From 80a9592cea7301d807c15ce1a5c9d9aad4ea827f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Menrath?= Date: Tue, 15 Oct 2024 12:04:03 +0200 Subject: [PATCH] init: add v 7.15.0 --- MEC-Installation-Guide.pdf | Bin 0 -> 431203 bytes app/addons/ACF.php | 59 + app/addons/KC.php | 85 + app/addons/PMP.php | 201 + app/addons/TNP.php | 57 + app/addons/VC.php | 78 + app/addons/avada.php | 72 + app/addons/avada/preview.php | 11 + app/addons/beaver.php | 54 + app/addons/divi.php | 67 + app/addons/divi/includes/Divi.php | 45 + .../divi/includes/MECShortcodesForDivi.php | 20 + app/addons/divi/includes/loader.js | 9 + app/addons/divi/includes/loader.php | 14 + .../modules/MECShortcodes/MECShortcodes.jsx | 27 + .../modules/MECShortcodes/MECShortcodes.php | 37 + app/addons/divi/includes/modules/index.js | 5 + app/addons/divi/scripts/builder-bundle.min.js | 201 + .../divi/scripts/frontend-bundle.min.js | 1 + app/addons/divi/scripts/frontend.js | 3 + app/addons/divi/styles/style-dbp.min.css | 0 app/addons/divi/styles/style.min.css | 1 + app/addons/elementor.php | 77 + app/addons/elementor/index.html | 0 app/addons/elementor/shortcode.php | 110 + app/addons/index.html | 0 app/addons/learndash.php | 158 + app/addons/mec-beaver-builder/calendar.svg | 1 + .../mec-beaver-builder/includes/frontend.php | 3 + .../mec-beaver-builder/mec-beaver-builder.php | 39 + app/addons/tnp/index.html | 0 app/addons/tnp/simple/block-empty.php | 1 + app/addons/tnp/simple/block-full.php | 54 + app/addons/tnp/simple/block-left.php | 47 + app/addons/tnp/simple/block-right.php | 51 + app/addons/tnp/simple/block.php | 71 + app/addons/tnp/simple/icon.png | Bin 0 -> 1056 bytes app/addons/tnp/simple/index.html | 0 app/addons/tnp/simple/options.php | 26 + .../Campaign_Monitor/class/base_classes.php | 317 + app/api/Campaign_Monitor/class/cacert.pem | 3849 +++ app/api/Campaign_Monitor/class/exceptions.php | 10 + app/api/Campaign_Monitor/class/log.php | 21 + .../Campaign_Monitor/class/serialisation.php | 136 + .../Campaign_Monitor/class/services_json.php | 774 + app/api/Campaign_Monitor/class/transport.php | 352 + .../Campaign_Monitor/csrest_subscribers.php | 235 + app/api/Google/Auth/Abstract.php | 38 + app/api/Google/Auth/AppIdentity.php | 120 + app/api/Google/Auth/AssertionCredentials.php | 136 + app/api/Google/Auth/ComputeEngine.php | 146 + app/api/Google/Auth/Exception.php | 24 + app/api/Google/Auth/LoginTicket.php | 71 + app/api/Google/Auth/OAuth2.php | 646 + app/api/Google/Auth/Simple.php | 63 + app/api/Google/Cache/Abstract.php | 53 + app/api/Google/Cache/Apc.php | 113 + app/api/Google/Cache/Exception.php | 24 + app/api/Google/Cache/File.php | 209 + app/api/Google/Cache/Memcache.php | 184 + app/api/Google/Cache/Null.php | 57 + app/api/Google/Client.php | 715 + app/api/Google/Collection.php | 123 + app/api/Google/Config.php | 456 + app/api/Google/Exception.php | 20 + app/api/Google/Http/Batch.php | 145 + app/api/Google/Http/CacheParser.php | 185 + app/api/Google/Http/MediaFileUpload.php | 341 + app/api/Google/Http/REST.php | 178 + app/api/Google/Http/Request.php | 504 + app/api/Google/IO/Abstract.php | 339 + app/api/Google/IO/Curl.php | 194 + app/api/Google/IO/Exception.php | 69 + app/api/Google/IO/Stream.php | 243 + app/api/Google/IO/cacerts.pem | 2183 ++ app/api/Google/Logger/Abstract.php | 408 + app/api/Google/Logger/Exception.php | 24 + app/api/Google/Logger/File.php | 158 + app/api/Google/Logger/Null.php | 43 + app/api/Google/Logger/Psr.php | 93 + app/api/Google/Model.php | 312 + app/api/Google/Service.php | 56 + app/api/Google/Service/Calendar.php | 3856 +++ app/api/Google/Service/Exception.php | 105 + app/api/Google/Service/Resource.php | 255 + app/api/Google/Signer/Abstract.php | 29 + app/api/Google/Signer/P12.php | 94 + app/api/Google/Task/Exception.php | 24 + app/api/Google/Task/Retryable.php | 36 + app/api/Google/Task/Runner.php | 257 + app/api/Google/Utils.php | 133 + app/api/Google/Utils/URITemplate.php | 333 + app/api/Google/Verifier/Abstract.php | 30 + app/api/Google/Verifier/Pem.php | 75 + app/api/Google/autoload.php | 37 + app/api/Google/index.html | 0 app/api/Meetup/meetup.php | 132 + app/api/Stripe/Account.php | 431 + app/api/Stripe/AccountLink.php | 26 + app/api/Stripe/AlipayAccount.php | 75 + app/api/Stripe/ApiOperations/All.php | 37 + app/api/Stripe/ApiOperations/Create.php | 31 + app/api/Stripe/ApiOperations/Delete.php | 30 + .../Stripe/ApiOperations/NestedResource.php | 135 + app/api/Stripe/ApiOperations/Request.php | 68 + app/api/Stripe/ApiOperations/Retrieve.php | 30 + app/api/Stripe/ApiOperations/Update.php | 52 + app/api/Stripe/ApiRequestor.php | 526 + app/api/Stripe/ApiResource.php | 120 + app/api/Stripe/ApiResponse.php | 45 + app/api/Stripe/ApplePayDomain.php | 31 + app/api/Stripe/ApplicationFee.php | 90 + app/api/Stripe/ApplicationFeeRefund.php | 66 + app/api/Stripe/Balance.php | 45 + app/api/Stripe/BalanceTransaction.php | 71 + app/api/Stripe/BankAccount.php | 132 + app/api/Stripe/BaseStripeClient.php | 269 + .../Stripe/BillingPortal/Configuration.php | 31 + app/api/Stripe/BillingPortal/Session.php | 42 + app/api/Stripe/BitcoinReceiver.php | 71 + app/api/Stripe/BitcoinTransaction.php | 19 + app/api/Stripe/Capability.php | 87 + app/api/Stripe/Card.php | 142 + app/api/Stripe/Charge.php | 146 + app/api/Stripe/Checkout/Session.php | 89 + app/api/Stripe/Collection.php | 282 + app/api/Stripe/CountrySpec.php | 30 + app/api/Stripe/Coupon.php | 41 + app/api/Stripe/CreditNote.php | 111 + app/api/Stripe/CreditNoteLineItem.php | 26 + app/api/Stripe/Customer.php | 276 + app/api/Stripe/CustomerBalanceTransaction.php | 103 + app/api/Stripe/Discount.php | 23 + app/api/Stripe/Dispute.php | 82 + app/api/Stripe/EphemeralKey.php | 43 + app/api/Stripe/ErrorObject.php | 164 + app/api/Stripe/Event.php | 231 + .../Exception/ApiConnectionException.php | 12 + .../Stripe/Exception/ApiErrorException.php | 219 + .../Exception/AuthenticationException.php | 11 + .../Exception/BadMethodCallException.php | 7 + app/api/Stripe/Exception/CardException.php | 84 + .../Stripe/Exception/ExceptionInterface.php | 22 + .../Stripe/Exception/IdempotencyException.php | 11 + .../Exception/InvalidArgumentException.php | 7 + .../Exception/InvalidRequestException.php | 60 + .../Exception/OAuth/ExceptionInterface.php | 10 + .../OAuth/InvalidClientException.php | 12 + .../Exception/OAuth/InvalidGrantException.php | 13 + .../OAuth/InvalidRequestException.php | 11 + .../Exception/OAuth/InvalidScopeException.php | 10 + .../Exception/OAuth/OAuthErrorException.php | 19 + .../OAuth/UnknownOAuthErrorException.php | 12 + .../OAuth/UnsupportedGrantTypeException.php | 11 + .../UnsupportedResponseTypeException.php | 11 + .../Stripe/Exception/PermissionException.php | 11 + .../Stripe/Exception/RateLimitException.php | 12 + .../SignatureVerificationException.php | 74 + .../Exception/UnexpectedValueException.php | 7 + .../Exception/UnknownApiErrorException.php | 12 + app/api/Stripe/ExchangeRate.php | 30 + app/api/Stripe/File.php | 82 + app/api/Stripe/FileLink.php | 30 + app/api/Stripe/HttpClient/ClientInterface.php | 22 + app/api/Stripe/HttpClient/CurlClient.php | 551 + .../HttpClient/data/ca-certificates.crt | 3646 +++ app/api/Stripe/HttpClient/data/test.png | Bin 0 -> 95 bytes app/api/Stripe/Invoice.php | 261 + app/api/Stripe/InvoiceItem.php | 49 + app/api/Stripe/InvoiceLineItem.php | 33 + app/api/Stripe/Issuing/Authorization.php | 81 + app/api/Stripe/Issuing/Card.php | 59 + app/api/Stripe/Issuing/CardDetails.php | 19 + app/api/Stripe/Issuing/Cardholder.php | 39 + app/api/Stripe/Issuing/Dispute.php | 53 + app/api/Stripe/Issuing/Transaction.php | 43 + app/api/Stripe/LineItem.php | 26 + app/api/Stripe/LoginLink.php | 15 + app/api/Stripe/Mandate.php | 27 + app/api/Stripe/OAuth.php | 101 + app/api/Stripe/OAuthErrorObject.php | 31 + app/api/Stripe/Order.php | 81 + app/api/Stripe/OrderItem.php | 19 + app/api/Stripe/OrderReturn.php | 32 + app/api/Stripe/PaymentIntent.php | 125 + app/api/Stripe/PaymentMethod.php | 87 + app/api/Stripe/Payout.php | 108 + app/api/Stripe/Person.php | 120 + app/api/Stripe/Plan.php | 57 + app/api/Stripe/Price.php | 62 + app/api/Stripe/Product.php | 53 + app/api/Stripe/PromotionCode.php | 33 + app/api/Stripe/Radar/EarlyFraudWarning.php | 37 + app/api/Stripe/Radar/ValueList.php | 35 + app/api/Stripe/Radar/ValueListItem.php | 31 + app/api/Stripe/Recipient.php | 44 + app/api/Stripe/RecipientTransfer.php | 36 + app/api/Stripe/Refund.php | 58 + app/api/Stripe/Reporting/ReportRun.php | 37 + app/api/Stripe/Reporting/ReportType.php | 34 + app/api/Stripe/RequestTelemetry.php | 26 + app/api/Stripe/Review.php | 66 + app/api/Stripe/SKU.php | 44 + app/api/Stripe/Service/AbstractService.php | 79 + .../Stripe/Service/AbstractServiceFactory.php | 59 + app/api/Stripe/Service/AccountLinkService.php | 25 + app/api/Stripe/Service/AccountService.php | 381 + .../Stripe/Service/ApplePayDomainService.php | 70 + .../Stripe/Service/ApplicationFeeService.php | 125 + app/api/Stripe/Service/BalanceService.php | 26 + .../Service/BalanceTransactionService.php | 47 + .../BillingPortalServiceFactory.php | 27 + .../BillingPortal/ConfigurationService.php | 73 + .../Service/BillingPortal/SessionService.php | 23 + app/api/Stripe/Service/ChargeService.php | 101 + .../Checkout/CheckoutServiceFactory.php | 25 + .../Service/Checkout/SessionService.php | 73 + app/api/Stripe/Service/CoreServiceFactory.php | 125 + app/api/Stripe/Service/CountrySpecService.php | 39 + app/api/Stripe/Service/CouponService.php | 104 + app/api/Stripe/Service/CreditNoteService.php | 156 + app/api/Stripe/Service/CustomerService.php | 353 + app/api/Stripe/Service/DisputeService.php | 83 + .../Stripe/Service/EphemeralKeyService.php | 43 + app/api/Stripe/Service/EventService.php | 44 + .../Stripe/Service/ExchangeRateService.php | 41 + app/api/Stripe/Service/FileLinkService.php | 70 + app/api/Stripe/Service/FileService.php | 66 + app/api/Stripe/Service/InvoiceItemService.php | 93 + app/api/Stripe/Service/InvoiceService.php | 272 + .../Service/Issuing/AuthorizationService.php | 97 + .../Stripe/Service/Issuing/CardService.php | 73 + .../Service/Issuing/CardholderService.php | 74 + .../Stripe/Service/Issuing/DisputeService.php | 99 + .../Service/Issuing/IssuingServiceFactory.php | 33 + .../Service/Issuing/TransactionService.php | 59 + app/api/Stripe/Service/MandateService.php | 24 + app/api/Stripe/Service/OAuthService.php | 150 + app/api/Stripe/Service/OrderReturnService.php | 42 + app/api/Stripe/Service/OrderService.php | 109 + .../Stripe/Service/PaymentIntentService.php | 181 + .../Stripe/Service/PaymentMethodService.php | 121 + app/api/Stripe/Service/PayoutService.php | 127 + app/api/Stripe/Service/PlanService.php | 91 + app/api/Stripe/Service/PriceService.php | 72 + app/api/Stripe/Service/ProductService.php | 92 + .../Stripe/Service/PromotionCodeService.php | 72 + .../Radar/EarlyFraudWarningService.php | 43 + .../Service/Radar/RadarServiceFactory.php | 29 + .../Service/Radar/ValueListItemService.php | 74 + .../Stripe/Service/Radar/ValueListService.php | 93 + app/api/Stripe/Service/RefundService.php | 76 + .../Service/Reporting/ReportRunService.php | 57 + .../Service/Reporting/ReportTypeService.php | 41 + .../Reporting/ReportingServiceFactory.php | 27 + app/api/Stripe/Service/ReviewService.php | 58 + .../Stripe/Service/SetupAttemptService.php | 23 + app/api/Stripe/Service/SetupIntentService.php | 127 + .../Sigma/ScheduledQueryRunService.php | 39 + .../Service/Sigma/SigmaServiceFactory.php | 25 + app/api/Stripe/Service/SkuService.php | 95 + app/api/Stripe/Service/SourceService.php | 110 + .../Service/SubscriptionItemService.php | 151 + .../Service/SubscriptionScheduleService.php | 113 + .../Stripe/Service/SubscriptionService.php | 124 + app/api/Stripe/Service/TaxRateService.php | 71 + .../Terminal/ConnectionTokenService.php | 25 + .../Service/Terminal/LocationService.php | 87 + .../Stripe/Service/Terminal/ReaderService.php | 87 + .../Terminal/TerminalServiceFactory.php | 29 + app/api/Stripe/Service/TokenService.php | 42 + app/api/Stripe/Service/TopupService.php | 89 + app/api/Stripe/Service/TransferService.php | 175 + .../Stripe/Service/WebhookEndpointService.php | 97 + app/api/Stripe/SetupAttempt.php | 32 + app/api/Stripe/SetupIntent.php | 114 + app/api/Stripe/Sigma/ScheduledQueryRun.php | 37 + app/api/Stripe/SingletonApiResource.php | 38 + app/api/Stripe/Source.php | 168 + app/api/Stripe/SourceTransaction.php | 20 + app/api/Stripe/Stripe.php | 278 + app/api/Stripe/StripeClient.php | 77 + app/api/Stripe/StripeClientInterface.php | 56 + app/api/Stripe/StripeObject.php | 582 + app/api/Stripe/Subscription.php | 116 + app/api/Stripe/SubscriptionItem.php | 84 + app/api/Stripe/SubscriptionSchedule.php | 74 + app/api/Stripe/TaxId.php | 107 + app/api/Stripe/TaxRate.php | 40 + app/api/Stripe/Terminal/ConnectionToken.php | 23 + app/api/Stripe/Terminal/Location.php | 30 + app/api/Stripe/Terminal/Reader.php | 35 + app/api/Stripe/ThreeDSecure.php | 37 + app/api/Stripe/Token.php | 57 + app/api/Stripe/Topup.php | 63 + app/api/Stripe/Transfer.php | 130 + app/api/Stripe/TransferReversal.php | 79 + app/api/Stripe/UsageRecord.php | 25 + app/api/Stripe/UsageRecordSummary.php | 19 + app/api/Stripe/Util/CaseInsensitiveArray.php | 78 + app/api/Stripe/Util/DefaultLogger.php | 29 + app/api/Stripe/Util/LoggerInterface.php | 34 + app/api/Stripe/Util/ObjectTypes.php | 100 + app/api/Stripe/Util/RandomGenerator.php | 36 + app/api/Stripe/Util/RequestOptions.php | 168 + app/api/Stripe/Util/Set.php | 45 + app/api/Stripe/Util/Util.php | 265 + app/api/Stripe/Webhook.php | 42 + app/api/Stripe/WebhookEndpoint.php | 41 + app/api/Stripe/WebhookSignature.php | 140 + app/api/Stripe/autoload.php | 22 + app/api/TFPDF/font/courier.php | 8 + app/api/TFPDF/font/courierb.php | 8 + app/api/TFPDF/font/courierbi.php | 8 + app/api/TFPDF/font/courieri.php | 8 + app/api/TFPDF/font/helvetica.php | 19 + app/api/TFPDF/font/helveticab.php | 19 + app/api/TFPDF/font/helveticabi.php | 19 + app/api/TFPDF/font/helveticai.php | 19 + app/api/TFPDF/font/symbol.php | 19 + app/api/TFPDF/font/times.php | 19 + app/api/TFPDF/font/timesb.php | 19 + app/api/TFPDF/font/timesbi.php | 19 + app/api/TFPDF/font/timesi.php | 19 + app/api/TFPDF/font/unifont/DejaVuSans.ttf | Bin 0 -> 720012 bytes .../font/unifont/DejaVuSansCondensed-Bold.ttf | Bin 0 -> 631992 bytes .../font/unifont/DejaVuSansCondensed.ttf | Bin 0 -> 643852 bytes app/api/TFPDF/font/unifont/ttfonts.php | 1083 + app/api/TFPDF/font/zapfdingbats.php | 19 + app/api/TFPDF/tfpdf.php | 2378 ++ app/api/Twilio/Base/BaseClient.php | 388 + .../Twilio/Base/PhoneNumberCapabilities.php | 80 + app/api/Twilio/Deserialize.php | 51 + app/api/Twilio/Domain.php | 82 + .../Exceptions/ConfigurationException.php | 9 + .../Exceptions/DeserializeException.php | 9 + .../Exceptions/EnvironmentException.php | 9 + app/api/Twilio/Exceptions/HttpException.php | 9 + app/api/Twilio/Exceptions/RestException.php | 52 + app/api/Twilio/Exceptions/TwilioException.php | 9 + app/api/Twilio/Exceptions/TwimlException.php | 9 + app/api/Twilio/Http/Client.php | 12 + app/api/Twilio/Http/CurlClient.php | 238 + app/api/Twilio/Http/File.php | 47 + app/api/Twilio/Http/GuzzleClient.php | 99 + app/api/Twilio/Http/Response.php | 40 + app/api/Twilio/InstanceContext.php | 19 + app/api/Twilio/InstanceResource.php | 28 + app/api/Twilio/Jwt/AccessToken.php | 169 + app/api/Twilio/Jwt/Client/ScopeURI.php | 67 + app/api/Twilio/Jwt/ClientToken.php | 128 + app/api/Twilio/Jwt/Grants/ChatGrant.php | 128 + app/api/Twilio/Jwt/Grants/Grant.php | 21 + app/api/Twilio/Jwt/Grants/PlaybackGrant.php | 52 + app/api/Twilio/Jwt/Grants/SyncGrant.php | 126 + app/api/Twilio/Jwt/Grants/TaskRouterGrant.php | 101 + app/api/Twilio/Jwt/Grants/VideoGrant.php | 52 + app/api/Twilio/Jwt/Grants/VoiceGrant.php | 165 + app/api/Twilio/Jwt/JWT.php | 172 + .../Twilio/Jwt/TaskRouter/CapabilityToken.php | 161 + app/api/Twilio/Jwt/TaskRouter/Policy.php | 54 + .../Jwt/TaskRouter/TaskQueueCapability.php | 21 + .../Jwt/TaskRouter/WorkerCapability.php | 49 + .../Jwt/TaskRouter/WorkspaceCapability.php | 16 + app/api/Twilio/ListResource.php | 19 + app/api/Twilio/Options.php | 13 + app/api/Twilio/Page.php | 195 + app/api/Twilio/Rest/Accounts.php | 47 + app/api/Twilio/Rest/Accounts/V1.php | 116 + .../Accounts/V1/AuthTokenPromotionContext.php | 75 + .../V1/AuthTokenPromotionInstance.php | 122 + .../Accounts/V1/AuthTokenPromotionList.php | 61 + .../Accounts/V1/AuthTokenPromotionPage.php | 55 + .../Accounts/V1/Credential/AwsContext.php | 123 + .../Accounts/V1/Credential/AwsInstance.php | 152 + .../Rest/Accounts/V1/Credential/AwsList.php | 194 + .../Accounts/V1/Credential/AwsOptions.php | 152 + .../Rest/Accounts/V1/Credential/AwsPage.php | 55 + .../V1/Credential/PublicKeyContext.php | 123 + .../V1/Credential/PublicKeyInstance.php | 152 + .../Accounts/V1/Credential/PublicKeyList.php | 194 + .../V1/Credential/PublicKeyOptions.php | 152 + .../Accounts/V1/Credential/PublicKeyPage.php | 55 + .../Rest/Accounts/V1/CredentialInstance.php | 71 + .../Rest/Accounts/V1/CredentialList.php | 123 + .../Rest/Accounts/V1/CredentialPage.php | 55 + .../Accounts/V1/SecondaryAuthTokenContext.php | 88 + .../V1/SecondaryAuthTokenInstance.php | 134 + .../Accounts/V1/SecondaryAuthTokenList.php | 61 + .../Accounts/V1/SecondaryAuthTokenPage.php | 55 + app/api/Twilio/Rest/AccountsBase.php | 88 + app/api/Twilio/Rest/Api.php | 371 + app/api/Twilio/Rest/Api/V2010.php | 309 + .../Address/DependentPhoneNumberInstance.php | 133 + .../Address/DependentPhoneNumberList.php | 157 + .../Address/DependentPhoneNumberPage.php | 55 + .../Rest/Api/V2010/Account/AddressContext.php | 205 + .../Api/V2010/Account/AddressInstance.php | 185 + .../Rest/Api/V2010/Account/AddressList.php | 232 + .../Rest/Api/V2010/Account/AddressOptions.php | 418 + .../Rest/Api/V2010/Account/AddressPage.php | 55 + .../Api/V2010/Account/ApplicationContext.php | 161 + .../Api/V2010/Account/ApplicationInstance.php | 184 + .../Api/V2010/Account/ApplicationList.php | 234 + .../Api/V2010/Account/ApplicationOptions.php | 724 + .../Api/V2010/Account/ApplicationPage.php | 55 + .../Account/AuthorizedConnectAppContext.php | 87 + .../Account/AuthorizedConnectAppInstance.php | 136 + .../Account/AuthorizedConnectAppList.php | 168 + .../Account/AuthorizedConnectAppPage.php | 55 + .../LocalInstance.php | 108 + .../AvailablePhoneNumberCountry/LocalList.php | 199 + .../LocalOptions.php | 382 + .../AvailablePhoneNumberCountry/LocalPage.php | 55 + .../MachineToMachineInstance.php | 108 + .../MachineToMachineList.php | 199 + .../MachineToMachineOptions.php | 382 + .../MachineToMachinePage.php | 55 + .../MobileInstance.php | 108 + .../MobileList.php | 199 + .../MobileOptions.php | 382 + .../MobilePage.php | 55 + .../NationalInstance.php | 108 + .../NationalList.php | 199 + .../NationalOptions.php | 382 + .../NationalPage.php | 55 + .../SharedCostInstance.php | 108 + .../SharedCostList.php | 199 + .../SharedCostOptions.php | 382 + .../SharedCostPage.php | 55 + .../TollFreeInstance.php | 108 + .../TollFreeList.php | 199 + .../TollFreeOptions.php | 382 + .../TollFreePage.php | 55 + .../VoipInstance.php | 108 + .../AvailablePhoneNumberCountry/VoipList.php | 199 + .../VoipOptions.php | 382 + .../AvailablePhoneNumberCountry/VoipPage.php | 55 + .../AvailablePhoneNumberCountryContext.php | 259 + .../AvailablePhoneNumberCountryInstance.php | 196 + .../AvailablePhoneNumberCountryList.php | 168 + .../AvailablePhoneNumberCountryPage.php | 55 + .../Api/V2010/Account/BalanceInstance.php | 85 + .../Rest/Api/V2010/Account/BalanceList.php | 77 + .../Rest/Api/V2010/Account/BalancePage.php | 55 + .../Api/V2010/Account/Call/EventInstance.php | 84 + .../Rest/Api/V2010/Account/Call/EventList.php | 157 + .../Rest/Api/V2010/Account/Call/EventPage.php | 55 + .../V2010/Account/Call/FeedbackContext.php | 119 + .../V2010/Account/Call/FeedbackInstance.php | 142 + .../Api/V2010/Account/Call/FeedbackList.php | 73 + .../V2010/Account/Call/FeedbackOptions.php | 96 + .../Api/V2010/Account/Call/FeedbackPage.php | 55 + .../Account/Call/FeedbackSummaryContext.php | 100 + .../Account/Call/FeedbackSummaryInstance.php | 156 + .../Account/Call/FeedbackSummaryList.php | 115 + .../Account/Call/FeedbackSummaryOptions.php | 116 + .../Account/Call/FeedbackSummaryPage.php | 55 + .../Account/Call/NotificationContext.php | 93 + .../Account/Call/NotificationInstance.php | 152 + .../V2010/Account/Call/NotificationList.php | 189 + .../Account/Call/NotificationOptions.php | 132 + .../V2010/Account/Call/NotificationPage.php | 55 + .../Api/V2010/Account/Call/PaymentContext.php | 111 + .../V2010/Account/Call/PaymentInstance.php | 134 + .../Api/V2010/Account/Call/PaymentList.php | 145 + .../Api/V2010/Account/Call/PaymentOptions.php | 370 + .../Api/V2010/Account/Call/PaymentPage.php | 55 + .../V2010/Account/Call/RecordingContext.php | 140 + .../V2010/Account/Call/RecordingInstance.php | 181 + .../Api/V2010/Account/Call/RecordingList.php | 226 + .../V2010/Account/Call/RecordingOptions.php | 310 + .../Api/V2010/Account/Call/RecordingPage.php | 55 + .../Api/V2010/Account/Call/SiprecContext.php | 100 + .../Api/V2010/Account/Call/SiprecInstance.php | 133 + .../Api/V2010/Account/Call/SiprecList.php | 516 + .../Api/V2010/Account/Call/SiprecOptions.php | 3712 +++ .../Api/V2010/Account/Call/SiprecPage.php | 55 + .../Api/V2010/Account/Call/StreamContext.php | 101 + .../Api/V2010/Account/Call/StreamInstance.php | 134 + .../Api/V2010/Account/Call/StreamList.php | 518 + .../Api/V2010/Account/Call/StreamOptions.php | 3695 +++ .../Api/V2010/Account/Call/StreamPage.php | 55 + .../Call/UserDefinedMessageInstance.php | 89 + .../Account/Call/UserDefinedMessageList.php | 97 + .../Call/UserDefinedMessageOptions.php | 76 + .../Account/Call/UserDefinedMessagePage.php | 55 + .../UserDefinedMessageSubscriptionContext.php | 85 + ...UserDefinedMessageSubscriptionInstance.php | 128 + .../UserDefinedMessageSubscriptionList.php | 117 + .../UserDefinedMessageSubscriptionOptions.php | 96 + .../UserDefinedMessageSubscriptionPage.php | 55 + .../Rest/Api/V2010/Account/CallContext.php | 363 + .../Rest/Api/V2010/Account/CallInstance.php | 285 + .../Rest/Api/V2010/Account/CallList.php | 349 + .../Rest/Api/V2010/Account/CallOptions.php | 1064 + .../Rest/Api/V2010/Account/CallPage.php | 55 + .../Account/Conference/ParticipantContext.php | 160 + .../Conference/ParticipantInstance.php | 172 + .../Account/Conference/ParticipantList.php | 308 + .../Account/Conference/ParticipantOptions.php | 1192 + .../Account/Conference/ParticipantPage.php | 55 + .../Account/Conference/RecordingContext.php | 140 + .../Account/Conference/RecordingInstance.php | 179 + .../Account/Conference/RecordingList.php | 187 + .../Account/Conference/RecordingOptions.php | 168 + .../Account/Conference/RecordingPage.php | 55 + .../Api/V2010/Account/ConferenceContext.php | 200 + .../Api/V2010/Account/ConferenceInstance.php | 175 + .../Rest/Api/V2010/Account/ConferenceList.php | 190 + .../Api/V2010/Account/ConferenceOptions.php | 290 + .../Rest/Api/V2010/Account/ConferencePage.php | 55 + .../Api/V2010/Account/ConnectAppContext.php | 144 + .../Api/V2010/Account/ConnectAppInstance.php | 163 + .../Rest/Api/V2010/Account/ConnectAppList.php | 168 + .../Api/V2010/Account/ConnectAppOptions.php | 208 + .../Rest/Api/V2010/Account/ConnectAppPage.php | 55 + .../AssignedAddOnExtensionContext.php | 99 + .../AssignedAddOnExtensionInstance.php | 137 + .../AssignedAddOnExtensionList.php | 182 + .../AssignedAddOnExtensionPage.php | 55 + .../AssignedAddOnContext.php | 166 + .../AssignedAddOnInstance.php | 163 + .../IncomingPhoneNumber/AssignedAddOnList.php | 202 + .../IncomingPhoneNumber/AssignedAddOnPage.php | 55 + .../IncomingPhoneNumber/LocalInstance.php | 149 + .../Account/IncomingPhoneNumber/LocalList.php | 238 + .../IncomingPhoneNumber/LocalOptions.php | 556 + .../Account/IncomingPhoneNumber/LocalPage.php | 55 + .../IncomingPhoneNumber/MobileInstance.php | 149 + .../IncomingPhoneNumber/MobileList.php | 238 + .../IncomingPhoneNumber/MobileOptions.php | 556 + .../IncomingPhoneNumber/MobilePage.php | 55 + .../IncomingPhoneNumber/TollFreeInstance.php | 149 + .../IncomingPhoneNumber/TollFreeList.php | 238 + .../IncomingPhoneNumber/TollFreeOptions.php | 556 + .../IncomingPhoneNumber/TollFreePage.php | 55 + .../Account/IncomingPhoneNumberContext.php | 234 + .../Account/IncomingPhoneNumberInstance.php | 222 + .../V2010/Account/IncomingPhoneNumberList.php | 346 + .../Account/IncomingPhoneNumberOptions.php | 1040 + .../V2010/Account/IncomingPhoneNumberPage.php | 55 + .../Rest/Api/V2010/Account/KeyContext.php | 130 + .../Rest/Api/V2010/Account/KeyInstance.php | 150 + .../Twilio/Rest/Api/V2010/Account/KeyList.php | 168 + .../Rest/Api/V2010/Account/KeyOptions.php | 82 + .../Twilio/Rest/Api/V2010/Account/KeyPage.php | 55 + .../Account/Message/FeedbackInstance.php | 93 + .../V2010/Account/Message/FeedbackList.php | 94 + .../V2010/Account/Message/FeedbackOptions.php | 74 + .../V2010/Account/Message/FeedbackPage.php | 55 + .../V2010/Account/Message/MediaContext.php | 106 + .../V2010/Account/Message/MediaInstance.php | 144 + .../Api/V2010/Account/Message/MediaList.php | 187 + .../V2010/Account/Message/MediaOptions.php | 116 + .../Api/V2010/Account/Message/MediaPage.php | 55 + .../Rest/Api/V2010/Account/MessageContext.php | 210 + .../Api/V2010/Account/MessageInstance.php | 203 + .../Rest/Api/V2010/Account/MessageList.php | 255 + .../Rest/Api/V2010/Account/MessageOptions.php | 626 + .../Rest/Api/V2010/Account/MessagePage.php | 55 + .../Rest/Api/V2010/Account/NewKeyInstance.php | 90 + .../Rest/Api/V2010/Account/NewKeyList.php | 87 + .../Rest/Api/V2010/Account/NewKeyOptions.php | 76 + .../Rest/Api/V2010/Account/NewKeyPage.php | 55 + .../V2010/Account/NewSigningKeyInstance.php | 90 + .../Api/V2010/Account/NewSigningKeyList.php | 87 + .../V2010/Account/NewSigningKeyOptions.php | 76 + .../Api/V2010/Account/NewSigningKeyPage.php | 55 + .../Api/V2010/Account/NotificationContext.php | 87 + .../V2010/Account/NotificationInstance.php | 150 + .../Api/V2010/Account/NotificationList.php | 182 + .../Api/V2010/Account/NotificationOptions.php | 132 + .../Api/V2010/Account/NotificationPage.php | 55 + .../V2010/Account/OutgoingCallerIdContext.php | 130 + .../Account/OutgoingCallerIdInstance.php | 156 + .../V2010/Account/OutgoingCallerIdList.php | 177 + .../V2010/Account/OutgoingCallerIdOptions.php | 150 + .../V2010/Account/OutgoingCallerIdPage.php | 55 + .../Api/V2010/Account/Queue/MemberContext.php | 127 + .../V2010/Account/Queue/MemberInstance.php | 145 + .../Api/V2010/Account/Queue/MemberList.php | 175 + .../Api/V2010/Account/Queue/MemberOptions.php | 80 + .../Api/V2010/Account/Queue/MemberPage.php | 55 + .../Rest/Api/V2010/Account/QueueContext.php | 191 + .../Rest/Api/V2010/Account/QueueInstance.php | 171 + .../Rest/Api/V2010/Account/QueueList.php | 200 + .../Rest/Api/V2010/Account/QueueOptions.php | 152 + .../Rest/Api/V2010/Account/QueuePage.php | 55 + .../Recording/AddOnResult/PayloadContext.php | 112 + .../Recording/AddOnResult/PayloadInstance.php | 154 + .../Recording/AddOnResult/PayloadList.php | 182 + .../Recording/AddOnResult/PayloadPage.php | 55 + .../Account/Recording/AddOnResultContext.php | 166 + .../Account/Recording/AddOnResultInstance.php | 161 + .../Account/Recording/AddOnResultList.php | 175 + .../Account/Recording/AddOnResultPage.php | 55 + .../Recording/TranscriptionContext.php | 106 + .../Recording/TranscriptionInstance.php | 156 + .../Account/Recording/TranscriptionList.php | 175 + .../Account/Recording/TranscriptionPage.php | 55 + .../Api/V2010/Account/RecordingContext.php | 190 + .../Api/V2010/Account/RecordingInstance.php | 189 + .../Rest/Api/V2010/Account/RecordingList.php | 186 + .../Api/V2010/Account/RecordingOptions.php | 220 + .../Rest/Api/V2010/Account/RecordingPage.php | 55 + .../Api/V2010/Account/ShortCodeContext.php | 127 + .../Api/V2010/Account/ShortCodeInstance.php | 154 + .../Rest/Api/V2010/Account/ShortCodeList.php | 177 + .../Api/V2010/Account/ShortCodeOptions.php | 238 + .../Rest/Api/V2010/Account/ShortCodePage.php | 55 + .../Api/V2010/Account/SigningKeyContext.php | 130 + .../Api/V2010/Account/SigningKeyInstance.php | 150 + .../Rest/Api/V2010/Account/SigningKeyList.php | 168 + .../Api/V2010/Account/SigningKeyOptions.php | 82 + .../Rest/Api/V2010/Account/SigningKeyPage.php | 55 + .../Sip/CredentialList/CredentialContext.php | 137 + .../Sip/CredentialList/CredentialInstance.php | 158 + .../Sip/CredentialList/CredentialList.php | 205 + .../Sip/CredentialList/CredentialOptions.php | 84 + .../Sip/CredentialList/CredentialPage.php | 55 + .../Account/Sip/CredentialListContext.php | 186 + .../Account/Sip/CredentialListInstance.php | 166 + .../V2010/Account/Sip/CredentialListList.php | 195 + .../V2010/Account/Sip/CredentialListPage.php | 55 + .../AuthCallsCredentialListMappingContext.php | 106 + ...AuthCallsCredentialListMappingInstance.php | 140 + .../AuthCallsCredentialListMappingList.php | 202 + .../AuthCallsCredentialListMappingPage.php | 55 + ...CallsIpAccessControlListMappingContext.php | 106 + ...allsIpAccessControlListMappingInstance.php | 140 + ...uthCallsIpAccessControlListMappingList.php | 202 + ...uthCallsIpAccessControlListMappingPage.php | 55 + .../AuthTypes/AuthTypeCallsInstance.php | 73 + .../Domain/AuthTypes/AuthTypeCallsList.php | 137 + .../Domain/AuthTypes/AuthTypeCallsPage.php | 55 + ...istrationsCredentialListMappingContext.php | 106 + ...strationsCredentialListMappingInstance.php | 140 + ...RegistrationsCredentialListMappingList.php | 202 + ...RegistrationsCredentialListMappingPage.php | 55 + .../AuthTypeRegistrationsInstance.php | 73 + .../AuthTypes/AuthTypeRegistrationsList.php | 118 + .../AuthTypes/AuthTypeRegistrationsPage.php | 55 + .../Account/Sip/Domain/AuthTypesInstance.php | 73 + .../Account/Sip/Domain/AuthTypesList.php | 135 + .../Account/Sip/Domain/AuthTypesPage.php | 55 + .../Domain/CredentialListMappingContext.php | 106 + .../Domain/CredentialListMappingInstance.php | 144 + .../Sip/Domain/CredentialListMappingList.php | 202 + .../Sip/Domain/CredentialListMappingPage.php | 55 + .../IpAccessControlListMappingContext.php | 106 + .../IpAccessControlListMappingInstance.php | 144 + .../Domain/IpAccessControlListMappingList.php | 202 + .../Domain/IpAccessControlListMappingPage.php | 55 + .../Api/V2010/Account/Sip/DomainContext.php | 253 + .../Api/V2010/Account/Sip/DomainInstance.php | 215 + .../Rest/Api/V2010/Account/Sip/DomainList.php | 223 + .../Api/V2010/Account/Sip/DomainOptions.php | 548 + .../Rest/Api/V2010/Account/Sip/DomainPage.php | 55 + .../IpAccessControlList/IpAddressContext.php | 141 + .../IpAccessControlList/IpAddressInstance.php | 162 + .../Sip/IpAccessControlList/IpAddressList.php | 211 + .../IpAccessControlList/IpAddressOptions.php | 170 + .../Sip/IpAccessControlList/IpAddressPage.php | 55 + .../Sip/IpAccessControlListContext.php | 186 + .../Sip/IpAccessControlListInstance.php | 166 + .../Account/Sip/IpAccessControlListList.php | 194 + .../Account/Sip/IpAccessControlListPage.php | 55 + .../Rest/Api/V2010/Account/SipInstance.php | 72 + .../Twilio/Rest/Api/V2010/Account/SipList.php | 148 + .../Twilio/Rest/Api/V2010/Account/SipPage.php | 55 + .../Rest/Api/V2010/Account/TokenInstance.php | 94 + .../Rest/Api/V2010/Account/TokenList.php | 87 + .../Rest/Api/V2010/Account/TokenOptions.php | 76 + .../Rest/Api/V2010/Account/TokenPage.php | 55 + .../V2010/Account/TranscriptionContext.php | 100 + .../V2010/Account/TranscriptionInstance.php | 154 + .../Api/V2010/Account/TranscriptionList.php | 168 + .../Api/V2010/Account/TranscriptionPage.php | 55 + .../Account/Usage/Record/AllTimeInstance.php | 110 + .../Account/Usage/Record/AllTimeList.php | 165 + .../Account/Usage/Record/AllTimeOptions.php | 130 + .../Account/Usage/Record/AllTimePage.php | 55 + .../Account/Usage/Record/DailyInstance.php | 110 + .../V2010/Account/Usage/Record/DailyList.php | 165 + .../Account/Usage/Record/DailyOptions.php | 130 + .../V2010/Account/Usage/Record/DailyPage.php | 55 + .../Usage/Record/LastMonthInstance.php | 110 + .../Account/Usage/Record/LastMonthList.php | 165 + .../Account/Usage/Record/LastMonthOptions.php | 130 + .../Account/Usage/Record/LastMonthPage.php | 55 + .../Account/Usage/Record/MonthlyInstance.php | 110 + .../Account/Usage/Record/MonthlyList.php | 165 + .../Account/Usage/Record/MonthlyOptions.php | 130 + .../Account/Usage/Record/MonthlyPage.php | 55 + .../Usage/Record/ThisMonthInstance.php | 110 + .../Account/Usage/Record/ThisMonthList.php | 165 + .../Account/Usage/Record/ThisMonthOptions.php | 130 + .../Account/Usage/Record/ThisMonthPage.php | 55 + .../Account/Usage/Record/TodayInstance.php | 110 + .../V2010/Account/Usage/Record/TodayList.php | 165 + .../Account/Usage/Record/TodayOptions.php | 130 + .../V2010/Account/Usage/Record/TodayPage.php | 55 + .../Account/Usage/Record/YearlyInstance.php | 110 + .../V2010/Account/Usage/Record/YearlyList.php | 165 + .../Account/Usage/Record/YearlyOptions.php | 130 + .../V2010/Account/Usage/Record/YearlyPage.php | 55 + .../Usage/Record/YesterdayInstance.php | 110 + .../Account/Usage/Record/YesterdayList.php | 165 + .../Account/Usage/Record/YesterdayOptions.php | 130 + .../Account/Usage/Record/YesterdayPage.php | 55 + .../V2010/Account/Usage/RecordInstance.php | 110 + .../Api/V2010/Account/Usage/RecordList.php | 341 + .../Api/V2010/Account/Usage/RecordOptions.php | 130 + .../Api/V2010/Account/Usage/RecordPage.php | 55 + .../V2010/Account/Usage/TriggerContext.php | 134 + .../V2010/Account/Usage/TriggerInstance.php | 174 + .../Api/V2010/Account/Usage/TriggerList.php | 222 + .../V2010/Account/Usage/TriggerOptions.php | 306 + .../Api/V2010/Account/Usage/TriggerPage.php | 55 + .../Rest/Api/V2010/Account/UsageInstance.php | 72 + .../Rest/Api/V2010/Account/UsageList.php | 129 + .../Rest/Api/V2010/Account/UsagePage.php | 55 + .../Account/ValidationRequestInstance.php | 89 + .../V2010/Account/ValidationRequestList.php | 98 + .../Account/ValidationRequestOptions.php | 148 + .../V2010/Account/ValidationRequestPage.php | 55 + .../Twilio/Rest/Api/V2010/AccountContext.php | 600 + .../Twilio/Rest/Api/V2010/AccountInstance.php | 389 + app/api/Twilio/Rest/Api/V2010/AccountList.php | 197 + .../Twilio/Rest/Api/V2010/AccountOptions.php | 216 + app/api/Twilio/Rest/Api/V2010/AccountPage.php | 55 + app/api/Twilio/Rest/ApiBase.php | 88 + app/api/Twilio/Rest/Autopilot.php | 32 + app/api/Twilio/Rest/Autopilot/V1.php | 106 + .../V1/Assistant/DefaultsContext.php | 111 + .../V1/Assistant/DefaultsInstance.php | 135 + .../Autopilot/V1/Assistant/DefaultsList.php | 67 + .../V1/Assistant/DefaultsOptions.php | 78 + .../Autopilot/V1/Assistant/DefaultsPage.php | 55 + .../V1/Assistant/DialogueContext.php | 87 + .../V1/Assistant/DialogueInstance.php | 125 + .../Autopilot/V1/Assistant/DialogueList.php | 71 + .../Autopilot/V1/Assistant/DialoguePage.php | 55 + .../Assistant/FieldType/FieldValueContext.php | 106 + .../FieldType/FieldValueInstance.php | 150 + .../V1/Assistant/FieldType/FieldValueList.php | 217 + .../Assistant/FieldType/FieldValueOptions.php | 132 + .../V1/Assistant/FieldType/FieldValuePage.php | 55 + .../V1/Assistant/FieldTypeContext.php | 191 + .../V1/Assistant/FieldTypeInstance.php | 171 + .../Autopilot/V1/Assistant/FieldTypeList.php | 200 + .../V1/Assistant/FieldTypeOptions.php | 152 + .../Autopilot/V1/Assistant/FieldTypePage.php | 55 + .../V1/Assistant/ModelBuildContext.php | 130 + .../V1/Assistant/ModelBuildInstance.php | 162 + .../Autopilot/V1/Assistant/ModelBuildList.php | 199 + .../V1/Assistant/ModelBuildOptions.php | 152 + .../Autopilot/V1/Assistant/ModelBuildPage.php | 55 + .../Autopilot/V1/Assistant/QueryContext.php | 132 + .../Autopilot/V1/Assistant/QueryInstance.php | 170 + .../Rest/Autopilot/V1/Assistant/QueryList.php | 217 + .../Autopilot/V1/Assistant/QueryOptions.php | 274 + .../Rest/Autopilot/V1/Assistant/QueryPage.php | 55 + .../V1/Assistant/StyleSheetContext.php | 111 + .../V1/Assistant/StyleSheetInstance.php | 135 + .../Autopilot/V1/Assistant/StyleSheetList.php | 67 + .../V1/Assistant/StyleSheetOptions.php | 78 + .../Autopilot/V1/Assistant/StyleSheetPage.php | 55 + .../V1/Assistant/Task/FieldContext.php | 106 + .../V1/Assistant/Task/FieldInstance.php | 148 + .../Autopilot/V1/Assistant/Task/FieldList.php | 205 + .../Autopilot/V1/Assistant/Task/FieldPage.php | 55 + .../V1/Assistant/Task/SampleContext.php | 141 + .../V1/Assistant/Task/SampleInstance.php | 164 + .../V1/Assistant/Task/SampleList.php | 217 + .../V1/Assistant/Task/SampleOptions.php | 220 + .../V1/Assistant/Task/SamplePage.php | 55 + .../V1/Assistant/Task/TaskActionsContext.php | 118 + .../V1/Assistant/Task/TaskActionsInstance.php | 139 + .../V1/Assistant/Task/TaskActionsList.php | 73 + .../V1/Assistant/Task/TaskActionsOptions.php | 78 + .../V1/Assistant/Task/TaskActionsPage.php | 55 + .../Assistant/Task/TaskStatisticsContext.php | 87 + .../Assistant/Task/TaskStatisticsInstance.php | 127 + .../V1/Assistant/Task/TaskStatisticsList.php | 73 + .../V1/Assistant/Task/TaskStatisticsPage.php | 55 + .../Autopilot/V1/Assistant/TaskContext.php | 256 + .../Autopilot/V1/Assistant/TaskInstance.php | 203 + .../Rest/Autopilot/V1/Assistant/TaskList.php | 205 + .../Autopilot/V1/Assistant/TaskOptions.php | 224 + .../Rest/Autopilot/V1/Assistant/TaskPage.php | 55 + .../Autopilot/V1/Assistant/WebhookContext.php | 136 + .../V1/Assistant/WebhookInstance.php | 162 + .../Autopilot/V1/Assistant/WebhookList.php | 206 + .../Autopilot/V1/Assistant/WebhookOptions.php | 188 + .../Autopilot/V1/Assistant/WebhookPage.php | 55 + .../Rest/Autopilot/V1/AssistantContext.php | 329 + .../Rest/Autopilot/V1/AssistantInstance.php | 249 + .../Rest/Autopilot/V1/AssistantList.php | 202 + .../Rest/Autopilot/V1/AssistantOptions.php | 368 + .../Rest/Autopilot/V1/AssistantPage.php | 55 + .../Autopilot/V1/RestoreAssistantInstance.php | 103 + .../Autopilot/V1/RestoreAssistantList.php | 77 + .../Autopilot/V1/RestoreAssistantPage.php | 55 + app/api/Twilio/Rest/AutopilotBase.php | 88 + app/api/Twilio/Rest/Bulkexports.php | 44 + app/api/Twilio/Rest/Bulkexports/V1.php | 106 + .../Rest/Bulkexports/V1/Export/DayContext.php | 87 + .../Bulkexports/V1/Export/DayInstance.php | 127 + .../Rest/Bulkexports/V1/Export/DayList.php | 168 + .../Rest/Bulkexports/V1/Export/DayPage.php | 55 + .../V1/Export/ExportCustomJobInstance.php | 101 + .../V1/Export/ExportCustomJobList.php | 193 + .../V1/Export/ExportCustomJobOptions.php | 114 + .../V1/Export/ExportCustomJobPage.php | 55 + .../Rest/Bulkexports/V1/Export/JobContext.php | 94 + .../Bulkexports/V1/Export/JobInstance.php | 149 + .../Rest/Bulkexports/V1/Export/JobList.php | 65 + .../Rest/Bulkexports/V1/Export/JobPage.php | 55 + .../V1/ExportConfigurationContext.php | 115 + .../V1/ExportConfigurationInstance.php | 137 + .../V1/ExportConfigurationList.php | 65 + .../V1/ExportConfigurationOptions.php | 114 + .../V1/ExportConfigurationPage.php | 55 + .../Rest/Bulkexports/V1/ExportContext.php | 157 + .../Rest/Bulkexports/V1/ExportInstance.php | 140 + .../Twilio/Rest/Bulkexports/V1/ExportList.php | 122 + .../Twilio/Rest/Bulkexports/V1/ExportPage.php | 55 + app/api/Twilio/Rest/BulkexportsBase.php | 88 + app/api/Twilio/Rest/Chat.php | 60 + app/api/Twilio/Rest/Chat/V1.php | 107 + .../Twilio/Rest/Chat/V1/CredentialContext.php | 134 + .../Rest/Chat/V1/CredentialInstance.php | 156 + .../Twilio/Rest/Chat/V1/CredentialList.php | 203 + .../Twilio/Rest/Chat/V1/CredentialOptions.php | 314 + .../Twilio/Rest/Chat/V1/CredentialPage.php | 55 + .../Chat/V1/Service/Channel/InviteContext.php | 106 + .../V1/Service/Channel/InviteInstance.php | 150 + .../Chat/V1/Service/Channel/InviteList.php | 215 + .../Chat/V1/Service/Channel/InviteOptions.php | 132 + .../Chat/V1/Service/Channel/InvitePage.php | 55 + .../Chat/V1/Service/Channel/MemberContext.php | 139 + .../V1/Service/Channel/MemberInstance.php | 166 + .../Chat/V1/Service/Channel/MemberList.php | 215 + .../Chat/V1/Service/Channel/MemberOptions.php | 202 + .../Chat/V1/Service/Channel/MemberPage.php | 55 + .../V1/Service/Channel/MessageContext.php | 139 + .../V1/Service/Channel/MessageInstance.php | 170 + .../Chat/V1/Service/Channel/MessageList.php | 216 + .../V1/Service/Channel/MessageOptions.php | 220 + .../Chat/V1/Service/Channel/MessagePage.php | 55 + .../Rest/Chat/V1/Service/ChannelContext.php | 233 + .../Rest/Chat/V1/Service/ChannelInstance.php | 201 + .../Rest/Chat/V1/Service/ChannelList.php | 209 + .../Rest/Chat/V1/Service/ChannelOptions.php | 272 + .../Rest/Chat/V1/Service/ChannelPage.php | 55 + .../Rest/Chat/V1/Service/RoleContext.php | 128 + .../Rest/Chat/V1/Service/RoleInstance.php | 159 + .../Twilio/Rest/Chat/V1/Service/RoleList.php | 201 + .../Twilio/Rest/Chat/V1/Service/RolePage.php | 55 + .../V1/Service/User/UserChannelInstance.php | 96 + .../Chat/V1/Service/User/UserChannelList.php | 157 + .../Chat/V1/Service/User/UserChannelPage.php | 55 + .../Rest/Chat/V1/Service/UserContext.php | 192 + .../Rest/Chat/V1/Service/UserInstance.php | 181 + .../Twilio/Rest/Chat/V1/Service/UserList.php | 204 + .../Rest/Chat/V1/Service/UserOptions.php | 206 + .../Twilio/Rest/Chat/V1/Service/UserPage.php | 55 + .../Twilio/Rest/Chat/V1/ServiceContext.php | 326 + .../Twilio/Rest/Chat/V1/ServiceInstance.php | 213 + app/api/Twilio/Rest/Chat/V1/ServiceList.php | 186 + .../Twilio/Rest/Chat/V1/ServiceOptions.php | 1038 + app/api/Twilio/Rest/Chat/V1/ServicePage.php | 55 + app/api/Twilio/Rest/Chat/V2.php | 107 + .../Rest/Chat/V2/.openapi-generator-ignore | 23 + .../Twilio/Rest/Chat/V2/CredentialContext.php | 134 + .../Rest/Chat/V2/CredentialInstance.php | 156 + .../Twilio/Rest/Chat/V2/CredentialList.php | 203 + .../Twilio/Rest/Chat/V2/CredentialOptions.php | 314 + .../Twilio/Rest/Chat/V2/CredentialPage.php | 55 + .../Rest/Chat/V2/Service/BindingContext.php | 100 + .../Rest/Chat/V2/Service/BindingInstance.php | 152 + .../Rest/Chat/V2/Service/BindingList.php | 178 + .../Rest/Chat/V2/Service/BindingOptions.php | 98 + .../Rest/Chat/V2/Service/BindingPage.php | 55 + .../Chat/V2/Service/Channel/InviteContext.php | 106 + .../V2/Service/Channel/InviteInstance.php | 150 + .../Chat/V2/Service/Channel/InviteList.php | 215 + .../Chat/V2/Service/Channel/InviteOptions.php | 132 + .../Chat/V2/Service/Channel/InvitePage.php | 55 + .../Chat/V2/Service/Channel/MemberContext.php | 155 + .../V2/Service/Channel/MemberInstance.php | 169 + .../Chat/V2/Service/Channel/MemberList.php | 227 + .../Chat/V2/Service/Channel/MemberOptions.php | 450 + .../Chat/V2/Service/Channel/MemberPage.php | 55 + .../V2/Service/Channel/MessageContext.php | 155 + .../V2/Service/Channel/MessageInstance.php | 177 + .../Chat/V2/Service/Channel/MessageList.php | 226 + .../V2/Service/Channel/MessageOptions.php | 468 + .../Chat/V2/Service/Channel/MessagePage.php | 55 + .../V2/Service/Channel/WebhookContext.php | 148 + .../V2/Service/Channel/WebhookInstance.php | 162 + .../Chat/V2/Service/Channel/WebhookList.php | 219 + .../V2/Service/Channel/WebhookOptions.php | 310 + .../Chat/V2/Service/Channel/WebhookPage.php | 55 + .../Rest/Chat/V2/Service/ChannelContext.php | 267 + .../Rest/Chat/V2/Service/ChannelInstance.php | 212 + .../Rest/Chat/V2/Service/ChannelList.php | 218 + .../Rest/Chat/V2/Service/ChannelOptions.php | 466 + .../Rest/Chat/V2/Service/ChannelPage.php | 55 + .../Rest/Chat/V2/Service/RoleContext.php | 128 + .../Rest/Chat/V2/Service/RoleInstance.php | 159 + .../Twilio/Rest/Chat/V2/Service/RoleList.php | 201 + .../Twilio/Rest/Chat/V2/Service/RolePage.php | 55 + .../V2/Service/User/UserBindingContext.php | 106 + .../V2/Service/User/UserBindingInstance.php | 154 + .../Chat/V2/Service/User/UserBindingList.php | 182 + .../V2/Service/User/UserBindingOptions.php | 80 + .../Chat/V2/Service/User/UserBindingPage.php | 55 + .../V2/Service/User/UserChannelContext.php | 147 + .../V2/Service/User/UserChannelInstance.php | 166 + .../Chat/V2/Service/User/UserChannelList.php | 175 + .../V2/Service/User/UserChannelOptions.php | 166 + .../Chat/V2/Service/User/UserChannelPage.php | 55 + .../Rest/Chat/V2/Service/UserContext.php | 215 + .../Rest/Chat/V2/Service/UserInstance.php | 191 + .../Twilio/Rest/Chat/V2/Service/UserList.php | 206 + .../Rest/Chat/V2/Service/UserOptions.php | 242 + .../Twilio/Rest/Chat/V2/Service/UserPage.php | 55 + .../Twilio/Rest/Chat/V2/ServiceContext.php | 299 + .../Twilio/Rest/Chat/V2/ServiceInstance.php | 227 + app/api/Twilio/Rest/Chat/V2/ServiceList.php | 186 + .../Twilio/Rest/Chat/V2/ServiceOptions.php | 624 + app/api/Twilio/Rest/Chat/V2/ServicePage.php | 55 + app/api/Twilio/Rest/Chat/V3.php | 95 + .../Rest/Chat/V3/.openapi-generator-ignore | 23 + .../Twilio/Rest/Chat/V3/ChannelContext.php | 101 + .../Twilio/Rest/Chat/V3/ChannelInstance.php | 146 + app/api/Twilio/Rest/Chat/V3/ChannelList.php | 69 + .../Twilio/Rest/Chat/V3/ChannelOptions.php | 110 + app/api/Twilio/Rest/Chat/V3/ChannelPage.php | 55 + app/api/Twilio/Rest/ChatBase.php | 114 + app/api/Twilio/Rest/Client.php | 695 + app/api/Twilio/Rest/Content.php | 25 + app/api/Twilio/Rest/Content/V1.php | 117 + .../V1/Content/ApprovalFetchContext.php | 81 + .../V1/Content/ApprovalFetchInstance.php | 121 + .../Content/V1/Content/ApprovalFetchList.php | 67 + .../Content/V1/Content/ApprovalFetchPage.php | 55 + .../V1/ContentAndApprovalsInstance.php | 97 + .../Content/V1/ContentAndApprovalsList.php | 145 + .../Content/V1/ContentAndApprovalsPage.php | 55 + .../Twilio/Rest/Content/V1/ContentContext.php | 152 + .../Rest/Content/V1/ContentInstance.php | 157 + .../Twilio/Rest/Content/V1/ContentList.php | 161 + .../Twilio/Rest/Content/V1/ContentPage.php | 55 + .../Rest/Content/V1/LegacyContentInstance.php | 101 + .../Rest/Content/V1/LegacyContentList.php | 145 + .../Rest/Content/V1/LegacyContentPage.php | 55 + app/api/Twilio/Rest/ContentBase.php | 88 + app/api/Twilio/Rest/Conversations.php | 137 + app/api/Twilio/Rest/Conversations/V1.php | 177 + .../V1/AddressConfigurationContext.php | 140 + .../V1/AddressConfigurationInstance.php | 158 + .../V1/AddressConfigurationList.php | 218 + .../V1/AddressConfigurationOptions.php | 464 + .../V1/AddressConfigurationPage.php | 55 + .../V1/Configuration/WebhookContext.php | 112 + .../V1/Configuration/WebhookInstance.php | 139 + .../V1/Configuration/WebhookList.php | 61 + .../V1/Configuration/WebhookOptions.php | 148 + .../V1/Configuration/WebhookPage.php | 55 + .../Conversations/V1/ConfigurationContext.php | 109 + .../V1/ConfigurationInstance.php | 139 + .../Conversations/V1/ConfigurationList.php | 118 + .../Conversations/V1/ConfigurationOptions.php | 132 + .../Conversations/V1/ConfigurationPage.php | 55 + .../Message/DeliveryReceiptContext.php | 93 + .../Message/DeliveryReceiptInstance.php | 140 + .../Message/DeliveryReceiptList.php | 175 + .../Message/DeliveryReceiptPage.php | 55 + .../V1/Conversation/MessageContext.php | 205 + .../V1/Conversation/MessageInstance.php | 184 + .../V1/Conversation/MessageList.php | 220 + .../V1/Conversation/MessageOptions.php | 468 + .../V1/Conversation/MessagePage.php | 55 + .../V1/Conversation/ParticipantContext.php | 154 + .../V1/Conversation/ParticipantInstance.php | 167 + .../V1/Conversation/ParticipantList.php | 214 + .../V1/Conversation/ParticipantOptions.php | 490 + .../V1/Conversation/ParticipantPage.php | 55 + .../V1/Conversation/WebhookContext.php | 139 + .../V1/Conversation/WebhookInstance.php | 158 + .../V1/Conversation/WebhookList.php | 211 + .../V1/Conversation/WebhookOptions.php | 292 + .../V1/Conversation/WebhookPage.php | 55 + .../Conversations/V1/ConversationContext.php | 243 + .../Conversations/V1/ConversationInstance.php | 200 + .../Conversations/V1/ConversationList.php | 218 + .../Conversations/V1/ConversationOptions.php | 590 + .../Conversations/V1/ConversationPage.php | 55 + .../Conversations/V1/CredentialContext.php | 136 + .../Conversations/V1/CredentialInstance.php | 156 + .../Rest/Conversations/V1/CredentialList.php | 203 + .../Conversations/V1/CredentialOptions.php | 330 + .../Rest/Conversations/V1/CredentialPage.php | 55 + .../V1/ParticipantConversationInstance.php | 111 + .../V1/ParticipantConversationList.php | 154 + .../V1/ParticipantConversationOptions.php | 94 + .../V1/ParticipantConversationPage.php | 55 + .../Rest/Conversations/V1/RoleContext.php | 121 + .../Rest/Conversations/V1/RoleInstance.php | 157 + .../Twilio/Rest/Conversations/V1/RoleList.php | 193 + .../Twilio/Rest/Conversations/V1/RolePage.php | 55 + .../V1/Service/BindingContext.php | 100 + .../V1/Service/BindingInstance.php | 150 + .../Conversations/V1/Service/BindingList.php | 178 + .../V1/Service/BindingOptions.php | 98 + .../Conversations/V1/Service/BindingPage.php | 55 + .../Configuration/NotificationContext.php | 135 + .../Configuration/NotificationInstance.php | 141 + .../Configuration/NotificationList.php | 67 + .../Configuration/NotificationOptions.php | 294 + .../Configuration/NotificationPage.php | 55 + .../Service/Configuration/WebhookContext.php | 117 + .../Service/Configuration/WebhookInstance.php | 141 + .../V1/Service/Configuration/WebhookList.php | 67 + .../Service/Configuration/WebhookOptions.php | 132 + .../V1/Service/Configuration/WebhookPage.php | 55 + .../V1/Service/ConfigurationContext.php | 117 + .../V1/Service/ConfigurationInstance.php | 141 + .../V1/Service/ConfigurationList.php | 143 + .../V1/Service/ConfigurationOptions.php | 132 + .../V1/Service/ConfigurationPage.php | 55 + .../Message/DeliveryReceiptContext.php | 99 + .../Message/DeliveryReceiptInstance.php | 144 + .../Message/DeliveryReceiptList.php | 182 + .../Message/DeliveryReceiptPage.php | 55 + .../Service/Conversation/MessageContext.php | 213 + .../Service/Conversation/MessageInstance.php | 188 + .../V1/Service/Conversation/MessageList.php | 228 + .../Service/Conversation/MessageOptions.php | 468 + .../V1/Service/Conversation/MessagePage.php | 55 + .../Conversation/ParticipantContext.php | 161 + .../Conversation/ParticipantInstance.php | 171 + .../Service/Conversation/ParticipantList.php | 222 + .../Conversation/ParticipantOptions.php | 490 + .../Service/Conversation/ParticipantPage.php | 55 + .../Service/Conversation/WebhookContext.php | 146 + .../Service/Conversation/WebhookInstance.php | 162 + .../V1/Service/Conversation/WebhookList.php | 219 + .../Service/Conversation/WebhookOptions.php | 292 + .../V1/Service/Conversation/WebhookPage.php | 55 + .../V1/Service/ConversationContext.php | 253 + .../V1/Service/ConversationInstance.php | 202 + .../V1/Service/ConversationList.php | 226 + .../V1/Service/ConversationOptions.php | 590 + .../V1/Service/ConversationPage.php | 55 + .../ParticipantConversationInstance.php | 112 + .../Service/ParticipantConversationList.php | 160 + .../ParticipantConversationOptions.php | 94 + .../Service/ParticipantConversationPage.php | 55 + .../Conversations/V1/Service/RoleContext.php | 128 + .../Conversations/V1/Service/RoleInstance.php | 159 + .../Conversations/V1/Service/RoleList.php | 201 + .../Conversations/V1/Service/RolePage.php | 55 + .../Service/User/UserConversationContext.php | 142 + .../Service/User/UserConversationInstance.php | 180 + .../V1/Service/User/UserConversationList.php | 175 + .../Service/User/UserConversationOptions.php | 116 + .../V1/Service/User/UserConversationPage.php | 55 + .../Conversations/V1/Service/UserContext.php | 200 + .../Conversations/V1/Service/UserInstance.php | 180 + .../Conversations/V1/Service/UserList.php | 206 + .../Conversations/V1/Service/UserOptions.php | 292 + .../Conversations/V1/Service/UserPage.php | 55 + .../Rest/Conversations/V1/ServiceContext.php | 246 + .../Rest/Conversations/V1/ServiceInstance.php | 201 + .../Rest/Conversations/V1/ServiceList.php | 186 + .../Rest/Conversations/V1/ServicePage.php | 55 + .../V1/User/UserConversationContext.php | 135 + .../V1/User/UserConversationInstance.php | 178 + .../V1/User/UserConversationList.php | 168 + .../V1/User/UserConversationOptions.php | 116 + .../V1/User/UserConversationPage.php | 55 + .../Rest/Conversations/V1/UserContext.php | 192 + .../Rest/Conversations/V1/UserInstance.php | 178 + .../Twilio/Rest/Conversations/V1/UserList.php | 198 + .../Rest/Conversations/V1/UserOptions.php | 292 + .../Twilio/Rest/Conversations/V1/UserPage.php | 55 + app/api/Twilio/Rest/ConversationsBase.php | 88 + app/api/Twilio/Rest/Events.php | 76 + app/api/Twilio/Rest/Events/V1.php | 131 + .../Rest/Events/V1/EventTypeContext.php | 81 + .../Rest/Events/V1/EventTypeInstance.php | 128 + .../Twilio/Rest/Events/V1/EventTypeList.php | 168 + .../Rest/Events/V1/EventTypeOptions.php | 78 + .../Twilio/Rest/Events/V1/EventTypePage.php | 55 + .../Events/V1/Schema/SchemaVersionContext.php | 87 + .../V1/Schema/SchemaVersionInstance.php | 126 + .../Events/V1/Schema/SchemaVersionList.php | 168 + .../Events/V1/Schema/SchemaVersionPage.php | 55 + .../Twilio/Rest/Events/V1/SchemaContext.php | 139 + .../Twilio/Rest/Events/V1/SchemaInstance.php | 135 + app/api/Twilio/Rest/Events/V1/SchemaList.php | 65 + app/api/Twilio/Rest/Events/V1/SchemaPage.php | 55 + .../Rest/Events/V1/Sink/SinkTestInstance.php | 81 + .../Rest/Events/V1/Sink/SinkTestList.php | 77 + .../Rest/Events/V1/Sink/SinkTestPage.php | 55 + .../Events/V1/Sink/SinkValidateInstance.php | 81 + .../Rest/Events/V1/Sink/SinkValidateList.php | 84 + .../Rest/Events/V1/Sink/SinkValidatePage.php | 55 + app/api/Twilio/Rest/Events/V1/SinkContext.php | 195 + .../Twilio/Rest/Events/V1/SinkInstance.php | 178 + app/api/Twilio/Rest/Events/V1/SinkList.php | 202 + app/api/Twilio/Rest/Events/V1/SinkOptions.php | 102 + app/api/Twilio/Rest/Events/V1/SinkPage.php | 55 + .../Subscription/SubscribedEventContext.php | 130 + .../Subscription/SubscribedEventInstance.php | 151 + .../V1/Subscription/SubscribedEventList.php | 200 + .../Subscription/SubscribedEventOptions.php | 134 + .../V1/Subscription/SubscribedEventPage.php | 55 + .../Rest/Events/V1/SubscriptionContext.php | 183 + .../Rest/Events/V1/SubscriptionInstance.php | 167 + .../Rest/Events/V1/SubscriptionList.php | 200 + .../Rest/Events/V1/SubscriptionOptions.php | 152 + .../Rest/Events/V1/SubscriptionPage.php | 55 + app/api/Twilio/Rest/EventsBase.php | 88 + app/api/Twilio/Rest/FlexApi.php | 118 + app/api/Twilio/Rest/FlexApi/V1.php | 268 + .../Rest/FlexApi/V1/AssessmentsContext.php | 100 + .../Rest/FlexApi/V1/AssessmentsInstance.php | 146 + .../Rest/FlexApi/V1/AssessmentsList.php | 233 + .../Rest/FlexApi/V1/AssessmentsOptions.php | 198 + .../Rest/FlexApi/V1/AssessmentsPage.php | 55 + .../Twilio/Rest/FlexApi/V1/ChannelContext.php | 94 + .../Rest/FlexApi/V1/ChannelInstance.php | 142 + .../Twilio/Rest/FlexApi/V1/ChannelList.php | 212 + .../Twilio/Rest/FlexApi/V1/ChannelOptions.php | 172 + .../Twilio/Rest/FlexApi/V1/ChannelPage.php | 55 + .../Rest/FlexApi/V1/ConfigurationContext.php | 85 + .../Rest/FlexApi/V1/ConfigurationInstance.php | 204 + .../Rest/FlexApi/V1/ConfigurationList.php | 61 + .../Rest/FlexApi/V1/ConfigurationOptions.php | 76 + .../Rest/FlexApi/V1/ConfigurationPage.php | 55 + .../Rest/FlexApi/V1/FlexFlowContext.php | 156 + .../Rest/FlexApi/V1/FlexFlowInstance.php | 168 + .../Twilio/Rest/FlexApi/V1/FlexFlowList.php | 231 + .../Rest/FlexApi/V1/FlexFlowOptions.php | 700 + .../Twilio/Rest/FlexApi/V1/FlexFlowPage.php | 55 + .../V1/InsightsAssessmentsCommentInstance.php | 102 + .../V1/InsightsAssessmentsCommentList.php | 207 + .../V1/InsightsAssessmentsCommentOptions.php | 164 + .../V1/InsightsAssessmentsCommentPage.php | 55 + .../V1/InsightsConversationsInstance.php | 86 + .../FlexApi/V1/InsightsConversationsList.php | 154 + .../V1/InsightsConversationsOptions.php | 94 + .../FlexApi/V1/InsightsConversationsPage.php | 55 + .../InsightsQuestionnairesCategoryContext.php | 112 + ...InsightsQuestionnairesCategoryInstance.php | 137 + .../V1/InsightsQuestionnairesCategoryList.php | 194 + .../InsightsQuestionnairesCategoryOptions.php | 232 + .../V1/InsightsQuestionnairesCategoryPage.php | 55 + .../V1/InsightsQuestionnairesContext.php | 143 + .../V1/InsightsQuestionnairesInstance.php | 156 + .../FlexApi/V1/InsightsQuestionnairesList.php | 207 + .../V1/InsightsQuestionnairesOptions.php | 410 + .../FlexApi/V1/InsightsQuestionnairesPage.php | 55 + .../InsightsQuestionnairesQuestionContext.php | 121 + ...InsightsQuestionnairesQuestionInstance.php | 149 + .../V1/InsightsQuestionnairesQuestionList.php | 212 + .../InsightsQuestionnairesQuestionOptions.php | 340 + .../V1/InsightsQuestionnairesQuestionPage.php | 55 + .../FlexApi/V1/InsightsSegmentsContext.php | 88 + .../FlexApi/V1/InsightsSegmentsInstance.php | 159 + .../Rest/FlexApi/V1/InsightsSegmentsList.php | 171 + .../FlexApi/V1/InsightsSegmentsOptions.php | 146 + .../Rest/FlexApi/V1/InsightsSegmentsPage.php | 55 + .../FlexApi/V1/InsightsSessionContext.php | 82 + .../FlexApi/V1/InsightsSessionInstance.php | 123 + .../Rest/FlexApi/V1/InsightsSessionList.php | 61 + .../FlexApi/V1/InsightsSessionOptions.php | 76 + .../Rest/FlexApi/V1/InsightsSessionPage.php | 55 + .../V1/InsightsSettingsAnswerSetsInstance.php | 88 + .../V1/InsightsSettingsAnswerSetsList.php | 77 + .../V1/InsightsSettingsAnswerSetsOptions.php | 76 + .../V1/InsightsSettingsAnswerSetsPage.php | 55 + .../V1/InsightsSettingsCommentInstance.php | 84 + .../V1/InsightsSettingsCommentList.php | 77 + .../V1/InsightsSettingsCommentOptions.php | 76 + .../V1/InsightsSettingsCommentPage.php | 55 + .../FlexApi/V1/InsightsUserRolesContext.php | 82 + .../FlexApi/V1/InsightsUserRolesInstance.php | 117 + .../Rest/FlexApi/V1/InsightsUserRolesList.php | 61 + .../FlexApi/V1/InsightsUserRolesOptions.php | 76 + .../Rest/FlexApi/V1/InsightsUserRolesPage.php | 55 + .../InteractionChannelInviteInstance.php | 90 + .../InteractionChannelInviteList.php | 185 + .../InteractionChannelInvitePage.php | 55 + .../InteractionChannelParticipantContext.php | 100 + .../InteractionChannelParticipantInstance.php | 128 + .../InteractionChannelParticipantList.php | 206 + .../InteractionChannelParticipantPage.php | 55 + .../Interaction/InteractionChannelContext.php | 199 + .../InteractionChannelInstance.php | 167 + .../V1/Interaction/InteractionChannelList.php | 168 + .../Interaction/InteractionChannelOptions.php | 80 + .../V1/Interaction/InteractionChannelPage.php | 55 + .../Rest/FlexApi/V1/InteractionContext.php | 139 + .../Rest/FlexApi/V1/InteractionInstance.php | 134 + .../Rest/FlexApi/V1/InteractionList.php | 97 + .../Rest/FlexApi/V1/InteractionPage.php | 55 + .../Rest/FlexApi/V1/WebChannelContext.php | 125 + .../Rest/FlexApi/V1/WebChannelInstance.php | 152 + .../Twilio/Rest/FlexApi/V1/WebChannelList.php | 203 + .../Rest/FlexApi/V1/WebChannelOptions.php | 168 + .../Twilio/Rest/FlexApi/V1/WebChannelPage.php | 55 + app/api/Twilio/Rest/FlexApi/V2.php | 94 + .../Rest/FlexApi/V2/WebChannelsInstance.php | 82 + .../Rest/FlexApi/V2/WebChannelsList.php | 87 + .../Rest/FlexApi/V2/WebChannelsOptions.php | 112 + .../Rest/FlexApi/V2/WebChannelsPage.php | 55 + app/api/Twilio/Rest/FlexApiBase.php | 101 + app/api/Twilio/Rest/FrontlineApi.php | 25 + app/api/Twilio/Rest/FrontlineApi/V1.php | 95 + .../Rest/FrontlineApi/V1/UserContext.php | 117 + .../Rest/FrontlineApi/V1/UserInstance.php | 141 + .../Twilio/Rest/FrontlineApi/V1/UserList.php | 65 + .../Rest/FrontlineApi/V1/UserOptions.php | 130 + .../Twilio/Rest/FrontlineApi/V1/UserPage.php | 55 + app/api/Twilio/Rest/FrontlineApiBase.php | 88 + app/api/Twilio/Rest/Insights.php | 83 + app/api/Twilio/Rest/Insights/V1.php | 141 + .../Insights/V1/Call/AnnotationContext.php | 123 + .../Insights/V1/Call/AnnotationInstance.php | 147 + .../Rest/Insights/V1/Call/AnnotationList.php | 67 + .../Insights/V1/Call/AnnotationOptions.php | 182 + .../Rest/Insights/V1/Call/AnnotationPage.php | 55 + .../Insights/V1/Call/CallSummaryContext.php | 91 + .../Insights/V1/Call/CallSummaryInstance.php | 162 + .../Rest/Insights/V1/Call/CallSummaryList.php | 67 + .../Insights/V1/Call/CallSummaryOptions.php | 76 + .../Rest/Insights/V1/Call/CallSummaryPage.php | 55 + .../Rest/Insights/V1/Call/EventInstance.php | 101 + .../Rest/Insights/V1/Call/EventList.php | 158 + .../Rest/Insights/V1/Call/EventOptions.php | 76 + .../Rest/Insights/V1/Call/EventPage.php | 55 + .../Rest/Insights/V1/Call/MetricInstance.php | 97 + .../Rest/Insights/V1/Call/MetricList.php | 160 + .../Rest/Insights/V1/Call/MetricOptions.php | 94 + .../Rest/Insights/V1/Call/MetricPage.php | 55 + .../Twilio/Rest/Insights/V1/CallContext.php | 194 + .../Twilio/Rest/Insights/V1/CallInstance.php | 160 + app/api/Twilio/Rest/Insights/V1/CallList.php | 65 + app/api/Twilio/Rest/Insights/V1/CallPage.php | 55 + .../Insights/V1/CallSummariesInstance.php | 123 + .../Rest/Insights/V1/CallSummariesList.php | 189 + .../Rest/Insights/V1/CallSummariesOptions.php | 400 + .../Rest/Insights/V1/CallSummariesPage.php | 55 + .../ConferenceParticipantContext.php | 99 + .../ConferenceParticipantInstance.php | 172 + .../Conference/ConferenceParticipantList.php | 179 + .../ConferenceParticipantOptions.php | 182 + .../Conference/ConferenceParticipantPage.php | 55 + .../Rest/Insights/V1/ConferenceContext.php | 139 + .../Rest/Insights/V1/ConferenceInstance.php | 171 + .../Rest/Insights/V1/ConferenceList.php | 186 + .../Rest/Insights/V1/ConferenceOptions.php | 240 + .../Rest/Insights/V1/ConferencePage.php | 55 + .../Insights/V1/Room/ParticipantContext.php | 87 + .../Insights/V1/Room/ParticipantInstance.php | 150 + .../Rest/Insights/V1/Room/ParticipantList.php | 168 + .../Rest/Insights/V1/Room/ParticipantPage.php | 55 + .../Twilio/Rest/Insights/V1/RoomContext.php | 139 + .../Twilio/Rest/Insights/V1/RoomInstance.php | 177 + app/api/Twilio/Rest/Insights/V1/RoomList.php | 177 + .../Twilio/Rest/Insights/V1/RoomOptions.php | 150 + app/api/Twilio/Rest/Insights/V1/RoomPage.php | 55 + .../Rest/Insights/V1/SettingContext.php | 116 + .../Rest/Insights/V1/SettingInstance.php | 134 + .../Twilio/Rest/Insights/V1/SettingList.php | 61 + .../Rest/Insights/V1/SettingOptions.php | 164 + .../Twilio/Rest/Insights/V1/SettingPage.php | 55 + app/api/Twilio/Rest/InsightsBase.php | 88 + app/api/Twilio/Rest/IpMessaging.php | 42 + app/api/Twilio/Rest/IpMessaging/V1.php | 107 + .../Rest/IpMessaging/V1/CredentialContext.php | 134 + .../IpMessaging/V1/CredentialInstance.php | 156 + .../Rest/IpMessaging/V1/CredentialList.php | 203 + .../Rest/IpMessaging/V1/CredentialOptions.php | 314 + .../Rest/IpMessaging/V1/CredentialPage.php | 55 + .../V1/Service/Channel/InviteContext.php | 106 + .../V1/Service/Channel/InviteInstance.php | 150 + .../V1/Service/Channel/InviteList.php | 215 + .../V1/Service/Channel/InviteOptions.php | 132 + .../V1/Service/Channel/InvitePage.php | 55 + .../V1/Service/Channel/MemberContext.php | 139 + .../V1/Service/Channel/MemberInstance.php | 166 + .../V1/Service/Channel/MemberList.php | 215 + .../V1/Service/Channel/MemberOptions.php | 202 + .../V1/Service/Channel/MemberPage.php | 55 + .../V1/Service/Channel/MessageContext.php | 139 + .../V1/Service/Channel/MessageInstance.php | 170 + .../V1/Service/Channel/MessageList.php | 216 + .../V1/Service/Channel/MessageOptions.php | 220 + .../V1/Service/Channel/MessagePage.php | 55 + .../IpMessaging/V1/Service/ChannelContext.php | 233 + .../V1/Service/ChannelInstance.php | 201 + .../IpMessaging/V1/Service/ChannelList.php | 209 + .../IpMessaging/V1/Service/ChannelOptions.php | 272 + .../IpMessaging/V1/Service/ChannelPage.php | 55 + .../IpMessaging/V1/Service/RoleContext.php | 128 + .../IpMessaging/V1/Service/RoleInstance.php | 159 + .../Rest/IpMessaging/V1/Service/RoleList.php | 201 + .../Rest/IpMessaging/V1/Service/RolePage.php | 55 + .../V1/Service/User/UserChannelInstance.php | 96 + .../V1/Service/User/UserChannelList.php | 157 + .../V1/Service/User/UserChannelPage.php | 55 + .../IpMessaging/V1/Service/UserContext.php | 192 + .../IpMessaging/V1/Service/UserInstance.php | 181 + .../Rest/IpMessaging/V1/Service/UserList.php | 204 + .../IpMessaging/V1/Service/UserOptions.php | 206 + .../Rest/IpMessaging/V1/Service/UserPage.php | 55 + .../Rest/IpMessaging/V1/ServiceContext.php | 326 + .../Rest/IpMessaging/V1/ServiceInstance.php | 213 + .../Rest/IpMessaging/V1/ServiceList.php | 186 + .../Rest/IpMessaging/V1/ServiceOptions.php | 1038 + .../Rest/IpMessaging/V1/ServicePage.php | 55 + app/api/Twilio/Rest/IpMessaging/V2.php | 107 + .../Rest/IpMessaging/V2/CredentialContext.php | 134 + .../IpMessaging/V2/CredentialInstance.php | 156 + .../Rest/IpMessaging/V2/CredentialList.php | 203 + .../Rest/IpMessaging/V2/CredentialOptions.php | 314 + .../Rest/IpMessaging/V2/CredentialPage.php | 55 + .../IpMessaging/V2/Service/BindingContext.php | 100 + .../V2/Service/BindingInstance.php | 152 + .../IpMessaging/V2/Service/BindingList.php | 178 + .../IpMessaging/V2/Service/BindingOptions.php | 98 + .../IpMessaging/V2/Service/BindingPage.php | 55 + .../V2/Service/Channel/InviteContext.php | 106 + .../V2/Service/Channel/InviteInstance.php | 150 + .../V2/Service/Channel/InviteList.php | 215 + .../V2/Service/Channel/InviteOptions.php | 132 + .../V2/Service/Channel/InvitePage.php | 55 + .../V2/Service/Channel/MemberContext.php | 155 + .../V2/Service/Channel/MemberInstance.php | 169 + .../V2/Service/Channel/MemberList.php | 227 + .../V2/Service/Channel/MemberOptions.php | 450 + .../V2/Service/Channel/MemberPage.php | 55 + .../V2/Service/Channel/MessageContext.php | 155 + .../V2/Service/Channel/MessageInstance.php | 177 + .../V2/Service/Channel/MessageList.php | 226 + .../V2/Service/Channel/MessageOptions.php | 468 + .../V2/Service/Channel/MessagePage.php | 55 + .../V2/Service/Channel/WebhookContext.php | 148 + .../V2/Service/Channel/WebhookInstance.php | 162 + .../V2/Service/Channel/WebhookList.php | 219 + .../V2/Service/Channel/WebhookOptions.php | 310 + .../V2/Service/Channel/WebhookPage.php | 55 + .../IpMessaging/V2/Service/ChannelContext.php | 267 + .../V2/Service/ChannelInstance.php | 212 + .../IpMessaging/V2/Service/ChannelList.php | 218 + .../IpMessaging/V2/Service/ChannelOptions.php | 466 + .../IpMessaging/V2/Service/ChannelPage.php | 55 + .../IpMessaging/V2/Service/RoleContext.php | 128 + .../IpMessaging/V2/Service/RoleInstance.php | 159 + .../Rest/IpMessaging/V2/Service/RoleList.php | 201 + .../Rest/IpMessaging/V2/Service/RolePage.php | 55 + .../V2/Service/User/UserBindingContext.php | 106 + .../V2/Service/User/UserBindingInstance.php | 154 + .../V2/Service/User/UserBindingList.php | 182 + .../V2/Service/User/UserBindingOptions.php | 80 + .../V2/Service/User/UserBindingPage.php | 55 + .../V2/Service/User/UserChannelContext.php | 142 + .../V2/Service/User/UserChannelInstance.php | 165 + .../V2/Service/User/UserChannelList.php | 175 + .../V2/Service/User/UserChannelOptions.php | 116 + .../V2/Service/User/UserChannelPage.php | 55 + .../IpMessaging/V2/Service/UserContext.php | 215 + .../IpMessaging/V2/Service/UserInstance.php | 191 + .../Rest/IpMessaging/V2/Service/UserList.php | 206 + .../IpMessaging/V2/Service/UserOptions.php | 242 + .../Rest/IpMessaging/V2/Service/UserPage.php | 55 + .../Rest/IpMessaging/V2/ServiceContext.php | 299 + .../Rest/IpMessaging/V2/ServiceInstance.php | 227 + .../Rest/IpMessaging/V2/ServiceList.php | 186 + .../Rest/IpMessaging/V2/ServiceOptions.php | 624 + .../Rest/IpMessaging/V2/ServicePage.php | 55 + app/api/Twilio/Rest/IpMessagingBase.php | 101 + app/api/Twilio/Rest/Lookups.php | 25 + app/api/Twilio/Rest/Lookups/V1.php | 95 + .../Rest/Lookups/V1/PhoneNumberContext.php | 97 + .../Rest/Lookups/V1/PhoneNumberInstance.php | 129 + .../Rest/Lookups/V1/PhoneNumberList.php | 65 + .../Rest/Lookups/V1/PhoneNumberOptions.php | 130 + .../Rest/Lookups/V1/PhoneNumberPage.php | 55 + app/api/Twilio/Rest/Lookups/V2.php | 95 + .../Rest/Lookups/V2/PhoneNumberContext.php | 113 + .../Rest/Lookups/V2/PhoneNumberInstance.php | 143 + .../Rest/Lookups/V2/PhoneNumberList.php | 65 + .../Rest/Lookups/V2/PhoneNumberOptions.php | 274 + .../Rest/Lookups/V2/PhoneNumberPage.php | 55 + app/api/Twilio/Rest/LookupsBase.php | 101 + app/api/Twilio/Rest/Media.php | 59 + app/api/Twilio/Rest/Media/V1.php | 119 + .../Rest/Media/V1/MediaProcessorContext.php | 107 + .../Rest/Media/V1/MediaProcessorInstance.php | 151 + .../Rest/Media/V1/MediaProcessorList.php | 210 + .../Rest/Media/V1/MediaProcessorOptions.php | 204 + .../Rest/Media/V1/MediaProcessorPage.php | 55 + .../Rest/Media/V1/MediaRecordingContext.php | 94 + .../Rest/Media/V1/MediaRecordingInstance.php | 156 + .../Rest/Media/V1/MediaRecordingList.php | 174 + .../Rest/Media/V1/MediaRecordingOptions.php | 134 + .../Rest/Media/V1/MediaRecordingPage.php | 55 + .../PlayerStreamer/PlaybackGrantContext.php | 112 + .../PlayerStreamer/PlaybackGrantInstance.php | 138 + .../V1/PlayerStreamer/PlaybackGrantList.php | 67 + .../PlayerStreamer/PlaybackGrantOptions.php | 96 + .../V1/PlayerStreamer/PlaybackGrantPage.php | 55 + .../Rest/Media/V1/PlayerStreamerContext.php | 165 + .../Rest/Media/V1/PlayerStreamerInstance.php | 162 + .../Rest/Media/V1/PlayerStreamerList.php | 204 + .../Rest/Media/V1/PlayerStreamerOptions.php | 204 + .../Rest/Media/V1/PlayerStreamerPage.php | 55 + app/api/Twilio/Rest/MediaBase.php | 88 + app/api/Twilio/Rest/Messaging.php | 126 + app/api/Twilio/Rest/Messaging/V1.php | 197 + .../BrandRegistrationOtpInstance.php | 83 + .../BrandRegistrationOtpList.php | 77 + .../BrandRegistrationOtpPage.php | 55 + .../BrandRegistration/BrandVettingContext.php | 87 + .../BrandVettingInstance.php | 136 + .../V1/BrandRegistration/BrandVettingList.php | 206 + .../BrandRegistration/BrandVettingOptions.php | 130 + .../V1/BrandRegistration/BrandVettingPage.php | 55 + .../Messaging/V1/BrandRegistrationContext.php | 176 + .../V1/BrandRegistrationInstance.php | 187 + .../Messaging/V1/BrandRegistrationList.php | 200 + .../Messaging/V1/BrandRegistrationOptions.php | 118 + .../Messaging/V1/BrandRegistrationPage.php | 55 + .../Messaging/V1/DeactivationsContext.php | 86 + .../Messaging/V1/DeactivationsInstance.php | 115 + .../Rest/Messaging/V1/DeactivationsList.php | 61 + .../Messaging/V1/DeactivationsOptions.php | 76 + .../Rest/Messaging/V1/DeactivationsPage.php | 55 + .../Rest/Messaging/V1/DomainCertsContext.php | 120 + .../Rest/Messaging/V1/DomainCertsInstance.php | 155 + .../Rest/Messaging/V1/DomainCertsList.php | 65 + .../Rest/Messaging/V1/DomainCertsPage.php | 55 + .../Rest/Messaging/V1/DomainConfigContext.php | 118 + .../Messaging/V1/DomainConfigInstance.php | 145 + .../Rest/Messaging/V1/DomainConfigList.php | 65 + .../DomainConfigMessagingServiceContext.php | 81 + .../DomainConfigMessagingServiceInstance.php | 130 + .../V1/DomainConfigMessagingServiceList.php | 65 + .../V1/DomainConfigMessagingServicePage.php | 55 + .../Rest/Messaging/V1/DomainConfigOptions.php | 114 + .../Rest/Messaging/V1/DomainConfigPage.php | 55 + .../Messaging/V1/ExternalCampaignInstance.php | 89 + .../Messaging/V1/ExternalCampaignList.php | 80 + .../Messaging/V1/ExternalCampaignPage.php | 55 + .../LinkshorteningMessagingServiceContext.php | 100 + ...LinkshorteningMessagingServiceInstance.php | 133 + .../V1/LinkshorteningMessagingServiceList.php | 69 + .../V1/LinkshorteningMessagingServicePage.php | 55 + .../V1/Service/AlphaSenderContext.php | 100 + .../V1/Service/AlphaSenderInstance.php | 144 + .../Messaging/V1/Service/AlphaSenderList.php | 194 + .../Messaging/V1/Service/AlphaSenderPage.php | 55 + .../V1/Service/PhoneNumberContext.php | 100 + .../V1/Service/PhoneNumberInstance.php | 146 + .../Messaging/V1/Service/PhoneNumberList.php | 194 + .../Messaging/V1/Service/PhoneNumberPage.php | 55 + .../Messaging/V1/Service/ShortCodeContext.php | 100 + .../V1/Service/ShortCodeInstance.php | 146 + .../Messaging/V1/Service/ShortCodeList.php | 194 + .../Messaging/V1/Service/ShortCodePage.php | 55 + .../V1/Service/UsAppToPersonContext.php | 100 + .../V1/Service/UsAppToPersonInstance.php | 176 + .../V1/Service/UsAppToPersonList.php | 229 + .../V1/Service/UsAppToPersonOptions.php | 172 + .../V1/Service/UsAppToPersonPage.php | 55 + .../Service/UsAppToPersonUsecaseInstance.php | 81 + .../V1/Service/UsAppToPersonUsecaseList.php | 87 + .../Service/UsAppToPersonUsecaseOptions.php | 76 + .../V1/Service/UsAppToPersonUsecasePage.php | 55 + .../Rest/Messaging/V1/ServiceContext.php | 287 + .../Rest/Messaging/V1/ServiceInstance.php | 237 + .../Twilio/Rest/Messaging/V1/ServiceList.php | 221 + .../Rest/Messaging/V1/ServiceOptions.php | 652 + .../Twilio/Rest/Messaging/V1/ServicePage.php | 55 + .../V1/TollfreeVerificationContext.php | 149 + .../V1/TollfreeVerificationInstance.php | 192 + .../Messaging/V1/TollfreeVerificationList.php | 252 + .../V1/TollfreeVerificationOptions.php | 756 + .../Messaging/V1/TollfreeVerificationPage.php | 55 + .../Rest/Messaging/V1/UsecaseInstance.php | 80 + .../Twilio/Rest/Messaging/V1/UsecaseList.php | 70 + .../Twilio/Rest/Messaging/V1/UsecasePage.php | 55 + app/api/Twilio/Rest/MessagingBase.php | 88 + app/api/Twilio/Rest/Microvisor.php | 42 + app/api/Twilio/Rest/Microvisor/V1.php | 131 + .../Microvisor/V1/AccountConfigContext.php | 120 + .../Microvisor/V1/AccountConfigInstance.php | 147 + .../Rest/Microvisor/V1/AccountConfigList.php | 189 + .../Rest/Microvisor/V1/AccountConfigPage.php | 55 + .../Microvisor/V1/AccountSecretContext.php | 120 + .../Microvisor/V1/AccountSecretInstance.php | 145 + .../Rest/Microvisor/V1/AccountSecretList.php | 189 + .../Rest/Microvisor/V1/AccountSecretPage.php | 55 + .../Microvisor/V1/App/AppManifestContext.php | 81 + .../Microvisor/V1/App/AppManifestInstance.php | 121 + .../Microvisor/V1/App/AppManifestList.php | 67 + .../Microvisor/V1/App/AppManifestPage.php | 55 + .../Twilio/Rest/Microvisor/V1/AppContext.php | 152 + .../Twilio/Rest/Microvisor/V1/AppInstance.php | 153 + app/api/Twilio/Rest/Microvisor/V1/AppList.php | 161 + app/api/Twilio/Rest/Microvisor/V1/AppPage.php | 55 + .../V1/Device/DeviceConfigContext.php | 127 + .../V1/Device/DeviceConfigInstance.php | 151 + .../Microvisor/V1/Device/DeviceConfigList.php | 197 + .../Microvisor/V1/Device/DeviceConfigPage.php | 55 + .../V1/Device/DeviceSecretContext.php | 127 + .../V1/Device/DeviceSecretInstance.php | 149 + .../Microvisor/V1/Device/DeviceSecretList.php | 197 + .../Microvisor/V1/Device/DeviceSecretPage.php | 55 + .../Rest/Microvisor/V1/DeviceContext.php | 192 + .../Rest/Microvisor/V1/DeviceInstance.php | 167 + .../Twilio/Rest/Microvisor/V1/DeviceList.php | 161 + .../Rest/Microvisor/V1/DeviceOptions.php | 116 + .../Twilio/Rest/Microvisor/V1/DevicePage.php | 55 + app/api/Twilio/Rest/MicrovisorBase.php | 88 + app/api/Twilio/Rest/Monitor.php | 41 + app/api/Twilio/Rest/Monitor/V1.php | 107 + .../Twilio/Rest/Monitor/V1/AlertContext.php | 81 + .../Twilio/Rest/Monitor/V1/AlertInstance.php | 152 + app/api/Twilio/Rest/Monitor/V1/AlertList.php | 173 + .../Twilio/Rest/Monitor/V1/AlertOptions.php | 114 + app/api/Twilio/Rest/Monitor/V1/AlertPage.php | 55 + .../Twilio/Rest/Monitor/V1/EventContext.php | 81 + .../Twilio/Rest/Monitor/V1/EventInstance.php | 142 + app/api/Twilio/Rest/Monitor/V1/EventList.php | 179 + .../Twilio/Rest/Monitor/V1/EventOptions.php | 168 + app/api/Twilio/Rest/Monitor/V1/EventPage.php | 55 + app/api/Twilio/Rest/MonitorBase.php | 88 + app/api/Twilio/Rest/Notify.php | 41 + app/api/Twilio/Rest/Notify/V1.php | 107 + .../Rest/Notify/V1/CredentialContext.php | 134 + .../Rest/Notify/V1/CredentialInstance.php | 156 + .../Twilio/Rest/Notify/V1/CredentialList.php | 203 + .../Rest/Notify/V1/CredentialOptions.php | 314 + .../Twilio/Rest/Notify/V1/CredentialPage.php | 55 + .../Rest/Notify/V1/Service/BindingContext.php | 100 + .../Notify/V1/Service/BindingInstance.php | 156 + .../Rest/Notify/V1/Service/BindingList.php | 225 + .../Rest/Notify/V1/Service/BindingOptions.php | 240 + .../Rest/Notify/V1/Service/BindingPage.php | 55 + .../V1/Service/NotificationInstance.php | 120 + .../Notify/V1/Service/NotificationList.php | 122 + .../Notify/V1/Service/NotificationOptions.php | 380 + .../Notify/V1/Service/NotificationPage.php | 55 + .../Twilio/Rest/Notify/V1/ServiceContext.php | 226 + .../Twilio/Rest/Notify/V1/ServiceInstance.php | 201 + app/api/Twilio/Rest/Notify/V1/ServiceList.php | 222 + .../Twilio/Rest/Notify/V1/ServiceOptions.php | 652 + app/api/Twilio/Rest/Notify/V1/ServicePage.php | 55 + app/api/Twilio/Rest/NotifyBase.php | 88 + app/api/Twilio/Rest/Numbers.php | 16 + app/api/Twilio/Rest/Numbers/V2.php | 94 + .../Bundle/BundleCopyInstance.php | 100 + .../Bundle/BundleCopyList.php | 180 + .../Bundle/BundleCopyOptions.php | 78 + .../Bundle/BundleCopyPage.php | 55 + .../Bundle/EvaluationContext.php | 87 + .../Bundle/EvaluationInstance.php | 132 + .../Bundle/EvaluationList.php | 188 + .../Bundle/EvaluationPage.php | 55 + .../Bundle/ItemAssignmentContext.php | 100 + .../Bundle/ItemAssignmentInstance.php | 140 + .../Bundle/ItemAssignmentList.php | 194 + .../Bundle/ItemAssignmentPage.php | 55 + .../Bundle/ReplaceItemsInstance.php | 100 + .../Bundle/ReplaceItemsList.php | 84 + .../Bundle/ReplaceItemsPage.php | 55 + .../V2/RegulatoryCompliance/BundleContext.php | 242 + .../RegulatoryCompliance/BundleInstance.php | 205 + .../V2/RegulatoryCompliance/BundleList.php | 230 + .../V2/RegulatoryCompliance/BundleOptions.php | 486 + .../V2/RegulatoryCompliance/BundlePage.php | 55 + .../RegulatoryCompliance/EndUserContext.php | 126 + .../RegulatoryCompliance/EndUserInstance.php | 156 + .../V2/RegulatoryCompliance/EndUserList.php | 196 + .../RegulatoryCompliance/EndUserOptions.php | 152 + .../V2/RegulatoryCompliance/EndUserPage.php | 55 + .../EndUserTypeContext.php | 81 + .../EndUserTypeInstance.php | 123 + .../RegulatoryCompliance/EndUserTypeList.php | 161 + .../RegulatoryCompliance/EndUserTypePage.php | 55 + .../RegulationContext.php | 81 + .../RegulationInstance.php | 127 + .../RegulatoryCompliance/RegulationList.php | 172 + .../RegulationOptions.php | 114 + .../RegulatoryCompliance/RegulationPage.php | 55 + .../SupportingDocumentContext.php | 126 + .../SupportingDocumentInstance.php | 162 + .../SupportingDocumentList.php | 196 + .../SupportingDocumentOptions.php | 152 + .../SupportingDocumentPage.php | 55 + .../SupportingDocumentTypeContext.php | 81 + .../SupportingDocumentTypeInstance.php | 123 + .../SupportingDocumentTypeList.php | 161 + .../SupportingDocumentTypePage.php | 55 + .../V2/RegulatoryComplianceInstance.php | 71 + .../Numbers/V2/RegulatoryComplianceList.php | 191 + .../Numbers/V2/RegulatoryCompliancePage.php | 55 + app/api/Twilio/Rest/NumbersBase.php | 88 + app/api/Twilio/Rest/Oauth.php | 71 + app/api/Twilio/Rest/Oauth/V1.php | 138 + .../Rest/Oauth/V1/DeviceCodeInstance.php | 90 + .../Twilio/Rest/Oauth/V1/DeviceCodeList.php | 87 + .../Rest/Oauth/V1/DeviceCodeOptions.php | 76 + .../Twilio/Rest/Oauth/V1/DeviceCodePage.php | 55 + app/api/Twilio/Rest/Oauth/V1/OauthContext.php | 75 + .../Twilio/Rest/Oauth/V1/OauthInstance.php | 115 + app/api/Twilio/Rest/Oauth/V1/OauthList.php | 61 + app/api/Twilio/Rest/Oauth/V1/OauthPage.php | 55 + .../Rest/Oauth/V1/OpenidDiscoveryContext.php | 75 + .../Rest/Oauth/V1/OpenidDiscoveryInstance.php | 137 + .../Rest/Oauth/V1/OpenidDiscoveryList.php | 61 + .../Rest/Oauth/V1/OpenidDiscoveryPage.php | 55 + .../Twilio/Rest/Oauth/V1/TokenInstance.php | 89 + app/api/Twilio/Rest/Oauth/V1/TokenList.php | 96 + app/api/Twilio/Rest/Oauth/V1/TokenOptions.php | 166 + app/api/Twilio/Rest/Oauth/V1/TokenPage.php | 55 + .../Twilio/Rest/Oauth/V1/UserInfoContext.php | 75 + .../Twilio/Rest/Oauth/V1/UserInfoInstance.php | 123 + app/api/Twilio/Rest/Oauth/V1/UserInfoList.php | 61 + app/api/Twilio/Rest/Oauth/V1/UserInfoPage.php | 55 + app/api/Twilio/Rest/OauthBase.php | 88 + app/api/Twilio/Rest/Preview.php | 178 + .../Twilio/Rest/Preview/DeployedDevices.php | 95 + .../Fleet/CertificateContext.php | 132 + .../Fleet/CertificateInstance.php | 160 + .../DeployedDevices/Fleet/CertificateList.php | 208 + .../Fleet/CertificateOptions.php | 220 + .../DeployedDevices/Fleet/CertificatePage.php | 55 + .../Fleet/DeploymentContext.php | 132 + .../Fleet/DeploymentInstance.php | 158 + .../DeployedDevices/Fleet/DeploymentList.php | 199 + .../Fleet/DeploymentOptions.php | 170 + .../DeployedDevices/Fleet/DeploymentPage.php | 55 + .../DeployedDevices/Fleet/DeviceContext.php | 137 + .../DeployedDevices/Fleet/DeviceInstance.php | 166 + .../DeployedDevices/Fleet/DeviceList.php | 212 + .../DeployedDevices/Fleet/DeviceOptions.php | 310 + .../DeployedDevices/Fleet/DevicePage.php | 55 + .../DeployedDevices/Fleet/KeyContext.php | 132 + .../DeployedDevices/Fleet/KeyInstance.php | 160 + .../Preview/DeployedDevices/Fleet/KeyList.php | 205 + .../DeployedDevices/Fleet/KeyOptions.php | 220 + .../Preview/DeployedDevices/Fleet/KeyPage.php | 55 + .../Preview/DeployedDevices/FleetContext.php | 240 + .../Preview/DeployedDevices/FleetInstance.php | 199 + .../Preview/DeployedDevices/FleetList.php | 189 + .../Preview/DeployedDevices/FleetOptions.php | 152 + .../Preview/DeployedDevices/FleetPage.php | 55 + app/api/Twilio/Rest/Preview/HostedNumbers.php | 107 + .../DependentHostedNumberOrderInstance.php | 125 + .../DependentHostedNumberOrderList.php | 166 + .../DependentHostedNumberOrderOptions.php | 148 + .../DependentHostedNumberOrderPage.php | 55 + .../AuthorizationDocumentContext.php | 180 + .../AuthorizationDocumentInstance.php | 157 + .../AuthorizationDocumentList.php | 213 + .../AuthorizationDocumentOptions.php | 306 + .../AuthorizationDocumentPage.php | 55 + .../HostedNumberOrderContext.php | 142 + .../HostedNumberOrderInstance.php | 187 + .../HostedNumbers/HostedNumberOrderList.php | 238 + .../HostedNumberOrderOptions.php | 664 + .../HostedNumbers/HostedNumberOrderPage.php | 55 + app/api/Twilio/Rest/Preview/Marketplace.php | 107 + .../AvailableAddOnExtensionContext.php | 87 + .../AvailableAddOnExtensionInstance.php | 127 + .../AvailableAddOnExtensionList.php | 168 + .../AvailableAddOnExtensionPage.php | 55 + .../Marketplace/AvailableAddOnContext.php | 139 + .../Marketplace/AvailableAddOnInstance.php | 138 + .../Marketplace/AvailableAddOnList.php | 161 + .../Marketplace/AvailableAddOnPage.php | 55 + .../InstalledAddOnExtensionContext.php | 115 + .../InstalledAddOnExtensionInstance.php | 142 + .../InstalledAddOnExtensionList.php | 168 + .../InstalledAddOnExtensionPage.php | 55 + .../Marketplace/InstalledAddOnContext.php | 184 + .../Marketplace/InstalledAddOnInstance.php | 171 + .../Marketplace/InstalledAddOnList.php | 198 + .../Marketplace/InstalledAddOnOptions.php | 170 + .../Marketplace/InstalledAddOnPage.php | 55 + app/api/Twilio/Rest/Preview/Sync.php | 95 + .../Document/DocumentPermissionContext.php | 141 + .../Document/DocumentPermissionInstance.php | 160 + .../Document/DocumentPermissionList.php | 175 + .../Document/DocumentPermissionPage.php | 55 + .../Preview/Sync/Service/DocumentContext.php | 193 + .../Preview/Sync/Service/DocumentInstance.php | 176 + .../Preview/Sync/Service/DocumentList.php | 200 + .../Preview/Sync/Service/DocumentOptions.php | 152 + .../Preview/Sync/Service/DocumentPage.php | 55 + .../Service/SyncList/SyncListItemContext.php | 146 + .../Service/SyncList/SyncListItemInstance.php | 166 + .../Service/SyncList/SyncListItemList.php | 214 + .../Service/SyncList/SyncListItemOptions.php | 220 + .../Service/SyncList/SyncListItemPage.php | 55 + .../SyncList/SyncListPermissionContext.php | 141 + .../SyncList/SyncListPermissionInstance.php | 160 + .../SyncList/SyncListPermissionList.php | 175 + .../SyncList/SyncListPermissionPage.php | 55 + .../Preview/Sync/Service/SyncListContext.php | 179 + .../Preview/Sync/Service/SyncListInstance.php | 169 + .../Preview/Sync/Service/SyncListList.php | 197 + .../Preview/Sync/Service/SyncListOptions.php | 82 + .../Preview/Sync/Service/SyncListPage.php | 55 + .../Service/SyncMap/SyncMapItemContext.php | 146 + .../Service/SyncMap/SyncMapItemInstance.php | 166 + .../Sync/Service/SyncMap/SyncMapItemList.php | 217 + .../Service/SyncMap/SyncMapItemOptions.php | 220 + .../Sync/Service/SyncMap/SyncMapItemPage.php | 55 + .../SyncMap/SyncMapPermissionContext.php | 141 + .../SyncMap/SyncMapPermissionInstance.php | 160 + .../Service/SyncMap/SyncMapPermissionList.php | 175 + .../Service/SyncMap/SyncMapPermissionPage.php | 55 + .../Preview/Sync/Service/SyncMapContext.php | 179 + .../Preview/Sync/Service/SyncMapInstance.php | 169 + .../Rest/Preview/Sync/Service/SyncMapList.php | 197 + .../Preview/Sync/Service/SyncMapOptions.php | 82 + .../Rest/Preview/Sync/Service/SyncMapPage.php | 55 + .../Rest/Preview/Sync/ServiceContext.php | 226 + .../Rest/Preview/Sync/ServiceInstance.php | 191 + .../Twilio/Rest/Preview/Sync/ServiceList.php | 196 + .../Rest/Preview/Sync/ServiceOptions.php | 242 + .../Twilio/Rest/Preview/Sync/ServicePage.php | 55 + app/api/Twilio/Rest/Preview/Understand.php | 95 + .../AssistantFallbackActionsContext.php | 111 + .../AssistantFallbackActionsInstance.php | 135 + .../AssistantFallbackActionsList.php | 67 + .../AssistantFallbackActionsOptions.php | 78 + .../AssistantFallbackActionsPage.php | 55 + .../AssistantInitiationActionsContext.php | 111 + .../AssistantInitiationActionsInstance.php | 135 + .../AssistantInitiationActionsList.php | 67 + .../AssistantInitiationActionsOptions.php | 78 + .../AssistantInitiationActionsPage.php | 55 + .../Understand/Assistant/DialogueContext.php | 87 + .../Understand/Assistant/DialogueInstance.php | 125 + .../Understand/Assistant/DialogueList.php | 71 + .../Understand/Assistant/DialoguePage.php | 55 + .../Assistant/FieldType/FieldValueContext.php | 106 + .../FieldType/FieldValueInstance.php | 150 + .../Assistant/FieldType/FieldValueList.php | 217 + .../Assistant/FieldType/FieldValueOptions.php | 132 + .../Assistant/FieldType/FieldValuePage.php | 55 + .../Understand/Assistant/FieldTypeContext.php | 191 + .../Assistant/FieldTypeInstance.php | 171 + .../Understand/Assistant/FieldTypeList.php | 200 + .../Understand/Assistant/FieldTypeOptions.php | 152 + .../Understand/Assistant/FieldTypePage.php | 55 + .../Assistant/ModelBuildContext.php | 130 + .../Assistant/ModelBuildInstance.php | 162 + .../Understand/Assistant/ModelBuildList.php | 199 + .../Assistant/ModelBuildOptions.php | 152 + .../Understand/Assistant/ModelBuildPage.php | 55 + .../Understand/Assistant/QueryContext.php | 132 + .../Understand/Assistant/QueryInstance.php | 168 + .../Understand/Assistant/QueryList.php | 217 + .../Understand/Assistant/QueryOptions.php | 274 + .../Understand/Assistant/QueryPage.php | 55 + .../Assistant/StyleSheetContext.php | 111 + .../Assistant/StyleSheetInstance.php | 135 + .../Understand/Assistant/StyleSheetList.php | 67 + .../Assistant/StyleSheetOptions.php | 78 + .../Understand/Assistant/StyleSheetPage.php | 55 + .../Assistant/Task/FieldContext.php | 106 + .../Assistant/Task/FieldInstance.php | 148 + .../Understand/Assistant/Task/FieldList.php | 205 + .../Understand/Assistant/Task/FieldPage.php | 55 + .../Assistant/Task/SampleContext.php | 141 + .../Assistant/Task/SampleInstance.php | 164 + .../Understand/Assistant/Task/SampleList.php | 217 + .../Assistant/Task/SampleOptions.php | 220 + .../Understand/Assistant/Task/SamplePage.php | 55 + .../Assistant/Task/TaskActionsContext.php | 118 + .../Assistant/Task/TaskActionsInstance.php | 139 + .../Assistant/Task/TaskActionsList.php | 73 + .../Assistant/Task/TaskActionsOptions.php | 78 + .../Assistant/Task/TaskActionsPage.php | 55 + .../Assistant/Task/TaskStatisticsContext.php | 87 + .../Assistant/Task/TaskStatisticsInstance.php | 127 + .../Assistant/Task/TaskStatisticsList.php | 73 + .../Assistant/Task/TaskStatisticsPage.php | 55 + .../Understand/Assistant/TaskContext.php | 256 + .../Understand/Assistant/TaskInstance.php | 203 + .../Preview/Understand/Assistant/TaskList.php | 205 + .../Understand/Assistant/TaskOptions.php | 224 + .../Preview/Understand/Assistant/TaskPage.php | 55 + .../Preview/Understand/AssistantContext.php | 329 + .../Preview/Understand/AssistantInstance.php | 245 + .../Rest/Preview/Understand/AssistantList.php | 204 + .../Preview/Understand/AssistantOptions.php | 386 + .../Rest/Preview/Understand/AssistantPage.php | 55 + app/api/Twilio/Rest/Preview/Wireless.php | 119 + .../Rest/Preview/Wireless/CommandContext.php | 81 + .../Rest/Preview/Wireless/CommandInstance.php | 136 + .../Rest/Preview/Wireless/CommandList.php | 214 + .../Rest/Preview/Wireless/CommandOptions.php | 274 + .../Rest/Preview/Wireless/CommandPage.php | 55 + .../Rest/Preview/Wireless/RatePlanContext.php | 125 + .../Preview/Wireless/RatePlanInstance.php | 168 + .../Rest/Preview/Wireless/RatePlanList.php | 208 + .../Rest/Preview/Wireless/RatePlanOptions.php | 314 + .../Rest/Preview/Wireless/RatePlanPage.php | 55 + .../Preview/Wireless/Sim/UsageContext.php | 93 + .../Preview/Wireless/Sim/UsageInstance.php | 133 + .../Rest/Preview/Wireless/Sim/UsageList.php | 67 + .../Preview/Wireless/Sim/UsageOptions.php | 94 + .../Rest/Preview/Wireless/Sim/UsagePage.php | 55 + .../Rest/Preview/Wireless/SimContext.php | 198 + .../Rest/Preview/Wireless/SimInstance.php | 183 + .../Twilio/Rest/Preview/Wireless/SimList.php | 176 + .../Rest/Preview/Wireless/SimOptions.php | 472 + .../Twilio/Rest/Preview/Wireless/SimPage.php | 55 + app/api/Twilio/Rest/PreviewBase.php | 153 + app/api/Twilio/Rest/Pricing.php | 68 + app/api/Twilio/Rest/Pricing/V1.php | 116 + .../Pricing/V1/Messaging/CountryContext.php | 81 + .../Pricing/V1/Messaging/CountryInstance.php | 125 + .../Rest/Pricing/V1/Messaging/CountryList.php | 161 + .../Rest/Pricing/V1/Messaging/CountryPage.php | 55 + .../Rest/Pricing/V1/MessagingInstance.php | 71 + .../Twilio/Rest/Pricing/V1/MessagingList.php | 106 + .../Twilio/Rest/Pricing/V1/MessagingPage.php | 55 + .../Pricing/V1/PhoneNumber/CountryContext.php | 81 + .../V1/PhoneNumber/CountryInstance.php | 123 + .../Pricing/V1/PhoneNumber/CountryList.php | 161 + .../Pricing/V1/PhoneNumber/CountryPage.php | 55 + .../Rest/Pricing/V1/PhoneNumberInstance.php | 71 + .../Rest/Pricing/V1/PhoneNumberList.php | 106 + .../Rest/Pricing/V1/PhoneNumberPage.php | 55 + .../Rest/Pricing/V1/Voice/CountryContext.php | 81 + .../Rest/Pricing/V1/Voice/CountryInstance.php | 125 + .../Rest/Pricing/V1/Voice/CountryList.php | 161 + .../Rest/Pricing/V1/Voice/CountryPage.php | 55 + .../Rest/Pricing/V1/Voice/NumberContext.php | 81 + .../Rest/Pricing/V1/Voice/NumberInstance.php | 127 + .../Rest/Pricing/V1/Voice/NumberList.php | 65 + .../Rest/Pricing/V1/Voice/NumberPage.php | 55 + .../Twilio/Rest/Pricing/V1/VoiceInstance.php | 71 + app/api/Twilio/Rest/Pricing/V1/VoiceList.php | 123 + app/api/Twilio/Rest/Pricing/V1/VoicePage.php | 55 + app/api/Twilio/Rest/Pricing/V2.php | 118 + .../Twilio/Rest/Pricing/V2/CountryContext.php | 81 + .../Rest/Pricing/V2/CountryInstance.php | 125 + .../Twilio/Rest/Pricing/V2/CountryList.php | 161 + .../Twilio/Rest/Pricing/V2/CountryPage.php | 55 + .../Twilio/Rest/Pricing/V2/NumberContext.php | 91 + .../Twilio/Rest/Pricing/V2/NumberInstance.php | 131 + app/api/Twilio/Rest/Pricing/V2/NumberList.php | 65 + .../Twilio/Rest/Pricing/V2/NumberOptions.php | 76 + app/api/Twilio/Rest/Pricing/V2/NumberPage.php | 55 + .../Rest/Pricing/V2/Voice/CountryContext.php | 81 + .../Rest/Pricing/V2/Voice/CountryInstance.php | 125 + .../Rest/Pricing/V2/Voice/CountryList.php | 161 + .../Rest/Pricing/V2/Voice/CountryPage.php | 55 + .../Rest/Pricing/V2/Voice/NumberContext.php | 91 + .../Rest/Pricing/V2/Voice/NumberInstance.php | 131 + .../Rest/Pricing/V2/Voice/NumberList.php | 65 + .../Rest/Pricing/V2/Voice/NumberOptions.php | 76 + .../Rest/Pricing/V2/Voice/NumberPage.php | 55 + .../Twilio/Rest/Pricing/V2/VoiceInstance.php | 71 + app/api/Twilio/Rest/Pricing/V2/VoiceList.php | 123 + app/api/Twilio/Rest/Pricing/V2/VoicePage.php | 55 + app/api/Twilio/Rest/PricingBase.php | 101 + app/api/Twilio/Rest/Proxy.php | 25 + app/api/Twilio/Rest/Proxy/V1.php | 95 + .../Proxy/V1/Service/PhoneNumberContext.php | 131 + .../Proxy/V1/Service/PhoneNumberInstance.php | 167 + .../Rest/Proxy/V1/Service/PhoneNumberList.php | 202 + .../Proxy/V1/Service/PhoneNumberOptions.php | 170 + .../Rest/Proxy/V1/Service/PhoneNumberPage.php | 55 + .../V1/Service/Session/InteractionContext.php | 106 + .../Service/Session/InteractionInstance.php | 168 + .../V1/Service/Session/InteractionList.php | 175 + .../V1/Service/Session/InteractionPage.php | 55 + .../Participant/MessageInteractionContext.php | 99 + .../MessageInteractionInstance.php | 160 + .../Participant/MessageInteractionList.php | 216 + .../Participant/MessageInteractionOptions.php | 98 + .../Participant/MessageInteractionPage.php | 55 + .../V1/Service/Session/ParticipantContext.php | 166 + .../Service/Session/ParticipantInstance.php | 167 + .../V1/Service/Session/ParticipantList.php | 212 + .../V1/Service/Session/ParticipantOptions.php | 118 + .../V1/Service/Session/ParticipantPage.php | 55 + .../Rest/Proxy/V1/Service/SessionContext.php | 214 + .../Rest/Proxy/V1/Service/SessionInstance.php | 195 + .../Rest/Proxy/V1/Service/SessionList.php | 208 + .../Rest/Proxy/V1/Service/SessionOptions.php | 254 + .../Rest/Proxy/V1/Service/SessionPage.php | 55 + .../Proxy/V1/Service/ShortCodeContext.php | 131 + .../Proxy/V1/Service/ShortCodeInstance.php | 163 + .../Rest/Proxy/V1/Service/ShortCodeList.php | 194 + .../Proxy/V1/Service/ShortCodeOptions.php | 84 + .../Rest/Proxy/V1/Service/ShortCodePage.php | 55 + .../Twilio/Rest/Proxy/V1/ServiceContext.php | 233 + .../Twilio/Rest/Proxy/V1/ServiceInstance.php | 199 + app/api/Twilio/Rest/Proxy/V1/ServiceList.php | 204 + .../Twilio/Rest/Proxy/V1/ServiceOptions.php | 360 + app/api/Twilio/Rest/Proxy/V1/ServicePage.php | 55 + app/api/Twilio/Rest/ProxyBase.php | 88 + app/api/Twilio/Rest/Routes.php | 58 + app/api/Twilio/Rest/Routes/V2.php | 119 + .../Rest/Routes/V2/PhoneNumberContext.php | 112 + .../Rest/Routes/V2/PhoneNumberInstance.php | 144 + .../Twilio/Rest/Routes/V2/PhoneNumberList.php | 65 + .../Rest/Routes/V2/PhoneNumberOptions.php | 96 + .../Twilio/Rest/Routes/V2/PhoneNumberPage.php | 55 + .../Rest/Routes/V2/SipDomainContext.php | 112 + .../Rest/Routes/V2/SipDomainInstance.php | 144 + .../Twilio/Rest/Routes/V2/SipDomainList.php | 65 + .../Rest/Routes/V2/SipDomainOptions.php | 96 + .../Twilio/Rest/Routes/V2/SipDomainPage.php | 55 + .../Twilio/Rest/Routes/V2/TrunkContext.php | 112 + .../Twilio/Rest/Routes/V2/TrunkInstance.php | 144 + app/api/Twilio/Rest/Routes/V2/TrunkList.php | 65 + .../Twilio/Rest/Routes/V2/TrunkOptions.php | 96 + app/api/Twilio/Rest/Routes/V2/TrunkPage.php | 55 + app/api/Twilio/Rest/RoutesBase.php | 88 + app/api/Twilio/Rest/Serverless.php | 24 + app/api/Twilio/Rest/Serverless/V1.php | 95 + .../V1/Service/Asset/AssetVersionContext.php | 93 + .../V1/Service/Asset/AssetVersionInstance.php | 134 + .../V1/Service/Asset/AssetVersionList.php | 175 + .../V1/Service/Asset/AssetVersionPage.php | 55 + .../Serverless/V1/Service/AssetContext.php | 186 + .../Serverless/V1/Service/AssetInstance.php | 168 + .../Rest/Serverless/V1/Service/AssetList.php | 194 + .../Rest/Serverless/V1/Service/AssetPage.php | 55 + .../V1/Service/Build/BuildStatusContext.php | 87 + .../V1/Service/Build/BuildStatusInstance.php | 125 + .../V1/Service/Build/BuildStatusList.php | 73 + .../V1/Service/Build/BuildStatusPage.php | 55 + .../Serverless/V1/Service/BuildContext.php | 159 + .../Serverless/V1/Service/BuildInstance.php | 163 + .../Rest/Serverless/V1/Service/BuildList.php | 204 + .../Serverless/V1/Service/BuildOptions.php | 137 + .../Rest/Serverless/V1/Service/BuildPage.php | 55 + .../Service/Environment/DeploymentContext.php | 93 + .../Environment/DeploymentInstance.php | 134 + .../V1/Service/Environment/DeploymentList.php | 205 + .../Service/Environment/DeploymentOptions.php | 80 + .../V1/Service/Environment/DeploymentPage.php | 55 + .../V1/Service/Environment/LogContext.php | 93 + .../V1/Service/Environment/LogInstance.php | 142 + .../V1/Service/Environment/LogList.php | 187 + .../V1/Service/Environment/LogOptions.php | 114 + .../V1/Service/Environment/LogPage.php | 55 + .../Service/Environment/VariableContext.php | 139 + .../Service/Environment/VariableInstance.php | 162 + .../V1/Service/Environment/VariableList.php | 205 + .../Service/Environment/VariableOptions.php | 102 + .../V1/Service/Environment/VariablePage.php | 55 + .../V1/Service/EnvironmentContext.php | 199 + .../V1/Service/EnvironmentInstance.php | 181 + .../Serverless/V1/Service/EnvironmentList.php | 200 + .../V1/Service/EnvironmentOptions.php | 82 + .../Serverless/V1/Service/EnvironmentPage.php | 55 + .../Serverless/V1/Service/FunctionContext.php | 186 + .../V1/Service/FunctionInstance.php | 168 + .../Serverless/V1/Service/FunctionList.php | 194 + .../Serverless/V1/Service/FunctionPage.php | 55 + .../FunctionVersionContentContext.php | 93 + .../FunctionVersionContentInstance.php | 129 + .../FunctionVersionContentList.php | 79 + .../FunctionVersionContentPage.php | 55 + .../TwilioFunction/FunctionVersionContext.php | 153 + .../FunctionVersionInstance.php | 147 + .../TwilioFunction/FunctionVersionList.php | 175 + .../TwilioFunction/FunctionVersionPage.php | 55 + .../Rest/Serverless/V1/ServiceContext.php | 243 + .../Rest/Serverless/V1/ServiceInstance.php | 203 + .../Twilio/Rest/Serverless/V1/ServiceList.php | 198 + .../Rest/Serverless/V1/ServiceOptions.php | 188 + .../Twilio/Rest/Serverless/V1/ServicePage.php | 55 + app/api/Twilio/Rest/ServerlessBase.php | 88 + app/api/Twilio/Rest/Studio.php | 32 + app/api/Twilio/Rest/Studio/V1.php | 95 + .../Engagement/EngagementContextContext.php | 87 + .../Engagement/EngagementContextInstance.php | 125 + .../Flow/Engagement/EngagementContextList.php | 73 + .../Flow/Engagement/EngagementContextPage.php | 55 + .../Engagement/Step/StepContextContext.php | 93 + .../Engagement/Step/StepContextInstance.php | 129 + .../Flow/Engagement/Step/StepContextList.php | 79 + .../Flow/Engagement/Step/StepContextPage.php | 55 + .../Studio/V1/Flow/Engagement/StepContext.php | 153 + .../V1/Flow/Engagement/StepInstance.php | 153 + .../Studio/V1/Flow/Engagement/StepList.php | 175 + .../Studio/V1/Flow/Engagement/StepPage.php | 55 + .../Rest/Studio/V1/Flow/EngagementContext.php | 179 + .../Studio/V1/Flow/EngagementInstance.php | 171 + .../Rest/Studio/V1/Flow/EngagementList.php | 204 + .../Rest/Studio/V1/Flow/EngagementOptions.php | 82 + .../Rest/Studio/V1/Flow/EngagementPage.php | 55 + .../Execution/ExecutionContextContext.php | 87 + .../Execution/ExecutionContextInstance.php | 125 + .../Flow/Execution/ExecutionContextList.php | 73 + .../Flow/Execution/ExecutionContextPage.php | 55 + .../ExecutionStepContextContext.php | 93 + .../ExecutionStepContextInstance.php | 129 + .../ExecutionStepContextList.php | 79 + .../ExecutionStepContextPage.php | 55 + .../Flow/Execution/ExecutionStepContext.php | 153 + .../Flow/Execution/ExecutionStepInstance.php | 153 + .../V1/Flow/Execution/ExecutionStepList.php | 175 + .../V1/Flow/Execution/ExecutionStepPage.php | 55 + .../Rest/Studio/V1/Flow/ExecutionContext.php | 206 + .../Rest/Studio/V1/Flow/ExecutionInstance.php | 184 + .../Rest/Studio/V1/Flow/ExecutionList.php | 212 + .../Rest/Studio/V1/Flow/ExecutionOptions.php | 152 + .../Rest/Studio/V1/Flow/ExecutionPage.php | 55 + app/api/Twilio/Rest/Studio/V1/FlowContext.php | 171 + .../Twilio/Rest/Studio/V1/FlowInstance.php | 165 + app/api/Twilio/Rest/Studio/V1/FlowList.php | 161 + app/api/Twilio/Rest/Studio/V1/FlowPage.php | 55 + app/api/Twilio/Rest/Studio/V2.php | 106 + .../Execution/ExecutionContextContext.php | 87 + .../Execution/ExecutionContextInstance.php | 125 + .../Flow/Execution/ExecutionContextList.php | 73 + .../Flow/Execution/ExecutionContextPage.php | 55 + .../ExecutionStepContextContext.php | 93 + .../ExecutionStepContextInstance.php | 129 + .../ExecutionStepContextList.php | 79 + .../ExecutionStepContextPage.php | 55 + .../Flow/Execution/ExecutionStepContext.php | 153 + .../Flow/Execution/ExecutionStepInstance.php | 153 + .../V2/Flow/Execution/ExecutionStepList.php | 175 + .../V2/Flow/Execution/ExecutionStepPage.php | 55 + .../Rest/Studio/V2/Flow/ExecutionContext.php | 206 + .../Rest/Studio/V2/Flow/ExecutionInstance.php | 182 + .../Rest/Studio/V2/Flow/ExecutionList.php | 212 + .../Rest/Studio/V2/Flow/ExecutionOptions.php | 152 + .../Rest/Studio/V2/Flow/ExecutionPage.php | 55 + .../Studio/V2/Flow/FlowRevisionContext.php | 87 + .../Studio/V2/Flow/FlowRevisionInstance.php | 140 + .../Rest/Studio/V2/Flow/FlowRevisionList.php | 168 + .../Rest/Studio/V2/Flow/FlowRevisionPage.php | 55 + .../Studio/V2/Flow/FlowTestUserContext.php | 108 + .../Studio/V2/Flow/FlowTestUserInstance.php | 132 + .../Rest/Studio/V2/Flow/FlowTestUserList.php | 67 + .../Rest/Studio/V2/Flow/FlowTestUserPage.php | 55 + app/api/Twilio/Rest/Studio/V2/FlowContext.php | 227 + .../Twilio/Rest/Studio/V2/FlowInstance.php | 202 + app/api/Twilio/Rest/Studio/V2/FlowList.php | 199 + app/api/Twilio/Rest/Studio/V2/FlowOptions.php | 170 + app/api/Twilio/Rest/Studio/V2/FlowPage.php | 55 + .../Rest/Studio/V2/FlowValidateInstance.php | 80 + .../Rest/Studio/V2/FlowValidateList.php | 90 + .../Rest/Studio/V2/FlowValidateOptions.php | 76 + .../Rest/Studio/V2/FlowValidatePage.php | 55 + app/api/Twilio/Rest/StudioBase.php | 101 + app/api/Twilio/Rest/Supersim.php | 142 + app/api/Twilio/Rest/Supersim/V1.php | 189 + .../Rest/Supersim/V1/EsimProfileContext.php | 81 + .../Rest/Supersim/V1/EsimProfileInstance.php | 142 + .../Rest/Supersim/V1/EsimProfileList.php | 206 + .../Rest/Supersim/V1/EsimProfileOptions.php | 220 + .../Rest/Supersim/V1/EsimProfilePage.php | 55 + .../Twilio/Rest/Supersim/V1/FleetContext.php | 122 + .../Twilio/Rest/Supersim/V1/FleetInstance.php | 158 + app/api/Twilio/Rest/Supersim/V1/FleetList.php | 213 + .../Twilio/Rest/Supersim/V1/FleetOptions.php | 416 + app/api/Twilio/Rest/Supersim/V1/FleetPage.php | 55 + .../Rest/Supersim/V1/IpCommandContext.php | 81 + .../Rest/Supersim/V1/IpCommandInstance.php | 140 + .../Twilio/Rest/Supersim/V1/IpCommandList.php | 214 + .../Rest/Supersim/V1/IpCommandOptions.php | 218 + .../Twilio/Rest/Supersim/V1/IpCommandPage.php | 55 + .../NetworkAccessProfileNetworkContext.php | 100 + .../NetworkAccessProfileNetworkInstance.php | 139 + .../NetworkAccessProfileNetworkList.php | 194 + .../NetworkAccessProfileNetworkPage.php | 55 + .../V1/NetworkAccessProfileContext.php | 168 + .../V1/NetworkAccessProfileInstance.php | 153 + .../Supersim/V1/NetworkAccessProfileList.php | 192 + .../V1/NetworkAccessProfileOptions.php | 150 + .../Supersim/V1/NetworkAccessProfilePage.php | 55 + .../Rest/Supersim/V1/NetworkContext.php | 81 + .../Rest/Supersim/V1/NetworkInstance.php | 123 + .../Twilio/Rest/Supersim/V1/NetworkList.php | 172 + .../Rest/Supersim/V1/NetworkOptions.php | 114 + .../Twilio/Rest/Supersim/V1/NetworkPage.php | 55 + .../Supersim/V1/SettingsUpdateInstance.php | 95 + .../Rest/Supersim/V1/SettingsUpdateList.php | 154 + .../Supersim/V1/SettingsUpdateOptions.php | 94 + .../Rest/Supersim/V1/SettingsUpdatePage.php | 55 + .../Supersim/V1/Sim/BillingPeriodInstance.php | 96 + .../Supersim/V1/Sim/BillingPeriodList.php | 151 + .../Supersim/V1/Sim/BillingPeriodPage.php | 55 + .../Supersim/V1/Sim/SimIpAddressInstance.php | 83 + .../Rest/Supersim/V1/Sim/SimIpAddressList.php | 151 + .../Rest/Supersim/V1/Sim/SimIpAddressPage.php | 55 + .../Twilio/Rest/Supersim/V1/SimContext.php | 195 + .../Twilio/Rest/Supersim/V1/SimInstance.php | 169 + app/api/Twilio/Rest/Supersim/V1/SimList.php | 200 + .../Twilio/Rest/Supersim/V1/SimOptions.php | 256 + app/api/Twilio/Rest/Supersim/V1/SimPage.php | 55 + .../Rest/Supersim/V1/SmsCommandContext.php | 81 + .../Rest/Supersim/V1/SmsCommandInstance.php | 132 + .../Rest/Supersim/V1/SmsCommandList.php | 207 + .../Rest/Supersim/V1/SmsCommandOptions.php | 184 + .../Rest/Supersim/V1/SmsCommandPage.php | 55 + .../Rest/Supersim/V1/UsageRecordInstance.php | 100 + .../Rest/Supersim/V1/UsageRecordList.php | 167 + .../Rest/Supersim/V1/UsageRecordOptions.php | 202 + .../Rest/Supersim/V1/UsageRecordPage.php | 55 + app/api/Twilio/Rest/SupersimBase.php | 88 + app/api/Twilio/Rest/Sync.php | 23 + app/api/Twilio/Rest/Sync/V1.php | 95 + .../Document/DocumentPermissionContext.php | 141 + .../Document/DocumentPermissionInstance.php | 160 + .../Document/DocumentPermissionList.php | 175 + .../Document/DocumentPermissionPage.php | 55 + .../Rest/Sync/V1/Service/DocumentContext.php | 194 + .../Rest/Sync/V1/Service/DocumentInstance.php | 177 + .../Rest/Sync/V1/Service/DocumentList.php | 202 + .../Rest/Sync/V1/Service/DocumentOptions.php | 206 + .../Rest/Sync/V1/Service/DocumentPage.php | 55 + .../Service/SyncList/SyncListItemContext.php | 151 + .../Service/SyncList/SyncListItemInstance.php | 167 + .../V1/Service/SyncList/SyncListItemList.php | 223 + .../Service/SyncList/SyncListItemOptions.php | 378 + .../V1/Service/SyncList/SyncListItemPage.php | 55 + .../SyncList/SyncListPermissionContext.php | 141 + .../SyncList/SyncListPermissionInstance.php | 160 + .../SyncList/SyncListPermissionList.php | 175 + .../SyncList/SyncListPermissionPage.php | 55 + .../Rest/Sync/V1/Service/SyncListContext.php | 211 + .../Rest/Sync/V1/Service/SyncListInstance.php | 185 + .../Rest/Sync/V1/Service/SyncListList.php | 201 + .../Rest/Sync/V1/Service/SyncListOptions.php | 188 + .../Rest/Sync/V1/Service/SyncListPage.php | 55 + .../V1/Service/SyncMap/SyncMapItemContext.php | 151 + .../Service/SyncMap/SyncMapItemInstance.php | 167 + .../V1/Service/SyncMap/SyncMapItemList.php | 226 + .../V1/Service/SyncMap/SyncMapItemOptions.php | 378 + .../V1/Service/SyncMap/SyncMapItemPage.php | 55 + .../SyncMap/SyncMapPermissionContext.php | 141 + .../SyncMap/SyncMapPermissionInstance.php | 160 + .../Service/SyncMap/SyncMapPermissionList.php | 175 + .../Service/SyncMap/SyncMapPermissionPage.php | 55 + .../Rest/Sync/V1/Service/SyncMapContext.php | 211 + .../Rest/Sync/V1/Service/SyncMapInstance.php | 185 + .../Rest/Sync/V1/Service/SyncMapList.php | 201 + .../Rest/Sync/V1/Service/SyncMapOptions.php | 188 + .../Rest/Sync/V1/Service/SyncMapPage.php | 55 + .../SyncStream/StreamMessageInstance.php | 85 + .../Service/SyncStream/StreamMessageList.php | 93 + .../Service/SyncStream/StreamMessagePage.php | 55 + .../Sync/V1/Service/SyncStreamContext.php | 189 + .../Sync/V1/Service/SyncStreamInstance.php | 174 + .../Rest/Sync/V1/Service/SyncStreamList.php | 199 + .../Sync/V1/Service/SyncStreamOptions.php | 153 + .../Rest/Sync/V1/Service/SyncStreamPage.php | 55 + .../Twilio/Rest/Sync/V1/ServiceContext.php | 251 + .../Twilio/Rest/Sync/V1/ServiceInstance.php | 209 + app/api/Twilio/Rest/Sync/V1/ServiceList.php | 202 + .../Twilio/Rest/Sync/V1/ServiceOptions.php | 350 + app/api/Twilio/Rest/Sync/V1/ServicePage.php | 55 + app/api/Twilio/Rest/SyncBase.php | 88 + app/api/Twilio/Rest/Taskrouter.php | 24 + app/api/Twilio/Rest/Taskrouter/V1.php | 95 + .../V1/Workspace/ActivityContext.php | 130 + .../V1/Workspace/ActivityInstance.php | 160 + .../Taskrouter/V1/Workspace/ActivityList.php | 209 + .../V1/Workspace/ActivityOptions.php | 202 + .../Taskrouter/V1/Workspace/ActivityPage.php | 55 + .../Taskrouter/V1/Workspace/EventContext.php | 87 + .../Taskrouter/V1/Workspace/EventInstance.php | 150 + .../Taskrouter/V1/Workspace/EventList.php | 196 + .../Taskrouter/V1/Workspace/EventOptions.php | 258 + .../Taskrouter/V1/Workspace/EventPage.php | 55 + .../V1/Workspace/Task/ReservationContext.php | 231 + .../V1/Workspace/Task/ReservationInstance.php | 154 + .../V1/Workspace/Task/ReservationList.php | 184 + .../V1/Workspace/Task/ReservationOptions.php | 1098 + .../V1/Workspace/Task/ReservationPage.php | 55 + .../V1/Workspace/TaskChannelContext.php | 133 + .../V1/Workspace/TaskChannelInstance.php | 162 + .../V1/Workspace/TaskChannelList.php | 204 + .../V1/Workspace/TaskChannelOptions.php | 152 + .../V1/Workspace/TaskChannelPage.php | 55 + .../Taskrouter/V1/Workspace/TaskContext.php | 204 + .../Taskrouter/V1/Workspace/TaskInstance.php | 196 + .../Rest/Taskrouter/V1/Workspace/TaskList.php | 228 + .../Taskrouter/V1/Workspace/TaskOptions.php | 538 + .../Rest/Taskrouter/V1/Workspace/TaskPage.php | 55 + .../TaskQueueCumulativeStatisticsContext.php | 106 + .../TaskQueueCumulativeStatisticsInstance.php | 162 + .../TaskQueueCumulativeStatisticsList.php | 73 + .../TaskQueueCumulativeStatisticsOptions.php | 148 + .../TaskQueueCumulativeStatisticsPage.php | 55 + .../TaskQueueRealTimeStatisticsContext.php | 97 + .../TaskQueueRealTimeStatisticsInstance.php | 145 + .../TaskQueueRealTimeStatisticsList.php | 73 + .../TaskQueueRealTimeStatisticsOptions.php | 76 + .../TaskQueueRealTimeStatisticsPage.php | 55 + .../TaskQueue/TaskQueueStatisticsContext.php | 106 + .../TaskQueue/TaskQueueStatisticsInstance.php | 129 + .../TaskQueue/TaskQueueStatisticsList.php | 73 + .../TaskQueue/TaskQueueStatisticsOptions.php | 148 + .../TaskQueue/TaskQueueStatisticsPage.php | 55 + .../TaskQueuesStatisticsInstance.php | 89 + .../TaskQueue/TaskQueuesStatisticsList.php | 169 + .../TaskQueue/TaskQueuesStatisticsOptions.php | 166 + .../TaskQueue/TaskQueuesStatisticsPage.php | 55 + .../V1/Workspace/TaskQueueContext.php | 239 + .../V1/Workspace/TaskQueueInstance.php | 203 + .../Taskrouter/V1/Workspace/TaskQueueList.php | 276 + .../V1/Workspace/TaskQueueOptions.php | 396 + .../Taskrouter/V1/Workspace/TaskQueuePage.php | 55 + .../Workspace/Worker/ReservationContext.php | 227 + .../Workspace/Worker/ReservationInstance.php | 154 + .../V1/Workspace/Worker/ReservationList.php | 182 + .../Workspace/Worker/ReservationOptions.php | 1046 + .../V1/Workspace/Worker/ReservationPage.php | 55 + .../Workspace/Worker/WorkerChannelContext.php | 127 + .../Worker/WorkerChannelInstance.php | 158 + .../V1/Workspace/Worker/WorkerChannelList.php | 175 + .../Workspace/Worker/WorkerChannelOptions.php | 98 + .../V1/Workspace/Worker/WorkerChannelPage.php | 55 + .../Worker/WorkerStatisticsContext.php | 104 + .../Worker/WorkerStatisticsInstance.php | 127 + .../Workspace/Worker/WorkerStatisticsList.php | 73 + .../Worker/WorkerStatisticsOptions.php | 130 + .../Workspace/Worker/WorkerStatisticsPage.php | 55 + .../WorkersCumulativeStatisticsContext.php | 98 + .../WorkersCumulativeStatisticsInstance.php | 140 + .../WorkersCumulativeStatisticsList.php | 67 + .../WorkersCumulativeStatisticsOptions.php | 130 + .../WorkersCumulativeStatisticsPage.php | 55 + .../WorkersRealTimeStatisticsContext.php | 91 + .../WorkersRealTimeStatisticsInstance.php | 125 + .../Worker/WorkersRealTimeStatisticsList.php | 67 + .../WorkersRealTimeStatisticsOptions.php | 76 + .../Worker/WorkersRealTimeStatisticsPage.php | 55 + .../Worker/WorkersStatisticsContext.php | 104 + .../Worker/WorkersStatisticsInstance.php | 125 + .../Worker/WorkersStatisticsList.php | 67 + .../Worker/WorkersStatisticsOptions.php | 184 + .../Worker/WorkersStatisticsPage.php | 55 + .../Taskrouter/V1/Workspace/WorkerContext.php | 283 + .../V1/Workspace/WorkerInstance.php | 220 + .../Taskrouter/V1/Workspace/WorkerList.php | 279 + .../Taskrouter/V1/Workspace/WorkerOptions.php | 450 + .../Taskrouter/V1/Workspace/WorkerPage.php | 55 + .../WorkflowCumulativeStatisticsContext.php | 106 + .../WorkflowCumulativeStatisticsInstance.php | 162 + .../WorkflowCumulativeStatisticsList.php | 73 + .../WorkflowCumulativeStatisticsOptions.php | 148 + .../WorkflowCumulativeStatisticsPage.php | 55 + .../WorkflowRealTimeStatisticsContext.php | 97 + .../WorkflowRealTimeStatisticsInstance.php | 135 + .../WorkflowRealTimeStatisticsList.php | 73 + .../WorkflowRealTimeStatisticsOptions.php | 76 + .../WorkflowRealTimeStatisticsPage.php | 55 + .../Workflow/WorkflowStatisticsContext.php | 106 + .../Workflow/WorkflowStatisticsInstance.php | 129 + .../Workflow/WorkflowStatisticsList.php | 73 + .../Workflow/WorkflowStatisticsOptions.php | 148 + .../Workflow/WorkflowStatisticsPage.php | 55 + .../V1/Workspace/WorkflowContext.php | 239 + .../V1/Workspace/WorkflowInstance.php | 199 + .../Taskrouter/V1/Workspace/WorkflowList.php | 213 + .../V1/Workspace/WorkflowOptions.php | 310 + .../Taskrouter/V1/Workspace/WorkflowPage.php | 55 + .../WorkspaceCumulativeStatisticsContext.php | 100 + .../WorkspaceCumulativeStatisticsInstance.php | 158 + .../WorkspaceCumulativeStatisticsList.php | 67 + .../WorkspaceCumulativeStatisticsOptions.php | 148 + .../WorkspaceCumulativeStatisticsPage.php | 55 + .../WorkspaceRealTimeStatisticsContext.php | 91 + .../WorkspaceRealTimeStatisticsInstance.php | 135 + .../WorkspaceRealTimeStatisticsList.php | 67 + .../WorkspaceRealTimeStatisticsOptions.php | 76 + .../WorkspaceRealTimeStatisticsPage.php | 55 + .../Workspace/WorkspaceStatisticsContext.php | 100 + .../Workspace/WorkspaceStatisticsInstance.php | 125 + .../V1/Workspace/WorkspaceStatisticsList.php | 67 + .../Workspace/WorkspaceStatisticsOptions.php | 148 + .../V1/Workspace/WorkspaceStatisticsPage.php | 55 + .../Rest/Taskrouter/V1/WorkspaceContext.php | 365 + .../Rest/Taskrouter/V1/WorkspaceInstance.php | 271 + .../Rest/Taskrouter/V1/WorkspaceList.php | 207 + .../Rest/Taskrouter/V1/WorkspaceOptions.php | 360 + .../Rest/Taskrouter/V1/WorkspacePage.php | 55 + app/api/Twilio/Rest/TaskrouterBase.php | 88 + app/api/Twilio/Rest/Trunking.php | 24 + app/api/Twilio/Rest/Trunking/V1.php | 95 + .../V1/Trunk/CredentialListContext.php | 100 + .../V1/Trunk/CredentialListInstance.php | 142 + .../Trunking/V1/Trunk/CredentialListList.php | 194 + .../Trunking/V1/Trunk/CredentialListPage.php | 55 + .../V1/Trunk/IpAccessControlListContext.php | 100 + .../V1/Trunk/IpAccessControlListInstance.php | 142 + .../V1/Trunk/IpAccessControlListList.php | 194 + .../V1/Trunk/IpAccessControlListPage.php | 55 + .../V1/Trunk/OriginationUrlContext.php | 139 + .../V1/Trunk/OriginationUrlInstance.php | 164 + .../Trunking/V1/Trunk/OriginationUrlList.php | 207 + .../V1/Trunk/OriginationUrlOptions.php | 156 + .../Trunking/V1/Trunk/OriginationUrlPage.php | 55 + .../Trunking/V1/Trunk/PhoneNumberContext.php | 100 + .../Trunking/V1/Trunk/PhoneNumberInstance.php | 180 + .../Trunking/V1/Trunk/PhoneNumberList.php | 194 + .../Trunking/V1/Trunk/PhoneNumberPage.php | 55 + .../Trunking/V1/Trunk/RecordingContext.php | 112 + .../Trunking/V1/Trunk/RecordingInstance.php | 131 + .../Rest/Trunking/V1/Trunk/RecordingList.php | 67 + .../Trunking/V1/Trunk/RecordingOptions.php | 92 + .../Rest/Trunking/V1/Trunk/RecordingPage.php | 55 + .../Twilio/Rest/Trunking/V1/TrunkContext.php | 272 + .../Twilio/Rest/Trunking/V1/TrunkInstance.php | 225 + app/api/Twilio/Rest/Trunking/V1/TrunkList.php | 204 + .../Twilio/Rest/Trunking/V1/TrunkOptions.php | 378 + app/api/Twilio/Rest/Trunking/V1/TrunkPage.php | 55 + app/api/Twilio/Rest/TrunkingBase.php | 88 + app/api/Twilio/Rest/Trusthub.php | 128 + app/api/Twilio/Rest/Trusthub/V1.php | 167 + ...ofilesChannelEndpointAssignmentContext.php | 100 + ...filesChannelEndpointAssignmentInstance.php | 142 + ...rProfilesChannelEndpointAssignmentList.php | 206 + ...ofilesChannelEndpointAssignmentOptions.php | 100 + ...rProfilesChannelEndpointAssignmentPage.php | 55 + ...stomerProfilesEntityAssignmentsContext.php | 100 + ...tomerProfilesEntityAssignmentsInstance.php | 140 + .../CustomerProfilesEntityAssignmentsList.php | 194 + .../CustomerProfilesEntityAssignmentsPage.php | 55 + .../CustomerProfilesEvaluationsContext.php | 87 + .../CustomerProfilesEvaluationsInstance.php | 132 + .../CustomerProfilesEvaluationsList.php | 194 + .../CustomerProfilesEvaluationsPage.php | 55 + .../Trusthub/V1/CustomerProfilesContext.php | 225 + .../Trusthub/V1/CustomerProfilesInstance.php | 195 + .../Rest/Trusthub/V1/CustomerProfilesList.php | 208 + .../Trusthub/V1/CustomerProfilesOptions.php | 272 + .../Rest/Trusthub/V1/CustomerProfilesPage.php | 55 + .../Rest/Trusthub/V1/EndUserContext.php | 126 + .../Rest/Trusthub/V1/EndUserInstance.php | 156 + .../Twilio/Rest/Trusthub/V1/EndUserList.php | 196 + .../Rest/Trusthub/V1/EndUserOptions.php | 152 + .../Twilio/Rest/Trusthub/V1/EndUserPage.php | 55 + .../Rest/Trusthub/V1/EndUserTypeContext.php | 81 + .../Rest/Trusthub/V1/EndUserTypeInstance.php | 123 + .../Rest/Trusthub/V1/EndUserTypeList.php | 161 + .../Rest/Trusthub/V1/EndUserTypePage.php | 55 + .../Rest/Trusthub/V1/PoliciesContext.php | 81 + .../Rest/Trusthub/V1/PoliciesInstance.php | 121 + .../Twilio/Rest/Trusthub/V1/PoliciesList.php | 161 + .../Twilio/Rest/Trusthub/V1/PoliciesPage.php | 55 + .../Trusthub/V1/SupportingDocumentContext.php | 126 + .../V1/SupportingDocumentInstance.php | 160 + .../Trusthub/V1/SupportingDocumentList.php | 196 + .../Trusthub/V1/SupportingDocumentOptions.php | 152 + .../Trusthub/V1/SupportingDocumentPage.php | 55 + .../V1/SupportingDocumentTypeContext.php | 81 + .../V1/SupportingDocumentTypeInstance.php | 123 + .../V1/SupportingDocumentTypeList.php | 161 + .../V1/SupportingDocumentTypePage.php | 55 + ...oductsChannelEndpointAssignmentContext.php | 100 + ...ductsChannelEndpointAssignmentInstance.php | 142 + ...tProductsChannelEndpointAssignmentList.php | 206 + ...oductsChannelEndpointAssignmentOptions.php | 100 + ...tProductsChannelEndpointAssignmentPage.php | 55 + .../TrustProductsEntityAssignmentsContext.php | 100 + ...TrustProductsEntityAssignmentsInstance.php | 140 + .../TrustProductsEntityAssignmentsList.php | 194 + .../TrustProductsEntityAssignmentsPage.php | 55 + .../TrustProductsEvaluationsContext.php | 87 + .../TrustProductsEvaluationsInstance.php | 132 + .../TrustProductsEvaluationsList.php | 194 + .../TrustProductsEvaluationsPage.php | 55 + .../Rest/Trusthub/V1/TrustProductsContext.php | 225 + .../Trusthub/V1/TrustProductsInstance.php | 195 + .../Rest/Trusthub/V1/TrustProductsList.php | 208 + .../Rest/Trusthub/V1/TrustProductsOptions.php | 272 + .../Rest/Trusthub/V1/TrustProductsPage.php | 55 + app/api/Twilio/Rest/TrusthubBase.php | 88 + app/api/Twilio/Rest/Verify.php | 99 + app/api/Twilio/Rest/Verify/V2.php | 153 + app/api/Twilio/Rest/Verify/V2/FormContext.php | 81 + .../Twilio/Rest/Verify/V2/FormInstance.php | 121 + app/api/Twilio/Rest/Verify/V2/FormList.php | 65 + app/api/Twilio/Rest/Verify/V2/FormPage.php | 55 + .../Twilio/Rest/Verify/V2/SafelistContext.php | 94 + .../Rest/Verify/V2/SafelistInstance.php | 131 + .../Twilio/Rest/Verify/V2/SafelistList.php | 93 + .../Twilio/Rest/Verify/V2/SafelistPage.php | 55 + .../Verify/V2/Service/AccessTokenContext.php | 87 + .../Verify/V2/Service/AccessTokenInstance.php | 136 + .../Verify/V2/Service/AccessTokenList.php | 112 + .../Verify/V2/Service/AccessTokenOptions.php | 96 + .../Verify/V2/Service/AccessTokenPage.php | 55 + .../Entity/Challenge/NotificationInstance.php | 100 + .../Entity/Challenge/NotificationList.php | 101 + .../Entity/Challenge/NotificationOptions.php | 76 + .../Entity/Challenge/NotificationPage.php | 55 + .../V2/Service/Entity/ChallengeContext.php | 186 + .../V2/Service/Entity/ChallengeInstance.php | 179 + .../V2/Service/Entity/ChallengeList.php | 227 + .../V2/Service/Entity/ChallengeOptions.php | 308 + .../V2/Service/Entity/ChallengePage.php | 55 + .../V2/Service/Entity/FactorContext.php | 153 + .../V2/Service/Entity/FactorInstance.php | 170 + .../Verify/V2/Service/Entity/FactorList.php | 175 + .../V2/Service/Entity/FactorOptions.php | 224 + .../Verify/V2/Service/Entity/FactorPage.php | 55 + .../V2/Service/Entity/NewFactorInstance.php | 109 + .../V2/Service/Entity/NewFactorList.php | 123 + .../V2/Service/Entity/NewFactorOptions.php | 270 + .../V2/Service/Entity/NewFactorPage.php | 55 + .../Rest/Verify/V2/Service/EntityContext.php | 198 + .../Rest/Verify/V2/Service/EntityInstance.php | 175 + .../Rest/Verify/V2/Service/EntityList.php | 194 + .../Rest/Verify/V2/Service/EntityPage.php | 55 + .../Service/MessagingConfigurationContext.php | 127 + .../MessagingConfigurationInstance.php | 155 + .../V2/Service/MessagingConfigurationList.php | 197 + .../V2/Service/MessagingConfigurationPage.php | 55 + .../V2/Service/RateLimit/BucketContext.php | 139 + .../V2/Service/RateLimit/BucketInstance.php | 162 + .../V2/Service/RateLimit/BucketList.php | 205 + .../V2/Service/RateLimit/BucketOptions.php | 102 + .../V2/Service/RateLimit/BucketPage.php | 55 + .../Verify/V2/Service/RateLimitContext.php | 189 + .../Verify/V2/Service/RateLimitInstance.php | 171 + .../Rest/Verify/V2/Service/RateLimitList.php | 200 + .../Verify/V2/Service/RateLimitOptions.php | 134 + .../Rest/Verify/V2/Service/RateLimitPage.php | 55 + .../V2/Service/VerificationCheckInstance.php | 104 + .../V2/Service/VerificationCheckList.php | 95 + .../V2/Service/VerificationCheckOptions.php | 148 + .../V2/Service/VerificationCheckPage.php | 55 + .../Verify/V2/Service/VerificationContext.php | 114 + .../V2/Service/VerificationInstance.php | 159 + .../Verify/V2/Service/VerificationList.php | 135 + .../Verify/V2/Service/VerificationOptions.php | 296 + .../Verify/V2/Service/VerificationPage.php | 55 + .../Rest/Verify/V2/Service/WebhookContext.php | 139 + .../Verify/V2/Service/WebhookInstance.php | 166 + .../Rest/Verify/V2/Service/WebhookList.php | 209 + .../Rest/Verify/V2/Service/WebhookOptions.php | 216 + .../Rest/Verify/V2/Service/WebhookPage.php | 55 + .../Twilio/Rest/Verify/V2/ServiceContext.php | 327 + .../Twilio/Rest/Verify/V2/ServiceInstance.php | 247 + app/api/Twilio/Rest/Verify/V2/ServiceList.php | 223 + .../Twilio/Rest/Verify/V2/ServiceOptions.php | 692 + app/api/Twilio/Rest/Verify/V2/ServicePage.php | 55 + .../Rest/Verify/V2/TemplateInstance.php | 88 + .../Twilio/Rest/Verify/V2/TemplateList.php | 152 + .../Twilio/Rest/Verify/V2/TemplateOptions.php | 76 + .../Twilio/Rest/Verify/V2/TemplatePage.php | 55 + .../Verify/V2/VerificationAttemptContext.php | 81 + .../Verify/V2/VerificationAttemptInstance.php | 136 + .../Verify/V2/VerificationAttemptList.php | 183 + .../Verify/V2/VerificationAttemptOptions.php | 204 + .../Verify/V2/VerificationAttemptPage.php | 55 + .../V2/VerificationAttemptsSummaryContext.php | 96 + .../VerificationAttemptsSummaryInstance.php | 123 + .../V2/VerificationAttemptsSummaryList.php | 61 + .../V2/VerificationAttemptsSummaryOptions.php | 166 + .../V2/VerificationAttemptsSummaryPage.php | 55 + app/api/Twilio/Rest/VerifyBase.php | 88 + app/api/Twilio/Rest/Video.php | 107 + app/api/Twilio/Rest/Video/V1.php | 153 + .../Rest/Video/V1/CompositionContext.php | 94 + .../Rest/Video/V1/CompositionHookContext.php | 143 + .../Rest/Video/V1/CompositionHookInstance.php | 171 + .../Rest/Video/V1/CompositionHookList.php | 221 + .../Rest/Video/V1/CompositionHookOptions.php | 522 + .../Rest/Video/V1/CompositionHookPage.php | 55 + .../Rest/Video/V1/CompositionInstance.php | 168 + .../Twilio/Rest/Video/V1/CompositionList.php | 219 + .../Rest/Video/V1/CompositionOptions.php | 310 + .../Twilio/Rest/Video/V1/CompositionPage.php | 55 + .../Video/V1/CompositionSettingsContext.php | 115 + .../Video/V1/CompositionSettingsInstance.php | 142 + .../Rest/Video/V1/CompositionSettingsList.php | 61 + .../Video/V1/CompositionSettingsOptions.php | 150 + .../Rest/Video/V1/CompositionSettingsPage.php | 55 + .../Twilio/Rest/Video/V1/RecordingContext.php | 94 + .../Rest/Video/V1/RecordingInstance.php | 162 + .../Twilio/Rest/Video/V1/RecordingList.php | 179 + .../Twilio/Rest/Video/V1/RecordingOptions.php | 170 + .../Twilio/Rest/Video/V1/RecordingPage.php | 55 + .../Video/V1/RecordingSettingsContext.php | 115 + .../Video/V1/RecordingSettingsInstance.php | 142 + .../Rest/Video/V1/RecordingSettingsList.php | 61 + .../Video/V1/RecordingSettingsOptions.php | 150 + .../Rest/Video/V1/RecordingSettingsPage.php | 55 + .../V1/Room/Participant/AnonymizeContext.php | 87 + .../V1/Room/Participant/AnonymizeInstance.php | 138 + .../V1/Room/Participant/AnonymizeList.php | 73 + .../V1/Room/Participant/AnonymizePage.php | 55 + .../Participant/PublishedTrackContext.php | 93 + .../Participant/PublishedTrackInstance.php | 136 + .../Room/Participant/PublishedTrackList.php | 175 + .../Room/Participant/PublishedTrackPage.php | 55 + .../Participant/SubscribeRulesInstance.php | 91 + .../Room/Participant/SubscribeRulesList.php | 115 + .../Participant/SubscribeRulesOptions.php | 78 + .../Room/Participant/SubscribeRulesPage.php | 55 + .../Participant/SubscribedTrackContext.php | 93 + .../Participant/SubscribedTrackInstance.php | 138 + .../Room/Participant/SubscribedTrackList.php | 175 + .../Room/Participant/SubscribedTrackPage.php | 55 + .../Rest/Video/V1/Room/ParticipantContext.php | 235 + .../Video/V1/Room/ParticipantInstance.php | 195 + .../Rest/Video/V1/Room/ParticipantList.php | 182 + .../Rest/Video/V1/Room/ParticipantOptions.php | 182 + .../Rest/Video/V1/Room/ParticipantPage.php | 55 + .../Video/V1/Room/RecordingRulesInstance.php | 88 + .../Rest/Video/V1/Room/RecordingRulesList.php | 107 + .../Video/V1/Room/RecordingRulesOptions.php | 78 + .../Rest/Video/V1/Room/RecordingRulesPage.php | 55 + .../Video/V1/Room/RoomRecordingContext.php | 100 + .../Video/V1/Room/RoomRecordingInstance.php | 162 + .../Rest/Video/V1/Room/RoomRecordingList.php | 182 + .../Video/V1/Room/RoomRecordingOptions.php | 134 + .../Rest/Video/V1/Room/RoomRecordingPage.php | 55 + app/api/Twilio/Rest/Video/V1/RoomContext.php | 202 + app/api/Twilio/Rest/Video/V1/RoomInstance.php | 206 + app/api/Twilio/Rest/Video/V1/RoomList.php | 230 + app/api/Twilio/Rest/Video/V1/RoomOptions.php | 436 + app/api/Twilio/Rest/Video/V1/RoomPage.php | 55 + app/api/Twilio/Rest/VideoBase.php | 88 + app/api/Twilio/Rest/Voice.php | 101 + app/api/Twilio/Rest/Voice/V1.php | 154 + .../Rest/Voice/V1/ArchivedCallContext.php | 80 + .../Rest/Voice/V1/ArchivedCallInstance.php | 108 + .../Twilio/Rest/Voice/V1/ArchivedCallList.php | 69 + .../Twilio/Rest/Voice/V1/ArchivedCallPage.php | 55 + .../Twilio/Rest/Voice/V1/ByocTrunkContext.php | 142 + .../Rest/Voice/V1/ByocTrunkInstance.php | 170 + .../Twilio/Rest/Voice/V1/ByocTrunkList.php | 208 + .../Twilio/Rest/Voice/V1/ByocTrunkOptions.php | 458 + .../Twilio/Rest/Voice/V1/ByocTrunkPage.php | 55 + .../ConnectionPolicyTargetContext.php | 139 + .../ConnectionPolicyTargetInstance.php | 164 + .../ConnectionPolicyTargetList.php | 207 + .../ConnectionPolicyTargetOptions.php | 260 + .../ConnectionPolicyTargetPage.php | 55 + .../Rest/Voice/V1/ConnectionPolicyContext.php | 181 + .../Voice/V1/ConnectionPolicyInstance.php | 165 + .../Rest/Voice/V1/ConnectionPolicyList.php | 189 + .../Rest/Voice/V1/ConnectionPolicyOptions.php | 134 + .../Rest/Voice/V1/ConnectionPolicyPage.php | 55 + .../BulkCountryUpdateInstance.php | 82 + .../BulkCountryUpdateList.php | 77 + .../BulkCountryUpdatePage.php | 55 + .../Country/HighriskSpecialPrefixInstance.php | 81 + .../Country/HighriskSpecialPrefixList.php | 151 + .../Country/HighriskSpecialPrefixPage.php | 55 + .../V1/DialingPermissions/CountryContext.php | 138 + .../V1/DialingPermissions/CountryInstance.php | 142 + .../V1/DialingPermissions/CountryList.php | 179 + .../V1/DialingPermissions/CountryOptions.php | 168 + .../V1/DialingPermissions/CountryPage.php | 55 + .../V1/DialingPermissions/SettingsContext.php | 104 + .../DialingPermissions/SettingsInstance.php | 129 + .../V1/DialingPermissions/SettingsList.php | 61 + .../V1/DialingPermissions/SettingsOptions.php | 78 + .../V1/DialingPermissions/SettingsPage.php | 55 + .../Voice/V1/DialingPermissionsInstance.php | 71 + .../Rest/Voice/V1/DialingPermissionsList.php | 139 + .../Rest/Voice/V1/DialingPermissionsPage.php | 55 + .../Twilio/Rest/Voice/V1/IpRecordContext.php | 123 + .../Twilio/Rest/Voice/V1/IpRecordInstance.php | 156 + app/api/Twilio/Rest/Voice/V1/IpRecordList.php | 194 + .../Twilio/Rest/Voice/V1/IpRecordOptions.php | 152 + app/api/Twilio/Rest/Voice/V1/IpRecordPage.php | 55 + .../Rest/Voice/V1/SourceIpMappingContext.php | 120 + .../Rest/Voice/V1/SourceIpMappingInstance.php | 151 + .../Rest/Voice/V1/SourceIpMappingList.php | 189 + .../Rest/Voice/V1/SourceIpMappingPage.php | 55 + app/api/Twilio/Rest/VoiceBase.php | 88 + app/api/Twilio/Rest/Wireless.php | 67 + app/api/Twilio/Rest/Wireless/V1.php | 130 + .../Rest/Wireless/V1/CommandContext.php | 94 + .../Rest/Wireless/V1/CommandInstance.php | 150 + .../Twilio/Rest/Wireless/V1/CommandList.php | 215 + .../Rest/Wireless/V1/CommandOptions.php | 274 + .../Twilio/Rest/Wireless/V1/CommandPage.php | 55 + .../Rest/Wireless/V1/RatePlanContext.php | 125 + .../Rest/Wireless/V1/RatePlanInstance.php | 172 + .../Twilio/Rest/Wireless/V1/RatePlanList.php | 210 + .../Rest/Wireless/V1/RatePlanOptions.php | 332 + .../Twilio/Rest/Wireless/V1/RatePlanPage.php | 55 + .../Wireless/V1/Sim/DataSessionInstance.php | 112 + .../Rest/Wireless/V1/Sim/DataSessionList.php | 151 + .../Rest/Wireless/V1/Sim/DataSessionPage.php | 55 + .../Wireless/V1/Sim/UsageRecordInstance.php | 89 + .../Rest/Wireless/V1/Sim/UsageRecordList.php | 163 + .../Wireless/V1/Sim/UsageRecordOptions.php | 112 + .../Rest/Wireless/V1/Sim/UsageRecordPage.php | 55 + .../Twilio/Rest/Wireless/V1/SimContext.php | 232 + .../Twilio/Rest/Wireless/V1/SimInstance.php | 209 + app/api/Twilio/Rest/Wireless/V1/SimList.php | 176 + .../Twilio/Rest/Wireless/V1/SimOptions.php | 506 + app/api/Twilio/Rest/Wireless/V1/SimPage.php | 55 + .../Rest/Wireless/V1/UsageRecordInstance.php | 86 + .../Rest/Wireless/V1/UsageRecordList.php | 157 + .../Rest/Wireless/V1/UsageRecordOptions.php | 112 + .../Rest/Wireless/V1/UsageRecordPage.php | 55 + app/api/Twilio/Rest/WirelessBase.php | 88 + app/api/Twilio/Security/RequestValidator.php | 172 + app/api/Twilio/Serialize.php | 83 + app/api/Twilio/Stream.php | 105 + .../TaskRouter/WorkflowConfiguration.php | 49 + app/api/Twilio/TaskRouter/WorkflowRule.php | 31 + .../Twilio/TaskRouter/WorkflowRuleTarget.php | 38 + app/api/Twilio/TwiML/Fax/Receive.php | 70 + app/api/Twilio/TwiML/FaxResponse.php | 29 + app/api/Twilio/TwiML/GenericNode.php | 19 + app/api/Twilio/TwiML/Messaging/Body.php | 23 + app/api/Twilio/TwiML/Messaging/Media.php | 23 + app/api/Twilio/TwiML/Messaging/Message.php | 90 + app/api/Twilio/TwiML/Messaging/Redirect.php | 33 + app/api/Twilio/TwiML/MessagingResponse.php | 41 + app/api/Twilio/TwiML/TwiML.php | 136 + app/api/Twilio/TwiML/Video/Room.php | 23 + app/api/Twilio/TwiML/Voice/Application.php | 108 + app/api/Twilio/TwiML/Voice/ApplicationSid.php | 23 + app/api/Twilio/TwiML/Voice/Autopilot.php | 23 + app/api/Twilio/TwiML/Voice/Client.php | 89 + app/api/Twilio/TwiML/Voice/Conference.php | 206 + app/api/Twilio/TwiML/Voice/Config.php | 41 + app/api/Twilio/TwiML/Voice/Connect.php | 92 + app/api/Twilio/TwiML/Voice/Conversation.php | 151 + app/api/Twilio/TwiML/Voice/Dial.php | 262 + app/api/Twilio/TwiML/Voice/Echo_.php | 21 + app/api/Twilio/TwiML/Voice/Enqueue.php | 89 + app/api/Twilio/TwiML/Voice/Gather.php | 220 + app/api/Twilio/TwiML/Voice/Hangup.php | 31 + app/api/Twilio/TwiML/Voice/Identity.php | 23 + app/api/Twilio/TwiML/Voice/Leave.php | 21 + app/api/Twilio/TwiML/Voice/Number.php | 158 + app/api/Twilio/TwiML/Voice/Parameter.php | 41 + app/api/Twilio/TwiML/Voice/Pause.php | 32 + app/api/Twilio/TwiML/Voice/Pay.php | 212 + app/api/Twilio/TwiML/Voice/Play.php | 42 + app/api/Twilio/TwiML/Voice/Prompt.php | 101 + app/api/Twilio/TwiML/Voice/Queue.php | 60 + app/api/Twilio/TwiML/Voice/Record.php | 132 + app/api/Twilio/TwiML/Voice/Redirect.php | 33 + app/api/Twilio/TwiML/Voice/Refer.php | 51 + app/api/Twilio/TwiML/Voice/ReferSip.php | 23 + app/api/Twilio/TwiML/Voice/Reject.php | 42 + app/api/Twilio/TwiML/Voice/Room.php | 34 + app/api/Twilio/TwiML/Voice/Say.php | 158 + app/api/Twilio/TwiML/Voice/Sim.php | 23 + app/api/Twilio/TwiML/Voice/Sip.php | 158 + app/api/Twilio/TwiML/Voice/Siprec.php | 60 + app/api/Twilio/TwiML/Voice/Sms.php | 69 + app/api/Twilio/TwiML/Voice/SsmlBreak.php | 42 + app/api/Twilio/TwiML/Voice/SsmlEmphasis.php | 120 + app/api/Twilio/TwiML/Voice/SsmlLang.php | 140 + app/api/Twilio/TwiML/Voice/SsmlP.php | 120 + app/api/Twilio/TwiML/Voice/SsmlPhoneme.php | 42 + app/api/Twilio/TwiML/Voice/SsmlProsody.php | 161 + app/api/Twilio/TwiML/Voice/SsmlS.php | 110 + app/api/Twilio/TwiML/Voice/SsmlSayAs.php | 43 + app/api/Twilio/TwiML/Voice/SsmlSub.php | 34 + app/api/Twilio/TwiML/Voice/SsmlW.php | 99 + app/api/Twilio/TwiML/Voice/Start.php | 61 + app/api/Twilio/TwiML/Voice/Stop.php | 41 + app/api/Twilio/TwiML/Voice/Stream.php | 87 + app/api/Twilio/TwiML/Voice/Task.php | 42 + app/api/Twilio/TwiML/Voice/VirtualAgent.php | 92 + app/api/Twilio/TwiML/VoiceResponse.php | 222 + app/api/Twilio/Values.php | 98 + app/api/Twilio/Version.php | 236 + app/api/Twilio/VersionInfo.php | 15 + app/api/Twilio/autoload.php | 146 + app/api/XLSX/xlsxwriter.class.php | 981 + app/api/addons-api/addons-api.json | 362 + .../advanced-importer-addon-icon.svg | 1 + app/api/addons-api/advanced-location01.svg | 1 + app/api/addons-api/advanced-map-2.svg | 1 + app/api/addons-api/advanced-organizer01.svg | 1 + app/api/addons-api/advanced-report.svg | 1 + app/api/addons-api/advanced-speaker01.svg | 1 + app/api/addons-api/blackfriday.json | 3 + .../buddyboss-integration-addon.svg | 1 + .../addons-api/divi-single-builder-addon.svg | 1 + app/api/addons-api/elementor-fes-builder.svg | 51 + app/api/addons-api/event-api.svg | 1 + app/api/addons-api/fluent-view.svg | 1 + .../gutenberg-single -builder-addon.svg | 46 + app/api/addons-api/index.html | 0 app/api/addons-api/invoice-5.svg | 1 + app/api/addons-api/liquid-view-layouts.svg | 38 + app/api/addons-api/mec-extra-content-2.json | 5 + app/api/addons-api/mec-extra-content.json | 5 + .../5addons-announcement.png | Bin 0 -> 5492 bytes .../7x7-campaign-special-min.png | Bin 0 -> 11256 bytes .../advanced-importer-addon-banner.png | Bin 0 -> 19532 bytes .../advanced-map-addon-share-1-min.jpg | Bin 0 -> 42905 bytes .../advanced-map-addon-share-1.jpg | Bin 0 -> 75517 bytes .../advanced-reports-addon-teaser.png | Bin 0 -> 21016 bytes .../mec-extra-content/bf-2021-pop-bg3.png | Bin 0 -> 43954 bytes .../bfcm2022-mec-bknd-1-min.png | Bin 0 -> 13198 bytes .../mec-extra-content/black-f-banner-1.png | Bin 0 -> 306664 bytes .../black-friday-2021-3-min.jpg | Bin 0 -> 19777 bytes .../black-friday-2021-ntf1-min.jpg | Bin 0 -> 16583 bytes .../black-friday-2021-ntf2-min.jpg | Bin 0 -> 20496 bytes .../buddyboss-addon-banner.png | Bin 0 -> 35361 bytes .../mec-extra-content/c7x7-ans1.png | Bin 0 -> 9762 bytes .../divi-single-builder-addon-banner.png | Bin 0 -> 19719 bytes .../elementor-fes-builder.svg | 1 + .../addons-api/mec-extra-content/index.html | 0 .../invoice-addon-share-min.png | Bin 0 -> 39843 bytes .../mec-extra-content/liquid-view-layouts.svg | 38 + .../lite-new-update-announcement.png | Bin 0 -> 10296 bytes .../mec-extra-content/lite-update.jpg | Bin 0 -> 143752 bytes .../mec-extra-content/mec-covid 19.png | Bin 0 -> 136012 bytes .../mec-extra-content/mec-fluent-view.jpg | Bin 0 -> 62442 bytes .../mec-extra-content/mec-ft-req-banner.png | Bin 0 -> 33002 bytes .../mec-gutenberg-single-builder.svg | 1 + .../mec-extra-content/mec-notif-banner-1.png | Bin 0 -> 27344 bytes .../mec-extra-content/mec-notif-banner-11.png | Bin 0 -> 27344 bytes .../photo_2022-01-10_16-33-18.jpg | Bin 0 -> 20258 bytes .../rsvp-events-addon-banner.png | Bin 0 -> 17319 bytes .../mec-extra-content/seat-addon-icon.svg | 1 + .../mec-extra-content/social-poster-addon.svg | 1 + .../square-integration-addon.svg | 1 + .../addons-api/mec-extra-content/style2.css | 138 + .../virtual-events-addon-banner.png | Bin 0 -> 26048 bytes .../waiting-list-addon-banner.png | Bin 0 -> 23655 bytes .../zapier-integration-addon-banner1.png | Bin 0 -> 64903 bytes .../zoom-integration-addon-banner.png | Bin 0 -> 30335 bytes .../mec-gutenberg-single-builder.svg | 1 + .../mec-shortcode-designer-addon-icon.svg | 47 + app/api/addons-api/mec_addon_icon_27.svg | 1 + app/api/addons-api/mec_addon_icon_37.svg | 1 + app/api/addons-api/mec_addon_icon_39.svg | 1 + app/api/addons-api/mec_addon_icon_40.svg | 1 + app/api/addons-api/multi-site-3.svg | 1 + app/api/addons-api/rsvp-event-addon.svg | 1 + app/api/addons-api/seat-addon-icon.svg | 45 + .../addons-api/social-auto-poster-addon.svg | 1 + app/api/addons-api/social-poster-addon.svg | 50 + .../addons-api/square-integration-addon.svg | 26 + app/api/addons-api/user-dashboard.svg | 1 + app/api/addons-api/virtual-events.svg | 38 + app/api/addons-api/waiting-list-icon.svg | 1 + .../addons-api/webex-integration-addon.svg | 299 + .../addons-api/zapier-integration01 (1).svg | 1 + app/api/addons-api/zapier-integration01.svg | 1 + app/api/addons-api/zoom-integration-addon.svg | 1 + app/api/index.html | 0 app/composer.json | 10 + app/composer.lock | 84 + app/controller.php | 18 + app/core/mec.php | 19 + app/core/puc/.editorconfig | 15 + app/core/puc/.gitignore | 40 + app/core/puc/Puc/v4/Factory.php | 6 + app/core/puc/Puc/v4p11/Autoloader.php | 63 + app/core/puc/Puc/v4p11/DebugBar/Extension.php | 190 + app/core/puc/Puc/v4p11/DebugBar/Panel.php | 165 + .../Puc/v4p11/DebugBar/PluginExtension.php | 33 + .../puc/Puc/v4p11/DebugBar/PluginPanel.php | 38 + .../puc/Puc/v4p11/DebugBar/ThemePanel.php | 21 + app/core/puc/Puc/v4p11/Factory.php | 365 + app/core/puc/Puc/v4p11/InstalledPackage.php | 103 + app/core/puc/Puc/v4p11/Metadata.php | 132 + app/core/puc/Puc/v4p11/OAuthSignature.php | 100 + app/core/puc/Puc/v4p11/Plugin/Info.php | 132 + app/core/puc/Puc/v4p11/Plugin/Package.php | 184 + app/core/puc/Puc/v4p11/Plugin/Ui.php | 278 + app/core/puc/Puc/v4p11/Plugin/Update.php | 112 + .../puc/Puc/v4p11/Plugin/UpdateChecker.php | 414 + app/core/puc/Puc/v4p11/Scheduler.php | 266 + app/core/puc/Puc/v4p11/StateStore.php | 207 + app/core/puc/Puc/v4p11/Theme/Package.php | 65 + app/core/puc/Puc/v4p11/Theme/Update.php | 84 + .../puc/Puc/v4p11/Theme/UpdateChecker.php | 152 + app/core/puc/Puc/v4p11/Update.php | 34 + app/core/puc/Puc/v4p11/UpdateChecker.php | 999 + app/core/puc/Puc/v4p11/UpgraderStatus.php | 199 + app/core/puc/Puc/v4p11/Utils.php | 69 + app/core/puc/Puc/v4p11/Vcs/Api.php | 302 + app/core/puc/Puc/v4p11/Vcs/BaseChecker.php | 27 + app/core/puc/Puc/v4p11/Vcs/BitBucketApi.php | 273 + app/core/puc/Puc/v4p11/Vcs/GitHubApi.php | 441 + app/core/puc/Puc/v4p11/Vcs/GitLabApi.php | 399 + .../puc/Puc/v4p11/Vcs/PluginUpdateChecker.php | 293 + app/core/puc/Puc/v4p11/Vcs/Reference.php | 49 + .../puc/Puc/v4p11/Vcs/ThemeUpdateChecker.php | 118 + app/core/puc/README.md | 326 + app/core/puc/composer.json | 23 + app/core/puc/css/puc-debug-bar.css | 70 + app/core/puc/examples/plugin.json | 52 + app/core/puc/examples/theme.json | 5 + app/core/puc/js/debug-bar.js | 52 + .../puc/languages/plugin-update-checker-ca.mo | Bin 0 -> 1186 bytes .../puc/languages/plugin-update-checker-ca.po | 48 + .../languages/plugin-update-checker-cs_CZ.mo | Bin 0 -> 1077 bytes .../languages/plugin-update-checker-cs_CZ.po | 45 + .../languages/plugin-update-checker-da_DK.mo | Bin 0 -> 1010 bytes .../languages/plugin-update-checker-da_DK.po | 42 + .../languages/plugin-update-checker-de_DE.mo | Bin 0 -> 980 bytes .../languages/plugin-update-checker-de_DE.po | 38 + .../languages/plugin-update-checker-es_AR.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_AR.po | 48 + .../languages/plugin-update-checker-es_CL.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_CL.po | 48 + .../languages/plugin-update-checker-es_CO.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_CO.po | 48 + .../languages/plugin-update-checker-es_CR.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_CR.po | 48 + .../languages/plugin-update-checker-es_DO.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_DO.po | 48 + .../languages/plugin-update-checker-es_ES.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_ES.po | 48 + .../languages/plugin-update-checker-es_GT.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_GT.po | 48 + .../languages/plugin-update-checker-es_HN.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_HN.po | 48 + .../languages/plugin-update-checker-es_MX.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_MX.po | 48 + .../languages/plugin-update-checker-es_PE.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_PE.po | 48 + .../languages/plugin-update-checker-es_PR.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_PR.po | 48 + .../languages/plugin-update-checker-es_UY.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_UY.po | 48 + .../languages/plugin-update-checker-es_VE.mo | Bin 0 -> 1140 bytes .../languages/plugin-update-checker-es_VE.po | 48 + .../languages/plugin-update-checker-fa_IR.mo | Bin 0 -> 1128 bytes .../languages/plugin-update-checker-fa_IR.po | 38 + .../languages/plugin-update-checker-fr_CA.mo | Bin 0 -> 1208 bytes .../languages/plugin-update-checker-fr_CA.po | 48 + .../languages/plugin-update-checker-fr_FR.mo | Bin 0 -> 1066 bytes .../languages/plugin-update-checker-fr_FR.po | 42 + .../languages/plugin-update-checker-hu_HU.mo | Bin 0 -> 982 bytes .../languages/plugin-update-checker-hu_HU.po | 41 + .../languages/plugin-update-checker-it_IT.mo | Bin 0 -> 989 bytes .../languages/plugin-update-checker-it_IT.po | 38 + .../puc/languages/plugin-update-checker-ja.mo | Bin 0 -> 1454 bytes .../puc/languages/plugin-update-checker-ja.po | 57 + .../languages/plugin-update-checker-nl_BE.mo | Bin 0 -> 1211 bytes .../languages/plugin-update-checker-nl_BE.po | 48 + .../languages/plugin-update-checker-nl_NL.mo | Bin 0 -> 1211 bytes .../languages/plugin-update-checker-nl_NL.po | 48 + .../languages/plugin-update-checker-pt_BR.mo | Bin 0 -> 1014 bytes .../languages/plugin-update-checker-pt_BR.po | 48 + .../languages/plugin-update-checker-ru_RU.mo | Bin 0 -> 1337 bytes .../languages/plugin-update-checker-ru_RU.po | 48 + .../languages/plugin-update-checker-sl_SI.mo | Bin 0 -> 1203 bytes .../languages/plugin-update-checker-sl_SI.po | 48 + .../languages/plugin-update-checker-sv_SE.mo | Bin 0 -> 1006 bytes .../languages/plugin-update-checker-sv_SE.po | 42 + .../languages/plugin-update-checker-tr_TR.mo | Bin 0 -> 1118 bytes .../languages/plugin-update-checker-tr_TR.po | 48 + .../languages/plugin-update-checker-uk_UA.mo | Bin 0 -> 1309 bytes .../languages/plugin-update-checker-uk_UA.po | 48 + .../languages/plugin-update-checker-zh_CN.mo | Bin 0 -> 1060 bytes .../languages/plugin-update-checker-zh_CN.po | 48 + .../puc/languages/plugin-update-checker.pot | 49 + app/core/puc/license.txt | 7 + app/core/puc/load-v4p11.php | 28 + app/core/puc/plugin-update-checker.php | 10 + app/core/puc/vendor/Parsedown.php | 9 + app/core/puc/vendor/ParsedownLegacy.php | 1535 + app/core/puc/vendor/ParsedownModern.php | 1538 + app/core/puc/vendor/PucReadmeParser.php | 348 + app/core/src/Attendees/Attendee.php | 120 + app/core/src/Attendees/Attendees.php | 593 + app/core/src/Attendees/AttendeesTable.php | 70 + app/core/src/Attendees/index.php | 5 + app/core/src/Base.php | 264 + app/core/src/BookingForm/Attendees.php | 487 + app/core/src/BookingForm/DisplayFields.php | 338 + app/core/src/BookingForm/index.php | 5 + app/core/src/Books/Book.php | 329 + app/core/src/Books/BookingForm.php | 68 + app/core/src/Books/BooksQuery.php | 98 + app/core/src/Books/EventBook.php | 148 + app/core/src/Books/index.php | 5 + app/core/src/Events/Event.php | 311 + app/core/src/Events/Events.php | 100 + app/core/src/Events/EventsQuery.php | 153 + app/core/src/Events/index.php | 5 + app/core/src/FES/FormBuilder.php | 4181 +++ app/core/src/FES/index.php | 5 + app/core/src/FES/scripts.js | 182 + app/core/src/Forms/CustomForm.php | 162 + app/core/src/Forms/DisplayFields.php | 257 + app/core/src/Forms/FormFields.php | 689 + app/core/src/Forms/SettingsForm.php | 322 + app/core/src/Forms/backend.css | 408 + app/core/src/Forms/backend.js | 139 + app/core/src/Forms/custom-form.css | 110 + app/core/src/Forms/index.php | 5 + app/core/src/ImportExport/Terms.php | 393 + app/core/src/ImportExport/index.php | 5 + app/core/src/Libraries/FlushNotices.php | 68 + app/core/src/Libraries/index.php | 5 + app/core/src/Locations/Location.php | 39 + app/core/src/Locations/index.php | 5 + .../DisplayNotificationSettings.php | 26 + app/core/src/Notifications/SendEmail.php | 489 + app/core/src/Notifications/index.php | 5 + .../template-notification-settings.php | 134 + app/core/src/PostBase.php | 138 + app/core/src/Settings/Settings.php | 67 + app/core/src/Settings/index.php | 5 + app/core/src/SingleBuilder/SingleBuilder.php | 242 + .../Widgets/BookingForm/BookingForm.php | 92 + .../SingleBuilder/Widgets/Content/Content.php | 64 + .../Widgets/EventAttendees/EventAttendees.php | 51 + .../Widgets/EventBanner/EventBanner.php | 116 + .../EventBreadcrumbs/EventBreadcrumbs.php | 65 + .../EventCancellationReason.php | 64 + .../EventCategories/EventCategories.php | 66 + .../Widgets/EventCost/EventCost.php | 113 + .../Widgets/EventCountdown/EventCountdown.php | 50 + .../Widgets/EventData/EventData.php | 53 + .../Widgets/EventDate/EventDate.php | 68 + .../Widgets/EventExport/EventExport.php | 48 + .../Widgets/EventGallery/EventGallery.php | 95 + .../Widgets/EventGoogleMap/EventGoogleMap.php | 62 + .../EventHourlySchedule.php | 50 + .../Widgets/EventLabels/EventLabels.php | 65 + .../Widgets/EventLocalTime/EventLocalTime.php | 48 + .../Widgets/EventLocations/EventLocations.php | 108 + .../Widgets/EventMoreInfo/EventMoreInfo.php | 74 + .../EventNextOccurrences.php | 48 + .../EventNextPrevious/EventNextPrevious.php | 49 + .../EventOrganizers/EventOrganizers.php | 151 + .../EventPublicDownload.php | 46 + .../Widgets/EventQrCode/EventQrCode.php | 48 + .../EventRegisterButton.php | 98 + .../Widgets/EventRelated/EventRelated.php | 49 + .../EventSocialShare/EventSocialShare.php | 79 + .../Widgets/EventSpeakers/EventSpeakers.php | 76 + .../Widgets/EventSponsors/EventSponsors.php | 53 + .../Widgets/EventTags/EventTags.php | 65 + .../Widgets/EventTime/EventTime.php | 67 + .../EventTrailerUrl/EventTrailerUrl.php | 37 + .../Widgets/EventVirtual/EventVirtual.php | 54 + .../Widgets/EventWeather/EventWeather.php | 50 + .../Widgets/EventZoom/EventZoom.php | 54 + .../src/SingleBuilder/Widgets/FAQ/FAQ.php | 42 + .../Widgets/FeaturedImage/FeaturedImage.php | 58 + .../Widgets/FeaturedImage/empty-pic.jpg | Bin 0 -> 4985 bytes .../Widgets/RSVPForm/RSVPForm.php | 69 + .../Widgets/SimpleHeader/SimpleHeader.php | 36 + .../src/SingleBuilder/Widgets/WidgetBase.php | 96 + app/core/src/SingleBuilder/index.php | 5 + app/core/src/Singleton.php | 23 + app/core/src/Tickets/Ticket.php | 67 + app/core/src/Tickets/Tickets.php | 51 + app/core/src/Tickets/index.php | 5 + app/core/src/Transactions/Transaction.php | 2342 ++ app/core/src/Transactions/index.php | 5 + app/core/src/index.php | 5 + app/crons/index.html | 0 app/features/admincalendar.php | 98 + app/features/adminupcoming.php | 145 + app/features/archive.php | 49 + app/features/autoemails.php | 162 + app/features/booking/calendar_novel.php | 198 + app/features/booking/variations.php | 23 + app/features/bookingcalendar.php | 138 + app/features/cart.php | 192 + app/features/cart/cart.php | 95 + app/features/cart/checkout.php | 164 + app/features/cart/index.html | 0 app/features/certificates.php | 310 + app/features/certificates/template.php | 60 + app/features/colors.php | 125 + app/features/compatibility.php | 103 + app/features/contextual.php | 345 + app/features/dc.php | 221 + app/features/dlfile.php | 233 + app/features/emails/details.php | 68 + app/features/events.php | 4062 +++ app/features/faq.php | 162 + app/features/feed.php | 227 + app/features/feed/index.html | 0 app/features/feed/rss2.php | 102 + app/features/fes.php | 1763 + app/features/fes/form.php | 212 + app/features/fes/index.html | 0 app/features/fes/list.php | 178 + app/features/fes/message.php | 7 + app/features/gateways/index.html | 0 app/features/hourlyschedule.php | 79 + app/features/index.html | 0 app/features/ix.php | 5254 +++ app/features/ix/export.php | 71 + app/features/ix/export_g_calendar.php | 189 + app/features/ix/import.php | 111 + app/features/ix/import_f_calendar.php | 112 + app/features/ix/import_g_calendar.php | 129 + app/features/ix/import_meetup.php | 121 + app/features/ix/index.html | 0 app/features/ix/sync.php | 118 + app/features/ix/test_data.php | 115 + app/features/ix/thirdparty.php | 215 + app/features/labels.php | 290 + app/features/locations.php | 437 + app/features/login.php | 73 + app/features/login/index.html | 0 app/features/login/login.php | 156 + app/features/maintenance.php | 83 + app/features/mec.php | 2147 ++ app/features/mec/addons.php | 75 + app/features/mec/booking.php | 1557 + app/features/mec/dashboard.php | 384 + app/features/mec/dyncss.php | 392 + app/features/mec/fes.php | 829 + app/features/mec/gateways.php | 3 + app/features/mec/go-pro.php | 95 + app/features/mec/ie.php | 59 + app/features/mec/index.html | 0 app/features/mec/integrations.php | 517 + app/features/mec/messages.php | 131 + .../mec/meta_boxes/display_options.php | 3348 ++ app/features/mec/meta_boxes/filter.php | 393 + app/features/mec/meta_boxes/icons.php | 18 + app/features/mec/meta_boxes/index.html | 0 app/features/mec/meta_boxes/search_form.php | 1257 + app/features/mec/meta_boxes/shortcode.php | 6 + app/features/mec/modules.php | 876 + app/features/mec/notifications.php | 2525 ++ app/features/mec/regform.php | 4 + app/features/mec/settings.php | 1545 + app/features/mec/single.php | 760 + app/features/mec/styles.php | 101 + app/features/mec/styling.php | 401 + app/features/mec/support-page.php | 519 + app/features/mec/support.php | 153 + app/features/mec/webfonts/index.html | 0 app/features/mec/webfonts/webfonts.php | 6 + app/features/mec/wizard.php | 567 + app/features/notifications.php | 212 + app/features/occurrences.php | 663 + app/features/organizers.php | 418 + app/features/partial.php | 77 + app/features/popup.php | 681 + app/features/popup/event.php | 668 + app/features/popup/index.html | 0 app/features/popup/settings.php | 958 + app/features/popup/shortcode.php | 921 + app/features/profile.php | 99 + app/features/profile/index.html | 0 app/features/profile/message.php | 7 + app/features/profile/profile.php | 272 + app/features/report.php | 319 + app/features/report/tpl.php | 146 + app/features/restful.php | 166 + app/features/schema.php | 309 + app/features/search.php | 391 + app/features/search_bar/index.html | 0 app/features/search_bar/search_bar.php | 153 + app/features/search_bar/search_noresult.php | 1 + app/features/search_bar/search_result.php | 34 + app/features/sms.php | 140 + app/features/speakers.php | 565 + app/features/sponsors.php | 176 + app/features/tag.php | 132 + app/features/taxonomies/shortcode.php | 29 + app/features/taxonomyshortcode.php | 67 + app/features/update.php | 930 + app/features/userevents.php | 84 + app/features/wc.php | 302 + app/features/webhooks.php | 361 + app/features/webhooks/details.php | 39 + app/index.html | 0 app/libraries/base.php | 326 + app/libraries/book.php | 1946 ++ app/libraries/bookingRecord.php | 195 + app/libraries/cache.php | 87 + app/libraries/captcha.php | 189 + app/libraries/cart.php | 257 + app/libraries/db.php | 240 + app/libraries/eventFields.php | 131 + app/libraries/factory.php | 1391 + app/libraries/feed.php | 156 + app/libraries/filesystem.php | 864 + app/libraries/formBuilder.php | 246 + app/libraries/icons.php | 173 + app/libraries/index.html | 0 app/libraries/kses.php | 227 + app/libraries/main.php | 10512 ++++++ app/libraries/meetup.php | 242 + app/libraries/notifications.php | 2647 ++ app/libraries/parser.php | 261 + app/libraries/partial.php | 112 + app/libraries/qrcode.php | 3224 ++ app/libraries/render.php | 1887 ++ app/libraries/restful.php | 117 + app/libraries/schedule.php | 162 + app/libraries/search.php | 502 + app/libraries/skins.php | 2553 ++ app/libraries/syncSchedule.php | 43 + app/libraries/ticketVariations.php | 86 + app/libraries/tickets.php | 653 + app/libraries/transaction.php | 219 + app/libraries/user.php | 249 + app/libraries/walker.php | 166 + app/libraries/wc.php | 549 + app/modules/attendees-list/details.php | 112 + app/modules/attendees-list/index.html | 0 app/modules/booking/default.php | 1086 + app/modules/booking/index.html | 0 app/modules/booking/steps/checkout.php | 237 + app/modules/booking/steps/form.php | 53 + app/modules/booking/steps/index.html | 0 app/modules/booking/steps/message.php | 51 + app/modules/booking/steps/tickets.php | 330 + app/modules/countdown/details.php | 460 + app/modules/countdown/index.html | 0 app/modules/export/details.php | 88 + app/modules/export/index.html | 0 app/modules/googlemap/details.php | 153 + app/modules/googlemap/index.html | 0 app/modules/googlemap/styles/CDO.json | 1 + .../googlemap/styles/apple-maps-esque.json | 1 + .../googlemap/styles/blue-essence.json | 1 + app/modules/googlemap/styles/blue-water.json | 1 + app/modules/googlemap/styles/facebook.json | 1 + app/modules/googlemap/styles/index.html | 0 app/modules/googlemap/styles/intown-map.json | 1 + app/modules/googlemap/styles/light-dream.json | 1 + app/modules/googlemap/styles/midnight.json | 1 + app/modules/googlemap/styles/pale-down.json | 1 + .../googlemap/styles/shades-of-grey.json | 1 + .../googlemap/styles/subtle-grayscale.json | 1 + app/modules/googlemap/styles/ultra-light.json | 1 + app/modules/index.html | 0 app/modules/links/details.php | 31 + app/modules/links/index.html | 0 app/modules/links/list.php | 23 + app/modules/local-time/details.php | 57 + app/modules/local-time/index.html | 0 app/modules/local-time/type1.php | 54 + app/modules/local-time/type2.php | 88 + app/modules/local-time/type3.php | 52 + app/modules/next-event/details.php | 174 + app/modules/next-event/index.html | 0 app/modules/next-event/multiple.php | 90 + app/modules/progress-bar/index.html | 0 app/modules/progress-bar/single.php | 59 + app/modules/qrcode/details.php | 41 + app/modules/qrcode/index.html | 0 app/modules/qrcode/invoice.php | 35 + app/modules/speakers/details.php | 126 + app/modules/speakers/index.html | 0 app/modules/sponsors/details.php | 45 + app/modules/sponsors/index.html | 0 app/modules/weather/darksky.php | 71 + app/modules/weather/details.php | 41 + app/modules/weather/index.html | 0 app/modules/weather/visualcrossing.php | 71 + app/modules/weather/weatherapi.php | 74 + app/skins/agenda.php | 292 + app/skins/agenda/index.html | 0 app/skins/agenda/render.php | 73 + app/skins/agenda/tpl.php | 98 + app/skins/available_spot.php | 122 + app/skins/available_spot/index.html | 0 app/skins/available_spot/tpl.php | 212 + app/skins/carousel.php | 253 + app/skins/carousel/index.html | 0 app/skins/carousel/render.php | 192 + app/skins/carousel/tpl.php | 67 + app/skins/countdown.php | 132 + app/skins/countdown/index.html | 0 app/skins/countdown/tpl.php | 251 + app/skins/cover.php | 124 + app/skins/cover/index.html | 0 app/skins/cover/tpl.php | 85 + app/skins/custom.php | 295 + app/skins/custom/index.html | 0 app/skins/custom/render.php | 139 + app/skins/custom/tpl.php | 87 + app/skins/daily_view.php | 424 + app/skins/daily_view/index.html | 0 app/skins/daily_view/render.php | 60 + app/skins/daily_view/tpl.php | 146 + app/skins/default_full_calendar.php | 265 + app/skins/default_full_calendar/index.html | 0 app/skins/default_full_calendar/tpl.php | 98 + app/skins/full_calendar.php | 458 + app/skins/full_calendar/index.html | 0 app/skins/full_calendar/tpl.php | 187 + app/skins/general_calendar.php | 699 + app/skins/general_calendar/render.php | 3 + app/skins/general_calendar/tpl.php | 516 + app/skins/grid.php | 655 + app/skins/grid/index.html | 0 app/skins/grid/render.php | 345 + app/skins/grid/tpl.php | 100 + app/skins/index.html | 0 app/skins/list.php | 657 + app/skins/list/index.html | 0 app/skins/list/render.php | 369 + app/skins/list/tpl.php | 108 + app/skins/map.php | 253 + app/skins/map/index.html | 0 app/skins/map/tpl.php | 100 + app/skins/masonry.php | 340 + app/skins/masonry/index.html | 0 app/skins/masonry/render.php | 162 + app/skins/masonry/tpl.php | 94 + app/skins/monthly_view.php | 451 + app/skins/monthly_view/calendar.php | 271 + app/skins/monthly_view/calendar_admin.php | 148 + app/skins/monthly_view/calendar_clean.php | 359 + app/skins/monthly_view/calendar_novel.php | 214 + app/skins/monthly_view/calendar_simple.php | 296 + app/skins/monthly_view/index.html | 0 app/skins/monthly_view/render.php | 13 + app/skins/monthly_view/tpl.php | 159 + app/skins/single.php | 2014 ++ app/skins/single/builder.php | 13 + app/skins/single/default.php | 474 + app/skins/single/divi-builder.php | 11 + app/skins/single/index.html | 0 app/skins/single/m1.php | 336 + app/skins/single/m2.php | 301 + app/skins/single/modern.php | 230 + app/skins/single/tpl.php | 60 + app/skins/slider.php | 254 + app/skins/slider/index.html | 0 app/skins/slider/render.php | 179 + app/skins/slider/tpl.php | 58 + app/skins/tile.php | 524 + app/skins/tile/index.html | 0 app/skins/tile/render.php | 93 + app/skins/tile/tpl.php | 155 + app/skins/timeline.php | 293 + app/skins/timeline/index.html | 0 app/skins/timeline/render.php | 114 + app/skins/timeline/tpl.php | 89 + app/skins/timetable.php | 506 + app/skins/timetable/classic.php | 68 + app/skins/timetable/clean.php | 71 + app/skins/timetable/index.html | 0 app/skins/timetable/modern.php | 170 + app/skins/timetable/render.php | 175 + app/skins/timetable/tpl.php | 14 + app/skins/weekly_view.php | 440 + app/skins/weekly_view/index.html | 0 app/skins/weekly_view/render.php | 72 + app/skins/weekly_view/tpl.php | 169 + app/skins/yearly_view.php | 359 + app/skins/yearly_view/calendar.php | 117 + app/skins/yearly_view/index.html | 0 app/skins/yearly_view/render.php | 83 + app/skins/yearly_view/tpl.php | 144 + app/vendor/autoload.php | 25 + app/vendor/composer/ClassLoader.php | 585 + app/vendor/composer/InstalledVersions.php | 359 + app/vendor/composer/LICENSE | 21 + app/vendor/composer/autoload_classmap.php | 10 + app/vendor/composer/autoload_namespaces.php | 10 + app/vendor/composer/autoload_psr4.php | 10 + app/vendor/composer/autoload_real.php | 38 + app/vendor/composer/autoload_static.php | 47 + app/vendor/composer/installed.json | 74 + app/vendor/composer/installed.php | 32 + app/vendor/composer/platform_check.php | 26 + app/vendor/johngrogg/ics-parser/.editorconfig | 11 + .../.github/ISSUE_TEMPLATE/bug_report.md | 31 + .../pull_request_template.md | 12 + .../ics-parser/.github/release_template.md | 9 + app/vendor/johngrogg/ics-parser/.gitignore | 58 + .../johngrogg/ics-parser/CONTRIBUTING.md | 18 + app/vendor/johngrogg/ics-parser/FUNDING.yml | 1 + app/vendor/johngrogg/ics-parser/LICENSE | 15 + app/vendor/johngrogg/ics-parser/README.md | 242 + app/vendor/johngrogg/ics-parser/composer.json | 55 + app/vendor/johngrogg/ics-parser/composer.lock | 1227 + app/vendor/johngrogg/ics-parser/ecs.php | 268 + .../johngrogg/ics-parser/examples/ICal.ics | 337 + .../johngrogg/ics-parser/examples/index.php | 174 + app/vendor/johngrogg/ics-parser/phpunit.xml | 7 + app/vendor/johngrogg/ics-parser/rector.php | 83 + .../johngrogg/ics-parser/src/ICal/Event.php | 204 + .../johngrogg/ics-parser/src/ICal/ICal.php | 2633 ++ .../ics-parser/tests/RecurrencesTest.php | 531 + .../ics-parser/tests/SingleEventsTest.php | 501 + .../ics-parser/tests/ical/ical-monthly.ics | 18 + .../ics-parser/tests/ical/issue-196.ics | 64 + .../tests/rfc5545RecurrenceExamplesTest.php | 1033 + app/widgets/MEC.php | 169 + app/widgets/index.html | 0 app/widgets/single.php | 148 + app/widgets/single/default.php | 214 + app/widgets/single/index.html | 0 app/widgets/single/modern.php | 184 + assets/css/a11y-backend.css | 164 + assets/css/a11y-backend.min.css | 1 + assets/css/a11y.css | 119 + assets/css/a11y.min.css | 1 + assets/css/admin-calendar.min.css | 288 + assets/css/admin-upcoming.min.css | 1 + assets/css/backend.css | 13908 ++++++++ assets/css/backend.min.css | 5 + assets/css/dyncss.css | 0 assets/css/frontend.css | 27342 ++++++++++++++++ assets/css/frontend.min.css | 1 + assets/css/iconfonts.css | 3431 ++ assets/css/index.html | 0 assets/css/mec-general-calendar.css | 1 + assets/css/mecrtl.css | 926 + assets/css/mecrtl.min.css | 1 + assets/css/nice-select.min.css | 1 + assets/css/rtlbackend.css | 123 + assets/files/sample.csv | 2 + assets/fonts/FontAwesome.otf | Bin 0 -> 123112 bytes assets/fonts/Simple-Line-Icons.eot | Bin 0 -> 54266 bytes assets/fonts/Simple-Line-Icons.svg | 200 + assets/fonts/Simple-Line-Icons.ttf | Bin 0 -> 54056 bytes assets/fonts/Simple-Line-Icons.woff | Bin 0 -> 81332 bytes assets/fonts/Simple-Line-Icons.woff2 | Bin 0 -> 30064 bytes assets/fonts/fontawesome-webfont.eot | Bin 0 -> 75220 bytes assets/fonts/fontawesome-webfont.svg | 685 + assets/fonts/fontawesome-webfont.ttf | Bin 0 -> 150920 bytes assets/fonts/fontawesome-webfont.woff | Bin 0 -> 89076 bytes assets/fonts/fontawesome-webfont.woff2 | Bin 0 -> 70728 bytes assets/fonts/index.html | 0 assets/icon.html | 837 + assets/img/ajax-loader.gif | Bin 0 -> 25243 bytes assets/img/cluster1/index.html | 0 assets/img/cluster1/m1.png | Bin 0 -> 3003 bytes assets/img/cluster1/m2.png | Bin 0 -> 3259 bytes assets/img/cluster1/m3.png | Bin 0 -> 3956 bytes assets/img/cluster1/m4.png | Bin 0 -> 5705 bytes assets/img/cluster1/m5.png | Bin 0 -> 6839 bytes assets/img/document.png | Bin 0 -> 6774 bytes assets/img/dp-dsb-support.jpg | Bin 0 -> 23887 bytes assets/img/dp-dsb-support2.png | Bin 0 -> 115857 bytes assets/img/email-document.png | Bin 0 -> 1232 bytes assets/img/ico-mec-vc.png | Bin 0 -> 1056 bytes assets/img/index.html | 0 assets/img/m-01.png | Bin 0 -> 1195 bytes assets/img/m-02.png | Bin 0 -> 1250 bytes assets/img/m-03.png | Bin 0 -> 1060 bytes assets/img/m-04.png | Bin 0 -> 1341 bytes assets/img/m-05.png | Bin 0 -> 1104 bytes assets/img/map.jpg | Bin 0 -> 68530 bytes assets/img/mec-addons-teaser1.png | Bin 0 -> 42569 bytes assets/img/mec-booking.svg | 31 + assets/img/mec-lite-backend-go-pro.png | Bin 0 -> 57249 bytes assets/img/mec-logo-icon.png | Bin 0 -> 46996 bytes assets/img/mec-logo-icon.svg | 101 + assets/img/mec-logo-w.png | Bin 0 -> 29718 bytes assets/img/mec-logo-w2.png | Bin 0 -> 31256 bytes assets/img/mec-weather-icon-01.png | Bin 0 -> 2302 bytes assets/img/mec-weather-icon-02.png | Bin 0 -> 2459 bytes assets/img/mec-weather-icon-03.png | Bin 0 -> 1794 bytes assets/img/mec-weather-icon-04.png | Bin 0 -> 2189 bytes assets/img/mec-weather-icon-05.png | Bin 0 -> 2234 bytes assets/img/mec-weather-icon-06.png | Bin 0 -> 2333 bytes assets/img/mec-weather-icon-07.png | Bin 0 -> 1882 bytes assets/img/mec.svg | 30 + assets/img/newsletter-document.png | Bin 0 -> 2767 bytes assets/img/no-image.png | Bin 0 -> 11422 bytes assets/img/popup/add-event-first-step.png | Bin 0 -> 10148 bytes assets/img/popup/add-organizer.png | Bin 0 -> 23598 bytes assets/img/popup/add-sh-icon.png | Bin 0 -> 304 bytes assets/img/popup/calendar_icon.png | Bin 0 -> 429 bytes assets/img/popup/char.png | Bin 0 -> 11239 bytes assets/img/popup/eye.png | Bin 0 -> 498 bytes assets/img/popup/fifth-step.png | Bin 0 -> 29113 bytes assets/img/popup/first-step.png | Bin 0 -> 29846 bytes assets/img/popup/fourth-step.png | Bin 0 -> 35375 bytes assets/img/popup/index.html | 0 assets/img/popup/mec-logo.svg | 15 + assets/img/popup/organization.png | Bin 0 -> 329 bytes assets/img/popup/picture.png | Bin 0 -> 299 bytes assets/img/popup/plus-blue.png | Bin 0 -> 341 bytes assets/img/popup/plus.png | Bin 0 -> 382 bytes assets/img/popup/pointer.png | Bin 0 -> 414 bytes assets/img/popup/popup-new-shortcode-plus.svg | 3 + assets/img/popup/popup-next-icon.svg | 3 + assets/img/popup/popup-prev-icon.svg | 3 + assets/img/popup/save.svg | 1 + assets/img/popup/sixth-step.png | Bin 0 -> 57709 bytes assets/img/skins/agenda.svg | 65 + assets/img/skins/agenda/agenda-clean.png | Bin 0 -> 7097 bytes assets/img/skins/agenda/index.html | 0 .../available-spot/available-spot-classic.png | Bin 0 -> 19682 bytes assets/img/skins/available_spot.svg | 41 + assets/img/skins/carousel.svg | 67 + assets/img/skins/carousel/carousel-type-1.png | Bin 0 -> 18418 bytes assets/img/skins/carousel/carousel-type-2.png | Bin 0 -> 15714 bytes assets/img/skins/carousel/carousel-type-3.png | Bin 0 -> 16994 bytes assets/img/skins/carousel/carousel-type-4.png | Bin 0 -> 10993 bytes assets/img/skins/carousel/index.html | 0 assets/img/skins/countdown.svg | 38 + .../img/skins/countdown/countdown-type-1.png | Bin 0 -> 2066 bytes .../img/skins/countdown/countdown-type-2.png | Bin 0 -> 3105 bytes .../img/skins/countdown/countdown-type-3.png | Bin 0 -> 8505 bytes assets/img/skins/countdown/index.html | 0 assets/img/skins/cover.svg | 34 + assets/img/skins/cover/cover-classic.png | Bin 0 -> 22337 bytes assets/img/skins/cover/cover-clean.png | Bin 0 -> 26633 bytes assets/img/skins/cover/cover-modern.png | Bin 0 -> 35046 bytes assets/img/skins/cover/index.html | 0 assets/img/skins/custom.svg | 43 + assets/img/skins/daily.svg | 78 + assets/img/skins/daily/daily-classic.png | Bin 0 -> 5950 bytes .../img/skins/fluent/fluent-agenda-view.png | Bin 0 -> 14352 bytes .../fluent-available-spot-view-type1.png | Bin 0 -> 32545 bytes .../fluent-available-spot-view-type2.png | Bin 0 -> 21884 bytes .../img/skins/fluent/fluent-carousel-view.png | Bin 0 -> 17575 bytes .../skins/fluent/fluent-countdown-view.png | Bin 0 -> 18650 bytes .../skins/fluent/fluent-cover-view-type1.png | Bin 0 -> 28652 bytes .../skins/fluent/fluent-cover-view-type2.png | Bin 0 -> 24218 bytes .../skins/fluent/fluent-cover-view-type3.png | Bin 0 -> 28785 bytes .../skins/fluent/fluent-cover-view-type4.png | Bin 0 -> 28913 bytes assets/img/skins/fluent/fluent-daily-view.png | Bin 0 -> 10355 bytes .../fluent/fluent-full-calendar-view.png | Bin 0 -> 9123 bytes assets/img/skins/fluent/fluent-grid-view.png | Bin 0 -> 26461 bytes assets/img/skins/fluent/fluent-list-view.png | Bin 0 -> 15353 bytes .../img/skins/fluent/fluent-masonry-view.png | Bin 0 -> 32219 bytes .../img/skins/fluent/fluent-monthly-view.png | Bin 0 -> 9123 bytes .../img/skins/fluent/fluent-slider-view.png | Bin 0 -> 26168 bytes assets/img/skins/fluent/fluent-tile-view.png | Bin 0 -> 23927 bytes .../skins/fluent/fluent-time-table-view.png | Bin 0 -> 8618 bytes .../img/skins/fluent/fluent-weekly-view.png | Bin 0 -> 9175 bytes .../img/skins/fluent/fluent-yearly-view.png | Bin 0 -> 14700 bytes .../full-calendar/full-calendar-daily.png | Bin 0 -> 2835 bytes .../full-calendar/full-calendar-list.png | Bin 0 -> 18714 bytes .../full-calendar/full-calendar-monthly.png | Bin 0 -> 3408 bytes .../full-calendar/full-calendar-weekly.png | Bin 0 -> 2661 bytes .../full-calendar/full-calendar-yearly.png | Bin 0 -> 7389 bytes assets/img/skins/full-calendar/index.html | 0 assets/img/skins/full_calendar.svg | 82 + assets/img/skins/general_calendar.svg | 75 + assets/img/skins/grid.svg | 45 + assets/img/skins/grid/grid-classic.png | Bin 0 -> 20040 bytes assets/img/skins/grid/grid-clean.png | Bin 0 -> 18072 bytes assets/img/skins/grid/grid-colorful.png | Bin 0 -> 4347 bytes assets/img/skins/grid/grid-minimal.png | Bin 0 -> 2932 bytes assets/img/skins/grid/grid-modern.png | Bin 0 -> 3914 bytes assets/img/skins/grid/grid-novel.png | Bin 0 -> 7397 bytes assets/img/skins/grid/grid-simple.png | Bin 0 -> 3856 bytes assets/img/skins/grid/index.html | 0 assets/img/skins/index.html | 0 .../skins/liquid/liquid-available-spot.jpg | Bin 0 -> 20805 bytes assets/img/skins/liquid/liquid-carousel.jpg | Bin 0 -> 22841 bytes assets/img/skins/liquid/liquid-cover.jpg | Bin 0 -> 19565 bytes assets/img/skins/liquid/liquid-daily.jpg | Bin 0 -> 11712 bytes .../img/skins/liquid/liquid-full-calendar.jpg | Bin 0 -> 21993 bytes assets/img/skins/liquid/liquid-grid-large.jpg | Bin 0 -> 34382 bytes .../img/skins/liquid/liquid-grid-medium.jpg | Bin 0 -> 38143 bytes assets/img/skins/liquid/liquid-grid-small.jpg | Bin 0 -> 35545 bytes assets/img/skins/liquid/liquid-list-large.jpg | Bin 0 -> 22756 bytes .../img/skins/liquid/liquid-list-medium.jpg | Bin 0 -> 15150 bytes .../img/skins/liquid/liquid-list-minimal.jpg | Bin 0 -> 12062 bytes assets/img/skins/liquid/liquid-list-small.jpg | Bin 0 -> 13225 bytes assets/img/skins/liquid/liquid-map.jpg | Bin 0 -> 26858 bytes assets/img/skins/liquid/liquid-slider.jpg | Bin 0 -> 18691 bytes assets/img/skins/liquid/liquid-weekly.jpg | Bin 0 -> 16697 bytes assets/img/skins/list.svg | 36 + assets/img/skins/list/index.html | 0 assets/img/skins/list/list-accordion.png | Bin 0 -> 2444 bytes assets/img/skins/list/list-classic.png | Bin 0 -> 14092 bytes assets/img/skins/list/list-minimal.png | Bin 0 -> 5031 bytes assets/img/skins/list/list-modern.png | Bin 0 -> 1375 bytes assets/img/skins/list/list-standard.png | Bin 0 -> 9863 bytes assets/img/skins/map.svg | 29 + assets/img/skins/map/map-classic.jpg | Bin 0 -> 37146 bytes assets/img/skins/masonry.svg | 74 + assets/img/skins/masonry/masonry-classic.png | Bin 0 -> 25017 bytes assets/img/skins/monthly.svg | 75 + assets/img/skins/monthly/index.html | 0 assets/img/skins/monthly/monthly-classic.png | Bin 0 -> 3348 bytes assets/img/skins/monthly/monthly-clean.png | Bin 0 -> 3039 bytes assets/img/skins/monthly/monthly-modern.png | Bin 0 -> 4881 bytes assets/img/skins/monthly/monthly-novel.png | Bin 0 -> 14707 bytes assets/img/skins/monthly/monthly-simple.png | Bin 0 -> 10899 bytes assets/img/skins/popup/agenda-clean.jpg | Bin 0 -> 9344 bytes assets/img/skins/popup/agenda-fluent.jpg | Bin 0 -> 7063 bytes .../skins/popup/available-spot-classic.jpg | Bin 0 -> 10957 bytes .../popup/available-spot-fluent-type1.jpg | Bin 0 -> 8071 bytes .../popup/available-spot-fluent-type2.jpg | Bin 0 -> 10317 bytes assets/img/skins/popup/carousel-fluent.jpg | Bin 0 -> 7608 bytes assets/img/skins/popup/carousel-type1.jpg | Bin 0 -> 7376 bytes assets/img/skins/popup/carousel-type2.jpg | Bin 0 -> 4823 bytes assets/img/skins/popup/carousel-type3.jpg | Bin 0 -> 6016 bytes assets/img/skins/popup/carousel-type4.jpg | Bin 0 -> 2945 bytes assets/img/skins/popup/countdown-fluent.jpg | Bin 0 -> 9450 bytes assets/img/skins/popup/countdown-type1.jpg | Bin 0 -> 2803 bytes assets/img/skins/popup/countdown-type2.jpg | Bin 0 -> 10775 bytes assets/img/skins/popup/countdown-type3.jpg | Bin 0 -> 4457 bytes assets/img/skins/popup/cover-classic.jpg | Bin 0 -> 9466 bytes assets/img/skins/popup/cover-clean.jpg | Bin 0 -> 8547 bytes assets/img/skins/popup/cover-fluent-type1.jpg | Bin 0 -> 11684 bytes assets/img/skins/popup/cover-fluent-type2.jpg | Bin 0 -> 10871 bytes assets/img/skins/popup/cover-fluent-type3.jpg | Bin 0 -> 11651 bytes assets/img/skins/popup/cover-fluent-type4.jpg | Bin 0 -> 12165 bytes assets/img/skins/popup/cover-modern.jpg | Bin 0 -> 11599 bytes assets/img/skins/popup/daily-classic.jpg | Bin 0 -> 3188 bytes assets/img/skins/popup/daily-fluent.jpg | Bin 0 -> 7191 bytes assets/img/skins/popup/grid-classic.jpg | Bin 0 -> 17436 bytes assets/img/skins/popup/grid-clean.jpg | Bin 0 -> 18707 bytes assets/img/skins/popup/grid-colorful.jpg | Bin 0 -> 15736 bytes assets/img/skins/popup/grid-fluent.jpg | Bin 0 -> 11675 bytes assets/img/skins/popup/grid-minimal.jpg | Bin 0 -> 12806 bytes assets/img/skins/popup/grid-modern.jpg | Bin 0 -> 8570 bytes assets/img/skins/popup/grid-novel.jpg | Bin 0 -> 13969 bytes assets/img/skins/popup/grid-simple.jpg | Bin 0 -> 5898 bytes assets/img/skins/popup/index.html | 0 assets/img/skins/popup/list-classic.jpg | Bin 0 -> 9411 bytes assets/img/skins/popup/list-fluent.jpg | Bin 0 -> 9244 bytes assets/img/skins/popup/list-minimal.jpg | Bin 0 -> 8694 bytes assets/img/skins/popup/list-modern.jpg | Bin 0 -> 9440 bytes assets/img/skins/popup/list-standard.jpg | Bin 0 -> 6903 bytes assets/img/skins/popup/list-toggle.jpg | Bin 0 -> 6664 bytes assets/img/skins/popup/masonry-classic.jpg | Bin 0 -> 12799 bytes assets/img/skins/popup/masonry-fluent.jpg | Bin 0 -> 15671 bytes assets/img/skins/popup/monthly-classic.jpg | Bin 0 -> 3939 bytes assets/img/skins/popup/monthly-clean.jpg | Bin 0 -> 5734 bytes assets/img/skins/popup/monthly-fluent.jpg | Bin 0 -> 7573 bytes assets/img/skins/popup/monthly-modern.jpg | Bin 0 -> 6713 bytes assets/img/skins/popup/monthly-novel.jpg | Bin 0 -> 12438 bytes assets/img/skins/popup/monthly-simple.jpg | Bin 0 -> 9951 bytes assets/img/skins/popup/slider-fluent.jpg | Bin 0 -> 9177 bytes assets/img/skins/popup/slider-type1.jpg | Bin 0 -> 5689 bytes assets/img/skins/popup/slider-type2.jpg | Bin 0 -> 11660 bytes assets/img/skins/popup/slider-type3.jpg | Bin 0 -> 14895 bytes assets/img/skins/popup/slider-type4.jpg | Bin 0 -> 15785 bytes assets/img/skins/popup/slider-type5.jpg | Bin 0 -> 6661 bytes assets/img/skins/popup/tile-classic.jpg | Bin 0 -> 8994 bytes assets/img/skins/popup/tile-fluent.jpg | Bin 0 -> 19251 bytes assets/img/skins/popup/timetable-clean.jpg | Bin 0 -> 16527 bytes assets/img/skins/popup/timetable-fluent.jpg | Bin 0 -> 5068 bytes assets/img/skins/popup/timetable-modern.jpg | Bin 0 -> 8347 bytes assets/img/skins/popup/weekly-classic.jpg | Bin 0 -> 6383 bytes assets/img/skins/popup/weekly-fluent.jpg | Bin 0 -> 5887 bytes assets/img/skins/popup/yearly-fluent.jpg | Bin 0 -> 7772 bytes assets/img/skins/popup/yearly-modern.jpg | Bin 0 -> 10836 bytes assets/img/skins/shortcode-designer.svg | 43 + assets/img/skins/slider.svg | 43 + assets/img/skins/slider/index.html | 0 assets/img/skins/slider/slider-type-1.png | Bin 0 -> 11856 bytes assets/img/skins/slider/slider-type-2.png | Bin 0 -> 27333 bytes assets/img/skins/slider/slider-type-3.png | Bin 0 -> 26606 bytes assets/img/skins/slider/slider-type-4.png | Bin 0 -> 25852 bytes assets/img/skins/slider/slider-type-5.png | Bin 0 -> 16327 bytes assets/img/skins/tile.svg | 40 + assets/img/skins/tile/tile-classic.png | Bin 0 -> 30717 bytes assets/img/skins/time-table/index.html | 0 .../img/skins/time-table/time-table-clean.png | Bin 0 -> 8083 bytes .../skins/time-table/time-table-modern.png | Bin 0 -> 1868 bytes assets/img/skins/timeline.svg | 69 + assets/img/skins/timetable.svg | 101 + assets/img/skins/weekly.svg | 70 + assets/img/skins/weekly/weekly-classic.png | Bin 0 -> 6528 bytes assets/img/skins/yearly.svg | 75 + assets/img/skins/yearly/index.html | 0 assets/img/skins/yearly/yearly-modern.png | Bin 0 -> 18581 bytes assets/img/support.png | Bin 0 -> 154040 bytes assets/img/svg/calendar.svg | 3 + assets/img/svg/camrecorder.svg | 9 + assets/img/svg/cancel.svg | 9 + assets/img/svg/clock.svg | 3 + assets/img/svg/delay.svg | 9 + assets/img/svg/form/back-icon.svg | 3 + assets/img/svg/form/calendar-icon.svg | 3 + assets/img/svg/form/close-icon.svg | 3 + assets/img/svg/form/credit-card-icon.svg | 14 + assets/img/svg/form/discount-icon.svg | 8 + assets/img/svg/form/done-icon.svg | 3 + assets/img/svg/form/down-icon.svg | 3 + assets/img/svg/form/down-small-icon.svg | 6 + assets/img/svg/form/email-icon.svg | 3 + assets/img/svg/form/i-icon.svg | 14 + assets/img/svg/form/left-icon.svg | 3 + assets/img/svg/form/lock-icon.svg | 3 + assets/img/svg/form/minus-icon.svg | 3 + assets/img/svg/form/next-icon.svg | 3 + assets/img/svg/form/pay-locally-icon.svg | 3 + assets/img/svg/form/paypal-icon.svg | 3 + assets/img/svg/form/plus-icon.svg | 4 + assets/img/svg/form/right-icon.svg | 3 + assets/img/svg/form/search-icon.svg | 3 + assets/img/svg/form/stripe-card-icon.svg | 7 + assets/img/svg/form/stripe-icon.svg | 3 + assets/img/svg/form/subtotal-icon.svg | 42 + assets/img/svg/form/ticket-icon.svg | 26 + assets/img/svg/form/up-icon.svg | 3 + assets/img/svg/form/up-small-icon.svg | 6 + assets/img/svg/form/user-icon.svg | 6 + assets/img/svg/local-time.svg | 3 + assets/img/svg/location.svg | 3 + assets/img/svg/mec-live-now.svg | 9 + assets/img/svg/ontime.svg | 9 + assets/img/svg/share.svg | 3 + assets/img/webnus-logo.png | Bin 0 -> 14602 bytes assets/img/webnus-logo2.png | Bin 0 -> 14082 bytes assets/img/wn-ms-icon-17-n.svg | 21 + assets/img/x-social-media-black-icon.svg | 1 + assets/img/x-social-media-logo-icon.svg | 1 + assets/img/x.png | Bin 0 -> 452 bytes assets/index.html | 0 assets/js/admin-calendar.js | 123 + assets/js/admin-upcoming.js | 73 + assets/js/backend.js | 1196 + assets/js/chartjs.min.js | 13 + assets/js/date.format.min.js | 1 + assets/js/events.js | 1078 + assets/js/flipcount-divi.js | 1954 ++ assets/js/flipcount.js | 1953 ++ assets/js/frontend.js | 7036 ++++ assets/js/googlemap.js | 411 + assets/js/imagesload.js | 7 + assets/js/index.html | 0 assets/js/isotope.pkgd.min.js | 12 + assets/js/jquery.nice-select.min.js | 4 + assets/js/jquery.nicescroll.min.js | 2 + assets/js/jquery.typewatch.js | 102 + assets/js/mec-ajax-login.js | 0 assets/js/mec-external.js | 36 + assets/js/mec-general-calendar.js | 6 + assets/js/shuffle.min.js | 2 + assets/js/total-booking-reports.js | 73 + assets/packages/clusterer/index.html | 0 assets/packages/clusterer/markerclusterer.js | 1315 + .../packages/clusterer/markerclusterer.min.js | 1 + .../colorbrightness/colorbrightness.min.js | 11 + assets/packages/featherlight/featherlight.css | 164 + assets/packages/featherlight/featherlight.js | 667 + assets/packages/index.html | 0 assets/packages/lity/index.html | 0 assets/packages/lity/lity.css | 200 + assets/packages/lity/lity.js | 638 + assets/packages/lity/lity.min.css | 3 + assets/packages/lity/lity.min.js | 5 + assets/packages/month-picker/MonthPicker.css | 204 + assets/packages/month-picker/MonthPicker.js | 474 + assets/packages/owl-carousel/AjaxLoader.gif | Bin 0 -> 1517 bytes assets/packages/owl-carousel/grabbing.png | Bin 0 -> 116 bytes assets/packages/owl-carousel/index.html | 0 assets/packages/owl-carousel/owl.carousel.css | 171 + .../owl-carousel/owl.carousel.min.css | 1 + .../packages/owl-carousel/owl.carousel.min.js | 8 + assets/packages/owl-carousel/owl.theme.css | 55 + .../packages/owl-carousel/owl.theme.min.css | 1 + .../packages/owl-carousel/owl.transitions.css | 163 + .../owl-carousel/owl.transitions.min.css | 1 + assets/packages/richmarker/index.html | 0 assets/packages/richmarker/richmarker.min.js | 20 + assets/packages/select2/select2.full.min.js | 2 + assets/packages/select2/select2.min.css | 1 + assets/packages/timepicker/index.html | 0 .../timepicker/jquery.timepicker.min.css | 1 + .../timepicker/jquery.timepicker.min.js | 2 + assets/packages/tooltip/tooltip.css | 1 + assets/packages/tooltip/tooltip.js | 2 + .../tooltipster-sideTip-shadow.min.css | 1 + assets/sql/index.html | 0 assets/sql/install.sql | 96 + assets/sql/tables.sql | 104 + changelog.txt | 3311 ++ index.html | 0 languages/index.html | 0 languages/modern-events-calendar-lite-ca.mo | Bin 0 -> 170312 bytes languages/modern-events-calendar-lite-ca.po | 17497 ++++++++++ .../modern-events-calendar-lite-cs_CZ.mo | Bin 0 -> 80407 bytes .../modern-events-calendar-lite-cs_CZ.po | 18018 ++++++++++ .../modern-events-calendar-lite-de_DE.mo | Bin 0 -> 215991 bytes .../modern-events-calendar-lite-de_DE.po | 16762 ++++++++++ .../modern-events-calendar-lite-en_US.mo | Bin 0 -> 673 bytes .../modern-events-calendar-lite-en_US.po | 14494 ++++++++ .../modern-events-calendar-lite-es_ES.mo | Bin 0 -> 134197 bytes .../modern-events-calendar-lite-es_ES.po | 17680 ++++++++++ .../modern-events-calendar-lite-fr_FR.mo | Bin 0 -> 126042 bytes .../modern-events-calendar-lite-fr_FR.po | 17503 ++++++++++ .../modern-events-calendar-lite-hu_HU.mo | Bin 0 -> 171053 bytes .../modern-events-calendar-lite-hu_HU.po | 16318 +++++++++ .../modern-events-calendar-lite-it_IT.mo | Bin 0 -> 68120 bytes .../modern-events-calendar-lite-it_IT.po | 16534 ++++++++++ .../modern-events-calendar-lite-nb_NO.mo | Bin 0 -> 134089 bytes .../modern-events-calendar-lite-nb_NO.po | 17602 ++++++++++ .../modern-events-calendar-lite-nl_NL.mo | Bin 0 -> 112002 bytes .../modern-events-calendar-lite-nl_NL.po | 17700 ++++++++++ .../modern-events-calendar-lite-pl_PL.mo | Bin 0 -> 113123 bytes .../modern-events-calendar-lite-pl_PL.po | 17961 ++++++++++ .../modern-events-calendar-lite-pt_BR.mo | Bin 0 -> 36407 bytes .../modern-events-calendar-lite-pt_BR.po | 17820 ++++++++++ .../modern-events-calendar-lite-ru_RU.mo | Bin 0 -> 34848 bytes .../modern-events-calendar-lite-ru_RU.po | 17447 ++++++++++ .../modern-events-calendar-lite-sv_SE.mo | Bin 0 -> 43946 bytes .../modern-events-calendar-lite-sv_SE.po | 17796 ++++++++++ .../modern-events-calendar-lite-tr_TR.mo | Bin 0 -> 25100 bytes .../modern-events-calendar-lite-tr_TR.po | 17412 ++++++++++ languages/modern-events-calendar-lite.pot | 14495 ++++++++ mec-init.php | 288 + modern-events-calendar-lite.php | 51 + readme.txt | 3228 ++ templates/archive-mec-events.php | 58 + templates/index.html | 0 templates/single-mec-events.php | 28 + templates/taxonomy-mec-category.php | 39 + wpml-config.xml | 174 + 3727 files changed, 866442 insertions(+) create mode 100755 MEC-Installation-Guide.pdf create mode 100755 app/addons/ACF.php create mode 100755 app/addons/KC.php create mode 100755 app/addons/PMP.php create mode 100755 app/addons/TNP.php create mode 100755 app/addons/VC.php create mode 100755 app/addons/avada.php create mode 100755 app/addons/avada/preview.php create mode 100755 app/addons/beaver.php create mode 100755 app/addons/divi.php create mode 100755 app/addons/divi/includes/Divi.php create mode 100755 app/addons/divi/includes/MECShortcodesForDivi.php create mode 100755 app/addons/divi/includes/loader.js create mode 100755 app/addons/divi/includes/loader.php create mode 100755 app/addons/divi/includes/modules/MECShortcodes/MECShortcodes.jsx create mode 100755 app/addons/divi/includes/modules/MECShortcodes/MECShortcodes.php create mode 100755 app/addons/divi/includes/modules/index.js create mode 100755 app/addons/divi/scripts/builder-bundle.min.js create mode 100755 app/addons/divi/scripts/frontend-bundle.min.js create mode 100755 app/addons/divi/scripts/frontend.js create mode 100755 app/addons/divi/styles/style-dbp.min.css create mode 100755 app/addons/divi/styles/style.min.css create mode 100755 app/addons/elementor.php create mode 100755 app/addons/elementor/index.html create mode 100755 app/addons/elementor/shortcode.php create mode 100755 app/addons/index.html create mode 100755 app/addons/learndash.php create mode 100755 app/addons/mec-beaver-builder/calendar.svg create mode 100755 app/addons/mec-beaver-builder/includes/frontend.php create mode 100755 app/addons/mec-beaver-builder/mec-beaver-builder.php create mode 100755 app/addons/tnp/index.html create mode 100755 app/addons/tnp/simple/block-empty.php create mode 100755 app/addons/tnp/simple/block-full.php create mode 100755 app/addons/tnp/simple/block-left.php create mode 100755 app/addons/tnp/simple/block-right.php create mode 100755 app/addons/tnp/simple/block.php create mode 100755 app/addons/tnp/simple/icon.png create mode 100755 app/addons/tnp/simple/index.html create mode 100755 app/addons/tnp/simple/options.php create mode 100755 app/api/Campaign_Monitor/class/base_classes.php create mode 100755 app/api/Campaign_Monitor/class/cacert.pem create mode 100755 app/api/Campaign_Monitor/class/exceptions.php create mode 100755 app/api/Campaign_Monitor/class/log.php create mode 100755 app/api/Campaign_Monitor/class/serialisation.php create mode 100755 app/api/Campaign_Monitor/class/services_json.php create mode 100755 app/api/Campaign_Monitor/class/transport.php create mode 100755 app/api/Campaign_Monitor/csrest_subscribers.php create mode 100755 app/api/Google/Auth/Abstract.php create mode 100755 app/api/Google/Auth/AppIdentity.php create mode 100755 app/api/Google/Auth/AssertionCredentials.php create mode 100755 app/api/Google/Auth/ComputeEngine.php create mode 100755 app/api/Google/Auth/Exception.php create mode 100755 app/api/Google/Auth/LoginTicket.php create mode 100755 app/api/Google/Auth/OAuth2.php create mode 100755 app/api/Google/Auth/Simple.php create mode 100755 app/api/Google/Cache/Abstract.php create mode 100755 app/api/Google/Cache/Apc.php create mode 100755 app/api/Google/Cache/Exception.php create mode 100755 app/api/Google/Cache/File.php create mode 100755 app/api/Google/Cache/Memcache.php create mode 100755 app/api/Google/Cache/Null.php create mode 100755 app/api/Google/Client.php create mode 100755 app/api/Google/Collection.php create mode 100755 app/api/Google/Config.php create mode 100755 app/api/Google/Exception.php create mode 100755 app/api/Google/Http/Batch.php create mode 100755 app/api/Google/Http/CacheParser.php create mode 100755 app/api/Google/Http/MediaFileUpload.php create mode 100755 app/api/Google/Http/REST.php create mode 100755 app/api/Google/Http/Request.php create mode 100755 app/api/Google/IO/Abstract.php create mode 100755 app/api/Google/IO/Curl.php create mode 100755 app/api/Google/IO/Exception.php create mode 100755 app/api/Google/IO/Stream.php create mode 100755 app/api/Google/IO/cacerts.pem create mode 100755 app/api/Google/Logger/Abstract.php create mode 100755 app/api/Google/Logger/Exception.php create mode 100755 app/api/Google/Logger/File.php create mode 100755 app/api/Google/Logger/Null.php create mode 100755 app/api/Google/Logger/Psr.php create mode 100755 app/api/Google/Model.php create mode 100755 app/api/Google/Service.php create mode 100755 app/api/Google/Service/Calendar.php create mode 100755 app/api/Google/Service/Exception.php create mode 100755 app/api/Google/Service/Resource.php create mode 100755 app/api/Google/Signer/Abstract.php create mode 100755 app/api/Google/Signer/P12.php create mode 100755 app/api/Google/Task/Exception.php create mode 100755 app/api/Google/Task/Retryable.php create mode 100755 app/api/Google/Task/Runner.php create mode 100755 app/api/Google/Utils.php create mode 100755 app/api/Google/Utils/URITemplate.php create mode 100755 app/api/Google/Verifier/Abstract.php create mode 100755 app/api/Google/Verifier/Pem.php create mode 100755 app/api/Google/autoload.php create mode 100755 app/api/Google/index.html create mode 100755 app/api/Meetup/meetup.php create mode 100755 app/api/Stripe/Account.php create mode 100755 app/api/Stripe/AccountLink.php create mode 100755 app/api/Stripe/AlipayAccount.php create mode 100755 app/api/Stripe/ApiOperations/All.php create mode 100755 app/api/Stripe/ApiOperations/Create.php create mode 100755 app/api/Stripe/ApiOperations/Delete.php create mode 100755 app/api/Stripe/ApiOperations/NestedResource.php create mode 100755 app/api/Stripe/ApiOperations/Request.php create mode 100755 app/api/Stripe/ApiOperations/Retrieve.php create mode 100755 app/api/Stripe/ApiOperations/Update.php create mode 100755 app/api/Stripe/ApiRequestor.php create mode 100755 app/api/Stripe/ApiResource.php create mode 100755 app/api/Stripe/ApiResponse.php create mode 100755 app/api/Stripe/ApplePayDomain.php create mode 100755 app/api/Stripe/ApplicationFee.php create mode 100755 app/api/Stripe/ApplicationFeeRefund.php create mode 100755 app/api/Stripe/Balance.php create mode 100755 app/api/Stripe/BalanceTransaction.php create mode 100755 app/api/Stripe/BankAccount.php create mode 100755 app/api/Stripe/BaseStripeClient.php create mode 100755 app/api/Stripe/BillingPortal/Configuration.php create mode 100755 app/api/Stripe/BillingPortal/Session.php create mode 100755 app/api/Stripe/BitcoinReceiver.php create mode 100755 app/api/Stripe/BitcoinTransaction.php create mode 100755 app/api/Stripe/Capability.php create mode 100755 app/api/Stripe/Card.php create mode 100755 app/api/Stripe/Charge.php create mode 100755 app/api/Stripe/Checkout/Session.php create mode 100755 app/api/Stripe/Collection.php create mode 100755 app/api/Stripe/CountrySpec.php create mode 100755 app/api/Stripe/Coupon.php create mode 100755 app/api/Stripe/CreditNote.php create mode 100755 app/api/Stripe/CreditNoteLineItem.php create mode 100755 app/api/Stripe/Customer.php create mode 100755 app/api/Stripe/CustomerBalanceTransaction.php create mode 100755 app/api/Stripe/Discount.php create mode 100755 app/api/Stripe/Dispute.php create mode 100755 app/api/Stripe/EphemeralKey.php create mode 100755 app/api/Stripe/ErrorObject.php create mode 100755 app/api/Stripe/Event.php create mode 100755 app/api/Stripe/Exception/ApiConnectionException.php create mode 100755 app/api/Stripe/Exception/ApiErrorException.php create mode 100755 app/api/Stripe/Exception/AuthenticationException.php create mode 100755 app/api/Stripe/Exception/BadMethodCallException.php create mode 100755 app/api/Stripe/Exception/CardException.php create mode 100755 app/api/Stripe/Exception/ExceptionInterface.php create mode 100755 app/api/Stripe/Exception/IdempotencyException.php create mode 100755 app/api/Stripe/Exception/InvalidArgumentException.php create mode 100755 app/api/Stripe/Exception/InvalidRequestException.php create mode 100755 app/api/Stripe/Exception/OAuth/ExceptionInterface.php create mode 100755 app/api/Stripe/Exception/OAuth/InvalidClientException.php create mode 100755 app/api/Stripe/Exception/OAuth/InvalidGrantException.php create mode 100755 app/api/Stripe/Exception/OAuth/InvalidRequestException.php create mode 100755 app/api/Stripe/Exception/OAuth/InvalidScopeException.php create mode 100755 app/api/Stripe/Exception/OAuth/OAuthErrorException.php create mode 100755 app/api/Stripe/Exception/OAuth/UnknownOAuthErrorException.php create mode 100755 app/api/Stripe/Exception/OAuth/UnsupportedGrantTypeException.php create mode 100755 app/api/Stripe/Exception/OAuth/UnsupportedResponseTypeException.php create mode 100755 app/api/Stripe/Exception/PermissionException.php create mode 100755 app/api/Stripe/Exception/RateLimitException.php create mode 100755 app/api/Stripe/Exception/SignatureVerificationException.php create mode 100755 app/api/Stripe/Exception/UnexpectedValueException.php create mode 100755 app/api/Stripe/Exception/UnknownApiErrorException.php create mode 100755 app/api/Stripe/ExchangeRate.php create mode 100755 app/api/Stripe/File.php create mode 100755 app/api/Stripe/FileLink.php create mode 100755 app/api/Stripe/HttpClient/ClientInterface.php create mode 100755 app/api/Stripe/HttpClient/CurlClient.php create mode 100755 app/api/Stripe/HttpClient/data/ca-certificates.crt create mode 100755 app/api/Stripe/HttpClient/data/test.png create mode 100755 app/api/Stripe/Invoice.php create mode 100755 app/api/Stripe/InvoiceItem.php create mode 100755 app/api/Stripe/InvoiceLineItem.php create mode 100755 app/api/Stripe/Issuing/Authorization.php create mode 100755 app/api/Stripe/Issuing/Card.php create mode 100755 app/api/Stripe/Issuing/CardDetails.php create mode 100755 app/api/Stripe/Issuing/Cardholder.php create mode 100755 app/api/Stripe/Issuing/Dispute.php create mode 100755 app/api/Stripe/Issuing/Transaction.php create mode 100755 app/api/Stripe/LineItem.php create mode 100755 app/api/Stripe/LoginLink.php create mode 100755 app/api/Stripe/Mandate.php create mode 100755 app/api/Stripe/OAuth.php create mode 100755 app/api/Stripe/OAuthErrorObject.php create mode 100755 app/api/Stripe/Order.php create mode 100755 app/api/Stripe/OrderItem.php create mode 100755 app/api/Stripe/OrderReturn.php create mode 100755 app/api/Stripe/PaymentIntent.php create mode 100755 app/api/Stripe/PaymentMethod.php create mode 100755 app/api/Stripe/Payout.php create mode 100755 app/api/Stripe/Person.php create mode 100755 app/api/Stripe/Plan.php create mode 100755 app/api/Stripe/Price.php create mode 100755 app/api/Stripe/Product.php create mode 100755 app/api/Stripe/PromotionCode.php create mode 100755 app/api/Stripe/Radar/EarlyFraudWarning.php create mode 100755 app/api/Stripe/Radar/ValueList.php create mode 100755 app/api/Stripe/Radar/ValueListItem.php create mode 100755 app/api/Stripe/Recipient.php create mode 100755 app/api/Stripe/RecipientTransfer.php create mode 100755 app/api/Stripe/Refund.php create mode 100755 app/api/Stripe/Reporting/ReportRun.php create mode 100755 app/api/Stripe/Reporting/ReportType.php create mode 100755 app/api/Stripe/RequestTelemetry.php create mode 100755 app/api/Stripe/Review.php create mode 100755 app/api/Stripe/SKU.php create mode 100755 app/api/Stripe/Service/AbstractService.php create mode 100755 app/api/Stripe/Service/AbstractServiceFactory.php create mode 100755 app/api/Stripe/Service/AccountLinkService.php create mode 100755 app/api/Stripe/Service/AccountService.php create mode 100755 app/api/Stripe/Service/ApplePayDomainService.php create mode 100755 app/api/Stripe/Service/ApplicationFeeService.php create mode 100755 app/api/Stripe/Service/BalanceService.php create mode 100755 app/api/Stripe/Service/BalanceTransactionService.php create mode 100755 app/api/Stripe/Service/BillingPortal/BillingPortalServiceFactory.php create mode 100755 app/api/Stripe/Service/BillingPortal/ConfigurationService.php create mode 100755 app/api/Stripe/Service/BillingPortal/SessionService.php create mode 100755 app/api/Stripe/Service/ChargeService.php create mode 100755 app/api/Stripe/Service/Checkout/CheckoutServiceFactory.php create mode 100755 app/api/Stripe/Service/Checkout/SessionService.php create mode 100755 app/api/Stripe/Service/CoreServiceFactory.php create mode 100755 app/api/Stripe/Service/CountrySpecService.php create mode 100755 app/api/Stripe/Service/CouponService.php create mode 100755 app/api/Stripe/Service/CreditNoteService.php create mode 100755 app/api/Stripe/Service/CustomerService.php create mode 100755 app/api/Stripe/Service/DisputeService.php create mode 100755 app/api/Stripe/Service/EphemeralKeyService.php create mode 100755 app/api/Stripe/Service/EventService.php create mode 100755 app/api/Stripe/Service/ExchangeRateService.php create mode 100755 app/api/Stripe/Service/FileLinkService.php create mode 100755 app/api/Stripe/Service/FileService.php create mode 100755 app/api/Stripe/Service/InvoiceItemService.php create mode 100755 app/api/Stripe/Service/InvoiceService.php create mode 100755 app/api/Stripe/Service/Issuing/AuthorizationService.php create mode 100755 app/api/Stripe/Service/Issuing/CardService.php create mode 100755 app/api/Stripe/Service/Issuing/CardholderService.php create mode 100755 app/api/Stripe/Service/Issuing/DisputeService.php create mode 100755 app/api/Stripe/Service/Issuing/IssuingServiceFactory.php create mode 100755 app/api/Stripe/Service/Issuing/TransactionService.php create mode 100755 app/api/Stripe/Service/MandateService.php create mode 100755 app/api/Stripe/Service/OAuthService.php create mode 100755 app/api/Stripe/Service/OrderReturnService.php create mode 100755 app/api/Stripe/Service/OrderService.php create mode 100755 app/api/Stripe/Service/PaymentIntentService.php create mode 100755 app/api/Stripe/Service/PaymentMethodService.php create mode 100755 app/api/Stripe/Service/PayoutService.php create mode 100755 app/api/Stripe/Service/PlanService.php create mode 100755 app/api/Stripe/Service/PriceService.php create mode 100755 app/api/Stripe/Service/ProductService.php create mode 100755 app/api/Stripe/Service/PromotionCodeService.php create mode 100755 app/api/Stripe/Service/Radar/EarlyFraudWarningService.php create mode 100755 app/api/Stripe/Service/Radar/RadarServiceFactory.php create mode 100755 app/api/Stripe/Service/Radar/ValueListItemService.php create mode 100755 app/api/Stripe/Service/Radar/ValueListService.php create mode 100755 app/api/Stripe/Service/RefundService.php create mode 100755 app/api/Stripe/Service/Reporting/ReportRunService.php create mode 100755 app/api/Stripe/Service/Reporting/ReportTypeService.php create mode 100755 app/api/Stripe/Service/Reporting/ReportingServiceFactory.php create mode 100755 app/api/Stripe/Service/ReviewService.php create mode 100755 app/api/Stripe/Service/SetupAttemptService.php create mode 100755 app/api/Stripe/Service/SetupIntentService.php create mode 100755 app/api/Stripe/Service/Sigma/ScheduledQueryRunService.php create mode 100755 app/api/Stripe/Service/Sigma/SigmaServiceFactory.php create mode 100755 app/api/Stripe/Service/SkuService.php create mode 100755 app/api/Stripe/Service/SourceService.php create mode 100755 app/api/Stripe/Service/SubscriptionItemService.php create mode 100755 app/api/Stripe/Service/SubscriptionScheduleService.php create mode 100755 app/api/Stripe/Service/SubscriptionService.php create mode 100755 app/api/Stripe/Service/TaxRateService.php create mode 100755 app/api/Stripe/Service/Terminal/ConnectionTokenService.php create mode 100755 app/api/Stripe/Service/Terminal/LocationService.php create mode 100755 app/api/Stripe/Service/Terminal/ReaderService.php create mode 100755 app/api/Stripe/Service/Terminal/TerminalServiceFactory.php create mode 100755 app/api/Stripe/Service/TokenService.php create mode 100755 app/api/Stripe/Service/TopupService.php create mode 100755 app/api/Stripe/Service/TransferService.php create mode 100755 app/api/Stripe/Service/WebhookEndpointService.php create mode 100755 app/api/Stripe/SetupAttempt.php create mode 100755 app/api/Stripe/SetupIntent.php create mode 100755 app/api/Stripe/Sigma/ScheduledQueryRun.php create mode 100755 app/api/Stripe/SingletonApiResource.php create mode 100755 app/api/Stripe/Source.php create mode 100755 app/api/Stripe/SourceTransaction.php create mode 100755 app/api/Stripe/Stripe.php create mode 100755 app/api/Stripe/StripeClient.php create mode 100755 app/api/Stripe/StripeClientInterface.php create mode 100755 app/api/Stripe/StripeObject.php create mode 100755 app/api/Stripe/Subscription.php create mode 100755 app/api/Stripe/SubscriptionItem.php create mode 100755 app/api/Stripe/SubscriptionSchedule.php create mode 100755 app/api/Stripe/TaxId.php create mode 100755 app/api/Stripe/TaxRate.php create mode 100755 app/api/Stripe/Terminal/ConnectionToken.php create mode 100755 app/api/Stripe/Terminal/Location.php create mode 100755 app/api/Stripe/Terminal/Reader.php create mode 100755 app/api/Stripe/ThreeDSecure.php create mode 100755 app/api/Stripe/Token.php create mode 100755 app/api/Stripe/Topup.php create mode 100755 app/api/Stripe/Transfer.php create mode 100755 app/api/Stripe/TransferReversal.php create mode 100755 app/api/Stripe/UsageRecord.php create mode 100755 app/api/Stripe/UsageRecordSummary.php create mode 100755 app/api/Stripe/Util/CaseInsensitiveArray.php create mode 100755 app/api/Stripe/Util/DefaultLogger.php create mode 100755 app/api/Stripe/Util/LoggerInterface.php create mode 100755 app/api/Stripe/Util/ObjectTypes.php create mode 100755 app/api/Stripe/Util/RandomGenerator.php create mode 100755 app/api/Stripe/Util/RequestOptions.php create mode 100755 app/api/Stripe/Util/Set.php create mode 100755 app/api/Stripe/Util/Util.php create mode 100755 app/api/Stripe/Webhook.php create mode 100755 app/api/Stripe/WebhookEndpoint.php create mode 100755 app/api/Stripe/WebhookSignature.php create mode 100755 app/api/Stripe/autoload.php create mode 100755 app/api/TFPDF/font/courier.php create mode 100755 app/api/TFPDF/font/courierb.php create mode 100755 app/api/TFPDF/font/courierbi.php create mode 100755 app/api/TFPDF/font/courieri.php create mode 100755 app/api/TFPDF/font/helvetica.php create mode 100755 app/api/TFPDF/font/helveticab.php create mode 100755 app/api/TFPDF/font/helveticabi.php create mode 100755 app/api/TFPDF/font/helveticai.php create mode 100755 app/api/TFPDF/font/symbol.php create mode 100755 app/api/TFPDF/font/times.php create mode 100755 app/api/TFPDF/font/timesb.php create mode 100755 app/api/TFPDF/font/timesbi.php create mode 100755 app/api/TFPDF/font/timesi.php create mode 100755 app/api/TFPDF/font/unifont/DejaVuSans.ttf create mode 100755 app/api/TFPDF/font/unifont/DejaVuSansCondensed-Bold.ttf create mode 100755 app/api/TFPDF/font/unifont/DejaVuSansCondensed.ttf create mode 100755 app/api/TFPDF/font/unifont/ttfonts.php create mode 100755 app/api/TFPDF/font/zapfdingbats.php create mode 100755 app/api/TFPDF/tfpdf.php create mode 100755 app/api/Twilio/Base/BaseClient.php create mode 100755 app/api/Twilio/Base/PhoneNumberCapabilities.php create mode 100755 app/api/Twilio/Deserialize.php create mode 100755 app/api/Twilio/Domain.php create mode 100755 app/api/Twilio/Exceptions/ConfigurationException.php create mode 100755 app/api/Twilio/Exceptions/DeserializeException.php create mode 100755 app/api/Twilio/Exceptions/EnvironmentException.php create mode 100755 app/api/Twilio/Exceptions/HttpException.php create mode 100755 app/api/Twilio/Exceptions/RestException.php create mode 100755 app/api/Twilio/Exceptions/TwilioException.php create mode 100755 app/api/Twilio/Exceptions/TwimlException.php create mode 100755 app/api/Twilio/Http/Client.php create mode 100755 app/api/Twilio/Http/CurlClient.php create mode 100755 app/api/Twilio/Http/File.php create mode 100755 app/api/Twilio/Http/GuzzleClient.php create mode 100755 app/api/Twilio/Http/Response.php create mode 100755 app/api/Twilio/InstanceContext.php create mode 100755 app/api/Twilio/InstanceResource.php create mode 100755 app/api/Twilio/Jwt/AccessToken.php create mode 100755 app/api/Twilio/Jwt/Client/ScopeURI.php create mode 100755 app/api/Twilio/Jwt/ClientToken.php create mode 100755 app/api/Twilio/Jwt/Grants/ChatGrant.php create mode 100755 app/api/Twilio/Jwt/Grants/Grant.php create mode 100755 app/api/Twilio/Jwt/Grants/PlaybackGrant.php create mode 100755 app/api/Twilio/Jwt/Grants/SyncGrant.php create mode 100755 app/api/Twilio/Jwt/Grants/TaskRouterGrant.php create mode 100755 app/api/Twilio/Jwt/Grants/VideoGrant.php create mode 100755 app/api/Twilio/Jwt/Grants/VoiceGrant.php create mode 100755 app/api/Twilio/Jwt/JWT.php create mode 100755 app/api/Twilio/Jwt/TaskRouter/CapabilityToken.php create mode 100755 app/api/Twilio/Jwt/TaskRouter/Policy.php create mode 100755 app/api/Twilio/Jwt/TaskRouter/TaskQueueCapability.php create mode 100755 app/api/Twilio/Jwt/TaskRouter/WorkerCapability.php create mode 100755 app/api/Twilio/Jwt/TaskRouter/WorkspaceCapability.php create mode 100755 app/api/Twilio/ListResource.php create mode 100755 app/api/Twilio/Options.php create mode 100755 app/api/Twilio/Page.php create mode 100755 app/api/Twilio/Rest/Accounts.php create mode 100755 app/api/Twilio/Rest/Accounts/V1.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionContext.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionInstance.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionList.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionPage.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/AwsContext.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/AwsInstance.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/AwsList.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/AwsOptions.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/AwsPage.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyContext.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyInstance.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyList.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyOptions.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyPage.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/CredentialList.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenContext.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenInstance.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenList.php create mode 100755 app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenPage.php create mode 100755 app/api/Twilio/Rest/AccountsBase.php create mode 100755 app/api/Twilio/Rest/Api.php create mode 100755 app/api/Twilio/Rest/Api/V2010.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AddressContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AddressInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AddressList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AddressOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AddressPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ApplicationContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ApplicationInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ApplicationList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ApplicationOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ApplicationPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachinePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobilePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/BalanceInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/BalanceList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/BalancePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/EventInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/EventList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/EventPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/StreamContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/StreamInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/StreamList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/StreamOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/StreamPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessagePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/CallContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/CallInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/CallList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/CallOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/CallPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConferenceContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConferenceInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConferenceList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConferenceOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConferencePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConnectAppContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConnectAppInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConnectAppList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConnectAppOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ConnectAppPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobilePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/KeyContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/KeyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/KeyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/KeyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/KeyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/MediaContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/MediaInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/MediaList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/MediaOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Message/MediaPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/MessageContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/MessageInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/MessageList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/MessageOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/MessagePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewKeyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewKeyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewKeyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewKeyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NotificationContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NotificationInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NotificationList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NotificationOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/NotificationPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/QueueContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/QueueInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/QueueList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/QueueOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/QueuePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/RecordingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/RecordingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/RecordingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/RecordingOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/RecordingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ShortCodeContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ShortCodeInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ShortCodeList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ShortCodeOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ShortCodePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SigningKeyContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SigningKeyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SigningKeyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SigningKeyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SigningKeyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SipInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SipList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/SipPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TokenInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TokenList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TokenOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TokenPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TranscriptionContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TranscriptionInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TranscriptionList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/TranscriptionPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/UsageInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/UsageList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/UsagePage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestPage.php create mode 100755 app/api/Twilio/Rest/Api/V2010/AccountContext.php create mode 100755 app/api/Twilio/Rest/Api/V2010/AccountInstance.php create mode 100755 app/api/Twilio/Rest/Api/V2010/AccountList.php create mode 100755 app/api/Twilio/Rest/Api/V2010/AccountOptions.php create mode 100755 app/api/Twilio/Rest/Api/V2010/AccountPage.php create mode 100755 app/api/Twilio/Rest/ApiBase.php create mode 100755 app/api/Twilio/Rest/Autopilot.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/DialoguePage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValuePage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypePage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SamplePage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/AssistantContext.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/AssistantInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/AssistantList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/AssistantOptions.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/AssistantPage.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantInstance.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantList.php create mode 100755 app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantPage.php create mode 100755 app/api/Twilio/Rest/AutopilotBase.php create mode 100755 app/api/Twilio/Rest/Bulkexports.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/DayContext.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/DayInstance.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/DayList.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/DayPage.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobInstance.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobList.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobOptions.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobPage.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/JobContext.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/JobInstance.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/JobList.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/Export/JobPage.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationContext.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationList.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationOptions.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationPage.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportContext.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportInstance.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportList.php create mode 100755 app/api/Twilio/Rest/Bulkexports/V1/ExportPage.php create mode 100755 app/api/Twilio/Rest/BulkexportsBase.php create mode 100755 app/api/Twilio/Rest/Chat.php create mode 100755 app/api/Twilio/Rest/Chat/V1.php create mode 100755 app/api/Twilio/Rest/Chat/V1/CredentialContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/CredentialList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/InvitePage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberPage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/Channel/MessagePage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/ChannelContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/ChannelList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/ChannelPage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/RoleContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/RoleInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/RoleList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/RolePage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelPage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/UserContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/UserInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/UserList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/UserOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/Service/UserPage.php create mode 100755 app/api/Twilio/Rest/Chat/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Chat/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Chat/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/Chat/V2.php create mode 100755 app/api/Twilio/Rest/Chat/V2/.openapi-generator-ignore create mode 100755 app/api/Twilio/Rest/Chat/V2/CredentialContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/CredentialList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/BindingContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/BindingInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/BindingList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/BindingOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/BindingPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/InvitePage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/MessagePage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/ChannelContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/ChannelList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/ChannelPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/RoleContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/RoleInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/RoleList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/RolePage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/UserContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/UserInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/UserList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/UserOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/Service/UserPage.php create mode 100755 app/api/Twilio/Rest/Chat/V2/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Chat/V2/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V2/ServiceList.php create mode 100755 app/api/Twilio/Rest/Chat/V2/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V2/ServicePage.php create mode 100755 app/api/Twilio/Rest/Chat/V3.php create mode 100755 app/api/Twilio/Rest/Chat/V3/.openapi-generator-ignore create mode 100755 app/api/Twilio/Rest/Chat/V3/ChannelContext.php create mode 100755 app/api/Twilio/Rest/Chat/V3/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/Chat/V3/ChannelList.php create mode 100755 app/api/Twilio/Rest/Chat/V3/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/Chat/V3/ChannelPage.php create mode 100755 app/api/Twilio/Rest/ChatBase.php create mode 100755 app/api/Twilio/Rest/Client.php create mode 100755 app/api/Twilio/Rest/Content.php create mode 100755 app/api/Twilio/Rest/Content/V1.php create mode 100755 app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchContext.php create mode 100755 app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchInstance.php create mode 100755 app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchList.php create mode 100755 app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchPage.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentAndApprovalsInstance.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentAndApprovalsList.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentAndApprovalsPage.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentContext.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentInstance.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentList.php create mode 100755 app/api/Twilio/Rest/Content/V1/ContentPage.php create mode 100755 app/api/Twilio/Rest/Content/V1/LegacyContentInstance.php create mode 100755 app/api/Twilio/Rest/Content/V1/LegacyContentList.php create mode 100755 app/api/Twilio/Rest/Content/V1/LegacyContentPage.php create mode 100755 app/api/Twilio/Rest/ContentBase.php create mode 100755 app/api/Twilio/Rest/Conversations.php create mode 100755 app/api/Twilio/Rest/Conversations/V1.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/AddressConfigurationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/AddressConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/AddressConfigurationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/AddressConfigurationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/AddressConfigurationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConfigurationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConfigurationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConfigurationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConfigurationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/MessageContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/MessageInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/MessageList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/MessageOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/MessagePage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConversationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/CredentialContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/CredentialList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ParticipantConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ParticipantConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ParticipantConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ParticipantConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/RoleContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/RoleInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/RoleList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/RolePage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/BindingContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/BindingInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/BindingList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/BindingOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/BindingPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessagePage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConversationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/RoleContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/RoleInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/RoleList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/RolePage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/UserContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/UserInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/UserList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/UserOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/Service/UserPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/User/UserConversationContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/User/UserConversationInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/User/UserConversationList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/User/UserConversationOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/User/UserConversationPage.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/UserContext.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/UserInstance.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/UserList.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/UserOptions.php create mode 100755 app/api/Twilio/Rest/Conversations/V1/UserPage.php create mode 100755 app/api/Twilio/Rest/ConversationsBase.php create mode 100755 app/api/Twilio/Rest/Events.php create mode 100755 app/api/Twilio/Rest/Events/V1.php create mode 100755 app/api/Twilio/Rest/Events/V1/EventTypeContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/EventTypeInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/EventTypeList.php create mode 100755 app/api/Twilio/Rest/Events/V1/EventTypeOptions.php create mode 100755 app/api/Twilio/Rest/Events/V1/EventTypePage.php create mode 100755 app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionList.php create mode 100755 app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionPage.php create mode 100755 app/api/Twilio/Rest/Events/V1/SchemaContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/SchemaInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/SchemaList.php create mode 100755 app/api/Twilio/Rest/Events/V1/SchemaPage.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkTestInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkTestList.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkTestPage.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkValidateInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkValidateList.php create mode 100755 app/api/Twilio/Rest/Events/V1/Sink/SinkValidatePage.php create mode 100755 app/api/Twilio/Rest/Events/V1/SinkContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/SinkInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/SinkList.php create mode 100755 app/api/Twilio/Rest/Events/V1/SinkOptions.php create mode 100755 app/api/Twilio/Rest/Events/V1/SinkPage.php create mode 100755 app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventList.php create mode 100755 app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventOptions.php create mode 100755 app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventPage.php create mode 100755 app/api/Twilio/Rest/Events/V1/SubscriptionContext.php create mode 100755 app/api/Twilio/Rest/Events/V1/SubscriptionInstance.php create mode 100755 app/api/Twilio/Rest/Events/V1/SubscriptionList.php create mode 100755 app/api/Twilio/Rest/Events/V1/SubscriptionOptions.php create mode 100755 app/api/Twilio/Rest/Events/V1/SubscriptionPage.php create mode 100755 app/api/Twilio/Rest/EventsBase.php create mode 100755 app/api/Twilio/Rest/FlexApi.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/AssessmentsContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/AssessmentsInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/AssessmentsList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/AssessmentsOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/AssessmentsPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ChannelContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ChannelList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ChannelPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ConfigurationContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ConfigurationList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ConfigurationOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/ConfigurationPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/FlexFlowContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/FlexFlowInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/FlexFlowList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/FlexFlowOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/FlexFlowPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSessionContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSessionInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSessionList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSessionOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSessionPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInvitePage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InteractionContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InteractionInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InteractionList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/InteractionPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/WebChannelContext.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/WebChannelInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/WebChannelList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/WebChannelOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V1/WebChannelPage.php create mode 100755 app/api/Twilio/Rest/FlexApi/V2.php create mode 100755 app/api/Twilio/Rest/FlexApi/V2/WebChannelsInstance.php create mode 100755 app/api/Twilio/Rest/FlexApi/V2/WebChannelsList.php create mode 100755 app/api/Twilio/Rest/FlexApi/V2/WebChannelsOptions.php create mode 100755 app/api/Twilio/Rest/FlexApi/V2/WebChannelsPage.php create mode 100755 app/api/Twilio/Rest/FlexApiBase.php create mode 100755 app/api/Twilio/Rest/FrontlineApi.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1/UserContext.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1/UserInstance.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1/UserList.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1/UserOptions.php create mode 100755 app/api/Twilio/Rest/FrontlineApi/V1/UserPage.php create mode 100755 app/api/Twilio/Rest/FrontlineApiBase.php create mode 100755 app/api/Twilio/Rest/Insights.php create mode 100755 app/api/Twilio/Rest/Insights/V1.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/AnnotationContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/AnnotationInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/AnnotationList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/AnnotationOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/AnnotationPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/CallSummaryContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/CallSummaryInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/CallSummaryList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/CallSummaryOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/CallSummaryPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/EventInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/EventList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/EventOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/EventPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/MetricInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/MetricList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/MetricOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Call/MetricPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallSummariesInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallSummariesList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallSummariesOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/CallSummariesPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/ConferenceContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/ConferenceInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/ConferenceList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/ConferenceOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/ConferencePage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Room/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Room/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Room/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/Room/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/RoomContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/RoomInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/RoomList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/RoomOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/RoomPage.php create mode 100755 app/api/Twilio/Rest/Insights/V1/SettingContext.php create mode 100755 app/api/Twilio/Rest/Insights/V1/SettingInstance.php create mode 100755 app/api/Twilio/Rest/Insights/V1/SettingList.php create mode 100755 app/api/Twilio/Rest/Insights/V1/SettingOptions.php create mode 100755 app/api/Twilio/Rest/Insights/V1/SettingPage.php create mode 100755 app/api/Twilio/Rest/InsightsBase.php create mode 100755 app/api/Twilio/Rest/IpMessaging.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/CredentialContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/CredentialList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/CredentialPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InvitePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessagePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/RoleContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/RoleInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/RoleList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/RolePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/UserContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/UserInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/UserList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/UserOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/Service/UserPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/CredentialContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/CredentialList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/CredentialPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/BindingContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/BindingInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/BindingList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/BindingOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/BindingPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InvitePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessagePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/RoleContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/RoleInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/RoleList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/RolePage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/UserContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/UserInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/UserList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/UserOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/Service/UserPage.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/ServiceContext.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/ServiceList.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/IpMessaging/V2/ServicePage.php create mode 100755 app/api/Twilio/Rest/IpMessagingBase.php create mode 100755 app/api/Twilio/Rest/Lookups.php create mode 100755 app/api/Twilio/Rest/Lookups/V1.php create mode 100755 app/api/Twilio/Rest/Lookups/V1/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Lookups/V1/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Lookups/V1/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Lookups/V1/PhoneNumberOptions.php create mode 100755 app/api/Twilio/Rest/Lookups/V1/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Lookups/V2.php create mode 100755 app/api/Twilio/Rest/Lookups/V2/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Lookups/V2/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Lookups/V2/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Lookups/V2/PhoneNumberOptions.php create mode 100755 app/api/Twilio/Rest/Lookups/V2/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/LookupsBase.php create mode 100755 app/api/Twilio/Rest/Media.php create mode 100755 app/api/Twilio/Rest/Media/V1.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaProcessorContext.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaProcessorInstance.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaProcessorList.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaProcessorOptions.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaProcessorPage.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaRecordingContext.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaRecordingInstance.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaRecordingList.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaRecordingOptions.php create mode 100755 app/api/Twilio/Rest/Media/V1/MediaRecordingPage.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantContext.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantInstance.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantList.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantOptions.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantPage.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamerContext.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamerInstance.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamerList.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamerOptions.php create mode 100755 app/api/Twilio/Rest/Media/V1/PlayerStreamerPage.php create mode 100755 app/api/Twilio/Rest/MediaBase.php create mode 100755 app/api/Twilio/Rest/Messaging.php create mode 100755 app/api/Twilio/Rest/Messaging/V1.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistrationContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistrationInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistrationList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistrationOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/BrandRegistrationPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DeactivationsContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DeactivationsInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DeactivationsList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DeactivationsOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DeactivationsPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainCertsContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainCertsInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainCertsList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainCertsPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServicePage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/DomainConfigPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ExternalCampaignInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ExternalCampaignList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ExternalCampaignPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServicePage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/ShortCodePage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecasePage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationContext.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationOptions.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationPage.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/UsecaseInstance.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/UsecaseList.php create mode 100755 app/api/Twilio/Rest/Messaging/V1/UsecasePage.php create mode 100755 app/api/Twilio/Rest/MessagingBase.php create mode 100755 app/api/Twilio/Rest/Microvisor.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountConfigContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountConfigInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountConfigList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountConfigPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountSecretContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountSecretInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountSecretList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AccountSecretPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/App/AppManifestContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/App/AppManifestInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/App/AppManifestList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/App/AppManifestPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AppContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AppInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AppList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/AppPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretPage.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/DeviceContext.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/DeviceInstance.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/DeviceList.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/DeviceOptions.php create mode 100755 app/api/Twilio/Rest/Microvisor/V1/DevicePage.php create mode 100755 app/api/Twilio/Rest/MicrovisorBase.php create mode 100755 app/api/Twilio/Rest/Monitor.php create mode 100755 app/api/Twilio/Rest/Monitor/V1.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/AlertContext.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/AlertInstance.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/AlertList.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/AlertOptions.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/AlertPage.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/EventContext.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/EventInstance.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/EventList.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/EventOptions.php create mode 100755 app/api/Twilio/Rest/Monitor/V1/EventPage.php create mode 100755 app/api/Twilio/Rest/MonitorBase.php create mode 100755 app/api/Twilio/Rest/Notify.php create mode 100755 app/api/Twilio/Rest/Notify/V1.php create mode 100755 app/api/Twilio/Rest/Notify/V1/CredentialContext.php create mode 100755 app/api/Twilio/Rest/Notify/V1/CredentialInstance.php create mode 100755 app/api/Twilio/Rest/Notify/V1/CredentialList.php create mode 100755 app/api/Twilio/Rest/Notify/V1/CredentialOptions.php create mode 100755 app/api/Twilio/Rest/Notify/V1/CredentialPage.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/BindingContext.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/BindingInstance.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/BindingList.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/BindingOptions.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/BindingPage.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/NotificationInstance.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/NotificationList.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/NotificationOptions.php create mode 100755 app/api/Twilio/Rest/Notify/V1/Service/NotificationPage.php create mode 100755 app/api/Twilio/Rest/Notify/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Notify/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Notify/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Notify/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Notify/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/NotifyBase.php create mode 100755 app/api/Twilio/Rest/Numbers.php create mode 100755 app/api/Twilio/Rest/Numbers/V2.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyOptions.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleOptions.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundlePage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserOptions.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypePage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationOptions.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentOptions.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentPage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeContext.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypePage.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceInstance.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceList.php create mode 100755 app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliancePage.php create mode 100755 app/api/Twilio/Rest/NumbersBase.php create mode 100755 app/api/Twilio/Rest/Oauth.php create mode 100755 app/api/Twilio/Rest/Oauth/V1.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/DeviceCodeInstance.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/DeviceCodeList.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/DeviceCodeOptions.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/DeviceCodePage.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OauthContext.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OauthInstance.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OauthList.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OauthPage.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryContext.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryInstance.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryList.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryPage.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/TokenInstance.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/TokenList.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/TokenOptions.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/TokenPage.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/UserInfoContext.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/UserInfoInstance.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/UserInfoList.php create mode 100755 app/api/Twilio/Rest/Oauth/V1/UserInfoPage.php create mode 100755 app/api/Twilio/Rest/OauthBase.php create mode 100755 app/api/Twilio/Rest/Preview.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateContext.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateInstance.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateList.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateOptions.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificatePage.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentContext.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentInstance.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentList.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentOptions.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentPage.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceContext.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceInstance.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceList.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceOptions.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DevicePage.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyContext.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyInstance.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyList.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyOptions.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyPage.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/FleetContext.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/FleetInstance.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/FleetList.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/FleetOptions.php create mode 100755 app/api/Twilio/Rest/Preview/DeployedDevices/FleetPage.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderInstance.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderList.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderOptions.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderPage.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentContext.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentInstance.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentList.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentOptions.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentPage.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderContext.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderInstance.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderList.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderOptions.php create mode 100755 app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderPage.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionContext.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionList.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionPage.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnContext.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnList.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnPage.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionContext.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionList.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionPage.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnContext.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnList.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/DocumentContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/DocumentInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/DocumentList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/DocumentOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/DocumentPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncListContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncListInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncListList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncListOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncListPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMapContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMapInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMapList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMapOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/Service/SyncMapPage.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/ServiceList.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Sync/ServicePage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/DialoguePage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValuePage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypePage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/QueryContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/QueryInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/QueryList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/QueryOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/QueryPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SamplePage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/TaskContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/TaskInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/TaskList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/TaskOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/Assistant/TaskPage.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/AssistantContext.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/AssistantInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/AssistantList.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/AssistantOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Understand/AssistantPage.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/CommandContext.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/CommandInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/CommandList.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/CommandOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/CommandPage.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/RatePlanContext.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/RatePlanInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/RatePlanList.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/RatePlanOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/RatePlanPage.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/Sim/UsageContext.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/Sim/UsageInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/Sim/UsageList.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/Sim/UsageOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/Sim/UsagePage.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/SimContext.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/SimInstance.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/SimList.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/SimOptions.php create mode 100755 app/api/Twilio/Rest/Preview/Wireless/SimPage.php create mode 100755 app/api/Twilio/Rest/PreviewBase.php create mode 100755 app/api/Twilio/Rest/Pricing.php create mode 100755 app/api/Twilio/Rest/Pricing/V1.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Messaging/CountryContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Messaging/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Messaging/CountryList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Messaging/CountryPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/MessagingInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/MessagingList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/MessagingPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/CountryContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/CountryList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/CountryPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/NumberContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/NumberInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/NumberList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/Voice/NumberPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/VoiceInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/VoiceList.php create mode 100755 app/api/Twilio/Rest/Pricing/V1/VoicePage.php create mode 100755 app/api/Twilio/Rest/Pricing/V2.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/CountryContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/CountryList.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/CountryPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/NumberContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/NumberInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/NumberList.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/NumberOptions.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/NumberPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/CountryContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/CountryList.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/CountryPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/NumberContext.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/NumberInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/NumberList.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/NumberOptions.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/Voice/NumberPage.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/VoiceInstance.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/VoiceList.php create mode 100755 app/api/Twilio/Rest/Pricing/V2/VoicePage.php create mode 100755 app/api/Twilio/Rest/PricingBase.php create mode 100755 app/api/Twilio/Rest/Proxy.php create mode 100755 app/api/Twilio/Rest/Proxy/V1.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionPage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionPage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/SessionContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/SessionInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/SessionList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/SessionOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/SessionPage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/Service/ShortCodePage.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Proxy/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/ProxyBase.php create mode 100755 app/api/Twilio/Rest/Routes.php create mode 100755 app/api/Twilio/Rest/Routes/V2.php create mode 100755 app/api/Twilio/Rest/Routes/V2/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Routes/V2/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Routes/V2/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Routes/V2/PhoneNumberOptions.php create mode 100755 app/api/Twilio/Rest/Routes/V2/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Routes/V2/SipDomainContext.php create mode 100755 app/api/Twilio/Rest/Routes/V2/SipDomainInstance.php create mode 100755 app/api/Twilio/Rest/Routes/V2/SipDomainList.php create mode 100755 app/api/Twilio/Rest/Routes/V2/SipDomainOptions.php create mode 100755 app/api/Twilio/Rest/Routes/V2/SipDomainPage.php create mode 100755 app/api/Twilio/Rest/Routes/V2/TrunkContext.php create mode 100755 app/api/Twilio/Rest/Routes/V2/TrunkInstance.php create mode 100755 app/api/Twilio/Rest/Routes/V2/TrunkList.php create mode 100755 app/api/Twilio/Rest/Routes/V2/TrunkOptions.php create mode 100755 app/api/Twilio/Rest/Routes/V2/TrunkPage.php create mode 100755 app/api/Twilio/Rest/RoutesBase.php create mode 100755 app/api/Twilio/Rest/Serverless.php create mode 100755 app/api/Twilio/Rest/Serverless/V1.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/AssetContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/AssetInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/AssetList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/AssetPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/BuildContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/BuildInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/BuildList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/BuildOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/BuildPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariablePage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/FunctionContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/FunctionInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/FunctionList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/FunctionPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionPage.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Serverless/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/ServerlessBase.php create mode 100755 app/api/Twilio/Rest/Studio.php create mode 100755 app/api/Twilio/Rest/Studio/V1.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/EngagementContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/EngagementInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/EngagementList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/EngagementOptions.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/EngagementPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/ExecutionContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/ExecutionInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/ExecutionList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/ExecutionOptions.php create mode 100755 app/api/Twilio/Rest/Studio/V1/Flow/ExecutionPage.php create mode 100755 app/api/Twilio/Rest/Studio/V1/FlowContext.php create mode 100755 app/api/Twilio/Rest/Studio/V1/FlowInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V1/FlowList.php create mode 100755 app/api/Twilio/Rest/Studio/V1/FlowPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/ExecutionContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/ExecutionInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/ExecutionList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/ExecutionOptions.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/ExecutionPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowContext.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowOptions.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowPage.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowValidateInstance.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowValidateList.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowValidateOptions.php create mode 100755 app/api/Twilio/Rest/Studio/V2/FlowValidatePage.php create mode 100755 app/api/Twilio/Rest/StudioBase.php create mode 100755 app/api/Twilio/Rest/Supersim.php create mode 100755 app/api/Twilio/Rest/Supersim/V1.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/EsimProfileContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/EsimProfileInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/EsimProfileList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/EsimProfileOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/EsimProfilePage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/FleetContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/FleetInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/FleetList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/FleetOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/FleetPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/IpCommandContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/IpCommandInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/IpCommandList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/IpCommandOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/IpCommandPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfilePage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/NetworkPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SettingsUpdateInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SettingsUpdateList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SettingsUpdateOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SettingsUpdatePage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SimContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SimInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SimList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SimOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SimPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SmsCommandContext.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SmsCommandInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SmsCommandList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SmsCommandOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/SmsCommandPage.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/UsageRecordInstance.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/UsageRecordList.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/UsageRecordOptions.php create mode 100755 app/api/Twilio/Rest/Supersim/V1/UsageRecordPage.php create mode 100755 app/api/Twilio/Rest/SupersimBase.php create mode 100755 app/api/Twilio/Rest/Sync.php create mode 100755 app/api/Twilio/Rest/Sync/V1.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/DocumentContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/DocumentInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/DocumentList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/DocumentOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/DocumentPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncListContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncListInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncListList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncListOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncListPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMapContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMapInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMapList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMapOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncMapPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessagePage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStreamContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStreamInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStreamList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStreamOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/Service/SyncStreamPage.php create mode 100755 app/api/Twilio/Rest/Sync/V1/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Sync/V1/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Sync/V1/ServiceList.php create mode 100755 app/api/Twilio/Rest/Sync/V1/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Sync/V1/ServicePage.php create mode 100755 app/api/Twilio/Rest/SyncBase.php create mode 100755 app/api/Twilio/Rest/Taskrouter.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueuePage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsPage.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/WorkspaceContext.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/WorkspaceInstance.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/WorkspaceList.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/WorkspaceOptions.php create mode 100755 app/api/Twilio/Rest/Taskrouter/V1/WorkspacePage.php create mode 100755 app/api/Twilio/Rest/TaskrouterBase.php create mode 100755 app/api/Twilio/Rest/Trunking.php create mode 100755 app/api/Twilio/Rest/Trunking/V1.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListPage.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListPage.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlOptions.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlPage.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberPage.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingOptions.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingPage.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/TrunkContext.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/TrunkInstance.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/TrunkList.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/TrunkOptions.php create mode 100755 app/api/Twilio/Rest/Trunking/V1/TrunkPage.php create mode 100755 app/api/Twilio/Rest/TrunkingBase.php create mode 100755 app/api/Twilio/Rest/Trusthub.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserTypeContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserTypeInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserTypeList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/EndUserTypePage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/PoliciesContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/PoliciesInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/PoliciesList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/PoliciesPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypePage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsPage.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProductsContext.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProductsInstance.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProductsList.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProductsOptions.php create mode 100755 app/api/Twilio/Rest/Trusthub/V1/TrustProductsPage.php create mode 100755 app/api/Twilio/Rest/TrusthubBase.php create mode 100755 app/api/Twilio/Rest/Verify.php create mode 100755 app/api/Twilio/Rest/Verify/V2.php create mode 100755 app/api/Twilio/Rest/Verify/V2/FormContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/FormInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/FormList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/FormPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/SafelistContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/SafelistInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/SafelistList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/SafelistPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/AccessTokenContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/AccessTokenInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/AccessTokenList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/AccessTokenOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/AccessTokenPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengePage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/EntityContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/EntityInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/EntityList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/EntityPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimitContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimitInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimitList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimitOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/RateLimitPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/VerificationPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/WebhookContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/WebhookInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/WebhookList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/WebhookOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/Service/WebhookPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/ServiceContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/ServiceInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/ServiceList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/ServiceOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/ServicePage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/TemplateInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/TemplateList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/TemplateOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/TemplatePage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptPage.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryContext.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryInstance.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryList.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryOptions.php create mode 100755 app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryPage.php create mode 100755 app/api/Twilio/Rest/VerifyBase.php create mode 100755 app/api/Twilio/Rest/Video.php create mode 100755 app/api/Twilio/Rest/Video/V1.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionHookContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionHookInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionHookList.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionHookOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionHookPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionList.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionSettingsContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionSettingsInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionSettingsList.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionSettingsOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/CompositionSettingsPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingList.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingSettingsContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingSettingsInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingSettingsList.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingSettingsOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/RecordingSettingsPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizePage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/ParticipantContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/ParticipantInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/ParticipantList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/ParticipantOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/ParticipantPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RecordingRulesInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RecordingRulesList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RecordingRulesOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RecordingRulesPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RoomRecordingContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RoomRecordingInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RoomRecordingList.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RoomRecordingOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/Room/RoomRecordingPage.php create mode 100755 app/api/Twilio/Rest/Video/V1/RoomContext.php create mode 100755 app/api/Twilio/Rest/Video/V1/RoomInstance.php create mode 100755 app/api/Twilio/Rest/Video/V1/RoomList.php create mode 100755 app/api/Twilio/Rest/Video/V1/RoomOptions.php create mode 100755 app/api/Twilio/Rest/Video/V1/RoomPage.php create mode 100755 app/api/Twilio/Rest/VideoBase.php create mode 100755 app/api/Twilio/Rest/Voice.php create mode 100755 app/api/Twilio/Rest/Voice/V1.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ArchivedCallContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ArchivedCallInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ArchivedCallList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ArchivedCallPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ByocTrunkContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ByocTrunkInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ByocTrunkList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ByocTrunkOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ByocTrunkPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicyContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicyInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicyList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicyOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/ConnectionPolicyPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdatePage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissionsInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissionsList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/DialingPermissionsPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/IpRecordContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/IpRecordInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/IpRecordList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/IpRecordOptions.php create mode 100755 app/api/Twilio/Rest/Voice/V1/IpRecordPage.php create mode 100755 app/api/Twilio/Rest/Voice/V1/SourceIpMappingContext.php create mode 100755 app/api/Twilio/Rest/Voice/V1/SourceIpMappingInstance.php create mode 100755 app/api/Twilio/Rest/Voice/V1/SourceIpMappingList.php create mode 100755 app/api/Twilio/Rest/Voice/V1/SourceIpMappingPage.php create mode 100755 app/api/Twilio/Rest/VoiceBase.php create mode 100755 app/api/Twilio/Rest/Wireless.php create mode 100755 app/api/Twilio/Rest/Wireless/V1.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/CommandContext.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/CommandInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/CommandList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/CommandOptions.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/CommandPage.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/RatePlanContext.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/RatePlanInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/RatePlanList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/RatePlanOptions.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/RatePlanPage.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionPage.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordOptions.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordPage.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/SimContext.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/SimInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/SimList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/SimOptions.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/SimPage.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/UsageRecordInstance.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/UsageRecordList.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/UsageRecordOptions.php create mode 100755 app/api/Twilio/Rest/Wireless/V1/UsageRecordPage.php create mode 100755 app/api/Twilio/Rest/WirelessBase.php create mode 100755 app/api/Twilio/Security/RequestValidator.php create mode 100755 app/api/Twilio/Serialize.php create mode 100755 app/api/Twilio/Stream.php create mode 100755 app/api/Twilio/TaskRouter/WorkflowConfiguration.php create mode 100755 app/api/Twilio/TaskRouter/WorkflowRule.php create mode 100755 app/api/Twilio/TaskRouter/WorkflowRuleTarget.php create mode 100755 app/api/Twilio/TwiML/Fax/Receive.php create mode 100755 app/api/Twilio/TwiML/FaxResponse.php create mode 100755 app/api/Twilio/TwiML/GenericNode.php create mode 100755 app/api/Twilio/TwiML/Messaging/Body.php create mode 100755 app/api/Twilio/TwiML/Messaging/Media.php create mode 100755 app/api/Twilio/TwiML/Messaging/Message.php create mode 100755 app/api/Twilio/TwiML/Messaging/Redirect.php create mode 100755 app/api/Twilio/TwiML/MessagingResponse.php create mode 100755 app/api/Twilio/TwiML/TwiML.php create mode 100755 app/api/Twilio/TwiML/Video/Room.php create mode 100755 app/api/Twilio/TwiML/Voice/Application.php create mode 100755 app/api/Twilio/TwiML/Voice/ApplicationSid.php create mode 100755 app/api/Twilio/TwiML/Voice/Autopilot.php create mode 100755 app/api/Twilio/TwiML/Voice/Client.php create mode 100755 app/api/Twilio/TwiML/Voice/Conference.php create mode 100755 app/api/Twilio/TwiML/Voice/Config.php create mode 100755 app/api/Twilio/TwiML/Voice/Connect.php create mode 100755 app/api/Twilio/TwiML/Voice/Conversation.php create mode 100755 app/api/Twilio/TwiML/Voice/Dial.php create mode 100755 app/api/Twilio/TwiML/Voice/Echo_.php create mode 100755 app/api/Twilio/TwiML/Voice/Enqueue.php create mode 100755 app/api/Twilio/TwiML/Voice/Gather.php create mode 100755 app/api/Twilio/TwiML/Voice/Hangup.php create mode 100755 app/api/Twilio/TwiML/Voice/Identity.php create mode 100755 app/api/Twilio/TwiML/Voice/Leave.php create mode 100755 app/api/Twilio/TwiML/Voice/Number.php create mode 100755 app/api/Twilio/TwiML/Voice/Parameter.php create mode 100755 app/api/Twilio/TwiML/Voice/Pause.php create mode 100755 app/api/Twilio/TwiML/Voice/Pay.php create mode 100755 app/api/Twilio/TwiML/Voice/Play.php create mode 100755 app/api/Twilio/TwiML/Voice/Prompt.php create mode 100755 app/api/Twilio/TwiML/Voice/Queue.php create mode 100755 app/api/Twilio/TwiML/Voice/Record.php create mode 100755 app/api/Twilio/TwiML/Voice/Redirect.php create mode 100755 app/api/Twilio/TwiML/Voice/Refer.php create mode 100755 app/api/Twilio/TwiML/Voice/ReferSip.php create mode 100755 app/api/Twilio/TwiML/Voice/Reject.php create mode 100755 app/api/Twilio/TwiML/Voice/Room.php create mode 100755 app/api/Twilio/TwiML/Voice/Say.php create mode 100755 app/api/Twilio/TwiML/Voice/Sim.php create mode 100755 app/api/Twilio/TwiML/Voice/Sip.php create mode 100755 app/api/Twilio/TwiML/Voice/Siprec.php create mode 100755 app/api/Twilio/TwiML/Voice/Sms.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlBreak.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlEmphasis.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlLang.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlP.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlPhoneme.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlProsody.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlS.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlSayAs.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlSub.php create mode 100755 app/api/Twilio/TwiML/Voice/SsmlW.php create mode 100755 app/api/Twilio/TwiML/Voice/Start.php create mode 100755 app/api/Twilio/TwiML/Voice/Stop.php create mode 100755 app/api/Twilio/TwiML/Voice/Stream.php create mode 100755 app/api/Twilio/TwiML/Voice/Task.php create mode 100755 app/api/Twilio/TwiML/Voice/VirtualAgent.php create mode 100755 app/api/Twilio/TwiML/VoiceResponse.php create mode 100755 app/api/Twilio/Values.php create mode 100755 app/api/Twilio/Version.php create mode 100755 app/api/Twilio/VersionInfo.php create mode 100755 app/api/Twilio/autoload.php create mode 100755 app/api/XLSX/xlsxwriter.class.php create mode 100755 app/api/addons-api/addons-api.json create mode 100755 app/api/addons-api/advanced-importer-addon-icon.svg create mode 100755 app/api/addons-api/advanced-location01.svg create mode 100755 app/api/addons-api/advanced-map-2.svg create mode 100755 app/api/addons-api/advanced-organizer01.svg create mode 100755 app/api/addons-api/advanced-report.svg create mode 100755 app/api/addons-api/advanced-speaker01.svg create mode 100755 app/api/addons-api/blackfriday.json create mode 100755 app/api/addons-api/buddyboss-integration-addon.svg create mode 100755 app/api/addons-api/divi-single-builder-addon.svg create mode 100755 app/api/addons-api/elementor-fes-builder.svg create mode 100755 app/api/addons-api/event-api.svg create mode 100755 app/api/addons-api/fluent-view.svg create mode 100755 app/api/addons-api/gutenberg-single -builder-addon.svg create mode 100755 app/api/addons-api/index.html create mode 100755 app/api/addons-api/invoice-5.svg create mode 100755 app/api/addons-api/liquid-view-layouts.svg create mode 100755 app/api/addons-api/mec-extra-content-2.json create mode 100755 app/api/addons-api/mec-extra-content.json create mode 100755 app/api/addons-api/mec-extra-content/5addons-announcement.png create mode 100755 app/api/addons-api/mec-extra-content/7x7-campaign-special-min.png create mode 100755 app/api/addons-api/mec-extra-content/advanced-importer-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/advanced-map-addon-share-1-min.jpg create mode 100755 app/api/addons-api/mec-extra-content/advanced-map-addon-share-1.jpg create mode 100755 app/api/addons-api/mec-extra-content/advanced-reports-addon-teaser.png create mode 100755 app/api/addons-api/mec-extra-content/bf-2021-pop-bg3.png create mode 100755 app/api/addons-api/mec-extra-content/bfcm2022-mec-bknd-1-min.png create mode 100755 app/api/addons-api/mec-extra-content/black-f-banner-1.png create mode 100755 app/api/addons-api/mec-extra-content/black-friday-2021-3-min.jpg create mode 100755 app/api/addons-api/mec-extra-content/black-friday-2021-ntf1-min.jpg create mode 100755 app/api/addons-api/mec-extra-content/black-friday-2021-ntf2-min.jpg create mode 100755 app/api/addons-api/mec-extra-content/buddyboss-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/c7x7-ans1.png create mode 100755 app/api/addons-api/mec-extra-content/divi-single-builder-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/elementor-fes-builder.svg create mode 100755 app/api/addons-api/mec-extra-content/index.html create mode 100755 app/api/addons-api/mec-extra-content/invoice-addon-share-min.png create mode 100755 app/api/addons-api/mec-extra-content/liquid-view-layouts.svg create mode 100755 app/api/addons-api/mec-extra-content/lite-new-update-announcement.png create mode 100755 app/api/addons-api/mec-extra-content/lite-update.jpg create mode 100755 app/api/addons-api/mec-extra-content/mec-covid 19.png create mode 100755 app/api/addons-api/mec-extra-content/mec-fluent-view.jpg create mode 100755 app/api/addons-api/mec-extra-content/mec-ft-req-banner.png create mode 100755 app/api/addons-api/mec-extra-content/mec-gutenberg-single-builder.svg create mode 100755 app/api/addons-api/mec-extra-content/mec-notif-banner-1.png create mode 100755 app/api/addons-api/mec-extra-content/mec-notif-banner-11.png create mode 100755 app/api/addons-api/mec-extra-content/photo_2022-01-10_16-33-18.jpg create mode 100755 app/api/addons-api/mec-extra-content/rsvp-events-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/seat-addon-icon.svg create mode 100755 app/api/addons-api/mec-extra-content/social-poster-addon.svg create mode 100755 app/api/addons-api/mec-extra-content/square-integration-addon.svg create mode 100755 app/api/addons-api/mec-extra-content/style2.css create mode 100755 app/api/addons-api/mec-extra-content/virtual-events-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/waiting-list-addon-banner.png create mode 100755 app/api/addons-api/mec-extra-content/zapier-integration-addon-banner1.png create mode 100755 app/api/addons-api/mec-extra-content/zoom-integration-addon-banner.png create mode 100755 app/api/addons-api/mec-gutenberg-single-builder.svg create mode 100755 app/api/addons-api/mec-shortcode-designer-addon-icon.svg create mode 100755 app/api/addons-api/mec_addon_icon_27.svg create mode 100755 app/api/addons-api/mec_addon_icon_37.svg create mode 100755 app/api/addons-api/mec_addon_icon_39.svg create mode 100755 app/api/addons-api/mec_addon_icon_40.svg create mode 100755 app/api/addons-api/multi-site-3.svg create mode 100755 app/api/addons-api/rsvp-event-addon.svg create mode 100755 app/api/addons-api/seat-addon-icon.svg create mode 100755 app/api/addons-api/social-auto-poster-addon.svg create mode 100755 app/api/addons-api/social-poster-addon.svg create mode 100755 app/api/addons-api/square-integration-addon.svg create mode 100755 app/api/addons-api/user-dashboard.svg create mode 100755 app/api/addons-api/virtual-events.svg create mode 100755 app/api/addons-api/waiting-list-icon.svg create mode 100755 app/api/addons-api/webex-integration-addon.svg create mode 100755 app/api/addons-api/zapier-integration01 (1).svg create mode 100755 app/api/addons-api/zapier-integration01.svg create mode 100755 app/api/addons-api/zoom-integration-addon.svg create mode 100755 app/api/index.html create mode 100755 app/composer.json create mode 100755 app/composer.lock create mode 100755 app/controller.php create mode 100755 app/core/mec.php create mode 100755 app/core/puc/.editorconfig create mode 100755 app/core/puc/.gitignore create mode 100755 app/core/puc/Puc/v4/Factory.php create mode 100755 app/core/puc/Puc/v4p11/Autoloader.php create mode 100755 app/core/puc/Puc/v4p11/DebugBar/Extension.php create mode 100755 app/core/puc/Puc/v4p11/DebugBar/Panel.php create mode 100755 app/core/puc/Puc/v4p11/DebugBar/PluginExtension.php create mode 100755 app/core/puc/Puc/v4p11/DebugBar/PluginPanel.php create mode 100755 app/core/puc/Puc/v4p11/DebugBar/ThemePanel.php create mode 100755 app/core/puc/Puc/v4p11/Factory.php create mode 100755 app/core/puc/Puc/v4p11/InstalledPackage.php create mode 100755 app/core/puc/Puc/v4p11/Metadata.php create mode 100755 app/core/puc/Puc/v4p11/OAuthSignature.php create mode 100755 app/core/puc/Puc/v4p11/Plugin/Info.php create mode 100755 app/core/puc/Puc/v4p11/Plugin/Package.php create mode 100755 app/core/puc/Puc/v4p11/Plugin/Ui.php create mode 100755 app/core/puc/Puc/v4p11/Plugin/Update.php create mode 100755 app/core/puc/Puc/v4p11/Plugin/UpdateChecker.php create mode 100755 app/core/puc/Puc/v4p11/Scheduler.php create mode 100755 app/core/puc/Puc/v4p11/StateStore.php create mode 100755 app/core/puc/Puc/v4p11/Theme/Package.php create mode 100755 app/core/puc/Puc/v4p11/Theme/Update.php create mode 100755 app/core/puc/Puc/v4p11/Theme/UpdateChecker.php create mode 100755 app/core/puc/Puc/v4p11/Update.php create mode 100755 app/core/puc/Puc/v4p11/UpdateChecker.php create mode 100755 app/core/puc/Puc/v4p11/UpgraderStatus.php create mode 100755 app/core/puc/Puc/v4p11/Utils.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/Api.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/BaseChecker.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/BitBucketApi.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/GitHubApi.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/GitLabApi.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/PluginUpdateChecker.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/Reference.php create mode 100755 app/core/puc/Puc/v4p11/Vcs/ThemeUpdateChecker.php create mode 100755 app/core/puc/README.md create mode 100755 app/core/puc/composer.json create mode 100755 app/core/puc/css/puc-debug-bar.css create mode 100755 app/core/puc/examples/plugin.json create mode 100755 app/core/puc/examples/theme.json create mode 100755 app/core/puc/js/debug-bar.js create mode 100755 app/core/puc/languages/plugin-update-checker-ca.mo create mode 100755 app/core/puc/languages/plugin-update-checker-ca.po create mode 100755 app/core/puc/languages/plugin-update-checker-cs_CZ.mo create mode 100755 app/core/puc/languages/plugin-update-checker-cs_CZ.po create mode 100755 app/core/puc/languages/plugin-update-checker-da_DK.mo create mode 100755 app/core/puc/languages/plugin-update-checker-da_DK.po create mode 100755 app/core/puc/languages/plugin-update-checker-de_DE.mo create mode 100755 app/core/puc/languages/plugin-update-checker-de_DE.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_AR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_AR.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_CL.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_CL.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_CO.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_CO.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_CR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_CR.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_DO.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_DO.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_ES.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_ES.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_GT.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_GT.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_HN.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_HN.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_MX.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_MX.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_PE.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_PE.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_PR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_PR.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_UY.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_UY.po create mode 100755 app/core/puc/languages/plugin-update-checker-es_VE.mo create mode 100755 app/core/puc/languages/plugin-update-checker-es_VE.po create mode 100755 app/core/puc/languages/plugin-update-checker-fa_IR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-fa_IR.po create mode 100755 app/core/puc/languages/plugin-update-checker-fr_CA.mo create mode 100755 app/core/puc/languages/plugin-update-checker-fr_CA.po create mode 100755 app/core/puc/languages/plugin-update-checker-fr_FR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-fr_FR.po create mode 100755 app/core/puc/languages/plugin-update-checker-hu_HU.mo create mode 100755 app/core/puc/languages/plugin-update-checker-hu_HU.po create mode 100755 app/core/puc/languages/plugin-update-checker-it_IT.mo create mode 100755 app/core/puc/languages/plugin-update-checker-it_IT.po create mode 100755 app/core/puc/languages/plugin-update-checker-ja.mo create mode 100755 app/core/puc/languages/plugin-update-checker-ja.po create mode 100755 app/core/puc/languages/plugin-update-checker-nl_BE.mo create mode 100755 app/core/puc/languages/plugin-update-checker-nl_BE.po create mode 100755 app/core/puc/languages/plugin-update-checker-nl_NL.mo create mode 100755 app/core/puc/languages/plugin-update-checker-nl_NL.po create mode 100755 app/core/puc/languages/plugin-update-checker-pt_BR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-pt_BR.po create mode 100755 app/core/puc/languages/plugin-update-checker-ru_RU.mo create mode 100755 app/core/puc/languages/plugin-update-checker-ru_RU.po create mode 100755 app/core/puc/languages/plugin-update-checker-sl_SI.mo create mode 100755 app/core/puc/languages/plugin-update-checker-sl_SI.po create mode 100755 app/core/puc/languages/plugin-update-checker-sv_SE.mo create mode 100755 app/core/puc/languages/plugin-update-checker-sv_SE.po create mode 100755 app/core/puc/languages/plugin-update-checker-tr_TR.mo create mode 100755 app/core/puc/languages/plugin-update-checker-tr_TR.po create mode 100755 app/core/puc/languages/plugin-update-checker-uk_UA.mo create mode 100755 app/core/puc/languages/plugin-update-checker-uk_UA.po create mode 100755 app/core/puc/languages/plugin-update-checker-zh_CN.mo create mode 100755 app/core/puc/languages/plugin-update-checker-zh_CN.po create mode 100755 app/core/puc/languages/plugin-update-checker.pot create mode 100755 app/core/puc/license.txt create mode 100755 app/core/puc/load-v4p11.php create mode 100755 app/core/puc/plugin-update-checker.php create mode 100755 app/core/puc/vendor/Parsedown.php create mode 100755 app/core/puc/vendor/ParsedownLegacy.php create mode 100755 app/core/puc/vendor/ParsedownModern.php create mode 100755 app/core/puc/vendor/PucReadmeParser.php create mode 100755 app/core/src/Attendees/Attendee.php create mode 100755 app/core/src/Attendees/Attendees.php create mode 100755 app/core/src/Attendees/AttendeesTable.php create mode 100755 app/core/src/Attendees/index.php create mode 100755 app/core/src/Base.php create mode 100755 app/core/src/BookingForm/Attendees.php create mode 100755 app/core/src/BookingForm/DisplayFields.php create mode 100755 app/core/src/BookingForm/index.php create mode 100755 app/core/src/Books/Book.php create mode 100755 app/core/src/Books/BookingForm.php create mode 100755 app/core/src/Books/BooksQuery.php create mode 100755 app/core/src/Books/EventBook.php create mode 100755 app/core/src/Books/index.php create mode 100755 app/core/src/Events/Event.php create mode 100755 app/core/src/Events/Events.php create mode 100755 app/core/src/Events/EventsQuery.php create mode 100755 app/core/src/Events/index.php create mode 100755 app/core/src/FES/FormBuilder.php create mode 100755 app/core/src/FES/index.php create mode 100755 app/core/src/FES/scripts.js create mode 100755 app/core/src/Forms/CustomForm.php create mode 100755 app/core/src/Forms/DisplayFields.php create mode 100755 app/core/src/Forms/FormFields.php create mode 100755 app/core/src/Forms/SettingsForm.php create mode 100755 app/core/src/Forms/backend.css create mode 100755 app/core/src/Forms/backend.js create mode 100755 app/core/src/Forms/custom-form.css create mode 100755 app/core/src/Forms/index.php create mode 100755 app/core/src/ImportExport/Terms.php create mode 100755 app/core/src/ImportExport/index.php create mode 100755 app/core/src/Libraries/FlushNotices.php create mode 100755 app/core/src/Libraries/index.php create mode 100755 app/core/src/Locations/Location.php create mode 100755 app/core/src/Locations/index.php create mode 100755 app/core/src/Notifications/DisplayNotificationSettings.php create mode 100755 app/core/src/Notifications/SendEmail.php create mode 100755 app/core/src/Notifications/index.php create mode 100755 app/core/src/Notifications/template-notification-settings.php create mode 100755 app/core/src/PostBase.php create mode 100755 app/core/src/Settings/Settings.php create mode 100755 app/core/src/Settings/index.php create mode 100755 app/core/src/SingleBuilder/SingleBuilder.php create mode 100755 app/core/src/SingleBuilder/Widgets/BookingForm/BookingForm.php create mode 100755 app/core/src/SingleBuilder/Widgets/Content/Content.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventAttendees/EventAttendees.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventBanner/EventBanner.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventBreadcrumbs/EventBreadcrumbs.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventCancellationReason/EventCancellationReason.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventCategories/EventCategories.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventCost/EventCost.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventCountdown/EventCountdown.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventData/EventData.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventDate/EventDate.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventExport/EventExport.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventGallery/EventGallery.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventGoogleMap/EventGoogleMap.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventHourlySchedule/EventHourlySchedule.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventLabels/EventLabels.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventLocalTime/EventLocalTime.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventLocations/EventLocations.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventMoreInfo/EventMoreInfo.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventNextOccurrences/EventNextOccurrences.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventNextPrevious/EventNextPrevious.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventOrganizers/EventOrganizers.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventPublicDownload/EventPublicDownload.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventQrCode/EventQrCode.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventRegisterButton/EventRegisterButton.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventRelated/EventRelated.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventSocialShare/EventSocialShare.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventSpeakers/EventSpeakers.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventSponsors/EventSponsors.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventTags/EventTags.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventTime/EventTime.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventTrailerUrl/EventTrailerUrl.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventVirtual/EventVirtual.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventWeather/EventWeather.php create mode 100755 app/core/src/SingleBuilder/Widgets/EventZoom/EventZoom.php create mode 100755 app/core/src/SingleBuilder/Widgets/FAQ/FAQ.php create mode 100755 app/core/src/SingleBuilder/Widgets/FeaturedImage/FeaturedImage.php create mode 100755 app/core/src/SingleBuilder/Widgets/FeaturedImage/empty-pic.jpg create mode 100755 app/core/src/SingleBuilder/Widgets/RSVPForm/RSVPForm.php create mode 100755 app/core/src/SingleBuilder/Widgets/SimpleHeader/SimpleHeader.php create mode 100755 app/core/src/SingleBuilder/Widgets/WidgetBase.php create mode 100755 app/core/src/SingleBuilder/index.php create mode 100755 app/core/src/Singleton.php create mode 100755 app/core/src/Tickets/Ticket.php create mode 100755 app/core/src/Tickets/Tickets.php create mode 100755 app/core/src/Tickets/index.php create mode 100755 app/core/src/Transactions/Transaction.php create mode 100755 app/core/src/Transactions/index.php create mode 100755 app/core/src/index.php create mode 100755 app/crons/index.html create mode 100755 app/features/admincalendar.php create mode 100755 app/features/adminupcoming.php create mode 100755 app/features/archive.php create mode 100755 app/features/autoemails.php create mode 100755 app/features/booking/calendar_novel.php create mode 100755 app/features/booking/variations.php create mode 100755 app/features/bookingcalendar.php create mode 100755 app/features/cart.php create mode 100755 app/features/cart/cart.php create mode 100755 app/features/cart/checkout.php create mode 100755 app/features/cart/index.html create mode 100755 app/features/certificates.php create mode 100755 app/features/certificates/template.php create mode 100755 app/features/colors.php create mode 100755 app/features/compatibility.php create mode 100755 app/features/contextual.php create mode 100755 app/features/dc.php create mode 100755 app/features/dlfile.php create mode 100755 app/features/emails/details.php create mode 100755 app/features/events.php create mode 100755 app/features/faq.php create mode 100755 app/features/feed.php create mode 100755 app/features/feed/index.html create mode 100755 app/features/feed/rss2.php create mode 100755 app/features/fes.php create mode 100755 app/features/fes/form.php create mode 100755 app/features/fes/index.html create mode 100755 app/features/fes/list.php create mode 100755 app/features/fes/message.php create mode 100755 app/features/gateways/index.html create mode 100755 app/features/hourlyschedule.php create mode 100755 app/features/index.html create mode 100755 app/features/ix.php create mode 100755 app/features/ix/export.php create mode 100755 app/features/ix/export_g_calendar.php create mode 100755 app/features/ix/import.php create mode 100755 app/features/ix/import_f_calendar.php create mode 100755 app/features/ix/import_g_calendar.php create mode 100755 app/features/ix/import_meetup.php create mode 100755 app/features/ix/index.html create mode 100755 app/features/ix/sync.php create mode 100755 app/features/ix/test_data.php create mode 100755 app/features/ix/thirdparty.php create mode 100755 app/features/labels.php create mode 100755 app/features/locations.php create mode 100755 app/features/login.php create mode 100755 app/features/login/index.html create mode 100755 app/features/login/login.php create mode 100755 app/features/maintenance.php create mode 100755 app/features/mec.php create mode 100755 app/features/mec/addons.php create mode 100755 app/features/mec/booking.php create mode 100755 app/features/mec/dashboard.php create mode 100755 app/features/mec/dyncss.php create mode 100755 app/features/mec/fes.php create mode 100755 app/features/mec/gateways.php create mode 100755 app/features/mec/go-pro.php create mode 100755 app/features/mec/ie.php create mode 100755 app/features/mec/index.html create mode 100755 app/features/mec/integrations.php create mode 100755 app/features/mec/messages.php create mode 100755 app/features/mec/meta_boxes/display_options.php create mode 100755 app/features/mec/meta_boxes/filter.php create mode 100755 app/features/mec/meta_boxes/icons.php create mode 100755 app/features/mec/meta_boxes/index.html create mode 100755 app/features/mec/meta_boxes/search_form.php create mode 100755 app/features/mec/meta_boxes/shortcode.php create mode 100755 app/features/mec/modules.php create mode 100755 app/features/mec/notifications.php create mode 100755 app/features/mec/regform.php create mode 100755 app/features/mec/settings.php create mode 100755 app/features/mec/single.php create mode 100755 app/features/mec/styles.php create mode 100755 app/features/mec/styling.php create mode 100755 app/features/mec/support-page.php create mode 100755 app/features/mec/support.php create mode 100755 app/features/mec/webfonts/index.html create mode 100755 app/features/mec/webfonts/webfonts.php create mode 100755 app/features/mec/wizard.php create mode 100755 app/features/notifications.php create mode 100755 app/features/occurrences.php create mode 100755 app/features/organizers.php create mode 100755 app/features/partial.php create mode 100755 app/features/popup.php create mode 100755 app/features/popup/event.php create mode 100755 app/features/popup/index.html create mode 100755 app/features/popup/settings.php create mode 100755 app/features/popup/shortcode.php create mode 100755 app/features/profile.php create mode 100755 app/features/profile/index.html create mode 100755 app/features/profile/message.php create mode 100755 app/features/profile/profile.php create mode 100755 app/features/report.php create mode 100755 app/features/report/tpl.php create mode 100755 app/features/restful.php create mode 100755 app/features/schema.php create mode 100755 app/features/search.php create mode 100755 app/features/search_bar/index.html create mode 100755 app/features/search_bar/search_bar.php create mode 100755 app/features/search_bar/search_noresult.php create mode 100755 app/features/search_bar/search_result.php create mode 100755 app/features/sms.php create mode 100755 app/features/speakers.php create mode 100755 app/features/sponsors.php create mode 100755 app/features/tag.php create mode 100755 app/features/taxonomies/shortcode.php create mode 100755 app/features/taxonomyshortcode.php create mode 100755 app/features/update.php create mode 100755 app/features/userevents.php create mode 100755 app/features/wc.php create mode 100755 app/features/webhooks.php create mode 100755 app/features/webhooks/details.php create mode 100755 app/index.html create mode 100755 app/libraries/base.php create mode 100755 app/libraries/book.php create mode 100755 app/libraries/bookingRecord.php create mode 100755 app/libraries/cache.php create mode 100755 app/libraries/captcha.php create mode 100755 app/libraries/cart.php create mode 100755 app/libraries/db.php create mode 100755 app/libraries/eventFields.php create mode 100755 app/libraries/factory.php create mode 100755 app/libraries/feed.php create mode 100755 app/libraries/filesystem.php create mode 100755 app/libraries/formBuilder.php create mode 100755 app/libraries/icons.php create mode 100755 app/libraries/index.html create mode 100755 app/libraries/kses.php create mode 100755 app/libraries/main.php create mode 100755 app/libraries/meetup.php create mode 100755 app/libraries/notifications.php create mode 100755 app/libraries/parser.php create mode 100755 app/libraries/partial.php create mode 100755 app/libraries/qrcode.php create mode 100755 app/libraries/render.php create mode 100755 app/libraries/restful.php create mode 100755 app/libraries/schedule.php create mode 100755 app/libraries/search.php create mode 100755 app/libraries/skins.php create mode 100755 app/libraries/syncSchedule.php create mode 100755 app/libraries/ticketVariations.php create mode 100755 app/libraries/tickets.php create mode 100755 app/libraries/transaction.php create mode 100755 app/libraries/user.php create mode 100755 app/libraries/walker.php create mode 100755 app/libraries/wc.php create mode 100755 app/modules/attendees-list/details.php create mode 100755 app/modules/attendees-list/index.html create mode 100755 app/modules/booking/default.php create mode 100755 app/modules/booking/index.html create mode 100755 app/modules/booking/steps/checkout.php create mode 100755 app/modules/booking/steps/form.php create mode 100755 app/modules/booking/steps/index.html create mode 100755 app/modules/booking/steps/message.php create mode 100755 app/modules/booking/steps/tickets.php create mode 100755 app/modules/countdown/details.php create mode 100755 app/modules/countdown/index.html create mode 100755 app/modules/export/details.php create mode 100755 app/modules/export/index.html create mode 100755 app/modules/googlemap/details.php create mode 100755 app/modules/googlemap/index.html create mode 100755 app/modules/googlemap/styles/CDO.json create mode 100755 app/modules/googlemap/styles/apple-maps-esque.json create mode 100755 app/modules/googlemap/styles/blue-essence.json create mode 100755 app/modules/googlemap/styles/blue-water.json create mode 100755 app/modules/googlemap/styles/facebook.json create mode 100755 app/modules/googlemap/styles/index.html create mode 100755 app/modules/googlemap/styles/intown-map.json create mode 100755 app/modules/googlemap/styles/light-dream.json create mode 100755 app/modules/googlemap/styles/midnight.json create mode 100755 app/modules/googlemap/styles/pale-down.json create mode 100755 app/modules/googlemap/styles/shades-of-grey.json create mode 100755 app/modules/googlemap/styles/subtle-grayscale.json create mode 100755 app/modules/googlemap/styles/ultra-light.json create mode 100755 app/modules/index.html create mode 100755 app/modules/links/details.php create mode 100755 app/modules/links/index.html create mode 100755 app/modules/links/list.php create mode 100755 app/modules/local-time/details.php create mode 100755 app/modules/local-time/index.html create mode 100755 app/modules/local-time/type1.php create mode 100755 app/modules/local-time/type2.php create mode 100755 app/modules/local-time/type3.php create mode 100755 app/modules/next-event/details.php create mode 100755 app/modules/next-event/index.html create mode 100755 app/modules/next-event/multiple.php create mode 100755 app/modules/progress-bar/index.html create mode 100755 app/modules/progress-bar/single.php create mode 100755 app/modules/qrcode/details.php create mode 100755 app/modules/qrcode/index.html create mode 100755 app/modules/qrcode/invoice.php create mode 100755 app/modules/speakers/details.php create mode 100755 app/modules/speakers/index.html create mode 100755 app/modules/sponsors/details.php create mode 100755 app/modules/sponsors/index.html create mode 100755 app/modules/weather/darksky.php create mode 100755 app/modules/weather/details.php create mode 100755 app/modules/weather/index.html create mode 100755 app/modules/weather/visualcrossing.php create mode 100755 app/modules/weather/weatherapi.php create mode 100755 app/skins/agenda.php create mode 100755 app/skins/agenda/index.html create mode 100755 app/skins/agenda/render.php create mode 100755 app/skins/agenda/tpl.php create mode 100755 app/skins/available_spot.php create mode 100755 app/skins/available_spot/index.html create mode 100755 app/skins/available_spot/tpl.php create mode 100755 app/skins/carousel.php create mode 100755 app/skins/carousel/index.html create mode 100755 app/skins/carousel/render.php create mode 100755 app/skins/carousel/tpl.php create mode 100755 app/skins/countdown.php create mode 100755 app/skins/countdown/index.html create mode 100755 app/skins/countdown/tpl.php create mode 100755 app/skins/cover.php create mode 100755 app/skins/cover/index.html create mode 100755 app/skins/cover/tpl.php create mode 100755 app/skins/custom.php create mode 100755 app/skins/custom/index.html create mode 100755 app/skins/custom/render.php create mode 100755 app/skins/custom/tpl.php create mode 100755 app/skins/daily_view.php create mode 100755 app/skins/daily_view/index.html create mode 100755 app/skins/daily_view/render.php create mode 100755 app/skins/daily_view/tpl.php create mode 100755 app/skins/default_full_calendar.php create mode 100755 app/skins/default_full_calendar/index.html create mode 100755 app/skins/default_full_calendar/tpl.php create mode 100755 app/skins/full_calendar.php create mode 100755 app/skins/full_calendar/index.html create mode 100755 app/skins/full_calendar/tpl.php create mode 100755 app/skins/general_calendar.php create mode 100755 app/skins/general_calendar/render.php create mode 100755 app/skins/general_calendar/tpl.php create mode 100755 app/skins/grid.php create mode 100755 app/skins/grid/index.html create mode 100755 app/skins/grid/render.php create mode 100755 app/skins/grid/tpl.php create mode 100755 app/skins/index.html create mode 100755 app/skins/list.php create mode 100755 app/skins/list/index.html create mode 100755 app/skins/list/render.php create mode 100755 app/skins/list/tpl.php create mode 100755 app/skins/map.php create mode 100755 app/skins/map/index.html create mode 100755 app/skins/map/tpl.php create mode 100755 app/skins/masonry.php create mode 100755 app/skins/masonry/index.html create mode 100755 app/skins/masonry/render.php create mode 100755 app/skins/masonry/tpl.php create mode 100755 app/skins/monthly_view.php create mode 100755 app/skins/monthly_view/calendar.php create mode 100755 app/skins/monthly_view/calendar_admin.php create mode 100755 app/skins/monthly_view/calendar_clean.php create mode 100755 app/skins/monthly_view/calendar_novel.php create mode 100755 app/skins/monthly_view/calendar_simple.php create mode 100755 app/skins/monthly_view/index.html create mode 100755 app/skins/monthly_view/render.php create mode 100755 app/skins/monthly_view/tpl.php create mode 100755 app/skins/single.php create mode 100755 app/skins/single/builder.php create mode 100755 app/skins/single/default.php create mode 100755 app/skins/single/divi-builder.php create mode 100755 app/skins/single/index.html create mode 100755 app/skins/single/m1.php create mode 100755 app/skins/single/m2.php create mode 100755 app/skins/single/modern.php create mode 100755 app/skins/single/tpl.php create mode 100755 app/skins/slider.php create mode 100755 app/skins/slider/index.html create mode 100755 app/skins/slider/render.php create mode 100755 app/skins/slider/tpl.php create mode 100755 app/skins/tile.php create mode 100755 app/skins/tile/index.html create mode 100755 app/skins/tile/render.php create mode 100755 app/skins/tile/tpl.php create mode 100755 app/skins/timeline.php create mode 100755 app/skins/timeline/index.html create mode 100755 app/skins/timeline/render.php create mode 100755 app/skins/timeline/tpl.php create mode 100755 app/skins/timetable.php create mode 100755 app/skins/timetable/classic.php create mode 100755 app/skins/timetable/clean.php create mode 100755 app/skins/timetable/index.html create mode 100755 app/skins/timetable/modern.php create mode 100755 app/skins/timetable/render.php create mode 100755 app/skins/timetable/tpl.php create mode 100755 app/skins/weekly_view.php create mode 100755 app/skins/weekly_view/index.html create mode 100755 app/skins/weekly_view/render.php create mode 100755 app/skins/weekly_view/tpl.php create mode 100755 app/skins/yearly_view.php create mode 100755 app/skins/yearly_view/calendar.php create mode 100755 app/skins/yearly_view/index.html create mode 100755 app/skins/yearly_view/render.php create mode 100755 app/skins/yearly_view/tpl.php create mode 100755 app/vendor/autoload.php create mode 100755 app/vendor/composer/ClassLoader.php create mode 100755 app/vendor/composer/InstalledVersions.php create mode 100755 app/vendor/composer/LICENSE create mode 100755 app/vendor/composer/autoload_classmap.php create mode 100755 app/vendor/composer/autoload_namespaces.php create mode 100755 app/vendor/composer/autoload_psr4.php create mode 100755 app/vendor/composer/autoload_real.php create mode 100755 app/vendor/composer/autoload_static.php create mode 100755 app/vendor/composer/installed.json create mode 100755 app/vendor/composer/installed.php create mode 100755 app/vendor/composer/platform_check.php create mode 100755 app/vendor/johngrogg/ics-parser/.editorconfig create mode 100755 app/vendor/johngrogg/ics-parser/.github/ISSUE_TEMPLATE/bug_report.md create mode 100755 app/vendor/johngrogg/ics-parser/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md create mode 100755 app/vendor/johngrogg/ics-parser/.github/release_template.md create mode 100755 app/vendor/johngrogg/ics-parser/.gitignore create mode 100755 app/vendor/johngrogg/ics-parser/CONTRIBUTING.md create mode 100755 app/vendor/johngrogg/ics-parser/FUNDING.yml create mode 100755 app/vendor/johngrogg/ics-parser/LICENSE create mode 100755 app/vendor/johngrogg/ics-parser/README.md create mode 100755 app/vendor/johngrogg/ics-parser/composer.json create mode 100755 app/vendor/johngrogg/ics-parser/composer.lock create mode 100755 app/vendor/johngrogg/ics-parser/ecs.php create mode 100755 app/vendor/johngrogg/ics-parser/examples/ICal.ics create mode 100755 app/vendor/johngrogg/ics-parser/examples/index.php create mode 100755 app/vendor/johngrogg/ics-parser/phpunit.xml create mode 100755 app/vendor/johngrogg/ics-parser/rector.php create mode 100755 app/vendor/johngrogg/ics-parser/src/ICal/Event.php create mode 100755 app/vendor/johngrogg/ics-parser/src/ICal/ICal.php create mode 100755 app/vendor/johngrogg/ics-parser/tests/RecurrencesTest.php create mode 100755 app/vendor/johngrogg/ics-parser/tests/SingleEventsTest.php create mode 100755 app/vendor/johngrogg/ics-parser/tests/ical/ical-monthly.ics create mode 100755 app/vendor/johngrogg/ics-parser/tests/ical/issue-196.ics create mode 100755 app/vendor/johngrogg/ics-parser/tests/rfc5545RecurrenceExamplesTest.php create mode 100755 app/widgets/MEC.php create mode 100755 app/widgets/index.html create mode 100755 app/widgets/single.php create mode 100755 app/widgets/single/default.php create mode 100755 app/widgets/single/index.html create mode 100755 app/widgets/single/modern.php create mode 100755 assets/css/a11y-backend.css create mode 100755 assets/css/a11y-backend.min.css create mode 100755 assets/css/a11y.css create mode 100755 assets/css/a11y.min.css create mode 100755 assets/css/admin-calendar.min.css create mode 100755 assets/css/admin-upcoming.min.css create mode 100755 assets/css/backend.css create mode 100755 assets/css/backend.min.css create mode 100755 assets/css/dyncss.css create mode 100755 assets/css/frontend.css create mode 100755 assets/css/frontend.min.css create mode 100755 assets/css/iconfonts.css create mode 100755 assets/css/index.html create mode 100755 assets/css/mec-general-calendar.css create mode 100755 assets/css/mecrtl.css create mode 100755 assets/css/mecrtl.min.css create mode 100755 assets/css/nice-select.min.css create mode 100755 assets/css/rtlbackend.css create mode 100755 assets/files/sample.csv create mode 100755 assets/fonts/FontAwesome.otf create mode 100755 assets/fonts/Simple-Line-Icons.eot create mode 100755 assets/fonts/Simple-Line-Icons.svg create mode 100755 assets/fonts/Simple-Line-Icons.ttf create mode 100755 assets/fonts/Simple-Line-Icons.woff create mode 100755 assets/fonts/Simple-Line-Icons.woff2 create mode 100755 assets/fonts/fontawesome-webfont.eot create mode 100755 assets/fonts/fontawesome-webfont.svg create mode 100755 assets/fonts/fontawesome-webfont.ttf create mode 100755 assets/fonts/fontawesome-webfont.woff create mode 100755 assets/fonts/fontawesome-webfont.woff2 create mode 100755 assets/fonts/index.html create mode 100755 assets/icon.html create mode 100755 assets/img/ajax-loader.gif create mode 100755 assets/img/cluster1/index.html create mode 100755 assets/img/cluster1/m1.png create mode 100755 assets/img/cluster1/m2.png create mode 100755 assets/img/cluster1/m3.png create mode 100755 assets/img/cluster1/m4.png create mode 100755 assets/img/cluster1/m5.png create mode 100755 assets/img/document.png create mode 100755 assets/img/dp-dsb-support.jpg create mode 100755 assets/img/dp-dsb-support2.png create mode 100755 assets/img/email-document.png create mode 100755 assets/img/ico-mec-vc.png create mode 100755 assets/img/index.html create mode 100755 assets/img/m-01.png create mode 100755 assets/img/m-02.png create mode 100755 assets/img/m-03.png create mode 100755 assets/img/m-04.png create mode 100755 assets/img/m-05.png create mode 100755 assets/img/map.jpg create mode 100755 assets/img/mec-addons-teaser1.png create mode 100755 assets/img/mec-booking.svg create mode 100755 assets/img/mec-lite-backend-go-pro.png create mode 100755 assets/img/mec-logo-icon.png create mode 100755 assets/img/mec-logo-icon.svg create mode 100755 assets/img/mec-logo-w.png create mode 100755 assets/img/mec-logo-w2.png create mode 100755 assets/img/mec-weather-icon-01.png create mode 100755 assets/img/mec-weather-icon-02.png create mode 100755 assets/img/mec-weather-icon-03.png create mode 100755 assets/img/mec-weather-icon-04.png create mode 100755 assets/img/mec-weather-icon-05.png create mode 100755 assets/img/mec-weather-icon-06.png create mode 100755 assets/img/mec-weather-icon-07.png create mode 100755 assets/img/mec.svg create mode 100755 assets/img/newsletter-document.png create mode 100755 assets/img/no-image.png create mode 100755 assets/img/popup/add-event-first-step.png create mode 100755 assets/img/popup/add-organizer.png create mode 100755 assets/img/popup/add-sh-icon.png create mode 100755 assets/img/popup/calendar_icon.png create mode 100755 assets/img/popup/char.png create mode 100755 assets/img/popup/eye.png create mode 100755 assets/img/popup/fifth-step.png create mode 100755 assets/img/popup/first-step.png create mode 100755 assets/img/popup/fourth-step.png create mode 100755 assets/img/popup/index.html create mode 100755 assets/img/popup/mec-logo.svg create mode 100755 assets/img/popup/organization.png create mode 100755 assets/img/popup/picture.png create mode 100755 assets/img/popup/plus-blue.png create mode 100755 assets/img/popup/plus.png create mode 100755 assets/img/popup/pointer.png create mode 100755 assets/img/popup/popup-new-shortcode-plus.svg create mode 100755 assets/img/popup/popup-next-icon.svg create mode 100755 assets/img/popup/popup-prev-icon.svg create mode 100755 assets/img/popup/save.svg create mode 100755 assets/img/popup/sixth-step.png create mode 100755 assets/img/skins/agenda.svg create mode 100755 assets/img/skins/agenda/agenda-clean.png create mode 100755 assets/img/skins/agenda/index.html create mode 100755 assets/img/skins/available-spot/available-spot-classic.png create mode 100755 assets/img/skins/available_spot.svg create mode 100755 assets/img/skins/carousel.svg create mode 100755 assets/img/skins/carousel/carousel-type-1.png create mode 100755 assets/img/skins/carousel/carousel-type-2.png create mode 100755 assets/img/skins/carousel/carousel-type-3.png create mode 100755 assets/img/skins/carousel/carousel-type-4.png create mode 100755 assets/img/skins/carousel/index.html create mode 100755 assets/img/skins/countdown.svg create mode 100755 assets/img/skins/countdown/countdown-type-1.png create mode 100755 assets/img/skins/countdown/countdown-type-2.png create mode 100755 assets/img/skins/countdown/countdown-type-3.png create mode 100755 assets/img/skins/countdown/index.html create mode 100755 assets/img/skins/cover.svg create mode 100755 assets/img/skins/cover/cover-classic.png create mode 100755 assets/img/skins/cover/cover-clean.png create mode 100755 assets/img/skins/cover/cover-modern.png create mode 100755 assets/img/skins/cover/index.html create mode 100755 assets/img/skins/custom.svg create mode 100755 assets/img/skins/daily.svg create mode 100755 assets/img/skins/daily/daily-classic.png create mode 100755 assets/img/skins/fluent/fluent-agenda-view.png create mode 100755 assets/img/skins/fluent/fluent-available-spot-view-type1.png create mode 100755 assets/img/skins/fluent/fluent-available-spot-view-type2.png create mode 100755 assets/img/skins/fluent/fluent-carousel-view.png create mode 100755 assets/img/skins/fluent/fluent-countdown-view.png create mode 100755 assets/img/skins/fluent/fluent-cover-view-type1.png create mode 100755 assets/img/skins/fluent/fluent-cover-view-type2.png create mode 100755 assets/img/skins/fluent/fluent-cover-view-type3.png create mode 100755 assets/img/skins/fluent/fluent-cover-view-type4.png create mode 100755 assets/img/skins/fluent/fluent-daily-view.png create mode 100755 assets/img/skins/fluent/fluent-full-calendar-view.png create mode 100755 assets/img/skins/fluent/fluent-grid-view.png create mode 100755 assets/img/skins/fluent/fluent-list-view.png create mode 100755 assets/img/skins/fluent/fluent-masonry-view.png create mode 100755 assets/img/skins/fluent/fluent-monthly-view.png create mode 100755 assets/img/skins/fluent/fluent-slider-view.png create mode 100755 assets/img/skins/fluent/fluent-tile-view.png create mode 100755 assets/img/skins/fluent/fluent-time-table-view.png create mode 100755 assets/img/skins/fluent/fluent-weekly-view.png create mode 100755 assets/img/skins/fluent/fluent-yearly-view.png create mode 100755 assets/img/skins/full-calendar/full-calendar-daily.png create mode 100755 assets/img/skins/full-calendar/full-calendar-list.png create mode 100755 assets/img/skins/full-calendar/full-calendar-monthly.png create mode 100755 assets/img/skins/full-calendar/full-calendar-weekly.png create mode 100755 assets/img/skins/full-calendar/full-calendar-yearly.png create mode 100755 assets/img/skins/full-calendar/index.html create mode 100755 assets/img/skins/full_calendar.svg create mode 100755 assets/img/skins/general_calendar.svg create mode 100755 assets/img/skins/grid.svg create mode 100755 assets/img/skins/grid/grid-classic.png create mode 100755 assets/img/skins/grid/grid-clean.png create mode 100755 assets/img/skins/grid/grid-colorful.png create mode 100755 assets/img/skins/grid/grid-minimal.png create mode 100755 assets/img/skins/grid/grid-modern.png create mode 100755 assets/img/skins/grid/grid-novel.png create mode 100755 assets/img/skins/grid/grid-simple.png create mode 100755 assets/img/skins/grid/index.html create mode 100755 assets/img/skins/index.html create mode 100755 assets/img/skins/liquid/liquid-available-spot.jpg create mode 100755 assets/img/skins/liquid/liquid-carousel.jpg create mode 100755 assets/img/skins/liquid/liquid-cover.jpg create mode 100755 assets/img/skins/liquid/liquid-daily.jpg create mode 100755 assets/img/skins/liquid/liquid-full-calendar.jpg create mode 100755 assets/img/skins/liquid/liquid-grid-large.jpg create mode 100755 assets/img/skins/liquid/liquid-grid-medium.jpg create mode 100755 assets/img/skins/liquid/liquid-grid-small.jpg create mode 100755 assets/img/skins/liquid/liquid-list-large.jpg create mode 100755 assets/img/skins/liquid/liquid-list-medium.jpg create mode 100755 assets/img/skins/liquid/liquid-list-minimal.jpg create mode 100755 assets/img/skins/liquid/liquid-list-small.jpg create mode 100755 assets/img/skins/liquid/liquid-map.jpg create mode 100755 assets/img/skins/liquid/liquid-slider.jpg create mode 100755 assets/img/skins/liquid/liquid-weekly.jpg create mode 100755 assets/img/skins/list.svg create mode 100755 assets/img/skins/list/index.html create mode 100755 assets/img/skins/list/list-accordion.png create mode 100755 assets/img/skins/list/list-classic.png create mode 100755 assets/img/skins/list/list-minimal.png create mode 100755 assets/img/skins/list/list-modern.png create mode 100755 assets/img/skins/list/list-standard.png create mode 100755 assets/img/skins/map.svg create mode 100755 assets/img/skins/map/map-classic.jpg create mode 100755 assets/img/skins/masonry.svg create mode 100755 assets/img/skins/masonry/masonry-classic.png create mode 100755 assets/img/skins/monthly.svg create mode 100755 assets/img/skins/monthly/index.html create mode 100755 assets/img/skins/monthly/monthly-classic.png create mode 100755 assets/img/skins/monthly/monthly-clean.png create mode 100755 assets/img/skins/monthly/monthly-modern.png create mode 100755 assets/img/skins/monthly/monthly-novel.png create mode 100755 assets/img/skins/monthly/monthly-simple.png create mode 100755 assets/img/skins/popup/agenda-clean.jpg create mode 100755 assets/img/skins/popup/agenda-fluent.jpg create mode 100755 assets/img/skins/popup/available-spot-classic.jpg create mode 100755 assets/img/skins/popup/available-spot-fluent-type1.jpg create mode 100755 assets/img/skins/popup/available-spot-fluent-type2.jpg create mode 100755 assets/img/skins/popup/carousel-fluent.jpg create mode 100755 assets/img/skins/popup/carousel-type1.jpg create mode 100755 assets/img/skins/popup/carousel-type2.jpg create mode 100755 assets/img/skins/popup/carousel-type3.jpg create mode 100755 assets/img/skins/popup/carousel-type4.jpg create mode 100755 assets/img/skins/popup/countdown-fluent.jpg create mode 100755 assets/img/skins/popup/countdown-type1.jpg create mode 100755 assets/img/skins/popup/countdown-type2.jpg create mode 100755 assets/img/skins/popup/countdown-type3.jpg create mode 100755 assets/img/skins/popup/cover-classic.jpg create mode 100755 assets/img/skins/popup/cover-clean.jpg create mode 100755 assets/img/skins/popup/cover-fluent-type1.jpg create mode 100755 assets/img/skins/popup/cover-fluent-type2.jpg create mode 100755 assets/img/skins/popup/cover-fluent-type3.jpg create mode 100755 assets/img/skins/popup/cover-fluent-type4.jpg create mode 100755 assets/img/skins/popup/cover-modern.jpg create mode 100755 assets/img/skins/popup/daily-classic.jpg create mode 100755 assets/img/skins/popup/daily-fluent.jpg create mode 100755 assets/img/skins/popup/grid-classic.jpg create mode 100755 assets/img/skins/popup/grid-clean.jpg create mode 100755 assets/img/skins/popup/grid-colorful.jpg create mode 100755 assets/img/skins/popup/grid-fluent.jpg create mode 100755 assets/img/skins/popup/grid-minimal.jpg create mode 100755 assets/img/skins/popup/grid-modern.jpg create mode 100755 assets/img/skins/popup/grid-novel.jpg create mode 100755 assets/img/skins/popup/grid-simple.jpg create mode 100755 assets/img/skins/popup/index.html create mode 100755 assets/img/skins/popup/list-classic.jpg create mode 100755 assets/img/skins/popup/list-fluent.jpg create mode 100755 assets/img/skins/popup/list-minimal.jpg create mode 100755 assets/img/skins/popup/list-modern.jpg create mode 100755 assets/img/skins/popup/list-standard.jpg create mode 100755 assets/img/skins/popup/list-toggle.jpg create mode 100755 assets/img/skins/popup/masonry-classic.jpg create mode 100755 assets/img/skins/popup/masonry-fluent.jpg create mode 100755 assets/img/skins/popup/monthly-classic.jpg create mode 100755 assets/img/skins/popup/monthly-clean.jpg create mode 100755 assets/img/skins/popup/monthly-fluent.jpg create mode 100755 assets/img/skins/popup/monthly-modern.jpg create mode 100755 assets/img/skins/popup/monthly-novel.jpg create mode 100755 assets/img/skins/popup/monthly-simple.jpg create mode 100755 assets/img/skins/popup/slider-fluent.jpg create mode 100755 assets/img/skins/popup/slider-type1.jpg create mode 100755 assets/img/skins/popup/slider-type2.jpg create mode 100755 assets/img/skins/popup/slider-type3.jpg create mode 100755 assets/img/skins/popup/slider-type4.jpg create mode 100755 assets/img/skins/popup/slider-type5.jpg create mode 100755 assets/img/skins/popup/tile-classic.jpg create mode 100755 assets/img/skins/popup/tile-fluent.jpg create mode 100755 assets/img/skins/popup/timetable-clean.jpg create mode 100755 assets/img/skins/popup/timetable-fluent.jpg create mode 100755 assets/img/skins/popup/timetable-modern.jpg create mode 100755 assets/img/skins/popup/weekly-classic.jpg create mode 100755 assets/img/skins/popup/weekly-fluent.jpg create mode 100755 assets/img/skins/popup/yearly-fluent.jpg create mode 100755 assets/img/skins/popup/yearly-modern.jpg create mode 100755 assets/img/skins/shortcode-designer.svg create mode 100755 assets/img/skins/slider.svg create mode 100755 assets/img/skins/slider/index.html create mode 100755 assets/img/skins/slider/slider-type-1.png create mode 100755 assets/img/skins/slider/slider-type-2.png create mode 100755 assets/img/skins/slider/slider-type-3.png create mode 100755 assets/img/skins/slider/slider-type-4.png create mode 100755 assets/img/skins/slider/slider-type-5.png create mode 100755 assets/img/skins/tile.svg create mode 100755 assets/img/skins/tile/tile-classic.png create mode 100755 assets/img/skins/time-table/index.html create mode 100755 assets/img/skins/time-table/time-table-clean.png create mode 100755 assets/img/skins/time-table/time-table-modern.png create mode 100755 assets/img/skins/timeline.svg create mode 100755 assets/img/skins/timetable.svg create mode 100755 assets/img/skins/weekly.svg create mode 100755 assets/img/skins/weekly/weekly-classic.png create mode 100755 assets/img/skins/yearly.svg create mode 100755 assets/img/skins/yearly/index.html create mode 100755 assets/img/skins/yearly/yearly-modern.png create mode 100755 assets/img/support.png create mode 100755 assets/img/svg/calendar.svg create mode 100755 assets/img/svg/camrecorder.svg create mode 100755 assets/img/svg/cancel.svg create mode 100755 assets/img/svg/clock.svg create mode 100755 assets/img/svg/delay.svg create mode 100755 assets/img/svg/form/back-icon.svg create mode 100755 assets/img/svg/form/calendar-icon.svg create mode 100755 assets/img/svg/form/close-icon.svg create mode 100755 assets/img/svg/form/credit-card-icon.svg create mode 100755 assets/img/svg/form/discount-icon.svg create mode 100755 assets/img/svg/form/done-icon.svg create mode 100755 assets/img/svg/form/down-icon.svg create mode 100755 assets/img/svg/form/down-small-icon.svg create mode 100755 assets/img/svg/form/email-icon.svg create mode 100755 assets/img/svg/form/i-icon.svg create mode 100755 assets/img/svg/form/left-icon.svg create mode 100755 assets/img/svg/form/lock-icon.svg create mode 100755 assets/img/svg/form/minus-icon.svg create mode 100755 assets/img/svg/form/next-icon.svg create mode 100755 assets/img/svg/form/pay-locally-icon.svg create mode 100755 assets/img/svg/form/paypal-icon.svg create mode 100755 assets/img/svg/form/plus-icon.svg create mode 100755 assets/img/svg/form/right-icon.svg create mode 100755 assets/img/svg/form/search-icon.svg create mode 100755 assets/img/svg/form/stripe-card-icon.svg create mode 100755 assets/img/svg/form/stripe-icon.svg create mode 100755 assets/img/svg/form/subtotal-icon.svg create mode 100755 assets/img/svg/form/ticket-icon.svg create mode 100755 assets/img/svg/form/up-icon.svg create mode 100755 assets/img/svg/form/up-small-icon.svg create mode 100755 assets/img/svg/form/user-icon.svg create mode 100755 assets/img/svg/local-time.svg create mode 100755 assets/img/svg/location.svg create mode 100755 assets/img/svg/mec-live-now.svg create mode 100755 assets/img/svg/ontime.svg create mode 100755 assets/img/svg/share.svg create mode 100755 assets/img/webnus-logo.png create mode 100755 assets/img/webnus-logo2.png create mode 100755 assets/img/wn-ms-icon-17-n.svg create mode 100755 assets/img/x-social-media-black-icon.svg create mode 100755 assets/img/x-social-media-logo-icon.svg create mode 100755 assets/img/x.png create mode 100755 assets/index.html create mode 100755 assets/js/admin-calendar.js create mode 100755 assets/js/admin-upcoming.js create mode 100755 assets/js/backend.js create mode 100755 assets/js/chartjs.min.js create mode 100755 assets/js/date.format.min.js create mode 100755 assets/js/events.js create mode 100755 assets/js/flipcount-divi.js create mode 100755 assets/js/flipcount.js create mode 100755 assets/js/frontend.js create mode 100755 assets/js/googlemap.js create mode 100755 assets/js/imagesload.js create mode 100755 assets/js/index.html create mode 100755 assets/js/isotope.pkgd.min.js create mode 100755 assets/js/jquery.nice-select.min.js create mode 100755 assets/js/jquery.nicescroll.min.js create mode 100755 assets/js/jquery.typewatch.js create mode 100755 assets/js/mec-ajax-login.js create mode 100755 assets/js/mec-external.js create mode 100755 assets/js/mec-general-calendar.js create mode 100755 assets/js/shuffle.min.js create mode 100755 assets/js/total-booking-reports.js create mode 100755 assets/packages/clusterer/index.html create mode 100755 assets/packages/clusterer/markerclusterer.js create mode 100755 assets/packages/clusterer/markerclusterer.min.js create mode 100755 assets/packages/colorbrightness/colorbrightness.min.js create mode 100755 assets/packages/featherlight/featherlight.css create mode 100755 assets/packages/featherlight/featherlight.js create mode 100755 assets/packages/index.html create mode 100755 assets/packages/lity/index.html create mode 100755 assets/packages/lity/lity.css create mode 100755 assets/packages/lity/lity.js create mode 100755 assets/packages/lity/lity.min.css create mode 100755 assets/packages/lity/lity.min.js create mode 100755 assets/packages/month-picker/MonthPicker.css create mode 100755 assets/packages/month-picker/MonthPicker.js create mode 100755 assets/packages/owl-carousel/AjaxLoader.gif create mode 100755 assets/packages/owl-carousel/grabbing.png create mode 100755 assets/packages/owl-carousel/index.html create mode 100755 assets/packages/owl-carousel/owl.carousel.css create mode 100755 assets/packages/owl-carousel/owl.carousel.min.css create mode 100755 assets/packages/owl-carousel/owl.carousel.min.js create mode 100755 assets/packages/owl-carousel/owl.theme.css create mode 100755 assets/packages/owl-carousel/owl.theme.min.css create mode 100755 assets/packages/owl-carousel/owl.transitions.css create mode 100755 assets/packages/owl-carousel/owl.transitions.min.css create mode 100755 assets/packages/richmarker/index.html create mode 100755 assets/packages/richmarker/richmarker.min.js create mode 100755 assets/packages/select2/select2.full.min.js create mode 100755 assets/packages/select2/select2.min.css create mode 100755 assets/packages/timepicker/index.html create mode 100755 assets/packages/timepicker/jquery.timepicker.min.css create mode 100755 assets/packages/timepicker/jquery.timepicker.min.js create mode 100755 assets/packages/tooltip/tooltip.css create mode 100755 assets/packages/tooltip/tooltip.js create mode 100755 assets/packages/tooltip/tooltipster-sideTip-shadow.min.css create mode 100755 assets/sql/index.html create mode 100755 assets/sql/install.sql create mode 100755 assets/sql/tables.sql create mode 100755 changelog.txt create mode 100755 index.html create mode 100755 languages/index.html create mode 100755 languages/modern-events-calendar-lite-ca.mo create mode 100755 languages/modern-events-calendar-lite-ca.po create mode 100755 languages/modern-events-calendar-lite-cs_CZ.mo create mode 100755 languages/modern-events-calendar-lite-cs_CZ.po create mode 100755 languages/modern-events-calendar-lite-de_DE.mo create mode 100755 languages/modern-events-calendar-lite-de_DE.po create mode 100755 languages/modern-events-calendar-lite-en_US.mo create mode 100755 languages/modern-events-calendar-lite-en_US.po create mode 100755 languages/modern-events-calendar-lite-es_ES.mo create mode 100755 languages/modern-events-calendar-lite-es_ES.po create mode 100755 languages/modern-events-calendar-lite-fr_FR.mo create mode 100755 languages/modern-events-calendar-lite-fr_FR.po create mode 100755 languages/modern-events-calendar-lite-hu_HU.mo create mode 100755 languages/modern-events-calendar-lite-hu_HU.po create mode 100755 languages/modern-events-calendar-lite-it_IT.mo create mode 100755 languages/modern-events-calendar-lite-it_IT.po create mode 100755 languages/modern-events-calendar-lite-nb_NO.mo create mode 100755 languages/modern-events-calendar-lite-nb_NO.po create mode 100755 languages/modern-events-calendar-lite-nl_NL.mo create mode 100755 languages/modern-events-calendar-lite-nl_NL.po create mode 100755 languages/modern-events-calendar-lite-pl_PL.mo create mode 100755 languages/modern-events-calendar-lite-pl_PL.po create mode 100755 languages/modern-events-calendar-lite-pt_BR.mo create mode 100755 languages/modern-events-calendar-lite-pt_BR.po create mode 100755 languages/modern-events-calendar-lite-ru_RU.mo create mode 100755 languages/modern-events-calendar-lite-ru_RU.po create mode 100755 languages/modern-events-calendar-lite-sv_SE.mo create mode 100755 languages/modern-events-calendar-lite-sv_SE.po create mode 100755 languages/modern-events-calendar-lite-tr_TR.mo create mode 100755 languages/modern-events-calendar-lite-tr_TR.po create mode 100755 languages/modern-events-calendar-lite.pot create mode 100755 mec-init.php create mode 100755 modern-events-calendar-lite.php create mode 100755 readme.txt create mode 100755 templates/archive-mec-events.php create mode 100755 templates/index.html create mode 100755 templates/single-mec-events.php create mode 100755 templates/taxonomy-mec-category.php create mode 100755 wpml-config.xml diff --git a/MEC-Installation-Guide.pdf b/MEC-Installation-Guide.pdf new file mode 100755 index 0000000000000000000000000000000000000000..0d6aa81ae77c634b40b776fe5e365f17fd42fa68 GIT binary patch literal 431203 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
k}xzJMlnPLjAodOp&^KTltm#ug4x<)mt%?!o( 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�Jk5sbIp_JiVSAD$ZIY&AdJUf$G($$fRAxIP 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 literal 0 HcmV?d00001 diff --git a/app/addons/ACF.php b/app/addons/ACF.php new file mode 100755 index 0000000..9660540 --- /dev/null +++ b/app/addons/ACF.php @@ -0,0 +1,59 @@ + + */ +class MEC_addon_ACF extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + } + + /** + * Initialize the ACF addon + * @author Webnus + */ + public function init() + { + $this->factory->action('mec_wc_product_created', [$this, 'sync_acf_fields'], 10, 2); + $this->factory->action('mec_wc_product_updated', [$this, 'sync_acf_fields'], 10, 2); + } + + /** + * @param int $product_id + * @param int $event_id + * @return void + */ + public function sync_acf_fields($product_id, $event_id) + { + // ACF Plugin is not installed and activated + if(!class_exists('ACF')) return; + + // Event ACF Data + $data = get_fields($event_id, false); + + // Data is invalid + if(!is_array($data)) return; + if(!count($data)) return; + + // Store data for Product + foreach($data as $key => $value) + { + update_field($key, $value, $product_id); + } + } +} \ No newline at end of file diff --git a/app/addons/KC.php b/app/addons/KC.php new file mode 100755 index 0000000..bf0d3ba --- /dev/null +++ b/app/addons/KC.php @@ -0,0 +1,85 @@ + + */ +class MEC_addon_KC extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the KC addon + * @author Webnus + * @return boolean + */ + public function init() + { + // King Composer is not installed + if(!function_exists('kc_add_map')) return false; + + $this->factory->action('init', array($this, 'map')); + return true; + } + + /** + * Register the addon in KC + * @author Webnus + */ + public function map() + { + $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); + + $calendars_name = $calendars_number = []; + foreach($calendar_posts as $calendar_post) + { + $calendars_name[] = $calendar_post->post_title; + $calendars_number[] = $calendar_post->ID; + } + + $calendars_array = array_combine($calendars_number, $calendars_name); + + kc_add_map(array + ( + 'MEC' => array( + 'name' => esc_html__('Modern Events Calendar', 'modern-events-calendar-lite'), + 'icon' => 'mec-kingcomposer-icon', + 'category' => esc_html__('Content', 'modern-events-calendar-lite'), + 'params' => array( + 'General' => array( + array( + 'name' => 'id', + 'label' => esc_html__('Shortcode', 'modern-events-calendar-lite'), + 'type' => 'select', + 'options' => $calendars_array, + 'description' => esc_html__('Select from predefined shortcodes', 'modern-events-calendar-lite'), + ), + ), + ) + ), + )); + } +} \ No newline at end of file diff --git a/app/addons/PMP.php b/app/addons/PMP.php new file mode 100755 index 0000000..2010bec --- /dev/null +++ b/app/addons/PMP.php @@ -0,0 +1,201 @@ + + */ +class MEC_addon_PMP extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize the PMP addon + * @author Webnus + * @return boolean + */ + public function init() + { + $event_restriction = isset($this->settings['pmp_status']) && $this->settings['pmp_status']; + $booking_restriction = isset($this->settings['pmp_booking_restriction']) && $this->settings['pmp_booking_restriction']; + $ticket_restriction = isset($this->settings['pmp_ticket_restrictions']) && $this->settings['pmp_ticket_restrictions']; + + // Module is not enabled + if(!$event_restriction && !$booking_restriction && !$ticket_restriction) return false; + + // Event Restriction + if($event_restriction) + { + // Metabox + add_action('admin_menu', [$this, 'metabox']); + + // Display Access Error + add_filter('mec_show_event_details_page', [$this, 'check'], 10, 2); + } + + // Booking Restriction + if($booking_restriction) + { + add_filter('mec_booking_module_abort', [$this, 'booking_abort'], 10, 2); + } + + // Ticket Restrictions + if($ticket_restriction) + { + add_action('mec_ticket_extra_options', [$this, 'ticket_plans_fields'], 10, 3); + add_filter('mec_get_tickets_availability', [$this, 'ticket_availability'], 10, 5); + } + + return true; + } + + public function metabox() + { + if(!defined('PMPRO_VERSION')) return; + + // Register + add_meta_box('pmpro_page_meta', esc_html__('Require Membership', 'modern-events-calendar-lite'), 'pmpro_page_meta', $this->main->get_main_post_type(), 'side', 'high'); + } + + public function check($status, $event_id) + { + if(!defined('PMPRO_VERSION')) return $status; + + // Has Access + if(function_exists('pmpro_has_membership_access')) + { + $response = pmpro_has_membership_access($event_id, NULL, true); + $available = $response[0] ?? true; + + if(!$available) + { + $post_membership_levels_ids = $response[1]; + $post_membership_levels_names = $response[2]; + + $content = pmpro_get_no_access_message('', $post_membership_levels_ids, $post_membership_levels_names); + $status = '

'.get_the_title($event_id).'

'.MEC_kses::page($content).'
'; + } + } + + return $status; + } + + public function booking_abort($abort, $event) + { + if(!function_exists('pmpro_hasMembershipLevel')) return $abort; + + // Event ID + $event_id = $event->ID; + if(!$event_id) return $abort; + + // Event Categories + $categories = (isset($event->data) and isset($event->data->categories) and is_array($event->data->categories)) ? $event->data->categories : []; + + // Event has no category + if(!count($categories)) return $abort; + + // User ID + $user_id = get_current_user_id(); + + // Booking Restriction Options + $options = isset($this->settings['pmp_booking']) && is_array($this->settings['pmp_booking']) ? $this->settings['pmp_booking'] : []; + + $needed_levels = []; + foreach($options as $level_id => $cats) + { + foreach($categories as $category) + { + if(in_array($category['id'], $cats)) $needed_levels[] = $level_id; + } + } + + $needed_levels = array_unique($needed_levels); + if($needed_levels and !pmpro_hasMembershipLevel($needed_levels, $user_id)) + { + return pmpro_get_no_access_message('', $needed_levels); + } + + return $abort; + } + + public function ticket_plans_fields($ticket_id, $data, $args = []) + { + if(!function_exists('pmpro_getAllLevels')) return; + + $name_prefix = $args['name_prefix'] ?? 'mec[tickets]'; + $advanced_class = $args['advanced_class'] ?? 'mec-basvanced-advanced w-hidden'; + + // Levels + $levels = pmpro_getAllLevels(); + ?> +
+
+
+


+
    + +
  • + +
  • + +
+
+
+ + */ +class MEC_addon_TNP extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize the TNP addon + * @author Webnus + * @return boolean + */ + public function init() + { + $this->factory->action('newsletter_register_blocks', array($this, 'register')); + + return true; + } + + public function register() + { + if(!class_exists('TNP_Composer')) return; + + TNP_Composer::register_block(MEC_ABSPATH.'app'.DS.'addons'.DS.'tnp'.DS.'simple'); + } +} \ No newline at end of file diff --git a/app/addons/VC.php b/app/addons/VC.php new file mode 100755 index 0000000..87445d3 --- /dev/null +++ b/app/addons/VC.php @@ -0,0 +1,78 @@ + + */ +class MEC_addon_VC extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the VC addon + * @author Webnus + */ + public function init() + { + // Visual Composer is not installed + if(!function_exists('vc_map')) return false; + + $this->factory->action('vc_before_init', array($this, 'map')); + return true; + } + + /** + * Register the addon in VC + * @author Webnus + */ + public function map() + { + $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); + + $calendars = []; + foreach($calendar_posts as $calendar_post) $calendars[$calendar_post->post_title] = $calendar_post->ID; + + vc_map(array( + 'name'=>esc_html__('Modern Events Calendar', 'modern-events-calendar-lite'), + 'base'=>'MEC', + 'class'=>'', + 'controls'=>'full', + 'icon'=>$this->main->asset('img/ico-mec-vc.png'), + 'category'=>esc_html__('Content', 'modern-events-calendar-lite'), + 'params'=>array( + array( + 'type'=>'dropdown', + 'holder'=>'div', + 'class'=>'', + 'heading'=>esc_html__('Shortcode', 'modern-events-calendar-lite'), + 'param_name'=>'id', + 'value'=>$calendars, + 'description'=>esc_html__('Select from predefined shortcodes', 'modern-events-calendar-lite') + ) + ) + )); + } +} \ No newline at end of file diff --git a/app/addons/avada.php b/app/addons/avada.php new file mode 100755 index 0000000..76e9ab6 --- /dev/null +++ b/app/addons/avada.php @@ -0,0 +1,72 @@ + + */ +class MEC_addon_avada extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the Elementor addon + * @author Webnus + */ + public function init() + { + $this->factory->action('fusion_builder_before_init', array($this, 'register')); + } + + public function register() + { + $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); + + $shortcodes = []; + foreach($calendar_posts as $calendar_post) + { + $shortcodes[$calendar_post->ID] = $calendar_post->post_title; + } + + fusion_builder_map([ + 'name' => esc_attr__('MEC', 'modern-events-calendar-lite'), + 'shortcode' => 'MEC', + 'icon' => 'fusiona-code', + 'preview' => MEC_ABSPATH.'app/addons/avada/preview.php', + 'preview_id' => 'mec-avada-shortcode-element', + 'allow_generator' => true, + 'params' => [ + [ + 'type' => 'select', + 'heading' => esc_attr__('Shortcode', 'modern-events-calendar-lite'), + 'description' => esc_attr__('Select one of created shortcodes.', 'modern-events-calendar-lite'), + 'param_name' => 'id', + 'value' => $shortcodes, + 'default' => '', + ], + ], + ]); + } +} \ No newline at end of file diff --git a/app/addons/avada/preview.php b/app/addons/avada/preview.php new file mode 100755 index 0000000..2a5fb81 --- /dev/null +++ b/app/addons/avada/preview.php @@ -0,0 +1,11 @@ + + diff --git a/app/addons/beaver.php b/app/addons/beaver.php new file mode 100755 index 0000000..5683f88 --- /dev/null +++ b/app/addons/beaver.php @@ -0,0 +1,54 @@ + + */ +class MEC_addon_beaver extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the Elementor addon + * @author Webnus + */ + public function init() + { + // Beaver Builder is not installed + if(!class_exists( 'FLBuilder' ) ) return false; + define( 'MEC_BEAVER_DIR', plugin_dir_path( __FILE__ ) ); + define( 'MEC_BEAVER_URL', plugins_url( '/', __FILE__ ) ); + add_action( 'init', array($this,'mec_beaver_builder_shortcode') ); + return true; + } + + public function mec_beaver_builder_shortcode() { + if ( class_exists( 'FLBuilder' ) ) { + require_once MEC_ABSPATH.'app/addons/mec-beaver-builder/mec-beaver-builder.php'; + } + } + +} \ No newline at end of file diff --git a/app/addons/divi.php b/app/addons/divi.php new file mode 100755 index 0000000..7e4ab11 --- /dev/null +++ b/app/addons/divi.php @@ -0,0 +1,67 @@ + + */ +class MEC_addon_divi extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the Elementor addon + * @author Webnus + */ + public function init() + { + // Divi is not installed + $theme = wp_get_theme(); // gets the current theme + + if('Divi' != $theme->get_template()) return false; + + add_action('divi_extensions_init', array($this, 'mecdivi_initialize_extension')); + add_filter('et_builder_load_actions', array($this, 'add_ajax_actions')); + + return true; + } + + /** + * Creates the extension's main class instance. + * + * @since 1.0.0 + */ + public function mecdivi_initialize_extension() + { + require_once plugin_dir_path( __FILE__ ) . 'divi/includes/Divi.php'; + require_once plugin_dir_path( __FILE__ ) . 'divi/includes/MECShortcodesForDivi.php'; + } + + public function add_ajax_actions($actions) + { + $actions[] = 'mec_load_single_page'; + return $actions; + } +} \ No newline at end of file diff --git a/app/addons/divi/includes/Divi.php b/app/addons/divi/includes/Divi.php new file mode 100755 index 0000000..769e79e --- /dev/null +++ b/app/addons/divi/includes/Divi.php @@ -0,0 +1,45 @@ +plugin_dir = plugin_dir_path( __FILE__ ); + $this->plugin_dir_url = plugin_dir_url( $this->plugin_dir ); + + parent::__construct( $name, $args ); + } +} + +new MECDIVI_Divi; diff --git a/app/addons/divi/includes/MECShortcodesForDivi.php b/app/addons/divi/includes/MECShortcodesForDivi.php new file mode 100755 index 0000000..880377f --- /dev/null +++ b/app/addons/divi/includes/MECShortcodesForDivi.php @@ -0,0 +1,20 @@ + { + API.registerModules(modules); +}); diff --git a/app/addons/divi/includes/loader.php b/app/addons/divi/includes/loader.php new file mode 100755 index 0000000..b055daf --- /dev/null +++ b/app/addons/divi/includes/loader.php @@ -0,0 +1,14 @@ + + ); + } +} + +export default MECShortcodes; diff --git a/app/addons/divi/includes/modules/MECShortcodes/MECShortcodes.php b/app/addons/divi/includes/modules/MECShortcodes/MECShortcodes.php new file mode 100755 index 0000000..9927d05 --- /dev/null +++ b/app/addons/divi/includes/modules/MECShortcodes/MECShortcodes.php @@ -0,0 +1,37 @@ + 'https://webnus.net', + 'author' => 'Webnus', + 'author_uri' => 'https://webnus.net', + ); + + public function init() { + $this->name = esc_html__( 'MEC Shortcodes', 'mecdivi-divi' ); + } + + public function get_fields() { + $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); + $calendars = []; + foreach($calendar_posts as $calendar_post) $calendars[$calendar_post->ID] = $calendar_post->post_title; + + return array( + 'shortcode_id' => array( + 'label' => esc_html__( 'MEC Shortcodes', 'mecdivi-divi' ), + 'type' => 'select', + 'options' => $calendars, + 'description' => esc_html__( 'Enter the shortcode_id of your choosing here.', 'mecdivi-divi' ), + ), + ); + } + public function render( $attrs, $content = NULL, $render_slug = NULL ) { + return do_shortcode('[MEC id="'.$this->props['shortcode_id'].'"]'); + } +} + +new MECDIVI_MECShortcodes; diff --git a/app/addons/divi/includes/modules/index.js b/app/addons/divi/includes/modules/index.js new file mode 100755 index 0000000..3d7b28b --- /dev/null +++ b/app/addons/divi/includes/modules/index.js @@ -0,0 +1,5 @@ +import MECShortcodes from './MECShortcodes/MECShortcodes'; + +export default [ + MECShortcodes, +]; diff --git a/app/addons/divi/scripts/builder-bundle.min.js b/app/addons/divi/scripts/builder-bundle.min.js new file mode 100755 index 0000000..76ae47b --- /dev/null +++ b/app/addons/divi/scripts/builder-bundle.min.js @@ -0,0 +1,201 @@ +!(function(e) { + var t = {}; + function n(o) { + if (t[o]) return t[o].exports; + var r = (t[o] = { i: o, l: !1, exports: {} }); + return e[o].call(r.exports, r, r.exports, n), (r.l = !0), r.exports; + } + (n.m = e), + (n.c = t), + (n.d = function(e, t, o) { + n.o(e, t) || + Object.defineProperty(e, t, { + configurable: !1, + enumerable: !0, + get: o + }); + }), + (n.n = function(e) { + var t = + e && e.__esModule + ? function() { + return e.default; + } + : function() { + return e; + }; + return n.d(t, "a", t), t; + }), + (n.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (n.p = "/"), + n((n.s = 1)); +})([ + function(e, t) { + e.exports = jQuery; + }, + function(e, t, n) { + n(2), (e.exports = n(3)); + }, + function(e, t, n) { + "use strict"; + }, + function(e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", { value: !0 }); + var o = n(0), + r = n.n(o), + c = n(4); + r()(window).on("et_builder_api_ready", function(e, t) { + t.registerModules(c.a); + }); + }, + function(e, t, n) { + "use strict"; + var o = n(5); + t.a = [o.a]; + }, + function(e, t, n) { + "use strict"; + var o = n(6), + r = n.n(o), + c = n(0), + u = n.n(c); + function i(e) { + return (i = + "function" === typeof Symbol && "symbol" === typeof Symbol.iterator + ? function(e) { + return typeof e; + } + : function(e) { + return e && + "function" === typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? "symbol" + : typeof e; + })(e); + } + function a(e, t) { + for (var n = 0; n < t.length; n++) { + var o = t[n]; + (o.enumerable = o.enumerable || !1), + (o.configurable = !0), + "value" in o && (o.writable = !0), + Object.defineProperty(e, o.key, o); + } + } + function f(e, t) { + return !t || ("object" !== i(t) && "function" !== typeof t) + ? (function(e) { + if (void 0 === e) + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + return e; + })(e) + : t; + } + var s = (function(e) { + function t() { + return ( + (function(e, t) { + if (!(e instanceof t)) + throw new TypeError("Cannot call a class as a function"); + })(this, t), + f( + this, + (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments) + ) + ); + } + var n, c, i; + return ( + (function(e, t) { + if ("function" !== typeof t && null !== t) + throw new TypeError( + "Super expression must either be null or a function" + ); + (e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && + (Object.setPrototypeOf + ? Object.setPrototypeOf(e, t) + : (e.__proto__ = t)); + })(t, o["Component"]), + (n = t), + (c = [ + { + key: "render", + value: function() { + return ( + u.a.ajax({ + url: window.ETBuilderBackend.ajaxUrl, + type: "post", + data: { + action: "MECDIVI_load_mec_shortcode", + nonce: "et_admin_load_nonce", + shortcode_id: this.props.shortcode_id + }, + success: function(e) { + u()(".mec-shortcode").html(e); + var node = jQuery(".mec-event-masonry"); + if(typeof node !== 'undefined') + { + // var masonryShuffle = window.Shuffle; + + if (node === null) { + return; + } + + // var masonryShuffle = new Shuffle(node, { + // itemSelector: '.mec-masonry-item-wrap', + // }); + // masonryShuffle.sort({ + // by: node.data('created') + // }); + // var $container = $("#mec_skin_" + settings.id + " .mec-event-masonry"); + var $grid = node.isotope({ + filter: '*', + itemSelector: '.mec-masonry-item-wrap', + getSortData: { + date: '[data-sort-masonry]', + }, + sortBy: 'date', + animationOptions: { + duration: 750, + easing: 'linear', + queue: false + }, + }); + } + } + }), + r.a.createElement("div", { class: "mec-shortcode" }) + ); + } + } + ]) && a(n.prototype, c), + i && a(n, i), + t + ); + })(); + Object.defineProperty(s, "slug", { + configurable: !0, + enumerable: !0, + writable: !0, + value: "mecdivi_MECShortcodes" + }), + (t.a = s); + }, + function(e, t) { + e.exports = React; + } +]); diff --git a/app/addons/divi/scripts/frontend-bundle.min.js b/app/addons/divi/scripts/frontend-bundle.min.js new file mode 100755 index 0000000..297744f --- /dev/null +++ b/app/addons/divi/scripts/frontend-bundle.min.js @@ -0,0 +1 @@ +!function(n){var t={};function r(e){if(t[e])return t[e].exports;var o=t[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=n,r.c=t,r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(t,"a",t),t},r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},r.p="/",r(r.s=7)}({7:function(n,t,r){n.exports=r(8)},8:function(n,t){jQuery(function(n){})}}); \ No newline at end of file diff --git a/app/addons/divi/scripts/frontend.js b/app/addons/divi/scripts/frontend.js new file mode 100755 index 0000000..a8780e5 --- /dev/null +++ b/app/addons/divi/scripts/frontend.js @@ -0,0 +1,3 @@ +// This script is loaded both on the frontend page and in the Visual Builder. + +jQuery(function($) {}); diff --git a/app/addons/divi/styles/style-dbp.min.css b/app/addons/divi/styles/style-dbp.min.css new file mode 100755 index 0000000..e69de29 diff --git a/app/addons/divi/styles/style.min.css b/app/addons/divi/styles/style.min.css new file mode 100755 index 0000000..bddb0bd --- /dev/null +++ b/app/addons/divi/styles/style.min.css @@ -0,0 +1 @@ + .mec-owl-carousel {display: none;width: 100%;-webkit-tap-highlight-color: transparent;position: relative;z-index: 1;}.mec-owl-carousel .owl-stage {position: relative;-ms-touch-action: pan-Y;-moz-backface-visibility: hidden;}.mec-owl-carousel .owl-stage:after {content: ".";display: block;clear: both;visibility: hidden;line-height: 0;height: 0;}.mec-owl-carousel .owl-stage-outer {position: relative;overflow: hidden;-webkit-transform: translate3d(0px, 0px, 0px);}.mec-owl-carousel .owl-wrapper, .mec-owl-carousel .owl-item {-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;-ms-backface-visibility: hidden;-webkit-transform: translate3d(0, 0, 0);-moz-transform: translate3d(0, 0, 0);-ms-transform: translate3d(0, 0, 0);}.mec-owl-carousel .owl-item {position: relative;min-height: 1px;float: left;-webkit-backface-visibility: hidden;-webkit-tap-highlight-color: transparent;-webkit-touch-callout: none;}.mec-owl-carousel .owl-item img {display: block;width: 100%;}.mec-owl-carousel .owl-nav.disabled, .mec-owl-carousel .owl-dots.disabled {display: none;}.mec-owl-carousel .owl-nav .owl-prev, .mec-owl-carousel .owl-nav .owl-next, .mec-owl-carousel .owl-dot {cursor: pointer;cursor: hand;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}.mec-owl-carousel.owl-loaded {display: block;}.mec-owl-carousel.owl-loading {opacity: 0;display: block;}.mec-owl-carousel.owl-hidden {opacity: 0;}.mec-owl-carousel.owl-refresh .owl-item {visibility: hidden;}.mec-owl-carousel.owl-drag .owl-item {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}.mec-owl-carousel.owl-grab {cursor: move;cursor: grab;}.mec-owl-carousel.owl-rtl {direction: rtl;}.mec-owl-carousel.owl-rtl .owl-item {float: right;}.no-js .mec-owl-carousel {display: block;}.mec-owl-carousel .animated {animation-duration: 1000ms;animation-fill-mode: both;}.mec-owl-carousel .owl-animated-in {z-index: 0;}.mec-owl-carousel .owl-animated-out {z-index: 1;}.mec-owl-carousel .fadeOut {animation-name: fadeOut;}@keyframes fadeOut {0% {opacity: 1;}100% {opacity: 0;}}.owl-height {transition: height 500ms ease-in-out;}.mec-owl-carousel .owl-item .owl-lazy {opacity: 0;transition: opacity 400ms ease;}.mec-owl-carousel .owl-item img.owl-lazy {transform-style: preserve-3d;}.mec-owl-carousel .owl-video-wrapper {position: relative;height: 100%;background: #000;}.mec-owl-carousel .owl-video-play-icon {position: absolute;height: 80px;width: 80px;left: 50%;top: 50%;margin-left: -40px;margin-top: -40px;background: url("owl.video.play.png") no-repeat;cursor: pointer;z-index: 1;-webkit-backface-visibility: hidden;transition: transform 100ms ease;}.mec-owl-carousel .owl-video-play-icon:hover {-ms-transform: scale(1.3, 1.3);transform: scale(1.3, 1.3);}.mec-owl-carousel .owl-video-playing .owl-video-tn, .mec-owl-carousel .owl-video-playing .owl-video-play-icon {display: none;}.mec-owl-carousel .owl-video-tn {opacity: 0;height: 100%;background-position: center center;background-repeat: no-repeat;background-size: contain;transition: opacity 400ms ease;}.mec-owl-carousel .owl-video-frame {position: relative;z-index: 1;height: 100%;width: 100%;} \ No newline at end of file diff --git a/app/addons/elementor.php b/app/addons/elementor.php new file mode 100755 index 0000000..c4cc873 --- /dev/null +++ b/app/addons/elementor.php @@ -0,0 +1,77 @@ + + */ +class MEC_addon_elementor extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + } + + /** + * Initialize the Elementor addon + * @author Webnus + */ + public function init() + { + // Elementor is not installed + if(!did_action('elementor/loaded')) return false; + + add_action('elementor/widgets/register', array($this, 'register_shortcode')); + + add_action( 'elementor/preview/enqueue_styles', function() + { + wp_enqueue_style( 'mec-owl-carousel-style' ); + wp_enqueue_style( 'mec-frontend-style' ); + }); + + add_action('elementor/editor/after_enqueue_scripts', function() + { + wp_enqueue_script('mec-owl-carousel-script'); + wp_enqueue_script('mec-frontend-script'); + }); + + return true; + } + + /** + * Register MEC Elementor Shortcode + * @author Webnus + */ + public function register_shortcode() + { + require_once MEC_ABSPATH.'app/addons/elementor/shortcode.php'; + \Elementor\Plugin::instance()->widgets_manager->register(new \Elementor\MEC_addon_elementor_shortcode()); + } + + /** + * Register the addon in Elementor + * @author Webnus + */ + public function map() + { + } +} \ No newline at end of file diff --git a/app/addons/elementor/index.html b/app/addons/elementor/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/addons/elementor/shortcode.php b/app/addons/elementor/shortcode.php new file mode 100755 index 0000000..0faff3b --- /dev/null +++ b/app/addons/elementor/shortcode.php @@ -0,0 +1,110 @@ + + */ +class MEC_addon_elementor_shortcode extends \Elementor\Widget_Base +{ + /** + * Retrieve MEC widget name. + * + * @since 1.0.0 + * @access public + * @return string Widget name. + */ + public function get_name() + { + return 'MEC'; + } + + /** + * Retrieve MEC widget title. + * + * @since 1.0.0 + * @access public + * @return string Widget title. + */ + public function get_title() + { + return esc_html__('Modern Events Calendar (MEC)', 'modern-events-calendar-lite'); + } + + /** + * Retrieve MEC widget icon. + * + * @since 1.0.0 + * @access public + * @return string Widget icon. + */ + public function get_icon() + { + return 'eicon-archive-posts'; + } + + /** + * Set widget category. + * + * @since 1.0.0 + * @access public + * @return array Widget category. + */ + public function get_categories() + { + return array('general'); + } + + /** + * Register MEC widget controls. + * + * @since 1.0.0 + * @access protected + */ + protected function register_controls() + { + $calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); + + $calendars = []; + foreach($calendar_posts as $calendar_post) $calendars[$calendar_post->ID] = $calendar_post->post_title; + + // Content Tab + $this->start_controls_section( + 'content_section', + array( + 'label' => esc_html__('General', 'modern-events-calendar-lite'), + 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, + ) + ); + + // Select Type Section + $this->add_control( + 'type', + array( + 'label' => esc_html__('Select Type', 'modern-events-calendar-lite'), + 'type' => \Elementor\Controls_Manager::SELECT, + 'options' => $calendars, + ) + ); + + $this->end_controls_section(); + } + + /** + * Render MEC widget output on the frontend. + * + * @since 1.0.0 + * @access protected + */ + protected function render() + { + $settings = $this->get_settings_for_display(); + if(!empty($settings['type'])) + { + echo do_shortcode('[MEC id="'.$settings['type'].'"]'); + } + } +} \ No newline at end of file diff --git a/app/addons/index.html b/app/addons/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/addons/learndash.php b/app/addons/learndash.php new file mode 100755 index 0000000..7e6e5a3 --- /dev/null +++ b/app/addons/learndash.php @@ -0,0 +1,158 @@ + + */ +class MEC_addon_learndash extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory class + $this->factory = $this->getFactory(); + + // MEC Main class + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize the LD addon + * @author Webnus + * @return boolean + */ + public function init() + { + // Module is not enabled + if(!isset($this->settings['ld_status']) or (isset($this->settings['ld_status']) and !$this->settings['ld_status'])) return false; + + // Tickets + add_action('custom_field_ticket', array($this, 'add_courses_dropdown_to_tickets'), 10, 2); + add_action('custom_field_dynamic_ticket', array($this, 'add_courses_dropdown_to_raw_tickets')); + + // Enrollment Method + $enroll_method = (isset($this->settings['ld_enrollment_method']) and trim($this->settings['ld_enrollment_method'])) ? $this->settings['ld_enrollment_method'] : 'booking'; + + // Enroll + if($enroll_method === 'booking') add_action('mec_booking_completed', array($this, 'assign'), 10, 1); + elseif($enroll_method === 'confirm') add_action('mec_booking_confirmed', array($this, 'assign'), 10, 1); + elseif($enroll_method === 'verification') add_action('mec_booking_verified', array($this, 'assign'), 10, 1); + elseif($enroll_method === 'confirm_verification') + { + add_action('mec_booking_confirmed', array($this, 'pre_enroll'), 10, 1); + add_action('mec_booking_verified', array($this, 'pre_enroll'), 10, 1); + } + + return true; + } + + public function add_courses_dropdown_to_tickets($ticket, $key) + { + // LearnDash is not installed + if(!defined('LEARNDASH_VERSION')) return; + + $courses = $this->get_courses(); + if(!count($courses)) return; + ?> +
+ + +
+ add_courses_dropdown_to_tickets(array(), ':i:'); + } + + public function get_courses() + { + $courses = []; + + $args = ['post_type' => 'sfwd-courses', 'posts_per_page' => -1]; + if(!current_user_can('manage_options') and isset($this->settings['ld_course_access']) and $this->settings['ld_course_access'] === 'user') $args['author'] = get_current_user_id(); + + $posts = get_posts($args); + if($posts) foreach($posts as $post) $courses[$post->ID] = $post->post_title; + + return $courses; + } + + public function assign($book_id) + { + // LearnDash is not installed + if(!defined('LEARNDASH_VERSION')) return; + + // MEC User + $u = $this->getUser(); + + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $ticket_ids = explode(',', get_post_meta($book_id, 'mec_ticket_id', true)); + + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if(!is_array($attendees)) $attendees = []; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + foreach($attendees as $key => $attendee) + { + if($key === 'attachments') continue; + if(!isset($attendee['id'])) continue; + + $ticket_id = $attendee['id']; + + if(!is_numeric($ticket_id)) continue; + if(!in_array($ticket_id, $ticket_ids)) continue; + if(!isset($tickets[$ticket_id])) continue; + + $ticket = $tickets[$ticket_id]; + + // Course ID + $course_id = $ticket['ld_course']; + + // User ID + $user_id = $u->register($attendee, [ + 'event_id' => $event_id, + ]); + + // Associate Course + ld_update_course_access($user_id, $course_id, false); + } + } + + public function pre_enroll($booking_id) + { + $confirmed = get_post_meta($booking_id, 'mec_confirmed', true); + $verified = get_post_meta($booking_id, 'mec_verified', true); + + if($confirmed == 1 and $verified == 1) $this->assign($booking_id); + } +} \ No newline at end of file diff --git a/app/addons/mec-beaver-builder/calendar.svg b/app/addons/mec-beaver-builder/calendar.svg new file mode 100755 index 0000000..8b77f50 --- /dev/null +++ b/app/addons/mec-beaver-builder/calendar.svg @@ -0,0 +1 @@ + diff --git a/app/addons/mec-beaver-builder/includes/frontend.php b/app/addons/mec-beaver-builder/includes/frontend.php new file mode 100755 index 0000000..1f4d306 --- /dev/null +++ b/app/addons/mec-beaver-builder/includes/frontend.php @@ -0,0 +1,3 @@ +
+ mec_shortcode.'"]') ?> +
diff --git a/app/addons/mec-beaver-builder/mec-beaver-builder.php b/app/addons/mec-beaver-builder/mec-beaver-builder.php new file mode 100755 index 0000000..8063a67 --- /dev/null +++ b/app/addons/mec-beaver-builder/mec-beaver-builder.php @@ -0,0 +1,39 @@ + esc_html__( 'Modern Events Calendar (MEC)', 'modern-events-calendar-lite'), + 'description' => esc_html__( 'MEC Shortcodes', 'modern-events-calendar-lite'), + 'category' => esc_html__( 'Basic', 'modern-events-calendar-lite'), + 'dir' => MEC_BEAVER_DIR . 'mec-beaver-builder/', + 'url' => MEC_BEAVER_URL . 'mec-beaver-builder/', + 'icon' => 'button.svg', + 'editor_export' => true, // Defaults to true and can be omitted. + 'enabled' => true, // Defaults to true and can be omitted. + 'partial_refresh' => false, // Defaults to false and can be omitted. + )); + } +} + +$calendar_posts = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1')); +$calendars = []; +foreach($calendar_posts as $calendar_post) $calendars[$calendar_post->ID] = $calendar_post->post_title; +FLBuilder::register_module( 'mecBeaverBuilderShortcode', array( + 'my-tab-1' => array( + 'title' => esc_html__( 'Content', 'modern-events-calendar-lite'), + 'sections' => array( + 'my-section-1' => array( + 'title' => esc_html__( 'Select Shortcode', 'modern-events-calendar-lite'), + 'fields' => array( + 'mec_shortcode' => array( + 'type' => 'select', + 'label' => esc_html__( 'Select Shortcode', 'modern-events-calendar-lite'), + 'options' => $calendars, + ), + ) + ) + ) + ) +) ); \ No newline at end of file diff --git a/app/addons/tnp/index.html b/app/addons/tnp/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/addons/tnp/simple/block-empty.php b/app/addons/tnp/simple/block-empty.php new file mode 100755 index 0000000..4250ae0 --- /dev/null +++ b/app/addons/tnp/simple/block-empty.php @@ -0,0 +1 @@ +

\ No newline at end of file diff --git a/app/addons/tnp/simple/block-full.php b/app/addons/tnp/simple/block-full.php new file mode 100755 index 0000000..aab4450 --- /dev/null +++ b/app/addons/tnp/simple/block-full.php @@ -0,0 +1,54 @@ + + + + + + + + + + + + + post_content): ?> + + + + + + + + +
+ +
+ post_title; ?> +
+ post_content; ?> +
+ +
diff --git a/app/addons/tnp/simple/block-left.php b/app/addons/tnp/simple/block-left.php new file mode 100755 index 0000000..f0abfdf --- /dev/null +++ b/app/addons/tnp/simple/block-left.php @@ -0,0 +1,47 @@ + + + + + + +
+ +
+ + + + + + post_content): ?> + + + + + + + +
+ post_title; ?> +
+ post_content; ?> +
+ +
diff --git a/app/addons/tnp/simple/block-right.php b/app/addons/tnp/simple/block-right.php new file mode 100755 index 0000000..ad69536 --- /dev/null +++ b/app/addons/tnp/simple/block-right.php @@ -0,0 +1,51 @@ + + +
+ + + + + +
+ +
+ + + + + + post_content): ?> + + + + + + + +
+ post_title; ?> +
+ post_content; ?> +
+ +
+ +
diff --git a/app/addons/tnp/simple/block.php b/app/addons/tnp/simple/block.php new file mode 100755 index 0000000..fe9c825 --- /dev/null +++ b/app/addons/tnp/simple/block.php @@ -0,0 +1,71 @@ + NULL, + 'layout' => 'full', + + // block_ prefixed options are reserved for Newsletter and the ones below managed directly by Newsletter + 'block_padding_left' => 15, + 'block_padding_right' => 15, + 'block_padding_top' => 15, + 'block_padding_bottom' => 15, + 'block_background' => '#ffffff', +); + +$options = array_merge($default_options, $options); + +/** @var MEC_main $main */ +$main = MEC_base::getInstance('app.libraries.main'); + +$event_id = $options['event_id']; + +$layout = $options['layout']; +if(!$event_id) $layout = 'empty'; + +$td_width = round((600 - $options['block_padding_left'] - $options['block_padding_right'] - 20)/2); + +$featured_image_id = $event_id ? get_post_thumbnail_id($event_id) : NULL; +if($event_id and $featured_image_id) +{ + if($layout === 'full') + { + $image_width = 600 - $options['block_padding_left'] - $options['block_padding_right']; + $media = tnp_resize_2x($featured_image_id, [$image_width, 0]); + } + else + { + $media = tnp_resize_2x($featured_image_id, [$td_width, 0]); + } +} +else $media = false; + +$title_style = TNP_Composer::get_title_style($options, 'title', $composer); +$text_style = TNP_Composer::get_text_style($options, '', $composer); + +$event = $event_id ? get_post($event_id) : NULL; + +$button_options = $options; +$button_options['button_url'] = $event_id ? get_permalink($event) : NULL; +$button_options['button_label'] = esc_html__('Click Here', 'modern-events-calendar-lite'); + +switch ($layout) { + case 'left': + include __DIR__ . '/block-left.php'; + return; + case 'right': + include __DIR__ . '/block-right.php'; + return; + case 'empty': + include __DIR__ . '/block-empty.php'; + return; + default: + include __DIR__ . '/block-full.php'; + return; +} diff --git a/app/addons/tnp/simple/icon.png b/app/addons/tnp/simple/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..25ad91147b79b49902f4798f559cc3ee4cca20a0 GIT binary patch literal 1056 zcmV+*1mF9KP)YCXD0os&;w5anhULO>7&5B@}mgsjFWC}Bku z$tEO>Zjyt$GjHa-?y|aH&&*C{S0l_EEQ+4)H#1eQ>iepyiJ37@Q5ds?<;SH4zjDO< zb`_{Xr_dABNn}Nlph&Ii#A)m_B934Juo`$%<2E^PPlOLPQa!RqDpU0OA+00q+O9eV zQ3?u?F|+~)Fm7dMt~APu#2%B?QX)c3$Qd2Bo8wC?&W>$#U$c`J_7?NMnsWcqoO$CD zo#lMva<0vL8fLELk7qM}V8L7SLB@*n+`rD}-|>g1`Qo+z0RE{A@Bf9bTK*`}Cp3rw zX(W+<^y+SPt;zNEbmII;8BYC>DelaR8Ak%xF}3q8Jx8q0Wlo-b)o+-I;*HdEMDqvzIvR(D_+ zuImxumTAlDV1k6^CF`X)uC(#yXFOHKmkT(v$dBAfWi|L(3(+JT_>-psdb+ko1f}O7 zz!Oge?A`TAmlycYzJ3t~9t>L7GxKlU`1?$v6|5 zu&~JY-9ZOWFvk$I^MY;mT{0!ZIiZ=eG2|&Tgn`d`eUq9yY2JA&HzCOufJEm#()EYGH$;@`Oc_uc-(y51|je{-zB3o~#cb}nF z;eLSr)RZ4rgI+rNLG)A9gCU*xm)Z#wghl_<>DaY~F6#2w?cz~qYV2nz{iW&pvocLz1f{R zqYv-PnoF#dd#IFDnF*Y_L9bmkXz3reLy)b2w7gYPcjKNUw)LhJ9J-fwPOfn9KfYc6 aEx-VEHwfo@I#a3u0000 + + $main->get_main_post_type(), + 'posts_per_page' => -1 +)); + +$options = array('' => '-----'); +foreach($posts as $post) $options['' . $post->ID] = $post->post_title; + +$fields->select('event_id', esc_html__('Event', 'modern-events-calendar-lite'), $options); ?> + +select('layout', esc_html__('Layout', 'modern-events-calendar-lite'), array( + 'full' => 'Full', + 'left' => 'Image left', + 'right' => 'Image right' +)); ?> + +block_commons(); \ No newline at end of file diff --git a/app/api/Campaign_Monitor/class/base_classes.php b/app/api/Campaign_Monitor/class/base_classes.php new file mode 100755 index 0000000..95dde69 --- /dev/null +++ b/app/api/Campaign_Monitor/class/base_classes.php @@ -0,0 +1,317 @@ +response = $response; + $this->http_status_code = $code; + } + + /** + * Can be used to check if a call to the api resulted in a successful response. + * @return boolean False if the call failed. Check the response property for the failure reason. + * @access public + */ + function was_successful() { + return $this->http_status_code >= 200 && $this->http_status_code < 300; + } + } +} +/** + * Base class for the create send PHP wrapper. + * This class includes functions to access the general data, + * i.e timezones, clients and getting your API Key from username and password + * @author tobyb + * + */ +if (!class_exists('CS_REST_Wrapper_Base')) { + class CS_REST_Wrapper_Base { + /** + * The protocol to use while accessing the api + * @var string http or https + * @access private + */ + var $_protocol; + + /** + * The base route of the create send api. + * @var string + * @access private + */ + var $_base_route; + + /** + * The serialiser to use for serialisation and deserialisation + * of API request and response data + * @var CS_REST_JsonSerialiser or CS_REST_XmlSerialiser + * @access private + */ + var $_serialiser; + + /** + * The transport to use to send API requests + * @var CS_REST_CurlTransport or CS_REST_SocketTransport or your own custom transport. + * @access private + */ + var $_transport; + + /** + * The logger to use for debugging of all API requests + * @var CS_REST_Log + * @access private + */ + var $_log; + + /** + * The default options to use for each API request. + * These can be overridden by passing in an array as the call_options argument + * to a single api request. + * Valid options are: + * + * deserialise boolean: + * Set this to false if you want to get the raw response. + * This can be useful if your passing json directly to javascript. + * + * While there are clearly other options there is no need to change them. + * @var array + * @access private + */ + var $_default_call_options; + + /** + * Constructor. + * @param $auth_details array Authentication details to use for API calls. + * This array must take one of the following forms: + * If using OAuth to authenticate: + * array( + * 'access_token' => 'your access token', + * 'refresh_token' => 'your refresh token') + * + * Or if using an API key: + * array('api_key' => 'your api key') + * + * Note that this method will continue to work in the deprecated + * case when $auth_details is passed in as a string containing an + * API key. + * @param $protocol string The protocol to use for requests (http|https) + * @param $debug_level int The level of debugging required CS_REST_LOG_NONE | CS_REST_LOG_ERROR | CS_REST_LOG_WARNING | CS_REST_LOG_VERBOSE + * @param $host string The host to send API requests to. There is no need to change this + * @param $log CS_REST_Log The logger to use. Used for dependency injection + * @param $serialiser The serialiser to use. Used for dependency injection + * @param $transport The transport to use. Used for dependency injection + * @access public + */ + function __construct( + $auth_details, + $protocol = 'https', + $debug_level = CS_REST_LOG_NONE, + $host = CS_HOST, + $log = NULL, + $serialiser = NULL, + $transport = NULL) { + + if (is_string($auth_details)) { + # If $auth_details is a string, assume it is an API key + $auth_details = array('api_key' => $auth_details); + } + + $this->_log = is_null($log) ? new CS_REST_Log($debug_level) : $log; + + $this->_protocol = $protocol; + $this->_base_route = $protocol.'://'.$host.'/api/v3.2/'; + + $this->_log->log_message('Creating wrapper for '.$this->_base_route, get_class($this), CS_REST_LOG_VERBOSE); + + $this->_transport = is_null($transport) ? + CS_REST_TRANSPORT_get_available($this->is_secure(), $this->_log) : + $transport; + + $transport_type = method_exists($this->_transport, 'get_type') ? $this->_transport->get_type() : 'Unknown'; + $this->_log->log_message('Using '.$transport_type.' for transport', get_class($this), CS_REST_LOG_WARNING); + + $this->_serialiser = is_null($serialiser) ? + CS_REST_SERIALISATION_get_available($this->_log) : $serialiser; + + $this->_log->log_message('Using '.$this->_serialiser->get_type().' json serialising', get_class($this), CS_REST_LOG_WARNING); + + $this->_default_call_options = array ( + 'authdetails' => $auth_details, + 'userAgent' => 'createsend-php v'.CS_REST_WRAPPER_VERSION. + ' PHPv'.phpversion().' over '.$transport_type.' with '.$this->_serialiser->get_type(), + 'contentType' => 'application/json; charset=utf-8', + 'deserialise' => true, + 'host' => $host, + 'protocol' => $protocol + ); + + } + + /** + * Refresh the current OAuth token using the current refresh token. + * @access public + */ + function refresh_token() { + if (!isset($this->_default_call_options['authdetails']) || + !isset($this->_default_call_options['authdetails']['refresh_token'])) { + trigger_error( + 'Error refreshing token. There is no refresh token set on this object.', + E_USER_ERROR); + return array(NULL, NULL, NULL); + } + $body = "grant_type=refresh_token&refresh_token=".urlencode( + $this->_default_call_options['authdetails']['refresh_token']); + $options = array('contentType' => 'application/x-www-form-urlencoded'); + $wrap = new CS_REST_Wrapper_Base( + NULL, 'https', CS_REST_LOG_NONE, CS_HOST, NULL, + new CS_REST_DoNothingSerialiser(), NULL); + + $result = $wrap->post_request(CS_OAUTH_TOKEN_URI, $body, $options); + if ($result->was_successful()) { + $access_token = $result->response->access_token; + $expires_in = $result->response->expires_in; + $refresh_token = $result->response->refresh_token; + $this->_default_call_options['authdetails'] = array( + 'access_token' => $access_token, + 'refresh_token' => $refresh_token + ); + return array($access_token, $expires_in, $refresh_token); + } else { + trigger_error( + 'Error refreshing token. '.$result->response->error.': '.$result->response->error_description, + E_USER_ERROR); + return array(NULL, NULL, NULL); + } + } + + /** + * @return boolean True if the wrapper is using SSL. + * @access public + */ + function is_secure() { + return $this->_protocol === 'https'; + } + + function put_request($route, $data, $call_options = array()) { + return $this->_call($call_options, CS_REST_PUT, $route, $data); + } + + function post_request($route, $data, $call_options = array()) { + return $this->_call($call_options, CS_REST_POST, $route, $data); + } + + function delete_request($route, $call_options = array()) { + return $this->_call($call_options, CS_REST_DELETE, $route); + } + + function get_request($route, $include_tracking_pref = NULL, $call_options = array()) { + + if(isset($include_tracking_pref) + && is_bool($include_tracking_pref)) { + $route .= '&includeTrackingPreference='.($include_tracking_pref ? "true" : "false"); + } + + return $this->_call($call_options, CS_REST_GET, $route); + } + + function get_request_with_params($route, $params) { + if(!is_null($params)) { + # http_build_query coerces booleans to 1 and 0, not helpful + foreach($params as $key=>$value) { + if(is_bool($value)) { + $params[$key] = ($value) ? 'true' : 'false'; + } + } + $route = $route . '?' . http_build_query($params); + } + return $this->get_request($route); + } + + function get_request_paged($route, $page_number, $page_size, $order_field, $order_direction, $include_tracking_pref = NULL, + $join_char = 'deprecated') { + // Stores our query values + $query = []; + // Extract any initial queries in the route into our local query + if(strpos($route, '?') !== false) { + $parts = parse_url($route); + $route = current(explode('?', $route)); + if(array_key_exists('query', $parts) && !empty($parts['query'])) { + parse_str($parts['query'], $query); + } + } + // Now selectively add supplied vars to the query + if(!is_null($page_number)) { + $query['page'] = $page_number; + } + if(!is_null($page_size)) { + $query['pageSize'] = $page_size; + } + if(!is_null($order_field)) { + $query['orderField'] = $order_field; + } + if(!is_null($order_direction)) { + $query['orderDirection'] = $order_direction; + } + // If we ended up with a query, add it back to the route + if(!empty($query)) { + $route .= '?'.http_build_query($query); + } + return $this->get_request($route, $include_tracking_pref); + } + + /** + * Internal method to make a general API request based on the provided options + * @param $call_options + * @access private + */ + function _call($call_options, $method, $route, $data = NULL) { + $call_options['route'] = $route; + $call_options['method'] = $method; + + if(!is_null($data)) { + $call_options['data'] = $this->_serialiser->serialise($data); + } + + $call_options = array_merge($this->_default_call_options, $call_options); + $this->_log->log_message('Making '.$call_options['method'].' call to: '.$call_options['route'], get_class($this), CS_REST_LOG_WARNING); + + $call_result = $this->_transport->make_call($call_options); + + $this->_log->log_message('Call result:
'.var_export($call_result, true).'
', + get_class($this), CS_REST_LOG_VERBOSE); + + if($call_options['deserialise']) { + $call_result['response'] = $this->_serialiser->deserialise($call_result['response']); + } + + return new CS_REST_Wrapper_Result($call_result['response'], $call_result['code']); + } + } +} \ No newline at end of file diff --git a/app/api/Campaign_Monitor/class/cacert.pem b/app/api/Campaign_Monitor/class/cacert.pem new file mode 100755 index 0000000..617991f --- /dev/null +++ b/app/api/Campaign_Monitor/class/cacert.pem @@ -0,0 +1,3849 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Thu Jun 28 15:03:08 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.85 $ $Date: 2012/06/28 13:50:18 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +S-TRUST Authentication and Encryption Root CA 2005 PN +===================================================== +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh +cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT +LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w +NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk +ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj +aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp +b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob +4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL +g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf +eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 +KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB +/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv +bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU +D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 +P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA +nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit +F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b +Hz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign CA +========== +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD +EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy +MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp +Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q +ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy +P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN +GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk +YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM +rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy +oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P +AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ +VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 +QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI +mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb +/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG +zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ +VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 +yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa +XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n +0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ +RjXZ+Hxb +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/app/api/Campaign_Monitor/class/exceptions.php b/app/api/Campaign_Monitor/class/exceptions.php new file mode 100755 index 0000000..da6f2ec --- /dev/null +++ b/app/api/Campaign_Monitor/class/exceptions.php @@ -0,0 +1,10 @@ +_level = $level; + } + + function log_message($message, $module, $level) { + if($this->_level >= $level) { + echo date('G:i:s').' - '.$module.': '.$message."
\n"; + } + } + } +} \ No newline at end of file diff --git a/app/api/Campaign_Monitor/class/serialisation.php b/app/api/Campaign_Monitor/class/serialisation.php new file mode 100755 index 0000000..80960c3 --- /dev/null +++ b/app/api/Campaign_Monitor/class/serialisation.php @@ -0,0 +1,136 @@ +log_message('Getting serialiser', __FUNCTION__, CS_REST_LOG_VERBOSE); + if(function_exists('json_decode') && function_exists('json_encode')) { + return new CS_REST_NativeJsonSerialiser($log); + } else { + return new CS_REST_ServicesJsonSerialiser($log); + } + } +} + +if (!class_exists('CS_REST_BaseSerialiser')) { + class CS_REST_BaseSerialiser { + + var $_log; + + function __construct($log) { + $this->_log = $log; + } + + /** + * Recursively ensures that all data values are utf-8 encoded. + * @param array $data All values of this array are checked for utf-8 encoding. + */ + function check_encoding($data) { + + foreach($data as $k => $v) { + // If the element is a sub-array then recusively encode the array + if(is_array($v)) { + $data[$k] = $this->check_encoding($v); + // Otherwise if the element is a string then we need to check the encoding + } else if(is_string($v)) { + if((function_exists('mb_detect_encoding') && mb_detect_encoding($v) !== 'UTF-8') || + (function_exists('mb_check_encoding') && !mb_check_encoding($v, 'UTF-8'))) { + // The string is using some other encoding, make sure we utf-8 encode + $v = utf8_encode($v); + } + + $data[$k] = $v; + } + } + + return $data; + } + } +} + +if (!class_exists('CS_REST_DoNothingSerialiser')) { + class CS_REST_DoNothingSerialiser extends CS_REST_BaseSerialiser { + function __construct() {} + function get_type() { return 'do_nothing'; } + function serialise($data) { return $data; } + function deserialise($text) { + $data = json_decode($text); + return is_null($data) ? $text : $data; + } + function check_encoding($data) { return $data; } + } +} + +if (!class_exists('CS_REST_NativeJsonSerialiser')) { + class CS_REST_NativeJsonSerialiser extends CS_REST_BaseSerialiser { + + function get_format() { + return 'json'; + } + + function get_type() { + return 'native'; + } + + function serialise($data) { + if(is_null($data) || $data == '') return ''; + return json_encode($this->check_encoding($data)); + } + + function deserialise($text) { + $data = json_decode($text); + + return $this->strip_surrounding_quotes(is_null($data) ? $text : $data); + } + + /** + * We've had sporadic reports of people getting ID's from create routes with the surrounding quotes present. + * There is no case where these should be present. Just get rid of it. + */ + function strip_surrounding_quotes($data) { + if(is_string($data)) { + return trim($data, '"'); + } + + return $data; + } + } +} + +if (!class_exists('CS_REST_ServicesJsonSerialiser')) { + class CS_REST_ServicesJsonSerialiser extends CS_REST_BaseSerialiser { + + var $_serialiser; + + function __construct($log) { + parent::__construct($log); + if (!class_exists('Services_JSON', false)) { + require_once dirname(__FILE__).'/services_json.php'; + } + + $this->_serialiser = new Services_JSON(); + } + + function get_content_type() { + return 'application/json'; + } + + function get_format() { + return 'json'; + } + + function get_type() { + return 'services_json'; + } + + function serialise($data) { + if(is_null($data) || $data == '') return ''; + return $this->_serialiser->encode($this->check_encoding($data)); + } + + function deserialise($text) { + $data = $this->_serialiser->decode($text); + + return is_null($data) ? $text : $data; + } + } +} \ No newline at end of file diff --git a/app/api/Campaign_Monitor/class/services_json.php b/app/api/Campaign_Monitor/class/services_json.php new file mode 100755 index 0000000..4555960 --- /dev/null +++ b/app/api/Campaign_Monitor/class/services_json.php @@ -0,0 +1,774 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +defined('SERVICES_JSON_SLICE') or define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +defined('SERVICES_JSON_IN_STR') or define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +defined('SERVICES_JSON_IN_ARR') or define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +defined('SERVICES_JSON_IN_OBJ') or define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +defined('SERVICES_JSON_IN_CMT') or define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +defined('SERVICES_JSON_LOOSE_TYPE') or define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +defined('SERVICES_JSON_SUPPRESS_ERRORS') or define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +if (!class_exists('Services_JSON')) { + class Services_JSON + { + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function __construct($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8[0]) >> 2)) + . chr((0xC0 & (ord($utf8[0]) << 6)) + | (0x3F & ord($utf8[1]))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8[0]) << 4)) + | (0x0F & (ord($utf8[1]) >> 2))) + . chr((0xC0 & (ord($utf8[1]) << 6)) + | (0x7F & ord($utf8[2]))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var[$c]); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var[$c]; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var[$c]; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var[$c + 1])); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2])); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3])); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3]), + ord($var[$c + 4])); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3]), + ord($var[$c + 4]), + ord($var[$c + 5])); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if($this->isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if($this->isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if($this->isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if($this->isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = []; + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs[$c]); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs[++$c]; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs[$c]; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str[0] == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = []; + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = []; + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = []; + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); + + } elseif (($chrs[$c] == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + + } elseif (($chrs[$c] == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + + } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + + } elseif (($chrs[$c] == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + + } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + function isError($data, $code = null) + { + if (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } + } +} + +if (!class_exists('Services_JSON_Error')) { + class Services_JSON_Error + { + function __construct($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } +} + +?> diff --git a/app/api/Campaign_Monitor/class/transport.php b/app/api/Campaign_Monitor/class/transport.php new file mode 100755 index 0000000..eb598aa --- /dev/null +++ b/app/api/Campaign_Monitor/class/transport.php @@ -0,0 +1,352 @@ +log_message('No transport is available', __FUNCTION__, CS_REST_LOG_ERROR); + trigger_error('No transport is available.'. + ($requires_ssl ? ' Try using non-secure (http) mode or ' : ' Please '). + 'ensure the cURL extension is loaded', E_USER_ERROR); + } + } +} + +if(!function_exists("CS_REST_TRANSPORT_can_use_raw_socket")) { + function CS_REST_TRANSPORT_can_use_raw_socket($requires_ssl) { + if(function_exists('fsockopen')) { + if($requires_ssl) { + return extension_loaded('openssl'); + } + + return true; + } + + return false; + } +} + +if (!class_exists('CS_REST_BaseTransport')) { + class CS_REST_BaseTransport { + + var $_log; + + function __construct($log) { + $this->_log = $log; + } + + function split_and_inflate($response, $may_be_compressed) { + $ra = explode("\r\n\r\n", $response); + + $result = array_pop($ra); + $headers = array_pop($ra); + + if($may_be_compressed && preg_match('/^Content-Encoding:\s+gzip\s+$/im', $headers)) { + $original_length = strlen($response); + $result = gzinflate(substr($result, 10, -8)); + + $this->_log->log_message('Inflated gzipped response: '.$original_length.' bytes ->'. + strlen($result).' bytes', get_class(), CS_REST_LOG_VERBOSE); + } + + return array($headers, $result); + } + + } +} +/** + * Provide HTTP request functionality via cURL extensions + * + * @author tobyb + * @since 1.0 + */ +if (!class_exists('CS_REST_CurlTransport')) { + class CS_REST_CurlTransport extends CS_REST_BaseTransport { + + var $_curl_zlib; + + function __construct($log) { + parent::__construct($log); + + $curl_version = curl_version(); + $this->_curl_zlib = isset($curl_version['libz_version']); + } + + /** + * @return string The type of transport used + */ + function get_type() { + return 'cURL'; + } + + function make_call($call_options) { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $call_options['route']); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, true); + $headers = []; + $headers[] = 'Content-Type: '.$call_options['contentType']; + + + if (array_key_exists('authdetails', $call_options) && + isset($call_options['authdetails'])) { + if (array_key_exists('username', $call_options['authdetails']) && + array_key_exists('password', $call_options['authdetails'])) { + # Authenticating using basic auth for retrieving user's API key. + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($ch, CURLOPT_USERPWD, $call_options['authdetails']['username'].':'.$call_options['authdetails']['password']); + } elseif (array_key_exists('access_token', $call_options['authdetails'])) { + # Authenticating using OAuth. + $access_token = $call_options['authdetails']['access_token']; + $headers[] = 'Authorization: Bearer '.$access_token; + } elseif (array_key_exists('api_key', $call_options['authdetails'])) { + # Authenticating using an API key. + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + $api_key = $call_options['authdetails']['api_key']; + curl_setopt($ch, CURLOPT_USERPWD, $api_key.':nopass'); + } + } + + curl_setopt($ch, CURLOPT_USERAGENT, $call_options['userAgent']); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, CS_REST_SOCKET_TIMEOUT); + curl_setopt($ch, CURLOPT_TIMEOUT, CS_REST_CALL_TIMEOUT); + + $inflate_response = false; + if($this->_curl_zlib) { + $this->_log->log_message('curl+zlib support available. Requesting gzipped response.', + get_class($this), CS_REST_LOG_VERBOSE); + curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); + } else if(function_exists('gzinflate')) { + $headers[] = 'Accept-Encoding: gzip'; + $inflate_response = true; + } + + if($call_options['protocol'] === 'https') { + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + + if(strlen(ini_get('curl.cainfo')) === 0) { + curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__).'/cacert.pem'); + } + } + + switch($call_options['method']) { + case CS_REST_PUT: + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, CS_REST_PUT); + $headers[] = 'Content-Length: '.strlen($call_options['data']); + curl_setopt($ch, CURLOPT_POSTFIELDS, $call_options['data']); + break; + case CS_REST_POST: + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, isset($call_options['data']) ? $call_options['data'] : ''); + break; + case CS_REST_DELETE: + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, CS_REST_DELETE); + break; + } + + if(count($headers) > 0) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + $response = curl_exec($ch); + + if(!$response && $response !== '') { + $this->_log->log_message('Error making request with curl_error: '.curl_errno($ch), + get_class($this), CS_REST_LOG_ERROR); + + require_once dirname(__FILE__).'/exceptions.php'; + throw new CurlException(curl_error($ch), curl_errno($ch)); + } + + list( $headers, $result ) = $this->split_and_inflate($response, $inflate_response); + + $this->_log->log_message('API Call Info for '.$call_options['method'].' '. + curl_getinfo($ch, CURLINFO_EFFECTIVE_URL).': '.curl_getinfo($ch, CURLINFO_SIZE_UPLOAD). + ' bytes uploaded. '.curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD).' bytes downloaded'. + ' Total time (seconds): '.curl_getinfo($ch, CURLINFO_TOTAL_TIME), + get_class($this), CS_REST_LOG_VERBOSE); + + $result = array( + 'code' => curl_getinfo($ch, CURLINFO_HTTP_CODE), + 'response' => $result + ); + + curl_close($ch); + + return $result; + } + } +} + +if (!class_exists('CS_REST_SocketWrapper')) { + class CS_REST_SocketWrapper { + var $socket; + + function open($domain, $port) { + $this->socket = fsockopen($domain, $port, $errno, $errstr, CS_REST_SOCKET_TIMEOUT); + + if(!$this->socket) { + die('Error making request with '.$errno.': '.$errstr); + return false; + } else if(function_exists('stream_set_timeout')) { + stream_set_timeout($this->socket, CS_REST_SOCKET_TIMEOUT); + } + + return true; + } + + function write($data) { + fwrite($this->socket, $data); + } + + function read() { + ob_start(); + fpassthru($this->socket); + + return ob_get_clean(); + } + + function close() { + fclose($this->socket); + } + } +} + +if (!class_exists('CS_REST_SocketTransport')) { + class CS_REST_SocketTransport extends CS_REST_BaseTransport { + + var $_socket_wrapper; + + function __construct($log, $socket_wrapper = NULL) { + parent::__construct($log); + + if(is_null($socket_wrapper)) { + $socket_wrapper = new CS_REST_SocketWrapper(); + } + + $this->_socket_wrapper = $socket_wrapper; + } + + /** + * @return string The type of transport used + */ + function get_type() { + return 'Socket'; + } + + function make_call($call_options) { + $start_host = strpos($call_options['route'], $call_options['host']); + $host_len = strlen($call_options['host']); + + $domain = substr($call_options['route'], $start_host, $host_len); + $host = $domain; + $path = substr($call_options['route'], $start_host + $host_len); + $protocol = substr($call_options['route'], 0, $start_host); + $port = 80; + + $this->_log->log_message('Creating socket to '.$domain.' over '.$protocol.' for request to '.$path, + get_class($this), CS_REST_LOG_VERBOSE); + + if($protocol === 'https://') { + $domain = 'ssl://'.$domain; + $port = 443; + } + + if($this->_socket_wrapper->open($domain, $port)) { + $inflate_response = function_exists('gzinflate'); + + $request = $this->_build_request($call_options, $host, $path, $inflate_response); + $this->_log->log_message('Sending
'.$request.'
down the socket', + get_class($this), CS_REST_LOG_VERBOSE); + + $this->_socket_wrapper->write($request); + $response = $this->_socket_wrapper->read(); + $this->_socket_wrapper->close(); + + $this->_log->log_message('API Call Info for '.$call_options['method'].' '. + $call_options['route'].': '.strlen($request). + ' bytes uploaded. '.strlen($response).' bytes downloaded', + get_class($this), CS_REST_LOG_VERBOSE); + + list( $headers, $result ) = $this->split_and_inflate($response, $inflate_response); + + $this->_log->log_message('Received headers
'.$headers.'
', + get_class($this), CS_REST_LOG_VERBOSE); + + return array( + 'code' => $this->_get_status_code($headers), + 'response' => trim($result) + ); + } + } + + function _get_status_code($headers) { + if (preg_match('%^\s*HTTP/1\.1 (?P\d{3})%', $headers, $regs)) { + $this->_log->log_message('Got HTTP Status Code: '.$regs['code'], + get_class($this), CS_REST_LOG_VERBOSE); + return $regs['code']; + } + + $this->_log->log_message('Failed to get HTTP status code from request headers
'.$headers.'
', + get_class($this), CS_REST_LOG_ERROR); + trigger_error('Failed to get HTTP status code from request', E_USER_ERROR); + } + + function _build_request($call_options, $host, $path, $accept_gzip) { + $request_auth_details = ''; + + if (array_key_exists('authdetails', $call_options)) { + if (array_key_exists('username', $call_options['authdetails']) && + array_key_exists('password', $call_options['authdetails'])) { + # Authenticating using basic auth for retrieving user's API key. + $request_auth_details .= 'Authorization: Basic '.base64_encode($call_options['authdetails']['username'].':'.$call_options['authdetails']['password'])."\n"; + } elseif (array_key_exists('access_token', $call_options['authdetails'])) { + # Authenticating using OAuth. + $access_token = $call_options['authdetails']['access_token']; + $request_auth_details .= 'Authorization: Bearer '.$access_token."\n"; + } elseif (array_key_exists('api_key', $call_options['authdetails'])) { + # Authenticating using an API key. + $api_key = $call_options['authdetails']['api_key']; + $request_auth_details .= 'Authorization: Basic '.base64_encode($api_key.':nopass')."\n"; + } + } + + $request = + $call_options['method'].' '.$path." HTTP/1.1\n". + 'Host: '.$host."\n". + $request_auth_details. + 'User-Agent: '.$call_options['userAgent']."\n". + "Connection: Close\n". + 'Content-Type: '.$call_options['contentType']."\n"; + + if($accept_gzip) { + $request .= + "Accept-Encoding: gzip\n"; + } + + if(isset($call_options['data'])) { + $request .= + 'Content-Length: '.strlen($call_options['data'])."\n\n". + $call_options['data']; + } + + return $request."\n\n"; + } + } +} \ No newline at end of file diff --git a/app/api/Campaign_Monitor/csrest_subscribers.php b/app/api/Campaign_Monitor/csrest_subscribers.php new file mode 100755 index 0000000..12a6848 --- /dev/null +++ b/app/api/Campaign_Monitor/csrest_subscribers.php @@ -0,0 +1,235 @@ + 'your access token', + * 'refresh_token' => 'your refresh token') + * + * Or if using an API key: + * array('api_key' => 'your api key') + * @param string $protocol The protocol to use for requests (http|https) + * @param int $debug_level The level of debugging required CS_REST_LOG_NONE | CS_REST_LOG_ERROR | CS_REST_LOG_WARNING | CS_REST_LOG_VERBOSE + * @param string $host The host to send API requests to. There is no need to change this + * @param CS_REST_Log $log The logger to use. Used for dependency injection + * @param object|null $serialiser The serialiser to use. Used for dependency injection + * @param object|null $transport The transport to use. Used for dependency injection + * @access public + */ + function __construct ( + $list_id, + $auth_details, + $protocol = 'https', + $debug_level = CS_REST_LOG_NONE, + $host = 'api.createsend.com', + $log = NULL, + $serialiser = NULL, + $transport = NULL) { + + parent::__construct($auth_details, $protocol, $debug_level, $host, $log, $serialiser, $transport); + $this->set_list_id($list_id); + + } + + /** + * Change the list id used for calls after construction + * @param $list_id + * @access public + */ + function set_list_id($list_id) { + $this->_subscribers_base_route = $this->_base_route.'subscribers/'.$list_id; + } + + /** + * Adds a new subscriber to the specified list + * @param array $subscriber The subscriber details to use during creation. + * This array should be of the form + * array ( + * 'EmailAddress' => The new subscribers email address + * 'Name' => The name of the new subscriber + * 'CustomFields' => array( + * array( + * 'Key' => The custom fields personalisation tag + * 'Value' => The value for this subscriber + * ) + * ) + * 'ConsentToTrack' => Subscriber tracking preference ("yes", "no") + * 'Resubscribe' => Whether we should resubscribe this subscriber if they already exist in the list + * 'RestartSubscriptionBasedAutoResponders' => Whether we should restart subscription based auto responders which are sent when the subscriber first subscribes to a list. + * ) + * @access public + * @return CS_REST_Wrapper_Result A successful response will be empty + */ + function add($subscriber) { + return $this->post_request($this->_subscribers_base_route.'.json', $subscriber); + } + + /** + * Updates an existing subscriber (email, name, state, or custom fields) in the specified list. + * The update is performed even for inactive subscribers, but will return an error in the event of the + * given email not existing in the list. + * @param string $email The email address of the susbcriber to be updated + * @param array $subscriber The subscriber details to use for the update. Empty parameters will remain unchanged + * This array should be of the form + * array ( + * 'EmailAddress' => The new email address + * 'Name' => The name of the subscriber + * 'CustomFields' => array( + * array( + * 'Key' => The custom fields personalisation tag + * 'Value' => The value for this subscriber + * 'Clear' => true/false (pass true to remove this custom field. in the case of a [multi-option, select many] field, pass an option in the 'Value' field to clear that option or leave Value blank to remove all options) + * ) + * ) + * 'ConsentToTrack' => Subscriber tracking preference ("yes", "no") + * 'Resubscribe' => Whether we should resubscribe this subscriber if they already exist in the list + * 'RestartSubscriptionBasedAutoResponders' => Whether we should restart subscription based auto responders which are sent when the subscriber first subscribes to a list. + * ) + * @access public + * @return CS_REST_Wrapper_Result A successful response will be empty + */ + function update($email, $subscriber) { + return $this->put_request($this->_subscribers_base_route.'.json?email='.urlencode($email), $subscriber); + } + + /** + * Imports an array of subscribers into the current list + * @param array $subscribers An array of subscribers to import. + * This array should be of the form + * array ( + * array ( + * 'EmailAddress' => The new subscribers email address + * 'Name' => The name of the new subscriber + * 'CustomFields' => array( + * array( + * 'Key' => The custom fields personalisation tag + * 'Value' => The value for this subscriber + * 'Clear' => true/false (pass true to remove this custom field. in the case of a [multi-option, select many] field, pass an option in the 'Value' field to clear that option or leave Value blank to remove all options) + * ) + * ) + * ) + * ) + * @param bool $resubscribe Whether we should resubscribe any existing subscribers + * @param bool $queueSubscriptionBasedAutoResponders By default, subscription based auto responders do not trigger during an import. Pass a value of true to override this behaviour + * @param bool $restartSubscriptionBasedAutoResponders By default, subscription based auto responders will not be restarted + * @access public + * @return CS_REST_Wrapper_Result A successful response will be an object of the form + * { + * 'TotalUniqueEmailsSubmitted' => The number of unique emails submitted in the call + * 'TotalExistingSubscribers' => The number of subscribers who already existed in the list + * 'TotalNewSubscribers' => The number of new subscriptions to the list + * 'DuplicateEmailsInSubmission' => array The emails which appeared more than once in the batch + * 'FailureDetails' => array ( + * { + * 'EmailAddress' => The email address which failed + * 'Code' => The Create Send API Error code + * 'Message' => The reason for the failure + * } + * ) + * } + * + */ + function import($subscribers, $resubscribe, $queueSubscriptionBasedAutoResponders = false, $restartSubscriptionBasedAutoResponders = false) { + $subscribers = array( + 'Resubscribe' => $resubscribe, + 'QueueSubscriptionBasedAutoResponders' => $queueSubscriptionBasedAutoResponders, + 'Subscribers' => $subscribers, + 'RestartSubscriptionBasedAutoresponders' => $restartSubscriptionBasedAutoResponders + ); + + return $this->post_request($this->_subscribers_base_route.'/import.json', $subscribers); + } + + /** + * Gets a subscriber details, including custom fields + * @access public + * @return CS_REST_Wrapper_Result A successful response will be an object of the form + * { + * 'EmailAddress' => The subscriber email address + * 'Name' => The subscribers name + * 'Date' => The date the subscriber was added to the list + * 'State' => The current state of the subscriber + * 'CustomFields' => array( + * { + * 'Key' => The custom fields personalisation tag + * 'Value' => The custom field value for this subscriber + * } + * ) + * } + */ + function get($email, $include_tracking_pref = NULL) { + return $this->get_request($this->_subscribers_base_route.'.json?email='.urlencode($email), $include_tracking_pref); + } + + /** + * Gets the sending history to a specific subscriber + * @access public + * @return CS_REST_Wrapper_Result A successful response will be an object of the form + * array( + * { + * ID => The id of the email which was sent + * Type => 'Campaign' + * Name => The name of the email + * Actions => array( + * { + * Event => The type of action (Click, Open, Unsubscribe etc) + * Date => The date the event occurred + * IPAddress => The IP that the event originated from + * Detail => Any available details about the event i.e the URL for clicks + * } + * ) + * } + * ) + */ + function get_history($email) { + return $this->get_request($this->_subscribers_base_route.'/history.json?email='.urlencode($email)); + } + + /** + * Unsubscribes the given subscriber from the current list + * @param string $email The email address to unsubscribe + * @access public + * @return CS_REST_Wrapper_Result A successful response will be empty + */ + function unsubscribe($email) { + // We need to build the subscriber data structure. + $email = array( + 'EmailAddress' => $email + ); + + return $this->post_request($this->_subscribers_base_route.'/unsubscribe.json', $email); + } + + /** + * deletes the given subscriber from the current list + * @param string $email The email address to delete + * @access public + * @return CS_REST_Wrapper_Result A successful response will be empty + */ + function delete($email) { + return $this->delete_request($this->_subscribers_base_route.'.json?email='.urlencode($email)); + } + } +} \ No newline at end of file diff --git a/app/api/Google/Auth/Abstract.php b/app/api/Google/Auth/Abstract.php new file mode 100755 index 0000000..52dbed5 --- /dev/null +++ b/app/api/Google/Auth/Abstract.php @@ -0,0 +1,38 @@ + + * + */ +abstract class Google_Auth_Abstract +{ + /** + * An utility function that first calls $this->auth->sign($request) and then + * executes makeRequest() on that signed request. Used for when a request + * should be authenticated + * @param Google_Http_Request $request + * @return Google_Http_Request $request + */ + abstract public function authenticatedRequest(Google_Http_Request $request); + abstract public function sign(Google_Http_Request $request); +} diff --git a/app/api/Google/Auth/AppIdentity.php b/app/api/Google/Auth/AppIdentity.php new file mode 100755 index 0000000..b4ac9ca --- /dev/null +++ b/app/api/Google/Auth/AppIdentity.php @@ -0,0 +1,120 @@ +client = $client; + } + + /** + * Retrieve an access token for the scopes supplied. + */ + public function authenticateForScope($scopes) + { + if ($this->token && $this->tokenScopes == $scopes) { + return $this->token; + } + + $cacheKey = self::CACHE_PREFIX; + if (is_string($scopes)) { + $cacheKey .= $scopes; + } else if (is_array($scopes)) { + $cacheKey .= implode(":", $scopes); + } + + $this->token = $this->client->getCache()->get($cacheKey); + if (!$this->token) { + $this->retrieveToken($scopes, $cacheKey); + } else if ($this->token['expiration_time'] < time()) { + $this->client->getCache()->delete($cacheKey); + $this->retrieveToken($scopes, $cacheKey); + } + + $this->tokenScopes = $scopes; + return $this->token; + } + + /** + * Retrieve a new access token and store it in cache + * @param mixed $scopes + * @param string $cacheKey + */ + private function retrieveToken($scopes, $cacheKey) + { + $this->token = AppIdentityService::getAccessToken($scopes); + if ($this->token) { + $this->client->getCache()->set( + $cacheKey, + $this->token + ); + } + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->client->getIo()->makeRequest($request); + } + + public function sign(Google_Http_Request $request) + { + if (!$this->token) { + // No token, so nothing to do. + return $request; + } + + $this->client->getLogger()->debug('App Identity authentication'); + + // Add the OAuth2 header to the request + $request->setRequestHeaders( + array('Authorization' => 'Bearer ' . $this->token['access_token']) + ); + + return $request; + } +} diff --git a/app/api/Google/Auth/AssertionCredentials.php b/app/api/Google/Auth/AssertionCredentials.php new file mode 100755 index 0000000..a7e5f54 --- /dev/null +++ b/app/api/Google/Auth/AssertionCredentials.php @@ -0,0 +1,136 @@ +serviceAccountName = $serviceAccountName; + $this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes); + $this->privateKey = $privateKey; + $this->privateKeyPassword = $privateKeyPassword; + $this->assertionType = $assertionType; + $this->sub = $sub; + $this->prn = $sub; + $this->useCache = $useCache; + } + + /** + * Generate a unique key to represent this credential. + * @return string + */ + public function getCacheKey() + { + if (!$this->useCache) { + return false; + } + $h = $this->sub; + $h .= $this->assertionType; + $h .= $this->privateKey; + $h .= $this->scopes; + $h .= $this->serviceAccountName; + return md5($h); + } + + public function generateAssertion() + { + $now = time(); + + $jwtParams = array( + 'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI, + 'scope' => $this->scopes, + 'iat' => $now, + 'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS, + 'iss' => $this->serviceAccountName, + ); + + if ($this->sub !== false) { + $jwtParams['sub'] = $this->sub; + } else if ($this->prn !== false) { + $jwtParams['prn'] = $this->prn; + } + + return $this->makeSignedJwt($jwtParams); + } + + /** + * Creates a signed JWT. + * @param array $payload + * @return string The signed JWT. + */ + private function makeSignedJwt($payload) + { + $header = array('typ' => 'JWT', 'alg' => 'RS256'); + + $payload = json_encode($payload); + // Handle some overzealous escaping in PHP json that seemed to cause some errors + // with claimsets. + $payload = str_replace('\/', '/', $payload); + + $segments = array( + Google_Utils::urlSafeB64Encode(json_encode($header)), + Google_Utils::urlSafeB64Encode($payload) + ); + + $signingInput = implode('.', $segments); + $signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword); + $signature = $signer->sign($signingInput); + $segments[] = Google_Utils::urlSafeB64Encode($signature); + + return implode(".", $segments); + } +} diff --git a/app/api/Google/Auth/ComputeEngine.php b/app/api/Google/Auth/ComputeEngine.php new file mode 100755 index 0000000..de9d675 --- /dev/null +++ b/app/api/Google/Auth/ComputeEngine.php @@ -0,0 +1,146 @@ + + */ +class Google_Auth_ComputeEngine extends Google_Auth_Abstract +{ + const METADATA_AUTH_URL = + 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'; + private $client; + private $token; + + public function __construct(Google_Client $client, $config = null) + { + $this->client = $client; + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->client->getIo()->makeRequest($request); + } + + /** + * @param string $token + * @throws Google_Auth_Exception + */ + public function setAccessToken($token) + { + $token = json_decode($token, true); + if ($token == null) { + throw new Google_Auth_Exception('Could not json decode the token'); + } + if (! isset($token['access_token'])) { + throw new Google_Auth_Exception("Invalid token format"); + } + $token['created'] = time(); + $this->token = $token; + } + + public function getAccessToken() + { + return json_encode($this->token); + } + + /** + * Acquires a new access token from the compute engine metadata server. + * @throws Google_Auth_Exception + */ + public function acquireAccessToken() + { + $request = new Google_Http_Request( + self::METADATA_AUTH_URL, + 'GET', + array( + 'Metadata-Flavor' => 'Google' + ) + ); + $request->disableGzip(); + $response = $this->client->getIo()->makeRequest($request); + + if ($response->getResponseHttpCode() == 200) { + $this->setAccessToken($response->getResponseBody()); + $this->token['created'] = time(); + return $this->getAccessToken(); + } else { + throw new Google_Auth_Exception( + sprintf( + "Error fetching service account access token, message: '%s'", + $response->getResponseBody() + ), + $response->getResponseHttpCode() + ); + } + } + + /** + * Include an accessToken in a given apiHttpRequest. + * @param Google_Http_Request $request + * @return Google_Http_Request + * @throws Google_Auth_Exception + */ + public function sign(Google_Http_Request $request) + { + if ($this->isAccessTokenExpired()) { + $this->acquireAccessToken(); + } + + $this->client->getLogger()->debug('Compute engine service account authentication'); + + $request->setRequestHeaders( + array('Authorization' => 'Bearer ' . $this->token['access_token']) + ); + + return $request; + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + if (!$this->token || !isset($this->token['created'])) { + return true; + } + + // If the token is set to expire in the next 30 seconds. + $expired = ($this->token['created'] + + ($this->token['expires_in'] - 30)) < time(); + + return $expired; + } +} diff --git a/app/api/Google/Auth/Exception.php b/app/api/Google/Auth/Exception.php new file mode 100755 index 0000000..61bf52d --- /dev/null +++ b/app/api/Google/Auth/Exception.php @@ -0,0 +1,24 @@ + + */ +class Google_Auth_LoginTicket +{ + const USER_ATTR = "sub"; + + // Information from id token envelope. + private $envelope; + + // Information from id token payload. + private $payload; + + /** + * Creates a user based on the supplied token. + * + * @param string $envelope Header from a verified authentication token. + * @param string $payload Information from a verified authentication token. + */ + public function __construct($envelope, $payload) + { + $this->envelope = $envelope; + $this->payload = $payload; + } + + /** + * Returns the numeric identifier for the user. + * @throws Google_Auth_Exception + * @return + */ + public function getUserId() + { + if (array_key_exists(self::USER_ATTR, $this->payload)) { + return $this->payload[self::USER_ATTR]; + } + throw new Google_Auth_Exception("No user_id in token"); + } + + /** + * Returns attributes from the login ticket. This can contain + * various information about the user session. + * @return array + */ + public function getAttributes() + { + return array("envelope" => $this->envelope, "payload" => $this->payload); + } +} diff --git a/app/api/Google/Auth/OAuth2.php b/app/api/Google/Auth/OAuth2.php new file mode 100755 index 0000000..dde843c --- /dev/null +++ b/app/api/Google/Auth/OAuth2.php @@ -0,0 +1,646 @@ +client = $client; + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->client->getIo()->makeRequest($request); + } + + /** + * @param string $code + * @param boolean $crossClient + * @throws Google_Auth_Exception + * @return string + */ + public function authenticate($code, $crossClient = false) + { + if (strlen($code) == 0) { + throw new Google_Auth_Exception("Invalid code"); + } + + $arguments = array( + 'code' => $code, + 'grant_type' => 'authorization_code', + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'client_secret' => $this->client->getClassConfig($this, 'client_secret') + ); + + if ($crossClient !== true) { + $arguments['redirect_uri'] = $this->client->getClassConfig($this, 'redirect_uri'); + } + + // We got here from the redirect from a successful authorization grant, + // fetch the access token + $request = new Google_Http_Request( + self::OAUTH2_TOKEN_URI, + 'POST', + array(), + $arguments + ); + $request->disableGzip(); + $response = $this->client->getIo()->makeRequest($request); + + if ($response->getResponseHttpCode() == 200) { + $this->setAccessToken($response->getResponseBody()); + $this->token['created'] = time(); + return $this->getAccessToken(); + } else { + $decodedResponse = json_decode($response->getResponseBody(), true); + if ($decodedResponse != null && $decodedResponse['error']) { + $errorText = $decodedResponse['error']; + if (isset($decodedResponse['error_description'])) { + $errorText .= ": " . $decodedResponse['error_description']; + } + } + throw new Google_Auth_Exception( + sprintf( + "Error fetching OAuth2 access token, message: '%s'", + $errorText + ), + $response->getResponseHttpCode() + ); + } + } + + /** + * Create a URL to obtain user authorization. + * The authorization endpoint allows the user to first + * authenticate, and then grant/deny the access request. + * @param string $scope The scope is expressed as a list of space-delimited strings. + * @return string + */ + public function createAuthUrl($scope) + { + $params = array( + 'response_type' => 'code', + 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'), + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'scope' => $scope, + 'access_type' => $this->client->getClassConfig($this, 'access_type'), + ); + + // Prefer prompt to approval prompt. + if ($this->client->getClassConfig($this, 'prompt')) { + $params = $this->maybeAddParam($params, 'prompt'); + } else { + $params = $this->maybeAddParam($params, 'approval_prompt'); + } + $params = $this->maybeAddParam($params, 'login_hint'); + $params = $this->maybeAddParam($params, 'hd'); + $params = $this->maybeAddParam($params, 'openid.realm'); + $params = $this->maybeAddParam($params, 'include_granted_scopes'); + + // If the list of scopes contains plus.login, add request_visible_actions + // to auth URL. + $rva = $this->client->getClassConfig($this, 'request_visible_actions'); + if (strpos($scope, 'plus.login') && strlen($rva) > 0) { + $params['request_visible_actions'] = $rva; + } + + if (isset($this->state)) { + $params['state'] = $this->state; + } + + return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&'); + } + + /** + * @param string $token + * @throws Google_Auth_Exception + */ + public function setAccessToken($token) + { + $token = json_decode($token, true); + if ($token == null) { + throw new Google_Auth_Exception('Could not json decode the token'); + } + if (! isset($token['access_token'])) { + throw new Google_Auth_Exception("Invalid token format"); + } + $this->token = $token; + } + + public function getAccessToken() + { + return json_encode($this->token); + } + + public function getRefreshToken() + { + if (array_key_exists('refresh_token', $this->token)) { + return $this->token['refresh_token']; + } else { + return null; + } + } + + public function setState($state) + { + $this->state = $state; + } + + public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) + { + $this->assertionCredentials = $creds; + } + + /** + * Include an accessToken in a given apiHttpRequest. + * @param Google_Http_Request $request + * @return Google_Http_Request + * @throws Google_Auth_Exception + */ + public function sign(Google_Http_Request $request) + { + // add the developer key to the request before signing it + if ($this->client->getClassConfig($this, 'developer_key')) { + $request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key')); + } + + // Cannot sign the request without an OAuth access token. + if (null == $this->token && null == $this->assertionCredentials) { + return $request; + } + + // Check if the token is set to expire in the next 30 seconds + // (or has already expired). + if ($this->isAccessTokenExpired()) { + if ($this->assertionCredentials) { + $this->refreshTokenWithAssertion(); + } else { + $this->client->getLogger()->debug('OAuth2 access token expired'); + if (! array_key_exists('refresh_token', $this->token)) { + $error = "The OAuth 2.0 access token has expired," + ." and a refresh token is not available. Refresh tokens" + ." are not returned for responses that were auto-approved."; + + $this->client->getLogger()->error($error); + throw new Google_Auth_Exception($error); + } + $this->refreshToken($this->token['refresh_token']); + } + } + + $this->client->getLogger()->debug('OAuth2 authentication'); + + // Add the OAuth2 header to the request + $request->setRequestHeaders( + array('Authorization' => 'Bearer ' . $this->token['access_token']) + ); + + return $request; + } + + /** + * Fetches a fresh access token with the given refresh token. + * @param string $refreshToken + * @return void + */ + public function refreshToken($refreshToken) + { + $this->refreshTokenRequest( + array( + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'client_secret' => $this->client->getClassConfig($this, 'client_secret'), + 'refresh_token' => $refreshToken, + 'grant_type' => 'refresh_token' + ) + ); + } + + /** + * Fetches a fresh access token with a given assertion token. + * @param Google_Auth_AssertionCredentials $assertionCredentials optional. + * @return void + */ + public function refreshTokenWithAssertion($assertionCredentials = null) + { + if (!$assertionCredentials) { + $assertionCredentials = $this->assertionCredentials; + } + + $cacheKey = $assertionCredentials->getCacheKey(); + + if ($cacheKey) { + // We can check whether we have a token available in the + // cache. If it is expired, we can retrieve a new one from + // the assertion. + $token = $this->client->getCache()->get($cacheKey); + if ($token) { + $this->setAccessToken($token); + } + if (!$this->isAccessTokenExpired()) { + return; + } + } + + $this->client->getLogger()->debug('OAuth2 access token expired'); + $this->refreshTokenRequest( + array( + 'grant_type' => 'assertion', + 'assertion_type' => $assertionCredentials->assertionType, + 'assertion' => $assertionCredentials->generateAssertion(), + ) + ); + + if ($cacheKey) { + // Attempt to cache the token. + $this->client->getCache()->set( + $cacheKey, + $this->getAccessToken() + ); + } + } + + private function refreshTokenRequest($params) + { + if (isset($params['assertion'])) { + $this->client->getLogger()->info( + 'OAuth2 access token refresh with Signed JWT assertion grants.' + ); + } else { + $this->client->getLogger()->info('OAuth2 access token refresh'); + } + + $http = new Google_Http_Request( + self::OAUTH2_TOKEN_URI, + 'POST', + array(), + $params + ); + $http->disableGzip(); + $request = $this->client->getIo()->makeRequest($http); + + $code = $request->getResponseHttpCode(); + $body = $request->getResponseBody(); + if (200 == $code) { + $token = json_decode($body, true); + if ($token == null) { + throw new Google_Auth_Exception("Could not json decode the access token"); + } + + if (! isset($token['access_token']) || ! isset($token['expires_in'])) { + throw new Google_Auth_Exception("Invalid token format"); + } + + if (isset($token['id_token'])) { + $this->token['id_token'] = $token['id_token']; + } + $this->token['access_token'] = $token['access_token']; + $this->token['expires_in'] = $token['expires_in']; + $this->token['created'] = time(); + } else { + throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code); + } + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) + { + if (!$token) { + if (!$this->token) { + // Not initialized, no token to actually revoke + return false; + } elseif (array_key_exists('refresh_token', $this->token)) { + $token = $this->token['refresh_token']; + } else { + $token = $this->token['access_token']; + } + } + $request = new Google_Http_Request( + self::OAUTH2_REVOKE_URI, + 'POST', + array(), + "token=$token" + ); + $request->disableGzip(); + $response = $this->client->getIo()->makeRequest($request); + $code = $response->getResponseHttpCode(); + if ($code == 200) { + $this->token = null; + return true; + } + + return false; + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + if (!$this->token || !isset($this->token['created'])) { + return true; + } + + // If the token is set to expire in the next 30 seconds. + $expired = ($this->token['created'] + + ($this->token['expires_in'] - 30)) < time(); + + return $expired; + } + + // Gets federated sign-on certificates to use for verifying identity tokens. + // Returns certs as array structure, where keys are key ids, and values + // are PEM encoded certificates. + private function getFederatedSignOnCerts() + { + return $this->retrieveCertsFromLocation( + $this->client->getClassConfig($this, 'federated_signon_certs_url') + ); + } + + /** + * Retrieve and cache a certificates file. + * + * @param $url string location + * @throws Google_Auth_Exception + * @return array certificates + */ + public function retrieveCertsFromLocation($url) + { + // If we're retrieving a local file, just grab it. + if ("http" != substr($url, 0, 4)) { + $file = file_get_contents($url); + if ($file) { + return json_decode($file, true); + } else { + throw new Google_Auth_Exception( + "Failed to retrieve verification certificates: '" . + $url . "'." + ); + } + } + + // This relies on makeRequest caching certificate responses. + $request = $this->client->getIo()->makeRequest( + new Google_Http_Request( + $url + ) + ); + if ($request->getResponseHttpCode() == 200) { + $certs = json_decode($request->getResponseBody(), true); + if ($certs) { + return $certs; + } + } + throw new Google_Auth_Exception( + "Failed to retrieve verification certificates: '" . + $request->getResponseBody() . "'.", + $request->getResponseHttpCode() + ); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * + * @param $id_token + * @param $audience + * @return Google_Auth_LoginTicket + */ + public function verifyIdToken($id_token = null, $audience = null) + { + if (!$id_token) { + $id_token = $this->token['id_token']; + } + $certs = $this->getFederatedSignonCerts(); + if (!$audience) { + $audience = $this->client->getClassConfig($this, 'client_id'); + } + + return $this->verifySignedJwtWithCerts( + $id_token, + $certs, + $audience, + array(self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS) + ); + } + + /** + * Verifies the id token, returns the verified token contents. + * + * @param $jwt string the token + * @param $certs array of certificates + * @param $required_audience string the expected consumer of the token + * @param [$issuer] the expected issues, defaults to Google + * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS + * @throws Google_Auth_Exception + * @return mixed token information if valid, false if not + */ + public function verifySignedJwtWithCerts( + $jwt, + $certs, + $required_audience, + $issuer = null, + $max_expiry = null + ) { + if (!$max_expiry) { + // Set the maximum time we will accept a token for. + $max_expiry = self::MAX_TOKEN_LIFETIME_SECS; + } + + $segments = explode(".", $jwt); + if (count($segments) != 3) { + throw new Google_Auth_Exception("Wrong number of segments in token: $jwt"); + } + $signed = $segments[0] . "." . $segments[1]; + $signature = Google_Utils::urlSafeB64Decode($segments[2]); + + // Parse envelope. + $envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true); + if (!$envelope) { + throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]); + } + + // Parse token + $json_body = Google_Utils::urlSafeB64Decode($segments[1]); + $payload = json_decode($json_body, true); + if (!$payload) { + throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]); + } + + // Check signature + $verified = false; + foreach ($certs as $keyName => $pem) { + $public_key = new Google_Verifier_Pem($pem); + if ($public_key->verify($signed, $signature)) { + $verified = true; + break; + } + } + + if (!$verified) { + throw new Google_Auth_Exception("Invalid token signature: $jwt"); + } + + // Check issued-at timestamp + $iat = 0; + if (array_key_exists("iat", $payload)) { + $iat = $payload["iat"]; + } + if (!$iat) { + throw new Google_Auth_Exception("No issue time in token: $json_body"); + } + $earliest = $iat - self::CLOCK_SKEW_SECS; + + // Check expiration timestamp + $now = time(); + $exp = 0; + if (array_key_exists("exp", $payload)) { + $exp = $payload["exp"]; + } + if (!$exp) { + throw new Google_Auth_Exception("No expiration time in token: $json_body"); + } + if ($exp >= $now + $max_expiry) { + throw new Google_Auth_Exception( + sprintf("Expiration time too far in future: %s", $json_body) + ); + } + + $latest = $exp + self::CLOCK_SKEW_SECS; + if ($now < $earliest) { + throw new Google_Auth_Exception( + sprintf( + "Token used too early, %s < %s: %s", + $now, + $earliest, + $json_body + ) + ); + } + if ($now > $latest) { + throw new Google_Auth_Exception( + sprintf( + "Token used too late, %s > %s: %s", + $now, + $latest, + $json_body + ) + ); + } + + // support HTTP and HTTPS issuers + // @see https://developers.google.com/identity/sign-in/web/backend-auth + $iss = $payload['iss']; + if ($issuer && !in_array($iss, (array) $issuer)) { + throw new Google_Auth_Exception( + sprintf( + "Invalid issuer, %s not in %s: %s", + $iss, + "[".implode(",", (array) $issuer)."]", + $json_body + ) + ); + } + + // Check audience + $aud = $payload["aud"]; + if ($aud != $required_audience) { + throw new Google_Auth_Exception( + sprintf( + "Wrong recipient, %s != %s:", + $aud, + $required_audience, + $json_body + ) + ); + } + + // All good. + return new Google_Auth_LoginTicket($envelope, $payload); + } + + /** + * Add a parameter to the auth params if not empty string. + */ + private function maybeAddParam($params, $name) + { + $param = $this->client->getClassConfig($this, $name); + if ($param != '') { + $params[$name] = $param; + } + return $params; + } +} diff --git a/app/api/Google/Auth/Simple.php b/app/api/Google/Auth/Simple.php new file mode 100755 index 0000000..cee5976 --- /dev/null +++ b/app/api/Google/Auth/Simple.php @@ -0,0 +1,63 @@ +client = $client; + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->io->makeRequest($request); + } + + public function sign(Google_Http_Request $request) + { + $key = $this->client->getClassConfig($this, 'developer_key'); + if ($key) { + $this->client->getLogger()->debug( + 'Simple API Access developer key authentication' + ); + $request->setQueryParam('key', $key); + } + return $request; + } +} diff --git a/app/api/Google/Cache/Abstract.php b/app/api/Google/Cache/Abstract.php new file mode 100755 index 0000000..e6c7530 --- /dev/null +++ b/app/api/Google/Cache/Abstract.php @@ -0,0 +1,53 @@ + + */ +abstract class Google_Cache_Abstract +{ + + abstract public function __construct(Google_Client $client); + + /** + * Retrieves the data for the given key, or false if they + * key is unknown or expired + * + * @param String $key The key who's data to retrieve + * @param boolean|int $expiration Expiration time in seconds + * + */ + abstract public function get($key, $expiration = false); + + /** + * Store the key => $value set. The $value is serialized + * by this function so can be of any type + * + * @param string $key Key of the data + * @param string $value data + */ + abstract public function set($key, $value); + + /** + * Removes the key/data pair for the given $key + * + * @param String $key + */ + abstract public function delete($key); +} diff --git a/app/api/Google/Cache/Apc.php b/app/api/Google/Cache/Apc.php new file mode 100755 index 0000000..d3a8db1 --- /dev/null +++ b/app/api/Google/Cache/Apc.php @@ -0,0 +1,113 @@ + + */ +class Google_Cache_Apc extends Google_Cache_Abstract +{ + /** + * @var Google_Client the current client + */ + private $client; + + public function __construct(Google_Client $client) + { + if (! function_exists('apc_add') ) { + $error = "Apc functions not available"; + + $client->getLogger()->error($error); + throw new Google_Cache_Exception($error); + } + + $this->client = $client; + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) + { + $ret = apc_fetch($key); + if ($ret === false) { + $this->client->getLogger()->debug( + 'APC cache miss', + array('key' => $key) + ); + return false; + } + if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { + $this->client->getLogger()->debug( + 'APC cache miss (expired)', + array('key' => $key, 'var' => $ret) + ); + $this->delete($key); + return false; + } + + $this->client->getLogger()->debug( + 'APC cache hit', + array('key' => $key, 'var' => $ret) + ); + + return $ret['data']; + } + + /** + * @inheritDoc + */ + public function set($key, $value) + { + $var = array('time' => time(), 'data' => $value); + $rc = apc_store($key, $var); + + if ($rc == false) { + $this->client->getLogger()->error( + 'APC cache set failed', + array('key' => $key, 'var' => $var) + ); + throw new Google_Cache_Exception("Couldn't store data"); + } + + $this->client->getLogger()->debug( + 'APC cache set', + array('key' => $key, 'var' => $var) + ); + } + + /** + * @inheritDoc + * @param String $key + */ + public function delete($key) + { + $this->client->getLogger()->debug( + 'APC cache delete', + array('key' => $key) + ); + apc_delete($key); + } +} diff --git a/app/api/Google/Cache/Exception.php b/app/api/Google/Cache/Exception.php new file mode 100755 index 0000000..32030c0 --- /dev/null +++ b/app/api/Google/Cache/Exception.php @@ -0,0 +1,24 @@ + + */ +class Google_Cache_File extends Google_Cache_Abstract +{ + const MAX_LOCK_RETRIES = 10; + private $path; + private $fh; + + /** + * @var Google_Client the current client + */ + private $client; + + public function __construct(Google_Client $client) + { + $this->client = $client; + $this->path = $this->client->getClassConfig($this, 'directory'); + } + + public function get($key, $expiration = false) + { + $storageFile = $this->getCacheFile($key); + $data = false; + + if (!file_exists($storageFile)) { + $this->client->getLogger()->debug( + 'File cache miss', + array('key' => $key, 'file' => $storageFile) + ); + return false; + } + + if ($expiration) { + $mtime = filemtime($storageFile); + if ((time() - $mtime) >= $expiration) { + $this->client->getLogger()->debug( + 'File cache miss (expired)', + array('key' => $key, 'file' => $storageFile) + ); + $this->delete($key); + return false; + } + } + + if ($this->acquireReadLock($storageFile)) { + if (filesize($storageFile) > 0) { + $data = fread($this->fh, filesize($storageFile)); + $data = unserialize($data); + } else { + $this->client->getLogger()->debug( + 'Cache file was empty', + array('file' => $storageFile) + ); + } + $this->unlock($storageFile); + } + + $this->client->getLogger()->debug( + 'File cache hit', + array('key' => $key, 'file' => $storageFile, 'var' => $data) + ); + + return $data; + } + + public function set($key, $value) + { + $storageFile = $this->getWriteableCacheFile($key); + if ($this->acquireWriteLock($storageFile)) { + // We serialize the whole request object, since we don't only want the + // responseContent but also the postBody used, headers, size, etc. + $data = serialize($value); + $result = fwrite($this->fh, $data); + $this->unlock($storageFile); + + $this->client->getLogger()->debug( + 'File cache set', + array('key' => $key, 'file' => $storageFile, 'var' => $value) + ); + } else { + $this->client->getLogger()->notice( + 'File cache set failed', + array('key' => $key, 'file' => $storageFile) + ); + } + } + + public function delete($key) + { + $file = $this->getCacheFile($key); + if (file_exists($file) && !unlink($file)) { + $this->client->getLogger()->error( + 'File cache delete failed', + array('key' => $key, 'file' => $file) + ); + throw new Google_Cache_Exception("Cache file could not be deleted"); + } + + $this->client->getLogger()->debug( + 'File cache delete', + array('key' => $key, 'file' => $file) + ); + } + + private function getWriteableCacheFile($file) + { + return $this->getCacheFile($file, true); + } + + private function getCacheFile($file, $forWrite = false) + { + return $this->getCacheDir($file, $forWrite) . '/' . md5($file); + } + + private function getCacheDir($file, $forWrite) + { + // use the first 2 characters of the hash as a directory prefix + // this should prevent slowdowns due to huge directory listings + // and thus give some basic amount of scalability + $storageDir = $this->path . '/' . substr(md5($file), 0, 2); + if ($forWrite && ! is_dir($storageDir)) { + if (! mkdir($storageDir, 0700, true)) { + $this->client->getLogger()->error( + 'File cache creation failed', + array('dir' => $storageDir) + ); + throw new Google_Cache_Exception("Could not create storage directory: $storageDir"); + } + } + return $storageDir; + } + + private function acquireReadLock($storageFile) + { + return $this->acquireLock(LOCK_SH, $storageFile); + } + + private function acquireWriteLock($storageFile) + { + $rc = $this->acquireLock(LOCK_EX, $storageFile); + if (!$rc) { + $this->client->getLogger()->notice( + 'File cache write lock failed', + array('file' => $storageFile) + ); + $this->delete($storageFile); + } + return $rc; + } + + private function acquireLock($type, $storageFile) + { + $mode = $type == LOCK_EX ? "w" : "r"; + $this->fh = fopen($storageFile, $mode); + if (!$this->fh) { + $this->client->getLogger()->error( + 'Failed to open file during lock acquisition', + array('file' => $storageFile) + ); + return false; + } + if ($type == LOCK_EX) { + chmod($storageFile, 0600); + } + $count = 0; + while (!flock($this->fh, $type | LOCK_NB)) { + // Sleep for 10ms. + usleep(10000); + if (++$count < self::MAX_LOCK_RETRIES) { + return false; + } + } + return true; + } + + public function unlock($storageFile) + { + if ($this->fh) { + flock($this->fh, LOCK_UN); + } + } +} diff --git a/app/api/Google/Cache/Memcache.php b/app/api/Google/Cache/Memcache.php new file mode 100755 index 0000000..b6510b4 --- /dev/null +++ b/app/api/Google/Cache/Memcache.php @@ -0,0 +1,184 @@ + + */ +class Google_Cache_Memcache extends Google_Cache_Abstract +{ + private $connection = false; + private $mc = false; + private $host; + private $port; + + /** + * @var Google_Client the current client + */ + private $client; + + public function __construct(Google_Client $client) + { + if (!function_exists('memcache_connect') && !class_exists("Memcached")) { + $error = "Memcache functions not available"; + + $client->getLogger()->error($error); + throw new Google_Cache_Exception($error); + } + + $this->client = $client; + + if ($client->isAppEngine()) { + // No credentials needed for GAE. + $this->mc = new Memcached(); + $this->connection = true; + } else { + $this->host = $client->getClassConfig($this, 'host'); + $this->port = $client->getClassConfig($this, 'port'); + if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) { + $error = "You need to supply a valid memcache host and port"; + + $client->getLogger()->error($error); + throw new Google_Cache_Exception($error); + } + } + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) + { + $this->connect(); + $ret = false; + if ($this->mc) { + $ret = $this->mc->get($key); + } else { + $ret = memcache_get($this->connection, $key); + } + if ($ret === false) { + $this->client->getLogger()->debug( + 'Memcache cache miss', + array('key' => $key) + ); + return false; + } + if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { + $this->client->getLogger()->debug( + 'Memcache cache miss (expired)', + array('key' => $key, 'var' => $ret) + ); + $this->delete($key); + return false; + } + + $this->client->getLogger()->debug( + 'Memcache cache hit', + array('key' => $key, 'var' => $ret) + ); + + return $ret['data']; + } + + /** + * @inheritDoc + * @param string $key + * @param string $value + * @throws Google_Cache_Exception + */ + public function set($key, $value) + { + $this->connect(); + // we store it with the cache_time default expiration so objects will at + // least get cleaned eventually. + $data = array('time' => time(), 'data' => $value); + $rc = false; + if ($this->mc) { + $rc = $this->mc->set($key, $data); + } else { + $rc = memcache_set($this->connection, $key, $data, false); + } + if ($rc == false) { + $this->client->getLogger()->error( + 'Memcache cache set failed', + array('key' => $key, 'var' => $data) + ); + + throw new Google_Cache_Exception("Couldn't store data in cache"); + } + + $this->client->getLogger()->debug( + 'Memcache cache set', + array('key' => $key, 'var' => $data) + ); + } + + /** + * @inheritDoc + * @param String $key + */ + public function delete($key) + { + $this->connect(); + if ($this->mc) { + $this->mc->delete($key, 0); + } else { + memcache_delete($this->connection, $key, 0); + } + + $this->client->getLogger()->debug( + 'Memcache cache delete', + array('key' => $key) + ); + } + + /** + * Lazy initialiser for memcache connection. Uses pconnect for to take + * advantage of the persistence pool where possible. + */ + private function connect() + { + if ($this->connection) { + return; + } + + if (class_exists("Memcached")) { + $this->mc = new Memcached(); + $this->mc->addServer($this->host, $this->port); + $this->connection = true; + } else { + $this->connection = memcache_pconnect($this->host, $this->port); + } + + if (! $this->connection) { + $error = "Couldn't connect to memcache server"; + + $this->client->getLogger()->error($error); + throw new Google_Cache_Exception($error); + } + } +} diff --git a/app/api/Google/Cache/Null.php b/app/api/Google/Cache/Null.php new file mode 100755 index 0000000..c30dc6d --- /dev/null +++ b/app/api/Google/Cache/Null.php @@ -0,0 +1,57 @@ +isAppEngine()) { + // Automatically use Memcache if we're in AppEngine. + $config->setCacheClass('Google_Cache_Memcache'); + } + + if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) { + // Automatically disable compress.zlib, as currently unsupported. + $config->setClassConfig('Google_Http_Request', 'disable_gzip', true); + } + } + + if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) { + if (function_exists('curl_version') && function_exists('curl_exec') + && !$this->isAppEngine()) { + $config->setIoClass("Google_IO_Curl"); + } else { + $config->setIoClass("Google_IO_Stream"); + } + } + + $this->config = $config; + } + + /** + * Get a string containing the version of the library. + * + * @return string + */ + public function getLibraryVersion() + { + return self::LIBVER; + } + + /** + * Attempt to exchange a code for an valid authentication token. + * If $crossClient is set to true, the request body will not include + * the request_uri argument + * Helper wrapped around the OAuth 2.0 implementation. + * + * @param $code string code from accounts.google.com + * @param $crossClient boolean, whether this is a cross-client authentication + * @return string token + */ + public function authenticate($code, $crossClient = false) + { + $this->authenticated = true; + return $this->getAuth()->authenticate($code, $crossClient); + } + + /** + * Loads a service account key and parameters from a JSON + * file from the Google Developer Console. Uses that and the + * given array of scopes to return an assertion credential for + * use with refreshTokenWithAssertionCredential. + * + * @param string $jsonLocation File location of the project-key.json. + * @param array $scopes The scopes to assert. + * @return Google_Auth_AssertionCredentials. + * @ + */ + public function loadServiceAccountJson($jsonLocation, $scopes) + { + $data = json_decode(file_get_contents($jsonLocation)); + if (isset($data->type) && $data->type == 'service_account') { + // Service Account format. + $cred = new Google_Auth_AssertionCredentials( + $data->client_email, + $scopes, + $data->private_key + ); + return $cred; + } else { + throw new Google_Exception("Invalid service account JSON file."); + } + } + + /** + * Set the auth config from the JSON string provided. + * This structure should match the file downloaded from + * the "Download JSON" button on in the Google Developer + * Console. + * @param string $json the configuration json + * @throws Google_Exception + */ + public function setAuthConfig($json) + { + $data = json_decode($json); + $key = isset($data->installed) ? 'installed' : 'web'; + if (!isset($data->$key)) { + throw new Google_Exception("Invalid client secret JSON file."); + } + $this->setClientId($data->$key->client_id); + $this->setClientSecret($data->$key->client_secret); + if (isset($data->$key->redirect_uris)) { + $this->setRedirectUri($data->$key->redirect_uris[0]); + } + } + + /** + * Set the auth config from the JSON file in the path + * provided. This should match the file downloaded from + * the "Download JSON" button on in the Google Developer + * Console. + * @param string $file the file location of the client json + */ + public function setAuthConfigFile($file) + { + $this->setAuthConfig(file_get_contents($file)); + } + + /** + * @throws Google_Auth_Exception + * @return array + * @visible For Testing + */ + public function prepareScopes() + { + if (empty($this->requestedScopes)) { + throw new Google_Auth_Exception("No scopes specified"); + } + $scopes = implode(' ', $this->requestedScopes); + return $scopes; + } + + /** + * Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl() + * or Google_Client#getAccessToken(). + * @param string $accessToken JSON encoded string containing in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600, "id_token":"TOKEN", "created":1320790426} + */ + public function setAccessToken($accessToken) + { + if ($accessToken == 'null') { + $accessToken = null; + } + $this->getAuth()->setAccessToken($accessToken); + } + + + + /** + * Set the authenticator object + * @param Google_Auth_Abstract $auth + */ + public function setAuth(Google_Auth_Abstract $auth) + { + $this->config->setAuthClass(get_class($auth)); + $this->auth = $auth; + } + + /** + * Set the IO object + * @param Google_IO_Abstract $io + */ + public function setIo(Google_IO_Abstract $io) + { + $this->config->setIoClass(get_class($io)); + $this->io = $io; + } + + /** + * Set the Cache object + * @param Google_Cache_Abstract $cache + */ + public function setCache(Google_Cache_Abstract $cache) + { + $this->config->setCacheClass(get_class($cache)); + $this->cache = $cache; + } + + /** + * Set the Logger object + * @param Google_Logger_Abstract $logger + */ + public function setLogger(Google_Logger_Abstract $logger) + { + $this->config->setLoggerClass(get_class($logger)); + $this->logger = $logger; + } + + /** + * Construct the OAuth 2.0 authorization request URI. + * @return string + */ + public function createAuthUrl() + { + $scopes = $this->prepareScopes(); + return $this->getAuth()->createAuthUrl($scopes); + } + + /** + * Get the OAuth 2.0 access token. + * @return string $accessToken JSON encoded string in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600,"id_token":"TOKEN", "created":1320790426} + */ + public function getAccessToken() + { + $token = $this->getAuth()->getAccessToken(); + // The response is json encoded, so could be the string null. + // It is arguable whether this check should be here or lower + // in the library. + return (null == $token || 'null' == $token || '[]' == $token) ? null : $token; + } + + /** + * Get the OAuth 2.0 refresh token. + * @return string $refreshToken refresh token or null if not available + */ + public function getRefreshToken() + { + return $this->getAuth()->getRefreshToken(); + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + return $this->getAuth()->isAccessTokenExpired(); + } + + /** + * Set OAuth 2.0 "state" parameter to achieve per-request customization. + * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 + * @param string $state + */ + public function setState($state) + { + $this->getAuth()->setState($state); + } + + /** + * @param string $accessType Possible values for access_type include: + * {@code "offline"} to request offline access from the user. + * {@code "online"} to request online access from the user. + */ + public function setAccessType($accessType) + { + $this->config->setAccessType($accessType); + } + + /** + * @param string $approvalPrompt Possible values for approval_prompt include: + * {@code "force"} to force the approval UI to appear. (This is the default value) + * {@code "auto"} to request auto-approval when possible. + */ + public function setApprovalPrompt($approvalPrompt) + { + $this->config->setApprovalPrompt($approvalPrompt); + } + + /** + * Set the login hint, email address or sub id. + * @param string $loginHint + */ + public function setLoginHint($loginHint) + { + $this->config->setLoginHint($loginHint); + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $applicationName + */ + public function setApplicationName($applicationName) + { + $this->config->setApplicationName($applicationName); + } + + /** + * Set the OAuth 2.0 Client ID. + * @param string $clientId + */ + public function setClientId($clientId) + { + $this->config->setClientId($clientId); + } + + /** + * Set the OAuth 2.0 Client Secret. + * @param string $clientSecret + */ + public function setClientSecret($clientSecret) + { + $this->config->setClientSecret($clientSecret); + } + + /** + * Set the OAuth 2.0 Redirect URI. + * @param string $redirectUri + */ + public function setRedirectUri($redirectUri) + { + $this->config->setRedirectUri($redirectUri); + } + + /** + * If 'plus.login' is included in the list of requested scopes, you can use + * this method to define types of app activities that your app will write. + * You can find a list of available types here: + * @link https://developers.google.com/+/api/moment-types + * + * @param array $requestVisibleActions Array of app activity types + */ + public function setRequestVisibleActions($requestVisibleActions) + { + if (is_array($requestVisibleActions)) { + $requestVisibleActions = join(" ", $requestVisibleActions); + } + $this->config->setRequestVisibleActions($requestVisibleActions); + } + + /** + * Set the developer key to use, these are obtained through the API Console. + * @see http://code.google.com/apis/console-help/#generatingdevkeys + * @param string $developerKey + */ + public function setDeveloperKey($developerKey) + { + $this->config->setDeveloperKey($developerKey); + } + + /** + * Set the hd (hosted domain) parameter streamlines the login process for + * Google Apps hosted accounts. By including the domain of the user, you + * restrict sign-in to accounts at that domain. + * @param $hd string - the domain to use. + */ + public function setHostedDomain($hd) + { + $this->config->setHostedDomain($hd); + } + + /** + * Set the prompt hint. Valid values are none, consent and select_account. + * If no value is specified and the user has not previously authorized + * access, then the user is shown a consent screen. + * @param $prompt string + */ + public function setPrompt($prompt) + { + $this->config->setPrompt($prompt); + } + + /** + * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth + * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which + * an authentication request is valid. + * @param $realm string - the URL-space to use. + */ + public function setOpenidRealm($realm) + { + $this->config->setOpenidRealm($realm); + } + + /** + * If this is provided with the value true, and the authorization request is + * granted, the authorization will include any previous authorizations + * granted to this user/application combination for other scopes. + * @param $include boolean - the URL-space to use. + */ + public function setIncludeGrantedScopes($include) + { + $this->config->setIncludeGrantedScopes($include); + } + + /** + * Fetches a fresh OAuth 2.0 access token with the given refresh token. + * @param string $refreshToken + */ + public function refreshToken($refreshToken) + { + $this->getAuth()->refreshToken($refreshToken); + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) + { + return $this->getAuth()->revokeToken($token); + } + + /** + * Verify an id_token. This method will verify the current id_token, if one + * isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (id_token) that should be verified. + * @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was + * successful. + */ + public function verifyIdToken($token = null) + { + return $this->getAuth()->verifyIdToken($token); + } + + /** + * Verify a JWT that was signed with your own certificates. + * + * @param $id_token string The JWT token + * @param $cert_location array of certificates + * @param $audience string the expected consumer of the token + * @param $issuer string the expected issuer, defaults to Google + * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS + * @return mixed token information if valid, false if not + */ + public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null) + { + $auth = new Google_Auth_OAuth2($this); + $certs = $auth->retrieveCertsFromLocation($cert_location); + return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry); + } + + /** + * @param $creds Google_Auth_AssertionCredentials + */ + public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) + { + $this->getAuth()->setAssertionCredentials($creds); + } + + /** + * Set the scopes to be requested. Must be called before createAuthUrl(). + * Will remove any previously configured scopes. + * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login', + * 'https://www.googleapis.com/auth/moderator') + */ + public function setScopes($scopes) + { + $this->requestedScopes = []; + $this->addScope($scopes); + } + + /** + * This functions adds a scope to be requested as part of the OAuth2.0 flow. + * Will append any scopes not previously requested to the scope parameter. + * A single string will be treated as a scope to request. An array of strings + * will each be appended. + * @param $scope_or_scopes string|array e.g. "profile" + */ + public function addScope($scope_or_scopes) + { + if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) { + $this->requestedScopes[] = $scope_or_scopes; + } else if (is_array($scope_or_scopes)) { + foreach ($scope_or_scopes as $scope) { + $this->addScope($scope); + } + } + } + + /** + * Returns the list of scopes requested by the client + * @return array the list of scopes + * + */ + public function getScopes() + { + return $this->requestedScopes; + } + + /** + * Declare whether batch calls should be used. This may increase throughput + * by making multiple requests in one connection. + * + * @param boolean $useBatch True if the batch support should + * be enabled. Defaults to False. + */ + public function setUseBatch($useBatch) + { + // This is actually an alias for setDefer. + $this->setDefer($useBatch); + } + + /** + * Declare whether making API calls should make the call immediately, or + * return a request which can be called with ->execute(); + * + * @param boolean $defer True if calls should not be executed right away. + */ + public function setDefer($defer) + { + $this->deferExecution = $defer; + } + + /** + * Helper method to execute deferred HTTP requests. + * + * @param $request Google_Http_Request|Google_Http_Batch + * @throws Google_Exception + * @return object of the type of the expected class or array. + */ + public function execute($request) + { + if ($request instanceof Google_Http_Request) { + $request->setUserAgent( + $this->getApplicationName() + . " " . self::USER_AGENT_SUFFIX + . $this->getLibraryVersion() + ); + if (!$this->getClassConfig("Google_Http_Request", "disable_gzip")) { + $request->enableGzip(); + } + $request->maybeMoveParametersToBody(); + return Google_Http_REST::execute($this, $request); + } else if ($request instanceof Google_Http_Batch) { + return $request->execute(); + } else { + throw new Google_Exception("Do not know how to execute this type of object."); + } + } + + /** + * Whether or not to return raw requests + * @return boolean + */ + public function shouldDefer() + { + return $this->deferExecution; + } + + /** + * @return Google_Auth_Abstract Authentication implementation + */ + public function getAuth() + { + if (!isset($this->auth)) { + $class = $this->config->getAuthClass(); + $this->auth = new $class($this); + } + return $this->auth; + } + + /** + * @return Google_IO_Abstract IO implementation + */ + public function getIo() + { + if (!isset($this->io)) { + $class = $this->config->getIoClass(); + $this->io = new $class($this); + } + return $this->io; + } + + /** + * @return Google_Cache_Abstract Cache implementation + */ + public function getCache() + { + if (!isset($this->cache)) { + $class = $this->config->getCacheClass(); + $this->cache = new $class($this); + } + return $this->cache; + } + + /** + * @return Google_Logger_Abstract Logger implementation + */ + public function getLogger() + { + if (!isset($this->logger)) { + $class = $this->config->getLoggerClass(); + $this->logger = new $class($this); + } + return $this->logger; + } + + /** + * Retrieve custom configuration for a specific class. + * @param $class string|object - class or instance of class to retrieve + * @param $key string optional - key to retrieve + * @return array + */ + public function getClassConfig($class, $key = null) + { + if (!is_string($class)) { + $class = get_class($class); + } + return $this->config->getClassConfig($class, $key); + } + + /** + * Set configuration specific to a given class. + * $config->setClassConfig('Google_Cache_File', + * array('directory' => '/tmp/cache')); + * @param $class string|object - The class name for the configuration + * @param $config string key or an array of configuration values + * @param $value string optional - if $config is a key, the value + * + */ + public function setClassConfig($class, $config, $value = null) + { + if (!is_string($class)) { + $class = get_class($class); + } + $this->config->setClassConfig($class, $config, $value); + + } + + /** + * @return string the base URL to use for calls to the APIs + */ + public function getBasePath() + { + return $this->config->getBasePath(); + } + + /** + * @return string the name of the application + */ + public function getApplicationName() + { + return $this->config->getApplicationName(); + } + + /** + * Are we running in Google AppEngine? + * return bool + */ + public function isAppEngine() + { + return (isset($_SERVER['SERVER_SOFTWARE']) && + strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false); + } +} diff --git a/app/api/Google/Collection.php b/app/api/Google/Collection.php new file mode 100755 index 0000000..8b88ee7 --- /dev/null +++ b/app/api/Google/Collection.php @@ -0,0 +1,123 @@ +modelData[$this->collection_key]) + && is_array($this->modelData[$this->collection_key])) { + reset($this->modelData[$this->collection_key]); + } + } + + /** + * @return mixed + */ + public function current() + { + $this->coerceType($this->key()); + if (is_array($this->modelData[$this->collection_key])) { + return current($this->modelData[$this->collection_key]); + } + + return null; + } + + /** + * @return bool|float|int|string|null + */ + public function key() + { + if (isset($this->modelData[$this->collection_key]) + && is_array($this->modelData[$this->collection_key])) { + return key($this->modelData[$this->collection_key]); + } + + return null; + } + + /** + * @return mixed|void + */ + public function next() + { + return next($this->modelData[$this->collection_key]); + } + + /** + * @return bool + */ + public function valid() + { + $key = $this->key(); + return $key !== null && $key !== false; + } + + /** + * @return int + */ + public function count() + { + if (!isset($this->modelData[$this->collection_key])) { + return 0; + } + return count($this->modelData[$this->collection_key]); + } + + public function offsetExists($offset) + { + if (!is_numeric($offset)) { + return parent::offsetExists($offset); + } + return isset($this->modelData[$this->collection_key][$offset]); + } + + public function offsetGet($offset) + { + if (!is_numeric($offset)) { + return parent::offsetGet($offset); + } + $this->coerceType($offset); + return $this->modelData[$this->collection_key][$offset]; + } + + public function offsetSet($offset, $value) + { + if (!is_numeric($offset)) { + return parent::offsetSet($offset, $value); + } + $this->modelData[$this->collection_key][$offset] = $value; + } + + public function offsetUnset($offset) + { + if (!is_numeric($offset)) { + return parent::offsetUnset($offset); + } + unset($this->modelData[$this->collection_key][$offset]); + } + + private function coerceType($offset) + { + $typeKey = $this->keyType($this->collection_key); + if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) { + $type = $this->$typeKey; + $this->modelData[$this->collection_key][$offset] = + new $type($this->modelData[$this->collection_key][$offset]); + } + } +} diff --git a/app/api/Google/Config.php b/app/api/Google/Config.php new file mode 100755 index 0000000..710d580 --- /dev/null +++ b/app/api/Google/Config.php @@ -0,0 +1,456 @@ +configuration = array( + // The application_name is included in the User-Agent HTTP header. + 'application_name' => '', + + // Which Authentication, Storage and HTTP IO classes to use. + 'auth_class' => 'Google_Auth_OAuth2', + 'io_class' => self::USE_AUTO_IO_SELECTION, + 'cache_class' => 'Google_Cache_File', + 'logger_class' => 'Google_Logger_Null', + + // Don't change these unless you're working against a special development + // or testing environment. + 'base_path' => 'https://www.googleapis.com', + + // Definition of class specific values, like file paths and so on. + 'classes' => array( + 'Google_IO_Abstract' => array( + 'request_timeout_seconds' => 100, + ), + 'Google_IO_Curl' => array( + 'disable_proxy_workaround' => false, + 'options' => null, + ), + 'Google_Logger_Abstract' => array( + 'level' => 'debug', + 'log_format' => "[%datetime%] %level%: %message% %context%\n", + 'date_format' => 'd/M/Y:H:i:s O', + 'allow_newlines' => true + ), + 'Google_Logger_File' => array( + 'file' => 'php://stdout', + 'mode' => 0640, + 'lock' => false, + ), + 'Google_Http_Request' => array( + // Disable the use of gzip on calls if set to true. Defaults to false. + 'disable_gzip' => self::GZIP_ENABLED, + + // We default gzip to disabled on uploads even if gzip is otherwise + // enabled, due to some issues seen with small packet sizes for uploads. + // Please test with this option before enabling gzip for uploads in + // a production environment. + 'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED, + ), + // If you want to pass in OAuth 2.0 settings, they will need to be + // structured like this. + 'Google_Auth_OAuth2' => array( + // Keys for OAuth 2.0 access, see the API console at + // https://developers.google.com/console + 'client_id' => '', + 'client_secret' => '', + 'redirect_uri' => '', + + // Simple API access key, also from the API console. Ensure you get + // a Server key, and not a Browser key. + 'developer_key' => '', + + // Other parameters. + 'hd' => '', + 'prompt' => '', + 'openid.realm' => '', + 'include_granted_scopes' => '', + 'login_hint' => '', + 'request_visible_actions' => '', + 'access_type' => 'online', + 'approval_prompt' => 'auto', + 'federated_signon_certs_url' => + 'https://www.googleapis.com/oauth2/v1/certs', + ), + 'Google_Task_Runner' => array( + // Delays are specified in seconds + 'initial_delay' => 1, + 'max_delay' => 60, + // Base number for exponential backoff + 'factor' => 2, + // A random number between -jitter and jitter will be added to the + // factor on each iteration to allow for better distribution of + // retries. + 'jitter' => .5, + // Maximum number of retries allowed + 'retries' => 0 + ), + 'Google_Service_Exception' => array( + 'retry_map' => array( + '500' => self::TASK_RETRY_ALWAYS, + '503' => self::TASK_RETRY_ALWAYS, + 'rateLimitExceeded' => self::TASK_RETRY_ALWAYS, + 'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS + ) + ), + 'Google_IO_Exception' => array( + 'retry_map' => !extension_loaded('curl') ? array() : array( + CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS, + CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS, + CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS, + CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS, + CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS + ) + ), + // Set a default directory for the file cache. + 'Google_Cache_File' => array( + 'directory' => sys_get_temp_dir() . '/Google_Client' + ) + ), + ); + if ($ini_file_location) { + $ini = parse_ini_file($ini_file_location, true); + if (is_array($ini) && count($ini)) { + $merged_configuration = $ini + $this->configuration; + if (isset($ini['classes']) && isset($this->configuration['classes'])) { + $merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes']; + } + $this->configuration = $merged_configuration; + } + } + } + + /** + * Set configuration specific to a given class. + * $config->setClassConfig('Google_Cache_File', + * array('directory' => '/tmp/cache')); + * @param $class string The class name for the configuration + * @param $config string key or an array of configuration values + * @param $value string optional - if $config is a key, the value + */ + public function setClassConfig($class, $config, $value = null) + { + if (!is_array($config)) { + if (!isset($this->configuration['classes'][$class])) { + $this->configuration['classes'][$class] = []; + } + $this->configuration['classes'][$class][$config] = $value; + } else { + $this->configuration['classes'][$class] = $config; + } + } + + public function getClassConfig($class, $key = null) + { + if (!isset($this->configuration['classes'][$class])) { + return null; + } + if ($key === null) { + return $this->configuration['classes'][$class]; + } else { + return $this->configuration['classes'][$class][$key]; + } + } + + /** + * Return the configured cache class. + * @return string + */ + public function getCacheClass() + { + return $this->configuration['cache_class']; + } + + /** + * Return the configured logger class. + * @return string + */ + public function getLoggerClass() + { + return $this->configuration['logger_class']; + } + + /** + * Return the configured Auth class. + * @return string + */ + public function getAuthClass() + { + return $this->configuration['auth_class']; + } + + /** + * Set the auth class. + * + * @param $class string the class name to set + */ + public function setAuthClass($class) + { + $prev = $this->configuration['auth_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['auth_class'] = $class; + } + + /** + * Set the IO class. + * + * @param $class string the class name to set + */ + public function setIoClass($class) + { + $prev = $this->configuration['io_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['io_class'] = $class; + } + + /** + * Set the cache class. + * + * @param $class string the class name to set + */ + public function setCacheClass($class) + { + $prev = $this->configuration['cache_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['cache_class'] = $class; + } + + /** + * Set the logger class. + * + * @param $class string the class name to set + */ + public function setLoggerClass($class) + { + $prev = $this->configuration['logger_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['logger_class'] = $class; + } + + /** + * Return the configured IO class. + * + * @return string + */ + public function getIoClass() + { + return $this->configuration['io_class']; + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $name + */ + public function setApplicationName($name) + { + $this->configuration['application_name'] = $name; + } + + /** + * @return string the name of the application + */ + public function getApplicationName() + { + return $this->configuration['application_name']; + } + + /** + * Set the client ID for the auth class. + * @param $clientId string - the API console client ID + */ + public function setClientId($clientId) + { + $this->setAuthConfig('client_id', $clientId); + } + + /** + * Set the client secret for the auth class. + * @param $secret string - the API console client secret + */ + public function setClientSecret($secret) + { + $this->setAuthConfig('client_secret', $secret); + } + + /** + * Set the redirect uri for the auth class. Note that if using the + * Javascript based sign in flow, this should be the string 'postmessage'. + * + * @param $uri string - the URI that users should be redirected to + */ + public function setRedirectUri($uri) + { + $this->setAuthConfig('redirect_uri', $uri); + } + + /** + * Set the app activities for the auth class. + * @param $rva string a space separated list of app activity types + */ + public function setRequestVisibleActions($rva) + { + $this->setAuthConfig('request_visible_actions', $rva); + } + + /** + * Set the the access type requested (offline or online.) + * @param $access string - the access type + */ + public function setAccessType($access) + { + $this->setAuthConfig('access_type', $access); + } + + /** + * Set when to show the approval prompt (auto or force) + * @param $approval string - the approval request + */ + public function setApprovalPrompt($approval) + { + $this->setAuthConfig('approval_prompt', $approval); + } + + /** + * Set the login hint (email address or sub identifier) + * @param $hint string + */ + public function setLoginHint($hint) + { + $this->setAuthConfig('login_hint', $hint); + } + + /** + * Set the developer key for the auth class. Note that this is separate value + * from the client ID - if it looks like a URL, its a client ID! + * @param $key string - the API console developer key + */ + public function setDeveloperKey($key) + { + $this->setAuthConfig('developer_key', $key); + } + + /** + * Set the hd (hosted domain) parameter streamlines the login process for + * Google Apps hosted accounts. By including the domain of the user, you + * restrict sign-in to accounts at that domain. + * + * This should not be used to ensure security on your application - check + * the hd values within an id token (@see Google_Auth_LoginTicket) after sign + * in to ensure that the user is from the domain you were expecting. + * + * @param $hd string - the domain to use. + */ + public function setHostedDomain($hd) + { + $this->setAuthConfig('hd', $hd); + } + + /** + * Set the prompt hint. Valid values are none, consent and select_account. + * If no value is specified and the user has not previously authorized + * access, then the user is shown a consent screen. + * @param $prompt string + */ + public function setPrompt($prompt) + { + $this->setAuthConfig('prompt', $prompt); + } + + /** + * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth + * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which + * an authentication request is valid. + * @param $realm string - the URL-space to use. + */ + public function setOpenidRealm($realm) + { + $this->setAuthConfig('openid.realm', $realm); + } + + /** + * If this is provided with the value true, and the authorization request is + * granted, the authorization will include any previous authorizations + * granted to this user/application combination for other scopes. + * @param $include boolean - the URL-space to use. + */ + public function setIncludeGrantedScopes($include) + { + $this->setAuthConfig( + 'include_granted_scopes', + $include ? "true" : "false" + ); + } + + /** + * @return string the base URL to use for API calls + */ + public function getBasePath() + { + return $this->configuration['base_path']; + } + + /** + * Set the auth configuration for the current auth class. + * @param $key - the key to set + * @param $value - the parameter value + */ + private function setAuthConfig($key, $value) + { + if (!isset($this->configuration['classes'][$this->getAuthClass()])) { + $this->configuration['classes'][$this->getAuthClass()] = []; + } + $this->configuration['classes'][$this->getAuthClass()][$key] = $value; + } +} diff --git a/app/api/Google/Exception.php b/app/api/Google/Exception.php new file mode 100755 index 0000000..9629818 --- /dev/null +++ b/app/api/Google/Exception.php @@ -0,0 +1,20 @@ +client = $client; + $this->root_url = rtrim($rootUrl ? $rootUrl : $this->client->getBasePath(), '/'); + $this->batch_path = $batchPath ? $batchPath : 'batch'; + $this->expected_classes = []; + $boundary = (false == $boundary) ? mt_rand() : $boundary; + $this->boundary = str_replace('"', '', $boundary); + } + + public function add(Google_Http_Request $request, $key = false) + { + if (false == $key) { + $key = mt_rand(); + } + + $this->requests[$key] = $request; + } + + public function execute() + { + $body = ''; + + /** @var Google_Http_Request $req */ + foreach ($this->requests as $key => $req) { + $body .= "--{$this->boundary}\n"; + $body .= $req->toBatchString($key) . "\n\n"; + $this->expected_classes["response-" . $key] = $req->getExpectedClass(); + } + + $body .= "--{$this->boundary}--"; + + $url = $this->root_url . '/' . $this->batch_path; + $httpRequest = new Google_Http_Request($url, 'POST'); + $httpRequest->setRequestHeaders( + array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary) + ); + + $httpRequest->setPostBody($body); + $response = $this->client->getIo()->makeRequest($httpRequest); + + return $this->parseResponse($response); + } + + public function parseResponse(Google_Http_Request $response) + { + $contentType = $response->getResponseHeader('content-type'); + $contentType = explode(';', $contentType); + $boundary = false; + foreach ($contentType as $part) { + $part = (explode('=', $part, 2)); + if (isset($part[0]) && 'boundary' == trim($part[0])) { + $boundary = $part[1]; + } + } + + $body = $response->getResponseBody(); + if ($body) { + $body = str_replace("--$boundary--", "--$boundary", $body); + $parts = explode("--$boundary", $body); + $responses = []; + + foreach ($parts as $part) { + $part = trim($part); + if (!empty($part)) { + list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2); + $metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders); + + $status = substr($part, 0, strpos($part, "\n")); + $status = explode(" ", $status); + $status = $status[1]; + + list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false); + $response = new Google_Http_Request(""); + $response->setResponseHttpCode($status); + $response->setResponseHeaders($partHeaders); + $response->setResponseBody($partBody); + + // Need content id. + $key = $metaHeaders['content-id']; + + if (isset($this->expected_classes[$key]) && + strlen($this->expected_classes[$key]) > 0) { + $class = $this->expected_classes[$key]; + $response->setExpectedClass($class); + } + + try { + $response = Google_Http_REST::decodeHttpResponse($response, $this->client); + $responses[$key] = $response; + } catch (Google_Service_Exception $e) { + // Store the exception as the response, so successful responses + // can be processed. + $responses[$key] = $e; + } + } + } + + return $responses; + } + + return null; + } +} diff --git a/app/api/Google/Http/CacheParser.php b/app/api/Google/Http/CacheParser.php new file mode 100755 index 0000000..5f9b4f7 --- /dev/null +++ b/app/api/Google/Http/CacheParser.php @@ -0,0 +1,185 @@ +getRequestMethod(); + if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) { + return false; + } + + // Don't cache authorized requests/responses. + // [rfc2616-14.8] When a shared cache receives a request containing an + // Authorization field, it MUST NOT return the corresponding response + // as a reply to any other request... + if ($resp->getRequestHeader("authorization")) { + return false; + } + + return true; + } + + /** + * Check if an HTTP response can be cached by a private local cache. + * + * @static + * @param Google_Http_Request $resp + * @return bool True if the response is cacheable. + * False if the response is un-cacheable. + */ + public static function isResponseCacheable(Google_Http_Request $resp) + { + // First, check if the HTTP request was cacheable before inspecting the + // HTTP response. + if (false == self::isRequestCacheable($resp)) { + return false; + } + + $code = $resp->getResponseHttpCode(); + if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) { + return false; + } + + // The resource is uncacheable if the resource is already expired and + // the resource doesn't have an ETag for revalidation. + $etag = $resp->getResponseHeader("etag"); + if (self::isExpired($resp) && $etag == false) { + return false; + } + + // [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT + // store any part of either this response or the request that elicited it. + $cacheControl = $resp->getParsedCacheControl(); + if (isset($cacheControl['no-store'])) { + return false; + } + + // Pragma: no-cache is an http request directive, but is occasionally + // used as a response header incorrectly. + $pragma = $resp->getResponseHeader('pragma'); + if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) { + return false; + } + + // [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that + // a cache cannot determine from the request headers of a subsequent request + // whether this response is the appropriate representation." + // Given this, we deem responses with the Vary header as uncacheable. + $vary = $resp->getResponseHeader('vary'); + if ($vary) { + return false; + } + + return true; + } + + /** + * @static + * @param Google_Http_Request $resp + * @return bool True if the HTTP response is considered to be expired. + * False if it is considered to be fresh. + */ + public static function isExpired(Google_Http_Request $resp) + { + // HTTP/1.1 clients and caches MUST treat other invalid date formats, + // especially including the value “0”, as in the past. + $parsedExpires = false; + $responseHeaders = $resp->getResponseHeaders(); + + if (isset($responseHeaders['expires'])) { + $rawExpires = $responseHeaders['expires']; + // Check for a malformed expires header first. + if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) { + return true; + } + + // See if we can parse the expires header. + $parsedExpires = strtotime($rawExpires); + if (false == $parsedExpires || $parsedExpires <= 0) { + return true; + } + } + + // Calculate the freshness of an http response. + $freshnessLifetime = false; + $cacheControl = $resp->getParsedCacheControl(); + if (isset($cacheControl['max-age'])) { + $freshnessLifetime = $cacheControl['max-age']; + } + + $rawDate = $resp->getResponseHeader('date'); + $parsedDate = strtotime($rawDate); + + if (empty($rawDate) || false == $parsedDate) { + // We can't default this to now, as that means future cache reads + // will always pass with the logic below, so we will require a + // date be injected if not supplied. + throw new Google_Exception("All cacheable requests must have creation dates."); + } + + if (false == $freshnessLifetime && isset($responseHeaders['expires'])) { + $freshnessLifetime = $parsedExpires - $parsedDate; + } + + if (false == $freshnessLifetime) { + return true; + } + + // Calculate the age of an http response. + $age = max(0, time() - $parsedDate); + if (isset($responseHeaders['age'])) { + $age = max($age, strtotime($responseHeaders['age'])); + } + + return $freshnessLifetime <= $age; + } + + /** + * Determine if a cache entry should be revalidated with by the origin. + * + * @param Google_Http_Request $response + * @return bool True if the entry is expired, else return false. + */ + public static function mustRevalidate(Google_Http_Request $response) + { + // [13.3] When a cache has a stale entry that it would like to use as a + // response to a client's request, it first has to check with the origin + // server to see if its cached entry is still usable. + return self::isExpired($response); + } +} diff --git a/app/api/Google/Http/MediaFileUpload.php b/app/api/Google/Http/MediaFileUpload.php new file mode 100755 index 0000000..b625dd0 --- /dev/null +++ b/app/api/Google/Http/MediaFileUpload.php @@ -0,0 +1,341 @@ +client = $client; + $this->request = $request; + $this->mimeType = $mimeType; + $this->data = $data; + $this->size = strlen($this->data); + $this->resumable = $resumable; + if (!$chunkSize) { + $chunkSize = 256 * 1024; + } + $this->chunkSize = $chunkSize; + $this->progress = 0; + $this->boundary = $boundary; + + // Process Media Request + $this->process(); + } + + /** + * Set the size of the file that is being uploaded. + * @param $size - int file size in bytes + */ + public function setFileSize($size) + { + $this->size = $size; + } + + /** + * Return the progress on the upload + * @return int progress in bytes uploaded. + */ + public function getProgress() + { + return $this->progress; + } + + /** + * Return the HTTP result code from the last call made. + * @return int code + */ + public function getHttpResultCode() + { + return $this->httpResultCode; + } + + /** + * Sends a PUT-Request to google drive and parses the response, + * setting the appropiate variables from the response() + * + * @param Google_Http_Request $httpRequest the Reuqest which will be send + * + * @return false|mixed false when the upload is unfinished or the decoded http response + * + */ + private function makePutRequest(Google_Http_Request $httpRequest) + { + if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) { + $httpRequest->enableGzip(); + } else { + $httpRequest->disableGzip(); + } + + $response = $this->client->getIo()->makeRequest($httpRequest); + $response->setExpectedClass($this->request->getExpectedClass()); + $code = $response->getResponseHttpCode(); + $this->httpResultCode = $code; + + if (308 == $code) { + // Track the amount uploaded. + $range = explode('-', $response->getResponseHeader('range')); + $this->progress = $range[1] + 1; + + // Allow for changing upload URLs. + $location = $response->getResponseHeader('location'); + if ($location) { + $this->resumeUri = $location; + } + + // No problems, but upload not complete. + return false; + } else { + return Google_Http_REST::decodeHttpResponse($response, $this->client); + } + } + + /** + * Send the next part of the file to upload. + * @param [$chunk] the next set of bytes to send. If false will used $data passed + * at construct time. + */ + public function nextChunk($chunk = false) + { + if (false == $this->resumeUri) { + $this->resumeUri = $this->fetchResumeUri(); + } + + if (false == $chunk) { + $chunk = substr($this->data, $this->progress, $this->chunkSize); + } + $lastBytePos = $this->progress + strlen($chunk) - 1; + $headers = array( + 'content-range' => "bytes $this->progress-$lastBytePos/$this->size", + 'content-type' => $this->request->getRequestHeader('content-type'), + 'content-length' => $this->chunkSize, + 'expect' => '', + ); + + $httpRequest = new Google_Http_Request( + $this->resumeUri, + 'PUT', + $headers, + $chunk + ); + return $this->makePutRequest($httpRequest); + } + + /** + * Resume a previously unfinished upload + * @param $resumeUri the resume-URI of the unfinished, resumable upload. + */ + public function resume($resumeUri) + { + $this->resumeUri = $resumeUri; + $headers = array( + 'content-range' => "bytes */$this->size", + 'content-length' => 0, + ); + $httpRequest = new Google_Http_Request( + $this->resumeUri, + 'PUT', + $headers + ); + return $this->makePutRequest($httpRequest); + } + + /** + * @return array|bool + * @visible for testing + */ + private function process() + { + $postBody = false; + $contentType = false; + + $meta = $this->request->getPostBody(); + $meta = is_string($meta) ? json_decode($meta, true) : $meta; + + $uploadType = $this->getUploadType($meta); + $this->request->setQueryParam('uploadType', $uploadType); + $this->transformToUploadUrl(); + $mimeType = $this->mimeType ? + $this->mimeType : + $this->request->getRequestHeader('content-type'); + + if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = is_string($meta) ? $meta : json_encode($meta); + } else if (self::UPLOAD_MEDIA_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = $this->data; + } else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) { + // This is a multipart/related upload. + $boundary = $this->boundary ? $this->boundary : mt_rand(); + $boundary = str_replace('"', '', $boundary); + $contentType = 'multipart/related; boundary=' . $boundary; + $related = "--$boundary\r\n"; + $related .= "Content-Type: application/json; charset=UTF-8\r\n"; + $related .= "\r\n" . json_encode($meta) . "\r\n"; + $related .= "--$boundary\r\n"; + $related .= "Content-Type: $mimeType\r\n"; + $related .= "Content-Transfer-Encoding: base64\r\n"; + $related .= "\r\n" . base64_encode($this->data) . "\r\n"; + $related .= "--$boundary--"; + $postBody = $related; + } + + $this->request->setPostBody($postBody); + + if (isset($contentType) && $contentType) { + $contentTypeHeader['content-type'] = $contentType; + $this->request->setRequestHeaders($contentTypeHeader); + } + } + + private function transformToUploadUrl() + { + $base = $this->request->getBaseComponent(); + $this->request->setBaseComponent($base . '/upload'); + } + + /** + * Valid upload types: + * - resumable (UPLOAD_RESUMABLE_TYPE) + * - media (UPLOAD_MEDIA_TYPE) + * - multipart (UPLOAD_MULTIPART_TYPE) + * @param $meta + * @return string + * @visible for testing + */ + public function getUploadType($meta) + { + if ($this->resumable) { + return self::UPLOAD_RESUMABLE_TYPE; + } + + if (false == $meta && $this->data) { + return self::UPLOAD_MEDIA_TYPE; + } + + return self::UPLOAD_MULTIPART_TYPE; + } + + public function getResumeUri() + { + return ( $this->resumeUri !== null ? $this->resumeUri : $this->fetchResumeUri() ); + } + + private function fetchResumeUri() + { + $result = null; + $body = $this->request->getPostBody(); + if ($body) { + $headers = array( + 'content-type' => 'application/json; charset=UTF-8', + 'content-length' => Google_Utils::getStrLen($body), + 'x-upload-content-type' => $this->mimeType, + 'x-upload-content-length' => $this->size, + 'expect' => '', + ); + $this->request->setRequestHeaders($headers); + } + + $response = $this->client->getIo()->makeRequest($this->request); + $location = $response->getResponseHeader('location'); + $code = $response->getResponseHttpCode(); + + if (200 == $code && true == $location) { + return $location; + } + $message = $code; + $body = @json_decode($response->getResponseBody()); + if (!empty($body->error->errors) ) { + $message .= ': '; + foreach ($body->error->errors as $error) { + $message .= "{$error->domain}, {$error->message};"; + } + $message = rtrim($message, ';'); + } + + $error = "Failed to start the resumable upload (HTTP {$message})"; + $this->client->getLogger()->error($error); + throw new Google_Exception($error); + } + + public function setChunkSize($chunkSize) + { + $this->chunkSize = $chunkSize; + } +} diff --git a/app/api/Google/Http/REST.php b/app/api/Google/Http/REST.php new file mode 100755 index 0000000..eb788ad --- /dev/null +++ b/app/api/Google/Http/REST.php @@ -0,0 +1,178 @@ +getRequestMethod(), $req->getUrl()), + array(get_class(), 'doExecute'), + array($client, $req) + ); + + return $runner->run(); + } + + /** + * Executes a Google_Http_Request + * + * @param Google_Client $client + * @param Google_Http_Request $req + * @return array decoded result + * @throws Google_Service_Exception on server side error (ie: not authenticated, + * invalid or malformed post body, invalid url) + */ + public static function doExecute(Google_Client $client, Google_Http_Request $req) + { + $httpRequest = $client->getIo()->makeRequest($req); + $httpRequest->setExpectedClass($req->getExpectedClass()); + return self::decodeHttpResponse($httpRequest, $client); + } + + /** + * Decode an HTTP Response. + * @static + * @throws Google_Service_Exception + * @param Google_Http_Request $response The http response to be decoded. + * @param Google_Client $client + * @return mixed|null + */ + public static function decodeHttpResponse($response, Google_Client $client = null) + { + $code = $response->getResponseHttpCode(); + $body = $response->getResponseBody(); + $decoded = null; + + if ((intVal($code)) >= 300) { + $decoded = json_decode($body, true); + $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl(); + if (isset($decoded['error']) && + isset($decoded['error']['message']) && + isset($decoded['error']['code'])) { + // if we're getting a json encoded error definition, use that instead of the raw response + // body for improved readability + $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}"; + } else { + $err .= ": ($code) $body"; + } + + $errors = null; + // Specific check for APIs which don't return error details, such as Blogger. + if (isset($decoded['error']) && isset($decoded['error']['errors'])) { + $errors = $decoded['error']['errors']; + } + + $map = null; + if ($client) { + $client->getLogger()->error( + $err, + array('code' => $code, 'errors' => $errors) + ); + + $map = $client->getClassConfig( + 'Google_Service_Exception', + 'retry_map' + ); + } + throw new Google_Service_Exception($err, $code, null, $errors, $map); + } + + // Only attempt to decode the response, if the response code wasn't (204) 'no content' + if ($code != '204') { + if ($response->getExpectedRaw()) { + return $body; + } + + $decoded = json_decode($body, true); + if ($decoded === null || $decoded === "") { + $error = "Invalid json in service response: $body"; + if ($client) { + $client->getLogger()->error($error); + } + throw new Google_Service_Exception($error); + } + + if ($response->getExpectedClass()) { + $class = $response->getExpectedClass(); + $decoded = new $class($decoded); + } + } + return $decoded; + } + + /** + * Parse/expand request parameters and create a fully qualified + * request uri. + * @static + * @param string $servicePath + * @param string $restPath + * @param array $params + * @return string $requestUrl + */ + public static function createRequestUri($servicePath, $restPath, $params) + { + $requestUrl = $servicePath . $restPath; + $uriTemplateVars = []; + $queryVars = []; + foreach ($params as $paramName => $paramSpec) { + if ($paramSpec['type'] == 'boolean') { + $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false'; + } + if ($paramSpec['location'] == 'path') { + $uriTemplateVars[$paramName] = $paramSpec['value']; + } else if ($paramSpec['location'] == 'query') { + if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) { + foreach ($paramSpec['value'] as $value) { + $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value)); + } + } else { + $queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value'])); + } + } + } + + if (count($uriTemplateVars)) { + $uriTemplateParser = new Google_Utils_URITemplate(); + $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); + } + + if (count($queryVars)) { + $requestUrl .= '?' . implode('&', $queryVars); + } + + return $requestUrl; + } +} diff --git a/app/api/Google/Http/Request.php b/app/api/Google/Http/Request.php new file mode 100755 index 0000000..b675b3e --- /dev/null +++ b/app/api/Google/Http/Request.php @@ -0,0 +1,504 @@ + + * @author Chirag Shah + * + */ +class Google_Http_Request +{ + const GZIP_UA = " (gzip)"; + + private $batchHeaders = array( + 'Content-Type' => 'application/http', + 'Content-Transfer-Encoding' => 'binary', + 'MIME-Version' => '1.0', + ); + + protected $queryParams; + protected $requestMethod; + protected $requestHeaders; + protected $baseComponent = null; + protected $path; + protected $postBody; + protected $userAgent = ''; + protected $canGzip = null; + + protected $responseHttpCode; + protected $responseHeaders; + protected $responseBody; + + protected $expectedClass; + protected $expectedRaw = false; + + public $accessKey; + + public function __construct( + $url, + $method = 'GET', + $headers = array(), + $postBody = null + ) { + $this->setUrl($url); + $this->setRequestMethod($method); + $this->setRequestHeaders($headers); + $this->setPostBody($postBody); + } + + /** + * Misc function that returns the base url component of the $url + * used by the OAuth signing class to calculate the base string + * @return string The base url component of the $url. + */ + public function getBaseComponent() + { + return $this->baseComponent; + } + + /** + * Set the base URL that path and query parameters will be added to. + * @param $baseComponent string + */ + public function setBaseComponent($baseComponent) + { + $this->baseComponent = rtrim($baseComponent, '/'); + } + + /** + * Enable support for gzipped responses with this request. + */ + public function enableGzip() + { + $this->setRequestHeaders(array("Accept-Encoding" => "gzip")); + $this->canGzip = true; + $this->setUserAgent($this->userAgent); + } + + /** + * Disable support for gzip responses with this request. + */ + public function disableGzip() + { + if ( + isset($this->requestHeaders['accept-encoding']) && + $this->requestHeaders['accept-encoding'] == "gzip" + ) { + unset($this->requestHeaders['accept-encoding']); + } + $this->canGzip = false; + $this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent); + } + + /** + * Can this request accept a gzip response? + * @return bool + */ + public function canGzip() + { + return $this->canGzip; + } + + /** + * Misc function that returns an array of the query parameters of the current + * url used by the OAuth signing class to calculate the signature + * @return array Query parameters in the query string. + */ + public function getQueryParams() + { + return $this->queryParams; + } + + /** + * Set a new query parameter. + * @param $key - string to set, does not need to be URL encoded + * @param $value - string to set, does not need to be URL encoded + */ + public function setQueryParam($key, $value) + { + $this->queryParams[$key] = $value; + } + + /** + * @return string HTTP Response Code. + */ + public function getResponseHttpCode() + { + return (int) $this->responseHttpCode; + } + + /** + * @param int $responseHttpCode HTTP Response Code. + */ + public function setResponseHttpCode($responseHttpCode) + { + $this->responseHttpCode = $responseHttpCode; + } + + /** + * @return $responseHeaders (array) HTTP Response Headers. + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * @return string HTTP Response Body + */ + public function getResponseBody() + { + return $this->responseBody; + } + + /** + * Set the class the response to this request should expect. + * + * @param $class string the class name + */ + public function setExpectedClass($class) + { + $this->expectedClass = $class; + } + + /** + * Retrieve the expected class the response should expect. + * @return string class name + */ + public function getExpectedClass() + { + return $this->expectedClass; + } + + /** + * Enable expected raw response + */ + public function enableExpectedRaw() + { + $this->expectedRaw = true; + } + + /** + * Disable expected raw response + */ + public function disableExpectedRaw() + { + $this->expectedRaw = false; + } + + /** + * Expected raw response or not. + * @return boolean expected raw response + */ + public function getExpectedRaw() + { + return $this->expectedRaw; + } + + /** + * @param array $headers The HTTP response headers + * to be normalized. + */ + public function setResponseHeaders($headers) + { + $headers = Google_Utils::normalize($headers); + if ($this->responseHeaders) { + $headers = array_merge($this->responseHeaders, $headers); + } + + $this->responseHeaders = $headers; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getResponseHeader($key) + { + return isset($this->responseHeaders[$key]) + ? $this->responseHeaders[$key] + : false; + } + + /** + * @param string $responseBody The HTTP response body. + */ + public function setResponseBody($responseBody) + { + $this->responseBody = $responseBody; + } + + /** + * @return string $url The request URL. + */ + public function getUrl() + { + return $this->baseComponent . $this->path . + (count($this->queryParams) ? + "?" . $this->buildQuery($this->queryParams) : + ''); + } + + /** + * @return string $method HTTP Request Method. + */ + public function getRequestMethod() + { + return $this->requestMethod; + } + + /** + * @return array $headers HTTP Request Headers. + */ + public function getRequestHeaders() + { + return $this->requestHeaders; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getRequestHeader($key) + { + return isset($this->requestHeaders[$key]) + ? $this->requestHeaders[$key] + : false; + } + + /** + * @return string $postBody HTTP Request Body. + */ + public function getPostBody() + { + return $this->postBody; + } + + /** + * @param string $url the url to set + */ + public function setUrl($url) + { + if (substr($url, 0, 4) != 'http') { + // Force the path become relative. + if (substr($url, 0, 1) !== '/') { + $url = '/' . $url; + } + } + $parts = parse_url($url); + if (isset($parts['host'])) { + $this->baseComponent = sprintf( + "%s%s%s", + isset($parts['scheme']) ? $parts['scheme'] . "://" : '', + isset($parts['host']) ? $parts['host'] : '', + isset($parts['port']) ? ":" . $parts['port'] : '' + ); + } + $this->path = isset($parts['path']) ? $parts['path'] : ''; + $this->queryParams = []; + if (isset($parts['query'])) { + $this->queryParams = $this->parseQuery($parts['query']); + } + } + + /** + * @param string $method Set he HTTP Method and normalize + * it to upper-case, as required by HTTP. + * + */ + public function setRequestMethod($method) + { + $this->requestMethod = strtoupper($method); + } + + /** + * @param array $headers The HTTP request headers + * to be set and normalized. + */ + public function setRequestHeaders($headers) + { + $headers = Google_Utils::normalize($headers); + if ($this->requestHeaders) { + $headers = array_merge($this->requestHeaders, $headers); + } + $this->requestHeaders = $headers; + } + + /** + * @param string $postBody the postBody to set + */ + public function setPostBody($postBody) + { + $this->postBody = $postBody; + } + + /** + * Set the User-Agent Header. + * @param string $userAgent The User-Agent. + */ + public function setUserAgent($userAgent) + { + $this->userAgent = $userAgent; + if ($this->canGzip) { + $this->userAgent = $userAgent . self::GZIP_UA; + } + } + + /** + * @return string The User-Agent. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Returns a cache key depending on if this was an OAuth signed request + * in which case it will use the non-signed url and access key to make this + * cache key unique per authenticated user, else use the plain request url + * @return string The md5 hash of the request cache key. + */ + public function getCacheKey() + { + $key = $this->getUrl(); + + if (isset($this->accessKey)) { + $key .= $this->accessKey; + } + + if (isset($this->requestHeaders['authorization'])) { + $key .= $this->requestHeaders['authorization']; + } + + return md5($key); + } + + public function getParsedCacheControl() + { + $parsed = []; + $rawCacheControl = $this->getResponseHeader('cache-control'); + if ($rawCacheControl) { + $rawCacheControl = str_replace(', ', '&', $rawCacheControl); + parse_str($rawCacheControl, $parsed); + } + + return $parsed; + } + + /** + * @param string $id + * @return string A string representation of the HTTP Request. + */ + public function toBatchString($id) + { + $str = ''; + $path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" . + http_build_query($this->queryParams); + $str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n"; + + foreach ($this->getRequestHeaders() as $key => $val) { + $str .= $key . ': ' . $val . "\n"; + } + + if ($this->getPostBody()) { + $str .= "\n"; + $str .= $this->getPostBody(); + } + + $headers = ''; + foreach ($this->batchHeaders as $key => $val) { + $headers .= $key . ': ' . $val . "\n"; + } + + $headers .= "Content-ID: $id\n"; + $str = $headers . "\n" . $str; + + return $str; + } + + /** + * Our own version of parse_str that allows for multiple variables + * with the same name. + * @param $string - the query string to parse + */ + private function parseQuery($string) + { + $return = []; + $parts = explode("&", $string); + foreach ($parts as $part) { + list($key, $value) = explode('=', $part, 2); + $value = urldecode($value); + if (isset($return[$key])) { + if (!is_array($return[$key])) { + $return[$key] = array($return[$key]); + } + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + return $return; + } + + /** + * A version of build query that allows for multiple + * duplicate keys. + * @param $parts array of key value pairs + */ + private function buildQuery($parts) + { + $return = []; + foreach ($parts as $key => $value) { + if (is_array($value)) { + foreach ($value as $v) { + $return[] = urlencode($key) . "=" . urlencode($v); + } + } else { + $return[] = urlencode($key) . "=" . urlencode($value); + } + } + return implode('&', $return); + } + + /** + * If we're POSTing and have no body to send, we can send the query + * parameters in there, which avoids length issues with longer query + * params. + */ + public function maybeMoveParametersToBody() + { + if ($this->getRequestMethod() == "POST" && empty($this->postBody)) { + $this->setRequestHeaders( + array( + "content-type" => + "application/x-www-form-urlencoded; charset=UTF-8" + ) + ); + $this->setPostBody($this->buildQuery($this->queryParams)); + $this->queryParams = []; + } + } +} diff --git a/app/api/Google/IO/Abstract.php b/app/api/Google/IO/Abstract.php new file mode 100755 index 0000000..bf23b40 --- /dev/null +++ b/app/api/Google/IO/Abstract.php @@ -0,0 +1,339 @@ + null, "PUT" => null); + private static $HOP_BY_HOP = array( + 'connection' => true, + 'keep-alive' => true, + 'proxy-authenticate' => true, + 'proxy-authorization' => true, + 'te' => true, + 'trailers' => true, + 'transfer-encoding' => true, + 'upgrade' => true + ); + + + /** @var Google_Client */ + protected $client; + + public function __construct(Google_Client $client) + { + $this->client = $client; + $timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds'); + if ($timeout > 0) { + $this->setTimeout($timeout); + } + } + + /** + * Executes a Google_Http_Request + * @param Google_Http_Request $request the http request to be executed + * @return array containing response headers, body, and http code + * @throws Google_IO_Exception on curl or IO error + */ + abstract public function executeRequest(Google_Http_Request $request); + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + abstract public function setOptions($options); + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + abstract public function setTimeout($timeout); + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + abstract public function getTimeout(); + + /** + * Test for the presence of a cURL header processing bug + * + * The cURL bug was present in versions prior to 7.30.0 and caused the header + * length to be miscalculated when a "Connection established" header added by + * some proxies was present. + * + * @return boolean + */ + abstract protected function needsQuirk(); + + /** + * @visible for testing. + * Cache the response to an HTTP request if it is cacheable. + * @param Google_Http_Request $request + * @return bool Returns true if the insertion was successful. + * Otherwise, return false. + */ + public function setCachedRequest(Google_Http_Request $request) + { + // Determine if the request is cacheable. + if (Google_Http_CacheParser::isResponseCacheable($request)) { + $this->client->getCache()->set($request->getCacheKey(), $request); + return true; + } + + return false; + } + + /** + * Execute an HTTP Request + * + * @param Google_Http_Request $request the http request to be executed + * @return Google_Http_Request http request with the response http code, + * response headers and response body filled in + * @throws Google_IO_Exception on curl or IO error + */ + public function makeRequest(Google_Http_Request $request) + { + // First, check to see if we have a valid cached version. + $cached = $this->getCachedRequest($request); + if ($cached !== false && $cached instanceof Google_Http_Request) { + if (!$this->checkMustRevalidateCachedRequest($cached, $request)) { + return $cached; + } + } + + if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) { + $request = $this->processEntityRequest($request); + } + + list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request); + + if ($respHttpCode == 304 && $cached) { + // If the server responded NOT_MODIFIED, return the cached request. + $this->updateCachedRequest($cached, $responseHeaders); + return $cached; + } + + if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) { + $responseHeaders['date'] = date("r"); + } + + $request->setResponseHttpCode($respHttpCode); + $request->setResponseHeaders($responseHeaders); + $request->setResponseBody($responseData); + // Store the request in cache (the function checks to see if the request + // can actually be cached) + $this->setCachedRequest($request); + return $request; + } + + /** + * @visible for testing. + * @param Google_Http_Request $request + * @return Google_Http_Request|bool Returns the cached object or + * false if the operation was unsuccessful. + */ + public function getCachedRequest(Google_Http_Request $request) + { + if (false === Google_Http_CacheParser::isRequestCacheable($request)) { + return false; + } + + return $this->client->getCache()->get($request->getCacheKey()); + } + + /** + * @visible for testing + * Process an http request that contains an enclosed entity. + * @param Google_Http_Request $request + * @return Google_Http_Request Processed request with the enclosed entity. + */ + public function processEntityRequest(Google_Http_Request $request) + { + $postBody = $request->getPostBody(); + $contentType = $request->getRequestHeader("content-type"); + + // Set the default content-type as application/x-www-form-urlencoded. + if (false == $contentType) { + $contentType = self::FORM_URLENCODED; + $request->setRequestHeaders(array('content-type' => $contentType)); + } + + // Force the payload to match the content-type asserted in the header. + if ($contentType == self::FORM_URLENCODED && is_array($postBody)) { + $postBody = http_build_query($postBody, '', '&'); + $request->setPostBody($postBody); + } + + // Make sure the content-length header is set. + if (!$postBody || is_string($postBody)) { + $postsLength = strlen($postBody); + $request->setRequestHeaders(array('content-length' => $postsLength)); + } + + return $request; + } + + /** + * Check if an already cached request must be revalidated, and if so update + * the request with the correct ETag headers. + * @param Google_Http_Request $cached A previously cached response. + * @param Google_Http_Request $request The outbound request. + * return bool If the cached object needs to be revalidated, false if it is + * still current and can be re-used. + */ + protected function checkMustRevalidateCachedRequest($cached, $request) + { + if (Google_Http_CacheParser::mustRevalidate($cached)) { + $addHeaders = []; + if ($cached->getResponseHeader('etag')) { + // [13.3.4] If an entity tag has been provided by the origin server, + // we must use that entity tag in any cache-conditional request. + $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag'); + } elseif ($cached->getResponseHeader('date')) { + $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date'); + } + + $request->setRequestHeaders($addHeaders); + return true; + } else { + return false; + } + } + + /** + * Update a cached request, using the headers from the last response. + * @param Google_Http_Request $cached A previously cached response. + * @param mixed Associative array of response headers from the last request. + */ + protected function updateCachedRequest($cached, $responseHeaders) + { + $hopByHop = self::$HOP_BY_HOP; + if (!empty($responseHeaders['connection'])) { + $connectionHeaders = array_map( + 'strtolower', + array_filter( + array_map('trim', explode(',', $responseHeaders['connection'])) + ) + ); + $hopByHop += array_fill_keys($connectionHeaders, true); + } + + $endToEnd = array_diff_key($responseHeaders, $hopByHop); + $cached->setResponseHeaders($endToEnd); + } + + /** + * Used by the IO lib and also the batch processing. + * + * @param $respData + * @param $headerSize + * @return array + */ + public function parseHttpResponse($respData, $headerSize) + { + // check proxy header + foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) { + if (stripos($respData, $established_header) !== false) { + // existed, remove it + $respData = str_ireplace($established_header, '', $respData); + // Subtract the proxy header size unless the cURL bug prior to 7.30.0 + // is present which prevented the proxy header size from being taken into + // account. + if (!$this->needsQuirk()) { + $headerSize -= strlen($established_header); + } + break; + } + } + + if ($headerSize) { + $responseBody = substr($respData, $headerSize); + $responseHeaders = substr($respData, 0, $headerSize); + } else { + $responseSegments = explode("\r\n\r\n", $respData, 2); + $responseHeaders = $responseSegments[0]; + $responseBody = isset($responseSegments[1]) ? $responseSegments[1] : + null; + } + + $responseHeaders = $this->getHttpResponseHeaders($responseHeaders); + return array($responseHeaders, $responseBody); + } + + /** + * Parse out headers from raw headers + * @param rawHeaders array or string + * @return array + */ + public function getHttpResponseHeaders($rawHeaders) + { + if (is_array($rawHeaders)) { + return $this->parseArrayHeaders($rawHeaders); + } else { + return $this->parseStringHeaders($rawHeaders); + } + } + + private function parseStringHeaders($rawHeaders) + { + $headers = []; + $responseHeaderLines = explode("\r\n", $rawHeaders); + foreach ($responseHeaderLines as $headerLine) { + if ($headerLine && strpos($headerLine, ':') !== false) { + list($header, $value) = explode(': ', $headerLine, 2); + $header = strtolower($header); + if (isset($headers[$header])) { + $headers[$header] .= "\n" . $value; + } else { + $headers[$header] = $value; + } + } + } + return $headers; + } + + private function parseArrayHeaders($rawHeaders) + { + $header_count = count($rawHeaders); + $headers = []; + + for ($i = 0; $i < $header_count; $i++) { + $header = $rawHeaders[$i]; + // Times will have colons in - so we just want the first match. + $header_parts = explode(': ', $header, 2); + if (count($header_parts) == 2) { + $headers[strtolower($header_parts[0])] = $header_parts[1]; + } + } + + return $headers; + } +} diff --git a/app/api/Google/IO/Curl.php b/app/api/Google/IO/Curl.php new file mode 100755 index 0000000..8d2e7b3 --- /dev/null +++ b/app/api/Google/IO/Curl.php @@ -0,0 +1,194 @@ + + */ + +if (!class_exists('Google_Client')) { + require_once dirname(__FILE__) . '/../autoload.php'; +} + +class Google_IO_Curl extends Google_IO_Abstract +{ + // cURL hex representation of version 7.30.0 + const NO_QUIRK_VERSION = 0x071E00; + + private $options = []; + + /** @var bool $disableProxyWorkaround */ + private $disableProxyWorkaround; + + public function __construct(Google_Client $client) + { + if (!extension_loaded('curl')) { + $error = 'The cURL IO handler requires the cURL extension to be enabled'; + $client->getLogger()->critical($error); + throw new Google_IO_Exception($error); + } + + parent::__construct($client); + + $this->disableProxyWorkaround = $this->client->getClassConfig( + 'Google_IO_Curl', + 'disable_proxy_workaround' + ); + } + + /** + * Execute an HTTP Request + * + * @param Google_Http_Request $request the http request to be executed + * @return array containing response headers, body, and http code + * @throws Google_IO_Exception on curl or IO error + */ + public function executeRequest(Google_Http_Request $request) + { + $curl = curl_init(); + + if ($request->getPostBody()) { + curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody()); + } + + $requestHeaders = $request->getRequestHeaders(); + if ($requestHeaders && is_array($requestHeaders)) { + $curlHeaders = []; + foreach ($requestHeaders as $k => $v) { + $curlHeaders[] = "$k: $v"; + } + curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); + } + curl_setopt($curl, CURLOPT_URL, $request->getUrl()); + + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod()); + curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent()); + + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + + // The SSL version will be determined by the underlying library + // @see https://github.com/google/google-api-php-client/pull/644 + //curl_setopt($curl, CURLOPT_SSLVERSION, 1); + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HEADER, true); + + if ($request->canGzip()) { + curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); + } + + $options = $this->client->getClassConfig('Google_IO_Curl', 'options'); + if (is_array($options)) { + $this->setOptions($options); + } + + foreach ($this->options as $key => $var) { + curl_setopt($curl, $key, $var); + } + + if (!isset($this->options[CURLOPT_CAINFO])) { + curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem'); + } + + $this->client->getLogger()->debug( + 'cURL request', + array( + 'url' => $request->getUrl(), + 'method' => $request->getRequestMethod(), + 'headers' => $requestHeaders, + 'body' => $request->getPostBody() + ) + ); + + $response = curl_exec($curl); + if ($response === false) { + $error = curl_error($curl); + $code = curl_errno($curl); + $map = $this->client->getClassConfig('Google_IO_Exception', 'retry_map'); + + $this->client->getLogger()->error('cURL ' . $error); + throw new Google_IO_Exception($error, $code, null, $map); + } + $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); + + list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize); + $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + $this->client->getLogger()->debug( + 'cURL response', + array( + 'code' => $responseCode, + 'headers' => $responseHeaders, + 'body' => $responseBody, + ) + ); + + return array($responseBody, $responseHeaders, $responseCode); + } + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + public function setOptions($options) + { + $this->options = $options + $this->options; + } + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + public function setTimeout($timeout) + { + // Since this timeout is really for putting a bound on the time + // we'll set them both to the same. If you need to specify a longer + // CURLOPT_TIMEOUT, or a higher CONNECTTIMEOUT, the best thing to + // do is use the setOptions method for the values individually. + $this->options[CURLOPT_CONNECTTIMEOUT] = $timeout; + $this->options[CURLOPT_TIMEOUT] = $timeout; + } + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + public function getTimeout() + { + return $this->options[CURLOPT_TIMEOUT]; + } + + /** + * Test for the presence of a cURL header processing bug + * + * {@inheritDoc} + * + * @return boolean + */ + protected function needsQuirk() + { + if ($this->disableProxyWorkaround) { + return false; + } + + $ver = curl_version(); + $versionNum = $ver['version_number']; + return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION; + } +} diff --git a/app/api/Google/IO/Exception.php b/app/api/Google/IO/Exception.php new file mode 100755 index 0000000..30d9c2d --- /dev/null +++ b/app/api/Google/IO/Exception.php @@ -0,0 +1,69 @@ += 0) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + + if (is_array($retryMap)) { + $this->retryMap = $retryMap; + } + } + + /** + * Gets the number of times the associated task can be retried. + * + * NOTE: -1 is returned if the task can be retried indefinitely + * + * @return integer + */ + public function allowedRetries() + { + if (isset($this->retryMap[$this->code])) { + return $this->retryMap[$this->code]; + } + + return 0; + } +} diff --git a/app/api/Google/IO/Stream.php b/app/api/Google/IO/Stream.php new file mode 100755 index 0000000..867c90f --- /dev/null +++ b/app/api/Google/IO/Stream.php @@ -0,0 +1,243 @@ + + */ + +if (!class_exists('Google_Client')) { + require_once dirname(__FILE__) . '/../autoload.php'; +} + +class Google_IO_Stream extends Google_IO_Abstract +{ + const TIMEOUT = "timeout"; + const ZLIB = "compress.zlib://"; + private $options = []; + private $trappedErrorNumber; + private $trappedErrorString; + + private static $DEFAULT_HTTP_CONTEXT = array( + "follow_location" => 0, + "ignore_errors" => 1, + ); + + private static $DEFAULT_SSL_CONTEXT = array( + "verify_peer" => true, + ); + + public function __construct(Google_Client $client) + { + if (!ini_get('allow_url_fopen')) { + $error = 'The stream IO handler requires the allow_url_fopen runtime ' . + 'configuration to be enabled'; + $client->getLogger()->critical($error); + throw new Google_IO_Exception($error); + } + + parent::__construct($client); + } + + /** + * Execute an HTTP Request + * + * @param Google_Http_Request $request the http request to be executed + * @return array containing response headers, body, and http code + * @throws Google_IO_Exception on curl or IO error + */ + public function executeRequest(Google_Http_Request $request) + { + $default_options = stream_context_get_options(stream_context_get_default()); + + $requestHttpContext = array_key_exists('http', $default_options) ? + $default_options['http'] : []; + + if ($request->getPostBody()) { + $requestHttpContext["content"] = $request->getPostBody(); + } + + $requestHeaders = $request->getRequestHeaders(); + if ($requestHeaders && is_array($requestHeaders)) { + $headers = ""; + foreach ($requestHeaders as $k => $v) { + $headers .= "$k: $v\r\n"; + } + $requestHttpContext["header"] = $headers; + } + + $requestHttpContext["method"] = $request->getRequestMethod(); + $requestHttpContext["user_agent"] = $request->getUserAgent(); + + $requestSslContext = array_key_exists('ssl', $default_options) ? + $default_options['ssl'] : []; + + if (!$this->client->isAppEngine() && !array_key_exists("cafile", $requestSslContext)) { + $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem'; + } + + $options = array( + "http" => array_merge( + self::$DEFAULT_HTTP_CONTEXT, + $requestHttpContext + ), + "ssl" => array_merge( + self::$DEFAULT_SSL_CONTEXT, + $requestSslContext + ) + ); + + $context = stream_context_create($options); + + $url = $request->getUrl(); + + if ($request->canGzip()) { + $url = self::ZLIB . $url; + } + + $this->client->getLogger()->debug( + 'Stream request', + array( + 'url' => $url, + 'method' => $request->getRequestMethod(), + 'headers' => $requestHeaders, + 'body' => $request->getPostBody() + ) + ); + + // We are trapping any thrown errors in this method only and + // throwing an exception. + $this->trappedErrorNumber = null; + $this->trappedErrorString = null; + + // START - error trap. + set_error_handler(array($this, 'trapError')); + $fh = fopen($url, 'r', false, $context); + restore_error_handler(); + // END - error trap. + + if ($this->trappedErrorNumber) { + $error = sprintf( + "HTTP Error: Unable to connect: '%s'", + $this->trappedErrorString + ); + + $this->client->getLogger()->error('Stream ' . $error); + throw new Google_IO_Exception($error, $this->trappedErrorNumber); + } + + $response_data = false; + $respHttpCode = self::UNKNOWN_CODE; + if ($fh) { + if (isset($this->options[self::TIMEOUT])) { + stream_set_timeout($fh, $this->options[self::TIMEOUT]); + } + + $response_data = stream_get_contents($fh); + fclose($fh); + + $respHttpCode = $this->getHttpResponseCode($http_response_header); + } + + if (false === $response_data) { + $error = sprintf( + "HTTP Error: Unable to connect: '%s'", + $respHttpCode + ); + + $this->client->getLogger()->error('Stream ' . $error); + throw new Google_IO_Exception($error, $respHttpCode); + } + + $responseHeaders = $this->getHttpResponseHeaders($http_response_header); + + $this->client->getLogger()->debug( + 'Stream response', + array( + 'code' => $respHttpCode, + 'headers' => $responseHeaders, + 'body' => $response_data, + ) + ); + + return array($response_data, $responseHeaders, $respHttpCode); + } + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + public function setOptions($options) + { + $this->options = $options + $this->options; + } + + /** + * Method to handle errors, used for error handling around + * stream connection methods. + */ + public function trapError($errno, $errstr) + { + $this->trappedErrorNumber = $errno; + $this->trappedErrorString = $errstr; + } + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + public function setTimeout($timeout) + { + $this->options[self::TIMEOUT] = $timeout; + } + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + public function getTimeout() + { + return $this->options[self::TIMEOUT]; + } + + /** + * Test for the presence of a cURL header processing bug + * + * {@inheritDoc} + * + * @return boolean + */ + protected function needsQuirk() + { + return false; + } + + protected function getHttpResponseCode($response_headers) + { + $header_count = count($response_headers); + + for ($i = 0; $i < $header_count; $i++) { + $header = $response_headers[$i]; + if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) { + $response = explode(' ', $header); + return $response[1]; + } + } + return self::UNKNOWN_CODE; + } +} diff --git a/app/api/Google/IO/cacerts.pem b/app/api/Google/IO/cacerts.pem new file mode 100755 index 0000000..971512a --- /dev/null +++ b/app/api/Google/IO/cacerts.pem @@ -0,0 +1,2183 @@ +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: O=Equifax OU=Equifax Secure Certificate Authority +# Subject: O=Equifax OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure CA" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 4 Public Primary Certification Authority - G3" +# Serial: 314531972711909413743075096039378935511 +# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df +# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d +# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946059622 +# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc +# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe +# SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy +MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA +vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G +CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA +WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ +h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 +f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN +B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy +vUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 +# Label: "Equifax Secure eBusiness CA 2" +# Serial: 930140085 +# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca +# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc +# SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj +dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 +NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD +VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G +vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ +BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl +IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw +NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq +y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 +E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Low-Value Services Root" +# Serial: 1 +# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc +# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d +# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Public Services Root" +# Serial: 1 +# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f +# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 +# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Qualified Certificates Root" +# Serial: 1 +# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb +# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf +# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Global CA 2" +# Serial: 1 +# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 +# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d +# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Label: "America Online Root Certification Authority 1" +# Serial: 1 +# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e +# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a +# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Label: "America Online Root Certification Authority 2" +# Serial: 1 +# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf +# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 +# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=Secure Certificate Services O=Comodo CA Limited +# Subject: CN=Secure Certificate Services O=Comodo CA Limited +# Label: "Comodo Secure Services root" +# Serial: 1 +# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd +# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 +# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- + +# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited +# Subject: CN=Trusted Certificate Services O=Comodo CA Limited +# Label: "Comodo Trusted Services root" +# Serial: 1 +# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 +# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd +# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN DATACorp SGC Root CA" +# Serial: 91374294542884689855167577680241077609 +# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 +# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 +# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN USERFirst Hardware Root CA" +# Serial: 91374294542884704022267039221184531197 +# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 +# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 +# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Label: "TC TrustCenter Class 2 CA II" +# Serial: 941389028203453866782103406992443 +# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 +# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e +# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Label: "TC TrustCenter Class 3 CA II" +# Serial: 1506523511417715638772220530020799 +# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e +# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 +# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA I" +# Serial: 601024842042189035295619584734726 +# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c +# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 +# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA III" +# Serial: 2010889993983507346460533407902964 +# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b +# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87 +# SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy +MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl +ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm +BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF +5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv +DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v +zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT +yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj +dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh +MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI +4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz +dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY +aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G +DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH +LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- diff --git a/app/api/Google/Logger/Abstract.php b/app/api/Google/Logger/Abstract.php new file mode 100755 index 0000000..03e46cb --- /dev/null +++ b/app/api/Google/Logger/Abstract.php @@ -0,0 +1,408 @@ + 600, + self::ALERT => 550, + self::CRITICAL => 500, + self::ERROR => 400, + self::WARNING => 300, + self::NOTICE => 250, + self::INFO => 200, + self::DEBUG => 100, + ); + + /** + * @var integer $level The minimum logging level + */ + protected $level = self::DEBUG; + + /** + * @var string $logFormat The current log format + */ + protected $logFormat = self::DEFAULT_LOG_FORMAT; + /** + * @var string $dateFormat The current date format + */ + protected $dateFormat = self::DEFAULT_DATE_FORMAT; + + /** + * @var boolean $allowNewLines If newlines are allowed + */ + protected $allowNewLines = false; + + /** + * @param Google_Client $client The current Google client + */ + public function __construct(Google_Client $client) + { + $this->setLevel( + $client->getClassConfig('Google_Logger_Abstract', 'level') + ); + + $format = $client->getClassConfig('Google_Logger_Abstract', 'log_format'); + $this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT; + + $format = $client->getClassConfig('Google_Logger_Abstract', 'date_format'); + $this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT; + + $this->allowNewLines = (bool) $client->getClassConfig( + 'Google_Logger_Abstract', + 'allow_newlines' + ); + } + + /** + * Sets the minimum logging level that this logger handles. + * + * @param integer $level + */ + public function setLevel($level) + { + $this->level = $this->normalizeLevel($level); + } + + /** + * Checks if the logger should handle messages at the provided level. + * + * @param integer $level + * @return boolean + */ + public function shouldHandle($level) + { + return $this->normalizeLevel($level) >= $this->level; + } + + /** + * System is unusable. + * + * @param string $message The log message + * @param array $context The log context + */ + public function emergency($message, array $context = array()) + { + $this->log(self::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message The log message + * @param array $context The log context + */ + public function alert($message, array $context = array()) + { + $this->log(self::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message The log message + * @param array $context The log context + */ + public function critical($message, array $context = array()) + { + $this->log(self::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message The log message + * @param array $context The log context + */ + public function error($message, array $context = array()) + { + $this->log(self::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message The log message + * @param array $context The log context + */ + public function warning($message, array $context = array()) + { + $this->log(self::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message The log message + * @param array $context The log context + */ + public function notice($message, array $context = array()) + { + $this->log(self::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message The log message + * @param array $context The log context + */ + public function info($message, array $context = array()) + { + $this->log(self::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message The log message + * @param array $context The log context + */ + public function debug($message, array $context = array()) + { + $this->log(self::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level The log level + * @param string $message The log message + * @param array $context The log context + */ + public function log($level, $message, array $context = array()) + { + if (!$this->shouldHandle($level)) { + return false; + } + + $levelName = is_int($level) ? array_search($level, self::$levels) : $level; + $message = $this->interpolate( + array( + 'message' => $message, + 'context' => $context, + 'level' => strtoupper($levelName), + 'datetime' => new DateTime(), + ) + ); + + $this->write($message); + } + + /** + * Interpolates log variables into the defined log format. + * + * @param array $variables The log variables. + * @return string + */ + protected function interpolate(array $variables = array()) + { + $template = $this->logFormat; + + if (!$variables['context']) { + $template = str_replace('%context%', '', $template); + unset($variables['context']); + } else { + $this->reverseJsonInContext($variables['context']); + } + + foreach ($variables as $key => $value) { + if (strpos($template, '%'. $key .'%') !== false) { + $template = str_replace( + '%' . $key . '%', + $this->export($value), + $template + ); + } + } + + return $template; + } + + /** + * Reverses JSON encoded PHP arrays and objects so that they log better. + * + * @param array $context The log context + */ + protected function reverseJsonInContext(array &$context) + { + if (!$context) { + return; + } + + foreach ($context as $key => $val) { + if (!$val || !is_string($val) || !($val[0] == '{' || $val[0] == '[')) { + continue; + } + + $json = @json_decode($val); + if (is_object($json) || is_array($json)) { + $context[$key] = $json; + } + } + } + + /** + * Exports a PHP value for logging to a string. + * + * @param mixed $value The value to + */ + protected function export($value) + { + if (is_string($value)) { + if ($this->allowNewLines) { + return $value; + } + + return preg_replace('/[\r\n]+/', ' ', $value); + } + + if (is_resource($value)) { + return sprintf( + 'resource(%d) of type (%s)', + $value, + get_resource_type($value) + ); + } + + if ($value instanceof DateTime) { + return $value->format($this->dateFormat); + } + + if (version_compare(PHP_VERSION, '5.4.0', '>=')) { + $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + + if ($this->allowNewLines) { + $options |= JSON_PRETTY_PRINT; + } + + return @json_encode($value, $options); + } + + return str_replace('\\/', '/', @json_encode($value)); + } + + /** + * Converts a given log level to the integer form. + * + * @param mixed $level The logging level + * @return integer $level The normalized level + * @throws Google_Logger_Exception If $level is invalid + */ + protected function normalizeLevel($level) + { + if (is_int($level) && array_search($level, self::$levels) !== false) { + return $level; + } + + if (is_string($level) && isset(self::$levels[$level])) { + return self::$levels[$level]; + } + + throw new Google_Logger_Exception( + sprintf("Unknown LogLevel: '%s'", $level) + ); + } + + /** + * Writes a message to the current log implementation. + * + * @param string $message The message + */ + abstract protected function write($message); +} diff --git a/app/api/Google/Logger/Exception.php b/app/api/Google/Logger/Exception.php new file mode 100755 index 0000000..d3fcc92 --- /dev/null +++ b/app/api/Google/Logger/Exception.php @@ -0,0 +1,24 @@ +getClassConfig('Google_Logger_File', 'file'); + if (!is_string($file) && !is_resource($file)) { + throw new Google_Logger_Exception( + 'File logger requires a filename or a valid file pointer' + ); + } + + $mode = $client->getClassConfig('Google_Logger_File', 'mode'); + if (!$mode) { + $this->mode = $mode; + } + + $this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock'); + $this->file = $file; + } + + /** + * {@inheritdoc} + */ + protected function write($message) + { + if (is_string($this->file)) { + $this->open(); + } elseif (!is_resource($this->file)) { + throw new Google_Logger_Exception('File pointer is no longer available'); + } + + if ($this->lock) { + flock($this->file, LOCK_EX); + } + + fwrite($this->file, (string) $message); + + if ($this->lock) { + flock($this->file, LOCK_UN); + } + } + + /** + * Opens the log for writing. + * + * @return resource + */ + private function open() + { + // Used for trapping `fopen()` errors. + $this->trappedErrorNumber = null; + $this->trappedErrorString = null; + + $old = set_error_handler(array($this, 'trapError')); + + $needsChmod = !file_exists($this->file); + $fh = fopen($this->file, 'a'); + + restore_error_handler(); + + // Handles trapped `fopen()` errors. + if ($this->trappedErrorNumber) { + throw new Google_Logger_Exception( + sprintf( + "Logger Error: '%s'", + $this->trappedErrorString + ), + $this->trappedErrorNumber + ); + } + + if ($needsChmod) { + @chmod($this->file, $this->mode & ~umask()); + } + + return $this->file = $fh; + } + + /** + * Closes the log stream resource. + */ + private function close() + { + if (is_resource($this->file)) { + fclose($this->file); + } + } + + /** + * Traps `fopen()` errors. + * + * @param integer $errno The error number + * @param string $errstr The error string + */ + private function trapError($errno, $errstr) + { + $this->trappedErrorNumber = $errno; + $this->trappedErrorString = $errstr; + } + + public function __destruct() + { + $this->close(); + } +} diff --git a/app/api/Google/Logger/Null.php b/app/api/Google/Logger/Null.php new file mode 100755 index 0000000..3bd60a1 --- /dev/null +++ b/app/api/Google/Logger/Null.php @@ -0,0 +1,43 @@ +setLogger($logger); + } + } + + /** + * Sets the PSR-3 logger where logging will be delegated. + * + * NOTE: The `$logger` should technically implement + * `Psr\Log\LoggerInterface`, but we don't explicitly require this so that + * we can be compatible with PHP 5.2. + * + * @param Psr\Log\LoggerInterface $logger The PSR-3 logger + */ + public function setLogger(/*Psr\Log\LoggerInterface*/ $logger) + { + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function shouldHandle($level) + { + return isset($this->logger) && parent::shouldHandle($level); + } + + /** + * {@inheritdoc} + */ + public function log($level, $message, array $context = array()) + { + if (!$this->shouldHandle($level)) { + return false; + } + + if ($context) { + $this->reverseJsonInContext($context); + } + + $levelName = is_int($level) ? array_search($level, self::$levels) : $level; + $this->logger->log($levelName, $message, $context); + } + + /** + * {@inheritdoc} + */ + protected function write($message, array $context = array()) + { + } +} diff --git a/app/api/Google/Model.php b/app/api/Google/Model.php new file mode 100755 index 0000000..a2cbbe8 --- /dev/null +++ b/app/api/Google/Model.php @@ -0,0 +1,312 @@ +mapTypes($array); + } + $this->gapiInit(); + } + + /** + * Getter that handles passthrough access to the data array, and lazy object creation. + * @param string $key Property name. + * @return mixed The value if any, or null. + */ + public function __get($key) + { + $keyTypeName = $this->keyType($key); + $keyDataType = $this->dataType($key); + if (isset($this->$keyTypeName) && !isset($this->processed[$key])) { + if (isset($this->modelData[$key])) { + $val = $this->modelData[$key]; + } else if (isset($this->$keyDataType) && + ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) { + $val = []; + } else { + $val = null; + } + + if ($this->isAssociativeArray($val)) { + if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) { + foreach ($val as $arrayKey => $arrayItem) { + $this->modelData[$key][$arrayKey] = + $this->createObjectFromName($keyTypeName, $arrayItem); + } + } else { + $this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val); + } + } else if (is_array($val)) { + $arrayObject = []; + foreach ($val as $arrayIndex => $arrayItem) { + $arrayObject[$arrayIndex] = + $this->createObjectFromName($keyTypeName, $arrayItem); + } + $this->modelData[$key] = $arrayObject; + } + $this->processed[$key] = true; + } + + return isset($this->modelData[$key]) ? $this->modelData[$key] : null; + } + + /** + * Initialize this object's properties from an array. + * + * @param array $array Used to seed this object's properties. + * @return void + */ + protected function mapTypes($array) + { + // Hard initialise simple types, lazy load more complex ones. + foreach ($array as $key => $val) { + if ( !property_exists($this, $this->keyType($key)) && + property_exists($this, $key)) { + $this->$key = $val; + unset($array[$key]); + } elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) { + // This checks if property exists as camelCase, leaving it in array as snake_case + // in case of backwards compatibility issues. + $this->$camelKey = $val; + } + } + $this->modelData = $array; + } + + /** + * Blank initialiser to be used in subclasses to do post-construction initialisation - this + * avoids the need for subclasses to have to implement the variadics handling in their + * constructors. + */ + protected function gapiInit() + { + return; + } + + /** + * Create a simplified object suitable for straightforward + * conversion to JSON. This is relatively expensive + * due to the usage of reflection, but shouldn't be called + * a whole lot, and is the most straightforward way to filter. + */ + public function toSimpleObject() + { + $object = new stdClass(); + + // Process all other data. + foreach ($this->modelData as $key => $val) { + $result = $this->getSimpleValue($val); + if ($result !== null) { + $object->$key = $this->nullPlaceholderCheck($result); + } + } + + // Process all public properties. + $reflect = new ReflectionObject($this); + $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach ($props as $member) { + $name = $member->getName(); + $result = $this->getSimpleValue($this->$name); + if ($result !== null) { + $name = $this->getMappedName($name); + $object->$name = $this->nullPlaceholderCheck($result); + } + } + + return $object; + } + + /** + * Handle different types of values, primarily + * other objects and map and array data types. + */ + private function getSimpleValue($value) + { + if ($value instanceof Google_Model) { + return $value->toSimpleObject(); + } else if (is_array($value)) { + $return = []; + foreach ($value as $key => $a_value) { + $a_value = $this->getSimpleValue($a_value); + if ($a_value !== null) { + $key = $this->getMappedName($key); + $return[$key] = $this->nullPlaceholderCheck($a_value); + } + } + return $return; + } + return $value; + } + + /** + * Check whether the value is the null placeholder and return true null. + */ + private function nullPlaceholderCheck($value) + { + if ($value === self::NULL_VALUE) { + return null; + } + return $value; + } + + /** + * If there is an internal name mapping, use that. + */ + private function getMappedName($key) + { + if (isset($this->internal_gapi_mappings) && + isset($this->internal_gapi_mappings[$key])) { + $key = $this->internal_gapi_mappings[$key]; + } + return $key; + } + + /** + * Returns true only if the array is associative. + * @param array $array + * @return bool True if the array is associative. + */ + protected function isAssociativeArray($array) + { + if (!is_array($array)) { + return false; + } + $keys = array_keys($array); + foreach ($keys as $key) { + if (is_string($key)) { + return true; + } + } + return false; + } + + /** + * Given a variable name, discover its type. + * + * @param $name + * @param $item + * @return object The object from the item. + */ + private function createObjectFromName($name, $item) + { + $type = $this->$name; + return new $type($item); + } + + /** + * Verify if $obj is an array. + * @throws Google_Exception Thrown if $obj isn't an array. + * @param array $obj Items that should be validated. + * @param string $method Method expecting an array as an argument. + */ + public function assertIsArray($obj, $method) + { + if ($obj && !is_array($obj)) { + throw new Google_Exception( + "Incorrect parameter type passed to $method(). Expected an array." + ); + } + } + + /** + * @param mixed $offset + * @return bool + */ + public function offsetExists($offset) + { + return isset($this->$offset) || isset($this->modelData[$offset]); + } + + /** + * @param mixed $offset + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->$offset) ? + $this->$offset : + $this->__get($offset); + } + + /** + * @param mixed $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset, $value) + { + if (property_exists($this, $offset)) { + $this->$offset = $value; + } else { + $this->modelData[$offset] = $value; + $this->processed[$offset] = true; + } + } + + /** + * @param mixed $offset + * @return void + */ + public function offsetUnset($offset) + { + unset($this->modelData[$offset]); + } + + protected function keyType($key) + { + return $key . "Type"; + } + + protected function dataType($key) + { + return $key . "DataType"; + } + + public function __isset($key) + { + return isset($this->modelData[$key]); + } + + public function __unset($key) + { + unset($this->modelData[$key]); + } +} diff --git a/app/api/Google/Service.php b/app/api/Google/Service.php new file mode 100755 index 0000000..0848ac4 --- /dev/null +++ b/app/api/Google/Service.php @@ -0,0 +1,56 @@ +client = $client; + } + + /** + * Return the associated Google_Client class. + * @return Google_Client + */ + public function getClient() + { + return $this->client; + } + + /** + * Create a new HTTP Batch handler for this service + * + * @return Google_Http_Batch + */ + public function createBatch() + { + return new Google_Http_Batch( + $this->client, + false, + $this->rootUrl, + $this->batchPath + ); + } +} diff --git a/app/api/Google/Service/Calendar.php b/app/api/Google/Service/Calendar.php new file mode 100755 index 0000000..2ce6985 --- /dev/null +++ b/app/api/Google/Service/Calendar.php @@ -0,0 +1,3856 @@ + + * Lets you manipulate events and other calendar data.

+ * + *
if the object exists in live mode or the value false if the object exists in test mode. + */ +class ApplePayDomain extends ApiResource +{ + const OBJECT_NAME = 'apple_pay_domain'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + + /** + * @return string The class URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public static function classUrl() + { + return '/v1/apple_pay/domains'; + } +} diff --git a/app/api/Stripe/ApplicationFee.php b/app/api/Stripe/ApplicationFee.php new file mode 100755 index 0000000..364ca17 --- /dev/null +++ b/app/api/Stripe/ApplicationFee.php @@ -0,0 +1,90 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\Charge $originating_transaction ID of the corresponding charge on the platform account, if this fee was the result of a charge using the destination parameter. + * @property bool $refunded Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false. + * @property \Stripe\Collection $refunds A list of refunds that have been applied to the fee. + */ +class ApplicationFee extends ApiResource +{ + const OBJECT_NAME = 'application_fee'; + + use ApiOperations\All; + use ApiOperations\NestedResource; + use ApiOperations\Retrieve; + + const PATH_REFUNDS = '/refunds'; + + /** + * @param string $id the ID of the application fee on which to retrieve the fee refunds + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of fee refunds + */ + public static function allRefunds($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_REFUNDS, $params, $opts); + } + + /** + * @param string $id the ID of the application fee on which to create the fee refund + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public static function createRefund($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_REFUNDS, $params, $opts); + } + + /** + * @param string $id the ID of the application fee to which the fee refund belongs + * @param string $refundId the ID of the fee refund to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public static function retrieveRefund($id, $refundId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); + } + + /** + * @param string $id the ID of the application fee to which the fee refund belongs + * @param string $refundId the ID of the fee refund to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public static function updateRefund($id, $refundId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); + } +} diff --git a/app/api/Stripe/ApplicationFeeRefund.php b/app/api/Stripe/ApplicationFeeRefund.php new file mode 100755 index 0000000..12ccb9b --- /dev/null +++ b/app/api/Stripe/ApplicationFeeRefund.php @@ -0,0 +1,66 @@ +Application Fee Refund objects allow you to refund an application + * fee that has previously been created but not yet refunded. Funds will be + * refunded to the Stripe account from which the fee was originally collected. + * + * Related guide: Refunding + * Application Fees. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in %s. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string|\Stripe\ApplicationFee $fee ID of the application fee that was refunded. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + */ +class ApplicationFeeRefund extends ApiResource +{ + const OBJECT_NAME = 'fee_refund'; + + use ApiOperations\Update { + save as protected _save; + } + + /** + * @return string the API URL for this Stripe refund + */ + public function instanceUrl() + { + $id = $this['id']; + $fee = $this['fee']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' . + "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $fee = Util\Util::utf8($fee); + + $base = ApplicationFee::classUrl(); + $feeExtn = \urlencode($fee); + $extn = \urlencode($id); + + return "{$base}/{$feeExtn}/refunds/{$extn}"; + } + + /** + * @param null|array|string $opts + * + * @return ApplicationFeeRefund the saved refund + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/app/api/Stripe/Balance.php b/app/api/Stripe/Balance.php new file mode 100755 index 0000000..efc815c --- /dev/null +++ b/app/api/Stripe/Balance.php @@ -0,0 +1,45 @@ +transactions + * that contributed to the balance (charges, payouts, and so forth). + * + * The available and pending amounts for each currency are broken down further by + * payment source types. + * + * Related guide: Understanding Connect + * Account Balances. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject[] $available Funds that are available to be transferred or paid out, whether automatically by Stripe or explicitly via the Transfers API or Payouts API. The available balance for each currency and payment type can be found in the source_types property. + * @property \Stripe\StripeObject[] $connect_reserved Funds held due to negative balances on connected Custom accounts. The connect reserve balance for each currency and payment type can be found in the source_types property. + * @property \Stripe\StripeObject[] $instant_available Funds that can be paid out using Instant Payouts. + * @property \Stripe\StripeObject $issuing + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject[] $pending Funds that are not yet available in the balance, due to the 7-day rolling pay cycle. The pending balance for each currency, and for each payment type, can be found in the source_types property. + */ +class Balance extends SingletonApiResource +{ + const OBJECT_NAME = 'balance'; + + /** + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Balance + */ + public static function retrieve($opts = null) + { + return self::_singletonRetrieve($opts); + } +} diff --git a/app/api/Stripe/BalanceTransaction.php b/app/api/Stripe/BalanceTransaction.php new file mode 100755 index 0000000..29246ae --- /dev/null +++ b/app/api/Stripe/BalanceTransaction.php @@ -0,0 +1,71 @@ +Balance + * Transaction Types. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Gross amount of the transaction, in %s. + * @property int $available_on The date the transaction's net funds will become available in the Stripe balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|float $exchange_rate The exchange rate used, if applicable, for this transaction. Specifically, if money was converted from currency A to currency B, then the amount in currency A, times exchange_rate, would be the amount in currency B. For example, suppose you charged a customer 10.00 EUR. Then the PaymentIntent's amount would be 1000 and currency would be eur. Suppose this was converted into 12.34 USD in your Stripe account. Then the BalanceTransaction's amount would be 1234, currency would be usd, and exchange_rate would be 1.234. + * @property int $fee Fees (in %s) paid for this transaction. + * @property \Stripe\StripeObject[] $fee_details Detailed breakdown of fees (in %s) paid for this transaction. + * @property int $net Net amount of the transaction, in %s. + * @property string $reporting_category Learn more about how reporting categories can help you understand balance transactions from an accounting perspective. + * @property null|string|\Stripe\StripeObject $source The Stripe object to which this transaction is related. + * @property string $status If the transaction's net funds are available in the Stripe balance yet. Either available or pending. + * @property string $type Transaction type: adjustment, advance, advance_funding, anticipation_repayment, application_fee, application_fee_refund, charge, connect_collection_transfer, contribution, issuing_authorization_hold, issuing_authorization_release, issuing_dispute, issuing_transaction, payment, payment_failure_refund, payment_refund, payout, payout_cancel, payout_failure, refund, refund_failure, reserve_transaction, reserved_funds, stripe_fee, stripe_fx_fee, tax_fee, topup, topup_reversal, transfer, transfer_cancel, transfer_failure, or transfer_refund. Learn more about balance transaction types and what they represent. If you are looking to classify transactions for accounting purposes, you might want to consider reporting_category instead. + */ +class BalanceTransaction extends ApiResource +{ + const OBJECT_NAME = 'balance_transaction'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + + const TYPE_ADJUSTMENT = 'adjustment'; + const TYPE_ADVANCE = 'advance'; + const TYPE_ADVANCE_FUNDING = 'advance_funding'; + const TYPE_ANTICIPATION_REPAYMENT = 'anticipation_repayment'; + const TYPE_APPLICATION_FEE = 'application_fee'; + const TYPE_APPLICATION_FEE_REFUND = 'application_fee_refund'; + const TYPE_CHARGE = 'charge'; + const TYPE_CONNECT_COLLECTION_TRANSFER = 'connect_collection_transfer'; + const TYPE_CONTRIBUTION = 'contribution'; + const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; + const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; + const TYPE_ISSUING_DISPUTE = 'issuing_dispute'; + const TYPE_ISSUING_TRANSACTION = 'issuing_transaction'; + const TYPE_PAYMENT = 'payment'; + const TYPE_PAYMENT_FAILURE_REFUND = 'payment_failure_refund'; + const TYPE_PAYMENT_REFUND = 'payment_refund'; + const TYPE_PAYOUT = 'payout'; + const TYPE_PAYOUT_CANCEL = 'payout_cancel'; + const TYPE_PAYOUT_FAILURE = 'payout_failure'; + const TYPE_REFUND = 'refund'; + const TYPE_REFUND_FAILURE = 'refund_failure'; + const TYPE_RESERVE_TRANSACTION = 'reserve_transaction'; + const TYPE_RESERVED_FUNDS = 'reserved_funds'; + const TYPE_STRIPE_FEE = 'stripe_fee'; + const TYPE_STRIPE_FX_FEE = 'stripe_fx_fee'; + const TYPE_TAX_FEE = 'tax_fee'; + const TYPE_TOPUP = 'topup'; + const TYPE_TOPUP_REVERSAL = 'topup_reversal'; + const TYPE_TRANSFER = 'transfer'; + const TYPE_TRANSFER_CANCEL = 'transfer_cancel'; + const TYPE_TRANSFER_FAILURE = 'transfer_failure'; + const TYPE_TRANSFER_REFUND = 'transfer_refund'; +} diff --git a/app/api/Stripe/BankAccount.php b/app/api/Stripe/BankAccount.php new file mode 100755 index 0000000..08e0295 --- /dev/null +++ b/app/api/Stripe/BankAccount.php @@ -0,0 +1,132 @@ +Customer objects. + * + * On the other hand External Accounts are + * transfer destinations on Account objects for Custom accounts. They + * can be bank accounts or debit cards as well, and are documented in the links + * above. + * + * Related guide: Bank Debits and + * Transfers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string|\Stripe\Account $account The ID of the account that the bank account is associated with. + * @property null|string $account_holder_name The name of the person or business that owns the bank account. + * @property null|string $account_holder_type The type of entity that holds the account. This can be either individual or company. + * @property null|string[] $available_payout_methods A set of available payout methods for this bank account. Only values from this set should be passed as the method when creating a payout. + * @property null|string $bank_name Name of the bank associated with the routing number (e.g., WELLS FARGO). + * @property string $country Two-letter ISO code representing the country the bank account is located in. + * @property string $currency Three-letter ISO code for the currency paid out to the bank account. + * @property null|string|\Stripe\Customer $customer The ID of the customer that the bank account is associated with. + * @property null|bool $default_for_currency Whether this bank account is the default external account for its currency. + * @property null|string $fingerprint Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. + * @property string $last4 The last four digits of the bank account number. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $routing_number The routing transit number for the bank account. + * @property string $status

For bank accounts, possible values are new, validated, verified, verification_failed, or errored. A bank account that hasn't had any activity or validation performed is new. If Stripe can determine that the bank account exists, its status will be validated. Note that there often isn’t enough information to know (e.g., for smaller credit unions), and the validation is not always run. If customer bank account verification has succeeded, the bank account status will be verified. If the verification failed for any reason, such as microdeposit failure, the status will be verification_failed. If a transfer sent to this bank account fails, we'll set the status to errored and will not continue to send transfers until the bank details are updated.

For external accounts, possible values are new and errored. Validations aren't run against external accounts because they're only used for payouts. This means the other statuses don't apply. If a transfer fails, the status is set to errored and transfers are stopped until account details are updated.

+ */ +class BankAccount extends ApiResource +{ + const OBJECT_NAME = 'bank_account'; + + use ApiOperations\Delete; + use ApiOperations\Update; + + /** + * Possible string representations of the bank verification status. + * + * @see https://stripe.com/docs/api/external_account_bank_accounts/object#account_bank_account_object-status + */ + const STATUS_NEW = 'new'; + const STATUS_VALIDATED = 'validated'; + const STATUS_VERIFIED = 'verified'; + const STATUS_VERIFICATION_FAILED = 'verification_failed'; + const STATUS_ERRORED = 'errored'; + + /** + * @return string The instance URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public function instanceUrl() + { + if ($this['customer']) { + $base = Customer::classUrl(); + $parent = $this['customer']; + $path = 'sources'; + } elseif ($this['account']) { + $base = Account::classUrl(); + $parent = $this['account']; + $path = 'external_accounts'; + } else { + $msg = 'Bank accounts cannot be accessed without a customer ID or account ID.'; + + throw new Exception\UnexpectedValueException($msg, null); + } + $parentExtn = \urlencode(Util\Util::utf8($parent)); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$parentExtn}/{$path}/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Bank accounts cannot be retrieved without a customer ID or ' . + 'an account ID. Retrieve a bank account using ' . + "`Customer::retrieveSource('customer_id', " . + "'bank_account_id')` or `Account::retrieveExternalAccount(" . + "'account_id', 'bank_account_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Bank accounts cannot be updated without a customer ID or an ' . + 'account ID. Update a bank account using ' . + "`Customer::updateSource('customer_id', 'bank_account_id', " . + '$updateParams)` or `Account::updateExternalAccount(' . + "'account_id', 'bank_account_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return BankAccount the verified bank account + */ + public function verify($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/BaseStripeClient.php b/app/api/Stripe/BaseStripeClient.php new file mode 100755 index 0000000..30cdc27 --- /dev/null +++ b/app/api/Stripe/BaseStripeClient.php @@ -0,0 +1,269 @@ + */ + private $config; + + /** @var \Stripe\Util\RequestOptions */ + private $defaultOpts; + + /** + * Initializes a new instance of the {@link BaseStripeClient} class. + * + * The constructor takes a single argument. The argument can be a string, in which case it + * should be the API key. It can also be an array with various configuration settings. + * + * Configuration settings include the following options: + * + * - api_key (null|string): the Stripe API key, to be used in regular API requests. + * - client_id (null|string): the Stripe client ID, to be used in OAuth requests. + * - stripe_account (null|string): a Stripe account ID. If set, all requests sent by the client + * will automatically use the {@code Stripe-Account} header with that account ID. + * - stripe_version (null|string): a Stripe API verion. If set, all requests sent by the client + * will include the {@code Stripe-Version} header with that API version. + * + * The following configuration settings are also available, though setting these should rarely be necessary + * (only useful if you want to send requests to a mock server like stripe-mock): + * + * - api_base (string): the base URL for regular API requests. Defaults to + * {@link DEFAULT_API_BASE}. + * - connect_base (string): the base URL for OAuth requests. Defaults to + * {@link DEFAULT_CONNECT_BASE}. + * - files_base (string): the base URL for file creation requests. Defaults to + * {@link DEFAULT_FILES_BASE}. + * + * @param array|string $config the API key as a string, or an array containing + * the client configuration settings + */ + public function __construct($config = []) + { + if (\is_string($config)) { + $config = ['api_key' => $config]; + } elseif (!\is_array($config)) { + throw new \Stripe\Exception\InvalidArgumentException('$config must be a string or an array'); + } + + $config = \array_merge($this->getDefaultConfig(), $config); + $this->validateConfig($config); + + $this->config = $config; + + $this->defaultOpts = \Stripe\Util\RequestOptions::parse([ + 'stripe_account' => $config['stripe_account'], + 'stripe_version' => $config['stripe_version'], + ]); + } + + /** + * Gets the API key used by the client to send requests. + * + * @return null|string the API key used by the client to send requests + */ + public function getApiKey() + { + return $this->config['api_key']; + } + + /** + * Gets the client ID used by the client in OAuth requests. + * + * @return null|string the client ID used by the client in OAuth requests + */ + public function getClientId() + { + return $this->config['client_id']; + } + + /** + * Gets the base URL for Stripe's API. + * + * @return string the base URL for Stripe's API + */ + public function getApiBase() + { + return $this->config['api_base']; + } + + /** + * Gets the base URL for Stripe's OAuth API. + * + * @return string the base URL for Stripe's OAuth API + */ + public function getConnectBase() + { + return $this->config['connect_base']; + } + + /** + * Gets the base URL for Stripe's Files API. + * + * @return string the base URL for Stripe's Files API + */ + public function getFilesBase() + { + return $this->config['files_base']; + } + + /** + * Sends a request to Stripe's API. + * + * @param string $method the HTTP method + * @param string $path the path of the request + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return \Stripe\StripeObject the object returned by Stripe's API + */ + public function request($method, $path, $params, $opts) + { + $opts = $this->defaultOpts->merge($opts, true); + $baseUrl = $opts->apiBase ?: $this->getApiBase(); + $requestor = new \Stripe\ApiRequestor($this->apiKeyForRequest($opts), $baseUrl); + list($response, $opts->apiKey) = $requestor->request($method, $path, $params, $opts->headers); + $opts->discardNonPersistentHeaders(); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Sends a request to Stripe's API. + * + * @param string $method the HTTP method + * @param string $path the path of the request + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return \Stripe\Collection of ApiResources + */ + public function requestCollection($method, $path, $params, $opts) + { + $obj = $this->request($method, $path, $params, $opts); + if (!($obj instanceof \Stripe\Collection)) { + $received_class = \get_class($obj); + $msg = "Expected to receive `Stripe\\Collection` object from Stripe API. Instead received `{$received_class}`."; + + throw new \Stripe\Exception\UnexpectedValueException($msg); + } + $obj->setFilters($params); + + return $obj; + } + + /** + * @param \Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\AuthenticationException + * + * @return string + */ + private function apiKeyForRequest($opts) + { + $apiKey = $opts->apiKey ?: $this->getApiKey(); + + if (null === $apiKey) { + $msg = 'No API key provided. Set your API key when constructing the ' + . 'StripeClient instance, or provide it on a per-request basis ' + . 'using the `api_key` key in the $opts argument.'; + + throw new \Stripe\Exception\AuthenticationException($msg); + } + + return $apiKey; + } + + /** + * TODO: replace this with a private constant when we drop support for PHP < 5. + * + * @return array + */ + private function getDefaultConfig() + { + return [ + 'api_key' => null, + 'client_id' => null, + 'stripe_account' => null, + 'stripe_version' => null, + 'api_base' => self::DEFAULT_API_BASE, + 'connect_base' => self::DEFAULT_CONNECT_BASE, + 'files_base' => self::DEFAULT_FILES_BASE, + ]; + } + + /** + * @param array $config + * + * @throws \Stripe\Exception\InvalidArgumentException + */ + private function validateConfig($config) + { + // api_key + if (null !== $config['api_key'] && !\is_string($config['api_key'])) { + throw new \Stripe\Exception\InvalidArgumentException('api_key must be null or a string'); + } + + if (null !== $config['api_key'] && ('' === $config['api_key'])) { + $msg = 'api_key cannot be the empty string'; + + throw new \Stripe\Exception\InvalidArgumentException($msg); + } + + if (null !== $config['api_key'] && (\preg_match('/\s/', $config['api_key']))) { + $msg = 'api_key cannot contain whitespace'; + + throw new \Stripe\Exception\InvalidArgumentException($msg); + } + + // client_id + if (null !== $config['client_id'] && !\is_string($config['client_id'])) { + throw new \Stripe\Exception\InvalidArgumentException('client_id must be null or a string'); + } + + // stripe_account + if (null !== $config['stripe_account'] && !\is_string($config['stripe_account'])) { + throw new \Stripe\Exception\InvalidArgumentException('stripe_account must be null or a string'); + } + + // stripe_version + if (null !== $config['stripe_version'] && !\is_string($config['stripe_version'])) { + throw new \Stripe\Exception\InvalidArgumentException('stripe_version must be null or a string'); + } + + // api_base + if (!\is_string($config['api_base'])) { + throw new \Stripe\Exception\InvalidArgumentException('api_base must be a string'); + } + + // connect_base + if (!\is_string($config['connect_base'])) { + throw new \Stripe\Exception\InvalidArgumentException('connect_base must be a string'); + } + + // files_base + if (!\is_string($config['files_base'])) { + throw new \Stripe\Exception\InvalidArgumentException('files_base must be a string'); + } + + // check absence of extra keys + $extraConfigKeys = \array_diff(\array_keys($config), \array_keys($this->getDefaultConfig())); + if (!empty($extraConfigKeys)) { + // Wrap in single quote to more easily catch trailing spaces errors + $invalidKeys = "'" . \implode("', '", $extraConfigKeys) . "'"; + + throw new \Stripe\Exception\InvalidArgumentException('Found unknown key(s) in configuration array: ' . $invalidKeys); + } + } +} diff --git a/app/api/Stripe/BillingPortal/Configuration.php b/app/api/Stripe/BillingPortal/Configuration.php new file mode 100755 index 0000000..3cb5676 --- /dev/null +++ b/app/api/Stripe/BillingPortal/Configuration.php @@ -0,0 +1,31 @@ +overriden when creating the session. + * @property \Stripe\StripeObject $features + * @property bool $is_default Whether the configuration is the default. If true, this configuration can be managed in the Dashboard and portal sessions will use this configuration unless it is overriden when creating the session. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + */ +class Configuration extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing_portal.configuration'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/BillingPortal/Session.php b/app/api/Stripe/BillingPortal/Session.php new file mode 100755 index 0000000..ede9472 --- /dev/null +++ b/app/api/Stripe/BillingPortal/Session.php @@ -0,0 +1,42 @@ +product + * overview and integration + * guide. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string|\Stripe\BillingPortal\Configuration $configuration The configuration used by this session, describing the features available. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $customer The ID of the customer for this session. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $on_behalf_of The account for which the session was created on behalf of. When specified, only subscriptions and invoices with this on_behalf_of account appear in the portal. For more information, see the docs. Use the Accounts API to modify the on_behalf_of account's branding settings, which the portal displays. + * @property string $return_url The URL to redirect customers to when they click on the portal's link to return to your website. + * @property string $url The short-lived URL of the session that gives customers access to the customer portal. + */ +class Session extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing_portal.session'; + + use \Stripe\ApiOperations\Create; +} diff --git a/app/api/Stripe/BitcoinReceiver.php b/app/api/Stripe/BitcoinReceiver.php new file mode 100755 index 0000000..8abe693 --- /dev/null +++ b/app/api/Stripe/BitcoinReceiver.php @@ -0,0 +1,71 @@ +currency that you are collecting as payment. + * @property int $amount_received The amount of currency to which bitcoin_amount_received has been converted. + * @property int $bitcoin_amount The amount of bitcoin that the customer should send to fill the receiver. The bitcoin_amount is denominated in Satoshi: there are 10^8 Satoshi in one bitcoin. + * @property int $bitcoin_amount_received The amount of bitcoin that has been sent by the customer to this receiver. + * @property string $bitcoin_uri This URI can be displayed to the customer as a clickable link (to activate their bitcoin client) or as a QR code (for mobile wallets). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO code for the currency to which the bitcoin will be converted. + * @property null|string $customer The customer ID of the bitcoin receiver. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $email The customer's email address, set by the API call that creates the receiver. + * @property bool $filled This flag is initially false and updates to true when the customer sends the bitcoin_amount to this receiver. + * @property string $inbound_address A bitcoin address that is specific to this receiver. The customer can send bitcoin to this address to fill the receiver. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $payment The ID of the payment created from the receiver, if any. Hidden when viewing the receiver with a publishable key. + * @property null|string $refund_address The refund address of this bitcoin receiver. + * @property \Stripe\Collection $transactions A list with one entry for each time that the customer sent bitcoin to the receiver. Hidden when viewing the receiver with a publishable key. + * @property bool $uncaptured_funds This receiver contains uncaptured funds that can be used for a payment or refunded. + * @property null|bool $used_for_payment Indicate if this source is used for payment. + */ +class BitcoinReceiver extends ApiResource +{ + const OBJECT_NAME = 'bitcoin_receiver'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + + /** + * @return string The class URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public static function classUrl() + { + return '/v1/bitcoin/receivers'; + } + + /** + * @return string The instance URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public function instanceUrl() + { + if ($this['customer']) { + $base = Customer::classUrl(); + $parent = $this['customer']; + $path = 'sources'; + $parentExtn = \urlencode(Util\Util::utf8($parent)); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$parentExtn}/{$path}/{$extn}"; + } + + $base = BitcoinReceiver::classUrl(); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$extn}"; + } +} diff --git a/app/api/Stripe/BitcoinTransaction.php b/app/api/Stripe/BitcoinTransaction.php new file mode 100755 index 0000000..35e3624 --- /dev/null +++ b/app/api/Stripe/BitcoinTransaction.php @@ -0,0 +1,19 @@ +currency that the transaction was converted to in real-time. + * @property int $bitcoin_amount The amount of bitcoin contained in the transaction. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO code for the currency to which this transaction was converted. + * @property string $receiver The receiver to which this transaction was sent. + */ +class BitcoinTransaction extends ApiResource +{ + const OBJECT_NAME = 'bitcoin_transaction'; +} diff --git a/app/api/Stripe/Capability.php b/app/api/Stripe/Capability.php new file mode 100755 index 0000000..29731c9 --- /dev/null +++ b/app/api/Stripe/Capability.php @@ -0,0 +1,87 @@ +Account + * capabilities. + * + * @property string $id The identifier for the capability. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string|\Stripe\Account $account The account for which the capability enables functionality. + * @property bool $requested Whether the capability has been requested. + * @property null|int $requested_at Time at which the capability was requested. Measured in seconds since the Unix epoch. + * @property \Stripe\StripeObject $requirements + * @property string $status The status of the capability. Can be active, inactive, pending, or unrequested. + */ +class Capability extends ApiResource +{ + const OBJECT_NAME = 'capability'; + + use ApiOperations\Update; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_PENDING = 'pending'; + const STATUS_UNREQUESTED = 'unrequested'; + + /** + * @return string the API URL for this Stripe account reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $account = $this['account']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' . + "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $account = Util\Util::utf8($account); + + $base = Account::classUrl(); + $accountExtn = \urlencode($account); + $extn = \urlencode($id); + + return "{$base}/{$accountExtn}/capabilities/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Capabilities cannot be retrieved without an account ID. ' . + 'Retrieve a capability using `Account::retrieveCapability(' . + "'account_id', 'capability_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Capabilities cannot be updated without an account ID. ' . + 'Update a capability using `Account::updateCapability(' . + "'account_id', 'capability_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/app/api/Stripe/Card.php b/app/api/Stripe/Card.php new file mode 100755 index 0000000..2e18ad6 --- /dev/null +++ b/app/api/Stripe/Card.php @@ -0,0 +1,142 @@ +Card Payments + * with Sources. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string|\Stripe\Account $account The account this card belongs to. This attribute will not be in the card object if the card belongs to a customer or recipient instead. + * @property null|string $address_city City/District/Suburb/Town/Village. + * @property null|string $address_country Billing address country, if provided when creating card. + * @property null|string $address_line1 Address line 1 (Street address/PO Box/Company name). + * @property null|string $address_line1_check If address_line1 was provided, results of the check: pass, fail, unavailable, or unchecked. + * @property null|string $address_line2 Address line 2 (Apartment/Suite/Unit/Building). + * @property null|string $address_state State/County/Province/Region. + * @property null|string $address_zip ZIP or postal code. + * @property null|string $address_zip_check If address_zip was provided, results of the check: pass, fail, unavailable, or unchecked. + * @property null|string[] $available_payout_methods A set of available payout methods for this card. Only values from this set should be passed as the method when creating a payout. + * @property string $brand Card brand. Can be American Express, Diners Club, Discover, JCB, MasterCard, UnionPay, Visa, or Unknown. + * @property null|string $country Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + * @property null|string $currency Three-letter ISO code for currency. Only applicable on accounts (not customers or recipients). The card can be used as a transfer destination for funds in this currency. + * @property null|string|\Stripe\Customer $customer The customer that this card belongs to. This attribute will not be in the card object if the card belongs to an account or recipient instead. + * @property null|string $cvc_check If a CVC was provided, results of the check: pass, fail, unavailable, or unchecked. A result of unchecked indicates that CVC was provided but hasn't been checked yet. Checks are typically performed when attaching a card to a Customer object, or when creating a charge. For more details, see Check if a card is valid without a charge. + * @property null|bool $default_for_currency Whether this card is the default external account for its currency. + * @property null|string $dynamic_last4 (For tokenized numbers only.) The last four digits of the device account number. + * @property int $exp_month Two-digit number representing the card's expiration month. + * @property int $exp_year Four-digit number representing the card's expiration year. + * @property null|string $fingerprint Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number. + * @property string $funding Card funding type. Can be credit, debit, prepaid, or unknown. + * @property string $last4 The last four digits of the card. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name Cardholder name. + * @property null|string|\Stripe\Recipient $recipient The recipient that this card belongs to. This attribute will not be in the card object if the card belongs to a customer or account instead. + * @property null|string $tokenization_method If the card number is tokenized, this is the method that was used. Can be android_pay (includes Google Pay), apple_pay, masterpass, visa_checkout, or null. + */ +class Card extends ApiResource +{ + const OBJECT_NAME = 'card'; + + use ApiOperations\Delete; + use ApiOperations\Update; + + /** + * Possible string representations of the CVC check status. + * + * @see https://stripe.com/docs/api/cards/object#card_object-cvc_check + */ + const CVC_CHECK_FAIL = 'fail'; + const CVC_CHECK_PASS = 'pass'; + const CVC_CHECK_UNAVAILABLE = 'unavailable'; + const CVC_CHECK_UNCHECKED = 'unchecked'; + + /** + * Possible string representations of the funding of the card. + * + * @see https://stripe.com/docs/api/cards/object#card_object-funding + */ + const FUNDING_CREDIT = 'credit'; + const FUNDING_DEBIT = 'debit'; + const FUNDING_PREPAID = 'prepaid'; + const FUNDING_UNKNOWN = 'unknown'; + + /** + * Possible string representations of the tokenization method when using Apple Pay or Google Pay. + * + * @see https://stripe.com/docs/api/cards/object#card_object-tokenization_method + */ + const TOKENIZATION_METHOD_APPLE_PAY = 'apple_pay'; + const TOKENIZATION_METHOD_GOOGLE_PAY = 'google_pay'; + + /** + * @return string The instance URL for this resource. It needs to be special + * cased because cards are nested resources that may belong to different + * top-level resources. + */ + public function instanceUrl() + { + if ($this['customer']) { + $base = Customer::classUrl(); + $parent = $this['customer']; + $path = 'sources'; + } elseif ($this['account']) { + $base = Account::classUrl(); + $parent = $this['account']; + $path = 'external_accounts'; + } elseif ($this['recipient']) { + $base = Recipient::classUrl(); + $parent = $this['recipient']; + $path = 'cards'; + } else { + $msg = 'Cards cannot be accessed without a customer ID, account ID or recipient ID.'; + + throw new Exception\UnexpectedValueException($msg); + } + $parentExtn = \urlencode(Util\Util::utf8($parent)); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$parentExtn}/{$path}/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Cards cannot be retrieved without a customer ID or an ' . + 'account ID. Retrieve a card using ' . + "`Customer::retrieveSource('customer_id', 'card_id')` or " . + "`Account::retrieveExternalAccount('account_id', 'card_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Cards cannot be updated without a customer ID or an ' . + 'account ID. Update a card using ' . + "`Customer::updateSource('customer_id', 'card_id', " . + '$updateParams)` or `Account::updateExternalAccount(' . + "'account_id', 'card_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/app/api/Stripe/Charge.php b/app/api/Stripe/Charge.php new file mode 100755 index 0000000..c7bbac9 --- /dev/null +++ b/app/api/Stripe/Charge.php @@ -0,0 +1,146 @@ +Charge object. You + * can retrieve and refund individual charges as well as list all charges. Charges + * are identified by a unique, random ID. + * + * Related guide: Accept a + * payment with the Charges API. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount intended to be collected by this payment. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + * @property int $amount_captured Amount in %s captured (can be less than the amount attribute on the charge if a partial capture was made). + * @property int $amount_refunded Amount in %s refunded (can be less than the amount attribute on the charge if a partial refund was issued). + * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the charge. + * @property null|string|\Stripe\ApplicationFee $application_fee The application fee (if any) for the charge. See the Connect documentation for details. + * @property null|int $application_fee_amount The amount of the application fee (if any) requested for the charge. See the Connect documentation for details. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this charge on your account balance (not including refunds or disputes). + * @property \Stripe\StripeObject $billing_details + * @property null|string $calculated_statement_descriptor The full statement descriptor that is passed to card networks, and that is displayed on your customers' credit card and bank statements. Allows you to see what the statement descriptor looks like after the static and dynamic portions are combined. + * @property bool $captured If the charge was created without capturing, this Boolean represents whether it is still uncaptured or has since been captured. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Customer $customer ID of the customer this charge is for if one exists. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string|\Stripe\Account $destination ID of an existing, connected Stripe account to transfer funds to if transfer_data was specified in the charge request. + * @property null|string|\Stripe\Dispute $dispute Details about the dispute if the charge has been disputed. + * @property bool $disputed Whether the charge has been disputed. + * @property null|string $failure_code Error code explaining reason for charge failure if available (see the errors section for a list of codes). + * @property null|string $failure_message Message to user further explaining reason for charge failure if available. + * @property null|\Stripe\StripeObject $fraud_details Information on fraud assessments for the charge. + * @property null|string|\Stripe\Invoice $invoice ID of the invoice this charge is for if one exists. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string|\Stripe\Account $on_behalf_of The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the Connect documentation for details. + * @property null|string|\Stripe\Order $order ID of the order this charge is for if one exists. + * @property null|\Stripe\StripeObject $outcome Details about whether the payment was accepted, and why. See understanding declines for details. + * @property bool $paid true if the charge succeeded, or was successfully authorized for later capture. + * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent associated with this charge, if one exists. + * @property null|string $payment_method ID of the payment method used in this charge. + * @property null|\Stripe\StripeObject $payment_method_details Details about the payment method at the time of the transaction. + * @property null|string $receipt_email This is the email address that the receipt for this charge was sent to. + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this charge. This attribute will be null until a receipt has been sent. + * @property null|string $receipt_url This is the URL to view the receipt for this charge. The receipt is kept up-to-date to the latest state of the charge, including any refunds. If the charge is for an Invoice, the receipt will be stylized as an Invoice receipt. + * @property bool $refunded Whether the charge has been fully refunded. If the charge is only partially refunded, this attribute will still be false. + * @property \Stripe\Collection $refunds A list of refunds that have been applied to the charge. + * @property null|string|\Stripe\Review $review ID of the review associated with this charge if one exists. + * @property null|\Stripe\StripeObject $shipping Shipping information for the charge. + * @property null|\Stripe\Account|\Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source $source This is a legacy field that will be removed in the future. It contains the Source, Card, or BankAccount object used for the charge. For details about the payment method used for this charge, refer to payment_method or payment_method_details instead. + * @property null|string|\Stripe\Transfer $source_transfer The transfer ID which created this charge. Only present if the charge came from another Stripe account. See the Connect documentation for details. + * @property null|string $statement_descriptor For card charges, use statement_descriptor_suffix instead. Otherwise, you can use this value as the complete description of a charge on your customers’ statements. Must contain at least one letter, maximum 22 characters. + * @property null|string $statement_descriptor_suffix Provides information about the charge that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. + * @property string $status The status of the payment is either succeeded, pending, or failed. + * @property string|\Stripe\Transfer $transfer ID of the transfer to the destination account (only applicable if the charge was created using the destination parameter). + * @property null|\Stripe\StripeObject $transfer_data An optional dictionary including the account to automatically transfer to as part of a destination charge. See the Connect documentation for details. + * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. + */ +class Charge extends ApiResource +{ + const OBJECT_NAME = 'charge'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Possible string representations of decline codes. + * These strings are applicable to the decline_code property of the \Stripe\Exception\CardException exception. + * + * @see https://stripe.com/docs/declines/codes + */ + const DECLINED_AUTHENTICATION_REQUIRED = 'authentication_required'; + const DECLINED_APPROVE_WITH_ID = 'approve_with_id'; + const DECLINED_CALL_ISSUER = 'call_issuer'; + const DECLINED_CARD_NOT_SUPPORTED = 'card_not_supported'; + const DECLINED_CARD_VELOCITY_EXCEEDED = 'card_velocity_exceeded'; + const DECLINED_CURRENCY_NOT_SUPPORTED = 'currency_not_supported'; + const DECLINED_DO_NOT_HONOR = 'do_not_honor'; + const DECLINED_DO_NOT_TRY_AGAIN = 'do_not_try_again'; + const DECLINED_DUPLICATED_TRANSACTION = 'duplicate_transaction'; + const DECLINED_EXPIRED_CARD = 'expired_card'; + const DECLINED_FRAUDULENT = 'fraudulent'; + const DECLINED_GENERIC_DECLINE = 'generic_decline'; + const DECLINED_INCORRECT_NUMBER = 'incorrect_number'; + const DECLINED_INCORRECT_CVC = 'incorrect_cvc'; + const DECLINED_INCORRECT_PIN = 'incorrect_pin'; + const DECLINED_INCORRECT_ZIP = 'incorrect_zip'; + const DECLINED_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const DECLINED_INVALID_ACCOUNT = 'invalid_account'; + const DECLINED_INVALID_AMOUNT = 'invalid_amount'; + const DECLINED_INVALID_CVC = 'invalid_cvc'; + const DECLINED_INVALID_EXPIRY_YEAR = 'invalid_expiry_year'; + const DECLINED_INVALID_NUMBER = 'invalid_number'; + const DECLINED_INVALID_PIN = 'invalid_pin'; + const DECLINED_ISSUER_NOT_AVAILABLE = 'issuer_not_available'; + const DECLINED_LOST_CARD = 'lost_card'; + const DECLINED_MERCHANT_BLACKLIST = 'merchant_blacklist'; + const DECLINED_NEW_ACCOUNT_INFORMATION_AVAILABLE = 'new_account_information_available'; + const DECLINED_NO_ACTION_TAKEN = 'no_action_taken'; + const DECLINED_NOT_PERMITTED = 'not_permitted'; + const DECLINED_OFFLINE_PIN_REQUIRED = 'offline_pin_required'; + const DECLINED_ONLINE_OR_OFFLINE_PIN_REQUIRED = 'online_or_offline_pin_required'; + const DECLINED_PICKUP_CARD = 'pickup_card'; + const DECLINED_PIN_TRY_EXCEEDED = 'pin_try_exceeded'; + const DECLINED_PROCESSING_ERROR = 'processing_error'; + const DECLINED_REENTER_TRANSACTION = 'reenter_transaction'; + const DECLINED_RESTRICTED_CARD = 'restricted_card'; + const DECLINED_REVOCATION_OF_ALL_AUTHORIZATIONS = 'revocation_of_all_authorizations'; + const DECLINED_REVOCATION_OF_AUTHORIZATION = 'revocation_of_authorization'; + const DECLINED_SECURITY_VIOLATION = 'security_violation'; + const DECLINED_SERVICE_NOT_ALLOWED = 'service_not_allowed'; + const DECLINED_STOLEN_CARD = 'stolen_card'; + const DECLINED_STOP_PAYMENT_ORDER = 'stop_payment_order'; + const DECLINED_TESTMODE_DECLINE = 'testmode_decline'; + const DECLINED_TRANSACTION_NOT_ALLOWED = 'transaction_not_allowed'; + const DECLINED_TRY_AGAIN_LATER = 'try_again_later'; + const DECLINED_WITHDRAWAL_COUNT_LIMIT_EXCEEDED = 'withdrawal_count_limit_exceeded'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Charge the captured charge + */ + public function capture($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/capture'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Checkout/Session.php b/app/api/Stripe/Checkout/Session.php new file mode 100755 index 0000000..f5a7c82 --- /dev/null +++ b/app/api/Stripe/Checkout/Session.php @@ -0,0 +1,89 @@ +Checkout. We recommend + * creating a new Session each time your customer attempts to pay. + * + * Once payment is successful, the Checkout Session will contain a reference to the + * Customer, and either the + * successful PaymentIntent or an + * active Subscription. + * + * You can create a Checkout Session on your server and pass its ID to the client + * to begin Checkout. + * + * Related guide: Checkout + * Server Quickstart. + * + * @property string $id Unique identifier for the object. Used to pass to redirectToCheckout in Stripe.js. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|bool $allow_promotion_codes Enables user redeemable promotion codes. + * @property null|int $amount_subtotal Total of all items before discounts or taxes are applied. + * @property null|int $amount_total Total of all items after discounts and taxes are applied. + * @property null|string $billing_address_collection Describes whether Checkout should collect the customer's billing address. + * @property string $cancel_url The URL the customer will be directed to if they decide to cancel payment and return to your website. + * @property null|string $client_reference_id A unique string to reference the Checkout Session. This can be a customer ID, a cart ID, or similar, and can be used to reconcile the Session with your internal systems. + * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Customer $customer The ID of the customer for this Session. For Checkout Sessions in payment or subscription mode, Checkout will create a new customer object based on information provided during the payment flow unless an existing customer was provided when the Session was created. + * @property null|\Stripe\StripeObject $customer_details The customer details including the customer's tax exempt status and the customer's tax IDs. + * @property null|string $customer_email If provided, this value will be used when the Customer object is created. If not provided, customers will be asked to enter their email address. Use this parameter to prefill customer data if you already have an email on file. To access information about the customer once the payment flow is complete, use the customer attribute. + * @property \Stripe\Collection $line_items The line items purchased by the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $locale The IETF language tag of the locale Checkout is displayed in. If blank or auto, the browser's locale is used. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $mode The mode of the Checkout Session. + * @property null|string|\Stripe\PaymentIntent $payment_intent The ID of the PaymentIntent for Checkout Sessions in payment mode. + * @property string[] $payment_method_types A list of the types of payment methods (e.g. card) this Checkout Session is allowed to accept. + * @property string $payment_status The payment status of the Checkout Session, one of paid, unpaid, or no_payment_required. You can use this value to decide when to fulfill your customer's order. + * @property null|string|\Stripe\SetupIntent $setup_intent The ID of the SetupIntent for Checkout Sessions in setup mode. + * @property null|\Stripe\StripeObject $shipping Shipping information for this Checkout Session. + * @property null|\Stripe\StripeObject $shipping_address_collection When set, provides configuration for Checkout to collect a shipping address from a customer. + * @property null|string $submit_type Describes the type of transaction being performed by Checkout in order to customize relevant text on the page, such as the submit button. submit_type can only be specified on Checkout Sessions in payment mode, but not Checkout Sessions in subscription or setup mode. + * @property null|string|\Stripe\Subscription $subscription The ID of the subscription for Checkout Sessions in subscription mode. + * @property string $success_url The URL the customer will be directed to after the payment or subscription creation is successful. + * @property null|\Stripe\StripeObject $total_details Tax and discount details for the computed total amount. + */ +class Session extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'checkout.session'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\NestedResource; + use \Stripe\ApiOperations\Retrieve; + + const BILLING_ADDRESS_COLLECTION_AUTO = 'auto'; + const BILLING_ADDRESS_COLLECTION_REQUIRED = 'required'; + + const PAYMENT_STATUS_NO_PAYMENT_REQUIRED = 'no_payment_required'; + const PAYMENT_STATUS_PAID = 'paid'; + const PAYMENT_STATUS_UNPAID = 'unpaid'; + + const SUBMIT_TYPE_AUTO = 'auto'; + const SUBMIT_TYPE_BOOK = 'book'; + const SUBMIT_TYPE_DONATE = 'donate'; + const SUBMIT_TYPE_PAY = 'pay'; + + const PATH_LINE_ITEMS = '/line_items'; + + /** + * @param string $id the ID of the session on which to retrieve the items + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of items + */ + public static function allLineItems($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_LINE_ITEMS, $params, $opts); + } +} diff --git a/app/api/Stripe/Collection.php b/app/api/Stripe/Collection.php new file mode 100755 index 0000000..7162be2 --- /dev/null +++ b/app/api/Stripe/Collection.php @@ -0,0 +1,282 @@ +filters; + } + + /** + * Sets the filters, removing paging options. + * + * @param array $filters the filters + */ + public function setFilters($filters) + { + $this->filters = $filters; + } + + public function offsetGet($k) + { + if (\is_string($k)) { + return parent::offsetGet($k); + } + $msg = "You tried to access the {$k} index, but Collection " . + 'types only support string keys. (HINT: List calls ' . + 'return an object with a `data` (which is the data ' . + "array). You likely want to call ->data[{$k}])"; + + throw new Exception\InvalidArgumentException($msg); + } + + public function all($params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response, $opts); + if (!($obj instanceof \Stripe\Collection)) { + throw new \Stripe\Exception\UnexpectedValueException( + 'Expected type ' . \Stripe\Collection::class . ', got "' . \get_class($obj) . '" instead.' + ); + } + $obj->setFilters($params); + + return $obj; + } + + public function create($params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('post', $url, $params, $opts); + + return Util\Util::convertToStripeObject($response, $opts); + } + + public function retrieve($id, $params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + $id = Util\Util::utf8($id); + $extn = \urlencode($id); + list($response, $opts) = $this->_request( + 'get', + "{$url}/{$extn}", + $params, + $opts + ); + + return Util\Util::convertToStripeObject($response, $opts); + } + + /** + * @return int the number of objects in the current page + */ + public function count() + { + return \count($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * across objects in the current page + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * backwards across objects in the current page + */ + public function getReverseIterator() + { + return new \ArrayIterator(\array_reverse($this->data)); + } + + /** + * @return \Generator|StripeObject[] A generator that can be used to + * iterate across all objects across all pages. As page boundaries are + * encountered, the next page will be fetched automatically for + * continued iteration. + */ + public function autoPagingIterator() + { + $page = $this; + + while (true) { + $filters = $this->filters ?: []; + if (\array_key_exists('ending_before', $filters) + && !\array_key_exists('starting_after', $filters)) { + foreach ($page->getReverseIterator() as $item) { + yield $item; + } + $page = $page->previousPage(); + } else { + foreach ($page as $item) { + yield $item; + } + $page = $page->nextPage(); + } + + if ($page->isEmpty()) { + break; + } + } + } + + /** + * Returns an empty collection. This is returned from {@see nextPage()} + * when we know that there isn't a next page in order to replicate the + * behavior of the API when it attempts to return a page beyond the last. + * + * @param null|array|string $opts + * + * @return Collection + */ + public static function emptyCollection($opts = null) + { + return Collection::constructFrom(['data' => []], $opts); + } + + /** + * Returns true if the page object contains no element. + * + * @return bool + */ + public function isEmpty() + { + return empty($this->data); + } + + /** + * Fetches the next page in the resource list (if there is one). + * + * This method will try to respect the limit of the current page. If none + * was given, the default limit will be fetched again. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection + */ + public function nextPage($params = null, $opts = null) + { + if (!$this->has_more) { + return static::emptyCollection($opts); + } + + $lastId = \end($this->data)->id; + + $params = \array_merge( + $this->filters ?: [], + ['starting_after' => $lastId], + $params ?: [] + ); + + return $this->all($params, $opts); + } + + /** + * Fetches the previous page in the resource list (if there is one). + * + * This method will try to respect the limit of the current page. If none + * was given, the default limit will be fetched again. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection + */ + public function previousPage($params = null, $opts = null) + { + if (!$this->has_more) { + return static::emptyCollection($opts); + } + + $firstId = $this->data[0]->id; + + $params = \array_merge( + $this->filters ?: [], + ['ending_before' => $firstId], + $params ?: [] + ); + + return $this->all($params, $opts); + } + + /** + * Gets the first item from the current page. Returns `null` if the current page is empty. + * + * @return null|\Stripe\StripeObject + */ + public function first() + { + return \count($this->data) > 0 ? $this->data[0] : null; + } + + /** + * Gets the last item from the current page. Returns `null` if the current page is empty. + * + * @return null|\Stripe\StripeObject + */ + public function last() + { + return \count($this->data) > 0 ? $this->data[\count($this->data) - 1] : null; + } + + private function extractPathAndUpdateParams($params) + { + $url = \parse_url($this->url); + if (!isset($url['path'])) { + throw new Exception\UnexpectedValueException("Could not parse list url into parts: {$url}"); + } + + if (isset($url['query'])) { + // If the URL contains a query param, parse it out into $params so they + // don't interact weirdly with each other. + $query = []; + \parse_str($url['query'], $query); + $params = \array_merge($params ?: [], $query); + } + + return [$url['path'], $params]; + } +} diff --git a/app/api/Stripe/CountrySpec.php b/app/api/Stripe/CountrySpec.php new file mode 100755 index 0000000..86b5738 --- /dev/null +++ b/app/api/Stripe/CountrySpec.php @@ -0,0 +1,30 @@ +an online guide. + * + * @property string $id Unique identifier for the object. Represented as the ISO country code for this country. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $default_currency The default currency for this country. This applies to both payment methods and bank accounts. + * @property \Stripe\StripeObject $supported_bank_account_currencies Currencies that can be accepted in the specific country (for transfers). + * @property string[] $supported_payment_currencies Currencies that can be accepted in the specified country (for payments). + * @property string[] $supported_payment_methods Payment methods available in the specified country. You may need to enable some payment methods (e.g., ACH) on your account before they appear in this list. The stripe payment method refers to charging through your platform. + * @property string[] $supported_transfer_countries Countries that can accept transfers from the specified country. + * @property \Stripe\StripeObject $verification_fields + */ +class CountrySpec extends ApiResource +{ + const OBJECT_NAME = 'country_spec'; + + use ApiOperations\All; + use ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/Coupon.php b/app/api/Stripe/Coupon.php new file mode 100755 index 0000000..59a5cc2 --- /dev/null +++ b/app/api/Stripe/Coupon.php @@ -0,0 +1,41 @@ +invoices or orders. Coupons do + * not work with conventional one-off charges. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|int $amount_off Amount (in the currency specified) that will be taken off the subtotal of any invoices for this customer. + * @property \Stripe\StripeObject $applies_to + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency If amount_off has been set, the three-letter ISO code for the currency of the amount to take off. + * @property string $duration One of forever, once, and repeating. Describes how long a customer who applies this coupon will get the discount. + * @property null|int $duration_in_months If duration is repeating, the number of months the coupon applies. Null if coupon duration is forever or once. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|int $max_redemptions Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name Name of the coupon displayed to customers on for instance invoices or receipts. + * @property null|float $percent_off Percent that will be taken off the subtotal of any invoices for this customer for the duration of the coupon. For example, a coupon with percent_off of 50 will make a %s100 invoice %s50 instead. + * @property null|int $redeem_by Date after which the coupon can no longer be redeemed. + * @property int $times_redeemed Number of times this coupon has been applied to a customer. + * @property bool $valid Taking account of the above properties, whether this coupon can still be applied to a customer. + */ +class Coupon extends ApiResource +{ + const OBJECT_NAME = 'coupon'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/CreditNote.php b/app/api/Stripe/CreditNote.php new file mode 100755 index 0000000..68bd0ed --- /dev/null +++ b/app/api/Stripe/CreditNote.php @@ -0,0 +1,111 @@ +Credit Notes. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The integer amount in %s representing the total amount of the credit note, including tax. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string|\Stripe\Customer $customer ID of the customer. + * @property null|string|\Stripe\CustomerBalanceTransaction $customer_balance_transaction Customer balance transaction related to this credit note. + * @property int $discount_amount The integer amount in %s representing the total amount of discount that was credited. + * @property \Stripe\StripeObject[] $discount_amounts The aggregate amounts calculated per discount for all line items. + * @property string|\Stripe\Invoice $invoice ID of the invoice. + * @property \Stripe\Collection $lines Line items that make up the credit note + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $memo Customer-facing text that appears on the credit note PDF. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $number A unique number that identifies this particular credit note and appears on the PDF of the credit note and its associated invoice. + * @property null|int $out_of_band_amount Amount that was credited outside of Stripe. + * @property string $pdf The link to download the PDF of the credit note. + * @property null|string $reason Reason for issuing this credit note, one of duplicate, fraudulent, order_change, or product_unsatisfactory + * @property null|string|\Stripe\Refund $refund Refund related to this credit note. + * @property string $status Status of this credit note, one of issued or void. Learn more about voiding credit notes. + * @property int $subtotal The integer amount in %s representing the amount of the credit note, excluding tax and invoice level discounts. + * @property \Stripe\StripeObject[] $tax_amounts The aggregate amounts calculated per tax rate for all line items. + * @property int $total The integer amount in %s representing the total amount of the credit note, including tax and all discount. + * @property string $type Type of this credit note, one of pre_payment or post_payment. A pre_payment credit note means it was issued when the invoice was open. A post_payment credit note means it was issued when the invoice was paid. + * @property null|int $voided_at The time that the credit note was voided. + */ +class CreditNote extends ApiResource +{ + const OBJECT_NAME = 'credit_note'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\NestedResource; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const REASON_DUPLICATE = 'duplicate'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_ORDER_CHANGE = 'order_change'; + const REASON_PRODUCT_UNSATISFACTORY = 'product_unsatisfactory'; + + const STATUS_ISSUED = 'issued'; + const STATUS_VOID = 'void'; + + const TYPE_POST_PAYMENT = 'post_payment'; + const TYPE_PRE_PAYMENT = 'pre_payment'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote the previewed credit note + */ + public static function preview($params = null, $opts = null) + { + $url = static::classUrl() . '/preview'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return CreditNote the voided credit note + */ + public function voidCreditNote($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/void'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + const PATH_LINES = '/lines'; + + /** + * @param string $id the ID of the credit note on which to retrieve the credit note line items + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of credit note line items + */ + public static function allLines($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); + } +} diff --git a/app/api/Stripe/CreditNoteLineItem.php b/app/api/Stripe/CreditNoteLineItem.php new file mode 100755 index 0000000..1e1755e --- /dev/null +++ b/app/api/Stripe/CreditNoteLineItem.php @@ -0,0 +1,26 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|int $quantity The number of units of product being credited. + * @property \Stripe\StripeObject[] $tax_amounts The amount of tax calculated per tax rate for this line item + * @property \Stripe\TaxRate[] $tax_rates The tax rates which apply to the line item. + * @property string $type The type of the credit note line item, one of invoice_line_item or custom_line_item. When the type is invoice_line_item there is an additional invoice_line_item property on the resource the value of which is the id of the credited line item on the invoice. + * @property null|int $unit_amount The cost of each unit of product being credited. + * @property null|string $unit_amount_decimal Same as unit_amount, but contains a decimal value with at most 12 decimal places. + */ +class CreditNoteLineItem extends ApiResource +{ + const OBJECT_NAME = 'credit_note_line_item'; +} diff --git a/app/api/Stripe/Customer.php b/app/api/Stripe/Customer.php new file mode 100755 index 0000000..3c306b3 --- /dev/null +++ b/app/api/Stripe/Customer.php @@ -0,0 +1,276 @@ +Customer objects allow you to perform recurring charges, and to + * track multiple charges, that are associated with the same customer. The API + * allows you to create, delete, and update your customers. You can retrieve + * individual customers as well as a list of all your customers. + * + * Related guide: Save a card during + * payment. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|\Stripe\StripeObject $address The customer's address. + * @property int $balance Current balance, if any, being stored on the customer. If negative, the customer has credit to apply to their next invoice. If positive, the customer has an amount owed that will be added to their next invoice. The balance does not refer to any unpaid invoices; it solely takes into account amounts that have yet to be successfully applied to any invoice. This balance is only taken into account as invoices are finalized. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO code for the currency the customer can be charged in for recurring billing purposes. + * @property null|string|\Stripe\Account|\Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source $default_source

ID of the default payment source for the customer.

If you are using payment methods created via the PaymentMethods API, see the invoice_settings.default_payment_method field instead.

+ * @property null|bool $delinquent

When the customer's latest invoice is billed by charging automatically, delinquent is true if the invoice's latest charge failed. When the customer's latest invoice is billed by sending an invoice, delinquent is true if the invoice isn't paid by its due date.

If an invoice is marked uncollectible by dunning, delinquent doesn't get reset to false.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|\Stripe\Discount $discount Describes the current discount active on the customer, if there is one. + * @property null|string $email The customer's email address. + * @property null|string $invoice_prefix The prefix for the customer used to generate unique invoice numbers. + * @property \Stripe\StripeObject $invoice_settings + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name The customer's full name or business name. + * @property int $next_invoice_sequence The suffix of the customer's next invoice number, e.g., 0001. + * @property null|string $phone The customer's phone number. + * @property null|string[] $preferred_locales The customer's preferred locales (languages), ordered by preference. + * @property null|\Stripe\StripeObject $shipping Mailing and shipping address for the customer. Appears on invoices emailed to this customer. + * @property \Stripe\Collection $sources The customer's payment sources, if any. + * @property \Stripe\Collection $subscriptions The customer's current subscriptions, if any. + * @property null|string $tax_exempt Describes the customer's tax exemption status. One of none, exempt, or reverse. When set to reverse, invoice and receipt PDFs include the text "Reverse charge". + * @property \Stripe\Collection $tax_ids The customer's tax IDs. + */ +class Customer extends ApiResource +{ + const OBJECT_NAME = 'customer'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\NestedResource; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const TAX_EXEMPT_EXEMPT = 'exempt'; + const TAX_EXEMPT_NONE = 'none'; + const TAX_EXEMPT_REVERSE = 'reverse'; + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'source', + ]); + } + + return $savedNestedResources; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Customer the updated customer + */ + public function deleteDiscount($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom(['discount' => null], $opts, true); + } + + const PATH_BALANCE_TRANSACTIONS = '/balance_transactions'; + + /** + * @param string $id the ID of the customer on which to retrieve the customer balance transactions + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of customer balance transactions + */ + public static function allBalanceTransactions($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the customer balance transaction + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public static function createBalanceTransaction($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the customer balance transaction belongs + * @param string $balanceTransactionId the ID of the customer balance transaction to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public static function retrieveBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the customer balance transaction belongs + * @param string $balanceTransactionId the ID of the customer balance transaction to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public static function updateBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); + } + + const PATH_SOURCES = '/sources'; + + /** + * @param string $id the ID of the customer on which to retrieve the payment sources + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of payment sources (AlipayAccount, BankAccount, BitcoinReceiver, Card or Source) + */ + public static function allSources($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_SOURCES, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the payment source + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public static function createSource($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_SOURCES, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to delete + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public static function deleteSource($id, $sourceId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public static function retrieveSource($id, $sourceId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public static function updateSource($id, $sourceId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + + const PATH_TAX_IDS = '/tax_ids'; + + /** + * @param string $id the ID of the customer on which to retrieve the tax ids + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of tax ids + */ + public static function allTaxIds($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_TAX_IDS, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the tax id + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public static function createTaxId($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_TAX_IDS, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the tax id belongs + * @param string $taxIdId the ID of the tax id to delete + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public static function deleteTaxId($id, $taxIdId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the tax id belongs + * @param string $taxIdId the ID of the tax id to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public static function retrieveTaxId($id, $taxIdId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); + } +} diff --git a/app/api/Stripe/CustomerBalanceTransaction.php b/app/api/Stripe/CustomerBalanceTransaction.php new file mode 100755 index 0000000..ad3bc21 --- /dev/null +++ b/app/api/Stripe/CustomerBalanceTransaction.php @@ -0,0 +1,103 @@ +balance + * value, which denotes a debit or credit that's automatically applied to their + * next invoice upon finalization. You may modify the value directly by using the + * update customer API, + * or by creating a Customer Balance Transaction, which increments or decrements + * the customer's balance by the specified amount. + * + * Related guide: Customer Balance to + * learn more. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The amount of the transaction. A negative value is a credit for the customer's balance, and a positive value is a debit to the customer's balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\CreditNote $credit_note The ID of the credit note (if any) related to the transaction. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string|\Stripe\Customer $customer The ID of the customer the transaction belongs to. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property int $ending_balance The customer's balance after the transaction was applied. A negative value decreases the amount due on the customer's next invoice. A positive value increases the amount due on the customer's next invoice. + * @property null|string|\Stripe\Invoice $invoice The ID of the invoice (if any) related to the transaction. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $type Transaction type: adjustment, applied_to_invoice, credit_note, initial, invoice_too_large, invoice_too_small, unspent_receiver_credit, or unapplied_from_invoice. See the Customer Balance page to learn more about transaction types. + */ +class CustomerBalanceTransaction extends ApiResource +{ + const OBJECT_NAME = 'customer_balance_transaction'; + + const TYPE_ADJUSTMENT = 'adjustment'; + const TYPE_APPLIED_TO_INVOICE = 'applied_to_invoice'; + const TYPE_CREDIT_NOTE = 'credit_note'; + const TYPE_INITIAL = 'initial'; + const TYPE_INVOICE_TOO_LARGE = 'invoice_too_large'; + const TYPE_INVOICE_TOO_SMALL = 'invoice_too_small'; + const TYPE_UNSPENT_RECEIVER_CREDIT = 'unspent_receiver_credit'; + + const TYPE_ADJUSTEMENT = 'adjustment'; + + /** + * @return string the API URL for this balance transaction + */ + public function instanceUrl() + { + $id = $this['id']; + $customer = $this['customer']; + if (!$id) { + throw new Exception\UnexpectedValueException( + "Could not determine which URL to request: class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $customer = Util\Util::utf8($customer); + + $base = Customer::classUrl(); + $customerExtn = \urlencode($customer); + $extn = \urlencode($id); + + return "{$base}/{$customerExtn}/balance_transactions/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Customer Balance Transactions cannot be retrieved without a ' . + 'customer ID. Retrieve a Customer Balance Transaction using ' . + "`Customer::retrieveBalanceTransaction('customer_id', " . + "'balance_transaction_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Customer Balance Transactions cannot be updated without a ' . + 'customer ID. Update a Customer Balance Transaction using ' . + "`Customer::updateBalanceTransaction('customer_id', " . + "'balance_transaction_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/app/api/Stripe/Discount.php b/app/api/Stripe/Discount.php new file mode 100755 index 0000000..ceb0d59 --- /dev/null +++ b/app/api/Stripe/Discount.php @@ -0,0 +1,23 @@ +Disputes and Fraud + * documentation. + * + * Related guide: Disputes and + * Fraud. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Disputed amount. Usually the amount of the charge, but can differ (usually because of currency fluctuation or because only part of the order is disputed). + * @property \Stripe\BalanceTransaction[] $balance_transactions List of zero, one, or two balance transactions that show funds withdrawn and reinstated to your Stripe account as a result of this dispute. + * @property string|\Stripe\Charge $charge ID of the charge that was disputed. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property \Stripe\StripeObject $evidence + * @property \Stripe\StripeObject $evidence_details + * @property bool $is_charge_refundable If true, it is still possible to refund the disputed payment. Once the payment has been fully refunded, no further funds will be withdrawn from your Stripe account as a result of this dispute. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $network_reason_code Network-dependent reason code for the dispute. + * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent that was disputed. + * @property string $reason Reason given by cardholder for dispute. Possible values are bank_cannot_process, check_returned, credit_not_processed, customer_initiated, debit_not_authorized, duplicate, fraudulent, general, incorrect_account_details, insufficient_funds, product_not_received, product_unacceptable, subscription_canceled, or unrecognized. Read more about dispute reasons. + * @property string $status Current status of dispute. Possible values are warning_needs_response, warning_under_review, warning_closed, needs_response, under_review, charge_refunded, won, or lost. + */ +class Dispute extends ApiResource +{ + const OBJECT_NAME = 'dispute'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const REASON_BANK_CANNOT_PROCESS = 'bank_cannot_process'; + const REASON_CHECK_RETURNED = 'check_returned'; + const REASON_CREDIT_NOT_PROCESSED = 'credit_not_processed'; + const REASON_CUSTOMER_INITIATED = 'customer_initiated'; + const REASON_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; + const REASON_DUPLICATE = 'duplicate'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_GENERAL = 'general'; + const REASON_INCORRECT_ACCOUNT_DETAILS = 'incorrect_account_details'; + const REASON_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const REASON_PRODUCT_NOT_RECEIVED = 'product_not_received'; + const REASON_PRODUCT_UNACCEPTABLE = 'product_unacceptable'; + const REASON_SUBSCRIPTION_CANCELED = 'subscription_canceled'; + const REASON_UNRECOGNIZED = 'unrecognized'; + + const STATUS_CHARGE_REFUNDED = 'charge_refunded'; + const STATUS_LOST = 'lost'; + const STATUS_NEEDS_RESPONSE = 'needs_response'; + const STATUS_UNDER_REVIEW = 'under_review'; + const STATUS_WARNING_CLOSED = 'warning_closed'; + const STATUS_WARNING_NEEDS_RESPONSE = 'warning_needs_response'; + const STATUS_WARNING_UNDER_REVIEW = 'warning_under_review'; + const STATUS_WON = 'won'; + + /** + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Dispute the closed dispute + */ + // TODO: add $params to standardize signature + public function close($opts = null) + { + $url = $this->instanceUrl() . '/close'; + list($response, $opts) = $this->_request('post', $url, null, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/EphemeralKey.php b/app/api/Stripe/EphemeralKey.php new file mode 100755 index 0000000..8822319 --- /dev/null +++ b/app/api/Stripe/EphemeralKey.php @@ -0,0 +1,43 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $secret The key's secret. You can use this value to make authorized requests to the Stripe API. + * @property array $associated_objects + */ +class EphemeralKey extends ApiResource +{ + const OBJECT_NAME = 'ephemeral_key'; + + use ApiOperations\Create { + create as protected _create; + } + + use ApiOperations\Delete; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\InvalidArgumentException if stripe_version is missing + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\EphemeralKey the created key + */ + public static function create($params = null, $opts = null) + { + if (!$opts || !isset($opts['stripe_version'])) { + throw new Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); + } + + return self::_create($params, $opts); + } +} diff --git a/app/api/Stripe/ErrorObject.php b/app/api/Stripe/ErrorObject.php new file mode 100755 index 0000000..a5081c6 --- /dev/null +++ b/app/api/Stripe/ErrorObject.php @@ -0,0 +1,164 @@ + null, + 'code' => null, + 'decline_code' => null, + 'doc_url' => null, + 'message' => null, + 'param' => null, + 'payment_intent' => null, + 'payment_method' => null, + 'setup_intent' => null, + 'source' => null, + 'type' => null, + ], $values); + parent::refreshFrom($values, $opts, $partial); + } +} diff --git a/app/api/Stripe/Event.php b/app/api/Stripe/Event.php new file mode 100755 index 0000000..c25b64e --- /dev/null +++ b/app/api/Stripe/Event.php @@ -0,0 +1,231 @@ +Event object. For example, when a charge succeeds, we create a + * charge.succeeded event; and when an invoice payment attempt fails, + * we create an invoice.payment_failed event. Note that many API + * requests may cause multiple events to be created. For example, if you create a + * new subscription for a customer, you will receive both a + * customer.subscription.created event and a + * charge.succeeded event. + * + * Events occur when the state of another API resource changes. The state of that + * resource at the time of the change is embedded in the event's data field. For + * example, a charge.succeeded event will contain a charge, and an + * invoice.payment_failed event will contain an invoice. + * + * As with other API resources, you can use endpoints to retrieve an individual event or a list of events from the API. + * We also have a separate webhooks system for sending the + * Event objects directly to an endpoint on your server. Webhooks are + * managed in your account + * settings, and our Using + * Webhooks guide will help you get set up. + * + * When using Connect, you can also + * receive notifications of events that occur in connected accounts. For these + * events, there will be an additional account attribute in the + * received Event object. + * + * NOTE: Right now, access to events through the Retrieve Event API is + * guaranteed only for 30 days. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $account The connected account that originated the event. + * @property null|string $api_version The Stripe API version used to render data. Note: This property is populated only for events on or after October 31, 2014. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property \Stripe\StripeObject $data + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $pending_webhooks Number of webhooks that have yet to be successfully delivered (i.e., to return a 20x response) to the URLs you've specified. + * @property null|\Stripe\StripeObject $request Information on the API request that instigated the event. + * @property string $type Description of the event (e.g., invoice.created or charge.refunded). + */ +class Event extends ApiResource +{ + const OBJECT_NAME = 'event'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + + /** + * Possible string representations of event types. + * + * @see https://stripe.com/docs/api#event_types + */ + const ACCOUNT_UPDATED = 'account.updated'; + const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; + const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; + const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; + const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; + const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; + const APPLICATION_FEE_CREATED = 'application_fee.created'; + const APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; + const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; + const BALANCE_AVAILABLE = 'balance.available'; + const CAPABILITY_UPDATED = 'capability.updated'; + const CHARGE_CAPTURED = 'charge.captured'; + const CHARGE_EXPIRED = 'charge.expired'; + const CHARGE_FAILED = 'charge.failed'; + const CHARGE_PENDING = 'charge.pending'; + const CHARGE_REFUNDED = 'charge.refunded'; + const CHARGE_SUCCEEDED = 'charge.succeeded'; + const CHARGE_UPDATED = 'charge.updated'; + const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; + const CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; + const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; + const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; + const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; + const CHARGE_REFUND_UPDATED = 'charge.refund.updated'; + const CHECKOUT_SESSION_ASYNC_PAYMENT_FAILED = 'checkout.session.async_payment_failed'; + const CHECKOUT_SESSION_ASYNC_PAYMENT_SUCCEEDED = 'checkout.session.async_payment_succeeded'; + const CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed'; + const COUPON_CREATED = 'coupon.created'; + const COUPON_DELETED = 'coupon.deleted'; + const COUPON_UPDATED = 'coupon.updated'; + const CREDIT_NOTE_CREATED = 'credit_note.created'; + const CREDIT_NOTE_UPDATED = 'credit_note.updated'; + const CREDIT_NOTE_VOIDED = 'credit_note.voided'; + const CUSTOMER_CREATED = 'customer.created'; + const CUSTOMER_DELETED = 'customer.deleted'; + const CUSTOMER_UPDATED = 'customer.updated'; + const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; + const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; + const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; + const CUSTOMER_SOURCE_CREATED = 'customer.source.created'; + const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; + const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; + const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; + const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; + const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; + const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_APPLIED = 'customer.subscription.pending_update_applied'; + const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_EXPIRED = 'customer.subscription.pending_update_expired'; + const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; + const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; + const CUSTOMER_TAX_ID_CREATED = 'customer.tax_id.created'; + const CUSTOMER_TAX_ID_DELETED = 'customer.tax_id.deleted'; + const CUSTOMER_TAX_ID_UPDATED = 'customer.tax_id.updated'; + const FILE_CREATED = 'file.created'; + const INVOICE_CREATED = 'invoice.created'; + const INVOICE_DELETED = 'invoice.deleted'; + const INVOICE_FINALIZATION_FAILED = 'invoice.finalization_failed'; + const INVOICE_FINALIZED = 'invoice.finalized'; + const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; + const INVOICE_PAID = 'invoice.paid'; + const INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required'; + const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; + const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; + const INVOICE_SENT = 'invoice.sent'; + const INVOICE_UPCOMING = 'invoice.upcoming'; + const INVOICE_UPDATED = 'invoice.updated'; + const INVOICE_VOIDED = 'invoice.voided'; + const INVOICEITEM_CREATED = 'invoiceitem.created'; + const INVOICEITEM_DELETED = 'invoiceitem.deleted'; + const INVOICEITEM_UPDATED = 'invoiceitem.updated'; + const ISSUER_FRAUD_RECORD_CREATED = 'issuer_fraud_record.created'; + const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; + const ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request'; + const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; + const ISSUING_CARD_CREATED = 'issuing_card.created'; + const ISSUING_CARD_UPDATED = 'issuing_card.updated'; + const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; + const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; + const ISSUING_DISPUTE_CLOSED = 'issuing_dispute.closed'; + const ISSUING_DISPUTE_CREATED = 'issuing_dispute.created'; + const ISSUING_DISPUTE_FUNDS_REINSTATED = 'issuing_dispute.funds_reinstated'; + const ISSUING_DISPUTE_SUBMITTED = 'issuing_dispute.submitted'; + const ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated'; + const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; + const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; + const MANDATE_UPDATED = 'mandate.updated'; + const ORDER_CREATED = 'order.created'; + const ORDER_PAYMENT_FAILED = 'order.payment_failed'; + const ORDER_PAYMENT_SUCCEEDED = 'order.payment_succeeded'; + const ORDER_UPDATED = 'order.updated'; + const ORDER_RETURN_CREATED = 'order_return.created'; + const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; + const PAYMENT_INTENT_CANCELED = 'payment_intent.canceled'; + const PAYMENT_INTENT_CREATED = 'payment_intent.created'; + const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; + const PAYMENT_INTENT_PROCESSING = 'payment_intent.processing'; + const PAYMENT_INTENT_REQUIRES_ACTION = 'payment_intent.requires_action'; + const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; + const PAYMENT_METHOD_ATTACHED = 'payment_method.attached'; + const PAYMENT_METHOD_AUTOMATICALLY_UPDATED = 'payment_method.automatically_updated'; + const PAYMENT_METHOD_CARD_AUTOMATICALLY_UPDATED = 'payment_method.card_automatically_updated'; + const PAYMENT_METHOD_DETACHED = 'payment_method.detached'; + const PAYMENT_METHOD_UPDATED = 'payment_method.updated'; + const PAYOUT_CANCELED = 'payout.canceled'; + const PAYOUT_CREATED = 'payout.created'; + const PAYOUT_FAILED = 'payout.failed'; + const PAYOUT_PAID = 'payout.paid'; + const PAYOUT_UPDATED = 'payout.updated'; + const PERSON_CREATED = 'person.created'; + const PERSON_DELETED = 'person.deleted'; + const PERSON_UPDATED = 'person.updated'; + const PING = 'ping'; + const PLAN_CREATED = 'plan.created'; + const PLAN_DELETED = 'plan.deleted'; + const PLAN_UPDATED = 'plan.updated'; + const PRICE_CREATED = 'price.created'; + const PRICE_DELETED = 'price.deleted'; + const PRICE_UPDATED = 'price.updated'; + const PRODUCT_CREATED = 'product.created'; + const PRODUCT_DELETED = 'product.deleted'; + const PRODUCT_UPDATED = 'product.updated'; + const PROMOTION_CODE_CREATED = 'promotion_code.created'; + const PROMOTION_CODE_DELETED = 'promotion_code.deleted'; + const PROMOTION_CODE_UPDATED = 'promotion_code.updated'; + const RADAR_EARLY_FRAUD_WARNING_CREATED = 'radar.early_fraud_warning.created'; + const RADAR_EARLY_FRAUD_WARNING_UPDATED = 'radar.early_fraud_warning.updated'; + const RECIPIENT_CREATED = 'recipient.created'; + const RECIPIENT_DELETED = 'recipient.deleted'; + const RECIPIENT_UPDATED = 'recipient.updated'; + const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; + const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; + const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; + const REVIEW_CLOSED = 'review.closed'; + const REVIEW_OPENED = 'review.opened'; + const SETUP_INTENT_CANCELED = 'setup_intent.canceled'; + const SETUP_INTENT_CREATED = 'setup_intent.created'; + const SETUP_INTENT_REQUIRES_ACTION = 'setup_intent.requires_action'; + const SETUP_INTENT_SETUP_FAILED = 'setup_intent.setup_failed'; + const SETUP_INTENT_SUCCEEDED = 'setup_intent.succeeded'; + const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; + const SKU_CREATED = 'sku.created'; + const SKU_DELETED = 'sku.deleted'; + const SKU_UPDATED = 'sku.updated'; + const SOURCE_CANCELED = 'source.canceled'; + const SOURCE_CHARGEABLE = 'source.chargeable'; + const SOURCE_FAILED = 'source.failed'; + const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; + const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; + const SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; + const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; + const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; + const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; + const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; + const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; + const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; + const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; + const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; + const TAX_RATE_CREATED = 'tax_rate.created'; + const TAX_RATE_UPDATED = 'tax_rate.updated'; + const TOPUP_CANCELED = 'topup.canceled'; + const TOPUP_CREATED = 'topup.created'; + const TOPUP_FAILED = 'topup.failed'; + const TOPUP_REVERSED = 'topup.reversed'; + const TOPUP_SUCCEEDED = 'topup.succeeded'; + const TRANSFER_CREATED = 'transfer.created'; + const TRANSFER_REVERSED = 'transfer.reversed'; + const TRANSFER_UPDATED = 'transfer.updated'; +} diff --git a/app/api/Stripe/Exception/ApiConnectionException.php b/app/api/Stripe/Exception/ApiConnectionException.php new file mode 100755 index 0000000..1abc974 --- /dev/null +++ b/app/api/Stripe/Exception/ApiConnectionException.php @@ -0,0 +1,12 @@ +setHttpStatus($httpStatus); + $instance->setHttpBody($httpBody); + $instance->setJsonBody($jsonBody); + $instance->setHttpHeaders($httpHeaders); + $instance->setStripeCode($stripeCode); + + $instance->setRequestId(null); + if ($httpHeaders && isset($httpHeaders['Request-Id'])) { + $instance->setRequestId($httpHeaders['Request-Id']); + } + + $instance->setError($instance->constructErrorObject()); + + return $instance; + } + + /** + * Gets the Stripe error object. + * + * @return null|\Stripe\ErrorObject + */ + public function getError() + { + return $this->error; + } + + /** + * Sets the Stripe error object. + * + * @param null|\Stripe\ErrorObject $error + */ + public function setError($error) + { + $this->error = $error; + } + + /** + * Gets the HTTP body as a string. + * + * @return null|string + */ + public function getHttpBody() + { + return $this->httpBody; + } + + /** + * Sets the HTTP body as a string. + * + * @param null|string $httpBody + */ + public function setHttpBody($httpBody) + { + $this->httpBody = $httpBody; + } + + /** + * Gets the HTTP headers array. + * + * @return null|array|\Stripe\Util\CaseInsensitiveArray + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Sets the HTTP headers array. + * + * @param null|array|\Stripe\Util\CaseInsensitiveArray $httpHeaders + */ + public function setHttpHeaders($httpHeaders) + { + $this->httpHeaders = $httpHeaders; + } + + /** + * Gets the HTTP status code. + * + * @return null|int + */ + public function getHttpStatus() + { + return $this->httpStatus; + } + + /** + * Sets the HTTP status code. + * + * @param null|int $httpStatus + */ + public function setHttpStatus($httpStatus) + { + $this->httpStatus = $httpStatus; + } + + /** + * Gets the JSON deserialized body. + * + * @return null|array + */ + public function getJsonBody() + { + return $this->jsonBody; + } + + /** + * Sets the JSON deserialized body. + * + * @param null|array $jsonBody + */ + public function setJsonBody($jsonBody) + { + $this->jsonBody = $jsonBody; + } + + /** + * Gets the Stripe request ID. + * + * @return null|string + */ + public function getRequestId() + { + return $this->requestId; + } + + /** + * Sets the Stripe request ID. + * + * @param null|string $requestId + */ + public function setRequestId($requestId) + { + $this->requestId = $requestId; + } + + /** + * Gets the Stripe error code. + * + * Cf. the `CODE_*` constants on {@see \Stripe\ErrorObject} for possible + * values. + * + * @return null|string + */ + public function getStripeCode() + { + return $this->stripeCode; + } + + /** + * Sets the Stripe error code. + * + * @param null|string $stripeCode + */ + public function setStripeCode($stripeCode) + { + $this->stripeCode = $stripeCode; + } + + /** + * Returns the string representation of the exception. + * + * @return string + */ + public function __toString() + { + $statusStr = (null === $this->getHttpStatus()) ? '' : "(Status {$this->getHttpStatus()}) "; + $idStr = (null === $this->getRequestId()) ? '' : "(Request {$this->getRequestId()}) "; + + return "{$statusStr}{$idStr}{$this->getMessage()}"; + } + + protected function constructErrorObject() + { + if (null === $this->jsonBody || !\array_key_exists('error', $this->jsonBody)) { + return null; + } + + return \Stripe\ErrorObject::constructFrom($this->jsonBody['error']); + } +} diff --git a/app/api/Stripe/Exception/AuthenticationException.php b/app/api/Stripe/Exception/AuthenticationException.php new file mode 100755 index 0000000..bd9356b --- /dev/null +++ b/app/api/Stripe/Exception/AuthenticationException.php @@ -0,0 +1,11 @@ +setDeclineCode($declineCode); + $instance->setStripeParam($stripeParam); + + return $instance; + } + + /** + * Gets the decline code. + * + * @return null|string + */ + public function getDeclineCode() + { + return $this->declineCode; + } + + /** + * Sets the decline code. + * + * @param null|string $declineCode + */ + public function setDeclineCode($declineCode) + { + $this->declineCode = $declineCode; + } + + /** + * Gets the parameter related to the error. + * + * @return null|string + */ + public function getStripeParam() + { + return $this->stripeParam; + } + + /** + * Sets the parameter related to the error. + * + * @param null|string $stripeParam + */ + public function setStripeParam($stripeParam) + { + $this->stripeParam = $stripeParam; + } +} diff --git a/app/api/Stripe/Exception/ExceptionInterface.php b/app/api/Stripe/Exception/ExceptionInterface.php new file mode 100755 index 0000000..a0ccea9 --- /dev/null +++ b/app/api/Stripe/Exception/ExceptionInterface.php @@ -0,0 +1,22 @@ +setStripeParam($stripeParam); + + return $instance; + } + + /** + * Gets the parameter related to the error. + * + * @return null|string + */ + public function getStripeParam() + { + return $this->stripeParam; + } + + /** + * Sets the parameter related to the error. + * + * @param null|string $stripeParam + */ + public function setStripeParam($stripeParam) + { + $this->stripeParam = $stripeParam; + } +} diff --git a/app/api/Stripe/Exception/OAuth/ExceptionInterface.php b/app/api/Stripe/Exception/OAuth/ExceptionInterface.php new file mode 100755 index 0000000..bc1986f --- /dev/null +++ b/app/api/Stripe/Exception/OAuth/ExceptionInterface.php @@ -0,0 +1,10 @@ +jsonBody) { + return null; + } + + return \Stripe\OAuthErrorObject::constructFrom($this->jsonBody); + } +} diff --git a/app/api/Stripe/Exception/OAuth/UnknownOAuthErrorException.php b/app/api/Stripe/Exception/OAuth/UnknownOAuthErrorException.php new file mode 100755 index 0000000..f1d6f94 --- /dev/null +++ b/app/api/Stripe/Exception/OAuth/UnknownOAuthErrorException.php @@ -0,0 +1,12 @@ +setHttpBody($httpBody); + $instance->setSigHeader($sigHeader); + + return $instance; + } + + /** + * Gets the HTTP body as a string. + * + * @return null|string + */ + public function getHttpBody() + { + return $this->httpBody; + } + + /** + * Sets the HTTP body as a string. + * + * @param null|string $httpBody + */ + public function setHttpBody($httpBody) + { + $this->httpBody = $httpBody; + } + + /** + * Gets the `Stripe-Signature` HTTP header. + * + * @return null|string + */ + public function getSigHeader() + { + return $this->sigHeader; + } + + /** + * Sets the `Stripe-Signature` HTTP header. + * + * @param null|string $sigHeader + */ + public function setSigHeader($sigHeader) + { + $this->sigHeader = $sigHeader; + } +} diff --git a/app/api/Stripe/Exception/UnexpectedValueException.php b/app/api/Stripe/Exception/UnexpectedValueException.php new file mode 100755 index 0000000..5270eeb --- /dev/null +++ b/app/api/Stripe/Exception/UnexpectedValueException.php @@ -0,0 +1,7 @@ +Exchange Rate objects allow you to determine the rates that Stripe + * is currently using to convert from one currency to another. Since this number is + * variable throughout the day, there are various reasons why you might want to + * know the current rate (for example, to dynamically price an item for a user with + * a default payment in a foreign currency). + * + * If you want a guarantee that the charge is made with a certain exchange rate you + * expect is current, you can pass in exchange_rate to charges + * endpoints. If the value is no longer up to date, the charge won't go through. + * Please refer to our Exchange + * Rates API guide for more details. + * + * @property string $id Unique identifier for the object. Represented as the three-letter ISO currency code in lowercase. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject $rates Hash where the keys are supported currencies and the values are the exchange rate at which the base id currency converts to the key currency. + */ +class ExchangeRate extends ApiResource +{ + const OBJECT_NAME = 'exchange_rate'; + + use ApiOperations\All; + use ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/File.php b/app/api/Stripe/File.php new file mode 100755 index 0000000..8a835f6 --- /dev/null +++ b/app/api/Stripe/File.php @@ -0,0 +1,82 @@ +create file request (for + * example, when uploading dispute evidence) or it may have been created by Stripe + * (for example, the results of a Sigma scheduled + * query). + * + * Related guide: File Upload + * Guide. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|int $expires_at The time at which the file expires and is no longer available in epoch seconds. + * @property null|string $filename A filename for the file, suitable for saving to a filesystem. + * @property null|\Stripe\Collection $links A list of file links that point at this file. + * @property string $purpose The purpose of the uploaded file. + * @property int $size The size in bytes of the file object. + * @property null|string $title A user friendly title for the document. + * @property null|string $type The type of the file returned (e.g., csv, pdf, jpg, or png). + * @property null|string $url The URL from which the file can be downloaded using your live secret API key. + */ +class File extends ApiResource +{ + const OBJECT_NAME = 'file'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + + const PURPOSE_ACCOUNT_REQUIREMENT = 'account_requirement'; + const PURPOSE_ADDITIONAL_VERIFICATION = 'additional_verification'; + const PURPOSE_BUSINESS_ICON = 'business_icon'; + const PURPOSE_BUSINESS_LOGO = 'business_logo'; + const PURPOSE_CUSTOMER_SIGNATURE = 'customer_signature'; + const PURPOSE_DISPUTE_EVIDENCE = 'dispute_evidence'; + const PURPOSE_IDENTITY_DOCUMENT = 'identity_document'; + const PURPOSE_PCI_DOCUMENT = 'pci_document'; + const PURPOSE_TAX_DOCUMENT_USER_UPLOAD = 'tax_document_user_upload'; + + // This resource can have two different object names. In latter API + // versions, only `file` is used, but since stripe-php may be used with + // any API version, we need to support deserializing the older + // `file_upload` object into the same class. + const OBJECT_NAME_ALT = 'file_upload'; + + use ApiOperations\Create { + create as protected _create; + } + + public static function classUrl() + { + return '/v1/files'; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\File the created file + */ + public static function create($params = null, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + if (null === $opts->apiBase) { + $opts->apiBase = Stripe::$apiUploadBase; + } + // Manually flatten params, otherwise curl's multipart encoder will + // choke on nested arrays. + $flatParams = \array_column(\Stripe\Util\Util::flattenParams($params), 1, 0); + + return static::_create($flatParams, $opts); + } +} diff --git a/app/api/Stripe/FileLink.php b/app/api/Stripe/FileLink.php new file mode 100755 index 0000000..23eab02 --- /dev/null +++ b/app/api/Stripe/FileLink.php @@ -0,0 +1,30 @@ +File object with non-Stripe users, you + * can create a FileLink. FileLinks contain a URL that + * can be used to retrieve the contents of the file without authentication. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $expired Whether this link is already expired. + * @property null|int $expires_at Time at which the link expires. + * @property string|\Stripe\File $file The file object this link points to. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $url The publicly accessible URL to download the file. + */ +class FileLink extends ApiResource +{ + const OBJECT_NAME = 'file_link'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/HttpClient/ClientInterface.php b/app/api/Stripe/HttpClient/ClientInterface.php new file mode 100755 index 0000000..0dca25b --- /dev/null +++ b/app/api/Stripe/HttpClient/ClientInterface.php @@ -0,0 +1,22 @@ +defaultOptions = $defaultOptions; + $this->randomGenerator = $randomGenerator ?: new Util\RandomGenerator(); + $this->initUserAgentInfo(); + + $this->enableHttp2 = $this->canSafelyUseHttp2(); + } + + public function __destruct() + { + $this->closeCurlHandle(); + } + + public function initUserAgentInfo() + { + $curlVersion = \curl_version(); + $this->userAgentInfo = [ + 'httplib' => 'curl ' . $curlVersion['version'], + 'ssllib' => $curlVersion['ssl_version'], + ]; + } + + public function getDefaultOptions() + { + return $this->defaultOptions; + } + + public function getUserAgentInfo() + { + return $this->userAgentInfo; + } + + /** + * @return bool + */ + public function getEnablePersistentConnections() + { + return $this->enablePersistentConnections; + } + + /** + * @param bool $enable + */ + public function setEnablePersistentConnections($enable) + { + $this->enablePersistentConnections = $enable; + } + + /** + * @return bool + */ + public function getEnableHttp2() + { + return $this->enableHttp2; + } + + /** + * @param bool $enable + */ + public function setEnableHttp2($enable) + { + $this->enableHttp2 = $enable; + } + + /** + * @return null|callable + */ + public function getRequestStatusCallback() + { + return $this->requestStatusCallback; + } + + /** + * Sets a callback that is called after each request. The callback will + * receive the following parameters: + *
    + *
  1. string $rbody The response body
  2. + *
  3. integer $rcode The response status code
  4. + *
  5. \Stripe\Util\CaseInsensitiveArray $rheaders The response headers
  6. + *
  7. integer $errno The curl error number
  8. + *
  9. string|null $message The curl error message
  10. + *
  11. boolean $shouldRetry Whether the request will be retried
  12. + *
  13. integer $numRetries The number of the retry attempt
  14. + *
. + * + * @param null|callable $requestStatusCallback + */ + public function setRequestStatusCallback($requestStatusCallback) + { + $this->requestStatusCallback = $requestStatusCallback; + } + + // USER DEFINED TIMEOUTS + + const DEFAULT_TIMEOUT = 80; + const DEFAULT_CONNECT_TIMEOUT = 30; + + private $timeout = self::DEFAULT_TIMEOUT; + private $connectTimeout = self::DEFAULT_CONNECT_TIMEOUT; + + public function setTimeout($seconds) + { + $this->timeout = (int) \max($seconds, 0); + + return $this; + } + + public function setConnectTimeout($seconds) + { + $this->connectTimeout = (int) \max($seconds, 0); + + return $this; + } + + public function getTimeout() + { + return $this->timeout; + } + + public function getConnectTimeout() + { + return $this->connectTimeout; + } + + // END OF USER DEFINED TIMEOUTS + + public function request($method, $absUrl, $headers, $params, $hasFile) + { + $opts = []; + if (\is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value + $opts = \call_user_func_array($this->defaultOptions, \func_get_args()); + if (!\is_array($opts)) { + throw new Exception\UnexpectedValueException('Non-array value returned by defaultOptions CurlClient callback'); + } + } elseif (\is_array($this->defaultOptions)) { // set default curlopts from array + $opts = $this->defaultOptions; + } + + $method = \strtolower($method); + + $params = Util\Util::objectsToIds($params); + + if ('get' === $method) { + if ($hasFile) { + throw new Exception\UnexpectedValueException( + 'Issuing a GET request with a file parameter' + ); + } + $opts[\CURLOPT_HTTPGET] = 1; + if (\count($params) > 0) { + $encoded = Util\Util::encodeParameters($params); + $absUrl = "{$absUrl}?{$encoded}"; + } + } elseif ('post' === $method) { + $opts[\CURLOPT_POST] = 1; + $opts[\CURLOPT_POSTFIELDS] = $hasFile ? $params : Util\Util::encodeParameters($params); + } elseif ('delete' === $method) { + $opts[\CURLOPT_CUSTOMREQUEST] = 'DELETE'; + if (\count($params) > 0) { + $encoded = Util\Util::encodeParameters($params); + $absUrl = "{$absUrl}?{$encoded}"; + } + } else { + throw new Exception\UnexpectedValueException("Unrecognized method {$method}"); + } + + // It is only safe to retry network failures on POST requests if we + // add an Idempotency-Key header + if (('post' === $method) && (Stripe::$maxNetworkRetries > 0)) { + if (!$this->hasHeader($headers, 'Idempotency-Key')) { + $headers[] = 'Idempotency-Key: ' . $this->randomGenerator->uuid(); + } + } + + // By default for large request body sizes (> 1024 bytes), cURL will + // send a request without a body and with a `Expect: 100-continue` + // header, which gives the server a chance to respond with an error + // status code in cases where one can be determined right away (say + // on an authentication problem for example), and saves the "large" + // request body from being ever sent. + // + // Unfortunately, the bindings don't currently correctly handle the + // success case (in which the server sends back a 100 CONTINUE), so + // we'll error under that condition. To compensate for that problem + // for the time being, override cURL's behavior by simply always + // sending an empty `Expect:` header. + $headers[] = 'Expect: '; + + $absUrl = Util\Util::utf8($absUrl); + $opts[\CURLOPT_URL] = $absUrl; + $opts[\CURLOPT_RETURNTRANSFER] = true; + $opts[\CURLOPT_CONNECTTIMEOUT] = $this->connectTimeout; + $opts[\CURLOPT_TIMEOUT] = $this->timeout; + $opts[\CURLOPT_HTTPHEADER] = $headers; + $opts[\CURLOPT_CAINFO] = Stripe::getCABundlePath(); + if (!Stripe::getVerifySslCerts()) { + $opts[\CURLOPT_SSL_VERIFYPEER] = false; + } + + if (!isset($opts[\CURLOPT_HTTP_VERSION]) && $this->getEnableHttp2()) { + // For HTTPS requests, enable HTTP/2, if supported + $opts[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2TLS; + } + + // Stripe's API servers are only accessible over IPv4. Force IPv4 resolving to avoid + // potential issues (cf. https://github.com/stripe/stripe-php/issues/1045). + $opts[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; + + list($rbody, $rcode, $rheaders) = $this->executeRequestWithRetries($opts, $absUrl); + + return [$rbody, $rcode, $rheaders]; + } + + /** + * @param array $opts cURL options + * @param string $absUrl + */ + private function executeRequestWithRetries($opts, $absUrl) + { + $numRetries = 0; + + while (true) { + $rcode = 0; + $errno = 0; + $message = null; + + // Create a callback to capture HTTP headers for the response + $rheaders = new Util\CaseInsensitiveArray(); + $headerCallback = function ($curl, $header_line) use (&$rheaders) { + // Ignore the HTTP request line (HTTP/1.1 200 OK) + if (false === \strpos($header_line, ':')) { + return \strlen($header_line); + } + list($key, $value) = \explode(':', \trim($header_line), 2); + $rheaders[\trim($key)] = \trim($value); + + return \strlen($header_line); + }; + $opts[\CURLOPT_HEADERFUNCTION] = $headerCallback; + + $this->resetCurlHandle(); + \curl_setopt_array($this->curlHandle, $opts); + $rbody = \curl_exec($this->curlHandle); + + if (false === $rbody) { + $errno = \curl_errno($this->curlHandle); + $message = \curl_error($this->curlHandle); + } else { + $rcode = \curl_getinfo($this->curlHandle, \CURLINFO_HTTP_CODE); + } + if (!$this->getEnablePersistentConnections()) { + $this->closeCurlHandle(); + } + + $shouldRetry = $this->shouldRetry($errno, $rcode, $rheaders, $numRetries); + + if (\is_callable($this->getRequestStatusCallback())) { + \call_user_func_array( + $this->getRequestStatusCallback(), + [$rbody, $rcode, $rheaders, $errno, $message, $shouldRetry, $numRetries] + ); + } + + if ($shouldRetry) { + ++$numRetries; + $sleepSeconds = $this->sleepTime($numRetries, $rheaders); + \usleep((int) ($sleepSeconds * 1000000)); + } else { + break; + } + } + + if (false === $rbody) { + $this->handleCurlError($absUrl, $errno, $message, $numRetries); + } + + return [$rbody, $rcode, $rheaders]; + } + + /** + * @param string $url + * @param int $errno + * @param string $message + * @param int $numRetries + * + * @throws Exception\ApiConnectionException + */ + private function handleCurlError($url, $errno, $message, $numRetries) + { + switch ($errno) { + case \CURLE_COULDNT_CONNECT: + case \CURLE_COULDNT_RESOLVE_HOST: + case \CURLE_OPERATION_TIMEOUTED: + $msg = "Could not connect to Stripe ({$url}). Please check your " + . 'internet connection and try again. If this problem persists, ' + . "you should check Stripe's service status at " + . 'https://twitter.com/stripestatus, or'; + + break; + + case \CURLE_SSL_CACERT: + case \CURLE_SSL_PEER_CERTIFICATE: + $msg = "Could not verify Stripe's SSL certificate. Please make sure " + . 'that your network is not intercepting certificates. ' + . "(Try going to {$url} in your browser.) " + . 'If this problem persists,'; + + break; + + default: + $msg = 'Unexpected error communicating with Stripe. ' + . 'If this problem persists,'; + } + $msg .= ' let us know at support@stripe.com.'; + + $msg .= "\n\n(Network error [errno {$errno}]: {$message})"; + + if ($numRetries > 0) { + $msg .= "\n\nRequest was retried {$numRetries} times."; + } + + throw new Exception\ApiConnectionException($msg); + } + + /** + * Checks if an error is a problem that we should retry on. This includes both + * socket errors that may represent an intermittent problem and some special + * HTTP statuses. + * + * @param int $errno + * @param int $rcode + * @param array|\Stripe\Util\CaseInsensitiveArray $rheaders + * @param int $numRetries + * + * @return bool + */ + private function shouldRetry($errno, $rcode, $rheaders, $numRetries) + { + if ($numRetries >= Stripe::getMaxNetworkRetries()) { + return false; + } + + // Retry on timeout-related problems (either on open or read). + if (\CURLE_OPERATION_TIMEOUTED === $errno) { + return true; + } + + // Destination refused the connection, the connection was reset, or a + // variety of other connection failures. This could occur from a single + // saturated server, so retry in case it's intermittent. + if (\CURLE_COULDNT_CONNECT === $errno) { + return true; + } + + // The API may ask us not to retry (eg; if doing so would be a no-op) + // or advise us to retry (eg; in cases of lock timeouts); we defer to that. + if (isset($rheaders['stripe-should-retry'])) { + if ('false' === $rheaders['stripe-should-retry']) { + return false; + } + if ('true' === $rheaders['stripe-should-retry']) { + return true; + } + } + + // 409 Conflict + if (409 === $rcode) { + return true; + } + + // Retry on 500, 503, and other internal errors. + // + // Note that we expect the stripe-should-retry header to be false + // in most cases when a 500 is returned, since our idempotency framework + // would typically replay it anyway. + if ($rcode >= 500) { + return true; + } + + return false; + } + + /** + * Provides the number of seconds to wait before retrying a request. + * + * @param int $numRetries + * @param array|\Stripe\Util\CaseInsensitiveArray $rheaders + * + * @return int + */ + private function sleepTime($numRetries, $rheaders) + { + // Apply exponential backoff with $initialNetworkRetryDelay on the + // number of $numRetries so far as inputs. Do not allow the number to exceed + // $maxNetworkRetryDelay. + $sleepSeconds = \min( + Stripe::getInitialNetworkRetryDelay() * 1.0 * 2 ** ($numRetries - 1), + Stripe::getMaxNetworkRetryDelay() + ); + + // Apply some jitter by randomizing the value in the range of + // ($sleepSeconds / 2) to ($sleepSeconds). + $sleepSeconds *= 0.5 * (1 + $this->randomGenerator->randFloat()); + + // But never sleep less than the base sleep seconds. + $sleepSeconds = \max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds); + + // And never sleep less than the time the API asks us to wait, assuming it's a reasonable ask. + $retryAfter = isset($rheaders['retry-after']) ? (float) ($rheaders['retry-after']) : 0.0; + if (\floor($retryAfter) === $retryAfter && $retryAfter <= Stripe::getMaxRetryAfter()) { + $sleepSeconds = \max($sleepSeconds, $retryAfter); + } + + return $sleepSeconds; + } + + /** + * Initializes the curl handle. If already initialized, the handle is closed first. + */ + private function initCurlHandle() + { + $this->closeCurlHandle(); + $this->curlHandle = \curl_init(); + } + + /** + * Closes the curl handle if initialized. Do nothing if already closed. + */ + private function closeCurlHandle() + { + if (null !== $this->curlHandle) { + \curl_close($this->curlHandle); + $this->curlHandle = null; + } + } + + /** + * Resets the curl handle. If the handle is not already initialized, or if persistent + * connections are disabled, the handle is reinitialized instead. + */ + private function resetCurlHandle() + { + if (null !== $this->curlHandle && $this->getEnablePersistentConnections()) { + \curl_reset($this->curlHandle); + } else { + $this->initCurlHandle(); + } + } + + /** + * Indicates whether it is safe to use HTTP/2 or not. + * + * @return bool + */ + private function canSafelyUseHttp2() + { + // Versions of curl older than 7.60.0 don't respect GOAWAY frames + // (cf. https://github.com/curl/curl/issues/2416), which Stripe use. + $curlVersion = \curl_version()['version']; + + return \version_compare($curlVersion, '7.60.0') >= 0; + } + + /** + * Checks if a list of headers contains a specific header name. + * + * @param string[] $headers + * @param string $name + * + * @return bool + */ + private function hasHeader($headers, $name) + { + foreach ($headers as $header) { + if (0 === \strncasecmp($header, "{$name}: ", \strlen($name) + 2)) { + return true; + } + } + + return false; + } +} diff --git a/app/api/Stripe/HttpClient/data/ca-certificates.crt b/app/api/Stripe/HttpClient/data/ca-certificates.crt new file mode 100755 index 0000000..9b9492b --- /dev/null +++ b/app/api/Stripe/HttpClient/data/ca-certificates.crt @@ -0,0 +1,3646 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================ +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +==================================================== +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +Certplus Root CA G1 +=================== +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV +BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe +Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD +ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN +r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx +Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj +BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv +LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 +z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc +4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd +4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj +jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ +ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY +lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG +YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ +2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F +6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX +CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe +tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC +VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ ++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ +qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +Certplus Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT +AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x +NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 +cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN +Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud +IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV +HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl +vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +OpenTrust Root CA G1 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx +MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa +Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 +ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO +YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 +xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO +9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq +3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi +n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 +URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr +TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px +N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv +uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK +n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh +X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 +nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm +GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ +bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o +4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA +OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx +-----END CERTIFICATE----- + +OpenTrust Root CA G2 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy +MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ +Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz +4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV +eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt +UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz +3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj +3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz +9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 +0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT +y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 +M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI +mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG +S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp +EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ +6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr +gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo +SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 +YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm +u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK +-----END CERTIFICATE----- + +OpenTrust Root CA G3 +==================== +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X +DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w +ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B +ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf +BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM +BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta +3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- diff --git a/app/api/Stripe/HttpClient/data/test.png b/app/api/Stripe/HttpClient/data/test.png new file mode 100755 index 0000000000000000000000000000000000000000..1914264c08781d1f30ee0b8482bccf44586f2dc1 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju0VQumF+E%TuG2$FoVOh l8)-lem#2$k2*>s01R$Gz9%CSj!PC{xWt~$(697H@6ZHT9 literal 0 HcmV?d00001 diff --git a/app/api/Stripe/Invoice.php b/app/api/Stripe/Invoice.php new file mode 100755 index 0000000..14d7728 --- /dev/null +++ b/app/api/Stripe/Invoice.php @@ -0,0 +1,261 @@ +invoice + * items, and proration adjustments that may be caused by subscription + * upgrades/downgrades (if necessary). + * + * If your invoice is configured to be billed through automatic charges, Stripe + * automatically finalizes your invoice and attempts payment. Note that finalizing + * the invoice, when + * automatic, does not happen immediately as the invoice is created. Stripe + * waits until one hour after the last webhook was successfully sent (or the last + * webhook timed out after failing). If you (and the platforms you may have + * connected to) have no webhooks configured, Stripe waits one hour after creation + * to finalize the invoice. + * + * If your invoice is configured to be billed by sending an email, then based on + * your email + * settings, Stripe will email the invoice to your customer and await payment. + * These emails can contain a link to a hosted page to pay the invoice. + * + * Stripe applies any customer credit on the account before determining the amount + * due for the invoice (i.e., the amount that will be actually charged). If the + * amount due for the invoice is less than Stripe's minimum allowed + * charge per currency, the invoice is automatically marked paid, and we add + * the amount due to the customer's credit balance which is applied to the next + * invoice. + * + * More details on the customer's credit balance are here. + * + * Related guide: Send + * Invoices to Customers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $account_country The country of the business associated with this invoice, most often the business creating the invoice. + * @property null|string $account_name The public name of the business associated with this invoice, most often the business creating the invoice. + * @property null|(string|\Stripe\TaxId)[] $account_tax_ids The account tax IDs associated with the invoice. Only editable when the invoice is a draft. + * @property int $amount_due Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the amount_due may be 0. If there is a positive starting_balance for the invoice (the customer owes money), the amount_due will also take that into account. The charge that gets generated for the invoice will be for the amount specified in amount_due. + * @property int $amount_paid The amount, in %s, that was paid. + * @property int $amount_remaining The amount remaining, in %s, that is due. + * @property null|int $application_fee_amount The fee in %s that will be applied to the invoice and transferred to the application owner's Stripe account when the invoice is paid. + * @property int $attempt_count Number of payment attempts made for this invoice, from the perspective of the payment retry schedule. Any payment attempt counts as the first attempt, and subsequently only automatic retries increment the attempt count. In other words, manual payment attempts after the first attempt do not affect the retry schedule. + * @property bool $attempted Whether an attempt has been made to pay the invoice. An invoice is not attempted until 1 hour after the invoice.created webhook, for example, so you might not want to display that invoice as unpaid to your users. + * @property bool $auto_advance Controls whether Stripe will perform automatic collection of the invoice. When false, the invoice's state will not automatically advance without an explicit action. + * @property null|string $billing_reason Indicates the reason why the invoice was created. subscription_cycle indicates an invoice created by a subscription advancing into a new period. subscription_create indicates an invoice created due to creating a subscription. subscription_update indicates an invoice created due to updating a subscription. subscription is set for all old invoices to indicate either a change to a subscription or a period advancement. manual is set for all invoices unrelated to a subscription (for example: created via the invoice editor). The upcoming value is reserved for simulated invoices per the upcoming invoice endpoint. subscription_threshold indicates an invoice created due to a billing threshold being reached. + * @property null|string|\Stripe\Charge $charge ID of the latest charge generated for this invoice, if any. + * @property null|string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|\Stripe\StripeObject[] $custom_fields Custom fields displayed on the invoice. + * @property string|\Stripe\Customer $customer The ID of the customer who will be billed. + * @property null|\Stripe\StripeObject $customer_address The customer's address. Until the invoice is finalized, this field will equal customer.address. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_email The customer's email. Until the invoice is finalized, this field will equal customer.email. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_name The customer's name. Until the invoice is finalized, this field will equal customer.name. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_phone The customer's phone number. Until the invoice is finalized, this field will equal customer.phone. Once the invoice is finalized, this field will no longer be updated. + * @property null|\Stripe\StripeObject $customer_shipping The customer's shipping information. Until the invoice is finalized, this field will equal customer.shipping. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_tax_exempt The customer's tax exempt status. Until the invoice is finalized, this field will equal customer.tax_exempt. Once the invoice is finalized, this field will no longer be updated. + * @property null|\Stripe\StripeObject[] $customer_tax_ids The customer's tax IDs. Until the invoice is finalized, this field will contain the same tax IDs as customer.tax_ids. Once the invoice is finalized, this field will no longer be updated. + * @property null|string|\Stripe\PaymentMethod $default_payment_method ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings. + * @property null|string|\Stripe\Account|\Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source $default_source ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source. + * @property \Stripe\TaxRate[] $default_tax_rates The tax rates applied to this invoice, if any. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard. + * @property null|\Stripe\Discount $discount Describes the current discount applied to this invoice, if there is one. Not populated if there are multiple discounts. + * @property null|(string|\Stripe\Discount)[] $discounts The discounts applied to the invoice. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property null|int $due_date The date on which payment for this invoice is due. This value will be null for invoices where collection_method=charge_automatically. + * @property null|int $ending_balance Ending customer balance after the invoice is finalized. Invoices are finalized approximately an hour after successful webhook delivery or when payment collection is attempted for the invoice. If the invoice has not been finalized yet, this will be null. + * @property null|string $footer Footer displayed on the invoice. + * @property null|string $hosted_invoice_url The URL for the hosted invoice page, which allows customers to view and pay an invoice. If the invoice has not been finalized yet, this will be null. + * @property null|string $invoice_pdf The link to download the PDF for the invoice. If the invoice has not been finalized yet, this will be null. + * @property null|\Stripe\ErrorObject $last_finalization_error The error encountered during the previous attempt to finalize the invoice. This field is cleared when the invoice is successfully finalized. + * @property \Stripe\Collection $lines The individual line items that make up the invoice. lines is sorted as follows: invoice items in reverse chronological order, followed by the subscription, if any. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|int $next_payment_attempt The time at which payment will next be attempted. This value will be null for invoices where collection_method=send_invoice. + * @property null|string $number A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified. + * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the Invoices with Connect documentation for details. + * @property bool $paid Whether payment was successfully collected for this invoice. An invoice can be paid (most commonly) with a charge or with credit from the customer's account balance. + * @property null|string|\Stripe\PaymentIntent $payment_intent The PaymentIntent associated with this invoice. The PaymentIntent is generated when the invoice is finalized, and can then be used to pay the invoice. Note that voiding an invoice will cancel the PaymentIntent. + * @property \Stripe\StripeObject $payment_settings + * @property int $period_end End of the usage period during which invoice items were added to this invoice. + * @property int $period_start Start of the usage period during which invoice items were added to this invoice. + * @property int $post_payment_credit_notes_amount Total amount of all post-payment credit notes issued for this invoice. + * @property int $pre_payment_credit_notes_amount Total amount of all pre-payment credit notes issued for this invoice. + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this invoice. + * @property int $starting_balance Starting customer balance before the invoice is finalized. If the invoice has not been finalized yet, this will be the current customer balance. + * @property null|string $statement_descriptor Extra information about an invoice for the customer's credit card statement. + * @property null|string $status The status of the invoice, one of draft, open, paid, uncollectible, or void. Learn more + * @property \Stripe\StripeObject $status_transitions + * @property null|string|\Stripe\Subscription $subscription The subscription that this invoice was prepared for, if any. + * @property int $subscription_proration_date Only set for upcoming invoices that preview prorations. The time used to calculate prorations. + * @property int $subtotal Total of all subscriptions, invoice items, and prorations on the invoice before any invoice level discount or tax is applied. Item discounts are already incorporated + * @property null|int $tax The amount of tax on this invoice. This is the sum of all the tax amounts on this invoice. + * @property \Stripe\StripeObject $threshold_reason + * @property int $total Total after discounts and taxes. + * @property null|\Stripe\StripeObject[] $total_discount_amounts The aggregate amounts calculated per discount across all line items. + * @property \Stripe\StripeObject[] $total_tax_amounts The aggregate amounts calculated per tax rate for all line items. + * @property null|int $webhooks_delivered_at Invoices are automatically paid or sent 1 hour after webhooks are delivered, or until all webhook delivery attempts have been exhausted. This field tracks the time when webhooks for this invoice were successfully delivered. If the invoice had no webhooks to deliver, this will be set while the invoice is being created. + */ +class Invoice extends ApiResource +{ + const OBJECT_NAME = 'invoice'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const BILLING_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const BILLING_SEND_INVOICE = 'send_invoice'; + + const BILLING_REASON_MANUAL = 'manual'; + const BILLING_REASON_SUBSCRIPTION = 'subscription'; + const BILLING_REASON_SUBSCRIPTION_CREATE = 'subscription_create'; + const BILLING_REASON_SUBSCRIPTION_CYCLE = 'subscription_cycle'; + const BILLING_REASON_SUBSCRIPTION_THRESHOLD = 'subscription_threshold'; + const BILLING_REASON_SUBSCRIPTION_UPDATE = 'subscription_update'; + const BILLING_REASON_UPCOMING = 'upcoming'; + + const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; + + const STATUS_DELETED = 'deleted'; + const STATUS_DRAFT = 'draft'; + const STATUS_OPEN = 'open'; + const STATUS_PAID = 'paid'; + const STATUS_UNCOLLECTIBLE = 'uncollectible'; + const STATUS_VOID = 'void'; + + use ApiOperations\NestedResource; + + const PATH_LINES = '/lines'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice the upcoming invoice + */ + public static function upcoming($params = null, $opts = null) + { + $url = static::classUrl() . '/upcoming'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id the ID of the invoice on which to retrieve the lines + * @param null|array $params + * @param null|array|string $opts + * + * @throws StripeExceptionApiErrorException if the request fails + * + * @return \Stripe\Collection the list of lines (InvoiceLineItem) + */ + public static function allLines($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Invoice the finalized invoice + */ + public function finalizeInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/finalize'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Invoice the uncollectible invoice + */ + public function markUncollectible($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/mark_uncollectible'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Invoice the paid invoice + */ + public function pay($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/pay'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Invoice the sent invoice + */ + public function sendInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/send'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Invoice the voided invoice + */ + public function voidInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/void'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/InvoiceItem.php b/app/api/Stripe/InvoiceItem.php new file mode 100755 index 0000000..664d47e --- /dev/null +++ b/app/api/Stripe/InvoiceItem.php @@ -0,0 +1,49 @@ +Subscription + * Invoices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in the currency specified) of the invoice item. This should always be equal to unit_amount * quantity. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string|\Stripe\Customer $customer The ID of the customer who will be billed when this invoice item is billed. + * @property int $date Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property bool $discountable If true, discounts will apply to this invoice item. Always false for prorations. + * @property null|(string|\Stripe\Discount)[] $discounts The discounts which apply to the invoice item. Item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property null|string|\Stripe\Invoice $invoice The ID of the invoice this invoice item belongs to. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\StripeObject $period + * @property null|\Stripe\Plan $plan If the invoice item is a proration, the plan of the subscription that the proration was computed for. + * @property null|\Stripe\Price $price The price of the invoice item. + * @property bool $proration Whether the invoice item was created automatically as a proration adjustment when the customer switched plans. + * @property int $quantity Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. + * @property null|string|\Stripe\Subscription $subscription The subscription that this invoice item has been created for, if any. + * @property string $subscription_item The subscription item that this invoice item has been created for, if any. + * @property null|\Stripe\TaxRate[] $tax_rates The tax rates which apply to the invoice item. When set, the default_tax_rates on the invoice do not apply to this invoice item. + * @property null|int $unit_amount Unit amount (in the currency specified) of the invoice item. + * @property null|string $unit_amount_decimal Same as unit_amount, but contains a decimal value with at most 12 decimal places. + */ +class InvoiceItem extends ApiResource +{ + const OBJECT_NAME = 'invoiceitem'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/InvoiceLineItem.php b/app/api/Stripe/InvoiceLineItem.php new file mode 100755 index 0000000..7a1c9bb --- /dev/null +++ b/app/api/Stripe/InvoiceLineItem.php @@ -0,0 +1,33 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|\Stripe\StripeObject[] $discount_amounts The amount of discount calculated per discount for this line item. + * @property bool $discountable If true, discounts will apply to this line item. Always false for prorations. + * @property null|(string|\Stripe\Discount)[] $discounts The discounts applied to the invoice line item. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property string $invoice_item The ID of the invoice item associated with this line item if any. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with type=subscription this will reflect the metadata of the subscription that caused the line item to be created. + * @property \Stripe\StripeObject $period + * @property null|\Stripe\Plan $plan The plan of the subscription, if the line item is a subscription or a proration. + * @property null|\Stripe\Price $price The price of the line item. + * @property bool $proration Whether this is a proration. + * @property null|int $quantity The quantity of the subscription, if the line item is a subscription or a proration. + * @property null|string $subscription The subscription that the invoice item pertains to, if any. + * @property string $subscription_item The subscription item that generated this invoice item. Left empty if the line item is not an explicit result of a subscription. + * @property \Stripe\StripeObject[] $tax_amounts The amount of tax calculated per tax rate for this line item + * @property \Stripe\TaxRate[] $tax_rates The tax rates which apply to the line item. + * @property string $type A string identifying the type of the source of this line item, either an invoiceitem or a subscription. + */ +class InvoiceLineItem extends ApiResource +{ + const OBJECT_NAME = 'line_item'; +} diff --git a/app/api/Stripe/Issuing/Authorization.php b/app/api/Stripe/Issuing/Authorization.php new file mode 100755 index 0000000..f9032b6 --- /dev/null +++ b/app/api/Stripe/Issuing/Authorization.php @@ -0,0 +1,81 @@ +issued card is used to + * make a purchase, an Issuing Authorization object is created. Authorizations + * must be approved for the purchase to be completed successfully. + * + * Related guide: Issued Card + * Authorizations. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The total amount that was authorized or rejected. This amount is in the card's currency and in the smallest currency unit. + * @property null|\Stripe\StripeObject $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. + * @property bool $approved Whether the authorization has been approved. + * @property string $authorization_method How the card details were provided. + * @property \Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with this authorization. + * @property \Stripe\Issuing\Card $card You can create physical or virtual cards that are issued to cardholders. + * @property null|string|\Stripe\Issuing\Cardholder $cardholder The cardholder to whom this authorization belongs. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $merchant_amount The total amount that was authorized or rejected. This amount is in the merchant_currency and in the smallest currency unit. + * @property string $merchant_currency The currency that was presented to the cardholder for the authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property \Stripe\StripeObject $merchant_data + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|\Stripe\StripeObject $pending_request The pending authorization request. This field will only be non-null during an issuing_authorization.request webhook. + * @property \Stripe\StripeObject[] $request_history History of every time pending_request was approved/denied, either by you directly or by Stripe (e.g. based on your spending_controls). If the merchant changes the authorization by performing an incremental authorization, you can look at this field to see the previous requests for the authorization. + * @property string $status The current status of the authorization in its lifecycle. + * @property \Stripe\Issuing\Transaction[] $transactions List of transactions associated with this authorization. + * @property \Stripe\StripeObject $verification_data + * @property null|string $wallet What, if any, digital wallet was used for this authorization. One of apple_pay, google_pay, or samsung_pay. + */ +class Authorization extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.authorization'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Authorization the approved authorization + */ + public function approve($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/approve'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Authorization the declined authorization + */ + public function decline($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/decline'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Issuing/Card.php b/app/api/Stripe/Issuing/Card.php new file mode 100755 index 0000000..80ce3b6 --- /dev/null +++ b/app/api/Stripe/Issuing/Card.php @@ -0,0 +1,59 @@ +create physical or + * virtual cards that are issued to cardholders. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $brand The brand of the card. + * @property null|string $cancellation_reason The reason why the card was canceled. + * @property \Stripe\Issuing\Cardholder $cardholder

An Issuing Cardholder object represents an individual or business entity who is issued cards.

Related guide: How to create a Cardholder

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $cvc The card's CVC. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. + * @property int $exp_month The expiration month of the card. + * @property int $exp_year The expiration year of the card. + * @property string $last4 The last 4 digits of the card number. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $number The full unredacted card number. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. + * @property null|string|\Stripe\Issuing\Card $replaced_by The latest card that replaces this card, if any. + * @property null|string|\Stripe\Issuing\Card $replacement_for The card this card replaces, if any. + * @property null|string $replacement_reason The reason why the previous card needed to be replaced. + * @property null|\Stripe\StripeObject $shipping Where and how the card will be shipped. + * @property \Stripe\StripeObject $spending_controls + * @property string $status Whether authorizations can be approved on this card. + * @property string $type The type of the card. + */ +class Card extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.card'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\CardDetails the card details associated with that issuing card + */ + public function details($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/details'; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/app/api/Stripe/Issuing/CardDetails.php b/app/api/Stripe/Issuing/CardDetails.php new file mode 100755 index 0000000..2097a55 --- /dev/null +++ b/app/api/Stripe/Issuing/CardDetails.php @@ -0,0 +1,19 @@ +Cardholder object represents an individual or business + * entity who is issued cards. + * + * Related guide: How to create a + * Cardholder + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject $billing + * @property null|\Stripe\StripeObject $company Additional information about a company cardholder. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $email The cardholder's email address. + * @property null|\Stripe\StripeObject $individual Additional information about an individual cardholder. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The cardholder's name. This will be printed on cards issued to them. + * @property null|string $phone_number The cardholder's phone number. + * @property \Stripe\StripeObject $requirements + * @property null|\Stripe\StripeObject $spending_controls Rules that control spending across this cardholder's cards. Refer to our documentation for more details. + * @property string $status Specifies whether to permit authorizations on this cardholder's cards. + * @property string $type One of individual or company. + */ +class Cardholder extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.cardholder'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/Issuing/Dispute.php b/app/api/Stripe/Issuing/Dispute.php new file mode 100755 index 0000000..795e58d --- /dev/null +++ b/app/api/Stripe/Issuing/Dispute.php @@ -0,0 +1,53 @@ +card issuer, you can dispute + * transactions that the cardholder does not recognize, suspects to be fraudulent, + * or has other issues with. + * + * Related guide: Disputing + * Transactions + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Disputed amount. Usually the amount of the transaction, but can differ (usually because of currency fluctuation). + * @property null|\Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with the dispute. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency The currency the transaction was made in. + * @property \Stripe\StripeObject $evidence + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $status Current status of the dispute. + * @property string|\Stripe\Issuing\Transaction $transaction The transaction being disputed. + */ +class Dispute extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.dispute'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Dispute the submited dispute + */ + public function submit($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/submit'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Issuing/Transaction.php b/app/api/Stripe/Issuing/Transaction.php new file mode 100755 index 0000000..6270508 --- /dev/null +++ b/app/api/Stripe/Issuing/Transaction.php @@ -0,0 +1,43 @@ +issued card that + * results in funds entering or leaving your Stripe account, such as a completed + * purchase or refund, is represented by an Issuing Transaction + * object. + * + * Related guide: Issued Card + * Transactions. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The transaction amount, which will be reflected in your balance. This amount is in your currency and in the smallest currency unit. + * @property null|\Stripe\StripeObject $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. + * @property null|string|\Stripe\Issuing\Authorization $authorization The Authorization object that led to this transaction. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction associated with this transaction. + * @property string|\Stripe\Issuing\Card $card The card used to make this transaction. + * @property null|string|\Stripe\Issuing\Cardholder $cardholder The cardholder to whom this transaction belongs. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Issuing\Dispute $dispute If you've disputed the transaction, the ID of the dispute. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $merchant_amount The amount that the merchant will receive, denominated in merchant_currency and in the smallest currency unit. It will be different from amount if the merchant is taking payment in a different currency. + * @property string $merchant_currency The currency with which the merchant is taking payment. + * @property \Stripe\StripeObject $merchant_data + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|\Stripe\StripeObject $purchase_details Additional purchase information that is optionally provided by the merchant. + * @property string $type The nature of the transaction. + */ +class Transaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.transaction'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/LineItem.php b/app/api/Stripe/LineItem.php new file mode 100755 index 0000000..80c2a61 --- /dev/null +++ b/app/api/Stripe/LineItem.php @@ -0,0 +1,26 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. Defaults to product name. + * @property \Stripe\StripeObject[] $discounts The discounts applied to the line item. + * @property null|\Stripe\Price $price The price used to generate the line item. + * @property null|int $quantity The quantity of products being purchased. + * @property \Stripe\StripeObject[] $taxes The taxes applied to the line item. + */ +class LineItem extends ApiResource +{ + const OBJECT_NAME = 'item'; + + use ApiOperations\All; +} diff --git a/app/api/Stripe/LoginLink.php b/app/api/Stripe/LoginLink.php new file mode 100755 index 0000000..a016fca --- /dev/null +++ b/app/api/Stripe/LoginLink.php @@ -0,0 +1,15 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $multi_use + * @property string|\Stripe\PaymentMethod $payment_method ID of the payment method associated with this mandate. + * @property \Stripe\StripeObject $payment_method_details + * @property \Stripe\StripeObject $single_use + * @property string $status The status of the mandate, which indicates whether it can be used to initiate a payment. + * @property string $type The type of the mandate. + */ +class Mandate extends ApiResource +{ + const OBJECT_NAME = 'mandate'; + + use ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/OAuth.php b/app/api/Stripe/OAuth.php new file mode 100755 index 0000000..71deeae --- /dev/null +++ b/app/api/Stripe/OAuth.php @@ -0,0 +1,101 @@ +request( + 'post', + '/oauth/token', + $params, + null + ); + + return Util\Util::convertToStripeObject($response->json, $opts); + } + + /** + * Disconnects an account from your platform. + * + * @param null|array $params + * @param null|array $opts + * + * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails + * + * @return StripeObject object containing the response from the API + */ + public static function deauthorize($params = null, $opts = null) + { + $params = $params ?: []; + $base = ($opts && \array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase; + $requestor = new ApiRequestor(null, $base); + $params['client_id'] = self::_getClientId($params); + list($response, $apiKey) = $requestor->request( + 'post', + '/oauth/deauthorize', + $params, + null + ); + + return Util\Util::convertToStripeObject($response->json, $opts); + } + + private static function _getClientId($params = null) + { + $clientId = ($params && \array_key_exists('client_id', $params)) ? $params['client_id'] : null; + if (null === $clientId) { + $clientId = Stripe::getClientId(); + } + if (null === $clientId) { + $msg = 'No client_id provided. (HINT: set your client_id using ' + . '"Stripe::setClientId()". You can find your client_ids ' + . 'in your Stripe dashboard at ' + . 'https://dashboard.stripe.com/account/applications/settings, ' + . 'after registering your account as a platform. See ' + . 'https://stripe.com/docs/connect/standard-accounts for details, ' + . 'or email support@stripe.com if you have any questions.'; + + throw new Exception\AuthenticationException($msg); + } + + return $clientId; + } +} diff --git a/app/api/Stripe/OAuthErrorObject.php b/app/api/Stripe/OAuthErrorObject.php new file mode 100755 index 0000000..945cb66 --- /dev/null +++ b/app/api/Stripe/OAuthErrorObject.php @@ -0,0 +1,31 @@ + null, + 'error_description' => null, + ], $values); + parent::refreshFrom($values, $opts, $partial); + } +} diff --git a/app/api/Stripe/Order.php b/app/api/Stripe/Order.php new file mode 100755 index 0000000..7d664e2 --- /dev/null +++ b/app/api/Stripe/Order.php @@ -0,0 +1,81 @@ +products. You can + * create, retrieve, and pay individual orders, as well as list all orders. Orders + * are identified by a unique, random ID. + * + * Related guide: Tax, Shipping, and + * Inventory. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the order. + * @property null|int $amount_returned The total amount that was returned to the customer. + * @property null|string $application ID of the Connect Application that created the order. + * @property null|int $application_fee A fee in cents that will be applied to the order and transferred to the application owner’s Stripe account. The request must be made with an OAuth key or the Stripe-Account header in order to take an application fee. For more information, see the application fees documentation. + * @property null|string|\Stripe\Charge $charge The ID of the payment used to pay for the order. Present if the order status is paid, fulfilled, or refunded. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Customer $customer The customer used for the order. + * @property null|string $email The email address of the customer placing the order. + * @property string $external_coupon_code External coupon code to load for this order. + * @property \Stripe\OrderItem[] $items List of items constituting the order. An order can have up to 25 items. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|\Stripe\Collection $returns A list of returns that have taken place for this order. + * @property null|string $selected_shipping_method The shipping method that is currently selected for this order, if any. If present, it is equal to one of the ids of shipping methods in the shipping_methods array. At order creation time, if there are multiple shipping methods, Stripe will automatically selected the first method. + * @property null|\Stripe\StripeObject $shipping The shipping address for the order. Present if the order is for goods to be shipped. + * @property null|\Stripe\StripeObject[] $shipping_methods A list of supported shipping methods for this order. The desired shipping method can be specified either by updating the order, or when paying it. + * @property string $status Current order status. One of created, paid, canceled, fulfilled, or returned. More details in the Orders Guide. + * @property null|\Stripe\StripeObject $status_transitions The timestamps at which the order status was updated. + * @property null|int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + * @property string $upstream_id The user's order ID if it is different from the Stripe order ID. + */ +class Order extends ApiResource +{ + const OBJECT_NAME = 'order'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\OrderReturn the newly created return + */ + public function returnOrder($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/returns'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + + return Util\Util::convertToStripeObject($response, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Order the paid order + */ + public function pay($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/pay'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/OrderItem.php b/app/api/Stripe/OrderItem.php new file mode 100755 index 0000000..48c558d --- /dev/null +++ b/app/api/Stripe/OrderItem.php @@ -0,0 +1,19 @@ +order items. Returns always + * belong to an order, and may optionally contain a refund. + * + * Related guide: Handling + * Returns. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the returned line item. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property \Stripe\OrderItem[] $items The items included in this order return. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\Order $order The order that this return includes items from. + * @property null|string|\Stripe\Refund $refund The ID of the refund issued for this return. + */ +class OrderReturn extends ApiResource +{ + const OBJECT_NAME = 'order_return'; + + use ApiOperations\All; + use ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/PaymentIntent.php b/app/api/Stripe/PaymentIntent.php new file mode 100755 index 0000000..67bf35e --- /dev/null +++ b/app/api/Stripe/PaymentIntent.php @@ -0,0 +1,125 @@ +multiple + * statuses throughout its lifetime as it interfaces with Stripe.js to perform + * authentication flows and ultimately creates at most one successful charge. + * + * Related guide: Payment Intents API. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + * @property int $amount_capturable Amount that can be captured from this PaymentIntent. + * @property int $amount_received Amount that was collected by this PaymentIntent. + * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the PaymentIntent. + * @property null|int $application_fee_amount The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents use case for connected accounts. + * @property null|int $canceled_at Populated when status is canceled, this is the time at which the PaymentIntent was canceled. Measured in seconds since the Unix epoch. + * @property null|string $cancellation_reason Reason for cancellation of this PaymentIntent, either user-provided (duplicate, fraudulent, requested_by_customer, or abandoned) or generated by Stripe internally (failed_invoice, void_invoice, or automatic). + * @property string $capture_method Controls when the funds will be captured from the customer's account. + * @property \Stripe\Collection $charges Charges that were created by this PaymentIntent, if any. + * @property null|string $client_secret

The client secret of this PaymentIntent. Used for client-side retrieval using a publishable key.

The client secret can be used to complete a payment from your frontend. It should not be stored, logged, embedded in URLs, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

Refer to our docs to accept a payment and learn about how client_secret should be handled.

+ * @property string $confirmation_method + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Customer $customer

ID of the Customer this PaymentIntent belongs to, if one exists.

Payment methods attached to other Customers cannot be used with this PaymentIntent.

If present in combination with setup_future_usage, this PaymentIntent's payment method will be attached to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string|\Stripe\Invoice $invoice ID of the invoice that created this PaymentIntent, if it exists. + * @property null|\Stripe\ErrorObject $last_payment_error The payment error encountered in the previous PaymentIntent confirmation. It will be cleared if the PaymentIntent is later updated for any reason. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. For more information, see the documentation. + * @property null|\Stripe\StripeObject $next_action If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source. + * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the funds of the PaymentIntent are intended. See the PaymentIntents use case for connected accounts for details. + * @property null|string|\Stripe\PaymentMethod $payment_method ID of the payment method used in this PaymentIntent. + * @property null|\Stripe\StripeObject $payment_method_options Payment-method-specific configuration for this PaymentIntent. + * @property string[] $payment_method_types The list of payment method types (e.g. card) that this PaymentIntent is allowed to use. + * @property null|string $receipt_email Email address that the receipt for the resulting payment will be sent to. If receipt_email is specified for a payment in live mode, a receipt will be sent regardless of your email settings. + * @property null|string|\Stripe\Review $review ID of the review associated with this PaymentIntent, if any. + * @property null|string $setup_future_usage

Indicates that you intend to make future payments with this PaymentIntent's payment method.

Providing this parameter will attach the payment method to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete. If no Customer was provided, the payment method can still be attached to a Customer after the transaction completes.

When processing card payments, Stripe also uses setup_future_usage to dynamically optimize your payment flow and comply with regional legislation and network rules, such as SCA.

+ * @property null|\Stripe\StripeObject $shipping Shipping information for this PaymentIntent. + * @property null|string|\Stripe\Account|\Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source $source This is a legacy field that will be removed in the future. It is the ID of the Source object that is associated with this PaymentIntent, if one was supplied. + * @property null|string $statement_descriptor For non-card charges, you can use this value as the complete description that appears on your customers’ statements. Must contain at least one letter, maximum 22 characters. + * @property null|string $statement_descriptor_suffix Provides information about a card payment that customers see on their statements. Concatenated with the prefix (shortened descriptor) or statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters for the concatenated descriptor. + * @property string $status Status of this PaymentIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, requires_capture, canceled, or succeeded. Read more about each PaymentIntent status. + * @property null|\Stripe\StripeObject $transfer_data The data with which to automatically create a Transfer when the payment is finalized. See the PaymentIntents use case for connected accounts for details. + * @property null|string $transfer_group A string that identifies the resulting payment as part of a group. See the PaymentIntents use case for connected accounts for details. + */ +class PaymentIntent extends ApiResource +{ + const OBJECT_NAME = 'payment_intent'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const STATUS_CANCELED = 'canceled'; + const STATUS_PROCESSING = 'processing'; + const STATUS_REQUIRES_ACTION = 'requires_action'; + const STATUS_REQUIRES_CAPTURE = 'requires_capture'; + const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; + const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return PaymentIntent the canceled payment intent + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return PaymentIntent the captured payment intent + */ + public function capture($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/capture'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return PaymentIntent the confirmed payment intent + */ + public function confirm($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/confirm'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/PaymentMethod.php b/app/api/Stripe/PaymentMethod.php new file mode 100755 index 0000000..f77e7bd --- /dev/null +++ b/app/api/Stripe/PaymentMethod.php @@ -0,0 +1,87 @@ +PaymentIntents to + * collect payments or saved to Customer objects to store instrument details for + * future payments. + * + * Related guides: Payment Methods and + * More Payment + * Scenarios. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject $afterpay_clearpay + * @property \Stripe\StripeObject $alipay + * @property \Stripe\StripeObject $au_becs_debit + * @property \Stripe\StripeObject $bacs_debit + * @property \Stripe\StripeObject $bancontact + * @property \Stripe\StripeObject $billing_details + * @property \Stripe\StripeObject $card + * @property \Stripe\StripeObject $card_present + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Customer $customer The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer. + * @property \Stripe\StripeObject $eps + * @property \Stripe\StripeObject $fpx + * @property \Stripe\StripeObject $giropay + * @property \Stripe\StripeObject $grabpay + * @property \Stripe\StripeObject $ideal + * @property \Stripe\StripeObject $interac_present + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\StripeObject $oxxo + * @property \Stripe\StripeObject $p24 + * @property \Stripe\StripeObject $sepa_debit + * @property \Stripe\StripeObject $sofort + * @property string $type The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type. + */ +class PaymentMethod extends ApiResource +{ + const OBJECT_NAME = 'payment_method'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return PaymentMethod the attached payment method + */ + public function attach($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/attach'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return PaymentMethod the detached payment method + */ + public function detach($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/detach'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Payout.php b/app/api/Stripe/Payout.php new file mode 100755 index 0000000..336042b --- /dev/null +++ b/app/api/Stripe/Payout.php @@ -0,0 +1,108 @@ +Payout object is created when you receive funds from Stripe, or + * when you initiate a payout to either a bank account or debit card of a connected Stripe account. You + * can retrieve individual payouts, as well as list all payouts. Payouts are made + * on varying schedules, + * depending on your country and industry. + * + * Related guide: Receiving Payouts. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in %s) to be transferred to your bank account or debit card. + * @property int $arrival_date Date the payout is expected to arrive in the bank. This factors in delays like weekends or bank holidays. + * @property bool $automatic Returns true if the payout was created by an automated payout schedule, and false if it was requested manually. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this payout on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string|\Stripe\BankAccount|\Stripe\Card $destination ID of the bank account or card the payout was sent to. + * @property null|string|\Stripe\BalanceTransaction $failure_balance_transaction If the payout failed or was canceled, this will be the ID of the balance transaction that reversed the initial balance transaction, and puts the funds from the failed payout back in your balance. + * @property null|string $failure_code Error code explaining reason for payout failure if available. See Types of payout failures for a list of failure codes. + * @property null|string $failure_message Message to user further explaining reason for payout failure if available. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $method The method used to send this payout, which can be standard or instant. instant is only supported for payouts to debit cards. (See Instant payouts for marketplaces for more information.) + * @property null|string|\Stripe\Payout $original_payout If the payout reverses another, this is the ID of the original payout. + * @property null|string|\Stripe\Payout $reversed_by If the payout was reversed, this is the ID of the payout that reverses this payout. + * @property string $source_type The source balance this payout came from. One of card, fpx, or bank_account. + * @property null|string $statement_descriptor Extra information about a payout to be displayed on the user's bank statement. + * @property string $status Current status of the payout: paid, pending, in_transit, canceled or failed. A payout is pending until it is submitted to the bank, when it becomes in_transit. The status then changes to paid if the transaction goes through, or to failed or canceled (within 5 business days). Some failed payouts may initially show as paid but then change to failed. + * @property string $type Can be bank_account or card. + */ +class Payout extends ApiResource +{ + const OBJECT_NAME = 'payout'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const FAILURE_ACCOUNT_CLOSED = 'account_closed'; + const FAILURE_ACCOUNT_FROZEN = 'account_frozen'; + const FAILURE_BANK_ACCOUNT_RESTRICTED = 'bank_account_restricted'; + const FAILURE_BANK_OWNERSHIP_CHANGED = 'bank_ownership_changed'; + const FAILURE_COULD_NOT_PROCESS = 'could_not_process'; + const FAILURE_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; + const FAILURE_DECLINED = 'declined'; + const FAILURE_INCORRECT_ACCOUNT_HOLDER_NAME = 'incorrect_account_holder_name'; + const FAILURE_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const FAILURE_INVALID_ACCOUNT_NUMBER = 'invalid_account_number'; + const FAILURE_INVALID_CURRENCY = 'invalid_currency'; + const FAILURE_NO_ACCOUNT = 'no_account'; + const FAILURE_UNSUPPORTED_CARD = 'unsupported_card'; + + const METHOD_INSTANT = 'instant'; + const METHOD_STANDARD = 'standard'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_IN_TRANSIT = 'in_transit'; + const STATUS_PAID = 'paid'; + const STATUS_PENDING = 'pending'; + + const TYPE_BANK_ACCOUNT = 'bank_account'; + const TYPE_CARD = 'card'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Payout the canceled payout + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Payout the reversed payout + */ + public function reverse($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reverse'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Person.php b/app/api/Stripe/Person.php new file mode 100755 index 0000000..aac6faf --- /dev/null +++ b/app/api/Stripe/Person.php @@ -0,0 +1,120 @@ +Standard onboarding + * or Express onboarding + * documentation for information about platform pre-filling and account + * onboarding steps. + * + * Related guide: Handling + * Identity Verification with the API. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $account The account the person is associated with. + * @property \Stripe\StripeObject $address + * @property null|\Stripe\StripeObject $address_kana The Kana variation of the person's address (Japan only). + * @property null|\Stripe\StripeObject $address_kanji The Kanji variation of the person's address (Japan only). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property \Stripe\StripeObject $dob + * @property null|string $email The person's email address. + * @property null|string $first_name The person's first name. + * @property null|string $first_name_kana The Kana variation of the person's first name (Japan only). + * @property null|string $first_name_kanji The Kanji variation of the person's first name (Japan only). + * @property null|string $gender The person's gender (International regulations require either "male" or "female"). + * @property bool $id_number_provided Whether the person's id_number was provided. + * @property null|string $last_name The person's last name. + * @property null|string $last_name_kana The Kana variation of the person's last name (Japan only). + * @property null|string $last_name_kanji The Kanji variation of the person's last name (Japan only). + * @property null|string $maiden_name The person's maiden name. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nationality The country where the person is a national. + * @property null|string $phone The person's phone number. + * @property string $political_exposure Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction. + * @property \Stripe\StripeObject $relationship + * @property null|\Stripe\StripeObject $requirements Information about the requirements for this person, including what information needs to be collected, and by when. + * @property bool $ssn_last_4_provided Whether the last four digits of the person's Social Security number have been provided (U.S. only). + * @property \Stripe\StripeObject $verification + */ +class Person extends ApiResource +{ + const OBJECT_NAME = 'person'; + + use ApiOperations\Delete; + use ApiOperations\Update; + + const GENDER_FEMALE = 'female'; + const GENDER_MALE = 'male'; + + const POLITICAL_EXPOSURE_EXISTING = 'existing'; + const POLITICAL_EXPOSURE_NONE = 'none'; + + const VERIFICATION_STATUS_PENDING = 'pending'; + const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; + const VERIFICATION_STATUS_VERIFIED = 'verified'; + + /** + * @return string the API URL for this Stripe account reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $account = $this['account']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' . + "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $account = Util\Util::utf8($account); + + $base = Account::classUrl(); + $accountExtn = \urlencode($account); + $extn = \urlencode($id); + + return "{$base}/{$accountExtn}/persons/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Persons cannot be retrieved without an account ID. Retrieve ' . + "a person using `Account::retrievePerson('account_id', " . + "'person_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Persons cannot be updated without an account ID. Update ' . + "a person using `Account::updatePerson('account_id', " . + "'person_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/app/api/Stripe/Plan.php b/app/api/Stripe/Plan.php new file mode 100755 index 0000000..4a4133b --- /dev/null +++ b/app/api/Stripe/Plan.php @@ -0,0 +1,57 @@ +Prices API. It replaces the Plans + * API and is backwards compatible to simplify your migration. + * + * Plans define the base price, currency, and billing cycle for recurring purchases + * of products. Products help + * you track inventory or provisioning, and plans help you track pricing. Different + * physical goods or levels of service should be represented by products, and + * pricing options should be represented by plans. This approach lets you change + * prices without having to change your provisioning scheme. + * + * For example, you might have a single "gold" product that has plans for + * $10/month, $100/year, €9/month, and €90/year. + * + * Related guides: Set up + * a subscription and more about products and prices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the plan can be used for new purchases. + * @property null|string $aggregate_usage Specifies a usage aggregation strategy for plans of usage_type=metered. Allowed values are sum for summing up all usage during a period, last_during_period for using the last usage record reported within a period, last_ever for using the last usage record ever (across period bounds) or max which uses the usage record with the maximum reported usage during a period. Defaults to sum. + * @property null|int $amount The unit amount in %s to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. + * @property null|string $amount_decimal The unit amount in %s to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. + * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in amount) will be charged per unit in quantity (for plans with usage_type=licensed), or per unit of total usage (for plans with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $interval The frequency at which a subscription is billed. One of day, week, month or year. + * @property int $interval_count The number of intervals (specified in the interval attribute) between subscription billings. For example, interval=month and interval_count=3 bills every 3 months. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nickname A brief description of the plan, hidden from customers. + * @property null|string|\Stripe\Product $product The product whose pricing this plan determines. + * @property \Stripe\StripeObject[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. + * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. + * @property null|\Stripe\StripeObject $transform_usage Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. + * @property null|int $trial_period_days Default number of trial days when subscribing a customer to this plan using trial_from_plan=true. + * @property string $usage_type Configures how the quantity per period should be determined. Can be either metered or licensed. licensed automatically bills the quantity set when adding it to a subscription. metered aggregates the total usage based on usage records. Defaults to licensed. + */ +class Plan extends ApiResource +{ + const OBJECT_NAME = 'plan'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/Price.php b/app/api/Stripe/Price.php new file mode 100755 index 0000000..d7eaa9b --- /dev/null +++ b/app/api/Stripe/Price.php @@ -0,0 +1,62 @@ +Products help you track + * inventory or provisioning, and prices help you track payment terms. Different + * physical goods or levels of service should be represented by products, and + * pricing options should be represented by prices. This approach lets you change + * prices without having to change your provisioning scheme. + * + * For example, you might have a single "gold" product that has prices + * for $10/month, $100/year, and €9 once. + * + * Related guides: Set up + * a subscription, create an invoice, + * and more about products + * and prices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the price can be used for new purchases. + * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in unit_amount or unit_amount_decimal) will be charged per unit in quantity (for prices with usage_type=licensed), or per unit of total usage (for prices with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $lookup_key A lookup key used to retrieve prices dynamically from a static string. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nickname A brief description of the plan, hidden from customers. + * @property string|\Stripe\Product $product The ID of the product this price is associated with. + * @property null|\Stripe\StripeObject $recurring The recurring components of a price such as interval and usage_type. + * @property \Stripe\StripeObject[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. + * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. + * @property null|\Stripe\StripeObject $transform_quantity Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. + * @property string $type One of one_time or recurring depending on whether the price is for a one-time purchase or a recurring (subscription) purchase. + * @property null|int $unit_amount The unit amount in %s to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. + * @property null|string $unit_amount_decimal The unit amount in %s to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. + */ +class Price extends ApiResource +{ + const OBJECT_NAME = 'price'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const BILLING_SCHEME_PER_UNIT = 'per_unit'; + const BILLING_SCHEME_TIERED = 'tiered'; + + const TIERS_MODE_GRADUATED = 'graduated'; + const TIERS_MODE_VOLUME = 'volume'; + + const TYPE_ONE_TIME = 'one_time'; + const TYPE_RECURRING = 'recurring'; +} diff --git a/app/api/Stripe/Product.php b/app/api/Stripe/Product.php new file mode 100755 index 0000000..fffdbf5 --- /dev/null +++ b/app/api/Stripe/Product.php @@ -0,0 +1,53 @@ +Prices to + * configure pricing in Checkout and Subscriptions. + * + * Related guides: Set up + * a subscription or accept one-time + * payments with Checkout and more about Products and Prices + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the product is currently available for purchase. + * @property null|string[] $attributes A list of up to 5 attributes that each SKU can provide values for (e.g., ["color", "size"]). + * @property null|string $caption A short one-line description of the product, meant to be displayable to the customer. Only applicable to products of type=good. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string[] $deactivate_on An array of connect application identifiers that cannot purchase this product. Only applicable to products of type=good. + * @property null|string $description The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes. + * @property string[] $images A list of up to 8 URLs of images for this product, meant to be displayable to the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The product's name, meant to be displayable to the customer. Whenever this product is sold via a subscription, name will show up on associated invoice line item descriptions. + * @property null|\Stripe\StripeObject $package_dimensions The dimensions of this product for shipping purposes. A SKU associated with this product can override this value by having its own package_dimensions. Only applicable to products of type=good. + * @property null|bool $shippable Whether this product is a shipped good. Only applicable to products of type=good. + * @property null|string $statement_descriptor Extra information about a product which will appear on your customer's credit card statement. In the case that multiple products are billed at once, the first statement descriptor will be used. + * @property string $type The type of the product. The product is either of type good, which is eligible for use with Orders and SKUs, or service, which is eligible for use with Subscriptions and Plans. + * @property null|string $unit_label A label that represents units of this product in Stripe and on customers’ receipts and invoices. When set, this will be included in associated invoice line item descriptions. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + * @property null|string $url A URL of a publicly-accessible webpage for this product. Only applicable to products of type=good. + */ +class Product extends ApiResource +{ + const OBJECT_NAME = 'product'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const TYPE_GOOD = 'good'; + const TYPE_SERVICE = 'service'; +} diff --git a/app/api/Stripe/PromotionCode.php b/app/api/Stripe/PromotionCode.php new file mode 100755 index 0000000..29bf65b --- /dev/null +++ b/app/api/Stripe/PromotionCode.php @@ -0,0 +1,33 @@ +invoices or orders. Coupons do not work with conventional one-off charges. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Customer $customer The customer that this promotion code can be used by. + * @property null|int $expires_at Date at which the promotion code can no longer be redeemed. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|int $max_redemptions Maximum number of times this promotion code can be redeemed. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\StripeObject $restrictions + * @property int $times_redeemed Number of times this promotion code has been used. + */ +class PromotionCode extends ApiResource +{ + const OBJECT_NAME = 'promotion_code'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/Radar/EarlyFraudWarning.php b/app/api/Stripe/Radar/EarlyFraudWarning.php new file mode 100755 index 0000000..d428ac2 --- /dev/null +++ b/app/api/Stripe/Radar/EarlyFraudWarning.php @@ -0,0 +1,37 @@ +Early + * Fraud Warnings. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $actionable An EFW is actionable if it has not received a dispute and has not been fully refunded. You may wish to proactively refund a charge that receives an EFW, in order to avoid receiving a dispute later. + * @property string|\Stripe\Charge $charge ID of the charge this early fraud warning is for, optionally expanded. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $fraud_type The type of fraud labelled by the issuer. One of card_never_received, fraudulent_card_application, made_with_counterfeit_card, made_with_lost_card, made_with_stolen_card, misc, unauthorized_use_of_card. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class EarlyFraudWarning extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.early_fraud_warning'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Retrieve; + + const FRAUD_TYPE_CARD_NEVER_RECEIVED = 'card_never_received'; + const FRAUD_TYPE_FRAUDULENT_CARD_APPLICATION = 'fraudulent_card_application'; + const FRAUD_TYPE_MADE_WITH_COUNTERFEIT_CARD = 'made_with_counterfeit_card'; + const FRAUD_TYPE_MADE_WITH_LOST_CARD = 'made_with_lost_card'; + const FRAUD_TYPE_MADE_WITH_STOLEN_CARD = 'made_with_stolen_card'; + const FRAUD_TYPE_MISC = 'misc'; + const FRAUD_TYPE_UNAUTHORIZED_USE_OF_CARD = 'unauthorized_use_of_card'; +} diff --git a/app/api/Stripe/Radar/ValueList.php b/app/api/Stripe/Radar/ValueList.php new file mode 100755 index 0000000..e3425ed --- /dev/null +++ b/app/api/Stripe/Radar/ValueList.php @@ -0,0 +1,35 @@ +Default Stripe + * Lists. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $alias The name of the value list for use in rules. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $created_by The name or email address of the user who created this value list. + * @property string $item_type The type of items in the value list. One of card_fingerprint, card_bin, email, ip_address, country, string, or case_sensitive_string. + * @property \Stripe\Collection $list_items List of items contained within this value list. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The name of the value list. + */ +class ValueList extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.value_list'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Delete; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/Radar/ValueListItem.php b/app/api/Stripe/Radar/ValueListItem.php new file mode 100755 index 0000000..42c830d --- /dev/null +++ b/app/api/Stripe/Radar/ValueListItem.php @@ -0,0 +1,31 @@ +Managing List + * Items. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $created_by The name or email address of the user who added this item to the value list. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $value The value of the item. + * @property string $value_list The identifier of the value list this item belongs to. + */ +class ValueListItem extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.value_list_item'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Delete; + use \Stripe\ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/Recipient.php b/app/api/Stripe/Recipient.php new file mode 100755 index 0000000..5041cfd --- /dev/null +++ b/app/api/Stripe/Recipient.php @@ -0,0 +1,44 @@ +Recipient objects, you can transfer money from your Stripe + * account to a third-party bank account or debit card. The API allows you to + * create, delete, and update your recipients. You can retrieve individual + * recipients as well as a list of all your recipients. + * + * Recipient objects have been deprecated in favor of Connect, specifically Connect's much + * more powerful Account objects. + * Stripe accounts that don't already use recipients can no longer begin doing so. + * Please use Account objects instead. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|\Stripe\BankAccount $active_account Hash describing the current account on the recipient, if there is one. + * @property null|\Stripe\Collection $cards + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Card $default_card The default card to use for creating transfers to this recipient. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $email + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string|\Stripe\Account $migrated_to The ID of the Custom account this recipient was migrated to. If set, the recipient can no longer be updated, nor can transfers be made to it: use the Custom account instead. + * @property null|string $name Full, legal name of the recipient. + * @property string|\Stripe\Account $rolled_back_from + * @property string $type Type of the recipient, one of individual or corporation. + * @property bool $verified Whether the recipient has been verified. This field is non-standard, and maybe removed in the future + */ +class Recipient extends ApiResource +{ + const OBJECT_NAME = 'recipient'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/RecipientTransfer.php b/app/api/Stripe/RecipientTransfer.php new file mode 100755 index 0000000..c92c611 --- /dev/null +++ b/app/api/Stripe/RecipientTransfer.php @@ -0,0 +1,36 @@ +Refund objects allow you to refund a charge that has previously + * been created but not yet refunded. Funds will be refunded to the credit or debit + * card that was originally charged. + * + * Related guide: Refunds. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in %s. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. + * @property null|string|\Stripe\Charge $charge ID of the charge that was refunded. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. (Available on non-card refunds only) + * @property string|\Stripe\BalanceTransaction $failure_balance_transaction If the refund failed, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction. + * @property string $failure_reason If the refund failed, the reason for refund failure if known. Possible values are lost_or_stolen_card, expired_or_canceled_card, or unknown. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the PaymentIntent that was refunded. + * @property null|string $reason Reason for the refund, either user-provided (duplicate, fraudulent, or requested_by_customer) or generated by Stripe internally (expired_uncaptured_charge). + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this refund. + * @property null|string|\Stripe\TransferReversal $source_transfer_reversal The transfer reversal that is associated with the refund. Only present if the charge came from another Stripe account. See the Connect documentation for details. + * @property null|string $status Status of the refund. For credit card refunds, this can be pending, succeeded, or failed. For other types of refunds, it can be pending, succeeded, failed, or canceled. Refer to our refunds documentation for more details. + * @property null|string|\Stripe\TransferReversal $transfer_reversal If the accompanying transfer was reversed, the transfer reversal object. Only applicable if the charge was created using the destination parameter. + */ +class Refund extends ApiResource +{ + const OBJECT_NAME = 'refund'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const FAILURE_REASON_EXPIRED_OR_CANCELED_CARD = 'expired_or_canceled_card'; + const FAILURE_REASON_LOST_OR_STOLEN_CARD = 'lost_or_stolen_card'; + const FAILURE_REASON_UNKNOWN = 'unknown'; + + const REASON_DUPLICATE = 'duplicate'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * @deprecated use FAILURE_REASON_EXPIRED_OR_CANCELED_CARD instead + */ + const FAILURE_REASON = 'expired_or_canceled_card'; +} diff --git a/app/api/Stripe/Reporting/ReportRun.php b/app/api/Stripe/Reporting/ReportRun.php new file mode 100755 index 0000000..6bdd1c1 --- /dev/null +++ b/app/api/Stripe/Reporting/ReportRun.php @@ -0,0 +1,37 @@ +API Access to + * Reports. + * + * Note that reports can only be run based on your live-mode data (not test-mode + * data), and thus related requests must be made with a live-mode API key. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $error If something should go wrong during the run, a message about the failure (populated when status=failed). + * @property bool $livemode Always true: reports can only be run on live-mode data. + * @property \Stripe\StripeObject $parameters + * @property string $report_type The ID of the report type to run, such as "balance.summary.1". + * @property null|\Stripe\File $result The file object representing the result of the report run (populated when status=succeeded). + * @property string $status Status of this report run. This will be pending when the run is initially created. When the run finishes, this will be set to succeeded and the result field will be populated. Rarely, we may encounter an error, at which point this will be set to failed and the error field will be populated. + * @property null|int $succeeded_at Timestamp at which this run successfully finished (populated when status=succeeded). Measured in seconds since the Unix epoch. + */ +class ReportRun extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'reporting.report_run'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/Reporting/ReportType.php b/app/api/Stripe/Reporting/ReportType.php new file mode 100755 index 0000000..99f0c52 --- /dev/null +++ b/app/api/Stripe/Reporting/ReportType.php @@ -0,0 +1,34 @@ +API Access to Reports + * documentation for those Report Type IDs, along with required and optional + * parameters. + * + * Note that reports can only be run based on your live-mode data (not test-mode + * data), and thus related requests must be made with a live-mode API key. + * + * @property string $id The ID of the Report Type, such as balance.summary.1. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $data_available_end Most recent time for which this Report Type is available. Measured in seconds since the Unix epoch. + * @property int $data_available_start Earliest time for which this Report Type is available. Measured in seconds since the Unix epoch. + * @property null|string[] $default_columns List of column names that are included by default when this Report Type gets run. (If the Report Type doesn't support the columns parameter, this will be null.) + * @property string $name Human-readable name of the Report Type + * @property int $updated When this Report Type was latest updated. Measured in seconds since the Unix epoch. + * @property int $version Version of the Report Type. Different versions report with the same ID will have the same purpose, but may take different run parameters or have different result schemas. + */ +class ReportType extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'reporting.report_type'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Retrieve; +} diff --git a/app/api/Stripe/RequestTelemetry.php b/app/api/Stripe/RequestTelemetry.php new file mode 100755 index 0000000..00832a7 --- /dev/null +++ b/app/api/Stripe/RequestTelemetry.php @@ -0,0 +1,26 @@ +requestId = $requestId; + $this->requestDuration = $requestDuration; + } +} diff --git a/app/api/Stripe/Review.php b/app/api/Stripe/Review.php new file mode 100755 index 0000000..7f23b9f --- /dev/null +++ b/app/api/Stripe/Review.php @@ -0,0 +1,66 @@ +Radar and reviewing payments here. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $billing_zip The ZIP or postal code of the card used, if applicable. + * @property null|string|\Stripe\Charge $charge The charge associated with this review. + * @property null|string $closed_reason The reason the review was closed, or null if it has not yet been closed. One of approved, refunded, refunded_as_fraud, or disputed. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $ip_address The IP address where the payment originated. + * @property null|\Stripe\StripeObject $ip_address_location Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $open If true, the review needs action. + * @property string $opened_reason The reason the review was opened. One of rule or manual. + * @property string|\Stripe\PaymentIntent $payment_intent The PaymentIntent ID associated with this review, if one exists. + * @property string $reason The reason the review is currently open or closed. One of rule, manual, approved, refunded, refunded_as_fraud, or disputed. + * @property null|\Stripe\StripeObject $session Information related to the browsing session of the user who initiated the payment. + */ +class Review extends ApiResource +{ + const OBJECT_NAME = 'review'; + + use ApiOperations\All; + use ApiOperations\Retrieve; + + /** + * Possible string representations of the current, the opening or the closure reason of the review. + * Not all of these enumeration apply to all of the ´reason´ fields. Please consult the Review object to + * determine where these are apply. + * + * @see https://stripe.com/docs/api/radar/reviews/object + */ + const REASON_APPROVED = 'approved'; + const REASON_DISPUTED = 'disputed'; + const REASON_MANUAL = 'manual'; + const REASON_REFUNDED = 'refunded'; + const REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud'; + const REASON_RULE = 'rule'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Review the approved review + */ + public function approve($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/approve'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/SKU.php b/app/api/Stripe/SKU.php new file mode 100755 index 0000000..6c03061 --- /dev/null +++ b/app/api/Stripe/SKU.php @@ -0,0 +1,44 @@ +stock keeping units. + * SKUs describe specific product variations, taking into account any combination + * of: attributes, currency, and cost. For example, a product may be a T-shirt, + * whereas a specific SKU represents the size: large, color: + * red version of that shirt. + * + * Can also be used to manage inventory. + * + * Related guide: Tax, Shipping, and + * Inventory. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the SKU is available for purchase. + * @property \Stripe\StripeObject $attributes A dictionary of attributes and values for the attributes defined by the product. If, for example, a product's attributes are ["size", "gender"], a valid SKU has the following dictionary of attributes: {"size": "Medium", "gender": "Unisex"}. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $image The URL of an image for this SKU, meant to be displayable to the customer. + * @property \Stripe\StripeObject $inventory + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|\Stripe\StripeObject $package_dimensions The dimensions of this SKU for shipping purposes. + * @property int $price The cost of the item as a positive integer in the smallest currency unit (that is, 100 cents to charge $1.00, or 100 to charge ¥100, Japanese Yen being a zero-decimal currency). + * @property string|\Stripe\Product $product The ID of the product this SKU is associated with. The product must be currently active. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + */ +class SKU extends ApiResource +{ + const OBJECT_NAME = 'sku'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/Service/AbstractService.php b/app/api/Stripe/Service/AbstractService.php new file mode 100755 index 0000000..6e2c330 --- /dev/null +++ b/app/api/Stripe/Service/AbstractService.php @@ -0,0 +1,79 @@ +client = $client; + } + + /** + * Gets the client used by this service to send requests. + * + * @return \Stripe\StripeClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Translate null values to empty strings. For service methods, + * we interpret null as a request to unset the field, which + * corresponds to sending an empty string for the field to the + * API. + * + * @param null|array $params + */ + private static function formatParams($params) + { + if (null === $params) { + return null; + } + \array_walk_recursive($params, function (&$value, $key) { + if (null === $value) { + $value = ''; + } + }); + + return $params; + } + + protected function request($method, $path, $params, $opts) + { + return $this->getClient()->request($method, $path, static::formatParams($params), $opts); + } + + protected function requestCollection($method, $path, $params, $opts) + { + return $this->getClient()->requestCollection($method, $path, static::formatParams($params), $opts); + } + + protected function buildPath($basePath, ...$ids) + { + foreach ($ids as $id) { + if (null === $id || '' === \trim($id)) { + $msg = 'The resource ID cannot be null or whitespace.'; + + throw new \Stripe\Exception\InvalidArgumentException($msg); + } + } + + return \sprintf($basePath, ...\array_map('\urlencode', $ids)); + } +} diff --git a/app/api/Stripe/Service/AbstractServiceFactory.php b/app/api/Stripe/Service/AbstractServiceFactory.php new file mode 100755 index 0000000..f11f5f3 --- /dev/null +++ b/app/api/Stripe/Service/AbstractServiceFactory.php @@ -0,0 +1,59 @@ + */ + private $services; + + /** + * @param \Stripe\StripeClientInterface $client + */ + public function __construct($client) + { + $this->client = $client; + $this->services = []; + } + + /** + * @param string $name + * + * @return null|string + */ + abstract protected function getServiceClass($name); + + /** + * @param string $name + * + * @return null|AbstractService|AbstractServiceFactory + */ + public function __get($name) + { + $serviceClass = $this->getServiceClass($name); + if (null !== $serviceClass) { + if (!\array_key_exists($name, $this->services)) { + $this->services[$name] = new $serviceClass($this->client); + } + + return $this->services[$name]; + } + + \trigger_error('Undefined property: ' . static::class . '::$' . $name); + + return null; + } +} diff --git a/app/api/Stripe/Service/AccountLinkService.php b/app/api/Stripe/Service/AccountLinkService.php new file mode 100755 index 0000000..46894b9 --- /dev/null +++ b/app/api/Stripe/Service/AccountLinkService.php @@ -0,0 +1,25 @@ +request('post', '/v1/account_links', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/AccountService.php b/app/api/Stripe/Service/AccountService.php new file mode 100755 index 0000000..2b5b188 --- /dev/null +++ b/app/api/Stripe/Service/AccountService.php @@ -0,0 +1,381 @@ +Connect. If you’re not a platform, the list is empty. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/accounts', $params, $opts); + } + + /** + * Returns a list of capabilities associated with the account. The capabilities are + * returned sorted by creation date, with the most recent capability appearing + * first. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allCapabilities($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/capabilities', $parentId), $params, $opts); + } + + /** + * List external accounts for an account. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allExternalAccounts($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); + } + + /** + * Returns a list of people associated with the account’s legal entity. The people + * are returned sorted by creation date, with the most recent people appearing + * first. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allPersons($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); + } + + /** + * With Connect, you can create Stripe accounts for + * your users. To do this, you’ll first need to register your + * platform. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/accounts', $params, $opts); + } + + /** + * Create an external account for a given account. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public function createExternalAccount($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); + } + + /** + * Creates a single-use login link for an Express account to access their Stripe + * dashboard. + * + * You may only create login links for Express accounts connected to your + * platform. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\LoginLink + */ + public function createLoginLink($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/login_links', $parentId), $params, $opts); + } + + /** + * Creates a new person. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public function createPerson($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); + } + + /** + * With Connect, you can delete Custom or Express + * accounts you manage. + * + * Accounts created using test-mode keys can be deleted at any time. Accounts + * created using live-mode keys can only be deleted once all balances are zero. + * + * If you want to delete your own account, use the account information tab in your + * account settings instead. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } + + /** + * Delete a specified external account for a given account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public function deleteExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Deletes an existing person’s relationship to the account’s legal entity. Any + * person with a relationship for an account can be deleted through the API, except + * if the person is the account_opener. If your integration is using + * the executive parameter, you cannot delete the only verified + * executive on file. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public function deletePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * With Connect, you may flag accounts as suspicious. + * + * Test-mode Custom and Express accounts can be rejected at any time. Accounts + * created using live-mode keys may only be rejected once all balances are zero. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public function reject($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/reject', $id), $params, $opts); + } + + /** + * Retrieves information about the specified Account Capability. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Capability + */ + public function retrieveCapability($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieve a specified external account for a given account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public function retrieveExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves an existing person. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public function retrievePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates a connected Express or Custom + * account by setting the values of the parameters passed. Any parameters not + * provided are left unchanged. Most parameters can be changed only for Custom + * accounts. (These are marked Custom Only below.) Parameters + * marked Custom and Express are supported by both account types. + * + * To update your own account, use the Dashboard. Refer to our Connect documentation to learn more + * about updating accounts. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } + + /** + * Updates an existing Account Capability. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Capability + */ + public function updateCapability($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the metadata, account holder name, and account holder type of a bank + * account belonging to a Custom + * account, and optionally sets it as the default for its currency. Other bank + * account details are not editable by design. + * + * You can re-enable a disabled bank account by performing an update call without + * providing any arguments or changes. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public function updateExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates an existing person. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public function updatePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the details of an account. + * + * @param null|string $id + * @param null|array $params + * @param null|array|StripeUtilRequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public function retrieve($id = null, $params = null, $opts = null) + { + if (null === $id) { + return $this->request('get', '/v1/account', $params, $opts); + } + + return $this->request('get', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/ApplePayDomainService.php b/app/api/Stripe/Service/ApplePayDomainService.php new file mode 100755 index 0000000..6957149 --- /dev/null +++ b/app/api/Stripe/Service/ApplePayDomainService.php @@ -0,0 +1,70 @@ +requestCollection('get', '/v1/apple_pay/domains', $params, $opts); + } + + /** + * Create an apple pay domain. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplePayDomain + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/apple_pay/domains', $params, $opts); + } + + /** + * Delete an apple pay domain. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplePayDomain + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); + } + + /** + * Retrieve an apple pay domain. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplePayDomain + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/ApplicationFeeService.php b/app/api/Stripe/Service/ApplicationFeeService.php new file mode 100755 index 0000000..9224084 --- /dev/null +++ b/app/api/Stripe/Service/ApplicationFeeService.php @@ -0,0 +1,125 @@ +requestCollection('get', '/v1/application_fees', $params, $opts); + } + + /** + * You can see a list of the refunds belonging to a specific application fee. Note + * that the 10 most recent refunds are always available by default on the + * application fee object. If you need more than those 10, you can use this API + * method and the limit and starting_after parameters to + * page through additional refunds. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allRefunds($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); + } + + /** + * Refunds an application fee that has previously been collected but not yet + * refunded. Funds will be refunded to the Stripe account from which the fee was + * originally collected. + * + * You can optionally refund only part of an application fee. You can do so + * multiple times, until the entire fee has been refunded. + * + * Once entirely refunded, an application fee can’t be refunded again. This method + * will raise an error when called on an already-refunded application fee, or when + * trying to refund more money than is left on an application fee. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public function createRefund($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); + } + + /** + * Retrieves the details of an application fee that your account has collected. The + * same information is returned when refunding the application fee. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFee + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/application_fees/%s', $id), $params, $opts); + } + + /** + * By default, you can see the 10 most recent refunds stored directly on the + * application fee object, but you can also retrieve details about a specific + * refund stored on the application fee. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public function retrieveRefund($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the specified application fee refund by setting the values of the + * parameters passed. Any parameters not provided will be left unchanged. + * + * This request only accepts metadata as an argument. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ApplicationFeeRefund + */ + public function updateRefund($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/BalanceService.php b/app/api/Stripe/Service/BalanceService.php new file mode 100755 index 0000000..b76c455 --- /dev/null +++ b/app/api/Stripe/Service/BalanceService.php @@ -0,0 +1,26 @@ +Accounting + * for negative balances. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Balance + */ + public function retrieve($params = null, $opts = null) + { + return $this->request('get', '/v1/balance', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/BalanceTransactionService.php b/app/api/Stripe/Service/BalanceTransactionService.php new file mode 100755 index 0000000..900abbd --- /dev/null +++ b/app/api/Stripe/Service/BalanceTransactionService.php @@ -0,0 +1,47 @@ +/v1/balance/history. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/balance_transactions', $params, $opts); + } + + /** + * Retrieves the balance transaction with the given ID. + * + * Note that this endpoint previously used the path + * /v1/balance/history/:id. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BalanceTransaction + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/balance_transactions/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/BillingPortal/BillingPortalServiceFactory.php b/app/api/Stripe/Service/BillingPortal/BillingPortalServiceFactory.php new file mode 100755 index 0000000..9d1df0f --- /dev/null +++ b/app/api/Stripe/Service/BillingPortal/BillingPortalServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'configurations' => ConfigurationService::class, + 'sessions' => SessionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/BillingPortal/ConfigurationService.php b/app/api/Stripe/Service/BillingPortal/ConfigurationService.php new file mode 100755 index 0000000..f9569f1 --- /dev/null +++ b/app/api/Stripe/Service/BillingPortal/ConfigurationService.php @@ -0,0 +1,73 @@ +requestCollection('get', '/v1/billing_portal/configurations', $params, $opts); + } + + /** + * Creates a configuration that describes the functionality and behavior of a + * PortalSession. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BillingPortal\Configuration + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing_portal/configurations', $params, $opts); + } + + /** + * Retrieves a configuration that describes the functionality of the customer + * portal. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BillingPortal\Configuration + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); + } + + /** + * Updates a configuration that describes the functionality of the customer portal. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BillingPortal\Configuration + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/BillingPortal/SessionService.php b/app/api/Stripe/Service/BillingPortal/SessionService.php new file mode 100755 index 0000000..e508c2a --- /dev/null +++ b/app/api/Stripe/Service/BillingPortal/SessionService.php @@ -0,0 +1,23 @@ +request('post', '/v1/billing_portal/sessions', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/ChargeService.php b/app/api/Stripe/Service/ChargeService.php new file mode 100755 index 0000000..c1ed47e --- /dev/null +++ b/app/api/Stripe/Service/ChargeService.php @@ -0,0 +1,101 @@ +requestCollection('get', '/v1/charges', $params, $opts); + } + + /** + * Capture the payment of an existing, uncaptured, charge. This is the second half + * of the two-step payment flow, where first you created a + * charge with the capture option set to false. + * + * Uncaptured payments expire exactly seven days after they are created. If they + * are not captured by that point in time, they will be marked as refunded and will + * no longer be capturable. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Charge + */ + public function capture($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/charges/%s/capture', $id), $params, $opts); + } + + /** + * To charge a credit card or other payment source, you create a + * Charge object. If your API key is in test mode, the supplied + * payment source (e.g., card) won’t actually be charged, although everything else + * will occur as if in live mode. (Stripe assumes that the charge would have + * completed successfully). + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Charge + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/charges', $params, $opts); + } + + /** + * Retrieves the details of a charge that has previously been created. Supply the + * unique charge ID that was returned from your previous request, and Stripe will + * return the corresponding charge information. The same information is returned + * when creating or refunding the charge. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Charge + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/charges/%s', $id), $params, $opts); + } + + /** + * Updates the specified charge by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Charge + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/charges/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Checkout/CheckoutServiceFactory.php b/app/api/Stripe/Service/Checkout/CheckoutServiceFactory.php new file mode 100755 index 0000000..26a5ee8 --- /dev/null +++ b/app/api/Stripe/Service/Checkout/CheckoutServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'sessions' => SessionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/Checkout/SessionService.php b/app/api/Stripe/Service/Checkout/SessionService.php new file mode 100755 index 0000000..f00e0a5 --- /dev/null +++ b/app/api/Stripe/Service/Checkout/SessionService.php @@ -0,0 +1,73 @@ +requestCollection('get', '/v1/checkout/sessions', $params, $opts); + } + + /** + * When retrieving a Checkout Session, there is an includable + * line_items property containing the first handful of those + * items. There is also a URL where you can retrieve the full (paginated) list of + * line items. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allLineItems($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/checkout/sessions/%s/line_items', $parentId), $params, $opts); + } + + /** + * Creates a Session object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Checkout\Session + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/checkout/sessions', $params, $opts); + } + + /** + * Retrieves a Session object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Checkout\Session + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/checkout/sessions/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/CoreServiceFactory.php b/app/api/Stripe/Service/CoreServiceFactory.php new file mode 100755 index 0000000..7cede5d --- /dev/null +++ b/app/api/Stripe/Service/CoreServiceFactory.php @@ -0,0 +1,125 @@ + + */ + private static $classMap = [ + 'accountLinks' => AccountLinkService::class, + 'accounts' => AccountService::class, + 'applePayDomains' => ApplePayDomainService::class, + 'applicationFees' => ApplicationFeeService::class, + 'balance' => BalanceService::class, + 'balanceTransactions' => BalanceTransactionService::class, + 'billingPortal' => BillingPortal\BillingPortalServiceFactory::class, + 'charges' => ChargeService::class, + 'checkout' => Checkout\CheckoutServiceFactory::class, + 'countrySpecs' => CountrySpecService::class, + 'coupons' => CouponService::class, + 'creditNotes' => CreditNoteService::class, + 'customers' => CustomerService::class, + 'disputes' => DisputeService::class, + 'ephemeralKeys' => EphemeralKeyService::class, + 'events' => EventService::class, + 'exchangeRates' => ExchangeRateService::class, + 'fileLinks' => FileLinkService::class, + 'files' => FileService::class, + 'invoiceItems' => InvoiceItemService::class, + 'invoices' => InvoiceService::class, + 'issuing' => Issuing\IssuingServiceFactory::class, + 'mandates' => MandateService::class, + 'oauth' => OAuthService::class, + 'orderReturns' => OrderReturnService::class, + 'orders' => OrderService::class, + 'paymentIntents' => PaymentIntentService::class, + 'paymentMethods' => PaymentMethodService::class, + 'payouts' => PayoutService::class, + 'plans' => PlanService::class, + 'prices' => PriceService::class, + 'products' => ProductService::class, + 'promotionCodes' => PromotionCodeService::class, + 'radar' => Radar\RadarServiceFactory::class, + 'refunds' => RefundService::class, + 'reporting' => Reporting\ReportingServiceFactory::class, + 'reviews' => ReviewService::class, + 'setupAttempts' => SetupAttemptService::class, + 'setupIntents' => SetupIntentService::class, + 'sigma' => Sigma\SigmaServiceFactory::class, + 'skus' => SkuService::class, + 'sources' => SourceService::class, + 'subscriptionItems' => SubscriptionItemService::class, + 'subscriptions' => SubscriptionService::class, + 'subscriptionSchedules' => SubscriptionScheduleService::class, + 'taxRates' => TaxRateService::class, + 'terminal' => Terminal\TerminalServiceFactory::class, + 'tokens' => TokenService::class, + 'topups' => TopupService::class, + 'transfers' => TransferService::class, + 'webhookEndpoints' => WebhookEndpointService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/CountrySpecService.php b/app/api/Stripe/Service/CountrySpecService.php new file mode 100755 index 0000000..ed62198 --- /dev/null +++ b/app/api/Stripe/Service/CountrySpecService.php @@ -0,0 +1,39 @@ +requestCollection('get', '/v1/country_specs', $params, $opts); + } + + /** + * Returns a Country Spec for a given Country code. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CountrySpec + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/country_specs/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/CouponService.php b/app/api/Stripe/Service/CouponService.php new file mode 100755 index 0000000..ae492a4 --- /dev/null +++ b/app/api/Stripe/Service/CouponService.php @@ -0,0 +1,104 @@ +requestCollection('get', '/v1/coupons', $params, $opts); + } + + /** + * You can create coupons easily via the coupon management page of the + * Stripe dashboard. Coupon creation is also accessible via the API if you need to + * create coupons on the fly. + * + * A coupon has either a percent_off or an amount_off and + * currency. If you set an amount_off, that amount will + * be subtracted from any invoice’s subtotal. For example, an invoice with a + * subtotal of 100 will have a final total of + * 0 if a coupon with an amount_off of + * 200 is applied to it and an invoice with a subtotal of + * 300 will have a final total of 100 if + * a coupon with an amount_off of 200 is applied to + * it. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Coupon + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/coupons', $params, $opts); + } + + /** + * You can delete coupons via the coupon management page of the + * Stripe dashboard. However, deleting a coupon does not affect any customers who + * have already applied the coupon; it means that new customers can’t redeem the + * coupon. You can also delete coupons via the API. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Coupon + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } + + /** + * Retrieves the coupon with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Coupon + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } + + /** + * Updates the metadata of a coupon. Other coupon details (currency, duration, + * amount_off) are, by design, not editable. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Coupon + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/CreditNoteService.php b/app/api/Stripe/Service/CreditNoteService.php new file mode 100755 index 0000000..fc8d898 --- /dev/null +++ b/app/api/Stripe/Service/CreditNoteService.php @@ -0,0 +1,156 @@ +requestCollection('get', '/v1/credit_notes', $params, $opts); + } + + /** + * When retrieving a credit note, you’ll get a lines property + * containing the the first handful of those items. There is also a URL where you + * can retrieve the full (paginated) list of line items. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allLines($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/credit_notes/%s/lines', $parentId), $params, $opts); + } + + /** + * Issue a credit note to adjust the amount of a finalized invoice. For a + * status=open invoice, a credit note reduces its + * amount_due. For a status=paid invoice, a credit note + * does not affect its amount_due. Instead, it can result in any + * combination of the following:. + * + *
  • Refund: create a new refund (using refund_amount) or link + * an existing refund (using refund).
  • Customer balance + * credit: credit the customer’s balance (using credit_amount) which + * will be automatically applied to their next invoice when it’s finalized.
  • + *
  • Outside of Stripe credit: record the amount that is or will be credited + * outside of Stripe (using out_of_band_amount).
+ * + * For post-payment credit notes the sum of the refund, credit and outside of + * Stripe amounts must equal the credit note total. + * + * You may issue multiple credit notes for an invoice. Each credit note will + * increment the invoice’s pre_payment_credit_notes_amount or + * post_payment_credit_notes_amount depending on its + * status at the time of credit note creation. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/credit_notes', $params, $opts); + } + + /** + * Get a preview of a credit note without creating it. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function preview($params = null, $opts = null) + { + return $this->request('get', '/v1/credit_notes/preview', $params, $opts); + } + + /** + * When retrieving a credit note preview, you’ll get a lines + * property containing the first handful of those items. This URL you can retrieve + * the full (paginated) list of line items. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function previewLines($params = null, $opts = null) + { + return $this->request('get', '/v1/credit_notes/preview/lines', $params, $opts); + } + + /** + * Retrieves the credit note object with the given identifier. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); + } + + /** + * Updates an existing credit note. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); + } + + /** + * Marks a credit note as void. Learn more about voiding credit notes. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CreditNote + */ + public function voidCreditNote($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/credit_notes/%s/void', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/CustomerService.php b/app/api/Stripe/Service/CustomerService.php new file mode 100755 index 0000000..af4f098 --- /dev/null +++ b/app/api/Stripe/Service/CustomerService.php @@ -0,0 +1,353 @@ +requestCollection('get', '/v1/customers', $params, $opts); + } + + /** + * Returns a list of transactions that updated the customer’s balances. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allBalanceTransactions($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); + } + + /** + * List sources for a specified customer. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allSources($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); + } + + /** + * Returns a list of tax IDs for a customer. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allTaxIds($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); + } + + /** + * Creates a new customer object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Customer + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/customers', $params, $opts); + } + + /** + * Creates an immutable transaction that updates the customer’s credit balance. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public function createBalanceTransaction($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); + } + + /** + * When you create a new credit card, you must specify a customer or recipient on + * which to create it. + * + * If the card’s owner has no default card, then the new card will become the + * default. However, if the owner already has a default, then it will not change. + * To change the default, you should update the + * customer to have a new default_source. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public function createSource($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); + } + + /** + * Creates a new TaxID object for a customer. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public function createTaxId($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); + } + + /** + * Permanently deletes a customer. It cannot be undone. Also immediately cancels + * any active subscriptions on the customer. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Customer + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Removes the currently applied discount on a customer. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Customer + */ + public function deleteDiscount($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/discount', $id), $params, $opts); + } + + /** + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public function deleteSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Deletes an existing TaxID object. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public function deleteTaxId($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the details of an existing customer. You need only supply the unique + * customer identifier that was returned upon customer creation. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Customer + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Retrieves a specific customer balance transaction that updated the customer’s balances. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public function retrieveBalanceTransaction($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieve a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public function retrieveSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the TaxID object with the given identifier. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxId + */ + public function retrieveTaxId($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the specified customer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. For example, if you pass the + * source parameter, that becomes the customer’s active source + * (e.g., a card) to be used for all charges in the future. When you update a + * customer to a new valid card source by passing the source + * parameter: for each of the customer’s current subscriptions, if the subscription + * bills automatically and is in the past_due state, then the latest + * open invoice for the subscription with automatic collection enabled will be + * retried. This retry will not count as an automatic retry, and will not affect + * the next regularly scheduled payment for the invoice. Changing the + * default_source for a customer will not trigger this behavior. + * + * This request accepts mostly the same arguments as the customer creation call. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Customer + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Most credit balance transaction fields are immutable, but you may update its + * description and metadata. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\CustomerBalanceTransaction + */ + public function updateBalanceTransaction($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); + } + + /** + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public function updateSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source + */ + public function verifySource($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s/verify', $parentId, $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/DisputeService.php b/app/api/Stripe/Service/DisputeService.php new file mode 100755 index 0000000..6b14c20 --- /dev/null +++ b/app/api/Stripe/Service/DisputeService.php @@ -0,0 +1,83 @@ +requestCollection('get', '/v1/disputes', $params, $opts); + } + + /** + * Closing the dispute for a charge indicates that you do not have any evidence to + * submit and are essentially dismissing the dispute, acknowledging it as lost. + * + * The status of the dispute will change from needs_response to + * lost. Closing a dispute is irreversible. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Dispute + */ + public function close($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/disputes/%s/close', $id), $params, $opts); + } + + /** + * Retrieves the dispute with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Dispute + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); + } + + /** + * When you get a dispute, contacting your customer is always the best first step. + * If that doesn’t work, you can submit evidence to help us resolve the dispute in + * your favor. You can do this in your dashboard, but if you prefer, + * you can use the API to submit evidence programmatically. + * + * Depending on your dispute type, different evidence fields will give you a better + * chance of winning your dispute. To figure out which evidence fields to provide, + * see our guide to dispute types. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Dispute + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/EphemeralKeyService.php b/app/api/Stripe/Service/EphemeralKeyService.php new file mode 100755 index 0000000..1305234 --- /dev/null +++ b/app/api/Stripe/Service/EphemeralKeyService.php @@ -0,0 +1,43 @@ +request('delete', $this->buildPath('/v1/ephemeral_keys/%s', $id), $params, $opts); + } + + /** + * Creates a short-lived API key for a given resource. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\EphemeralKey + */ + public function create($params = null, $opts = null) + { + if (!$opts || !isset($opts['stripe_version'])) { + throw new \Stripe\Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); + } + + return $this->request('post', '/v1/ephemeral_keys', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/EventService.php b/app/api/Stripe/Service/EventService.php new file mode 100755 index 0000000..8fe6f73 --- /dev/null +++ b/app/api/Stripe/Service/EventService.php @@ -0,0 +1,44 @@ +event object api_version + * attribute (not according to your current Stripe API version or + * Stripe-Version header). + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/events', $params, $opts); + } + + /** + * Retrieves the details of an event. Supply the unique identifier of the event, + * which you might have received in a webhook. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Event + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/events/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/ExchangeRateService.php b/app/api/Stripe/Service/ExchangeRateService.php new file mode 100755 index 0000000..7fcc80f --- /dev/null +++ b/app/api/Stripe/Service/ExchangeRateService.php @@ -0,0 +1,41 @@ +requestCollection('get', '/v1/exchange_rates', $params, $opts); + } + + /** + * Retrieves the exchange rates from the given currency to every supported + * currency. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\ExchangeRate + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/exchange_rates/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/FileLinkService.php b/app/api/Stripe/Service/FileLinkService.php new file mode 100755 index 0000000..e248187 --- /dev/null +++ b/app/api/Stripe/Service/FileLinkService.php @@ -0,0 +1,70 @@ +requestCollection('get', '/v1/file_links', $params, $opts); + } + + /** + * Creates a new file link object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\FileLink + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/file_links', $params, $opts); + } + + /** + * Retrieves the file link with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\FileLink + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); + } + + /** + * Updates an existing file link object. Expired links can no longer be updated. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\FileLink + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/FileService.php b/app/api/Stripe/Service/FileService.php new file mode 100755 index 0000000..ad12776 --- /dev/null +++ b/app/api/Stripe/Service/FileService.php @@ -0,0 +1,66 @@ +requestCollection('get', '/v1/files', $params, $opts); + } + + /** + * Retrieves the details of an existing file object. Supply the unique file ID from + * a file, and Stripe will return the corresponding file object. To access file + * contents, see the File Upload + * Guide. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\File + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/files/%s', $id), $params, $opts); + } + + /** + * Create a file. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\File + */ + public function create($params = null, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + if (!isset($opts->apiBase)) { + $opts->apiBase = $this->getClient()->getFilesBase(); + } + + // Manually flatten params, otherwise curl's multipart encoder will + // choke on nested null|arrays. + $flatParams = \array_column(\Stripe\Util\Util::flattenParams($params), 1, 0); + + return $this->request('post', '/v1/files', $flatParams, $opts); + } +} diff --git a/app/api/Stripe/Service/InvoiceItemService.php b/app/api/Stripe/Service/InvoiceItemService.php new file mode 100755 index 0000000..53ce507 --- /dev/null +++ b/app/api/Stripe/Service/InvoiceItemService.php @@ -0,0 +1,93 @@ +requestCollection('get', '/v1/invoiceitems', $params, $opts); + } + + /** + * Creates an item to be added to a draft invoice (up to 250 items per invoice). If + * no invoice is specified, the item will be on the next invoice created for the + * customer specified. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\InvoiceItem + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/invoiceitems', $params, $opts); + } + + /** + * Deletes an invoice item, removing it from an invoice. Deleting invoice items is + * only possible when they’re not attached to invoices, or if it’s attached to a + * draft invoice. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\InvoiceItem + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } + + /** + * Retrieves the invoice item with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\InvoiceItem + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } + + /** + * Updates the amount or description of an invoice item on an upcoming invoice. + * Updating an invoice item is only possible before the invoice it’s attached to is + * closed. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\InvoiceItem + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/InvoiceService.php b/app/api/Stripe/Service/InvoiceService.php new file mode 100755 index 0000000..c443712 --- /dev/null +++ b/app/api/Stripe/Service/InvoiceService.php @@ -0,0 +1,272 @@ +requestCollection('get', '/v1/invoices', $params, $opts); + } + + /** + * When retrieving an invoice, you’ll get a lines property + * containing the total count of line items and the first handful of those items. + * There is also a URL where you can retrieve the full (paginated) list of line + * items. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allLines($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/invoices/%s/lines', $parentId), $params, $opts); + } + + /** + * This endpoint creates a draft invoice for a given customer. The draft invoice + * created pulls in all pending invoice items on that customer, including + * prorations. The invoice remains a draft until you finalize the invoice, which allows you to pay or send the invoice to + * your customers. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/invoices', $params, $opts); + } + + /** + * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to + * delete invoices that are no longer in a draft state will fail; once an invoice + * has been finalized or if an invoice is for a subscription, it must be voided. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Stripe automatically finalizes drafts before sending and attempting payment on + * invoices. However, if you’d like to finalize a draft invoice manually, you can + * do so using this method. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function finalizeInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/finalize', $id), $params, $opts); + } + + /** + * Marking an invoice as uncollectible is useful for keeping track of bad debts + * that can be written off for accounting purposes. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function markUncollectible($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/mark_uncollectible', $id), $params, $opts); + } + + /** + * Stripe automatically creates and then attempts to collect payment on invoices + * for customers on subscriptions according to your subscriptions + * settings. However, if you’d like to attempt payment on an invoice out of the + * normal collection schedule or for some other reason, you can do so. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function pay($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/pay', $id), $params, $opts); + } + + /** + * Retrieves the invoice with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Stripe will automatically send invoices to customers according to your subscriptions + * settings. However, if you’d like to manually send an invoice to your + * customer out of the normal schedule, you can do so. When sending invoices that + * have already been paid, there will be no reference to the payment in the email. + * + * Requests made in test-mode result in no emails being sent, despite sending an + * invoice.sent event. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function sendInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/send', $id), $params, $opts); + } + + /** + * At any time, you can preview the upcoming invoice for a customer. This will show + * you all the charges that are pending, including subscription renewal charges, + * invoice item charges, etc. It will also show you any discounts that are + * applicable to the invoice. + * + * Note that when you are viewing an upcoming invoice, you are simply viewing a + * preview – the invoice has not yet been created. As such, the upcoming invoice + * will not show up in invoice listing calls, and you cannot use the API to pay or + * edit the invoice. If you want to change the amount that your customer will be + * billed, you can add, remove, or update pending invoice items, or update the + * customer’s discount. + * + * You can preview the effects of updating a subscription, including a preview of + * what proration will take place. To ensure that the actual proration is + * calculated exactly the same as the previewed proration, you should pass a + * proration_date parameter when doing the actual subscription update. + * The value passed in should be the same as the + * subscription_proration_date returned on the upcoming invoice + * resource. The recommended way to get only the prorations being previewed is to + * consider only proration line items where period[start] is equal to + * the subscription_proration_date on the upcoming invoice resource. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function upcoming($params = null, $opts = null) + { + return $this->request('get', '/v1/invoices/upcoming', $params, $opts); + } + + /** + * When retrieving an upcoming invoice, you’ll get a lines + * property containing the total count of line items and the first handful of those + * items. There is also a URL where you can retrieve the full (paginated) list of + * line items. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function upcomingLines($params = null, $opts = null) + { + return $this->request('get', '/v1/invoices/upcoming/lines', $params, $opts); + } + + /** + * Draft invoices are fully editable. Once an invoice is finalized, monetary values, + * as well as collection_method, become uneditable. + * + * If you would like to stop the Stripe Billing engine from automatically + * finalizing, reattempting payments on, sending reminders for, or automatically reconciling + * invoices, pass auto_advance=false. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is + * similar to deletion, however it only applies to + * finalized invoices and maintains a papertrail where the invoice can still be + * found. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Invoice + */ + public function voidInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/void', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Issuing/AuthorizationService.php b/app/api/Stripe/Service/Issuing/AuthorizationService.php new file mode 100755 index 0000000..2bd84d7 --- /dev/null +++ b/app/api/Stripe/Service/Issuing/AuthorizationService.php @@ -0,0 +1,97 @@ +Authorization objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/authorizations', $params, $opts); + } + + /** + * Approves a pending Issuing Authorization object. This request + * should be made within the timeout window of the real-time + * authorization flow. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Authorization + */ + public function approve($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/approve', $id), $params, $opts); + } + + /** + * Declines a pending Issuing Authorization object. This request + * should be made within the timeout window of the real time + * authorization flow. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Authorization + */ + public function decline($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/decline', $id), $params, $opts); + } + + /** + * Retrieves an Issuing Authorization object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Authorization + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Authorization object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Authorization + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Issuing/CardService.php b/app/api/Stripe/Service/Issuing/CardService.php new file mode 100755 index 0000000..cae2e20 --- /dev/null +++ b/app/api/Stripe/Service/Issuing/CardService.php @@ -0,0 +1,73 @@ +Card objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/cards', $params, $opts); + } + + /** + * Creates an Issuing Card object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Card + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/cards', $params, $opts); + } + + /** + * Retrieves an Issuing Card object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Card + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Card object by setting the values of + * the parameters passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Card + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Issuing/CardholderService.php b/app/api/Stripe/Service/Issuing/CardholderService.php new file mode 100755 index 0000000..14494fb --- /dev/null +++ b/app/api/Stripe/Service/Issuing/CardholderService.php @@ -0,0 +1,74 @@ +Cardholder objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/cardholders', $params, $opts); + } + + /** + * Creates a new Issuing Cardholder object that can be issued cards. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Cardholder + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/cardholders', $params, $opts); + } + + /** + * Retrieves an Issuing Cardholder object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Cardholder + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Cardholder object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Cardholder + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Issuing/DisputeService.php b/app/api/Stripe/Service/Issuing/DisputeService.php new file mode 100755 index 0000000..6ead76d --- /dev/null +++ b/app/api/Stripe/Service/Issuing/DisputeService.php @@ -0,0 +1,99 @@ +Dispute objects. The objects are sorted + * in descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/disputes', $params, $opts); + } + + /** + * Creates an Issuing Dispute object. Individual pieces of evidence + * within the evidence object are optional at this point. Stripe only + * validates that required evidence is present during submission. Refer to Dispute + * reasons and evidence for more details about evidence requirements. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Dispute + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/disputes', $params, $opts); + } + + /** + * Retrieves an Issuing Dispute object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Dispute + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); + } + + /** + * Submits an Issuing Dispute to the card network. Stripe validates + * that all evidence fields required for the dispute’s reason are present. For more + * details, see Dispute + * reasons and evidence. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Dispute + */ + public function submit($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s/submit', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Dispute object by setting the values + * of the parameters passed. Any parameters not provided will be left unchanged. + * Properties on the evidence object can be unset by passing in an + * empty string. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Dispute + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Issuing/IssuingServiceFactory.php b/app/api/Stripe/Service/Issuing/IssuingServiceFactory.php new file mode 100755 index 0000000..89f2c8c --- /dev/null +++ b/app/api/Stripe/Service/Issuing/IssuingServiceFactory.php @@ -0,0 +1,33 @@ + + */ + private static $classMap = [ + 'authorizations' => AuthorizationService::class, + 'cardholders' => CardholderService::class, + 'cards' => CardService::class, + 'disputes' => DisputeService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/Issuing/TransactionService.php b/app/api/Stripe/Service/Issuing/TransactionService.php new file mode 100755 index 0000000..199ecf8 --- /dev/null +++ b/app/api/Stripe/Service/Issuing/TransactionService.php @@ -0,0 +1,59 @@ +Transaction objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/transactions', $params, $opts); + } + + /** + * Retrieves an Issuing Transaction object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Transaction + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Transaction object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Issuing\Transaction + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/MandateService.php b/app/api/Stripe/Service/MandateService.php new file mode 100755 index 0000000..21f6e02 --- /dev/null +++ b/app/api/Stripe/Service/MandateService.php @@ -0,0 +1,24 @@ +request('get', $this->buildPath('/v1/mandates/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/OAuthService.php b/app/api/Stripe/Service/OAuthService.php new file mode 100755 index 0000000..9ad4383 --- /dev/null +++ b/app/api/Stripe/Service/OAuthService.php @@ -0,0 +1,150 @@ +_parseOpts($opts); + $opts->apiBase = $this->_getBase($opts); + + return $this->request($method, $path, $params, $opts); + } + + /** + * Generates a URL to Stripe's OAuth form. + * + * @param null|array $params + * @param null|array $opts + * + * @return string the URL to Stripe's OAuth form + */ + public function authorizeUrl($params = null, $opts = null) + { + $params = $params ?: []; + + $opts = $this->_parseOpts($opts); + $base = $this->_getBase($opts); + + $params['client_id'] = $this->_getClientId($params); + if (!\array_key_exists('response_type', $params)) { + $params['response_type'] = 'code'; + } + $query = \Stripe\Util\Util::encodeParameters($params); + + return $base . '/oauth/authorize?' . $query; + } + + /** + * Use an authoriztion code to connect an account to your platform and + * fetch the user's credentials. + * + * @param null|array $params + * @param null|array $opts + * + * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails + * + * @return \Stripe\StripeObject object containing the response from the API + */ + public function token($params = null, $opts = null) + { + $params = $params ?: []; + $params['client_secret'] = $this->_getClientSecret($params); + + return $this->requestConnect('post', '/oauth/token', $params, $opts); + } + + /** + * Disconnects an account from your platform. + * + * @param null|array $params + * @param null|array $opts + * + * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails + * + * @return \Stripe\StripeObject object containing the response from the API + */ + public function deauthorize($params = null, $opts = null) + { + $params = $params ?: []; + $params['client_id'] = $this->_getClientId($params); + + return $this->requestConnect('post', '/oauth/deauthorize', $params, $opts); + } + + private function _getClientId($params = null) + { + $clientId = ($params && \array_key_exists('client_id', $params)) ? $params['client_id'] : null; + + if (null === $clientId) { + $clientId = $this->client->getClientId(); + } + if (null === $clientId) { + $msg = 'No client_id provided. (HINT: set your client_id using ' + . '`new \Stripe\StripeClient([clientId => + ])`)". You can find your client_ids ' + . 'in your Stripe dashboard at ' + . 'https://dashboard.stripe.com/account/applications/settings, ' + . 'after registering your account as a platform. See ' + . 'https://stripe.com/docs/connect/standard-accounts for details, ' + . 'or email support@stripe.com if you have any questions.'; + + throw new \Stripe\Exception\AuthenticationException($msg); + } + + return $clientId; + } + + private function _getClientSecret($params = null) + { + if (\array_key_exists('client_secret', $params)) { + return $params['client_secret']; + } + + return $this->client->getApiKey(); + } + + /** + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @throws \Stripe\Exception\InvalidArgumentException + * + * @return \Stripe\Util\RequestOptions + */ + private function _parseOpts($opts) + { + if (\is_array($opts)) { + if (\array_key_exists('connect_base', $opts)) { + // Throw an exception for the convenience of anybody migrating to + // \Stripe\Service\OAuthService from \Stripe\OAuth, where `connect_base` + // was the name of the parameter that behaves as `api_base` does here. + throw new \Stripe\Exception\InvalidArgumentException('Use `api_base`, not `connect_base`'); + } + } + + return \Stripe\Util\RequestOptions::parse($opts); + } + + /** + * @param \Stripe\Util\RequestOptions $opts + * + * @return string + */ + private function _getBase($opts) + { + return isset($opts->apiBase) ? + $opts->apiBase : + $this->client->getConnectBase(); + } +} diff --git a/app/api/Stripe/Service/OrderReturnService.php b/app/api/Stripe/Service/OrderReturnService.php new file mode 100755 index 0000000..8509674 --- /dev/null +++ b/app/api/Stripe/Service/OrderReturnService.php @@ -0,0 +1,42 @@ +requestCollection('get', '/v1/order_returns', $params, $opts); + } + + /** + * Retrieves the details of an existing order return. Supply the unique order ID + * from either an order return creation request or the order return list, and + * Stripe will return the corresponding order information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\OrderReturn + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/order_returns/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/OrderService.php b/app/api/Stripe/Service/OrderService.php new file mode 100755 index 0000000..fa9f126 --- /dev/null +++ b/app/api/Stripe/Service/OrderService.php @@ -0,0 +1,109 @@ +requestCollection('get', '/v1/orders', $params, $opts); + } + + /** + * Creates a new order object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Order + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/orders', $params, $opts); + } + + /** + * Pay an order by providing a source to create a payment. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Order + */ + public function pay($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/orders/%s/pay', $id), $params, $opts); + } + + /** + * Retrieves the details of an existing order. Supply the unique order ID from + * either an order creation request or the order list, and Stripe will return the + * corresponding order information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Order + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/orders/%s', $id), $params, $opts); + } + + /** + * Return all or part of an order. The order must have a status of + * paid or fulfilled before it can be returned. Once all + * items have been returned, the order will become canceled or + * returned depending on which status the order started in. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Order + */ + public function returnOrder($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/orders/%s/returns', $id), $params, $opts); + } + + /** + * Updates the specific order by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Order + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/orders/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PaymentIntentService.php b/app/api/Stripe/Service/PaymentIntentService.php new file mode 100755 index 0000000..091ee85 --- /dev/null +++ b/app/api/Stripe/Service/PaymentIntentService.php @@ -0,0 +1,181 @@ +requestCollection('get', '/v1/payment_intents', $params, $opts); + } + + /** + * A PaymentIntent object can be canceled when it is in one of these statuses: + * requires_payment_method, requires_capture, + * requires_confirmation, or requires_action. + * + * Once canceled, no additional charges will be made by the PaymentIntent and any + * operations on the PaymentIntent will fail with an error. For PaymentIntents with + * status=’requires_capture’, the remaining + * amount_capturable will automatically be refunded. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/cancel', $id), $params, $opts); + } + + /** + * Capture the funds of an existing uncaptured PaymentIntent when its status is + * requires_capture. + * + * Uncaptured PaymentIntents will be canceled exactly seven days after they are + * created. + * + * Learn more about separate authorization + * and capture. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function capture($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/capture', $id), $params, $opts); + } + + /** + * Confirm that your customer intends to pay with current or provided payment + * method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. + * + * If the selected payment method requires additional authentication steps, the + * PaymentIntent will transition to the requires_action status and + * suggest additional actions via next_action. If payment fails, the + * PaymentIntent will transition to the requires_payment_method + * status. If payment succeeds, the PaymentIntent will transition to the + * succeeded status (or requires_capture, if + * capture_method is set to manual). + * + * If the confirmation_method is automatic, payment may + * be attempted using our client SDKs and + * the PaymentIntent’s client_secret. After + * next_actions are handled by the client, no additional confirmation + * is required to complete the payment. + * + * If the confirmation_method is manual, all payment + * attempts must be initiated using a secret key. If any actions are required for + * the payment, the PaymentIntent will return to the + * requires_confirmation state after those actions are completed. Your + * server needs to then explicitly re-confirm the PaymentIntent to initiate the + * next payment attempt. Read the expanded documentation to + * learn more about manual confirmation. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function confirm($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/confirm', $id), $params, $opts); + } + + /** + * Creates a PaymentIntent object. + * + * After the PaymentIntent is created, attach a payment method and confirm to continue the payment. + * You can read more about the different payment flows available via the Payment + * Intents API here. + * + * When confirm=true is used during creation, it is equivalent to + * creating and confirming the PaymentIntent in the same call. You may use any + * parameters available in the confirm + * API when confirm=true is supplied. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_intents', $params, $opts); + } + + /** + * Retrieves the details of a PaymentIntent that has previously been created. + * + * Client-side retrieval using a publishable key is allowed when the + * client_secret is provided in the query string. + * + * When retrieved with a publishable key, only a subset of properties will be + * returned. Please refer to the payment + * intent object reference for more details. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); + } + + /** + * Updates properties on a PaymentIntent object without confirming. + * + * Depending on which properties you update, you may need to confirm the + * PaymentIntent again. For example, updating the payment_method will + * always require you to confirm the PaymentIntent again. If you prefer to update + * and confirm at the same time, we recommend updating properties via the confirm API instead. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentIntent + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PaymentMethodService.php b/app/api/Stripe/Service/PaymentMethodService.php new file mode 100755 index 0000000..fcda1c9 --- /dev/null +++ b/app/api/Stripe/Service/PaymentMethodService.php @@ -0,0 +1,121 @@ +requestCollection('get', '/v1/payment_methods', $params, $opts); + } + + /** + * Attaches a PaymentMethod object to a Customer. + * + * To attach a new PaymentMethod to a customer for future payments, we recommend + * you use a SetupIntent or a PaymentIntent + * with setup_future_usage. + * These approaches will perform any necessary steps to ensure that the + * PaymentMethod can be used in a future payment. Using the + * /v1/payment_methods/:id/attach endpoint does not ensure that future + * payments can be made with the attached PaymentMethod. See Optimizing cards for future + * payments for more information about setting up future payments. + * + * To use this PaymentMethod as the default for invoice or subscription payments, + * set invoice_settings.default_payment_method, + * on the Customer to the PaymentMethod’s ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentMethod + */ + public function attach($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s/attach', $id), $params, $opts); + } + + /** + * Creates a PaymentMethod object. Read the Stripe.js + * reference to learn how to create PaymentMethods via Stripe.js. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentMethod + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_methods', $params, $opts); + } + + /** + * Detaches a PaymentMethod object from a Customer. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentMethod + */ + public function detach($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s/detach', $id), $params, $opts); + } + + /** + * Retrieves a PaymentMethod object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentMethod + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); + } + + /** + * Updates a PaymentMethod object. A PaymentMethod must be attached a customer to + * be updated. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PaymentMethod + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PayoutService.php b/app/api/Stripe/Service/PayoutService.php new file mode 100755 index 0000000..35414d0 --- /dev/null +++ b/app/api/Stripe/Service/PayoutService.php @@ -0,0 +1,127 @@ +requestCollection('get', '/v1/payouts', $params, $opts); + } + + /** + * A previously created payout can be canceled if it has not yet been paid out. + * Funds will be refunded to your available balance. You may not cancel automatic + * Stripe payouts. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Payout + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s/cancel', $id), $params, $opts); + } + + /** + * To send funds to your own bank account, you create a new payout object. Your Stripe balance must be able to cover the payout amount, or + * you’ll receive an “Insufficient Funds” error. + * + * If your API key is in test mode, money won’t actually be sent, though everything + * else will occur as if in live mode. + * + * If you are creating a manual payout on a Stripe account that uses multiple + * payment source types, you’ll need to specify the source type balance that the + * payout should draw from. The balance object + * details available and pending amounts by source type. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Payout + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payouts', $params, $opts); + } + + /** + * Retrieves the details of an existing payout. Supply the unique payout ID from + * either a payout creation request or the payout list, and Stripe will return the + * corresponding payout information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Payout + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); + } + + /** + * Reverses a payout by debiting the destination bank account. Only payouts for + * connected accounts to US bank accounts may be reversed at this time. If the + * payout is in the pending status, + * /v1/payouts/:id/cancel should be used instead. + * + * By requesting a reversal via /v1/payouts/:id/reverse, you confirm + * that the authorized signatory of the selected bank account has authorized the + * debit on the bank account and that no other authorization is required. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Payout + */ + public function reverse($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s/reverse', $id), $params, $opts); + } + + /** + * Updates the specified payout by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. This request accepts only the + * metadata as arguments. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Payout + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PlanService.php b/app/api/Stripe/Service/PlanService.php new file mode 100755 index 0000000..4685ad8 --- /dev/null +++ b/app/api/Stripe/Service/PlanService.php @@ -0,0 +1,91 @@ +requestCollection('get', '/v1/plans', $params, $opts); + } + + /** + * You can now model subscriptions more flexibly using the Prices + * API. It replaces the Plans API and is backwards compatible to simplify your + * migration. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Plan + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/plans', $params, $opts); + } + + /** + * Deleting plans means new subscribers can’t be added. Existing subscribers aren’t + * affected. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Plan + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } + + /** + * Retrieves the plan with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Plan + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } + + /** + * Updates the specified plan by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. By design, you cannot change a + * plan’s ID, amount, currency, or billing cycle. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Plan + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PriceService.php b/app/api/Stripe/Service/PriceService.php new file mode 100755 index 0000000..2a62a31 --- /dev/null +++ b/app/api/Stripe/Service/PriceService.php @@ -0,0 +1,72 @@ +requestCollection('get', '/v1/prices', $params, $opts); + } + + /** + * Creates a new price for an existing product. The price can be recurring or + * one-time. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Price + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/prices', $params, $opts); + } + + /** + * Retrieves the price with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Price + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/prices/%s', $id), $params, $opts); + } + + /** + * Updates the specified price by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Price + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/prices/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/ProductService.php b/app/api/Stripe/Service/ProductService.php new file mode 100755 index 0000000..3ca3b6d --- /dev/null +++ b/app/api/Stripe/Service/ProductService.php @@ -0,0 +1,92 @@ +requestCollection('get', '/v1/products', $params, $opts); + } + + /** + * Creates a new product object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Product + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/products', $params, $opts); + } + + /** + * Delete a product. Deleting a product is only possible if it has no prices + * associated with it. Additionally, deleting a product with type=good + * is only possible if it has no SKUs associated with it. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Product + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } + + /** + * Retrieves the details of an existing product. Supply the unique product ID from + * either a product creation request or the product list, and Stripe will return + * the corresponding product information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Product + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } + + /** + * Updates the specific product by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Product + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/PromotionCodeService.php b/app/api/Stripe/Service/PromotionCodeService.php new file mode 100755 index 0000000..b53fa93 --- /dev/null +++ b/app/api/Stripe/Service/PromotionCodeService.php @@ -0,0 +1,72 @@ +requestCollection('get', '/v1/promotion_codes', $params, $opts); + } + + /** + * A promotion code points to a coupon. You can optionally restrict the code to a + * specific customer, redemption limit, and expiration date. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PromotionCode + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/promotion_codes', $params, $opts); + } + + /** + * Retrieves the promotion code with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PromotionCode + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); + } + + /** + * Updates the specified promotion code by setting the values of the parameters + * passed. Most fields are, by design, not editable. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\PromotionCode + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Radar/EarlyFraudWarningService.php b/app/api/Stripe/Service/Radar/EarlyFraudWarningService.php new file mode 100755 index 0000000..fbc437f --- /dev/null +++ b/app/api/Stripe/Service/Radar/EarlyFraudWarningService.php @@ -0,0 +1,43 @@ +requestCollection('get', '/v1/radar/early_fraud_warnings', $params, $opts); + } + + /** + * Retrieves the details of an early fraud warning that has previously been + * created. + * + * Please refer to the early fraud + * warning object reference for more details. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\EarlyFraudWarning + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/early_fraud_warnings/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Radar/RadarServiceFactory.php b/app/api/Stripe/Service/Radar/RadarServiceFactory.php new file mode 100755 index 0000000..157a767 --- /dev/null +++ b/app/api/Stripe/Service/Radar/RadarServiceFactory.php @@ -0,0 +1,29 @@ + + */ + private static $classMap = [ + 'earlyFraudWarnings' => EarlyFraudWarningService::class, + 'valueListItems' => ValueListItemService::class, + 'valueLists' => ValueListService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/Radar/ValueListItemService.php b/app/api/Stripe/Service/Radar/ValueListItemService.php new file mode 100755 index 0000000..ed925f8 --- /dev/null +++ b/app/api/Stripe/Service/Radar/ValueListItemService.php @@ -0,0 +1,74 @@ +ValueListItem objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/radar/value_list_items', $params, $opts); + } + + /** + * Creates a new ValueListItem object, which is added to the specified + * parent value list. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueListItem + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/radar/value_list_items', $params, $opts); + } + + /** + * Deletes a ValueListItem object, removing it from its parent value + * list. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueListItem + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); + } + + /** + * Retrieves a ValueListItem object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueListItem + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Radar/ValueListService.php b/app/api/Stripe/Service/Radar/ValueListService.php new file mode 100755 index 0000000..2684184 --- /dev/null +++ b/app/api/Stripe/Service/Radar/ValueListService.php @@ -0,0 +1,93 @@ +ValueList objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/radar/value_lists', $params, $opts); + } + + /** + * Creates a new ValueList object, which can then be referenced in + * rules. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueList + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/radar/value_lists', $params, $opts); + } + + /** + * Deletes a ValueList object, also deleting any items contained + * within the value list. To be deleted, a value list must not be referenced in any + * rules. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueList + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } + + /** + * Retrieves a ValueList object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueList + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } + + /** + * Updates a ValueList object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. Note that + * item_type is immutable. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Radar\ValueList + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/RefundService.php b/app/api/Stripe/Service/RefundService.php new file mode 100755 index 0000000..3617def --- /dev/null +++ b/app/api/Stripe/Service/RefundService.php @@ -0,0 +1,76 @@ +requestCollection('get', '/v1/refunds', $params, $opts); + } + + /** + * Create a refund. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Refund + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/refunds', $params, $opts); + } + + /** + * Retrieves the details of an existing refund. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Refund + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); + } + + /** + * Updates the specified refund by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * This request only accepts metadata as an argument. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Refund + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Reporting/ReportRunService.php b/app/api/Stripe/Service/Reporting/ReportRunService.php new file mode 100755 index 0000000..428e09a --- /dev/null +++ b/app/api/Stripe/Service/Reporting/ReportRunService.php @@ -0,0 +1,57 @@ +live-mode API key.). + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reporting/report_runs', $params, $opts); + } + + /** + * Creates a new object and begin running the report. (Requires a live-mode API key.). + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Reporting\ReportRun + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/reporting/report_runs', $params, $opts); + } + + /** + * Retrieves the details of an existing Report Run. (Requires a live-mode API key.). + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Reporting\ReportRun + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reporting/report_runs/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Reporting/ReportTypeService.php b/app/api/Stripe/Service/Reporting/ReportTypeService.php new file mode 100755 index 0000000..b6956c2 --- /dev/null +++ b/app/api/Stripe/Service/Reporting/ReportTypeService.php @@ -0,0 +1,41 @@ +live-mode API key.). + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reporting/report_types', $params, $opts); + } + + /** + * Retrieves the details of a Report Type. (Requires a live-mode API key.). + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Reporting\ReportType + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reporting/report_types/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Reporting/ReportingServiceFactory.php b/app/api/Stripe/Service/Reporting/ReportingServiceFactory.php new file mode 100755 index 0000000..72a6278 --- /dev/null +++ b/app/api/Stripe/Service/Reporting/ReportingServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'reportRuns' => ReportRunService::class, + 'reportTypes' => ReportTypeService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/ReviewService.php b/app/api/Stripe/Service/ReviewService.php new file mode 100755 index 0000000..d424996 --- /dev/null +++ b/app/api/Stripe/Service/ReviewService.php @@ -0,0 +1,58 @@ +Review objects that have open set to + * true. The objects are sorted in descending order by creation date, + * with the most recently created object appearing first. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reviews', $params, $opts); + } + + /** + * Approves a Review object, closing it and removing it from the list + * of reviews. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Review + */ + public function approve($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/reviews/%s/approve', $id), $params, $opts); + } + + /** + * Retrieves a Review object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Review + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reviews/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SetupAttemptService.php b/app/api/Stripe/Service/SetupAttemptService.php new file mode 100755 index 0000000..1b924f3 --- /dev/null +++ b/app/api/Stripe/Service/SetupAttemptService.php @@ -0,0 +1,23 @@ +requestCollection('get', '/v1/setup_attempts', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SetupIntentService.php b/app/api/Stripe/Service/SetupIntentService.php new file mode 100755 index 0000000..69a0ad7 --- /dev/null +++ b/app/api/Stripe/Service/SetupIntentService.php @@ -0,0 +1,127 @@ +requestCollection('get', '/v1/setup_intents', $params, $opts); + } + + /** + * A SetupIntent object can be canceled when it is in one of these statuses: + * requires_payment_method, requires_confirmation, or + * requires_action. + * + * Once canceled, setup is abandoned and any operations on the SetupIntent will + * fail with an error. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SetupIntent + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s/cancel', $id), $params, $opts); + } + + /** + * Confirm that your customer intends to set up the current or provided payment + * method. For example, you would confirm a SetupIntent when a customer hits the + * “Save” button on a payment method management page on your website. + * + * If the selected payment method does not require any additional steps from the + * customer, the SetupIntent will transition to the succeeded status. + * + * Otherwise, it will transition to the requires_action status and + * suggest additional actions via next_action. If setup fails, the + * SetupIntent will transition to the requires_payment_method status. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SetupIntent + */ + public function confirm($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s/confirm', $id), $params, $opts); + } + + /** + * Creates a SetupIntent object. + * + * After the SetupIntent is created, attach a payment method and confirm to collect any required + * permissions to charge the payment method later. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SetupIntent + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/setup_intents', $params, $opts); + } + + /** + * Retrieves the details of a SetupIntent that has previously been created. + * + * Client-side retrieval using a publishable key is allowed when the + * client_secret is provided in the query string. + * + * When retrieved with a publishable key, only a subset of properties will be + * returned. Please refer to the SetupIntent + * object reference for more details. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SetupIntent + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); + } + + /** + * Updates a SetupIntent object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SetupIntent + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Sigma/ScheduledQueryRunService.php b/app/api/Stripe/Service/Sigma/ScheduledQueryRunService.php new file mode 100755 index 0000000..1c2ae7e --- /dev/null +++ b/app/api/Stripe/Service/Sigma/ScheduledQueryRunService.php @@ -0,0 +1,39 @@ +requestCollection('get', '/v1/sigma/scheduled_query_runs', $params, $opts); + } + + /** + * Retrieves the details of an scheduled query run. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Sigma\ScheduledQueryRun + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/sigma/scheduled_query_runs/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Sigma/SigmaServiceFactory.php b/app/api/Stripe/Service/Sigma/SigmaServiceFactory.php new file mode 100755 index 0000000..c9d83c3 --- /dev/null +++ b/app/api/Stripe/Service/Sigma/SigmaServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'scheduledQueryRuns' => ScheduledQueryRunService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/SkuService.php b/app/api/Stripe/Service/SkuService.php new file mode 100755 index 0000000..839b16a --- /dev/null +++ b/app/api/Stripe/Service/SkuService.php @@ -0,0 +1,95 @@ +requestCollection('get', '/v1/skus', $params, $opts); + } + + /** + * Creates a new SKU associated with a product. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SKU + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/skus', $params, $opts); + } + + /** + * Delete a SKU. Deleting a SKU is only possible until it has been used in an + * order. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SKU + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/skus/%s', $id), $params, $opts); + } + + /** + * Retrieves the details of an existing SKU. Supply the unique SKU identifier from + * either a SKU creation request or from the product, and Stripe will return the + * corresponding SKU information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SKU + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/skus/%s', $id), $params, $opts); + } + + /** + * Updates the specific SKU by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * Note that a SKU’s attributes are not editable. Instead, you would + * need to deactivate the existing SKU and create a new one with the new attribute + * values. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SKU + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/skus/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SourceService.php b/app/api/Stripe/Service/SourceService.php new file mode 100755 index 0000000..dcf7788 --- /dev/null +++ b/app/api/Stripe/Service/SourceService.php @@ -0,0 +1,110 @@ +request('get', $this->buildPath('/v1/sources/%s/source_transactions', $id), $params, $opts); + } + + /** + * Creates a new source object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/sources', $params, $opts); + } + + /** + * Delete a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source + */ + public function detach($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves an existing source object. Supply the unique source ID from a source + * creation request and Stripe will return the corresponding up-to-date source + * object information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/sources/%s', $id), $params, $opts); + } + + /** + * Updates the specified source by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * This request accepts the metadata and owner as + * arguments. It is also possible to update type specific information for selected + * payment methods. Please refer to our payment method + * guides for more detail. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/sources/%s', $id), $params, $opts); + } + + /** + * Verify a given source. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source + */ + public function verify($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/sources/%s/verify', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SubscriptionItemService.php b/app/api/Stripe/Service/SubscriptionItemService.php new file mode 100755 index 0000000..01996bd --- /dev/null +++ b/app/api/Stripe/Service/SubscriptionItemService.php @@ -0,0 +1,151 @@ +requestCollection('get', '/v1/subscription_items', $params, $opts); + } + + /** + * For the specified subscription item, returns a list of summary objects. Each + * object in the list provides usage information that’s been summarized from + * multiple usage records and over a subscription billing period (e.g., 15 usage + * records in the month of September). + * + * The list is sorted in reverse-chronological order (newest first). The first list + * item represents the most current usage period that hasn’t ended yet. Since new + * usage records can still be added, the returned summary information for the + * subscription item’s ID should be seen as unstable until the subscription billing + * period ends. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allUsageRecordSummaries($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/subscription_items/%s/usage_record_summaries', $parentId), $params, $opts); + } + + /** + * Adds a new item to an existing subscription. No existing items will be changed + * or replaced. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionItem + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscription_items', $params, $opts); + } + + /** + * Creates a usage record for a specified subscription item and date, and fills it + * with a quantity. + * + * Usage records provide quantity information that Stripe uses to + * track how much a customer is using your service. With usage information and the + * pricing model set up by the metered + * billing plan, Stripe helps you send accurate invoices to your customers. + * + * The default calculation for usage is to add up all the quantity + * values of the usage records within a billing period. You can change this default + * behavior with the billing plan’s aggregate_usage parameter. When + * there is more than one usage record with the same timestamp, Stripe adds the + * quantity values together. In most cases, this is the desired + * resolution, however, you can change this behavior with the action + * parameter. + * + * The default pricing model for metered billing is per-unit pricing. + * For finer granularity, you can configure metered billing to have a tiered pricing + * model. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\UsageRecord + */ + public function createUsageRecord($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_items/%s/usage_records', $parentId), $params, $opts); + } + + /** + * Deletes an item from the subscription. Removing a subscription item from a + * subscription will not cancel the subscription. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionItem + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } + + /** + * Retrieves the subscription item with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionItem + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } + + /** + * Updates the plan or quantity of an item on a current subscription. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionItem + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SubscriptionScheduleService.php b/app/api/Stripe/Service/SubscriptionScheduleService.php new file mode 100755 index 0000000..3f88136 --- /dev/null +++ b/app/api/Stripe/Service/SubscriptionScheduleService.php @@ -0,0 +1,113 @@ +requestCollection('get', '/v1/subscription_schedules', $params, $opts); + } + + /** + * Cancels a subscription schedule and its associated subscription immediately (if + * the subscription schedule has an active subscription). A subscription schedule + * can only be canceled if its status is not_started or + * active. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionSchedule + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/cancel', $id), $params, $opts); + } + + /** + * Creates a new subscription schedule object. Each customer can have up to 500 + * active or scheduled subscriptions. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionSchedule + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscription_schedules', $params, $opts); + } + + /** + * Releases the subscription schedule immediately, which will stop scheduling of + * its phases, but leave any existing subscription in place. A schedule can only be + * released if its status is not_started or active. If + * the subscription schedule is currently associated with a subscription, releasing + * it will remove its subscription property and set the subscription’s + * ID to the released_subscription property. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionSchedule + */ + public function release($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/release', $id), $params, $opts); + } + + /** + * Retrieves the details of an existing subscription schedule. You only need to + * supply the unique subscription schedule identifier that was returned upon + * subscription schedule creation. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionSchedule + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); + } + + /** + * Updates an existing subscription schedule. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\SubscriptionSchedule + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/SubscriptionService.php b/app/api/Stripe/Service/SubscriptionService.php new file mode 100755 index 0000000..bee794f --- /dev/null +++ b/app/api/Stripe/Service/SubscriptionService.php @@ -0,0 +1,124 @@ +status=canceled. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/subscriptions', $params, $opts); + } + + /** + * Cancels a customer’s subscription immediately. The customer will not be charged + * again for the subscription. + * + * Note, however, that any pending invoice items that you’ve created will still be + * charged for at the end of the period, unless manually deleted. If you’ve set the subscription to cancel + * at the end of the period, any pending prorations will also be left in place and + * collected at the end of the period. But if the subscription is set to cancel + * immediately, pending prorations will be removed. + * + * By default, upon subscription cancellation, Stripe will stop automatic + * collection of all finalized invoices for the customer. This is intended to + * prevent unexpected payment attempts after the customer has canceled a + * subscription. However, you can resume automatic collection of the invoices + * manually after subscription cancellation to have us proceed. Or, you could check + * for unpaid invoices before allowing the customer to cancel the subscription at + * all. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } + + /** + * Creates a new subscription on an existing customer. Each customer can have up to + * 500 active or scheduled subscriptions. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscriptions', $params, $opts); + } + + /** + * Removes the currently applied discount on a subscription. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription + */ + public function deleteDiscount($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscriptions/%s/discount', $id), $params, $opts); + } + + /** + * Retrieves the subscription with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } + + /** + * Updates an existing subscription on a customer to match the specified + * parameters. When changing plans or quantities, we will optionally prorate the + * price we charge next month to make up for any price changes. To preview how the + * proration will be calculated, use the upcoming + * invoice endpoint. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/TaxRateService.php b/app/api/Stripe/Service/TaxRateService.php new file mode 100755 index 0000000..02cd6f0 --- /dev/null +++ b/app/api/Stripe/Service/TaxRateService.php @@ -0,0 +1,71 @@ +requestCollection('get', '/v1/tax_rates', $params, $opts); + } + + /** + * Creates a new tax rate. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxRate + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tax_rates', $params, $opts); + } + + /** + * Retrieves a tax rate with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxRate + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); + } + + /** + * Updates an existing tax rate. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TaxRate + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Terminal/ConnectionTokenService.php b/app/api/Stripe/Service/Terminal/ConnectionTokenService.php new file mode 100755 index 0000000..db2ef9a --- /dev/null +++ b/app/api/Stripe/Service/Terminal/ConnectionTokenService.php @@ -0,0 +1,25 @@ +request('post', '/v1/terminal/connection_tokens', $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Terminal/LocationService.php b/app/api/Stripe/Service/Terminal/LocationService.php new file mode 100755 index 0000000..9f43ce7 --- /dev/null +++ b/app/api/Stripe/Service/Terminal/LocationService.php @@ -0,0 +1,87 @@ +Location objects. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/terminal/locations', $params, $opts); + } + + /** + * Creates a new Location object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Location + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/locations', $params, $opts); + } + + /** + * Deletes a Location object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Location + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } + + /** + * Retrieves a Location object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Location + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } + + /** + * Updates a Location object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Location + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Terminal/ReaderService.php b/app/api/Stripe/Service/Terminal/ReaderService.php new file mode 100755 index 0000000..65f7ad8 --- /dev/null +++ b/app/api/Stripe/Service/Terminal/ReaderService.php @@ -0,0 +1,87 @@ +Reader objects. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/terminal/readers', $params, $opts); + } + + /** + * Creates a new Reader object. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Reader + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/readers', $params, $opts); + } + + /** + * Deletes a Reader object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Reader + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } + + /** + * Retrieves a Reader object. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Reader + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } + + /** + * Updates a Reader object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Terminal\Reader + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/Terminal/TerminalServiceFactory.php b/app/api/Stripe/Service/Terminal/TerminalServiceFactory.php new file mode 100755 index 0000000..f040941 --- /dev/null +++ b/app/api/Stripe/Service/Terminal/TerminalServiceFactory.php @@ -0,0 +1,29 @@ + + */ + private static $classMap = [ + 'connectionTokens' => ConnectionTokenService::class, + 'locations' => LocationService::class, + 'readers' => ReaderService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/app/api/Stripe/Service/TokenService.php b/app/api/Stripe/Service/TokenService.php new file mode 100755 index 0000000..be8adfd --- /dev/null +++ b/app/api/Stripe/Service/TokenService.php @@ -0,0 +1,42 @@ +Custom + * account. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Token + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tokens', $params, $opts); + } + + /** + * Retrieves the token with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Token + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tokens/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/TopupService.php b/app/api/Stripe/Service/TopupService.php new file mode 100755 index 0000000..d1efc15 --- /dev/null +++ b/app/api/Stripe/Service/TopupService.php @@ -0,0 +1,89 @@ +requestCollection('get', '/v1/topups', $params, $opts); + } + + /** + * Cancels a top-up. Only pending top-ups can be canceled. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Topup + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/topups/%s/cancel', $id), $params, $opts); + } + + /** + * Top up the balance of an account. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Topup + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/topups', $params, $opts); + } + + /** + * Retrieves the details of a top-up that has previously been created. Supply the + * unique top-up ID that was returned from your previous request, and Stripe will + * return the corresponding top-up information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Topup + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/topups/%s', $id), $params, $opts); + } + + /** + * Updates the metadata of a top-up. Other top-up details are not editable by + * design. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Topup + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/topups/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/TransferService.php b/app/api/Stripe/Service/TransferService.php new file mode 100755 index 0000000..4c3baf5 --- /dev/null +++ b/app/api/Stripe/Service/TransferService.php @@ -0,0 +1,175 @@ +requestCollection('get', '/v1/transfers', $params, $opts); + } + + /** + * You can see a list of the reversals belonging to a specific transfer. Note that + * the 10 most recent reversals are always available by default on the transfer + * object. If you need more than those 10, you can use this API method and the + * limit and starting_after parameters to page through + * additional reversals. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection + */ + public function allReversals($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Transfer + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s/cancel', $id), $params, $opts); + } + + /** + * To send funds from your Stripe account to a connected account, you create a new + * transfer object. Your Stripe balance must be able to + * cover the transfer amount, or you’ll receive an “Insufficient Funds” error. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Transfer + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/transfers', $params, $opts); + } + + /** + * When you create a new reversal, you must specify a transfer to create it on. + * + * When reversing transfers, you can optionally reverse part of the transfer. You + * can do so as many times as you wish until the entire transfer has been reversed. + * + * Once entirely reversed, a transfer can’t be reversed again. This method will + * return an error when called on an already-reversed transfer, or when trying to + * reverse more money than is left on a transfer. + * + * @param string $parentId + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public function createReversal($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); + } + + /** + * Retrieves the details of an existing transfer. Supply the unique transfer ID + * from either a transfer creation request or the transfer list, and Stripe will + * return the corresponding transfer information. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Transfer + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); + } + + /** + * By default, you can see the 10 most recent reversals stored directly on the + * transfer object, but you can also retrieve details about a specific reversal + * stored on the transfer. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public function retrieveReversal($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the specified transfer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. + * + * This request accepts only metadata as an argument. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Transfer + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); + } + + /** + * Updates the specified reversal by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. + * + * This request only accepts metadata and description as arguments. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public function updateReversal($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); + } +} diff --git a/app/api/Stripe/Service/WebhookEndpointService.php b/app/api/Stripe/Service/WebhookEndpointService.php new file mode 100755 index 0000000..936bc64 --- /dev/null +++ b/app/api/Stripe/Service/WebhookEndpointService.php @@ -0,0 +1,97 @@ +requestCollection('get', '/v1/webhook_endpoints', $params, $opts); + } + + /** + * A webhook endpoint must have a url and a list of + * enabled_events. You may optionally specify the Boolean + * connect parameter. If set to true, then a Connect webhook endpoint + * that notifies the specified url about events from all connected + * accounts is created; otherwise an account webhook endpoint that notifies the + * specified url only about events from your account is created. You + * can also create webhook endpoints in the webhooks settings + * section of the Dashboard. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\WebhookEndpoint + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/webhook_endpoints', $params, $opts); + } + + /** + * You can also delete webhook endpoints via the webhook endpoint + * management page of the Stripe dashboard. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\WebhookEndpoint + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } + + /** + * Retrieves the webhook endpoint with the given ID. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\WebhookEndpoint + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } + + /** + * Updates the webhook endpoint. You may edit the url, the list of + * enabled_events, and the status of your endpoint. + * + * @param string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\WebhookEndpoint + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } +} diff --git a/app/api/Stripe/SetupAttempt.php b/app/api/Stripe/SetupAttempt.php new file mode 100755 index 0000000..9280237 --- /dev/null +++ b/app/api/Stripe/SetupAttempt.php @@ -0,0 +1,32 @@ +application on the SetupIntent at the time of this confirmation. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Customer $customer The value of customer on the SetupIntent at the time of this confirmation. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\Account $on_behalf_of The value of on_behalf_of on the SetupIntent at the time of this confirmation. + * @property string|\Stripe\PaymentMethod $payment_method ID of the payment method used with this SetupAttempt. + * @property \Stripe\StripeObject $payment_method_details + * @property null|\Stripe\ErrorObject $setup_error The error encountered during this attempt to confirm the SetupIntent, if any. + * @property string|\Stripe\SetupIntent $setup_intent ID of the SetupIntent that this attempt belongs to. + * @property string $status Status of this SetupAttempt, one of requires_confirmation, requires_action, processing, succeeded, failed, or abandoned. + * @property string $usage The value of usage on the SetupIntent at the time of this confirmation, one of off_session or on_session. + */ +class SetupAttempt extends ApiResource +{ + const OBJECT_NAME = 'setup_attempt'; + + use ApiOperations\All; +} diff --git a/app/api/Stripe/SetupIntent.php b/app/api/Stripe/SetupIntent.php new file mode 100755 index 0000000..21389e3 --- /dev/null +++ b/app/api/Stripe/SetupIntent.php @@ -0,0 +1,114 @@ +PaymentIntents to drive + * the payment flow. + * + * Create a SetupIntent as soon as you're ready to collect your customer's payment + * credentials. Do not maintain long-lived, unconfirmed SetupIntents as they may no + * longer be valid. The SetupIntent then transitions through multiple statuses as + * it guides you through the setup process. + * + * Successful SetupIntents result in payment credentials that are optimized for + * future payments. For example, cardholders in certain regions may need to be + * run through Strong Customer + * Authentication at the time of payment method collection in order to + * streamline later off-session payments. + * If the SetupIntent is used with a Customer, + * upon success, it will automatically attach the resulting payment method to that + * Customer. We recommend using SetupIntents or setup_future_usage + * on PaymentIntents to save payment methods in order to prevent saving invalid or + * unoptimized payment methods. + * + * By using SetupIntents, you ensure that your customers experience the minimum set + * of required friction, even as regulations change over time. + * + * Related guide: Setup + * Intents API. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string|\Stripe\StripeObject $application ID of the Connect application that created the SetupIntent. + * @property null|string $cancellation_reason Reason for cancellation of this SetupIntent, one of abandoned, requested_by_customer, or duplicate. + * @property null|string $client_secret

The client secret of this SetupIntent. Used for client-side retrieval using a publishable key.

The client secret can be used to complete payment setup from your frontend. It should not be stored, logged, embedded in URLs, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Customer $customer

ID of the Customer this SetupIntent belongs to, if one exists.

If present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|\Stripe\ErrorObject $last_setup_error The error encountered in the previous SetupIntent confirmation. + * @property null|string|\Stripe\SetupAttempt $latest_attempt The most recent SetupAttempt for this SetupIntent. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\Mandate $mandate ID of the multi use Mandate generated by the SetupIntent. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|\Stripe\StripeObject $next_action If present, this property tells you what actions you need to take in order for your customer to continue payment setup. + * @property null|string|\Stripe\Account $on_behalf_of The account (if any) for which the setup is intended. + * @property null|string|\Stripe\PaymentMethod $payment_method ID of the payment method used with this SetupIntent. + * @property null|\Stripe\StripeObject $payment_method_options Payment-method-specific configuration for this SetupIntent. + * @property string[] $payment_method_types The list of payment method types (e.g. card) that this SetupIntent is allowed to set up. + * @property null|string|\Stripe\Mandate $single_use_mandate ID of the single_use Mandate generated by the SetupIntent. + * @property string $status Status of this SetupIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, canceled, or succeeded. + * @property string $usage

Indicates how the payment method is intended to be used in the future.

Use on_session if you intend to only reuse the payment method when the customer is in your checkout flow. Use off_session if your customer may or may not be in your checkout flow. If not provided, this value defaults to off_session.

+ */ +class SetupIntent extends ApiResource +{ + const OBJECT_NAME = 'setup_intent'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const STATUS_CANCELED = 'canceled'; + const STATUS_PROCESSING = 'processing'; + const STATUS_REQUIRES_ACTION = 'requires_action'; + const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; + const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return SetupIntent the canceled setup intent + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return SetupIntent the confirmed setup intent + */ + public function confirm($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/confirm'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Sigma/ScheduledQueryRun.php b/app/api/Stripe/Sigma/ScheduledQueryRun.php new file mode 100755 index 0000000..60ad038 --- /dev/null +++ b/app/api/Stripe/Sigma/ScheduledQueryRun.php @@ -0,0 +1,37 @@ +scheduled + * a Sigma query, you'll receive a + * sigma.scheduled_query_run.created webhook each time the query runs. + * The webhook contains a ScheduledQueryRun object, which you can use + * to retrieve the query results. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property int $data_load_time When the query was run, Sigma contained a snapshot of your Stripe data at this time. + * @property \Stripe\StripeObject $error + * @property null|\Stripe\File $file The file object representing the results of the query. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $result_available_until Time at which the result expires and is no longer available for download. + * @property string $sql SQL for the query. + * @property string $status The query's execution status, which will be completed for successful runs, and canceled, failed, or timed_out otherwise. + * @property string $title Title of the query. + */ +class ScheduledQueryRun extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'scheduled_query_run'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Retrieve; + + public static function classUrl() + { + return '/v1/sigma/scheduled_query_runs'; + } +} diff --git a/app/api/Stripe/SingletonApiResource.php b/app/api/Stripe/SingletonApiResource.php new file mode 100755 index 0000000..952c7b7 --- /dev/null +++ b/app/api/Stripe/SingletonApiResource.php @@ -0,0 +1,38 @@ +refresh(); + + return $instance; + } + + /** + * @return string the endpoint associated with this singleton class + */ + public static function classUrl() + { + // Replace dots with slashes for namespaced resources, e.g. if the object's name is + // "foo.bar", then its URL will be "/v1/foo/bar". + $base = \str_replace('.', '/', static::OBJECT_NAME); + + return "/v1/{$base}"; + } + + /** + * @return string the endpoint associated with this singleton API resource + */ + public function instanceUrl() + { + return static::classUrl(); + } +} diff --git a/app/api/Stripe/Source.php b/app/api/Stripe/Source.php new file mode 100755 index 0000000..95c217d --- /dev/null +++ b/app/api/Stripe/Source.php @@ -0,0 +1,168 @@ +Source objects allow you to accept a variety of payment methods. + * They represent a customer's payment instrument, and can be used with the Stripe + * API just like a Card object: once chargeable, they can be charged, + * or can be attached to customers. + * + * Related guides: Sources API and Sources & Customers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject $ach_credit_transfer + * @property \Stripe\StripeObject $ach_debit + * @property \Stripe\StripeObject $acss_debit + * @property \Stripe\StripeObject $alipay + * @property null|int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for single_use sources. + * @property \Stripe\StripeObject $au_becs_debit + * @property \Stripe\StripeObject $bancontact + * @property \Stripe\StripeObject $card + * @property \Stripe\StripeObject $card_present + * @property string $client_secret The client secret of the source. Used for client-side retrieval using a publishable key. + * @property \Stripe\StripeObject $code_verification + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO code for the currency associated with the source. This is the currency for which the source will be chargeable once ready. Required for single_use sources. + * @property string $customer The ID of the customer to which this source is attached. This will not be present when the source has not been attached to a customer. + * @property \Stripe\StripeObject $eps + * @property string $flow The authentication flow of the source. flow is one of redirect, receiver, code_verification, none. + * @property \Stripe\StripeObject $giropay + * @property \Stripe\StripeObject $ideal + * @property \Stripe\StripeObject $klarna + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\StripeObject $multibanco + * @property null|\Stripe\StripeObject $owner Information about the owner of the payment instrument that may be used or required by particular source types. + * @property \Stripe\StripeObject $p24 + * @property \Stripe\StripeObject $receiver + * @property \Stripe\StripeObject $redirect + * @property \Stripe\StripeObject $sepa_credit_transfer + * @property \Stripe\StripeObject $sepa_debit + * @property \Stripe\StripeObject $sofort + * @property \Stripe\StripeObject $source_order + * @property null|string $statement_descriptor Extra information about a source. This will appear on your customer's statement every time you charge the source. + * @property string $status The status of the source, one of canceled, chargeable, consumed, failed, or pending. Only chargeable sources can be used to create a charge. + * @property \Stripe\StripeObject $three_d_secure + * @property string $type The type of the source. The type is a payment method, one of ach_credit_transfer, ach_debit, alipay, bancontact, card, card_present, eps, giropay, ideal, multibanco, klarna, p24, sepa_debit, sofort, three_d_secure, or wechat. An additional hash is included on the source with a name matching this value. It contains additional information specific to the payment method used. + * @property null|string $usage Either reusable or single_use. Whether this source should be reusable or not. Some source types may or may not be reusable by construction, while others may leave the option at creation. If an incompatible value is passed, an error will be returned. + * @property \Stripe\StripeObject $wechat + */ +class Source extends ApiResource +{ + const OBJECT_NAME = 'source'; + + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const FLOW_CODE_VERIFICATION = 'code_verification'; + const FLOW_NONE = 'none'; + const FLOW_RECEIVER = 'receiver'; + const FLOW_REDIRECT = 'redirect'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_CHARGEABLE = 'chargeable'; + const STATUS_CONSUMED = 'consumed'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + + const USAGE_REUSABLE = 'reusable'; + const USAGE_SINGLE_USE = 'single_use'; + + use ApiOperations\NestedResource; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\UnexpectedValueException if the source is not attached to a customer + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Source the detached source + */ + public function detach($params = null, $opts = null) + { + self::_validateParams($params); + + $id = $this['id']; + if (!$id) { + $class = static::class; + $msg = "Could not determine which URL to request: {$class} instance " + . "has invalid ID: {$id}"; + + throw new Exception\UnexpectedValueException($msg, null); + } + + if ($this['customer']) { + $base = Customer::classUrl(); + $parentExtn = \urlencode(Util\Util::utf8($this['customer'])); + $extn = \urlencode(Util\Util::utf8($id)); + $url = "{$base}/{$parentExtn}/sources/{$extn}"; + + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + $message = 'This source object does not appear to be currently attached ' + . 'to a customer object.'; + + throw new Exception\UnexpectedValueException($message); + } + + /** + * @deprecated sourceTransactions is deprecated. Please use Source::allSourceTransactions instead. + * + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of source transactions + */ + public function sourceTransactions($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/source_transactions'; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of source transactions + */ + public static function allSourceTransactions($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, '/source_transactions', $params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Source the verified source + */ + public function verify($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/SourceTransaction.php b/app/api/Stripe/SourceTransaction.php new file mode 100755 index 0000000..6fb2aa1 --- /dev/null +++ b/app/api/Stripe/SourceTransaction.php @@ -0,0 +1,20 @@ +coreServiceFactory) { + $this->coreServiceFactory = new \Stripe\Service\CoreServiceFactory($this); + } + + return $this->coreServiceFactory->__get($name); + } +} diff --git a/app/api/Stripe/StripeClientInterface.php b/app/api/Stripe/StripeClientInterface.php new file mode 100755 index 0000000..f4c95bf --- /dev/null +++ b/app/api/Stripe/StripeClientInterface.php @@ -0,0 +1,56 @@ + "old_value"] + * + * If we update the object with `metadata[new]=new_value`, the server side + * object now has *both* fields: + * + * metadata = ["old" => "old_value", "new" => "new_value"] + * + * This is okay in itself because usually users will want to treat it as + * additive: + * + * $obj->metadata["new"] = "new_value"; + * $obj->save(); + * + * However, in other cases, they may want to replace the entire existing + * contents: + * + * $obj->metadata = ["new" => "new_value"]; + * $obj->save(); + * + * This is where things get a little bit tricky because in order to clear + * any old keys that may have existed, we actually have to send an explicit + * empty string to the server. So the operation above would have to send + * this form to get the intended behavior: + * + * metadata[old]=&metadata[new]=new_value + * + * This method allows us to track which parameters are considered additive, + * and lets us behave correctly where appropriate when serializing + * parameters to be sent. + * + * @return Util\Set Set of additive parameters + */ + public static function getAdditiveParams() + { + static $additiveParams = null; + if (null === $additiveParams) { + // Set `metadata` as additive so that when it's set directly we remember + // to clear keys that may have been previously set by sending empty + // values for them. + // + // It's possible that not every object has `metadata`, but having this + // option set when there is no `metadata` field is not harmful. + $additiveParams = new Util\Set([ + 'metadata', + ]); + } + + return $additiveParams; + } + + public function __construct($id = null, $opts = null) + { + list($id, $this->_retrieveOptions) = Util\Util::normalizeId($id); + $this->_opts = Util\RequestOptions::parse($opts); + $this->_originalValues = []; + $this->_values = []; + $this->_unsavedValues = new Util\Set(); + $this->_transientValues = new Util\Set(); + if (null !== $id) { + $this->_values['id'] = $id; + } + } + + // Standard accessor magic methods + public function __set($k, $v) + { + if (static::getPermanentAttributes()->includes($k)) { + throw new Exception\InvalidArgumentException( + "Cannot set {$k} on this object. HINT: you can't set: " . + \implode(', ', static::getPermanentAttributes()->toArray()) + ); + } + + if ('' === $v) { + throw new Exception\InvalidArgumentException( + 'You cannot set \'' . $k . '\'to an empty string. ' + . 'We interpret empty strings as NULL in requests. ' + . 'You may set obj->' . $k . ' = NULL to delete the property' + ); + } + + $this->_values[$k] = Util\Util::convertToStripeObject($v, $this->_opts); + $this->dirtyValue($this->_values[$k]); + $this->_unsavedValues->add($k); + } + + public function __isset($k) + { + return isset($this->_values[$k]); + } + + public function __unset($k) + { + unset($this->_values[$k]); + $this->_transientValues->add($k); + $this->_unsavedValues->discard($k); + } + + public function &__get($k) + { + // function should return a reference, using $nullval to return a reference to null + $nullval = null; + if (!empty($this->_values) && \array_key_exists($k, $this->_values)) { + return $this->_values[$k]; + } + if (!empty($this->_transientValues) && $this->_transientValues->includes($k)) { + $class = static::class; + $attrs = \implode(', ', \array_keys($this->_values)); + $message = "Stripe Notice: Undefined property of {$class} instance: {$k}. " + . "HINT: The {$k} attribute was set in the past, however. " + . 'It was then wiped when refreshing the object ' + . "with the result returned by Stripe's API, " + . 'probably as a result of a save(). The attributes currently ' + . "available on this object are: {$attrs}"; + Stripe::getLogger()->error($message); + + return $nullval; + } + $class = static::class; + Stripe::getLogger()->error("Stripe Notice: Undefined property of {$class} instance: {$k}"); + + return $nullval; + } + + // Magic method for var_dump output. Only works with PHP >= 5.6 + public function __debugInfo() + { + return $this->_values; + } + + // ArrayAccess methods + #[\ReturnTypeWillChange] + public function offsetSet($k, $v) + { + $this->{$k} = $v; + } + + #[\ReturnTypeWillChange] + public function offsetExists($k) + { + return \array_key_exists($k, $this->_values); + } + + #[\ReturnTypeWillChange] + public function offsetUnset($k) + { + unset($this->{$k}); + } + + #[\ReturnTypeWillChange] + public function offsetGet($k) + { + return \array_key_exists($k, $this->_values) ? $this->_values[$k] : null; + } + + // Countable method + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->_values); + } + + public function keys() + { + return \array_keys($this->_values); + } + + public function values() + { + return \array_values($this->_values); + } + + /** + * This unfortunately needs to be public to be used in Util\Util. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * + * @return static the object constructed from the given values + */ + public static function constructFrom($values, $opts = null) + { + $obj = new static(isset($values['id']) ? $values['id'] : null); + $obj->refreshFrom($values, $opts); + + return $obj; + } + + /** + * Refreshes this object using the provided values. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * @param bool $partial defaults to false + */ + public function refreshFrom($values, $opts, $partial = false) + { + $this->_opts = Util\RequestOptions::parse($opts); + + $this->_originalValues = self::deepCopy($values); + + if ($values instanceof StripeObject) { + $values = $values->toArray(); + } + + // Wipe old state before setting new. This is useful for e.g. updating a + // customer, where there is no persistent card parameter. Mark those values + // which don't persist as transient + if ($partial) { + $removed = new Util\Set(); + } else { + $removed = new Util\Set(\array_diff(\array_keys($this->_values), \array_keys($values))); + } + + foreach ($removed->toArray() as $k) { + unset($this->{$k}); + } + + $this->updateAttributes($values, $opts, false); + foreach ($values as $k => $v) { + $this->_transientValues->discard($k); + $this->_unsavedValues->discard($k); + } + } + + /** + * Mass assigns attributes on the model. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * @param bool $dirty defaults to true + */ + public function updateAttributes($values, $opts = null, $dirty = true) + { + foreach ($values as $k => $v) { + // Special-case metadata to always be cast as a StripeObject + // This is necessary in case metadata is empty, as PHP arrays do + // not differentiate between lists and hashes, and we consider + // empty arrays to be lists. + if (('metadata' === $k) && (\is_array($v))) { + $this->_values[$k] = StripeObject::constructFrom($v, $opts); + } else { + $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts); + } + if ($dirty) { + $this->dirtyValue($this->_values[$k]); + } + $this->_unsavedValues->add($k); + } + } + + /** + * @param bool $force defaults to false + * + * @return array a recursive mapping of attributes to values for this object, + * including the proper value for deleted attributes + */ + public function serializeParameters($force = false) + { + $updateParams = []; + + foreach ($this->_values as $k => $v) { + // There are a few reasons that we may want to add in a parameter for + // update: + // + // 1. The `$force` option has been set. + // 2. We know that it was modified. + // 3. Its value is a StripeObject. A StripeObject may contain modified + // values within in that its parent StripeObject doesn't know about. + // + $original = \array_key_exists($k, $this->_originalValues) ? $this->_originalValues[$k] : null; + $unsaved = $this->_unsavedValues->includes($k); + if ($force || $unsaved || $v instanceof StripeObject) { + $updateParams[$k] = $this->serializeParamsValue( + $this->_values[$k], + $original, + $unsaved, + $force, + $k + ); + } + } + + // a `null` that makes it out of `serializeParamsValue` signals an empty + // value that we shouldn't appear in the serialized form of the object + return \array_filter( + $updateParams, + function ($v) { + return null !== $v; + } + ); + } + + public function serializeParamsValue($value, $original, $unsaved, $force, $key = null) + { + // The logic here is that essentially any object embedded in another + // object that had a `type` is actually an API resource of a different + // type that's been included in the response. These other resources must + // be updated from their proper endpoints, and therefore they are not + // included when serializing even if they've been modified. + // + // There are _some_ known exceptions though. + // + // For example, if the value is unsaved (meaning the user has set it), and + // it looks like the API resource is persisted with an ID, then we include + // the object so that parameters are serialized with a reference to its + // ID. + // + // Another example is that on save API calls it's sometimes desirable to + // update a customer's default source by setting a new card (or other) + // object with `->source=` and then saving the customer. The + // `saveWithParent` flag to override the default behavior allows us to + // handle these exceptions. + // + // We throw an error if a property was set explicitly but we can't do + // anything with it because the integration is probably not working as the + // user intended it to. + if (null === $value) { + return ''; + } + if (($value instanceof ApiResource) && (!$value->saveWithParent)) { + if (!$unsaved) { + return null; + } + if (isset($value->id)) { + return $value; + } + + throw new Exception\InvalidArgumentException( + "Cannot save property `{$key}` containing an API resource of type " . + \get_class($value) . ". It doesn't appear to be persisted and is " . + 'not marked as `saveWithParent`.' + ); + } + if (\is_array($value)) { + if (Util\Util::isList($value)) { + // Sequential array, i.e. a list + $update = []; + foreach ($value as $v) { + $update[] = $this->serializeParamsValue($v, null, true, $force); + } + // This prevents an array that's unchanged from being resent. + if ($update !== $this->serializeParamsValue($original, null, true, $force, $key)) { + return $update; + } + } else { + // Associative array, i.e. a map + return Util\Util::convertToStripeObject($value, $this->_opts)->serializeParameters(); + } + } elseif ($value instanceof StripeObject) { + $update = $value->serializeParameters($force); + if ($original && $unsaved && $key && static::getAdditiveParams()->includes($key)) { + $update = \array_merge(self::emptyValues($original), $update); + } + + return $update; + } else { + return $value; + } + } + + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return $this->toArray(); + } + + /** + * Returns an associative array with the key and values composing the + * Stripe object. + * + * @return array the associative array + */ + public function toArray() + { + $maybeToArray = function ($value) { + if (null === $value) { + return null; + } + + return \is_object($value) && \method_exists($value, 'toArray') ? $value->toArray() : $value; + }; + + return \array_reduce(\array_keys($this->_values), function ($acc, $k) use ($maybeToArray) { + if ('_' === \substr((string) $k, 0, 1)) { + return $acc; + } + $v = $this->_values[$k]; + if (Util\Util::isList($v)) { + $acc[$k] = \array_map($maybeToArray, $v); + } else { + $acc[$k] = $maybeToArray($v); + } + + return $acc; + }, []); + } + + /** + * Returns a pretty JSON representation of the Stripe object. + * + * @return string the JSON representation of the Stripe object + */ + public function toJSON() + { + return \json_encode($this->toArray(), \JSON_PRETTY_PRINT); + } + + public function __toString() + { + $class = static::class; + + return $class . ' JSON: ' . $this->toJSON(); + } + + /** + * Sets all keys within the StripeObject as unsaved so that they will be + * included with an update when `serializeParameters` is called. This + * method is also recursive, so any StripeObjects contained as values or + * which are values in a tenant array are also marked as dirty. + */ + public function dirty() + { + $this->_unsavedValues = new Util\Set(\array_keys($this->_values)); + foreach ($this->_values as $k => $v) { + $this->dirtyValue($v); + } + } + + protected function dirtyValue($value) + { + if (\is_array($value)) { + foreach ($value as $v) { + $this->dirtyValue($v); + } + } elseif ($value instanceof StripeObject) { + $value->dirty(); + } + } + + /** + * Produces a deep copy of the given object including support for arrays + * and StripeObjects. + * + * @param mixed $obj + */ + protected static function deepCopy($obj) + { + if (\is_array($obj)) { + $copy = []; + foreach ($obj as $k => $v) { + $copy[$k] = self::deepCopy($v); + } + + return $copy; + } + if ($obj instanceof StripeObject) { + return $obj::constructFrom( + self::deepCopy($obj->_values), + clone $obj->_opts + ); + } + + return $obj; + } + + /** + * Returns a hash of empty values for all the values that are in the given + * StripeObject. + * + * @param mixed $obj + */ + public static function emptyValues($obj) + { + if (\is_array($obj)) { + $values = $obj; + } elseif ($obj instanceof StripeObject) { + $values = $obj->_values; + } else { + throw new Exception\InvalidArgumentException( + 'empty_values got unexpected object type: ' . \get_class($obj) + ); + } + + return \array_fill_keys(\array_keys($values), ''); + } + + /** + * @return null|ApiResponse The last response from the Stripe API + */ + public function getLastResponse() + { + return $this->_lastResponse; + } + + /** + * Sets the last response from the Stripe API. + * + * @param ApiResponse $resp + */ + public function setLastResponse($resp) + { + $this->_lastResponse = $resp; + } + + /** + * Indicates whether or not the resource has been deleted on the server. + * Note that some, but not all, resources can indicate whether they have + * been deleted. + * + * @return bool whether the resource is deleted + */ + public function isDeleted() + { + return isset($this->_values['deleted']) ? $this->_values['deleted'] : false; + } +} diff --git a/app/api/Stripe/Subscription.php b/app/api/Stripe/Subscription.php new file mode 100755 index 0000000..94b7253 --- /dev/null +++ b/app/api/Stripe/Subscription.php @@ -0,0 +1,116 @@ +Creating + * Subscriptions. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|float $application_fee_percent A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice subtotal that will be transferred to the application owner's Stripe account. + * @property int $billing_cycle_anchor Determines the date of the first full invoice, and, for plans with month or year intervals, the day of the month for subsequent invoices. + * @property null|\Stripe\StripeObject $billing_thresholds Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period + * @property null|int $cancel_at A date in the future at which the subscription will automatically get canceled + * @property bool $cancel_at_period_end If the subscription has been canceled with the at_period_end flag set to true, cancel_at_period_end on the subscription will be true. You can use this attribute to determine whether a subscription that has a status of active is scheduled to be canceled at the end of the current period. + * @property null|int $canceled_at If the subscription has been canceled, the date of that cancellation. If the subscription was canceled with cancel_at_period_end, canceled_at will reflect the time of the most recent update request, not the end of the subscription period when the subscription is automatically moved to a canceled state. + * @property null|string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property int $current_period_end End of the current period that the subscription has been invoiced for. At the end of this period, a new invoice will be created. + * @property int $current_period_start Start of the current period that the subscription has been invoiced for. + * @property string|\Stripe\Customer $customer ID of the customer who owns the subscription. + * @property null|int $days_until_due Number of days a customer has to pay invoices generated by this subscription. This value will be null for subscriptions where collection_method=charge_automatically. + * @property null|string|\Stripe\PaymentMethod $default_payment_method ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over default_source. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. + * @property null|string|\Stripe\Account|\Stripe\AlipayAccount|\Stripe\BankAccount|\Stripe\BitcoinReceiver|\Stripe\Card|\Stripe\Source $default_source ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If default_payment_method is also set, default_payment_method will take precedence. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. + * @property null|\Stripe\TaxRate[] $default_tax_rates The tax rates that will apply to any subscription item that does not have tax_rates set. Invoices created will have their default_tax_rates populated from the subscription. + * @property null|\Stripe\Discount $discount Describes the current discount applied to this subscription, if there is one. When billing, a discount applied to a subscription overrides a discount applied on a customer-wide basis. + * @property null|int $ended_at If the subscription has ended, the date the subscription ended. + * @property \Stripe\Collection $items List of subscription items, each with an attached price. + * @property null|string|\Stripe\Invoice $latest_invoice The most recent invoice this subscription has generated. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|int $next_pending_invoice_item_invoice Specifies the approximate timestamp on which any pending invoice items will be billed according to the schedule provided at pending_invoice_item_interval. + * @property null|\Stripe\StripeObject $pause_collection If specified, payment collection for this subscription will be paused. + * @property null|\Stripe\StripeObject $pending_invoice_item_interval Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling Create an invoice for the given subscription at the specified interval. + * @property null|string|\Stripe\SetupIntent $pending_setup_intent You can use this SetupIntent to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the SCA Migration Guide. + * @property null|\Stripe\StripeObject $pending_update If specified, pending updates that will be applied to the subscription once the latest_invoice has been paid. + * @property null|string|\Stripe\SubscriptionSchedule $schedule The schedule attached to the subscription + * @property int $start_date Date when the subscription was first created. The date might differ from the created date due to backdating. + * @property string $status

Possible values are incomplete, incomplete_expired, trialing, active, past_due, canceled, or unpaid.

For collection_method=charge_automatically a subscription moves into incomplete if the initial payment attempt fails. A subscription in this state can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an active state. If the first invoice is not paid within 23 hours, the subscription transitions to incomplete_expired. This is a terminal state, the open invoice will be voided and no further invoices will be generated.

A subscription that is currently in a trial period is trialing and moves to active when the trial period is over.

If subscription collection_method=charge_automatically it becomes past_due when payment to renew it fails and canceled or unpaid (depending on your subscriptions settings) when Stripe has exhausted all payment retry attempts.

If subscription collection_method=send_invoice it becomes past_due when its invoice is not paid by the due date, and canceled or unpaid if it is still not paid by an additional deadline after that. Note that when a subscription has a status of unpaid, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices.

+ * @property null|int $trial_end If the subscription has a trial, the end of that trial. + * @property null|int $trial_start If the subscription has a trial, the beginning of that trial. + */ +class Subscription extends ApiResource +{ + const OBJECT_NAME = 'subscription'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const PAYMENT_BEHAVIOR_ALLOW_INCOMPLETE = 'allow_incomplete'; + const PAYMENT_BEHAVIOR_ERROR_IF_INCOMPLETE = 'error_if_incomplete'; + const PAYMENT_BEHAVIOR_PENDING_IF_INCOMPLETE = 'pending_if_incomplete'; + + const PRORATION_BEHAVIOR_ALWAYS_INVOICE = 'always_invoice'; + const PRORATION_BEHAVIOR_CREATE_PRORATIONS = 'create_prorations'; + const PRORATION_BEHAVIOR_NONE = 'none'; + + const STATUS_ACTIVE = 'active'; + const STATUS_CANCELED = 'canceled'; + const STATUS_INCOMPLETE = 'incomplete'; + const STATUS_INCOMPLETE_EXPIRED = 'incomplete_expired'; + const STATUS_PAST_DUE = 'past_due'; + const STATUS_TRIALING = 'trialing'; + const STATUS_UNPAID = 'unpaid'; + + use ApiOperations\Delete { + delete as protected _delete; + } + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'source', + ]); + } + + return $savedNestedResources; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription the deleted subscription + */ + public function cancel($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Subscription the updated subscription + */ + public function deleteDiscount($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom(['discount' => null], $opts, true); + } +} diff --git a/app/api/Stripe/SubscriptionItem.php b/app/api/Stripe/SubscriptionItem.php new file mode 100755 index 0000000..d85ed1c --- /dev/null +++ b/app/api/Stripe/SubscriptionItem.php @@ -0,0 +1,84 @@ +key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\Plan $plan

You can now model subscriptions more flexibly using the Prices API. It replaces the Plans API and is backwards compatible to simplify your migration.

Plans define the base price, currency, and billing cycle for recurring purchases of products. Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single "gold" product that has plans for $10/month, $100/year, €9/month, and €90/year.

Related guides: Set up a subscription and more about products and prices.

+ * @property \Stripe\Price $price

Prices define the unit cost, currency, and (optional) billing cycle for both recurring and one-time purchases of products. Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single "gold" product that has prices for $10/month, $100/year, and €9 once.

Related guides: Set up a subscription, create an invoice, and more about products and prices.

+ * @property int $quantity The quantity of the plan to which the customer should be subscribed. + * @property string $subscription The subscription this subscription_item belongs to. + * @property null|\Stripe\TaxRate[] $tax_rates The tax rates which apply to this subscription_item. When set, the default_tax_rates on the subscription do not apply to this subscription_item. + */ +class SubscriptionItem extends ApiResource +{ + const OBJECT_NAME = 'subscription_item'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\NestedResource; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const PATH_USAGE_RECORDS = '/usage_records'; + + /** + * @param null|string $id the ID of the subscription item on which to create the usage record + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\UsageRecord + */ + public static function createUsageRecord($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_USAGE_RECORDS, $params, $opts); + } + + /** + * @deprecated usageRecordSummaries is deprecated. Please use SubscriptionItem::allUsageRecordSummaries instead. + * + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of usage record summaries + */ + public function usageRecordSummaries($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/usage_record_summaries'; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + const PATH_USAGE_RECORD_SUMMARIES = '/usage_record_summaries'; + + /** + * @param string $id the ID of the subscription item on which to retrieve the usage record summaries + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of usage record summaries + */ + public static function allUsageRecordSummaries($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_USAGE_RECORD_SUMMARIES, $params, $opts); + } +} diff --git a/app/api/Stripe/SubscriptionSchedule.php b/app/api/Stripe/SubscriptionSchedule.php new file mode 100755 index 0000000..3d34a86 --- /dev/null +++ b/app/api/Stripe/SubscriptionSchedule.php @@ -0,0 +1,74 @@ +Subscription + * Schedules. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|int $canceled_at Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch. + * @property null|int $completed_at Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|\Stripe\StripeObject $current_phase Object representing the start and end dates for the current phase of the subscription schedule, if it is active. + * @property string|\Stripe\Customer $customer ID of the customer who owns the subscription schedule. + * @property \Stripe\StripeObject $default_settings + * @property string $end_behavior Behavior of the subscription schedule and underlying subscription when it ends. Possible values are release and cancel. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\StripeObject[] $phases Configuration for the subscription schedule's phases. + * @property null|int $released_at Time at which the subscription schedule was released. Measured in seconds since the Unix epoch. + * @property null|string $released_subscription ID of the subscription once managed by the subscription schedule (if it is released). + * @property string $status The present status of the subscription schedule. Possible values are not_started, active, completed, released, and canceled. You can read more about the different states in our behavior guide. + * @property null|string|\Stripe\Subscription $subscription ID of the subscription managed by the subscription schedule. + */ +class SubscriptionSchedule extends ApiResource +{ + const OBJECT_NAME = 'subscription_schedule'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return SubscriptionSchedule the canceled subscription schedule + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return SubscriptionSchedule the released subscription schedule + */ + public function release($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/release'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/TaxId.php b/app/api/Stripe/TaxId.php new file mode 100755 index 0000000..ee3439a --- /dev/null +++ b/app/api/Stripe/TaxId.php @@ -0,0 +1,107 @@ +customer. A customer's tax IDs + * are displayed on invoices and credit notes issued for the customer. + * + * Related guide: Customer + * Tax Identification Numbers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $country Two-letter ISO code representing the country of the tax ID. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string|\Stripe\Customer $customer ID of the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $type Type of the tax ID, one of ae_trn, au_abn, br_cnpj, br_cpf, ca_bn, ca_qst, ch_vat, cl_tin, es_cif, eu_vat, gb_vat, hk_br, id_npwp, in_gst, jp_cn, jp_rn, kr_brn, li_uid, mx_rfc, my_frp, my_itn, my_sst, no_vat, nz_gst, ru_inn, ru_kpp, sa_vat, sg_gst, sg_uen, th_vat, tw_vat, us_ein, or za_vat. Note that some legacy tax IDs have type unknown + * @property string $value Value of the tax ID. + * @property null|\Stripe\StripeObject $verification Tax ID verification information. + */ +class TaxId extends ApiResource +{ + const OBJECT_NAME = 'tax_id'; + + use ApiOperations\Delete; + + const TYPE_AE_TRN = 'ae_trn'; + const TYPE_AU_ABN = 'au_abn'; + const TYPE_BR_CNPJ = 'br_cnpj'; + const TYPE_BR_CPF = 'br_cpf'; + const TYPE_CA_BN = 'ca_bn'; + const TYPE_CA_QST = 'ca_qst'; + const TYPE_CH_VAT = 'ch_vat'; + const TYPE_CL_TIN = 'cl_tin'; + const TYPE_ES_CIF = 'es_cif'; + const TYPE_EU_VAT = 'eu_vat'; + const TYPE_GB_VAT = 'gb_vat'; + const TYPE_HK_BR = 'hk_br'; + const TYPE_ID_NPWP = 'id_npwp'; + const TYPE_IN_GST = 'in_gst'; + const TYPE_JP_CN = 'jp_cn'; + const TYPE_JP_RN = 'jp_rn'; + const TYPE_KR_BRN = 'kr_brn'; + const TYPE_LI_UID = 'li_uid'; + const TYPE_MX_RFC = 'mx_rfc'; + const TYPE_MY_FRP = 'my_frp'; + const TYPE_MY_ITN = 'my_itn'; + const TYPE_MY_SST = 'my_sst'; + const TYPE_NO_VAT = 'no_vat'; + const TYPE_NZ_GST = 'nz_gst'; + const TYPE_RU_INN = 'ru_inn'; + const TYPE_RU_KPP = 'ru_kpp'; + const TYPE_SA_VAT = 'sa_vat'; + const TYPE_SG_GST = 'sg_gst'; + const TYPE_SG_UEN = 'sg_uen'; + const TYPE_TH_VAT = 'th_vat'; + const TYPE_TW_VAT = 'tw_vat'; + const TYPE_UNKNOWN = 'unknown'; + const TYPE_US_EIN = 'us_ein'; + const TYPE_ZA_VAT = 'za_vat'; + + const VERIFICATION_STATUS_PENDING = 'pending'; + const VERIFICATION_STATUS_UNAVAILABLE = 'unavailable'; + const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; + const VERIFICATION_STATUS_VERIFIED = 'verified'; + + /** + * @return string the API URL for this tax id + */ + public function instanceUrl() + { + $id = $this['id']; + $customer = $this['customer']; + if (!$id) { + throw new Exception\UnexpectedValueException( + "Could not determine which URL to request: class instance has invalid ID: {$id}" + ); + } + $id = Util\Util::utf8($id); + $customer = Util\Util::utf8($customer); + + $base = Customer::classUrl(); + $customerExtn = \urlencode($customer); + $extn = \urlencode($id); + + return "{$base}/{$customerExtn}/tax_ids/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws \Stripe\Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Tax IDs cannot be retrieved without a customer ID. Retrieve ' . + "a tax ID using `Customer::retrieveTaxId('customer_id', " . + "'tax_id_id')`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/app/api/Stripe/TaxRate.php b/app/api/Stripe/TaxRate.php new file mode 100755 index 0000000..66f6089 --- /dev/null +++ b/app/api/Stripe/TaxRate.php @@ -0,0 +1,40 @@ +invoices, subscriptions and + * Checkout + * Sessions to collect tax. + * + * Related guide: Tax + * Rates. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Defaults to true. When set to false, this tax rate cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set. + * @property null|string $country Two-letter country code (ISO 3166-1 alpha-2). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers. + * @property string $display_name The display name of the tax rates as it will appear to your customer on their receipt email, PDF, and the hosted invoice page. + * @property bool $inclusive This specifies if the tax rate is inclusive or exclusive. + * @property null|string $jurisdiction The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property float $percentage This represents the tax rate percent out of 100. + * @property null|string $state ISO 3166-2 subdivision code, without country prefix. For example, "NY" for New York, United States. + */ +class TaxRate extends ApiResource +{ + const OBJECT_NAME = 'tax_rate'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/Terminal/ConnectionToken.php b/app/api/Stripe/Terminal/ConnectionToken.php new file mode 100755 index 0000000..5010257 --- /dev/null +++ b/app/api/Stripe/Terminal/ConnectionToken.php @@ -0,0 +1,23 @@ +Fleet + * Management. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $location The id of the location that this connection token is scoped to. + * @property string $secret Your application should pass this token to the Stripe Terminal SDK. + */ +class ConnectionToken extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.connection_token'; + + use \Stripe\ApiOperations\Create; +} diff --git a/app/api/Stripe/Terminal/Location.php b/app/api/Stripe/Terminal/Location.php new file mode 100755 index 0000000..4519814 --- /dev/null +++ b/app/api/Stripe/Terminal/Location.php @@ -0,0 +1,30 @@ +Fleet + * Management. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\StripeObject $address + * @property string $display_name The display name of the location. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + */ +class Location extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.location'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Delete; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/Terminal/Reader.php b/app/api/Stripe/Terminal/Reader.php new file mode 100755 index 0000000..8aaf1ca --- /dev/null +++ b/app/api/Stripe/Terminal/Reader.php @@ -0,0 +1,35 @@ +Connecting to a + * Reader. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $device_sw_version The current software version of the reader. + * @property string $device_type Type of reader, one of bbpos_chipper2x or verifone_P400. + * @property null|string $ip_address The local IP address of the reader. + * @property string $label Custom label given to the reader for easier identification. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $location The location identifier of the reader. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $serial_number Serial number of the reader. + * @property null|string $status The networking status of the reader. + */ +class Reader extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.reader'; + + use \Stripe\ApiOperations\All; + use \Stripe\ApiOperations\Create; + use \Stripe\ApiOperations\Delete; + use \Stripe\ApiOperations\Retrieve; + use \Stripe\ApiOperations\Update; +} diff --git a/app/api/Stripe/ThreeDSecure.php b/app/api/Stripe/ThreeDSecure.php new file mode 100755 index 0000000..2a00db3 --- /dev/null +++ b/app/api/Stripe/ThreeDSecure.php @@ -0,0 +1,37 @@ +3D + * Secure object. Once the object has been created, you can use it to + * authenticate the cardholder and create a charge. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount of the charge that you will create when authentication completes. + * @property bool $authenticated True if the cardholder went through the authentication flow and their bank indicated that authentication succeeded. + * @property \Stripe\Card $card

You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

Related guide: Card Payments with Sources.

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $redirect_url If present, this is the URL that you should send the cardholder to for authentication. If you are going to use Stripe.js to display the authentication page in an iframe, you should use the value "_callback". + * @property string $status Possible values are redirect_pending, succeeded, or failed. When the cardholder can be authenticated, the object starts with status redirect_pending. When liability will be shifted to the cardholder's bank (either because the cardholder was successfully authenticated, or because the bank has not implemented 3D Secure, the object wlil be in status succeeded. failed indicates that authentication was attempted unsuccessfully. + */ +class ThreeDSecure extends ApiResource +{ + const OBJECT_NAME = 'three_d_secure'; + + use ApiOperations\Create; + use ApiOperations\Retrieve; + + /** + * @return string the endpoint URL for the given class + */ + public static function classUrl() + { + return '/v1/3d_secure'; + } +} diff --git a/app/api/Stripe/Token.php b/app/api/Stripe/Token.php new file mode 100755 index 0000000..6956ae8 --- /dev/null +++ b/app/api/Stripe/Token.php @@ -0,0 +1,57 @@ +recommended payments integrations to + * perform this process client-side. This ensures that no sensitive card data + * touches your server, and allows your integration to operate in a PCI-compliant + * way. + * + * If you cannot use client-side tokenization, you can also create tokens using the + * API with either your publishable or secret API key. Keep in mind that if your + * integration uses this method, you are responsible for any PCI compliance that + * may be required, and you must keep your secret API key safe. Unlike with + * client-side tokenization, your customer's information is not sent directly to + * Stripe, so we cannot determine how it is handled or stored. + * + * Tokens cannot be stored or used more than once. To store card or bank account + * information for later use, you can create Customer objects or Custom accounts. Note + * that Radar, our integrated solution + * for automatic fraud protection, supports only integrations that use client-side + * tokenization. + * + * Related guide: Accept + * a payment + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property \Stripe\BankAccount $bank_account

These bank accounts are payment methods on Customer objects.

On the other hand External Accounts are transfer destinations on Account objects for Custom accounts. They can be bank accounts or debit cards as well, and are documented in the links above.

Related guide: Bank Debits and Transfers.

+ * @property \Stripe\Card $card

You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

Related guide: Card Payments with Sources.

+ * @property null|string $client_ip IP address of the client that generated the token. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $type Type of the token: account, bank_account, card, or pii. + * @property bool $used Whether this token has already been used (tokens can be used only once). + */ +class Token extends ApiResource +{ + const OBJECT_NAME = 'token'; + + use ApiOperations\Create; + use ApiOperations\Retrieve; + + const TYPE_ACCOUNT = 'account'; + const TYPE_BANK_ACCOUNT = 'bank_account'; + const TYPE_CARD = 'card'; + const TYPE_PII = 'pii'; +} diff --git a/app/api/Stripe/Topup.php b/app/api/Stripe/Topup.php new file mode 100755 index 0000000..4782173 --- /dev/null +++ b/app/api/Stripe/Topup.php @@ -0,0 +1,63 @@ +Topping Up your + * Platform Account. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount transferred. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction that describes the impact of this top-up on your account balance. May not be specified depending on status of top-up. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|int $expected_availability_date Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up. + * @property null|string $failure_code Error code explaining reason for top-up failure if available (see the errors section for a list of codes). + * @property null|string $failure_message Message to user further explaining reason for top-up failure if available. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\Source $source

Source objects allow you to accept a variety of payment methods. They represent a customer's payment instrument, and can be used with the Stripe API just like a Card object: once chargeable, they can be charged, or can be attached to customers.

Related guides: Sources API and Sources & Customers.

+ * @property null|string $statement_descriptor Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter. + * @property string $status The status of the top-up is either canceled, failed, pending, reversed, or succeeded. + * @property null|string $transfer_group A string that identifies this top-up as part of a group. + */ +class Topup extends ApiResource +{ + const OBJECT_NAME = 'topup'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_REVERSED = 'reversed'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Topup the canceled topup + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/Transfer.php b/app/api/Stripe/Transfer.php new file mode 100755 index 0000000..5d720dd --- /dev/null +++ b/app/api/Stripe/Transfer.php @@ -0,0 +1,130 @@ +Transfer object is created when you move funds between Stripe + * accounts as part of Connect. + * + * Before April 6, 2017, transfers also represented movement of funds from a Stripe + * account to a card or bank account. This behavior has since been split out into a + * Payout object, with + * corresponding payout endpoints. For more information, read about the transfer/payout split. + * + * Related guide: Creating Separate + * Charges and Transfers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount in %s to be transferred. + * @property int $amount_reversed Amount in %s reversed (can be less than the amount attribute on the transfer if a partial reversal was issued). + * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact of this transfer on your account balance. + * @property int $created Time that this record of the transfer was first created. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string|\Stripe\Account $destination ID of the Stripe account the transfer was sent to. + * @property string|\Stripe\Charge $destination_payment If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property \Stripe\Collection $reversals A list of reversals that have been applied to the transfer. + * @property bool $reversed Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false. + * @property null|string|\Stripe\Charge $source_transaction ID of the charge or payment that was used to fund the transfer. If null, the transfer was funded from the available balance. + * @property null|string $source_type The source balance this transfer came from. One of card, fpx, or bank_account. + * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. + */ +class Transfer extends ApiResource +{ + const OBJECT_NAME = 'transfer'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\NestedResource; + use ApiOperations\Retrieve; + use ApiOperations\Update; + + const SOURCE_TYPE_ALIPAY_ACCOUNT = 'alipay_account'; + const SOURCE_TYPE_BANK_ACCOUNT = 'bank_account'; + const SOURCE_TYPE_CARD = 'card'; + const SOURCE_TYPE_FINANCING = 'financing'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Transfer the canceled transfer + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + const PATH_REVERSALS = '/reversals'; + + /** + * @param string $id the ID of the transfer on which to retrieve the transfer reversals + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of transfer reversals + */ + public static function allReversals($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_REVERSALS, $params, $opts); + } + + /** + * @param string $id the ID of the transfer on which to create the transfer reversal + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public static function createReversal($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_REVERSALS, $params, $opts); + } + + /** + * @param string $id the ID of the transfer to which the transfer reversal belongs + * @param string $reversalId the ID of the transfer reversal to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public static function retrieveReversal($id, $reversalId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); + } + + /** + * @param string $id the ID of the transfer to which the transfer reversal belongs + * @param string $reversalId the ID of the transfer reversal to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\TransferReversal + */ + public static function updateReversal($id, $reversalId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); + } +} diff --git a/app/api/Stripe/TransferReversal.php b/app/api/Stripe/TransferReversal.php new file mode 100755 index 0000000..a2be682 --- /dev/null +++ b/app/api/Stripe/TransferReversal.php @@ -0,0 +1,79 @@ +Stripe Connect platforms can + * reverse transfers made to a connected account, either entirely or partially, and + * can also specify whether to refund any related application fees. Transfer + * reversals add to the platform's balance and subtract from the destination + * account's balance. + * + * Reversing a transfer that was made for a destination charge is allowed only + * up to the amount of the charge. It is possible to reverse a transfer_group + * transfer only if the destination account has enough balance to cover the + * reversal. + * + * Related guide: Reversing + * Transfers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in %s. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction Balance transaction that describes the impact on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string|\Stripe\Refund $destination_payment_refund Linked payment refund for the transfer reversal. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string|\Stripe\Refund $source_refund ID of the refund responsible for the transfer reversal. + * @property string|\Stripe\Transfer $transfer ID of the transfer that was reversed. + */ +class TransferReversal extends ApiResource +{ + const OBJECT_NAME = 'transfer_reversal'; + + use ApiOperations\Update { + save as protected _save; + } + + /** + * @return string the API URL for this Stripe transfer reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $transfer = $this['transfer']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' . + "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $transfer = Util\Util::utf8($transfer); + + $base = Transfer::classUrl(); + $transferExtn = \urlencode($transfer); + $extn = \urlencode($id); + + return "{$base}/{$transferExtn}/reversals/{$extn}"; + } + + /** + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return TransferReversal the saved reversal + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/app/api/Stripe/UsageRecord.php b/app/api/Stripe/UsageRecord.php new file mode 100755 index 0000000..355c796 --- /dev/null +++ b/app/api/Stripe/UsageRecord.php @@ -0,0 +1,25 @@ +Metered + * Billing. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $quantity The usage quantity for the specified date. + * @property string $subscription_item The ID of the subscription item this usage record contains data for. + * @property int $timestamp The timestamp when this usage occurred. + */ +class UsageRecord extends ApiResource +{ + const OBJECT_NAME = 'usage_record'; +} diff --git a/app/api/Stripe/UsageRecordSummary.php b/app/api/Stripe/UsageRecordSummary.php new file mode 100755 index 0000000..d56d5d3 --- /dev/null +++ b/app/api/Stripe/UsageRecordSummary.php @@ -0,0 +1,19 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $period + * @property string $subscription_item The ID of the subscription item this summary is describing. + * @property int $total_usage The total usage within this usage period. + */ +class UsageRecordSummary extends ApiResource +{ + const OBJECT_NAME = 'usage_record_summary'; +} diff --git a/app/api/Stripe/Util/CaseInsensitiveArray.php b/app/api/Stripe/Util/CaseInsensitiveArray.php new file mode 100755 index 0000000..f7d269f --- /dev/null +++ b/app/api/Stripe/Util/CaseInsensitiveArray.php @@ -0,0 +1,78 @@ +container = \array_change_key_case($initial_array, \CASE_LOWER); + } + + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->container); + } + + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->container); + } + + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + $offset = static::maybeLowercase($offset); + if (null === $offset) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + $offset = static::maybeLowercase($offset); + + return isset($this->container[$offset]); + } + + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + $offset = static::maybeLowercase($offset); + unset($this->container[$offset]); + } + + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + $offset = static::maybeLowercase($offset); + + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + private static function maybeLowercase($v) + { + if (\is_string($v)) { + return \strtolower($v); + } + + return $v; + } +} diff --git a/app/api/Stripe/Util/DefaultLogger.php b/app/api/Stripe/Util/DefaultLogger.php new file mode 100755 index 0000000..b749702 --- /dev/null +++ b/app/api/Stripe/Util/DefaultLogger.php @@ -0,0 +1,29 @@ + 0) { + throw new \Stripe\Exception\BadMethodCallException('DefaultLogger does not currently implement context. Please implement if you need it.'); + } + + if (null === $this->destination) { + \error_log($message, $this->messageType); + } else { + \error_log($message, $this->messageType, $this->destination); + } + } +} diff --git a/app/api/Stripe/Util/LoggerInterface.php b/app/api/Stripe/Util/LoggerInterface.php new file mode 100755 index 0000000..c9b7be2 --- /dev/null +++ b/app/api/Stripe/Util/LoggerInterface.php @@ -0,0 +1,34 @@ + \Stripe\Account::class, + \Stripe\AccountLink::OBJECT_NAME => \Stripe\AccountLink::class, + \Stripe\AlipayAccount::OBJECT_NAME => \Stripe\AlipayAccount::class, + \Stripe\ApplePayDomain::OBJECT_NAME => \Stripe\ApplePayDomain::class, + \Stripe\ApplicationFee::OBJECT_NAME => \Stripe\ApplicationFee::class, + \Stripe\ApplicationFeeRefund::OBJECT_NAME => \Stripe\ApplicationFeeRefund::class, + \Stripe\Balance::OBJECT_NAME => \Stripe\Balance::class, + \Stripe\BalanceTransaction::OBJECT_NAME => \Stripe\BalanceTransaction::class, + \Stripe\BankAccount::OBJECT_NAME => \Stripe\BankAccount::class, + \Stripe\BillingPortal\Configuration::OBJECT_NAME => \Stripe\BillingPortal\Configuration::class, + \Stripe\BillingPortal\Session::OBJECT_NAME => \Stripe\BillingPortal\Session::class, + \Stripe\BitcoinReceiver::OBJECT_NAME => \Stripe\BitcoinReceiver::class, + \Stripe\BitcoinTransaction::OBJECT_NAME => \Stripe\BitcoinTransaction::class, + \Stripe\Capability::OBJECT_NAME => \Stripe\Capability::class, + \Stripe\Card::OBJECT_NAME => \Stripe\Card::class, + \Stripe\Charge::OBJECT_NAME => \Stripe\Charge::class, + \Stripe\Checkout\Session::OBJECT_NAME => \Stripe\Checkout\Session::class, + \Stripe\Collection::OBJECT_NAME => \Stripe\Collection::class, + \Stripe\CountrySpec::OBJECT_NAME => \Stripe\CountrySpec::class, + \Stripe\Coupon::OBJECT_NAME => \Stripe\Coupon::class, + \Stripe\CreditNote::OBJECT_NAME => \Stripe\CreditNote::class, + \Stripe\CreditNoteLineItem::OBJECT_NAME => \Stripe\CreditNoteLineItem::class, + \Stripe\Customer::OBJECT_NAME => \Stripe\Customer::class, + \Stripe\CustomerBalanceTransaction::OBJECT_NAME => \Stripe\CustomerBalanceTransaction::class, + \Stripe\Discount::OBJECT_NAME => \Stripe\Discount::class, + \Stripe\Dispute::OBJECT_NAME => \Stripe\Dispute::class, + \Stripe\EphemeralKey::OBJECT_NAME => \Stripe\EphemeralKey::class, + \Stripe\Event::OBJECT_NAME => \Stripe\Event::class, + \Stripe\ExchangeRate::OBJECT_NAME => \Stripe\ExchangeRate::class, + \Stripe\File::OBJECT_NAME => \Stripe\File::class, + \Stripe\File::OBJECT_NAME_ALT => \Stripe\File::class, + \Stripe\FileLink::OBJECT_NAME => \Stripe\FileLink::class, + \Stripe\Invoice::OBJECT_NAME => \Stripe\Invoice::class, + \Stripe\InvoiceItem::OBJECT_NAME => \Stripe\InvoiceItem::class, + \Stripe\InvoiceLineItem::OBJECT_NAME => \Stripe\InvoiceLineItem::class, + \Stripe\Issuing\Authorization::OBJECT_NAME => \Stripe\Issuing\Authorization::class, + \Stripe\Issuing\Card::OBJECT_NAME => \Stripe\Issuing\Card::class, + \Stripe\Issuing\CardDetails::OBJECT_NAME => \Stripe\Issuing\CardDetails::class, + \Stripe\Issuing\Cardholder::OBJECT_NAME => \Stripe\Issuing\Cardholder::class, + \Stripe\Issuing\Dispute::OBJECT_NAME => \Stripe\Issuing\Dispute::class, + \Stripe\Issuing\Transaction::OBJECT_NAME => \Stripe\Issuing\Transaction::class, + \Stripe\LineItem::OBJECT_NAME => \Stripe\LineItem::class, + \Stripe\LoginLink::OBJECT_NAME => \Stripe\LoginLink::class, + \Stripe\Mandate::OBJECT_NAME => \Stripe\Mandate::class, + \Stripe\Order::OBJECT_NAME => \Stripe\Order::class, + \Stripe\OrderItem::OBJECT_NAME => \Stripe\OrderItem::class, + \Stripe\OrderReturn::OBJECT_NAME => \Stripe\OrderReturn::class, + \Stripe\PaymentIntent::OBJECT_NAME => \Stripe\PaymentIntent::class, + \Stripe\PaymentMethod::OBJECT_NAME => \Stripe\PaymentMethod::class, + \Stripe\Payout::OBJECT_NAME => \Stripe\Payout::class, + \Stripe\Person::OBJECT_NAME => \Stripe\Person::class, + \Stripe\Plan::OBJECT_NAME => \Stripe\Plan::class, + \Stripe\Price::OBJECT_NAME => \Stripe\Price::class, + \Stripe\Product::OBJECT_NAME => \Stripe\Product::class, + \Stripe\PromotionCode::OBJECT_NAME => \Stripe\PromotionCode::class, + \Stripe\Radar\EarlyFraudWarning::OBJECT_NAME => \Stripe\Radar\EarlyFraudWarning::class, + \Stripe\Radar\ValueList::OBJECT_NAME => \Stripe\Radar\ValueList::class, + \Stripe\Radar\ValueListItem::OBJECT_NAME => \Stripe\Radar\ValueListItem::class, + \Stripe\Recipient::OBJECT_NAME => \Stripe\Recipient::class, + \Stripe\RecipientTransfer::OBJECT_NAME => \Stripe\RecipientTransfer::class, + \Stripe\Refund::OBJECT_NAME => \Stripe\Refund::class, + \Stripe\Reporting\ReportRun::OBJECT_NAME => \Stripe\Reporting\ReportRun::class, + \Stripe\Reporting\ReportType::OBJECT_NAME => \Stripe\Reporting\ReportType::class, + \Stripe\Review::OBJECT_NAME => \Stripe\Review::class, + \Stripe\SetupAttempt::OBJECT_NAME => \Stripe\SetupAttempt::class, + \Stripe\SetupIntent::OBJECT_NAME => \Stripe\SetupIntent::class, + \Stripe\Sigma\ScheduledQueryRun::OBJECT_NAME => \Stripe\Sigma\ScheduledQueryRun::class, + \Stripe\SKU::OBJECT_NAME => \Stripe\SKU::class, + \Stripe\Source::OBJECT_NAME => \Stripe\Source::class, + \Stripe\SourceTransaction::OBJECT_NAME => \Stripe\SourceTransaction::class, + \Stripe\Subscription::OBJECT_NAME => \Stripe\Subscription::class, + \Stripe\SubscriptionItem::OBJECT_NAME => \Stripe\SubscriptionItem::class, + \Stripe\SubscriptionSchedule::OBJECT_NAME => \Stripe\SubscriptionSchedule::class, + \Stripe\TaxId::OBJECT_NAME => \Stripe\TaxId::class, + \Stripe\TaxRate::OBJECT_NAME => \Stripe\TaxRate::class, + \Stripe\Terminal\ConnectionToken::OBJECT_NAME => \Stripe\Terminal\ConnectionToken::class, + \Stripe\Terminal\Location::OBJECT_NAME => \Stripe\Terminal\Location::class, + \Stripe\Terminal\Reader::OBJECT_NAME => \Stripe\Terminal\Reader::class, + \Stripe\ThreeDSecure::OBJECT_NAME => \Stripe\ThreeDSecure::class, + \Stripe\Token::OBJECT_NAME => \Stripe\Token::class, + \Stripe\Topup::OBJECT_NAME => \Stripe\Topup::class, + \Stripe\Transfer::OBJECT_NAME => \Stripe\Transfer::class, + \Stripe\TransferReversal::OBJECT_NAME => \Stripe\TransferReversal::class, + \Stripe\UsageRecord::OBJECT_NAME => \Stripe\UsageRecord::class, + \Stripe\UsageRecordSummary::OBJECT_NAME => \Stripe\UsageRecordSummary::class, + \Stripe\WebhookEndpoint::OBJECT_NAME => \Stripe\WebhookEndpoint::class, + ]; +} diff --git a/app/api/Stripe/Util/RandomGenerator.php b/app/api/Stripe/Util/RandomGenerator.php new file mode 100755 index 0000000..6a29213 --- /dev/null +++ b/app/api/Stripe/Util/RandomGenerator.php @@ -0,0 +1,36 @@ + a list of headers that should be persisted across requests + */ + public static $HEADERS_TO_PERSIST = [ + 'Stripe-Account', + 'Stripe-Version', + ]; + + /** @var array */ + public $headers; + + /** @var null|string */ + public $apiKey; + + /** @var null|string */ + public $apiBase; + + /** + * @param null|string $key + * @param array $headers + * @param null|string $base + */ + public function __construct($key = null, $headers = [], $base = null) + { + $this->apiKey = $key; + $this->headers = $headers; + $this->apiBase = $base; + } + + /** + * @return array + */ + public function __debugInfo() + { + return [ + 'apiKey' => $this->redactedApiKey(), + 'headers' => $this->headers, + 'apiBase' => $this->apiBase, + ]; + } + + /** + * Unpacks an options array and merges it into the existing RequestOptions + * object. + * + * @param null|array|RequestOptions|string $options a key => value array + * @param bool $strict when true, forbid string form and arbitrary keys in array form + * + * @return RequestOptions + */ + public function merge($options, $strict = false) + { + $other_options = self::parse($options, $strict); + if (null === $other_options->apiKey) { + $other_options->apiKey = $this->apiKey; + } + if (null === $other_options->apiBase) { + $other_options->apiBase = $this->apiBase; + } + $other_options->headers = \array_merge($this->headers, $other_options->headers); + + return $other_options; + } + + /** + * Discards all headers that we don't want to persist across requests. + */ + public function discardNonPersistentHeaders() + { + foreach ($this->headers as $k => $v) { + if (!\in_array($k, self::$HEADERS_TO_PERSIST, true)) { + unset($this->headers[$k]); + } + } + } + + /** + * Unpacks an options array into an RequestOptions object. + * + * @param null|array|RequestOptions|string $options a key => value array + * @param bool $strict when true, forbid string form and arbitrary keys in array form + * + * @throws \Stripe\Exception\InvalidArgumentException + * + * @return RequestOptions + */ + public static function parse($options, $strict = false) + { + if ($options instanceof self) { + return $options; + } + + if (null === $options) { + return new RequestOptions(null, [], null); + } + + if (\is_string($options)) { + if ($strict) { + $message = 'Do not pass a string for request options. If you want to set the ' + . 'API key, pass an array like ["api_key" => ] instead.'; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + return new RequestOptions($options, [], null); + } + + if (\is_array($options)) { + $headers = []; + $key = null; + $base = null; + + if (\array_key_exists('api_key', $options)) { + $key = $options['api_key']; + unset($options['api_key']); + } + if (\array_key_exists('idempotency_key', $options)) { + $headers['Idempotency-Key'] = $options['idempotency_key']; + unset($options['idempotency_key']); + } + if (\array_key_exists('stripe_account', $options)) { + $headers['Stripe-Account'] = $options['stripe_account']; + unset($options['stripe_account']); + } + if (\array_key_exists('stripe_version', $options)) { + $headers['Stripe-Version'] = $options['stripe_version']; + unset($options['stripe_version']); + } + if (\array_key_exists('api_base', $options)) { + $base = $options['api_base']; + unset($options['api_base']); + } + + if ($strict && !empty($options)) { + $message = 'Got unexpected keys in options array: ' . \implode(', ', \array_keys($options)); + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + return new RequestOptions($key, $headers, $base); + } + + $message = 'The second argument to Stripe API method calls is an ' + . 'optional per-request apiKey, which must be a string, or ' + . 'per-request options, which must be an array. (HINT: you can set ' + . 'a global apiKey by "Stripe::setApiKey()")'; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + private function redactedApiKey() + { + $pieces = \explode('_', $this->apiKey, 3); + $last = \array_pop($pieces); + $redactedLast = \strlen($last) > 4 + ? (\str_repeat('*', \strlen($last) - 4) . \substr($last, -4)) + : $last; + $pieces[] = $redactedLast; + + return \implode('_', $pieces); + } +} diff --git a/app/api/Stripe/Util/Set.php b/app/api/Stripe/Util/Set.php new file mode 100755 index 0000000..8b7a087 --- /dev/null +++ b/app/api/Stripe/Util/Set.php @@ -0,0 +1,45 @@ +_elts = []; + foreach ($members as $item) { + $this->_elts[$item] = true; + } + } + + public function includes($elt) + { + return isset($this->_elts[$elt]); + } + + public function add($elt) + { + $this->_elts[$elt] = true; + } + + public function discard($elt) + { + unset($this->_elts[$elt]); + } + + public function toArray() + { + return \array_keys($this->_elts); + } + + #[\ReturnTypeWillChange] + public function getIterator() + { + return new ArrayIterator($this->toArray()); + } +} diff --git a/app/api/Stripe/Util/Util.php b/app/api/Stripe/Util/Util.php new file mode 100755 index 0000000..602f466 --- /dev/null +++ b/app/api/Stripe/Util/Util.php @@ -0,0 +1,265 @@ +id; + } + if (static::isList($h)) { + $results = []; + foreach ($h as $v) { + $results[] = static::objectsToIds($v); + } + + return $results; + } + if (\is_array($h)) { + $results = []; + foreach ($h as $k => $v) { + if (null === $v) { + continue; + } + $results[$k] = static::objectsToIds($v); + } + + return $results; + } + + return $h; + } + + /** + * @param array $params + * + * @return string + */ + public static function encodeParameters($params) + { + $flattenedParams = self::flattenParams($params); + $pieces = []; + foreach ($flattenedParams as $param) { + list($k, $v) = $param; + $pieces[] = self::urlEncode($k) . '=' . self::urlEncode($v); + } + + return \implode('&', $pieces); + } + + /** + * @param array $params + * @param null|string $parentKey + * + * @return array + */ + public static function flattenParams($params, $parentKey = null) + { + $result = []; + + foreach ($params as $key => $value) { + $calculatedKey = $parentKey ? "{$parentKey}[{$key}]" : $key; + + if (self::isList($value)) { + $result = \array_merge($result, self::flattenParamsList($value, $calculatedKey)); + } elseif (\is_array($value)) { + $result = \array_merge($result, self::flattenParams($value, $calculatedKey)); + } else { + \array_push($result, [$calculatedKey, $value]); + } + } + + return $result; + } + + /** + * @param array $value + * @param string $calculatedKey + * + * @return array + */ + public static function flattenParamsList($value, $calculatedKey) + { + $result = []; + + foreach ($value as $i => $elem) { + if (self::isList($elem)) { + $result = \array_merge($result, self::flattenParamsList($elem, $calculatedKey)); + } elseif (\is_array($elem)) { + $result = \array_merge($result, self::flattenParams($elem, "{$calculatedKey}[{$i}]")); + } else { + \array_push($result, ["{$calculatedKey}[{$i}]", $elem]); + } + } + + return $result; + } + + /** + * @param string $key a string to URL-encode + * + * @return string the URL-encoded string + */ + public static function urlEncode($key) + { + $s = \urlencode((string) $key); + + // Don't use strict form encoding by changing the square bracket control + // characters back to their literals. This is fine by the server, and + // makes these parameter strings easier to read. + $s = \str_replace('%5B', '[', $s); + + return \str_replace('%5D', ']', $s); + } + + public static function normalizeId($id) + { + if (\is_array($id)) { + $params = $id; + $id = $params['id']; + unset($params['id']); + } else { + $params = []; + } + + return [$id, $params]; + } + + /** + * Returns UNIX timestamp in milliseconds. + * + * @return int current time in millis + */ + public static function currentTimeMillis() + { + return (int) \round(\microtime(true) * 1000); + } +} diff --git a/app/api/Stripe/Webhook.php b/app/api/Stripe/Webhook.php new file mode 100755 index 0000000..67d2799 --- /dev/null +++ b/app/api/Stripe/Webhook.php @@ -0,0 +1,42 @@ +webhook + * endpoints via the API to be notified about events that happen in your Stripe + * account or connected accounts. + * + * Most users configure webhooks from the dashboard, which provides a + * user interface for registering and testing your webhook endpoints. + * + * Related guide: Setting up + * Webhooks. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $api_version The API version events are rendered as for this webhook endpoint. + * @property null|string $application The ID of the associated Connect application. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An optional description of what the webhook is used for. + * @property string[] $enabled_events The list of events to enable for this endpoint. ['*'] indicates that all events are enabled, except those that require explicit selection. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $secret The endpoint's secret, used to generate webhook signatures. Only returned at creation. + * @property string $status The status of the webhook. It can be enabled or disabled. + * @property string $url The URL of the webhook endpoint. + */ +class WebhookEndpoint extends ApiResource +{ + const OBJECT_NAME = 'webhook_endpoint'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\Retrieve; + use ApiOperations\Update; +} diff --git a/app/api/Stripe/WebhookSignature.php b/app/api/Stripe/WebhookSignature.php new file mode 100755 index 0000000..bfd1dde --- /dev/null +++ b/app/api/Stripe/WebhookSignature.php @@ -0,0 +1,140 @@ + 0) && (\abs(\time() - $timestamp) > $tolerance)) { + throw Exception\SignatureVerificationException::factory( + 'Timestamp outside the tolerance zone', + $payload, + $header + ); + } + + return true; + } + + /** + * Extracts the timestamp in a signature header. + * + * @param string $header the signature header + * + * @return int the timestamp contained in the header, or -1 if no valid + * timestamp is found + */ + private static function getTimestamp($header) + { + $items = \explode(',', $header); + + foreach ($items as $item) { + $itemParts = \explode('=', $item, 2); + if ('t' === $itemParts[0]) { + if (!\is_numeric($itemParts[1])) { + return -1; + } + + return (int) ($itemParts[1]); + } + } + + return -1; + } + + /** + * Extracts the signatures matching a given scheme in a signature header. + * + * @param string $header the signature header + * @param string $scheme the signature scheme to look for + * + * @return array the list of signatures matching the provided scheme + */ + private static function getSignatures($header, $scheme) + { + $signatures = []; + $items = \explode(',', $header); + + foreach ($items as $item) { + $itemParts = \explode('=', $item, 2); + if (\trim($itemParts[0]) === $scheme) { + $signatures[] = $itemParts[1]; + } + } + + return $signatures; + } + + /** + * Computes the signature for a given payload and secret. + * + * The current scheme used by Stripe ("v1") is HMAC/SHA-256. + * + * @param string $payload the payload to sign + * @param string $secret the secret used to generate the signature + * + * @return string the signature as a string + */ + private static function computeSignature($payload, $secret) + { + return \hash_hmac('sha256', $payload, $secret); + } +} diff --git a/app/api/Stripe/autoload.php b/app/api/Stripe/autoload.php new file mode 100755 index 0000000..79b7671 --- /dev/null +++ b/app/api/Stripe/autoload.php @@ -0,0 +1,22 @@ + diff --git a/app/api/TFPDF/font/courierb.php b/app/api/TFPDF/font/courierb.php new file mode 100755 index 0000000..3fc69a5 --- /dev/null +++ b/app/api/TFPDF/font/courierb.php @@ -0,0 +1,8 @@ + diff --git a/app/api/TFPDF/font/courierbi.php b/app/api/TFPDF/font/courierbi.php new file mode 100755 index 0000000..a49f2ae --- /dev/null +++ b/app/api/TFPDF/font/courierbi.php @@ -0,0 +1,8 @@ + diff --git a/app/api/TFPDF/font/courieri.php b/app/api/TFPDF/font/courieri.php new file mode 100755 index 0000000..9c1c2cf --- /dev/null +++ b/app/api/TFPDF/font/courieri.php @@ -0,0 +1,8 @@ + diff --git a/app/api/TFPDF/font/helvetica.php b/app/api/TFPDF/font/helvetica.php new file mode 100755 index 0000000..7e20c3a --- /dev/null +++ b/app/api/TFPDF/font/helvetica.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/app/api/TFPDF/font/helveticab.php b/app/api/TFPDF/font/helveticab.php new file mode 100755 index 0000000..452e0ac --- /dev/null +++ b/app/api/TFPDF/font/helveticab.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/app/api/TFPDF/font/helveticabi.php b/app/api/TFPDF/font/helveticabi.php new file mode 100755 index 0000000..ea5c56f --- /dev/null +++ b/app/api/TFPDF/font/helveticabi.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/app/api/TFPDF/font/helveticai.php b/app/api/TFPDF/font/helveticai.php new file mode 100755 index 0000000..e3c638a --- /dev/null +++ b/app/api/TFPDF/font/helveticai.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/app/api/TFPDF/font/symbol.php b/app/api/TFPDF/font/symbol.php new file mode 100755 index 0000000..b980b07 --- /dev/null +++ b/app/api/TFPDF/font/symbol.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +?> diff --git a/app/api/TFPDF/font/times.php b/app/api/TFPDF/font/times.php new file mode 100755 index 0000000..d3ea808 --- /dev/null +++ b/app/api/TFPDF/font/times.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +?> diff --git a/app/api/TFPDF/font/timesb.php b/app/api/TFPDF/font/timesb.php new file mode 100755 index 0000000..1c198f0 --- /dev/null +++ b/app/api/TFPDF/font/timesb.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/app/api/TFPDF/font/timesbi.php b/app/api/TFPDF/font/timesbi.php new file mode 100755 index 0000000..a6034b2 --- /dev/null +++ b/app/api/TFPDF/font/timesbi.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/app/api/TFPDF/font/timesi.php b/app/api/TFPDF/font/timesi.php new file mode 100755 index 0000000..bd9e0d9 --- /dev/null +++ b/app/api/TFPDF/font/timesi.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/app/api/TFPDF/font/unifont/DejaVuSans.ttf b/app/api/TFPDF/font/unifont/DejaVuSans.ttf new file mode 100755 index 0000000000000000000000000000000000000000..27cff476ef317e4666f7ffb77e82b9398a90825a GIT binary patch literal 720012 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�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�@_$#aU@6laZ58j-; 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 literal 0 HcmV?d00001 diff --git a/app/api/TFPDF/font/unifont/DejaVuSansCondensed-Bold.ttf b/app/api/TFPDF/font/unifont/DejaVuSansCondensed-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..9edd89c3dcc333569ad86607f37c26f5e52d1836 GIT binary patch literal 631992 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 z z!yniRuU&AvU8-D+paQXi5(T~4&^3nU@@dqwV9)E3k%~tq*TjBSv!tZ$?eAG)W zOg`$d@amU`OOJ(Dy;2?UnpZs*UU?zB;@H{AEB3=jo(~^+^~B3BhL2bak3AM%_UJ>C zmt6{vp1*(c=tJSrZ$EzQ>N`(7ayC5t(3>U?KNlX7(TCm?Ub+e|xey+dwFmdZ1FC!A zQnYcOu;Y=G&t7)en45yzz zv354BT|IGX74BVydsgA(WNmVC6((z8a`nWC{Sdaoi}a}%t-^6V@9_)a*x7LW+mCO3 Y{udvA&F_x?j{WXv#{ah!FFW@C02~XV&;S4c literal 0 HcmV?d00001 diff --git a/app/api/TFPDF/font/unifont/DejaVuSansCondensed.ttf b/app/api/TFPDF/font/unifont/DejaVuSansCondensed.ttf new file mode 100755 index 0000000000000000000000000000000000000000..826e619b783bb1c24dd5491114e490f8ecf6013b GIT binary patch literal 643852 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

JB7+dzQ0 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 PATHd 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 A>6(~Zkim!NUH5+VKX#f|P_h5V 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:tiaSIUikbXpf4K78iR{rAXi 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 +* License: LGPL +* Copyright (c) Ian Back, 2010 +* This header must be retained in any redistribution or +* modification of the file. +* +*/ + +// Define the value used in the "head" table of a created TTF file +// 0x74727565 "true" for Mac +// 0x00010000 for Windows +// Either seems to work for a font embedded in a PDF file +// when read by Adobe Reader on a Windows PC(!) +define("_TTF_MAC_HEADER", false); + + +// TrueType Font Glyph operators +define("GF_WORDS",(1 << 0)); +define("GF_SCALE",(1 << 3)); +define("GF_MORE",(1 << 5)); +define("GF_XYSCALE",(1 << 6)); +define("GF_TWOBYTWO",(1 << 7)); + + + +class TTFontFile { + + var $maxUni; + var $_pos; + var $numTables; + var $searchRange; + var $entrySelector; + var $rangeShift; + var $tables; + var $otables; + var $filename; + var $fh; + var $hmetrics; + var $glyphPos; + var $charToGlyph; + var $ascent; + var $descent; + var $name; + var $familyName; + var $styleName; + var $fullName; + var $uniqueFontID; + var $unitsPerEm; + var $bbox; + var $capHeight; + var $stemV; + var $italicAngle; + var $flags; + var $underlinePosition; + var $underlineThickness; + var $charWidths; + var $defaultWidth; + var $maxStrLenRead; + + function __construct() { + $this->maxStrLenRead = 200000; // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) + } + + + function getMetrics($file) { + $this->filename = $file; + $this->fh = fopen($file,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = []; + $this->charToGlyph = []; + $this->tables = []; + $this->otables = []; + $this->ascent = 0; + $this->descent = 0; + $this->TTCFonts = []; + $this->version = $version = $this->read_ulong(); + if ($version==0x4F54544F) + die("Postscript outlines are not supported"); + if ($version==0x74746366) + die("ERROR - TrueType Fonts Collections not supported"); + if (!in_array($version, array(0x00010000,0x74727565))) + die("Not a TrueType font: version=".$version); + $this->readTableDirectory(); + $this->extractInfo(); + fclose($this->fh); + } + + + function readTableDirectory() { + $this->numTables = $this->read_ushort(); + $this->searchRange = $this->read_ushort(); + $this->entrySelector = $this->read_ushort(); + $this->rangeShift = $this->read_ushort(); + $this->tables = []; + for ($i=0;$i<$this->numTables;$i++) { + $record = []; + $record['tag'] = $this->read_tag(); + $record['checksum'] = array($this->read_ushort(),$this->read_ushort()); + $record['offset'] = $this->read_ulong(); + $record['length'] = $this->read_ulong(); + $this->tables[$record['tag']] = $record; + } + } + + + function sub32($x, $y) { + $xlo = $x[1]; + $xhi = $x[0]; + $ylo = $y[1]; + $yhi = $y[0]; + if ($ylo > $xlo) { $xlo += 1 << 16; $yhi += 1; } + $reslo = $xlo-$ylo; + if ($yhi > $xhi) { $xhi += 1 << 16; } + $reshi = $xhi-$yhi; + $reshi = $reshi & 0xFFFF; + return array($reshi, $reslo); + } + + function calcChecksum($data) { + if (strlen($data) % 4) { $data .= str_repeat("\0",(4-(strlen($data) % 4))); } + $hi=0x0000; + $lo=0x0000; + for($i=0;$i> 16; + $lo = $lo & 0xFFFF; + $hi = $hi & 0xFFFF; + } + return array($hi, $lo); + } + + function get_table_pos($tag) { + $offset = $this->tables[$tag]['offset']; + $length = $this->tables[$tag]['length']; + return array($offset, $length); + } + + function seek($pos) { + $this->_pos = $pos; + fseek($this->fh,$this->_pos); + } + + function skip($delta) { + $this->_pos = $this->_pos + $delta; + fseek($this->fh,$this->_pos); + } + + function seek_table($tag, $offset_in_table = 0) { + $tpos = $this->get_table_pos($tag); + $this->_pos = $tpos[0] + $offset_in_table; + fseek($this->fh, $this->_pos); + return $this->_pos; + } + + function read_tag() { + $this->_pos += 4; + return fread($this->fh,4); + } + + function read_short() { + $this->_pos += 2; + $s = fread($this->fh,2); + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { $a = ($a - (1 << 16)) ; } + return $a; + } + + function unpack_short($s) { + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { + $a = ($a - (1 << 16)); + } + return $a; + } + + function read_ushort() { + $this->_pos += 2; + $s = fread($this->fh,2); + return (ord($s[0])<<8) + ord($s[1]); + } + + function read_ulong() { + $this->_pos += 4; + $s = fread($this->fh,4); + // if large uInt32 as an integer, PHP converts it to -ve + return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24 + } + + function get_ushort($pos) { + fseek($this->fh,$pos); + $s = fread($this->fh,2); + return (ord($s[0])<<8) + ord($s[1]); + } + + function get_ulong($pos) { + fseek($this->fh,$pos); + $s = fread($this->fh,4); + // iF large uInt32 as an integer, PHP converts it to -ve + return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24 + } + + function pack_short($val) { + if ($val<0) { + $val = abs($val); + $val = ~$val; + $val += 1; + } + return pack("n",$val); + } + + function splice($stream, $offset, $value) { + return substr($stream,0,$offset) . $value . substr($stream,$offset+strlen($value)); + } + + function _set_ushort($stream, $offset, $value) { + $up = pack("n", $value); + return $this->splice($stream, $offset, $up); + } + + function _set_short($stream, $offset, $val) { + if ($val<0) { + $val = abs($val); + $val = ~$val; + $val += 1; + } + $up = pack("n",$val); + return $this->splice($stream, $offset, $up); + } + + function get_chunk($pos, $length) { + fseek($this->fh,$pos); + if ($length <1) { return ''; } + return (fread($this->fh,$length)); + } + + function get_table($tag) { + list($pos, $length) = $this->get_table_pos($tag); + if ($length == 0) { die('Truetype font ('.$this->filename.'): error reading table: '.$tag); } + fseek($this->fh,$pos); + return (fread($this->fh,$length)); + } + + function add($tag, $data) { + if ($tag == 'head') { + $data = $this->splice($data, 8, "\0\0\0\0"); + } + $this->otables[$tag] = $data; + } + + + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// + + function extractInfo() { + /////////////////////////////////// + // name - Naming table + /////////////////////////////////// + $this->sFamilyClass = 0; + $this->sFamilySubClass = 0; + + $name_offset = $this->seek_table("name"); + $format = $this->read_ushort(); + if ($format != 0) + die("Unknown name table format ".$format); + $numRecords = $this->read_ushort(); + $string_data_offset = $name_offset + $this->read_ushort(); + $names = array(1=>'',2=>'',3=>'',4=>'',6=>''); + $K = array_keys($names); + $nameCount = count($names); + for ($i=0;$i<$numRecords; $i++) { + $platformId = $this->read_ushort(); + $encodingId = $this->read_ushort(); + $languageId = $this->read_ushort(); + $nameId = $this->read_ushort(); + $length = $this->read_ushort(); + $offset = $this->read_ushort(); + if (!in_array($nameId,$K)) continue; + $N = ''; + if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name + $opos = $this->_pos; + $this->seek($string_data_offset + $offset); + if ($length % 2 != 0) + die("PostScript name is UTF-16BE string of odd length"); + $length /= 2; + $N = ''; + while ($length > 0) { + $char = $this->read_ushort(); + $N .= (chr($char)); + $length -= 1; + } + $this->_pos = $opos; + $this->seek($opos); + } + else if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name + $opos = $this->_pos; + $N = $this->get_chunk($string_data_offset + $offset, $length); + $this->_pos = $opos; + $this->seek($opos); + } + if ($N && $names[$nameId]=='') { + $names[$nameId] = $N; + $nameCount -= 1; + if ($nameCount==0) break; + } + } + if ($names[6]) + $psName = $names[6]; + else if ($names[4]) + $psName = preg_replace('/ /','-',$names[4]); + else if ($names[1]) + $psName = preg_replace('/ /','-',$names[1]); + else + $psName = ''; + if (!$psName) + die("Could not find PostScript font name"); + $this->name = $psName; + if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } + if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } + if ($names[4]) { $this->fullName = $names[4]; } else { $this->fullName = $psName; } + if ($names[3]) { $this->uniqueFontID = $names[3]; } else { $this->uniqueFontID = $psName; } + if ($names[6]) { $this->fullName = $names[6]; } + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + $this->skip(18); + $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); + $scale = 1000 / $unitsPerEm; + $this->skip(16); + $xMin = $this->read_short(); + $yMin = $this->read_short(); + $xMax = $this->read_short(); + $yMax = $this->read_short(); + $this->bbox = array(($xMin*$scale), ($yMin*$scale), ($xMax*$scale), ($yMax*$scale)); + $this->skip(3*2); + $indexToLocFormat = $this->read_ushort(); + $glyphDataFormat = $this->read_ushort(); + if ($glyphDataFormat != 0) + die('Unknown glyph data format '.$glyphDataFormat); + + /////////////////////////////////// + // hhea metrics table + /////////////////////////////////// + // ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility + if (isset($this->tables["hhea"])) { + $this->seek_table("hhea"); + $this->skip(4); + $hheaAscender = $this->read_short(); + $hheaDescender = $this->read_short(); + $this->ascent = ($hheaAscender *$scale); + $this->descent = ($hheaDescender *$scale); + } + + /////////////////////////////////// + // OS/2 - OS/2 and Windows metrics table + /////////////////////////////////// + if (isset($this->tables["OS/2"])) { + $this->seek_table("OS/2"); + $version = $this->read_ushort(); + $this->skip(2); + $usWeightClass = $this->read_ushort(); + $this->skip(2); + $fsType = $this->read_ushort(); + if ($fsType == 0x0002 || ($fsType & 0x0300) != 0) { + die('ERROR - Font file '.$this->filename.' cannot be embedded due to copyright restrictions.'); + $this->restrictedUse = true; + } + $this->skip(20); + $sF = $this->read_short(); + $this->sFamilyClass = ($sF >> 8); + $this->sFamilySubClass = ($sF & 0xFF); + $this->_pos += 10; //PANOSE = 10 byte length + $panose = fread($this->fh,10); + $this->skip(26); + $sTypoAscender = $this->read_short(); + $sTypoDescender = $this->read_short(); + if (!$this->ascent) $this->ascent = ($sTypoAscender*$scale); + if (!$this->descent) $this->descent = ($sTypoDescender*$scale); + if ($version > 1) { + $this->skip(16); + $sCapHeight = $this->read_short(); + $this->capHeight = ($sCapHeight*$scale); + } + else { + $this->capHeight = $this->ascent; + } + } + else { + $usWeightClass = 500; + if (!$this->ascent) $this->ascent = ($yMax*$scale); + if (!$this->descent) $this->descent = ($yMin*$scale); + $this->capHeight = $this->ascent; + } + $this->stemV = 50 + intval(pow(($usWeightClass / 65.0),2)); + + /////////////////////////////////// + // post - PostScript table + /////////////////////////////////// + $this->seek_table("post"); + $this->skip(4); + $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; + $this->underlinePosition = $this->read_short() * $scale; + $this->underlineThickness = $this->read_short() * $scale; + $isFixedPitch = $this->read_ulong(); + + $this->flags = 4; + + if ($this->italicAngle!= 0) + $this->flags = $this->flags | 64; + if ($usWeightClass >= 600) + $this->flags = $this->flags | 262144; + if ($isFixedPitch) + $this->flags = $this->flags | 1; + + /////////////////////////////////// + // hhea - Horizontal header table + /////////////////////////////////// + $this->seek_table("hhea"); + $this->skip(32); + $metricDataFormat = $this->read_ushort(); + if ($metricDataFormat != 0) + die('Unknown horizontal metric data format '.$metricDataFormat); + $numberOfHMetrics = $this->read_ushort(); + if ($numberOfHMetrics == 0) + die('Number of horizontal metrics is 0'); + + /////////////////////////////////// + // maxp - Maximum profile table + /////////////////////////////////// + $this->seek_table("maxp"); + $this->skip(4); + $numGlyphs = $this->read_ushort(); + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + if (!$unicode_cmap_offset) $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + if (!$unicode_cmap_offset) + die('Font ('.$this->filename .') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); + + + $glyphToChar = []; + $charToGlyph = []; + $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph ); + + /////////////////////////////////// + // hmtx - Horizontal metrics table + /////////////////////////////////// + $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); + + } + + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + + + function makeSubset($file, &$subset) { + $this->filename = $file; + $this->fh = fopen($file ,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = []; + $this->charToGlyph = []; + $this->tables = []; + $this->otables = []; + $this->ascent = 0; + $this->descent = 0; + $this->skip(4); + $this->maxUni = 0; + $this->readTableDirectory(); + + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + $this->skip(50); + $indexToLocFormat = $this->read_ushort(); + $glyphDataFormat = $this->read_ushort(); + + /////////////////////////////////// + // hhea - Horizontal header table + /////////////////////////////////// + $this->seek_table("hhea"); + $this->skip(32); + $metricDataFormat = $this->read_ushort(); + $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); + + /////////////////////////////////// + // maxp - Maximum profile table + /////////////////////////////////// + $this->seek_table("maxp"); + $this->skip(4); + $numGlyphs = $this->read_ushort(); + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + + if (!$unicode_cmap_offset) + die('Font ('.$this->filename .') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); + + + $glyphToChar = []; + $charToGlyph = []; + $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph ); + + $this->charToGlyph = $charToGlyph; + + /////////////////////////////////// + // hmtx - Horizontal metrics table + /////////////////////////////////// + $scale = 1; // not used + $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); + + /////////////////////////////////// + // loca - Index to location + /////////////////////////////////// + $this->getLOCA($indexToLocFormat, $numGlyphs); + + $subsetglyphs = array(0=>0); + $subsetCharToGlyph = []; + foreach($subset AS $code) { + if (isset($this->charToGlyph[$code])) { + $subsetglyphs[$this->charToGlyph[$code]] = $code; // Old Glyph ID => Unicode + $subsetCharToGlyph[$code] = $this->charToGlyph[$code]; // Unicode to old GlyphID + + } + $this->maxUni = max($this->maxUni, $code); + } + + list($start,$dummy) = $this->get_table_pos('glyf'); + + $glyphSet = []; + ksort($subsetglyphs); + $n = 0; + $fsLastCharIndex = 0; // maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1. + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + $fsLastCharIndex = max($fsLastCharIndex, $uni); + $glyphSet[$originalGlyphIdx] = $n; // old glyphID to new glyphID + $n++; + } + + ksort($subsetCharToGlyph); + foreach($subsetCharToGlyph AS $uni => $originalGlyphIdx) { + $codeToGlyph[$uni] = $glyphSet[$originalGlyphIdx] ; + } + $this->codeToGlyph = $codeToGlyph; + + ksort($subsetglyphs); + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + $this->getGlyphs($originalGlyphIdx, $start, $glyphSet, $subsetglyphs); + } + + $numGlyphs = $numberOfHMetrics = count($subsetglyphs ); + + //tables copied from the original + $tags = array ('name'); + foreach($tags AS $tag) { $this->add($tag, $this->get_table($tag)); } + $tags = array ('cvt ', 'fpgm', 'prep', 'gasp'); + foreach($tags AS $tag) { + if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } + } + + // post - PostScript + $opost = $this->get_table('post'); + $post = "\x00\x03\x00\x00" . substr($opost,4,12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + $this->add('post', $post); + + // Sort CID2GID map into segments of contiguous codes + ksort($codeToGlyph); + unset($codeToGlyph[0]); + //unset($codeToGlyph[65535]); + $rangeid = 0; + $range = []; + $prevcid = -2; + $prevglidx = -1; + // for each character + foreach ($codeToGlyph as $cid => $glidx) { + if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { + $range[$rangeid][] = $glidx; + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = []; + $range[$rangeid][] = $glidx; + } + $prevcid = $cid; + $prevglidx = $glidx; + } + + // cmap - Character to glyph mapping - Format 4 (MS / ) + $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $segCount ) { + $searchRange = $searchRange * 2; + $entrySelector = $entrySelector + 1; + } + $searchRange = $searchRange * 2; + $rangeShift = $segCount * 2 - $searchRange; + $length = 16 + (8*$segCount ) + ($numGlyphs+1); + $cmap = array(0, 1, // Index : version, number of encoding subtables + 3, 1, // Encoding Subtable : platform (MS=3), encoding (Unicode) + 0, 12, // Encoding Subtable : offset (hi,lo) + 4, $length, 0, // Format 4 Mapping subtable: format, length, language + $segCount*2, + $searchRange, + $entrySelector, + $rangeShift); + + // endCode(s) + foreach($range AS $start=>$subrange) { + $endCode = $start + (count($subrange)-1); + $cmap[] = $endCode; // endCode(s) + } + $cmap[] = 0xFFFF; // endCode of last Segment + $cmap[] = 0; // reservedPad + + // startCode(s) + foreach($range AS $start=>$subrange) { + $cmap[] = $start; // startCode(s) + } + $cmap[] = 0xFFFF; // startCode of last Segment + // idDelta(s) + foreach($range AS $start=>$subrange) { + $idDelta = -($start-$subrange[0]); + $n += count($subrange); + $cmap[] = $idDelta; // idDelta(s) + } + $cmap[] = 1; // idDelta of last Segment + // idRangeOffset(s) + foreach($range AS $subrange) { + $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 + + } + $cmap[] = 0; // idRangeOffset of last Segment + foreach($range AS $subrange) { + foreach($subrange AS $glidx) { + $cmap[] = $glidx; + } + } + $cmap[] = 0; // Mapping for last character + $cmapstr = ''; + foreach($cmap AS $cm) { $cmapstr .= pack("n",$cm); } + $this->add('cmap', $cmapstr); + + + // glyf - Glyph data + list($glyfOffset,$glyfLength) = $this->get_table_pos('glyf'); + if ($glyfLength < $this->maxStrLenRead) { + $glyphData = $this->get_table('glyf'); + } + + $offsets = []; + $glyf = ''; + $pos = 0; + + $hmtxstr = ''; + $xMinT = 0; + $yMinT = 0; + $xMaxT = 0; + $yMaxT = 0; + $advanceWidthMax = 0; + $minLeftSideBearing = 0; + $minRightSideBearing = 0; + $xMaxExtent = 0; + $maxPoints = 0; // points in non-compound glyph + $maxContours = 0; // contours in non-compound glyph + $maxComponentPoints = 0; // points in compound glyph + $maxComponentContours = 0; // contours in compound glyph + $maxComponentElements = 0; // number of glyphs referenced at top level + $maxComponentDepth = 0; // levels of recursion, set to 0 if font has only simple glyphs + $this->glyphdata = []; + + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + // hmtx - Horizontal Metrics + $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); + $hmtxstr .= $hm; + + $offsets[] = $pos; + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + if ($glyfLength < $this->maxStrLenRead) { + $data = substr($glyphData,$glyphPos,$glyphLen); + } + else { + if ($glyphLen > 0) $data = $this->get_chunk($glyfOffset+$glyphPos,$glyphLen); + else $data = ''; + } + + if ($glyphLen > 0) { + $up = unpack("n", substr($data,0,2)); + } + + if ($glyphLen > 2 && ($up[1] & (1 << 15)) ) { // If number of contours <= -1 i.e. composiste glyph + $pos_in_glyph = 10; + $flags = GF_MORE; + $nComponentElements = 0; + while ($flags & GF_MORE) { + $nComponentElements += 1; // number of glyphs referenced at top level + $up = unpack("n", substr($data,$pos_in_glyph,2)); + $flags = $up[1]; + $up = unpack("n", substr($data,$pos_in_glyph+2,2)); + $glyphIdx = $up[1]; + $this->glyphdata[$originalGlyphIdx]['compGlyphs'][] = $glyphIdx; + $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); + $pos_in_glyph += 4; + if ($flags & GF_WORDS) { $pos_in_glyph += 4; } + else { $pos_in_glyph += 2; } + if ($flags & GF_SCALE) { $pos_in_glyph += 2; } + else if ($flags & GF_XYSCALE) { $pos_in_glyph += 4; } + else if ($flags & GF_TWOBYTWO) { $pos_in_glyph += 8; } + } + $maxComponentElements = max($maxComponentElements, $nComponentElements); + } + + $glyf .= $data; + $pos += $glyphLen; + if ($pos % 4 != 0) { + $padding = 4 - ($pos % 4); + $glyf .= str_repeat("\0",$padding); + $pos += $padding; + } + } + + $offsets[] = $pos; + $this->add('glyf', $glyf); + + // hmtx - Horizontal Metrics + $this->add('hmtx', $hmtxstr); + + // loca - Index to location + $locastr = ''; + if ((($pos + 1) >> 1) > 0xFFFF) { + $indexToLocFormat = 1; // long format + foreach($offsets AS $offset) { $locastr .= pack("N",$offset); } + } + else { + $indexToLocFormat = 0; // short format + foreach($offsets AS $offset) { $locastr .= pack("n",($offset/2)); } + } + $this->add('loca', $locastr); + + // head - Font header + $head = $this->get_table('head'); + $head = $this->_set_ushort($head, 50, $indexToLocFormat); + $this->add('head', $head); + + + // hhea - Horizontal Header + $hhea = $this->get_table('hhea'); + $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); + $this->add('hhea', $hhea); + + // maxp - Maximum Profile + $maxp = $this->get_table('maxp'); + $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); + $this->add('maxp', $maxp); + + + // OS/2 - OS/2 + $os2 = $this->get_table('OS/2'); + $this->add('OS/2', $os2 ); + + fclose($this->fh); + + // Put the TTF file together + $stm = ''; + $this->endTTFile($stm); + return $stm ; + } + + ////////////////////////////////////////////////////////////////////////////////// + // Recursively get composite glyph data + function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) { + $depth++; + $maxdepth = max($maxdepth, $depth); + if (count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { + foreach($this->glyphdata[$originalGlyphIdx]['compGlyphs'] AS $glyphIdx) { + $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); + } + } + else if (($this->glyphdata[$originalGlyphIdx]['nContours'] > 0) && $depth > 0) { // simple + $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; + $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; + } + $depth--; + } + + + ////////////////////////////////////////////////////////////////////////////////// + // Recursively get composite glyphs + function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) { + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + if (!$glyphLen) { + return; + } + $this->seek($start + $glyphPos); + $numberOfContours = $this->read_short(); + if ($numberOfContours < 0) { + $this->skip(8); + $flags = GF_MORE; + while ($flags & GF_MORE) { + $flags = $this->read_ushort(); + $glyphIdx = $this->read_ushort(); + if (!isset($glyphSet[$glyphIdx])) { + $glyphSet[$glyphIdx] = count($subsetglyphs); // old glyphID to new glyphID + $subsetglyphs[$glyphIdx] = true; + } + $savepos = ftell($this->fh); + $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); + $this->seek($savepos); + if ($flags & GF_WORDS) + $this->skip(4); + else + $this->skip(2); + if ($flags & GF_SCALE) + $this->skip(2); + else if ($flags & GF_XYSCALE) + $this->skip(4); + else if ($flags & GF_TWOBYTWO) + $this->skip(8); + } + } + } + + ////////////////////////////////////////////////////////////////////////////////// + + function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) { + $start = $this->seek_table("hmtx"); + $aw = 0; + $this->charWidths = str_pad('', 256*256*2, "\x00"); + $nCharWidths = 0; + if (($numberOfHMetrics*4) < $this->maxStrLenRead) { + $data = $this->get_chunk($start,($numberOfHMetrics*4)); + $arr = unpack("n*", $data); + } + else { $this->seek($start); } + for( $glyph=0; $glyph<$numberOfHMetrics; $glyph++) { + + if (($numberOfHMetrics*4) < $this->maxStrLenRead) { + $aw = $arr[($glyph*2)+1]; + } + else { + $aw = $this->read_ushort(); + $lsb = $this->read_ushort(); + } + if (isset($glyphToChar[$glyph]) || $glyph == 0) { + + if ($aw >= (1 << 15) ) { $aw = 0; } // 1.03 Some (arabic) fonts have -ve values for width + // although should be unsigned value - comes out as e.g. 65108 (intended -50) + if ($glyph == 0) { + $this->defaultWidth = $scale*$aw; + continue; + } + foreach($glyphToChar[$glyph] AS $char) { + if ($char != 0 && $char != 65535) { + $w = intval(round($scale*$aw)); + if ($w == 0) { $w = 65535; } + if ($char < 196608) { + $this->charWidths[$char*2] = chr($w >> 8); + $this->charWidths[$char*2 + 1] = chr($w & 0xFF); + $nCharWidths++; + } + } + } + } + } + $data = $this->get_chunk(($start+$numberOfHMetrics*4),($numGlyphs*2)); + $arr = unpack("n*", $data); + $diff = $numGlyphs-$numberOfHMetrics; + for( $pos=0; $pos<$diff; $pos++) { + $glyph = $pos + $numberOfHMetrics; + if (isset($glyphToChar[$glyph])) { + foreach($glyphToChar[$glyph] AS $char) { + if ($char != 0 && $char != 65535) { + $w = intval(round($scale*$aw)); + if ($w == 0) { $w = 65535; } + if ($char < 196608) { + $this->charWidths[$char*2] = chr($w >> 8); + $this->charWidths[$char*2 + 1] = chr($w & 0xFF); + $nCharWidths++; + } + } + } + } + } + // NB 65535 is a set width of 0 + // First bytes define number of chars in font + $this->charWidths[0] = chr($nCharWidths >> 8); + $this->charWidths[1] = chr($nCharWidths & 0xFF); + } + + function getHMetric($numberOfHMetrics, $gid) { + $start = $this->seek_table("hmtx"); + if ($gid < $numberOfHMetrics) { + $this->seek($start+($gid*4)); + $hm = fread($this->fh,4); + } + else { + $this->seek($start+(($numberOfHMetrics-1)*4)); + $hm = fread($this->fh,2); + $this->seek($start+($numberOfHMetrics*2)+($gid*2)); + $hm .= fread($this->fh,2); + } + return $hm; + } + + function getLOCA($indexToLocFormat, $numGlyphs) { + $start = $this->seek_table('loca'); + $this->glyphPos = []; + if ($indexToLocFormat == 0) { + $data = $this->get_chunk($start,($numGlyphs*2)+2); + $arr = unpack("n*", $data); + for ($n=0; $n<=$numGlyphs; $n++) { + $this->glyphPos[] = ($arr[$n+1] * 2); + } + } + else if ($indexToLocFormat == 1) { + $data = $this->get_chunk($start,($numGlyphs*4)+4); + $arr = unpack("N*", $data); + for ($n=0; $n<=$numGlyphs; $n++) { + $this->glyphPos[] = ($arr[$n+1]); + } + } + else + die('Unknown location table format '.$indexToLocFormat); + } + + + // CMAP Format 4 + function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph ) { + $this->maxUniChar = 0; + $this->seek($unicode_cmap_offset + 2); + $length = $this->read_ushort(); + $limit = $unicode_cmap_offset + $length; + $this->skip(2); + + $segCount = $this->read_ushort() / 2; + $this->skip(6); + $endCount = []; + for($i=0; $i<$segCount; $i++) { $endCount[] = $this->read_ushort(); } + $this->skip(2); + $startCount = []; + for($i=0; $i<$segCount; $i++) { $startCount[] = $this->read_ushort(); } + $idDelta = []; + for($i=0; $i<$segCount; $i++) { $idDelta[] = $this->read_short(); } // ???? was unsigned short + $idRangeOffset_start = $this->_pos; + $idRangeOffset = []; + for($i=0; $i<$segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } + + for ($n=0;$n<$segCount;$n++) { + $endpoint = ($endCount[$n] + 1); + for ($unichar=$startCount[$n];$unichar<$endpoint;$unichar++) { + if ($idRangeOffset[$n] == 0) + $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; + else { + $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; + $offset = $idRangeOffset_start + 2 * $n + $offset; + if ($offset >= $limit) + $glyph = 0; + else { + $glyph = $this->get_ushort($offset); + if ($glyph != 0) + $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; + } + } + $charToGlyph[$unichar] = $glyph; + if ($unichar < 196608) { $this->maxUniChar = max($unichar,$this->maxUniChar); } + $glyphToChar[$glyph][] = $unichar; + } + } + } + + + // Put the TTF file together + function endTTFile(&$stm) { + $stm = ''; + $numTables = count($this->otables); + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $numTables) { + $searchRange = $searchRange * 2; + $entrySelector = $entrySelector + 1; + } + $searchRange = $searchRange * 16; + $rangeShift = $numTables * 16 - $searchRange; + + // Header + if (_TTF_MAC_HEADER) { + $stm .= (pack("Nnnnn", 0x74727565, $numTables, $searchRange, $entrySelector, $rangeShift)); // Mac + } + else { + $stm .= (pack("Nnnnn", 0x00010000, $numTables, $searchRange, $entrySelector, $rangeShift)); // Windows + } + + // Table directory + $tables = $this->otables; + + ksort ($tables); + $offset = 12 + $numTables * 16; + foreach ($tables AS $tag=>$data) { + if ($tag == 'head') { $head_start = $offset; } + $stm .= $tag; + $checksum = $this->calcChecksum($data); + $stm .= pack("nn", $checksum[0],$checksum[1]); + $stm .= pack("NN", $offset, strlen($data)); + $paddedLength = (strlen($data)+3)&~3; + $offset = $offset + $paddedLength; + } + + // Table data + foreach ($tables AS $tag=>$data) { + $data .= "\0\0\0"; + $stm .= substr($data,0,(strlen($data)&~3)); + } + + $checksum = $this->calcChecksum($stm); + $checksum = $this->sub32(array(0xB1B0,0xAFBA), $checksum); + $chk = pack("nn", $checksum[0],$checksum[1]); + $stm = $this->splice($stm,($head_start + 8),$chk); + return $stm ; + } +} \ No newline at end of file diff --git a/app/api/TFPDF/font/zapfdingbats.php b/app/api/TFPDF/font/zapfdingbats.php new file mode 100755 index 0000000..afef4d3 --- /dev/null +++ b/app/api/TFPDF/font/zapfdingbats.php @@ -0,0 +1,19 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +?> diff --git a/app/api/TFPDF/tfpdf.php b/app/api/TFPDF/tfpdf.php new file mode 100755 index 0000000..4de86b2 --- /dev/null +++ b/app/api/TFPDF/tfpdf.php @@ -0,0 +1,2378 @@ + * +* Tycho Veltmeijer (versions 1.30+) * +* License: LGPL * +*******************************************************************************/ + +define('tFPDF_VERSION','1.32'); + +class tFPDF +{ +protected $unifontSubset; +protected $page; // current page number +protected $n; // current object number +protected $offsets; // array of object offsets +protected $buffer; // buffer holding in-memory PDF +protected $pages; // array containing pages +protected $state; // current document state +protected $compress; // compression flag +protected $k; // scale factor (number of points in user unit) +protected $DefOrientation; // default orientation +protected $CurOrientation; // current orientation +protected $StdPageSizes; // standard page sizes +protected $DefPageSize; // default page size +protected $CurPageSize; // current page size +protected $CurRotation; // current page rotation +protected $PageInfo; // page-related data +protected $wPt, $hPt; // dimensions of current page in points +protected $w, $h; // dimensions of current page in user unit +protected $lMargin; // left margin +protected $tMargin; // top margin +protected $rMargin; // right margin +protected $bMargin; // page break margin +protected $cMargin; // cell margin +protected $x, $y; // current position in user unit +protected $lasth; // height of last printed cell +protected $LineWidth; // line width in user unit +protected $fontpath; // path containing fonts +protected $CoreFonts; // array of core font names +protected $fonts; // array of used fonts +protected $FontFiles; // array of font files +protected $encodings; // array of encodings +protected $cmaps; // array of ToUnicode CMaps +protected $FontFamily; // current font family +protected $FontStyle; // current font style +protected $underline; // underlining flag +protected $CurrentFont; // current font info +protected $FontSizePt; // current font size in points +protected $FontSize; // current font size in user unit +protected $DrawColor; // commands for drawing color +protected $FillColor; // commands for filling color +protected $TextColor; // commands for text color +protected $ColorFlag; // indicates whether fill and text colors are different +protected $WithAlpha; // indicates whether alpha channel is used +protected $ws; // word spacing +protected $images; // array of used images +protected $PageLinks; // array of links in pages +protected $links; // array of internal links +protected $AutoPageBreak; // automatic page breaking +protected $PageBreakTrigger; // threshold used to trigger page breaks +protected $InHeader; // flag set when processing header +protected $InFooter; // flag set when processing footer +protected $AliasNbPages; // alias for total number of pages +protected $ZoomMode; // zoom display mode +protected $LayoutMode; // layout display mode +protected $metadata; // document properties +protected $PDFVersion; // PDF version number + +/******************************************************************************* +* Public methods * +*******************************************************************************/ + +function __construct($orientation='P', $unit='mm', $size='A4') +{ + // Some checks + $this->_dochecks(); + // Initialization of properties + $this->state = 0; + $this->page = 0; + $this->n = 2; + $this->buffer = ''; + $this->pages = []; + $this->PageInfo = []; + $this->fonts = []; + $this->FontFiles = []; + $this->encodings = []; + $this->cmaps = []; + $this->images = []; + $this->links = []; + $this->InHeader = false; + $this->InFooter = false; + $this->lasth = 0; + $this->FontFamily = ''; + $this->FontStyle = ''; + $this->FontSizePt = 12; + $this->underline = false; + $this->DrawColor = '0 G'; + $this->FillColor = '0 g'; + $this->TextColor = '0 g'; + $this->ColorFlag = false; + $this->WithAlpha = false; + $this->ws = 0; + // Font path + if(defined('FPDF_FONTPATH')) + { + $this->fontpath = FPDF_FONTPATH; + if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\') + $this->fontpath .= '/'; + } + elseif(is_dir(dirname(__FILE__).'/font')) + $this->fontpath = dirname(__FILE__).'/font/'; + else + $this->fontpath = ''; + // Core fonts + $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats'); + // Scale factor + if($unit=='pt') + $this->k = 1; + elseif($unit=='mm') + $this->k = 72/25.4; + elseif($unit=='cm') + $this->k = 72/2.54; + elseif($unit=='in') + $this->k = 72; + else + $this->Error('Incorrect unit: '.$unit); + // Page sizes + $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + $size = $this->_getpagesize($size); + $this->DefPageSize = $size; + $this->CurPageSize = $size; + // Page orientation + $orientation = strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation = 'P'; + $this->w = $size[0]; + $this->h = $size[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation = 'L'; + $this->w = $size[1]; + $this->h = $size[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation = $this->DefOrientation; + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + // Page rotation + $this->CurRotation = 0; + // Page margins (1 cm) + $margin = 28.35/$this->k; + $this->SetMargins($margin,$margin); + // Interior cell margin (1 mm) + $this->cMargin = $margin/10; + // Line width (0.2 mm) + $this->LineWidth = .567/$this->k; + // Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + // Default display mode + $this->SetDisplayMode('default'); + // Enable compression + $this->SetCompression(true); + // Set default PDF version number + $this->PDFVersion = '1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + // Set left, top and right margins + $this->lMargin = $left; + $this->tMargin = $top; + if($right===null) + $right = $left; + $this->rMargin = $right; +} + +function SetLeftMargin($margin) +{ + // Set left margin + $this->lMargin = $margin; + if($this->page>0 && $this->x<$margin) + $this->x = $margin; +} + +function SetTopMargin($margin) +{ + // Set top margin + $this->tMargin = $margin; +} + +function SetRightMargin($margin) +{ + // Set right margin + $this->rMargin = $margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + // Set auto page break mode and triggering margin + $this->AutoPageBreak = $auto; + $this->bMargin = $margin; + $this->PageBreakTrigger = $this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='default') +{ + // Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode = $zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode = $layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + // Set page compression + if(function_exists('gzcompress')) + $this->compress = $compress; + else + $this->compress = false; +} + +function SetTitle($title, $isUTF8=false) +{ + // Title of document + $this->metadata['Title'] = $isUTF8 ? $title : utf8_encode($title); +} + +function SetAuthor($author, $isUTF8=false) +{ + // Author of document + $this->metadata['Author'] = $isUTF8 ? $author : utf8_encode($author); +} + +function SetSubject($subject, $isUTF8=false) +{ + // Subject of document + $this->metadata['Subject'] = $isUTF8 ? $subject : utf8_encode($subject); +} + +function SetKeywords($keywords, $isUTF8=false) +{ + // Keywords of document + $this->metadata['Keywords'] = $isUTF8 ? $keywords : utf8_encode($keywords); +} + +function SetCreator($creator, $isUTF8=false) +{ + // Creator of document + $this->metadata['Creator'] = $isUTF8 ? $creator : utf8_encode($creator); +} + +function AliasNbPages($alias='{nb}') +{ + // Define an alias for total number of pages + $this->AliasNbPages = $alias; +} + +function Error($msg) +{ + // Fatal error + throw new Exception('FPDF error: '.$msg); +} + +function Close() +{ + // Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + // Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $size='', $rotation=0) +{ + // Start a new page + if($this->state==3) + $this->Error('The document is closed'); + $family = $this->FontFamily; + $style = $this->FontStyle.($this->underline ? 'U' : ''); + $fontsize = $this->FontSizePt; + $lw = $this->LineWidth; + $dc = $this->DrawColor; + $fc = $this->FillColor; + $tc = $this->TextColor; + $cf = $this->ColorFlag; + if($this->page>0) + { + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + } + // Start new page + $this->_beginpage($orientation,$size,$rotation); + // Set line cap style to square + $this->_out('2 J'); + // Set line width + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + // Set font + if($family) + $this->SetFont($family,$style,$fontsize); + // Set colors + $this->DrawColor = $dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor = $fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor = $tc; + $this->ColorFlag = $cf; + // Page header + $this->InHeader = true; + $this->Header(); + $this->InHeader = false; + // Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + // Restore font + if($family) + $this->SetFont($family,$style,$fontsize); + // Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor = $dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor = $fc; + $this->_out($fc); + } + $this->TextColor = $tc; + $this->ColorFlag = $cf; +} + +function Header() +{ + // To be implemented in your own inherited class +} + +function Footer() +{ + // To be implemented in your own inherited class +} + +function PageNo() +{ + // Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + // Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor = sprintf('%.3F G',$r/255); + else + $this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + // Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor = sprintf('%.3F g',$r/255); + else + $this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + // Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor = sprintf('%.3F g',$r/255); + else + $this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + // Get width of a string in the current font + $s = (string)$s; + $cw = &$this->CurrentFont['cw']; + $w=0; + if ($this->unifontSubset) { + $unicode = $this->UTF8StringToArray($s); + foreach($unicode as $char) { + if (isset($cw[2*$char])) { $w += (ord($cw[2*$char])<<8) + ord($cw[2*$char+1]); } + else if($char>0 && $char<128 && isset($cw[chr($char)])) { $w += $cw[chr($char)]; } + else if(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + else if(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + } + else { + $l = strlen($s); + for($i=0;$i<$l;$i++) + $w += $cw[$s[$i]]; + } + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + // Set line width + $this->LineWidth = $width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + // Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + // Draw a rectangle + if($style=='F') + $op = 'f'; + elseif($style=='FD' || $style=='DF') + $op = 'B'; + else + $op = 'S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='', $uni=false) +{ + // Add a TrueType, OpenType or Type1 font + $family = strtolower($family); + $style = strtoupper($style); + if($style=='IB') + $style = 'BI'; + if($file=='') { + if ($uni) { + $file = str_replace(' ','',$family).strtolower($style).'.ttf'; + } + else { + $file = str_replace(' ','',$family).strtolower($style).'.php'; + } + } + $fontkey = $family.$style; + if(isset($this->fonts[$fontkey])) + return; + if ($uni) { + if (defined("_SYSTEM_TTFONTS") && file_exists(_SYSTEM_TTFONTS.$file )) { $ttffilename = _SYSTEM_TTFONTS.$file ; } + else { $ttffilename = $this->fontpath.'unifont/'.$file ; } + $unifilename = $this->fontpath.'unifont/'.strtolower(substr($file ,0,(strpos($file ,'.')))); + $name = ''; + $originalsize = 0; + $ttfstat = stat($ttffilename); + if (file_exists($unifilename.'.mtx.php')) { + include($unifilename.'.mtx.php'); + } + if (!isset($type) || !isset($name) || $originalsize != $ttfstat['size']) { + $ttffile = $ttffilename; + require_once($this->fontpath.'unifont/ttfonts.php'); + $ttf = new TTFontFile(); + $ttf->getMetrics($ttffile); + $cw = $ttf->charWidths; + $name = preg_replace('/[ ()]/','',$ttf->fullName); + + $desc= array('Ascent'=>round($ttf->ascent), + 'Descent'=>round($ttf->descent), + 'CapHeight'=>round($ttf->capHeight), + 'Flags'=>$ttf->flags, + 'FontBBox'=>'['.round($ttf->bbox[0])." ".round($ttf->bbox[1])." ".round($ttf->bbox[2])." ".round($ttf->bbox[3]).']', + 'ItalicAngle'=>$ttf->italicAngle, + 'StemV'=>round($ttf->stemV), + 'MissingWidth'=>round($ttf->defaultWidth)); + $up = round($ttf->underlinePosition); + $ut = round($ttf->underlineThickness); + $originalsize = $ttfstat['size']+0; + $type = 'TTF'; + // Generate metrics .php file + $s='"; + if (is_writable(dirname($this->fontpath.'unifont/'.'x'))) { + $fh = fopen($unifilename.'.mtx.php',"w"); + fwrite($fh,$s,strlen($s)); + fclose($fh); + $fh = fopen($unifilename.'.cw.dat',"wb"); + fwrite($fh,$cw,strlen($cw)); + fclose($fh); + @unlink($unifilename.'.cw127.php'); + } + unset($ttf); + } + else { + $cw = @file_get_contents($unifilename.'.cw.dat'); + } + $i = count($this->fonts)+1; + if(!empty($this->AliasNbPages)) + $sbarr = range(0,57); + else + $sbarr = range(0,32); + $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subset'=>$sbarr, 'unifilename'=>$unifilename); + + $this->FontFiles[$fontkey]=array('length1'=>$originalsize, 'type'=>"TTF", 'ttffile'=>$ttffile); + $this->FontFiles[$file]=array('type'=>"TTF"); + unset($cw); + } + else { + $info = $this->_loadfont($file); + $info['i'] = count($this->fonts)+1; + if(!empty($info['file'])) + { + // Embedded font + if($info['type']=='TrueType') + $this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']); + else + $this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']); + } + $this->fonts[$fontkey] = $info; + } +} + +function SetFont($family, $style='', $size=0) +{ + // Select a font; size given in points + if($family=='') + $family = $this->FontFamily; + else + $family = strtolower($family); + $style = strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline = true; + $style = str_replace('U','',$style); + } + else + $this->underline = false; + if($style=='IB') + $style = 'BI'; + if($size==0) + $size = $this->FontSizePt; + // Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + + // Test if font is already loaded + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + { + // Test if one of the core fonts + if($family=='arial') + $family = 'helvetica'; + if(in_array($family,$this->CoreFonts)) + { + if($family=='symbol' || $family=='zapfdingbats') + $style = ''; + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + $this->AddFont($family,$style); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + // Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + $this->CurrentFont = &$this->fonts[$fontkey]; + if ($this->fonts[$fontkey]['type']=='TTF') { $this->unifontSubset = true; } + else { $this->unifontSubset = false; } + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + // Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + // Create a new internal link + $n = count($this->links)+1; + $this->links[$n] = array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + // Set destination of internal link + if($y==-1) + $y = $this->y; + if($page==-1) + $page = $this->page; + $this->links[$link] = array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + // Put a link on the page + $this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + // Output a string + $txt = (string)$txt; + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + if ($this->unifontSubset) + { + $txt2 = '('.$this->_escape($this->UTF8ToUTF16BE($txt, false)).')'; + foreach($this->UTF8StringToArray($txt) as $uni) + $this->CurrentFont['subset'][$uni] = $uni; + } + else + $txt2 = '('.$this->_escape($txt).')'; + $s = sprintf('BT %.2F %.2F Td %s Tj ET',$x*$this->k,($this->h-$y)*$this->k,$txt2); + if($this->underline && $txt!='') + $s .= ' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s = 'q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + // Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + // Output a cell + $txt = (string)$txt; + $k = $this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x = $this->x; + $ws = $this->ws; + if($ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation); + $this->x = $x; + if($ws>0) + { + $this->ws = $ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $s = ''; + if($fill || $border==1) + { + if($fill) + $op = ($border==1) ? 'B' : 'f'; + else + $op = 'S'; + $s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x = $this->x; + $y = $this->y; + if(strpos($border,'L')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + if($align=='R') + $dx = $w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx = ($w-$this->GetStringWidth($txt))/2; + else + $dx = $this->cMargin; + if($this->ColorFlag) + $s .= 'q '.$this->TextColor.' '; + // If multibyte, Tw has no effect - do word spacing using an adjustment before each space + if ($this->ws && $this->unifontSubset) { + foreach($this->UTF8StringToArray($txt) as $uni) + $this->CurrentFont['subset'][$uni] = $uni; + $space = $this->_escape($this->UTF8ToUTF16BE(' ', false)); + $s .= sprintf('BT 0 Tw %.2F %.2F Td [',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k); + $t = explode(' ',$txt); + $numt = count($t); + for($i=0;$i<$numt;$i++) { + $tx = $t[$i]; + $tx = '('.$this->_escape($this->UTF8ToUTF16BE($tx, false)).')'; + $s .= sprintf('%s ',$tx); + if (($i+1)<$numt) { + $adj = -($this->ws*$this->k)*1000/$this->FontSizePt; + $s .= sprintf('%d(%s) ',$adj,$space); + } + } + $s .= '] TJ'; + $s .= ' ET'; + } + else { + if ($this->unifontSubset) + { + $txt2 = '('.$this->_escape($this->UTF8ToUTF16BE($txt, false)).')'; + foreach($this->UTF8StringToArray($txt) as $uni) + $this->CurrentFont['subset'][$uni] = $uni; + } + else + $txt2='('.$this->_escape($txt).')'; + $s .= sprintf('BT %.2F %.2F Td %s Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + } + if($this->underline) + $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s .= ' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth = $h; + if($ln>0) + { + // Go to next line + $this->y += $h; + if($ln==1) + $this->x = $this->lMargin; + } + else + $this->x += $w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + // Output text with automatic or explicit line breaks + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $cw = &$this->CurrentFont['cw']; + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin); + //$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',(string)$txt); + if ($this->unifontSubset) { + $nb=mb_strlen($s, 'utf-8'); + while($nb>0 && mb_substr($s,$nb-1,1,'utf-8')=="\n") $nb--; + } + else { + $nb = strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + } + $b = 0; + if($border) + { + if($border==1) + { + $border = 'LTRB'; + $b = 'LRT'; + $b2 = 'LR'; + } + else + { + $b2 = ''; + if(strpos($border,'L')!==false) + $b2 .= 'L'; + if(strpos($border,'R')!==false) + $b2 .= 'R'; + $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $ns = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + if ($this->unifontSubset) { + $c = mb_substr($s,$i,1,'UTF-8'); + } + else { + $c=$s[$i]; + } + if($c=="\n") + { + // Explicit line break + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill); + } + else { + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + $i++; + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + continue; + } + if($c==' ') + { + $sep = $i; + $ls = $l; + $ns++; + } + + if ($this->unifontSubset) { $l += $this->GetStringWidth($c); } + else { $l += $cw[$c]*$this->FontSize/1000; } + + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill); + } + else { + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + } + else + { + if($align=='J') + { + $this->ws = ($ns>1) ? ($wmax-$ls)/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),$b,2,$align,$fill); + } + else { + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + } + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + } + else + $i++; + } + // Last chunk + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b .= 'B'; + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),$b,2,$align,$fill); + } + else { + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + $this->x = $this->lMargin; +} + +function Write($h, $txt, $link='') +{ + // Output text in flowing mode + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $cw = &$this->CurrentFont['cw']; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin); + $s = str_replace("\r",'',(string)$txt); + if ($this->unifontSubset) { + $nb = mb_strlen($s, 'UTF-8'); + if($nb==1 && $s==" ") { + $this->x += $this->GetStringWidth($s); + return; + } + } + else { + $nb = strlen($s); + } + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + if ($this->unifontSubset) { + $c = mb_substr($s,$i,1,'UTF-8'); + } + else { + $c = $s[$i]; + } + if($c=="\n") + { + // Explicit line break + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,'',false,$link); + } + else { + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link); + } + $i++; + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin); + } + $nl++; + continue; + } + if($c==' ') + $sep = $i; + + if ($this->unifontSubset) { $l += $this->GetStringWidth($c); } + else { $l += $cw[$c]*$this->FontSize/1000; } + + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + // Move to next line + $this->x = $this->lMargin; + $this->y += $h; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin); + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,'',false,$link); + } + else { + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link); + } + } + else + { + if ($this->unifontSubset) { + $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),0,2,'',false,$link); + } + else { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',false,$link); + } + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin); + } + $nl++; + } + else + $i++; + } + // Last chunk + if($i!=$j) { + if ($this->unifontSubset) { + $this->Cell($l,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,0,'',false,$link); + } + else { + $this->Cell($l,$h,substr($s,$j),0,0,'',false,$link); + } + } +} + +function Ln($h=null) +{ + // Line feed; default value is the last cell height + $this->x = $this->lMargin; + if($h===null) + $this->y += $this->lasth; + else + $this->y += $h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + // Put an image on the page + if($file=='') + $this->Error('Image file name is empty'); + if(!isset($this->images[$file])) + { + // First use of this image, get info + if($type=='') + { + $pos = strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type = substr($file,$pos+1); + } + $type = strtolower($type); + if($type=='jpeg') + $type = 'jpg'; + $mtd = '_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info = $this->$mtd($file); + $info['i'] = count($this->images)+1; + $this->images[$file] = $info; + } + else + $info = $this->images[$file]; + + // Automatic width and height calculation if needed + if($w==0 && $h==0) + { + // Put image at 96 dpi + $w = -96; + $h = -96; + } + if($w<0) + $w = -$info['w']*72/$w/$this->k; + if($h<0) + $h = -$info['h']*72/$h/$this->k; + if($w==0) + $w = $h*$info['w']/$info['h']; + if($h==0) + $h = $w*$info['h']/$info['w']; + + // Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x2 = $this->x; + $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation); + $this->x = $x2; + } + $y = $this->y; + $this->y += $h; + } + + if($x===null) + $x = $this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetPageWidth() +{ + // Get current page width + return $this->w; +} + +function GetPageHeight() +{ + // Get current page height + return $this->h; +} + +function GetX() +{ + // Get x position + return $this->x; +} + +function SetX($x) +{ + // Set x position + if($x>=0) + $this->x = $x; + else + $this->x = $this->w+$x; +} + +function GetY() +{ + // Get y position + return $this->y; +} + +function SetY($y, $resetX=true) +{ + // Set y position and optionally reset x + if($y>=0) + $this->y = $y; + else + $this->y = $this->h+$y; + if($resetX) + $this->x = $this->lMargin; +} + +function SetXY($x, $y) +{ + // Set x and y positions + $this->SetX($x); + $this->SetY($y,false); +} + +function Output($dest='', $name='', $isUTF8=false) +{ + // Output PDF to some destination + $this->Close(); + if(strlen($name)==1 && strlen($dest)!=1) + { + // Fix parameter order + $tmp = $dest; + $dest = $name; + $name = $tmp; + } + if($dest=='') + $dest = 'I'; + if($name=='') + $name = 'doc.pdf'; + switch(strtoupper($dest)) + { + case 'I': + // Send to standard output + $this->_checkoutput(); + if(PHP_SAPI!='cli') + { + // We send to a browser + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; '.$this->_httpencode('filename',$name,$isUTF8)); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + } + echo ($this->buffer); + break; + case 'D': + // Download file + $this->_checkoutput(); + header('Content-Type: application/x-download'); + header('Content-Disposition: attachment; '.$this->_httpencode('filename',$name,$isUTF8)); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + echo ($this->buffer); + break; + case 'F': + // Save to local file + if(!file_put_contents($name,$this->buffer)) + $this->Error('Unable to create output file: '.$name); + break; + case 'S': + // Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* Protected methods * +*******************************************************************************/ + +protected function _dochecks() +{ + // Check availability of mbstring + if(!function_exists('mb_strlen')) + $this->Error('mbstring extension is not available'); + // Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); +} + +protected function _checkoutput() +{ + if(PHP_SAPI!='cli') + { + if(headers_sent($file,$line)) + $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)"); + } + if(ob_get_length()) + { + // The output buffer is not empty + if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents())) + { + // It contains only a UTF-8 BOM and/or whitespace, let's clean it + ob_clean(); + } + else + $this->Error("Some data has already been output, can't send PDF file"); + } +} + +protected function _getpagesize($size) +{ + if(is_string($size)) + { + $size = strtolower($size); + if(!isset($this->StdPageSizes[$size])) + $this->Error('Unknown page size: '.$size); + $a = $this->StdPageSizes[$size]; + return array($a[0]/$this->k, $a[1]/$this->k); + } + else + { + if($size[0]>$size[1]) + return array($size[1], $size[0]); + else + return $size; + } +} + +protected function _beginpage($orientation, $size, $rotation) +{ + $this->page++; + $this->pages[$this->page] = ''; + $this->state = 2; + $this->x = $this->lMargin; + $this->y = $this->tMargin; + $this->FontFamily = ''; + // Check page size and orientation + if($orientation=='') + $orientation = $this->DefOrientation; + else + $orientation = strtoupper($orientation[0]); + if($size=='') + $size = $this->DefPageSize; + else + $size = $this->_getpagesize($size); + if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1]) + { + // New size or orientation + if($orientation=='P') + { + $this->w = $size[0]; + $this->h = $size[1]; + } + else + { + $this->w = $size[1]; + $this->h = $size[0]; + } + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + $this->PageBreakTrigger = $this->h-$this->bMargin; + $this->CurOrientation = $orientation; + $this->CurPageSize = $size; + } + if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1]) + $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt); + if($rotation!=0) + { + if($rotation%90!=0) + $this->Error('Incorrect rotation value: '.$rotation); + $this->CurRotation = $rotation; + $this->PageInfo[$this->page]['rotation'] = $rotation; + } +} + +protected function _endpage() +{ + $this->state = 1; +} + +protected function _loadfont($font) +{ + // Load a font definition file from the font directory + if(strpos($font,'/')!==false || strpos($font,"\\")!==false) + $this->Error('Incorrect font definition file name: '.$font); + include($this->fontpath.$font); + if(!isset($name)) + $this->Error('Could not include font definition file'); + if(isset($enc)) + $enc = strtolower($enc); + if(!isset($subsetted)) + $subsetted = false; + return get_defined_vars(); +} + +protected function _isascii($s) +{ + // Test if string is ASCII + $nb = strlen($s); + for($i=0;$i<$nb;$i++) + { + if(ord($s[$i])>127) + return false; + } + return true; +} + +protected function _httpencode($param, $value, $isUTF8) +{ + // Encode HTTP header field parameter + if($this->_isascii($value)) + return $param.'="'.$value.'"'; + if(!$isUTF8) + $value = utf8_encode($value); + if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==false) + return $param.'="'.rawurlencode($value).'"'; + else + return $param."*=UTF-8''".rawurlencode($value); +} + +protected function _UTF8toUTF16($s) +{ + // Convert UTF-8 to UTF-16BE with BOM + $res = "\xFE\xFF"; + $nb = strlen($s); + $i = 0; + while($i<$nb) + { + $c1 = ord($s[$i++]); + if($c1>=224) + { + // 3-byte character + $c2 = ord($s[$i++]); + $c3 = ord($s[$i++]); + $res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + // 2-byte character + $c2 = ord($s[$i++]); + $res .= chr(($c1 & 0x1C)>>2); + $res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + // Single-byte character + $res .= "\0".chr($c1); + } + } + return $res; +} + +protected function _escape($s) +{ + // Escape special characters + if(strpos($s,'(')!==false || strpos($s,')')!==false || strpos($s,'\\')!==false || strpos($s,"\r")!==false) + return str_replace(array('\\','(',')',"\r"), array('\\\\','\\(','\\)','\\r'), $s); + else + return $s; +} + +protected function _textstring($s) +{ + // Format a text string + if(!$this->_isascii($s)) + $s = $this->_UTF8toUTF16($s); + return '('.$this->_escape($s).')'; +} + +protected function _dounderline($x, $y, $txt) +{ + // Underline text + $up = $this->CurrentFont['up']; + $ut = $this->CurrentFont['ut']; + $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +protected function _parsejpg($file) +{ + // Extract info from a JPEG file + $a = getimagesize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace = 'DeviceRGB'; + elseif($a['channels']==4) + $colspace = 'DeviceCMYK'; + else + $colspace = 'DeviceGray'; + $bpc = isset($a['bits']) ? $a['bits'] : 8; + $data = file_get_contents($file); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +protected function _parsepng($file) +{ + // Extract info from a PNG file + $f = fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + $info = $this->_parsepngstream($f,$file); + fclose($f); + return $info; +} + +protected function _parsepngstream($f, $file) +{ + // Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + + // Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w = $this->_readint($f); + $h = $this->_readint($f); + $bpc = ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct = ord($this->_readstream($f,1)); + if($ct==0 || $ct==4) + $colspace = 'DeviceGray'; + elseif($ct==2 || $ct==6) + $colspace = 'DeviceRGB'; + elseif($ct==3) + $colspace = 'Indexed'; + else + $this->Error('Unknown color type: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w; + + // Scan chunks looking for palette, transparency and image data + $pal = ''; + $trns = ''; + $data = ''; + do + { + $n = $this->_readint($f); + $type = $this->_readstream($f,4); + if($type=='PLTE') + { + // Read palette + $pal = $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + // Read transparency info + $t = $this->_readstream($f,$n); + if($ct==0) + $trns = array(ord(substr($t,1,1))); + elseif($ct==2) + $trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos = strpos($t,chr(0)); + if($pos!==false) + $trns = array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + // Read image data block + $data .= $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + $info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns); + if($ct>=4) + { + // Extract alpha channel + if(!function_exists('gzuncompress')) + $this->Error('Zlib not available, can\'t handle alpha channel: '.$file); + $data = gzuncompress($data); + $color = ''; + $alpha = ''; + if($ct==4) + { + // Gray image + $len = 2*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.)./s','$1',$line); + $alpha .= preg_replace('/.(.)/s','$1',$line); + } + } + else + { + // RGB image + $len = 4*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.{3})./s','$1',$line); + $alpha .= preg_replace('/.{3}(.)/s','$1',$line); + } + } + unset($data); + $data = gzcompress($color); + $info['smask'] = gzcompress($alpha); + $this->WithAlpha = true; + if($this->PDFVersion<'1.4') + $this->PDFVersion = '1.4'; + } + $info['data'] = $data; + return $info; +} + +protected function _readstream($f, $n) +{ + // Read n bytes from stream + $res = ''; + while($n>0 && !feof($f)) + { + $s = fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n -= strlen($s); + $res .= $s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +protected function _readint($f) +{ + // Read a 4-byte integer from stream + $a = unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +protected function _parsegif($file) +{ + // Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im = imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + ob_start(); + imagepng($im); + $data = ob_get_clean(); + imagedestroy($im); + $f = fopen('php://temp','rb+'); + if(!$f) + $this->Error('Unable to create memory stream'); + fwrite($f,$data); + rewind($f); + $info = $this->_parsepngstream($f,$file); + fclose($f); + return $info; +} + +protected function _out($s) +{ + // Add a line to the document + if($this->state==2) + $this->pages[$this->page] .= $s."\n"; + elseif($this->state==1) + $this->_put($s); + elseif($this->state==0) + $this->Error('No page has been added yet'); + elseif($this->state==3) + $this->Error('The document is closed'); +} + +protected function _put($s) +{ + $this->buffer .= $s."\n"; +} + +protected function _getoffset() +{ + return strlen($this->buffer); +} + +protected function _newobj($n=null) +{ + // Begin a new object + if($n===null) + $n = ++$this->n; + $this->offsets[$n] = $this->_getoffset(); + $this->_put($n.' 0 obj'); +} + +protected function _putstream($data) +{ + $this->_put('stream'); + $this->_put($data); + $this->_put('endstream'); +} + +protected function _putstreamobject($data) +{ + if($this->compress) + { + $entries = '/Filter /FlateDecode '; + $data = gzcompress($data); + } + else + $entries = ''; + $entries .= '/Length '.strlen($data); + $this->_newobj(); + $this->_put('<<'.$entries.'>>'); + $this->_putstream($data); + $this->_put('endobj'); +} + +protected function _putpage($n) +{ + $this->_newobj(); + $this->_put('<_put('/Parent 1 0 R'); + if(isset($this->PageInfo[$n]['size'])) + $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageInfo[$n]['size'][0],$this->PageInfo[$n]['size'][1])); + if(isset($this->PageInfo[$n]['rotation'])) + $this->_put('/Rotate '.$this->PageInfo[$n]['rotation']); + $this->_put('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + // Links + $annots = '/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots .= '<_textstring($pl[4]).'>>>>'; + else + { + $l = $this->links[$pl[4]]; + if(isset($this->PageInfo[$l[0]]['size'])) + $h = $this->PageInfo[$l[0]]['size'][1]; + else + $h = ($this->DefOrientation=='P') ? $this->DefPageSize[1]*$this->k : $this->DefPageSize[0]*$this->k; + $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',$this->PageInfo[$l[0]]['n'],$h-$l[1]*$this->k); + } + } + $this->_put($annots.']'); + } + if($this->WithAlpha) + $this->_put('/Group <>'); + $this->_put('/Contents '.($this->n+1).' 0 R>>'); + $this->_put('endobj'); + // Page content + if(!empty($this->AliasNbPages)) { + $alias = $this->UTF8ToUTF16BE($this->AliasNbPages, false); + $r = $this->UTF8ToUTF16BE($this->page, false); + $this->pages[$n] = str_replace($alias,$r,$this->pages[$n]); + // Now repeat for no pages in non-subset fonts + + $this->pages[$n] = str_replace($this->AliasNbPages,$this->page,$this->pages[$n]); + } + $this->_putstreamobject($this->pages[$n]); +} + +protected function _putpages() +{ + $nb = $this->page; + for($n=1;$n<=$nb;$n++) + $this->PageInfo[$n]['n'] = $this->n+1+2*($n-1); + for($n=1;$n<=$nb;$n++) + $this->_putpage($n); + // Pages root + $this->_newobj(1); + $this->_put('<PageInfo[$n]['n'].' 0 R '; + $this->_put($kids.']'); + $this->_put('/Count '.$nb); + if($this->DefOrientation=='P') + { + $w = $this->DefPageSize[0]; + $h = $this->DefPageSize[1]; + } + else + { + $w = $this->DefPageSize[1]; + $h = $this->DefPageSize[0]; + } + $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$w*$this->k,$h*$this->k)); + $this->_put('>>'); + $this->_put('endobj'); +} + +protected function _putfonts() +{ + foreach($this->FontFiles as $file=>$info) + { + if (!isset($info['type']) || $info['type']!='TTF') { + // Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n'] = $this->n; + $font = file_get_contents($this->fontpath.$file,true); + if(!$font) + $this->Error('Font file not found: '.$file); + $compressed = (substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + $font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']); + $this->_put('<_put('/Filter /FlateDecode'); + $this->_put('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_put('/Length2 '.$info['length2'].' /Length3 0'); + $this->_put('>>'); + $this->_putstream($font); + $this->_put('endobj'); + } + } + foreach($this->fonts as $k=>$font) + { + // Encoding + if(isset($font['diff'])) + { + if(!isset($this->encodings[$font['enc']])) + { + $this->_newobj(); + $this->_put('<>'); + $this->_put('endobj'); + $this->encodings[$font['enc']] = $this->n; + } + } + // ToUnicode CMap + if(isset($font['uv'])) + { + if(isset($font['enc'])) + $cmapkey = $font['enc']; + else + $cmapkey = $font['name']; + if(!isset($this->cmaps[$cmapkey])) + { + $cmap = $this->_tounicodecmap($font['uv']); + $this->_putstreamobject($cmap); + $this->cmaps[$cmapkey] = $this->n; + } + } + // Font object + $type = $font['type']; + $name = $font['name']; + if($type=='Core') + { + // Core font + $this->fonts[$k]['n'] = $this->n+1; + $this->_newobj(); + $this->_put('<_put('/BaseFont /'.$name); + $this->_put('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_put('/Encoding /WinAnsiEncoding'); + if(isset($font['uv'])) + $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + // Additional Type1 or TrueType/OpenType font + if(isset($font['subsetted']) && $font['subsetted']) + $name = 'AAAAAA+'.$name; + $this->fonts[$k]['n'] = $this->n+1; + $this->_newobj(); + $this->_put('<_put('/BaseFont /'.$name); + $this->_put('/Subtype /'.$type); + $this->_put('/FirstChar 32 /LastChar 255'); + $this->_put('/Widths '.($this->n+1).' 0 R'); + $this->_put('/FontDescriptor '.($this->n+2).' 0 R'); + + if($font['enc']) + { + if(isset($font['diff'])) + $this->_put('/Encoding '.$this->encodings[$font['enc']].' 0 R'); + else + $this->_put('/Encoding /WinAnsiEncoding'); + } + + if(isset($font['uv'])) + $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + // Widths + $this->_newobj(); + $cw = &$font['cw']; + $s = '['; + for($i=32;$i<=255;$i++) + $s .= $cw[chr($i)].' '; + $this->_put($s.']'); + $this->_put('endobj'); + // Descriptor + $this->_newobj(); + $s = '<$v) + $s .= ' /'.$k.' '.$v; + + if(!empty($font['file'])) + $s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R'; + $this->_put($s.'>>'); + $this->_put('endobj'); + } + // TrueType embedded SUBSETS or FULL + else if ($type=='TTF') { + $this->fonts[$k]['n']=$this->n+1; + require_once($this->fontpath.'unifont/ttfonts.php'); + $ttf = new TTFontFile(); + $fontname = 'MPDFAA'.'+'.$font['name']; + $subset = $font['subset']; + unset($subset[0]); + $ttfontstream = $ttf->makeSubset($font['ttffile'], $subset); + $ttfontsize = strlen($ttfontstream); + $fontstream = gzcompress($ttfontstream); + $codeToGlyph = $ttf->codeToGlyph; + unset($codeToGlyph[0]); + + // Type0 Font + // A composite font - a font composed of other fonts, organized hierarchically + $this->_newobj(); + $this->_put('<_put('/Subtype /Type0'); + $this->_put('/BaseFont /'.$fontname.''); + $this->_put('/Encoding /Identity-H'); + $this->_put('/DescendantFonts ['.($this->n + 1).' 0 R]'); + $this->_put('/ToUnicode '.($this->n + 2).' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + + // CIDFontType2 + // A CIDFont whose glyph descriptions are based on TrueType font technology + $this->_newobj(); + $this->_put('<_put('/Subtype /CIDFontType2'); + $this->_put('/BaseFont /'.$fontname.''); + $this->_put('/CIDSystemInfo '.($this->n + 2).' 0 R'); + $this->_put('/FontDescriptor '.($this->n + 3).' 0 R'); + if (isset($font['desc']['MissingWidth'])){ + $this->_out('/DW '.$font['desc']['MissingWidth'].''); + } + + $this->_putTTfontwidths($font, $ttf->maxUni); + + $this->_put('/CIDToGIDMap '.($this->n + 4).' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + + // ToUnicode + $this->_newobj(); + $toUni = "/CIDInit /ProcSet findresource begin\n"; + $toUni .= "12 dict begin\n"; + $toUni .= "begincmap\n"; + $toUni .= "/CIDSystemInfo\n"; + $toUni .= "<_put('<>'); + $this->_putstream($toUni); + $this->_put('endobj'); + + // CIDSystemInfo dictionary + $this->_newobj(); + $this->_put('<_put('/Ordering (UCS)'); + $this->_put('/Supplement 0'); + $this->_put('>>'); + $this->_put('endobj'); + + // Font descriptor + $this->_newobj(); + $this->_put('<_put('/FontName /'.$fontname); + foreach($font['desc'] as $kd=>$v) { + if ($kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag + $this->_out(' /'.$kd.' '.$v); + } + $this->_put('/FontFile2 '.($this->n + 2).' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + + // Embed CIDToGIDMap + // A specification of the mapping from CIDs to glyph indices + $cidtogidmap = ''; + $cidtogidmap = str_pad('', 256*256*2, "\x00"); + foreach($codeToGlyph as $cc=>$glyph) { + $cidtogidmap[$cc*2] = chr($glyph >> 8); + $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF); + } + $cidtogidmap = gzcompress($cidtogidmap); + $this->_newobj(); + $this->_put('<_put('/Filter /FlateDecode'); + $this->_put('>>'); + $this->_putstream($cidtogidmap); + $this->_put('endobj'); + + //Font file + $this->_newobj(); + $this->_put('<_put('/Filter /FlateDecode'); + $this->_put('/Length1 '.$ttfontsize); + $this->_put('>>'); + $this->_putstream($fontstream); + $this->_put('endobj'); + unset($ttf); + } + else + { + // Allow for additional types + $this->fonts[$k]['n'] = $this->n+1; + $mtd = '_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +protected function _putTTfontwidths(&$font, $maxUni) { + if (file_exists($font['unifilename'].'.cw127.php')) { + include($font['unifilename'].'.cw127.php') ; + $startcid = 128; + } + else { + $rangeid = 0; + $range = []; + $prevcid = -2; + $prevwidth = -1; + $interval = false; + $startcid = 1; + } + $cwlen = $maxUni + 1; + + // for each character + for ($cid=$startcid; $cid<$cwlen; $cid++) { + if ($cid==128 && (!file_exists($font['unifilename'].'.cw127.php'))) { + if (is_writable(dirname($this->fontpath.'unifont/x'))) { + $fh = fopen($font['unifilename'].'.cw127.php',"wb"); + $cw127='"; + fwrite($fh,$cw127,strlen($cw127)); + fclose($fh); + } + } + if ((!isset($font['cw'][$cid*2]) || !isset($font['cw'][$cid*2+1])) || + ($font['cw'][$cid*2] == "\00" && $font['cw'][$cid*2+1] == "\00")) { continue; } + + $width = (ord($font['cw'][$cid*2]) << 8) + ord($font['cw'][$cid*2+1]); + if ($width == 65535) { $width = 0; } + if ($cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) { continue; } + if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) { + if ($cid == ($prevcid + 1)) { + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } + else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = []; + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = []; + $range[$rangeid][] = $width; + } + else { $range[$rangeid][] = $width; } + $interval = false; + } + } else { + $rangeid = $cid; + $range[$rangeid] = []; + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + $prevk = -1; + $nextk = -1; + $prevint = false; + foreach ($range as $k => $ws) { + $cws = count($ws); + if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) { + if (isset($range[$k]['interval'])) { unset($range[$k]['interval']); } + $range[$prevk] = array_merge($range[$prevk], $range[$k]); + unset($range[$k]); + } + else { $prevk = $k; } + $nextk = $k + $cws; + if (isset($ws['interval'])) { + if ($cws > 3) { $prevint = true; } + else { $prevint = false; } + unset($range[$k]['interval']); + --$nextk; + } + else { $prevint = false; } + } + $w = ''; + foreach ($range as $k => $ws) { + if (count(array_count_values($ws)) == 1) { $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; } + else { $w .= ' '.$k.' [ '.implode(' ', $ws).' ]' . "\n"; } + } + $this->_out('/W ['.$w.' ]'); +} + +protected function _tounicodecmap($uv) +{ + $ranges = ''; + $nbr = 0; + $chars = ''; + $nbc = 0; + foreach($uv as $c=>$v) + { + if(is_array($v)) + { + $ranges .= sprintf("<%02X> <%02X> <%04X>\n",$c,$c+$v[1]-1,$v[0]); + $nbr++; + } + else + { + $chars .= sprintf("<%02X> <%04X>\n",$c,$v); + $nbc++; + } + } + $s = "/CIDInit /ProcSet findresource begin\n"; + $s .= "12 dict begin\n"; + $s .= "begincmap\n"; + $s .= "/CIDSystemInfo\n"; + $s .= "<0) + { + $s .= "$nbr beginbfrange\n"; + $s .= $ranges; + $s .= "endbfrange\n"; + } + if($nbc>0) + { + $s .= "$nbc beginbfchar\n"; + $s .= $chars; + $s .= "endbfchar\n"; + } + $s .= "endcmap\n"; + $s .= "CMapName currentdict /CMap defineresource pop\n"; + $s .= "end\n"; + $s .= "end"; + return $s; +} + +protected function _putimages() +{ + foreach(array_keys($this->images) as $file) + { + $this->_putimage($this->images[$file]); + unset($this->images[$file]['data']); + unset($this->images[$file]['smask']); + } +} + +protected function _putimage(&$info) +{ + $this->_newobj(); + $info['n'] = $this->n; + $this->_put('<_put('/Subtype /Image'); + $this->_put('/Width '.$info['w']); + $this->_put('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_put('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_put('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_put('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_put('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_put('/Filter /'.$info['f']); + if(isset($info['dp'])) + $this->_put('/DecodeParms <<'.$info['dp'].'>>'); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns = ''; + for($i=0;$i_put('/Mask ['.$trns.']'); + } + if(isset($info['smask'])) + $this->_put('/SMask '.($this->n+1).' 0 R'); + $this->_put('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + $this->_put('endobj'); + // Soft mask + if(isset($info['smask'])) + { + $dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w']; + $smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']); + $this->_putimage($smask); + } + // Palette + if($info['cs']=='Indexed') + $this->_putstreamobject($info['pal']); +} + +protected function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_put('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +protected function _putresourcedict() +{ + $this->_put('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_put('/Font <<'); + foreach($this->fonts as $font) + $this->_put('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_put('>>'); + $this->_put('/XObject <<'); + $this->_putxobjectdict(); + $this->_put('>>'); +} + +protected function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + // Resource dictionary + $this->_newobj(2); + $this->_put('<<'); + $this->_putresourcedict(); + $this->_put('>>'); + $this->_put('endobj'); +} + +protected function _putinfo() +{ + $this->metadata['Producer'] = 'tFPDF '.tFPDF_VERSION; + $this->metadata['CreationDate'] = 'D:'.@date('YmdHis'); + foreach($this->metadata as $key=>$value) + $this->_put('/'.$key.' '.$this->_textstring($value)); +} + +protected function _putcatalog() +{ + $n = $this->PageInfo[1]['n']; + $this->_put('/Type /Catalog'); + $this->_put('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_put('/OpenAction ['.$n.' 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_put('/OpenAction ['.$n.' 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_put('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_put('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_put('/PageLayout /TwoColumnLeft'); +} + +protected function _putheader() +{ + $this->_put('%PDF-'.$this->PDFVersion); +} + +protected function _puttrailer() +{ + $this->_put('/Size '.($this->n+1)); + $this->_put('/Root '.$this->n.' 0 R'); + $this->_put('/Info '.($this->n-1).' 0 R'); +} + +protected function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + // Info + $this->_newobj(); + $this->_put('<<'); + $this->_putinfo(); + $this->_put('>>'); + $this->_put('endobj'); + // Catalog + $this->_newobj(); + $this->_put('<<'); + $this->_putcatalog(); + $this->_put('>>'); + $this->_put('endobj'); + // Cross-ref + $offset = $this->_getoffset(); + $this->_put('xref'); + $this->_put('0 '.($this->n+1)); + $this->_put('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_put(sprintf('%010d 00000 n ',$this->offsets[$i])); + // Trailer + $this->_put('trailer'); + $this->_put('<<'); + $this->_puttrailer(); + $this->_put('>>'); + $this->_put('startxref'); + $this->_put($offset); + $this->_put('%%EOF'); + $this->state = 3; +} + +// ********* NEW FUNCTIONS ********* +// Converts UTF-8 strings to UTF16-BE. +protected function UTF8ToUTF16BE($str, $setbom=true) { + $outstr = ""; + if ($setbom) { + $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) + } + $outstr .= mb_convert_encoding($str, 'UTF-16BE', 'UTF-8'); + return $outstr; +} + +// Converts UTF-8 strings to codepoints array +protected function UTF8StringToArray($str) { + $out = []; + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $uni = -1; + $h = ord($str[$i]); + if ( $h <= 0x7F ) + $uni = $h; + elseif ( $h >= 0xC2 ) { + if ( ($h <= 0xDF) && ($i < $len -1) ) + $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xEF) && ($i < $len -2) ) + $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 + | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xF4) && ($i < $len -3) ) + $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 + | (ord($str[++$i]) & 0x3F) << 6 + | (ord($str[++$i]) & 0x3F); + } + if ($uni >= 0) { + $out[] = $uni; + } + } + return $out; +} + + + +} +?> diff --git a/app/api/Twilio/Base/BaseClient.php b/app/api/Twilio/Base/BaseClient.php new file mode 100755 index 0000000..c7f6033 --- /dev/null +++ b/app/api/Twilio/Base/BaseClient.php @@ -0,0 +1,388 @@ +environment = $environment ?: \getenv(); + + $this->username = $this->getArg($username, self::ENV_ACCOUNT_SID); + $this->password = $this->getArg($password, self::ENV_AUTH_TOKEN); + $this->region = $this->getArg($region, self::ENV_REGION); + $this->edge = $this->getArg(null, self::ENV_EDGE); + $this->logLevel = $this->getArg(null, self::ENV_LOG); + $this->userAgentExtensions = $userAgentExtensions ?: []; + + if (!$this->username || !$this->password) { + throw new ConfigurationException('Credentials are required to create a Client'); + } + + $this->accountSid = $accountSid ?: $this->username; + + if ($httpClient) { + $this->httpClient = $httpClient; + } else { + $this->httpClient = new CurlClient(); + } + } + + /** + * Determines argument value accounting for environment variables. + * + * @param string $arg The constructor argument + * @param string $envVar The environment variable name + * @return ?string Argument value + */ + public function getArg(?string $arg, string $envVar): ?string + { + if ($arg) { + return $arg; + } + + if (\array_key_exists($envVar, $this->environment)) { + return $this->environment[$envVar]; + } + + return null; + } + + /** + * Makes a request to the Twilio API using the configured http client + * Authentication information is automatically added if none is provided + * + * @param string $method HTTP Method + * @param string $uri Fully qualified url + * @param string[] $params Query string parameters + * @param string[] $data POST body data + * @param string[] $headers HTTP Headers + * @param string $username User for Authentication + * @param string $password Password for Authentication + * @param int $timeout Timeout in seconds + * @return \Twilio\Http\Response Response from the Twilio API + */ + public function request( + string $method, + string $uri, + array $params = [], + array $data = [], + array $headers = [], + string $username = null, + string $password = null, + int $timeout = null + ): \Twilio\Http\Response{ + $username = $username ?: $this->username; + $password = $password ?: $this->password; + $logLevel = (getenv('DEBUG_HTTP_TRAFFIC') === 'true' ? 'debug' : $this->getLogLevel()); + + $headers['User-Agent'] = 'twilio-php/' . VersionInfo::string() . + ' (' . php_uname("s") . ' ' . php_uname("m") . ')' . + ' PHP/' . PHP_VERSION; + $headers['Accept-Charset'] = 'utf-8'; + + if ($this->userAgentExtensions) { + $headers['User-Agent'] .= ' ' . implode(' ', $this->userAgentExtensions); + } + + if (!\array_key_exists('Accept', $headers)) { + $headers['Accept'] = 'application/json'; + } + + $uri = $this->buildUri($uri); + + if ($logLevel === 'debug') { + error_log('-- BEGIN Twilio API Request --'); + error_log('Request Method: ' . $method); + $u = parse_url($uri); + if (isset($u['path'])) { + error_log('Request URL: ' . $u['path']); + } + if (isset($u['query']) && strlen($u['query']) > 0) { + error_log('Query Params: ' . $u['query']); + } + error_log('Request Headers: '); + foreach ($headers as $key => $value) { + if (strpos(strtolower($key), 'authorization') === false) { + error_log("$key: $value"); + } + } + error_log('-- END Twilio API Request --'); + } + + $response = $this->getHttpClient()->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + + if ($logLevel === 'debug') { + error_log('Status Code: ' . $response->getStatusCode()); + error_log('Response Headers:'); + $responseHeaders = $response->getHeaders(); + foreach ($responseHeaders as $key => $value) { + error_log("$key: $value"); + } + } + + return $response; + } + + /** + * Build the final request uri + * + * @param string $uri The original request uri + * @return string Request uri + */ + public function buildUri(string $uri): string + { + if ($this->region == null && $this->edge == null) { + return $uri; + } + + $parsedUrl = \parse_url($uri); + $pieces = \explode('.', $parsedUrl['host']); + $product = $pieces[0]; + $domain = \implode('.', \array_slice($pieces, -2)); + $newEdge = $this->edge; + $newRegion = $this->region; + if (count($pieces) == 4) { // product.region.twilio.com + $newRegion = $newRegion ?: $pieces[1]; + } elseif (count($pieces) == 5) { // product.edge.region.twilio.com + $newEdge = $newEdge ?: $pieces[1]; + $newRegion = $newRegion ?: $pieces[2]; + } + + if ($newEdge != null && $newRegion == null) { + $newRegion = self::DEFAULT_REGION; + } + + $parsedUrl['host'] = \implode('.', \array_filter([$product, $newEdge, $newRegion, $domain])); + return RequestValidator::unparse_url($parsedUrl); + } + + /** + * Magic getter to lazy load domains + * + * @param string $name Domain to return + * @return \Twilio\Domain The requested domain + * @throws TwilioException For unknown domains + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown domain ' . $name); + } + + /** + * Magic call to lazy load contexts + * + * @param string $name Context to return + * @param mixed[] $arguments Context to return + * @return \Twilio\InstanceContext The requested context + * @throws TwilioException For unknown contexts + */ + public function __call(string $name, array $arguments) + { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Client ' . $this->getAccountSid() . ']'; + } + + /** + * Validates connection to new SSL certificate endpoint + * + * @param CurlClient $client + * @throws TwilioException if request fails + */ + public function validateSslCertificate(CurlClient $client): void + { + $response = $client->request('GET', 'https://api.twilio.com:8443'); + + if ($response->getStatusCode() < 200 || $response->getStatusCode() > 300) { + throw new TwilioException('Failed to validate SSL certificate'); + } + } + + /** + * @return \Twilio\Rest\Api\V2010\AccountContext Account provided as the + * authenticating account + */ + public function getAccount(): \Twilio\Rest\Api\V2010\AccountContext + { + return $this->api->v2010->account; + } + + /** + * Retrieve the Username + * + * @return string Current Username + */ + public function getUsername(): string + { + return $this->username; + } + + /** + * Retrieve the Password + * + * @return string Current Password + */ + public function getPassword(): string + { + return $this->password; + } + + /** + * Retrieve the AccountSid + * + * @return string Current AccountSid + */ + public function getAccountSid(): string + { + return $this->accountSid; + } + + /** + * Retrieve the Region + * + * @return string Current Region + */ + public function getRegion(): string + { + return $this->region; + } + + /** + * Retrieve the Edge + * + * @return string Current Edge + */ + public function getEdge(): string + { + return $this->edge; + } + + /** + * Set Edge + * + * @param string $uri Edge to use, unsets the Edge when called with no arguments + */ + public function setEdge(string $edge = null): void + { + $this->edge = $this->getArg($edge, self::ENV_EDGE); + } + + /** + * Retrieve the HttpClient + * + * @return HttpClient Current HttpClient + */ + public function getHttpClient(): HttpClient + { + return $this->httpClient; + } + + /** + * Set the HttpClient + * + * @param HttpClient $httpClient HttpClient to use + */ + public function setHttpClient(HttpClient $httpClient): void + { + $this->httpClient = $httpClient; + } + + /** + * Retrieve the log level + * + * @return ?string Current log level + */ + public function getLogLevel(): ?string + { + return $this->logLevel; + } + + /** + * Set log level to debug + * + * @param string $logLevel log level to use + */ + public function setLogLevel(string $logLevel = null): void + { + $this->logLevel = $this->getArg($logLevel, self::ENV_LOG); + } +} diff --git a/app/api/Twilio/Base/PhoneNumberCapabilities.php b/app/api/Twilio/Base/PhoneNumberCapabilities.php new file mode 100755 index 0000000..0344d39 --- /dev/null +++ b/app/api/Twilio/Base/PhoneNumberCapabilities.php @@ -0,0 +1,80 @@ +mms = Values::array_get($capabilities, 'mms', "false"); + $this->sms = Values::array_get($capabilities, 'sms', "false"); + $this->voice = Values::array_get($capabilities, 'voice', "false"); + $this->fax = Values::array_get($capabilities, 'fax', "false"); + } + + /** + * Access the mms + */ + public function getMms(): bool + { + return $this->mms; + } + + /** + * Access the sms + */ + public function getSms(): bool + { + return $this->sms; + } + + /** + * Access the voice + */ + public function getVoice(): bool + { + return $this->voice; + } + + /** + * Access the fax + */ + public function getFax(): bool + { + return $this->fax; + } + + public function __get(string $name) + { + if (\property_exists($this, $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + throw new TwilioException('Unknown subresource ' . $name); + } + + public function __toString(): string + { + return "[Twilio.Base.PhoneNumberCapabilities " . + "( + mms: " . json_encode($this->mms) . ", + sms: " . json_encode($this->sms) . ", + voice: " . json_encode($this->voice) . ", + fax: " . json_encode($this->fax) . " + )]"; + } +} diff --git a/app/api/Twilio/Deserialize.php b/app/api/Twilio/Deserialize.php new file mode 100755 index 0000000..b091f17 --- /dev/null +++ b/app/api/Twilio/Deserialize.php @@ -0,0 +1,51 @@ + 0) { + return new PhoneNumberCapabilities($arr); + } + } + } catch (\Exception $e) { + // no-op + } + + return $arr; + } +} diff --git a/app/api/Twilio/Domain.php b/app/api/Twilio/Domain.php new file mode 100755 index 0000000..1b06aac --- /dev/null +++ b/app/api/Twilio/Domain.php @@ -0,0 +1,82 @@ +client = $client; + $this->baseUrl = ''; + } + + /** + * Translate version relative URIs into absolute URLs + * + * @param string $uri Version relative URI + * @return string Absolute URL for this domain + */ + public function absoluteUrl(string $uri): string { + return \implode('/', [\trim($this->baseUrl, '/'), \trim($uri, '/')]); + } + + /** + * Make an HTTP request to the domain + * + * @param string $method HTTP Method to make the request with + * @param string $uri Relative uri to make a request to + * @param array $params Query string arguments + * @param array $data Post form data + * @param array $headers HTTP headers to send with the request + * @param string $user User to authenticate as + * @param string $password Password + * @param int $timeout Request timeout + * @return Response the response for the request + */ + public function request(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $user = null, string $password = null, + int $timeout = null): Response { + $url = $this->absoluteUrl($uri); + return $this->client->request( + $method, + $url, + $params, + $data, + $headers, + $user, + $password, + $timeout + ); + } + + public function getClient(): Client { + return $this->client; + } + + public function __toString(): string { + return '[Domain]'; + } +} diff --git a/app/api/Twilio/Exceptions/ConfigurationException.php b/app/api/Twilio/Exceptions/ConfigurationException.php new file mode 100755 index 0000000..a94d364 --- /dev/null +++ b/app/api/Twilio/Exceptions/ConfigurationException.php @@ -0,0 +1,9 @@ +statusCode = $statusCode; + $this->moreInfo = $moreInfo; + $this->details = $details; + parent::__construct($message, $code); + } + + /** + * Get the HTTP Status Code of the RestException + * @return int HTTP Status Code + */ + public function getStatusCode(): int { + return $this->statusCode; + } + + /** + * Get more information of the RestException + * @return string More error information + */ + public function getMoreInfo(): string { + return $this->moreInfo; + } + + /** + * Get the details of the RestException + * @return exception details + */ + public function getDetails(): array { + return $this->details; + } +} diff --git a/app/api/Twilio/Exceptions/TwilioException.php b/app/api/Twilio/Exceptions/TwilioException.php new file mode 100755 index 0000000..1df267b --- /dev/null +++ b/app/api/Twilio/Exceptions/TwilioException.php @@ -0,0 +1,9 @@ +curlOptions = $options; + } + + public function request(string $method, string $url, + array $params = [], array $data = [], array $headers = [], + string $user = null, string $password = null, + int $timeout = null): Response { + $options = $this->options($method, $url, $params, $data, $headers, + $user, $password, $timeout); + + $this->lastRequest = $options; + $this->lastResponse = null; + + try { + if (!$curl = \curl_init()) { + throw new EnvironmentException('Unable to initialize cURL'); + } + + if (!\curl_setopt_array($curl, $options)) { + throw new EnvironmentException(\curl_error($curl)); + } + + if (!$response = \curl_exec($curl)) { + throw new EnvironmentException(\curl_error($curl)); + } + + $parts = \explode("\r\n\r\n", $response, 3); + + list($head, $body) = ( + \preg_match('/\AHTTP\/1.\d 100 Continue\Z/', $parts[0]) + || \preg_match('/\AHTTP\/1.\d 200 Connection established\Z/', $parts[0]) + || \preg_match('/\AHTTP\/1.\d 200 Tunnel established\Z/', $parts[0]) + ) + ? array($parts[1], $parts[2]) + : array($parts[0], $parts[1]); + + $statusCode = \curl_getinfo($curl, CURLINFO_HTTP_CODE); + + $responseHeaders = []; + $headerLines = \explode("\r\n", $head); + \array_shift($headerLines); + foreach ($headerLines as $line) { + list($key, $value) = \explode(':', $line, 2); + $responseHeaders[$key] = $value; + } + + \curl_close($curl); + + if (isset($options[CURLOPT_INFILE]) && \is_resource($options[CURLOPT_INFILE])) { + \fclose($options[CURLOPT_INFILE]); + } + + $this->lastResponse = new Response($statusCode, $body, $responseHeaders); + + return $this->lastResponse; + } catch (\ErrorException $e) { + if (isset($curl) && \is_resource($curl)) { + \curl_close($curl); + } + + if (isset($options[CURLOPT_INFILE]) && \is_resource($options[CURLOPT_INFILE])) { + \fclose($options[CURLOPT_INFILE]); + } + + throw $e; + } + } + + public function options(string $method, string $url, + array $params = [], array $data = [], array $headers = [], + string $user = null, string $password = null, + int $timeout = null): array { + $timeout = $timeout ?? self::DEFAULT_TIMEOUT; + $options = $this->curlOptions + [ + CURLOPT_URL => $url, + CURLOPT_HEADER => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_INFILESIZE => Null, + CURLOPT_HTTPHEADER => [], + CURLOPT_TIMEOUT => $timeout, + ]; + + foreach ($headers as $key => $value) { + $options[CURLOPT_HTTPHEADER][] = "$key: $value"; + } + + if ($user && $password) { + $options[CURLOPT_HTTPHEADER][] = 'Authorization: Basic ' . \base64_encode("$user:$password"); + } + + $query = $this->buildQuery($params); + if ($query) { + $options[CURLOPT_URL] .= '?' . $query; + } + + switch (\strtolower(\trim($method))) { + case 'get': + $options[CURLOPT_HTTPGET] = true; + break; + case 'post': + $options[CURLOPT_POST] = true; + if ($this->hasFile($data)) { + [$headers, $body] = $this->buildMultipartOptions($data); + $options[CURLOPT_POSTFIELDS] = $body; + $options[CURLOPT_HTTPHEADER] = \array_merge($options[CURLOPT_HTTPHEADER], $headers); + } else { + $options[CURLOPT_POSTFIELDS] = $this->buildQuery($data); + $options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/x-www-form-urlencoded'; + } + + break; + case 'put': + // TODO: PUT doesn't used anywhere and it has strange implementation. Must investigate later + $options[CURLOPT_PUT] = true; + if ($data) { + if ($buffer = \fopen('php://memory', 'w+')) { + $dataString = $this->buildQuery($data); + \fwrite($buffer, $dataString); + \fseek($buffer, 0); + $options[CURLOPT_INFILE] = $buffer; + $options[CURLOPT_INFILESIZE] = \strlen($dataString); + } else { + throw new EnvironmentException('Unable to open a temporary file'); + } + } + break; + case 'head': + $options[CURLOPT_NOBODY] = true; + break; + default: + $options[CURLOPT_CUSTOMREQUEST] = \strtoupper($method); + } + + return $options; + } + + public function buildQuery(?array $params): string { + $parts = []; + $params = $params ?: []; + + foreach ($params as $key => $value) { + if (\is_array($value)) { + foreach ($value as $item) { + $parts[] = \urlencode((string)$key) . '=' . \urlencode((string)$item); + } + } else { + $parts[] = \urlencode((string)$key) . '=' . \urlencode((string)$value); + } + } + + return \implode('&', $parts); + } + + private function hasFile(array $data): bool { + foreach ($data as $value) { + if ($value instanceof File) { + return true; + } + } + + return false; + } + + private function buildMultipartOptions(array $data): array { + $boundary = \uniqid('', true); + $delimiter = "-------------{$boundary}"; + $body = ''; + + foreach ($data as $key => $value) { + if ($value instanceof File) { + $contents = $value->getContents(); + if ($contents === null) { + $chunk = \file_get_contents($value->getFileName()); + $filename = \basename($value->getFileName()); + } elseif (\is_resource($contents)) { + $chunk = ''; + while (!\feof($contents)) { + $chunk .= \fread($contents, 8096); + } + + $filename = $value->getFileName(); + } elseif (\is_string($contents)) { + $chunk = $contents; + $filename = $value->getFileName(); + } else { + throw new \InvalidArgumentException('Unsupported content type'); + } + + $headers = ''; + $contentType = $value->getContentType(); + if ($contentType !== null) { + $headers .= "Content-Type: {$contentType}\r\n"; + } + + $body .= \vsprintf("--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n%s\r\n%s\r\n", [ + $delimiter, + $key, + $filename, + $headers, + $chunk, + ]); + } else { + $body .= \vsprintf("--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", [ + $delimiter, + $key, + $value, + ]); + } + } + + $body .= "--{$delimiter}--\r\n"; + + return [ + [ + "Content-Type: multipart/form-data; boundary={$delimiter}", + 'Content-Length: ' . \strlen($body), + ], + $body, + ]; + } +} diff --git a/app/api/Twilio/Http/File.php b/app/api/Twilio/Http/File.php new file mode 100755 index 0000000..0823c80 --- /dev/null +++ b/app/api/Twilio/Http/File.php @@ -0,0 +1,47 @@ +fileName = $fileName; + $this->contents = $contents; + $this->contentType = $contentType; + } + + /** + * @return resource|string|mixed|null + */ + public function getContents() { + return $this->contents; + } + + public function getFileName(): string { + return $this->fileName; + } + + public function getContentType(): ?string { + return $this->contentType; + } +} diff --git a/app/api/Twilio/Http/GuzzleClient.php b/app/api/Twilio/Http/GuzzleClient.php new file mode 100755 index 0000000..7eff5ed --- /dev/null +++ b/app/api/Twilio/Http/GuzzleClient.php @@ -0,0 +1,99 @@ +client = $client; + } + + public function request(string $method, string $url, + array $params = [], array $data = [], array $headers = [], + string $user = null, string $password = null, + int $timeout = null): Response { + try { + $options = [ + 'timeout' => $timeout, + 'auth' => [$user, $password], + 'allow_redirects' => false, + ]; + + if ($params) { + $options['query'] = Query::build($params, PHP_QUERY_RFC1738); + } + + if ($method === 'POST') { + if ($this->hasFile($data)) { + $options['multipart'] = $this->buildMultipartParam($data); + } else { + $options['body'] = Query::build($data, PHP_QUERY_RFC1738); + $headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + } + + $response = $this->client->send(new Request($method, $url, $headers), $options); + } catch (BadResponseException $exception) { + $response = $exception->getResponse(); + } catch (\Exception $exception) { + throw new HttpException('Unable to complete the HTTP request', 0, $exception); + } + + // Casting the body (stream) to a string performs a rewind, ensuring we return the entire response. + // See https://stackoverflow.com/a/30549372/86696 + return new Response($response->getStatusCode(), (string)$response->getBody(), $response->getHeaders()); + } + + private function hasFile(array $data): bool { + foreach ($data as $value) { + if ($value instanceof File) { + return true; + } + } + + return false; + } + + private function buildMultipartParam(array $data): array { + $multipart = []; + foreach ($data as $key => $value) { + if ($value instanceof File) { + $contents = $value->getContents(); + if ($contents === null) { + $contents = fopen($value->getFileName(), 'rb'); + } + + $chunk = [ + 'name' => $key, + 'contents' => $contents, + 'filename' => $value->getFileName(), + ]; + + if ($value->getContentType() !== null) { + $chunk['headers']['Content-Type'] = $value->getContentType(); + } + } else { + $chunk = [ + 'name' => $key, + 'contents' => $value, + ]; + } + + $multipart[] = $chunk; + } + + return $multipart; + } +} diff --git a/app/api/Twilio/Http/Response.php b/app/api/Twilio/Http/Response.php new file mode 100755 index 0000000..e1b58ae --- /dev/null +++ b/app/api/Twilio/Http/Response.php @@ -0,0 +1,40 @@ +statusCode = $statusCode; + $this->content = $content; + $this->headers = $headers; + } + + /** + * @return mixed + */ + public function getContent() { + return \json_decode($this->content, true); + } + + public function getStatusCode(): int { + return $this->statusCode; + } + + public function getHeaders(): array { + return $this->headers; + } + + public function ok(): bool { + return $this->getStatusCode() < 400; + } + + public function __toString(): string { + return '[Response] HTTP ' . $this->getStatusCode() . ' ' . $this->content; + } +} diff --git a/app/api/Twilio/InstanceContext.php b/app/api/Twilio/InstanceContext.php new file mode 100755 index 0000000..f72a49f --- /dev/null +++ b/app/api/Twilio/InstanceContext.php @@ -0,0 +1,19 @@ +version = $version; + } + + public function __toString(): string { + return '[InstanceContext]'; + } +} diff --git a/app/api/Twilio/InstanceResource.php b/app/api/Twilio/InstanceResource.php new file mode 100755 index 0000000..a356111 --- /dev/null +++ b/app/api/Twilio/InstanceResource.php @@ -0,0 +1,28 @@ +version = $version; + } + + public function toArray(): array { + return $this->properties; + } + + public function __toString(): string { + return '[InstanceResource]'; + } + + public function __isset($name): bool { + return \array_key_exists($name, $this->properties); + } +} diff --git a/app/api/Twilio/Jwt/AccessToken.php b/app/api/Twilio/Jwt/AccessToken.php new file mode 100755 index 0000000..c635fa0 --- /dev/null +++ b/app/api/Twilio/Jwt/AccessToken.php @@ -0,0 +1,169 @@ +signingKeySid = $signingKeySid; + $this->accountSid = $accountSid; + $this->secret = $secret; + $this->ttl = $ttl; + $this->region = $region; + + if ($identity !== null) { + $this->identity = $identity; + } + + $this->grants = []; + $this->customClaims = []; + } + + /** + * Set the identity of this access token + * + * @param string $identity identity of the grant + * + * @return $this updated access token + */ + public function setIdentity(string $identity): self { + $this->identity = $identity; + return $this; + } + + /** + * Returns the identity of the grant + * + * @return string the identity + */ + public function getIdentity(): string { + return $this->identity; + } + + /** + * Set the nbf of this access token + * + * @param int $nbf nbf in epoch seconds of the grant + * + * @return $this updated access token + */ + public function setNbf(int $nbf): self { + $this->nbf = $nbf; + return $this; + } + + /** + * Returns the nbf of the grant + * + * @return int the nbf in epoch seconds + */ + public function getNbf(): int { + return $this->nbf; + } + + /** + * Set the region of this access token + * + * @param string $region Home region of the account sid in this access token + * + * @return $this updated access token + */ + public function setRegion(string $region): self { + $this->region = $region; + return $this; + } + + /** + * Returns the region of this access token + * + * @return string Home region of the account sid in this access token + */ + public function getRegion(): string { + return $this->region; + } + + /** + * Add a grant to the access token + * + * @param Grant $grant to be added + * + * @return $this the updated access token + */ + public function addGrant(Grant $grant): self { + $this->grants[] = $grant; + return $this; + } + + /** + * Allows to set custom claims, which then will be encoded into JWT payload. + * + * @param string $name + * @param string $value + */ + public function addClaim(string $name, string $value): void { + $this->customClaims[$name] = $value; + } + + public function toJWT(string $algorithm = 'HS256'): string { + $header = [ + 'cty' => 'twilio-fpa;v=1', + 'typ' => 'JWT' + ]; + + if ($this->region) { + $header['twr'] = $this->region; + } + + $now = \time(); + + $grants = []; + if ($this->identity) { + $grants['identity'] = $this->identity; + } + + foreach ($this->grants as $grant) { + $payload = $grant->getPayload(); + if (empty($payload)) { + $payload = \json_decode('{}'); + } + + $grants[$grant->getGrantKey()] = $payload; + } + + if (empty($grants)) { + $grants = \json_decode('{}'); + } + + $payload = \array_merge($this->customClaims, [ + 'jti' => $this->signingKeySid . '-' . $now, + 'iss' => $this->signingKeySid, + 'sub' => $this->accountSid, + 'exp' => $now + $this->ttl, + 'grants' => $grants + ]); + + if ($this->nbf !== null) { + $payload['nbf'] = $this->nbf; + } + + return JWT::encode($payload, $this->secret, $algorithm, $header); + } + + public function __toString(): string { + return $this->toJWT(); + } +} diff --git a/app/api/Twilio/Jwt/Client/ScopeURI.php b/app/api/Twilio/Jwt/Client/ScopeURI.php new file mode 100755 index 0000000..f35d258 --- /dev/null +++ b/app/api/Twilio/Jwt/Client/ScopeURI.php @@ -0,0 +1,67 @@ +:? + * + * For example: + * scope:client:incoming?name=jonas + */ +class ScopeURI { + public $service; + public $privilege; + public $params; + + public function __construct(string $service, string $privilege, array $params = []) { + $this->service = $service; + $this->privilege = $privilege; + $this->params = $params; + } + + public function toString(): string { + $uri = "scope:{$this->service}:{$this->privilege}"; + if (\count($this->params)) { + $uri .= '?' . \http_build_query($this->params, '', '&'); + } + return $uri; + } + + /** + * Parse a scope URI into a ScopeURI object + * + * @param string $uri The scope URI + * @return ScopeURI The parsed scope uri + * @throws \UnexpectedValueException + */ + public static function parse(string $uri): ScopeURI { + if (\strpos($uri, 'scope:') !== 0) { + throw new \UnexpectedValueException( + 'Not a scope URI according to scheme'); + } + + $parts = \explode('?', $uri, 1); + $params = null; + + if (\count($parts) > 1) { + \parse_str($parts[1], $params); + } + + $parts = \explode(':', $parts[0], 2); + + if (\count($parts) !== 3) { + throw new \UnexpectedValueException( + 'Not enough parts for scope URI'); + } + + [$scheme, $service, $privilege] = $parts; + return new ScopeURI($service, $privilege, $params); + } +} diff --git a/app/api/Twilio/Jwt/ClientToken.php b/app/api/Twilio/Jwt/ClientToken.php new file mode 100755 index 0000000..03327e0 --- /dev/null +++ b/app/api/Twilio/Jwt/ClientToken.php @@ -0,0 +1,128 @@ +accountSid = $accountSid; + $this->authToken = $authToken; + $this->scopes = []; + $this->clientName = false; + $this->customClaims = []; + } + + /** + * If the user of this token should be allowed to accept incoming + * connections then configure the TwilioCapability through this method and + * specify the client name. + * + * @param string $clientName + * @throws \InvalidArgumentException + */ + public function allowClientIncoming(string $clientName): void { + // clientName must be a non-zero length alphanumeric string + if (\preg_match('/\W/', $clientName)) { + throw new \InvalidArgumentException( + 'Only alphanumeric characters allowed in client name.'); + } + + if ($clientName === '') { + throw new \InvalidArgumentException( + 'Client name must not be a zero length string.'); + } + + $this->clientName = $clientName; + $this->allow('client', 'incoming', ['clientName' => $clientName]); + } + + /** + * Allow the user of this token to make outgoing connections. + * + * @param string $appSid the application to which this token grants access + * @param mixed[] $appParams signed parameters that the user of this token + * cannot overwrite. + */ + public function allowClientOutgoing(string $appSid, array $appParams = []): void { + $this->allow('client', 'outgoing', [ + 'appSid' => $appSid, + 'appParams' => \http_build_query($appParams, '', '&') + ]); + } + + /** + * Allow the user of this token to access their event stream. + * + * @param mixed[] $filters key/value filters to apply to the event stream + */ + public function allowEventStream(array $filters = []): void { + $this->allow('stream', 'subscribe', [ + 'path' => '/2010-04-01/Events', + 'params' => \http_build_query($filters, '', '&'), + ]); + } + + /** + * Allows to set custom claims, which then will be encoded into JWT payload. + * + * @param string $name + * @param string $value + */ + public function addClaim(string $name, string $value): void { + $this->customClaims[$name] = $value; + } + + /** + * Generates a new token based on the credentials and permissions that + * previously has been granted to this token. + * + * @param int $ttl the expiration time of the token (in seconds). Default + * value is 3600 (1hr) + * @return string the newly generated token that is valid for $ttl seconds + */ + public function generateToken(int $ttl = 3600): string { + $payload = \array_merge($this->customClaims, [ + 'scope' => [], + 'iss' => $this->accountSid, + 'exp' => \time() + $ttl, + ]); + $scopeStrings = []; + + foreach ($this->scopes as $scope) { + if ($scope->privilege === 'outgoing' && $this->clientName) { + $scope->params['clientName'] = $this->clientName; + } + $scopeStrings[] = $scope->toString(); + } + + $payload['scope'] = \implode(' ', $scopeStrings); + return JWT::encode($payload, $this->authToken, 'HS256'); + } + + protected function allow(string $service, string $privilege, array $params): void { + $this->scopes[] = new ScopeURI($service, $privilege, $params); + } +} diff --git a/app/api/Twilio/Jwt/Grants/ChatGrant.php b/app/api/Twilio/Jwt/Grants/ChatGrant.php new file mode 100755 index 0000000..af16d2a --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/ChatGrant.php @@ -0,0 +1,128 @@ +serviceSid; + } + + /** + * Set the service sid of this grant + * + * @param string $serviceSid service sid of the grant + * + * @return $this updated grant + */ + public function setServiceSid(string $serviceSid): self { + $this->serviceSid = $serviceSid; + return $this; + } + + /** + * Returns the endpoint id of the grant + * + * @return string the endpoint id + */ + public function getEndpointId(): string { + return $this->endpointId; + } + + /** + * Set the endpoint id of the grant + * + * @param string $endpointId endpoint id of the grant + * + * @return $this updated grant + */ + public function setEndpointId(string $endpointId): self { + $this->endpointId = $endpointId; + return $this; + } + + /** + * Returns the deployment role sid of the grant + * + * @return string the deployment role sid + */ + public function getDeploymentRoleSid(): string { + return $this->deploymentRoleSid; + } + + /** + * Set the role sid of the grant + * + * @param string $deploymentRoleSid role sid of the grant + * + * @return $this updated grant + */ + public function setDeploymentRoleSid(string $deploymentRoleSid): self { + $this->deploymentRoleSid = $deploymentRoleSid; + return $this; + } + + /** + * Returns the push credential sid of the grant + * + * @return string the push credential sid + */ + public function getPushCredentialSid(): string { + return $this->pushCredentialSid; + } + + /** + * Set the credential sid of the grant + * + * @param string $pushCredentialSid push credential sid of the grant + * + * @return $this updated grant + */ + public function setPushCredentialSid(string $pushCredentialSid): self { + $this->pushCredentialSid = $pushCredentialSid; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'chat'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->serviceSid) { + $payload['service_sid'] = $this->serviceSid; + } + if ($this->endpointId) { + $payload['endpoint_id'] = $this->endpointId; + } + if ($this->deploymentRoleSid) { + $payload['deployment_role_sid'] = $this->deploymentRoleSid; + } + if ($this->pushCredentialSid) { + $payload['push_credential_sid'] = $this->pushCredentialSid; + } + + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/Grants/Grant.php b/app/api/Twilio/Jwt/Grants/Grant.php new file mode 100755 index 0000000..eb20e3e --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/Grant.php @@ -0,0 +1,21 @@ +grant; + } + + /** + * Set the playback grant that will allow access to a stream + * + * @param array $grant playback grant from Twilio API + * @return $this updated grant + */ + public function setGrant(array $grant): self { + $this->grant = $grant; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'player'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->grant) { + $payload = $this->grant; + } + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/Grants/SyncGrant.php b/app/api/Twilio/Jwt/Grants/SyncGrant.php new file mode 100755 index 0000000..757ea80 --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/SyncGrant.php @@ -0,0 +1,126 @@ +serviceSid; + } + + /** + * Set the service sid of this grant + * + * @param string $serviceSid service sid of the grant + * + * @return $this updated grant + */ + public function setServiceSid(string $serviceSid): self { + $this->serviceSid = $serviceSid; + return $this; + } + + /** + * Returns the endpoint id of the grant + * + * @return string the endpoint id + */ + public function getEndpointId(): string { + return $this->endpointId; + } + + /** + * Set the endpoint id of the grant + * + * @param string $endpointId endpoint id of the grant + * + * @return $this updated grant + */ + public function setEndpointId(string $endpointId): self { + $this->endpointId = $endpointId; + return $this; + } + + /** + * Returns the deployment role sid of the grant + * + * @return string the deployment role sid + */ + public function getDeploymentRoleSid(): string { + return $this->deploymentRoleSid; + } + + /** + * Set the role sid of the grant + * + * @param string $deploymentRoleSid role sid of the grant + * + * @return $this updated grant + */ + public function setDeploymentRoleSid(string $deploymentRoleSid): self { + $this->deploymentRoleSid = $deploymentRoleSid; + return $this; + } + + /** + * Returns the push credential sid of the grant + * + * @return string the push credential sid + */ + public function getPushCredentialSid(): string { + return $this->pushCredentialSid; + } + + /** + * Set the credential sid of the grant + * + * @param string $pushCredentialSid push credential sid of the grant + * + * @return $this updated grant + */ + public function setPushCredentialSid(string $pushCredentialSid): self { + $this->pushCredentialSid = $pushCredentialSid; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'data_sync'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->serviceSid) { + $payload['service_sid'] = $this->serviceSid; + } + if ($this->endpointId) { + $payload['endpoint_id'] = $this->endpointId; + } + if ($this->deploymentRoleSid) { + $payload['deployment_role_sid'] = $this->deploymentRoleSid; + } + if ($this->pushCredentialSid) { + $payload['push_credential_sid'] = $this->pushCredentialSid; + } + + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/Grants/TaskRouterGrant.php b/app/api/Twilio/Jwt/Grants/TaskRouterGrant.php new file mode 100755 index 0000000..07613cb --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/TaskRouterGrant.php @@ -0,0 +1,101 @@ +workspaceSid; + } + + /** + * Set the workspace sid of this grant + * + * @param string $workspaceSid workspace sid of the grant + * + * @return $this updated grant + */ + public function setWorkspaceSid(string $workspaceSid): self { + $this->workspaceSid = $workspaceSid; + return $this; + } + + /** + * Returns the worker sid + * + * @return string the worker sid + */ + public function getWorkerSid(): string { + return $this->workerSid; + } + + /** + * Set the worker sid of this grant + * + * @param string $workerSid worker sid of the grant + * + * @return $this updated grant + */ + public function setWorkerSid(string $workerSid): self { + $this->workerSid = $workerSid; + return $this; + } + + /** + * Returns the role + * + * @return string the role + */ + public function getRole(): string { + return $this->role; + } + + /** + * Set the role of this grant + * + * @param string $role role of the grant + * + * @return $this updated grant + */ + public function setRole(string $role): self { + $this->role = $role; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'task_router'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->workspaceSid) { + $payload['workspace_sid'] = $this->workspaceSid; + } + if ($this->workerSid) { + $payload['worker_sid'] = $this->workerSid; + } + if ($this->role) { + $payload['role'] = $this->role; + } + + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/Grants/VideoGrant.php b/app/api/Twilio/Jwt/Grants/VideoGrant.php new file mode 100755 index 0000000..dbf2a38 --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/VideoGrant.php @@ -0,0 +1,52 @@ +room; + } + + /** + * Set the room to allow access to in the grant + * + * @param string $roomSidOrName room sid or name + * @return $this updated grant + */ + public function setRoom(string $roomSidOrName): self { + $this->room = $roomSidOrName; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'video'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->room) { + $payload['room'] = $this->room; + } + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/Grants/VoiceGrant.php b/app/api/Twilio/Jwt/Grants/VoiceGrant.php new file mode 100755 index 0000000..296774a --- /dev/null +++ b/app/api/Twilio/Jwt/Grants/VoiceGrant.php @@ -0,0 +1,165 @@ +incomingAllow; + } + + /** + * Set whether incoming is allowed + * + * @param bool $incomingAllow whether incoming is allowed + * + * @return $this updated grant + */ + public function setIncomingAllow(bool $incomingAllow): self { + $this->incomingAllow = $incomingAllow; + return $this; + } + + /** + * Returns the outgoing application sid + * + * @return string the outgoing application sid + */ + public function getOutgoingApplicationSid(): string { + return $this->outgoingApplicationSid; + } + + /** + * Set the outgoing application sid of the grant + * + * @param string $outgoingApplicationSid outgoing application sid of grant + * + * @return $this updated grant + */ + public function setOutgoingApplicationSid(string $outgoingApplicationSid): self { + $this->outgoingApplicationSid = $outgoingApplicationSid; + return $this; + } + + /** + * Returns the outgoing application params + * + * @return array the outgoing application params + */ + public function getOutgoingApplicationParams(): array { + return $this->outgoingApplicationParams; + } + + /** + * Set the outgoing application of the the grant + * + * @param string $sid outgoing application sid of the grant + * @param array $params params to pass the the application + * + * @return $this updated grant + */ + public function setOutgoingApplication(string $sid, array $params): self { + $this->outgoingApplicationSid = $sid; + $this->outgoingApplicationParams = $params; + return $this; + } + + /** + * Returns the push credential sid + * + * @return string the push credential sid + */ + public function getPushCredentialSid(): string { + return $this->pushCredentialSid; + } + + /** + * Set the push credential sid + * + * @param string $pushCredentialSid + * + * @return $this updated grant + */ + public function setPushCredentialSid(string $pushCredentialSid): self { + $this->pushCredentialSid = $pushCredentialSid; + return $this; + } + + /** + * Returns the endpoint id + * + * @return string the endpoint id + */ + public function getEndpointId(): string { + return $this->endpointId; + } + + /** + * Set the endpoint id + * + * @param string $endpointId endpoint id + * + * @return $this updated grant + */ + public function setEndpointId(string $endpointId): self { + $this->endpointId = $endpointId; + return $this; + } + + /** + * Returns the grant type + * + * @return string type of the grant + */ + public function getGrantKey(): string { + return 'voice'; + } + + /** + * Returns the grant data + * + * @return array data of the grant + */ + public function getPayload(): array { + $payload = []; + if ($this->incomingAllow === true) { + $incoming = []; + $incoming['allow'] = true; + $payload['incoming'] = $incoming; + } + + if ($this->outgoingApplicationSid) { + $outgoing = []; + $outgoing['application_sid'] = $this->outgoingApplicationSid; + + if ($this->outgoingApplicationParams) { + $outgoing['params'] = $this->outgoingApplicationParams; + } + + $payload['outgoing'] = $outgoing; + } + + if ($this->pushCredentialSid) { + $payload['push_credential_sid'] = $this->pushCredentialSid; + } + + if ($this->endpointId) { + $payload['endpoint_id'] = $this->endpointId; + } + + return $payload; + } +} diff --git a/app/api/Twilio/Jwt/JWT.php b/app/api/Twilio/Jwt/JWT.php new file mode 100755 index 0000000..f9506e9 --- /dev/null +++ b/app/api/Twilio/Jwt/JWT.php @@ -0,0 +1,172 @@ + + */ +class JWT { + /** + * @param string $jwt The JWT + * @param string|null $key The secret key + * @param bool $verify Don't skip verification process + * @return object The JWT's payload as a PHP object + * @throws \DomainException + * @throws \UnexpectedValueException + */ + public static function decode(string $jwt, string $key = null, bool $verify = true) { + $tks = \explode('.', $jwt); + if (\count($tks) !== 3) { + throw new \UnexpectedValueException('Wrong number of segments'); + } + list($headb64, $payloadb64, $cryptob64) = $tks; + if (null === ($header = self::jsonDecode(self::urlsafeB64Decode($headb64))) + ) { + throw new \UnexpectedValueException('Invalid segment encoding'); + } + if (null === $payload = self::jsonDecode(self::urlsafeB64Decode($payloadb64)) + ) { + throw new \UnexpectedValueException('Invalid segment encoding'); + } + $sig = self::urlsafeB64Decode($cryptob64); + if ($verify) { + if (empty($header->alg)) { + throw new \DomainException('Empty algorithm'); + } + + if (!hash_equals($sig, self::sign("$headb64.$payloadb64", $key, $header->alg))) { + throw new \UnexpectedValueException('Signature verification failed'); + } + } + return $payload; + } + + /** + * @param string $jwt The JWT + * @return object The JWT's header as a PHP object + * @throws \UnexpectedValueException + */ + public static function getHeader(string $jwt) { + $tks = \explode('.', $jwt); + if (\count($tks) !== 3) { + throw new \UnexpectedValueException('Wrong number of segments'); + } + list($headb64) = $tks; + if (null === ($header = self::jsonDecode(self::urlsafeB64Decode($headb64))) + ) { + throw new \UnexpectedValueException('Invalid segment encoding'); + } + return $header; + } + + /** + * @param object|array $payload PHP object or array + * @param string $key The secret key + * @param string $algo The signing algorithm + * @param array $additionalHeaders Additional keys/values to add to the header + * + * @return string A JWT + */ + public static function encode($payload, string $key, string $algo = 'HS256', array $additionalHeaders = []): string { + $header = ['typ' => 'JWT', 'alg' => $algo]; + $header += $additionalHeaders; + + $segments = []; + $segments[] = self::urlsafeB64Encode(self::jsonEncode($header)); + $segments[] = self::urlsafeB64Encode(self::jsonEncode($payload)); + $signing_input = \implode('.', $segments); + + $signature = self::sign($signing_input, $key, $algo); + $segments[] = self::urlsafeB64Encode($signature); + + return \implode('.', $segments); + } + + /** + * @param string $msg The message to sign + * @param string $key The secret key + * @param string $method The signing algorithm + * @return string An encrypted message + * @throws \DomainException + */ + public static function sign(string $msg, string $key, string $method = 'HS256'): string { + $methods = [ + 'HS256' => 'sha256', + 'HS384' => 'sha384', + 'HS512' => 'sha512', + ]; + if (empty($methods[$method])) { + throw new \DomainException('Algorithm not supported'); + } + return \hash_hmac($methods[$method], $msg, $key, true); + } + + /** + * @param string $input JSON string + * @return object Object representation of JSON string + * @throws \DomainException + */ + public static function jsonDecode(string $input) { + $obj = \json_decode($input); + if (\function_exists('json_last_error') && $errno = \json_last_error()) { + self::handleJsonError($errno); + } else if ($obj === null && $input !== 'null') { + throw new \DomainException('Null result with non-null input'); + } + return $obj; + } + + /** + * @param object|array $input A PHP object or array + * @return string JSON representation of the PHP object or array + * @throws \DomainException + */ + public static function jsonEncode($input): string { + $json = \json_encode($input); + if (\function_exists('json_last_error') && $errno = \json_last_error()) { + self::handleJsonError($errno); + } else if ($json === 'null' && $input !== null) { + throw new \DomainException('Null result with non-null input'); + } + return $json; + } + + /** + * @param string $input A base64 encoded string + * + * @return string A decoded string + */ + public static function urlsafeB64Decode(string $input): string { + $padLen = 4 - \strlen($input) % 4; + $input .= \str_repeat('=', $padLen); + return \base64_decode(\strtr($input, '-_', '+/')); + } + + /** + * @param string $input Anything really + * + * @return string The base64 encode of what you passed in + */ + public static function urlsafeB64Encode(string $input): string { + return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_')); + } + + /** + * @param int $errno An error number from json_last_error() + * + * @throws \DomainException + */ + private static function handleJsonError(int $errno): void { + $messages = [ + JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', + JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', + JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON' + ]; + throw new \DomainException($messages[$errno] ?? 'Unknown JSON error: ' . $errno); + } +} diff --git a/app/api/Twilio/Jwt/TaskRouter/CapabilityToken.php b/app/api/Twilio/Jwt/TaskRouter/CapabilityToken.php new file mode 100755 index 0000000..0ada344 --- /dev/null +++ b/app/api/Twilio/Jwt/TaskRouter/CapabilityToken.php @@ -0,0 +1,161 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class CapabilityToken { + protected $accountSid; + protected $authToken; + private $friendlyName; + /** @var Policy[] $policies */ + private $policies; + + protected $baseUrl = 'https://taskrouter.twilio.com/v1'; + protected $baseWsUrl = 'https://event-bridge.twilio.com/v1/wschannels'; + protected $version = 'v1'; + + protected $workspaceSid; + protected $channelId; + protected $resourceUrl; + + protected $required = ['required' => true]; + protected $optional = ['required' => false]; + + public function __construct(string $accountSid, string $authToken, string $workspaceSid, string $channelId, + string $resourceUrl = null, string $overrideBaseUrl = null, string $overrideBaseWSUrl = null) { + $this->accountSid = $accountSid; + $this->authToken = $authToken; + $this->friendlyName = $channelId; + $this->policies = []; + + $this->workspaceSid = $workspaceSid; + $this->channelId = $channelId; + if (isset($overrideBaseUrl)) { + $this->baseUrl = $overrideBaseUrl; + } + if (isset($overrideBaseWSUrl)) { + $this->baseWsUrl = $overrideBaseWSUrl; + } + $this->baseUrl .= '/Workspaces/' . $workspaceSid; + + $this->validateJWT(); + + if (!isset($resourceUrl)) { + $this->setupResource(); + } + + //add permissions to GET and POST to the event-bridge channel + $this->allow($this->baseWsUrl . '/' . $this->accountSid . '/' . $this->channelId, 'GET', null, null); + $this->allow($this->baseWsUrl . '/' . $this->accountSid . '/' . $this->channelId, 'POST', null, null); + + //add permissions to fetch the instance resource + $this->allow($this->resourceUrl, 'GET', null, null); + } + + protected function setupResource(): void { + } + + public function addPolicyDeconstructed(string $url, string $method, ?array $queryFilter = [], ?array $postFilter = [], bool $allow = true): Policy { + $policy = new Policy($url, $method, $queryFilter, $postFilter, $allow); + $this->policies[] = $policy; + return $policy; + } + + public function allow(string $url, string $method, ?array $queryFilter = [], ?array $postFilter = []): void { + $this->addPolicyDeconstructed($url, $method, $queryFilter, $postFilter, true); + } + + public function deny(string $url, string $method, array $queryFilter = [], array $postFilter = []): void { + $this->addPolicyDeconstructed($url, $method, $queryFilter, $postFilter, false); + } + + private function validateJWT(): void { + if (!isset($this->accountSid) || \strpos($this->accountSid, 'AC') !== 0) { + throw new \Exception('Invalid AccountSid provided: ' . $this->accountSid); + } + if (!isset($this->workspaceSid) || \strpos($this->workspaceSid, 'WS') !== 0) { + throw new \Exception('Invalid WorkspaceSid provided: ' . $this->workspaceSid); + } + if (!isset($this->channelId)) { + throw new \Exception('ChannelId not provided'); + } + $prefix = \substr($this->channelId, 0, 2); + if ($prefix !== 'WS' && $prefix !== 'WK' && $prefix !== 'WQ') { + throw new \Exception("Invalid ChannelId provided: " . $this->channelId); + } + } + + public function allowFetchSubresources(): void { + $method = 'GET'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->resourceUrl . '/**', $method, $queryFilter, $postFilter); + } + + public function allowUpdates(): void { + $method = 'POST'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->resourceUrl, $method, $queryFilter, $postFilter); + } + + public function allowUpdatesSubresources(): void { + $method = 'POST'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->resourceUrl . '/**', $method, $queryFilter, $postFilter); + } + + public function allowDelete(): void { + $method = 'DELETE'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->resourceUrl, $method, $queryFilter, $postFilter); + } + + public function allowDeleteSubresources(): void { + $method = 'DELETE'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->resourceUrl . '/**', $method, $queryFilter, $postFilter); + } + + public function generateToken(int $ttl = 3600, array $extraAttributes = []): string { + $payload = [ + 'version' => $this->version, + 'friendly_name' => $this->friendlyName, + 'iss' => $this->accountSid, + 'exp' => \time() + $ttl, + 'account_sid' => $this->accountSid, + 'channel' => $this->channelId, + 'workspace_sid' => $this->workspaceSid + ]; + + if (\strpos($this->channelId, 'WK') === 0) { + $payload['worker_sid'] = $this->channelId; + } else if (\strpos($this->channelId, 'WQ') === 0) { + $payload['taskqueue_sid'] = $this->channelId; + } + + foreach ($extraAttributes as $key => $value) { + $payload[$key] = $value; + } + + $policyStrings = []; + foreach ($this->policies as $policy) { + $policyStrings[] = $policy->toArray(); + } + + $payload['policies'] = $policyStrings; + return JWT::encode($payload, $this->authToken, 'HS256'); + } +} diff --git a/app/api/Twilio/Jwt/TaskRouter/Policy.php b/app/api/Twilio/Jwt/TaskRouter/Policy.php new file mode 100755 index 0000000..ab81264 --- /dev/null +++ b/app/api/Twilio/Jwt/TaskRouter/Policy.php @@ -0,0 +1,54 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class Policy { + private $url; + private $method; + private $queryFilter; + private $postFilter; + private $allow; + + public function __construct(string $url, string $method, ?array $queryFilter = [], ?array $postFilter = [], bool $allow = true) { + $this->url = $url; + $this->method = $method; + $this->queryFilter = $queryFilter; + $this->postFilter = $postFilter; + $this->allow = $allow; + } + + public function addQueryFilter($queryFilter): void { + $this->queryFilter[] = $queryFilter; + } + + public function addPostFilter($postFilter): void { + $this->postFilter[] = $postFilter; + } + + public function toArray(): array { + $policy_array = ['url' => $this->url, 'method' => $this->method, 'allow' => $this->allow]; + if ($this->queryFilter !== null) { + if (\count($this->queryFilter) > 0) { + $policy_array['query_filter'] = $this->queryFilter; + } else { + $policy_array['query_filter'] = new \stdClass(); + } + } + if ($this->postFilter !== null) { + if (\count($this->postFilter) > 0) { + $policy_array['post_filter'] = $this->postFilter; + } else { + $policy_array['post_filter'] = new \stdClass(); + } + } + return $policy_array; + } +} diff --git a/app/api/Twilio/Jwt/TaskRouter/TaskQueueCapability.php b/app/api/Twilio/Jwt/TaskRouter/TaskQueueCapability.php new file mode 100755 index 0000000..0ed23ef --- /dev/null +++ b/app/api/Twilio/Jwt/TaskRouter/TaskQueueCapability.php @@ -0,0 +1,21 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class TaskQueueCapability extends CapabilityToken { + public function __construct(string $accountSid, string $authToken, string $workspaceSid, string $taskQueueSid, + string $overrideBaseUrl = null, string $overrideBaseWSUrl = null) { + parent::__construct($accountSid, $authToken, $workspaceSid, $taskQueueSid, null, $overrideBaseUrl, $overrideBaseWSUrl); + } + + protected function setupResource(): void { + $this->resourceUrl = $this->baseUrl . '/TaskQueues/' . $this->channelId; + } +} diff --git a/app/api/Twilio/Jwt/TaskRouter/WorkerCapability.php b/app/api/Twilio/Jwt/TaskRouter/WorkerCapability.php new file mode 100755 index 0000000..431f8c2 --- /dev/null +++ b/app/api/Twilio/Jwt/TaskRouter/WorkerCapability.php @@ -0,0 +1,49 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class WorkerCapability extends CapabilityToken { + private $tasksUrl; + private $workerReservationsUrl; + private $activityUrl; + + public function __construct(string $accountSid, string $authToken, string $workspaceSid, string $workerSid, + string $overrideBaseUrl = null, string $overrideBaseWSUrl = null) { + parent::__construct($accountSid, $authToken, $workspaceSid, $workerSid, null, $overrideBaseUrl, $overrideBaseWSUrl); + + $this->tasksUrl = $this->baseUrl . '/Tasks/**'; + $this->activityUrl = $this->baseUrl . '/Activities'; + $this->workerReservationsUrl = $this->resourceUrl . '/Reservations/**'; + + //add permissions to fetch the list of activities, tasks, and worker reservations + $this->allow($this->activityUrl, 'GET', null, null); + $this->allow($this->tasksUrl, 'GET', null, null); + $this->allow($this->workerReservationsUrl, 'GET', null, null); + } + + protected function setupResource(): void { + $this->resourceUrl = $this->baseUrl . '/Workers/' . $this->channelId; + } + + public function allowActivityUpdates(): void { + $method = 'POST'; + $queryFilter = []; + $postFilter = ['ActivitySid' => $this->required]; + $this->allow($this->resourceUrl, $method, $queryFilter, $postFilter); + } + + public function allowReservationUpdates(): void { + $method = 'POST'; + $queryFilter = []; + $postFilter = []; + $this->allow($this->tasksUrl, $method, $queryFilter, $postFilter); + $this->allow($this->workerReservationsUrl, $method, $queryFilter, $postFilter); + } +} diff --git a/app/api/Twilio/Jwt/TaskRouter/WorkspaceCapability.php b/app/api/Twilio/Jwt/TaskRouter/WorkspaceCapability.php new file mode 100755 index 0000000..39eeceb --- /dev/null +++ b/app/api/Twilio/Jwt/TaskRouter/WorkspaceCapability.php @@ -0,0 +1,16 @@ +resourceUrl = $this->baseUrl; + } +} diff --git a/app/api/Twilio/ListResource.php b/app/api/Twilio/ListResource.php new file mode 100755 index 0000000..705f908 --- /dev/null +++ b/app/api/Twilio/ListResource.php @@ -0,0 +1,19 @@ +version = $version; + } + + public function __toString(): string { + return '[ListResource]'; + } +} diff --git a/app/api/Twilio/Options.php b/app/api/Twilio/Options.php new file mode 100755 index 0000000..aa8851d --- /dev/null +++ b/app/api/Twilio/Options.php @@ -0,0 +1,13 @@ +options); + } +} diff --git a/app/api/Twilio/Page.php b/app/api/Twilio/Page.php new file mode 100755 index 0000000..252e388 --- /dev/null +++ b/app/api/Twilio/Page.php @@ -0,0 +1,195 @@ +processResponse($response); + + $this->version = $version; + $this->payload = $payload; + $this->solution = []; + $this->records = new \ArrayIterator($this->loadPage()); + } + + protected function processResponse(Response $response) { + if ($response->getStatusCode() !== 200 && !$this->isPagingEol($response->getContent())) { + $message = '[HTTP ' . $response->getStatusCode() . '] Unable to fetch page'; + $code = $response->getStatusCode(); + + $content = $response->getContent(); + $details = []; + $moreInfo = ''; + + if (\is_array($content)) { + $message .= isset($content['message']) ? ': ' . $content['message'] : ''; + $code = $content['code'] ?? $code; + $moreInfo = $content['more_info'] ?? ''; + $details = $content['details'] ?? [] ; + } + + throw new RestException($message, $code, $response->getStatusCode(), $moreInfo, $details); + } + return $response->getContent(); + } + + protected function isPagingEol(?array $content): bool { + return $content !== null && \array_key_exists('code', $content) && $content['code'] === 20006; + } + + protected function hasMeta(string $key): bool { + return \array_key_exists('meta', $this->payload) && \array_key_exists($key, $this->payload['meta']); + } + + protected function getMeta(string $key, string $default = null): ?string { + return $this->hasMeta($key) ? $this->payload['meta'][$key] : $default; + } + + protected function loadPage(): array { + $key = $this->getMeta('key'); + if ($key) { + return $this->payload[$key]; + } + + $keys = \array_keys($this->payload); + $key = \array_diff($keys, self::$metaKeys); + $key = \array_values($key); + + if (\count($key) === 1) { + return $this->payload[$key[0]]; + } + + // handle end of results error code + if ($this->isPagingEol($this->payload)) { + return []; + } + + throw new DeserializeException('Page Records can not be deserialized'); + } + + public function getPreviousPageUrl(): ?string { + if ($this->hasMeta('previous_page_url')) { + return $this->getMeta('previous_page_url'); + } else if (\array_key_exists('previous_page_uri', $this->payload) && $this->payload['previous_page_uri']) { + return $this->getVersion()->getDomain()->absoluteUrl($this->payload['previous_page_uri']); + } + return null; + } + + public function getNextPageUrl(): ?string { + if ($this->hasMeta('next_page_url')) { + return $this->getMeta('next_page_url'); + } else if (\array_key_exists('next_page_uri', $this->payload) && $this->payload['next_page_uri']) { + return $this->getVersion()->getDomain()->absoluteUrl($this->payload['next_page_uri']); + } + return null; + } + + public function nextPage(): ?Page { + if (!$this->getNextPageUrl()) { + return null; + } + + $response = $this->getVersion()->getDomain()->getClient()->request('GET', $this->getNextPageUrl()); + return new static($this->getVersion(), $response, $this->solution); + } + + public function previousPage(): ?Page { + if (!$this->getPreviousPageUrl()) { + return null; + } + + $response = $this->getVersion()->getDomain()->getClient()->request('GET', $this->getPreviousPageUrl()); + return new static($this->getVersion(), $response, $this->solution); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + #[\ReturnTypeWillChange] + public function current() { + return $this->buildInstance($this->records->current()); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + public function next(): void { + $this->records->next(); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return mixed scalar on success, or null on failure. + */ + #[\ReturnTypeWillChange] + public function key() { + return $this->records->key(); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return bool The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ + public function valid(): bool { + return $this->records->valid(); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + public function rewind(): void { + $this->records->rewind(); + } + + + public function getVersion(): Version { + return $this->version; + } + + public function __toString(): string { + return '[Page]'; + } + +} diff --git a/app/api/Twilio/Rest/Accounts.php b/app/api/Twilio/Rest/Accounts.php new file mode 100755 index 0000000..7d539dc --- /dev/null +++ b/app/api/Twilio/Rest/Accounts.php @@ -0,0 +1,47 @@ +authTokenPromotion instead + */ + protected function getAuthTokenPromotion(): \Twilio\Rest\Accounts\V1\AuthTokenPromotionList { + echo "authTokenPromotion is deprecated. Use v1->authTokenPromotion instead."; + return $this->v1->authTokenPromotion; + } + + /** + * @deprecated Use v1->authTokenPromotion() instead. + */ + protected function contextAuthTokenPromotion(): \Twilio\Rest\Accounts\V1\AuthTokenPromotionContext { + echo "authTokenPromotion() is deprecated. Use v1->authTokenPromotion() instead."; + return $this->v1->authTokenPromotion(); + } + + /** + * @deprecated Use v1->credentials instead. + */ + protected function getCredentials(): \Twilio\Rest\Accounts\V1\CredentialList { + echo "credentials is deprecated. Use v1->credentials instead."; + return $this->v1->credentials; + } + + /** + * @deprecated Use v1->secondaryAuthToken instead. + */ + protected function getSecondaryAuthToken(): \Twilio\Rest\Accounts\V1\SecondaryAuthTokenList { + echo "secondaryAuthToken is deprecated. Use v1->secondaryAuthToken instead."; + return $this->v1->secondaryAuthToken; + } + + /** + * @deprecated Use v1->secondaryAuthToken() instead. + */ + protected function contextSecondaryAuthToken(): \Twilio\Rest\Accounts\V1\SecondaryAuthTokenContext { + echo "secondaryAuthToken() is deprecated. Use v1->secondaryAuthToken() instead."; + return $this->v1->secondaryAuthToken(); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Accounts/V1.php b/app/api/Twilio/Rest/Accounts/V1.php new file mode 100755 index 0000000..036eb9c --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1.php @@ -0,0 +1,116 @@ +version = 'v1'; + } + + protected function getAuthTokenPromotion(): AuthTokenPromotionList + { + if (!$this->_authTokenPromotion) { + $this->_authTokenPromotion = new AuthTokenPromotionList($this); + } + return $this->_authTokenPromotion; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getSecondaryAuthToken(): SecondaryAuthTokenList + { + if (!$this->_secondaryAuthToken) { + $this->_secondaryAuthToken = new SecondaryAuthTokenList($this); + } + return $this->_secondaryAuthToken; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionContext.php b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionContext.php new file mode 100755 index 0000000..5681708 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionContext.php @@ -0,0 +1,75 @@ +solution = [ + ]; + + $this->uri = '/AuthTokens/Promote'; + } + + /** + * Update the AuthTokenPromotionInstance + * + * @return AuthTokenPromotionInstance Updated AuthTokenPromotionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): AuthTokenPromotionInstance + { + + $payload = $this->version->update('POST', $this->uri); + + return new AuthTokenPromotionInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.AuthTokenPromotionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionInstance.php b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionInstance.php new file mode 100755 index 0000000..14a1ab1 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionInstance.php @@ -0,0 +1,122 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'authToken' => Values::array_get($payload, 'auth_token'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthTokenPromotionContext Context for this AuthTokenPromotionInstance + */ + protected function proxy(): AuthTokenPromotionContext + { + if (!$this->context) { + $this->context = new AuthTokenPromotionContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Update the AuthTokenPromotionInstance + * + * @return AuthTokenPromotionInstance Updated AuthTokenPromotionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): AuthTokenPromotionInstance + { + + return $this->proxy()->update(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.AuthTokenPromotionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionList.php b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionList.php new file mode 100755 index 0000000..4f12292 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a AuthTokenPromotionContext + */ + public function getContext( + + ): AuthTokenPromotionContext + { + return new AuthTokenPromotionContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.AuthTokenPromotionList]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionPage.php b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionPage.php new file mode 100755 index 0000000..32a5ee2 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/AuthTokenPromotionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthTokenPromotionInstance \Twilio\Rest\Accounts\V1\AuthTokenPromotionInstance + */ + public function buildInstance(array $payload): AuthTokenPromotionInstance + { + return new AuthTokenPromotionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.AuthTokenPromotionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/AwsContext.php b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsContext.php new file mode 100755 index 0000000..638861a --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsContext.php @@ -0,0 +1,123 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/AWS/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AwsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AwsInstance + * + * @return AwsInstance Fetched AwsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AwsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AwsInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AwsInstance + * + * @param array|Options $options Optional Arguments + * @return AwsInstance Updated AwsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AwsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AwsInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.AwsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/AwsInstance.php b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsInstance.php new file mode 100755 index 0000000..f9bc1cc --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AwsContext Context for this AwsInstance + */ + protected function proxy(): AwsContext + { + if (!$this->context) { + $this->context = new AwsContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AwsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AwsInstance + * + * @return AwsInstance Fetched AwsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AwsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AwsInstance + * + * @param array|Options $options Optional Arguments + * @return AwsInstance Updated AwsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AwsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.AwsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/AwsList.php b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsList.php new file mode 100755 index 0000000..f77bc4c --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsList.php @@ -0,0 +1,194 @@ +solution = [ + ]; + + $this->uri = '/Credentials/AWS'; + } + + /** + * Create the AwsInstance + * + * @param string $credentials A string that contains the AWS access credentials in the format `:`. For example, `AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` + * @param array|Options $options Optional Arguments + * @return AwsInstance Created AwsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $credentials, array $options = []): AwsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Credentials' => + $credentials, + 'FriendlyName' => + $options['friendlyName'], + 'AccountSid' => + $options['accountSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AwsInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AwsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AwsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AwsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AwsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AwsPage Page of AwsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AwsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AwsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AwsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AwsPage Page of AwsInstance + */ + public function getPage(string $targetUrl): AwsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AwsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AwsContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the AWS resource to delete. + */ + public function getContext( + string $sid + + ): AwsContext + { + return new AwsContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.AwsList]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/AwsOptions.php b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsOptions.php new file mode 100755 index 0000000..ca016b2 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + $this->options['accountSid'] = $accountSid; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request. + * + * @param string $accountSid The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request. + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Accounts.V1.CreateAwsOptions ' . $options . ']'; + } +} + + + + +class UpdateAwsOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Accounts.V1.UpdateAwsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/AwsPage.php b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsPage.php new file mode 100755 index 0000000..94483b3 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/AwsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AwsInstance \Twilio\Rest\Accounts\V1\Credential\AwsInstance + */ + public function buildInstance(array $payload): AwsInstance + { + return new AwsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.AwsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyContext.php b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyContext.php new file mode 100755 index 0000000..22867ff --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyContext.php @@ -0,0 +1,123 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/PublicKeys/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the PublicKeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the PublicKeyInstance + * + * @return PublicKeyInstance Fetched PublicKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PublicKeyInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PublicKeyInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the PublicKeyInstance + * + * @param array|Options $options Optional Arguments + * @return PublicKeyInstance Updated PublicKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PublicKeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new PublicKeyInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.PublicKeyContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyInstance.php b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyInstance.php new file mode 100755 index 0000000..5032fc4 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PublicKeyContext Context for this PublicKeyInstance + */ + protected function proxy(): PublicKeyContext + { + if (!$this->context) { + $this->context = new PublicKeyContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the PublicKeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the PublicKeyInstance + * + * @return PublicKeyInstance Fetched PublicKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PublicKeyInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the PublicKeyInstance + * + * @param array|Options $options Optional Arguments + * @return PublicKeyInstance Updated PublicKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PublicKeyInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.PublicKeyInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyList.php b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyList.php new file mode 100755 index 0000000..3ab08fa --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyList.php @@ -0,0 +1,194 @@ +solution = [ + ]; + + $this->uri = '/Credentials/PublicKeys'; + } + + /** + * Create the PublicKeyInstance + * + * @param string $publicKey A URL encoded representation of the public key. For example, `-----BEGIN PUBLIC KEY-----MIIBIjANB.pa9xQIDAQAB-----END PUBLIC KEY-----` + * @param array|Options $options Optional Arguments + * @return PublicKeyInstance Created PublicKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $publicKey, array $options = []): PublicKeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PublicKey' => + $publicKey, + 'FriendlyName' => + $options['friendlyName'], + 'AccountSid' => + $options['accountSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PublicKeyInstance( + $this->version, + $payload + ); + } + + + /** + * Reads PublicKeyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PublicKeyInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PublicKeyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PublicKeyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PublicKeyPage Page of PublicKeyInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PublicKeyPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PublicKeyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PublicKeyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PublicKeyPage Page of PublicKeyInstance + */ + public function getPage(string $targetUrl): PublicKeyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PublicKeyPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PublicKeyContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the PublicKey resource to delete. + */ + public function getContext( + string $sid + + ): PublicKeyContext + { + return new PublicKeyContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.PublicKeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyOptions.php b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyOptions.php new file mode 100755 index 0000000..acd9687 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + $this->options['accountSid'] = $accountSid; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request + * + * @param string $accountSid The SID of the Subaccount that this Credential should be associated with. Must be a valid Subaccount of the account issuing the request + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Accounts.V1.CreatePublicKeyOptions ' . $options . ']'; + } +} + + + + +class UpdatePublicKeyOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Accounts.V1.UpdatePublicKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyPage.php b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyPage.php new file mode 100755 index 0000000..3c2c656 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/Credential/PublicKeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PublicKeyInstance \Twilio\Rest\Accounts\V1\Credential\PublicKeyInstance + */ + public function buildInstance(array $payload): PublicKeyInstance + { + return new PublicKeyInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.PublicKeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/CredentialInstance.php b/app/api/Twilio/Rest/Accounts/V1/CredentialInstance.php new file mode 100755 index 0000000..3e4b9b1 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/CredentialInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.CredentialInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/CredentialList.php b/app/api/Twilio/Rest/Accounts/V1/CredentialList.php new file mode 100755 index 0000000..6b8e6c1 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/CredentialList.php @@ -0,0 +1,123 @@ +solution = [ + ]; + } + + /** + * Access the aws + */ + protected function getAws(): AwsList + { + if (!$this->_aws) { + $this->_aws = new AwsList( + $this->version + ); + } + return $this->_aws; + } + + /** + * Access the publicKey + */ + protected function getPublicKey(): PublicKeyList + { + if (!$this->_publicKey) { + $this->_publicKey = new PublicKeyList( + $this->version + ); + } + return $this->_publicKey; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/CredentialPage.php b/app/api/Twilio/Rest/Accounts/V1/CredentialPage.php new file mode 100755 index 0000000..95adb71 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Accounts\V1\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenContext.php b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenContext.php new file mode 100755 index 0000000..f5883be --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenContext.php @@ -0,0 +1,88 @@ +solution = [ + ]; + + $this->uri = '/AuthTokens/Secondary'; + } + + /** + * Create the SecondaryAuthTokenInstance + * + * @return SecondaryAuthTokenInstance Created SecondaryAuthTokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): SecondaryAuthTokenInstance + { + + $payload = $this->version->create('POST', $this->uri); + + return new SecondaryAuthTokenInstance( + $this->version, + $payload + ); + } + + + /** + * Delete the SecondaryAuthTokenInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.SecondaryAuthTokenContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenInstance.php b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenInstance.php new file mode 100755 index 0000000..c9e8f73 --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'secondaryAuthToken' => Values::array_get($payload, 'secondary_auth_token'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SecondaryAuthTokenContext Context for this SecondaryAuthTokenInstance + */ + protected function proxy(): SecondaryAuthTokenContext + { + if (!$this->context) { + $this->context = new SecondaryAuthTokenContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Create the SecondaryAuthTokenInstance + * + * @return SecondaryAuthTokenInstance Created SecondaryAuthTokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): SecondaryAuthTokenInstance + { + + return $this->proxy()->create(); + } + + /** + * Delete the SecondaryAuthTokenInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Accounts.V1.SecondaryAuthTokenInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenList.php b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenList.php new file mode 100755 index 0000000..c3671ab --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a SecondaryAuthTokenContext + */ + public function getContext( + + ): SecondaryAuthTokenContext + { + return new SecondaryAuthTokenContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.SecondaryAuthTokenList]'; + } +} diff --git a/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenPage.php b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenPage.php new file mode 100755 index 0000000..9e4809b --- /dev/null +++ b/app/api/Twilio/Rest/Accounts/V1/SecondaryAuthTokenPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SecondaryAuthTokenInstance \Twilio\Rest\Accounts\V1\SecondaryAuthTokenInstance + */ + public function buildInstance(array $payload): SecondaryAuthTokenInstance + { + return new SecondaryAuthTokenInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Accounts.V1.SecondaryAuthTokenPage]'; + } +} diff --git a/app/api/Twilio/Rest/AccountsBase.php b/app/api/Twilio/Rest/AccountsBase.php new file mode 100755 index 0000000..87371cb --- /dev/null +++ b/app/api/Twilio/Rest/AccountsBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://accounts.twilio.com'; + } + + + /** + * @return V1 Version v1 of accounts + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Accounts]'; + } +} diff --git a/app/api/Twilio/Rest/Api.php b/app/api/Twilio/Rest/Api.php new file mode 100755 index 0000000..dc589b1 --- /dev/null +++ b/app/api/Twilio/Rest/Api.php @@ -0,0 +1,371 @@ +v2010->account; + } + + protected function getAccounts(): \Twilio\Rest\Api\V2010\AccountList { + return $this->v2010->accounts; + } + + /** + * @param string $sid Fetch by unique Account Sid + */ + protected function contextAccounts(string $sid): \Twilio\Rest\Api\V2010\AccountContext { + return $this->v2010->accounts($sid); + } + + /** + * @deprecated Use account->addresses instead. + */ + protected function getAddresses(): \Twilio\Rest\Api\V2010\Account\AddressList { + echo "addresses is deprecated. Use account->addresses instead."; + return $this->v2010->account->addresses; + } + + /** + * @deprecated Use account->addresses(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextAddresses(string $sid): \Twilio\Rest\Api\V2010\Account\AddressContext { + echo "addresses(\$sid) is deprecated. Use account->addresses(\$sid) instead."; + return $this->v2010->account->addresses($sid); + } + + /** + * @deprecated Use account->applications instead. + */ + protected function getApplications(): \Twilio\Rest\Api\V2010\Account\ApplicationList { + echo "applications is deprecated. Use account->applications instead."; + return $this->v2010->account->applications; + } + + /** + * @deprecated Use account->applications(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextApplications(string $sid): \Twilio\Rest\Api\V2010\Account\ApplicationContext { + echo "applications(\$sid) is deprecated. Use account->applications(\$sid) instead."; + return $this->v2010->account->applications($sid); + } + + /** + * @deprecated Use account->authorizedConnectApps instead. + */ + protected function getAuthorizedConnectApps(): \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppList { + echo "authorizedConnectApps is deprecated. Use account->authorizedConnectApps instead."; + return $this->v2010->account->authorizedConnectApps; + } + + /** + * @deprecated Use account->authorizedConnectApps(\$connectAppSid) instead. + * @param string $connectAppSid The SID of the Connect App to fetch + */ + protected function contextAuthorizedConnectApps(string $connectAppSid): \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppContext { + echo "authorizedConnectApps(\$connectAppSid) is deprecated. Use account->authorizedConnectApps(\$connectAppSid) instead."; + return $this->v2010->account->authorizedConnectApps($connectAppSid); + } + + /** + * @deprecated Use account->availablePhoneNumbers instead. + */ + protected function getAvailablePhoneNumbers(): \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryList { + echo "availablePhoneNumbers is deprecated. Use account->availablePhoneNumbers instead."; + return $this->v2010->account->availablePhoneNumbers; + } + + /** + * @deprecated Use account->availablePhoneNumbers(\$countryCode) instead. + * @param string $countryCode The ISO country code of the country to fetch + * available phone number information about + */ + protected function contextAvailablePhoneNumbers(string $countryCode): \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryContext { + echo "availablePhoneNumbers(\$countryCode) is deprecated. Use account->availablePhoneNumbers(\$countryCode) instead."; + return $this->v2010->account->availablePhoneNumbers($countryCode); + } + + /** + * @deprecated Use account->balance instead. + */ + protected function getBalance(): \Twilio\Rest\Api\V2010\Account\BalanceList { + echo "balance is deprecated. Use account->balance instead."; + return $this->v2010->account->balance; + } + + /** + * @deprecated Use account->calls instead + */ + protected function getCalls(): \Twilio\Rest\Api\V2010\Account\CallList { + echo "calls is deprecated. Use account->calls instead."; + return $this->v2010->account->calls; + } + + /** + * @deprecated Use account->calls(\$sid) instead. + * @param string $sid The SID of the Call resource to fetch + */ + protected function contextCalls(string $sid): \Twilio\Rest\Api\V2010\Account\CallContext { + echo "calls(\$sid) is deprecated. Use account->calls(\$sid) instead."; + return $this->v2010->account->calls($sid); + } + + /** + * @deprecated Use account->conferences instead. + */ + protected function getConferences(): \Twilio\Rest\Api\V2010\Account\ConferenceList { + echo "conferences is deprecated. Use account->conferences instead."; + return $this->v2010->account->conferences; + } + + /** + * @deprecated Use account->conferences(\$sid) instead. + * @param string $sid The unique string that identifies this resource + */ + protected function contextConferences(string $sid): \Twilio\Rest\Api\V2010\Account\ConferenceContext { + echo "conferences(\$sid) is deprecated. Use account->conferences(\$sid) instead."; + return $this->v2010->account->conferences($sid); + } + + /** + * @deprecated Use account->connectApps instead. + */ + protected function getConnectApps(): \Twilio\Rest\Api\V2010\Account\ConnectAppList { + echo "connectApps is deprecated. Use account->connectApps instead."; + return $this->v2010->account->connectApps; + } + + /** + * @deprecated account->connectApps(\$sid) + * @param string $sid The unique string that identifies the resource + */ + protected function contextConnectApps(string $sid): \Twilio\Rest\Api\V2010\Account\ConnectAppContext { + echo "connectApps(\$sid) is deprecated. Use account->connectApps(\$sid) instead."; + return $this->v2010->account->connectApps($sid); + } + + /** + * @deprecated Use account->incomingPhoneNumbers instead + */ + protected function getIncomingPhoneNumbers(): \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberList { + echo "incomingPhoneNumbers is deprecated. Use account->incomingPhoneNumbers instead."; + return $this->v2010->account->incomingPhoneNumbers; + } + + /** + * @deprecated Use account->incomingPhoneNumbers(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextIncomingPhoneNumbers(string $sid): \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberContext { + echo "incomingPhoneNumbers(\$sid) is deprecated. Use account->incomingPhoneNumbers(\$sid) instead."; + return $this->v2010->account->incomingPhoneNumbers($sid); + } + + /** + * @deprecated Use account->keys instead. + */ + protected function getKeys(): \Twilio\Rest\Api\V2010\Account\KeyList { + echo "keys is deprecated. Use account->keys instead."; + return $this->v2010->account->keys; + } + + /** + * @deprecated Use account->keys(\$sid) instead + * @param string $sid The unique string that identifies the resource + */ + protected function contextKeys(string $sid): \Twilio\Rest\Api\V2010\Account\KeyContext { + echo "keys(\$sid) is deprecated. Use account->keys(\$sid) instead."; + return $this->v2010->account->keys($sid); + } + + /** + * @deprecated Use account->messages instead. + */ + protected function getMessages(): \Twilio\Rest\Api\V2010\Account\MessageList { + echo "messages is deprecated. Use account->messages instead."; + return $this->v2010->account->messages; + } + + /** + * @deprecated Use account->messages(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextMessages(string $sid): \Twilio\Rest\Api\V2010\Account\MessageContext { + echo "amessages(\$sid) is deprecated. Use account->messages(\$sid) instead."; + return $this->v2010->account->messages($sid); + } + + /** + * @deprecated Use account->newKeys instead. + */ + protected function getNewKeys(): \Twilio\Rest\Api\V2010\Account\NewKeyList { + echo "newKeys is deprecated. Use account->newKeys instead."; + return $this->v2010->account->newKeys; + } + + /** + * @deprecated Use account->newSigningKeys instead. + */ + protected function getNewSigningKeys(): \Twilio\Rest\Api\V2010\Account\NewSigningKeyList { + echo "newSigningKeys is deprecated. Use account->newSigningKeys instead."; + return $this->v2010->account->newSigningKeys; + } + + /** + * @deprecated Use account->notifications instead. + */ + protected function getNotifications(): \Twilio\Rest\Api\V2010\Account\NotificationList { + echo "notifications is deprecated. Use account->notifications instead."; + return $this->v2010->account->notifications; + } + + /** + * @deprecated Use account->notifications(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextNotifications(string $sid): \Twilio\Rest\Api\V2010\Account\NotificationContext { + echo "notifications(\$sid) is deprecated. Use account->notifications(\$sid) instead."; + return $this->v2010->account->notifications($sid); + } + + /** + * @deprecated Use account->outgoingCallerIds instead. + */ + protected function getOutgoingCallerIds(): \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdList { + echo "outgoingCallerIds is deprecated. Use account->outgoingCallerIds instead."; + return $this->v2010->account->outgoingCallerIds; + } + + /** + * @deprecated Use account->outgoingCallerIds(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextOutgoingCallerIds(string $sid): \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdContext { + echo "outgoingCallerIds(\$sid) is deprecated. Use account->outgoingCallerIds(\$sid) instead."; + return $this->v2010->account->outgoingCallerIds($sid); + } + + /** + * @deprecated Use account->queues instead. + */ + protected function getQueues(): \Twilio\Rest\Api\V2010\Account\QueueList { + echo "queues is deprecated. Use account->queues instead."; + return $this->v2010->account->queues; + } + + /** + * @deprecated Use account->queues(\$sid) instead. + * @param string $sid The unique string that identifies this resource + */ + protected function contextQueues(string $sid): \Twilio\Rest\Api\V2010\Account\QueueContext { + echo "queues(\$sid) is deprecated. Use account->queues(\$sid) instead."; + return $this->v2010->account->queues($sid); + } + + /** + * @deprecated Use account->recordings instead. + */ + protected function getRecordings(): \Twilio\Rest\Api\V2010\Account\RecordingList { + echo "recordings is deprecated. Use account->recordings instead."; + return $this->v2010->account->recordings; + } + + /** + * @deprecated Use account->recordings(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextRecordings(string $sid): \Twilio\Rest\Api\V2010\Account\RecordingContext { + echo "recordings(\$sid) is deprecated. Use account->recordings(\$sid) instead."; + return $this->v2010->account->recordings($sid); + } + + /** + * @deprecated Use account->signingKeys instead. + */ + protected function getSigningKeys(): \Twilio\Rest\Api\V2010\Account\SigningKeyList { + echo "signingKeys is deprecated. Use account->signingKeys instead."; + return $this->v2010->account->signingKeys; + } + + /** + * @deprecated Use account->signingKeys(\$sid) instead. + * @param string $sid The sid + */ + protected function contextSigningKeys(string $sid): \Twilio\Rest\Api\V2010\Account\SigningKeyContext { + echo "signingKeys(\$sid) is deprecated. Use account->signingKeys(\$sid) instead."; + return $this->v2010->account->signingKeys($sid); + } + + /** + * @deprecated Use account->sip instead. + */ + protected function getSip(): \Twilio\Rest\Api\V2010\Account\SipList { + echo "sip is deprecated. Use account->sip instead."; + return $this->v2010->account->sip; + } + + /** + * @deprecated Use account->shortCodes instead. + */ + protected function getShortCodes(): \Twilio\Rest\Api\V2010\Account\ShortCodeList { + echo "shortCodes is deprecated. Use account->shortCodes instead."; + return $this->v2010->account->shortCodes; + } + + /** + * @deprecated Use account->shortCodes(\$sid) instead. + * @param string $sid The unique string that identifies this resource + */ + protected function contextShortCodes(string $sid): \Twilio\Rest\Api\V2010\Account\ShortCodeContext { + echo "shortCodes(\$sid) is deprecated. Use account->shortCodes(\$sid) instead."; + return $this->v2010->account->shortCodes($sid); + } + + /** + * @deprecated Use account->token instead. + */ + protected function getTokens(): \Twilio\Rest\Api\V2010\Account\TokenList { + echo "tokens is deprecated. Use account->token instead."; + return $this->v2010->account->tokens; + } + + /** + * @deprecated Use account->transcriptions instead. + */ + protected function getTranscriptions(): \Twilio\Rest\Api\V2010\Account\TranscriptionList { + echo "transcriptions is deprecated. Use account->transcriptions instead."; + return $this->v2010->account->transcriptions; + } + + /** + * @deprecated Use account->transcriptions(\$sid) instead + * @param string $sid The unique string that identifies the resource + */ + protected function contextTranscriptions(string $sid): \Twilio\Rest\Api\V2010\Account\TranscriptionContext { + echo "transcriptions(\$sid) is deprecated. Use account->transcriptions(\$sid) instead."; + return $this->v2010->account->transcriptions($sid); + } + + /** + * @deprecated Use account->usage instead. + */ + protected function getUsage(): \Twilio\Rest\Api\V2010\Account\UsageList { + echo "usage is deprecated. Use account->usage instead."; + return $this->v2010->account->usage; + } + + /** + * @deprecated Use account->validationRequests instead. + */ + protected function getValidationRequests(): \Twilio\Rest\Api\V2010\Account\ValidationRequestList { + echo "validationRequests is deprecated. Use account->validationRequests instead."; + return $this->v2010->account->validationRequests; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Api/V2010.php b/app/api/Twilio/Rest/Api/V2010.php new file mode 100755 index 0000000..a82ad29 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010.php @@ -0,0 +1,309 @@ +version = '2010-04-01'; + } + + protected function getAccounts(): AccountList + { + if (!$this->_accounts) { + $this->_accounts = new AccountList($this); + } + return $this->_accounts; + } + + /** + * @return AccountContext Account provided as the authenticating account + */ + protected function getAccount(): AccountContext + { + if (!$this->_account) { + $this->_account = new AccountContext( + $this, + $this->domain->getClient()->getAccountSid() + ); + } + return $this->_account; + } + + /** + * Setter to override the primary account + * + * @param AccountContext|AccountInstance $account account to use as the primary + * account + */ + public function setAccount($account): void + { + $this->_account = $account; + } + + protected function getRecordings(): \Twilio\Rest\Api\V2010\Account\RecordingList + { + return $this->account->recordings; + } + + protected function getUsage(): \Twilio\Rest\Api\V2010\Account\UsageList + { + return $this->account->usage; + } + + protected function getMessages(): \Twilio\Rest\Api\V2010\Account\MessageList + { + return $this->account->messages; + } + + protected function getKeys(): \Twilio\Rest\Api\V2010\Account\KeyList + { + return $this->account->keys; + } + + protected function getNewKeys(): \Twilio\Rest\Api\V2010\Account\NewKeyList + { + return $this->account->newKeys; + } + + protected function getApplications(): \Twilio\Rest\Api\V2010\Account\ApplicationList + { + return $this->account->applications; + } + + protected function getIncomingPhoneNumbers(): \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberList + { + return $this->account->incomingPhoneNumbers; + } + + protected function getConferences(): \Twilio\Rest\Api\V2010\Account\ConferenceList + { + return $this->account->conferences; + } + + protected function getCalls(): \Twilio\Rest\Api\V2010\Account\CallList + { + return $this->account->calls; + } + + protected function getOutgoingCallerIds(): \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdList + { + return $this->account->outgoingCallerIds; + } + + protected function getValidationRequests(): \Twilio\Rest\Api\V2010\Account\ValidationRequestList + { + return $this->account->validationRequests; + } + + protected function getTranscriptions(): \Twilio\Rest\Api\V2010\Account\TranscriptionList + { + return $this->account->transcriptions; + } + + protected function getConnectApps(): \Twilio\Rest\Api\V2010\Account\ConnectAppList + { + return $this->account->connectApps; + } + + protected function getAuthorizedConnectApps(): \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppList + { + return $this->account->authorizedConnectApps; + } + + protected function getTokens(): \Twilio\Rest\Api\V2010\Account\TokenList + { + return $this->account->tokens; + } + + protected function getBalance(): \Twilio\Rest\Api\V2010\Account\BalanceList + { + return $this->account->balance; + } + + protected function getSip(): \Twilio\Rest\Api\V2010\Account\SipList + { + return $this->account->sip; + } + + protected function getNotifications(): \Twilio\Rest\Api\V2010\Account\NotificationList + { + return $this->account->notifications; + } + + protected function getAvailablePhoneNumbers(): \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryList + { + return $this->account->availablePhoneNumbers; + } + + protected function getAddresses(): \Twilio\Rest\Api\V2010\Account\AddressList + { + return $this->account->addresses; + } + + protected function getQueues(): \Twilio\Rest\Api\V2010\Account\QueueList + { + return $this->account->queues; + } + + protected function getShortCodes(): \Twilio\Rest\Api\V2010\Account\ShortCodeList + { + return $this->account->shortCodes; + } + + protected function getSigningKeys(): \Twilio\Rest\Api\V2010\Account\SigningKeyList + { + return $this->account->signingKeys; + } + + protected function getNewSigningKeys(): \Twilio\Rest\Api\V2010\Account\NewSigningKeyList + { + return $this->account->newSigningKeys; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberInstance.php new file mode 100755 index 0000000..a5cfecf --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberInstance.php @@ -0,0 +1,133 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'capabilities' => Values::array_get($payload, 'capabilities'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'emergencyStatus' => Values::array_get($payload, 'emergency_status'), + 'emergencyAddressSid' => Values::array_get($payload, 'emergency_address_sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'addressSid' => $addressSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DependentPhoneNumberInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberList.php b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberList.php new file mode 100755 index 0000000..3e7ba4b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberList.php @@ -0,0 +1,157 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'addressSid' => + $addressSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Addresses/' . \rawurlencode($addressSid) + .'/DependentPhoneNumbers.json'; + } + + /** + * Reads DependentPhoneNumberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DependentPhoneNumberInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DependentPhoneNumberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DependentPhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DependentPhoneNumberPage Page of DependentPhoneNumberInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DependentPhoneNumberPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DependentPhoneNumberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DependentPhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DependentPhoneNumberPage Page of DependentPhoneNumberInstance + */ + public function getPage(string $targetUrl): DependentPhoneNumberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DependentPhoneNumberPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DependentPhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberPage.php new file mode 100755 index 0000000..091edd7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Address/DependentPhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DependentPhoneNumberInstance \Twilio\Rest\Api\V2010\Account\Address\DependentPhoneNumberInstance + */ + public function buildInstance(array $payload): DependentPhoneNumberInstance + { + return new DependentPhoneNumberInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['addressSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DependentPhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AddressContext.php b/app/api/Twilio/Rest/Api/V2010/Account/AddressContext.php new file mode 100755 index 0000000..c47a048 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AddressContext.php @@ -0,0 +1,205 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Addresses/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AddressInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AddressInstance + * + * @return AddressInstance Fetched AddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddressInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AddressInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the AddressInstance + * + * @param array|Options $options Optional Arguments + * @return AddressInstance Updated AddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AddressInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'CustomerName' => + $options['customerName'], + 'Street' => + $options['street'], + 'City' => + $options['city'], + 'Region' => + $options['region'], + 'PostalCode' => + $options['postalCode'], + 'EmergencyEnabled' => + Serialize::booleanToString($options['emergencyEnabled']), + 'AutoCorrectAddress' => + Serialize::booleanToString($options['autoCorrectAddress']), + 'StreetSecondary' => + $options['streetSecondary'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AddressInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the dependentPhoneNumbers + */ + protected function getDependentPhoneNumbers(): DependentPhoneNumberList + { + if (!$this->_dependentPhoneNumbers) { + $this->_dependentPhoneNumbers = new DependentPhoneNumberList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_dependentPhoneNumbers; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AddressContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AddressInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AddressInstance.php new file mode 100755 index 0000000..7ccd971 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AddressInstance.php @@ -0,0 +1,185 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'city' => Values::array_get($payload, 'city'), + 'customerName' => Values::array_get($payload, 'customer_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'region' => Values::array_get($payload, 'region'), + 'sid' => Values::array_get($payload, 'sid'), + 'street' => Values::array_get($payload, 'street'), + 'uri' => Values::array_get($payload, 'uri'), + 'emergencyEnabled' => Values::array_get($payload, 'emergency_enabled'), + 'validated' => Values::array_get($payload, 'validated'), + 'verified' => Values::array_get($payload, 'verified'), + 'streetSecondary' => Values::array_get($payload, 'street_secondary'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AddressContext Context for this AddressInstance + */ + protected function proxy(): AddressContext + { + if (!$this->context) { + $this->context = new AddressContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AddressInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AddressInstance + * + * @return AddressInstance Fetched AddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddressInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AddressInstance + * + * @param array|Options $options Optional Arguments + * @return AddressInstance Updated AddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AddressInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the dependentPhoneNumbers + */ + protected function getDependentPhoneNumbers(): DependentPhoneNumberList + { + return $this->proxy()->dependentPhoneNumbers; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AddressInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AddressList.php b/app/api/Twilio/Rest/Api/V2010/Account/AddressList.php new file mode 100755 index 0000000..bfa6cd0 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AddressList.php @@ -0,0 +1,232 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Addresses.json'; + } + + /** + * Create the AddressInstance + * + * @param string $customerName The name to associate with the new address. + * @param string $street The number and street address of the new address. + * @param string $city The city of the new address. + * @param string $region The state or region of the new address. + * @param string $postalCode The postal code of the new address. + * @param string $isoCountry The ISO country code of the new address. + * @param array|Options $options Optional Arguments + * @return AddressInstance Created AddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $customerName, string $street, string $city, string $region, string $postalCode, string $isoCountry, array $options = []): AddressInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CustomerName' => + $customerName, + 'Street' => + $street, + 'City' => + $city, + 'Region' => + $region, + 'PostalCode' => + $postalCode, + 'IsoCountry' => + $isoCountry, + 'FriendlyName' => + $options['friendlyName'], + 'EmergencyEnabled' => + Serialize::booleanToString($options['emergencyEnabled']), + 'AutoCorrectAddress' => + Serialize::booleanToString($options['autoCorrectAddress']), + 'StreetSecondary' => + $options['streetSecondary'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AddressInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads AddressInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AddressInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AddressInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AddressInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AddressPage Page of AddressInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AddressPage + { + $options = new Values($options); + + $params = Values::of([ + 'CustomerName' => + $options['customerName'], + 'FriendlyName' => + $options['friendlyName'], + 'IsoCountry' => + $options['isoCountry'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AddressPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AddressInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AddressPage Page of AddressInstance + */ + public function getPage(string $targetUrl): AddressPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AddressPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AddressContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Address resource to delete. + */ + public function getContext( + string $sid + + ): AddressContext + { + return new AddressContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AddressList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AddressOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AddressOptions.php new file mode 100755 index 0000000..0d4e1a9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AddressOptions.php @@ -0,0 +1,418 @@ +options['friendlyName'] = $friendlyName; + $this->options['emergencyEnabled'] = $emergencyEnabled; + $this->options['autoCorrectAddress'] = $autoCorrectAddress; + $this->options['streetSecondary'] = $streetSecondary; + } + + /** + * A descriptive string that you create to describe the new address. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new address. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether to enable emergency calling on the new address. Can be: `true` or `false`. + * + * @param bool $emergencyEnabled Whether to enable emergency calling on the new address. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setEmergencyEnabled(bool $emergencyEnabled): self + { + $this->options['emergencyEnabled'] = $emergencyEnabled; + return $this; + } + + /** + * Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + * + * @param bool $autoCorrectAddress Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + * @return $this Fluent Builder + */ + public function setAutoCorrectAddress(bool $autoCorrectAddress): self + { + $this->options['autoCorrectAddress'] = $autoCorrectAddress; + return $this; + } + + /** + * The additional number and street address of the address. + * + * @param string $streetSecondary The additional number and street address of the address. + * @return $this Fluent Builder + */ + public function setStreetSecondary(string $streetSecondary): self + { + $this->options['streetSecondary'] = $streetSecondary; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateAddressOptions ' . $options . ']'; + } +} + + + +class ReadAddressOptions extends Options + { + /** + * @param string $customerName The `customer_name` of the Address resources to read. + * @param string $friendlyName The string that identifies the Address resources to read. + * @param string $isoCountry The ISO country code of the Address resources to read. + */ + public function __construct( + + string $customerName = Values::NONE, + string $friendlyName = Values::NONE, + string $isoCountry = Values::NONE + + ) { + $this->options['customerName'] = $customerName; + $this->options['friendlyName'] = $friendlyName; + $this->options['isoCountry'] = $isoCountry; + } + + /** + * The `customer_name` of the Address resources to read. + * + * @param string $customerName The `customer_name` of the Address resources to read. + * @return $this Fluent Builder + */ + public function setCustomerName(string $customerName): self + { + $this->options['customerName'] = $customerName; + return $this; + } + + /** + * The string that identifies the Address resources to read. + * + * @param string $friendlyName The string that identifies the Address resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The ISO country code of the Address resources to read. + * + * @param string $isoCountry The ISO country code of the Address resources to read. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadAddressOptions ' . $options . ']'; + } +} + +class UpdateAddressOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the address. It can be up to 64 characters long. + * @param string $customerName The name to associate with the address. + * @param string $street The number and street address of the address. + * @param string $city The city of the address. + * @param string $region The state or region of the address. + * @param string $postalCode The postal code of the address. + * @param bool $emergencyEnabled Whether to enable emergency calling on the address. Can be: `true` or `false`. + * @param bool $autoCorrectAddress Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + * @param string $streetSecondary The additional number and street address of the address. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $customerName = Values::NONE, + string $street = Values::NONE, + string $city = Values::NONE, + string $region = Values::NONE, + string $postalCode = Values::NONE, + bool $emergencyEnabled = Values::BOOL_NONE, + bool $autoCorrectAddress = Values::BOOL_NONE, + string $streetSecondary = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['customerName'] = $customerName; + $this->options['street'] = $street; + $this->options['city'] = $city; + $this->options['region'] = $region; + $this->options['postalCode'] = $postalCode; + $this->options['emergencyEnabled'] = $emergencyEnabled; + $this->options['autoCorrectAddress'] = $autoCorrectAddress; + $this->options['streetSecondary'] = $streetSecondary; + } + + /** + * A descriptive string that you create to describe the address. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the address. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The name to associate with the address. + * + * @param string $customerName The name to associate with the address. + * @return $this Fluent Builder + */ + public function setCustomerName(string $customerName): self + { + $this->options['customerName'] = $customerName; + return $this; + } + + /** + * The number and street address of the address. + * + * @param string $street The number and street address of the address. + * @return $this Fluent Builder + */ + public function setStreet(string $street): self + { + $this->options['street'] = $street; + return $this; + } + + /** + * The city of the address. + * + * @param string $city The city of the address. + * @return $this Fluent Builder + */ + public function setCity(string $city): self + { + $this->options['city'] = $city; + return $this; + } + + /** + * The state or region of the address. + * + * @param string $region The state or region of the address. + * @return $this Fluent Builder + */ + public function setRegion(string $region): self + { + $this->options['region'] = $region; + return $this; + } + + /** + * The postal code of the address. + * + * @param string $postalCode The postal code of the address. + * @return $this Fluent Builder + */ + public function setPostalCode(string $postalCode): self + { + $this->options['postalCode'] = $postalCode; + return $this; + } + + /** + * Whether to enable emergency calling on the address. Can be: `true` or `false`. + * + * @param bool $emergencyEnabled Whether to enable emergency calling on the address. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setEmergencyEnabled(bool $emergencyEnabled): self + { + $this->options['emergencyEnabled'] = $emergencyEnabled; + return $this; + } + + /** + * Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + * + * @param bool $autoCorrectAddress Whether we should automatically correct the address. Can be: `true` or `false` and the default is `true`. If empty or `true`, we will correct the address you provide if necessary. If `false`, we won't alter the address you provide. + * @return $this Fluent Builder + */ + public function setAutoCorrectAddress(bool $autoCorrectAddress): self + { + $this->options['autoCorrectAddress'] = $autoCorrectAddress; + return $this; + } + + /** + * The additional number and street address of the address. + * + * @param string $streetSecondary The additional number and street address of the address. + * @return $this Fluent Builder + */ + public function setStreetSecondary(string $streetSecondary): self + { + $this->options['streetSecondary'] = $streetSecondary; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateAddressOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AddressPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AddressPage.php new file mode 100755 index 0000000..d5ad2f1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AddressPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AddressInstance \Twilio\Rest\Api\V2010\Account\AddressInstance + */ + public function buildInstance(array $payload): AddressInstance + { + return new AddressInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AddressPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ApplicationContext.php b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationContext.php new file mode 100755 index 0000000..87b2ae2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationContext.php @@ -0,0 +1,161 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Applications/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the ApplicationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ApplicationInstance + * + * @return ApplicationInstance Fetched ApplicationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ApplicationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ApplicationInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ApplicationInstance + * + * @param array|Options $options Optional Arguments + * @return ApplicationInstance Updated ApplicationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ApplicationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ApiVersion' => + $options['apiVersion'], + 'VoiceUrl' => + $options['voiceUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'SmsUrl' => + $options['smsUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsStatusCallback' => + $options['smsStatusCallback'], + 'MessageStatusCallback' => + $options['messageStatusCallback'], + 'PublicApplicationConnectEnabled' => + Serialize::booleanToString($options['publicApplicationConnectEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ApplicationInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ApplicationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ApplicationInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationInstance.php new file mode 100755 index 0000000..0032270 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationInstance.php @@ -0,0 +1,184 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'messageStatusCallback' => Values::array_get($payload, 'message_status_callback'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsStatusCallback' => Values::array_get($payload, 'sms_status_callback'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'publicApplicationConnectEnabled' => Values::array_get($payload, 'public_application_connect_enabled'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ApplicationContext Context for this ApplicationInstance + */ + protected function proxy(): ApplicationContext + { + if (!$this->context) { + $this->context = new ApplicationContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ApplicationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ApplicationInstance + * + * @return ApplicationInstance Fetched ApplicationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ApplicationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ApplicationInstance + * + * @param array|Options $options Optional Arguments + * @return ApplicationInstance Updated ApplicationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ApplicationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ApplicationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ApplicationList.php b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationList.php new file mode 100755 index 0000000..8c74b7e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationList.php @@ -0,0 +1,234 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Applications.json'; + } + + /** + * Create the ApplicationInstance + * + * @param array|Options $options Optional Arguments + * @return ApplicationInstance Created ApplicationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ApplicationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ApiVersion' => + $options['apiVersion'], + 'VoiceUrl' => + $options['voiceUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'SmsUrl' => + $options['smsUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsStatusCallback' => + $options['smsStatusCallback'], + 'MessageStatusCallback' => + $options['messageStatusCallback'], + 'FriendlyName' => + $options['friendlyName'], + 'PublicApplicationConnectEnabled' => + Serialize::booleanToString($options['publicApplicationConnectEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ApplicationInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads ApplicationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ApplicationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ApplicationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ApplicationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ApplicationPage Page of ApplicationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ApplicationPage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ApplicationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ApplicationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ApplicationPage Page of ApplicationInstance + */ + public function getPage(string $targetUrl): ApplicationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ApplicationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ApplicationContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Application resource to delete. + */ + public function getContext( + string $sid + + ): ApplicationContext + { + return new ApplicationContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ApplicationList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ApplicationOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationOptions.php new file mode 100755 index 0000000..2e5e82d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationOptions.php @@ -0,0 +1,724 @@ +options['apiVersion'] = $apiVersion; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['smsUrl'] = $smsUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsStatusCallback'] = $smsStatusCallback; + $this->options['messageStatusCallback'] = $messageStatusCallback; + $this->options['friendlyName'] = $friendlyName; + $this->options['publicApplicationConnectEnabled'] = $publicApplicationConnectEnabled; + } + + /** + * The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is the account's default API version. + * + * @param string $apiVersion The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is the account's default API version. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * The URL we should call when the phone number assigned to this application receives a call. + * + * @param string $voiceUrl The URL we should call when the phone number assigned to this application receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + * + * @param bool $voiceCallerIdLookup Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The URL we should call when the phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + * + * @param string $smsMethod The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $smsFallbackMethod The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL we should call using a POST method to send status information about SMS messages sent by the application. + * + * @param string $smsStatusCallback The URL we should call using a POST method to send status information about SMS messages sent by the application. + * @return $this Fluent Builder + */ + public function setSmsStatusCallback(string $smsStatusCallback): self + { + $this->options['smsStatusCallback'] = $smsStatusCallback; + return $this; + } + + /** + * The URL we should call using a POST method to send message status information to your application. + * + * @param string $messageStatusCallback The URL we should call using a POST method to send message status information to your application. + * @return $this Fluent Builder + */ + public function setMessageStatusCallback(string $messageStatusCallback): self + { + $this->options['messageStatusCallback'] = $messageStatusCallback; + return $this; + } + + /** + * A descriptive string that you create to describe the new application. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new application. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + * + * @param bool $publicApplicationConnectEnabled Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setPublicApplicationConnectEnabled(bool $publicApplicationConnectEnabled): self + { + $this->options['publicApplicationConnectEnabled'] = $publicApplicationConnectEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateApplicationOptions ' . $options . ']'; + } +} + + + +class ReadApplicationOptions extends Options + { + /** + * @param string $friendlyName The string that identifies the Application resources to read. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The string that identifies the Application resources to read. + * + * @param string $friendlyName The string that identifies the Application resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadApplicationOptions ' . $options . ']'; + } +} + +class UpdateApplicationOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $apiVersion The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + * @param string $voiceUrl The URL we should call when the phone number assigned to this application receives a call. + * @param string $voiceMethod The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + * @param bool $voiceCallerIdLookup Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + * @param string $smsUrl The URL we should call when the phone number receives an incoming SMS message. + * @param string $smsMethod The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + * @param string $smsFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + * @param string $smsFallbackMethod The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + * @param string $smsStatusCallback Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + * @param string $messageStatusCallback The URL we should call using a POST method to send message status information to your application. + * @param bool $publicApplicationConnectEnabled Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $apiVersion = Values::NONE, + string $voiceUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceFallbackMethod = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + bool $voiceCallerIdLookup = Values::BOOL_NONE, + string $smsUrl = Values::NONE, + string $smsMethod = Values::NONE, + string $smsFallbackUrl = Values::NONE, + string $smsFallbackMethod = Values::NONE, + string $smsStatusCallback = Values::NONE, + string $messageStatusCallback = Values::NONE, + bool $publicApplicationConnectEnabled = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['apiVersion'] = $apiVersion; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['smsUrl'] = $smsUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsStatusCallback'] = $smsStatusCallback; + $this->options['messageStatusCallback'] = $messageStatusCallback; + $this->options['publicApplicationConnectEnabled'] = $publicApplicationConnectEnabled; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + * + * @param string $apiVersion The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. The default value is your account's default API version. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * The URL we should call when the phone number assigned to this application receives a call. + * + * @param string $voiceUrl The URL we should call when the phone number assigned to this application receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + * + * @param bool $voiceCallerIdLookup Whether we should look up the caller's caller-ID name from the CNAM database (additional charges apply). Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The URL we should call when the phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + * + * @param string $smsMethod The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML from `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $smsFallbackMethod The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + * + * @param string $smsStatusCallback Same as message_status_callback: The URL we should call using a POST method to send status information about SMS messages sent by the application. Deprecated, included for backwards compatibility. + * @return $this Fluent Builder + */ + public function setSmsStatusCallback(string $smsStatusCallback): self + { + $this->options['smsStatusCallback'] = $smsStatusCallback; + return $this; + } + + /** + * The URL we should call using a POST method to send message status information to your application. + * + * @param string $messageStatusCallback The URL we should call using a POST method to send message status information to your application. + * @return $this Fluent Builder + */ + public function setMessageStatusCallback(string $messageStatusCallback): self + { + $this->options['messageStatusCallback'] = $messageStatusCallback; + return $this; + } + + /** + * Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + * + * @param bool $publicApplicationConnectEnabled Whether to allow other Twilio accounts to dial this applicaton using Dial verb. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setPublicApplicationConnectEnabled(bool $publicApplicationConnectEnabled): self + { + $this->options['publicApplicationConnectEnabled'] = $publicApplicationConnectEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateApplicationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ApplicationPage.php b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationPage.php new file mode 100755 index 0000000..f7c4bf3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ApplicationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ApplicationInstance \Twilio\Rest\Api\V2010\Account\ApplicationInstance + */ + public function buildInstance(array $payload): ApplicationInstance + { + return new ApplicationInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ApplicationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppContext.php b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppContext.php new file mode 100755 index 0000000..60fdbac --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppContext.php @@ -0,0 +1,87 @@ +solution = [ + 'accountSid' => + $accountSid, + 'connectAppSid' => + $connectAppSid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AuthorizedConnectApps/' . \rawurlencode($connectAppSid) + .'.json'; + } + + /** + * Fetch the AuthorizedConnectAppInstance + * + * @return AuthorizedConnectAppInstance Fetched AuthorizedConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthorizedConnectAppInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AuthorizedConnectAppInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['connectAppSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthorizedConnectAppContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppInstance.php new file mode 100755 index 0000000..c87dcd3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'connectAppCompanyName' => Values::array_get($payload, 'connect_app_company_name'), + 'connectAppDescription' => Values::array_get($payload, 'connect_app_description'), + 'connectAppFriendlyName' => Values::array_get($payload, 'connect_app_friendly_name'), + 'connectAppHomepageUrl' => Values::array_get($payload, 'connect_app_homepage_url'), + 'connectAppSid' => Values::array_get($payload, 'connect_app_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'permissions' => Values::array_get($payload, 'permissions'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'connectAppSid' => $connectAppSid ?: $this->properties['connectAppSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthorizedConnectAppContext Context for this AuthorizedConnectAppInstance + */ + protected function proxy(): AuthorizedConnectAppContext + { + if (!$this->context) { + $this->context = new AuthorizedConnectAppContext( + $this->version, + $this->solution['accountSid'], + $this->solution['connectAppSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AuthorizedConnectAppInstance + * + * @return AuthorizedConnectAppInstance Fetched AuthorizedConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthorizedConnectAppInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthorizedConnectAppInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppList.php b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppList.php new file mode 100755 index 0000000..0ba0cee --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AuthorizedConnectApps.json'; + } + + /** + * Reads AuthorizedConnectAppInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AuthorizedConnectAppInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AuthorizedConnectAppInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AuthorizedConnectAppInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AuthorizedConnectAppPage Page of AuthorizedConnectAppInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AuthorizedConnectAppPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AuthorizedConnectAppPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AuthorizedConnectAppInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AuthorizedConnectAppPage Page of AuthorizedConnectAppInstance + */ + public function getPage(string $targetUrl): AuthorizedConnectAppPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AuthorizedConnectAppPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AuthorizedConnectAppContext + * + * @param string $connectAppSid The SID of the Connect App to fetch. + */ + public function getContext( + string $connectAppSid + + ): AuthorizedConnectAppContext + { + return new AuthorizedConnectAppContext( + $this->version, + $this->solution['accountSid'], + $connectAppSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthorizedConnectAppList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppPage.php new file mode 100755 index 0000000..145f876 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AuthorizedConnectAppPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthorizedConnectAppInstance \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppInstance + */ + public function buildInstance(array $payload): AuthorizedConnectAppInstance + { + return new AuthorizedConnectAppInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthorizedConnectAppPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalInstance.php new file mode 100755 index 0000000..b1751ef --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalList.php new file mode 100755 index 0000000..a7e5ec2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/Local.json'; + } + + /** + * Reads LocalInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return LocalInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams LocalInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of LocalInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return LocalPage Page of LocalInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): LocalPage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new LocalPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of LocalInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return LocalPage Page of LocalInstance + */ + public function getPage(string $targetUrl): LocalPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new LocalPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalOptions.php new file mode 100755 index 0000000..47ac41c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-number-pattern) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumberlocal-resource?code-sample=code-find-phone-numbers-by-character-pattern). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadLocalOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalPage.php new file mode 100755 index 0000000..bd4978c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/LocalPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LocalInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\LocalInstance + */ + public function buildInstance(array $payload): LocalInstance + { + return new LocalInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineInstance.php new file mode 100755 index 0000000..76f2e4d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MachineToMachineInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineList.php new file mode 100755 index 0000000..857bdd1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/MachineToMachine.json'; + } + + /** + * Reads MachineToMachineInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MachineToMachineInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MachineToMachineInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MachineToMachineInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MachineToMachinePage Page of MachineToMachineInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MachineToMachinePage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MachineToMachinePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MachineToMachineInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MachineToMachinePage Page of MachineToMachineInstance + */ + public function getPage(string $targetUrl): MachineToMachinePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MachineToMachinePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MachineToMachineList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineOptions.php new file mode 100755 index 0000000..41c0af1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachineOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMachineToMachineOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachinePage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachinePage.php new file mode 100755 index 0000000..c63e931 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MachineToMachinePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MachineToMachineInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\MachineToMachineInstance + */ + public function buildInstance(array $payload): MachineToMachineInstance + { + return new MachineToMachineInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MachineToMachinePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileInstance.php new file mode 100755 index 0000000..616afdd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobileInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileList.php new file mode 100755 index 0000000..62ab46f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/Mobile.json'; + } + + /** + * Reads MobileInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MobileInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MobileInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MobileInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MobilePage Page of MobileInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MobilePage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MobilePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MobileInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MobilePage Page of MobileInstance + */ + public function getPage(string $targetUrl): MobilePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MobilePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobileList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileOptions.php new file mode 100755 index 0000000..5058498 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobileOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMobileOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobilePage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobilePage.php new file mode 100755 index 0000000..6ddba1c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/MobilePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MobileInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\MobileInstance + */ + public function buildInstance(array $payload): MobileInstance + { + return new MobileInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobilePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalInstance.php new file mode 100755 index 0000000..7f0754f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NationalInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalList.php new file mode 100755 index 0000000..d127672 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/National.json'; + } + + /** + * Reads NationalInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NationalInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams NationalInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NationalInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NationalPage Page of NationalInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NationalPage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NationalPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NationalInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NationalPage Page of NationalInstance + */ + public function getPage(string $targetUrl): NationalPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NationalPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NationalList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalOptions.php new file mode 100755 index 0000000..772e10a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadNationalOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalPage.php new file mode 100755 index 0000000..456b98e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/NationalPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NationalInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\NationalInstance + */ + public function buildInstance(array $payload): NationalInstance + { + return new NationalInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NationalPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostInstance.php new file mode 100755 index 0000000..5f851ee --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SharedCostInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostList.php new file mode 100755 index 0000000..cf12dfd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/SharedCost.json'; + } + + /** + * Reads SharedCostInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SharedCostInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SharedCostInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SharedCostInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SharedCostPage Page of SharedCostInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SharedCostPage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SharedCostPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SharedCostInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SharedCostPage Page of SharedCostInstance + */ + public function getPage(string $targetUrl): SharedCostPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SharedCostPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SharedCostList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostOptions.php new file mode 100755 index 0000000..4fa361d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadSharedCostOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostPage.php new file mode 100755 index 0000000..9118086 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/SharedCostPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SharedCostInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\SharedCostInstance + */ + public function buildInstance(array $payload): SharedCostInstance + { + return new SharedCostInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SharedCostPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeInstance.php new file mode 100755 index 0000000..259ec9e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreeInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeList.php new file mode 100755 index 0000000..6a9b913 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/TollFree.json'; + } + + /** + * Reads TollFreeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TollFreeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TollFreeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TollFreeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TollFreePage Page of TollFreeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TollFreePage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TollFreePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TollFreeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TollFreePage Page of TollFreeInstance + */ + public function getPage(string $targetUrl): TollFreePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TollFreePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreeList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeOptions.php new file mode 100755 index 0000000..2b1c549 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreeOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadTollFreeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreePage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreePage.php new file mode 100755 index 0000000..6998267 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/TollFreePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TollFreeInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\TollFreeInstance + */ + public function buildInstance(array $payload): TollFreeInstance + { + return new TollFreeInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipInstance.php new file mode 100755 index 0000000..6d5dca4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipInstance.php @@ -0,0 +1,108 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'lata' => Values::array_get($payload, 'lata'), + 'locality' => Values::array_get($payload, 'locality'), + 'rateCenter' => Values::array_get($payload, 'rate_center'), + 'latitude' => Values::array_get($payload, 'latitude'), + 'longitude' => Values::array_get($payload, 'longitude'), + 'region' => Values::array_get($payload, 'region'), + 'postalCode' => Values::array_get($payload, 'postal_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.VoipInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipList.php new file mode 100755 index 0000000..8130bf8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipList.php @@ -0,0 +1,199 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'countryCode' => + $countryCode, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'/Voip.json'; + } + + /** + * Reads VoipInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return VoipInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams VoipInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of VoipInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return VoipPage Page of VoipInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): VoipPage + { + $options = new Values($options); + + $params = Values::of([ + 'AreaCode' => + $options['areaCode'], + 'Contains' => + $options['contains'], + 'SmsEnabled' => + Serialize::booleanToString($options['smsEnabled']), + 'MmsEnabled' => + Serialize::booleanToString($options['mmsEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'ExcludeAllAddressRequired' => + Serialize::booleanToString($options['excludeAllAddressRequired']), + 'ExcludeLocalAddressRequired' => + Serialize::booleanToString($options['excludeLocalAddressRequired']), + 'ExcludeForeignAddressRequired' => + Serialize::booleanToString($options['excludeForeignAddressRequired']), + 'Beta' => + Serialize::booleanToString($options['beta']), + 'NearNumber' => + $options['nearNumber'], + 'NearLatLong' => + $options['nearLatLong'], + 'Distance' => + $options['distance'], + 'InPostalCode' => + $options['inPostalCode'], + 'InRegion' => + $options['inRegion'], + 'InRateCenter' => + $options['inRateCenter'], + 'InLata' => + $options['inLata'], + 'InLocality' => + $options['inLocality'], + 'FaxEnabled' => + Serialize::booleanToString($options['faxEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new VoipPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of VoipInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return VoipPage Page of VoipInstance + */ + public function getPage(string $targetUrl): VoipPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new VoipPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.VoipList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipOptions.php new file mode 100755 index 0000000..1b0cf6f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipOptions.php @@ -0,0 +1,382 @@ +options['areaCode'] = $areaCode; + $this->options['contains'] = $contains; + $this->options['smsEnabled'] = $smsEnabled; + $this->options['mmsEnabled'] = $mmsEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + $this->options['beta'] = $beta; + $this->options['nearNumber'] = $nearNumber; + $this->options['nearLatLong'] = $nearLatLong; + $this->options['distance'] = $distance; + $this->options['inPostalCode'] = $inPostalCode; + $this->options['inRegion'] = $inRegion; + $this->options['inRateCenter'] = $inRateCenter; + $this->options['inLata'] = $inLata; + $this->options['inLocality'] = $inLocality; + $this->options['faxEnabled'] = $faxEnabled; + } + + /** + * The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * + * @param int $areaCode The area code of the phone numbers to read. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setAreaCode(int $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * + * @param string $contains The pattern on which to match phone numbers. Valid characters are `*`, `0-9`, `a-z`, and `A-Z`. The `*` character matches any single digit. For examples, see [Example 2](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-2) and [Example 3](https://www.twilio.com/docs/phone-numbers/api/availablephonenumber-resource#local-get-basic-example-3). If specified, this value must have at least two characters. + * @return $this Fluent Builder + */ + public function setContains(string $contains): self + { + $this->options['contains'] = $contains; + return $this; + } + + /** + * Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * + * @param bool $smsEnabled Whether the phone numbers can receive text messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmsEnabled(bool $smsEnabled): self + { + $this->options['smsEnabled'] = $smsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * + * @param bool $mmsEnabled Whether the phone numbers can receive MMS messages. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMmsEnabled(bool $mmsEnabled): self + { + $this->options['mmsEnabled'] = $mmsEnabled; + return $this; + } + + /** + * Whether the phone numbers can receive calls. Can be: `true` or `false`. + * + * @param bool $voiceEnabled Whether the phone numbers can receive calls. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeAllAddressRequired Whether to exclude phone numbers that require an [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeAllAddressRequired(bool $excludeAllAddressRequired): self + { + $this->options['excludeAllAddressRequired'] = $excludeAllAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeLocalAddressRequired Whether to exclude phone numbers that require a local [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeLocalAddressRequired(bool $excludeLocalAddressRequired): self + { + $this->options['excludeLocalAddressRequired'] = $excludeLocalAddressRequired; + return $this; + } + + /** + * Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * + * @param bool $excludeForeignAddressRequired Whether to exclude phone numbers that require a foreign [Address](https://www.twilio.com/docs/usage/api/address). Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setExcludeForeignAddressRequired(bool $excludeForeignAddressRequired): self + { + $this->options['excludeForeignAddressRequired'] = $excludeForeignAddressRequired; + return $this; + } + + /** + * Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to read phone numbers that are new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearNumber Given a phone number, find a geographically close number within `distance` miles. Distance defaults to 25 miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearNumber(string $nearNumber): self + { + $this->options['nearNumber'] = $nearNumber; + return $this; + } + + /** + * Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * + * @param string $nearLatLong Given a latitude/longitude pair `lat,long` find geographically close numbers within `distance` miles. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setNearLatLong(string $nearLatLong): self + { + $this->options['nearLatLong'] = $nearLatLong; + return $this; + } + + /** + * The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * + * @param int $distance The search radius, in miles, for a `near_` query. Can be up to `500` and the default is `25`. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setDistance(int $distance): self + { + $this->options['distance'] = $distance; + return $this; + } + + /** + * Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inPostalCode Limit results to a particular postal code. Given a phone number, search within the same postal code as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInPostalCode(string $inPostalCode): self + { + $this->options['inPostalCode'] = $inPostalCode; + return $this; + } + + /** + * Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inRegion Limit results to a particular region, state, or province. Given a phone number, search within the same region as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRegion(string $inRegion): self + { + $this->options['inRegion'] = $inRegion; + return $this; + } + + /** + * Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * + * @param string $inRateCenter Limit results to a specific rate center, or given a phone number search within the same rate center as that number. Requires `in_lata` to be set as well. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInRateCenter(string $inRateCenter): self + { + $this->options['inRateCenter'] = $inRateCenter; + return $this; + } + + /** + * Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * + * @param string $inLata Limit results to a specific local access and transport area ([LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area)). Given a phone number, search within the same [LATA](https://en.wikipedia.org/wiki/Local_access_and_transport_area) as that number. Applies to only phone numbers in the US and Canada. + * @return $this Fluent Builder + */ + public function setInLata(string $inLata): self + { + $this->options['inLata'] = $inLata; + return $this; + } + + /** + * Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * + * @param string $inLocality Limit results to a particular locality or city. Given a phone number, search within the same Locality as that number. + * @return $this Fluent Builder + */ + public function setInLocality(string $inLocality): self + { + $this->options['inLocality'] = $inLocality; + return $this; + } + + /** + * Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * + * @param bool $faxEnabled Whether the phone numbers can receive faxes. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setFaxEnabled(bool $faxEnabled): self + { + $this->options['faxEnabled'] = $faxEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadVoipOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipPage.php new file mode 100755 index 0000000..b05e86b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountry/VoipPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VoipInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountry\VoipInstance + */ + public function buildInstance(array $payload): VoipInstance + { + return new VoipInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['countryCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.VoipPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryContext.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryContext.php new file mode 100755 index 0000000..e6ec61d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryContext.php @@ -0,0 +1,259 @@ +solution = [ + 'accountSid' => + $accountSid, + 'countryCode' => + $countryCode, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers/' . \rawurlencode($countryCode) + .'.json'; + } + + /** + * Fetch the AvailablePhoneNumberCountryInstance + * + * @return AvailablePhoneNumberCountryInstance Fetched AvailablePhoneNumberCountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailablePhoneNumberCountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AvailablePhoneNumberCountryInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + + /** + * Access the voip + */ + protected function getVoip(): VoipList + { + if (!$this->_voip) { + $this->_voip = new VoipList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_voip; + } + + /** + * Access the national + */ + protected function getNational(): NationalList + { + if (!$this->_national) { + $this->_national = new NationalList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_national; + } + + /** + * Access the mobile + */ + protected function getMobile(): MobileList + { + if (!$this->_mobile) { + $this->_mobile = new MobileList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_mobile; + } + + /** + * Access the machineToMachine + */ + protected function getMachineToMachine(): MachineToMachineList + { + if (!$this->_machineToMachine) { + $this->_machineToMachine = new MachineToMachineList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_machineToMachine; + } + + /** + * Access the tollFree + */ + protected function getTollFree(): TollFreeList + { + if (!$this->_tollFree) { + $this->_tollFree = new TollFreeList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_tollFree; + } + + /** + * Access the sharedCost + */ + protected function getSharedCost(): SharedCostList + { + if (!$this->_sharedCost) { + $this->_sharedCost = new SharedCostList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_sharedCost; + } + + /** + * Access the local + */ + protected function getLocal(): LocalList + { + if (!$this->_local) { + $this->_local = new LocalList( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->_local; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AvailablePhoneNumberCountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryInstance.php new file mode 100755 index 0000000..34b0860 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryInstance.php @@ -0,0 +1,196 @@ +properties = [ + 'countryCode' => Values::array_get($payload, 'country_code'), + 'country' => Values::array_get($payload, 'country'), + 'uri' => Values::array_get($payload, 'uri'), + 'beta' => Values::array_get($payload, 'beta'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'countryCode' => $countryCode ?: $this->properties['countryCode'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AvailablePhoneNumberCountryContext Context for this AvailablePhoneNumberCountryInstance + */ + protected function proxy(): AvailablePhoneNumberCountryContext + { + if (!$this->context) { + $this->context = new AvailablePhoneNumberCountryContext( + $this->version, + $this->solution['accountSid'], + $this->solution['countryCode'] + ); + } + + return $this->context; + } + + /** + * Fetch the AvailablePhoneNumberCountryInstance + * + * @return AvailablePhoneNumberCountryInstance Fetched AvailablePhoneNumberCountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailablePhoneNumberCountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the voip + */ + protected function getVoip(): VoipList + { + return $this->proxy()->voip; + } + + /** + * Access the national + */ + protected function getNational(): NationalList + { + return $this->proxy()->national; + } + + /** + * Access the mobile + */ + protected function getMobile(): MobileList + { + return $this->proxy()->mobile; + } + + /** + * Access the machineToMachine + */ + protected function getMachineToMachine(): MachineToMachineList + { + return $this->proxy()->machineToMachine; + } + + /** + * Access the tollFree + */ + protected function getTollFree(): TollFreeList + { + return $this->proxy()->tollFree; + } + + /** + * Access the sharedCost + */ + protected function getSharedCost(): SharedCostList + { + return $this->proxy()->sharedCost; + } + + /** + * Access the local + */ + protected function getLocal(): LocalList + { + return $this->proxy()->local; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AvailablePhoneNumberCountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryList.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryList.php new file mode 100755 index 0000000..1ee5029 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/AvailablePhoneNumbers.json'; + } + + /** + * Reads AvailablePhoneNumberCountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AvailablePhoneNumberCountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AvailablePhoneNumberCountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AvailablePhoneNumberCountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AvailablePhoneNumberCountryPage Page of AvailablePhoneNumberCountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AvailablePhoneNumberCountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AvailablePhoneNumberCountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AvailablePhoneNumberCountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AvailablePhoneNumberCountryPage Page of AvailablePhoneNumberCountryInstance + */ + public function getPage(string $targetUrl): AvailablePhoneNumberCountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AvailablePhoneNumberCountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AvailablePhoneNumberCountryContext + * + * @param string $countryCode The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country to fetch available phone number information about. + */ + public function getContext( + string $countryCode + + ): AvailablePhoneNumberCountryContext + { + return new AvailablePhoneNumberCountryContext( + $this->version, + $this->solution['accountSid'], + $countryCode + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AvailablePhoneNumberCountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryPage.php b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryPage.php new file mode 100755 index 0000000..532d67f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/AvailablePhoneNumberCountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AvailablePhoneNumberCountryInstance \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryInstance + */ + public function buildInstance(array $payload): AvailablePhoneNumberCountryInstance + { + return new AvailablePhoneNumberCountryInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AvailablePhoneNumberCountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/BalanceInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/BalanceInstance.php new file mode 100755 index 0000000..e136521 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/BalanceInstance.php @@ -0,0 +1,85 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'balance' => Values::array_get($payload, 'balance'), + 'currency' => Values::array_get($payload, 'currency'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.BalanceInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/BalanceList.php b/app/api/Twilio/Rest/Api/V2010/Account/BalanceList.php new file mode 100755 index 0000000..f696623 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/BalanceList.php @@ -0,0 +1,77 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Balance.json'; + } + + /** + * Fetch the BalanceInstance + * + * @return BalanceInstance Fetched BalanceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BalanceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BalanceInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.BalanceList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/BalancePage.php b/app/api/Twilio/Rest/Api/V2010/Account/BalancePage.php new file mode 100755 index 0000000..4bcb550 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/BalancePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BalanceInstance \Twilio\Rest\Api\V2010\Account\BalanceInstance + */ + public function buildInstance(array $payload): BalanceInstance + { + return new BalanceInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.BalancePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/EventInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventInstance.php new file mode 100755 index 0000000..a71a781 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventInstance.php @@ -0,0 +1,84 @@ +properties = [ + 'request' => Values::array_get($payload, 'request'), + 'response' => Values::array_get($payload, 'response'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.EventInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/EventList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventList.php new file mode 100755 index 0000000..a7d3c48 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventList.php @@ -0,0 +1,157 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Events.json'; + } + + /** + * Reads EventInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EventInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EventInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EventInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EventPage Page of EventInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EventPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EventPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EventInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EventPage Page of EventInstance + */ + public function getPage(string $targetUrl): EventPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EventPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.EventList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/EventPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventPage.php new file mode 100755 index 0000000..939240e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/EventPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EventInstance \Twilio\Rest\Api\V2010\Account\Call\EventInstance + */ + public function buildInstance(array $payload): EventInstance + { + return new EventInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.EventPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackContext.php new file mode 100755 index 0000000..3498ef1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackContext.php @@ -0,0 +1,119 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Feedback.json'; + } + + /** + * Fetch the FeedbackInstance + * + * @return FeedbackInstance Fetched FeedbackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FeedbackInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FeedbackInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Update the FeedbackInstance + * + * @param array|Options $options Optional Arguments + * @return FeedbackInstance Updated FeedbackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FeedbackInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'QualityScore' => + $options['qualityScore'], + 'Issue' => + $options['issue'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FeedbackInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.FeedbackContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackInstance.php new file mode 100755 index 0000000..9ec3e40 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'issues' => Values::array_get($payload, 'issues'), + 'qualityScore' => Values::array_get($payload, 'quality_score'), + 'sid' => Values::array_get($payload, 'sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FeedbackContext Context for this FeedbackInstance + */ + protected function proxy(): FeedbackContext + { + if (!$this->context) { + $this->context = new FeedbackContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the FeedbackInstance + * + * @return FeedbackInstance Fetched FeedbackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FeedbackInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FeedbackInstance + * + * @param array|Options $options Optional Arguments + * @return FeedbackInstance Updated FeedbackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FeedbackInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.FeedbackInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackList.php new file mode 100755 index 0000000..04e2375 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackList.php @@ -0,0 +1,73 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + } + + /** + * Constructs a FeedbackContext + */ + public function getContext( + + ): FeedbackContext + { + return new FeedbackContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackOptions.php new file mode 100755 index 0000000..5603935 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackOptions.php @@ -0,0 +1,96 @@ +options['qualityScore'] = $qualityScore; + $this->options['issue'] = $issue; + } + + /** + * The call quality expressed as an integer from `1` to `5` where `1` represents very poor call quality and `5` represents a perfect call. + * + * @param int $qualityScore The call quality expressed as an integer from `1` to `5` where `1` represents very poor call quality and `5` represents a perfect call. + * @return $this Fluent Builder + */ + public function setQualityScore(int $qualityScore): self + { + $this->options['qualityScore'] = $qualityScore; + return $this; + } + + /** + * One or more issues experienced during the call. The issues can be: `imperfect-audio`, `dropped-call`, `incorrect-caller-id`, `post-dial-delay`, `digits-not-captured`, `audio-latency`, `unsolicited-call`, or `one-way-audio`. + * + * @param string $issue One or more issues experienced during the call. The issues can be: `imperfect-audio`, `dropped-call`, `incorrect-caller-id`, `post-dial-delay`, `digits-not-captured`, `audio-latency`, `unsolicited-call`, or `one-way-audio`. + * @return $this Fluent Builder + */ + public function setIssue(array $issue): self + { + $this->options['issue'] = $issue; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateFeedbackOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackPage.php new file mode 100755 index 0000000..aced4c3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FeedbackInstance \Twilio\Rest\Api\V2010\Account\Call\FeedbackInstance + */ + public function buildInstance(array $payload): FeedbackInstance + { + return new FeedbackInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryContext.php new file mode 100755 index 0000000..f4f9f05 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryContext.php @@ -0,0 +1,100 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/FeedbackSummary/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the FeedbackSummaryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FeedbackSummaryInstance + * + * @return FeedbackSummaryInstance Fetched FeedbackSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FeedbackSummaryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FeedbackSummaryInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.FeedbackSummaryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryInstance.php new file mode 100755 index 0000000..4de52fc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callCount' => Values::array_get($payload, 'call_count'), + 'callFeedbackCount' => Values::array_get($payload, 'call_feedback_count'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'includeSubaccounts' => Values::array_get($payload, 'include_subaccounts'), + 'issues' => Values::array_get($payload, 'issues'), + 'qualityScoreAverage' => Values::array_get($payload, 'quality_score_average'), + 'qualityScoreMedian' => Values::array_get($payload, 'quality_score_median'), + 'qualityScoreStandardDeviation' => Values::array_get($payload, 'quality_score_standard_deviation'), + 'sid' => Values::array_get($payload, 'sid'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'status' => Values::array_get($payload, 'status'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FeedbackSummaryContext Context for this FeedbackSummaryInstance + */ + protected function proxy(): FeedbackSummaryContext + { + if (!$this->context) { + $this->context = new FeedbackSummaryContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FeedbackSummaryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FeedbackSummaryInstance + * + * @return FeedbackSummaryInstance Fetched FeedbackSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FeedbackSummaryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.FeedbackSummaryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryList.php new file mode 100755 index 0000000..4828f06 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryList.php @@ -0,0 +1,115 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/FeedbackSummary.json'; + } + + /** + * Create the FeedbackSummaryInstance + * + * @param \DateTime $startDate Only include feedback given on or after this date. Format is `YYYY-MM-DD` and specified in UTC. + * @param \DateTime $endDate Only include feedback given on or before this date. Format is `YYYY-MM-DD` and specified in UTC. + * @param array|Options $options Optional Arguments + * @return FeedbackSummaryInstance Created FeedbackSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(\DateTime $startDate, \DateTime $endDate, array $options = []): FeedbackSummaryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StartDate' => + Serialize::iso8601Date($startDate), + 'EndDate' => + Serialize::iso8601Date($endDate), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FeedbackSummaryInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Constructs a FeedbackSummaryContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): FeedbackSummaryContext + { + return new FeedbackSummaryContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackSummaryList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryOptions.php new file mode 100755 index 0000000..a81acc1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryOptions.php @@ -0,0 +1,116 @@ +options['includeSubaccounts'] = $includeSubaccounts; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + } + + /** + * Whether to also include Feedback resources from all subaccounts. `true` includes feedback from all subaccounts and `false`, the default, includes feedback from only the specified account. + * + * @param bool $includeSubaccounts Whether to also include Feedback resources from all subaccounts. `true` includes feedback from all subaccounts and `false`, the default, includes feedback from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * The URL that we will request when the feedback summary is complete. + * + * @param string $statusCallback The URL that we will request when the feedback summary is complete. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method (`GET` or `POST`) we use to make the request to the `StatusCallback` URL. + * + * @param string $statusCallbackMethod The HTTP method (`GET` or `POST`) we use to make the request to the `StatusCallback` URL. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateFeedbackSummaryOptions ' . $options . ']'; + } +} + + + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryPage.php new file mode 100755 index 0000000..0b9982f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/FeedbackSummaryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FeedbackSummaryInstance \Twilio\Rest\Api\V2010\Account\Call\FeedbackSummaryInstance + */ + public function buildInstance(array $payload): FeedbackSummaryInstance + { + return new FeedbackSummaryInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackSummaryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationContext.php new file mode 100755 index 0000000..57363fe --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationContext.php @@ -0,0 +1,93 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Notifications/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.NotificationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationInstance.php new file mode 100755 index 0000000..0a91d38 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'log' => Values::array_get($payload, 'log'), + 'messageDate' => Deserialize::dateTime(Values::array_get($payload, 'message_date')), + 'messageText' => Values::array_get($payload, 'message_text'), + 'moreInfo' => Values::array_get($payload, 'more_info'), + 'requestMethod' => Values::array_get($payload, 'request_method'), + 'requestUrl' => Values::array_get($payload, 'request_url'), + 'requestVariables' => Values::array_get($payload, 'request_variables'), + 'responseBody' => Values::array_get($payload, 'response_body'), + 'responseHeaders' => Values::array_get($payload, 'response_headers'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NotificationContext Context for this NotificationInstance + */ + protected function proxy(): NotificationContext + { + if (!$this->context) { + $this->context = new NotificationContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.NotificationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationList.php new file mode 100755 index 0000000..3e1c27e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationList.php @@ -0,0 +1,189 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Notifications.json'; + } + + /** + * Reads NotificationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NotificationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams NotificationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NotificationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NotificationPage Page of NotificationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NotificationPage + { + $options = new Values($options); + + $params = Values::of([ + 'Log' => + $options['log'], + 'MessageDate<' => + Serialize::iso8601Date($options['messageDateBefore']), + 'MessageDate' => + Serialize::iso8601Date($options['messageDate']), + 'MessageDate>' => + Serialize::iso8601Date($options['messageDateAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NotificationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NotificationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NotificationPage Page of NotificationInstance + */ + public function getPage(string $targetUrl): NotificationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NotificationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a NotificationContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Call Notification resource to fetch. + */ + public function getContext( + string $sid + + ): NotificationContext + { + return new NotificationContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NotificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationOptions.php new file mode 100755 index 0000000..f7faa2d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationOptions.php @@ -0,0 +1,132 @@ +=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return ReadNotificationOptions Options builder + */ + public static function read( + + int $log = Values::INT_NONE, + string $messageDateBefore = null, + string $messageDate = null, + string $messageDateAfter = null + + ): ReadNotificationOptions + { + return new ReadNotificationOptions( + $log, + $messageDateBefore, + $messageDate, + $messageDateAfter + ); + } + +} + + +class ReadNotificationOptions extends Options + { + /** + * @param int $log Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * @param string $messageDateBefore Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + */ + public function __construct( + + int $log = Values::INT_NONE, + string $messageDateBefore = null, + string $messageDate = null, + string $messageDateAfter = null + + ) { + $this->options['log'] = $log; + $this->options['messageDateBefore'] = $messageDateBefore; + $this->options['messageDate'] = $messageDate; + $this->options['messageDateAfter'] = $messageDateAfter; + } + + /** + * Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * + * @param int $log Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * @return $this Fluent Builder + */ + public function setLog(int $log): self + { + $this->options['log'] = $log; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDateBefore Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDateBefore(string $messageDateBefore): self + { + $this->options['messageDateBefore'] = $messageDateBefore; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDate(string $messageDate): self + { + $this->options['messageDate'] = $messageDate; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDateAfter(string $messageDateAfter): self + { + $this->options['messageDateAfter'] = $messageDateAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadNotificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationPage.php new file mode 100755 index 0000000..9b45d12 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/NotificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NotificationInstance \Twilio\Rest\Api\V2010\Account\Call\NotificationInstance + */ + public function buildInstance(array $payload): NotificationInstance + { + return new NotificationInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NotificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentContext.php new file mode 100755 index 0000000..1c7731b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentContext.php @@ -0,0 +1,111 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Payments/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Update the PaymentInstance + * + * @param string $idempotencyKey A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + * @param string $statusCallback Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + * @param array|Options $options Optional Arguments + * @return PaymentInstance Updated PaymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $idempotencyKey, string $statusCallback, array $options = []): PaymentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IdempotencyKey' => + $idempotencyKey, + 'StatusCallback' => + $statusCallback, + 'Capture' => + $options['capture'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new PaymentInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.PaymentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentInstance.php new file mode 100755 index 0000000..07bc392 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PaymentContext Context for this PaymentInstance + */ + protected function proxy(): PaymentContext + { + if (!$this->context) { + $this->context = new PaymentContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the PaymentInstance + * + * @param string $idempotencyKey A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + * @param string $statusCallback Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [Update](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-update) and [Complete/Cancel](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback-cancelcomplete) POST requests. + * @param array|Options $options Optional Arguments + * @return PaymentInstance Updated PaymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $idempotencyKey, string $statusCallback, array $options = []): PaymentInstance + { + + return $this->proxy()->update($idempotencyKey, $statusCallback, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.PaymentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentList.php new file mode 100755 index 0000000..1e2b112 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentList.php @@ -0,0 +1,145 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Payments.json'; + } + + /** + * Create the PaymentInstance + * + * @param string $idempotencyKey A unique token that will be used to ensure that multiple API calls with the same information do not result in multiple transactions. This should be a unique string value per API call and can be a randomly generated. + * @param string $statusCallback Provide an absolute or relative URL to receive status updates regarding your Pay session. Read more about the [expected StatusCallback values](https://www.twilio.com/docs/voice/api/payment-resource#statuscallback) + * @param array|Options $options Optional Arguments + * @return PaymentInstance Created PaymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $idempotencyKey, string $statusCallback, array $options = []): PaymentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IdempotencyKey' => + $idempotencyKey, + 'StatusCallback' => + $statusCallback, + 'BankAccountType' => + $options['bankAccountType'], + 'ChargeAmount' => + $options['chargeAmount'], + 'Currency' => + $options['currency'], + 'Description' => + $options['description'], + 'Input' => + $options['input'], + 'MinPostalCodeLength' => + $options['minPostalCodeLength'], + 'Parameter' => + Serialize::jsonObject($options['parameter']), + 'PaymentConnector' => + $options['paymentConnector'], + 'PaymentMethod' => + $options['paymentMethod'], + 'PostalCode' => + Serialize::booleanToString($options['postalCode']), + 'SecurityCode' => + Serialize::booleanToString($options['securityCode']), + 'Timeout' => + $options['timeout'], + 'TokenType' => + $options['tokenType'], + 'ValidCardTypes' => + $options['validCardTypes'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PaymentInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Constructs a PaymentContext + * + * @param string $sid The SID of Payments session that needs to be updated. + */ + public function getContext( + string $sid + + ): PaymentContext + { + return new PaymentContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.PaymentList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentOptions.php new file mode 100755 index 0000000..32b14be --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentOptions.php @@ -0,0 +1,370 @@ + Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + * @param string $paymentConnector This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + * @param string $paymentMethod + * @param bool $postalCode Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + * @param bool $securityCode Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + * @param int $timeout The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + * @param string $tokenType + * @param string $validCardTypes Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + * @return CreatePaymentOptions Options builder + */ + public static function create( + + string $bankAccountType = Values::NONE, + string $chargeAmount = Values::NONE, + string $currency = Values::NONE, + string $description = Values::NONE, + string $input = Values::NONE, + int $minPostalCodeLength = Values::INT_NONE, + array $parameter = Values::ARRAY_NONE, + string $paymentConnector = Values::NONE, + string $paymentMethod = Values::NONE, + bool $postalCode = Values::BOOL_NONE, + bool $securityCode = Values::BOOL_NONE, + int $timeout = Values::INT_NONE, + string $tokenType = Values::NONE, + string $validCardTypes = Values::NONE + + ): CreatePaymentOptions + { + return new CreatePaymentOptions( + $bankAccountType, + $chargeAmount, + $currency, + $description, + $input, + $minPostalCodeLength, + $parameter, + $paymentConnector, + $paymentMethod, + $postalCode, + $securityCode, + $timeout, + $tokenType, + $validCardTypes + ); + } + + /** + * @param string $capture + * @param string $status + * @return UpdatePaymentOptions Options builder + */ + public static function update( + + string $capture = Values::NONE, + string $status = Values::NONE + + ): UpdatePaymentOptions + { + return new UpdatePaymentOptions( + $capture, + $status + ); + } + +} + +class CreatePaymentOptions extends Options + { + /** + * @param string $bankAccountType + * @param string $chargeAmount A positive decimal value less than 1,000,000 to charge against the credit card or bank account. Default currency can be overwritten with `currency` field. Leave blank or set to 0 to tokenize. + * @param string $currency The currency of the `charge_amount`, formatted as [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format. The default value is `USD` and all values allowed from the Pay Connector are accepted. + * @param string $description The description can be used to provide more details regarding the transaction. This information is submitted along with the payment details to the Payment Connector which are then posted on the transactions. + * @param string $input A list of inputs that should be accepted. Currently only `dtmf` is supported. All digits captured during a pay session are redacted from the logs. + * @param int $minPostalCodeLength A positive integer that is used to validate the length of the `PostalCode` inputted by the user. User must enter this many digits. + * @param array $parameter A single-level JSON object used to pass custom parameters to payment processors. (Required for ACH payments). The information that has to be included here depends on the Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + * @param string $paymentConnector This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + * @param string $paymentMethod + * @param bool $postalCode Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + * @param bool $securityCode Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + * @param int $timeout The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + * @param string $tokenType + * @param string $validCardTypes Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + */ + public function __construct( + + string $bankAccountType = Values::NONE, + string $chargeAmount = Values::NONE, + string $currency = Values::NONE, + string $description = Values::NONE, + string $input = Values::NONE, + int $minPostalCodeLength = Values::INT_NONE, + array $parameter = Values::ARRAY_NONE, + string $paymentConnector = Values::NONE, + string $paymentMethod = Values::NONE, + bool $postalCode = Values::BOOL_NONE, + bool $securityCode = Values::BOOL_NONE, + int $timeout = Values::INT_NONE, + string $tokenType = Values::NONE, + string $validCardTypes = Values::NONE + + ) { + $this->options['bankAccountType'] = $bankAccountType; + $this->options['chargeAmount'] = $chargeAmount; + $this->options['currency'] = $currency; + $this->options['description'] = $description; + $this->options['input'] = $input; + $this->options['minPostalCodeLength'] = $minPostalCodeLength; + $this->options['parameter'] = $parameter; + $this->options['paymentConnector'] = $paymentConnector; + $this->options['paymentMethod'] = $paymentMethod; + $this->options['postalCode'] = $postalCode; + $this->options['securityCode'] = $securityCode; + $this->options['timeout'] = $timeout; + $this->options['tokenType'] = $tokenType; + $this->options['validCardTypes'] = $validCardTypes; + } + + /** + * @param string $bankAccountType + * @return $this Fluent Builder + */ + public function setBankAccountType(string $bankAccountType): self + { + $this->options['bankAccountType'] = $bankAccountType; + return $this; + } + + /** + * A positive decimal value less than 1,000,000 to charge against the credit card or bank account. Default currency can be overwritten with `currency` field. Leave blank or set to 0 to tokenize. + * + * @param string $chargeAmount A positive decimal value less than 1,000,000 to charge against the credit card or bank account. Default currency can be overwritten with `currency` field. Leave blank or set to 0 to tokenize. + * @return $this Fluent Builder + */ + public function setChargeAmount(string $chargeAmount): self + { + $this->options['chargeAmount'] = $chargeAmount; + return $this; + } + + /** + * The currency of the `charge_amount`, formatted as [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format. The default value is `USD` and all values allowed from the Pay Connector are accepted. + * + * @param string $currency The currency of the `charge_amount`, formatted as [ISO 4127](http://www.iso.org/iso/home/standards/currency_codes.htm) format. The default value is `USD` and all values allowed from the Pay Connector are accepted. + * @return $this Fluent Builder + */ + public function setCurrency(string $currency): self + { + $this->options['currency'] = $currency; + return $this; + } + + /** + * The description can be used to provide more details regarding the transaction. This information is submitted along with the payment details to the Payment Connector which are then posted on the transactions. + * + * @param string $description The description can be used to provide more details regarding the transaction. This information is submitted along with the payment details to the Payment Connector which are then posted on the transactions. + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * A list of inputs that should be accepted. Currently only `dtmf` is supported. All digits captured during a pay session are redacted from the logs. + * + * @param string $input A list of inputs that should be accepted. Currently only `dtmf` is supported. All digits captured during a pay session are redacted from the logs. + * @return $this Fluent Builder + */ + public function setInput(string $input): self + { + $this->options['input'] = $input; + return $this; + } + + /** + * A positive integer that is used to validate the length of the `PostalCode` inputted by the user. User must enter this many digits. + * + * @param int $minPostalCodeLength A positive integer that is used to validate the length of the `PostalCode` inputted by the user. User must enter this many digits. + * @return $this Fluent Builder + */ + public function setMinPostalCodeLength(int $minPostalCodeLength): self + { + $this->options['minPostalCodeLength'] = $minPostalCodeLength; + return $this; + } + + /** + * A single-level JSON object used to pass custom parameters to payment processors. (Required for ACH payments). The information that has to be included here depends on the Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + * + * @param array $parameter A single-level JSON object used to pass custom parameters to payment processors. (Required for ACH payments). The information that has to be included here depends on the Connector. [Read more](https://www.twilio.com/console/voice/pay-connectors). + * @return $this Fluent Builder + */ + public function setParameter(array $parameter): self + { + $this->options['parameter'] = $parameter; + return $this; + } + + /** + * This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + * + * @param string $paymentConnector This is the unique name corresponding to the Pay Connector installed in the Twilio Add-ons. Learn more about [ Connectors](https://www.twilio.com/console/voice/pay-connectors). The default value is `Default`. + * @return $this Fluent Builder + */ + public function setPaymentConnector(string $paymentConnector): self + { + $this->options['paymentConnector'] = $paymentConnector; + return $this; + } + + /** + * @param string $paymentMethod + * @return $this Fluent Builder + */ + public function setPaymentMethod(string $paymentMethod): self + { + $this->options['paymentMethod'] = $paymentMethod; + return $this; + } + + /** + * Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + * + * @param bool $postalCode Indicates whether the credit card postal code (zip code) is a required piece of payment information that must be provided by the caller. The default is `true`. + * @return $this Fluent Builder + */ + public function setPostalCode(bool $postalCode): self + { + $this->options['postalCode'] = $postalCode; + return $this; + } + + /** + * Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + * + * @param bool $securityCode Indicates whether the credit card security code is a required piece of payment information that must be provided by the caller. The default is `true`. + * @return $this Fluent Builder + */ + public function setSecurityCode(bool $securityCode): self + { + $this->options['securityCode'] = $securityCode; + return $this; + } + + /** + * The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + * + * @param int $timeout The number of seconds that should wait for the caller to press a digit between each subsequent digit, after the first one, before moving on to validate the digits captured. The default is `5`, maximum is `600`. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * @param string $tokenType + * @return $this Fluent Builder + */ + public function setTokenType(string $tokenType): self + { + $this->options['tokenType'] = $tokenType; + return $this; + } + + /** + * Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + * + * @param string $validCardTypes Credit card types separated by space that Pay should accept. The default value is `visa mastercard amex` + * @return $this Fluent Builder + */ + public function setValidCardTypes(string $validCardTypes): self + { + $this->options['validCardTypes'] = $validCardTypes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreatePaymentOptions ' . $options . ']'; + } +} + +class UpdatePaymentOptions extends Options + { + /** + * @param string $capture + * @param string $status + */ + public function __construct( + + string $capture = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['capture'] = $capture; + $this->options['status'] = $status; + } + + /** + * @param string $capture + * @return $this Fluent Builder + */ + public function setCapture(string $capture): self + { + $this->options['capture'] = $capture; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdatePaymentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentPage.php new file mode 100755 index 0000000..425c31e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/PaymentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PaymentInstance \Twilio\Rest\Api\V2010\Account\Call\PaymentInstance + */ + public function buildInstance(array $payload): PaymentInstance + { + return new PaymentInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.PaymentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingContext.php new file mode 100755 index 0000000..0ed334e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingContext.php @@ -0,0 +1,140 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Recordings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RecordingInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): RecordingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $status, + 'PauseBehavior' => + $options['pauseBehavior'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingInstance.php new file mode 100755 index 0000000..deb2b6a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingInstance.php @@ -0,0 +1,181 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'sid' => Values::array_get($payload, 'sid'), + 'price' => Values::array_get($payload, 'price'), + 'uri' => Values::array_get($payload, 'uri'), + 'encryptionDetails' => Values::array_get($payload, 'encryption_details'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'status' => Values::array_get($payload, 'status'), + 'channels' => Values::array_get($payload, 'channels'), + 'source' => Values::array_get($payload, 'source'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'track' => Values::array_get($payload, 'track'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingContext Context for this RecordingInstance + */ + protected function proxy(): RecordingContext + { + if (!$this->context) { + $this->context = new RecordingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RecordingInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): RecordingInstance + { + + return $this->proxy()->update($status, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingList.php new file mode 100755 index 0000000..5343b99 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingList.php @@ -0,0 +1,226 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Recordings.json'; + } + + /** + * Create the RecordingInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingInstance Created RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): RecordingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RecordingStatusCallbackEvent' => + Serialize::map($options['recordingStatusCallbackEvent'], function ($e) { return $e; }), + 'RecordingStatusCallback' => + $options['recordingStatusCallback'], + 'RecordingStatusCallbackMethod' => + $options['recordingStatusCallbackMethod'], + 'Trim' => + $options['trim'], + 'RecordingChannels' => + $options['recordingChannels'], + 'RecordingTrack' => + $options['recordingTrack'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Reads RecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RecordingPage Page of RecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreated<' => + Serialize::iso8601Date($options['dateCreatedBefore']), + 'DateCreated' => + Serialize::iso8601Date($options['dateCreated']), + 'DateCreated>' => + Serialize::iso8601Date($options['dateCreatedAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RecordingPage Page of RecordingInstance + */ + public function getPage(string $targetUrl): RecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RecordingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Recording resource to delete. + */ + public function getContext( + string $sid + + ): RecordingContext + { + return new RecordingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingOptions.php new file mode 100755 index 0000000..8d79840 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingOptions.php @@ -0,0 +1,310 @@ +=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return ReadRecordingOptions Options builder + */ + public static function read( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ): ReadRecordingOptions + { + return new ReadRecordingOptions( + $dateCreatedBefore, + $dateCreated, + $dateCreatedAfter + ); + } + + /** + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * @return UpdateRecordingOptions Options builder + */ + public static function update( + + string $pauseBehavior = Values::NONE + + ): UpdateRecordingOptions + { + return new UpdateRecordingOptions( + $pauseBehavior + ); + } + +} + +class CreateRecordingOptions extends Options + { + /** + * @param string[] $recordingStatusCallbackEvent The recording status events on which we should call the `recording_status_callback` URL. Can be: `in-progress`, `completed` and `absent` and the default is `completed`. Separate multiple event values with a space. + * @param string $recordingStatusCallback The URL we should call using the `recording_status_callback_method` on each recording event specified in `recording_status_callback_event`. For more information, see [RecordingStatusCallback parameters](https://www.twilio.com/docs/voice/api/recording#recordingstatuscallback). + * @param string $recordingStatusCallbackMethod The HTTP method we should use to call `recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`. + * @param string $trim Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. + * @param string $recordingChannels The number of channels used in the recording. Can be: `mono` or `dual` and the default is `mono`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels. + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + */ + public function __construct( + + array $recordingStatusCallbackEvent = Values::ARRAY_NONE, + string $recordingStatusCallback = Values::NONE, + string $recordingStatusCallbackMethod = Values::NONE, + string $trim = Values::NONE, + string $recordingChannels = Values::NONE, + string $recordingTrack = Values::NONE + + ) { + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + $this->options['trim'] = $trim; + $this->options['recordingChannels'] = $recordingChannels; + $this->options['recordingTrack'] = $recordingTrack; + } + + /** + * The recording status events on which we should call the `recording_status_callback` URL. Can be: `in-progress`, `completed` and `absent` and the default is `completed`. Separate multiple event values with a space. + * + * @param string[] $recordingStatusCallbackEvent The recording status events on which we should call the `recording_status_callback` URL. Can be: `in-progress`, `completed` and `absent` and the default is `completed`. Separate multiple event values with a space. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackEvent(array $recordingStatusCallbackEvent): self + { + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + return $this; + } + + /** + * The URL we should call using the `recording_status_callback_method` on each recording event specified in `recording_status_callback_event`. For more information, see [RecordingStatusCallback parameters](https://www.twilio.com/docs/voice/api/recording#recordingstatuscallback). + * + * @param string $recordingStatusCallback The URL we should call using the `recording_status_callback_method` on each recording event specified in `recording_status_callback_event`. For more information, see [RecordingStatusCallback parameters](https://www.twilio.com/docs/voice/api/recording#recordingstatuscallback). + * @return $this Fluent Builder + */ + public function setRecordingStatusCallback(string $recordingStatusCallback): self + { + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $recordingStatusCallbackMethod The HTTP method we should use to call `recording_status_callback`. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackMethod(string $recordingStatusCallbackMethod): self + { + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + return $this; + } + + /** + * Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. + * + * @param string $trim Whether to trim any leading and trailing silence in the recording. Can be: `trim-silence` or `do-not-trim` and the default is `do-not-trim`. `trim-silence` trims the silence from the beginning and end of the recording and `do-not-trim` does not. + * @return $this Fluent Builder + */ + public function setTrim(string $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * The number of channels used in the recording. Can be: `mono` or `dual` and the default is `mono`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels. + * + * @param string $recordingChannels The number of channels used in the recording. Can be: `mono` or `dual` and the default is `mono`. `mono` records all parties of the call into one channel. `dual` records each party of a 2-party call into separate channels. + * @return $this Fluent Builder + */ + public function setRecordingChannels(string $recordingChannels): self + { + $this->options['recordingChannels'] = $recordingChannels; + return $this; + } + + /** + * The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + * + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + * @return $this Fluent Builder + */ + public function setRecordingTrack(string $recordingTrack): self + { + $this->options['recordingTrack'] = $recordingTrack; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateRecordingOptions ' . $options . ']'; + } +} + + + +class ReadRecordingOptions extends Options + { + /** + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + */ + public function __construct( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ) { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(string $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreated(string $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(string $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadRecordingOptions ' . $options . ']'; + } +} + +class UpdateRecordingOptions extends Options + { + /** + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + */ + public function __construct( + + string $pauseBehavior = Values::NONE + + ) { + $this->options['pauseBehavior'] = $pauseBehavior; + } + + /** + * Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * @return $this Fluent Builder + */ + public function setPauseBehavior(string $pauseBehavior): self + { + $this->options['pauseBehavior'] = $pauseBehavior; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingPage.php new file mode 100755 index 0000000..b5d64ba --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/RecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingInstance \Twilio\Rest\Api\V2010\Account\Call\RecordingInstance + */ + public function buildInstance(array $payload): RecordingInstance + { + return new RecordingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecContext.php new file mode 100755 index 0000000..8959b1c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecContext.php @@ -0,0 +1,100 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Siprec/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Update the SiprecInstance + * + * @param string $status + * @return SiprecInstance Updated SiprecInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): SiprecInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SiprecInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.SiprecContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecInstance.php new file mode 100755 index 0000000..d3f132f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecInstance.php @@ -0,0 +1,133 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'name' => Values::array_get($payload, 'name'), + 'status' => Values::array_get($payload, 'status'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SiprecContext Context for this SiprecInstance + */ + protected function proxy(): SiprecContext + { + if (!$this->context) { + $this->context = new SiprecContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the SiprecInstance + * + * @param string $status + * @return SiprecInstance Updated SiprecInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): SiprecInstance + { + + return $this->proxy()->update($status); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.SiprecInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecList.php new file mode 100755 index 0000000..ff001b7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecList.php @@ -0,0 +1,516 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Siprec.json'; + } + + /** + * Create the SiprecInstance + * + * @param array|Options $options Optional Arguments + * @return SiprecInstance Created SiprecInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SiprecInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Name' => + $options['name'], + 'ConnectorName' => + $options['connectorName'], + 'Track' => + $options['track'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'Parameter1.Name' => + $options['parameter1Name'], + 'Parameter1.Value' => + $options['parameter1Value'], + 'Parameter2.Name' => + $options['parameter2Name'], + 'Parameter2.Value' => + $options['parameter2Value'], + 'Parameter3.Name' => + $options['parameter3Name'], + 'Parameter3.Value' => + $options['parameter3Value'], + 'Parameter4.Name' => + $options['parameter4Name'], + 'Parameter4.Value' => + $options['parameter4Value'], + 'Parameter5.Name' => + $options['parameter5Name'], + 'Parameter5.Value' => + $options['parameter5Value'], + 'Parameter6.Name' => + $options['parameter6Name'], + 'Parameter6.Value' => + $options['parameter6Value'], + 'Parameter7.Name' => + $options['parameter7Name'], + 'Parameter7.Value' => + $options['parameter7Value'], + 'Parameter8.Name' => + $options['parameter8Name'], + 'Parameter8.Value' => + $options['parameter8Value'], + 'Parameter9.Name' => + $options['parameter9Name'], + 'Parameter9.Value' => + $options['parameter9Value'], + 'Parameter10.Name' => + $options['parameter10Name'], + 'Parameter10.Value' => + $options['parameter10Value'], + 'Parameter11.Name' => + $options['parameter11Name'], + 'Parameter11.Value' => + $options['parameter11Value'], + 'Parameter12.Name' => + $options['parameter12Name'], + 'Parameter12.Value' => + $options['parameter12Value'], + 'Parameter13.Name' => + $options['parameter13Name'], + 'Parameter13.Value' => + $options['parameter13Value'], + 'Parameter14.Name' => + $options['parameter14Name'], + 'Parameter14.Value' => + $options['parameter14Value'], + 'Parameter15.Name' => + $options['parameter15Name'], + 'Parameter15.Value' => + $options['parameter15Value'], + 'Parameter16.Name' => + $options['parameter16Name'], + 'Parameter16.Value' => + $options['parameter16Value'], + 'Parameter17.Name' => + $options['parameter17Name'], + 'Parameter17.Value' => + $options['parameter17Value'], + 'Parameter18.Name' => + $options['parameter18Name'], + 'Parameter18.Value' => + $options['parameter18Value'], + 'Parameter19.Name' => + $options['parameter19Name'], + 'Parameter19.Value' => + $options['parameter19Value'], + 'Parameter20.Name' => + $options['parameter20Name'], + 'Parameter20.Value' => + $options['parameter20Value'], + 'Parameter21.Name' => + $options['parameter21Name'], + 'Parameter21.Value' => + $options['parameter21Value'], + 'Parameter22.Name' => + $options['parameter22Name'], + 'Parameter22.Value' => + $options['parameter22Value'], + 'Parameter23.Name' => + $options['parameter23Name'], + 'Parameter23.Value' => + $options['parameter23Value'], + 'Parameter24.Name' => + $options['parameter24Name'], + 'Parameter24.Value' => + $options['parameter24Value'], + 'Parameter25.Name' => + $options['parameter25Name'], + 'Parameter25.Value' => + $options['parameter25Value'], + 'Parameter26.Name' => + $options['parameter26Name'], + 'Parameter26.Value' => + $options['parameter26Value'], + 'Parameter27.Name' => + $options['parameter27Name'], + 'Parameter27.Value' => + $options['parameter27Value'], + 'Parameter28.Name' => + $options['parameter28Name'], + 'Parameter28.Value' => + $options['parameter28Value'], + 'Parameter29.Name' => + $options['parameter29Name'], + 'Parameter29.Value' => + $options['parameter29Value'], + 'Parameter30.Name' => + $options['parameter30Name'], + 'Parameter30.Value' => + $options['parameter30Value'], + 'Parameter31.Name' => + $options['parameter31Name'], + 'Parameter31.Value' => + $options['parameter31Value'], + 'Parameter32.Name' => + $options['parameter32Name'], + 'Parameter32.Value' => + $options['parameter32Value'], + 'Parameter33.Name' => + $options['parameter33Name'], + 'Parameter33.Value' => + $options['parameter33Value'], + 'Parameter34.Name' => + $options['parameter34Name'], + 'Parameter34.Value' => + $options['parameter34Value'], + 'Parameter35.Name' => + $options['parameter35Name'], + 'Parameter35.Value' => + $options['parameter35Value'], + 'Parameter36.Name' => + $options['parameter36Name'], + 'Parameter36.Value' => + $options['parameter36Value'], + 'Parameter37.Name' => + $options['parameter37Name'], + 'Parameter37.Value' => + $options['parameter37Value'], + 'Parameter38.Name' => + $options['parameter38Name'], + 'Parameter38.Value' => + $options['parameter38Value'], + 'Parameter39.Name' => + $options['parameter39Name'], + 'Parameter39.Value' => + $options['parameter39Value'], + 'Parameter40.Name' => + $options['parameter40Name'], + 'Parameter40.Value' => + $options['parameter40Value'], + 'Parameter41.Name' => + $options['parameter41Name'], + 'Parameter41.Value' => + $options['parameter41Value'], + 'Parameter42.Name' => + $options['parameter42Name'], + 'Parameter42.Value' => + $options['parameter42Value'], + 'Parameter43.Name' => + $options['parameter43Name'], + 'Parameter43.Value' => + $options['parameter43Value'], + 'Parameter44.Name' => + $options['parameter44Name'], + 'Parameter44.Value' => + $options['parameter44Value'], + 'Parameter45.Name' => + $options['parameter45Name'], + 'Parameter45.Value' => + $options['parameter45Value'], + 'Parameter46.Name' => + $options['parameter46Name'], + 'Parameter46.Value' => + $options['parameter46Value'], + 'Parameter47.Name' => + $options['parameter47Name'], + 'Parameter47.Value' => + $options['parameter47Value'], + 'Parameter48.Name' => + $options['parameter48Name'], + 'Parameter48.Value' => + $options['parameter48Value'], + 'Parameter49.Name' => + $options['parameter49Name'], + 'Parameter49.Value' => + $options['parameter49Value'], + 'Parameter50.Name' => + $options['parameter50Name'], + 'Parameter50.Value' => + $options['parameter50Value'], + 'Parameter51.Name' => + $options['parameter51Name'], + 'Parameter51.Value' => + $options['parameter51Value'], + 'Parameter52.Name' => + $options['parameter52Name'], + 'Parameter52.Value' => + $options['parameter52Value'], + 'Parameter53.Name' => + $options['parameter53Name'], + 'Parameter53.Value' => + $options['parameter53Value'], + 'Parameter54.Name' => + $options['parameter54Name'], + 'Parameter54.Value' => + $options['parameter54Value'], + 'Parameter55.Name' => + $options['parameter55Name'], + 'Parameter55.Value' => + $options['parameter55Value'], + 'Parameter56.Name' => + $options['parameter56Name'], + 'Parameter56.Value' => + $options['parameter56Value'], + 'Parameter57.Name' => + $options['parameter57Name'], + 'Parameter57.Value' => + $options['parameter57Value'], + 'Parameter58.Name' => + $options['parameter58Name'], + 'Parameter58.Value' => + $options['parameter58Value'], + 'Parameter59.Name' => + $options['parameter59Name'], + 'Parameter59.Value' => + $options['parameter59Value'], + 'Parameter60.Name' => + $options['parameter60Name'], + 'Parameter60.Value' => + $options['parameter60Value'], + 'Parameter61.Name' => + $options['parameter61Name'], + 'Parameter61.Value' => + $options['parameter61Value'], + 'Parameter62.Name' => + $options['parameter62Name'], + 'Parameter62.Value' => + $options['parameter62Value'], + 'Parameter63.Name' => + $options['parameter63Name'], + 'Parameter63.Value' => + $options['parameter63Value'], + 'Parameter64.Name' => + $options['parameter64Name'], + 'Parameter64.Value' => + $options['parameter64Value'], + 'Parameter65.Name' => + $options['parameter65Name'], + 'Parameter65.Value' => + $options['parameter65Value'], + 'Parameter66.Name' => + $options['parameter66Name'], + 'Parameter66.Value' => + $options['parameter66Value'], + 'Parameter67.Name' => + $options['parameter67Name'], + 'Parameter67.Value' => + $options['parameter67Value'], + 'Parameter68.Name' => + $options['parameter68Name'], + 'Parameter68.Value' => + $options['parameter68Value'], + 'Parameter69.Name' => + $options['parameter69Name'], + 'Parameter69.Value' => + $options['parameter69Value'], + 'Parameter70.Name' => + $options['parameter70Name'], + 'Parameter70.Value' => + $options['parameter70Value'], + 'Parameter71.Name' => + $options['parameter71Name'], + 'Parameter71.Value' => + $options['parameter71Value'], + 'Parameter72.Name' => + $options['parameter72Name'], + 'Parameter72.Value' => + $options['parameter72Value'], + 'Parameter73.Name' => + $options['parameter73Name'], + 'Parameter73.Value' => + $options['parameter73Value'], + 'Parameter74.Name' => + $options['parameter74Name'], + 'Parameter74.Value' => + $options['parameter74Value'], + 'Parameter75.Name' => + $options['parameter75Name'], + 'Parameter75.Value' => + $options['parameter75Value'], + 'Parameter76.Name' => + $options['parameter76Name'], + 'Parameter76.Value' => + $options['parameter76Value'], + 'Parameter77.Name' => + $options['parameter77Name'], + 'Parameter77.Value' => + $options['parameter77Value'], + 'Parameter78.Name' => + $options['parameter78Name'], + 'Parameter78.Value' => + $options['parameter78Value'], + 'Parameter79.Name' => + $options['parameter79Name'], + 'Parameter79.Value' => + $options['parameter79Value'], + 'Parameter80.Name' => + $options['parameter80Name'], + 'Parameter80.Value' => + $options['parameter80Value'], + 'Parameter81.Name' => + $options['parameter81Name'], + 'Parameter81.Value' => + $options['parameter81Value'], + 'Parameter82.Name' => + $options['parameter82Name'], + 'Parameter82.Value' => + $options['parameter82Value'], + 'Parameter83.Name' => + $options['parameter83Name'], + 'Parameter83.Value' => + $options['parameter83Value'], + 'Parameter84.Name' => + $options['parameter84Name'], + 'Parameter84.Value' => + $options['parameter84Value'], + 'Parameter85.Name' => + $options['parameter85Name'], + 'Parameter85.Value' => + $options['parameter85Value'], + 'Parameter86.Name' => + $options['parameter86Name'], + 'Parameter86.Value' => + $options['parameter86Value'], + 'Parameter87.Name' => + $options['parameter87Name'], + 'Parameter87.Value' => + $options['parameter87Value'], + 'Parameter88.Name' => + $options['parameter88Name'], + 'Parameter88.Value' => + $options['parameter88Value'], + 'Parameter89.Name' => + $options['parameter89Name'], + 'Parameter89.Value' => + $options['parameter89Value'], + 'Parameter90.Name' => + $options['parameter90Name'], + 'Parameter90.Value' => + $options['parameter90Value'], + 'Parameter91.Name' => + $options['parameter91Name'], + 'Parameter91.Value' => + $options['parameter91Value'], + 'Parameter92.Name' => + $options['parameter92Name'], + 'Parameter92.Value' => + $options['parameter92Value'], + 'Parameter93.Name' => + $options['parameter93Name'], + 'Parameter93.Value' => + $options['parameter93Value'], + 'Parameter94.Name' => + $options['parameter94Name'], + 'Parameter94.Value' => + $options['parameter94Value'], + 'Parameter95.Name' => + $options['parameter95Name'], + 'Parameter95.Value' => + $options['parameter95Value'], + 'Parameter96.Name' => + $options['parameter96Name'], + 'Parameter96.Value' => + $options['parameter96Value'], + 'Parameter97.Name' => + $options['parameter97Name'], + 'Parameter97.Value' => + $options['parameter97Value'], + 'Parameter98.Name' => + $options['parameter98Name'], + 'Parameter98.Value' => + $options['parameter98Value'], + 'Parameter99.Name' => + $options['parameter99Name'], + 'Parameter99.Value' => + $options['parameter99Value'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SiprecInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Constructs a SiprecContext + * + * @param string $sid The SID of the Siprec resource, or the `name` used when creating the resource + */ + public function getContext( + string $sid + + ): SiprecContext + { + return new SiprecContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SiprecList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecOptions.php new file mode 100755 index 0000000..0a8b1ab --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecOptions.php @@ -0,0 +1,3712 @@ +options['name'] = $name; + $this->options['connectorName'] = $connectorName; + $this->options['track'] = $track; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['parameter1Name'] = $parameter1Name; + $this->options['parameter1Value'] = $parameter1Value; + $this->options['parameter2Name'] = $parameter2Name; + $this->options['parameter2Value'] = $parameter2Value; + $this->options['parameter3Name'] = $parameter3Name; + $this->options['parameter3Value'] = $parameter3Value; + $this->options['parameter4Name'] = $parameter4Name; + $this->options['parameter4Value'] = $parameter4Value; + $this->options['parameter5Name'] = $parameter5Name; + $this->options['parameter5Value'] = $parameter5Value; + $this->options['parameter6Name'] = $parameter6Name; + $this->options['parameter6Value'] = $parameter6Value; + $this->options['parameter7Name'] = $parameter7Name; + $this->options['parameter7Value'] = $parameter7Value; + $this->options['parameter8Name'] = $parameter8Name; + $this->options['parameter8Value'] = $parameter8Value; + $this->options['parameter9Name'] = $parameter9Name; + $this->options['parameter9Value'] = $parameter9Value; + $this->options['parameter10Name'] = $parameter10Name; + $this->options['parameter10Value'] = $parameter10Value; + $this->options['parameter11Name'] = $parameter11Name; + $this->options['parameter11Value'] = $parameter11Value; + $this->options['parameter12Name'] = $parameter12Name; + $this->options['parameter12Value'] = $parameter12Value; + $this->options['parameter13Name'] = $parameter13Name; + $this->options['parameter13Value'] = $parameter13Value; + $this->options['parameter14Name'] = $parameter14Name; + $this->options['parameter14Value'] = $parameter14Value; + $this->options['parameter15Name'] = $parameter15Name; + $this->options['parameter15Value'] = $parameter15Value; + $this->options['parameter16Name'] = $parameter16Name; + $this->options['parameter16Value'] = $parameter16Value; + $this->options['parameter17Name'] = $parameter17Name; + $this->options['parameter17Value'] = $parameter17Value; + $this->options['parameter18Name'] = $parameter18Name; + $this->options['parameter18Value'] = $parameter18Value; + $this->options['parameter19Name'] = $parameter19Name; + $this->options['parameter19Value'] = $parameter19Value; + $this->options['parameter20Name'] = $parameter20Name; + $this->options['parameter20Value'] = $parameter20Value; + $this->options['parameter21Name'] = $parameter21Name; + $this->options['parameter21Value'] = $parameter21Value; + $this->options['parameter22Name'] = $parameter22Name; + $this->options['parameter22Value'] = $parameter22Value; + $this->options['parameter23Name'] = $parameter23Name; + $this->options['parameter23Value'] = $parameter23Value; + $this->options['parameter24Name'] = $parameter24Name; + $this->options['parameter24Value'] = $parameter24Value; + $this->options['parameter25Name'] = $parameter25Name; + $this->options['parameter25Value'] = $parameter25Value; + $this->options['parameter26Name'] = $parameter26Name; + $this->options['parameter26Value'] = $parameter26Value; + $this->options['parameter27Name'] = $parameter27Name; + $this->options['parameter27Value'] = $parameter27Value; + $this->options['parameter28Name'] = $parameter28Name; + $this->options['parameter28Value'] = $parameter28Value; + $this->options['parameter29Name'] = $parameter29Name; + $this->options['parameter29Value'] = $parameter29Value; + $this->options['parameter30Name'] = $parameter30Name; + $this->options['parameter30Value'] = $parameter30Value; + $this->options['parameter31Name'] = $parameter31Name; + $this->options['parameter31Value'] = $parameter31Value; + $this->options['parameter32Name'] = $parameter32Name; + $this->options['parameter32Value'] = $parameter32Value; + $this->options['parameter33Name'] = $parameter33Name; + $this->options['parameter33Value'] = $parameter33Value; + $this->options['parameter34Name'] = $parameter34Name; + $this->options['parameter34Value'] = $parameter34Value; + $this->options['parameter35Name'] = $parameter35Name; + $this->options['parameter35Value'] = $parameter35Value; + $this->options['parameter36Name'] = $parameter36Name; + $this->options['parameter36Value'] = $parameter36Value; + $this->options['parameter37Name'] = $parameter37Name; + $this->options['parameter37Value'] = $parameter37Value; + $this->options['parameter38Name'] = $parameter38Name; + $this->options['parameter38Value'] = $parameter38Value; + $this->options['parameter39Name'] = $parameter39Name; + $this->options['parameter39Value'] = $parameter39Value; + $this->options['parameter40Name'] = $parameter40Name; + $this->options['parameter40Value'] = $parameter40Value; + $this->options['parameter41Name'] = $parameter41Name; + $this->options['parameter41Value'] = $parameter41Value; + $this->options['parameter42Name'] = $parameter42Name; + $this->options['parameter42Value'] = $parameter42Value; + $this->options['parameter43Name'] = $parameter43Name; + $this->options['parameter43Value'] = $parameter43Value; + $this->options['parameter44Name'] = $parameter44Name; + $this->options['parameter44Value'] = $parameter44Value; + $this->options['parameter45Name'] = $parameter45Name; + $this->options['parameter45Value'] = $parameter45Value; + $this->options['parameter46Name'] = $parameter46Name; + $this->options['parameter46Value'] = $parameter46Value; + $this->options['parameter47Name'] = $parameter47Name; + $this->options['parameter47Value'] = $parameter47Value; + $this->options['parameter48Name'] = $parameter48Name; + $this->options['parameter48Value'] = $parameter48Value; + $this->options['parameter49Name'] = $parameter49Name; + $this->options['parameter49Value'] = $parameter49Value; + $this->options['parameter50Name'] = $parameter50Name; + $this->options['parameter50Value'] = $parameter50Value; + $this->options['parameter51Name'] = $parameter51Name; + $this->options['parameter51Value'] = $parameter51Value; + $this->options['parameter52Name'] = $parameter52Name; + $this->options['parameter52Value'] = $parameter52Value; + $this->options['parameter53Name'] = $parameter53Name; + $this->options['parameter53Value'] = $parameter53Value; + $this->options['parameter54Name'] = $parameter54Name; + $this->options['parameter54Value'] = $parameter54Value; + $this->options['parameter55Name'] = $parameter55Name; + $this->options['parameter55Value'] = $parameter55Value; + $this->options['parameter56Name'] = $parameter56Name; + $this->options['parameter56Value'] = $parameter56Value; + $this->options['parameter57Name'] = $parameter57Name; + $this->options['parameter57Value'] = $parameter57Value; + $this->options['parameter58Name'] = $parameter58Name; + $this->options['parameter58Value'] = $parameter58Value; + $this->options['parameter59Name'] = $parameter59Name; + $this->options['parameter59Value'] = $parameter59Value; + $this->options['parameter60Name'] = $parameter60Name; + $this->options['parameter60Value'] = $parameter60Value; + $this->options['parameter61Name'] = $parameter61Name; + $this->options['parameter61Value'] = $parameter61Value; + $this->options['parameter62Name'] = $parameter62Name; + $this->options['parameter62Value'] = $parameter62Value; + $this->options['parameter63Name'] = $parameter63Name; + $this->options['parameter63Value'] = $parameter63Value; + $this->options['parameter64Name'] = $parameter64Name; + $this->options['parameter64Value'] = $parameter64Value; + $this->options['parameter65Name'] = $parameter65Name; + $this->options['parameter65Value'] = $parameter65Value; + $this->options['parameter66Name'] = $parameter66Name; + $this->options['parameter66Value'] = $parameter66Value; + $this->options['parameter67Name'] = $parameter67Name; + $this->options['parameter67Value'] = $parameter67Value; + $this->options['parameter68Name'] = $parameter68Name; + $this->options['parameter68Value'] = $parameter68Value; + $this->options['parameter69Name'] = $parameter69Name; + $this->options['parameter69Value'] = $parameter69Value; + $this->options['parameter70Name'] = $parameter70Name; + $this->options['parameter70Value'] = $parameter70Value; + $this->options['parameter71Name'] = $parameter71Name; + $this->options['parameter71Value'] = $parameter71Value; + $this->options['parameter72Name'] = $parameter72Name; + $this->options['parameter72Value'] = $parameter72Value; + $this->options['parameter73Name'] = $parameter73Name; + $this->options['parameter73Value'] = $parameter73Value; + $this->options['parameter74Name'] = $parameter74Name; + $this->options['parameter74Value'] = $parameter74Value; + $this->options['parameter75Name'] = $parameter75Name; + $this->options['parameter75Value'] = $parameter75Value; + $this->options['parameter76Name'] = $parameter76Name; + $this->options['parameter76Value'] = $parameter76Value; + $this->options['parameter77Name'] = $parameter77Name; + $this->options['parameter77Value'] = $parameter77Value; + $this->options['parameter78Name'] = $parameter78Name; + $this->options['parameter78Value'] = $parameter78Value; + $this->options['parameter79Name'] = $parameter79Name; + $this->options['parameter79Value'] = $parameter79Value; + $this->options['parameter80Name'] = $parameter80Name; + $this->options['parameter80Value'] = $parameter80Value; + $this->options['parameter81Name'] = $parameter81Name; + $this->options['parameter81Value'] = $parameter81Value; + $this->options['parameter82Name'] = $parameter82Name; + $this->options['parameter82Value'] = $parameter82Value; + $this->options['parameter83Name'] = $parameter83Name; + $this->options['parameter83Value'] = $parameter83Value; + $this->options['parameter84Name'] = $parameter84Name; + $this->options['parameter84Value'] = $parameter84Value; + $this->options['parameter85Name'] = $parameter85Name; + $this->options['parameter85Value'] = $parameter85Value; + $this->options['parameter86Name'] = $parameter86Name; + $this->options['parameter86Value'] = $parameter86Value; + $this->options['parameter87Name'] = $parameter87Name; + $this->options['parameter87Value'] = $parameter87Value; + $this->options['parameter88Name'] = $parameter88Name; + $this->options['parameter88Value'] = $parameter88Value; + $this->options['parameter89Name'] = $parameter89Name; + $this->options['parameter89Value'] = $parameter89Value; + $this->options['parameter90Name'] = $parameter90Name; + $this->options['parameter90Value'] = $parameter90Value; + $this->options['parameter91Name'] = $parameter91Name; + $this->options['parameter91Value'] = $parameter91Value; + $this->options['parameter92Name'] = $parameter92Name; + $this->options['parameter92Value'] = $parameter92Value; + $this->options['parameter93Name'] = $parameter93Name; + $this->options['parameter93Value'] = $parameter93Value; + $this->options['parameter94Name'] = $parameter94Name; + $this->options['parameter94Value'] = $parameter94Value; + $this->options['parameter95Name'] = $parameter95Name; + $this->options['parameter95Value'] = $parameter95Value; + $this->options['parameter96Name'] = $parameter96Name; + $this->options['parameter96Value'] = $parameter96Value; + $this->options['parameter97Name'] = $parameter97Name; + $this->options['parameter97Value'] = $parameter97Value; + $this->options['parameter98Name'] = $parameter98Name; + $this->options['parameter98Value'] = $parameter98Value; + $this->options['parameter99Name'] = $parameter99Name; + $this->options['parameter99Value'] = $parameter99Value; + } + + /** + * The user-specified name of this Siprec, if one was given when the Siprec was created. This may be used to stop the Siprec. + * + * @param string $name The user-specified name of this Siprec, if one was given when the Siprec was created. This may be used to stop the Siprec. + * @return $this Fluent Builder + */ + public function setName(string $name): self + { + $this->options['name'] = $name; + return $this; + } + + /** + * Unique name used when configuring the connector via Marketplace Add-on. + * + * @param string $connectorName Unique name used when configuring the connector via Marketplace Add-on. + * @return $this Fluent Builder + */ + public function setConnectorName(string $connectorName): self + { + $this->options['connectorName'] = $connectorName; + return $this; + } + + /** + * @param string $track + * @return $this Fluent Builder + */ + public function setTrack(string $track): self + { + $this->options['track'] = $track; + return $this; + } + + /** + * Absolute URL of the status callback. + * + * @param string $statusCallback Absolute URL of the status callback. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The http method for the status_callback (one of GET, POST). + * + * @param string $statusCallbackMethod The http method for the status_callback (one of GET, POST). + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter1Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter1Name(string $parameter1Name): self + { + $this->options['parameter1Name'] = $parameter1Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter1Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter1Value(string $parameter1Value): self + { + $this->options['parameter1Value'] = $parameter1Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter2Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter2Name(string $parameter2Name): self + { + $this->options['parameter2Name'] = $parameter2Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter2Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter2Value(string $parameter2Value): self + { + $this->options['parameter2Value'] = $parameter2Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter3Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter3Name(string $parameter3Name): self + { + $this->options['parameter3Name'] = $parameter3Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter3Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter3Value(string $parameter3Value): self + { + $this->options['parameter3Value'] = $parameter3Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter4Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter4Name(string $parameter4Name): self + { + $this->options['parameter4Name'] = $parameter4Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter4Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter4Value(string $parameter4Value): self + { + $this->options['parameter4Value'] = $parameter4Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter5Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter5Name(string $parameter5Name): self + { + $this->options['parameter5Name'] = $parameter5Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter5Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter5Value(string $parameter5Value): self + { + $this->options['parameter5Value'] = $parameter5Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter6Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter6Name(string $parameter6Name): self + { + $this->options['parameter6Name'] = $parameter6Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter6Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter6Value(string $parameter6Value): self + { + $this->options['parameter6Value'] = $parameter6Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter7Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter7Name(string $parameter7Name): self + { + $this->options['parameter7Name'] = $parameter7Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter7Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter7Value(string $parameter7Value): self + { + $this->options['parameter7Value'] = $parameter7Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter8Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter8Name(string $parameter8Name): self + { + $this->options['parameter8Name'] = $parameter8Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter8Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter8Value(string $parameter8Value): self + { + $this->options['parameter8Value'] = $parameter8Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter9Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter9Name(string $parameter9Name): self + { + $this->options['parameter9Name'] = $parameter9Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter9Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter9Value(string $parameter9Value): self + { + $this->options['parameter9Value'] = $parameter9Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter10Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter10Name(string $parameter10Name): self + { + $this->options['parameter10Name'] = $parameter10Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter10Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter10Value(string $parameter10Value): self + { + $this->options['parameter10Value'] = $parameter10Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter11Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter11Name(string $parameter11Name): self + { + $this->options['parameter11Name'] = $parameter11Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter11Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter11Value(string $parameter11Value): self + { + $this->options['parameter11Value'] = $parameter11Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter12Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter12Name(string $parameter12Name): self + { + $this->options['parameter12Name'] = $parameter12Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter12Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter12Value(string $parameter12Value): self + { + $this->options['parameter12Value'] = $parameter12Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter13Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter13Name(string $parameter13Name): self + { + $this->options['parameter13Name'] = $parameter13Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter13Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter13Value(string $parameter13Value): self + { + $this->options['parameter13Value'] = $parameter13Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter14Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter14Name(string $parameter14Name): self + { + $this->options['parameter14Name'] = $parameter14Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter14Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter14Value(string $parameter14Value): self + { + $this->options['parameter14Value'] = $parameter14Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter15Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter15Name(string $parameter15Name): self + { + $this->options['parameter15Name'] = $parameter15Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter15Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter15Value(string $parameter15Value): self + { + $this->options['parameter15Value'] = $parameter15Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter16Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter16Name(string $parameter16Name): self + { + $this->options['parameter16Name'] = $parameter16Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter16Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter16Value(string $parameter16Value): self + { + $this->options['parameter16Value'] = $parameter16Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter17Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter17Name(string $parameter17Name): self + { + $this->options['parameter17Name'] = $parameter17Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter17Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter17Value(string $parameter17Value): self + { + $this->options['parameter17Value'] = $parameter17Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter18Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter18Name(string $parameter18Name): self + { + $this->options['parameter18Name'] = $parameter18Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter18Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter18Value(string $parameter18Value): self + { + $this->options['parameter18Value'] = $parameter18Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter19Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter19Name(string $parameter19Name): self + { + $this->options['parameter19Name'] = $parameter19Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter19Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter19Value(string $parameter19Value): self + { + $this->options['parameter19Value'] = $parameter19Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter20Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter20Name(string $parameter20Name): self + { + $this->options['parameter20Name'] = $parameter20Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter20Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter20Value(string $parameter20Value): self + { + $this->options['parameter20Value'] = $parameter20Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter21Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter21Name(string $parameter21Name): self + { + $this->options['parameter21Name'] = $parameter21Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter21Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter21Value(string $parameter21Value): self + { + $this->options['parameter21Value'] = $parameter21Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter22Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter22Name(string $parameter22Name): self + { + $this->options['parameter22Name'] = $parameter22Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter22Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter22Value(string $parameter22Value): self + { + $this->options['parameter22Value'] = $parameter22Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter23Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter23Name(string $parameter23Name): self + { + $this->options['parameter23Name'] = $parameter23Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter23Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter23Value(string $parameter23Value): self + { + $this->options['parameter23Value'] = $parameter23Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter24Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter24Name(string $parameter24Name): self + { + $this->options['parameter24Name'] = $parameter24Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter24Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter24Value(string $parameter24Value): self + { + $this->options['parameter24Value'] = $parameter24Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter25Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter25Name(string $parameter25Name): self + { + $this->options['parameter25Name'] = $parameter25Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter25Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter25Value(string $parameter25Value): self + { + $this->options['parameter25Value'] = $parameter25Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter26Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter26Name(string $parameter26Name): self + { + $this->options['parameter26Name'] = $parameter26Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter26Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter26Value(string $parameter26Value): self + { + $this->options['parameter26Value'] = $parameter26Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter27Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter27Name(string $parameter27Name): self + { + $this->options['parameter27Name'] = $parameter27Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter27Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter27Value(string $parameter27Value): self + { + $this->options['parameter27Value'] = $parameter27Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter28Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter28Name(string $parameter28Name): self + { + $this->options['parameter28Name'] = $parameter28Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter28Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter28Value(string $parameter28Value): self + { + $this->options['parameter28Value'] = $parameter28Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter29Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter29Name(string $parameter29Name): self + { + $this->options['parameter29Name'] = $parameter29Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter29Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter29Value(string $parameter29Value): self + { + $this->options['parameter29Value'] = $parameter29Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter30Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter30Name(string $parameter30Name): self + { + $this->options['parameter30Name'] = $parameter30Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter30Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter30Value(string $parameter30Value): self + { + $this->options['parameter30Value'] = $parameter30Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter31Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter31Name(string $parameter31Name): self + { + $this->options['parameter31Name'] = $parameter31Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter31Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter31Value(string $parameter31Value): self + { + $this->options['parameter31Value'] = $parameter31Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter32Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter32Name(string $parameter32Name): self + { + $this->options['parameter32Name'] = $parameter32Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter32Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter32Value(string $parameter32Value): self + { + $this->options['parameter32Value'] = $parameter32Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter33Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter33Name(string $parameter33Name): self + { + $this->options['parameter33Name'] = $parameter33Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter33Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter33Value(string $parameter33Value): self + { + $this->options['parameter33Value'] = $parameter33Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter34Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter34Name(string $parameter34Name): self + { + $this->options['parameter34Name'] = $parameter34Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter34Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter34Value(string $parameter34Value): self + { + $this->options['parameter34Value'] = $parameter34Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter35Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter35Name(string $parameter35Name): self + { + $this->options['parameter35Name'] = $parameter35Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter35Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter35Value(string $parameter35Value): self + { + $this->options['parameter35Value'] = $parameter35Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter36Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter36Name(string $parameter36Name): self + { + $this->options['parameter36Name'] = $parameter36Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter36Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter36Value(string $parameter36Value): self + { + $this->options['parameter36Value'] = $parameter36Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter37Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter37Name(string $parameter37Name): self + { + $this->options['parameter37Name'] = $parameter37Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter37Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter37Value(string $parameter37Value): self + { + $this->options['parameter37Value'] = $parameter37Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter38Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter38Name(string $parameter38Name): self + { + $this->options['parameter38Name'] = $parameter38Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter38Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter38Value(string $parameter38Value): self + { + $this->options['parameter38Value'] = $parameter38Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter39Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter39Name(string $parameter39Name): self + { + $this->options['parameter39Name'] = $parameter39Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter39Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter39Value(string $parameter39Value): self + { + $this->options['parameter39Value'] = $parameter39Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter40Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter40Name(string $parameter40Name): self + { + $this->options['parameter40Name'] = $parameter40Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter40Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter40Value(string $parameter40Value): self + { + $this->options['parameter40Value'] = $parameter40Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter41Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter41Name(string $parameter41Name): self + { + $this->options['parameter41Name'] = $parameter41Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter41Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter41Value(string $parameter41Value): self + { + $this->options['parameter41Value'] = $parameter41Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter42Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter42Name(string $parameter42Name): self + { + $this->options['parameter42Name'] = $parameter42Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter42Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter42Value(string $parameter42Value): self + { + $this->options['parameter42Value'] = $parameter42Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter43Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter43Name(string $parameter43Name): self + { + $this->options['parameter43Name'] = $parameter43Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter43Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter43Value(string $parameter43Value): self + { + $this->options['parameter43Value'] = $parameter43Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter44Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter44Name(string $parameter44Name): self + { + $this->options['parameter44Name'] = $parameter44Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter44Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter44Value(string $parameter44Value): self + { + $this->options['parameter44Value'] = $parameter44Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter45Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter45Name(string $parameter45Name): self + { + $this->options['parameter45Name'] = $parameter45Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter45Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter45Value(string $parameter45Value): self + { + $this->options['parameter45Value'] = $parameter45Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter46Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter46Name(string $parameter46Name): self + { + $this->options['parameter46Name'] = $parameter46Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter46Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter46Value(string $parameter46Value): self + { + $this->options['parameter46Value'] = $parameter46Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter47Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter47Name(string $parameter47Name): self + { + $this->options['parameter47Name'] = $parameter47Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter47Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter47Value(string $parameter47Value): self + { + $this->options['parameter47Value'] = $parameter47Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter48Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter48Name(string $parameter48Name): self + { + $this->options['parameter48Name'] = $parameter48Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter48Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter48Value(string $parameter48Value): self + { + $this->options['parameter48Value'] = $parameter48Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter49Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter49Name(string $parameter49Name): self + { + $this->options['parameter49Name'] = $parameter49Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter49Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter49Value(string $parameter49Value): self + { + $this->options['parameter49Value'] = $parameter49Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter50Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter50Name(string $parameter50Name): self + { + $this->options['parameter50Name'] = $parameter50Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter50Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter50Value(string $parameter50Value): self + { + $this->options['parameter50Value'] = $parameter50Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter51Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter51Name(string $parameter51Name): self + { + $this->options['parameter51Name'] = $parameter51Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter51Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter51Value(string $parameter51Value): self + { + $this->options['parameter51Value'] = $parameter51Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter52Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter52Name(string $parameter52Name): self + { + $this->options['parameter52Name'] = $parameter52Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter52Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter52Value(string $parameter52Value): self + { + $this->options['parameter52Value'] = $parameter52Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter53Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter53Name(string $parameter53Name): self + { + $this->options['parameter53Name'] = $parameter53Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter53Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter53Value(string $parameter53Value): self + { + $this->options['parameter53Value'] = $parameter53Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter54Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter54Name(string $parameter54Name): self + { + $this->options['parameter54Name'] = $parameter54Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter54Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter54Value(string $parameter54Value): self + { + $this->options['parameter54Value'] = $parameter54Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter55Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter55Name(string $parameter55Name): self + { + $this->options['parameter55Name'] = $parameter55Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter55Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter55Value(string $parameter55Value): self + { + $this->options['parameter55Value'] = $parameter55Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter56Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter56Name(string $parameter56Name): self + { + $this->options['parameter56Name'] = $parameter56Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter56Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter56Value(string $parameter56Value): self + { + $this->options['parameter56Value'] = $parameter56Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter57Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter57Name(string $parameter57Name): self + { + $this->options['parameter57Name'] = $parameter57Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter57Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter57Value(string $parameter57Value): self + { + $this->options['parameter57Value'] = $parameter57Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter58Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter58Name(string $parameter58Name): self + { + $this->options['parameter58Name'] = $parameter58Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter58Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter58Value(string $parameter58Value): self + { + $this->options['parameter58Value'] = $parameter58Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter59Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter59Name(string $parameter59Name): self + { + $this->options['parameter59Name'] = $parameter59Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter59Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter59Value(string $parameter59Value): self + { + $this->options['parameter59Value'] = $parameter59Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter60Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter60Name(string $parameter60Name): self + { + $this->options['parameter60Name'] = $parameter60Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter60Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter60Value(string $parameter60Value): self + { + $this->options['parameter60Value'] = $parameter60Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter61Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter61Name(string $parameter61Name): self + { + $this->options['parameter61Name'] = $parameter61Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter61Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter61Value(string $parameter61Value): self + { + $this->options['parameter61Value'] = $parameter61Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter62Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter62Name(string $parameter62Name): self + { + $this->options['parameter62Name'] = $parameter62Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter62Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter62Value(string $parameter62Value): self + { + $this->options['parameter62Value'] = $parameter62Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter63Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter63Name(string $parameter63Name): self + { + $this->options['parameter63Name'] = $parameter63Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter63Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter63Value(string $parameter63Value): self + { + $this->options['parameter63Value'] = $parameter63Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter64Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter64Name(string $parameter64Name): self + { + $this->options['parameter64Name'] = $parameter64Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter64Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter64Value(string $parameter64Value): self + { + $this->options['parameter64Value'] = $parameter64Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter65Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter65Name(string $parameter65Name): self + { + $this->options['parameter65Name'] = $parameter65Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter65Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter65Value(string $parameter65Value): self + { + $this->options['parameter65Value'] = $parameter65Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter66Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter66Name(string $parameter66Name): self + { + $this->options['parameter66Name'] = $parameter66Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter66Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter66Value(string $parameter66Value): self + { + $this->options['parameter66Value'] = $parameter66Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter67Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter67Name(string $parameter67Name): self + { + $this->options['parameter67Name'] = $parameter67Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter67Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter67Value(string $parameter67Value): self + { + $this->options['parameter67Value'] = $parameter67Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter68Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter68Name(string $parameter68Name): self + { + $this->options['parameter68Name'] = $parameter68Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter68Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter68Value(string $parameter68Value): self + { + $this->options['parameter68Value'] = $parameter68Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter69Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter69Name(string $parameter69Name): self + { + $this->options['parameter69Name'] = $parameter69Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter69Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter69Value(string $parameter69Value): self + { + $this->options['parameter69Value'] = $parameter69Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter70Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter70Name(string $parameter70Name): self + { + $this->options['parameter70Name'] = $parameter70Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter70Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter70Value(string $parameter70Value): self + { + $this->options['parameter70Value'] = $parameter70Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter71Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter71Name(string $parameter71Name): self + { + $this->options['parameter71Name'] = $parameter71Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter71Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter71Value(string $parameter71Value): self + { + $this->options['parameter71Value'] = $parameter71Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter72Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter72Name(string $parameter72Name): self + { + $this->options['parameter72Name'] = $parameter72Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter72Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter72Value(string $parameter72Value): self + { + $this->options['parameter72Value'] = $parameter72Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter73Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter73Name(string $parameter73Name): self + { + $this->options['parameter73Name'] = $parameter73Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter73Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter73Value(string $parameter73Value): self + { + $this->options['parameter73Value'] = $parameter73Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter74Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter74Name(string $parameter74Name): self + { + $this->options['parameter74Name'] = $parameter74Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter74Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter74Value(string $parameter74Value): self + { + $this->options['parameter74Value'] = $parameter74Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter75Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter75Name(string $parameter75Name): self + { + $this->options['parameter75Name'] = $parameter75Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter75Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter75Value(string $parameter75Value): self + { + $this->options['parameter75Value'] = $parameter75Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter76Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter76Name(string $parameter76Name): self + { + $this->options['parameter76Name'] = $parameter76Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter76Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter76Value(string $parameter76Value): self + { + $this->options['parameter76Value'] = $parameter76Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter77Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter77Name(string $parameter77Name): self + { + $this->options['parameter77Name'] = $parameter77Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter77Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter77Value(string $parameter77Value): self + { + $this->options['parameter77Value'] = $parameter77Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter78Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter78Name(string $parameter78Name): self + { + $this->options['parameter78Name'] = $parameter78Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter78Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter78Value(string $parameter78Value): self + { + $this->options['parameter78Value'] = $parameter78Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter79Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter79Name(string $parameter79Name): self + { + $this->options['parameter79Name'] = $parameter79Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter79Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter79Value(string $parameter79Value): self + { + $this->options['parameter79Value'] = $parameter79Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter80Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter80Name(string $parameter80Name): self + { + $this->options['parameter80Name'] = $parameter80Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter80Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter80Value(string $parameter80Value): self + { + $this->options['parameter80Value'] = $parameter80Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter81Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter81Name(string $parameter81Name): self + { + $this->options['parameter81Name'] = $parameter81Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter81Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter81Value(string $parameter81Value): self + { + $this->options['parameter81Value'] = $parameter81Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter82Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter82Name(string $parameter82Name): self + { + $this->options['parameter82Name'] = $parameter82Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter82Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter82Value(string $parameter82Value): self + { + $this->options['parameter82Value'] = $parameter82Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter83Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter83Name(string $parameter83Name): self + { + $this->options['parameter83Name'] = $parameter83Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter83Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter83Value(string $parameter83Value): self + { + $this->options['parameter83Value'] = $parameter83Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter84Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter84Name(string $parameter84Name): self + { + $this->options['parameter84Name'] = $parameter84Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter84Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter84Value(string $parameter84Value): self + { + $this->options['parameter84Value'] = $parameter84Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter85Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter85Name(string $parameter85Name): self + { + $this->options['parameter85Name'] = $parameter85Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter85Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter85Value(string $parameter85Value): self + { + $this->options['parameter85Value'] = $parameter85Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter86Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter86Name(string $parameter86Name): self + { + $this->options['parameter86Name'] = $parameter86Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter86Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter86Value(string $parameter86Value): self + { + $this->options['parameter86Value'] = $parameter86Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter87Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter87Name(string $parameter87Name): self + { + $this->options['parameter87Name'] = $parameter87Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter87Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter87Value(string $parameter87Value): self + { + $this->options['parameter87Value'] = $parameter87Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter88Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter88Name(string $parameter88Name): self + { + $this->options['parameter88Name'] = $parameter88Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter88Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter88Value(string $parameter88Value): self + { + $this->options['parameter88Value'] = $parameter88Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter89Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter89Name(string $parameter89Name): self + { + $this->options['parameter89Name'] = $parameter89Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter89Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter89Value(string $parameter89Value): self + { + $this->options['parameter89Value'] = $parameter89Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter90Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter90Name(string $parameter90Name): self + { + $this->options['parameter90Name'] = $parameter90Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter90Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter90Value(string $parameter90Value): self + { + $this->options['parameter90Value'] = $parameter90Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter91Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter91Name(string $parameter91Name): self + { + $this->options['parameter91Name'] = $parameter91Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter91Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter91Value(string $parameter91Value): self + { + $this->options['parameter91Value'] = $parameter91Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter92Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter92Name(string $parameter92Name): self + { + $this->options['parameter92Name'] = $parameter92Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter92Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter92Value(string $parameter92Value): self + { + $this->options['parameter92Value'] = $parameter92Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter93Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter93Name(string $parameter93Name): self + { + $this->options['parameter93Name'] = $parameter93Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter93Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter93Value(string $parameter93Value): self + { + $this->options['parameter93Value'] = $parameter93Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter94Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter94Name(string $parameter94Name): self + { + $this->options['parameter94Name'] = $parameter94Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter94Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter94Value(string $parameter94Value): self + { + $this->options['parameter94Value'] = $parameter94Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter95Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter95Name(string $parameter95Name): self + { + $this->options['parameter95Name'] = $parameter95Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter95Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter95Value(string $parameter95Value): self + { + $this->options['parameter95Value'] = $parameter95Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter96Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter96Name(string $parameter96Name): self + { + $this->options['parameter96Name'] = $parameter96Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter96Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter96Value(string $parameter96Value): self + { + $this->options['parameter96Value'] = $parameter96Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter97Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter97Name(string $parameter97Name): self + { + $this->options['parameter97Name'] = $parameter97Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter97Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter97Value(string $parameter97Value): self + { + $this->options['parameter97Value'] = $parameter97Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter98Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter98Name(string $parameter98Name): self + { + $this->options['parameter98Name'] = $parameter98Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter98Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter98Value(string $parameter98Value): self + { + $this->options['parameter98Value'] = $parameter98Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter99Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter99Name(string $parameter99Name): self + { + $this->options['parameter99Name'] = $parameter99Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter99Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter99Value(string $parameter99Value): self + { + $this->options['parameter99Value'] = $parameter99Value; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateSiprecOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecPage.php new file mode 100755 index 0000000..6416ce4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/SiprecPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SiprecInstance \Twilio\Rest\Api\V2010\Account\Call\SiprecInstance + */ + public function buildInstance(array $payload): SiprecInstance + { + return new SiprecInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SiprecPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamContext.php new file mode 100755 index 0000000..3c0f04d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamContext.php @@ -0,0 +1,101 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Streams/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Update the StreamInstance + * + * @param string $status + * @return StreamInstance Updated StreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): StreamInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new StreamInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.StreamContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamInstance.php new file mode 100755 index 0000000..a202fb4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'name' => Values::array_get($payload, 'name'), + 'status' => Values::array_get($payload, 'status'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return StreamContext Context for this StreamInstance + */ + protected function proxy(): StreamContext + { + if (!$this->context) { + $this->context = new StreamContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the StreamInstance + * + * @param string $status + * @return StreamInstance Updated StreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): StreamInstance + { + + return $this->proxy()->update($status); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.StreamInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamList.php new file mode 100755 index 0000000..279d0f7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamList.php @@ -0,0 +1,518 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/Streams.json'; + } + + /** + * Create the StreamInstance + * + * @param string $url Relative or absolute url where WebSocket connection will be established. + * @param array|Options $options Optional Arguments + * @return StreamInstance Created StreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $url, array $options = []): StreamInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Url' => + $url, + 'Name' => + $options['name'], + 'Track' => + $options['track'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'Parameter1.Name' => + $options['parameter1Name'], + 'Parameter1.Value' => + $options['parameter1Value'], + 'Parameter2.Name' => + $options['parameter2Name'], + 'Parameter2.Value' => + $options['parameter2Value'], + 'Parameter3.Name' => + $options['parameter3Name'], + 'Parameter3.Value' => + $options['parameter3Value'], + 'Parameter4.Name' => + $options['parameter4Name'], + 'Parameter4.Value' => + $options['parameter4Value'], + 'Parameter5.Name' => + $options['parameter5Name'], + 'Parameter5.Value' => + $options['parameter5Value'], + 'Parameter6.Name' => + $options['parameter6Name'], + 'Parameter6.Value' => + $options['parameter6Value'], + 'Parameter7.Name' => + $options['parameter7Name'], + 'Parameter7.Value' => + $options['parameter7Value'], + 'Parameter8.Name' => + $options['parameter8Name'], + 'Parameter8.Value' => + $options['parameter8Value'], + 'Parameter9.Name' => + $options['parameter9Name'], + 'Parameter9.Value' => + $options['parameter9Value'], + 'Parameter10.Name' => + $options['parameter10Name'], + 'Parameter10.Value' => + $options['parameter10Value'], + 'Parameter11.Name' => + $options['parameter11Name'], + 'Parameter11.Value' => + $options['parameter11Value'], + 'Parameter12.Name' => + $options['parameter12Name'], + 'Parameter12.Value' => + $options['parameter12Value'], + 'Parameter13.Name' => + $options['parameter13Name'], + 'Parameter13.Value' => + $options['parameter13Value'], + 'Parameter14.Name' => + $options['parameter14Name'], + 'Parameter14.Value' => + $options['parameter14Value'], + 'Parameter15.Name' => + $options['parameter15Name'], + 'Parameter15.Value' => + $options['parameter15Value'], + 'Parameter16.Name' => + $options['parameter16Name'], + 'Parameter16.Value' => + $options['parameter16Value'], + 'Parameter17.Name' => + $options['parameter17Name'], + 'Parameter17.Value' => + $options['parameter17Value'], + 'Parameter18.Name' => + $options['parameter18Name'], + 'Parameter18.Value' => + $options['parameter18Value'], + 'Parameter19.Name' => + $options['parameter19Name'], + 'Parameter19.Value' => + $options['parameter19Value'], + 'Parameter20.Name' => + $options['parameter20Name'], + 'Parameter20.Value' => + $options['parameter20Value'], + 'Parameter21.Name' => + $options['parameter21Name'], + 'Parameter21.Value' => + $options['parameter21Value'], + 'Parameter22.Name' => + $options['parameter22Name'], + 'Parameter22.Value' => + $options['parameter22Value'], + 'Parameter23.Name' => + $options['parameter23Name'], + 'Parameter23.Value' => + $options['parameter23Value'], + 'Parameter24.Name' => + $options['parameter24Name'], + 'Parameter24.Value' => + $options['parameter24Value'], + 'Parameter25.Name' => + $options['parameter25Name'], + 'Parameter25.Value' => + $options['parameter25Value'], + 'Parameter26.Name' => + $options['parameter26Name'], + 'Parameter26.Value' => + $options['parameter26Value'], + 'Parameter27.Name' => + $options['parameter27Name'], + 'Parameter27.Value' => + $options['parameter27Value'], + 'Parameter28.Name' => + $options['parameter28Name'], + 'Parameter28.Value' => + $options['parameter28Value'], + 'Parameter29.Name' => + $options['parameter29Name'], + 'Parameter29.Value' => + $options['parameter29Value'], + 'Parameter30.Name' => + $options['parameter30Name'], + 'Parameter30.Value' => + $options['parameter30Value'], + 'Parameter31.Name' => + $options['parameter31Name'], + 'Parameter31.Value' => + $options['parameter31Value'], + 'Parameter32.Name' => + $options['parameter32Name'], + 'Parameter32.Value' => + $options['parameter32Value'], + 'Parameter33.Name' => + $options['parameter33Name'], + 'Parameter33.Value' => + $options['parameter33Value'], + 'Parameter34.Name' => + $options['parameter34Name'], + 'Parameter34.Value' => + $options['parameter34Value'], + 'Parameter35.Name' => + $options['parameter35Name'], + 'Parameter35.Value' => + $options['parameter35Value'], + 'Parameter36.Name' => + $options['parameter36Name'], + 'Parameter36.Value' => + $options['parameter36Value'], + 'Parameter37.Name' => + $options['parameter37Name'], + 'Parameter37.Value' => + $options['parameter37Value'], + 'Parameter38.Name' => + $options['parameter38Name'], + 'Parameter38.Value' => + $options['parameter38Value'], + 'Parameter39.Name' => + $options['parameter39Name'], + 'Parameter39.Value' => + $options['parameter39Value'], + 'Parameter40.Name' => + $options['parameter40Name'], + 'Parameter40.Value' => + $options['parameter40Value'], + 'Parameter41.Name' => + $options['parameter41Name'], + 'Parameter41.Value' => + $options['parameter41Value'], + 'Parameter42.Name' => + $options['parameter42Name'], + 'Parameter42.Value' => + $options['parameter42Value'], + 'Parameter43.Name' => + $options['parameter43Name'], + 'Parameter43.Value' => + $options['parameter43Value'], + 'Parameter44.Name' => + $options['parameter44Name'], + 'Parameter44.Value' => + $options['parameter44Value'], + 'Parameter45.Name' => + $options['parameter45Name'], + 'Parameter45.Value' => + $options['parameter45Value'], + 'Parameter46.Name' => + $options['parameter46Name'], + 'Parameter46.Value' => + $options['parameter46Value'], + 'Parameter47.Name' => + $options['parameter47Name'], + 'Parameter47.Value' => + $options['parameter47Value'], + 'Parameter48.Name' => + $options['parameter48Name'], + 'Parameter48.Value' => + $options['parameter48Value'], + 'Parameter49.Name' => + $options['parameter49Name'], + 'Parameter49.Value' => + $options['parameter49Value'], + 'Parameter50.Name' => + $options['parameter50Name'], + 'Parameter50.Value' => + $options['parameter50Value'], + 'Parameter51.Name' => + $options['parameter51Name'], + 'Parameter51.Value' => + $options['parameter51Value'], + 'Parameter52.Name' => + $options['parameter52Name'], + 'Parameter52.Value' => + $options['parameter52Value'], + 'Parameter53.Name' => + $options['parameter53Name'], + 'Parameter53.Value' => + $options['parameter53Value'], + 'Parameter54.Name' => + $options['parameter54Name'], + 'Parameter54.Value' => + $options['parameter54Value'], + 'Parameter55.Name' => + $options['parameter55Name'], + 'Parameter55.Value' => + $options['parameter55Value'], + 'Parameter56.Name' => + $options['parameter56Name'], + 'Parameter56.Value' => + $options['parameter56Value'], + 'Parameter57.Name' => + $options['parameter57Name'], + 'Parameter57.Value' => + $options['parameter57Value'], + 'Parameter58.Name' => + $options['parameter58Name'], + 'Parameter58.Value' => + $options['parameter58Value'], + 'Parameter59.Name' => + $options['parameter59Name'], + 'Parameter59.Value' => + $options['parameter59Value'], + 'Parameter60.Name' => + $options['parameter60Name'], + 'Parameter60.Value' => + $options['parameter60Value'], + 'Parameter61.Name' => + $options['parameter61Name'], + 'Parameter61.Value' => + $options['parameter61Value'], + 'Parameter62.Name' => + $options['parameter62Name'], + 'Parameter62.Value' => + $options['parameter62Value'], + 'Parameter63.Name' => + $options['parameter63Name'], + 'Parameter63.Value' => + $options['parameter63Value'], + 'Parameter64.Name' => + $options['parameter64Name'], + 'Parameter64.Value' => + $options['parameter64Value'], + 'Parameter65.Name' => + $options['parameter65Name'], + 'Parameter65.Value' => + $options['parameter65Value'], + 'Parameter66.Name' => + $options['parameter66Name'], + 'Parameter66.Value' => + $options['parameter66Value'], + 'Parameter67.Name' => + $options['parameter67Name'], + 'Parameter67.Value' => + $options['parameter67Value'], + 'Parameter68.Name' => + $options['parameter68Name'], + 'Parameter68.Value' => + $options['parameter68Value'], + 'Parameter69.Name' => + $options['parameter69Name'], + 'Parameter69.Value' => + $options['parameter69Value'], + 'Parameter70.Name' => + $options['parameter70Name'], + 'Parameter70.Value' => + $options['parameter70Value'], + 'Parameter71.Name' => + $options['parameter71Name'], + 'Parameter71.Value' => + $options['parameter71Value'], + 'Parameter72.Name' => + $options['parameter72Name'], + 'Parameter72.Value' => + $options['parameter72Value'], + 'Parameter73.Name' => + $options['parameter73Name'], + 'Parameter73.Value' => + $options['parameter73Value'], + 'Parameter74.Name' => + $options['parameter74Name'], + 'Parameter74.Value' => + $options['parameter74Value'], + 'Parameter75.Name' => + $options['parameter75Name'], + 'Parameter75.Value' => + $options['parameter75Value'], + 'Parameter76.Name' => + $options['parameter76Name'], + 'Parameter76.Value' => + $options['parameter76Value'], + 'Parameter77.Name' => + $options['parameter77Name'], + 'Parameter77.Value' => + $options['parameter77Value'], + 'Parameter78.Name' => + $options['parameter78Name'], + 'Parameter78.Value' => + $options['parameter78Value'], + 'Parameter79.Name' => + $options['parameter79Name'], + 'Parameter79.Value' => + $options['parameter79Value'], + 'Parameter80.Name' => + $options['parameter80Name'], + 'Parameter80.Value' => + $options['parameter80Value'], + 'Parameter81.Name' => + $options['parameter81Name'], + 'Parameter81.Value' => + $options['parameter81Value'], + 'Parameter82.Name' => + $options['parameter82Name'], + 'Parameter82.Value' => + $options['parameter82Value'], + 'Parameter83.Name' => + $options['parameter83Name'], + 'Parameter83.Value' => + $options['parameter83Value'], + 'Parameter84.Name' => + $options['parameter84Name'], + 'Parameter84.Value' => + $options['parameter84Value'], + 'Parameter85.Name' => + $options['parameter85Name'], + 'Parameter85.Value' => + $options['parameter85Value'], + 'Parameter86.Name' => + $options['parameter86Name'], + 'Parameter86.Value' => + $options['parameter86Value'], + 'Parameter87.Name' => + $options['parameter87Name'], + 'Parameter87.Value' => + $options['parameter87Value'], + 'Parameter88.Name' => + $options['parameter88Name'], + 'Parameter88.Value' => + $options['parameter88Value'], + 'Parameter89.Name' => + $options['parameter89Name'], + 'Parameter89.Value' => + $options['parameter89Value'], + 'Parameter90.Name' => + $options['parameter90Name'], + 'Parameter90.Value' => + $options['parameter90Value'], + 'Parameter91.Name' => + $options['parameter91Name'], + 'Parameter91.Value' => + $options['parameter91Value'], + 'Parameter92.Name' => + $options['parameter92Name'], + 'Parameter92.Value' => + $options['parameter92Value'], + 'Parameter93.Name' => + $options['parameter93Name'], + 'Parameter93.Value' => + $options['parameter93Value'], + 'Parameter94.Name' => + $options['parameter94Name'], + 'Parameter94.Value' => + $options['parameter94Value'], + 'Parameter95.Name' => + $options['parameter95Name'], + 'Parameter95.Value' => + $options['parameter95Value'], + 'Parameter96.Name' => + $options['parameter96Name'], + 'Parameter96.Value' => + $options['parameter96Value'], + 'Parameter97.Name' => + $options['parameter97Name'], + 'Parameter97.Value' => + $options['parameter97Value'], + 'Parameter98.Name' => + $options['parameter98Name'], + 'Parameter98.Value' => + $options['parameter98Value'], + 'Parameter99.Name' => + $options['parameter99Name'], + 'Parameter99.Value' => + $options['parameter99Value'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new StreamInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Constructs a StreamContext + * + * @param string $sid The SID of the Stream resource, or the `name` used when creating the resource + */ + public function getContext( + string $sid + + ): StreamContext + { + return new StreamContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.StreamList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamOptions.php new file mode 100755 index 0000000..852734e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamOptions.php @@ -0,0 +1,3695 @@ +options['name'] = $name; + $this->options['track'] = $track; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['parameter1Name'] = $parameter1Name; + $this->options['parameter1Value'] = $parameter1Value; + $this->options['parameter2Name'] = $parameter2Name; + $this->options['parameter2Value'] = $parameter2Value; + $this->options['parameter3Name'] = $parameter3Name; + $this->options['parameter3Value'] = $parameter3Value; + $this->options['parameter4Name'] = $parameter4Name; + $this->options['parameter4Value'] = $parameter4Value; + $this->options['parameter5Name'] = $parameter5Name; + $this->options['parameter5Value'] = $parameter5Value; + $this->options['parameter6Name'] = $parameter6Name; + $this->options['parameter6Value'] = $parameter6Value; + $this->options['parameter7Name'] = $parameter7Name; + $this->options['parameter7Value'] = $parameter7Value; + $this->options['parameter8Name'] = $parameter8Name; + $this->options['parameter8Value'] = $parameter8Value; + $this->options['parameter9Name'] = $parameter9Name; + $this->options['parameter9Value'] = $parameter9Value; + $this->options['parameter10Name'] = $parameter10Name; + $this->options['parameter10Value'] = $parameter10Value; + $this->options['parameter11Name'] = $parameter11Name; + $this->options['parameter11Value'] = $parameter11Value; + $this->options['parameter12Name'] = $parameter12Name; + $this->options['parameter12Value'] = $parameter12Value; + $this->options['parameter13Name'] = $parameter13Name; + $this->options['parameter13Value'] = $parameter13Value; + $this->options['parameter14Name'] = $parameter14Name; + $this->options['parameter14Value'] = $parameter14Value; + $this->options['parameter15Name'] = $parameter15Name; + $this->options['parameter15Value'] = $parameter15Value; + $this->options['parameter16Name'] = $parameter16Name; + $this->options['parameter16Value'] = $parameter16Value; + $this->options['parameter17Name'] = $parameter17Name; + $this->options['parameter17Value'] = $parameter17Value; + $this->options['parameter18Name'] = $parameter18Name; + $this->options['parameter18Value'] = $parameter18Value; + $this->options['parameter19Name'] = $parameter19Name; + $this->options['parameter19Value'] = $parameter19Value; + $this->options['parameter20Name'] = $parameter20Name; + $this->options['parameter20Value'] = $parameter20Value; + $this->options['parameter21Name'] = $parameter21Name; + $this->options['parameter21Value'] = $parameter21Value; + $this->options['parameter22Name'] = $parameter22Name; + $this->options['parameter22Value'] = $parameter22Value; + $this->options['parameter23Name'] = $parameter23Name; + $this->options['parameter23Value'] = $parameter23Value; + $this->options['parameter24Name'] = $parameter24Name; + $this->options['parameter24Value'] = $parameter24Value; + $this->options['parameter25Name'] = $parameter25Name; + $this->options['parameter25Value'] = $parameter25Value; + $this->options['parameter26Name'] = $parameter26Name; + $this->options['parameter26Value'] = $parameter26Value; + $this->options['parameter27Name'] = $parameter27Name; + $this->options['parameter27Value'] = $parameter27Value; + $this->options['parameter28Name'] = $parameter28Name; + $this->options['parameter28Value'] = $parameter28Value; + $this->options['parameter29Name'] = $parameter29Name; + $this->options['parameter29Value'] = $parameter29Value; + $this->options['parameter30Name'] = $parameter30Name; + $this->options['parameter30Value'] = $parameter30Value; + $this->options['parameter31Name'] = $parameter31Name; + $this->options['parameter31Value'] = $parameter31Value; + $this->options['parameter32Name'] = $parameter32Name; + $this->options['parameter32Value'] = $parameter32Value; + $this->options['parameter33Name'] = $parameter33Name; + $this->options['parameter33Value'] = $parameter33Value; + $this->options['parameter34Name'] = $parameter34Name; + $this->options['parameter34Value'] = $parameter34Value; + $this->options['parameter35Name'] = $parameter35Name; + $this->options['parameter35Value'] = $parameter35Value; + $this->options['parameter36Name'] = $parameter36Name; + $this->options['parameter36Value'] = $parameter36Value; + $this->options['parameter37Name'] = $parameter37Name; + $this->options['parameter37Value'] = $parameter37Value; + $this->options['parameter38Name'] = $parameter38Name; + $this->options['parameter38Value'] = $parameter38Value; + $this->options['parameter39Name'] = $parameter39Name; + $this->options['parameter39Value'] = $parameter39Value; + $this->options['parameter40Name'] = $parameter40Name; + $this->options['parameter40Value'] = $parameter40Value; + $this->options['parameter41Name'] = $parameter41Name; + $this->options['parameter41Value'] = $parameter41Value; + $this->options['parameter42Name'] = $parameter42Name; + $this->options['parameter42Value'] = $parameter42Value; + $this->options['parameter43Name'] = $parameter43Name; + $this->options['parameter43Value'] = $parameter43Value; + $this->options['parameter44Name'] = $parameter44Name; + $this->options['parameter44Value'] = $parameter44Value; + $this->options['parameter45Name'] = $parameter45Name; + $this->options['parameter45Value'] = $parameter45Value; + $this->options['parameter46Name'] = $parameter46Name; + $this->options['parameter46Value'] = $parameter46Value; + $this->options['parameter47Name'] = $parameter47Name; + $this->options['parameter47Value'] = $parameter47Value; + $this->options['parameter48Name'] = $parameter48Name; + $this->options['parameter48Value'] = $parameter48Value; + $this->options['parameter49Name'] = $parameter49Name; + $this->options['parameter49Value'] = $parameter49Value; + $this->options['parameter50Name'] = $parameter50Name; + $this->options['parameter50Value'] = $parameter50Value; + $this->options['parameter51Name'] = $parameter51Name; + $this->options['parameter51Value'] = $parameter51Value; + $this->options['parameter52Name'] = $parameter52Name; + $this->options['parameter52Value'] = $parameter52Value; + $this->options['parameter53Name'] = $parameter53Name; + $this->options['parameter53Value'] = $parameter53Value; + $this->options['parameter54Name'] = $parameter54Name; + $this->options['parameter54Value'] = $parameter54Value; + $this->options['parameter55Name'] = $parameter55Name; + $this->options['parameter55Value'] = $parameter55Value; + $this->options['parameter56Name'] = $parameter56Name; + $this->options['parameter56Value'] = $parameter56Value; + $this->options['parameter57Name'] = $parameter57Name; + $this->options['parameter57Value'] = $parameter57Value; + $this->options['parameter58Name'] = $parameter58Name; + $this->options['parameter58Value'] = $parameter58Value; + $this->options['parameter59Name'] = $parameter59Name; + $this->options['parameter59Value'] = $parameter59Value; + $this->options['parameter60Name'] = $parameter60Name; + $this->options['parameter60Value'] = $parameter60Value; + $this->options['parameter61Name'] = $parameter61Name; + $this->options['parameter61Value'] = $parameter61Value; + $this->options['parameter62Name'] = $parameter62Name; + $this->options['parameter62Value'] = $parameter62Value; + $this->options['parameter63Name'] = $parameter63Name; + $this->options['parameter63Value'] = $parameter63Value; + $this->options['parameter64Name'] = $parameter64Name; + $this->options['parameter64Value'] = $parameter64Value; + $this->options['parameter65Name'] = $parameter65Name; + $this->options['parameter65Value'] = $parameter65Value; + $this->options['parameter66Name'] = $parameter66Name; + $this->options['parameter66Value'] = $parameter66Value; + $this->options['parameter67Name'] = $parameter67Name; + $this->options['parameter67Value'] = $parameter67Value; + $this->options['parameter68Name'] = $parameter68Name; + $this->options['parameter68Value'] = $parameter68Value; + $this->options['parameter69Name'] = $parameter69Name; + $this->options['parameter69Value'] = $parameter69Value; + $this->options['parameter70Name'] = $parameter70Name; + $this->options['parameter70Value'] = $parameter70Value; + $this->options['parameter71Name'] = $parameter71Name; + $this->options['parameter71Value'] = $parameter71Value; + $this->options['parameter72Name'] = $parameter72Name; + $this->options['parameter72Value'] = $parameter72Value; + $this->options['parameter73Name'] = $parameter73Name; + $this->options['parameter73Value'] = $parameter73Value; + $this->options['parameter74Name'] = $parameter74Name; + $this->options['parameter74Value'] = $parameter74Value; + $this->options['parameter75Name'] = $parameter75Name; + $this->options['parameter75Value'] = $parameter75Value; + $this->options['parameter76Name'] = $parameter76Name; + $this->options['parameter76Value'] = $parameter76Value; + $this->options['parameter77Name'] = $parameter77Name; + $this->options['parameter77Value'] = $parameter77Value; + $this->options['parameter78Name'] = $parameter78Name; + $this->options['parameter78Value'] = $parameter78Value; + $this->options['parameter79Name'] = $parameter79Name; + $this->options['parameter79Value'] = $parameter79Value; + $this->options['parameter80Name'] = $parameter80Name; + $this->options['parameter80Value'] = $parameter80Value; + $this->options['parameter81Name'] = $parameter81Name; + $this->options['parameter81Value'] = $parameter81Value; + $this->options['parameter82Name'] = $parameter82Name; + $this->options['parameter82Value'] = $parameter82Value; + $this->options['parameter83Name'] = $parameter83Name; + $this->options['parameter83Value'] = $parameter83Value; + $this->options['parameter84Name'] = $parameter84Name; + $this->options['parameter84Value'] = $parameter84Value; + $this->options['parameter85Name'] = $parameter85Name; + $this->options['parameter85Value'] = $parameter85Value; + $this->options['parameter86Name'] = $parameter86Name; + $this->options['parameter86Value'] = $parameter86Value; + $this->options['parameter87Name'] = $parameter87Name; + $this->options['parameter87Value'] = $parameter87Value; + $this->options['parameter88Name'] = $parameter88Name; + $this->options['parameter88Value'] = $parameter88Value; + $this->options['parameter89Name'] = $parameter89Name; + $this->options['parameter89Value'] = $parameter89Value; + $this->options['parameter90Name'] = $parameter90Name; + $this->options['parameter90Value'] = $parameter90Value; + $this->options['parameter91Name'] = $parameter91Name; + $this->options['parameter91Value'] = $parameter91Value; + $this->options['parameter92Name'] = $parameter92Name; + $this->options['parameter92Value'] = $parameter92Value; + $this->options['parameter93Name'] = $parameter93Name; + $this->options['parameter93Value'] = $parameter93Value; + $this->options['parameter94Name'] = $parameter94Name; + $this->options['parameter94Value'] = $parameter94Value; + $this->options['parameter95Name'] = $parameter95Name; + $this->options['parameter95Value'] = $parameter95Value; + $this->options['parameter96Name'] = $parameter96Name; + $this->options['parameter96Value'] = $parameter96Value; + $this->options['parameter97Name'] = $parameter97Name; + $this->options['parameter97Value'] = $parameter97Value; + $this->options['parameter98Name'] = $parameter98Name; + $this->options['parameter98Value'] = $parameter98Value; + $this->options['parameter99Name'] = $parameter99Name; + $this->options['parameter99Value'] = $parameter99Value; + } + + /** + * The user-specified name of this Stream, if one was given when the Stream was created. This may be used to stop the Stream. + * + * @param string $name The user-specified name of this Stream, if one was given when the Stream was created. This may be used to stop the Stream. + * @return $this Fluent Builder + */ + public function setName(string $name): self + { + $this->options['name'] = $name; + return $this; + } + + /** + * @param string $track + * @return $this Fluent Builder + */ + public function setTrack(string $track): self + { + $this->options['track'] = $track; + return $this; + } + + /** + * Absolute URL of the status callback. + * + * @param string $statusCallback Absolute URL of the status callback. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The http method for the status_callback (one of GET, POST). + * + * @param string $statusCallbackMethod The http method for the status_callback (one of GET, POST). + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter1Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter1Name(string $parameter1Name): self + { + $this->options['parameter1Name'] = $parameter1Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter1Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter1Value(string $parameter1Value): self + { + $this->options['parameter1Value'] = $parameter1Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter2Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter2Name(string $parameter2Name): self + { + $this->options['parameter2Name'] = $parameter2Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter2Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter2Value(string $parameter2Value): self + { + $this->options['parameter2Value'] = $parameter2Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter3Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter3Name(string $parameter3Name): self + { + $this->options['parameter3Name'] = $parameter3Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter3Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter3Value(string $parameter3Value): self + { + $this->options['parameter3Value'] = $parameter3Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter4Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter4Name(string $parameter4Name): self + { + $this->options['parameter4Name'] = $parameter4Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter4Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter4Value(string $parameter4Value): self + { + $this->options['parameter4Value'] = $parameter4Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter5Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter5Name(string $parameter5Name): self + { + $this->options['parameter5Name'] = $parameter5Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter5Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter5Value(string $parameter5Value): self + { + $this->options['parameter5Value'] = $parameter5Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter6Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter6Name(string $parameter6Name): self + { + $this->options['parameter6Name'] = $parameter6Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter6Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter6Value(string $parameter6Value): self + { + $this->options['parameter6Value'] = $parameter6Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter7Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter7Name(string $parameter7Name): self + { + $this->options['parameter7Name'] = $parameter7Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter7Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter7Value(string $parameter7Value): self + { + $this->options['parameter7Value'] = $parameter7Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter8Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter8Name(string $parameter8Name): self + { + $this->options['parameter8Name'] = $parameter8Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter8Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter8Value(string $parameter8Value): self + { + $this->options['parameter8Value'] = $parameter8Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter9Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter9Name(string $parameter9Name): self + { + $this->options['parameter9Name'] = $parameter9Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter9Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter9Value(string $parameter9Value): self + { + $this->options['parameter9Value'] = $parameter9Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter10Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter10Name(string $parameter10Name): self + { + $this->options['parameter10Name'] = $parameter10Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter10Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter10Value(string $parameter10Value): self + { + $this->options['parameter10Value'] = $parameter10Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter11Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter11Name(string $parameter11Name): self + { + $this->options['parameter11Name'] = $parameter11Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter11Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter11Value(string $parameter11Value): self + { + $this->options['parameter11Value'] = $parameter11Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter12Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter12Name(string $parameter12Name): self + { + $this->options['parameter12Name'] = $parameter12Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter12Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter12Value(string $parameter12Value): self + { + $this->options['parameter12Value'] = $parameter12Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter13Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter13Name(string $parameter13Name): self + { + $this->options['parameter13Name'] = $parameter13Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter13Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter13Value(string $parameter13Value): self + { + $this->options['parameter13Value'] = $parameter13Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter14Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter14Name(string $parameter14Name): self + { + $this->options['parameter14Name'] = $parameter14Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter14Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter14Value(string $parameter14Value): self + { + $this->options['parameter14Value'] = $parameter14Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter15Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter15Name(string $parameter15Name): self + { + $this->options['parameter15Name'] = $parameter15Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter15Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter15Value(string $parameter15Value): self + { + $this->options['parameter15Value'] = $parameter15Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter16Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter16Name(string $parameter16Name): self + { + $this->options['parameter16Name'] = $parameter16Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter16Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter16Value(string $parameter16Value): self + { + $this->options['parameter16Value'] = $parameter16Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter17Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter17Name(string $parameter17Name): self + { + $this->options['parameter17Name'] = $parameter17Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter17Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter17Value(string $parameter17Value): self + { + $this->options['parameter17Value'] = $parameter17Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter18Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter18Name(string $parameter18Name): self + { + $this->options['parameter18Name'] = $parameter18Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter18Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter18Value(string $parameter18Value): self + { + $this->options['parameter18Value'] = $parameter18Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter19Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter19Name(string $parameter19Name): self + { + $this->options['parameter19Name'] = $parameter19Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter19Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter19Value(string $parameter19Value): self + { + $this->options['parameter19Value'] = $parameter19Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter20Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter20Name(string $parameter20Name): self + { + $this->options['parameter20Name'] = $parameter20Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter20Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter20Value(string $parameter20Value): self + { + $this->options['parameter20Value'] = $parameter20Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter21Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter21Name(string $parameter21Name): self + { + $this->options['parameter21Name'] = $parameter21Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter21Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter21Value(string $parameter21Value): self + { + $this->options['parameter21Value'] = $parameter21Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter22Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter22Name(string $parameter22Name): self + { + $this->options['parameter22Name'] = $parameter22Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter22Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter22Value(string $parameter22Value): self + { + $this->options['parameter22Value'] = $parameter22Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter23Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter23Name(string $parameter23Name): self + { + $this->options['parameter23Name'] = $parameter23Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter23Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter23Value(string $parameter23Value): self + { + $this->options['parameter23Value'] = $parameter23Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter24Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter24Name(string $parameter24Name): self + { + $this->options['parameter24Name'] = $parameter24Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter24Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter24Value(string $parameter24Value): self + { + $this->options['parameter24Value'] = $parameter24Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter25Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter25Name(string $parameter25Name): self + { + $this->options['parameter25Name'] = $parameter25Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter25Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter25Value(string $parameter25Value): self + { + $this->options['parameter25Value'] = $parameter25Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter26Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter26Name(string $parameter26Name): self + { + $this->options['parameter26Name'] = $parameter26Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter26Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter26Value(string $parameter26Value): self + { + $this->options['parameter26Value'] = $parameter26Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter27Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter27Name(string $parameter27Name): self + { + $this->options['parameter27Name'] = $parameter27Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter27Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter27Value(string $parameter27Value): self + { + $this->options['parameter27Value'] = $parameter27Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter28Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter28Name(string $parameter28Name): self + { + $this->options['parameter28Name'] = $parameter28Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter28Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter28Value(string $parameter28Value): self + { + $this->options['parameter28Value'] = $parameter28Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter29Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter29Name(string $parameter29Name): self + { + $this->options['parameter29Name'] = $parameter29Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter29Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter29Value(string $parameter29Value): self + { + $this->options['parameter29Value'] = $parameter29Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter30Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter30Name(string $parameter30Name): self + { + $this->options['parameter30Name'] = $parameter30Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter30Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter30Value(string $parameter30Value): self + { + $this->options['parameter30Value'] = $parameter30Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter31Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter31Name(string $parameter31Name): self + { + $this->options['parameter31Name'] = $parameter31Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter31Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter31Value(string $parameter31Value): self + { + $this->options['parameter31Value'] = $parameter31Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter32Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter32Name(string $parameter32Name): self + { + $this->options['parameter32Name'] = $parameter32Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter32Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter32Value(string $parameter32Value): self + { + $this->options['parameter32Value'] = $parameter32Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter33Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter33Name(string $parameter33Name): self + { + $this->options['parameter33Name'] = $parameter33Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter33Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter33Value(string $parameter33Value): self + { + $this->options['parameter33Value'] = $parameter33Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter34Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter34Name(string $parameter34Name): self + { + $this->options['parameter34Name'] = $parameter34Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter34Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter34Value(string $parameter34Value): self + { + $this->options['parameter34Value'] = $parameter34Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter35Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter35Name(string $parameter35Name): self + { + $this->options['parameter35Name'] = $parameter35Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter35Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter35Value(string $parameter35Value): self + { + $this->options['parameter35Value'] = $parameter35Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter36Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter36Name(string $parameter36Name): self + { + $this->options['parameter36Name'] = $parameter36Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter36Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter36Value(string $parameter36Value): self + { + $this->options['parameter36Value'] = $parameter36Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter37Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter37Name(string $parameter37Name): self + { + $this->options['parameter37Name'] = $parameter37Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter37Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter37Value(string $parameter37Value): self + { + $this->options['parameter37Value'] = $parameter37Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter38Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter38Name(string $parameter38Name): self + { + $this->options['parameter38Name'] = $parameter38Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter38Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter38Value(string $parameter38Value): self + { + $this->options['parameter38Value'] = $parameter38Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter39Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter39Name(string $parameter39Name): self + { + $this->options['parameter39Name'] = $parameter39Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter39Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter39Value(string $parameter39Value): self + { + $this->options['parameter39Value'] = $parameter39Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter40Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter40Name(string $parameter40Name): self + { + $this->options['parameter40Name'] = $parameter40Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter40Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter40Value(string $parameter40Value): self + { + $this->options['parameter40Value'] = $parameter40Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter41Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter41Name(string $parameter41Name): self + { + $this->options['parameter41Name'] = $parameter41Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter41Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter41Value(string $parameter41Value): self + { + $this->options['parameter41Value'] = $parameter41Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter42Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter42Name(string $parameter42Name): self + { + $this->options['parameter42Name'] = $parameter42Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter42Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter42Value(string $parameter42Value): self + { + $this->options['parameter42Value'] = $parameter42Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter43Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter43Name(string $parameter43Name): self + { + $this->options['parameter43Name'] = $parameter43Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter43Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter43Value(string $parameter43Value): self + { + $this->options['parameter43Value'] = $parameter43Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter44Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter44Name(string $parameter44Name): self + { + $this->options['parameter44Name'] = $parameter44Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter44Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter44Value(string $parameter44Value): self + { + $this->options['parameter44Value'] = $parameter44Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter45Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter45Name(string $parameter45Name): self + { + $this->options['parameter45Name'] = $parameter45Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter45Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter45Value(string $parameter45Value): self + { + $this->options['parameter45Value'] = $parameter45Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter46Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter46Name(string $parameter46Name): self + { + $this->options['parameter46Name'] = $parameter46Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter46Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter46Value(string $parameter46Value): self + { + $this->options['parameter46Value'] = $parameter46Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter47Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter47Name(string $parameter47Name): self + { + $this->options['parameter47Name'] = $parameter47Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter47Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter47Value(string $parameter47Value): self + { + $this->options['parameter47Value'] = $parameter47Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter48Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter48Name(string $parameter48Name): self + { + $this->options['parameter48Name'] = $parameter48Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter48Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter48Value(string $parameter48Value): self + { + $this->options['parameter48Value'] = $parameter48Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter49Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter49Name(string $parameter49Name): self + { + $this->options['parameter49Name'] = $parameter49Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter49Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter49Value(string $parameter49Value): self + { + $this->options['parameter49Value'] = $parameter49Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter50Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter50Name(string $parameter50Name): self + { + $this->options['parameter50Name'] = $parameter50Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter50Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter50Value(string $parameter50Value): self + { + $this->options['parameter50Value'] = $parameter50Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter51Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter51Name(string $parameter51Name): self + { + $this->options['parameter51Name'] = $parameter51Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter51Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter51Value(string $parameter51Value): self + { + $this->options['parameter51Value'] = $parameter51Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter52Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter52Name(string $parameter52Name): self + { + $this->options['parameter52Name'] = $parameter52Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter52Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter52Value(string $parameter52Value): self + { + $this->options['parameter52Value'] = $parameter52Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter53Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter53Name(string $parameter53Name): self + { + $this->options['parameter53Name'] = $parameter53Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter53Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter53Value(string $parameter53Value): self + { + $this->options['parameter53Value'] = $parameter53Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter54Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter54Name(string $parameter54Name): self + { + $this->options['parameter54Name'] = $parameter54Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter54Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter54Value(string $parameter54Value): self + { + $this->options['parameter54Value'] = $parameter54Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter55Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter55Name(string $parameter55Name): self + { + $this->options['parameter55Name'] = $parameter55Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter55Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter55Value(string $parameter55Value): self + { + $this->options['parameter55Value'] = $parameter55Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter56Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter56Name(string $parameter56Name): self + { + $this->options['parameter56Name'] = $parameter56Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter56Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter56Value(string $parameter56Value): self + { + $this->options['parameter56Value'] = $parameter56Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter57Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter57Name(string $parameter57Name): self + { + $this->options['parameter57Name'] = $parameter57Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter57Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter57Value(string $parameter57Value): self + { + $this->options['parameter57Value'] = $parameter57Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter58Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter58Name(string $parameter58Name): self + { + $this->options['parameter58Name'] = $parameter58Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter58Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter58Value(string $parameter58Value): self + { + $this->options['parameter58Value'] = $parameter58Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter59Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter59Name(string $parameter59Name): self + { + $this->options['parameter59Name'] = $parameter59Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter59Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter59Value(string $parameter59Value): self + { + $this->options['parameter59Value'] = $parameter59Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter60Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter60Name(string $parameter60Name): self + { + $this->options['parameter60Name'] = $parameter60Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter60Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter60Value(string $parameter60Value): self + { + $this->options['parameter60Value'] = $parameter60Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter61Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter61Name(string $parameter61Name): self + { + $this->options['parameter61Name'] = $parameter61Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter61Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter61Value(string $parameter61Value): self + { + $this->options['parameter61Value'] = $parameter61Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter62Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter62Name(string $parameter62Name): self + { + $this->options['parameter62Name'] = $parameter62Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter62Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter62Value(string $parameter62Value): self + { + $this->options['parameter62Value'] = $parameter62Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter63Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter63Name(string $parameter63Name): self + { + $this->options['parameter63Name'] = $parameter63Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter63Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter63Value(string $parameter63Value): self + { + $this->options['parameter63Value'] = $parameter63Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter64Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter64Name(string $parameter64Name): self + { + $this->options['parameter64Name'] = $parameter64Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter64Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter64Value(string $parameter64Value): self + { + $this->options['parameter64Value'] = $parameter64Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter65Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter65Name(string $parameter65Name): self + { + $this->options['parameter65Name'] = $parameter65Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter65Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter65Value(string $parameter65Value): self + { + $this->options['parameter65Value'] = $parameter65Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter66Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter66Name(string $parameter66Name): self + { + $this->options['parameter66Name'] = $parameter66Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter66Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter66Value(string $parameter66Value): self + { + $this->options['parameter66Value'] = $parameter66Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter67Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter67Name(string $parameter67Name): self + { + $this->options['parameter67Name'] = $parameter67Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter67Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter67Value(string $parameter67Value): self + { + $this->options['parameter67Value'] = $parameter67Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter68Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter68Name(string $parameter68Name): self + { + $this->options['parameter68Name'] = $parameter68Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter68Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter68Value(string $parameter68Value): self + { + $this->options['parameter68Value'] = $parameter68Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter69Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter69Name(string $parameter69Name): self + { + $this->options['parameter69Name'] = $parameter69Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter69Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter69Value(string $parameter69Value): self + { + $this->options['parameter69Value'] = $parameter69Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter70Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter70Name(string $parameter70Name): self + { + $this->options['parameter70Name'] = $parameter70Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter70Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter70Value(string $parameter70Value): self + { + $this->options['parameter70Value'] = $parameter70Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter71Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter71Name(string $parameter71Name): self + { + $this->options['parameter71Name'] = $parameter71Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter71Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter71Value(string $parameter71Value): self + { + $this->options['parameter71Value'] = $parameter71Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter72Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter72Name(string $parameter72Name): self + { + $this->options['parameter72Name'] = $parameter72Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter72Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter72Value(string $parameter72Value): self + { + $this->options['parameter72Value'] = $parameter72Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter73Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter73Name(string $parameter73Name): self + { + $this->options['parameter73Name'] = $parameter73Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter73Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter73Value(string $parameter73Value): self + { + $this->options['parameter73Value'] = $parameter73Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter74Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter74Name(string $parameter74Name): self + { + $this->options['parameter74Name'] = $parameter74Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter74Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter74Value(string $parameter74Value): self + { + $this->options['parameter74Value'] = $parameter74Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter75Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter75Name(string $parameter75Name): self + { + $this->options['parameter75Name'] = $parameter75Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter75Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter75Value(string $parameter75Value): self + { + $this->options['parameter75Value'] = $parameter75Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter76Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter76Name(string $parameter76Name): self + { + $this->options['parameter76Name'] = $parameter76Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter76Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter76Value(string $parameter76Value): self + { + $this->options['parameter76Value'] = $parameter76Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter77Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter77Name(string $parameter77Name): self + { + $this->options['parameter77Name'] = $parameter77Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter77Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter77Value(string $parameter77Value): self + { + $this->options['parameter77Value'] = $parameter77Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter78Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter78Name(string $parameter78Name): self + { + $this->options['parameter78Name'] = $parameter78Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter78Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter78Value(string $parameter78Value): self + { + $this->options['parameter78Value'] = $parameter78Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter79Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter79Name(string $parameter79Name): self + { + $this->options['parameter79Name'] = $parameter79Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter79Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter79Value(string $parameter79Value): self + { + $this->options['parameter79Value'] = $parameter79Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter80Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter80Name(string $parameter80Name): self + { + $this->options['parameter80Name'] = $parameter80Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter80Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter80Value(string $parameter80Value): self + { + $this->options['parameter80Value'] = $parameter80Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter81Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter81Name(string $parameter81Name): self + { + $this->options['parameter81Name'] = $parameter81Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter81Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter81Value(string $parameter81Value): self + { + $this->options['parameter81Value'] = $parameter81Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter82Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter82Name(string $parameter82Name): self + { + $this->options['parameter82Name'] = $parameter82Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter82Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter82Value(string $parameter82Value): self + { + $this->options['parameter82Value'] = $parameter82Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter83Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter83Name(string $parameter83Name): self + { + $this->options['parameter83Name'] = $parameter83Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter83Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter83Value(string $parameter83Value): self + { + $this->options['parameter83Value'] = $parameter83Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter84Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter84Name(string $parameter84Name): self + { + $this->options['parameter84Name'] = $parameter84Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter84Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter84Value(string $parameter84Value): self + { + $this->options['parameter84Value'] = $parameter84Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter85Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter85Name(string $parameter85Name): self + { + $this->options['parameter85Name'] = $parameter85Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter85Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter85Value(string $parameter85Value): self + { + $this->options['parameter85Value'] = $parameter85Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter86Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter86Name(string $parameter86Name): self + { + $this->options['parameter86Name'] = $parameter86Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter86Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter86Value(string $parameter86Value): self + { + $this->options['parameter86Value'] = $parameter86Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter87Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter87Name(string $parameter87Name): self + { + $this->options['parameter87Name'] = $parameter87Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter87Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter87Value(string $parameter87Value): self + { + $this->options['parameter87Value'] = $parameter87Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter88Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter88Name(string $parameter88Name): self + { + $this->options['parameter88Name'] = $parameter88Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter88Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter88Value(string $parameter88Value): self + { + $this->options['parameter88Value'] = $parameter88Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter89Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter89Name(string $parameter89Name): self + { + $this->options['parameter89Name'] = $parameter89Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter89Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter89Value(string $parameter89Value): self + { + $this->options['parameter89Value'] = $parameter89Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter90Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter90Name(string $parameter90Name): self + { + $this->options['parameter90Name'] = $parameter90Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter90Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter90Value(string $parameter90Value): self + { + $this->options['parameter90Value'] = $parameter90Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter91Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter91Name(string $parameter91Name): self + { + $this->options['parameter91Name'] = $parameter91Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter91Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter91Value(string $parameter91Value): self + { + $this->options['parameter91Value'] = $parameter91Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter92Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter92Name(string $parameter92Name): self + { + $this->options['parameter92Name'] = $parameter92Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter92Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter92Value(string $parameter92Value): self + { + $this->options['parameter92Value'] = $parameter92Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter93Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter93Name(string $parameter93Name): self + { + $this->options['parameter93Name'] = $parameter93Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter93Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter93Value(string $parameter93Value): self + { + $this->options['parameter93Value'] = $parameter93Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter94Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter94Name(string $parameter94Name): self + { + $this->options['parameter94Name'] = $parameter94Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter94Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter94Value(string $parameter94Value): self + { + $this->options['parameter94Value'] = $parameter94Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter95Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter95Name(string $parameter95Name): self + { + $this->options['parameter95Name'] = $parameter95Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter95Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter95Value(string $parameter95Value): self + { + $this->options['parameter95Value'] = $parameter95Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter96Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter96Name(string $parameter96Name): self + { + $this->options['parameter96Name'] = $parameter96Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter96Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter96Value(string $parameter96Value): self + { + $this->options['parameter96Value'] = $parameter96Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter97Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter97Name(string $parameter97Name): self + { + $this->options['parameter97Name'] = $parameter97Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter97Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter97Value(string $parameter97Value): self + { + $this->options['parameter97Value'] = $parameter97Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter98Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter98Name(string $parameter98Name): self + { + $this->options['parameter98Name'] = $parameter98Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter98Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter98Value(string $parameter98Value): self + { + $this->options['parameter98Value'] = $parameter98Value; + return $this; + } + + /** + * Parameter name + * + * @param string $parameter99Name Parameter name + * @return $this Fluent Builder + */ + public function setParameter99Name(string $parameter99Name): self + { + $this->options['parameter99Name'] = $parameter99Name; + return $this; + } + + /** + * Parameter value + * + * @param string $parameter99Value Parameter value + * @return $this Fluent Builder + */ + public function setParameter99Value(string $parameter99Value): self + { + $this->options['parameter99Value'] = $parameter99Value; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateStreamOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamPage.php new file mode 100755 index 0000000..13c727a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/StreamPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StreamInstance \Twilio\Rest\Api\V2010\Account\Call\StreamInstance + */ + public function buildInstance(array $payload): StreamInstance + { + return new StreamInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.StreamPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageInstance.php new file mode 100755 index 0000000..dce699c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UserDefinedMessageInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageList.php new file mode 100755 index 0000000..fae4d6a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageList.php @@ -0,0 +1,97 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/UserDefinedMessages.json'; + } + + /** + * Create the UserDefinedMessageInstance + * + * @param string $content The User Defined Message in the form of URL-encoded JSON string. + * @param array|Options $options Optional Arguments + * @return UserDefinedMessageInstance Created UserDefinedMessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $content, array $options = []): UserDefinedMessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Content' => + $content, + 'IdempotencyKey' => + $options['idempotencyKey'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new UserDefinedMessageInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UserDefinedMessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageOptions.php new file mode 100755 index 0000000..e3a2f93 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageOptions.php @@ -0,0 +1,76 @@ +options['idempotencyKey'] = $idempotencyKey; + } + + /** + * A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + * + * @param string $idempotencyKey A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + * @return $this Fluent Builder + */ + public function setIdempotencyKey(string $idempotencyKey): self + { + $this->options['idempotencyKey'] = $idempotencyKey; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateUserDefinedMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessagePage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessagePage.php new file mode 100755 index 0000000..af2843c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserDefinedMessageInstance \Twilio\Rest\Api\V2010\Account\Call\UserDefinedMessageInstance + */ + public function buildInstance(array $payload): UserDefinedMessageInstance + { + return new UserDefinedMessageInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UserDefinedMessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionContext.php new file mode 100755 index 0000000..d16e2d6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionContext.php @@ -0,0 +1,85 @@ +solution = [ + 'accountSid' => + $accountSid, + 'callSid' => + $callSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/UserDefinedMessageSubscriptions/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the UserDefinedMessageSubscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.UserDefinedMessageSubscriptionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionInstance.php new file mode 100755 index 0000000..8a4e55f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionInstance.php @@ -0,0 +1,128 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'callSid' => $callSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserDefinedMessageSubscriptionContext Context for this UserDefinedMessageSubscriptionInstance + */ + protected function proxy(): UserDefinedMessageSubscriptionContext + { + if (!$this->context) { + $this->context = new UserDefinedMessageSubscriptionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserDefinedMessageSubscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.UserDefinedMessageSubscriptionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionList.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionList.php new file mode 100755 index 0000000..acaf4e8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionList.php @@ -0,0 +1,117 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($callSid) + .'/UserDefinedMessageSubscriptions.json'; + } + + /** + * Create the UserDefinedMessageSubscriptionInstance + * + * @param string $callback The URL we should call using the `method` to send user defined events to your application. URLs must contain a valid hostname (underscores are not permitted). + * @param array|Options $options Optional Arguments + * @return UserDefinedMessageSubscriptionInstance Created UserDefinedMessageSubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $callback, array $options = []): UserDefinedMessageSubscriptionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Callback' => + $callback, + 'IdempotencyKey' => + $options['idempotencyKey'], + 'Method' => + $options['method'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new UserDefinedMessageSubscriptionInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['callSid'] + ); + } + + + /** + * Constructs a UserDefinedMessageSubscriptionContext + * + * @param string $sid The SID that uniquely identifies this User Defined Message Subscription. + */ + public function getContext( + string $sid + + ): UserDefinedMessageSubscriptionContext + { + return new UserDefinedMessageSubscriptionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['callSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UserDefinedMessageSubscriptionList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionOptions.php new file mode 100755 index 0000000..c6fa403 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionOptions.php @@ -0,0 +1,96 @@ +options['idempotencyKey'] = $idempotencyKey; + $this->options['method'] = $method; + } + + /** + * A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + * + * @param string $idempotencyKey A unique string value to identify API call. This should be a unique string value per API call and can be a randomly generated. + * @return $this Fluent Builder + */ + public function setIdempotencyKey(string $idempotencyKey): self + { + $this->options['idempotencyKey'] = $idempotencyKey; + return $this; + } + + /** + * The HTTP method Twilio will use when requesting the above `Url`. Either `GET` or `POST`. Default is `POST`. + * + * @param string $method The HTTP method Twilio will use when requesting the above `Url`. Either `GET` or `POST`. Default is `POST`. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateUserDefinedMessageSubscriptionOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionPage.php new file mode 100755 index 0000000..d1532cb --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Call/UserDefinedMessageSubscriptionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserDefinedMessageSubscriptionInstance \Twilio\Rest\Api\V2010\Account\Call\UserDefinedMessageSubscriptionInstance + */ + public function buildInstance(array $payload): UserDefinedMessageSubscriptionInstance + { + return new UserDefinedMessageSubscriptionInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UserDefinedMessageSubscriptionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/CallContext.php b/app/api/Twilio/Rest/Api/V2010/Account/CallContext.php new file mode 100755 index 0000000..0b77154 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/CallContext.php @@ -0,0 +1,363 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the CallInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CallInstance + * + * @return CallInstance Fetched CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CallInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CallInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the CallInstance + * + * @param array|Options $options Optional Arguments + * @return CallInstance Updated CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CallInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Url' => + $options['url'], + 'Method' => + $options['method'], + 'Status' => + $options['status'], + 'FallbackUrl' => + $options['fallbackUrl'], + 'FallbackMethod' => + $options['fallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'Twiml' => + $options['twiml'], + 'TimeLimit' => + $options['timeLimit'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CallInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RecordingList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_recordings; + } + + /** + * Access the userDefinedMessageSubscriptions + */ + protected function getUserDefinedMessageSubscriptions(): UserDefinedMessageSubscriptionList + { + if (!$this->_userDefinedMessageSubscriptions) { + $this->_userDefinedMessageSubscriptions = new UserDefinedMessageSubscriptionList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_userDefinedMessageSubscriptions; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + if (!$this->_events) { + $this->_events = new EventList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_events; + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + if (!$this->_notifications) { + $this->_notifications = new NotificationList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_notifications; + } + + /** + * Access the userDefinedMessages + */ + protected function getUserDefinedMessages(): UserDefinedMessageList + { + if (!$this->_userDefinedMessages) { + $this->_userDefinedMessages = new UserDefinedMessageList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_userDefinedMessages; + } + + /** + * Access the siprec + */ + protected function getSiprec(): SiprecList + { + if (!$this->_siprec) { + $this->_siprec = new SiprecList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_siprec; + } + + /** + * Access the streams + */ + protected function getStreams(): StreamList + { + if (!$this->_streams) { + $this->_streams = new StreamList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_streams; + } + + /** + * Access the payments + */ + protected function getPayments(): PaymentList + { + if (!$this->_payments) { + $this->_payments = new PaymentList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_payments; + } + + /** + * Access the feedback + */ + protected function getFeedback(): FeedbackList + { + if (!$this->_feedback) { + $this->_feedback = new FeedbackList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_feedback; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CallContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/CallInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/CallInstance.php new file mode 100755 index 0000000..3f05dfd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/CallInstance.php @@ -0,0 +1,285 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'parentCallSid' => Values::array_get($payload, 'parent_call_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'to' => Values::array_get($payload, 'to'), + 'toFormatted' => Values::array_get($payload, 'to_formatted'), + 'from' => Values::array_get($payload, 'from'), + 'fromFormatted' => Values::array_get($payload, 'from_formatted'), + 'phoneNumberSid' => Values::array_get($payload, 'phone_number_sid'), + 'status' => Values::array_get($payload, 'status'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'direction' => Values::array_get($payload, 'direction'), + 'answeredBy' => Values::array_get($payload, 'answered_by'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'forwardedFrom' => Values::array_get($payload, 'forwarded_from'), + 'groupSid' => Values::array_get($payload, 'group_sid'), + 'callerName' => Values::array_get($payload, 'caller_name'), + 'queueTime' => Values::array_get($payload, 'queue_time'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CallContext Context for this CallInstance + */ + protected function proxy(): CallContext + { + if (!$this->context) { + $this->context = new CallContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CallInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CallInstance + * + * @return CallInstance Fetched CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CallInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CallInstance + * + * @param array|Options $options Optional Arguments + * @return CallInstance Updated CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CallInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + return $this->proxy()->recordings; + } + + /** + * Access the userDefinedMessageSubscriptions + */ + protected function getUserDefinedMessageSubscriptions(): UserDefinedMessageSubscriptionList + { + return $this->proxy()->userDefinedMessageSubscriptions; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + return $this->proxy()->events; + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + return $this->proxy()->notifications; + } + + /** + * Access the userDefinedMessages + */ + protected function getUserDefinedMessages(): UserDefinedMessageList + { + return $this->proxy()->userDefinedMessages; + } + + /** + * Access the siprec + */ + protected function getSiprec(): SiprecList + { + return $this->proxy()->siprec; + } + + /** + * Access the streams + */ + protected function getStreams(): StreamList + { + return $this->proxy()->streams; + } + + /** + * Access the payments + */ + protected function getPayments(): PaymentList + { + return $this->proxy()->payments; + } + + /** + * Access the feedback + */ + protected function getFeedback(): FeedbackList + { + return $this->proxy()->feedback; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CallInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/CallList.php b/app/api/Twilio/Rest/Api/V2010/Account/CallList.php new file mode 100755 index 0000000..679445b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/CallList.php @@ -0,0 +1,349 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Calls.json'; + } + + /** + * Create the CallInstance + * + * @param string $to The phone number, SIP address, or client identifier to call. + * @param string $from The phone number or client identifier to use as the caller id. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `From` must also be a phone number. + * @param array|Options $options Optional Arguments + * @return CallInstance Created CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, string $from, array $options = []): CallInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'From' => + $from, + 'Method' => + $options['method'], + 'FallbackUrl' => + $options['fallbackUrl'], + 'FallbackMethod' => + $options['fallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackEvent' => + Serialize::map($options['statusCallbackEvent'], function ($e) { return $e; }), + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'SendDigits' => + $options['sendDigits'], + 'Timeout' => + $options['timeout'], + 'Record' => + Serialize::booleanToString($options['record']), + 'RecordingChannels' => + $options['recordingChannels'], + 'RecordingStatusCallback' => + $options['recordingStatusCallback'], + 'RecordingStatusCallbackMethod' => + $options['recordingStatusCallbackMethod'], + 'SipAuthUsername' => + $options['sipAuthUsername'], + 'SipAuthPassword' => + $options['sipAuthPassword'], + 'MachineDetection' => + $options['machineDetection'], + 'MachineDetectionTimeout' => + $options['machineDetectionTimeout'], + 'RecordingStatusCallbackEvent' => + Serialize::map($options['recordingStatusCallbackEvent'], function ($e) { return $e; }), + 'Trim' => + $options['trim'], + 'CallerId' => + $options['callerId'], + 'MachineDetectionSpeechThreshold' => + $options['machineDetectionSpeechThreshold'], + 'MachineDetectionSpeechEndThreshold' => + $options['machineDetectionSpeechEndThreshold'], + 'MachineDetectionSilenceTimeout' => + $options['machineDetectionSilenceTimeout'], + 'AsyncAmd' => + $options['asyncAmd'], + 'AsyncAmdStatusCallback' => + $options['asyncAmdStatusCallback'], + 'AsyncAmdStatusCallbackMethod' => + $options['asyncAmdStatusCallbackMethod'], + 'Byoc' => + $options['byoc'], + 'CallReason' => + $options['callReason'], + 'CallToken' => + $options['callToken'], + 'RecordingTrack' => + $options['recordingTrack'], + 'TimeLimit' => + $options['timeLimit'], + 'Url' => + $options['url'], + 'Twiml' => + $options['twiml'], + 'ApplicationSid' => + $options['applicationSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CallInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads CallInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CallInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CallInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CallInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CallPage Page of CallInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CallPage + { + $options = new Values($options); + + $params = Values::of([ + 'To' => + $options['to'], + 'From' => + $options['from'], + 'ParentCallSid' => + $options['parentCallSid'], + 'Status' => + $options['status'], + 'StartTime<' => + Serialize::iso8601DateTime($options['startTimeBefore']), + 'StartTime' => + Serialize::iso8601DateTime($options['startTime']), + 'StartTime>' => + Serialize::iso8601DateTime($options['startTimeAfter']), + 'EndTime<' => + Serialize::iso8601DateTime($options['endTimeBefore']), + 'EndTime' => + Serialize::iso8601DateTime($options['endTime']), + 'EndTime>' => + Serialize::iso8601DateTime($options['endTimeAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CallPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CallInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CallPage Page of CallInstance + */ + public function getPage(string $targetUrl): CallPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CallPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CallContext + * + * @param string $sid The Twilio-provided Call SID that uniquely identifies the Call resource to delete + */ + public function getContext( + string $sid + + ): CallContext + { + return new CallContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Access the feedbackSummaries + */ + protected function getFeedbackSummaries(): FeedbackSummaryList + { + if (!$this->_feedbackSummaries) { + $this->_feedbackSummaries = new FeedbackSummaryList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_feedbackSummaries; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CallList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/CallOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/CallOptions.php new file mode 100755 index 0000000..2d81c8f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/CallOptions.php @@ -0,0 +1,1064 @@ +=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $startTime Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $startTimeAfter Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $endTimeBefore Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @param string $endTime Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @param string $endTimeAfter Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @return ReadCallOptions Options builder + */ + public static function read( + + string $to = Values::NONE, + string $from = Values::NONE, + string $parentCallSid = Values::NONE, + string $status = Values::NONE, + string $startTimeBefore = null, + string $startTime = null, + string $startTimeAfter = null, + string $endTimeBefore = null, + string $endTime = null, + string $endTimeAfter = null + + ): ReadCallOptions + { + return new ReadCallOptions( + $to, + $from, + $parentCallSid, + $status, + $startTimeBefore, + $startTime, + $startTimeAfter, + $endTimeBefore, + $endTime, + $endTimeAfter + ); + } + + /** + * @param string $url The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * @param string $method The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $status + * @param string $fallbackUrl The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $fallbackMethod The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * @param string $statusCallbackMethod The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $twiml TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + * @return UpdateCallOptions Options builder + */ + public static function update( + + string $url = Values::NONE, + string $method = Values::NONE, + string $status = Values::NONE, + string $fallbackUrl = Values::NONE, + string $fallbackMethod = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + string $twiml = Values::NONE, + int $timeLimit = Values::INT_NONE + + ): UpdateCallOptions + { + return new UpdateCallOptions( + $url, + $method, + $status, + $fallbackUrl, + $fallbackMethod, + $statusCallback, + $statusCallbackMethod, + $twiml, + $timeLimit + ); + } + +} + +class CreateCallOptions extends Options + { + /** + * @param string $url The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * @param string $twiml TwiML instructions for the call Twilio will use without fetching Twiml from url parameter. If both `twiml` and `url` are provided then `twiml` parameter will be ignored. Max 4000 characters. + * @param string $applicationSid The SID of the Application resource that will handle the call, if the call will be handled by an application. + * @param string $method The HTTP method we should use when calling the `url` parameter's value. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $fallbackUrl The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $fallbackMethod The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * @param string[] $statusCallbackEvent The call progress events that we will send to the `status_callback` URL. Can be: `initiated`, `ringing`, `answered`, and `completed`. If no event is specified, we send the `completed` status. If you want to receive multiple events, specify each one in a separate `status_callback_event` parameter. See the code sample for [monitoring call progress](https://www.twilio.com/docs/voice/api/call-resource?code-sample=code-create-a-call-resource-and-specify-a-statuscallbackevent&code-sdk-version=json). If an `application_sid` is present, this parameter is ignored. + * @param string $statusCallbackMethod The HTTP method we should use when calling the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $sendDigits A string of keys to dial after connecting to the number, maximum of 32 digits. Valid digits in the string include: any digit (`0`-`9`), '`#`', '`*`' and '`w`', to insert a half second pause. For example, if you connected to a company phone number and wanted to pause for one second, and then dial extension 1234 followed by the pound key, the value of this parameter would be `ww1234#`. Remember to URL-encode this string, since the '`#`' character has special meaning in a URL. If both `SendDigits` and `MachineDetection` parameters are provided, then `MachineDetection` will be ignored. + * @param int $timeout The integer number of seconds that we should allow the phone to ring before assuming there is no answer. The default is `60` seconds and the maximum is `600` seconds. For some call flows, we will add a 5-second buffer to the timeout value you provide. For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds. You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail. + * @param bool $record Whether to record the call. Can be `true` to record the phone call, or `false` to not. The default is `false`. The `recording_url` is sent to the `status_callback` URL. + * @param string $recordingChannels The number of channels in the final recording. Can be: `mono` or `dual`. The default is `mono`. `mono` records both legs of the call in a single channel of the recording file. `dual` records each leg to a separate channel of the recording file. The first channel of a dual-channel recording contains the parent call and the second channel contains the child call. + * @param string $recordingStatusCallback The URL that we call when the recording is available to be accessed. + * @param string $recordingStatusCallbackMethod The HTTP method we should use when calling the `recording_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * @param string $sipAuthUsername The username used to authenticate the caller making a SIP call. + * @param string $sipAuthPassword The password required to authenticate the user account specified in `sip_auth_username`. + * @param string $machineDetection Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * @param int $machineDetectionTimeout The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * @param string[] $recordingStatusCallbackEvent The recording status events that will trigger calls to the URL specified in `recording_status_callback`. Can be: `in-progress`, `completed` and `absent`. Defaults to `completed`. Separate multiple values with a space. + * @param string $trim Whether to trim any leading and trailing silence from the recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + * @param string $callerId The phone number, SIP address, or Client identifier that made this call. Phone numbers are in [E.164 format](https://wwnw.twilio.com/docs/glossary/what-e164) (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. + * @param int $machineDetectionSpeechThreshold The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * @param int $machineDetectionSpeechEndThreshold The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * @param int $machineDetectionSilenceTimeout The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * @param string $asyncAmd Select whether to perform answering machine detection in the background. Default, blocks the execution of the call until Answering Machine Detection is completed. Can be: `true` or `false`. + * @param string $asyncAmdStatusCallback The URL that we should call using the `async_amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * @param string $asyncAmdStatusCallbackMethod The HTTP method we should use when calling the `async_amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * @param string $byoc The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * @param string $callReason The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * @param string $callToken A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + */ + public function __construct( + + string $url = Values::NONE, + string $twiml = Values::NONE, + string $applicationSid = Values::NONE, + string $method = Values::NONE, + string $fallbackUrl = Values::NONE, + string $fallbackMethod = Values::NONE, + string $statusCallback = Values::NONE, + array $statusCallbackEvent = Values::ARRAY_NONE, + string $statusCallbackMethod = Values::NONE, + string $sendDigits = Values::NONE, + int $timeout = Values::INT_NONE, + bool $record = Values::BOOL_NONE, + string $recordingChannels = Values::NONE, + string $recordingStatusCallback = Values::NONE, + string $recordingStatusCallbackMethod = Values::NONE, + string $sipAuthUsername = Values::NONE, + string $sipAuthPassword = Values::NONE, + string $machineDetection = Values::NONE, + int $machineDetectionTimeout = Values::INT_NONE, + array $recordingStatusCallbackEvent = Values::ARRAY_NONE, + string $trim = Values::NONE, + string $callerId = Values::NONE, + int $machineDetectionSpeechThreshold = Values::INT_NONE, + int $machineDetectionSpeechEndThreshold = Values::INT_NONE, + int $machineDetectionSilenceTimeout = Values::INT_NONE, + string $asyncAmd = Values::NONE, + string $asyncAmdStatusCallback = Values::NONE, + string $asyncAmdStatusCallbackMethod = Values::NONE, + string $byoc = Values::NONE, + string $callReason = Values::NONE, + string $callToken = Values::NONE, + string $recordingTrack = Values::NONE, + int $timeLimit = Values::INT_NONE + + ) { + $this->options['url'] = $url; + $this->options['twiml'] = $twiml; + $this->options['applicationSid'] = $applicationSid; + $this->options['method'] = $method; + $this->options['fallbackUrl'] = $fallbackUrl; + $this->options['fallbackMethod'] = $fallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['sendDigits'] = $sendDigits; + $this->options['timeout'] = $timeout; + $this->options['record'] = $record; + $this->options['recordingChannels'] = $recordingChannels; + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + $this->options['sipAuthUsername'] = $sipAuthUsername; + $this->options['sipAuthPassword'] = $sipAuthPassword; + $this->options['machineDetection'] = $machineDetection; + $this->options['machineDetectionTimeout'] = $machineDetectionTimeout; + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + $this->options['trim'] = $trim; + $this->options['callerId'] = $callerId; + $this->options['machineDetectionSpeechThreshold'] = $machineDetectionSpeechThreshold; + $this->options['machineDetectionSpeechEndThreshold'] = $machineDetectionSpeechEndThreshold; + $this->options['machineDetectionSilenceTimeout'] = $machineDetectionSilenceTimeout; + $this->options['asyncAmd'] = $asyncAmd; + $this->options['asyncAmdStatusCallback'] = $asyncAmdStatusCallback; + $this->options['asyncAmdStatusCallbackMethod'] = $asyncAmdStatusCallbackMethod; + $this->options['byoc'] = $byoc; + $this->options['callReason'] = $callReason; + $this->options['callToken'] = $callToken; + $this->options['recordingTrack'] = $recordingTrack; + $this->options['timeLimit'] = $timeLimit; + } + + /** + * The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * + * @param string $url The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * @return $this Fluent Builder + */ + public function setUrl(string $url): self + { + $this->options['url'] = $url; + return $this; + } + + /** + * TwiML instructions for the call Twilio will use without fetching Twiml from url parameter. If both `twiml` and `url` are provided then `twiml` parameter will be ignored. Max 4000 characters. + * + * @param string $twiml TwiML instructions for the call Twilio will use without fetching Twiml from url parameter. If both `twiml` and `url` are provided then `twiml` parameter will be ignored. Max 4000 characters. + * @return $this Fluent Builder + */ + public function setTwiml(string $twiml): self + { + $this->options['twiml'] = $twiml; + return $this; + } + + /** + * The SID of the Application resource that will handle the call, if the call will be handled by an application. + * + * @param string $applicationSid The SID of the Application resource that will handle the call, if the call will be handled by an application. + * @return $this Fluent Builder + */ + public function setApplicationSid(string $applicationSid): self + { + $this->options['applicationSid'] = $applicationSid; + return $this; + } + + /** + * The HTTP method we should use when calling the `url` parameter's value. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $method The HTTP method we should use when calling the `url` parameter's value. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $fallbackUrl The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setFallbackUrl(string $fallbackUrl): self + { + $this->options['fallbackUrl'] = $fallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $fallbackMethod The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setFallbackMethod(string $fallbackMethod): self + { + $this->options['fallbackMethod'] = $fallbackMethod; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The call progress events that we will send to the `status_callback` URL. Can be: `initiated`, `ringing`, `answered`, and `completed`. If no event is specified, we send the `completed` status. If you want to receive multiple events, specify each one in a separate `status_callback_event` parameter. See the code sample for [monitoring call progress](https://www.twilio.com/docs/voice/api/call-resource?code-sample=code-create-a-call-resource-and-specify-a-statuscallbackevent&code-sdk-version=json). If an `application_sid` is present, this parameter is ignored. + * + * @param string[] $statusCallbackEvent The call progress events that we will send to the `status_callback` URL. Can be: `initiated`, `ringing`, `answered`, and `completed`. If no event is specified, we send the `completed` status. If you want to receive multiple events, specify each one in a separate `status_callback_event` parameter. See the code sample for [monitoring call progress](https://www.twilio.com/docs/voice/api/call-resource?code-sample=code-create-a-call-resource-and-specify-a-statuscallbackevent&code-sdk-version=json). If an `application_sid` is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setStatusCallbackEvent(array $statusCallbackEvent): self + { + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + return $this; + } + + /** + * The HTTP method we should use when calling the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $statusCallbackMethod The HTTP method we should use when calling the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * A string of keys to dial after connecting to the number, maximum of 32 digits. Valid digits in the string include: any digit (`0`-`9`), '`#`', '`*`' and '`w`', to insert a half second pause. For example, if you connected to a company phone number and wanted to pause for one second, and then dial extension 1234 followed by the pound key, the value of this parameter would be `ww1234#`. Remember to URL-encode this string, since the '`#`' character has special meaning in a URL. If both `SendDigits` and `MachineDetection` parameters are provided, then `MachineDetection` will be ignored. + * + * @param string $sendDigits A string of keys to dial after connecting to the number, maximum of 32 digits. Valid digits in the string include: any digit (`0`-`9`), '`#`', '`*`' and '`w`', to insert a half second pause. For example, if you connected to a company phone number and wanted to pause for one second, and then dial extension 1234 followed by the pound key, the value of this parameter would be `ww1234#`. Remember to URL-encode this string, since the '`#`' character has special meaning in a URL. If both `SendDigits` and `MachineDetection` parameters are provided, then `MachineDetection` will be ignored. + * @return $this Fluent Builder + */ + public function setSendDigits(string $sendDigits): self + { + $this->options['sendDigits'] = $sendDigits; + return $this; + } + + /** + * The integer number of seconds that we should allow the phone to ring before assuming there is no answer. The default is `60` seconds and the maximum is `600` seconds. For some call flows, we will add a 5-second buffer to the timeout value you provide. For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds. You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail. + * + * @param int $timeout The integer number of seconds that we should allow the phone to ring before assuming there is no answer. The default is `60` seconds and the maximum is `600` seconds. For some call flows, we will add a 5-second buffer to the timeout value you provide. For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds. You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * Whether to record the call. Can be `true` to record the phone call, or `false` to not. The default is `false`. The `recording_url` is sent to the `status_callback` URL. + * + * @param bool $record Whether to record the call. Can be `true` to record the phone call, or `false` to not. The default is `false`. The `recording_url` is sent to the `status_callback` URL. + * @return $this Fluent Builder + */ + public function setRecord(bool $record): self + { + $this->options['record'] = $record; + return $this; + } + + /** + * The number of channels in the final recording. Can be: `mono` or `dual`. The default is `mono`. `mono` records both legs of the call in a single channel of the recording file. `dual` records each leg to a separate channel of the recording file. The first channel of a dual-channel recording contains the parent call and the second channel contains the child call. + * + * @param string $recordingChannels The number of channels in the final recording. Can be: `mono` or `dual`. The default is `mono`. `mono` records both legs of the call in a single channel of the recording file. `dual` records each leg to a separate channel of the recording file. The first channel of a dual-channel recording contains the parent call and the second channel contains the child call. + * @return $this Fluent Builder + */ + public function setRecordingChannels(string $recordingChannels): self + { + $this->options['recordingChannels'] = $recordingChannels; + return $this; + } + + /** + * The URL that we call when the recording is available to be accessed. + * + * @param string $recordingStatusCallback The URL that we call when the recording is available to be accessed. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallback(string $recordingStatusCallback): self + { + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when calling the `recording_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $recordingStatusCallbackMethod The HTTP method we should use when calling the `recording_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackMethod(string $recordingStatusCallbackMethod): self + { + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + return $this; + } + + /** + * The username used to authenticate the caller making a SIP call. + * + * @param string $sipAuthUsername The username used to authenticate the caller making a SIP call. + * @return $this Fluent Builder + */ + public function setSipAuthUsername(string $sipAuthUsername): self + { + $this->options['sipAuthUsername'] = $sipAuthUsername; + return $this; + } + + /** + * The password required to authenticate the user account specified in `sip_auth_username`. + * + * @param string $sipAuthPassword The password required to authenticate the user account specified in `sip_auth_username`. + * @return $this Fluent Builder + */ + public function setSipAuthPassword(string $sipAuthPassword): self + { + $this->options['sipAuthPassword'] = $sipAuthPassword; + return $this; + } + + /** + * Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * + * @param string $machineDetection Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * @return $this Fluent Builder + */ + public function setMachineDetection(string $machineDetection): self + { + $this->options['machineDetection'] = $machineDetection; + return $this; + } + + /** + * The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * + * @param int $machineDetectionTimeout The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * @return $this Fluent Builder + */ + public function setMachineDetectionTimeout(int $machineDetectionTimeout): self + { + $this->options['machineDetectionTimeout'] = $machineDetectionTimeout; + return $this; + } + + /** + * The recording status events that will trigger calls to the URL specified in `recording_status_callback`. Can be: `in-progress`, `completed` and `absent`. Defaults to `completed`. Separate multiple values with a space. + * + * @param string[] $recordingStatusCallbackEvent The recording status events that will trigger calls to the URL specified in `recording_status_callback`. Can be: `in-progress`, `completed` and `absent`. Defaults to `completed`. Separate multiple values with a space. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackEvent(array $recordingStatusCallbackEvent): self + { + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + return $this; + } + + /** + * Whether to trim any leading and trailing silence from the recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + * + * @param string $trim Whether to trim any leading and trailing silence from the recording. Can be: `trim-silence` or `do-not-trim` and the default is `trim-silence`. + * @return $this Fluent Builder + */ + public function setTrim(string $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * The phone number, SIP address, or Client identifier that made this call. Phone numbers are in [E.164 format](https://wwnw.twilio.com/docs/glossary/what-e164) (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. + * + * @param string $callerId The phone number, SIP address, or Client identifier that made this call. Phone numbers are in [E.164 format](https://wwnw.twilio.com/docs/glossary/what-e164) (e.g., +16175551212). SIP addresses are formatted as `name@company.com`. + * @return $this Fluent Builder + */ + public function setCallerId(string $callerId): self + { + $this->options['callerId'] = $callerId; + return $this; + } + + /** + * The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * + * @param int $machineDetectionSpeechThreshold The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * @return $this Fluent Builder + */ + public function setMachineDetectionSpeechThreshold(int $machineDetectionSpeechThreshold): self + { + $this->options['machineDetectionSpeechThreshold'] = $machineDetectionSpeechThreshold; + return $this; + } + + /** + * The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * + * @param int $machineDetectionSpeechEndThreshold The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * @return $this Fluent Builder + */ + public function setMachineDetectionSpeechEndThreshold(int $machineDetectionSpeechEndThreshold): self + { + $this->options['machineDetectionSpeechEndThreshold'] = $machineDetectionSpeechEndThreshold; + return $this; + } + + /** + * The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * + * @param int $machineDetectionSilenceTimeout The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * @return $this Fluent Builder + */ + public function setMachineDetectionSilenceTimeout(int $machineDetectionSilenceTimeout): self + { + $this->options['machineDetectionSilenceTimeout'] = $machineDetectionSilenceTimeout; + return $this; + } + + /** + * Select whether to perform answering machine detection in the background. Default, blocks the execution of the call until Answering Machine Detection is completed. Can be: `true` or `false`. + * + * @param string $asyncAmd Select whether to perform answering machine detection in the background. Default, blocks the execution of the call until Answering Machine Detection is completed. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setAsyncAmd(string $asyncAmd): self + { + $this->options['asyncAmd'] = $asyncAmd; + return $this; + } + + /** + * The URL that we should call using the `async_amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * + * @param string $asyncAmdStatusCallback The URL that we should call using the `async_amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * @return $this Fluent Builder + */ + public function setAsyncAmdStatusCallback(string $asyncAmdStatusCallback): self + { + $this->options['asyncAmdStatusCallback'] = $asyncAmdStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when calling the `async_amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $asyncAmdStatusCallbackMethod The HTTP method we should use when calling the `async_amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setAsyncAmdStatusCallbackMethod(string $asyncAmdStatusCallbackMethod): self + { + $this->options['asyncAmdStatusCallbackMethod'] = $asyncAmdStatusCallbackMethod; + return $this; + } + + /** + * The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * + * @param string $byoc The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * @return $this Fluent Builder + */ + public function setByoc(string $byoc): self + { + $this->options['byoc'] = $byoc; + return $this; + } + + /** + * The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * + * @param string $callReason The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * @return $this Fluent Builder + */ + public function setCallReason(string $callReason): self + { + $this->options['callReason'] = $callReason; + return $this; + } + + /** + * A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + * + * @param string $callToken A token string needed to invoke a forwarded call. A call_token is generated when an incoming call is received on a Twilio number. Pass an incoming call's call_token value to a forwarded call via the call_token parameter when creating a new call. A forwarded call should bear the same CallerID of the original incoming call. + * @return $this Fluent Builder + */ + public function setCallToken(string $callToken): self + { + $this->options['callToken'] = $callToken; + return $this; + } + + /** + * The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + * + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is generated from Twilio. `both` records the audio that is received and generated by Twilio. + * @return $this Fluent Builder + */ + public function setRecordingTrack(string $recordingTrack): self + { + $this->options['recordingTrack'] = $recordingTrack; + return $this; + } + + /** + * The maximum duration of the call in seconds. Constraints depend on account and configuration. + * + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + * @return $this Fluent Builder + */ + public function setTimeLimit(int $timeLimit): self + { + $this->options['timeLimit'] = $timeLimit; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateCallOptions ' . $options . ']'; + } +} + + + +class ReadCallOptions extends Options + { + /** + * @param string $to Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + * @param string $from Only include calls from this phone number, SIP address, Client identifier or SIM SID. + * @param string $parentCallSid Only include calls spawned by calls with this SID. + * @param string $status The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + * @param string $startTimeBefore Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $startTime Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $startTimeAfter Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @param string $endTimeBefore Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @param string $endTime Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @param string $endTimeAfter Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + */ + public function __construct( + + string $to = Values::NONE, + string $from = Values::NONE, + string $parentCallSid = Values::NONE, + string $status = Values::NONE, + string $startTimeBefore = null, + string $startTime = null, + string $startTimeAfter = null, + string $endTimeBefore = null, + string $endTime = null, + string $endTimeAfter = null + + ) { + $this->options['to'] = $to; + $this->options['from'] = $from; + $this->options['parentCallSid'] = $parentCallSid; + $this->options['status'] = $status; + $this->options['startTimeBefore'] = $startTimeBefore; + $this->options['startTime'] = $startTime; + $this->options['startTimeAfter'] = $startTimeAfter; + $this->options['endTimeBefore'] = $endTimeBefore; + $this->options['endTime'] = $endTime; + $this->options['endTimeAfter'] = $endTimeAfter; + } + + /** + * Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + * + * @param string $to Only show calls made to this phone number, SIP address, Client identifier or SIM SID. + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * Only include calls from this phone number, SIP address, Client identifier or SIM SID. + * + * @param string $from Only include calls from this phone number, SIP address, Client identifier or SIM SID. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * Only include calls spawned by calls with this SID. + * + * @param string $parentCallSid Only include calls spawned by calls with this SID. + * @return $this Fluent Builder + */ + public function setParentCallSid(string $parentCallSid): self + { + $this->options['parentCallSid'] = $parentCallSid; + return $this; + } + + /** + * The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + * + * @param string $status The status of the calls to include. Can be: `queued`, `ringing`, `in-progress`, `canceled`, `completed`, `failed`, `busy`, or `no-answer`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * + * @param string $startTimeBefore Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setStartTimeBefore(string $startTimeBefore): self + { + $this->options['startTimeBefore'] = $startTimeBefore; + return $this; + } + + /** + * Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * + * @param string $startTime Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setStartTime(string $startTime): self + { + $this->options['startTime'] = $startTime; + return $this; + } + + /** + * Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * + * @param string $startTimeAfter Only include calls that started on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that started on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read calls that started on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read calls that started on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setStartTimeAfter(string $startTimeAfter): self + { + $this->options['startTimeAfter'] = $startTimeAfter; + return $this; + } + + /** + * Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * + * @param string $endTimeBefore Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setEndTimeBefore(string $endTimeBefore): self + { + $this->options['endTimeBefore'] = $endTimeBefore; + return $this; + } + + /** + * Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * + * @param string $endTime Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setEndTime(string $endTime): self + { + $this->options['endTime'] = $endTime; + return $this; + } + + /** + * Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * + * @param string $endTimeAfter Only include calls that ended on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read only calls that ended on this date. You can also specify an inequality, such as `EndTime<=YYYY-MM-DD`, to read calls that ended on or before midnight of this date, and `EndTime>=YYYY-MM-DD` to read calls that ended on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setEndTimeAfter(string $endTimeAfter): self + { + $this->options['endTimeAfter'] = $endTimeAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadCallOptions ' . $options . ']'; + } +} + +class UpdateCallOptions extends Options + { + /** + * @param string $url The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * @param string $method The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $status + * @param string $fallbackUrl The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $fallbackMethod The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * @param string $statusCallbackMethod The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @param string $twiml TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + */ + public function __construct( + + string $url = Values::NONE, + string $method = Values::NONE, + string $status = Values::NONE, + string $fallbackUrl = Values::NONE, + string $fallbackMethod = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + string $twiml = Values::NONE, + int $timeLimit = Values::INT_NONE + + ) { + $this->options['url'] = $url; + $this->options['method'] = $method; + $this->options['status'] = $status; + $this->options['fallbackUrl'] = $fallbackUrl; + $this->options['fallbackMethod'] = $fallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['twiml'] = $twiml; + $this->options['timeLimit'] = $timeLimit; + } + + /** + * The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * + * @param string $url The absolute URL that returns the TwiML instructions for the call. We will call this URL using the `method` when the call connects. For more information, see the [Url Parameter](https://www.twilio.com/docs/voice/make-calls#specify-a-url-parameter) section in [Making Calls](https://www.twilio.com/docs/voice/make-calls). + * @return $this Fluent Builder + */ + public function setUrl(string $url): self + { + $this->options['url'] = $url; + return $this; + } + + /** + * The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $method The HTTP method we should use when calling the `url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $fallbackUrl The URL that we call using the `fallback_method` if an error occurs when requesting or executing the TwiML at `url`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setFallbackUrl(string $fallbackUrl): self + { + $this->options['fallbackUrl'] = $fallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $fallbackMethod The HTTP method that we should use to request the `fallback_url`. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setFallbackMethod(string $fallbackMethod): self + { + $this->options['fallbackMethod'] = $fallbackMethod; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If no `status_callback_event` is specified, we will send the `completed` status. If an `application_sid` parameter is present, this parameter is ignored. URLs must contain a valid hostname (underscores are not permitted). + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * + * @param string $statusCallbackMethod The HTTP method we should use when requesting the `status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. If an `application_sid` parameter is present, this parameter is ignored. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + * + * @param string $twiml TwiML instructions for the call Twilio will use without fetching Twiml from url. Twiml and url parameters are mutually exclusive + * @return $this Fluent Builder + */ + public function setTwiml(string $twiml): self + { + $this->options['twiml'] = $twiml; + return $this; + } + + /** + * The maximum duration of the call in seconds. Constraints depend on account and configuration. + * + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + * @return $this Fluent Builder + */ + public function setTimeLimit(int $timeLimit): self + { + $this->options['timeLimit'] = $timeLimit; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateCallOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/CallPage.php b/app/api/Twilio/Rest/Api/V2010/Account/CallPage.php new file mode 100755 index 0000000..a550268 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/CallPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CallInstance \Twilio\Rest\Api\V2010\Account\CallInstance + */ + public function buildInstance(array $payload): CallInstance + { + return new CallInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CallPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantContext.php new file mode 100755 index 0000000..9382af4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantContext.php @@ -0,0 +1,160 @@ +solution = [ + 'accountSid' => + $accountSid, + 'conferenceSid' => + $conferenceSid, + 'callSid' => + $callSid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences/' . \rawurlencode($conferenceSid) + .'/Participants/' . \rawurlencode($callSid) + .'.json'; + } + + /** + * Delete the ParticipantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['callSid'] + ); + } + + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Muted' => + Serialize::booleanToString($options['muted']), + 'Hold' => + Serialize::booleanToString($options['hold']), + 'HoldUrl' => + $options['holdUrl'], + 'HoldMethod' => + $options['holdMethod'], + 'AnnounceUrl' => + $options['announceUrl'], + 'AnnounceMethod' => + $options['announceMethod'], + 'WaitUrl' => + $options['waitUrl'], + 'WaitMethod' => + $options['waitMethod'], + 'BeepOnExit' => + Serialize::booleanToString($options['beepOnExit']), + 'EndConferenceOnExit' => + Serialize::booleanToString($options['endConferenceOnExit']), + 'Coaching' => + Serialize::booleanToString($options['coaching']), + 'CallSidToCoach' => + $options['callSidToCoach'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantInstance.php new file mode 100755 index 0000000..e736215 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantInstance.php @@ -0,0 +1,172 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'label' => Values::array_get($payload, 'label'), + 'callSidToCoach' => Values::array_get($payload, 'call_sid_to_coach'), + 'coaching' => Values::array_get($payload, 'coaching'), + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endConferenceOnExit' => Values::array_get($payload, 'end_conference_on_exit'), + 'muted' => Values::array_get($payload, 'muted'), + 'hold' => Values::array_get($payload, 'hold'), + 'startConferenceOnEnter' => Values::array_get($payload, 'start_conference_on_enter'), + 'status' => Values::array_get($payload, 'status'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'conferenceSid' => $conferenceSid, 'callSid' => $callSid ?: $this->properties['callSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['callSid'] + ); + } + + return $this->context; + } + + /** + * Delete the ParticipantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantList.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantList.php new file mode 100755 index 0000000..d7dfcab --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantList.php @@ -0,0 +1,308 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'conferenceSid' => + $conferenceSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences/' . \rawurlencode($conferenceSid) + .'/Participants.json'; + } + + /** + * Create the ParticipantInstance + * + * @param string $from The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `from` must also be a phone number. If `to` is sip address, this value of `from` should be a username portion to be used to populate the P-Asserted-Identity header that is passed to the SIP endpoint. + * @param string $to The phone number, SIP address, or Client identifier that received this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). SIP addresses are formatted as `sip:name@company.com`. Client identifiers are formatted `client:name`. [Custom parameters](https://www.twilio.com/docs/voice/api/conference-participant-resource#custom-parameters) may also be specified. + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Created ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $from, string $to, array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'From' => + $from, + 'To' => + $to, + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'StatusCallbackEvent' => + Serialize::map($options['statusCallbackEvent'], function ($e) { return $e; }), + 'Label' => + $options['label'], + 'Timeout' => + $options['timeout'], + 'Record' => + Serialize::booleanToString($options['record']), + 'Muted' => + Serialize::booleanToString($options['muted']), + 'Beep' => + $options['beep'], + 'StartConferenceOnEnter' => + Serialize::booleanToString($options['startConferenceOnEnter']), + 'EndConferenceOnExit' => + Serialize::booleanToString($options['endConferenceOnExit']), + 'WaitUrl' => + $options['waitUrl'], + 'WaitMethod' => + $options['waitMethod'], + 'EarlyMedia' => + Serialize::booleanToString($options['earlyMedia']), + 'MaxParticipants' => + $options['maxParticipants'], + 'ConferenceRecord' => + $options['conferenceRecord'], + 'ConferenceTrim' => + $options['conferenceTrim'], + 'ConferenceStatusCallback' => + $options['conferenceStatusCallback'], + 'ConferenceStatusCallbackMethod' => + $options['conferenceStatusCallbackMethod'], + 'ConferenceStatusCallbackEvent' => + Serialize::map($options['conferenceStatusCallbackEvent'], function ($e) { return $e; }), + 'RecordingChannels' => + $options['recordingChannels'], + 'RecordingStatusCallback' => + $options['recordingStatusCallback'], + 'RecordingStatusCallbackMethod' => + $options['recordingStatusCallbackMethod'], + 'SipAuthUsername' => + $options['sipAuthUsername'], + 'SipAuthPassword' => + $options['sipAuthPassword'], + 'Region' => + $options['region'], + 'ConferenceRecordingStatusCallback' => + $options['conferenceRecordingStatusCallback'], + 'ConferenceRecordingStatusCallbackMethod' => + $options['conferenceRecordingStatusCallbackMethod'], + 'RecordingStatusCallbackEvent' => + Serialize::map($options['recordingStatusCallbackEvent'], function ($e) { return $e; }), + 'ConferenceRecordingStatusCallbackEvent' => + Serialize::map($options['conferenceRecordingStatusCallbackEvent'], function ($e) { return $e; }), + 'Coaching' => + Serialize::booleanToString($options['coaching']), + 'CallSidToCoach' => + $options['callSidToCoach'], + 'JitterBufferSize' => + $options['jitterBufferSize'], + 'Byoc' => + $options['byoc'], + 'CallerId' => + $options['callerId'], + 'CallReason' => + $options['callReason'], + 'RecordingTrack' => + $options['recordingTrack'], + 'TimeLimit' => + $options['timeLimit'], + 'MachineDetection' => + $options['machineDetection'], + 'MachineDetectionTimeout' => + $options['machineDetectionTimeout'], + 'MachineDetectionSpeechThreshold' => + $options['machineDetectionSpeechThreshold'], + 'MachineDetectionSpeechEndThreshold' => + $options['machineDetectionSpeechEndThreshold'], + 'MachineDetectionSilenceTimeout' => + $options['machineDetectionSilenceTimeout'], + 'AmdStatusCallback' => + $options['amdStatusCallback'], + 'AmdStatusCallbackMethod' => + $options['amdStatusCallbackMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['conferenceSid'] + ); + } + + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + $options = new Values($options); + + $params = Values::of([ + 'Muted' => + Serialize::booleanToString($options['muted']), + 'Hold' => + Serialize::booleanToString($options['hold']), + 'Coaching' => + Serialize::booleanToString($options['coaching']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $callSid The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID or label of the participant to delete. Non URL safe characters in a label must be percent encoded, for example, a space character is represented as %20. + */ + public function getContext( + string $callSid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $callSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantOptions.php new file mode 100755 index 0000000..2c6f9e4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantOptions.php @@ -0,0 +1,1192 @@ +`, ``, ``, or `` verbs. + * @param string $holdMethod The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + * @param string $announceUrl The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @param string $announceMethod The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $waitUrl The URL we call using the `wait_method` for the music to play while participants are waiting for the conference to start. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @param bool $beepOnExit Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + * @param bool $endConferenceOnExit Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * @param bool $coaching Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * @param string $callSidToCoach The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * @return UpdateParticipantOptions Options builder + */ + public static function update( + + bool $muted = Values::BOOL_NONE, + bool $hold = Values::BOOL_NONE, + string $holdUrl = Values::NONE, + string $holdMethod = Values::NONE, + string $announceUrl = Values::NONE, + string $announceMethod = Values::NONE, + string $waitUrl = Values::NONE, + string $waitMethod = Values::NONE, + bool $beepOnExit = Values::BOOL_NONE, + bool $endConferenceOnExit = Values::BOOL_NONE, + bool $coaching = Values::BOOL_NONE, + string $callSidToCoach = Values::NONE + + ): UpdateParticipantOptions + { + return new UpdateParticipantOptions( + $muted, + $hold, + $holdUrl, + $holdMethod, + $announceUrl, + $announceMethod, + $waitUrl, + $waitMethod, + $beepOnExit, + $endConferenceOnExit, + $coaching, + $callSidToCoach + ); + } + +} + +class CreateParticipantOptions extends Options + { + /** + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` and `POST` and defaults to `POST`. + * @param string[] $statusCallbackEvent The conference state changes that should generate a call to `status_callback`. Can be: `initiated`, `ringing`, `answered`, and `completed`. Separate multiple values with a space. The default value is `completed`. + * @param string $label A label for this participant. If one is supplied, it may subsequently be used to fetch, update or delete the participant. + * @param int $timeout The number of seconds that we should allow the phone to ring before assuming there is no answer. Can be an integer between `5` and `600`, inclusive. The default value is `60`. We always add a 5-second timeout buffer to outgoing calls, so value of 10 would result in an actual timeout that was closer to 15 seconds. + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * @param bool $muted Whether the agent is muted in the conference. Can be `true` or `false` and the default is `false`. + * @param string $beep Whether to play a notification beep to the conference when the participant joins. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @param bool $endConferenceOnExit Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. Can be: `true` or `false` and defaults to `true`. + * @param int $maxParticipants The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @param string $conferenceRecord Whether to record the conference the participant is joining. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @param string $conferenceTrim Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string[] $conferenceStatusCallbackEvent The conference state changes that should generate a call to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `modify`, `speaker`, and `announcement`. Separate multiple values with a space. Defaults to `start end`. + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $sipAuthUsername The SIP username used for authentication. + * @param string $sipAuthPassword The SIP password for authentication. + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string[] $recordingStatusCallbackEvent The recording state changes that should generate a call to `recording_status_callback`. Can be: `started`, `in-progress`, `paused`, `resumed`, `stopped`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'`. + * @param string[] $conferenceRecordingStatusCallbackEvent The conference recording state changes that generate a call to `conference_recording_status_callback`. Can be: `in-progress`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'` + * @param bool $coaching Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * @param string $callSidToCoach The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * @param string $jitterBufferSize Jitter buffer size for the connecting participant. Twilio will use this setting to apply Jitter Buffer before participant's audio is mixed into the conference. Can be: `off`, `small`, `medium`, and `large`. Default to `large`. + * @param string $byoc The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * @param string $callerId The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `callerId` must also be a phone number. If `to` is sip address, this value of `callerId` should be a username portion to be used to populate the From header that is passed to the SIP endpoint. + * @param string $callReason The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is sent from Twilio. `both` records the audio that is received and sent by Twilio. + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + * @param string $machineDetection Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * @param int $machineDetectionTimeout The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * @param int $machineDetectionSpeechThreshold The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * @param int $machineDetectionSpeechEndThreshold The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * @param int $machineDetectionSilenceTimeout The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * @param string $amdStatusCallback The URL that we should call using the `amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * @param string $amdStatusCallbackMethod The HTTP method we should use when calling the `amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + */ + public function __construct( + + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + array $statusCallbackEvent = Values::ARRAY_NONE, + string $label = Values::NONE, + int $timeout = Values::INT_NONE, + bool $record = Values::BOOL_NONE, + bool $muted = Values::BOOL_NONE, + string $beep = Values::NONE, + bool $startConferenceOnEnter = Values::BOOL_NONE, + bool $endConferenceOnExit = Values::BOOL_NONE, + string $waitUrl = Values::NONE, + string $waitMethod = Values::NONE, + bool $earlyMedia = Values::BOOL_NONE, + int $maxParticipants = Values::INT_NONE, + string $conferenceRecord = Values::NONE, + string $conferenceTrim = Values::NONE, + string $conferenceStatusCallback = Values::NONE, + string $conferenceStatusCallbackMethod = Values::NONE, + array $conferenceStatusCallbackEvent = Values::ARRAY_NONE, + string $recordingChannels = Values::NONE, + string $recordingStatusCallback = Values::NONE, + string $recordingStatusCallbackMethod = Values::NONE, + string $sipAuthUsername = Values::NONE, + string $sipAuthPassword = Values::NONE, + string $region = Values::NONE, + string $conferenceRecordingStatusCallback = Values::NONE, + string $conferenceRecordingStatusCallbackMethod = Values::NONE, + array $recordingStatusCallbackEvent = Values::ARRAY_NONE, + array $conferenceRecordingStatusCallbackEvent = Values::ARRAY_NONE, + bool $coaching = Values::BOOL_NONE, + string $callSidToCoach = Values::NONE, + string $jitterBufferSize = Values::NONE, + string $byoc = Values::NONE, + string $callerId = Values::NONE, + string $callReason = Values::NONE, + string $recordingTrack = Values::NONE, + int $timeLimit = Values::INT_NONE, + string $machineDetection = Values::NONE, + int $machineDetectionTimeout = Values::INT_NONE, + int $machineDetectionSpeechThreshold = Values::INT_NONE, + int $machineDetectionSpeechEndThreshold = Values::INT_NONE, + int $machineDetectionSilenceTimeout = Values::INT_NONE, + string $amdStatusCallback = Values::NONE, + string $amdStatusCallbackMethod = Values::NONE + + ) { + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + $this->options['label'] = $label; + $this->options['timeout'] = $timeout; + $this->options['record'] = $record; + $this->options['muted'] = $muted; + $this->options['beep'] = $beep; + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + $this->options['waitUrl'] = $waitUrl; + $this->options['waitMethod'] = $waitMethod; + $this->options['earlyMedia'] = $earlyMedia; + $this->options['maxParticipants'] = $maxParticipants; + $this->options['conferenceRecord'] = $conferenceRecord; + $this->options['conferenceTrim'] = $conferenceTrim; + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + $this->options['recordingChannels'] = $recordingChannels; + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + $this->options['sipAuthUsername'] = $sipAuthUsername; + $this->options['sipAuthPassword'] = $sipAuthPassword; + $this->options['region'] = $region; + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + $this->options['conferenceRecordingStatusCallbackEvent'] = $conferenceRecordingStatusCallbackEvent; + $this->options['coaching'] = $coaching; + $this->options['callSidToCoach'] = $callSidToCoach; + $this->options['jitterBufferSize'] = $jitterBufferSize; + $this->options['byoc'] = $byoc; + $this->options['callerId'] = $callerId; + $this->options['callReason'] = $callReason; + $this->options['recordingTrack'] = $recordingTrack; + $this->options['timeLimit'] = $timeLimit; + $this->options['machineDetection'] = $machineDetection; + $this->options['machineDetectionTimeout'] = $machineDetectionTimeout; + $this->options['machineDetectionSpeechThreshold'] = $machineDetectionSpeechThreshold; + $this->options['machineDetectionSpeechEndThreshold'] = $machineDetectionSpeechEndThreshold; + $this->options['machineDetectionSilenceTimeout'] = $machineDetectionSilenceTimeout; + $this->options['amdStatusCallback'] = $amdStatusCallback; + $this->options['amdStatusCallbackMethod'] = $amdStatusCallbackMethod; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` and `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` and `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The conference state changes that should generate a call to `status_callback`. Can be: `initiated`, `ringing`, `answered`, and `completed`. Separate multiple values with a space. The default value is `completed`. + * + * @param string[] $statusCallbackEvent The conference state changes that should generate a call to `status_callback`. Can be: `initiated`, `ringing`, `answered`, and `completed`. Separate multiple values with a space. The default value is `completed`. + * @return $this Fluent Builder + */ + public function setStatusCallbackEvent(array $statusCallbackEvent): self + { + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + return $this; + } + + /** + * A label for this participant. If one is supplied, it may subsequently be used to fetch, update or delete the participant. + * + * @param string $label A label for this participant. If one is supplied, it may subsequently be used to fetch, update or delete the participant. + * @return $this Fluent Builder + */ + public function setLabel(string $label): self + { + $this->options['label'] = $label; + return $this; + } + + /** + * The number of seconds that we should allow the phone to ring before assuming there is no answer. Can be an integer between `5` and `600`, inclusive. The default value is `60`. We always add a 5-second timeout buffer to outgoing calls, so value of 10 would result in an actual timeout that was closer to 15 seconds. + * + * @param int $timeout The number of seconds that we should allow the phone to ring before assuming there is no answer. Can be an integer between `5` and `600`, inclusive. The default value is `60`. We always add a 5-second timeout buffer to outgoing calls, so value of 10 would result in an actual timeout that was closer to 15 seconds. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setRecord(bool $record): self + { + $this->options['record'] = $record; + return $this; + } + + /** + * Whether the agent is muted in the conference. Can be `true` or `false` and the default is `false`. + * + * @param bool $muted Whether the agent is muted in the conference. Can be `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setMuted(bool $muted): self + { + $this->options['muted'] = $muted; + return $this; + } + + /** + * Whether to play a notification beep to the conference when the participant joins. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * + * @param string $beep Whether to play a notification beep to the conference when the participant joins. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @return $this Fluent Builder + */ + public function setBeep(string $beep): self + { + $this->options['beep'] = $beep; + return $this; + } + + /** + * Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @return $this Fluent Builder + */ + public function setStartConferenceOnEnter(bool $startConferenceOnEnter): self + { + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + return $this; + } + + /** + * Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $endConferenceOnExit Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setEndConferenceOnExit(bool $endConferenceOnExit): self + { + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + return $this; + } + + /** + * The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @return $this Fluent Builder + */ + public function setWaitUrl(string $waitUrl): self + { + $this->options['waitUrl'] = $waitUrl; + return $this; + } + + /** + * The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @return $this Fluent Builder + */ + public function setWaitMethod(string $waitMethod): self + { + $this->options['waitMethod'] = $waitMethod; + return $this; + } + + /** + * Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. Can be: `true` or `false` and defaults to `true`. + * + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. Can be: `true` or `false` and defaults to `true`. + * @return $this Fluent Builder + */ + public function setEarlyMedia(bool $earlyMedia): self + { + $this->options['earlyMedia'] = $earlyMedia; + return $this; + } + + /** + * The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * + * @param int $maxParticipants The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @return $this Fluent Builder + */ + public function setMaxParticipants(int $maxParticipants): self + { + $this->options['maxParticipants'] = $maxParticipants; + return $this; + } + + /** + * Whether to record the conference the participant is joining. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * + * @param string $conferenceRecord Whether to record the conference the participant is joining. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @return $this Fluent Builder + */ + public function setConferenceRecord(string $conferenceRecord): self + { + $this->options['conferenceRecord'] = $conferenceRecord; + return $this; + } + + /** + * Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * + * @param string $conferenceTrim Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @return $this Fluent Builder + */ + public function setConferenceTrim(string $conferenceTrim): self + { + $this->options['conferenceTrim'] = $conferenceTrim; + return $this; + } + + /** + * The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallback(string $conferenceStatusCallback): self + { + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackMethod(string $conferenceStatusCallbackMethod): self + { + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + return $this; + } + + /** + * The conference state changes that should generate a call to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `modify`, `speaker`, and `announcement`. Separate multiple values with a space. Defaults to `start end`. + * + * @param string[] $conferenceStatusCallbackEvent The conference state changes that should generate a call to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `modify`, `speaker`, and `announcement`. Separate multiple values with a space. Defaults to `start end`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackEvent(array $conferenceStatusCallbackEvent): self + { + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + return $this; + } + + /** + * The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @return $this Fluent Builder + */ + public function setRecordingChannels(string $recordingChannels): self + { + $this->options['recordingChannels'] = $recordingChannels; + return $this; + } + + /** + * The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallback(string $recordingStatusCallback): self + { + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackMethod(string $recordingStatusCallbackMethod): self + { + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + return $this; + } + + /** + * The SIP username used for authentication. + * + * @param string $sipAuthUsername The SIP username used for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthUsername(string $sipAuthUsername): self + { + $this->options['sipAuthUsername'] = $sipAuthUsername; + return $this; + } + + /** + * The SIP password for authentication. + * + * @param string $sipAuthPassword The SIP password for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthPassword(string $sipAuthPassword): self + { + $this->options['sipAuthPassword'] = $sipAuthPassword; + return $this; + } + + /** + * The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @return $this Fluent Builder + */ + public function setRegion(string $region): self + { + $this->options['region'] = $region; + return $this; + } + + /** + * The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallback(string $conferenceRecordingStatusCallback): self + { + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallbackMethod(string $conferenceRecordingStatusCallbackMethod): self + { + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + return $this; + } + + /** + * The recording state changes that should generate a call to `recording_status_callback`. Can be: `started`, `in-progress`, `paused`, `resumed`, `stopped`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'`. + * + * @param string[] $recordingStatusCallbackEvent The recording state changes that should generate a call to `recording_status_callback`. Can be: `started`, `in-progress`, `paused`, `resumed`, `stopped`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackEvent(array $recordingStatusCallbackEvent): self + { + $this->options['recordingStatusCallbackEvent'] = $recordingStatusCallbackEvent; + return $this; + } + + /** + * The conference recording state changes that generate a call to `conference_recording_status_callback`. Can be: `in-progress`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'` + * + * @param string[] $conferenceRecordingStatusCallbackEvent The conference recording state changes that generate a call to `conference_recording_status_callback`. Can be: `in-progress`, `completed`, `failed`, and `absent`. Separate multiple values with a space, ex: `'in-progress completed failed'` + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallbackEvent(array $conferenceRecordingStatusCallbackEvent): self + { + $this->options['conferenceRecordingStatusCallbackEvent'] = $conferenceRecordingStatusCallbackEvent; + return $this; + } + + /** + * Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * + * @param bool $coaching Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * @return $this Fluent Builder + */ + public function setCoaching(bool $coaching): self + { + $this->options['coaching'] = $coaching; + return $this; + } + + /** + * The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * + * @param string $callSidToCoach The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * @return $this Fluent Builder + */ + public function setCallSidToCoach(string $callSidToCoach): self + { + $this->options['callSidToCoach'] = $callSidToCoach; + return $this; + } + + /** + * Jitter buffer size for the connecting participant. Twilio will use this setting to apply Jitter Buffer before participant's audio is mixed into the conference. Can be: `off`, `small`, `medium`, and `large`. Default to `large`. + * + * @param string $jitterBufferSize Jitter buffer size for the connecting participant. Twilio will use this setting to apply Jitter Buffer before participant's audio is mixed into the conference. Can be: `off`, `small`, `medium`, and `large`. Default to `large`. + * @return $this Fluent Builder + */ + public function setJitterBufferSize(string $jitterBufferSize): self + { + $this->options['jitterBufferSize'] = $jitterBufferSize; + return $this; + } + + /** + * The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * + * @param string $byoc The SID of a BYOC (Bring Your Own Carrier) trunk to route this call with. Note that `byoc` is only meaningful when `to` is a phone number; it will otherwise be ignored. (Beta) + * @return $this Fluent Builder + */ + public function setByoc(string $byoc): self + { + $this->options['byoc'] = $byoc; + return $this; + } + + /** + * The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `callerId` must also be a phone number. If `to` is sip address, this value of `callerId` should be a username portion to be used to populate the From header that is passed to the SIP endpoint. + * + * @param string $callerId The phone number, Client identifier, or username portion of SIP address that made this call. Phone numbers are in [E.164](https://www.twilio.com/docs/glossary/what-e164) format (e.g., +16175551212). Client identifiers are formatted `client:name`. If using a phone number, it must be a Twilio number or a Verified [outgoing caller id](https://www.twilio.com/docs/voice/api/outgoing-caller-ids) for your account. If the `to` parameter is a phone number, `callerId` must also be a phone number. If `to` is sip address, this value of `callerId` should be a username portion to be used to populate the From header that is passed to the SIP endpoint. + * @return $this Fluent Builder + */ + public function setCallerId(string $callerId): self + { + $this->options['callerId'] = $callerId; + return $this; + } + + /** + * The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * + * @param string $callReason The Reason for the outgoing call. Use it to specify the purpose of the call that is presented on the called party's phone. (Branded Calls Beta) + * @return $this Fluent Builder + */ + public function setCallReason(string $callReason): self + { + $this->options['callReason'] = $callReason; + return $this; + } + + /** + * The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is sent from Twilio. `both` records the audio that is received and sent by Twilio. + * + * @param string $recordingTrack The audio track to record for the call. Can be: `inbound`, `outbound` or `both`. The default is `both`. `inbound` records the audio that is received by Twilio. `outbound` records the audio that is sent from Twilio. `both` records the audio that is received and sent by Twilio. + * @return $this Fluent Builder + */ + public function setRecordingTrack(string $recordingTrack): self + { + $this->options['recordingTrack'] = $recordingTrack; + return $this; + } + + /** + * The maximum duration of the call in seconds. Constraints depend on account and configuration. + * + * @param int $timeLimit The maximum duration of the call in seconds. Constraints depend on account and configuration. + * @return $this Fluent Builder + */ + public function setTimeLimit(int $timeLimit): self + { + $this->options['timeLimit'] = $timeLimit; + return $this; + } + + /** + * Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * + * @param string $machineDetection Whether to detect if a human, answering machine, or fax has picked up the call. Can be: `Enable` or `DetectMessageEnd`. Use `Enable` if you would like us to return `AnsweredBy` as soon as the called party is identified. Use `DetectMessageEnd`, if you would like to leave a message on an answering machine. If `send_digits` is provided, this parameter is ignored. For more information, see [Answering Machine Detection](https://www.twilio.com/docs/voice/answering-machine-detection). + * @return $this Fluent Builder + */ + public function setMachineDetection(string $machineDetection): self + { + $this->options['machineDetection'] = $machineDetection; + return $this; + } + + /** + * The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * + * @param int $machineDetectionTimeout The number of seconds that we should attempt to detect an answering machine before timing out and sending a voice request with `AnsweredBy` of `unknown`. The default timeout is 30 seconds. + * @return $this Fluent Builder + */ + public function setMachineDetectionTimeout(int $machineDetectionTimeout): self + { + $this->options['machineDetectionTimeout'] = $machineDetectionTimeout; + return $this; + } + + /** + * The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * + * @param int $machineDetectionSpeechThreshold The number of milliseconds that is used as the measuring stick for the length of the speech activity, where durations lower than this value will be interpreted as a human and longer than this value as a machine. Possible Values: 1000-6000. Default: 2400. + * @return $this Fluent Builder + */ + public function setMachineDetectionSpeechThreshold(int $machineDetectionSpeechThreshold): self + { + $this->options['machineDetectionSpeechThreshold'] = $machineDetectionSpeechThreshold; + return $this; + } + + /** + * The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * + * @param int $machineDetectionSpeechEndThreshold The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Possible Values: 500-5000. Default: 1200. + * @return $this Fluent Builder + */ + public function setMachineDetectionSpeechEndThreshold(int $machineDetectionSpeechEndThreshold): self + { + $this->options['machineDetectionSpeechEndThreshold'] = $machineDetectionSpeechEndThreshold; + return $this; + } + + /** + * The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * + * @param int $machineDetectionSilenceTimeout The number of milliseconds of initial silence after which an `unknown` AnsweredBy result will be returned. Possible Values: 2000-10000. Default: 5000. + * @return $this Fluent Builder + */ + public function setMachineDetectionSilenceTimeout(int $machineDetectionSilenceTimeout): self + { + $this->options['machineDetectionSilenceTimeout'] = $machineDetectionSilenceTimeout; + return $this; + } + + /** + * The URL that we should call using the `amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * + * @param string $amdStatusCallback The URL that we should call using the `amd_status_callback_method` to notify customer application whether the call was answered by human, machine or fax. + * @return $this Fluent Builder + */ + public function setAmdStatusCallback(string $amdStatusCallback): self + { + $this->options['amdStatusCallback'] = $amdStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when calling the `amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $amdStatusCallbackMethod The HTTP method we should use when calling the `amd_status_callback` URL. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setAmdStatusCallbackMethod(string $amdStatusCallbackMethod): self + { + $this->options['amdStatusCallbackMethod'] = $amdStatusCallbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateParticipantOptions ' . $options . ']'; + } +} + + + +class ReadParticipantOptions extends Options + { + /** + * @param bool $muted Whether to return only participants that are muted. Can be: `true` or `false`. + * @param bool $hold Whether to return only participants that are on hold. Can be: `true` or `false`. + * @param bool $coaching Whether to return only participants who are coaching another call. Can be: `true` or `false`. + */ + public function __construct( + + bool $muted = Values::BOOL_NONE, + bool $hold = Values::BOOL_NONE, + bool $coaching = Values::BOOL_NONE + + ) { + $this->options['muted'] = $muted; + $this->options['hold'] = $hold; + $this->options['coaching'] = $coaching; + } + + /** + * Whether to return only participants that are muted. Can be: `true` or `false`. + * + * @param bool $muted Whether to return only participants that are muted. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setMuted(bool $muted): self + { + $this->options['muted'] = $muted; + return $this; + } + + /** + * Whether to return only participants that are on hold. Can be: `true` or `false`. + * + * @param bool $hold Whether to return only participants that are on hold. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setHold(bool $hold): self + { + $this->options['hold'] = $hold; + return $this; + } + + /** + * Whether to return only participants who are coaching another call. Can be: `true` or `false`. + * + * @param bool $coaching Whether to return only participants who are coaching another call. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setCoaching(bool $coaching): self + { + $this->options['coaching'] = $coaching; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadParticipantOptions ' . $options . ']'; + } +} + +class UpdateParticipantOptions extends Options + { + /** + * @param bool $muted Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + * @param bool $hold Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + * @param string $holdUrl The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @param string $holdMethod The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + * @param string $announceUrl The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @param string $announceMethod The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $waitUrl The URL we call using the `wait_method` for the music to play while participants are waiting for the conference to start. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @param bool $beepOnExit Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + * @param bool $endConferenceOnExit Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * @param bool $coaching Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * @param string $callSidToCoach The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + */ + public function __construct( + + bool $muted = Values::BOOL_NONE, + bool $hold = Values::BOOL_NONE, + string $holdUrl = Values::NONE, + string $holdMethod = Values::NONE, + string $announceUrl = Values::NONE, + string $announceMethod = Values::NONE, + string $waitUrl = Values::NONE, + string $waitMethod = Values::NONE, + bool $beepOnExit = Values::BOOL_NONE, + bool $endConferenceOnExit = Values::BOOL_NONE, + bool $coaching = Values::BOOL_NONE, + string $callSidToCoach = Values::NONE + + ) { + $this->options['muted'] = $muted; + $this->options['hold'] = $hold; + $this->options['holdUrl'] = $holdUrl; + $this->options['holdMethod'] = $holdMethod; + $this->options['announceUrl'] = $announceUrl; + $this->options['announceMethod'] = $announceMethod; + $this->options['waitUrl'] = $waitUrl; + $this->options['waitMethod'] = $waitMethod; + $this->options['beepOnExit'] = $beepOnExit; + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + $this->options['coaching'] = $coaching; + $this->options['callSidToCoach'] = $callSidToCoach; + } + + /** + * Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + * + * @param bool $muted Whether the participant should be muted. Can be `true` or `false`. `true` will mute the participant, and `false` will un-mute them. Anything value other than `true` or `false` is interpreted as `false`. + * @return $this Fluent Builder + */ + public function setMuted(bool $muted): self + { + $this->options['muted'] = $muted; + return $this; + } + + /** + * Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + * + * @param bool $hold Whether the participant should be on hold. Can be: `true` or `false`. `true` puts the participant on hold, and `false` lets them rejoin the conference. + * @return $this Fluent Builder + */ + public function setHold(bool $hold): self + { + $this->options['hold'] = $hold; + return $this; + } + + /** + * The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * + * @param string $holdUrl The URL we call using the `hold_method` for music that plays when the participant is on hold. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @return $this Fluent Builder + */ + public function setHoldUrl(string $holdUrl): self + { + $this->options['holdUrl'] = $holdUrl; + return $this; + } + + /** + * The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + * + * @param string $holdMethod The HTTP method we should use to call `hold_url`. Can be: `GET` or `POST` and the default is `GET`. + * @return $this Fluent Builder + */ + public function setHoldMethod(string $holdMethod): self + { + $this->options['holdMethod'] = $holdMethod; + return $this; + } + + /** + * The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * + * @param string $announceUrl The URL we call using the `announce_method` for an announcement to the participant. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @return $this Fluent Builder + */ + public function setAnnounceUrl(string $announceUrl): self + { + $this->options['announceUrl'] = $announceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $announceMethod The HTTP method we should use to call `announce_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setAnnounceMethod(string $announceMethod): self + { + $this->options['announceMethod'] = $announceMethod; + return $this; + } + + /** + * The URL we call using the `wait_method` for the music to play while participants are waiting for the conference to start. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * + * @param string $waitUrl The URL we call using the `wait_method` for the music to play while participants are waiting for the conference to start. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @return $this Fluent Builder + */ + public function setWaitUrl(string $waitUrl): self + { + $this->options['waitUrl'] = $waitUrl; + return $this; + } + + /** + * The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @return $this Fluent Builder + */ + public function setWaitMethod(string $waitMethod): self + { + $this->options['waitMethod'] = $waitMethod; + return $this; + } + + /** + * Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + * + * @param bool $beepOnExit Whether to play a notification beep to the conference when the participant exits. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setBeepOnExit(bool $beepOnExit): self + { + $this->options['beepOnExit'] = $beepOnExit; + return $this; + } + + /** + * Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $endConferenceOnExit Whether to end the conference when the participant leaves. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setEndConferenceOnExit(bool $endConferenceOnExit): self + { + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + return $this; + } + + /** + * Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * + * @param bool $coaching Whether the participant is coaching another call. Can be: `true` or `false`. If not present, defaults to `false` unless `call_sid_to_coach` is defined. If `true`, `call_sid_to_coach` must be defined. + * @return $this Fluent Builder + */ + public function setCoaching(bool $coaching): self + { + $this->options['coaching'] = $coaching; + return $this; + } + + /** + * The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * + * @param string $callSidToCoach The SID of the participant who is being `coached`. The participant being coached is the only participant who can hear the participant who is `coaching`. + * @return $this Fluent Builder + */ + public function setCallSidToCoach(string $callSidToCoach): self + { + $this->options['callSidToCoach'] = $callSidToCoach; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateParticipantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantPage.php new file mode 100755 index 0000000..ed8028b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Api\V2010\Account\Conference\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['conferenceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingContext.php new file mode 100755 index 0000000..a531ad1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingContext.php @@ -0,0 +1,140 @@ +solution = [ + 'accountSid' => + $accountSid, + 'conferenceSid' => + $conferenceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences/' . \rawurlencode($conferenceSid) + .'/Recordings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RecordingInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): RecordingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $status, + 'PauseBehavior' => + $options['pauseBehavior'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingInstance.php new file mode 100755 index 0000000..2d9f443 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingInstance.php @@ -0,0 +1,179 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'sid' => Values::array_get($payload, 'sid'), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'status' => Values::array_get($payload, 'status'), + 'channels' => Values::array_get($payload, 'channels'), + 'source' => Values::array_get($payload, 'source'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'encryptionDetails' => Values::array_get($payload, 'encryption_details'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'conferenceSid' => $conferenceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingContext Context for this RecordingInstance + */ + protected function proxy(): RecordingContext + { + if (!$this->context) { + $this->context = new RecordingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RecordingInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): RecordingInstance + { + + return $this->proxy()->update($status, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingList.php new file mode 100755 index 0000000..210164c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingList.php @@ -0,0 +1,187 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'conferenceSid' => + $conferenceSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences/' . \rawurlencode($conferenceSid) + .'/Recordings.json'; + } + + /** + * Reads RecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RecordingPage Page of RecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreated<' => + Serialize::iso8601Date($options['dateCreatedBefore']), + 'DateCreated' => + Serialize::iso8601Date($options['dateCreated']), + 'DateCreated>' => + Serialize::iso8601Date($options['dateCreatedAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RecordingPage Page of RecordingInstance + */ + public function getPage(string $targetUrl): RecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RecordingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Conference Recording resource to delete. + */ + public function getContext( + string $sid + + ): RecordingContext + { + return new RecordingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['conferenceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingOptions.php new file mode 100755 index 0000000..b70a14c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingOptions.php @@ -0,0 +1,168 @@ +=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return ReadRecordingOptions Options builder + */ + public static function read( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ): ReadRecordingOptions + { + return new ReadRecordingOptions( + $dateCreatedBefore, + $dateCreated, + $dateCreatedAfter + ); + } + + /** + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * @return UpdateRecordingOptions Options builder + */ + public static function update( + + string $pauseBehavior = Values::NONE + + ): UpdateRecordingOptions + { + return new UpdateRecordingOptions( + $pauseBehavior + ); + } + +} + + + +class ReadRecordingOptions extends Options + { + /** + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + */ + public function __construct( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ) { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(string $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreated(string $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. You can also specify inequality: `DateCreated<=YYYY-MM-DD` will return recordings generated at or before midnight on a given date, and `DateCreated>=YYYY-MM-DD` returns recordings generated at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(string $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadRecordingOptions ' . $options . ']'; + } +} + +class UpdateRecordingOptions extends Options + { + /** + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + */ + public function __construct( + + string $pauseBehavior = Values::NONE + + ) { + $this->options['pauseBehavior'] = $pauseBehavior; + } + + /** + * Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * + * @param string $pauseBehavior Whether to record during a pause. Can be: `skip` or `silence` and the default is `silence`. `skip` does not record during the pause period, while `silence` will replace the actual audio of the call with silence during the pause period. This parameter only applies when setting `status` is set to `paused`. + * @return $this Fluent Builder + */ + public function setPauseBehavior(string $pauseBehavior): self + { + $this->options['pauseBehavior'] = $pauseBehavior; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingPage.php new file mode 100755 index 0000000..33cb649 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Conference/RecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingInstance \Twilio\Rest\Api\V2010\Account\Conference\RecordingInstance + */ + public function buildInstance(array $payload): RecordingInstance + { + return new RecordingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['conferenceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConferenceContext.php b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceContext.php new file mode 100755 index 0000000..5492842 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceContext.php @@ -0,0 +1,200 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the ConferenceInstance + * + * @return ConferenceInstance Fetched ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConferenceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConferenceInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ConferenceInstance + * + * @param array|Options $options Optional Arguments + * @return ConferenceInstance Updated ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConferenceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $options['status'], + 'AnnounceUrl' => + $options['announceUrl'], + 'AnnounceMethod' => + $options['announceMethod'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConferenceInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RecordingList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_recordings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ConferenceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConferenceInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceInstance.php new file mode 100755 index 0000000..d0be268 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceInstance.php @@ -0,0 +1,175 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'region' => Values::array_get($payload, 'region'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'uri' => Values::array_get($payload, 'uri'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'reasonConferenceEnded' => Values::array_get($payload, 'reason_conference_ended'), + 'callSidEndingConference' => Values::array_get($payload, 'call_sid_ending_conference'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConferenceContext Context for this ConferenceInstance + */ + protected function proxy(): ConferenceContext + { + if (!$this->context) { + $this->context = new ConferenceContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ConferenceInstance + * + * @return ConferenceInstance Fetched ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConferenceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConferenceInstance + * + * @param array|Options $options Optional Arguments + * @return ConferenceInstance Updated ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConferenceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + return $this->proxy()->recordings; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ConferenceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConferenceList.php b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceList.php new file mode 100755 index 0000000..8999037 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceList.php @@ -0,0 +1,190 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Conferences.json'; + } + + /** + * Reads ConferenceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConferenceInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ConferenceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConferenceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConferencePage Page of ConferenceInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConferencePage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreated<' => + Serialize::iso8601Date($options['dateCreatedBefore']), + 'DateCreated' => + Serialize::iso8601Date($options['dateCreated']), + 'DateCreated>' => + Serialize::iso8601Date($options['dateCreatedAfter']), + 'DateUpdated<' => + Serialize::iso8601Date($options['dateUpdatedBefore']), + 'DateUpdated' => + Serialize::iso8601Date($options['dateUpdated']), + 'DateUpdated>' => + Serialize::iso8601Date($options['dateUpdatedAfter']), + 'FriendlyName' => + $options['friendlyName'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConferencePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConferenceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConferencePage Page of ConferenceInstance + */ + public function getPage(string $targetUrl): ConferencePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConferencePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConferenceContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Conference resource to fetch + */ + public function getContext( + string $sid + + ): ConferenceContext + { + return new ConferenceContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ConferenceList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConferenceOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceOptions.php new file mode 100755 index 0000000..9aa5bd9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConferenceOptions.php @@ -0,0 +1,290 @@ +=YYYY-MM-DD`. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @param string $dateUpdatedBefore The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $dateUpdated The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $dateUpdatedAfter The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $friendlyName The string that identifies the Conference resources to read. + * @param string $status The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + * @return ReadConferenceOptions Options builder + */ + public static function read( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null, + string $dateUpdatedBefore = null, + string $dateUpdated = null, + string $dateUpdatedAfter = null, + string $friendlyName = Values::NONE, + string $status = Values::NONE + + ): ReadConferenceOptions + { + return new ReadConferenceOptions( + $dateCreatedBefore, + $dateCreated, + $dateCreatedAfter, + $dateUpdatedBefore, + $dateUpdated, + $dateUpdatedAfter, + $friendlyName, + $status + ); + } + + /** + * @param string $status + * @param string $announceUrl The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @param string $announceMethod The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + * @return UpdateConferenceOptions Options builder + */ + public static function update( + + string $status = Values::NONE, + string $announceUrl = Values::NONE, + string $announceMethod = Values::NONE + + ): UpdateConferenceOptions + { + return new UpdateConferenceOptions( + $status, + $announceUrl, + $announceMethod + ); + } + +} + + +class ReadConferenceOptions extends Options + { + /** + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @param string $dateUpdatedBefore The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $dateUpdated The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $dateUpdatedAfter The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @param string $friendlyName The string that identifies the Conference resources to read. + * @param string $status The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + */ + public function __construct( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null, + string $dateUpdatedBefore = null, + string $dateUpdated = null, + string $dateUpdatedAfter = null, + string $friendlyName = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateUpdatedBefore'] = $dateUpdatedBefore; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['dateUpdatedAfter'] = $dateUpdatedAfter; + $this->options['friendlyName'] = $friendlyName; + $this->options['status'] = $status; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * + * @param string $dateCreatedBefore The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(string $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * + * @param string $dateCreated The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateCreated(string $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * + * @param string $dateCreatedAfter The `date_created` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that started on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that started on or after midnight on a date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(string $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * + * @param string $dateUpdatedBefore The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateUpdatedBefore(string $dateUpdatedBefore): self + { + $this->options['dateUpdatedBefore'] = $dateUpdatedBefore; + return $this; + } + + /** + * The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * + * @param string $dateUpdated The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateUpdated(string $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * + * @param string $dateUpdatedAfter The `date_updated` value, specified as `YYYY-MM-DD`, of the resources to read. To read conferences that were last updated on or before midnight on a date, use `<=YYYY-MM-DD`, and to specify conferences that were last updated on or after midnight on a given date, use `>=YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateUpdatedAfter(string $dateUpdatedAfter): self + { + $this->options['dateUpdatedAfter'] = $dateUpdatedAfter; + return $this; + } + + /** + * The string that identifies the Conference resources to read. + * + * @param string $friendlyName The string that identifies the Conference resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + * + * @param string $status The status of the resources to read. Can be: `init`, `in-progress`, or `completed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadConferenceOptions ' . $options . ']'; + } +} + +class UpdateConferenceOptions extends Options + { + /** + * @param string $status + * @param string $announceUrl The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @param string $announceMethod The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + */ + public function __construct( + + string $status = Values::NONE, + string $announceUrl = Values::NONE, + string $announceMethod = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['announceUrl'] = $announceUrl; + $this->options['announceMethod'] = $announceMethod; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * + * @param string $announceUrl The URL we should call to announce something into the conference. The URL may return an MP3 file, a WAV file, or a TwiML document that contains ``, ``, ``, or `` verbs. + * @return $this Fluent Builder + */ + public function setAnnounceUrl(string $announceUrl): self + { + $this->options['announceUrl'] = $announceUrl; + return $this; + } + + /** + * The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + * + * @param string $announceMethod The HTTP method used to call `announce_url`. Can be: `GET` or `POST` and the default is `POST` + * @return $this Fluent Builder + */ + public function setAnnounceMethod(string $announceMethod): self + { + $this->options['announceMethod'] = $announceMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateConferenceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConferencePage.php b/app/api/Twilio/Rest/Api/V2010/Account/ConferencePage.php new file mode 100755 index 0000000..91ab421 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConferencePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConferenceInstance \Twilio\Rest\Api\V2010\Account\ConferenceInstance + */ + public function buildInstance(array $payload): ConferenceInstance + { + return new ConferenceInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ConferencePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppContext.php b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppContext.php new file mode 100755 index 0000000..825e990 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppContext.php @@ -0,0 +1,144 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/ConnectApps/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the ConnectAppInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ConnectAppInstance + * + * @return ConnectAppInstance Fetched ConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectAppInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConnectAppInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ConnectAppInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectAppInstance Updated ConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectAppInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AuthorizeRedirectUrl' => + $options['authorizeRedirectUrl'], + 'CompanyName' => + $options['companyName'], + 'DeauthorizeCallbackMethod' => + $options['deauthorizeCallbackMethod'], + 'DeauthorizeCallbackUrl' => + $options['deauthorizeCallbackUrl'], + 'Description' => + $options['description'], + 'FriendlyName' => + $options['friendlyName'], + 'HomepageUrl' => + $options['homepageUrl'], + 'Permissions' => + $options['permissions'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConnectAppInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ConnectAppContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppInstance.php new file mode 100755 index 0000000..05e64fa --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppInstance.php @@ -0,0 +1,163 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'authorizeRedirectUrl' => Values::array_get($payload, 'authorize_redirect_url'), + 'companyName' => Values::array_get($payload, 'company_name'), + 'deauthorizeCallbackMethod' => Values::array_get($payload, 'deauthorize_callback_method'), + 'deauthorizeCallbackUrl' => Values::array_get($payload, 'deauthorize_callback_url'), + 'description' => Values::array_get($payload, 'description'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'homepageUrl' => Values::array_get($payload, 'homepage_url'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConnectAppContext Context for this ConnectAppInstance + */ + protected function proxy(): ConnectAppContext + { + if (!$this->context) { + $this->context = new ConnectAppContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ConnectAppInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ConnectAppInstance + * + * @return ConnectAppInstance Fetched ConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectAppInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConnectAppInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectAppInstance Updated ConnectAppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectAppInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ConnectAppInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppList.php b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppList.php new file mode 100755 index 0000000..809ce5d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/ConnectApps.json'; + } + + /** + * Reads ConnectAppInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConnectAppInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ConnectAppInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConnectAppInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConnectAppPage Page of ConnectAppInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConnectAppPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConnectAppPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConnectAppInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConnectAppPage Page of ConnectAppInstance + */ + public function getPage(string $targetUrl): ConnectAppPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConnectAppPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConnectAppContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the ConnectApp resource to fetch. + */ + public function getContext( + string $sid + + ): ConnectAppContext + { + return new ConnectAppContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ConnectAppList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppOptions.php new file mode 100755 index 0000000..6100931 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppOptions.php @@ -0,0 +1,208 @@ +options['authorizeRedirectUrl'] = $authorizeRedirectUrl; + $this->options['companyName'] = $companyName; + $this->options['deauthorizeCallbackMethod'] = $deauthorizeCallbackMethod; + $this->options['deauthorizeCallbackUrl'] = $deauthorizeCallbackUrl; + $this->options['description'] = $description; + $this->options['friendlyName'] = $friendlyName; + $this->options['homepageUrl'] = $homepageUrl; + $this->options['permissions'] = $permissions; + } + + /** + * The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + * + * @param string $authorizeRedirectUrl The URL to redirect the user to after we authenticate the user and obtain authorization to access the Connect App. + * @return $this Fluent Builder + */ + public function setAuthorizeRedirectUrl(string $authorizeRedirectUrl): self + { + $this->options['authorizeRedirectUrl'] = $authorizeRedirectUrl; + return $this; + } + + /** + * The company name to set for the Connect App. + * + * @param string $companyName The company name to set for the Connect App. + * @return $this Fluent Builder + */ + public function setCompanyName(string $companyName): self + { + $this->options['companyName'] = $companyName; + return $this; + } + + /** + * The HTTP method to use when calling `deauthorize_callback_url`. + * + * @param string $deauthorizeCallbackMethod The HTTP method to use when calling `deauthorize_callback_url`. + * @return $this Fluent Builder + */ + public function setDeauthorizeCallbackMethod(string $deauthorizeCallbackMethod): self + { + $this->options['deauthorizeCallbackMethod'] = $deauthorizeCallbackMethod; + return $this; + } + + /** + * The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + * + * @param string $deauthorizeCallbackUrl The URL to call using the `deauthorize_callback_method` to de-authorize the Connect App. + * @return $this Fluent Builder + */ + public function setDeauthorizeCallbackUrl(string $deauthorizeCallbackUrl): self + { + $this->options['deauthorizeCallbackUrl'] = $deauthorizeCallbackUrl; + return $this; + } + + /** + * A description of the Connect App. + * + * @param string $description A description of the Connect App. + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A public URL where users can obtain more information about this Connect App. + * + * @param string $homepageUrl A public URL where users can obtain more information about this Connect App. + * @return $this Fluent Builder + */ + public function setHomepageUrl(string $homepageUrl): self + { + $this->options['homepageUrl'] = $homepageUrl; + return $this; + } + + /** + * A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + * + * @param string $permissions A comma-separated list of the permissions you will request from the users of this ConnectApp. Can include: `get-all` and `post-all`. + * @return $this Fluent Builder + */ + public function setPermissions(array $permissions): self + { + $this->options['permissions'] = $permissions; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateConnectAppOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppPage.php b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppPage.php new file mode 100755 index 0000000..3609d0f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ConnectAppPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConnectAppInstance \Twilio\Rest\Api\V2010\Account\ConnectAppInstance + */ + public function buildInstance(array $payload): ConnectAppInstance + { + return new ConnectAppInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ConnectAppPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionContext.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionContext.php new file mode 100755 index 0000000..242165e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionContext.php @@ -0,0 +1,99 @@ +solution = [ + 'accountSid' => + $accountSid, + 'resourceSid' => + $resourceSid, + 'assignedAddOnSid' => + $assignedAddOnSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/' . \rawurlencode($resourceSid) + .'/AssignedAddOns/' . \rawurlencode($assignedAddOnSid) + .'/Extensions/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the AssignedAddOnExtensionInstance + * + * @return AssignedAddOnExtensionInstance Fetched AssignedAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssignedAddOnExtensionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssignedAddOnExtensionInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['assignedAddOnSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AssignedAddOnExtensionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionInstance.php new file mode 100755 index 0000000..a3a0b91 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionInstance.php @@ -0,0 +1,137 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'resourceSid' => Values::array_get($payload, 'resource_sid'), + 'assignedAddOnSid' => Values::array_get($payload, 'assigned_add_on_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'productName' => Values::array_get($payload, 'product_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'uri' => Values::array_get($payload, 'uri'), + 'enabled' => Values::array_get($payload, 'enabled'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'resourceSid' => $resourceSid, 'assignedAddOnSid' => $assignedAddOnSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssignedAddOnExtensionContext Context for this AssignedAddOnExtensionInstance + */ + protected function proxy(): AssignedAddOnExtensionContext + { + if (!$this->context) { + $this->context = new AssignedAddOnExtensionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['assignedAddOnSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AssignedAddOnExtensionInstance + * + * @return AssignedAddOnExtensionInstance Fetched AssignedAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssignedAddOnExtensionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AssignedAddOnExtensionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionList.php new file mode 100755 index 0000000..d3df69e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionList.php @@ -0,0 +1,182 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'resourceSid' => + $resourceSid, + + 'assignedAddOnSid' => + $assignedAddOnSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/' . \rawurlencode($resourceSid) + .'/AssignedAddOns/' . \rawurlencode($assignedAddOnSid) + .'/Extensions.json'; + } + + /** + * Reads AssignedAddOnExtensionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssignedAddOnExtensionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssignedAddOnExtensionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssignedAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssignedAddOnExtensionPage Page of AssignedAddOnExtensionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssignedAddOnExtensionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssignedAddOnExtensionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssignedAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssignedAddOnExtensionPage Page of AssignedAddOnExtensionInstance + */ + public function getPage(string $targetUrl): AssignedAddOnExtensionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssignedAddOnExtensionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssignedAddOnExtensionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the resource to fetch. + */ + public function getContext( + string $sid + + ): AssignedAddOnExtensionContext + { + return new AssignedAddOnExtensionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['assignedAddOnSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AssignedAddOnExtensionList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionPage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionPage.php new file mode 100755 index 0000000..a5bc22f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOn/AssignedAddOnExtensionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssignedAddOnExtensionInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumber\AssignedAddOn\AssignedAddOnExtensionInstance + */ + public function buildInstance(array $payload): AssignedAddOnExtensionInstance + { + return new AssignedAddOnExtensionInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['resourceSid'], $this->solution['assignedAddOnSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AssignedAddOnExtensionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnContext.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnContext.php new file mode 100755 index 0000000..afe4807 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnContext.php @@ -0,0 +1,166 @@ +solution = [ + 'accountSid' => + $accountSid, + 'resourceSid' => + $resourceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/' . \rawurlencode($resourceSid) + .'/AssignedAddOns/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AssignedAddOnInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AssignedAddOnInstance + * + * @return AssignedAddOnInstance Fetched AssignedAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssignedAddOnInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssignedAddOnInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the extensions + */ + protected function getExtensions(): AssignedAddOnExtensionList + { + if (!$this->_extensions) { + $this->_extensions = new AssignedAddOnExtensionList( + $this->version, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['sid'] + ); + } + + return $this->_extensions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AssignedAddOnContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnInstance.php new file mode 100755 index 0000000..93b913f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnInstance.php @@ -0,0 +1,163 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'resourceSid' => Values::array_get($payload, 'resource_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'description' => Values::array_get($payload, 'description'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'resourceSid' => $resourceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssignedAddOnContext Context for this AssignedAddOnInstance + */ + protected function proxy(): AssignedAddOnContext + { + if (!$this->context) { + $this->context = new AssignedAddOnContext( + $this->version, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AssignedAddOnInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AssignedAddOnInstance + * + * @return AssignedAddOnInstance Fetched AssignedAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssignedAddOnInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the extensions + */ + protected function getExtensions(): AssignedAddOnExtensionList + { + return $this->proxy()->extensions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AssignedAddOnInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnList.php new file mode 100755 index 0000000..c60bb90 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'resourceSid' => + $resourceSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/' . \rawurlencode($resourceSid) + .'/AssignedAddOns.json'; + } + + /** + * Create the AssignedAddOnInstance + * + * @param string $installedAddOnSid The SID that identifies the Add-on installation. + * @return AssignedAddOnInstance Created AssignedAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $installedAddOnSid): AssignedAddOnInstance + { + + $data = Values::of([ + 'InstalledAddOnSid' => + $installedAddOnSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AssignedAddOnInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['resourceSid'] + ); + } + + + /** + * Reads AssignedAddOnInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssignedAddOnInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssignedAddOnInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssignedAddOnInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssignedAddOnPage Page of AssignedAddOnInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssignedAddOnPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssignedAddOnPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssignedAddOnInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssignedAddOnPage Page of AssignedAddOnInstance + */ + public function getPage(string $targetUrl): AssignedAddOnPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssignedAddOnPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssignedAddOnContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the resource to delete. + */ + public function getContext( + string $sid + + ): AssignedAddOnContext + { + return new AssignedAddOnContext( + $this->version, + $this->solution['accountSid'], + $this->solution['resourceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AssignedAddOnList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnPage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnPage.php new file mode 100755 index 0000000..bca2870 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/AssignedAddOnPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssignedAddOnInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumber\AssignedAddOnInstance + */ + public function buildInstance(array $payload): AssignedAddOnInstance + { + return new AssignedAddOnInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['resourceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AssignedAddOnPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalInstance.php new file mode 100755 index 0000000..0d78653 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'identitySid' => Values::array_get($payload, 'identity_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'origin' => Values::array_get($payload, 'origin'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceReceiveMode' => Values::array_get($payload, 'voice_receive_mode'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'emergencyStatus' => Values::array_get($payload, 'emergency_status'), + 'emergencyAddressSid' => Values::array_get($payload, 'emergency_address_sid'), + 'emergencyAddressStatus' => Values::array_get($payload, 'emergency_address_status'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'status' => Values::array_get($payload, 'status'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalList.php new file mode 100755 index 0000000..6f6b84c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalList.php @@ -0,0 +1,238 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/Local.json'; + } + + /** + * Create the LocalInstance + * + * @param string $phoneNumber The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * @param array|Options $options Optional Arguments + * @return LocalInstance Created LocalInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber, array $options = []): LocalInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + 'ApiVersion' => + $options['apiVersion'], + 'FriendlyName' => + $options['friendlyName'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceApplicationSid' => + $options['voiceApplicationSid'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'IdentitySid' => + $options['identitySid'], + 'AddressSid' => + $options['addressSid'], + 'EmergencyStatus' => + $options['emergencyStatus'], + 'EmergencyAddressSid' => + $options['emergencyAddressSid'], + 'TrunkSid' => + $options['trunkSid'], + 'VoiceReceiveMode' => + $options['voiceReceiveMode'], + 'BundleSid' => + $options['bundleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new LocalInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads LocalInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return LocalInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams LocalInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of LocalInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return LocalPage Page of LocalInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): LocalPage + { + $options = new Values($options); + + $params = Values::of([ + 'Beta' => + Serialize::booleanToString($options['beta']), + 'FriendlyName' => + $options['friendlyName'], + 'PhoneNumber' => + $options['phoneNumber'], + 'Origin' => + $options['origin'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new LocalPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of LocalInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return LocalPage Page of LocalInstance + */ + public function getPage(string $targetUrl): LocalPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new LocalPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalOptions.php new file mode 100755 index 0000000..6e385c1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalOptions.php @@ -0,0 +1,556 @@ +options['apiVersion'] = $apiVersion; + $this->options['friendlyName'] = $friendlyName; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['identitySid'] = $identitySid; + $this->options['addressSid'] = $addressSid; + $this->options['emergencyStatus'] = $emergencyStatus; + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + $this->options['trunkSid'] = $trunkSid; + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + $this->options['bundleSid'] = $bundleSid; + } + + /** + * The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * + * @param string $apiVersion The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * + * @param string $friendlyName A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call when the new phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the new phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * + * @param string $voiceApplicationSid The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setVoiceApplicationSid(string $voiceApplicationSid): self + { + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + return $this; + } + + /** + * Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * + * @param string $voiceUrl The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * + * @param string $identitySid The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * @return $this Fluent Builder + */ + public function setIdentitySid(string $identitySid): self + { + $this->options['identitySid'] = $identitySid; + return $this; + } + + /** + * The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * + * @param string $addressSid The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * @param string $emergencyStatus + * @return $this Fluent Builder + */ + public function setEmergencyStatus(string $emergencyStatus): self + { + $this->options['emergencyStatus'] = $emergencyStatus; + return $this; + } + + /** + * The SID of the emergency address configuration to use for emergency calling from the new phone number. + * + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from the new phone number. + * @return $this Fluent Builder + */ + public function setEmergencyAddressSid(string $emergencyAddressSid): self + { + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + return $this; + } + + /** + * The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * + * @param string $trunkSid The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setTrunkSid(string $trunkSid): self + { + $this->options['trunkSid'] = $trunkSid; + return $this; + } + + /** + * @param string $voiceReceiveMode + * @return $this Fluent Builder + */ + public function setVoiceReceiveMode(string $voiceReceiveMode): self + { + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + return $this; + } + + /** + * The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * @return $this Fluent Builder + */ + public function setBundleSid(string $bundleSid): self + { + $this->options['bundleSid'] = $bundleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateLocalOptions ' . $options . ']'; + } +} + +class ReadLocalOptions extends Options + { + /** + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @param string $friendlyName A string that identifies the resources to read. + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + */ + public function __construct( + + bool $beta = Values::BOOL_NONE, + string $friendlyName = Values::NONE, + string $phoneNumber = Values::NONE, + string $origin = Values::NONE + + ) { + $this->options['beta'] = $beta; + $this->options['friendlyName'] = $friendlyName; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['origin'] = $origin; + } + + /** + * Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * A string that identifies the resources to read. + * + * @param string $friendlyName A string that identifies the resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * @return $this Fluent Builder + */ + public function setOrigin(string $origin): self + { + $this->options['origin'] = $origin; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadLocalOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalPage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalPage.php new file mode 100755 index 0000000..278b0b6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/LocalPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LocalInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumber\LocalInstance + */ + public function buildInstance(array $payload): LocalInstance + { + return new LocalInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LocalPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileInstance.php new file mode 100755 index 0000000..d1a63dd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'identitySid' => Values::array_get($payload, 'identity_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'origin' => Values::array_get($payload, 'origin'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceReceiveMode' => Values::array_get($payload, 'voice_receive_mode'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'emergencyStatus' => Values::array_get($payload, 'emergency_status'), + 'emergencyAddressSid' => Values::array_get($payload, 'emergency_address_sid'), + 'emergencyAddressStatus' => Values::array_get($payload, 'emergency_address_status'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'status' => Values::array_get($payload, 'status'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobileInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileList.php new file mode 100755 index 0000000..10bde33 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileList.php @@ -0,0 +1,238 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/Mobile.json'; + } + + /** + * Create the MobileInstance + * + * @param string $phoneNumber The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * @param array|Options $options Optional Arguments + * @return MobileInstance Created MobileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber, array $options = []): MobileInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + 'ApiVersion' => + $options['apiVersion'], + 'FriendlyName' => + $options['friendlyName'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceApplicationSid' => + $options['voiceApplicationSid'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'IdentitySid' => + $options['identitySid'], + 'AddressSid' => + $options['addressSid'], + 'EmergencyStatus' => + $options['emergencyStatus'], + 'EmergencyAddressSid' => + $options['emergencyAddressSid'], + 'TrunkSid' => + $options['trunkSid'], + 'VoiceReceiveMode' => + $options['voiceReceiveMode'], + 'BundleSid' => + $options['bundleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MobileInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads MobileInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MobileInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MobileInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MobileInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MobilePage Page of MobileInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MobilePage + { + $options = new Values($options); + + $params = Values::of([ + 'Beta' => + Serialize::booleanToString($options['beta']), + 'FriendlyName' => + $options['friendlyName'], + 'PhoneNumber' => + $options['phoneNumber'], + 'Origin' => + $options['origin'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MobilePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MobileInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MobilePage Page of MobileInstance + */ + public function getPage(string $targetUrl): MobilePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MobilePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobileList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileOptions.php new file mode 100755 index 0000000..e0cc36e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobileOptions.php @@ -0,0 +1,556 @@ +options['apiVersion'] = $apiVersion; + $this->options['friendlyName'] = $friendlyName; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['identitySid'] = $identitySid; + $this->options['addressSid'] = $addressSid; + $this->options['emergencyStatus'] = $emergencyStatus; + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + $this->options['trunkSid'] = $trunkSid; + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + $this->options['bundleSid'] = $bundleSid; + } + + /** + * The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * + * @param string $apiVersion The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, the is a formatted version of the phone number. + * + * @param string $friendlyName A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, the is a formatted version of the phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those of the application. + * + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those of the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call when the new phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the new phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * + * @param string $voiceApplicationSid The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setVoiceApplicationSid(string $voiceApplicationSid): self + { + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + return $this; + } + + /** + * Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * + * @param string $voiceUrl The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * + * @param string $identitySid The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * @return $this Fluent Builder + */ + public function setIdentitySid(string $identitySid): self + { + $this->options['identitySid'] = $identitySid; + return $this; + } + + /** + * The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * + * @param string $addressSid The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * @param string $emergencyStatus + * @return $this Fluent Builder + */ + public function setEmergencyStatus(string $emergencyStatus): self + { + $this->options['emergencyStatus'] = $emergencyStatus; + return $this; + } + + /** + * The SID of the emergency address configuration to use for emergency calling from the new phone number. + * + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from the new phone number. + * @return $this Fluent Builder + */ + public function setEmergencyAddressSid(string $emergencyAddressSid): self + { + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + return $this; + } + + /** + * The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * + * @param string $trunkSid The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setTrunkSid(string $trunkSid): self + { + $this->options['trunkSid'] = $trunkSid; + return $this; + } + + /** + * @param string $voiceReceiveMode + * @return $this Fluent Builder + */ + public function setVoiceReceiveMode(string $voiceReceiveMode): self + { + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + return $this; + } + + /** + * The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * @return $this Fluent Builder + */ + public function setBundleSid(string $bundleSid): self + { + $this->options['bundleSid'] = $bundleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateMobileOptions ' . $options . ']'; + } +} + +class ReadMobileOptions extends Options + { + /** + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @param string $friendlyName A string that identifies the resources to read. + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + */ + public function __construct( + + bool $beta = Values::BOOL_NONE, + string $friendlyName = Values::NONE, + string $phoneNumber = Values::NONE, + string $origin = Values::NONE + + ) { + $this->options['beta'] = $beta; + $this->options['friendlyName'] = $friendlyName; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['origin'] = $origin; + } + + /** + * Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * A string that identifies the resources to read. + * + * @param string $friendlyName A string that identifies the resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * @return $this Fluent Builder + */ + public function setOrigin(string $origin): self + { + $this->options['origin'] = $origin; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMobileOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobilePage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobilePage.php new file mode 100755 index 0000000..3037fbd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/MobilePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MobileInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumber\MobileInstance + */ + public function buildInstance(array $payload): MobileInstance + { + return new MobileInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MobilePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeInstance.php new file mode 100755 index 0000000..e3be2d3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'identitySid' => Values::array_get($payload, 'identity_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'origin' => Values::array_get($payload, 'origin'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceReceiveMode' => Values::array_get($payload, 'voice_receive_mode'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'emergencyStatus' => Values::array_get($payload, 'emergency_status'), + 'emergencyAddressSid' => Values::array_get($payload, 'emergency_address_sid'), + 'emergencyAddressStatus' => Values::array_get($payload, 'emergency_address_status'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'status' => Values::array_get($payload, 'status'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreeInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeList.php new file mode 100755 index 0000000..802d9a3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeList.php @@ -0,0 +1,238 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/TollFree.json'; + } + + /** + * Create the TollFreeInstance + * + * @param string $phoneNumber The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * @param array|Options $options Optional Arguments + * @return TollFreeInstance Created TollFreeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber, array $options = []): TollFreeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + 'ApiVersion' => + $options['apiVersion'], + 'FriendlyName' => + $options['friendlyName'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceApplicationSid' => + $options['voiceApplicationSid'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'IdentitySid' => + $options['identitySid'], + 'AddressSid' => + $options['addressSid'], + 'EmergencyStatus' => + $options['emergencyStatus'], + 'EmergencyAddressSid' => + $options['emergencyAddressSid'], + 'TrunkSid' => + $options['trunkSid'], + 'VoiceReceiveMode' => + $options['voiceReceiveMode'], + 'BundleSid' => + $options['bundleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TollFreeInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads TollFreeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TollFreeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TollFreeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TollFreeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TollFreePage Page of TollFreeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TollFreePage + { + $options = new Values($options); + + $params = Values::of([ + 'Beta' => + Serialize::booleanToString($options['beta']), + 'FriendlyName' => + $options['friendlyName'], + 'PhoneNumber' => + $options['phoneNumber'], + 'Origin' => + $options['origin'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TollFreePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TollFreeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TollFreePage Page of TollFreeInstance + */ + public function getPage(string $targetUrl): TollFreePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TollFreePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreeList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeOptions.php new file mode 100755 index 0000000..cc36402 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreeOptions.php @@ -0,0 +1,556 @@ +options['apiVersion'] = $apiVersion; + $this->options['friendlyName'] = $friendlyName; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['identitySid'] = $identitySid; + $this->options['addressSid'] = $addressSid; + $this->options['emergencyStatus'] = $emergencyStatus; + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + $this->options['trunkSid'] = $trunkSid; + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + $this->options['bundleSid'] = $bundleSid; + } + + /** + * The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * + * @param string $apiVersion The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * + * @param string $friendlyName A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + * + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all `sms_*_url` values and use those of the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call when the new phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the new phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * + * @param string $voiceApplicationSid The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setVoiceApplicationSid(string $voiceApplicationSid): self + { + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + return $this; + } + + /** + * Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * + * @param string $voiceUrl The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The SID of the Identity resource that we should associate with the new phone number. Some regions require an Identity to meet local regulations. + * + * @param string $identitySid The SID of the Identity resource that we should associate with the new phone number. Some regions require an Identity to meet local regulations. + * @return $this Fluent Builder + */ + public function setIdentitySid(string $identitySid): self + { + $this->options['identitySid'] = $identitySid; + return $this; + } + + /** + * The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * + * @param string $addressSid The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * @param string $emergencyStatus + * @return $this Fluent Builder + */ + public function setEmergencyStatus(string $emergencyStatus): self + { + $this->options['emergencyStatus'] = $emergencyStatus; + return $this; + } + + /** + * The SID of the emergency address configuration to use for emergency calling from the new phone number. + * + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from the new phone number. + * @return $this Fluent Builder + */ + public function setEmergencyAddressSid(string $emergencyAddressSid): self + { + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + return $this; + } + + /** + * The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * + * @param string $trunkSid The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setTrunkSid(string $trunkSid): self + { + $this->options['trunkSid'] = $trunkSid; + return $this; + } + + /** + * @param string $voiceReceiveMode + * @return $this Fluent Builder + */ + public function setVoiceReceiveMode(string $voiceReceiveMode): self + { + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + return $this; + } + + /** + * The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * @return $this Fluent Builder + */ + public function setBundleSid(string $bundleSid): self + { + $this->options['bundleSid'] = $bundleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateTollFreeOptions ' . $options . ']'; + } +} + +class ReadTollFreeOptions extends Options + { + /** + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @param string $friendlyName A string that identifies the resources to read. + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + */ + public function __construct( + + bool $beta = Values::BOOL_NONE, + string $friendlyName = Values::NONE, + string $phoneNumber = Values::NONE, + string $origin = Values::NONE + + ) { + $this->options['beta'] = $beta; + $this->options['friendlyName'] = $friendlyName; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['origin'] = $origin; + } + + /** + * Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * A string that identifies the resources to read. + * + * @param string $friendlyName A string that identifies the resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * @return $this Fluent Builder + */ + public function setOrigin(string $origin): self + { + $this->options['origin'] = $origin; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadTollFreeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreePage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreePage.php new file mode 100755 index 0000000..9559f85 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumber/TollFreePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TollFreeInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumber\TollFreeInstance + */ + public function buildInstance(array $payload): TollFreeInstance + { + return new TollFreeInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TollFreePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberContext.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberContext.php new file mode 100755 index 0000000..891f73a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberContext.php @@ -0,0 +1,234 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the IncomingPhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IncomingPhoneNumberInstance + * + * @return IncomingPhoneNumberInstance Fetched IncomingPhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IncomingPhoneNumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IncomingPhoneNumberInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the IncomingPhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return IncomingPhoneNumberInstance Updated IncomingPhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IncomingPhoneNumberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AccountSid' => + $options['accountSid'], + 'ApiVersion' => + $options['apiVersion'], + 'FriendlyName' => + $options['friendlyName'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceApplicationSid' => + $options['voiceApplicationSid'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'EmergencyStatus' => + $options['emergencyStatus'], + 'EmergencyAddressSid' => + $options['emergencyAddressSid'], + 'TrunkSid' => + $options['trunkSid'], + 'VoiceReceiveMode' => + $options['voiceReceiveMode'], + 'IdentitySid' => + $options['identitySid'], + 'AddressSid' => + $options['addressSid'], + 'BundleSid' => + $options['bundleSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new IncomingPhoneNumberInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the assignedAddOns + */ + protected function getAssignedAddOns(): AssignedAddOnList + { + if (!$this->_assignedAddOns) { + $this->_assignedAddOns = new AssignedAddOnList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_assignedAddOns; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IncomingPhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberInstance.php new file mode 100755 index 0000000..5bcc665 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberInstance.php @@ -0,0 +1,222 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'identitySid' => Values::array_get($payload, 'identity_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'origin' => Values::array_get($payload, 'origin'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceReceiveMode' => Values::array_get($payload, 'voice_receive_mode'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'emergencyStatus' => Values::array_get($payload, 'emergency_status'), + 'emergencyAddressSid' => Values::array_get($payload, 'emergency_address_sid'), + 'emergencyAddressStatus' => Values::array_get($payload, 'emergency_address_status'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'status' => Values::array_get($payload, 'status'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IncomingPhoneNumberContext Context for this IncomingPhoneNumberInstance + */ + protected function proxy(): IncomingPhoneNumberContext + { + if (!$this->context) { + $this->context = new IncomingPhoneNumberContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IncomingPhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IncomingPhoneNumberInstance + * + * @return IncomingPhoneNumberInstance Fetched IncomingPhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IncomingPhoneNumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the IncomingPhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return IncomingPhoneNumberInstance Updated IncomingPhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IncomingPhoneNumberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the assignedAddOns + */ + protected function getAssignedAddOns(): AssignedAddOnList + { + return $this->proxy()->assignedAddOns; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IncomingPhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberList.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberList.php new file mode 100755 index 0000000..2d646c8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberList.php @@ -0,0 +1,346 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/IncomingPhoneNumbers.json'; + } + + /** + * Create the IncomingPhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return IncomingPhoneNumberInstance Created IncomingPhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): IncomingPhoneNumberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ApiVersion' => + $options['apiVersion'], + 'FriendlyName' => + $options['friendlyName'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'VoiceApplicationSid' => + $options['voiceApplicationSid'], + 'VoiceCallerIdLookup' => + Serialize::booleanToString($options['voiceCallerIdLookup']), + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'EmergencyStatus' => + $options['emergencyStatus'], + 'EmergencyAddressSid' => + $options['emergencyAddressSid'], + 'TrunkSid' => + $options['trunkSid'], + 'IdentitySid' => + $options['identitySid'], + 'AddressSid' => + $options['addressSid'], + 'VoiceReceiveMode' => + $options['voiceReceiveMode'], + 'BundleSid' => + $options['bundleSid'], + 'PhoneNumber' => + $options['phoneNumber'], + 'AreaCode' => + $options['areaCode'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IncomingPhoneNumberInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads IncomingPhoneNumberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IncomingPhoneNumberInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams IncomingPhoneNumberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IncomingPhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IncomingPhoneNumberPage Page of IncomingPhoneNumberInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IncomingPhoneNumberPage + { + $options = new Values($options); + + $params = Values::of([ + 'Beta' => + Serialize::booleanToString($options['beta']), + 'FriendlyName' => + $options['friendlyName'], + 'PhoneNumber' => + $options['phoneNumber'], + 'Origin' => + $options['origin'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IncomingPhoneNumberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IncomingPhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IncomingPhoneNumberPage Page of IncomingPhoneNumberInstance + */ + public function getPage(string $targetUrl): IncomingPhoneNumberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IncomingPhoneNumberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IncomingPhoneNumberContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the IncomingPhoneNumber resource to delete. + */ + public function getContext( + string $sid + + ): IncomingPhoneNumberContext + { + return new IncomingPhoneNumberContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Access the tollFree + */ + protected function getTollFree(): TollFreeList + { + if (!$this->_tollFree) { + $this->_tollFree = new TollFreeList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_tollFree; + } + + /** + * Access the local + */ + protected function getLocal(): LocalList + { + if (!$this->_local) { + $this->_local = new LocalList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_local; + } + + /** + * Access the mobile + */ + protected function getMobile(): MobileList + { + if (!$this->_mobile) { + $this->_mobile = new MobileList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_mobile; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IncomingPhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberOptions.php new file mode 100755 index 0000000..b2bc365 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberOptions.php @@ -0,0 +1,1040 @@ +options['phoneNumber'] = $phoneNumber; + $this->options['areaCode'] = $areaCode; + $this->options['apiVersion'] = $apiVersion; + $this->options['friendlyName'] = $friendlyName; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['emergencyStatus'] = $emergencyStatus; + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + $this->options['trunkSid'] = $trunkSid; + $this->options['identitySid'] = $identitySid; + $this->options['addressSid'] = $addressSid; + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + $this->options['bundleSid'] = $bundleSid; + } + + /** + * The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * + * @param string $phoneNumber The phone number to purchase specified in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * The desired area code for your new incoming phone number. Can be any three-digit, US or Canada area code. We will provision an available phone number within this area code for you. **You must provide an `area_code` or a `phone_number`.** (US and Canada only). + * + * @param string $areaCode The desired area code for your new incoming phone number. Can be any three-digit, US or Canada area code. We will provision an available phone number within this area code for you. **You must provide an `area_code` or a `phone_number`.** (US and Canada only). + * @return $this Fluent Builder + */ + public function setAreaCode(string $areaCode): self + { + $this->options['areaCode'] = $areaCode; + return $this; + } + + /** + * The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * + * @param string $apiVersion The API version to use for incoming calls made to the new phone number. The default is `2010-04-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the new phone number. + * + * @param string $friendlyName A descriptive string that you created to describe the new phone number. It can be up to 64 characters long. By default, this is a formatted version of the new phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the new phone number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call when the new phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the new phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * + * @param string $voiceApplicationSid The SID of the application we should use to handle calls to the new phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setVoiceApplicationSid(string $voiceApplicationSid): self + { + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + return $this; + } + + /** + * Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * + * @param string $voiceUrl The URL that we should call to answer a call to the new phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * @param string $emergencyStatus + * @return $this Fluent Builder + */ + public function setEmergencyStatus(string $emergencyStatus): self + { + $this->options['emergencyStatus'] = $emergencyStatus; + return $this; + } + + /** + * The SID of the emergency address configuration to use for emergency calling from the new phone number. + * + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from the new phone number. + * @return $this Fluent Builder + */ + public function setEmergencyAddressSid(string $emergencyAddressSid): self + { + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + return $this; + } + + /** + * The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * + * @param string $trunkSid The SID of the Trunk we should use to handle calls to the new phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setTrunkSid(string $trunkSid): self + { + $this->options['trunkSid'] = $trunkSid; + return $this; + } + + /** + * The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * + * @param string $identitySid The SID of the Identity resource that we should associate with the new phone number. Some regions require an identity to meet local regulations. + * @return $this Fluent Builder + */ + public function setIdentitySid(string $identitySid): self + { + $this->options['identitySid'] = $identitySid; + return $this; + } + + /** + * The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * + * @param string $addressSid The SID of the Address resource we should associate with the new phone number. Some regions require addresses to meet local regulations. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * @param string $voiceReceiveMode + * @return $this Fluent Builder + */ + public function setVoiceReceiveMode(string $voiceReceiveMode): self + { + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + return $this; + } + + /** + * The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * @return $this Fluent Builder + */ + public function setBundleSid(string $bundleSid): self + { + $this->options['bundleSid'] = $bundleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateIncomingPhoneNumberOptions ' . $options . ']'; + } +} + + + +class ReadIncomingPhoneNumberOptions extends Options + { + /** + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @param string $friendlyName A string that identifies the IncomingPhoneNumber resources to read. + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + */ + public function __construct( + + bool $beta = Values::BOOL_NONE, + string $friendlyName = Values::NONE, + string $phoneNumber = Values::NONE, + string $origin = Values::NONE + + ) { + $this->options['beta'] = $beta; + $this->options['friendlyName'] = $friendlyName; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['origin'] = $origin; + } + + /** + * Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * + * @param bool $beta Whether to include phone numbers new to the Twilio platform. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setBeta(bool $beta): self + { + $this->options['beta'] = $beta; + return $this; + } + + /** + * A string that identifies the IncomingPhoneNumber resources to read. + * + * @param string $friendlyName A string that identifies the IncomingPhoneNumber resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * + * @param string $phoneNumber The phone numbers of the IncomingPhoneNumber resources to read. You can specify partial numbers and use '*' as a wildcard for any digit. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * + * @param string $origin Whether to include phone numbers based on their origin. Can be: `twilio` or `hosted`. By default, phone numbers of all origin are included. + * @return $this Fluent Builder + */ + public function setOrigin(string $origin): self + { + $this->options['origin'] = $origin; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadIncomingPhoneNumberOptions ' . $options . ']'; + } +} + +class UpdateIncomingPhoneNumberOptions extends Options + { + /** + * @param string $accountSid The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + * @param string $apiVersion The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + * @param string $friendlyName A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $smsUrl The URL we should call when the phone number receives an incoming SMS message. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $voiceApplicationSid The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $voiceUrl The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @param string $emergencyStatus + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from this phone number. + * @param string $trunkSid The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @param string $voiceReceiveMode + * @param string $identitySid The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + * @param string $addressSid The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + */ + public function __construct( + + string $accountSid = Values::NONE, + string $apiVersion = Values::NONE, + string $friendlyName = Values::NONE, + string $smsApplicationSid = Values::NONE, + string $smsFallbackMethod = Values::NONE, + string $smsFallbackUrl = Values::NONE, + string $smsMethod = Values::NONE, + string $smsUrl = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + string $voiceApplicationSid = Values::NONE, + bool $voiceCallerIdLookup = Values::BOOL_NONE, + string $voiceFallbackMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceUrl = Values::NONE, + string $emergencyStatus = Values::NONE, + string $emergencyAddressSid = Values::NONE, + string $trunkSid = Values::NONE, + string $voiceReceiveMode = Values::NONE, + string $identitySid = Values::NONE, + string $addressSid = Values::NONE, + string $bundleSid = Values::NONE + + ) { + $this->options['accountSid'] = $accountSid; + $this->options['apiVersion'] = $apiVersion; + $this->options['friendlyName'] = $friendlyName; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['emergencyStatus'] = $emergencyStatus; + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + $this->options['trunkSid'] = $trunkSid; + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + $this->options['identitySid'] = $identitySid; + $this->options['addressSid'] = $addressSid; + $this->options['bundleSid'] = $bundleSid; + } + + /** + * The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + * + * @param string $accountSid The SID of the [Account](https://www.twilio.com/docs/iam/api/account) that created the IncomingPhoneNumber resource to update. For more information, see [Exchanging Numbers Between Subaccounts](https://www.twilio.com/docs/iam/api/subaccounts#exchanging-numbers). + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + * + * @param string $apiVersion The API version to use for incoming calls made to the phone number. The default is `2010-04-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * + * @param string $friendlyName A descriptive string that you created to describe this phone number. It can be up to 64 characters long. By default, this is a formatted version of the phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * + * @param string $smsApplicationSid The SID of the application that should handle SMS messages sent to the number. If an `sms_application_sid` is present, we ignore all of the `sms_*_url` urls and use those set on the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call `sms_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call when an error occurs while requesting or executing the TwiML defined by `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $smsMethod The HTTP method that we should use to call `sms_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call when the phone number receives an incoming SMS message. + * + * @param string $smsUrl The URL we should call when the phone number receives an incoming SMS message. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * + * @param string $voiceApplicationSid The SID of the application we should use to handle phone calls to the phone number. If a `voice_application_sid` is present, we ignore all of the voice urls and use only those set on the application. Setting a `voice_application_sid` will automatically delete your `trunk_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setVoiceApplicationSid(string $voiceApplicationSid): self + { + $this->options['voiceApplicationSid'] = $voiceApplicationSid; + return $this; + } + + /** + * Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * + * @param bool $voiceCallerIdLookup Whether to lookup the caller's name from the CNAM database and post it to your app. Can be: `true` or `false` and defaults to `false`. + * @return $this Fluent Builder + */ + public function setVoiceCallerIdLookup(bool $voiceCallerIdLookup): self + { + $this->options['voiceCallerIdLookup'] = $voiceCallerIdLookup; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceFallbackMethod The HTTP method that we should use to call `voice_fallback_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs retrieving or executing the TwiML requested by `url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $voiceMethod The HTTP method that we should use to call `voice_url`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * + * @param string $voiceUrl The URL that we should call to answer a call to the phone number. The `voice_url` will not be called if a `voice_application_sid` or a `trunk_sid` is set. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * @param string $emergencyStatus + * @return $this Fluent Builder + */ + public function setEmergencyStatus(string $emergencyStatus): self + { + $this->options['emergencyStatus'] = $emergencyStatus; + return $this; + } + + /** + * The SID of the emergency address configuration to use for emergency calling from this phone number. + * + * @param string $emergencyAddressSid The SID of the emergency address configuration to use for emergency calling from this phone number. + * @return $this Fluent Builder + */ + public function setEmergencyAddressSid(string $emergencyAddressSid): self + { + $this->options['emergencyAddressSid'] = $emergencyAddressSid; + return $this; + } + + /** + * The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * + * @param string $trunkSid The SID of the Trunk we should use to handle phone calls to the phone number. If a `trunk_sid` is present, we ignore all of the voice urls and voice applications and use only those set on the Trunk. Setting a `trunk_sid` will automatically delete your `voice_application_sid` and vice versa. + * @return $this Fluent Builder + */ + public function setTrunkSid(string $trunkSid): self + { + $this->options['trunkSid'] = $trunkSid; + return $this; + } + + /** + * @param string $voiceReceiveMode + * @return $this Fluent Builder + */ + public function setVoiceReceiveMode(string $voiceReceiveMode): self + { + $this->options['voiceReceiveMode'] = $voiceReceiveMode; + return $this; + } + + /** + * The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + * + * @param string $identitySid The SID of the Identity resource that we should associate with the phone number. Some regions require an identity to meet local regulations. + * @return $this Fluent Builder + */ + public function setIdentitySid(string $identitySid): self + { + $this->options['identitySid'] = $identitySid; + return $this; + } + + /** + * The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + * + * @param string $addressSid The SID of the Address resource we should associate with the phone number. Some regions require addresses to meet local regulations. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * + * @param string $bundleSid The SID of the Bundle resource that you associate with the phone number. Some regions require a Bundle to meet local Regulations. + * @return $this Fluent Builder + */ + public function setBundleSid(string $bundleSid): self + { + $this->options['bundleSid'] = $bundleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateIncomingPhoneNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberPage.php b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberPage.php new file mode 100755 index 0000000..48beab9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/IncomingPhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IncomingPhoneNumberInstance \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberInstance + */ + public function buildInstance(array $payload): IncomingPhoneNumberInstance + { + return new IncomingPhoneNumberInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IncomingPhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/KeyContext.php b/app/api/Twilio/Rest/Api/V2010/Account/KeyContext.php new file mode 100755 index 0000000..6ffd21c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/KeyContext.php @@ -0,0 +1,130 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Keys/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the KeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the KeyInstance + * + * @return KeyInstance Fetched KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): KeyInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new KeyInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the KeyInstance + * + * @param array|Options $options Optional Arguments + * @return KeyInstance Updated KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): KeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new KeyInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.KeyContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/KeyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/KeyInstance.php new file mode 100755 index 0000000..2328d1a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/KeyInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return KeyContext Context for this KeyInstance + */ + protected function proxy(): KeyContext + { + if (!$this->context) { + $this->context = new KeyContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the KeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the KeyInstance + * + * @return KeyInstance Fetched KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): KeyInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the KeyInstance + * + * @param array|Options $options Optional Arguments + * @return KeyInstance Updated KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): KeyInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.KeyInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/KeyList.php b/app/api/Twilio/Rest/Api/V2010/Account/KeyList.php new file mode 100755 index 0000000..82d7412 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/KeyList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Keys.json'; + } + + /** + * Reads KeyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return KeyInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams KeyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of KeyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return KeyPage Page of KeyInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): KeyPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new KeyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of KeyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return KeyPage Page of KeyInstance + */ + public function getPage(string $targetUrl): KeyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new KeyPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a KeyContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Key resource to delete. + */ + public function getContext( + string $sid + + ): KeyContext + { + return new KeyContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.KeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/KeyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/KeyOptions.php new file mode 100755 index 0000000..def1c76 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/KeyOptions.php @@ -0,0 +1,82 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/KeyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/KeyPage.php new file mode 100755 index 0000000..868e632 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/KeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return KeyInstance \Twilio\Rest\Api\V2010\Account\KeyInstance + */ + public function buildInstance(array $payload): KeyInstance + { + return new KeyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.KeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackInstance.php new file mode 100755 index 0000000..403888d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackInstance.php @@ -0,0 +1,93 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'messageSid' => Values::array_get($payload, 'message_sid'), + 'outcome' => Values::array_get($payload, 'outcome'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'messageSid' => $messageSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackList.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackList.php new file mode 100755 index 0000000..68df509 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackList.php @@ -0,0 +1,94 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'messageSid' => + $messageSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Feedback.json'; + } + + /** + * Create the FeedbackInstance + * + * @param array|Options $options Optional Arguments + * @return FeedbackInstance Created FeedbackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): FeedbackInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Outcome' => + $options['outcome'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FeedbackInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['messageSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackOptions.php new file mode 100755 index 0000000..ab46991 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackOptions.php @@ -0,0 +1,74 @@ +options['outcome'] = $outcome; + } + + /** + * @param string $outcome + * @return $this Fluent Builder + */ + public function setOutcome(string $outcome): self + { + $this->options['outcome'] = $outcome; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateFeedbackOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackPage.php new file mode 100755 index 0000000..d421539 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/FeedbackPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FeedbackInstance \Twilio\Rest\Api\V2010\Account\Message\FeedbackInstance + */ + public function buildInstance(array $payload): FeedbackInstance + { + return new FeedbackInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['messageSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.FeedbackPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaContext.php new file mode 100755 index 0000000..7694889 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'messageSid' => + $messageSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Media/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the MediaInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MediaInstance + * + * @return MediaInstance Fetched MediaInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MediaInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MediaContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaInstance.php new file mode 100755 index 0000000..b0d9f46 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'contentType' => Values::array_get($payload, 'content_type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'parentSid' => Values::array_get($payload, 'parent_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'messageSid' => $messageSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MediaContext Context for this MediaInstance + */ + protected function proxy(): MediaContext + { + if (!$this->context) { + $this->context = new MediaContext( + $this->version, + $this->solution['accountSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MediaInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MediaInstance + * + * @return MediaInstance Fetched MediaInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MediaInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaList.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaList.php new file mode 100755 index 0000000..712d89f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaList.php @@ -0,0 +1,187 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'messageSid' => + $messageSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Media.json'; + } + + /** + * Reads MediaInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MediaInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MediaInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MediaInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MediaPage Page of MediaInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MediaPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreated<' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateCreated>' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MediaPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MediaInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MediaPage Page of MediaInstance + */ + public function getPage(string $targetUrl): MediaPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MediaPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MediaContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Media resource to delete + */ + public function getContext( + string $sid + + ): MediaContext + { + return new MediaContext( + $this->version, + $this->solution['accountSid'], + $this->solution['messageSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MediaList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaOptions.php new file mode 100755 index 0000000..ea3ac40 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaOptions.php @@ -0,0 +1,116 @@ +=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @param string $dateCreated Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @param string $dateCreatedAfter Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @return ReadMediaOptions Options builder + */ + public static function read( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ): ReadMediaOptions + { + return new ReadMediaOptions( + $dateCreatedBefore, + $dateCreated, + $dateCreatedAfter + ); + } + +} + + + +class ReadMediaOptions extends Options + { + /** + * @param string $dateCreatedBefore Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @param string $dateCreated Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @param string $dateCreatedAfter Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + */ + public function __construct( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null + + ) { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + } + + /** + * Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * + * @param string $dateCreatedBefore Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(string $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * + * @param string $dateCreated Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreated(string $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * + * @param string $dateCreatedAfter Only include media that was created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read media that was created on this date. You can also specify an inequality, such as `StartTime<=YYYY-MM-DD`, to read media that was created on or before midnight of this date, and `StartTime>=YYYY-MM-DD` to read media that was created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(string $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMediaOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaPage.php new file mode 100755 index 0000000..660208a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Message/MediaPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MediaInstance \Twilio\Rest\Api\V2010\Account\Message\MediaInstance + */ + public function buildInstance(array $payload): MediaInstance + { + return new MediaInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['messageSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MediaPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/MessageContext.php b/app/api/Twilio/Rest/Api/V2010/Account/MessageContext.php new file mode 100755 index 0000000..c87d1cf --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/MessageContext.php @@ -0,0 +1,210 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Messages/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the feedback + */ + protected function getFeedback(): FeedbackList + { + if (!$this->_feedback) { + $this->_feedback = new FeedbackList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_feedback; + } + + /** + * Access the media + */ + protected function getMedia(): MediaList + { + if (!$this->_media) { + $this->_media = new MediaList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_media; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/MessageInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/MessageInstance.php new file mode 100755 index 0000000..446c168 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/MessageInstance.php @@ -0,0 +1,203 @@ +properties = [ + 'body' => Values::array_get($payload, 'body'), + 'numSegments' => Values::array_get($payload, 'num_segments'), + 'direction' => Values::array_get($payload, 'direction'), + 'from' => Values::array_get($payload, 'from'), + 'to' => Values::array_get($payload, 'to'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'price' => Values::array_get($payload, 'price'), + 'errorMessage' => Values::array_get($payload, 'error_message'), + 'uri' => Values::array_get($payload, 'uri'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'numMedia' => Values::array_get($payload, 'num_media'), + 'status' => Values::array_get($payload, 'status'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateSent' => Deserialize::dateTime(Values::array_get($payload, 'date_sent')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the feedback + */ + protected function getFeedback(): FeedbackList + { + return $this->proxy()->feedback; + } + + /** + * Access the media + */ + protected function getMedia(): MediaList + { + return $this->proxy()->media; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/MessageList.php b/app/api/Twilio/Rest/Api/V2010/Account/MessageList.php new file mode 100755 index 0000000..a8eb107 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/MessageList.php @@ -0,0 +1,255 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Messages.json'; + } + + /** + * Create the MessageInstance + * + * @param string $to The destination phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format for SMS/MMS or [Channel user address](https://www.twilio.com/docs/sms/channels#channel-addresses) for other 3rd-party channels. + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'StatusCallback' => + $options['statusCallback'], + 'ApplicationSid' => + $options['applicationSid'], + 'MaxPrice' => + $options['maxPrice'], + 'ProvideFeedback' => + Serialize::booleanToString($options['provideFeedback']), + 'Attempt' => + $options['attempt'], + 'ValidityPeriod' => + $options['validityPeriod'], + 'ForceDelivery' => + Serialize::booleanToString($options['forceDelivery']), + 'ContentRetention' => + $options['contentRetention'], + 'AddressRetention' => + $options['addressRetention'], + 'SmartEncoded' => + Serialize::booleanToString($options['smartEncoded']), + 'PersistentAction' => + Serialize::map($options['persistentAction'], function ($e) { return $e; }), + 'ShortenUrls' => + Serialize::booleanToString($options['shortenUrls']), + 'ScheduleType' => + $options['scheduleType'], + 'SendAt' => + Serialize::iso8601DateTime($options['sendAt']), + 'SendAsMms' => + Serialize::booleanToString($options['sendAsMms']), + 'ContentSid' => + $options['contentSid'], + 'ContentVariables' => + $options['contentVariables'], + 'From' => + $options['from'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'Body' => + $options['body'], + 'MediaUrl' => + Serialize::map($options['mediaUrl'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'To' => + $options['to'], + 'From' => + $options['from'], + 'DateSent<' => + Serialize::iso8601DateTime($options['dateSentBefore']), + 'DateSent' => + Serialize::iso8601DateTime($options['dateSent']), + 'DateSent>' => + Serialize::iso8601DateTime($options['dateSentAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Message resource to delete. + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/MessageOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/MessageOptions.php new file mode 100755 index 0000000..efcf433 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/MessageOptions.php @@ -0,0 +1,626 @@ +=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @param string $dateSent The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @param string $dateSentAfter The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @return ReadMessageOptions Options builder + */ + public static function read( + + string $to = Values::NONE, + string $from = Values::NONE, + string $dateSentBefore = null, + string $dateSent = null, + string $dateSentAfter = null + + ): ReadMessageOptions + { + return new ReadMessageOptions( + $to, + $from, + $dateSentBefore, + $dateSent, + $dateSentAfter + ); + } + + /** + * @param string $body The text of the message you want to send. Can be up to 1,600 characters long. + * @param string $status + * @return UpdateMessageOptions Options builder + */ + public static function update( + + string $body = Values::NONE, + string $status = Values::NONE + + ): UpdateMessageOptions + { + return new UpdateMessageOptions( + $body, + $status + ); + } + +} + +class CreateMessageOptions extends Options + { + /** + * @param string $from A Twilio phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, an [alphanumeric sender ID](https://www.twilio.com/docs/sms/send-messages#use-an-alphanumeric-sender-id), or a [Channel Endpoint address](https://www.twilio.com/docs/sms/channels#channel-addresses) that is enabled for the type of message you want to send. Phone numbers or [short codes](https://www.twilio.com/docs/sms/api/short-code) purchased from Twilio also work here. You cannot, for example, spoof messages from a private cell phone number. If you are using `messaging_service_sid`, this parameter must be empty. + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services#send-a-message-with-copilot) you want to associate with the Message. Set this parameter to use the [Messaging Service Settings and Copilot Features](https://www.twilio.com/console/sms/services) you have configured and leave the `from` parameter empty. When only this parameter is set, Twilio will use your enabled Copilot Features to select the `from` phone number for delivery. + * @param string $body The text of the message you want to send. Can be up to 1,600 characters in length. + * @param string[] $mediaUrl The URL of the media to send with the message. The media can be of type `gif`, `png`, and `jpeg` and will be formatted correctly on the recipient's device. The media size limit is 5MB for supported file types (JPEG, PNG, GIF) and 500KB for [other types](https://www.twilio.com/docs/sms/accepted-mime-types) of accepted media. To send more than one image in the message body, provide multiple `media_url` parameters in the POST request. You can include up to 10 `media_url` parameters per message. You can send images in an SMS message in only the US and Canada. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If specified, we POST these message status changes to the URL: `queued`, `failed`, `sent`, `delivered`, or `undelivered`. Twilio will POST its [standard request parameters](https://www.twilio.com/docs/sms/twiml#request-parameters) as well as some additional parameters including `MessageSid`, `MessageStatus`, and `ErrorCode`. If you include this parameter with the `messaging_service_sid`, we use this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/sms/services/api). URLs must contain a valid hostname and underscores are not allowed. + * @param string $applicationSid The SID of the application that should receive message status. We POST a `message_sid` parameter and a `message_status` parameter with a value of `sent` or `failed` to the [application](https://www.twilio.com/docs/usage/api/applications)'s `message_status_callback`. If a `status_callback` parameter is also passed, it will be ignored and the application's `message_status_callback` parameter will be used. + * @param string $maxPrice The maximum total price in US dollars that you will pay for the message to be delivered. Can be a decimal value that has up to 4 decimal places. All messages are queued for delivery and the message cost is checked before the message is sent. If the cost exceeds `max_price`, the message will fail and a status of `Failed` is sent to the status callback. If `MaxPrice` is not set, the message cost is not checked. + * @param bool $provideFeedback Whether to confirm delivery of the message. Set this value to `true` if you are sending messages that have a trackable user action and you intend to confirm delivery of the message using the [Message Feedback API](https://www.twilio.com/docs/sms/api/message-feedback-resource). This parameter is `false` by default. + * @param int $attempt Total number of attempts made ( including this ) to send out the message regardless of the provider used + * @param int $validityPeriod How long in seconds the message can remain in our outgoing message queue. After this period elapses, the message fails and we call your status callback. Can be between 1 and the default value of 14,400 seconds. After a message has been accepted by a carrier, however, we cannot guarantee that the message will not be queued after this period. We recommend that this value be at least 5 seconds. + * @param bool $forceDelivery Reserved + * @param string $contentRetention + * @param string $addressRetention + * @param bool $smartEncoded Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`. + * @param string[] $persistentAction Rich actions for Channels Messages. + * @param bool $shortenUrls Determines the usage of Click Tracking. Setting it to `true` will instruct Twilio to replace all links in the Message with a shortened version based on the associated Domain Sid and track clicks on them. If this parameter is not set on an API call, we will use the value set on the Messaging Service. If this parameter is not set and the value is not configured on the Messaging Service used this will default to `false`. + * @param string $scheduleType + * @param \DateTime $sendAt The time that Twilio will send the message. Must be in ISO 8601 format. + * @param bool $sendAsMms If set to True, Twilio will deliver the message as a single MMS message, regardless of the presence of media. + * @param string $contentSid The SID of the Content object returned at Content API content create time (https://www.twilio.com/docs/content-api/create-and-send-your-first-content-api-template#create-a-template). If this parameter is not specified, then the Content API will not be utilized. + * @param string $contentVariables Key-value pairs of variable names to substitution values, used alongside a content_sid. If not specified, Content API will default to the default variables defined at create time. + */ + public function __construct( + + string $from = Values::NONE, + string $messagingServiceSid = Values::NONE, + string $body = Values::NONE, + array $mediaUrl = Values::ARRAY_NONE, + string $statusCallback = Values::NONE, + string $applicationSid = Values::NONE, + string $maxPrice = Values::NONE, + bool $provideFeedback = Values::BOOL_NONE, + int $attempt = Values::INT_NONE, + int $validityPeriod = Values::INT_NONE, + bool $forceDelivery = Values::BOOL_NONE, + string $contentRetention = Values::NONE, + string $addressRetention = Values::NONE, + bool $smartEncoded = Values::BOOL_NONE, + array $persistentAction = Values::ARRAY_NONE, + bool $shortenUrls = Values::BOOL_NONE, + string $scheduleType = Values::NONE, + \DateTime $sendAt = null, + bool $sendAsMms = Values::BOOL_NONE, + string $contentSid = Values::NONE, + string $contentVariables = Values::NONE + + ) { + $this->options['from'] = $from; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['body'] = $body; + $this->options['mediaUrl'] = $mediaUrl; + $this->options['statusCallback'] = $statusCallback; + $this->options['applicationSid'] = $applicationSid; + $this->options['maxPrice'] = $maxPrice; + $this->options['provideFeedback'] = $provideFeedback; + $this->options['attempt'] = $attempt; + $this->options['validityPeriod'] = $validityPeriod; + $this->options['forceDelivery'] = $forceDelivery; + $this->options['contentRetention'] = $contentRetention; + $this->options['addressRetention'] = $addressRetention; + $this->options['smartEncoded'] = $smartEncoded; + $this->options['persistentAction'] = $persistentAction; + $this->options['shortenUrls'] = $shortenUrls; + $this->options['scheduleType'] = $scheduleType; + $this->options['sendAt'] = $sendAt; + $this->options['sendAsMms'] = $sendAsMms; + $this->options['contentSid'] = $contentSid; + $this->options['contentVariables'] = $contentVariables; + } + + /** + * A Twilio phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, an [alphanumeric sender ID](https://www.twilio.com/docs/sms/send-messages#use-an-alphanumeric-sender-id), or a [Channel Endpoint address](https://www.twilio.com/docs/sms/channels#channel-addresses) that is enabled for the type of message you want to send. Phone numbers or [short codes](https://www.twilio.com/docs/sms/api/short-code) purchased from Twilio also work here. You cannot, for example, spoof messages from a private cell phone number. If you are using `messaging_service_sid`, this parameter must be empty. + * + * @param string $from A Twilio phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, an [alphanumeric sender ID](https://www.twilio.com/docs/sms/send-messages#use-an-alphanumeric-sender-id), or a [Channel Endpoint address](https://www.twilio.com/docs/sms/channels#channel-addresses) that is enabled for the type of message you want to send. Phone numbers or [short codes](https://www.twilio.com/docs/sms/api/short-code) purchased from Twilio also work here. You cannot, for example, spoof messages from a private cell phone number. If you are using `messaging_service_sid`, this parameter must be empty. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services#send-a-message-with-copilot) you want to associate with the Message. Set this parameter to use the [Messaging Service Settings and Copilot Features](https://www.twilio.com/console/sms/services) you have configured and leave the `from` parameter empty. When only this parameter is set, Twilio will use your enabled Copilot Features to select the `from` phone number for delivery. + * + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services#send-a-message-with-copilot) you want to associate with the Message. Set this parameter to use the [Messaging Service Settings and Copilot Features](https://www.twilio.com/console/sms/services) you have configured and leave the `from` parameter empty. When only this parameter is set, Twilio will use your enabled Copilot Features to select the `from` phone number for delivery. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * The text of the message you want to send. Can be up to 1,600 characters in length. + * + * @param string $body The text of the message you want to send. Can be up to 1,600 characters in length. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The URL of the media to send with the message. The media can be of type `gif`, `png`, and `jpeg` and will be formatted correctly on the recipient's device. The media size limit is 5MB for supported file types (JPEG, PNG, GIF) and 500KB for [other types](https://www.twilio.com/docs/sms/accepted-mime-types) of accepted media. To send more than one image in the message body, provide multiple `media_url` parameters in the POST request. You can include up to 10 `media_url` parameters per message. You can send images in an SMS message in only the US and Canada. + * + * @param string[] $mediaUrl The URL of the media to send with the message. The media can be of type `gif`, `png`, and `jpeg` and will be formatted correctly on the recipient's device. The media size limit is 5MB for supported file types (JPEG, PNG, GIF) and 500KB for [other types](https://www.twilio.com/docs/sms/accepted-mime-types) of accepted media. To send more than one image in the message body, provide multiple `media_url` parameters in the POST request. You can include up to 10 `media_url` parameters per message. You can send images in an SMS message in only the US and Canada. + * @return $this Fluent Builder + */ + public function setMediaUrl(array $mediaUrl): self + { + $this->options['mediaUrl'] = $mediaUrl; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. If specified, we POST these message status changes to the URL: `queued`, `failed`, `sent`, `delivered`, or `undelivered`. Twilio will POST its [standard request parameters](https://www.twilio.com/docs/sms/twiml#request-parameters) as well as some additional parameters including `MessageSid`, `MessageStatus`, and `ErrorCode`. If you include this parameter with the `messaging_service_sid`, we use this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/sms/services/api). URLs must contain a valid hostname and underscores are not allowed. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. If specified, we POST these message status changes to the URL: `queued`, `failed`, `sent`, `delivered`, or `undelivered`. Twilio will POST its [standard request parameters](https://www.twilio.com/docs/sms/twiml#request-parameters) as well as some additional parameters including `MessageSid`, `MessageStatus`, and `ErrorCode`. If you include this parameter with the `messaging_service_sid`, we use this URL instead of the Status Callback URL of the [Messaging Service](https://www.twilio.com/docs/sms/services/api). URLs must contain a valid hostname and underscores are not allowed. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The SID of the application that should receive message status. We POST a `message_sid` parameter and a `message_status` parameter with a value of `sent` or `failed` to the [application](https://www.twilio.com/docs/usage/api/applications)'s `message_status_callback`. If a `status_callback` parameter is also passed, it will be ignored and the application's `message_status_callback` parameter will be used. + * + * @param string $applicationSid The SID of the application that should receive message status. We POST a `message_sid` parameter and a `message_status` parameter with a value of `sent` or `failed` to the [application](https://www.twilio.com/docs/usage/api/applications)'s `message_status_callback`. If a `status_callback` parameter is also passed, it will be ignored and the application's `message_status_callback` parameter will be used. + * @return $this Fluent Builder + */ + public function setApplicationSid(string $applicationSid): self + { + $this->options['applicationSid'] = $applicationSid; + return $this; + } + + /** + * The maximum total price in US dollars that you will pay for the message to be delivered. Can be a decimal value that has up to 4 decimal places. All messages are queued for delivery and the message cost is checked before the message is sent. If the cost exceeds `max_price`, the message will fail and a status of `Failed` is sent to the status callback. If `MaxPrice` is not set, the message cost is not checked. + * + * @param string $maxPrice The maximum total price in US dollars that you will pay for the message to be delivered. Can be a decimal value that has up to 4 decimal places. All messages are queued for delivery and the message cost is checked before the message is sent. If the cost exceeds `max_price`, the message will fail and a status of `Failed` is sent to the status callback. If `MaxPrice` is not set, the message cost is not checked. + * @return $this Fluent Builder + */ + public function setMaxPrice(string $maxPrice): self + { + $this->options['maxPrice'] = $maxPrice; + return $this; + } + + /** + * Whether to confirm delivery of the message. Set this value to `true` if you are sending messages that have a trackable user action and you intend to confirm delivery of the message using the [Message Feedback API](https://www.twilio.com/docs/sms/api/message-feedback-resource). This parameter is `false` by default. + * + * @param bool $provideFeedback Whether to confirm delivery of the message. Set this value to `true` if you are sending messages that have a trackable user action and you intend to confirm delivery of the message using the [Message Feedback API](https://www.twilio.com/docs/sms/api/message-feedback-resource). This parameter is `false` by default. + * @return $this Fluent Builder + */ + public function setProvideFeedback(bool $provideFeedback): self + { + $this->options['provideFeedback'] = $provideFeedback; + return $this; + } + + /** + * Total number of attempts made ( including this ) to send out the message regardless of the provider used + * + * @param int $attempt Total number of attempts made ( including this ) to send out the message regardless of the provider used + * @return $this Fluent Builder + */ + public function setAttempt(int $attempt): self + { + $this->options['attempt'] = $attempt; + return $this; + } + + /** + * How long in seconds the message can remain in our outgoing message queue. After this period elapses, the message fails and we call your status callback. Can be between 1 and the default value of 14,400 seconds. After a message has been accepted by a carrier, however, we cannot guarantee that the message will not be queued after this period. We recommend that this value be at least 5 seconds. + * + * @param int $validityPeriod How long in seconds the message can remain in our outgoing message queue. After this period elapses, the message fails and we call your status callback. Can be between 1 and the default value of 14,400 seconds. After a message has been accepted by a carrier, however, we cannot guarantee that the message will not be queued after this period. We recommend that this value be at least 5 seconds. + * @return $this Fluent Builder + */ + public function setValidityPeriod(int $validityPeriod): self + { + $this->options['validityPeriod'] = $validityPeriod; + return $this; + } + + /** + * Reserved + * + * @param bool $forceDelivery Reserved + * @return $this Fluent Builder + */ + public function setForceDelivery(bool $forceDelivery): self + { + $this->options['forceDelivery'] = $forceDelivery; + return $this; + } + + /** + * @param string $contentRetention + * @return $this Fluent Builder + */ + public function setContentRetention(string $contentRetention): self + { + $this->options['contentRetention'] = $contentRetention; + return $this; + } + + /** + * @param string $addressRetention + * @return $this Fluent Builder + */ + public function setAddressRetention(string $addressRetention): self + { + $this->options['addressRetention'] = $addressRetention; + return $this; + } + + /** + * Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`. + * + * @param bool $smartEncoded Whether to detect Unicode characters that have a similar GSM-7 character and replace them. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setSmartEncoded(bool $smartEncoded): self + { + $this->options['smartEncoded'] = $smartEncoded; + return $this; + } + + /** + * Rich actions for Channels Messages. + * + * @param string[] $persistentAction Rich actions for Channels Messages. + * @return $this Fluent Builder + */ + public function setPersistentAction(array $persistentAction): self + { + $this->options['persistentAction'] = $persistentAction; + return $this; + } + + /** + * Determines the usage of Click Tracking. Setting it to `true` will instruct Twilio to replace all links in the Message with a shortened version based on the associated Domain Sid and track clicks on them. If this parameter is not set on an API call, we will use the value set on the Messaging Service. If this parameter is not set and the value is not configured on the Messaging Service used this will default to `false`. + * + * @param bool $shortenUrls Determines the usage of Click Tracking. Setting it to `true` will instruct Twilio to replace all links in the Message with a shortened version based on the associated Domain Sid and track clicks on them. If this parameter is not set on an API call, we will use the value set on the Messaging Service. If this parameter is not set and the value is not configured on the Messaging Service used this will default to `false`. + * @return $this Fluent Builder + */ + public function setShortenUrls(bool $shortenUrls): self + { + $this->options['shortenUrls'] = $shortenUrls; + return $this; + } + + /** + * @param string $scheduleType + * @return $this Fluent Builder + */ + public function setScheduleType(string $scheduleType): self + { + $this->options['scheduleType'] = $scheduleType; + return $this; + } + + /** + * The time that Twilio will send the message. Must be in ISO 8601 format. + * + * @param \DateTime $sendAt The time that Twilio will send the message. Must be in ISO 8601 format. + * @return $this Fluent Builder + */ + public function setSendAt(\DateTime $sendAt): self + { + $this->options['sendAt'] = $sendAt; + return $this; + } + + /** + * If set to True, Twilio will deliver the message as a single MMS message, regardless of the presence of media. + * + * @param bool $sendAsMms If set to True, Twilio will deliver the message as a single MMS message, regardless of the presence of media. + * @return $this Fluent Builder + */ + public function setSendAsMms(bool $sendAsMms): self + { + $this->options['sendAsMms'] = $sendAsMms; + return $this; + } + + /** + * The SID of the Content object returned at Content API content create time (https://www.twilio.com/docs/content-api/create-and-send-your-first-content-api-template#create-a-template). If this parameter is not specified, then the Content API will not be utilized. + * + * @param string $contentSid The SID of the Content object returned at Content API content create time (https://www.twilio.com/docs/content-api/create-and-send-your-first-content-api-template#create-a-template). If this parameter is not specified, then the Content API will not be utilized. + * @return $this Fluent Builder + */ + public function setContentSid(string $contentSid): self + { + $this->options['contentSid'] = $contentSid; + return $this; + } + + /** + * Key-value pairs of variable names to substitution values, used alongside a content_sid. If not specified, Content API will default to the default variables defined at create time. + * + * @param string $contentVariables Key-value pairs of variable names to substitution values, used alongside a content_sid. If not specified, Content API will default to the default variables defined at create time. + * @return $this Fluent Builder + */ + public function setContentVariables(string $contentVariables): self + { + $this->options['contentVariables'] = $contentVariables; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateMessageOptions ' . $options . ']'; + } +} + + + +class ReadMessageOptions extends Options + { + /** + * @param string $to Read messages sent to only this phone number. + * @param string $from Read messages sent from only this phone number or alphanumeric sender ID. + * @param string $dateSentBefore The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @param string $dateSent The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @param string $dateSentAfter The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + */ + public function __construct( + + string $to = Values::NONE, + string $from = Values::NONE, + string $dateSentBefore = null, + string $dateSent = null, + string $dateSentAfter = null + + ) { + $this->options['to'] = $to; + $this->options['from'] = $from; + $this->options['dateSentBefore'] = $dateSentBefore; + $this->options['dateSent'] = $dateSent; + $this->options['dateSentAfter'] = $dateSentAfter; + } + + /** + * Read messages sent to only this phone number. + * + * @param string $to Read messages sent to only this phone number. + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * Read messages sent from only this phone number or alphanumeric sender ID. + * + * @param string $from Read messages sent from only this phone number or alphanumeric sender ID. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * + * @param string $dateSentBefore The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateSentBefore(string $dateSentBefore): self + { + $this->options['dateSentBefore'] = $dateSentBefore; + return $this; + } + + /** + * The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * + * @param string $dateSent The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateSent(string $dateSent): self + { + $this->options['dateSent'] = $dateSent; + return $this; + } + + /** + * The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * + * @param string $dateSentAfter The date of the messages to show. Specify a date as `YYYY-MM-DD` in GMT to read only messages sent on this date. For example: `2009-07-06`. You can also specify an inequality, such as `DateSent<=YYYY-MM-DD`, to read messages sent on or before midnight on a date, and `DateSent>=YYYY-MM-DD` to read messages sent on or after midnight on a date. + * @return $this Fluent Builder + */ + public function setDateSentAfter(string $dateSentAfter): self + { + $this->options['dateSentAfter'] = $dateSentAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $body The text of the message you want to send. Can be up to 1,600 characters long. + * @param string $status + */ + public function __construct( + + string $body = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['body'] = $body; + $this->options['status'] = $status; + } + + /** + * The text of the message you want to send. Can be up to 1,600 characters long. + * + * @param string $body The text of the message you want to send. Can be up to 1,600 characters long. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/MessagePage.php b/app/api/Twilio/Rest/Api/V2010/Account/MessagePage.php new file mode 100755 index 0000000..586d5ab --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\Api\V2010\Account\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewKeyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyInstance.php new file mode 100755 index 0000000..295fd35 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyInstance.php @@ -0,0 +1,90 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'secret' => Values::array_get($payload, 'secret'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewKeyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewKeyList.php b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyList.php new file mode 100755 index 0000000..e86d660 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyList.php @@ -0,0 +1,87 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Keys.json'; + } + + /** + * Create the NewKeyInstance + * + * @param array|Options $options Optional Arguments + * @return NewKeyInstance Created NewKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): NewKeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NewKeyInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewKeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewKeyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyOptions.php new file mode 100755 index 0000000..6dd16cc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyOptions.php @@ -0,0 +1,76 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateNewKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewKeyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyPage.php new file mode 100755 index 0000000..6d98b79 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewKeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NewKeyInstance \Twilio\Rest\Api\V2010\Account\NewKeyInstance + */ + public function buildInstance(array $payload): NewKeyInstance + { + return new NewKeyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewKeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyInstance.php new file mode 100755 index 0000000..d9d3787 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyInstance.php @@ -0,0 +1,90 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'secret' => Values::array_get($payload, 'secret'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewSigningKeyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyList.php b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyList.php new file mode 100755 index 0000000..aaba19c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyList.php @@ -0,0 +1,87 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SigningKeys.json'; + } + + /** + * Create the NewSigningKeyInstance + * + * @param array|Options $options Optional Arguments + * @return NewSigningKeyInstance Created NewSigningKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): NewSigningKeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NewSigningKeyInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewSigningKeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyOptions.php new file mode 100755 index 0000000..90d19b0 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyOptions.php @@ -0,0 +1,76 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateNewSigningKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyPage.php new file mode 100755 index 0000000..c45007f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NewSigningKeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NewSigningKeyInstance \Twilio\Rest\Api\V2010\Account\NewSigningKeyInstance + */ + public function buildInstance(array $payload): NewSigningKeyInstance + { + return new NewSigningKeyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NewSigningKeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NotificationContext.php b/app/api/Twilio/Rest/Api/V2010/Account/NotificationContext.php new file mode 100755 index 0000000..717b37f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NotificationContext.php @@ -0,0 +1,87 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Notifications/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.NotificationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NotificationInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/NotificationInstance.php new file mode 100755 index 0000000..3ef2f7f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NotificationInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'log' => Values::array_get($payload, 'log'), + 'messageDate' => Deserialize::dateTime(Values::array_get($payload, 'message_date')), + 'messageText' => Values::array_get($payload, 'message_text'), + 'moreInfo' => Values::array_get($payload, 'more_info'), + 'requestMethod' => Values::array_get($payload, 'request_method'), + 'requestUrl' => Values::array_get($payload, 'request_url'), + 'requestVariables' => Values::array_get($payload, 'request_variables'), + 'responseBody' => Values::array_get($payload, 'response_body'), + 'responseHeaders' => Values::array_get($payload, 'response_headers'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NotificationContext Context for this NotificationInstance + */ + protected function proxy(): NotificationContext + { + if (!$this->context) { + $this->context = new NotificationContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.NotificationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NotificationList.php b/app/api/Twilio/Rest/Api/V2010/Account/NotificationList.php new file mode 100755 index 0000000..a5e0cf1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NotificationList.php @@ -0,0 +1,182 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Notifications.json'; + } + + /** + * Reads NotificationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NotificationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams NotificationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NotificationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NotificationPage Page of NotificationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NotificationPage + { + $options = new Values($options); + + $params = Values::of([ + 'Log' => + $options['log'], + 'MessageDate<' => + Serialize::iso8601Date($options['messageDateBefore']), + 'MessageDate' => + Serialize::iso8601Date($options['messageDate']), + 'MessageDate>' => + Serialize::iso8601Date($options['messageDateAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NotificationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NotificationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NotificationPage Page of NotificationInstance + */ + public function getPage(string $targetUrl): NotificationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NotificationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a NotificationContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Notification resource to fetch. + */ + public function getContext( + string $sid + + ): NotificationContext + { + return new NotificationContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NotificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NotificationOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/NotificationOptions.php new file mode 100755 index 0000000..4079dd1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NotificationOptions.php @@ -0,0 +1,132 @@ +=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return ReadNotificationOptions Options builder + */ + public static function read( + + int $log = Values::INT_NONE, + string $messageDateBefore = null, + string $messageDate = null, + string $messageDateAfter = null + + ): ReadNotificationOptions + { + return new ReadNotificationOptions( + $log, + $messageDateBefore, + $messageDate, + $messageDateAfter + ); + } + +} + + +class ReadNotificationOptions extends Options + { + /** + * @param int $log Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * @param string $messageDateBefore Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + */ + public function __construct( + + int $log = Values::INT_NONE, + string $messageDateBefore = null, + string $messageDate = null, + string $messageDateAfter = null + + ) { + $this->options['log'] = $log; + $this->options['messageDateBefore'] = $messageDateBefore; + $this->options['messageDate'] = $messageDate; + $this->options['messageDateAfter'] = $messageDateAfter; + } + + /** + * Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * + * @param int $log Only read notifications of the specified log level. Can be: `0` to read only ERROR notifications or `1` to read only WARNING notifications. By default, all notifications are read. + * @return $this Fluent Builder + */ + public function setLog(int $log): self + { + $this->options['log'] = $log; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDateBefore Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDateBefore(string $messageDateBefore): self + { + $this->options['messageDateBefore'] = $messageDateBefore; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDate Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDate(string $messageDate): self + { + $this->options['messageDate'] = $messageDate; + return $this; + } + + /** + * Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * + * @param string $messageDateAfter Only show notifications for the specified date, formatted as `YYYY-MM-DD`. You can also specify an inequality, such as `<=YYYY-MM-DD` for messages logged at or before midnight on a date, or `>=YYYY-MM-DD` for messages logged at or after midnight on a date. + * @return $this Fluent Builder + */ + public function setMessageDateAfter(string $messageDateAfter): self + { + $this->options['messageDateAfter'] = $messageDateAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadNotificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/NotificationPage.php b/app/api/Twilio/Rest/Api/V2010/Account/NotificationPage.php new file mode 100755 index 0000000..589848c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/NotificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NotificationInstance \Twilio\Rest\Api\V2010\Account\NotificationInstance + */ + public function buildInstance(array $payload): NotificationInstance + { + return new NotificationInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.NotificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdContext.php b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdContext.php new file mode 100755 index 0000000..e20a2d8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdContext.php @@ -0,0 +1,130 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/OutgoingCallerIds/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the OutgoingCallerIdInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the OutgoingCallerIdInstance + * + * @return OutgoingCallerIdInstance Fetched OutgoingCallerIdInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OutgoingCallerIdInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new OutgoingCallerIdInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the OutgoingCallerIdInstance + * + * @param array|Options $options Optional Arguments + * @return OutgoingCallerIdInstance Updated OutgoingCallerIdInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): OutgoingCallerIdInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new OutgoingCallerIdInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.OutgoingCallerIdContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdInstance.php new file mode 100755 index 0000000..b60efe2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return OutgoingCallerIdContext Context for this OutgoingCallerIdInstance + */ + protected function proxy(): OutgoingCallerIdContext + { + if (!$this->context) { + $this->context = new OutgoingCallerIdContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the OutgoingCallerIdInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the OutgoingCallerIdInstance + * + * @return OutgoingCallerIdInstance Fetched OutgoingCallerIdInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OutgoingCallerIdInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the OutgoingCallerIdInstance + * + * @param array|Options $options Optional Arguments + * @return OutgoingCallerIdInstance Updated OutgoingCallerIdInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): OutgoingCallerIdInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.OutgoingCallerIdInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdList.php b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdList.php new file mode 100755 index 0000000..c5360d4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdList.php @@ -0,0 +1,177 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/OutgoingCallerIds.json'; + } + + /** + * Reads OutgoingCallerIdInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return OutgoingCallerIdInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams OutgoingCallerIdInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of OutgoingCallerIdInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return OutgoingCallerIdPage Page of OutgoingCallerIdInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): OutgoingCallerIdPage + { + $options = new Values($options); + + $params = Values::of([ + 'PhoneNumber' => + $options['phoneNumber'], + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new OutgoingCallerIdPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of OutgoingCallerIdInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return OutgoingCallerIdPage Page of OutgoingCallerIdInstance + */ + public function getPage(string $targetUrl): OutgoingCallerIdPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new OutgoingCallerIdPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a OutgoingCallerIdContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the OutgoingCallerId resource to delete. + */ + public function getContext( + string $sid + + ): OutgoingCallerIdContext + { + return new OutgoingCallerIdContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.OutgoingCallerIdList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdOptions.php new file mode 100755 index 0000000..e254044 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdOptions.php @@ -0,0 +1,150 @@ +options['phoneNumber'] = $phoneNumber; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The phone number of the OutgoingCallerId resources to read. + * + * @param string $phoneNumber The phone number of the OutgoingCallerId resources to read. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * The string that identifies the OutgoingCallerId resources to read. + * + * @param string $friendlyName The string that identifies the OutgoingCallerId resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadOutgoingCallerIdOptions ' . $options . ']'; + } +} + +class UpdateOutgoingCallerIdOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateOutgoingCallerIdOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdPage.php b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdPage.php new file mode 100755 index 0000000..ed144d5 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/OutgoingCallerIdPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return OutgoingCallerIdInstance \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdInstance + */ + public function buildInstance(array $payload): OutgoingCallerIdInstance + { + return new OutgoingCallerIdInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.OutgoingCallerIdPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberContext.php new file mode 100755 index 0000000..89d0f0e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberContext.php @@ -0,0 +1,127 @@ +solution = [ + 'accountSid' => + $accountSid, + 'queueSid' => + $queueSid, + 'callSid' => + $callSid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Queues/' . \rawurlencode($queueSid) + .'/Members/' . \rawurlencode($callSid) + .'.json'; + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['queueSid'], + $this->solution['callSid'] + ); + } + + + /** + * Update the MemberInstance + * + * @param string $url The absolute URL of the Queue resource. + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $url, array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Url' => + $url, + 'Method' => + $options['method'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['queueSid'], + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MemberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberInstance.php new file mode 100755 index 0000000..e3c3664 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberInstance.php @@ -0,0 +1,145 @@ +properties = [ + 'callSid' => Values::array_get($payload, 'call_sid'), + 'dateEnqueued' => Deserialize::dateTime(Values::array_get($payload, 'date_enqueued')), + 'position' => Values::array_get($payload, 'position'), + 'uri' => Values::array_get($payload, 'uri'), + 'waitTime' => Values::array_get($payload, 'wait_time'), + 'queueSid' => Values::array_get($payload, 'queue_sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'queueSid' => $queueSid, 'callSid' => $callSid ?: $this->properties['callSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MemberContext Context for this MemberInstance + */ + protected function proxy(): MemberContext + { + if (!$this->context) { + $this->context = new MemberContext( + $this->version, + $this->solution['accountSid'], + $this->solution['queueSid'], + $this->solution['callSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MemberInstance + * + * @param string $url The absolute URL of the Queue resource. + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $url, array $options = []): MemberInstance + { + + return $this->proxy()->update($url, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.MemberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberList.php b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberList.php new file mode 100755 index 0000000..74d82ca --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberList.php @@ -0,0 +1,175 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'queueSid' => + $queueSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Queues/' . \rawurlencode($queueSid) + .'/Members.json'; + } + + /** + * Reads MemberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MemberInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams MemberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MemberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MemberPage Page of MemberInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MemberPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MemberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MemberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MemberPage Page of MemberInstance + */ + public function getPage(string $targetUrl): MemberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MemberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MemberContext + * + * @param string $callSid The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resource(s) to fetch. + */ + public function getContext( + string $callSid + + ): MemberContext + { + return new MemberContext( + $this->version, + $this->solution['accountSid'], + $this->solution['queueSid'], + $callSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MemberList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberOptions.php new file mode 100755 index 0000000..d6e30c8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberOptions.php @@ -0,0 +1,80 @@ +options['method'] = $method; + } + + /** + * How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + * + * @param string $method How to pass the update request data. Can be `GET` or `POST` and the default is `POST`. `POST` sends the data as encoded form data and `GET` sends the data as query parameters. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateMemberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberPage.php new file mode 100755 index 0000000..36a324b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Queue/MemberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MemberInstance \Twilio\Rest\Api\V2010\Account\Queue\MemberInstance + */ + public function buildInstance(array $payload): MemberInstance + { + return new MemberInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['queueSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MemberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/QueueContext.php b/app/api/Twilio/Rest/Api/V2010/Account/QueueContext.php new file mode 100755 index 0000000..c9d20a6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/QueueContext.php @@ -0,0 +1,191 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Queues/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the QueueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the QueueInstance + * + * @return QueueInstance Fetched QueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new QueueInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the QueueInstance + * + * @param array|Options $options Optional Arguments + * @return QueueInstance Updated QueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'MaxSize' => + $options['maxSize'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new QueueInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + if (!$this->_members) { + $this->_members = new MemberList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_members; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.QueueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/QueueInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/QueueInstance.php new file mode 100755 index 0000000..43f1ca7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/QueueInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'currentSize' => Values::array_get($payload, 'current_size'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uri' => Values::array_get($payload, 'uri'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'averageWaitTime' => Values::array_get($payload, 'average_wait_time'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'maxSize' => Values::array_get($payload, 'max_size'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return QueueContext Context for this QueueInstance + */ + protected function proxy(): QueueContext + { + if (!$this->context) { + $this->context = new QueueContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the QueueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the QueueInstance + * + * @return QueueInstance Fetched QueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the QueueInstance + * + * @param array|Options $options Optional Arguments + * @return QueueInstance Updated QueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueueInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + return $this->proxy()->members; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.QueueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/QueueList.php b/app/api/Twilio/Rest/Api/V2010/Account/QueueList.php new file mode 100755 index 0000000..2cb8d14 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/QueueList.php @@ -0,0 +1,200 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Queues.json'; + } + + /** + * Create the QueueInstance + * + * @param string $friendlyName A descriptive string that you created to describe this resource. It can be up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return QueueInstance Created QueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): QueueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'MaxSize' => + $options['maxSize'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new QueueInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads QueueInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return QueueInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams QueueInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of QueueInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return QueuePage Page of QueueInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): QueuePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new QueuePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of QueueInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return QueuePage Page of QueueInstance + */ + public function getPage(string $targetUrl): QueuePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new QueuePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a QueueContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Queue resource to delete + */ + public function getContext( + string $sid + + ): QueueContext + { + return new QueueContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.QueueList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/QueueOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/QueueOptions.php new file mode 100755 index 0000000..6f7b91e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/QueueOptions.php @@ -0,0 +1,152 @@ +options['maxSize'] = $maxSize; + } + + /** + * The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + * + * @param int $maxSize The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + * @return $this Fluent Builder + */ + public function setMaxSize(int $maxSize): self + { + $this->options['maxSize'] = $maxSize; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateQueueOptions ' . $options . ']'; + } +} + + + + +class UpdateQueueOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you created to describe this resource. It can be up to 64 characters long. + * @param int $maxSize The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + */ + public function __construct( + + string $friendlyName = Values::NONE, + int $maxSize = Values::INT_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['maxSize'] = $maxSize; + } + + /** + * A descriptive string that you created to describe this resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you created to describe this resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + * + * @param int $maxSize The maximum number of calls allowed to be in the queue. The default is 1000. The maximum is 5000. + * @return $this Fluent Builder + */ + public function setMaxSize(int $maxSize): self + { + $this->options['maxSize'] = $maxSize; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateQueueOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/QueuePage.php b/app/api/Twilio/Rest/Api/V2010/Account/QueuePage.php new file mode 100755 index 0000000..8b1761c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/QueuePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return QueueInstance \Twilio\Rest\Api\V2010\Account\QueueInstance + */ + public function buildInstance(array $payload): QueueInstance + { + return new QueueInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.QueuePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadContext.php new file mode 100755 index 0000000..60c8ff8 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadContext.php @@ -0,0 +1,112 @@ +solution = [ + 'accountSid' => + $accountSid, + 'referenceSid' => + $referenceSid, + 'addOnResultSid' => + $addOnResultSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($referenceSid) + .'/AddOnResults/' . \rawurlencode($addOnResultSid) + .'/Payloads/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the PayloadInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the PayloadInstance + * + * @return PayloadInstance Fetched PayloadInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PayloadInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PayloadInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['addOnResultSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.PayloadContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadInstance.php new file mode 100755 index 0000000..df55bbb --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'addOnResultSid' => Values::array_get($payload, 'add_on_result_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'label' => Values::array_get($payload, 'label'), + 'addOnSid' => Values::array_get($payload, 'add_on_sid'), + 'addOnConfigurationSid' => Values::array_get($payload, 'add_on_configuration_sid'), + 'contentType' => Values::array_get($payload, 'content_type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'referenceSid' => Values::array_get($payload, 'reference_sid'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'referenceSid' => $referenceSid, 'addOnResultSid' => $addOnResultSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PayloadContext Context for this PayloadInstance + */ + protected function proxy(): PayloadContext + { + if (!$this->context) { + $this->context = new PayloadContext( + $this->version, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['addOnResultSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the PayloadInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the PayloadInstance + * + * @return PayloadInstance Fetched PayloadInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PayloadInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.PayloadInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadList.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadList.php new file mode 100755 index 0000000..d2bf128 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadList.php @@ -0,0 +1,182 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'referenceSid' => + $referenceSid, + + 'addOnResultSid' => + $addOnResultSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($referenceSid) + .'/AddOnResults/' . \rawurlencode($addOnResultSid) + .'/Payloads.json'; + } + + /** + * Reads PayloadInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PayloadInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PayloadInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PayloadInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PayloadPage Page of PayloadInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PayloadPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PayloadPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PayloadInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PayloadPage Page of PayloadInstance + */ + public function getPage(string $targetUrl): PayloadPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PayloadPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PayloadContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Recording AddOnResult Payload resource to delete. + */ + public function getContext( + string $sid + + ): PayloadContext + { + return new PayloadContext( + $this->version, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['addOnResultSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.PayloadList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadPage.php new file mode 100755 index 0000000..c263e0f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResult/PayloadPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PayloadInstance \Twilio\Rest\Api\V2010\Account\Recording\AddOnResult\PayloadInstance + */ + public function buildInstance(array $payload): PayloadInstance + { + return new PayloadInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['referenceSid'], $this->solution['addOnResultSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.PayloadPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultContext.php new file mode 100755 index 0000000..afc244c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultContext.php @@ -0,0 +1,166 @@ +solution = [ + 'accountSid' => + $accountSid, + 'referenceSid' => + $referenceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($referenceSid) + .'/AddOnResults/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AddOnResultInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AddOnResultInstance + * + * @return AddOnResultInstance Fetched AddOnResultInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddOnResultInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AddOnResultInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the payloads + */ + protected function getPayloads(): PayloadList + { + if (!$this->_payloads) { + $this->_payloads = new PayloadList( + $this->version, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['sid'] + ); + } + + return $this->_payloads; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AddOnResultContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultInstance.php new file mode 100755 index 0000000..61361fd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultInstance.php @@ -0,0 +1,161 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'addOnSid' => Values::array_get($payload, 'add_on_sid'), + 'addOnConfigurationSid' => Values::array_get($payload, 'add_on_configuration_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'dateCompleted' => Deserialize::dateTime(Values::array_get($payload, 'date_completed')), + 'referenceSid' => Values::array_get($payload, 'reference_sid'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'referenceSid' => $referenceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AddOnResultContext Context for this AddOnResultInstance + */ + protected function proxy(): AddOnResultContext + { + if (!$this->context) { + $this->context = new AddOnResultContext( + $this->version, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AddOnResultInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AddOnResultInstance + * + * @return AddOnResultInstance Fetched AddOnResultInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddOnResultInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the payloads + */ + protected function getPayloads(): PayloadList + { + return $this->proxy()->payloads; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AddOnResultInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultList.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultList.php new file mode 100755 index 0000000..c20fc6c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultList.php @@ -0,0 +1,175 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'referenceSid' => + $referenceSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($referenceSid) + .'/AddOnResults.json'; + } + + /** + * Reads AddOnResultInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AddOnResultInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AddOnResultInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AddOnResultInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AddOnResultPage Page of AddOnResultInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AddOnResultPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AddOnResultPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AddOnResultInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AddOnResultPage Page of AddOnResultInstance + */ + public function getPage(string $targetUrl): AddOnResultPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AddOnResultPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AddOnResultContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Recording AddOnResult resource to delete. + */ + public function getContext( + string $sid + + ): AddOnResultContext + { + return new AddOnResultContext( + $this->version, + $this->solution['accountSid'], + $this->solution['referenceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AddOnResultList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultPage.php new file mode 100755 index 0000000..f8dac75 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/AddOnResultPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AddOnResultInstance \Twilio\Rest\Api\V2010\Account\Recording\AddOnResultInstance + */ + public function buildInstance(array $payload): AddOnResultInstance + { + return new AddOnResultInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['referenceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AddOnResultPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionContext.php new file mode 100755 index 0000000..b68250c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'recordingSid' => + $recordingSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($recordingSid) + .'/Transcriptions/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the TranscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TranscriptionInstance + * + * @return TranscriptionInstance Fetched TranscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TranscriptionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TranscriptionInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['recordingSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TranscriptionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionInstance.php new file mode 100755 index 0000000..703d2b6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'duration' => Values::array_get($payload, 'duration'), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'recordingSid' => Values::array_get($payload, 'recording_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'transcriptionText' => Values::array_get($payload, 'transcription_text'), + 'type' => Values::array_get($payload, 'type'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'recordingSid' => $recordingSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TranscriptionContext Context for this TranscriptionInstance + */ + protected function proxy(): TranscriptionContext + { + if (!$this->context) { + $this->context = new TranscriptionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['recordingSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TranscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TranscriptionInstance + * + * @return TranscriptionInstance Fetched TranscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TranscriptionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TranscriptionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionList.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionList.php new file mode 100755 index 0000000..5a90f9e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionList.php @@ -0,0 +1,175 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'recordingSid' => + $recordingSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($recordingSid) + .'/Transcriptions.json'; + } + + /** + * Reads TranscriptionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TranscriptionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TranscriptionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TranscriptionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TranscriptionPage Page of TranscriptionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TranscriptionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TranscriptionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TranscriptionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TranscriptionPage Page of TranscriptionInstance + */ + public function getPage(string $targetUrl): TranscriptionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TranscriptionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TranscriptionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Transcription resource to delete. + */ + public function getContext( + string $sid + + ): TranscriptionContext + { + return new TranscriptionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['recordingSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TranscriptionList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionPage.php new file mode 100755 index 0000000..7fb4907 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Recording/TranscriptionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TranscriptionInstance \Twilio\Rest\Api\V2010\Account\Recording\TranscriptionInstance + */ + public function buildInstance(array $payload): TranscriptionInstance + { + return new TranscriptionInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['recordingSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TranscriptionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/RecordingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/RecordingContext.php new file mode 100755 index 0000000..07a1cdf --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/RecordingContext.php @@ -0,0 +1,190 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RecordingInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): RecordingInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'IncludeSoftDeleted' => + Serialize::booleanToString($options['includeSoftDeleted']), + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the addOnResults + */ + protected function getAddOnResults(): AddOnResultList + { + if (!$this->_addOnResults) { + $this->_addOnResults = new AddOnResultList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_addOnResults; + } + + /** + * Access the transcriptions + */ + protected function getTranscriptions(): TranscriptionList + { + if (!$this->_transcriptions) { + $this->_transcriptions = new TranscriptionList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_transcriptions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/RecordingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/RecordingInstance.php new file mode 100755 index 0000000..8f31930 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/RecordingInstance.php @@ -0,0 +1,189 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'sid' => Values::array_get($payload, 'sid'), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'status' => Values::array_get($payload, 'status'), + 'channels' => Values::array_get($payload, 'channels'), + 'source' => Values::array_get($payload, 'source'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'uri' => Values::array_get($payload, 'uri'), + 'encryptionDetails' => Values::array_get($payload, 'encryption_details'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'mediaUrl' => Values::array_get($payload, 'media_url'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingContext Context for this RecordingInstance + */ + protected function proxy(): RecordingContext + { + if (!$this->context) { + $this->context = new RecordingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RecordingInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): RecordingInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Access the addOnResults + */ + protected function getAddOnResults(): AddOnResultList + { + return $this->proxy()->addOnResults; + } + + /** + * Access the transcriptions + */ + protected function getTranscriptions(): TranscriptionList + { + return $this->proxy()->transcriptions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.RecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/RecordingList.php b/app/api/Twilio/Rest/Api/V2010/Account/RecordingList.php new file mode 100755 index 0000000..c9b63bc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/RecordingList.php @@ -0,0 +1,186 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Recordings.json'; + } + + /** + * Reads RecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RecordingPage Page of RecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreated<' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateCreated>' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'CallSid' => + $options['callSid'], + 'ConferenceSid' => + $options['conferenceSid'], + 'IncludeSoftDeleted' => + Serialize::booleanToString($options['includeSoftDeleted']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RecordingPage Page of RecordingInstance + */ + public function getPage(string $targetUrl): RecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RecordingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Recording resource to delete. + */ + public function getContext( + string $sid + + ): RecordingContext + { + return new RecordingContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/RecordingOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/RecordingOptions.php new file mode 100755 index 0000000..0a07b79 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/RecordingOptions.php @@ -0,0 +1,220 @@ +=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $dateCreated Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $dateCreatedAfter Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $callSid The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + * @param string $conferenceSid The Conference SID that identifies the conference associated with the recording to read. + * @param bool $includeSoftDeleted A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + * @return ReadRecordingOptions Options builder + */ + public static function read( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null, + string $callSid = Values::NONE, + string $conferenceSid = Values::NONE, + bool $includeSoftDeleted = Values::BOOL_NONE + + ): ReadRecordingOptions + { + return new ReadRecordingOptions( + $dateCreatedBefore, + $dateCreated, + $dateCreatedAfter, + $callSid, + $conferenceSid, + $includeSoftDeleted + ); + } + +} + + +class FetchRecordingOptions extends Options + { + /** + * @param bool $includeSoftDeleted A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + */ + public function __construct( + + bool $includeSoftDeleted = Values::BOOL_NONE + + ) { + $this->options['includeSoftDeleted'] = $includeSoftDeleted; + } + + /** + * A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + * + * @param bool $includeSoftDeleted A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + * @return $this Fluent Builder + */ + public function setIncludeSoftDeleted(bool $includeSoftDeleted): self + { + $this->options['includeSoftDeleted'] = $includeSoftDeleted; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.FetchRecordingOptions ' . $options . ']'; + } +} + +class ReadRecordingOptions extends Options + { + /** + * @param string $dateCreatedBefore Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $dateCreated Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $dateCreatedAfter Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @param string $callSid The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + * @param string $conferenceSid The Conference SID that identifies the conference associated with the recording to read. + * @param bool $includeSoftDeleted A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + */ + public function __construct( + + string $dateCreatedBefore = null, + string $dateCreated = null, + string $dateCreatedAfter = null, + string $callSid = Values::NONE, + string $conferenceSid = Values::NONE, + bool $includeSoftDeleted = Values::BOOL_NONE + + ) { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['callSid'] = $callSid; + $this->options['conferenceSid'] = $conferenceSid; + $this->options['includeSoftDeleted'] = $includeSoftDeleted; + } + + /** + * Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * + * @param string $dateCreatedBefore Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(string $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * + * @param string $dateCreated Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreated(string $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * + * @param string $dateCreatedAfter Only include recordings that were created on this date. Specify a date as `YYYY-MM-DD` in GMT, for example: `2009-07-06`, to read recordings that were created on this date. You can also specify an inequality, such as `DateCreated<=YYYY-MM-DD`, to read recordings that were created on or before midnight of this date, and `DateCreated>=YYYY-MM-DD` to read recordings that were created on or after midnight of this date. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(string $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + * + * @param string $callSid The [Call](https://www.twilio.com/docs/voice/api/call-resource) SID of the resources to read. + * @return $this Fluent Builder + */ + public function setCallSid(string $callSid): self + { + $this->options['callSid'] = $callSid; + return $this; + } + + /** + * The Conference SID that identifies the conference associated with the recording to read. + * + * @param string $conferenceSid The Conference SID that identifies the conference associated with the recording to read. + * @return $this Fluent Builder + */ + public function setConferenceSid(string $conferenceSid): self + { + $this->options['conferenceSid'] = $conferenceSid; + return $this; + } + + /** + * A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + * + * @param bool $includeSoftDeleted A boolean parameter indicating whether to retrieve soft deleted recordings or not. Recordings metadata are kept after deletion for a retention period of 40 days. + * @return $this Fluent Builder + */ + public function setIncludeSoftDeleted(bool $includeSoftDeleted): self + { + $this->options['includeSoftDeleted'] = $includeSoftDeleted; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/RecordingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/RecordingPage.php new file mode 100755 index 0000000..58fa81a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/RecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingInstance \Twilio\Rest\Api\V2010\Account\RecordingInstance + */ + public function buildInstance(array $payload): RecordingInstance + { + return new RecordingInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeContext.php b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeContext.php new file mode 100755 index 0000000..b5d2426 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeContext.php @@ -0,0 +1,127 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SMS/ShortCodes/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ShortCodeInstance + * + * @param array|Options $options Optional Arguments + * @return ShortCodeInstance Updated ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ShortCodeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ApiVersion' => + $options['apiVersion'], + 'SmsUrl' => + $options['smsUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ShortCodeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeInstance.php new file mode 100755 index 0000000..21ce09e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'shortCode' => Values::array_get($payload, 'short_code'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ShortCodeContext Context for this ShortCodeInstance + */ + protected function proxy(): ShortCodeContext + { + if (!$this->context) { + $this->context = new ShortCodeContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ShortCodeInstance + * + * @param array|Options $options Optional Arguments + * @return ShortCodeInstance Updated ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ShortCodeInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.ShortCodeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeList.php b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeList.php new file mode 100755 index 0000000..7fa1f6d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeList.php @@ -0,0 +1,177 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SMS/ShortCodes.json'; + } + + /** + * Reads ShortCodeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ShortCodeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ShortCodeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ShortCodePage Page of ShortCodeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ShortCodePage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ShortCode' => + $options['shortCode'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ShortCodePage Page of ShortCodeInstance + */ + public function getPage(string $targetUrl): ShortCodePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ShortCodeContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the ShortCode resource to fetch + */ + public function getContext( + string $sid + + ): ShortCodeContext + { + return new ShortCodeContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ShortCodeList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeOptions.php new file mode 100755 index 0000000..2941908 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodeOptions.php @@ -0,0 +1,238 @@ +options['friendlyName'] = $friendlyName; + $this->options['shortCode'] = $shortCode; + } + + /** + * The string that identifies the ShortCode resources to read. + * + * @param string $friendlyName The string that identifies the ShortCode resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + * + * @param string $shortCode Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' as a wildcard for any digit. + * @return $this Fluent Builder + */ + public function setShortCode(string $shortCode): self + { + $this->options['shortCode'] = $shortCode; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadShortCodeOptions ' . $options . ']'; + } +} + +class UpdateShortCodeOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + * @param string $apiVersion The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + * @param string $smsUrl The URL we should call when receiving an incoming SMS message to this short code. + * @param string $smsMethod The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + * @param string $smsFallbackUrl The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + * @param string $smsFallbackMethod The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $apiVersion = Values::NONE, + string $smsUrl = Values::NONE, + string $smsMethod = Values::NONE, + string $smsFallbackUrl = Values::NONE, + string $smsFallbackMethod = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['apiVersion'] = $apiVersion; + $this->options['smsUrl'] = $smsUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + } + + /** + * A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + * + * @param string $friendlyName A descriptive string that you created to describe this resource. It can be up to 64 characters long. By default, the `FriendlyName` is the short code. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + * + * @param string $apiVersion The API version to use to start a new TwiML session. Can be: `2010-04-01` or `2008-08-01`. + * @return $this Fluent Builder + */ + public function setApiVersion(string $apiVersion): self + { + $this->options['apiVersion'] = $apiVersion; + return $this; + } + + /** + * The URL we should call when receiving an incoming SMS message to this short code. + * + * @param string $smsUrl The URL we should call when receiving an incoming SMS message to this short code. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + * + * @param string $smsMethod The HTTP method we should use when calling the `sms_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + * + * @param string $smsFallbackUrl The URL that we should call if an error occurs while retrieving or executing the TwiML from `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $smsFallbackMethod The HTTP method that we should use to call the `sms_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateShortCodeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ShortCodePage.php b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodePage.php new file mode 100755 index 0000000..de392a6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ShortCodePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ShortCodeInstance \Twilio\Rest\Api\V2010\Account\ShortCodeInstance + */ + public function buildInstance(array $payload): ShortCodeInstance + { + return new ShortCodeInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ShortCodePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyContext.php b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyContext.php new file mode 100755 index 0000000..11548d5 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyContext.php @@ -0,0 +1,130 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SigningKeys/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the SigningKeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SigningKeyInstance + * + * @return SigningKeyInstance Fetched SigningKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SigningKeyInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SigningKeyInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SigningKeyInstance + * + * @param array|Options $options Optional Arguments + * @return SigningKeyInstance Updated SigningKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SigningKeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SigningKeyInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.SigningKeyContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyInstance.php new file mode 100755 index 0000000..4185fed --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SigningKeyContext Context for this SigningKeyInstance + */ + protected function proxy(): SigningKeyContext + { + if (!$this->context) { + $this->context = new SigningKeyContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SigningKeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SigningKeyInstance + * + * @return SigningKeyInstance Fetched SigningKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SigningKeyInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SigningKeyInstance + * + * @param array|Options $options Optional Arguments + * @return SigningKeyInstance Updated SigningKeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SigningKeyInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.SigningKeyInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyList.php b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyList.php new file mode 100755 index 0000000..25ffb8a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SigningKeys.json'; + } + + /** + * Reads SigningKeyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SigningKeyInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SigningKeyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SigningKeyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SigningKeyPage Page of SigningKeyInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SigningKeyPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SigningKeyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SigningKeyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SigningKeyPage Page of SigningKeyInstance + */ + public function getPage(string $targetUrl): SigningKeyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SigningKeyPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SigningKeyContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): SigningKeyContext + { + return new SigningKeyContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SigningKeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyOptions.php new file mode 100755 index 0000000..3cefd6f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyOptions.php @@ -0,0 +1,82 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateSigningKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyPage.php new file mode 100755 index 0000000..5214464 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SigningKeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SigningKeyInstance \Twilio\Rest\Api\V2010\Account\SigningKeyInstance + */ + public function buildInstance(array $payload): SigningKeyInstance + { + return new SigningKeyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SigningKeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialContext.php new file mode 100755 index 0000000..fe61eb2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialContext.php @@ -0,0 +1,137 @@ +solution = [ + 'accountSid' => + $accountSid, + 'credentialListSid' => + $credentialListSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/CredentialLists/' . \rawurlencode($credentialListSid) + .'/Credentials/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['credentialListSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Password' => + $options['password'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['credentialListSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialInstance.php new file mode 100755 index 0000000..10d36dc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'credentialListSid' => Values::array_get($payload, 'credential_list_sid'), + 'username' => Values::array_get($payload, 'username'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'credentialListSid' => $credentialListSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['accountSid'], + $this->solution['credentialListSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialList.php new file mode 100755 index 0000000..a9f4242 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialList.php @@ -0,0 +1,205 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'credentialListSid' => + $credentialListSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/CredentialLists/' . \rawurlencode($credentialListSid) + .'/Credentials.json'; + } + + /** + * Create the CredentialInstance + * + * @param string $username The username that will be passed when authenticating SIP requests. The username should be sent in response to Twilio's challenge of the initial INVITE. It can be up to 32 characters long. + * @param string $password The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $username, string $password): CredentialInstance + { + + $data = Values::of([ + 'Username' => + $username, + 'Password' => + $password, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['credentialListSid'] + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid The unique id that identifies the resource to delete. + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $this->solution['accountSid'], + $this->solution['credentialListSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialOptions.php new file mode 100755 index 0000000..c7a0406 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialOptions.php @@ -0,0 +1,84 @@ +options['password'] = $password; + } + + /** + * The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + * + * @param string $password The password that the username will use when authenticating SIP requests. The password must be a minimum of 12 characters, contain at least 1 digit, and have mixed case. (eg `IWasAtSignal2018`) + * @return $this Fluent Builder + */ + public function setPassword(string $password): self + { + $this->options['password'] = $password; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialPage.php new file mode 100755 index 0000000..7163c3c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialList/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Api\V2010\Account\Sip\CredentialList\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['credentialListSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListContext.php new file mode 100755 index 0000000..add270b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListContext.php @@ -0,0 +1,186 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/CredentialLists/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the CredentialListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialListInstance + * + * @return CredentialListInstance Fetched CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialListInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialListInstance + * + * @param string $friendlyName A human readable descriptive text for a CredentialList, up to 64 characters long. + * @return CredentialListInstance Updated CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): CredentialListInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialListInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the credentials + */ + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_credentials; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListInstance.php new file mode 100755 index 0000000..09a4681 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialListContext Context for this CredentialListInstance + */ + protected function proxy(): CredentialListContext + { + if (!$this->context) { + $this->context = new CredentialListContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialListInstance + * + * @return CredentialListInstance Fetched CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialListInstance + * + * @param string $friendlyName A human readable descriptive text for a CredentialList, up to 64 characters long. + * @return CredentialListInstance Updated CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): CredentialListInstance + { + + return $this->proxy()->update($friendlyName); + } + + /** + * Access the credentials + */ + protected function getCredentials(): CredentialList + { + return $this->proxy()->credentials; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListList.php new file mode 100755 index 0000000..58068f9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListList.php @@ -0,0 +1,195 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/CredentialLists.json'; + } + + /** + * Create the CredentialListInstance + * + * @param string $friendlyName A human readable descriptive text that describes the CredentialList, up to 64 characters long. + * @return CredentialListInstance Created CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): CredentialListInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialListInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads CredentialListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialListPage Page of CredentialListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialListPage Page of CredentialListInstance + */ + public function getPage(string $targetUrl): CredentialListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialListContext + * + * @param string $sid The credential list Sid that uniquely identifies this resource + */ + public function getContext( + string $sid + + ): CredentialListContext + { + return new CredentialListContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialListList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListPage.php new file mode 100755 index 0000000..ed0ea58 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/CredentialListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialListInstance \Twilio\Rest\Api\V2010\Account\Sip\CredentialListInstance + */ + public function buildInstance(array $payload): CredentialListInstance + { + return new CredentialListInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingContext.php new file mode 100755 index 0000000..1724842 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'domainSid' => + $domainSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Calls/CredentialListMappings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AuthCallsCredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AuthCallsCredentialListMappingInstance + * + * @return AuthCallsCredentialListMappingInstance Fetched AuthCallsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthCallsCredentialListMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AuthCallsCredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthCallsCredentialListMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingInstance.php new file mode 100755 index 0000000..1a54b4b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthCallsCredentialListMappingContext Context for this AuthCallsCredentialListMappingInstance + */ + protected function proxy(): AuthCallsCredentialListMappingContext + { + if (!$this->context) { + $this->context = new AuthCallsCredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AuthCallsCredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AuthCallsCredentialListMappingInstance + * + * @return AuthCallsCredentialListMappingInstance Fetched AuthCallsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthCallsCredentialListMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthCallsCredentialListMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingList.php new file mode 100755 index 0000000..c485b4f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Calls/CredentialListMappings.json'; + } + + /** + * Create the AuthCallsCredentialListMappingInstance + * + * @param string $credentialListSid The SID of the CredentialList resource to map to the SIP domain. + * @return AuthCallsCredentialListMappingInstance Created AuthCallsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $credentialListSid): AuthCallsCredentialListMappingInstance + { + + $data = Values::of([ + 'CredentialListSid' => + $credentialListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AuthCallsCredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + + + /** + * Reads AuthCallsCredentialListMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AuthCallsCredentialListMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AuthCallsCredentialListMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AuthCallsCredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AuthCallsCredentialListMappingPage Page of AuthCallsCredentialListMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AuthCallsCredentialListMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AuthCallsCredentialListMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AuthCallsCredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AuthCallsCredentialListMappingPage Page of AuthCallsCredentialListMappingInstance + */ + public function getPage(string $targetUrl): AuthCallsCredentialListMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AuthCallsCredentialListMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AuthCallsCredentialListMappingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the CredentialListMapping resource to delete. + */ + public function getContext( + string $sid + + ): AuthCallsCredentialListMappingContext + { + return new AuthCallsCredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthCallsCredentialListMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingPage.php new file mode 100755 index 0000000..0d02779 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsCredentialListMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthCallsCredentialListMappingInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypes\AuthTypeCalls\AuthCallsCredentialListMappingInstance + */ + public function buildInstance(array $payload): AuthCallsCredentialListMappingInstance + { + return new AuthCallsCredentialListMappingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthCallsCredentialListMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingContext.php new file mode 100755 index 0000000..75b2ad3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'domainSid' => + $domainSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Calls/IpAccessControlListMappings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AuthCallsIpAccessControlListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AuthCallsIpAccessControlListMappingInstance + * + * @return AuthCallsIpAccessControlListMappingInstance Fetched AuthCallsIpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthCallsIpAccessControlListMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AuthCallsIpAccessControlListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthCallsIpAccessControlListMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingInstance.php new file mode 100755 index 0000000..b04f7d3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthCallsIpAccessControlListMappingContext Context for this AuthCallsIpAccessControlListMappingInstance + */ + protected function proxy(): AuthCallsIpAccessControlListMappingContext + { + if (!$this->context) { + $this->context = new AuthCallsIpAccessControlListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AuthCallsIpAccessControlListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AuthCallsIpAccessControlListMappingInstance + * + * @return AuthCallsIpAccessControlListMappingInstance Fetched AuthCallsIpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthCallsIpAccessControlListMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthCallsIpAccessControlListMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingList.php new file mode 100755 index 0000000..8c95b11 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Calls/IpAccessControlListMappings.json'; + } + + /** + * Create the AuthCallsIpAccessControlListMappingInstance + * + * @param string $ipAccessControlListSid The SID of the IpAccessControlList resource to map to the SIP domain. + * @return AuthCallsIpAccessControlListMappingInstance Created AuthCallsIpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $ipAccessControlListSid): AuthCallsIpAccessControlListMappingInstance + { + + $data = Values::of([ + 'IpAccessControlListSid' => + $ipAccessControlListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AuthCallsIpAccessControlListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + + + /** + * Reads AuthCallsIpAccessControlListMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AuthCallsIpAccessControlListMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AuthCallsIpAccessControlListMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AuthCallsIpAccessControlListMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AuthCallsIpAccessControlListMappingPage Page of AuthCallsIpAccessControlListMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AuthCallsIpAccessControlListMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AuthCallsIpAccessControlListMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AuthCallsIpAccessControlListMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AuthCallsIpAccessControlListMappingPage Page of AuthCallsIpAccessControlListMappingInstance + */ + public function getPage(string $targetUrl): AuthCallsIpAccessControlListMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AuthCallsIpAccessControlListMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AuthCallsIpAccessControlListMappingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the IpAccessControlListMapping resource to delete. + */ + public function getContext( + string $sid + + ): AuthCallsIpAccessControlListMappingContext + { + return new AuthCallsIpAccessControlListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthCallsIpAccessControlListMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingPage.php new file mode 100755 index 0000000..e11b6c2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCalls/AuthCallsIpAccessControlListMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthCallsIpAccessControlListMappingInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypes\AuthTypeCalls\AuthCallsIpAccessControlListMappingInstance + */ + public function buildInstance(array $payload): AuthCallsIpAccessControlListMappingInstance + { + return new AuthCallsIpAccessControlListMappingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthCallsIpAccessControlListMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsInstance.php new file mode 100755 index 0000000..ef34028 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsInstance.php @@ -0,0 +1,73 @@ +solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeCallsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsList.php new file mode 100755 index 0000000..2081a64 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsList.php @@ -0,0 +1,137 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + } + + /** + * Access the ipAccessControlListMappings + */ + protected function getIpAccessControlListMappings(): AuthCallsIpAccessControlListMappingList + { + if (!$this->_ipAccessControlListMappings) { + $this->_ipAccessControlListMappings = new AuthCallsIpAccessControlListMappingList( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + return $this->_ipAccessControlListMappings; + } + + /** + * Access the credentialListMappings + */ + protected function getCredentialListMappings(): AuthCallsCredentialListMappingList + { + if (!$this->_credentialListMappings) { + $this->_credentialListMappings = new AuthCallsCredentialListMappingList( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + return $this->_credentialListMappings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeCallsList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsPage.php new file mode 100755 index 0000000..19b68b7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeCallsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthTypeCallsInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypes\AuthTypeCallsInstance + */ + public function buildInstance(array $payload): AuthTypeCallsInstance + { + return new AuthTypeCallsInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeCallsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingContext.php new file mode 100755 index 0000000..282753f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'domainSid' => + $domainSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Registrations/CredentialListMappings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the AuthRegistrationsCredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AuthRegistrationsCredentialListMappingInstance + * + * @return AuthRegistrationsCredentialListMappingInstance Fetched AuthRegistrationsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthRegistrationsCredentialListMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AuthRegistrationsCredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthRegistrationsCredentialListMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingInstance.php new file mode 100755 index 0000000..90506eb --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthRegistrationsCredentialListMappingContext Context for this AuthRegistrationsCredentialListMappingInstance + */ + protected function proxy(): AuthRegistrationsCredentialListMappingContext + { + if (!$this->context) { + $this->context = new AuthRegistrationsCredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AuthRegistrationsCredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AuthRegistrationsCredentialListMappingInstance + * + * @return AuthRegistrationsCredentialListMappingInstance Fetched AuthRegistrationsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthRegistrationsCredentialListMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AuthRegistrationsCredentialListMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingList.php new file mode 100755 index 0000000..f918c84 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/Auth/Registrations/CredentialListMappings.json'; + } + + /** + * Create the AuthRegistrationsCredentialListMappingInstance + * + * @param string $credentialListSid The SID of the CredentialList resource to map to the SIP domain. + * @return AuthRegistrationsCredentialListMappingInstance Created AuthRegistrationsCredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $credentialListSid): AuthRegistrationsCredentialListMappingInstance + { + + $data = Values::of([ + 'CredentialListSid' => + $credentialListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AuthRegistrationsCredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + + + /** + * Reads AuthRegistrationsCredentialListMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AuthRegistrationsCredentialListMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AuthRegistrationsCredentialListMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AuthRegistrationsCredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AuthRegistrationsCredentialListMappingPage Page of AuthRegistrationsCredentialListMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AuthRegistrationsCredentialListMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AuthRegistrationsCredentialListMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AuthRegistrationsCredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AuthRegistrationsCredentialListMappingPage Page of AuthRegistrationsCredentialListMappingInstance + */ + public function getPage(string $targetUrl): AuthRegistrationsCredentialListMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AuthRegistrationsCredentialListMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AuthRegistrationsCredentialListMappingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the CredentialListMapping resource to delete. + */ + public function getContext( + string $sid + + ): AuthRegistrationsCredentialListMappingContext + { + return new AuthRegistrationsCredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthRegistrationsCredentialListMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingPage.php new file mode 100755 index 0000000..07204d2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrations/AuthRegistrationsCredentialListMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthRegistrationsCredentialListMappingInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypes\AuthTypeRegistrations\AuthRegistrationsCredentialListMappingInstance + */ + public function buildInstance(array $payload): AuthRegistrationsCredentialListMappingInstance + { + return new AuthRegistrationsCredentialListMappingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthRegistrationsCredentialListMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsInstance.php new file mode 100755 index 0000000..d1ee75a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsInstance.php @@ -0,0 +1,73 @@ +solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeRegistrationsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsList.php new file mode 100755 index 0000000..7eda124 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsList.php @@ -0,0 +1,118 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + } + + /** + * Access the credentialListMappings + */ + protected function getCredentialListMappings(): AuthRegistrationsCredentialListMappingList + { + if (!$this->_credentialListMappings) { + $this->_credentialListMappings = new AuthRegistrationsCredentialListMappingList( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + return $this->_credentialListMappings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeRegistrationsList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsPage.php new file mode 100755 index 0000000..f91b0a3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypes/AuthTypeRegistrationsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthTypeRegistrationsInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypes\AuthTypeRegistrationsInstance + */ + public function buildInstance(array $payload): AuthTypeRegistrationsInstance + { + return new AuthTypeRegistrationsInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypeRegistrationsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesInstance.php new file mode 100755 index 0000000..c78ea44 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesInstance.php @@ -0,0 +1,73 @@ +solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypesInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesList.php new file mode 100755 index 0000000..95ff60e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesList.php @@ -0,0 +1,135 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + } + + /** + * Access the calls + */ + protected function getCalls(): AuthTypeCallsList + { + if (!$this->_calls) { + $this->_calls = new AuthTypeCallsList( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + return $this->_calls; + } + + /** + * Access the registrations + */ + protected function getRegistrations(): AuthTypeRegistrationsList + { + if (!$this->_registrations) { + $this->_registrations = new AuthTypeRegistrationsList( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + return $this->_registrations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypesList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesPage.php new file mode 100755 index 0000000..45d6cdc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/AuthTypesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthTypesInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\AuthTypesInstance + */ + public function buildInstance(array $payload): AuthTypesInstance + { + return new AuthTypesInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AuthTypesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingContext.php new file mode 100755 index 0000000..1cfd0f3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'domainSid' => + $domainSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/CredentialListMappings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the CredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialListMappingInstance + * + * @return CredentialListMappingInstance Fetched CredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialListMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingInstance.php new file mode 100755 index 0000000..4e16335 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialListMappingContext Context for this CredentialListMappingInstance + */ + protected function proxy(): CredentialListMappingContext + { + if (!$this->context) { + $this->context = new CredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialListMappingInstance + * + * @return CredentialListMappingInstance Fetched CredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.CredentialListMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingList.php new file mode 100755 index 0000000..05b8ccb --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/CredentialListMappings.json'; + } + + /** + * Create the CredentialListMappingInstance + * + * @param string $credentialListSid A 34 character string that uniquely identifies the CredentialList resource to map to the SIP domain. + * @return CredentialListMappingInstance Created CredentialListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $credentialListSid): CredentialListMappingInstance + { + + $data = Values::of([ + 'CredentialListSid' => + $credentialListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + + + /** + * Reads CredentialListMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialListMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialListMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialListMappingPage Page of CredentialListMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialListMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialListMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialListMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialListMappingPage Page of CredentialListMappingInstance + */ + public function getPage(string $targetUrl): CredentialListMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialListMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialListMappingContext + * + * @param string $sid A 34 character string that uniquely identifies the resource to delete. + */ + public function getContext( + string $sid + + ): CredentialListMappingContext + { + return new CredentialListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialListMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingPage.php new file mode 100755 index 0000000..e056ab1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/CredentialListMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialListMappingInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\CredentialListMappingInstance + */ + public function buildInstance(array $payload): CredentialListMappingInstance + { + return new CredentialListMappingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.CredentialListMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingContext.php new file mode 100755 index 0000000..3a9d265 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'accountSid' => + $accountSid, + 'domainSid' => + $domainSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/IpAccessControlListMappings/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the IpAccessControlListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IpAccessControlListMappingInstance + * + * @return IpAccessControlListMappingInstance Fetched IpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpAccessControlListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAccessControlListMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingInstance.php new file mode 100755 index 0000000..0814e52 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'domainSid' => $domainSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpAccessControlListMappingContext Context for this IpAccessControlListMappingInstance + */ + protected function proxy(): IpAccessControlListMappingContext + { + if (!$this->context) { + $this->context = new IpAccessControlListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IpAccessControlListMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IpAccessControlListMappingInstance + * + * @return IpAccessControlListMappingInstance Fetched IpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAccessControlListMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingList.php new file mode 100755 index 0000000..92af8bc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingList.php @@ -0,0 +1,202 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'domainSid' => + $domainSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($domainSid) + .'/IpAccessControlListMappings.json'; + } + + /** + * Create the IpAccessControlListMappingInstance + * + * @param string $ipAccessControlListSid The unique id of the IP access control list to map to the SIP domain. + * @return IpAccessControlListMappingInstance Created IpAccessControlListMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $ipAccessControlListSid): IpAccessControlListMappingInstance + { + + $data = Values::of([ + 'IpAccessControlListSid' => + $ipAccessControlListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpAccessControlListMappingInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['domainSid'] + ); + } + + + /** + * Reads IpAccessControlListMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpAccessControlListMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams IpAccessControlListMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpAccessControlListMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpAccessControlListMappingPage Page of IpAccessControlListMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpAccessControlListMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpAccessControlListMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpAccessControlListMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpAccessControlListMappingPage Page of IpAccessControlListMappingInstance + */ + public function getPage(string $targetUrl): IpAccessControlListMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpAccessControlListMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpAccessControlListMappingContext + * + * @param string $sid A 34 character string that uniquely identifies the resource to delete. + */ + public function getContext( + string $sid + + ): IpAccessControlListMappingContext + { + return new IpAccessControlListMappingContext( + $this->version, + $this->solution['accountSid'], + $this->solution['domainSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAccessControlListMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingPage.php new file mode 100755 index 0000000..f59703f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/Domain/IpAccessControlListMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpAccessControlListMappingInstance \Twilio\Rest\Api\V2010\Account\Sip\Domain\IpAccessControlListMappingInstance + */ + public function buildInstance(array $payload): IpAccessControlListMappingInstance + { + return new IpAccessControlListMappingInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['domainSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAccessControlListMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainContext.php new file mode 100755 index 0000000..f30e40e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainContext.php @@ -0,0 +1,253 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the DomainInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DomainInstance + * + * @return DomainInstance Fetched DomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DomainInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the DomainInstance + * + * @param array|Options $options Optional Arguments + * @return DomainInstance Updated DomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DomainInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceStatusCallbackMethod' => + $options['voiceStatusCallbackMethod'], + 'VoiceStatusCallbackUrl' => + $options['voiceStatusCallbackUrl'], + 'VoiceUrl' => + $options['voiceUrl'], + 'SipRegistration' => + Serialize::booleanToString($options['sipRegistration']), + 'DomainName' => + $options['domainName'], + 'EmergencyCallingEnabled' => + Serialize::booleanToString($options['emergencyCallingEnabled']), + 'Secure' => + Serialize::booleanToString($options['secure']), + 'ByocTrunkSid' => + $options['byocTrunkSid'], + 'EmergencyCallerSid' => + $options['emergencyCallerSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DomainInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the credentialListMappings + */ + protected function getCredentialListMappings(): CredentialListMappingList + { + if (!$this->_credentialListMappings) { + $this->_credentialListMappings = new CredentialListMappingList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_credentialListMappings; + } + + /** + * Access the ipAccessControlListMappings + */ + protected function getIpAccessControlListMappings(): IpAccessControlListMappingList + { + if (!$this->_ipAccessControlListMappings) { + $this->_ipAccessControlListMappings = new IpAccessControlListMappingList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_ipAccessControlListMappings; + } + + /** + * Access the auth + */ + protected function getAuth(): AuthTypesList + { + if (!$this->_auth) { + $this->_auth = new AuthTypesList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_auth; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.DomainContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainInstance.php new file mode 100755 index 0000000..13d6555 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainInstance.php @@ -0,0 +1,215 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'authType' => Values::array_get($payload, 'auth_type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'domainName' => Values::array_get($payload, 'domain_name'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'uri' => Values::array_get($payload, 'uri'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceStatusCallbackMethod' => Values::array_get($payload, 'voice_status_callback_method'), + 'voiceStatusCallbackUrl' => Values::array_get($payload, 'voice_status_callback_url'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'sipRegistration' => Values::array_get($payload, 'sip_registration'), + 'emergencyCallingEnabled' => Values::array_get($payload, 'emergency_calling_enabled'), + 'secure' => Values::array_get($payload, 'secure'), + 'byocTrunkSid' => Values::array_get($payload, 'byoc_trunk_sid'), + 'emergencyCallerSid' => Values::array_get($payload, 'emergency_caller_sid'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DomainContext Context for this DomainInstance + */ + protected function proxy(): DomainContext + { + if (!$this->context) { + $this->context = new DomainContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the DomainInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DomainInstance + * + * @return DomainInstance Fetched DomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DomainInstance + * + * @param array|Options $options Optional Arguments + * @return DomainInstance Updated DomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DomainInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the credentialListMappings + */ + protected function getCredentialListMappings(): CredentialListMappingList + { + return $this->proxy()->credentialListMappings; + } + + /** + * Access the ipAccessControlListMappings + */ + protected function getIpAccessControlListMappings(): IpAccessControlListMappingList + { + return $this->proxy()->ipAccessControlListMappings; + } + + /** + * Access the auth + */ + protected function getAuth(): AuthTypesList + { + return $this->proxy()->auth; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.DomainInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainList.php new file mode 100755 index 0000000..08c917e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainList.php @@ -0,0 +1,223 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/Domains.json'; + } + + /** + * Create the DomainInstance + * + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + * @param array|Options $options Optional Arguments + * @return DomainInstance Created DomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $domainName, array $options = []): DomainInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DomainName' => + $domainName, + 'FriendlyName' => + $options['friendlyName'], + 'VoiceUrl' => + $options['voiceUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceStatusCallbackUrl' => + $options['voiceStatusCallbackUrl'], + 'VoiceStatusCallbackMethod' => + $options['voiceStatusCallbackMethod'], + 'SipRegistration' => + Serialize::booleanToString($options['sipRegistration']), + 'EmergencyCallingEnabled' => + Serialize::booleanToString($options['emergencyCallingEnabled']), + 'Secure' => + Serialize::booleanToString($options['secure']), + 'ByocTrunkSid' => + $options['byocTrunkSid'], + 'EmergencyCallerSid' => + $options['emergencyCallerSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DomainInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads DomainInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DomainInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DomainInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DomainInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DomainPage Page of DomainInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DomainPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DomainPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DomainInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DomainPage Page of DomainInstance + */ + public function getPage(string $targetUrl): DomainPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DomainPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DomainContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the SipDomain resource to delete. + */ + public function getContext( + string $sid + + ): DomainContext + { + return new DomainContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DomainList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainOptions.php new file mode 100755 index 0000000..0fed9e5 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainOptions.php @@ -0,0 +1,548 @@ +options['friendlyName'] = $friendlyName; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceStatusCallbackUrl'] = $voiceStatusCallbackUrl; + $this->options['voiceStatusCallbackMethod'] = $voiceStatusCallbackMethod; + $this->options['sipRegistration'] = $sipRegistration; + $this->options['emergencyCallingEnabled'] = $emergencyCallingEnabled; + $this->options['secure'] = $secure; + $this->options['byocTrunkSid'] = $byocTrunkSid; + $this->options['emergencyCallerSid'] = $emergencyCallerSid; + } + + /** + * A descriptive string that you created to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you created to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL we should when the domain receives a call. + * + * @param string $voiceUrl The URL we should when the domain receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call to pass status parameters (such as call ended) to your application. + * + * @param string $voiceStatusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @return $this Fluent Builder + */ + public function setVoiceStatusCallbackUrl(string $voiceStatusCallbackUrl): self + { + $this->options['voiceStatusCallbackUrl'] = $voiceStatusCallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceStatusCallbackMethod The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceStatusCallbackMethod(string $voiceStatusCallbackMethod): self + { + $this->options['voiceStatusCallbackMethod'] = $voiceStatusCallbackMethod; + return $this; + } + + /** + * Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + * + * @param bool $sipRegistration Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + * @return $this Fluent Builder + */ + public function setSipRegistration(bool $sipRegistration): self + { + $this->options['sipRegistration'] = $sipRegistration; + return $this; + } + + /** + * Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + * + * @param bool $emergencyCallingEnabled Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + * @return $this Fluent Builder + */ + public function setEmergencyCallingEnabled(bool $emergencyCallingEnabled): self + { + $this->options['emergencyCallingEnabled'] = $emergencyCallingEnabled; + return $this; + } + + /** + * Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + * + * @param bool $secure Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + * @return $this Fluent Builder + */ + public function setSecure(bool $secure): self + { + $this->options['secure'] = $secure; + return $this; + } + + /** + * The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + * + * @param string $byocTrunkSid The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + * @return $this Fluent Builder + */ + public function setByocTrunkSid(string $byocTrunkSid): self + { + $this->options['byocTrunkSid'] = $byocTrunkSid; + return $this; + } + + /** + * Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + * + * @param string $emergencyCallerSid Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + * @return $this Fluent Builder + */ + public function setEmergencyCallerSid(string $emergencyCallerSid): self + { + $this->options['emergencyCallerSid'] = $emergencyCallerSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateDomainOptions ' . $options . ']'; + } +} + + + + +class UpdateDomainOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you created to describe the resource. It can be up to 64 characters long. + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * @param string $voiceMethod The HTTP method we should use to call `voice_url` + * @param string $voiceStatusCallbackMethod The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + * @param string $voiceStatusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @param string $voiceUrl The URL we should call when the domain receives a call. + * @param bool $sipRegistration Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + * @param bool $emergencyCallingEnabled Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + * @param bool $secure Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + * @param string $byocTrunkSid The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + * @param string $emergencyCallerSid Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $voiceFallbackMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceStatusCallbackMethod = Values::NONE, + string $voiceStatusCallbackUrl = Values::NONE, + string $voiceUrl = Values::NONE, + bool $sipRegistration = Values::BOOL_NONE, + string $domainName = Values::NONE, + bool $emergencyCallingEnabled = Values::BOOL_NONE, + bool $secure = Values::BOOL_NONE, + string $byocTrunkSid = Values::NONE, + string $emergencyCallerSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceStatusCallbackMethod'] = $voiceStatusCallbackMethod; + $this->options['voiceStatusCallbackUrl'] = $voiceStatusCallbackUrl; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['sipRegistration'] = $sipRegistration; + $this->options['domainName'] = $domainName; + $this->options['emergencyCallingEnabled'] = $emergencyCallingEnabled; + $this->options['secure'] = $secure; + $this->options['byocTrunkSid'] = $byocTrunkSid; + $this->options['emergencyCallerSid'] = $emergencyCallerSid; + } + + /** + * A descriptive string that you created to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you created to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url` + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url` + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceStatusCallbackMethod The HTTP method we should use to call `voice_status_callback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceStatusCallbackMethod(string $voiceStatusCallbackMethod): self + { + $this->options['voiceStatusCallbackMethod'] = $voiceStatusCallbackMethod; + return $this; + } + + /** + * The URL that we should call to pass status parameters (such as call ended) to your application. + * + * @param string $voiceStatusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @return $this Fluent Builder + */ + public function setVoiceStatusCallbackUrl(string $voiceStatusCallbackUrl): self + { + $this->options['voiceStatusCallbackUrl'] = $voiceStatusCallbackUrl; + return $this; + } + + /** + * The URL we should call when the domain receives a call. + * + * @param string $voiceUrl The URL we should call when the domain receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + * + * @param bool $sipRegistration Whether to allow SIP Endpoints to register with the domain to receive calls. Can be `true` or `false`. `true` allows SIP Endpoints to register with the domain to receive calls, `false` does not. + * @return $this Fluent Builder + */ + public function setSipRegistration(bool $sipRegistration): self + { + $this->options['sipRegistration'] = $sipRegistration; + return $this; + } + + /** + * The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + * + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and \\\"-\\\" and must end with `sip.twilio.com`. + * @return $this Fluent Builder + */ + public function setDomainName(string $domainName): self + { + $this->options['domainName'] = $domainName; + return $this; + } + + /** + * Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + * + * @param bool $emergencyCallingEnabled Whether emergency calling is enabled for the domain. If enabled, allows emergency calls on the domain from phone numbers with validated addresses. + * @return $this Fluent Builder + */ + public function setEmergencyCallingEnabled(bool $emergencyCallingEnabled): self + { + $this->options['emergencyCallingEnabled'] = $emergencyCallingEnabled; + return $this; + } + + /** + * Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + * + * @param bool $secure Whether secure SIP is enabled for the domain. If enabled, TLS will be enforced and SRTP will be negotiated on all incoming calls to this sip domain. + * @return $this Fluent Builder + */ + public function setSecure(bool $secure): self + { + $this->options['secure'] = $secure; + return $this; + } + + /** + * The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + * + * @param string $byocTrunkSid The SID of the BYOC Trunk(Bring Your Own Carrier) resource that the Sip Domain will be associated with. + * @return $this Fluent Builder + */ + public function setByocTrunkSid(string $byocTrunkSid): self + { + $this->options['byocTrunkSid'] = $byocTrunkSid; + return $this; + } + + /** + * Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + * + * @param string $emergencyCallerSid Whether an emergency caller sid is configured for the domain. If present, this phone number will be used as the callback for the emergency call. + * @return $this Fluent Builder + */ + public function setEmergencyCallerSid(string $emergencyCallerSid): self + { + $this->options['emergencyCallerSid'] = $emergencyCallerSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateDomainOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainPage.php new file mode 100755 index 0000000..ae4cdb2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/DomainPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DomainInstance \Twilio\Rest\Api\V2010\Account\Sip\DomainInstance + */ + public function buildInstance(array $payload): DomainInstance + { + return new DomainInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DomainPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressContext.php new file mode 100755 index 0000000..99bbf45 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressContext.php @@ -0,0 +1,141 @@ +solution = [ + 'accountSid' => + $accountSid, + 'ipAccessControlListSid' => + $ipAccessControlListSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/IpAccessControlLists/' . \rawurlencode($ipAccessControlListSid) + .'/IpAddresses/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the IpAddressInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IpAddressInstance + * + * @return IpAddressInstance Fetched IpAddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAddressInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpAddressInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['ipAccessControlListSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the IpAddressInstance + * + * @param array|Options $options Optional Arguments + * @return IpAddressInstance Updated IpAddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IpAddressInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IpAddress' => + $options['ipAddress'], + 'FriendlyName' => + $options['friendlyName'], + 'CidrPrefixLength' => + $options['cidrPrefixLength'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new IpAddressInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['ipAccessControlListSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAddressContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressInstance.php new file mode 100755 index 0000000..fd18a90 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'ipAddress' => Values::array_get($payload, 'ip_address'), + 'cidrPrefixLength' => Values::array_get($payload, 'cidr_prefix_length'), + 'ipAccessControlListSid' => Values::array_get($payload, 'ip_access_control_list_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'ipAccessControlListSid' => $ipAccessControlListSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpAddressContext Context for this IpAddressInstance + */ + protected function proxy(): IpAddressContext + { + if (!$this->context) { + $this->context = new IpAddressContext( + $this->version, + $this->solution['accountSid'], + $this->solution['ipAccessControlListSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IpAddressInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IpAddressInstance + * + * @return IpAddressInstance Fetched IpAddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAddressInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the IpAddressInstance + * + * @param array|Options $options Optional Arguments + * @return IpAddressInstance Updated IpAddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IpAddressInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAddressInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressList.php new file mode 100755 index 0000000..2c58c7e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressList.php @@ -0,0 +1,211 @@ +solution = [ + 'accountSid' => + $accountSid, + + 'ipAccessControlListSid' => + $ipAccessControlListSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/IpAccessControlLists/' . \rawurlencode($ipAccessControlListSid) + .'/IpAddresses.json'; + } + + /** + * Create the IpAddressInstance + * + * @param string $friendlyName A human readable descriptive text for this resource, up to 255 characters long. + * @param string $ipAddress An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + * @param array|Options $options Optional Arguments + * @return IpAddressInstance Created IpAddressInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $ipAddress, array $options = []): IpAddressInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'IpAddress' => + $ipAddress, + 'CidrPrefixLength' => + $options['cidrPrefixLength'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpAddressInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['ipAccessControlListSid'] + ); + } + + + /** + * Reads IpAddressInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpAddressInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams IpAddressInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpAddressInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpAddressPage Page of IpAddressInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpAddressPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpAddressPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpAddressInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpAddressPage Page of IpAddressInstance + */ + public function getPage(string $targetUrl): IpAddressPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpAddressPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpAddressContext + * + * @param string $sid A 34 character string that uniquely identifies the resource to delete. + */ + public function getContext( + string $sid + + ): IpAddressContext + { + return new IpAddressContext( + $this->version, + $this->solution['accountSid'], + $this->solution['ipAccessControlListSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAddressList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressOptions.php new file mode 100755 index 0000000..f02a1a4 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressOptions.php @@ -0,0 +1,170 @@ +options['cidrPrefixLength'] = $cidrPrefixLength; + } + + /** + * An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + * + * @param int $cidrPrefixLength An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + * @return $this Fluent Builder + */ + public function setCidrPrefixLength(int $cidrPrefixLength): self + { + $this->options['cidrPrefixLength'] = $cidrPrefixLength; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateIpAddressOptions ' . $options . ']'; + } +} + + + + +class UpdateIpAddressOptions extends Options + { + /** + * @param string $ipAddress An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + * @param string $friendlyName A human readable descriptive text for this resource, up to 255 characters long. + * @param int $cidrPrefixLength An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + */ + public function __construct( + + string $ipAddress = Values::NONE, + string $friendlyName = Values::NONE, + int $cidrPrefixLength = Values::INT_NONE + + ) { + $this->options['ipAddress'] = $ipAddress; + $this->options['friendlyName'] = $friendlyName; + $this->options['cidrPrefixLength'] = $cidrPrefixLength; + } + + /** + * An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + * + * @param string $ipAddress An IP address in dotted decimal notation from which you want to accept traffic. Any SIP requests from this IP address will be allowed by Twilio. IPv4 only supported today. + * @return $this Fluent Builder + */ + public function setIpAddress(string $ipAddress): self + { + $this->options['ipAddress'] = $ipAddress; + return $this; + } + + /** + * A human readable descriptive text for this resource, up to 255 characters long. + * + * @param string $friendlyName A human readable descriptive text for this resource, up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + * + * @param int $cidrPrefixLength An integer representing the length of the CIDR prefix to use with this IP address when accepting traffic. By default the entire IP address is used. + * @return $this Fluent Builder + */ + public function setCidrPrefixLength(int $cidrPrefixLength): self + { + $this->options['cidrPrefixLength'] = $cidrPrefixLength; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateIpAddressOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressPage.php new file mode 100755 index 0000000..c7821b0 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlList/IpAddressPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpAddressInstance \Twilio\Rest\Api\V2010\Account\Sip\IpAccessControlList\IpAddressInstance + */ + public function buildInstance(array $payload): IpAddressInstance + { + return new IpAddressInstance($this->version, $payload, $this->solution['accountSid'], $this->solution['ipAccessControlListSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAddressPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListContext.php new file mode 100755 index 0000000..1b56bbe --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListContext.php @@ -0,0 +1,186 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/IpAccessControlLists/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the IpAccessControlListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IpAccessControlListInstance + * + * @return IpAccessControlListInstance Fetched IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpAccessControlListInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the IpAccessControlListInstance + * + * @param string $friendlyName A human readable descriptive text, up to 255 characters long. + * @return IpAccessControlListInstance Updated IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): IpAccessControlListInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new IpAccessControlListInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the ipAddresses + */ + protected function getIpAddresses(): IpAddressList + { + if (!$this->_ipAddresses) { + $this->_ipAddresses = new IpAddressList( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->_ipAddresses; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAccessControlListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListInstance.php new file mode 100755 index 0000000..045ef68 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpAccessControlListContext Context for this IpAccessControlListInstance + */ + protected function proxy(): IpAccessControlListContext + { + if (!$this->context) { + $this->context = new IpAccessControlListContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IpAccessControlListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IpAccessControlListInstance + * + * @return IpAccessControlListInstance Fetched IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the IpAccessControlListInstance + * + * @param string $friendlyName A human readable descriptive text, up to 255 characters long. + * @return IpAccessControlListInstance Updated IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): IpAccessControlListInstance + { + + return $this->proxy()->update($friendlyName); + } + + /** + * Access the ipAddresses + */ + protected function getIpAddresses(): IpAddressList + { + return $this->proxy()->ipAddresses; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.IpAccessControlListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListList.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListList.php new file mode 100755 index 0000000..c8b1edc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListList.php @@ -0,0 +1,194 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/SIP/IpAccessControlLists.json'; + } + + /** + * Create the IpAccessControlListInstance + * + * @param string $friendlyName A human readable descriptive text that describes the IpAccessControlList, up to 255 characters long. + * @return IpAccessControlListInstance Created IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): IpAccessControlListInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpAccessControlListInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads IpAccessControlListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpAccessControlListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams IpAccessControlListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpAccessControlListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpAccessControlListPage Page of IpAccessControlListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpAccessControlListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpAccessControlListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpAccessControlListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpAccessControlListPage Page of IpAccessControlListInstance + */ + public function getPage(string $targetUrl): IpAccessControlListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpAccessControlListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpAccessControlListContext + * + * @param string $sid A 34 character string that uniquely identifies the resource to delete. + */ + public function getContext( + string $sid + + ): IpAccessControlListContext + { + return new IpAccessControlListContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAccessControlListList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListPage.php new file mode 100755 index 0000000..3a0088e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Sip/IpAccessControlListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpAccessControlListInstance \Twilio\Rest\Api\V2010\Account\Sip\IpAccessControlListInstance + */ + public function buildInstance(array $payload): IpAccessControlListInstance + { + return new IpAccessControlListInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.IpAccessControlListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SipInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/SipInstance.php new file mode 100755 index 0000000..efaf940 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SipInstance.php @@ -0,0 +1,72 @@ +solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SipInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SipList.php b/app/api/Twilio/Rest/Api/V2010/Account/SipList.php new file mode 100755 index 0000000..221a19f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SipList.php @@ -0,0 +1,148 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + } + + /** + * Access the domains + */ + protected function getDomains(): DomainList + { + if (!$this->_domains) { + $this->_domains = new DomainList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_domains; + } + + /** + * Access the credentialLists + */ + protected function getCredentialLists(): CredentialListList + { + if (!$this->_credentialLists) { + $this->_credentialLists = new CredentialListList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_credentialLists; + } + + /** + * Access the ipAccessControlLists + */ + protected function getIpAccessControlLists(): IpAccessControlListList + { + if (!$this->_ipAccessControlLists) { + $this->_ipAccessControlLists = new IpAccessControlListList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_ipAccessControlLists; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SipList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/SipPage.php b/app/api/Twilio/Rest/Api/V2010/Account/SipPage.php new file mode 100755 index 0000000..0a13bcc --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/SipPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SipInstance \Twilio\Rest\Api\V2010\Account\SipInstance + */ + public function buildInstance(array $payload): SipInstance + { + return new SipInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.SipPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TokenInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/TokenInstance.php new file mode 100755 index 0000000..071d02e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TokenInstance.php @@ -0,0 +1,94 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'iceServers' => Values::array_get($payload, 'ice_servers'), + 'password' => Values::array_get($payload, 'password'), + 'ttl' => Values::array_get($payload, 'ttl'), + 'username' => Values::array_get($payload, 'username'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TokenInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TokenList.php b/app/api/Twilio/Rest/Api/V2010/Account/TokenList.php new file mode 100755 index 0000000..3e2c7f7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TokenList.php @@ -0,0 +1,87 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Tokens.json'; + } + + /** + * Create the TokenInstance + * + * @param array|Options $options Optional Arguments + * @return TokenInstance Created TokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): TokenInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TokenInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TokenList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TokenOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/TokenOptions.php new file mode 100755 index 0000000..b483446 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TokenOptions.php @@ -0,0 +1,76 @@ +options['ttl'] = $ttl; + } + + /** + * The duration in seconds for which the generated credentials are valid. The default value is 86400 (24 hours). + * + * @param int $ttl The duration in seconds for which the generated credentials are valid. The default value is 86400 (24 hours). + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateTokenOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TokenPage.php b/app/api/Twilio/Rest/Api/V2010/Account/TokenPage.php new file mode 100755 index 0000000..04b988a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TokenPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TokenInstance \Twilio\Rest\Api\V2010\Account\TokenInstance + */ + public function buildInstance(array $payload): TokenInstance + { + return new TokenInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TokenPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionContext.php b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionContext.php new file mode 100755 index 0000000..7ba341b --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionContext.php @@ -0,0 +1,100 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Transcriptions/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the TranscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TranscriptionInstance + * + * @return TranscriptionInstance Fetched TranscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TranscriptionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TranscriptionInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TranscriptionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionInstance.php new file mode 100755 index 0000000..e1c0513 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'duration' => Values::array_get($payload, 'duration'), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'recordingSid' => Values::array_get($payload, 'recording_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'transcriptionText' => Values::array_get($payload, 'transcription_text'), + 'type' => Values::array_get($payload, 'type'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TranscriptionContext Context for this TranscriptionInstance + */ + protected function proxy(): TranscriptionContext + { + if (!$this->context) { + $this->context = new TranscriptionContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TranscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TranscriptionInstance + * + * @return TranscriptionInstance Fetched TranscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TranscriptionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TranscriptionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionList.php b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionList.php new file mode 100755 index 0000000..e548a13 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionList.php @@ -0,0 +1,168 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Transcriptions.json'; + } + + /** + * Reads TranscriptionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TranscriptionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TranscriptionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TranscriptionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TranscriptionPage Page of TranscriptionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TranscriptionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TranscriptionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TranscriptionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TranscriptionPage Page of TranscriptionInstance + */ + public function getPage(string $targetUrl): TranscriptionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TranscriptionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TranscriptionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Transcription resource to delete. + */ + public function getContext( + string $sid + + ): TranscriptionContext + { + return new TranscriptionContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TranscriptionList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionPage.php b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionPage.php new file mode 100755 index 0000000..eda5be9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/TranscriptionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TranscriptionInstance \Twilio\Rest\Api\V2010\Account\TranscriptionInstance + */ + public function buildInstance(array $payload): TranscriptionInstance + { + return new TranscriptionInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TranscriptionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeInstance.php new file mode 100755 index 0000000..f393a90 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AllTimeInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeList.php new file mode 100755 index 0000000..10d8083 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/AllTime.json'; + } + + /** + * Reads AllTimeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AllTimeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AllTimeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AllTimeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AllTimePage Page of AllTimeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AllTimePage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AllTimePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AllTimeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AllTimePage Page of AllTimeInstance + */ + public function getPage(string $targetUrl): AllTimePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AllTimePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AllTimeList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeOptions.php new file mode 100755 index 0000000..a0c210f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimeOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadAllTimeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimePage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimePage.php new file mode 100755 index 0000000..b4888b2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/AllTimePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AllTimeInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\AllTimeInstance + */ + public function buildInstance(array $payload): AllTimeInstance + { + return new AllTimeInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AllTimePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyInstance.php new file mode 100755 index 0000000..33ee0b6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DailyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyList.php new file mode 100755 index 0000000..9bde082 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/Daily.json'; + } + + /** + * Reads DailyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DailyInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams DailyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DailyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DailyPage Page of DailyInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DailyPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DailyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DailyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DailyPage Page of DailyInstance + */ + public function getPage(string $targetUrl): DailyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DailyPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DailyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyOptions.php new file mode 100755 index 0000000..cc0d8d6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadDailyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyPage.php new file mode 100755 index 0000000..a400572 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/DailyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DailyInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\DailyInstance + */ + public function buildInstance(array $payload): DailyInstance + { + return new DailyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.DailyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthInstance.php new file mode 100755 index 0000000..f5c1c26 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LastMonthInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthList.php new file mode 100755 index 0000000..49a9f61 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/LastMonth.json'; + } + + /** + * Reads LastMonthInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return LastMonthInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams LastMonthInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of LastMonthInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return LastMonthPage Page of LastMonthInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): LastMonthPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new LastMonthPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of LastMonthInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return LastMonthPage Page of LastMonthInstance + */ + public function getPage(string $targetUrl): LastMonthPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new LastMonthPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LastMonthList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthOptions.php new file mode 100755 index 0000000..c014b4a --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadLastMonthOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthPage.php new file mode 100755 index 0000000..b32dd94 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/LastMonthPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LastMonthInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\LastMonthInstance + */ + public function buildInstance(array $payload): LastMonthInstance + { + return new LastMonthInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.LastMonthPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyInstance.php new file mode 100755 index 0000000..8c5b742 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MonthlyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyList.php new file mode 100755 index 0000000..0cef114 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/Monthly.json'; + } + + /** + * Reads MonthlyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MonthlyInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MonthlyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MonthlyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MonthlyPage Page of MonthlyInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MonthlyPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MonthlyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MonthlyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MonthlyPage Page of MonthlyInstance + */ + public function getPage(string $targetUrl): MonthlyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MonthlyPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MonthlyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyOptions.php new file mode 100755 index 0000000..4fa256d --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadMonthlyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyPage.php new file mode 100755 index 0000000..9b48474 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/MonthlyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MonthlyInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\MonthlyInstance + */ + public function buildInstance(array $payload): MonthlyInstance + { + return new MonthlyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.MonthlyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthInstance.php new file mode 100755 index 0000000..5e3a501 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ThisMonthInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthList.php new file mode 100755 index 0000000..5b96e65 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/ThisMonth.json'; + } + + /** + * Reads ThisMonthInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ThisMonthInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ThisMonthInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ThisMonthInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ThisMonthPage Page of ThisMonthInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ThisMonthPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ThisMonthPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ThisMonthInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ThisMonthPage Page of ThisMonthInstance + */ + public function getPage(string $targetUrl): ThisMonthPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ThisMonthPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ThisMonthList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthOptions.php new file mode 100755 index 0000000..2d60fc0 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadThisMonthOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthPage.php new file mode 100755 index 0000000..ec84c9f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/ThisMonthPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ThisMonthInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\ThisMonthInstance + */ + public function buildInstance(array $payload): ThisMonthInstance + { + return new ThisMonthInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ThisMonthPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayInstance.php new file mode 100755 index 0000000..3201646 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TodayInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayList.php new file mode 100755 index 0000000..e228d6c --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/Today.json'; + } + + /** + * Reads TodayInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TodayInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TodayInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TodayInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TodayPage Page of TodayInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TodayPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TodayPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TodayInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TodayPage Page of TodayInstance + */ + public function getPage(string $targetUrl): TodayPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TodayPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TodayList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayOptions.php new file mode 100755 index 0000000..8948c33 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadTodayOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayPage.php new file mode 100755 index 0000000..f242499 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/TodayPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TodayInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\TodayInstance + */ + public function buildInstance(array $payload): TodayInstance + { + return new TodayInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TodayPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyInstance.php new file mode 100755 index 0000000..dc1e34e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YearlyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyList.php new file mode 100755 index 0000000..d79b627 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/Yearly.json'; + } + + /** + * Reads YearlyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return YearlyInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams YearlyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of YearlyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return YearlyPage Page of YearlyInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): YearlyPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new YearlyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of YearlyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return YearlyPage Page of YearlyInstance + */ + public function getPage(string $targetUrl): YearlyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new YearlyPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YearlyList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyOptions.php new file mode 100755 index 0000000..4867d81 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadYearlyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyPage.php new file mode 100755 index 0000000..cb084b9 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YearlyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return YearlyInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\YearlyInstance + */ + public function buildInstance(array $payload): YearlyInstance + { + return new YearlyInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YearlyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayInstance.php new file mode 100755 index 0000000..54bfab2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YesterdayInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayList.php new file mode 100755 index 0000000..3565074 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayList.php @@ -0,0 +1,165 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records/Yesterday.json'; + } + + /** + * Reads YesterdayInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return YesterdayInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams YesterdayInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of YesterdayInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return YesterdayPage Page of YesterdayInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): YesterdayPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new YesterdayPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of YesterdayInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return YesterdayPage Page of YesterdayInstance + */ + public function getPage(string $targetUrl): YesterdayPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new YesterdayPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YesterdayList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayOptions.php new file mode 100755 index 0000000..fd3a3f6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadYesterdayOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayPage.php new file mode 100755 index 0000000..60bc4cd --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/Record/YesterdayPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return YesterdayInstance \Twilio\Rest\Api\V2010\Account\Usage\Record\YesterdayInstance + */ + public function buildInstance(array $payload): YesterdayInstance + { + return new YesterdayInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.YesterdayPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordInstance.php new file mode 100755 index 0000000..30a99ef --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordInstance.php @@ -0,0 +1,110 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'asOf' => Values::array_get($payload, 'as_of'), + 'category' => Values::array_get($payload, 'category'), + 'count' => Values::array_get($payload, 'count'), + 'countUnit' => Values::array_get($payload, 'count_unit'), + 'description' => Values::array_get($payload, 'description'), + 'endDate' => Deserialize::dateTime(Values::array_get($payload, 'end_date')), + 'price' => Values::array_get($payload, 'price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'startDate' => Deserialize::dateTime(Values::array_get($payload, 'start_date')), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'uri' => Values::array_get($payload, 'uri'), + 'usage' => Values::array_get($payload, 'usage'), + 'usageUnit' => Values::array_get($payload, 'usage_unit'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordList.php new file mode 100755 index 0000000..37e6fa1 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordList.php @@ -0,0 +1,341 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Records.json'; + } + + /** + * Reads RecordInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RecordInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RecordInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RecordInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RecordPage Page of RecordInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RecordPage + { + $options = new Values($options); + + $params = Values::of([ + 'Category' => + $options['category'], + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'IncludeSubaccounts' => + Serialize::booleanToString($options['includeSubaccounts']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RecordPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RecordInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RecordPage Page of RecordInstance + */ + public function getPage(string $targetUrl): RecordPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RecordPage($this->version, $response, $this->solution); + } + + + /** + * Access the lastMonth + */ + protected function getLastMonth(): LastMonthList + { + if (!$this->_lastMonth) { + $this->_lastMonth = new LastMonthList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_lastMonth; + } + + /** + * Access the today + */ + protected function getToday(): TodayList + { + if (!$this->_today) { + $this->_today = new TodayList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_today; + } + + /** + * Access the yearly + */ + protected function getYearly(): YearlyList + { + if (!$this->_yearly) { + $this->_yearly = new YearlyList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_yearly; + } + + /** + * Access the thisMonth + */ + protected function getThisMonth(): ThisMonthList + { + if (!$this->_thisMonth) { + $this->_thisMonth = new ThisMonthList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_thisMonth; + } + + /** + * Access the daily + */ + protected function getDaily(): DailyList + { + if (!$this->_daily) { + $this->_daily = new DailyList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_daily; + } + + /** + * Access the allTime + */ + protected function getAllTime(): AllTimeList + { + if (!$this->_allTime) { + $this->_allTime = new AllTimeList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_allTime; + } + + /** + * Access the yesterday + */ + protected function getYesterday(): YesterdayList + { + if (!$this->_yesterday) { + $this->_yesterday = new YesterdayList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_yesterday; + } + + /** + * Access the monthly + */ + protected function getMonthly(): MonthlyList + { + if (!$this->_monthly) { + $this->_monthly = new MonthlyList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_monthly; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordOptions.php new file mode 100755 index 0000000..9ba15b3 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordOptions.php @@ -0,0 +1,130 @@ +options['category'] = $category; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['includeSubaccounts'] = $includeSubaccounts; + } + + /** + * The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * + * @param string $category The [usage category](https://www.twilio.com/docs/usage/api/usage-record#usage-categories) of the UsageRecord resources to read. Only UsageRecord resources in the specified category are retrieved. + * @return $this Fluent Builder + */ + public function setCategory(string $category): self + { + $this->options['category'] = $category; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `-30days`, which will set the start date to be 30 days before the current date. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. You can also specify offsets from the current date, such as: `+30days`, which will set the end date to 30 days from the current date. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * + * @param bool $includeSubaccounts Whether to include usage from the master account and all its subaccounts. Can be: `true` (the default) to include usage from the master account and all subaccounts or `false` to retrieve usage from only the specified account. + * @return $this Fluent Builder + */ + public function setIncludeSubaccounts(bool $includeSubaccounts): self + { + $this->options['includeSubaccounts'] = $includeSubaccounts; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadRecordOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordPage.php new file mode 100755 index 0000000..5a277fa --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/RecordPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordInstance \Twilio\Rest\Api\V2010\Account\Usage\RecordInstance + */ + public function buildInstance(array $payload): RecordInstance + { + return new RecordInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.RecordPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerContext.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerContext.php new file mode 100755 index 0000000..2dcf201 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerContext.php @@ -0,0 +1,134 @@ +solution = [ + 'accountSid' => + $accountSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Triggers/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Delete the TriggerInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TriggerInstance + * + * @return TriggerInstance Fetched TriggerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TriggerInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TriggerInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TriggerInstance + * + * @param array|Options $options Optional Arguments + * @return TriggerInstance Updated TriggerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TriggerInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TriggerInstance( + $this->version, + $payload, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TriggerContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerInstance.php new file mode 100755 index 0000000..b8291c7 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerInstance.php @@ -0,0 +1,174 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'callbackMethod' => Values::array_get($payload, 'callback_method'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'currentValue' => Values::array_get($payload, 'current_value'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateFired' => Deserialize::dateTime(Values::array_get($payload, 'date_fired')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'recurring' => Values::array_get($payload, 'recurring'), + 'sid' => Values::array_get($payload, 'sid'), + 'triggerBy' => Values::array_get($payload, 'trigger_by'), + 'triggerValue' => Values::array_get($payload, 'trigger_value'), + 'uri' => Values::array_get($payload, 'uri'), + 'usageCategory' => Values::array_get($payload, 'usage_category'), + 'usageRecordUri' => Values::array_get($payload, 'usage_record_uri'), + ]; + + $this->solution = ['accountSid' => $accountSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TriggerContext Context for this TriggerInstance + */ + protected function proxy(): TriggerContext + { + if (!$this->context) { + $this->context = new TriggerContext( + $this->version, + $this->solution['accountSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TriggerInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TriggerInstance + * + * @return TriggerInstance Fetched TriggerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TriggerInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TriggerInstance + * + * @param array|Options $options Optional Arguments + * @return TriggerInstance Updated TriggerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TriggerInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.TriggerInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerList.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerList.php new file mode 100755 index 0000000..86e7c2e --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerList.php @@ -0,0 +1,222 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/Usage/Triggers.json'; + } + + /** + * Create the TriggerInstance + * + * @param string $callbackUrl The URL we should call using `callback_method` when the trigger fires. + * @param string $triggerValue The usage value at which the trigger should fire. For convenience, you can use an offset value such as `+30` to specify a trigger_value that is 30 units more than the current usage value. Be sure to urlencode a `+` as `%2B`. + * @param string $usageCategory + * @param array|Options $options Optional Arguments + * @return TriggerInstance Created TriggerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $callbackUrl, string $triggerValue, string $usageCategory, array $options = []): TriggerInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CallbackUrl' => + $callbackUrl, + 'TriggerValue' => + $triggerValue, + 'UsageCategory' => + $usageCategory, + 'CallbackMethod' => + $options['callbackMethod'], + 'FriendlyName' => + $options['friendlyName'], + 'Recurring' => + $options['recurring'], + 'TriggerBy' => + $options['triggerBy'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TriggerInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Reads TriggerInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TriggerInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TriggerInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TriggerInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TriggerPage Page of TriggerInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TriggerPage + { + $options = new Values($options); + + $params = Values::of([ + 'Recurring' => + $options['recurring'], + 'TriggerBy' => + $options['triggerBy'], + 'UsageCategory' => + $options['usageCategory'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TriggerPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TriggerInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TriggerPage Page of TriggerInstance + */ + public function getPage(string $targetUrl): TriggerPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TriggerPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TriggerContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the UsageTrigger resource to delete. + */ + public function getContext( + string $sid + + ): TriggerContext + { + return new TriggerContext( + $this->version, + $this->solution['accountSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TriggerList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerOptions.php new file mode 100755 index 0000000..a29b275 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerOptions.php @@ -0,0 +1,306 @@ +options['callbackMethod'] = $callbackMethod; + $this->options['friendlyName'] = $friendlyName; + $this->options['recurring'] = $recurring; + $this->options['triggerBy'] = $triggerBy; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * @param string $recurring + * @return $this Fluent Builder + */ + public function setRecurring(string $recurring): self + { + $this->options['recurring'] = $recurring; + return $this; + } + + /** + * @param string $triggerBy + * @return $this Fluent Builder + */ + public function setTriggerBy(string $triggerBy): self + { + $this->options['triggerBy'] = $triggerBy; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateTriggerOptions ' . $options . ']'; + } +} + + + +class ReadTriggerOptions extends Options + { + /** + * @param string $recurring The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + * @param string $triggerBy The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + * @param string $usageCategory The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + */ + public function __construct( + + string $recurring = Values::NONE, + string $triggerBy = Values::NONE, + string $usageCategory = Values::NONE + + ) { + $this->options['recurring'] = $recurring; + $this->options['triggerBy'] = $triggerBy; + $this->options['usageCategory'] = $usageCategory; + } + + /** + * The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + * + * @param string $recurring The frequency of recurring UsageTriggers to read. Can be: `daily`, `monthly`, or `yearly` to read recurring UsageTriggers. An empty value or a value of `alltime` reads non-recurring UsageTriggers. + * @return $this Fluent Builder + */ + public function setRecurring(string $recurring): self + { + $this->options['recurring'] = $recurring; + return $this; + } + + /** + * The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + * + * @param string $triggerBy The trigger field of the UsageTriggers to read. Can be: `count`, `usage`, or `price` as described in the [UsageRecords documentation](https://www.twilio.com/docs/usage/api/usage-record#usage-count-price). + * @return $this Fluent Builder + */ + public function setTriggerBy(string $triggerBy): self + { + $this->options['triggerBy'] = $triggerBy; + return $this; + } + + /** + * The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + * + * @param string $usageCategory The usage category of the UsageTriggers to read. Must be a supported [usage categories](https://www.twilio.com/docs/usage/api/usage-record#usage-categories). + * @return $this Fluent Builder + */ + public function setUsageCategory(string $usageCategory): self + { + $this->options['usageCategory'] = $usageCategory; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadTriggerOptions ' . $options . ']'; + } +} + +class UpdateTriggerOptions extends Options + { + /** + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + * @param string $callbackUrl The URL we should call using `callback_method` when the trigger fires. + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + */ + public function __construct( + + string $callbackMethod = Values::NONE, + string $callbackUrl = Values::NONE, + string $friendlyName = Values::NONE + + ) { + $this->options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * The URL we should call using `callback_method` when the trigger fires. + * + * @param string $callbackUrl The URL we should call using `callback_method` when the trigger fires. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateTriggerOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerPage.php b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerPage.php new file mode 100755 index 0000000..9d26280 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/Usage/TriggerPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TriggerInstance \Twilio\Rest\Api\V2010\Account\Usage\TriggerInstance + */ + public function buildInstance(array $payload): TriggerInstance + { + return new TriggerInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.TriggerPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/UsageInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/UsageInstance.php new file mode 100755 index 0000000..764a99f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/UsageInstance.php @@ -0,0 +1,72 @@ +solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UsageInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/UsageList.php b/app/api/Twilio/Rest/Api/V2010/Account/UsageList.php new file mode 100755 index 0000000..cb7c5c0 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/UsageList.php @@ -0,0 +1,129 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + } + + /** + * Access the records + */ + protected function getRecords(): RecordList + { + if (!$this->_records) { + $this->_records = new RecordList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_records; + } + + /** + * Access the triggers + */ + protected function getTriggers(): TriggerList + { + if (!$this->_triggers) { + $this->_triggers = new TriggerList( + $this->version, + $this->solution['accountSid'] + ); + } + return $this->_triggers; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UsageList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/UsagePage.php b/app/api/Twilio/Rest/Api/V2010/Account/UsagePage.php new file mode 100755 index 0000000..44a32e6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/UsagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsageInstance \Twilio\Rest\Api\V2010\Account\UsageInstance + */ + public function buildInstance(array $payload): UsageInstance + { + return new UsageInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.UsagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestInstance.php b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestInstance.php new file mode 100755 index 0000000..dbcb86f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'validationCode' => Values::array_get($payload, 'validation_code'), + ]; + + $this->solution = ['accountSid' => $accountSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ValidationRequestInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestList.php b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestList.php new file mode 100755 index 0000000..8e9dde2 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestList.php @@ -0,0 +1,98 @@ +solution = [ + 'accountSid' => + $accountSid, + + ]; + + $this->uri = '/Accounts/' . \rawurlencode($accountSid) + .'/OutgoingCallerIds.json'; + } + + /** + * Create the ValidationRequestInstance + * + * @param string $phoneNumber The phone number to verify in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + * @param array|Options $options Optional Arguments + * @return ValidationRequestInstance Created ValidationRequestInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber, array $options = []): ValidationRequestInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + 'FriendlyName' => + $options['friendlyName'], + 'CallDelay' => + $options['callDelay'], + 'Extension' => + $options['extension'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ValidationRequestInstance( + $this->version, + $payload, + $this->solution['accountSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ValidationRequestList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestOptions.php b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestOptions.php new file mode 100755 index 0000000..646db22 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestOptions.php @@ -0,0 +1,148 @@ +options['friendlyName'] = $friendlyName; + $this->options['callDelay'] = $callDelay; + $this->options['extension'] = $extension; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + } + + /** + * A descriptive string that you create to describe the new caller ID resource. It can be up to 64 characters long. The default value is a formatted version of the phone number. + * + * @param string $friendlyName A descriptive string that you create to describe the new caller ID resource. It can be up to 64 characters long. The default value is a formatted version of the phone number. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The number of seconds to delay before initiating the verification call. Can be an integer between `0` and `60`, inclusive. The default is `0`. + * + * @param int $callDelay The number of seconds to delay before initiating the verification call. Can be an integer between `0` and `60`, inclusive. The default is `0`. + * @return $this Fluent Builder + */ + public function setCallDelay(int $callDelay): self + { + $this->options['callDelay'] = $callDelay; + return $this; + } + + /** + * The digits to dial after connecting the verification call. + * + * @param string $extension The digits to dial after connecting the verification call. + * @return $this Fluent Builder + */ + public function setExtension(string $extension): self + { + $this->options['extension'] = $extension; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information about the verification process to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information about the verification process to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`, and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `GET` or `POST`, and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateValidationRequestOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestPage.php b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestPage.php new file mode 100755 index 0000000..18d8053 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/Account/ValidationRequestPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ValidationRequestInstance \Twilio\Rest\Api\V2010\Account\ValidationRequestInstance + */ + public function buildInstance(array $payload): ValidationRequestInstance + { + return new ValidationRequestInstance($this->version, $payload, $this->solution['accountSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.ValidationRequestPage]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/AccountContext.php b/app/api/Twilio/Rest/Api/V2010/AccountContext.php new file mode 100755 index 0000000..14df4b6 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/AccountContext.php @@ -0,0 +1,600 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Accounts/' . \rawurlencode($sid) + .'.json'; + } + + /** + * Fetch the AccountInstance + * + * @return AccountInstance Fetched AccountInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AccountInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AccountInstance + * + * @param array|Options $options Optional Arguments + * @return AccountInstance Updated AccountInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AccountInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AccountInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RecordingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_recordings; + } + + /** + * Access the usage + */ + protected function getUsage(): UsageList + { + if (!$this->_usage) { + $this->_usage = new UsageList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_usage; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Access the keys + */ + protected function getKeys(): KeyList + { + if (!$this->_keys) { + $this->_keys = new KeyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_keys; + } + + /** + * Access the newKeys + */ + protected function getNewKeys(): NewKeyList + { + if (!$this->_newKeys) { + $this->_newKeys = new NewKeyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_newKeys; + } + + /** + * Access the applications + */ + protected function getApplications(): ApplicationList + { + if (!$this->_applications) { + $this->_applications = new ApplicationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_applications; + } + + /** + * Access the incomingPhoneNumbers + */ + protected function getIncomingPhoneNumbers(): IncomingPhoneNumberList + { + if (!$this->_incomingPhoneNumbers) { + $this->_incomingPhoneNumbers = new IncomingPhoneNumberList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_incomingPhoneNumbers; + } + + /** + * Access the conferences + */ + protected function getConferences(): ConferenceList + { + if (!$this->_conferences) { + $this->_conferences = new ConferenceList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_conferences; + } + + /** + * Access the calls + */ + protected function getCalls(): CallList + { + if (!$this->_calls) { + $this->_calls = new CallList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_calls; + } + + /** + * Access the outgoingCallerIds + */ + protected function getOutgoingCallerIds(): OutgoingCallerIdList + { + if (!$this->_outgoingCallerIds) { + $this->_outgoingCallerIds = new OutgoingCallerIdList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_outgoingCallerIds; + } + + /** + * Access the validationRequests + */ + protected function getValidationRequests(): ValidationRequestList + { + if (!$this->_validationRequests) { + $this->_validationRequests = new ValidationRequestList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_validationRequests; + } + + /** + * Access the transcriptions + */ + protected function getTranscriptions(): TranscriptionList + { + if (!$this->_transcriptions) { + $this->_transcriptions = new TranscriptionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_transcriptions; + } + + /** + * Access the connectApps + */ + protected function getConnectApps(): ConnectAppList + { + if (!$this->_connectApps) { + $this->_connectApps = new ConnectAppList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_connectApps; + } + + /** + * Access the authorizedConnectApps + */ + protected function getAuthorizedConnectApps(): AuthorizedConnectAppList + { + if (!$this->_authorizedConnectApps) { + $this->_authorizedConnectApps = new AuthorizedConnectAppList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_authorizedConnectApps; + } + + /** + * Access the tokens + */ + protected function getTokens(): TokenList + { + if (!$this->_tokens) { + $this->_tokens = new TokenList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_tokens; + } + + /** + * Access the balance + */ + protected function getBalance(): BalanceList + { + if (!$this->_balance) { + $this->_balance = new BalanceList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_balance; + } + + /** + * Access the sip + */ + protected function getSip(): SipList + { + if (!$this->_sip) { + $this->_sip = new SipList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_sip; + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + if (!$this->_notifications) { + $this->_notifications = new NotificationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_notifications; + } + + /** + * Access the availablePhoneNumbers + */ + protected function getAvailablePhoneNumbers(): AvailablePhoneNumberCountryList + { + if (!$this->_availablePhoneNumbers) { + $this->_availablePhoneNumbers = new AvailablePhoneNumberCountryList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_availablePhoneNumbers; + } + + /** + * Access the addresses + */ + protected function getAddresses(): AddressList + { + if (!$this->_addresses) { + $this->_addresses = new AddressList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_addresses; + } + + /** + * Access the queues + */ + protected function getQueues(): QueueList + { + if (!$this->_queues) { + $this->_queues = new QueueList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_queues; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + if (!$this->_shortCodes) { + $this->_shortCodes = new ShortCodeList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_shortCodes; + } + + /** + * Access the signingKeys + */ + protected function getSigningKeys(): SigningKeyList + { + if (!$this->_signingKeys) { + $this->_signingKeys = new SigningKeyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_signingKeys; + } + + /** + * Access the newSigningKeys + */ + protected function getNewSigningKeys(): NewSigningKeyList + { + if (!$this->_newSigningKeys) { + $this->_newSigningKeys = new NewSigningKeyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_newSigningKeys; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AccountContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/AccountInstance.php b/app/api/Twilio/Rest/Api/V2010/AccountInstance.php new file mode 100755 index 0000000..61fb912 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/AccountInstance.php @@ -0,0 +1,389 @@ +properties = [ + 'authToken' => Values::array_get($payload, 'auth_token'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'ownerAccountSid' => Values::array_get($payload, 'owner_account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'subresourceUris' => Values::array_get($payload, 'subresource_uris'), + 'type' => Values::array_get($payload, 'type'), + 'uri' => Values::array_get($payload, 'uri'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AccountContext Context for this AccountInstance + */ + protected function proxy(): AccountContext + { + if (!$this->context) { + $this->context = new AccountContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AccountInstance + * + * @return AccountInstance Fetched AccountInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AccountInstance + * + * @param array|Options $options Optional Arguments + * @return AccountInstance Updated AccountInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AccountInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + return $this->proxy()->recordings; + } + + /** + * Access the usage + */ + protected function getUsage(): UsageList + { + return $this->proxy()->usage; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Access the keys + */ + protected function getKeys(): KeyList + { + return $this->proxy()->keys; + } + + /** + * Access the newKeys + */ + protected function getNewKeys(): NewKeyList + { + return $this->proxy()->newKeys; + } + + /** + * Access the applications + */ + protected function getApplications(): ApplicationList + { + return $this->proxy()->applications; + } + + /** + * Access the incomingPhoneNumbers + */ + protected function getIncomingPhoneNumbers(): IncomingPhoneNumberList + { + return $this->proxy()->incomingPhoneNumbers; + } + + /** + * Access the conferences + */ + protected function getConferences(): ConferenceList + { + return $this->proxy()->conferences; + } + + /** + * Access the calls + */ + protected function getCalls(): CallList + { + return $this->proxy()->calls; + } + + /** + * Access the outgoingCallerIds + */ + protected function getOutgoingCallerIds(): OutgoingCallerIdList + { + return $this->proxy()->outgoingCallerIds; + } + + /** + * Access the validationRequests + */ + protected function getValidationRequests(): ValidationRequestList + { + return $this->proxy()->validationRequests; + } + + /** + * Access the transcriptions + */ + protected function getTranscriptions(): TranscriptionList + { + return $this->proxy()->transcriptions; + } + + /** + * Access the connectApps + */ + protected function getConnectApps(): ConnectAppList + { + return $this->proxy()->connectApps; + } + + /** + * Access the authorizedConnectApps + */ + protected function getAuthorizedConnectApps(): AuthorizedConnectAppList + { + return $this->proxy()->authorizedConnectApps; + } + + /** + * Access the tokens + */ + protected function getTokens(): TokenList + { + return $this->proxy()->tokens; + } + + /** + * Access the balance + */ + protected function getBalance(): BalanceList + { + return $this->proxy()->balance; + } + + /** + * Access the sip + */ + protected function getSip(): SipList + { + return $this->proxy()->sip; + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + return $this->proxy()->notifications; + } + + /** + * Access the availablePhoneNumbers + */ + protected function getAvailablePhoneNumbers(): AvailablePhoneNumberCountryList + { + return $this->proxy()->availablePhoneNumbers; + } + + /** + * Access the addresses + */ + protected function getAddresses(): AddressList + { + return $this->proxy()->addresses; + } + + /** + * Access the queues + */ + protected function getQueues(): QueueList + { + return $this->proxy()->queues; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + return $this->proxy()->shortCodes; + } + + /** + * Access the signingKeys + */ + protected function getSigningKeys(): SigningKeyList + { + return $this->proxy()->signingKeys; + } + + /** + * Access the newSigningKeys + */ + protected function getNewSigningKeys(): NewSigningKeyList + { + return $this->proxy()->newSigningKeys; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Api.V2010.AccountInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/AccountList.php b/app/api/Twilio/Rest/Api/V2010/AccountList.php new file mode 100755 index 0000000..7ec16fe --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/AccountList.php @@ -0,0 +1,197 @@ +solution = [ + ]; + + $this->uri = '/Accounts.json'; + } + + /** + * Create the AccountInstance + * + * @param array|Options $options Optional Arguments + * @return AccountInstance Created AccountInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): AccountInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AccountInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AccountInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AccountInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AccountInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AccountInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AccountPage Page of AccountInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AccountPage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AccountPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AccountInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AccountPage Page of AccountInstance + */ + public function getPage(string $targetUrl): AccountPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AccountPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AccountContext + * + * @param string $sid The Account Sid that uniquely identifies the account to fetch + */ + public function getContext( + string $sid + + ): AccountContext + { + return new AccountContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AccountList]'; + } +} diff --git a/app/api/Twilio/Rest/Api/V2010/AccountOptions.php b/app/api/Twilio/Rest/Api/V2010/AccountOptions.php new file mode 100755 index 0000000..3a0e732 --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/AccountOptions.php @@ -0,0 +1,216 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A human readable description of the account to create, defaults to `SubAccount Created at {YYYY-MM-DD HH:MM meridian}` + * + * @param string $friendlyName A human readable description of the account to create, defaults to `SubAccount Created at {YYYY-MM-DD HH:MM meridian}` + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.CreateAccountOptions ' . $options . ']'; + } +} + + +class ReadAccountOptions extends Options + { + /** + * @param string $friendlyName Only return the Account resources with friendly names that exactly match this name. + * @param string $status Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['status'] = $status; + } + + /** + * Only return the Account resources with friendly names that exactly match this name. + * + * @param string $friendlyName Only return the Account resources with friendly names that exactly match this name. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + * + * @param string $status Only return Account resources with the given status. Can be `closed`, `suspended` or `active`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.ReadAccountOptions ' . $options . ']'; + } +} + +class UpdateAccountOptions extends Options + { + /** + * @param string $friendlyName Update the human-readable description of this Account + * @param string $status + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['status'] = $status; + } + + /** + * Update the human-readable description of this Account + * + * @param string $friendlyName Update the human-readable description of this Account + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Api.V2010.UpdateAccountOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Api/V2010/AccountPage.php b/app/api/Twilio/Rest/Api/V2010/AccountPage.php new file mode 100755 index 0000000..d32da9f --- /dev/null +++ b/app/api/Twilio/Rest/Api/V2010/AccountPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AccountInstance \Twilio\Rest\Api\V2010\AccountInstance + */ + public function buildInstance(array $payload): AccountInstance + { + return new AccountInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Api.V2010.AccountPage]'; + } +} diff --git a/app/api/Twilio/Rest/ApiBase.php b/app/api/Twilio/Rest/ApiBase.php new file mode 100755 index 0000000..a71839c --- /dev/null +++ b/app/api/Twilio/Rest/ApiBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://api.twilio.com'; + } + + + /** + * @return V2010 Version v2010 of api + */ + protected function getV2010(): V2010 { + if (!$this->_v2010) { + $this->_v2010 = new V2010($this); + } + return $this->_v2010; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Api]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot.php b/app/api/Twilio/Rest/Autopilot.php new file mode 100755 index 0000000..1703075 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot.php @@ -0,0 +1,32 @@ +assistants instead. + */ + protected function getAssistants(): \Twilio\Rest\Autopilot\V1\AssistantList { + echo "assistants is deprecated. Use v1->assistants instead."; + return $this->v1->assistants; + } + + /** + * @deprecated Use v1->assistants(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextAssistants(string $sid): \Twilio\Rest\Autopilot\V1\AssistantContext { + echo "assistants(\$sid) is deprecated. Use v1->assistants(\$sid) instead."; + return $this->v1->assistants($sid); + } + + /** + * @deprecated Use v1->restoreAssistant instead + */ + protected function getRestoreAssistant(): \Twilio\Rest\Autopilot\V1\RestoreAssistantList { + echo "restoreAssistant is deprecated. Use v1->restoreAssistant instead."; + return $this->v1->restoreAssistant; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Autopilot/V1.php b/app/api/Twilio/Rest/Autopilot/V1.php new file mode 100755 index 0000000..c2d7668 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1.php @@ -0,0 +1,106 @@ +version = 'v1'; + } + + protected function getAssistants(): AssistantList + { + if (!$this->_assistants) { + $this->_assistants = new AssistantList($this); + } + return $this->_assistants; + } + + protected function getRestoreAssistant(): RestoreAssistantList + { + if (!$this->_restoreAssistant) { + $this->_restoreAssistant = new RestoreAssistantList($this); + } + return $this->_restoreAssistant; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsContext.php new file mode 100755 index 0000000..0f3fb5d --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsContext.php @@ -0,0 +1,111 @@ +solution = [ + 'assistantSid' => + $assistantSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Defaults'; + } + + /** + * Fetch the DefaultsInstance + * + * @return DefaultsInstance Fetched DefaultsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DefaultsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DefaultsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Update the DefaultsInstance + * + * @param array|Options $options Optional Arguments + * @return DefaultsInstance Updated DefaultsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DefaultsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Defaults' => + Serialize::jsonObject($options['defaults']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DefaultsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.DefaultsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsInstance.php new file mode 100755 index 0000000..98c0708 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DefaultsContext Context for this DefaultsInstance + */ + protected function proxy(): DefaultsContext + { + if (!$this->context) { + $this->context = new DefaultsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DefaultsInstance + * + * @return DefaultsInstance Fetched DefaultsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DefaultsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DefaultsInstance + * + * @param array|Options $options Optional Arguments + * @return DefaultsInstance Updated DefaultsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DefaultsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.DefaultsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsList.php new file mode 100755 index 0000000..5447b17 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsList.php @@ -0,0 +1,67 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a DefaultsContext + */ + public function getContext( + + ): DefaultsContext + { + return new DefaultsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.DefaultsList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsOptions.php new file mode 100755 index 0000000..65b265a --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsOptions.php @@ -0,0 +1,78 @@ +options['defaults'] = $defaults; + } + + /** + * A JSON string that describes the default task links for the `assistant_initiation`, `collect`, and `fallback` situations. + * + * @param array $defaults A JSON string that describes the default task links for the `assistant_initiation`, `collect`, and `fallback` situations. + * @return $this Fluent Builder + */ + public function setDefaults(array $defaults): self + { + $this->options['defaults'] = $defaults; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateDefaultsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsPage.php new file mode 100755 index 0000000..a4e4124 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DefaultsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DefaultsInstance \Twilio\Rest\Autopilot\V1\Assistant\DefaultsInstance + */ + public function buildInstance(array $payload): DefaultsInstance + { + return new DefaultsInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.DefaultsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueContext.php new file mode 100755 index 0000000..044a851 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueContext.php @@ -0,0 +1,87 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Dialogues/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DialogueInstance + * + * @return DialogueInstance Fetched DialogueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DialogueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DialogueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.DialogueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueInstance.php new file mode 100755 index 0000000..215dd06 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'data' => Values::array_get($payload, 'data'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DialogueContext Context for this DialogueInstance + */ + protected function proxy(): DialogueContext + { + if (!$this->context) { + $this->context = new DialogueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DialogueInstance + * + * @return DialogueInstance Fetched DialogueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DialogueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.DialogueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueList.php new file mode 100755 index 0000000..4fe4fab --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialogueList.php @@ -0,0 +1,71 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a DialogueContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Dialogue resource to fetch. + */ + public function getContext( + string $sid + + ): DialogueContext + { + return new DialogueContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.DialogueList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialoguePage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialoguePage.php new file mode 100755 index 0000000..6bddc1b --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/DialoguePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DialogueInstance \Twilio\Rest\Autopilot\V1\Assistant\DialogueInstance + */ + public function buildInstance(array $payload): DialogueInstance + { + return new DialogueInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.DialoguePage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueContext.php new file mode 100755 index 0000000..3821d37 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueContext.php @@ -0,0 +1,106 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'fieldTypeSid' => + $fieldTypeSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($fieldTypeSid) + .'/FieldValues/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldValueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldValueInstance + * + * @return FieldValueInstance Fetched FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldValueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldValueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldValueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueInstance.php new file mode 100755 index 0000000..0d81714 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'fieldTypeSid' => Values::array_get($payload, 'field_type_sid'), + 'language' => Values::array_get($payload, 'language'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'value' => Values::array_get($payload, 'value'), + 'url' => Values::array_get($payload, 'url'), + 'synonymOf' => Values::array_get($payload, 'synonym_of'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'fieldTypeSid' => $fieldTypeSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldValueContext Context for this FieldValueInstance + */ + protected function proxy(): FieldValueContext + { + if (!$this->context) { + $this->context = new FieldValueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldValueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldValueInstance + * + * @return FieldValueInstance Fetched FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldValueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldValueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueList.php new file mode 100755 index 0000000..6999337 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'fieldTypeSid' => + $fieldTypeSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($fieldTypeSid) + .'/FieldValues'; + } + + /** + * Create the FieldValueInstance + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) tag that specifies the language of the value. Currently supported tags: `en-US` + * @param string $value The Field Value data. + * @param array|Options $options Optional Arguments + * @return FieldValueInstance Created FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $value, array $options = []): FieldValueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'Value' => + $value, + 'SynonymOf' => + $options['synonymOf'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldValueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'] + ); + } + + + /** + * Reads FieldValueInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldValueInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams FieldValueInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldValueInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldValuePage Page of FieldValueInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldValuePage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldValuePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldValueInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldValuePage Page of FieldValueInstance + */ + public function getPage(string $targetUrl): FieldValuePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldValuePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldValueContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the FieldValue resource to delete. + */ + public function getContext( + string $sid + + ): FieldValueContext + { + return new FieldValueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldValueList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueOptions.php new file mode 100755 index 0000000..5e07fa3 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValueOptions.php @@ -0,0 +1,132 @@ +options['synonymOf'] = $synonymOf; + } + + /** + * The string value that indicates which word the field value is a synonym of. + * + * @param string $synonymOf The string value that indicates which word the field value is a synonym of. + * @return $this Fluent Builder + */ + public function setSynonymOf(string $synonymOf): self + { + $this->options['synonymOf'] = $synonymOf; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateFieldValueOptions ' . $options . ']'; + } +} + + + +class ReadFieldValueOptions extends Options + { + /** + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) tag that specifies the language of the value. Currently supported tags: `en-US` + */ + public function __construct( + + string $language = Values::NONE + + ) { + $this->options['language'] = $language; + } + + /** + * The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) tag that specifies the language of the value. Currently supported tags: `en-US` + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) tag that specifies the language of the value. Currently supported tags: `en-US` + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.ReadFieldValueOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValuePage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValuePage.php new file mode 100755 index 0000000..672ff12 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldType/FieldValuePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldValueInstance \Twilio\Rest\Autopilot\V1\Assistant\FieldType\FieldValueInstance + */ + public function buildInstance(array $payload): FieldValueInstance + { + return new FieldValueInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['fieldTypeSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldValuePage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeContext.php new file mode 100755 index 0000000..a5178d7 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeContext.php @@ -0,0 +1,191 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldTypeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldTypeInstance + * + * @return FieldTypeInstance Fetched FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the FieldTypeInstance + * + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Updated FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FieldTypeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the fieldValues + */ + protected function getFieldValues(): FieldValueList + { + if (!$this->_fieldValues) { + $this->_fieldValues = new FieldValueList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_fieldValues; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeInstance.php new file mode 100755 index 0000000..d32479b --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'links' => Values::array_get($payload, 'links'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldTypeContext Context for this FieldTypeInstance + */ + protected function proxy(): FieldTypeContext + { + if (!$this->context) { + $this->context = new FieldTypeContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldTypeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldTypeInstance + * + * @return FieldTypeInstance Fetched FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FieldTypeInstance + * + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Updated FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FieldTypeInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the fieldValues + */ + protected function getFieldValues(): FieldValueList + { + return $this->proxy()->fieldValues; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeList.php new file mode 100755 index 0000000..3dc5f01 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeList.php @@ -0,0 +1,200 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes'; + } + + /** + * Create the FieldTypeInstance + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Created FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): FieldTypeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads FieldTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FieldTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldTypePage Page of FieldTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldTypePage Page of FieldTypeInstance + */ + public function getPage(string $targetUrl): FieldTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldTypeContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the FieldType resource to delete. + */ + public function getContext( + string $sid + + ): FieldTypeContext + { + return new FieldTypeContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeOptions.php new file mode 100755 index 0000000..315cd38 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypeOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateFieldTypeOptions ' . $options . ']'; + } +} + + + + +class UpdateFieldTypeOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateFieldTypeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypePage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypePage.php new file mode 100755 index 0000000..cc606dd --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/FieldTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldTypeInstance \Twilio\Rest\Autopilot\V1\Assistant\FieldTypeInstance + */ + public function buildInstance(array $payload): FieldTypeInstance + { + return new FieldTypeInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildContext.php new file mode 100755 index 0000000..83a198f --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildContext.php @@ -0,0 +1,130 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/ModelBuilds/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ModelBuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ModelBuildInstance + * + * @return ModelBuildInstance Fetched ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ModelBuildInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Updated ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ModelBuildInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.ModelBuildContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildInstance.php new file mode 100755 index 0000000..0cbab3d --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'buildDuration' => Values::array_get($payload, 'build_duration'), + 'errorCode' => Values::array_get($payload, 'error_code'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ModelBuildContext Context for this ModelBuildInstance + */ + protected function proxy(): ModelBuildContext + { + if (!$this->context) { + $this->context = new ModelBuildContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ModelBuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ModelBuildInstance + * + * @return ModelBuildInstance Fetched ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ModelBuildInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Updated ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ModelBuildInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.ModelBuildInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildList.php new file mode 100755 index 0000000..abdac56 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildList.php @@ -0,0 +1,199 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/ModelBuilds'; + } + + /** + * Create the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Created ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ModelBuildInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StatusCallback' => + $options['statusCallback'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads ModelBuildInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ModelBuildInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ModelBuildInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ModelBuildInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ModelBuildPage Page of ModelBuildInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ModelBuildPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ModelBuildPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ModelBuildInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ModelBuildPage Page of ModelBuildInstance + */ + public function getPage(string $targetUrl): ModelBuildPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ModelBuildPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ModelBuildContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the ModelBuild resource to delete. + */ + public function getContext( + string $sid + + ): ModelBuildContext + { + return new ModelBuildContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.ModelBuildList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildOptions.php new file mode 100755 index 0000000..d393ea8 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildOptions.php @@ -0,0 +1,152 @@ +options['statusCallback'] = $statusCallback; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * The URL we should call using a POST method to send status information to your application. + * + * @param string $statusCallback The URL we should call using a POST method to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * An application-defined string that uniquely identifies the new resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateModelBuildOptions ' . $options . ']'; + } +} + + + + +class UpdateModelBuildOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + */ + public function __construct( + + string $uniqueName = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateModelBuildOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildPage.php new file mode 100755 index 0000000..67d22b0 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/ModelBuildPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ModelBuildInstance \Twilio\Rest\Autopilot\V1\Assistant\ModelBuildInstance + */ + public function buildInstance(array $payload): ModelBuildInstance + { + return new ModelBuildInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.ModelBuildPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryContext.php new file mode 100755 index 0000000..7be16da --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryContext.php @@ -0,0 +1,132 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Queries/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the QueryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the QueryInstance + * + * @return QueryInstance Fetched QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the QueryInstance + * + * @param array|Options $options Optional Arguments + * @return QueryInstance Updated QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'SampleSid' => + $options['sampleSid'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.QueryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryInstance.php new file mode 100755 index 0000000..f963499 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryInstance.php @@ -0,0 +1,170 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'results' => Values::array_get($payload, 'results'), + 'language' => Values::array_get($payload, 'language'), + 'modelBuildSid' => Values::array_get($payload, 'model_build_sid'), + 'query' => Values::array_get($payload, 'query'), + 'sampleSid' => Values::array_get($payload, 'sample_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'sourceChannel' => Values::array_get($payload, 'source_channel'), + 'dialogueSid' => Values::array_get($payload, 'dialogue_sid'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return QueryContext Context for this QueryInstance + */ + protected function proxy(): QueryContext + { + if (!$this->context) { + $this->context = new QueryContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the QueryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the QueryInstance + * + * @return QueryInstance Fetched QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the QueryInstance + * + * @param array|Options $options Optional Arguments + * @return QueryInstance Updated QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueryInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.QueryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryList.php new file mode 100755 index 0000000..0e0b2e9 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Queries'; + } + + /** + * Create the QueryInstance + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the new query. For example: `en-US`. + * @param string $query The end-user's natural language input. It can be up to 2048 characters long. + * @param array|Options $options Optional Arguments + * @return QueryInstance Created QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $query, array $options = []): QueryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'Query' => + $query, + 'Tasks' => + $options['tasks'], + 'ModelBuild' => + $options['modelBuild'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads QueryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return QueryInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams QueryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of QueryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return QueryPage Page of QueryInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): QueryPage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'ModelBuild' => + $options['modelBuild'], + 'Status' => + $options['status'], + 'DialogueSid' => + $options['dialogueSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new QueryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of QueryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return QueryPage Page of QueryInstance + */ + public function getPage(string $targetUrl): QueryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new QueryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a QueryContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Query resource to delete. + */ + public function getContext( + string $sid + + ): QueryContext + { + return new QueryContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.QueryList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryOptions.php new file mode 100755 index 0000000..3058e09 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryOptions.php @@ -0,0 +1,274 @@ +options['tasks'] = $tasks; + $this->options['modelBuild'] = $modelBuild; + } + + /** + * The list of tasks to limit the new query to. Tasks are expressed as a comma-separated list of task `unique_name` values. For example, `task-unique_name-1, task-unique_name-2`. Listing specific tasks is useful to constrain the paths that a user can take. + * + * @param string $tasks The list of tasks to limit the new query to. Tasks are expressed as a comma-separated list of task `unique_name` values. For example, `task-unique_name-1, task-unique_name-2`. Listing specific tasks is useful to constrain the paths that a user can take. + * @return $this Fluent Builder + */ + public function setTasks(string $tasks): self + { + $this->options['tasks'] = $tasks; + return $this; + } + + /** + * The SID or unique name of the [Model Build](https://www.twilio.com/docs/autopilot/api/model-build) to be queried. + * + * @param string $modelBuild The SID or unique name of the [Model Build](https://www.twilio.com/docs/autopilot/api/model-build) to be queried. + * @return $this Fluent Builder + */ + public function setModelBuild(string $modelBuild): self + { + $this->options['modelBuild'] = $modelBuild; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateQueryOptions ' . $options . ']'; + } +} + + + +class ReadQueryOptions extends Options + { + /** + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used by the Query resources to read. For example: `en-US`. + * @param string $modelBuild The SID or unique name of the [Model Build](https://www.twilio.com/docs/autopilot/api/model-build) to be queried. + * @param string $status The status of the resources to read. Can be: `pending-review`, `reviewed`, or `discarded` + * @param string $dialogueSid The SID of the [Dialogue](https://www.twilio.com/docs/autopilot/api/dialogue). + */ + public function __construct( + + string $language = Values::NONE, + string $modelBuild = Values::NONE, + string $status = Values::NONE, + string $dialogueSid = Values::NONE + + ) { + $this->options['language'] = $language; + $this->options['modelBuild'] = $modelBuild; + $this->options['status'] = $status; + $this->options['dialogueSid'] = $dialogueSid; + } + + /** + * The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used by the Query resources to read. For example: `en-US`. + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used by the Query resources to read. For example: `en-US`. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * The SID or unique name of the [Model Build](https://www.twilio.com/docs/autopilot/api/model-build) to be queried. + * + * @param string $modelBuild The SID or unique name of the [Model Build](https://www.twilio.com/docs/autopilot/api/model-build) to be queried. + * @return $this Fluent Builder + */ + public function setModelBuild(string $modelBuild): self + { + $this->options['modelBuild'] = $modelBuild; + return $this; + } + + /** + * The status of the resources to read. Can be: `pending-review`, `reviewed`, or `discarded` + * + * @param string $status The status of the resources to read. Can be: `pending-review`, `reviewed`, or `discarded` + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The SID of the [Dialogue](https://www.twilio.com/docs/autopilot/api/dialogue). + * + * @param string $dialogueSid The SID of the [Dialogue](https://www.twilio.com/docs/autopilot/api/dialogue). + * @return $this Fluent Builder + */ + public function setDialogueSid(string $dialogueSid): self + { + $this->options['dialogueSid'] = $dialogueSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.ReadQueryOptions ' . $options . ']'; + } +} + +class UpdateQueryOptions extends Options + { + /** + * @param string $sampleSid The SID of an optional reference to the [Sample](https://www.twilio.com/docs/autopilot/api/task-sample) created from the query. + * @param string $status The new status of the resource. Can be: `pending-review`, `reviewed`, or `discarded` + */ + public function __construct( + + string $sampleSid = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['sampleSid'] = $sampleSid; + $this->options['status'] = $status; + } + + /** + * The SID of an optional reference to the [Sample](https://www.twilio.com/docs/autopilot/api/task-sample) created from the query. + * + * @param string $sampleSid The SID of an optional reference to the [Sample](https://www.twilio.com/docs/autopilot/api/task-sample) created from the query. + * @return $this Fluent Builder + */ + public function setSampleSid(string $sampleSid): self + { + $this->options['sampleSid'] = $sampleSid; + return $this; + } + + /** + * The new status of the resource. Can be: `pending-review`, `reviewed`, or `discarded` + * + * @param string $status The new status of the resource. Can be: `pending-review`, `reviewed`, or `discarded` + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateQueryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryPage.php new file mode 100755 index 0000000..ce49235 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/QueryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return QueryInstance \Twilio\Rest\Autopilot\V1\Assistant\QueryInstance + */ + public function buildInstance(array $payload): QueryInstance + { + return new QueryInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.QueryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetContext.php new file mode 100755 index 0000000..951bde5 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetContext.php @@ -0,0 +1,111 @@ +solution = [ + 'assistantSid' => + $assistantSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/StyleSheet'; + } + + /** + * Fetch the StyleSheetInstance + * + * @return StyleSheetInstance Fetched StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StyleSheetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new StyleSheetInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Update the StyleSheetInstance + * + * @param array|Options $options Optional Arguments + * @return StyleSheetInstance Updated StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): StyleSheetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new StyleSheetInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.StyleSheetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetInstance.php new file mode 100755 index 0000000..b2b24d1 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return StyleSheetContext Context for this StyleSheetInstance + */ + protected function proxy(): StyleSheetContext + { + if (!$this->context) { + $this->context = new StyleSheetContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the StyleSheetInstance + * + * @return StyleSheetInstance Fetched StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StyleSheetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the StyleSheetInstance + * + * @param array|Options $options Optional Arguments + * @return StyleSheetInstance Updated StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): StyleSheetInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.StyleSheetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetList.php new file mode 100755 index 0000000..7a5e9c2 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetList.php @@ -0,0 +1,67 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a StyleSheetContext + */ + public function getContext( + + ): StyleSheetContext + { + return new StyleSheetContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.StyleSheetList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetOptions.php new file mode 100755 index 0000000..65254cb --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetOptions.php @@ -0,0 +1,78 @@ +options['styleSheet'] = $styleSheet; + } + + /** + * The JSON string that describes the style sheet object. + * + * @param array $styleSheet The JSON string that describes the style sheet object. + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateStyleSheetOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetPage.php new file mode 100755 index 0000000..a0217a0 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/StyleSheetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StyleSheetInstance \Twilio\Rest\Autopilot\V1\Assistant\StyleSheetInstance + */ + public function buildInstance(array $payload): StyleSheetInstance + { + return new StyleSheetInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.StyleSheetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldContext.php new file mode 100755 index 0000000..8f4d925 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldContext.php @@ -0,0 +1,106 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Fields/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldInstance + * + * @return FieldInstance Fetched FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldInstance.php new file mode 100755 index 0000000..abb6e47 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldInstance.php @@ -0,0 +1,148 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'fieldType' => Values::array_get($payload, 'field_type'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldContext Context for this FieldInstance + */ + protected function proxy(): FieldContext + { + if (!$this->context) { + $this->context = new FieldContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldInstance + * + * @return FieldInstance Fetched FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.FieldInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldList.php new file mode 100755 index 0000000..cfc5921 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldList.php @@ -0,0 +1,205 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Fields'; + } + + /** + * Create the FieldInstance + * + * @param string $fieldType The Field Type of the new field. Can be: a [Built-in Field Type](https://www.twilio.com/docs/autopilot/built-in-field-types), the `unique_name`, or the `sid` of a custom Field Type. + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. This value must be a unique string of no more than 64 characters. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @return FieldInstance Created FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $fieldType, string $uniqueName): FieldInstance + { + + $data = Values::of([ + 'FieldType' => + $fieldType, + 'UniqueName' => + $uniqueName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Reads FieldInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FieldInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldPage Page of FieldInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldPage Page of FieldInstance + */ + public function getPage(string $targetUrl): FieldPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Field resource to delete. + */ + public function getContext( + string $sid + + ): FieldContext + { + return new FieldContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldPage.php new file mode 100755 index 0000000..93c4a53 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/FieldPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldInstance \Twilio\Rest\Autopilot\V1\Assistant\Task\FieldInstance + */ + public function buildInstance(array $payload): FieldInstance + { + return new FieldInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.FieldPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleContext.php new file mode 100755 index 0000000..f66c142 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleContext.php @@ -0,0 +1,141 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Samples/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SampleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SampleInstance + * + * @return SampleInstance Fetched SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SampleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SampleInstance + * + * @param array|Options $options Optional Arguments + * @return SampleInstance Updated SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SampleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $options['language'], + 'TaggedText' => + $options['taggedText'], + 'SourceChannel' => + $options['sourceChannel'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.SampleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleInstance.php new file mode 100755 index 0000000..8307879 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleInstance.php @@ -0,0 +1,164 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'language' => Values::array_get($payload, 'language'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'taggedText' => Values::array_get($payload, 'tagged_text'), + 'url' => Values::array_get($payload, 'url'), + 'sourceChannel' => Values::array_get($payload, 'source_channel'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SampleContext Context for this SampleInstance + */ + protected function proxy(): SampleContext + { + if (!$this->context) { + $this->context = new SampleContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SampleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SampleInstance + * + * @return SampleInstance Fetched SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SampleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SampleInstance + * + * @param array|Options $options Optional Arguments + * @return SampleInstance Updated SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SampleInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.SampleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleList.php new file mode 100755 index 0000000..8490058 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Samples'; + } + + /** + * Create the SampleInstance + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the new sample. For example: `en-US`. + * @param string $taggedText The text example of how end users might express the task. The sample can contain [Field tag blocks](https://www.twilio.com/docs/autopilot/api/task-sample#field-tagging). + * @param array|Options $options Optional Arguments + * @return SampleInstance Created SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $taggedText, array $options = []): SampleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'TaggedText' => + $taggedText, + 'SourceChannel' => + $options['sourceChannel'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Reads SampleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SampleInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SampleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SampleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SamplePage Page of SampleInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SamplePage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SamplePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SampleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SamplePage Page of SampleInstance + */ + public function getPage(string $targetUrl): SamplePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SamplePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SampleContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Sample resource to delete. + */ + public function getContext( + string $sid + + ): SampleContext + { + return new SampleContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.SampleList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleOptions.php new file mode 100755 index 0000000..5e31f2b --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SampleOptions.php @@ -0,0 +1,220 @@ +options['sourceChannel'] = $sourceChannel; + } + + /** + * The communication channel from which the new sample was captured. Can be: `voice`, `sms`, `chat`, `alexa`, `google-assistant`, `slack`, or null if not included. + * + * @param string $sourceChannel The communication channel from which the new sample was captured. Can be: `voice`, `sms`, `chat`, `alexa`, `google-assistant`, `slack`, or null if not included. + * @return $this Fluent Builder + */ + public function setSourceChannel(string $sourceChannel): self + { + $this->options['sourceChannel'] = $sourceChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateSampleOptions ' . $options . ']'; + } +} + + + +class ReadSampleOptions extends Options + { + /** + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + */ + public function __construct( + + string $language = Values::NONE + + ) { + $this->options['language'] = $language; + } + + /** + * The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.ReadSampleOptions ' . $options . ']'; + } +} + +class UpdateSampleOptions extends Options + { + /** + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + * @param string $taggedText The text example of how end users might express the task. The sample can contain [Field tag blocks](https://www.twilio.com/docs/autopilot/api/task-sample#field-tagging). + * @param string $sourceChannel The communication channel from which the sample was captured. Can be: `voice`, `sms`, `chat`, `alexa`, `google-assistant`, `slack`, or null if not included. + */ + public function __construct( + + string $language = Values::NONE, + string $taggedText = Values::NONE, + string $sourceChannel = Values::NONE + + ) { + $this->options['language'] = $language; + $this->options['taggedText'] = $taggedText; + $this->options['sourceChannel'] = $sourceChannel; + } + + /** + * The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + * + * @param string $language The [ISO language-country](https://docs.oracle.com/cd/E13214_01/wli/docs92/xref/xqisocodes.html) string that specifies the language used for the sample. For example: `en-US`. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * The text example of how end users might express the task. The sample can contain [Field tag blocks](https://www.twilio.com/docs/autopilot/api/task-sample#field-tagging). + * + * @param string $taggedText The text example of how end users might express the task. The sample can contain [Field tag blocks](https://www.twilio.com/docs/autopilot/api/task-sample#field-tagging). + * @return $this Fluent Builder + */ + public function setTaggedText(string $taggedText): self + { + $this->options['taggedText'] = $taggedText; + return $this; + } + + /** + * The communication channel from which the sample was captured. Can be: `voice`, `sms`, `chat`, `alexa`, `google-assistant`, `slack`, or null if not included. + * + * @param string $sourceChannel The communication channel from which the sample was captured. Can be: `voice`, `sms`, `chat`, `alexa`, `google-assistant`, `slack`, or null if not included. + * @return $this Fluent Builder + */ + public function setSourceChannel(string $sourceChannel): self + { + $this->options['sourceChannel'] = $sourceChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateSampleOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SamplePage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SamplePage.php new file mode 100755 index 0000000..747fa56 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/SamplePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SampleInstance \Twilio\Rest\Autopilot\V1\Assistant\Task\SampleInstance + */ + public function buildInstance(array $payload): SampleInstance + { + return new SampleInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.SamplePage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsContext.php new file mode 100755 index 0000000..7a266f9 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsContext.php @@ -0,0 +1,118 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Actions'; + } + + /** + * Fetch the TaskActionsInstance + * + * @return TaskActionsInstance Fetched TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskActionsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Update the TaskActionsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskActionsInstance Updated TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskActionsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Actions' => + Serialize::jsonObject($options['actions']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskActionsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsInstance.php new file mode 100755 index 0000000..3878dea --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsInstance.php @@ -0,0 +1,139 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskActionsContext Context for this TaskActionsInstance + */ + protected function proxy(): TaskActionsContext + { + if (!$this->context) { + $this->context = new TaskActionsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskActionsInstance + * + * @return TaskActionsInstance Fetched TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskActionsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskActionsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskActionsInstance Updated TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskActionsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskActionsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsList.php new file mode 100755 index 0000000..8c6973a --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsList.php @@ -0,0 +1,73 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + } + + /** + * Constructs a TaskActionsContext + */ + public function getContext( + + ): TaskActionsContext + { + return new TaskActionsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskActionsList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsOptions.php new file mode 100755 index 0000000..2773d0c --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsOptions.php @@ -0,0 +1,78 @@ +options['actions'] = $actions; + } + + /** + * The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. + * + * @param array $actions The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateTaskActionsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsPage.php new file mode 100755 index 0000000..2c9c8ad --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskActionsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskActionsInstance \Twilio\Rest\Autopilot\V1\Assistant\Task\TaskActionsInstance + */ + public function buildInstance(array $payload): TaskActionsInstance + { + return new TaskActionsInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskActionsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsContext.php new file mode 100755 index 0000000..203206d --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsContext.php @@ -0,0 +1,87 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Statistics'; + } + + /** + * Fetch the TaskStatisticsInstance + * + * @return TaskStatisticsInstance Fetched TaskStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskStatisticsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskStatisticsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsInstance.php new file mode 100755 index 0000000..840e221 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'samplesCount' => Values::array_get($payload, 'samples_count'), + 'fieldsCount' => Values::array_get($payload, 'fields_count'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskStatisticsContext Context for this TaskStatisticsInstance + */ + protected function proxy(): TaskStatisticsContext + { + if (!$this->context) { + $this->context = new TaskStatisticsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskStatisticsInstance + * + * @return TaskStatisticsInstance Fetched TaskStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskStatisticsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsList.php new file mode 100755 index 0000000..0bbd5bc --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + } + + /** + * Constructs a TaskStatisticsContext + */ + public function getContext( + + ): TaskStatisticsContext + { + return new TaskStatisticsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsPage.php new file mode 100755 index 0000000..e9eabc2 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/Task/TaskStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskStatisticsInstance \Twilio\Rest\Autopilot\V1\Assistant\Task\TaskStatisticsInstance + */ + public function buildInstance(array $payload): TaskStatisticsInstance + { + return new TaskStatisticsInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskContext.php new file mode 100755 index 0000000..355f9d0 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskContext.php @@ -0,0 +1,256 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TaskInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Actions' => + Serialize::jsonObject($options['actions']), + 'ActionsUrl' => + $options['actionsUrl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the samples + */ + protected function getSamples(): SampleList + { + if (!$this->_samples) { + $this->_samples = new SampleList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_samples; + } + + /** + * Access the fields + */ + protected function getFields(): FieldList + { + if (!$this->_fields) { + $this->_fields = new FieldList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_fields; + } + + /** + * Access the taskActions + */ + protected function getTaskActions(): TaskActionsList + { + if (!$this->_taskActions) { + $this->_taskActions = new TaskActionsList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_taskActions; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new TaskStatisticsList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskInstance.php new file mode 100755 index 0000000..f61fb47 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskInstance.php @@ -0,0 +1,203 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'links' => Values::array_get($payload, 'links'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'actionsUrl' => Values::array_get($payload, 'actions_url'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskContext Context for this TaskInstance + */ + protected function proxy(): TaskContext + { + if (!$this->context) { + $this->context = new TaskContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TaskInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the samples + */ + protected function getSamples(): SampleList + { + return $this->proxy()->samples; + } + + /** + * Access the fields + */ + protected function getFields(): FieldList + { + return $this->proxy()->fields; + } + + /** + * Access the taskActions + */ + protected function getTaskActions(): TaskActionsList + { + return $this->proxy()->taskActions; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.TaskInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskList.php new file mode 100755 index 0000000..f608767 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskList.php @@ -0,0 +1,205 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks'; + } + + /** + * Create the TaskInstance + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. This value must be unique and 64 characters or less in length. + * @param array|Options $options Optional Arguments + * @return TaskInstance Created TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'FriendlyName' => + $options['friendlyName'], + 'Actions' => + Serialize::jsonObject($options['actions']), + 'ActionsUrl' => + $options['actionsUrl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads TaskInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TaskInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskPage Page of TaskInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskPage Page of TaskInstance + */ + public function getPage(string $targetUrl): TaskPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TaskContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Task resource to delete. + */ + public function getContext( + string $sid + + ): TaskContext + { + return new TaskContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskOptions.php new file mode 100755 index 0000000..d67d568 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskOptions.php @@ -0,0 +1,224 @@ +options['friendlyName'] = $friendlyName; + $this->options['actions'] = $actions; + $this->options['actionsUrl'] = $actionsUrl; + } + + /** + * A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. It is optional and not unique. + * + * @param array $actions The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. It is optional and not unique. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * The URL from which the Assistant can fetch actions. + * + * @param string $actionsUrl The URL from which the Assistant can fetch actions. + * @return $this Fluent Builder + */ + public function setActionsUrl(string $actionsUrl): self + { + $this->options['actionsUrl'] = $actionsUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateTaskOptions ' . $options . ']'; + } +} + + + + +class UpdateTaskOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 64 characters or less in length and be unique. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @param array $actions The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. + * @param string $actionsUrl The URL from which the Assistant can fetch actions. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + array $actions = Values::ARRAY_NONE, + string $actionsUrl = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['actions'] = $actions; + $this->options['actionsUrl'] = $actionsUrl; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be 64 characters or less in length and be unique. It can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 64 characters or less in length and be unique. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. + * + * @param array $actions The JSON string that specifies the [actions](https://www.twilio.com/docs/autopilot/actions) that instruct the Assistant on how to perform the task. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * The URL from which the Assistant can fetch actions. + * + * @param string $actionsUrl The URL from which the Assistant can fetch actions. + * @return $this Fluent Builder + */ + public function setActionsUrl(string $actionsUrl): self + { + $this->options['actionsUrl'] = $actionsUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateTaskOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskPage.php new file mode 100755 index 0000000..9806bdb --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/TaskPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskInstance \Twilio\Rest\Autopilot\V1\Assistant\TaskInstance + */ + public function buildInstance(array $payload): TaskInstance + { + return new TaskInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.TaskPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookContext.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookContext.php new file mode 100755 index 0000000..0e9ab4f --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookContext.php @@ -0,0 +1,136 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Events' => + $options['events'], + 'WebhookUrl' => + $options['webhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookInstance.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookInstance.php new file mode 100755 index 0000000..2f800da --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'url' => Values::array_get($payload, 'url'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'events' => Values::array_get($payload, 'events'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookList.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookList.php new file mode 100755 index 0000000..723a408 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookList.php @@ -0,0 +1,206 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. This value must be unique and 64 characters or less in length. + * @param string $events The list of space-separated events that this Webhook will subscribe to. + * @param string $webhookUrl The URL associated with this Webhook. + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, string $events, string $webhookUrl, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'Events' => + $events, + 'WebhookUrl' => + $webhookUrl, + 'WebhookMethod' => + $options['webhookMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Webhook resource to delete. + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookOptions.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookOptions.php new file mode 100755 index 0000000..94fa4f1 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookOptions.php @@ -0,0 +1,188 @@ +options['webhookMethod'] = $webhookMethod; + } + + /** + * The method to be used when calling the webhook's URL. + * + * @param string $webhookMethod The method to be used when calling the webhook's URL. + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. This value must be unique and 64 characters or less in length. + * @param string $events The list of space-separated events that this Webhook will subscribe to. + * @param string $webhookUrl The URL associated with this Webhook. + * @param string $webhookMethod The method to be used when calling the webhook's URL. + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $events = Values::NONE, + string $webhookUrl = Values::NONE, + string $webhookMethod = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['events'] = $events; + $this->options['webhookUrl'] = $webhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + } + + /** + * An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. This value must be unique and 64 characters or less in length. + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. This value must be unique and 64 characters or less in length. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The list of space-separated events that this Webhook will subscribe to. + * + * @param string $events The list of space-separated events that this Webhook will subscribe to. + * @return $this Fluent Builder + */ + public function setEvents(string $events): self + { + $this->options['events'] = $events; + return $this; + } + + /** + * The URL associated with this Webhook. + * + * @param string $webhookUrl The URL associated with this Webhook. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * The method to be used when calling the webhook's URL. + * + * @param string $webhookMethod The method to be used when calling the webhook's URL. + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookPage.php b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookPage.php new file mode 100755 index 0000000..17fe67f --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/Assistant/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Autopilot\V1\Assistant\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/AssistantContext.php b/app/api/Twilio/Rest/Autopilot/V1/AssistantContext.php new file mode 100755 index 0000000..1727cb6 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/AssistantContext.php @@ -0,0 +1,329 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AssistantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AssistantInstance + * + * @return AssistantInstance Fetched AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssistantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Updated AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'LogQueries' => + Serialize::booleanToString($options['logQueries']), + 'UniqueName' => + $options['uniqueName'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackEvents' => + $options['callbackEvents'], + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + 'Defaults' => + Serialize::jsonObject($options['defaults']), + 'DevelopmentStage' => + $options['developmentStage'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AssistantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the fieldTypes + */ + protected function getFieldTypes(): FieldTypeList + { + if (!$this->_fieldTypes) { + $this->_fieldTypes = new FieldTypeList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_fieldTypes; + } + + /** + * Access the modelBuilds + */ + protected function getModelBuilds(): ModelBuildList + { + if (!$this->_modelBuilds) { + $this->_modelBuilds = new ModelBuildList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_modelBuilds; + } + + /** + * Access the queries + */ + protected function getQueries(): QueryList + { + if (!$this->_queries) { + $this->_queries = new QueryList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_queries; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + if (!$this->_tasks) { + $this->_tasks = new TaskList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_tasks; + } + + /** + * Access the defaults + */ + protected function getDefaults(): DefaultsList + { + if (!$this->_defaults) { + $this->_defaults = new DefaultsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_defaults; + } + + /** + * Access the styleSheet + */ + protected function getStyleSheet(): StyleSheetList + { + if (!$this->_styleSheet) { + $this->_styleSheet = new StyleSheetList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_styleSheet; + } + + /** + * Access the dialogues + */ + protected function getDialogues(): DialogueList + { + if (!$this->_dialogues) { + $this->_dialogues = new DialogueList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_dialogues; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.AssistantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/AssistantInstance.php b/app/api/Twilio/Rest/Autopilot/V1/AssistantInstance.php new file mode 100755 index 0000000..8baae71 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/AssistantInstance.php @@ -0,0 +1,249 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'latestModelBuildSid' => Values::array_get($payload, 'latest_model_build_sid'), + 'links' => Values::array_get($payload, 'links'), + 'logQueries' => Values::array_get($payload, 'log_queries'), + 'developmentStage' => Values::array_get($payload, 'development_stage'), + 'needsModelBuild' => Values::array_get($payload, 'needs_model_build'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'callbackEvents' => Values::array_get($payload, 'callback_events'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssistantContext Context for this AssistantInstance + */ + protected function proxy(): AssistantContext + { + if (!$this->context) { + $this->context = new AssistantContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AssistantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AssistantInstance + * + * @return AssistantInstance Fetched AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Updated AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the fieldTypes + */ + protected function getFieldTypes(): FieldTypeList + { + return $this->proxy()->fieldTypes; + } + + /** + * Access the modelBuilds + */ + protected function getModelBuilds(): ModelBuildList + { + return $this->proxy()->modelBuilds; + } + + /** + * Access the queries + */ + protected function getQueries(): QueryList + { + return $this->proxy()->queries; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + return $this->proxy()->tasks; + } + + /** + * Access the defaults + */ + protected function getDefaults(): DefaultsList + { + return $this->proxy()->defaults; + } + + /** + * Access the styleSheet + */ + protected function getStyleSheet(): StyleSheetList + { + return $this->proxy()->styleSheet; + } + + /** + * Access the dialogues + */ + protected function getDialogues(): DialogueList + { + return $this->proxy()->dialogues; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Autopilot.V1.AssistantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/AssistantList.php b/app/api/Twilio/Rest/Autopilot/V1/AssistantList.php new file mode 100755 index 0000000..fa80759 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/AssistantList.php @@ -0,0 +1,202 @@ +solution = [ + ]; + + $this->uri = '/Assistants'; + } + + /** + * Create the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Created AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): AssistantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'LogQueries' => + Serialize::booleanToString($options['logQueries']), + 'UniqueName' => + $options['uniqueName'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackEvents' => + $options['callbackEvents'], + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + 'Defaults' => + Serialize::jsonObject($options['defaults']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AssistantInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AssistantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssistantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssistantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssistantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssistantPage Page of AssistantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssistantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssistantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssistantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssistantPage Page of AssistantInstance + */ + public function getPage(string $targetUrl): AssistantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssistantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssistantContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Assistant resource to delete. + */ + public function getContext( + string $sid + + ): AssistantContext + { + return new AssistantContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.AssistantList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/AssistantOptions.php b/app/api/Twilio/Rest/Autopilot/V1/AssistantOptions.php new file mode 100755 index 0000000..2e0ac5f --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/AssistantOptions.php @@ -0,0 +1,368 @@ +options['friendlyName'] = $friendlyName; + $this->options['logQueries'] = $logQueries; + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackEvents'] = $callbackEvents; + $this->options['styleSheet'] = $styleSheet; + $this->options['defaults'] = $defaults; + } + + /** + * A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether queries should be logged and kept after training. Can be: `true` or `false` and defaults to `true`. If `true`, queries are stored for 30 days, and then deleted. If `false`, no queries are stored. + * + * @param bool $logQueries Whether queries should be logged and kept after training. Can be: `true` or `false` and defaults to `true`. If `true`, queries are stored for 30 days, and then deleted. If `false`, no queries are stored. + * @return $this Fluent Builder + */ + public function setLogQueries(bool $logQueries): self + { + $this->options['logQueries'] = $logQueries; + return $this; + } + + /** + * An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * + * @param string $uniqueName An application-defined string that uniquely identifies the new resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Reserved. + * + * @param string $callbackUrl Reserved. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * Reserved. + * + * @param string $callbackEvents Reserved. + * @return $this Fluent Builder + */ + public function setCallbackEvents(string $callbackEvents): self + { + $this->options['callbackEvents'] = $callbackEvents; + return $this; + } + + /** + * The JSON string that defines the Assistant's [style sheet](https://www.twilio.com/docs/autopilot/api/assistant/stylesheet) + * + * @param array $styleSheet The JSON string that defines the Assistant's [style sheet](https://www.twilio.com/docs/autopilot/api/assistant/stylesheet) + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * A JSON object that defines the Assistant's [default tasks](https://www.twilio.com/docs/autopilot/api/assistant/defaults) for various scenarios, including initiation actions and fallback tasks. + * + * @param array $defaults A JSON object that defines the Assistant's [default tasks](https://www.twilio.com/docs/autopilot/api/assistant/defaults) for various scenarios, including initiation actions and fallback tasks. + * @return $this Fluent Builder + */ + public function setDefaults(array $defaults): self + { + $this->options['defaults'] = $defaults; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.CreateAssistantOptions ' . $options . ']'; + } +} + + + + +class UpdateAssistantOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @param bool $logQueries Whether queries should be logged and kept after training. Can be: `true` or `false` and defaults to `true`. If `true`, queries are stored for 30 days, and then deleted. If `false`, no queries are stored. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * @param string $callbackUrl Reserved. + * @param string $callbackEvents Reserved. + * @param array $styleSheet The JSON string that defines the Assistant's [style sheet](https://www.twilio.com/docs/autopilot/api/assistant/stylesheet) + * @param array $defaults A JSON object that defines the Assistant's [default tasks](https://www.twilio.com/docs/autopilot/api/assistant/defaults) for various scenarios, including initiation actions and fallback tasks. + * @param string $developmentStage A string describing the state of the assistant. + */ + public function __construct( + + string $friendlyName = Values::NONE, + bool $logQueries = Values::BOOL_NONE, + string $uniqueName = Values::NONE, + string $callbackUrl = Values::NONE, + string $callbackEvents = Values::NONE, + array $styleSheet = Values::ARRAY_NONE, + array $defaults = Values::ARRAY_NONE, + string $developmentStage = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['logQueries'] = $logQueries; + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackEvents'] = $callbackEvents; + $this->options['styleSheet'] = $styleSheet; + $this->options['defaults'] = $defaults; + $this->options['developmentStage'] = $developmentStage; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether queries should be logged and kept after training. Can be: `true` or `false` and defaults to `true`. If `true`, queries are stored for 30 days, and then deleted. If `false`, no queries are stored. + * + * @param bool $logQueries Whether queries should be logged and kept after training. Can be: `true` or `false` and defaults to `true`. If `true`, queries are stored for 30 days, and then deleted. If `false`, no queries are stored. + * @return $this Fluent Builder + */ + public function setLogQueries(bool $logQueries): self + { + $this->options['logQueries'] = $logQueries; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. The first 64 characters must be unique. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Reserved. + * + * @param string $callbackUrl Reserved. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * Reserved. + * + * @param string $callbackEvents Reserved. + * @return $this Fluent Builder + */ + public function setCallbackEvents(string $callbackEvents): self + { + $this->options['callbackEvents'] = $callbackEvents; + return $this; + } + + /** + * The JSON string that defines the Assistant's [style sheet](https://www.twilio.com/docs/autopilot/api/assistant/stylesheet) + * + * @param array $styleSheet The JSON string that defines the Assistant's [style sheet](https://www.twilio.com/docs/autopilot/api/assistant/stylesheet) + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * A JSON object that defines the Assistant's [default tasks](https://www.twilio.com/docs/autopilot/api/assistant/defaults) for various scenarios, including initiation actions and fallback tasks. + * + * @param array $defaults A JSON object that defines the Assistant's [default tasks](https://www.twilio.com/docs/autopilot/api/assistant/defaults) for various scenarios, including initiation actions and fallback tasks. + * @return $this Fluent Builder + */ + public function setDefaults(array $defaults): self + { + $this->options['defaults'] = $defaults; + return $this; + } + + /** + * A string describing the state of the assistant. + * + * @param string $developmentStage A string describing the state of the assistant. + * @return $this Fluent Builder + */ + public function setDevelopmentStage(string $developmentStage): self + { + $this->options['developmentStage'] = $developmentStage; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Autopilot.V1.UpdateAssistantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/AssistantPage.php b/app/api/Twilio/Rest/Autopilot/V1/AssistantPage.php new file mode 100755 index 0000000..569b1d4 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/AssistantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssistantInstance \Twilio\Rest\Autopilot\V1\AssistantInstance + */ + public function buildInstance(array $payload): AssistantInstance + { + return new AssistantInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.AssistantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantInstance.php b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantInstance.php new file mode 100755 index 0000000..cc8ca29 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantInstance.php @@ -0,0 +1,103 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'needsModelBuild' => Values::array_get($payload, 'needs_model_build'), + 'latestModelBuildSid' => Values::array_get($payload, 'latest_model_build_sid'), + 'logQueries' => Values::array_get($payload, 'log_queries'), + 'developmentStage' => Values::array_get($payload, 'development_stage'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'callbackEvents' => Values::array_get($payload, 'callback_events'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.RestoreAssistantInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantList.php b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantList.php new file mode 100755 index 0000000..3604ea1 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantList.php @@ -0,0 +1,77 @@ +solution = [ + ]; + + $this->uri = '/Assistants/Restore'; + } + + /** + * Update the RestoreAssistantInstance + * + * @param string $assistant The Twilio-provided string that uniquely identifies the Assistant resource to restore. + * @return RestoreAssistantInstance Updated RestoreAssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $assistant): RestoreAssistantInstance + { + + $data = Values::of([ + 'Assistant' => + $assistant, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RestoreAssistantInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.RestoreAssistantList]'; + } +} diff --git a/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantPage.php b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantPage.php new file mode 100755 index 0000000..a0f9687 --- /dev/null +++ b/app/api/Twilio/Rest/Autopilot/V1/RestoreAssistantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RestoreAssistantInstance \Twilio\Rest\Autopilot\V1\RestoreAssistantInstance + */ + public function buildInstance(array $payload): RestoreAssistantInstance + { + return new RestoreAssistantInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Autopilot.V1.RestoreAssistantPage]'; + } +} diff --git a/app/api/Twilio/Rest/AutopilotBase.php b/app/api/Twilio/Rest/AutopilotBase.php new file mode 100755 index 0000000..df3d3b7 --- /dev/null +++ b/app/api/Twilio/Rest/AutopilotBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://autopilot.twilio.com'; + } + + + /** + * @return V1 Version v1 of autopilot + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Autopilot]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports.php b/app/api/Twilio/Rest/Bulkexports.php new file mode 100755 index 0000000..2a54d8a --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports.php @@ -0,0 +1,44 @@ +exports instead. + */ + protected function getExports(): \Twilio\Rest\Bulkexports\V1\ExportList { + echo "exports is deprecated. Use v1->exports instead."; + return $this->v1->exports; + } + + /** + * @deprecated Use v1->exports(\$resourceType) instead. + * @param string $resourceType The type of communication – Messages, Calls, + * Conferences, and Participants + */ + protected function contextExports(string $resourceType): \Twilio\Rest\Bulkexports\V1\ExportContext { + echo "exports(\$resourceType) is deprecated. Use v1->exports(\$resourceType) instead."; + return $this->v1->exports($resourceType); + } + + /** + * @deprecated Use v1->exportConfiguration instead. + */ + protected function getExportConfiguration(): \Twilio\Rest\Bulkexports\V1\ExportConfigurationList { + echo "exportConfiguration is deprecated. Use v1->exportConfiguration instead."; + return $this->v1->exportConfiguration; + } + + /** + * @deprecated Use v1->exportConfiguration(\$resourceType) instead. + * @param string $resourceType The type of communication – Messages, Calls, + * Conferences, and Participants + */ + protected function contextExportConfiguration(string $resourceType): \Twilio\Rest\Bulkexports\V1\ExportConfigurationContext { + echo "rexportConfiguration(\$resourceType) is deprecated. Use v1->exportConfiguration(\$resourceType) instead."; + return $this->v1->exportConfiguration($resourceType); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Bulkexports/V1.php b/app/api/Twilio/Rest/Bulkexports/V1.php new file mode 100755 index 0000000..c855eba --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1.php @@ -0,0 +1,106 @@ +version = 'v1'; + } + + protected function getExports(): ExportList + { + if (!$this->_exports) { + $this->_exports = new ExportList($this); + } + return $this->_exports; + } + + protected function getExportConfiguration(): ExportConfigurationList + { + if (!$this->_exportConfiguration) { + $this->_exportConfiguration = new ExportConfigurationList($this); + } + return $this->_exportConfiguration; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/DayContext.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayContext.php new file mode 100755 index 0000000..8c3adf0 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayContext.php @@ -0,0 +1,87 @@ +solution = [ + 'resourceType' => + $resourceType, + 'day' => + $day, + ]; + + $this->uri = '/Exports/' . \rawurlencode($resourceType) + .'/Days/' . \rawurlencode($day) + .''; + } + + /** + * Fetch the DayInstance + * + * @return DayInstance Fetched DayInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DayInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DayInstance( + $this->version, + $payload, + $this->solution['resourceType'], + $this->solution['day'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.DayContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/DayInstance.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayInstance.php new file mode 100755 index 0000000..365da72 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'redirectTo' => Values::array_get($payload, 'redirect_to'), + 'day' => Values::array_get($payload, 'day'), + 'size' => Values::array_get($payload, 'size'), + 'createDate' => Values::array_get($payload, 'create_date'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'resourceType' => Values::array_get($payload, 'resource_type'), + ]; + + $this->solution = ['resourceType' => $resourceType, 'day' => $day ?: $this->properties['day'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DayContext Context for this DayInstance + */ + protected function proxy(): DayContext + { + if (!$this->context) { + $this->context = new DayContext( + $this->version, + $this->solution['resourceType'], + $this->solution['day'] + ); + } + + return $this->context; + } + + /** + * Fetch the DayInstance + * + * @return DayInstance Fetched DayInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DayInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.DayInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/DayList.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayList.php new file mode 100755 index 0000000..1cf172f --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayList.php @@ -0,0 +1,168 @@ +solution = [ + 'resourceType' => + $resourceType, + + ]; + + $this->uri = '/Exports/' . \rawurlencode($resourceType) + .'/Days'; + } + + /** + * Reads DayInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DayInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DayInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DayInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DayPage Page of DayInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DayPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DayPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DayInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DayPage Page of DayInstance + */ + public function getPage(string $targetUrl): DayPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DayPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DayContext + * + * @param string $day The ISO 8601 format date of the resources in the file, for a UTC day + */ + public function getContext( + string $day + + ): DayContext + { + return new DayContext( + $this->version, + $this->solution['resourceType'], + $day + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.DayList]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/DayPage.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayPage.php new file mode 100755 index 0000000..e4e760f --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/DayPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DayInstance \Twilio\Rest\Bulkexports\V1\Export\DayInstance + */ + public function buildInstance(array $payload): DayInstance + { + return new DayInstance($this->version, $payload, $this->solution['resourceType']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.DayPage]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobInstance.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobInstance.php new file mode 100755 index 0000000..91b63e6 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobInstance.php @@ -0,0 +1,101 @@ +properties = [ + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'startDay' => Values::array_get($payload, 'start_day'), + 'endDay' => Values::array_get($payload, 'end_day'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'email' => Values::array_get($payload, 'email'), + 'jobSid' => Values::array_get($payload, 'job_sid'), + 'details' => Values::array_get($payload, 'details'), + 'jobQueuePosition' => Values::array_get($payload, 'job_queue_position'), + 'estimatedCompletionTime' => Values::array_get($payload, 'estimated_completion_time'), + ]; + + $this->solution = ['resourceType' => $resourceType, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportCustomJobInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobList.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobList.php new file mode 100755 index 0000000..a91e68b --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobList.php @@ -0,0 +1,193 @@ +solution = [ + 'resourceType' => + $resourceType, + + ]; + + $this->uri = '/Exports/' . \rawurlencode($resourceType) + .'/Jobs'; + } + + /** + * Create the ExportCustomJobInstance + * + * @param string $startDay The start day for the custom export specified as a string in the format of yyyy-mm-dd + * @param string $endDay The end day for the custom export specified as a string in the format of yyyy-mm-dd. End day is inclusive and must be 2 days earlier than the current UTC day. + * @param string $friendlyName The friendly name specified when creating the job + * @param array|Options $options Optional Arguments + * @return ExportCustomJobInstance Created ExportCustomJobInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $startDay, string $endDay, string $friendlyName, array $options = []): ExportCustomJobInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StartDay' => + $startDay, + 'EndDay' => + $endDay, + 'FriendlyName' => + $friendlyName, + 'WebhookUrl' => + $options['webhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + 'Email' => + $options['email'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ExportCustomJobInstance( + $this->version, + $payload, + $this->solution['resourceType'] + ); + } + + + /** + * Reads ExportCustomJobInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ExportCustomJobInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ExportCustomJobInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ExportCustomJobInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ExportCustomJobPage Page of ExportCustomJobInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ExportCustomJobPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ExportCustomJobPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ExportCustomJobInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ExportCustomJobPage Page of ExportCustomJobInstance + */ + public function getPage(string $targetUrl): ExportCustomJobPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ExportCustomJobPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportCustomJobList]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobOptions.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobOptions.php new file mode 100755 index 0000000..a89635d --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobOptions.php @@ -0,0 +1,114 @@ +options['webhookUrl'] = $webhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + $this->options['email'] = $email; + } + + /** + * The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. If you set neither webhook nor email, you will have to check your job's status manually. + * + * @param string $webhookUrl The optional webhook url called on completion of the job. If this is supplied, `WebhookMethod` must also be supplied. If you set neither webhook nor email, you will have to check your job's status manually. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied. + * + * @param string $webhookMethod This is the method used to call the webhook on completion of the job. If this is supplied, `WebhookUrl` must also be supplied. + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * The optional email to send the completion notification to. You can set both webhook, and email, or one or the other. If you set neither, the job will run but you will have to query to determine your job's status. + * + * @param string $email The optional email to send the completion notification to. You can set both webhook, and email, or one or the other. If you set neither, the job will run but you will have to query to determine your job's status. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Bulkexports.V1.CreateExportCustomJobOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobPage.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobPage.php new file mode 100755 index 0000000..3ec8241 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/ExportCustomJobPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExportCustomJobInstance \Twilio\Rest\Bulkexports\V1\Export\ExportCustomJobInstance + */ + public function buildInstance(array $payload): ExportCustomJobInstance + { + return new ExportCustomJobInstance($this->version, $payload, $this->solution['resourceType']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportCustomJobPage]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/JobContext.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobContext.php new file mode 100755 index 0000000..153f6f0 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobContext.php @@ -0,0 +1,94 @@ +solution = [ + 'jobSid' => + $jobSid, + ]; + + $this->uri = '/Exports/Jobs/' . \rawurlencode($jobSid) + .''; + } + + /** + * Delete the JobInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the JobInstance + * + * @return JobInstance Fetched JobInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): JobInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new JobInstance( + $this->version, + $payload, + $this->solution['jobSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.JobContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/JobInstance.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobInstance.php new file mode 100755 index 0000000..9cdba57 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'details' => Values::array_get($payload, 'details'), + 'startDay' => Values::array_get($payload, 'start_day'), + 'endDay' => Values::array_get($payload, 'end_day'), + 'jobSid' => Values::array_get($payload, 'job_sid'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'email' => Values::array_get($payload, 'email'), + 'url' => Values::array_get($payload, 'url'), + 'jobQueuePosition' => Values::array_get($payload, 'job_queue_position'), + 'estimatedCompletionTime' => Values::array_get($payload, 'estimated_completion_time'), + ]; + + $this->solution = ['jobSid' => $jobSid ?: $this->properties['jobSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return JobContext Context for this JobInstance + */ + protected function proxy(): JobContext + { + if (!$this->context) { + $this->context = new JobContext( + $this->version, + $this->solution['jobSid'] + ); + } + + return $this->context; + } + + /** + * Delete the JobInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the JobInstance + * + * @return JobInstance Fetched JobInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): JobInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.JobInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/JobList.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobList.php new file mode 100755 index 0000000..ce412d3 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a JobContext + * + * @param string $jobSid The unique string that that we created to identify the Bulk Export job + */ + public function getContext( + string $jobSid + + ): JobContext + { + return new JobContext( + $this->version, + $jobSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.JobList]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/Export/JobPage.php b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobPage.php new file mode 100755 index 0000000..c52caeb --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/Export/JobPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return JobInstance \Twilio\Rest\Bulkexports\V1\Export\JobInstance + */ + public function buildInstance(array $payload): JobInstance + { + return new JobInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.JobPage]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationContext.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationContext.php new file mode 100755 index 0000000..637ac20 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationContext.php @@ -0,0 +1,115 @@ +solution = [ + 'resourceType' => + $resourceType, + ]; + + $this->uri = '/Exports/' . \rawurlencode($resourceType) + .'/Configuration'; + } + + /** + * Fetch the ExportConfigurationInstance + * + * @return ExportConfigurationInstance Fetched ExportConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExportConfigurationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExportConfigurationInstance( + $this->version, + $payload, + $this->solution['resourceType'] + ); + } + + + /** + * Update the ExportConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ExportConfigurationInstance Updated ExportConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ExportConfigurationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'WebhookUrl' => + $options['webhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ExportConfigurationInstance( + $this->version, + $payload, + $this->solution['resourceType'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.ExportConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationInstance.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationInstance.php new file mode 100755 index 0000000..acc9447 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationInstance.php @@ -0,0 +1,137 @@ +properties = [ + 'enabled' => Values::array_get($payload, 'enabled'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['resourceType' => $resourceType ?: $this->properties['resourceType'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExportConfigurationContext Context for this ExportConfigurationInstance + */ + protected function proxy(): ExportConfigurationContext + { + if (!$this->context) { + $this->context = new ExportConfigurationContext( + $this->version, + $this->solution['resourceType'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExportConfigurationInstance + * + * @return ExportConfigurationInstance Fetched ExportConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExportConfigurationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ExportConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ExportConfigurationInstance Updated ExportConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ExportConfigurationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.ExportConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationList.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationList.php new file mode 100755 index 0000000..5aa9469 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a ExportConfigurationContext + * + * @param string $resourceType The type of communication – Messages, Calls, Conferences, and Participants + */ + public function getContext( + string $resourceType + + ): ExportConfigurationContext + { + return new ExportConfigurationContext( + $this->version, + $resourceType + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationOptions.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationOptions.php new file mode 100755 index 0000000..b70db77 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationOptions.php @@ -0,0 +1,114 @@ +options['enabled'] = $enabled; + $this->options['webhookUrl'] = $webhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + } + + /** + * If true, Twilio will automatically generate every day's file when the day is over. + * + * @param bool $enabled If true, Twilio will automatically generate every day's file when the day is over. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Stores the URL destination for the method specified in webhook_method. + * + * @param string $webhookUrl Stores the URL destination for the method specified in webhook_method. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + * + * @param string $webhookMethod Sets whether Twilio should call a webhook URL when the automatic generation is complete, using GET or POST. The actual destination is set in the webhook_url + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Bulkexports.V1.UpdateExportConfigurationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationPage.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationPage.php new file mode 100755 index 0000000..8cb9b3c --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExportConfigurationInstance \Twilio\Rest\Bulkexports\V1\ExportConfigurationInstance + */ + public function buildInstance(array $payload): ExportConfigurationInstance + { + return new ExportConfigurationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportContext.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportContext.php new file mode 100755 index 0000000..cac8082 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportContext.php @@ -0,0 +1,157 @@ +solution = [ + 'resourceType' => + $resourceType, + ]; + + $this->uri = '/Exports/' . \rawurlencode($resourceType) + .''; + } + + /** + * Fetch the ExportInstance + * + * @return ExportInstance Fetched ExportInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExportInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExportInstance( + $this->version, + $payload, + $this->solution['resourceType'] + ); + } + + + /** + * Access the exportCustomJobs + */ + protected function getExportCustomJobs(): ExportCustomJobList + { + if (!$this->_exportCustomJobs) { + $this->_exportCustomJobs = new ExportCustomJobList( + $this->version, + $this->solution['resourceType'] + ); + } + + return $this->_exportCustomJobs; + } + + /** + * Access the days + */ + protected function getDays(): DayList + { + if (!$this->_days) { + $this->_days = new DayList( + $this->version, + $this->solution['resourceType'] + ); + } + + return $this->_days; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.ExportContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportInstance.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportInstance.php new file mode 100755 index 0000000..29f2228 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['resourceType' => $resourceType ?: $this->properties['resourceType'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExportContext Context for this ExportInstance + */ + protected function proxy(): ExportContext + { + if (!$this->context) { + $this->context = new ExportContext( + $this->version, + $this->solution['resourceType'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExportInstance + * + * @return ExportInstance Fetched ExportInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExportInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the exportCustomJobs + */ + protected function getExportCustomJobs(): ExportCustomJobList + { + return $this->proxy()->exportCustomJobs; + } + + /** + * Access the days + */ + protected function getDays(): DayList + { + return $this->proxy()->days; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Bulkexports.V1.ExportInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportList.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportList.php new file mode 100755 index 0000000..fea8ea6 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportList.php @@ -0,0 +1,122 @@ +solution = [ + ]; + } + + /** + * Constructs a ExportContext + * + * @param string $resourceType The type of communication – Messages, Calls, Conferences, and Participants + */ + public function getContext( + string $resourceType + + ): ExportContext + { + return new ExportContext( + $this->version, + $resourceType + ); + } + + /** + * Access the jobs + */ + protected function getJobs(): JobList + { + if (!$this->_jobs) { + $this->_jobs = new JobList( + $this->version + ); + } + return $this->_jobs; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportList]'; + } +} diff --git a/app/api/Twilio/Rest/Bulkexports/V1/ExportPage.php b/app/api/Twilio/Rest/Bulkexports/V1/ExportPage.php new file mode 100755 index 0000000..a5ff770 --- /dev/null +++ b/app/api/Twilio/Rest/Bulkexports/V1/ExportPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExportInstance \Twilio\Rest\Bulkexports\V1\ExportInstance + */ + public function buildInstance(array $payload): ExportInstance + { + return new ExportInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Bulkexports.V1.ExportPage]'; + } +} diff --git a/app/api/Twilio/Rest/BulkexportsBase.php b/app/api/Twilio/Rest/BulkexportsBase.php new file mode 100755 index 0000000..19505ab --- /dev/null +++ b/app/api/Twilio/Rest/BulkexportsBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://bulkexports.twilio.com'; + } + + + /** + * @return V1 Version v1 of bulkexports + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Bulkexports]'; + } +} diff --git a/app/api/Twilio/Rest/Chat.php b/app/api/Twilio/Rest/Chat.php new file mode 100755 index 0000000..0d88cc0 --- /dev/null +++ b/app/api/Twilio/Rest/Chat.php @@ -0,0 +1,60 @@ +credentials instead. + */ + protected function getCredentials(): \Twilio\Rest\Chat\V2\CredentialList { + echo "credentials is deprecated. Use v2->credentials instead."; + return $this->v2->credentials; + } + + /** + * @deprecated Use v2->credentials(\$sid) instead. + * @param string $sid The SID of the Credential resource to fetch + */ + protected function contextCredentials(string $sid): \Twilio\Rest\Chat\V2\CredentialContext { + echo "credentials(\$sid) is deprecated. Use v2->credentials(\$sid) instead."; + return $this->v2->credentials($sid); + } + + /** + * @deprecated Use v2->services instead. + */ + protected function getServices(): \Twilio\Rest\Chat\V2\ServiceList { + echo "services is deprecated. Use v2->services instead."; + return $this->v2->services; + } + + /** + * @deprecated Use v2->services(\$sid) instead. + * @param string $sid The SID of the Service resource to fetch + */ + protected function contextServices(string $sid): \Twilio\Rest\Chat\V2\ServiceContext { + echo "services(\$sid) is deprecated. Use v2->services(\$sid) instead."; + return $this->v2->services($sid); + } + + /** + * @deprecated Use v3->channels instead. + */ + protected function getChannels(): \Twilio\Rest\Chat\V3\ChannelList { + echo "channels is deprecated. Use v3->channels instead."; + return $this->v3->channels; + } + + /** + * @deprecated Use v3->channels(\$serviceSid, \$sid) instead. + * @param string $serviceSid Service Sid. + * @param string $sid A string that uniquely identifies this Channel. + */ + protected function contextChannels(string $serviceSid, string $sid): \Twilio\Rest\Chat\V3\ChannelContext { + echo "channels(\$serviceSid, \$sid) is deprecated. Use v3->channels(\$serviceSid, \$sid) instead."; + return $this->v3->channels($serviceSid, $sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Chat/V1.php b/app/api/Twilio/Rest/Chat/V1.php new file mode 100755 index 0000000..c66fa2b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1.php @@ -0,0 +1,107 @@ +version = 'v1'; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/CredentialContext.php b/app/api/Twilio/Rest/Chat/V1/CredentialContext.php new file mode 100755 index 0000000..b0b6e4e --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/CredentialContext.php @@ -0,0 +1,134 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/CredentialInstance.php b/app/api/Twilio/Rest/Chat/V1/CredentialInstance.php new file mode 100755 index 0000000..59a2b6a --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/CredentialList.php b/app/api/Twilio/Rest/Chat/V1/CredentialList.php new file mode 100755 index 0000000..5721d21 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Credential resource to delete. + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/CredentialOptions.php b/app/api/Twilio/Rest/Chat/V1/CredentialOptions.php new file mode 100755 index 0000000..6321fc9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/CredentialOptions.php @@ -0,0 +1,314 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A== -----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR. -----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/CredentialPage.php b/app/api/Twilio/Rest/Chat/V1/CredentialPage.php new file mode 100755 index 0000000..2f3d37d --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Chat\V1\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteContext.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteContext.php new file mode 100755 index 0000000..0d61846 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.InviteContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteInstance.php new file mode 100755 index 0000000..4fd6b80 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InviteContext Context for this InviteInstance + */ + protected function proxy(): InviteContext + { + if (!$this->context) { + $this->context = new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.InviteInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteList.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteList.php new file mode 100755 index 0000000..bce5816 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites'; + } + + /** + * Create the InviteInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more info. + * @param array|Options $options Optional Arguments + * @return InviteInstance Created InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): InviteInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InviteInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InviteInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InviteInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InviteInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InvitePage Page of InviteInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InvitePage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InvitePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InviteInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InvitePage Page of InviteInstance + */ + public function getPage(string $targetUrl): InvitePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InvitePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InviteContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Invite resource to delete. + */ + public function getContext( + string $sid + + ): InviteContext + { + return new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.InviteList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteOptions.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteOptions.php new file mode 100755 index 0000000..ae9a994 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InviteOptions.php @@ -0,0 +1,132 @@ +options['roleSid'] = $roleSid; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new member. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new member. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateInviteOptions ' . $options . ']'; + } +} + + + +class ReadInviteOptions extends Options + { + /** + * @param string[] $identity The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.ReadInviteOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/InvitePage.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InvitePage.php new file mode 100755 index 0000000..bb2a9de --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/InvitePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InviteInstance \Twilio\Rest\Chat\V1\Service\Channel\InviteInstance + */ + public function buildInstance(array $payload): InviteInstance + { + return new InviteInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.InvitePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberContext.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberContext.php new file mode 100755 index 0000000..d3bbdd6 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MemberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.MemberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberInstance.php new file mode 100755 index 0000000..e684b44 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'lastConsumptionTimestamp' => Deserialize::dateTime(Values::array_get($payload, 'last_consumption_timestamp')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MemberContext Context for this MemberInstance + */ + protected function proxy(): MemberContext + { + if (!$this->context) { + $this->context = new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MemberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.MemberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberList.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberList.php new file mode 100755 index 0000000..9215dd0 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members'; + } + + /** + * Create the MemberInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/services). See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + * @param array|Options $options Optional Arguments + * @return MemberInstance Created MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MemberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MemberInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MemberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MemberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MemberPage Page of MemberInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MemberPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MemberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MemberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MemberPage Page of MemberInstance + */ + public function getPage(string $targetUrl): MemberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MemberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MemberContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Member resource to delete. + */ + public function getContext( + string $sid + + ): MemberContext + { + return new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.MemberList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberOptions.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberOptions.php new file mode 100755 index 0000000..c121d76 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberOptions.php @@ -0,0 +1,202 @@ +options['roleSid'] = $roleSid; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateMemberOptions ' . $options . ']'; + } +} + + + +class ReadMemberOptions extends Options + { + /** + * @param string[] $identity The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/api/chat/rest/v1/user)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/api/chat/guides/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.ReadMemberOptions ' . $options . ']'; + } +} + +class UpdateMemberOptions extends Options + { + /** + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + */ + public function __construct( + + string $roleSid = Values::NONE, + int $lastConsumedMessageIndex = Values::INT_NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/api/services). + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + * + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/api/chat/rest/messages) that the Member has read within the [Channel](https://www.twilio.com/docs/api/chat/rest/channels). + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateMemberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberPage.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberPage.php new file mode 100755 index 0000000..aaf9e41 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MemberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MemberInstance \Twilio\Rest\Chat\V1\Service\Channel\MemberInstance + */ + public function buildInstance(array $payload): MemberInstance + { + return new MemberInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.MemberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageContext.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageContext.php new file mode 100755 index 0000000..6a85a50 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageInstance.php new file mode 100755 index 0000000..39c3f0d --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageInstance.php @@ -0,0 +1,170 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'wasEdited' => Values::array_get($payload, 'was_edited'), + 'from' => Values::array_get($payload, 'from'), + 'body' => Values::array_get($payload, 'body'), + 'index' => Values::array_get($payload, 'index'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageList.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageList.php new file mode 100755 index 0000000..62c73c1 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageList.php @@ -0,0 +1,216 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param string $body The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $body, array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $body, + 'From' => + $options['from'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Message resource to delete. + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageOptions.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageOptions.php new file mode 100755 index 0000000..9f3ad45 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessageOptions.php @@ -0,0 +1,220 @@ +options['from'] = $from; + $this->options['attributes'] = $attributes; + } + + /** + * The [identity](https://www.twilio.com/docs/api/chat/guides/identity) of the new message's author. The default value is `system`. + * + * @param string $from The [identity](https://www.twilio.com/docs/api/chat/guides/identity) of the new message's author. The default value is `system`. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateMessageOptions ' . $options . ']'; + } +} + + + +class ReadMessageOptions extends Options + { + /** + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + * + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $body The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @param string $attributes A valid JSON string that contains application-specific data. + */ + public function __construct( + + string $body = Values::NONE, + string $attributes = Values::NONE + + ) { + $this->options['body'] = $body; + $this->options['attributes'] = $attributes; + } + + /** + * The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * + * @param string $body The message to send to the channel. Can also be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessagePage.php b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessagePage.php new file mode 100755 index 0000000..d2d0b71 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/Channel/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\Chat\V1\Service\Channel\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/ChannelContext.php b/app/api/Twilio/Rest/Chat/V1/Service/ChannelContext.php new file mode 100755 index 0000000..9a7f3d4 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/ChannelContext.php @@ -0,0 +1,233 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + if (!$this->_members) { + $this->_members = new MemberList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + if (!$this->_invites) { + $this->_invites = new InviteList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_invites; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/ChannelInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/ChannelInstance.php new file mode 100755 index 0000000..2efb669 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/ChannelInstance.php @@ -0,0 +1,201 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'type' => Values::array_get($payload, 'type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'membersCount' => Values::array_get($payload, 'members_count'), + 'messagesCount' => Values::array_get($payload, 'messages_count'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + return $this->proxy()->members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + return $this->proxy()->invites; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/ChannelList.php b/app/api/Twilio/Rest/Chat/V1/Service/ChannelList.php new file mode 100755 index 0000000..a2bf36f --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/ChannelList.php @@ -0,0 +1,209 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels'; + } + + /** + * Create the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Created ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'Type' => + $options['type'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChannelInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChannelPage Page of ChannelInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChannelPage + { + $options = new Values($options); + + $params = Values::of([ + 'Type' => + $options['type'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChannelPage Page of ChannelInstance + */ + public function getPage(string $targetUrl): ChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChannelContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Channel resource to delete. + */ + public function getContext( + string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/ChannelOptions.php b/app/api/Twilio/Rest/Chat/V1/Service/ChannelOptions.php new file mode 100755 index 0000000..a35988a --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/ChannelOptions.php @@ -0,0 +1,272 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['type'] = $type; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateChannelOptions ' . $options . ']'; + } +} + + + +class ReadChannelOptions extends Options + { + /** + * @param string $type The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + */ + public function __construct( + + array $type = Values::ARRAY_NONE + + ) { + $this->options['type'] = $type; + } + + /** + * The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + * + * @param string $type The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + * @return $this Fluent Builder + */ + public function setType(array $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.ReadChannelOptions ' . $options . ']'; + } +} + +class UpdateChannelOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * @param string $attributes A valid JSON string that contains application-specific data. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + string $attributes = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/ChannelPage.php b/app/api/Twilio/Rest/Chat/V1/Service/ChannelPage.php new file mode 100755 index 0000000..0430959 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\Chat\V1\Service\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/RoleContext.php b/app/api/Twilio/Rest/Chat/V1/Service/RoleContext.php new file mode 100755 index 0000000..470f43c --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/RoleContext.php @@ -0,0 +1,128 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/RoleInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/RoleInstance.php new file mode 100755 index 0000000..2645a1a --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/RoleInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/RoleList.php b/app/api/Twilio/Rest/Chat/V1/Service/RoleList.php new file mode 100755 index 0000000..0da4a53 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/RoleList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @param string $type + * @param string[] $permission A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type` and are described in the documentation. + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Role resource to delete. + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/RolePage.php b/app/api/Twilio/Rest/Chat/V1/Service/RolePage.php new file mode 100755 index 0000000..b2794b9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\Chat\V1\Service\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelInstance.php new file mode 100755 index 0000000..e9b13b9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelInstance.php @@ -0,0 +1,96 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'memberSid' => Values::array_get($payload, 'member_sid'), + 'status' => Values::array_get($payload, 'status'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.UserChannelInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelList.php b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelList.php new file mode 100755 index 0000000..ade01dc --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelList.php @@ -0,0 +1,157 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels'; + } + + /** + * Reads UserChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserChannelPage Page of UserChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserChannelPage Page of UserChannelInstance + */ + public function getPage(string $targetUrl): UserChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.UserChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelPage.php b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelPage.php new file mode 100755 index 0000000..73619ca --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/User/UserChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserChannelInstance \Twilio\Rest\Chat\V1\Service\User\UserChannelInstance + */ + public function buildInstance(array $payload): UserChannelInstance + { + return new UserChannelInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.UserChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/UserContext.php b/app/api/Twilio/Rest/Chat/V1/Service/UserContext.php new file mode 100755 index 0000000..cbbce6b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/UserContext.php @@ -0,0 +1,192 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + if (!$this->_userChannels) { + $this->_userChannels = new UserChannelList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userChannels; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/UserInstance.php b/app/api/Twilio/Rest/Chat/V1/Service/UserInstance.php new file mode 100755 index 0000000..b73d05b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/UserInstance.php @@ -0,0 +1,181 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'joinedChannelsCount' => Values::array_get($payload, 'joined_channels_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + return $this->proxy()->userChannels; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/UserList.php b/app/api/Twilio/Rest/Chat/V1/Service/UserList.php new file mode 100755 index 0000000..adc7eb3 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/UserList.php @@ -0,0 +1,204 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/api/chat/rest/v1/user) within the [Service](https://www.twilio.com/docs/api/chat/rest/v1/service). This value is often a username or email address. See the Identity documentation for more details. + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the User resource to delete. + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/Service/UserOptions.php b/app/api/Twilio/Rest/Chat/V1/Service/UserOptions.php new file mode 100755 index 0000000..ffed2a8 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/UserOptions.php @@ -0,0 +1,206 @@ +options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new User. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to the new User. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * A descriptive string that you create to describe the new resource. This value is often used for display purposes. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. This value is often used for display purposes. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.CreateUserOptions ' . $options . ']'; + } +} + + + + +class UpdateUserOptions extends Options + { + /** + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + * @param string $attributes A valid JSON string that contains application-specific data. + * @param string $friendlyName A descriptive string that you create to describe the resource. It is often used for display purposes. + */ + public function __construct( + + string $roleSid = Values::NONE, + string $attributes = Values::NONE, + string $friendlyName = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/api/chat/rest/roles) assigned to this user. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It is often used for display purposes. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is often used for display purposes. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/Service/UserPage.php b/app/api/Twilio/Rest/Chat/V1/Service/UserPage.php new file mode 100755 index 0000000..f437e70 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/Service/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\Chat\V1\Service\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/ServiceContext.php b/app/api/Twilio/Rest/Chat/V1/ServiceContext.php new file mode 100755 index 0000000..ffd7f7b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/ServiceContext.php @@ -0,0 +1,326 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DefaultServiceRoleSid' => + $options['defaultServiceRoleSid'], + 'DefaultChannelRoleSid' => + $options['defaultChannelRoleSid'], + 'DefaultChannelCreatorRoleSid' => + $options['defaultChannelCreatorRoleSid'], + 'ReadStatusEnabled' => + Serialize::booleanToString($options['readStatusEnabled']), + 'ReachabilityEnabled' => + Serialize::booleanToString($options['reachabilityEnabled']), + 'TypingIndicatorTimeout' => + $options['typingIndicatorTimeout'], + 'ConsumptionReportInterval' => + $options['consumptionReportInterval'], + 'Notifications.NewMessage.Enabled' => + Serialize::booleanToString($options['notificationsNewMessageEnabled']), + 'Notifications.NewMessage.Template' => + $options['notificationsNewMessageTemplate'], + 'Notifications.AddedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsAddedToChannelEnabled']), + 'Notifications.AddedToChannel.Template' => + $options['notificationsAddedToChannelTemplate'], + 'Notifications.RemovedFromChannel.Enabled' => + Serialize::booleanToString($options['notificationsRemovedFromChannelEnabled']), + 'Notifications.RemovedFromChannel.Template' => + $options['notificationsRemovedFromChannelTemplate'], + 'Notifications.InvitedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsInvitedToChannelEnabled']), + 'Notifications.InvitedToChannel.Template' => + $options['notificationsInvitedToChannelTemplate'], + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + 'WebhookFilters' => + Serialize::map($options['webhookFilters'], function ($e) { return $e; }), + 'Webhooks.OnMessageSend.Url' => + $options['webhooksOnMessageSendUrl'], + 'Webhooks.OnMessageSend.Method' => + $options['webhooksOnMessageSendMethod'], + 'Webhooks.OnMessageUpdate.Url' => + $options['webhooksOnMessageUpdateUrl'], + 'Webhooks.OnMessageUpdate.Method' => + $options['webhooksOnMessageUpdateMethod'], + 'Webhooks.OnMessageRemove.Url' => + $options['webhooksOnMessageRemoveUrl'], + 'Webhooks.OnMessageRemove.Method' => + $options['webhooksOnMessageRemoveMethod'], + 'Webhooks.OnChannelAdd.Url' => + $options['webhooksOnChannelAddUrl'], + 'Webhooks.OnChannelAdd.Method' => + $options['webhooksOnChannelAddMethod'], + 'Webhooks.OnChannelDestroy.Url' => + $options['webhooksOnChannelDestroyUrl'], + 'Webhooks.OnChannelDestroy.Method' => + $options['webhooksOnChannelDestroyMethod'], + 'Webhooks.OnChannelUpdate.Url' => + $options['webhooksOnChannelUpdateUrl'], + 'Webhooks.OnChannelUpdate.Method' => + $options['webhooksOnChannelUpdateMethod'], + 'Webhooks.OnMemberAdd.Url' => + $options['webhooksOnMemberAddUrl'], + 'Webhooks.OnMemberAdd.Method' => + $options['webhooksOnMemberAddMethod'], + 'Webhooks.OnMemberRemove.Url' => + $options['webhooksOnMemberRemoveUrl'], + 'Webhooks.OnMemberRemove.Method' => + $options['webhooksOnMemberRemoveMethod'], + 'Webhooks.OnMessageSent.Url' => + $options['webhooksOnMessageSentUrl'], + 'Webhooks.OnMessageSent.Method' => + $options['webhooksOnMessageSentMethod'], + 'Webhooks.OnMessageUpdated.Url' => + $options['webhooksOnMessageUpdatedUrl'], + 'Webhooks.OnMessageUpdated.Method' => + $options['webhooksOnMessageUpdatedMethod'], + 'Webhooks.OnMessageRemoved.Url' => + $options['webhooksOnMessageRemovedUrl'], + 'Webhooks.OnMessageRemoved.Method' => + $options['webhooksOnMessageRemovedMethod'], + 'Webhooks.OnChannelAdded.Url' => + $options['webhooksOnChannelAddedUrl'], + 'Webhooks.OnChannelAdded.Method' => + $options['webhooksOnChannelAddedMethod'], + 'Webhooks.OnChannelDestroyed.Url' => + $options['webhooksOnChannelDestroyedUrl'], + 'Webhooks.OnChannelDestroyed.Method' => + $options['webhooksOnChannelDestroyedMethod'], + 'Webhooks.OnChannelUpdated.Url' => + $options['webhooksOnChannelUpdatedUrl'], + 'Webhooks.OnChannelUpdated.Method' => + $options['webhooksOnChannelUpdatedMethod'], + 'Webhooks.OnMemberAdded.Url' => + $options['webhooksOnMemberAddedUrl'], + 'Webhooks.OnMemberAdded.Method' => + $options['webhooksOnMemberAddedMethod'], + 'Webhooks.OnMemberRemoved.Url' => + $options['webhooksOnMemberRemovedUrl'], + 'Webhooks.OnMemberRemoved.Method' => + $options['webhooksOnMemberRemovedMethod'], + 'Limits.ChannelMembers' => + $options['limitsChannelMembers'], + 'Limits.UserChannels' => + $options['limitsUserChannels'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + if (!$this->_channels) { + $this->_channels = new ChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_channels; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_users; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/ServiceInstance.php b/app/api/Twilio/Rest/Chat/V1/ServiceInstance.php new file mode 100755 index 0000000..4c485a2 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/ServiceInstance.php @@ -0,0 +1,213 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'defaultServiceRoleSid' => Values::array_get($payload, 'default_service_role_sid'), + 'defaultChannelRoleSid' => Values::array_get($payload, 'default_channel_role_sid'), + 'defaultChannelCreatorRoleSid' => Values::array_get($payload, 'default_channel_creator_role_sid'), + 'readStatusEnabled' => Values::array_get($payload, 'read_status_enabled'), + 'reachabilityEnabled' => Values::array_get($payload, 'reachability_enabled'), + 'typingIndicatorTimeout' => Values::array_get($payload, 'typing_indicator_timeout'), + 'consumptionReportInterval' => Values::array_get($payload, 'consumption_report_interval'), + 'limits' => Values::array_get($payload, 'limits'), + 'webhooks' => Values::array_get($payload, 'webhooks'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'webhookFilters' => Values::array_get($payload, 'webhook_filters'), + 'notifications' => Values::array_get($payload, 'notifications'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + return $this->proxy()->channels; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + return $this->proxy()->roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + return $this->proxy()->users; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/ServiceList.php b/app/api/Twilio/Rest/Chat/V1/ServiceList.php new file mode 100755 index 0000000..0f4b709 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/ServiceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): ServiceInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V1/ServiceOptions.php b/app/api/Twilio/Rest/Chat/V1/ServiceOptions.php new file mode 100755 index 0000000..a725180 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/ServiceOptions.php @@ -0,0 +1,1038 @@ +options['friendlyName'] = $friendlyName; + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + $this->options['readStatusEnabled'] = $readStatusEnabled; + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + $this->options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + $this->options['webhookFilters'] = $webhookFilters; + $this->options['webhooksOnMessageSendUrl'] = $webhooksOnMessageSendUrl; + $this->options['webhooksOnMessageSendMethod'] = $webhooksOnMessageSendMethod; + $this->options['webhooksOnMessageUpdateUrl'] = $webhooksOnMessageUpdateUrl; + $this->options['webhooksOnMessageUpdateMethod'] = $webhooksOnMessageUpdateMethod; + $this->options['webhooksOnMessageRemoveUrl'] = $webhooksOnMessageRemoveUrl; + $this->options['webhooksOnMessageRemoveMethod'] = $webhooksOnMessageRemoveMethod; + $this->options['webhooksOnChannelAddUrl'] = $webhooksOnChannelAddUrl; + $this->options['webhooksOnChannelAddMethod'] = $webhooksOnChannelAddMethod; + $this->options['webhooksOnChannelDestroyUrl'] = $webhooksOnChannelDestroyUrl; + $this->options['webhooksOnChannelDestroyMethod'] = $webhooksOnChannelDestroyMethod; + $this->options['webhooksOnChannelUpdateUrl'] = $webhooksOnChannelUpdateUrl; + $this->options['webhooksOnChannelUpdateMethod'] = $webhooksOnChannelUpdateMethod; + $this->options['webhooksOnMemberAddUrl'] = $webhooksOnMemberAddUrl; + $this->options['webhooksOnMemberAddMethod'] = $webhooksOnMemberAddMethod; + $this->options['webhooksOnMemberRemoveUrl'] = $webhooksOnMemberRemoveUrl; + $this->options['webhooksOnMemberRemoveMethod'] = $webhooksOnMemberRemoveMethod; + $this->options['webhooksOnMessageSentUrl'] = $webhooksOnMessageSentUrl; + $this->options['webhooksOnMessageSentMethod'] = $webhooksOnMessageSentMethod; + $this->options['webhooksOnMessageUpdatedUrl'] = $webhooksOnMessageUpdatedUrl; + $this->options['webhooksOnMessageUpdatedMethod'] = $webhooksOnMessageUpdatedMethod; + $this->options['webhooksOnMessageRemovedUrl'] = $webhooksOnMessageRemovedUrl; + $this->options['webhooksOnMessageRemovedMethod'] = $webhooksOnMessageRemovedMethod; + $this->options['webhooksOnChannelAddedUrl'] = $webhooksOnChannelAddedUrl; + $this->options['webhooksOnChannelAddedMethod'] = $webhooksOnChannelAddedMethod; + $this->options['webhooksOnChannelDestroyedUrl'] = $webhooksOnChannelDestroyedUrl; + $this->options['webhooksOnChannelDestroyedMethod'] = $webhooksOnChannelDestroyedMethod; + $this->options['webhooksOnChannelUpdatedUrl'] = $webhooksOnChannelUpdatedUrl; + $this->options['webhooksOnChannelUpdatedMethod'] = $webhooksOnChannelUpdatedMethod; + $this->options['webhooksOnMemberAddedUrl'] = $webhooksOnMemberAddedUrl; + $this->options['webhooksOnMemberAddedMethod'] = $webhooksOnMemberAddedMethod; + $this->options['webhooksOnMemberRemovedUrl'] = $webhooksOnMemberRemovedUrl; + $this->options['webhooksOnMemberRemovedMethod'] = $webhooksOnMemberRemovedMethod; + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + $this->options['limitsUserChannels'] = $limitsUserChannels; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * + * @param string $defaultServiceRoleSid The service role assigned to users when they are added to the service. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * @return $this Fluent Builder + */ + public function setDefaultServiceRoleSid(string $defaultServiceRoleSid): self + { + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + return $this; + } + + /** + * The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * + * @param string $defaultChannelRoleSid The channel role assigned to users when they are added to a channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * @return $this Fluent Builder + */ + public function setDefaultChannelRoleSid(string $defaultChannelRoleSid): self + { + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + return $this; + } + + /** + * The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * + * @param string $defaultChannelCreatorRoleSid The channel role assigned to a channel creator when they join a new channel. See the [Roles endpoint](https://www.twilio.com/docs/chat/api/roles) for more details. + * @return $this Fluent Builder + */ + public function setDefaultChannelCreatorRoleSid(string $defaultChannelCreatorRoleSid): self + { + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + return $this; + } + + /** + * Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + * + * @param bool $readStatusEnabled Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + * @return $this Fluent Builder + */ + public function setReadStatusEnabled(bool $readStatusEnabled): self + { + $this->options['readStatusEnabled'] = $readStatusEnabled; + return $this; + } + + /** + * Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + * + * @param bool $reachabilityEnabled Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + * @return $this Fluent Builder + */ + public function setReachabilityEnabled(bool $reachabilityEnabled): self + { + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + return $this; + } + + /** + * How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + * + * @param int $typingIndicatorTimeout How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + * @return $this Fluent Builder + */ + public function setTypingIndicatorTimeout(int $typingIndicatorTimeout): self + { + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + return $this; + } + + /** + * DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + * + * @param int $consumptionReportInterval DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + * @return $this Fluent Builder + */ + public function setConsumptionReportInterval(int $consumptionReportInterval): self + { + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + return $this; + } + + /** + * Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + * + * @param bool $notificationsNewMessageEnabled Whether to send a notification when a new message is added to a channel. Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageEnabled(bool $notificationsNewMessageEnabled): self + { + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * + * @param string $notificationsNewMessageTemplate The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageTemplate(string $notificationsNewMessageTemplate): self + { + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + return $this; + } + + /** + * Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + * + * @param bool $notificationsAddedToChannelEnabled Whether to send a notification when a member is added to a channel. Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelEnabled(bool $notificationsAddedToChannelEnabled): self + { + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * + * @param string $notificationsAddedToChannelTemplate The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelTemplate(string $notificationsAddedToChannelTemplate): self + { + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + return $this; + } + + /** + * Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + * + * @param bool $notificationsRemovedFromChannelEnabled Whether to send a notification to a user when they are removed from a channel. Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelEnabled(bool $notificationsRemovedFromChannelEnabled): self + { + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * + * @param string $notificationsRemovedFromChannelTemplate The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelTemplate(string $notificationsRemovedFromChannelTemplate): self + { + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + return $this; + } + + /** + * Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + * + * @param bool $notificationsInvitedToChannelEnabled Whether to send a notification when a user is invited to a channel. Can be: `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelEnabled(bool $notificationsInvitedToChannelEnabled): self + { + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * + * @param string $notificationsInvitedToChannelTemplate The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelTemplate(string $notificationsInvitedToChannelTemplate): self + { + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + return $this; + } + + /** + * The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + * + * @param string $preWebhookUrl The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + * + * @param string $postWebhookUrl The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/api/chat/webhooks) for more details. + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string $webhookMethod The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string[] $webhookFilters The list of WebHook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setWebhookFilters(array $webhookFilters): self + { + $this->options['webhookFilters'] = $webhookFilters; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + * + * @param string $webhooksOnMessageSendUrl The URL of the webhook to call in response to the `on_message_send` event using the `webhooks.on_message_send.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSendUrl(string $webhooksOnMessageSendUrl): self + { + $this->options['webhooksOnMessageSendUrl'] = $webhooksOnMessageSendUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_message_send.url`. + * + * @param string $webhooksOnMessageSendMethod The HTTP method to use when calling the `webhooks.on_message_send.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSendMethod(string $webhooksOnMessageSendMethod): self + { + $this->options['webhooksOnMessageSendMethod'] = $webhooksOnMessageSendMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + * + * @param string $webhooksOnMessageUpdateUrl The URL of the webhook to call in response to the `on_message_update` event using the `webhooks.on_message_update.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdateUrl(string $webhooksOnMessageUpdateUrl): self + { + $this->options['webhooksOnMessageUpdateUrl'] = $webhooksOnMessageUpdateUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_message_update.url`. + * + * @param string $webhooksOnMessageUpdateMethod The HTTP method to use when calling the `webhooks.on_message_update.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdateMethod(string $webhooksOnMessageUpdateMethod): self + { + $this->options['webhooksOnMessageUpdateMethod'] = $webhooksOnMessageUpdateMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + * + * @param string $webhooksOnMessageRemoveUrl The URL of the webhook to call in response to the `on_message_remove` event using the `webhooks.on_message_remove.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemoveUrl(string $webhooksOnMessageRemoveUrl): self + { + $this->options['webhooksOnMessageRemoveUrl'] = $webhooksOnMessageRemoveUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_message_remove.url`. + * + * @param string $webhooksOnMessageRemoveMethod The HTTP method to use when calling the `webhooks.on_message_remove.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemoveMethod(string $webhooksOnMessageRemoveMethod): self + { + $this->options['webhooksOnMessageRemoveMethod'] = $webhooksOnMessageRemoveMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + * + * @param string $webhooksOnChannelAddUrl The URL of the webhook to call in response to the `on_channel_add` event using the `webhooks.on_channel_add.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddUrl(string $webhooksOnChannelAddUrl): self + { + $this->options['webhooksOnChannelAddUrl'] = $webhooksOnChannelAddUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_add.url`. + * + * @param string $webhooksOnChannelAddMethod The HTTP method to use when calling the `webhooks.on_channel_add.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddMethod(string $webhooksOnChannelAddMethod): self + { + $this->options['webhooksOnChannelAddMethod'] = $webhooksOnChannelAddMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + * + * @param string $webhooksOnChannelDestroyUrl The URL of the webhook to call in response to the `on_channel_destroy` event using the `webhooks.on_channel_destroy.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyUrl(string $webhooksOnChannelDestroyUrl): self + { + $this->options['webhooksOnChannelDestroyUrl'] = $webhooksOnChannelDestroyUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + * + * @param string $webhooksOnChannelDestroyMethod The HTTP method to use when calling the `webhooks.on_channel_destroy.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyMethod(string $webhooksOnChannelDestroyMethod): self + { + $this->options['webhooksOnChannelDestroyMethod'] = $webhooksOnChannelDestroyMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + * + * @param string $webhooksOnChannelUpdateUrl The URL of the webhook to call in response to the `on_channel_update` event using the `webhooks.on_channel_update.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdateUrl(string $webhooksOnChannelUpdateUrl): self + { + $this->options['webhooksOnChannelUpdateUrl'] = $webhooksOnChannelUpdateUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_update.url`. + * + * @param string $webhooksOnChannelUpdateMethod The HTTP method to use when calling the `webhooks.on_channel_update.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdateMethod(string $webhooksOnChannelUpdateMethod): self + { + $this->options['webhooksOnChannelUpdateMethod'] = $webhooksOnChannelUpdateMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + * + * @param string $webhooksOnMemberAddUrl The URL of the webhook to call in response to the `on_member_add` event using the `webhooks.on_member_add.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddUrl(string $webhooksOnMemberAddUrl): self + { + $this->options['webhooksOnMemberAddUrl'] = $webhooksOnMemberAddUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_member_add.url`. + * + * @param string $webhooksOnMemberAddMethod The HTTP method to use when calling the `webhooks.on_member_add.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddMethod(string $webhooksOnMemberAddMethod): self + { + $this->options['webhooksOnMemberAddMethod'] = $webhooksOnMemberAddMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + * + * @param string $webhooksOnMemberRemoveUrl The URL of the webhook to call in response to the `on_member_remove` event using the `webhooks.on_member_remove.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemoveUrl(string $webhooksOnMemberRemoveUrl): self + { + $this->options['webhooksOnMemberRemoveUrl'] = $webhooksOnMemberRemoveUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_member_remove.url`. + * + * @param string $webhooksOnMemberRemoveMethod The HTTP method to use when calling the `webhooks.on_member_remove.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemoveMethod(string $webhooksOnMemberRemoveMethod): self + { + $this->options['webhooksOnMemberRemoveMethod'] = $webhooksOnMemberRemoveMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + * + * @param string $webhooksOnMessageSentUrl The URL of the webhook to call in response to the `on_message_sent` event using the `webhooks.on_message_sent.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSentUrl(string $webhooksOnMessageSentUrl): self + { + $this->options['webhooksOnMessageSentUrl'] = $webhooksOnMessageSentUrl; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_sent` event`. + * + * @param string $webhooksOnMessageSentMethod The URL of the webhook to call in response to the `on_message_sent` event`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSentMethod(string $webhooksOnMessageSentMethod): self + { + $this->options['webhooksOnMessageSentMethod'] = $webhooksOnMessageSentMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + * + * @param string $webhooksOnMessageUpdatedUrl The URL of the webhook to call in response to the `on_message_updated` event using the `webhooks.on_message_updated.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdatedUrl(string $webhooksOnMessageUpdatedUrl): self + { + $this->options['webhooksOnMessageUpdatedUrl'] = $webhooksOnMessageUpdatedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_message_updated.url`. + * + * @param string $webhooksOnMessageUpdatedMethod The HTTP method to use when calling the `webhooks.on_message_updated.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdatedMethod(string $webhooksOnMessageUpdatedMethod): self + { + $this->options['webhooksOnMessageUpdatedMethod'] = $webhooksOnMessageUpdatedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + * + * @param string $webhooksOnMessageRemovedUrl The URL of the webhook to call in response to the `on_message_removed` event using the `webhooks.on_message_removed.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemovedUrl(string $webhooksOnMessageRemovedUrl): self + { + $this->options['webhooksOnMessageRemovedUrl'] = $webhooksOnMessageRemovedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_message_removed.url`. + * + * @param string $webhooksOnMessageRemovedMethod The HTTP method to use when calling the `webhooks.on_message_removed.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemovedMethod(string $webhooksOnMessageRemovedMethod): self + { + $this->options['webhooksOnMessageRemovedMethod'] = $webhooksOnMessageRemovedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + * + * @param string $webhooksOnChannelAddedUrl The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_added.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddedUrl(string $webhooksOnChannelAddedUrl): self + { + $this->options['webhooksOnChannelAddedUrl'] = $webhooksOnChannelAddedUrl; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_added` event`. + * + * @param string $webhooksOnChannelAddedMethod The URL of the webhook to call in response to the `on_channel_added` event`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddedMethod(string $webhooksOnChannelAddedMethod): self + { + $this->options['webhooksOnChannelAddedMethod'] = $webhooksOnChannelAddedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + * + * @param string $webhooksOnChannelDestroyedUrl The URL of the webhook to call in response to the `on_channel_added` event using the `webhooks.on_channel_destroyed.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyedUrl(string $webhooksOnChannelDestroyedUrl): self + { + $this->options['webhooksOnChannelDestroyedUrl'] = $webhooksOnChannelDestroyedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + * + * @param string $webhooksOnChannelDestroyedMethod The HTTP method to use when calling the `webhooks.on_channel_destroyed.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyedMethod(string $webhooksOnChannelDestroyedMethod): self + { + $this->options['webhooksOnChannelDestroyedMethod'] = $webhooksOnChannelDestroyedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + * + * @param string $webhooksOnChannelUpdatedUrl The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdatedUrl(string $webhooksOnChannelUpdatedUrl): self + { + $this->options['webhooksOnChannelUpdatedUrl'] = $webhooksOnChannelUpdatedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + * + * @param string $webhooksOnChannelUpdatedMethod The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdatedMethod(string $webhooksOnChannelUpdatedMethod): self + { + $this->options['webhooksOnChannelUpdatedMethod'] = $webhooksOnChannelUpdatedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + * + * @param string $webhooksOnMemberAddedUrl The URL of the webhook to call in response to the `on_channel_updated` event using the `webhooks.on_channel_updated.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddedUrl(string $webhooksOnMemberAddedUrl): self + { + $this->options['webhooksOnMemberAddedUrl'] = $webhooksOnMemberAddedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + * + * @param string $webhooksOnMemberAddedMethod The HTTP method to use when calling the `webhooks.on_channel_updated.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddedMethod(string $webhooksOnMemberAddedMethod): self + { + $this->options['webhooksOnMemberAddedMethod'] = $webhooksOnMemberAddedMethod; + return $this; + } + + /** + * The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + * + * @param string $webhooksOnMemberRemovedUrl The URL of the webhook to call in response to the `on_member_removed` event using the `webhooks.on_member_removed.method` HTTP method. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemovedUrl(string $webhooksOnMemberRemovedUrl): self + { + $this->options['webhooksOnMemberRemovedUrl'] = $webhooksOnMemberRemovedUrl; + return $this; + } + + /** + * The HTTP method to use when calling the `webhooks.on_member_removed.url`. + * + * @param string $webhooksOnMemberRemovedMethod The HTTP method to use when calling the `webhooks.on_member_removed.url`. + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemovedMethod(string $webhooksOnMemberRemovedMethod): self + { + $this->options['webhooksOnMemberRemovedMethod'] = $webhooksOnMemberRemovedMethod; + return $this; + } + + /** + * The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + * + * @param int $limitsChannelMembers The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + * @return $this Fluent Builder + */ + public function setLimitsChannelMembers(int $limitsChannelMembers): self + { + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + return $this; + } + + /** + * The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + * + * @param int $limitsUserChannels The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + * @return $this Fluent Builder + */ + public function setLimitsUserChannels(int $limitsUserChannels): self + { + $this->options['limitsUserChannels'] = $limitsUserChannels; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V1/ServicePage.php b/app/api/Twilio/Rest/Chat/V1/ServicePage.php new file mode 100755 index 0000000..c343a3f --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Chat\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2.php b/app/api/Twilio/Rest/Chat/V2.php new file mode 100755 index 0000000..4f7f028 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2.php @@ -0,0 +1,107 @@ +version = 'v2'; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/.openapi-generator-ignore b/app/api/Twilio/Rest/Chat/V2/.openapi-generator-ignore new file mode 100755 index 0000000..2d4b99e --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/app/api/Twilio/Rest/Chat/V2/CredentialContext.php b/app/api/Twilio/Rest/Chat/V2/CredentialContext.php new file mode 100755 index 0000000..7d153a7 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/CredentialContext.php @@ -0,0 +1,134 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/CredentialInstance.php b/app/api/Twilio/Rest/Chat/V2/CredentialInstance.php new file mode 100755 index 0000000..c674d71 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/CredentialList.php b/app/api/Twilio/Rest/Chat/V2/CredentialList.php new file mode 100755 index 0000000..9ed846c --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid The SID of the Credential resource to delete. + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/CredentialOptions.php b/app/api/Twilio/Rest/Chat/V2/CredentialOptions.php new file mode 100755 index 0000000..1faba9d --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/CredentialOptions.php @@ -0,0 +1,314 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/CredentialPage.php b/app/api/Twilio/Rest/Chat/V2/CredentialPage.php new file mode 100755 index 0000000..2752b58 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Chat\V2\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/BindingContext.php b/app/api/Twilio/Rest/Chat/V2/Service/BindingContext.php new file mode 100755 index 0000000..56b8212 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/BindingContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.BindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/BindingInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/BindingInstance.php new file mode 100755 index 0000000..f71f056 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/BindingInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'messageTypes' => Values::array_get($payload, 'message_types'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BindingContext Context for this BindingInstance + */ + protected function proxy(): BindingContext + { + if (!$this->context) { + $this->context = new BindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.BindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/BindingList.php b/app/api/Twilio/Rest/Chat/V2/Service/BindingList.php new file mode 100755 index 0000000..cbd8a20 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/BindingList.php @@ -0,0 +1,178 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings'; + } + + /** + * Reads BindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BindingPage Page of BindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'BindingType' => + $options['bindingType'], + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BindingPage Page of BindingInstance + */ + public function getPage(string $targetUrl): BindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BindingContext + * + * @param string $sid The SID of the Binding resource to delete. + */ + public function getContext( + string $sid + + ): BindingContext + { + return new BindingContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.BindingList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/BindingOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/BindingOptions.php new file mode 100755 index 0000000..fd7ea4b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/BindingOptions.php @@ -0,0 +1,98 @@ +options['bindingType'] = $bindingType; + $this->options['identity'] = $identity; + } + + /** + * The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * + * @param string $bindingType The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * @return $this Fluent Builder + */ + public function setBindingType(array $bindingType): self + { + $this->options['bindingType'] = $bindingType; + return $this; + } + + /** + * The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/BindingPage.php b/app/api/Twilio/Rest/Chat/V2/Service/BindingPage.php new file mode 100755 index 0000000..cfc73bd --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/BindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BindingInstance \Twilio\Rest\Chat\V2\Service\BindingInstance + */ + public function buildInstance(array $payload): BindingInstance + { + return new BindingInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.BindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteContext.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteContext.php new file mode 100755 index 0000000..032b3e0 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.InviteContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteInstance.php new file mode 100755 index 0000000..996f068 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InviteContext Context for this InviteInstance + */ + protected function proxy(): InviteContext + { + if (!$this->context) { + $this->context = new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.InviteInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteList.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteList.php new file mode 100755 index 0000000..f532d89 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites'; + } + + /** + * Create the InviteInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + * @param array|Options $options Optional Arguments + * @return InviteInstance Created InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): InviteInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InviteInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InviteInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InviteInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InviteInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InvitePage Page of InviteInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InvitePage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InvitePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InviteInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InvitePage Page of InviteInstance + */ + public function getPage(string $targetUrl): InvitePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InvitePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InviteContext + * + * @param string $sid The SID of the Invite resource to delete. + */ + public function getContext( + string $sid + + ): InviteContext + { + return new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.InviteList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteOptions.php new file mode 100755 index 0000000..44ca444 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InviteOptions.php @@ -0,0 +1,132 @@ +options['roleSid'] = $roleSid; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the new member. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) assigned to the new member. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateInviteOptions ' . $options . ']'; + } +} + + + +class ReadInviteOptions extends Options + { + /** + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadInviteOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/InvitePage.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InvitePage.php new file mode 100755 index 0000000..3b1baa6 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/InvitePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InviteInstance \Twilio\Rest\Chat\V2\Service\Channel\InviteInstance + */ + public function buildInstance(array $payload): InviteInstance + { + return new InviteInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.InvitePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberContext.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberContext.php new file mode 100755 index 0000000..90212e7 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberContext.php @@ -0,0 +1,155 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.MemberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberInstance.php new file mode 100755 index 0000000..7c6f19b --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberInstance.php @@ -0,0 +1,169 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'lastConsumptionTimestamp' => Deserialize::dateTime(Values::array_get($payload, 'last_consumption_timestamp')), + 'url' => Values::array_get($payload, 'url'), + 'attributes' => Values::array_get($payload, 'attributes'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MemberContext Context for this MemberInstance + */ + protected function proxy(): MemberContext + { + if (!$this->context) { + $this->context = new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.MemberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberList.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberList.php new file mode 100755 index 0000000..0e70ed1 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberList.php @@ -0,0 +1,227 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members'; + } + + /** + * Create the MemberInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more info. + * @param array|Options $options Optional Arguments + * @return MemberInstance Created MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MemberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MemberInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MemberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MemberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MemberPage Page of MemberInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MemberPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MemberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MemberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MemberPage Page of MemberInstance + */ + public function getPage(string $targetUrl): MemberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MemberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MemberContext + * + * @param string $sid The SID of the Member resource to delete. This value can be either the Member's `sid` or its `identity` value. + */ + public function getContext( + string $sid + + ): MemberContext + { + return new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.MemberList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberOptions.php new file mode 100755 index 0000000..9680a49 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberOptions.php @@ -0,0 +1,450 @@ +options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. This parameter should only be used when recreating a Member from a backup/separate source. + * + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. This parameter should only be used when recreating a Member from a backup/separate source. + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * + * @param \DateTime $lastConsumptionTimestamp The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used when a Member is being recreated from a backup/separate source and where a Member was previously updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used when a Member is being recreated from a backup/separate source and where a Member was previously updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateMemberOptions ' . $options . ']'; + } +} + +class DeleteMemberOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.DeleteMemberOptions ' . $options . ']'; + } +} + + +class ReadMemberOptions extends Options + { + /** + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the Member resources to read. See [access tokens](https://www.twilio.com/docs/chat/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadMemberOptions ' . $options . ']'; + } +} + +class UpdateMemberOptions extends Options + { + /** + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + * @param \DateTime $lastConsumptionTimestamp The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @param string $attributes A valid JSON string that contains application-specific data. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $roleSid = Values::NONE, + int $lastConsumedMessageIndex = Values::INT_NONE, + \DateTime $lastConsumptionTimestamp = null, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the member. The default roles are those specified on the [Service](https://www.twilio.com/docs/chat/rest/service-resource). + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + * + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) that the Member has read within the [Channel](https://www.twilio.com/docs/chat/channels). + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * + * @param \DateTime $lastConsumptionTimestamp The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this parameter should only be used when a Member is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateMemberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberPage.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberPage.php new file mode 100755 index 0000000..5d1400c --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MemberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MemberInstance \Twilio\Rest\Chat\V2\Service\Channel\MemberInstance + */ + public function buildInstance(array $payload): MemberInstance + { + return new MemberInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.MemberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageContext.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageContext.php new file mode 100755 index 0000000..5e97b56 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageContext.php @@ -0,0 +1,155 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'LastUpdatedBy' => + $options['lastUpdatedBy'], + 'From' => + $options['from'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageInstance.php new file mode 100755 index 0000000..81493f9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageInstance.php @@ -0,0 +1,177 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'lastUpdatedBy' => Values::array_get($payload, 'last_updated_by'), + 'wasEdited' => Values::array_get($payload, 'was_edited'), + 'from' => Values::array_get($payload, 'from'), + 'body' => Values::array_get($payload, 'body'), + 'index' => Values::array_get($payload, 'index'), + 'type' => Values::array_get($payload, 'type'), + 'media' => Values::array_get($payload, 'media'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageList.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageList.php new file mode 100755 index 0000000..9e371e5 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageList.php @@ -0,0 +1,226 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'From' => + $options['from'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'LastUpdatedBy' => + $options['lastUpdatedBy'], + 'Body' => + $options['body'], + 'MediaSid' => + $options['mediaSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid The SID of the Message resource to delete. + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageOptions.php new file mode 100755 index 0000000..f816ad3 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessageOptions.php @@ -0,0 +1,468 @@ +options['from'] = $from; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + $this->options['body'] = $body; + $this->options['mediaSid'] = $mediaSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The [Identity](https://www.twilio.com/docs/chat/identity) of the new message's author. The default value is `system`. + * + * @param string $from The [Identity](https://www.twilio.com/docs/chat/identity) of the new message's author. The default value is `system`. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + * + * @param string $lastUpdatedBy The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + * @return $this Fluent Builder + */ + public function setLastUpdatedBy(string $lastUpdatedBy): self + { + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + return $this; + } + + /** + * The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * + * @param string $body The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The SID of the [Media](https://www.twilio.com/docs/chat/rest/media) to attach to the new Message. + * + * @param string $mediaSid The SID of the [Media](https://www.twilio.com/docs/chat/rest/media) to attach to the new Message. + * @return $this Fluent Builder + */ + public function setMediaSid(string $mediaSid): self + { + $this->options['mediaSid'] = $mediaSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateMessageOptions ' . $options . ']'; + } +} + +class DeleteMessageOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.DeleteMessageOptions ' . $options . ']'; + } +} + + +class ReadMessageOptions extends Options + { + /** + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + * + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending) with `asc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $body The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @param string $attributes A valid JSON string that contains application-specific data. + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @param string $lastUpdatedBy The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + * @param string $from The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $body = Values::NONE, + string $attributes = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $lastUpdatedBy = Values::NONE, + string $from = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['body'] = $body; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + $this->options['from'] = $from; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * + * @param string $body The message to send to the channel. Can be an empty string or `null`, which sets the value as an empty string. You can send structured data in the body by serializing it as a string. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. This parameter should only be used when a Chat's history is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + * + * @param string $lastUpdatedBy The [Identity](https://www.twilio.com/docs/chat/identity) of the User who last updated the Message, if applicable. + * @return $this Fluent Builder + */ + public function setLastUpdatedBy(string $lastUpdatedBy): self + { + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + return $this; + } + + /** + * The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + * + * @param string $from The [Identity](https://www.twilio.com/docs/chat/identity) of the message's author. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessagePage.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessagePage.php new file mode 100755 index 0000000..8103077 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\Chat\V2\Service\Channel\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookContext.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookContext.php new file mode 100755 index 0000000..4d2efaa --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookContext.php @@ -0,0 +1,148 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.RetryCount' => + $options['configurationRetryCount'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookInstance.php new file mode 100755 index 0000000..3c5ac97 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'type' => Values::array_get($payload, 'type'), + 'url' => Values::array_get($payload, 'url'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookList.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookList.php new file mode 100755 index 0000000..5c51518 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookList.php @@ -0,0 +1,219 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.RetryCount' => + $options['configurationRetryCount'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid The SID of the Channel Webhook resource to delete. + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookOptions.php new file mode 100755 index 0000000..058a651 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookOptions.php @@ -0,0 +1,310 @@ +options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationRetryCount'] = $configurationRetryCount; + } + + /** + * The URL of the webhook to call using the `configuration.method`. + * + * @param string $configurationUrl The URL of the webhook to call using the `configuration.method`. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + * + * @param string[] $configurationFilters The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + * + * @param string[] $configurationTriggers A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` is `studio`. + * + * @param string $configurationFlowSid The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` is `studio`. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + * + * @param int $configurationRetryCount The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + * @return $this Fluent Builder + */ + public function setConfigurationRetryCount(int $configurationRetryCount): self + { + $this->options['configurationRetryCount'] = $configurationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $configurationUrl The URL of the webhook to call using the `configuration.method`. + * @param string $configurationMethod + * @param string[] $configurationFilters The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + * @param string[] $configurationTriggers A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + * @param string $configurationFlowSid The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + * @param int $configurationRetryCount The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + */ + public function __construct( + + string $configurationUrl = Values::NONE, + string $configurationMethod = Values::NONE, + array $configurationFilters = Values::ARRAY_NONE, + array $configurationTriggers = Values::ARRAY_NONE, + string $configurationFlowSid = Values::NONE, + int $configurationRetryCount = Values::INT_NONE + + ) { + $this->options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationRetryCount'] = $configurationRetryCount; + } + + /** + * The URL of the webhook to call using the `configuration.method`. + * + * @param string $configurationUrl The URL of the webhook to call using the `configuration.method`. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + * + * @param string[] $configurationFilters The events that cause us to call the Channel Webhook. Used when `type` is `webhook`. This parameter takes only one event. To specify more than one event, repeat this parameter for each event. For the list of possible events, see [Webhook Event Triggers](https://www.twilio.com/docs/chat/webhook-events#webhook-event-trigger). + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + * + * @param string[] $configurationTriggers A string that will cause us to call the webhook when it is present in a message body. This parameter takes only one trigger string. To specify more than one, repeat this parameter for each trigger string up to a total of 5 trigger strings. Used only when `type` = `trigger`. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + * + * @param string $configurationFlowSid The SID of the Studio [Flow](https://www.twilio.com/docs/studio/rest-api/flow) to call when an event in `configuration.filters` occurs. Used only when `type` = `studio`. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + * + * @param int $configurationRetryCount The number of times to retry the webhook if the first attempt fails. Can be an integer between 0 and 3, inclusive, and the default is 0. + * @return $this Fluent Builder + */ + public function setConfigurationRetryCount(int $configurationRetryCount): self + { + $this->options['configurationRetryCount'] = $configurationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookPage.php b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookPage.php new file mode 100755 index 0000000..76343a5 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/Channel/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Chat\V2\Service\Channel\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/ChannelContext.php b/app/api/Twilio/Rest/Chat/V2/Service/ChannelContext.php new file mode 100755 index 0000000..38e4afd --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/ChannelContext.php @@ -0,0 +1,267 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'CreatedBy' => + $options['createdBy'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + if (!$this->_members) { + $this->_members = new MemberList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + if (!$this->_invites) { + $this->_invites = new InviteList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_invites; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/ChannelInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/ChannelInstance.php new file mode 100755 index 0000000..6a1bdea --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/ChannelInstance.php @@ -0,0 +1,212 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'type' => Values::array_get($payload, 'type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'membersCount' => Values::array_get($payload, 'members_count'), + 'messagesCount' => Values::array_get($payload, 'messages_count'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + return $this->proxy()->members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + return $this->proxy()->invites; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/ChannelList.php b/app/api/Twilio/Rest/Chat/V2/Service/ChannelList.php new file mode 100755 index 0000000..dac1be5 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/ChannelList.php @@ -0,0 +1,218 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels'; + } + + /** + * Create the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Created ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'Type' => + $options['type'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'CreatedBy' => + $options['createdBy'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChannelInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChannelPage Page of ChannelInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChannelPage + { + $options = new Values($options); + + $params = Values::of([ + 'Type' => + $options['type'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChannelPage Page of ChannelInstance + */ + public function getPage(string $targetUrl): ChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChannelContext + * + * @param string $sid The SID of the Channel resource to delete. This value can be either the `sid` or the `unique_name` of the Channel resource to delete. + */ + public function getContext( + string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/ChannelOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/ChannelOptions.php new file mode 100755 index 0000000..2bab80a --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/ChannelOptions.php @@ -0,0 +1,466 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['type'] = $type; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['createdBy'] = $createdBy; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the Channel resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the Channel resource's `sid` in the URL. This value must be 64 characters or less in length and be unique within the Service. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used in cases where a Channel is being recreated from a backup/separate source and where a Message was previously updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. The default value is `null`. Note that this parameter should only be used in cases where a Channel is being recreated from a backup/separate source and where a Message was previously updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The `identity` of the User that created the channel. Default is: `system`. + * + * @param string $createdBy The `identity` of the User that created the channel. Default is: `system`. + * @return $this Fluent Builder + */ + public function setCreatedBy(string $createdBy): self + { + $this->options['createdBy'] = $createdBy; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateChannelOptions ' . $options . ']'; + } +} + +class DeleteChannelOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.DeleteChannelOptions ' . $options . ']'; + } +} + + +class ReadChannelOptions extends Options + { + /** + * @param string $type The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + */ + public function __construct( + + array $type = Values::ARRAY_NONE + + ) { + $this->options['type'] = $type; + } + + /** + * The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + * + * @param string $type The visibility of the Channels to read. Can be: `public` or `private` and defaults to `public`. + * @return $this Fluent Builder + */ + public function setType(array $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadChannelOptions ' . $options . ']'; + } +} + +class UpdateChannelOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 256 characters long. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + * @param string $attributes A valid JSON string that contains application-specific data. + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @param string $createdBy The `identity` of the User that created the channel. Default is: `system`. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + string $attributes = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $createdBy = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['createdBy'] = $createdBy; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 256 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. This value must be 256 characters or less in length and unique within the Service. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + * + * @param \DateTime $dateCreated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was created. The default value is the current time set by the Chat service. Note that this should only be used in cases where a Channel is being recreated from a backup/separate source. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * + * @param \DateTime $dateUpdated The date, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format, to assign to the resource as the date it was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The `identity` of the User that created the channel. Default is: `system`. + * + * @param string $createdBy The `identity` of the User that created the channel. Default is: `system`. + * @return $this Fluent Builder + */ + public function setCreatedBy(string $createdBy): self + { + $this->options['createdBy'] = $createdBy; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/ChannelPage.php b/app/api/Twilio/Rest/Chat/V2/Service/ChannelPage.php new file mode 100755 index 0000000..3d205d3 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\Chat\V2\Service\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/RoleContext.php b/app/api/Twilio/Rest/Chat/V2/Service/RoleContext.php new file mode 100755 index 0000000..4049317 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/RoleContext.php @@ -0,0 +1,128 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/RoleInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/RoleInstance.php new file mode 100755 index 0000000..2fb61b4 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/RoleInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/RoleList.php b/app/api/Twilio/Rest/Chat/V2/Service/RoleList.php new file mode 100755 index 0000000..7ebe42e --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/RoleList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @param string $type + * @param string[] $permission A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid The SID of the Role resource to delete. + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/RolePage.php b/app/api/Twilio/Rest/Chat/V2/Service/RolePage.php new file mode 100755 index 0000000..1e6a250 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\Chat\V2\Service\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingContext.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingContext.php new file mode 100755 index 0000000..634f2d9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'userSid' => + $userSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserBindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserBindingInstance + * + * @return UserBindingInstance Fetched UserBindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserBindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserBindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserBindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingInstance.php new file mode 100755 index 0000000..a0f0196 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'messageTypes' => Values::array_get($payload, 'message_types'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserBindingContext Context for this UserBindingInstance + */ + protected function proxy(): UserBindingContext + { + if (!$this->context) { + $this->context = new UserBindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserBindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserBindingInstance + * + * @return UserBindingInstance Fetched UserBindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserBindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserBindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingList.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingList.php new file mode 100755 index 0000000..7eb60b0 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingList.php @@ -0,0 +1,182 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Bindings'; + } + + /** + * Reads UserBindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserBindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams UserBindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserBindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserBindingPage Page of UserBindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserBindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'BindingType' => + $options['bindingType'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserBindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserBindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserBindingPage Page of UserBindingInstance + */ + public function getPage(string $targetUrl): UserBindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserBindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserBindingContext + * + * @param string $sid The SID of the User Binding resource to delete. + */ + public function getContext( + string $sid + + ): UserBindingContext + { + return new UserBindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserBindingList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingOptions.php new file mode 100755 index 0000000..5362eaf --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingOptions.php @@ -0,0 +1,80 @@ +options['bindingType'] = $bindingType; + } + + /** + * The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * + * @param string $bindingType The push technology used by the User Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * @return $this Fluent Builder + */ + public function setBindingType(array $bindingType): self + { + $this->options['bindingType'] = $bindingType; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.ReadUserBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingPage.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingPage.php new file mode 100755 index 0000000..a257b04 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserBindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserBindingInstance \Twilio\Rest\Chat\V2\Service\User\UserBindingInstance + */ + public function buildInstance(array $payload): UserBindingInstance + { + return new UserBindingInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserBindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelContext.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelContext.php new file mode 100755 index 0000000..7c82060 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelContext.php @@ -0,0 +1,147 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'userSid' => + $userSid, + 'channelSid' => + $channelSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels/' . \rawurlencode($channelSid) + .''; + } + + /** + * Delete the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the UserChannelInstance + * + * @return UserChannelInstance Fetched UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Update the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return UserChannelInstance Updated UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'NotificationLevel' => + $options['notificationLevel'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelInstance.php new file mode 100755 index 0000000..11cc1b3 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'memberSid' => Values::array_get($payload, 'member_sid'), + 'status' => Values::array_get($payload, 'status'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + 'notificationLevel' => Values::array_get($payload, 'notification_level'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, 'channelSid' => $channelSid ?: $this->properties['channelSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserChannelContext Context for this UserChannelInstance + */ + protected function proxy(): UserChannelContext + { + if (!$this->context) { + $this->context = new UserChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the UserChannelInstance + * + * @return UserChannelInstance Fetched UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return UserChannelInstance Updated UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelList.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelList.php new file mode 100755 index 0000000..cb4110f --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels'; + } + + /** + * Reads UserChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserChannelPage Page of UserChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserChannelPage Page of UserChannelInstance + */ + public function getPage(string $targetUrl): UserChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserChannelContext + * + * @param string $channelSid The SID of the [Channel](https://www.twilio.com/docs/api/chat/rest/channels) the resource belongs to. + */ + public function getContext( + string $channelSid + + ): UserChannelContext + { + return new UserChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $channelSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelOptions.php new file mode 100755 index 0000000..0d6b137 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelOptions.php @@ -0,0 +1,166 @@ +options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.DeleteUserChannelOptions ' . $options . ']'; + } +} + + + +class UpdateUserChannelOptions extends Options + { + /** + * @param string $notificationLevel + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + * @param \DateTime $lastConsumptionTimestamp The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + */ + public function __construct( + + string $notificationLevel = Values::NONE, + int $lastConsumedMessageIndex = Values::INT_NONE, + \DateTime $lastConsumptionTimestamp = null + + ) { + $this->options['notificationLevel'] = $notificationLevel; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + } + + /** + * @param string $notificationLevel + * @return $this Fluent Builder + */ + public function setNotificationLevel(string $notificationLevel): self + { + $this->options['notificationLevel'] = $notificationLevel; + return $this; + } + + /** + * The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + * + * @param int $lastConsumedMessageIndex The index of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) in the [Channel](https://www.twilio.com/docs/chat/channels) that the Member has read. + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * + * @param \DateTime $lastConsumptionTimestamp The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) timestamp of the last [Message](https://www.twilio.com/docs/chat/rest/message-resource) read event for the Member within the [Channel](https://www.twilio.com/docs/chat/channels). + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateUserChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelPage.php b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelPage.php new file mode 100755 index 0000000..cb71685 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/User/UserChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserChannelInstance \Twilio\Rest\Chat\V2\Service\User\UserChannelInstance + */ + public function buildInstance(array $payload): UserChannelInstance + { + return new UserChannelInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/UserContext.php b/app/api/Twilio/Rest/Chat/V2/Service/UserContext.php new file mode 100755 index 0000000..41de285 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/UserContext.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the userBindings + */ + protected function getUserBindings(): UserBindingList + { + if (!$this->_userBindings) { + $this->_userBindings = new UserBindingList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userBindings; + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + if (!$this->_userChannels) { + $this->_userChannels = new UserChannelList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userChannels; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/UserInstance.php b/app/api/Twilio/Rest/Chat/V2/Service/UserInstance.php new file mode 100755 index 0000000..d8164e7 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/UserInstance.php @@ -0,0 +1,191 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'joinedChannelsCount' => Values::array_get($payload, 'joined_channels_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userBindings + */ + protected function getUserBindings(): UserBindingList + { + return $this->proxy()->userBindings; + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + return $this->proxy()->userChannels; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/UserList.php b/app/api/Twilio/Rest/Chat/V2/Service/UserList.php new file mode 100755 index 0000000..8667af9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/UserList.php @@ -0,0 +1,206 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/chat/rest/service-resource). This value is often a username or email address. See the Identity documentation for more info. + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid The SID of the User resource to delete. This value can be either the `sid` or the `identity` of the User resource to delete. + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/Service/UserOptions.php b/app/api/Twilio/Rest/Chat/V2/Service/UserOptions.php new file mode 100755 index 0000000..512142a --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/UserOptions.php @@ -0,0 +1,242 @@ +options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the new User. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the new User. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * A descriptive string that you create to describe the new resource. This value is often used for display purposes. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. This value is often used for display purposes. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.CreateUserOptions ' . $options . ']'; + } +} + + + + +class UpdateUserOptions extends Options + { + /** + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + * @param string $attributes A valid JSON string that contains application-specific data. + * @param string $friendlyName A descriptive string that you create to describe the resource. It is often used for display purposes. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $roleSid = Values::NONE, + string $attributes = Values::NONE, + string $friendlyName = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + * + * @param string $roleSid The SID of the [Role](https://www.twilio.com/docs/chat/rest/role-resource) to assign to the User. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * A valid JSON string that contains application-specific data. + * + * @param string $attributes A valid JSON string that contains application-specific data. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It is often used for display purposes. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is often used for display purposes. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/Service/UserPage.php b/app/api/Twilio/Rest/Chat/V2/Service/UserPage.php new file mode 100755 index 0000000..1a0709c --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/Service/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\Chat\V2\Service\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/ServiceContext.php b/app/api/Twilio/Rest/Chat/V2/ServiceContext.php new file mode 100755 index 0000000..dcbfab9 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/ServiceContext.php @@ -0,0 +1,299 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DefaultServiceRoleSid' => + $options['defaultServiceRoleSid'], + 'DefaultChannelRoleSid' => + $options['defaultChannelRoleSid'], + 'DefaultChannelCreatorRoleSid' => + $options['defaultChannelCreatorRoleSid'], + 'ReadStatusEnabled' => + Serialize::booleanToString($options['readStatusEnabled']), + 'ReachabilityEnabled' => + Serialize::booleanToString($options['reachabilityEnabled']), + 'TypingIndicatorTimeout' => + $options['typingIndicatorTimeout'], + 'ConsumptionReportInterval' => + $options['consumptionReportInterval'], + 'Notifications.NewMessage.Enabled' => + Serialize::booleanToString($options['notificationsNewMessageEnabled']), + 'Notifications.NewMessage.Template' => + $options['notificationsNewMessageTemplate'], + 'Notifications.NewMessage.Sound' => + $options['notificationsNewMessageSound'], + 'Notifications.NewMessage.BadgeCountEnabled' => + Serialize::booleanToString($options['notificationsNewMessageBadgeCountEnabled']), + 'Notifications.AddedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsAddedToChannelEnabled']), + 'Notifications.AddedToChannel.Template' => + $options['notificationsAddedToChannelTemplate'], + 'Notifications.AddedToChannel.Sound' => + $options['notificationsAddedToChannelSound'], + 'Notifications.RemovedFromChannel.Enabled' => + Serialize::booleanToString($options['notificationsRemovedFromChannelEnabled']), + 'Notifications.RemovedFromChannel.Template' => + $options['notificationsRemovedFromChannelTemplate'], + 'Notifications.RemovedFromChannel.Sound' => + $options['notificationsRemovedFromChannelSound'], + 'Notifications.InvitedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsInvitedToChannelEnabled']), + 'Notifications.InvitedToChannel.Template' => + $options['notificationsInvitedToChannelTemplate'], + 'Notifications.InvitedToChannel.Sound' => + $options['notificationsInvitedToChannelSound'], + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + 'WebhookFilters' => + Serialize::map($options['webhookFilters'], function ($e) { return $e; }), + 'Limits.ChannelMembers' => + $options['limitsChannelMembers'], + 'Limits.UserChannels' => + $options['limitsUserChannels'], + 'Media.CompatibilityMessage' => + $options['mediaCompatibilityMessage'], + 'PreWebhookRetryCount' => + $options['preWebhookRetryCount'], + 'PostWebhookRetryCount' => + $options['postWebhookRetryCount'], + 'Notifications.LogEnabled' => + Serialize::booleanToString($options['notificationsLogEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + if (!$this->_channels) { + $this->_channels = new ChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_channels; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + if (!$this->_bindings) { + $this->_bindings = new BindingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_bindings; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_users; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/ServiceInstance.php b/app/api/Twilio/Rest/Chat/V2/ServiceInstance.php new file mode 100755 index 0000000..9a81246 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/ServiceInstance.php @@ -0,0 +1,227 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'defaultServiceRoleSid' => Values::array_get($payload, 'default_service_role_sid'), + 'defaultChannelRoleSid' => Values::array_get($payload, 'default_channel_role_sid'), + 'defaultChannelCreatorRoleSid' => Values::array_get($payload, 'default_channel_creator_role_sid'), + 'readStatusEnabled' => Values::array_get($payload, 'read_status_enabled'), + 'reachabilityEnabled' => Values::array_get($payload, 'reachability_enabled'), + 'typingIndicatorTimeout' => Values::array_get($payload, 'typing_indicator_timeout'), + 'consumptionReportInterval' => Values::array_get($payload, 'consumption_report_interval'), + 'limits' => Values::array_get($payload, 'limits'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'webhookFilters' => Values::array_get($payload, 'webhook_filters'), + 'preWebhookRetryCount' => Values::array_get($payload, 'pre_webhook_retry_count'), + 'postWebhookRetryCount' => Values::array_get($payload, 'post_webhook_retry_count'), + 'notifications' => Values::array_get($payload, 'notifications'), + 'media' => Values::array_get($payload, 'media'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + return $this->proxy()->channels; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + return $this->proxy()->bindings; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + return $this->proxy()->roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + return $this->proxy()->users; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V2.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/ServiceList.php b/app/api/Twilio/Rest/Chat/V2/ServiceList.php new file mode 100755 index 0000000..4c591cf --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/ServiceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): ServiceInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The SID of the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V2/ServiceOptions.php b/app/api/Twilio/Rest/Chat/V2/ServiceOptions.php new file mode 100755 index 0000000..7e2d454 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/ServiceOptions.php @@ -0,0 +1,624 @@ +options['friendlyName'] = $friendlyName; + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + $this->options['readStatusEnabled'] = $readStatusEnabled; + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + $this->options['notificationsNewMessageSound'] = $notificationsNewMessageSound; + $this->options['notificationsNewMessageBadgeCountEnabled'] = $notificationsNewMessageBadgeCountEnabled; + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + $this->options['notificationsAddedToChannelSound'] = $notificationsAddedToChannelSound; + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + $this->options['notificationsRemovedFromChannelSound'] = $notificationsRemovedFromChannelSound; + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + $this->options['notificationsInvitedToChannelSound'] = $notificationsInvitedToChannelSound; + $this->options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + $this->options['webhookFilters'] = $webhookFilters; + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + $this->options['limitsUserChannels'] = $limitsUserChannels; + $this->options['mediaCompatibilityMessage'] = $mediaCompatibilityMessage; + $this->options['preWebhookRetryCount'] = $preWebhookRetryCount; + $this->options['postWebhookRetryCount'] = $postWebhookRetryCount; + $this->options['notificationsLogEnabled'] = $notificationsLogEnabled; + } + + /** + * A descriptive string that you create to describe the resource. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * + * @param string $defaultServiceRoleSid The service role assigned to users when they are added to the service. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultServiceRoleSid(string $defaultServiceRoleSid): self + { + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + return $this; + } + + /** + * The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * + * @param string $defaultChannelRoleSid The channel role assigned to users when they are added to a channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultChannelRoleSid(string $defaultChannelRoleSid): self + { + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + return $this; + } + + /** + * The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * + * @param string $defaultChannelCreatorRoleSid The channel role assigned to a channel creator when they join a new channel. See the [Role resource](https://www.twilio.com/docs/chat/rest/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultChannelCreatorRoleSid(string $defaultChannelCreatorRoleSid): self + { + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + return $this; + } + + /** + * Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + * + * @param bool $readStatusEnabled Whether to enable the [Message Consumption Horizon](https://www.twilio.com/docs/chat/consumption-horizon) feature. The default is `true`. + * @return $this Fluent Builder + */ + public function setReadStatusEnabled(bool $readStatusEnabled): self + { + $this->options['readStatusEnabled'] = $readStatusEnabled; + return $this; + } + + /** + * Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + * + * @param bool $reachabilityEnabled Whether to enable the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) for this Service instance. The default is `false`. + * @return $this Fluent Builder + */ + public function setReachabilityEnabled(bool $reachabilityEnabled): self + { + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + return $this; + } + + /** + * How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + * + * @param int $typingIndicatorTimeout How long in seconds after a `started typing` event until clients should assume that user is no longer typing, even if no `ended typing` message was received. The default is 5 seconds. + * @return $this Fluent Builder + */ + public function setTypingIndicatorTimeout(int $typingIndicatorTimeout): self + { + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + return $this; + } + + /** + * DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + * + * @param int $consumptionReportInterval DEPRECATED. The interval in seconds between consumption reports submission batches from client endpoints. + * @return $this Fluent Builder + */ + public function setConsumptionReportInterval(int $consumptionReportInterval): self + { + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + return $this; + } + + /** + * Whether to send a notification when a new message is added to a channel. The default is `false`. + * + * @param bool $notificationsNewMessageEnabled Whether to send a notification when a new message is added to a channel. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageEnabled(bool $notificationsNewMessageEnabled): self + { + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * + * @param string $notificationsNewMessageTemplate The template to use to create the notification text displayed when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageTemplate(string $notificationsNewMessageTemplate): self + { + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + return $this; + } + + /** + * The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * + * @param string $notificationsNewMessageSound The name of the sound to play when a new message is added to a channel and `notifications.new_message.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageSound(string $notificationsNewMessageSound): self + { + $this->options['notificationsNewMessageSound'] = $notificationsNewMessageSound; + return $this; + } + + /** + * Whether the new message badge is enabled. The default is `false`. + * + * @param bool $notificationsNewMessageBadgeCountEnabled Whether the new message badge is enabled. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageBadgeCountEnabled(bool $notificationsNewMessageBadgeCountEnabled): self + { + $this->options['notificationsNewMessageBadgeCountEnabled'] = $notificationsNewMessageBadgeCountEnabled; + return $this; + } + + /** + * Whether to send a notification when a member is added to a channel. The default is `false`. + * + * @param bool $notificationsAddedToChannelEnabled Whether to send a notification when a member is added to a channel. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelEnabled(bool $notificationsAddedToChannelEnabled): self + { + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * + * @param string $notificationsAddedToChannelTemplate The template to use to create the notification text displayed when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelTemplate(string $notificationsAddedToChannelTemplate): self + { + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + return $this; + } + + /** + * The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * + * @param string $notificationsAddedToChannelSound The name of the sound to play when a member is added to a channel and `notifications.added_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelSound(string $notificationsAddedToChannelSound): self + { + $this->options['notificationsAddedToChannelSound'] = $notificationsAddedToChannelSound; + return $this; + } + + /** + * Whether to send a notification to a user when they are removed from a channel. The default is `false`. + * + * @param bool $notificationsRemovedFromChannelEnabled Whether to send a notification to a user when they are removed from a channel. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelEnabled(bool $notificationsRemovedFromChannelEnabled): self + { + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * + * @param string $notificationsRemovedFromChannelTemplate The template to use to create the notification text displayed to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelTemplate(string $notificationsRemovedFromChannelTemplate): self + { + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + return $this; + } + + /** + * The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * + * @param string $notificationsRemovedFromChannelSound The name of the sound to play to a user when they are removed from a channel and `notifications.removed_from_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelSound(string $notificationsRemovedFromChannelSound): self + { + $this->options['notificationsRemovedFromChannelSound'] = $notificationsRemovedFromChannelSound; + return $this; + } + + /** + * Whether to send a notification when a user is invited to a channel. The default is `false`. + * + * @param bool $notificationsInvitedToChannelEnabled Whether to send a notification when a user is invited to a channel. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelEnabled(bool $notificationsInvitedToChannelEnabled): self + { + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * + * @param string $notificationsInvitedToChannelTemplate The template to use to create the notification text displayed when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelTemplate(string $notificationsInvitedToChannelTemplate): self + { + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + return $this; + } + + /** + * The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * + * @param string $notificationsInvitedToChannelSound The name of the sound to play when a user is invited to a channel and `notifications.invited_to_channel.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelSound(string $notificationsInvitedToChannelSound): self + { + $this->options['notificationsInvitedToChannelSound'] = $notificationsInvitedToChannelSound; + return $this; + } + + /** + * The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string $preWebhookUrl The URL for pre-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string $postWebhookUrl The URL for post-event webhooks, which are called by using the `webhook_method`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string $webhookMethod The HTTP method to use for calls to the `pre_webhook_url` and `post_webhook_url` webhooks. Can be: `POST` or `GET` and the default is `POST`. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * + * @param string[] $webhookFilters The list of webhook events that are enabled for this Service instance. See [Webhook Events](https://www.twilio.com/docs/chat/webhook-events) for more details. + * @return $this Fluent Builder + */ + public function setWebhookFilters(array $webhookFilters): self + { + $this->options['webhookFilters'] = $webhookFilters; + return $this; + } + + /** + * The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + * + * @param int $limitsChannelMembers The maximum number of Members that can be added to Channels within this Service. Can be up to 1,000. + * @return $this Fluent Builder + */ + public function setLimitsChannelMembers(int $limitsChannelMembers): self + { + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + return $this; + } + + /** + * The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + * + * @param int $limitsUserChannels The maximum number of Channels Users can be a Member of within this Service. Can be up to 1,000. + * @return $this Fluent Builder + */ + public function setLimitsUserChannels(int $limitsUserChannels): self + { + $this->options['limitsUserChannels'] = $limitsUserChannels; + return $this; + } + + /** + * The message to send when a media message has no text. Can be used as placeholder message. + * + * @param string $mediaCompatibilityMessage The message to send when a media message has no text. Can be used as placeholder message. + * @return $this Fluent Builder + */ + public function setMediaCompatibilityMessage(string $mediaCompatibilityMessage): self + { + $this->options['mediaCompatibilityMessage'] = $mediaCompatibilityMessage; + return $this; + } + + /** + * The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + * + * @param int $preWebhookRetryCount The number of times to retry a call to the `pre_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. Default retry count is 0 times, which means the call won't be retried. + * @return $this Fluent Builder + */ + public function setPreWebhookRetryCount(int $preWebhookRetryCount): self + { + $this->options['preWebhookRetryCount'] = $preWebhookRetryCount; + return $this; + } + + /** + * The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + * + * @param int $postWebhookRetryCount The number of times to retry a call to the `post_webhook_url` if the request times out (after 5 seconds) or it receives a 429, 503, or 504 HTTP response. The default is 0, which means the call won't be retried. + * @return $this Fluent Builder + */ + public function setPostWebhookRetryCount(int $postWebhookRetryCount): self + { + $this->options['postWebhookRetryCount'] = $postWebhookRetryCount; + return $this; + } + + /** + * Whether to log notifications. The default is `false`. + * + * @param bool $notificationsLogEnabled Whether to log notifications. The default is `false`. + * @return $this Fluent Builder + */ + public function setNotificationsLogEnabled(bool $notificationsLogEnabled): self + { + $this->options['notificationsLogEnabled'] = $notificationsLogEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V2.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V2/ServicePage.php b/app/api/Twilio/Rest/Chat/V2/ServicePage.php new file mode 100755 index 0000000..7fc14cf --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V2/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Chat\V2\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V2.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V3.php b/app/api/Twilio/Rest/Chat/V3.php new file mode 100755 index 0000000..82638ac --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3.php @@ -0,0 +1,95 @@ +version = 'v3'; + } + + protected function getChannels(): ChannelList + { + if (!$this->_channels) { + $this->_channels = new ChannelList($this); + } + return $this->_channels; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V3]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V3/.openapi-generator-ignore b/app/api/Twilio/Rest/Chat/V3/.openapi-generator-ignore new file mode 100755 index 0000000..2d4b99e --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/app/api/Twilio/Rest/Chat/V3/ChannelContext.php b/app/api/Twilio/Rest/Chat/V3/ChannelContext.php new file mode 100755 index 0000000..8a7e6f8 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/ChannelContext.php @@ -0,0 +1,101 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $options['type'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V3.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V3/ChannelInstance.php b/app/api/Twilio/Rest/Chat/V3/ChannelInstance.php new file mode 100755 index 0000000..a8e3395 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/ChannelInstance.php @@ -0,0 +1,146 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'type' => Values::array_get($payload, 'type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'membersCount' => Values::array_get($payload, 'members_count'), + 'messagesCount' => Values::array_get($payload, 'messages_count'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid ?: $this->properties['serviceSid'], 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Chat.V3.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V3/ChannelList.php b/app/api/Twilio/Rest/Chat/V3/ChannelList.php new file mode 100755 index 0000000..2530c44 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/ChannelList.php @@ -0,0 +1,69 @@ +solution = [ + ]; + } + + /** + * Constructs a ChannelContext + * + * @param string $serviceSid The unique SID identifier of the Service. + * + * @param string $sid A 34 character string that uniquely identifies this Channel. + */ + public function getContext( + string $serviceSid + , string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $serviceSid, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V3.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Chat/V3/ChannelOptions.php b/app/api/Twilio/Rest/Chat/V3/ChannelOptions.php new file mode 100755 index 0000000..20db784 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/ChannelOptions.php @@ -0,0 +1,110 @@ +options['type'] = $type; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this channel belongs to. + * + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this channel belongs to. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Chat.V3.UpdateChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Chat/V3/ChannelPage.php b/app/api/Twilio/Rest/Chat/V3/ChannelPage.php new file mode 100755 index 0000000..60bb740 --- /dev/null +++ b/app/api/Twilio/Rest/Chat/V3/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\Chat\V3\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Chat.V3.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/ChatBase.php b/app/api/Twilio/Rest/ChatBase.php new file mode 100755 index 0000000..2d2e105 --- /dev/null +++ b/app/api/Twilio/Rest/ChatBase.php @@ -0,0 +1,114 @@ +baseUrl = 'https://chat.twilio.com'; + } + + + /** + * @return V1 Version v1 of chat + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of chat + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * @return V3 Version v3 of chat + */ + protected function getV3(): V3 { + if (!$this->_v3) { + $this->_v3 = new V3($this); + } + return $this->_v3; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Chat]'; + } +} diff --git a/app/api/Twilio/Rest/Client.php b/app/api/Twilio/Rest/Client.php new file mode 100755 index 0000000..b6c74e1 --- /dev/null +++ b/app/api/Twilio/Rest/Client.php @@ -0,0 +1,695 @@ +_accounts) { + $this->_accounts = new Accounts($this); + } + return $this->_accounts; + } + /** + * Access the Api Twilio Domain + * + * @return Api Api Twilio Domain + */ + protected function getApi(): Api { + if (!$this->_api) { + $this->_api = new Api($this); + } + return $this->_api; + } + /** + * Access the Autopilot Twilio Domain + * + * @return Autopilot Autopilot Twilio Domain + */ + protected function getAutopilot(): Autopilot { + if (!$this->_autopilot) { + $this->_autopilot = new Autopilot($this); + } + return $this->_autopilot; + } + /** + * Access the Bulkexports Twilio Domain + * + * @return Bulkexports Bulkexports Twilio Domain + */ + protected function getBulkexports(): Bulkexports { + if (!$this->_bulkexports) { + $this->_bulkexports = new Bulkexports($this); + } + return $this->_bulkexports; + } + /** + * Access the Chat Twilio Domain + * + * @return Chat Chat Twilio Domain + */ + protected function getChat(): Chat { + if (!$this->_chat) { + $this->_chat = new Chat($this); + } + return $this->_chat; + } + /** + * Access the Content Twilio Domain + * + * @return Content Content Twilio Domain + */ + protected function getContent(): Content { + if (!$this->_content) { + $this->_content = new Content($this); + } + return $this->_content; + } + /** + * Access the Conversations Twilio Domain + * + * @return Conversations Conversations Twilio Domain + */ + protected function getConversations(): Conversations { + if (!$this->_conversations) { + $this->_conversations = new Conversations($this); + } + return $this->_conversations; + } + /** + * Access the Events Twilio Domain + * + * @return Events Events Twilio Domain + */ + protected function getEvents(): Events { + if (!$this->_events) { + $this->_events = new Events($this); + } + return $this->_events; + } + /** + * Access the FlexApi Twilio Domain + * + * @return FlexApi FlexApi Twilio Domain + */ + protected function getFlexApi(): FlexApi { + if (!$this->_flexApi) { + $this->_flexApi = new FlexApi($this); + } + return $this->_flexApi; + } + /** + * Access the FrontlineApi Twilio Domain + * + * @return FrontlineApi FrontlineApi Twilio Domain + */ + protected function getFrontlineApi(): FrontlineApi { + if (!$this->_frontlineApi) { + $this->_frontlineApi = new FrontlineApi($this); + } + return $this->_frontlineApi; + } + /** + * Access the Insights Twilio Domain + * + * @return Insights Insights Twilio Domain + */ + protected function getInsights(): Insights { + if (!$this->_insights) { + $this->_insights = new Insights($this); + } + return $this->_insights; + } + /** + * Access the IpMessaging Twilio Domain + * + * @return IpMessaging IpMessaging Twilio Domain + */ + protected function getIpMessaging(): IpMessaging { + if (!$this->_ipMessaging) { + $this->_ipMessaging = new IpMessaging($this); + } + return $this->_ipMessaging; + } + /** + * Access the Lookups Twilio Domain + * + * @return Lookups Lookups Twilio Domain + */ + protected function getLookups(): Lookups { + if (!$this->_lookups) { + $this->_lookups = new Lookups($this); + } + return $this->_lookups; + } + /** + * Access the Media Twilio Domain + * + * @return Media Media Twilio Domain + */ + protected function getMedia(): Media { + if (!$this->_media) { + $this->_media = new Media($this); + } + return $this->_media; + } + /** + * Access the Messaging Twilio Domain + * + * @return Messaging Messaging Twilio Domain + */ + protected function getMessaging(): Messaging { + if (!$this->_messaging) { + $this->_messaging = new Messaging($this); + } + return $this->_messaging; + } + /** + * Access the Microvisor Twilio Domain + * + * @return Microvisor Microvisor Twilio Domain + */ + protected function getMicrovisor(): Microvisor { + if (!$this->_microvisor) { + $this->_microvisor = new Microvisor($this); + } + return $this->_microvisor; + } + /** + * Access the Monitor Twilio Domain + * + * @return Monitor Monitor Twilio Domain + */ + protected function getMonitor(): Monitor { + if (!$this->_monitor) { + $this->_monitor = new Monitor($this); + } + return $this->_monitor; + } + /** + * Access the Notify Twilio Domain + * + * @return Notify Notify Twilio Domain + */ + protected function getNotify(): Notify { + if (!$this->_notify) { + $this->_notify = new Notify($this); + } + return $this->_notify; + } + /** + * Access the Numbers Twilio Domain + * + * @return Numbers Numbers Twilio Domain + */ + protected function getNumbers(): Numbers { + if (!$this->_numbers) { + $this->_numbers = new Numbers($this); + } + return $this->_numbers; + } + /** + * Access the Oauth Twilio Domain + * + * @return Oauth Oauth Twilio Domain + */ + protected function getOauth(): Oauth { + if (!$this->_oauth) { + $this->_oauth = new Oauth($this); + } + return $this->_oauth; + } + /** + * Access the Preview Twilio Domain + * + * @return Preview Preview Twilio Domain + */ + protected function getPreview(): Preview { + if (!$this->_preview) { + $this->_preview = new Preview($this); + } + return $this->_preview; + } + /** + * Access the Pricing Twilio Domain + * + * @return Pricing Pricing Twilio Domain + */ + protected function getPricing(): Pricing { + if (!$this->_pricing) { + $this->_pricing = new Pricing($this); + } + return $this->_pricing; + } + /** + * Access the Proxy Twilio Domain + * + * @return Proxy Proxy Twilio Domain + */ + protected function getProxy(): Proxy { + if (!$this->_proxy) { + $this->_proxy = new Proxy($this); + } + return $this->_proxy; + } + /** + * Access the Routes Twilio Domain + * + * @return Routes Routes Twilio Domain + */ + protected function getRoutes(): Routes { + if (!$this->_routes) { + $this->_routes = new Routes($this); + } + return $this->_routes; + } + /** + * Access the Serverless Twilio Domain + * + * @return Serverless Serverless Twilio Domain + */ + protected function getServerless(): Serverless { + if (!$this->_serverless) { + $this->_serverless = new Serverless($this); + } + return $this->_serverless; + } + /** + * Access the Studio Twilio Domain + * + * @return Studio Studio Twilio Domain + */ + protected function getStudio(): Studio { + if (!$this->_studio) { + $this->_studio = new Studio($this); + } + return $this->_studio; + } + /** + * Access the Supersim Twilio Domain + * + * @return Supersim Supersim Twilio Domain + */ + protected function getSupersim(): Supersim { + if (!$this->_supersim) { + $this->_supersim = new Supersim($this); + } + return $this->_supersim; + } + /** + * Access the Sync Twilio Domain + * + * @return Sync Sync Twilio Domain + */ + protected function getSync(): Sync { + if (!$this->_sync) { + $this->_sync = new Sync($this); + } + return $this->_sync; + } + /** + * Access the Taskrouter Twilio Domain + * + * @return Taskrouter Taskrouter Twilio Domain + */ + protected function getTaskrouter(): Taskrouter { + if (!$this->_taskrouter) { + $this->_taskrouter = new Taskrouter($this); + } + return $this->_taskrouter; + } + /** + * Access the Trunking Twilio Domain + * + * @return Trunking Trunking Twilio Domain + */ + protected function getTrunking(): Trunking { + if (!$this->_trunking) { + $this->_trunking = new Trunking($this); + } + return $this->_trunking; + } + /** + * Access the Trusthub Twilio Domain + * + * @return Trusthub Trusthub Twilio Domain + */ + protected function getTrusthub(): Trusthub { + if (!$this->_trusthub) { + $this->_trusthub = new Trusthub($this); + } + return $this->_trusthub; + } + /** + * Access the Verify Twilio Domain + * + * @return Verify Verify Twilio Domain + */ + protected function getVerify(): Verify { + if (!$this->_verify) { + $this->_verify = new Verify($this); + } + return $this->_verify; + } + /** + * Access the Video Twilio Domain + * + * @return Video Video Twilio Domain + */ + protected function getVideo(): Video { + if (!$this->_video) { + $this->_video = new Video($this); + } + return $this->_video; + } + /** + * Access the Voice Twilio Domain + * + * @return Voice Voice Twilio Domain + */ + protected function getVoice(): Voice { + if (!$this->_voice) { + $this->_voice = new Voice($this); + } + return $this->_voice; + } + /** + * Access the Wireless Twilio Domain + * + * @return Wireless Wireless Twilio Domain + */ + protected function getWireless(): Wireless { + if (!$this->_wireless) { + $this->_wireless = new Wireless($this); + } + return $this->_wireless; + } + protected function getAddresses(): \Twilio\Rest\Api\V2010\Account\AddressList { + return $this->api->v2010->account->addresses; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Address resource to fetch. + */ + protected function contextAddresses(string $sid): \Twilio\Rest\Api\V2010\Account\AddressContext { + return $this->api->v2010->account->addresses($sid); + } + protected function getApplications(): \Twilio\Rest\Api\V2010\Account\ApplicationList { + return $this->api->v2010->account->applications; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Application resource to fetch. + */ + protected function contextApplications(string $sid): \Twilio\Rest\Api\V2010\Account\ApplicationContext { + return $this->api->v2010->account->applications($sid); + } + protected function getAuthorizedConnectApps(): \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppList { + return $this->api->v2010->account->authorizedConnectApps; + } + /** + * @param string $connectAppSid The SID of the Connect App to fetch. + */ + protected function contextAuthorizedConnectApps(string $connectAppSid): \Twilio\Rest\Api\V2010\Account\AuthorizedConnectAppContext { + return $this->api->v2010->account->authorizedConnectApps($connectAppSid); + } + protected function getAvailablePhoneNumbers(): \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryList { + return $this->api->v2010->account->availablePhoneNumbers; + } + /** + * @param string $countryCode The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country to fetch available phone number information about. + */ + protected function contextAvailablePhoneNumbers(string $countryCode): \Twilio\Rest\Api\V2010\Account\AvailablePhoneNumberCountryContext { + return $this->api->v2010->account->availablePhoneNumbers($countryCode); + } + protected function getBalance(): \Twilio\Rest\Api\V2010\Account\BalanceList { + return $this->api->v2010->account->balance; + } + protected function getCalls(): \Twilio\Rest\Api\V2010\Account\CallList { + return $this->api->v2010->account->calls; + } + /** + * @param string $sid The SID of the Call resource to fetch. + */ + protected function contextCalls(string $sid): \Twilio\Rest\Api\V2010\Account\CallContext { + return $this->api->v2010->account->calls($sid); + } + protected function getConferences(): \Twilio\Rest\Api\V2010\Account\ConferenceList { + return $this->api->v2010->account->conferences; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Conference resource to fetch + */ + protected function contextConferences(string $sid): \Twilio\Rest\Api\V2010\Account\ConferenceContext { + return $this->api->v2010->account->conferences($sid); + } + protected function getConnectApps(): \Twilio\Rest\Api\V2010\Account\ConnectAppList { + return $this->api->v2010->account->connectApps; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the ConnectApp resource to fetch. + */ + protected function contextConnectApps(string $sid): \Twilio\Rest\Api\V2010\Account\ConnectAppContext { + return $this->api->v2010->account->connectApps($sid); + } + protected function getIncomingPhoneNumbers(): \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberList { + return $this->api->v2010->account->incomingPhoneNumbers; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the IncomingPhoneNumber resource to fetch. + */ + protected function contextIncomingPhoneNumbers(string $sid): \Twilio\Rest\Api\V2010\Account\IncomingPhoneNumberContext { + return $this->api->v2010->account->incomingPhoneNumbers($sid); + } + protected function getKeys(): \Twilio\Rest\Api\V2010\Account\KeyList { + return $this->api->v2010->account->keys; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Key resource to fetch. + */ + protected function contextKeys(string $sid): \Twilio\Rest\Api\V2010\Account\KeyContext { + return $this->api->v2010->account->keys($sid); + } + protected function getMessages(): \Twilio\Rest\Api\V2010\Account\MessageList { + return $this->api->v2010->account->messages; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Message resource to fetch. + */ + protected function contextMessages(string $sid): \Twilio\Rest\Api\V2010\Account\MessageContext { + return $this->api->v2010->account->messages($sid); + } + protected function getNewKeys(): \Twilio\Rest\Api\V2010\Account\NewKeyList { + return $this->api->v2010->account->newKeys; + } + protected function getNewSigningKeys(): \Twilio\Rest\Api\V2010\Account\NewSigningKeyList { + return $this->api->v2010->account->newSigningKeys; + } + protected function getNotifications(): \Twilio\Rest\Api\V2010\Account\NotificationList { + return $this->api->v2010->account->notifications; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Notification resource to fetch. + */ + protected function contextNotifications(string $sid): \Twilio\Rest\Api\V2010\Account\NotificationContext { + return $this->api->v2010->account->notifications($sid); + } + protected function getOutgoingCallerIds(): \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdList { + return $this->api->v2010->account->outgoingCallerIds; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the OutgoingCallerId resource to fetch. + */ + protected function contextOutgoingCallerIds(string $sid): \Twilio\Rest\Api\V2010\Account\OutgoingCallerIdContext { + return $this->api->v2010->account->outgoingCallerIds($sid); + } + protected function getQueues(): \Twilio\Rest\Api\V2010\Account\QueueList { + return $this->api->v2010->account->queues; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Queue resource to fetch + */ + protected function contextQueues(string $sid): \Twilio\Rest\Api\V2010\Account\QueueContext { + return $this->api->v2010->account->queues($sid); + } + protected function getRecordings(): \Twilio\Rest\Api\V2010\Account\RecordingList { + return $this->api->v2010->account->recordings; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Recording resource to fetch. + */ + protected function contextRecordings(string $sid): \Twilio\Rest\Api\V2010\Account\RecordingContext { + return $this->api->v2010->account->recordings($sid); + } + protected function getShortCodes(): \Twilio\Rest\Api\V2010\Account\ShortCodeList { + return $this->api->v2010->account->shortCodes; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the ShortCode resource to fetch + */ + protected function contextShortCodes(string $sid): \Twilio\Rest\Api\V2010\Account\ShortCodeContext { + return $this->api->v2010->account->shortCodes($sid); + } + protected function getSigningKeys(): \Twilio\Rest\Api\V2010\Account\SigningKeyList { + return $this->api->v2010->account->signingKeys; + } + /** + * @param string $sid The sid + */ + protected function contextSigningKeys(string $sid): \Twilio\Rest\Api\V2010\Account\SigningKeyContext { + return $this->api->v2010->account->signingKeys($sid); + } + protected function getSip(): \Twilio\Rest\Api\V2010\Account\SipList { + return $this->api->v2010->account->sip; + } + protected function getTokens(): \Twilio\Rest\Api\V2010\Account\TokenList { + return $this->api->v2010->account->tokens; + } + protected function getTranscriptions(): \Twilio\Rest\Api\V2010\Account\TranscriptionList { + return $this->api->v2010->account->transcriptions; + } + /** + * @param string $sid The Twilio-provided string that uniquely identifies the Transcription resource to fetch. + */ + protected function contextTranscriptions(string $sid): \Twilio\Rest\Api\V2010\Account\TranscriptionContext { + return $this->api->v2010->account->transcriptions($sid); + } + protected function getUsage(): \Twilio\Rest\Api\V2010\Account\UsageList { + return $this->api->v2010->account->usage; + } + protected function getValidationRequests(): \Twilio\Rest\Api\V2010\Account\ValidationRequestList { + return $this->api->v2010->account->validationRequests; + } +} diff --git a/app/api/Twilio/Rest/Content.php b/app/api/Twilio/Rest/Content.php new file mode 100755 index 0000000..37d747c --- /dev/null +++ b/app/api/Twilio/Rest/Content.php @@ -0,0 +1,25 @@ +contents instead. + */ + protected function getContents(): \Twilio\Rest\Content\V1\ContentList { + echo "contents is deprecated. Use v1->contents instead."; + return $this->v1->contents; + } + + /** + * @deprecated Use v1->contents(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextContents(string $sid): \Twilio\Rest\Content\V1\ContentContext { + echo "contents(\$sid) is deprecated. Use v1->contents(\$sid) instead."; + return $this->v1->contents($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Content/V1.php b/app/api/Twilio/Rest/Content/V1.php new file mode 100755 index 0000000..ed8c25a --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1.php @@ -0,0 +1,117 @@ +version = 'v1'; + } + + protected function getContents(): ContentList + { + if (!$this->_contents) { + $this->_contents = new ContentList($this); + } + return $this->_contents; + } + + protected function getContentAndApprovals(): ContentAndApprovalsList + { + if (!$this->_contentAndApprovals) { + $this->_contentAndApprovals = new ContentAndApprovalsList($this); + } + return $this->_contentAndApprovals; + } + + protected function getLegacyContents(): LegacyContentList + { + if (!$this->_legacyContents) { + $this->_legacyContents = new LegacyContentList($this); + } + return $this->_legacyContents; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchContext.php b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchContext.php new file mode 100755 index 0000000..44d43e9 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Content/' . \rawurlencode($sid) + .'/ApprovalRequests'; + } + + /** + * Fetch the ApprovalFetchInstance + * + * @return ApprovalFetchInstance Fetched ApprovalFetchInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ApprovalFetchInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ApprovalFetchInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Content.V1.ApprovalFetchContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchInstance.php b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchInstance.php new file mode 100755 index 0000000..ef07f0f --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchInstance.php @@ -0,0 +1,121 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'whatsapp' => Values::array_get($payload, 'whatsapp'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ApprovalFetchContext Context for this ApprovalFetchInstance + */ + protected function proxy(): ApprovalFetchContext + { + if (!$this->context) { + $this->context = new ApprovalFetchContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ApprovalFetchInstance + * + * @return ApprovalFetchInstance Fetched ApprovalFetchInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ApprovalFetchInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Content.V1.ApprovalFetchInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchList.php b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchList.php new file mode 100755 index 0000000..c27a001 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchList.php @@ -0,0 +1,67 @@ +solution = [ + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a ApprovalFetchContext + */ + public function getContext( + + ): ApprovalFetchContext + { + return new ApprovalFetchContext( + $this->version, + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ApprovalFetchList]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchPage.php b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchPage.php new file mode 100755 index 0000000..fdf6a60 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/Content/ApprovalFetchPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ApprovalFetchInstance \Twilio\Rest\Content\V1\Content\ApprovalFetchInstance + */ + public function buildInstance(array $payload): ApprovalFetchInstance + { + return new ApprovalFetchInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ApprovalFetchPage]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsInstance.php b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsInstance.php new file mode 100755 index 0000000..dc49ba8 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsInstance.php @@ -0,0 +1,97 @@ +properties = [ + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'language' => Values::array_get($payload, 'language'), + 'variables' => Values::array_get($payload, 'variables'), + 'types' => Values::array_get($payload, 'types'), + 'approvalRequests' => Values::array_get($payload, 'approval_requests'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ContentAndApprovalsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsList.php b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsList.php new file mode 100755 index 0000000..7ff5573 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsList.php @@ -0,0 +1,145 @@ +solution = [ + ]; + + $this->uri = '/ContentAndApprovals'; + } + + /** + * Reads ContentAndApprovalsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ContentAndApprovalsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ContentAndApprovalsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ContentAndApprovalsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ContentAndApprovalsPage Page of ContentAndApprovalsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ContentAndApprovalsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ContentAndApprovalsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ContentAndApprovalsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ContentAndApprovalsPage Page of ContentAndApprovalsInstance + */ + public function getPage(string $targetUrl): ContentAndApprovalsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ContentAndApprovalsPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ContentAndApprovalsList]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsPage.php b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsPage.php new file mode 100755 index 0000000..c8e7b7f --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentAndApprovalsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ContentAndApprovalsInstance \Twilio\Rest\Content\V1\ContentAndApprovalsInstance + */ + public function buildInstance(array $payload): ContentAndApprovalsInstance + { + return new ContentAndApprovalsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ContentAndApprovalsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/ContentContext.php b/app/api/Twilio/Rest/Content/V1/ContentContext.php new file mode 100755 index 0000000..ca48ab6 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentContext.php @@ -0,0 +1,152 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Content/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ContentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ContentInstance + * + * @return ContentInstance Fetched ContentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ContentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ContentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the approvalFetch + */ + protected function getApprovalFetch(): ApprovalFetchList + { + if (!$this->_approvalFetch) { + $this->_approvalFetch = new ApprovalFetchList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_approvalFetch; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Content.V1.ContentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/ContentInstance.php b/app/api/Twilio/Rest/Content/V1/ContentInstance.php new file mode 100755 index 0000000..f20d535 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentInstance.php @@ -0,0 +1,157 @@ +properties = [ + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'language' => Values::array_get($payload, 'language'), + 'variables' => Values::array_get($payload, 'variables'), + 'types' => Values::array_get($payload, 'types'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ContentContext Context for this ContentInstance + */ + protected function proxy(): ContentContext + { + if (!$this->context) { + $this->context = new ContentContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ContentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ContentInstance + * + * @return ContentInstance Fetched ContentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ContentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the approvalFetch + */ + protected function getApprovalFetch(): ApprovalFetchList + { + return $this->proxy()->approvalFetch; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Content.V1.ContentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Content/V1/ContentList.php b/app/api/Twilio/Rest/Content/V1/ContentList.php new file mode 100755 index 0000000..64f527a --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Content'; + } + + /** + * Reads ContentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ContentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ContentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ContentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ContentPage Page of ContentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ContentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ContentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ContentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ContentPage Page of ContentInstance + */ + public function getPage(string $targetUrl): ContentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ContentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ContentContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Content resource to fetch. + */ + public function getContext( + string $sid + + ): ContentContext + { + return new ContentContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ContentList]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/ContentPage.php b/app/api/Twilio/Rest/Content/V1/ContentPage.php new file mode 100755 index 0000000..4eb8e83 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/ContentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ContentInstance \Twilio\Rest\Content\V1\ContentInstance + */ + public function buildInstance(array $payload): ContentInstance + { + return new ContentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.ContentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/LegacyContentInstance.php b/app/api/Twilio/Rest/Content/V1/LegacyContentInstance.php new file mode 100755 index 0000000..e9730e3 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/LegacyContentInstance.php @@ -0,0 +1,101 @@ +properties = [ + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'language' => Values::array_get($payload, 'language'), + 'variables' => Values::array_get($payload, 'variables'), + 'types' => Values::array_get($payload, 'types'), + 'legacyTemplateName' => Values::array_get($payload, 'legacy_template_name'), + 'legacyBody' => Values::array_get($payload, 'legacy_body'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.LegacyContentInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Content/V1/LegacyContentList.php b/app/api/Twilio/Rest/Content/V1/LegacyContentList.php new file mode 100755 index 0000000..99bbc9d --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/LegacyContentList.php @@ -0,0 +1,145 @@ +solution = [ + ]; + + $this->uri = '/LegacyContent'; + } + + /** + * Reads LegacyContentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return LegacyContentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams LegacyContentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of LegacyContentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return LegacyContentPage Page of LegacyContentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): LegacyContentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new LegacyContentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of LegacyContentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return LegacyContentPage Page of LegacyContentInstance + */ + public function getPage(string $targetUrl): LegacyContentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new LegacyContentPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.LegacyContentList]'; + } +} diff --git a/app/api/Twilio/Rest/Content/V1/LegacyContentPage.php b/app/api/Twilio/Rest/Content/V1/LegacyContentPage.php new file mode 100755 index 0000000..f1c1f84 --- /dev/null +++ b/app/api/Twilio/Rest/Content/V1/LegacyContentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LegacyContentInstance \Twilio\Rest\Content\V1\LegacyContentInstance + */ + public function buildInstance(array $payload): LegacyContentInstance + { + return new LegacyContentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Content.V1.LegacyContentPage]'; + } +} diff --git a/app/api/Twilio/Rest/ContentBase.php b/app/api/Twilio/Rest/ContentBase.php new file mode 100755 index 0000000..21cda50 --- /dev/null +++ b/app/api/Twilio/Rest/ContentBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://content.twilio.com'; + } + + + /** + * @return V1 Version v1 of content + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Content]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations.php b/app/api/Twilio/Rest/Conversations.php new file mode 100755 index 0000000..9f5cb20 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations.php @@ -0,0 +1,137 @@ +configuration instead. + */ + protected function getConfiguration(): \Twilio\Rest\Conversations\V1\ConfigurationList { + echo "configuration is deprecated. Use v1->configuration instead."; + return $this->v1->configuration; + } + + /** + * @deprecated Use v1->configuration() instead. + */ + protected function contextConfiguration(): \Twilio\Rest\Conversations\V1\ConfigurationContext { + echo "configuration() is deprecated. Use v1->configuration() instead."; + return $this->v1->configuration(); + } + + /** + * @deprecated Use v1->addressConfigurations instead. + */ + protected function getAddressConfigurations(): \Twilio\Rest\Conversations\V1\AddressConfigurationList { + echo "addressConfigurations is deprecated. Use v1->addressConfigurations instead."; + return $this->v1->addressConfigurations; + } + + /** + * @deprecated Use v1->addressConfigurations(\$sid) instead. + * @param string $sid The SID or Address of the Configuration. + */ + protected function contextAddressConfigurations(string $sid): \Twilio\Rest\Conversations\V1\AddressConfigurationContext { + echo "addressConfigurations(\$sid) is deprecated. Use v1->addressConfigurations(\$sid) instead."; + return $this->v1->addressConfigurations($sid); + } + + /** + * @deprecated Use v1->conversations instead. + */ + protected function getConversations(): \Twilio\Rest\Conversations\V1\ConversationList { + echo "conversations is deprecated. Use v1->conversations instead."; + return $this->v1->conversations; + } + + /** + * @deprecated Use v1->conversations(\$sid) instead. + * @param string $sid A 34 character string that uniquely identifies this + * resource. + */ + protected function contextConversations(string $sid): \Twilio\Rest\Conversations\V1\ConversationContext { + echo "conversations(\$sid) is deprecated. Use v1->conversations(\$sid) instead."; + return $this->v1->conversations($sid); + } + + /** + * @deprecated Use v1->credentials instead. + */ + protected function getCredentials(): \Twilio\Rest\Conversations\V1\CredentialList { + echo "credentials is deprecated. Use v1->credentials instead."; + return $this->v1->credentials; + } + + /** + * @deprecated Use v1->credentials(\$sid) instead. + * @param string $sid A 34 character string that uniquely identifies this + * resource. + */ + protected function contextCredentials(string $sid): \Twilio\Rest\Conversations\V1\CredentialContext { + echo "credentials(\$sid) is deprecated. Use v1->credentials(\$sid) instead."; + return $this->v1->credentials($sid); + } + + /** + * @deprecated Use v1->participantConversations instead. + */ + protected function getParticipantConversations(): \Twilio\Rest\Conversations\V1\ParticipantConversationList { + echo "participantConversations is deprecated. Use v1->participantConversations instead."; + return $this->v1->participantConversations; + } + + /** + * @deprecated Use v1->roles instead. + */ + protected function getRoles(): \Twilio\Rest\Conversations\V1\RoleList { + echo "roles is deprecated. Use v1->roles instead."; + return $this->v1->roles; + } + + /** + * @deprecated Use v1->roles(\$sid) instead. + * @param string $sid The SID of the Role resource to fetch + */ + protected function contextRoles(string $sid): \Twilio\Rest\Conversations\V1\RoleContext { + echo "roles(\$sid) is deprecated. Use v1->roles(\$sid) instead."; + return $this->v1->roles($sid); + } + + /** + * @deprecated Use v1->services instead. + */ + protected function getServices(): \Twilio\Rest\Conversations\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid A 34 character string that uniquely identifies this + * resource. + */ + protected function contextServices(string $sid): \Twilio\Rest\Conversations\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } + + /** + * @deprecated Use v1->users instead. + */ + protected function getUsers(): \Twilio\Rest\Conversations\V1\UserList { + echo "users is deprecated. Use v1->users instead."; + return $this->v1->users; + } + + /** + * @deprecated Use v1->users(\$sid) instead. + * @param string $sid The SID of the User resource to fetch + */ + protected function contextUsers(string $sid): \Twilio\Rest\Conversations\V1\UserContext { + echo "users(\$sid) is deprecated. Use v1->users(\$sid) instead."; + return $this->v1->users($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Conversations/V1.php b/app/api/Twilio/Rest/Conversations/V1.php new file mode 100755 index 0000000..20534e4 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1.php @@ -0,0 +1,177 @@ +version = 'v1'; + } + + protected function getAddressConfigurations(): AddressConfigurationList + { + if (!$this->_addressConfigurations) { + $this->_addressConfigurations = new AddressConfigurationList($this); + } + return $this->_addressConfigurations; + } + + protected function getConfiguration(): ConfigurationList + { + if (!$this->_configuration) { + $this->_configuration = new ConfigurationList($this); + } + return $this->_configuration; + } + + protected function getConversations(): ConversationList + { + if (!$this->_conversations) { + $this->_conversations = new ConversationList($this); + } + return $this->_conversations; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getParticipantConversations(): ParticipantConversationList + { + if (!$this->_participantConversations) { + $this->_participantConversations = new ParticipantConversationList($this); + } + return $this->_participantConversations; + } + + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList($this); + } + return $this->_roles; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList($this); + } + return $this->_users; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationContext.php b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationContext.php new file mode 100755 index 0000000..55ae9e7 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationContext.php @@ -0,0 +1,140 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Configuration/Addresses/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AddressConfigurationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AddressConfigurationInstance + * + * @return AddressConfigurationInstance Fetched AddressConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddressConfigurationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AddressConfigurationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AddressConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return AddressConfigurationInstance Updated AddressConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AddressConfigurationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'AutoCreation.Enabled' => + Serialize::booleanToString($options['autoCreationEnabled']), + 'AutoCreation.Type' => + $options['autoCreationType'], + 'AutoCreation.ConversationServiceSid' => + $options['autoCreationConversationServiceSid'], + 'AutoCreation.WebhookUrl' => + $options['autoCreationWebhookUrl'], + 'AutoCreation.WebhookMethod' => + $options['autoCreationWebhookMethod'], + 'AutoCreation.WebhookFilters' => + Serialize::map($options['autoCreationWebhookFilters'], function ($e) { return $e; }), + 'AutoCreation.StudioFlowSid' => + $options['autoCreationStudioFlowSid'], + 'AutoCreation.StudioRetryCount' => + $options['autoCreationStudioRetryCount'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AddressConfigurationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.AddressConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationInstance.php b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationInstance.php new file mode 100755 index 0000000..cecc092 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'type' => Values::array_get($payload, 'type'), + 'address' => Values::array_get($payload, 'address'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'autoCreation' => Values::array_get($payload, 'auto_creation'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AddressConfigurationContext Context for this AddressConfigurationInstance + */ + protected function proxy(): AddressConfigurationContext + { + if (!$this->context) { + $this->context = new AddressConfigurationContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AddressConfigurationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AddressConfigurationInstance + * + * @return AddressConfigurationInstance Fetched AddressConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AddressConfigurationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AddressConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return AddressConfigurationInstance Updated AddressConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AddressConfigurationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.AddressConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationList.php b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationList.php new file mode 100755 index 0000000..5950dae --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationList.php @@ -0,0 +1,218 @@ +solution = [ + ]; + + $this->uri = '/Configuration/Addresses'; + } + + /** + * Create the AddressConfigurationInstance + * + * @param string $type + * @param string $address The unique address to be configured. The address can be a whatsapp address or phone number + * @param array|Options $options Optional Arguments + * @return AddressConfigurationInstance Created AddressConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, string $address, array $options = []): AddressConfigurationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'Address' => + $address, + 'FriendlyName' => + $options['friendlyName'], + 'AutoCreation.Enabled' => + Serialize::booleanToString($options['autoCreationEnabled']), + 'AutoCreation.Type' => + $options['autoCreationType'], + 'AutoCreation.ConversationServiceSid' => + $options['autoCreationConversationServiceSid'], + 'AutoCreation.WebhookUrl' => + $options['autoCreationWebhookUrl'], + 'AutoCreation.WebhookMethod' => + $options['autoCreationWebhookMethod'], + 'AutoCreation.WebhookFilters' => + Serialize::map($options['autoCreationWebhookFilters'], function ($e) { return $e; }), + 'AutoCreation.StudioFlowSid' => + $options['autoCreationStudioFlowSid'], + 'AutoCreation.StudioRetryCount' => + $options['autoCreationStudioRetryCount'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AddressConfigurationInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AddressConfigurationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AddressConfigurationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AddressConfigurationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AddressConfigurationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AddressConfigurationPage Page of AddressConfigurationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AddressConfigurationPage + { + $options = new Values($options); + + $params = Values::of([ + 'Type' => + $options['type'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AddressConfigurationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AddressConfigurationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AddressConfigurationPage Page of AddressConfigurationInstance + */ + public function getPage(string $targetUrl): AddressConfigurationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AddressConfigurationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AddressConfigurationContext + * + * @param string $sid The SID of the Address Configuration resource. This value can be either the `sid` or the `address` of the configuration + */ + public function getContext( + string $sid + + ): AddressConfigurationContext + { + return new AddressConfigurationContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.AddressConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationOptions.php b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationOptions.php new file mode 100755 index 0000000..3e51210 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationOptions.php @@ -0,0 +1,464 @@ +options['friendlyName'] = $friendlyName; + $this->options['autoCreationEnabled'] = $autoCreationEnabled; + $this->options['autoCreationType'] = $autoCreationType; + $this->options['autoCreationConversationServiceSid'] = $autoCreationConversationServiceSid; + $this->options['autoCreationWebhookUrl'] = $autoCreationWebhookUrl; + $this->options['autoCreationWebhookMethod'] = $autoCreationWebhookMethod; + $this->options['autoCreationWebhookFilters'] = $autoCreationWebhookFilters; + $this->options['autoCreationStudioFlowSid'] = $autoCreationStudioFlowSid; + $this->options['autoCreationStudioRetryCount'] = $autoCreationStudioRetryCount; + } + + /** + * The human-readable name of this configuration, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this configuration, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Enable/Disable auto-creating conversations for messages to this address + * + * @param bool $autoCreationEnabled Enable/Disable auto-creating conversations for messages to this address + * @return $this Fluent Builder + */ + public function setAutoCreationEnabled(bool $autoCreationEnabled): self + { + $this->options['autoCreationEnabled'] = $autoCreationEnabled; + return $this; + } + + /** + * @param string $autoCreationType + * @return $this Fluent Builder + */ + public function setAutoCreationType(string $autoCreationType): self + { + $this->options['autoCreationType'] = $autoCreationType; + return $this; + } + + /** + * Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + * + * @param string $autoCreationConversationServiceSid Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + * @return $this Fluent Builder + */ + public function setAutoCreationConversationServiceSid(string $autoCreationConversationServiceSid): self + { + $this->options['autoCreationConversationServiceSid'] = $autoCreationConversationServiceSid; + return $this; + } + + /** + * For type `webhook`, the url for the webhook request. + * + * @param string $autoCreationWebhookUrl For type `webhook`, the url for the webhook request. + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookUrl(string $autoCreationWebhookUrl): self + { + $this->options['autoCreationWebhookUrl'] = $autoCreationWebhookUrl; + return $this; + } + + /** + * @param string $autoCreationWebhookMethod + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookMethod(string $autoCreationWebhookMethod): self + { + $this->options['autoCreationWebhookMethod'] = $autoCreationWebhookMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + * + * @param string[] $autoCreationWebhookFilters The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookFilters(array $autoCreationWebhookFilters): self + { + $this->options['autoCreationWebhookFilters'] = $autoCreationWebhookFilters; + return $this; + } + + /** + * For type `studio`, the studio flow SID where the webhook should be sent to. + * + * @param string $autoCreationStudioFlowSid For type `studio`, the studio flow SID where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setAutoCreationStudioFlowSid(string $autoCreationStudioFlowSid): self + { + $this->options['autoCreationStudioFlowSid'] = $autoCreationStudioFlowSid; + return $this; + } + + /** + * For type `studio`, number of times to retry the webhook request + * + * @param int $autoCreationStudioRetryCount For type `studio`, number of times to retry the webhook request + * @return $this Fluent Builder + */ + public function setAutoCreationStudioRetryCount(int $autoCreationStudioRetryCount): self + { + $this->options['autoCreationStudioRetryCount'] = $autoCreationStudioRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateAddressConfigurationOptions ' . $options . ']'; + } +} + + + +class ReadAddressConfigurationOptions extends Options + { + /** + * @param string $type Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + */ + public function __construct( + + string $type = Values::NONE + + ) { + $this->options['type'] = $type; + } + + /** + * Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + * + * @param string $type Filter the address configurations by its type. This value can be one of: `whatsapp`, `sms`. + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadAddressConfigurationOptions ' . $options . ']'; + } +} + +class UpdateAddressConfigurationOptions extends Options + { + /** + * @param string $friendlyName The human-readable name of this configuration, limited to 256 characters. Optional. + * @param bool $autoCreationEnabled Enable/Disable auto-creating conversations for messages to this address + * @param string $autoCreationType + * @param string $autoCreationConversationServiceSid Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + * @param string $autoCreationWebhookUrl For type `webhook`, the url for the webhook request. + * @param string $autoCreationWebhookMethod + * @param string[] $autoCreationWebhookFilters The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + * @param string $autoCreationStudioFlowSid For type `studio`, the studio flow SID where the webhook should be sent to. + * @param int $autoCreationStudioRetryCount For type `studio`, number of times to retry the webhook request + */ + public function __construct( + + string $friendlyName = Values::NONE, + bool $autoCreationEnabled = Values::BOOL_NONE, + string $autoCreationType = Values::NONE, + string $autoCreationConversationServiceSid = Values::NONE, + string $autoCreationWebhookUrl = Values::NONE, + string $autoCreationWebhookMethod = Values::NONE, + array $autoCreationWebhookFilters = Values::ARRAY_NONE, + string $autoCreationStudioFlowSid = Values::NONE, + int $autoCreationStudioRetryCount = Values::INT_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['autoCreationEnabled'] = $autoCreationEnabled; + $this->options['autoCreationType'] = $autoCreationType; + $this->options['autoCreationConversationServiceSid'] = $autoCreationConversationServiceSid; + $this->options['autoCreationWebhookUrl'] = $autoCreationWebhookUrl; + $this->options['autoCreationWebhookMethod'] = $autoCreationWebhookMethod; + $this->options['autoCreationWebhookFilters'] = $autoCreationWebhookFilters; + $this->options['autoCreationStudioFlowSid'] = $autoCreationStudioFlowSid; + $this->options['autoCreationStudioRetryCount'] = $autoCreationStudioRetryCount; + } + + /** + * The human-readable name of this configuration, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this configuration, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Enable/Disable auto-creating conversations for messages to this address + * + * @param bool $autoCreationEnabled Enable/Disable auto-creating conversations for messages to this address + * @return $this Fluent Builder + */ + public function setAutoCreationEnabled(bool $autoCreationEnabled): self + { + $this->options['autoCreationEnabled'] = $autoCreationEnabled; + return $this; + } + + /** + * @param string $autoCreationType + * @return $this Fluent Builder + */ + public function setAutoCreationType(string $autoCreationType): self + { + $this->options['autoCreationType'] = $autoCreationType; + return $this; + } + + /** + * Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + * + * @param string $autoCreationConversationServiceSid Conversation Service for the auto-created conversation. If not set, the conversation is created in the default service. + * @return $this Fluent Builder + */ + public function setAutoCreationConversationServiceSid(string $autoCreationConversationServiceSid): self + { + $this->options['autoCreationConversationServiceSid'] = $autoCreationConversationServiceSid; + return $this; + } + + /** + * For type `webhook`, the url for the webhook request. + * + * @param string $autoCreationWebhookUrl For type `webhook`, the url for the webhook request. + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookUrl(string $autoCreationWebhookUrl): self + { + $this->options['autoCreationWebhookUrl'] = $autoCreationWebhookUrl; + return $this; + } + + /** + * @param string $autoCreationWebhookMethod + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookMethod(string $autoCreationWebhookMethod): self + { + $this->options['autoCreationWebhookMethod'] = $autoCreationWebhookMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + * + * @param string[] $autoCreationWebhookFilters The list of events, firing webhook event for this Conversation. Values can be any of the following: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationStateUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved`, `onDeliveryUpdated` + * @return $this Fluent Builder + */ + public function setAutoCreationWebhookFilters(array $autoCreationWebhookFilters): self + { + $this->options['autoCreationWebhookFilters'] = $autoCreationWebhookFilters; + return $this; + } + + /** + * For type `studio`, the studio flow SID where the webhook should be sent to. + * + * @param string $autoCreationStudioFlowSid For type `studio`, the studio flow SID where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setAutoCreationStudioFlowSid(string $autoCreationStudioFlowSid): self + { + $this->options['autoCreationStudioFlowSid'] = $autoCreationStudioFlowSid; + return $this; + } + + /** + * For type `studio`, number of times to retry the webhook request + * + * @param int $autoCreationStudioRetryCount For type `studio`, number of times to retry the webhook request + * @return $this Fluent Builder + */ + public function setAutoCreationStudioRetryCount(int $autoCreationStudioRetryCount): self + { + $this->options['autoCreationStudioRetryCount'] = $autoCreationStudioRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateAddressConfigurationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationPage.php b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationPage.php new file mode 100755 index 0000000..29e1a81 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/AddressConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AddressConfigurationInstance \Twilio\Rest\Conversations\V1\AddressConfigurationInstance + */ + public function buildInstance(array $payload): AddressConfigurationInstance + { + return new AddressConfigurationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.AddressConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookContext.php b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookContext.php new file mode 100755 index 0000000..fb24e4a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookContext.php @@ -0,0 +1,112 @@ +solution = [ + ]; + + $this->uri = '/Configuration/Webhooks'; + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Method' => + $options['method'], + 'Filters' => + Serialize::map($options['filters'], function ($e) { return $e; }), + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'Target' => + $options['target'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookInstance.php b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookInstance.php new file mode 100755 index 0000000..f25efc4 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookInstance.php @@ -0,0 +1,139 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'method' => Values::array_get($payload, 'method'), + 'filters' => Values::array_get($payload, 'filters'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'target' => Values::array_get($payload, 'target'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookList.php b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookList.php new file mode 100755 index 0000000..4c8fdbf --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a WebhookContext + */ + public function getContext( + + ): WebhookContext + { + return new WebhookContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookOptions.php b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookOptions.php new file mode 100755 index 0000000..0a3bfa7 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookOptions.php @@ -0,0 +1,148 @@ +options['method'] = $method; + $this->options['filters'] = $filters; + $this->options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['target'] = $target; + } + + /** + * The HTTP method to be used when sending a webhook request. + * + * @param string $method The HTTP method to be used when sending a webhook request. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved` + * + * @param string[] $filters The list of webhook event triggers that are enabled for this Service: `onMessageAdded`, `onMessageUpdated`, `onMessageRemoved`, `onConversationUpdated`, `onConversationRemoved`, `onParticipantAdded`, `onParticipantUpdated`, `onParticipantRemoved` + * @return $this Fluent Builder + */ + public function setFilters(array $filters): self + { + $this->options['filters'] = $filters; + return $this; + } + + /** + * The absolute url the pre-event webhook request should be sent to. + * + * @param string $preWebhookUrl The absolute url the pre-event webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * The absolute url the post-event webhook request should be sent to. + * + * @param string $postWebhookUrl The absolute url the post-event webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * @param string $target + * @return $this Fluent Builder + */ + public function setTarget(string $target): self + { + $this->options['target'] = $target; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookPage.php b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookPage.php new file mode 100755 index 0000000..475bd4f --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Configuration/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Conversations\V1\Configuration\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConfigurationContext.php b/app/api/Twilio/Rest/Conversations/V1/ConfigurationContext.php new file mode 100755 index 0000000..223c8c9 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConfigurationContext.php @@ -0,0 +1,109 @@ +solution = [ + ]; + + $this->uri = '/Configuration'; + } + + /** + * Fetch the ConfigurationInstance + * + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConfigurationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConfigurationInstance( + $this->version, + $payload + ); + } + + + /** + * Update the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Updated ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConfigurationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DefaultChatServiceSid' => + $options['defaultChatServiceSid'], + 'DefaultMessagingServiceSid' => + $options['defaultMessagingServiceSid'], + 'DefaultInactiveTimer' => + $options['defaultInactiveTimer'], + 'DefaultClosedTimer' => + $options['defaultClosedTimer'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConfigurationInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConfigurationInstance.php b/app/api/Twilio/Rest/Conversations/V1/ConfigurationInstance.php new file mode 100755 index 0000000..babdb1c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConfigurationInstance.php @@ -0,0 +1,139 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'defaultChatServiceSid' => Values::array_get($payload, 'default_chat_service_sid'), + 'defaultMessagingServiceSid' => Values::array_get($payload, 'default_messaging_service_sid'), + 'defaultInactiveTimer' => Values::array_get($payload, 'default_inactive_timer'), + 'defaultClosedTimer' => Values::array_get($payload, 'default_closed_timer'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConfigurationContext Context for this ConfigurationInstance + */ + protected function proxy(): ConfigurationContext + { + if (!$this->context) { + $this->context = new ConfigurationContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the ConfigurationInstance + * + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConfigurationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Updated ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConfigurationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ConfigurationList.php b/app/api/Twilio/Rest/Conversations/V1/ConfigurationList.php new file mode 100755 index 0000000..1be87e1 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConfigurationList.php @@ -0,0 +1,118 @@ +solution = [ + ]; + } + + /** + * Constructs a ConfigurationContext + */ + public function getContext( + + ): ConfigurationContext + { + return new ConfigurationContext( + $this->version + ); + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version + ); + } + return $this->_webhooks; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConfigurationOptions.php b/app/api/Twilio/Rest/Conversations/V1/ConfigurationOptions.php new file mode 100755 index 0000000..7b16265 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConfigurationOptions.php @@ -0,0 +1,132 @@ +options['defaultChatServiceSid'] = $defaultChatServiceSid; + $this->options['defaultMessagingServiceSid'] = $defaultMessagingServiceSid; + $this->options['defaultInactiveTimer'] = $defaultInactiveTimer; + $this->options['defaultClosedTimer'] = $defaultClosedTimer; + } + + /** + * The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + * + * @param string $defaultChatServiceSid The SID of the default [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource) to use when creating a conversation. + * @return $this Fluent Builder + */ + public function setDefaultChatServiceSid(string $defaultChatServiceSid): self + { + $this->options['defaultChatServiceSid'] = $defaultChatServiceSid; + return $this; + } + + /** + * The SID of the default [Messaging Service](https://www.twilio.com/docs/sms/services/api) to use when creating a conversation. + * + * @param string $defaultMessagingServiceSid The SID of the default [Messaging Service](https://www.twilio.com/docs/sms/services/api) to use when creating a conversation. + * @return $this Fluent Builder + */ + public function setDefaultMessagingServiceSid(string $defaultMessagingServiceSid): self + { + $this->options['defaultMessagingServiceSid'] = $defaultMessagingServiceSid; + return $this; + } + + /** + * Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * + * @param string $defaultInactiveTimer Default ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @return $this Fluent Builder + */ + public function setDefaultInactiveTimer(string $defaultInactiveTimer): self + { + $this->options['defaultInactiveTimer'] = $defaultInactiveTimer; + return $this; + } + + /** + * Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * + * @param string $defaultClosedTimer Default ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @return $this Fluent Builder + */ + public function setDefaultClosedTimer(string $defaultClosedTimer): self + { + $this->options['defaultClosedTimer'] = $defaultClosedTimer; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateConfigurationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ConfigurationPage.php b/app/api/Twilio/Rest/Conversations/V1/ConfigurationPage.php new file mode 100755 index 0000000..8a70af3 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConfigurationInstance \Twilio\Rest\Conversations\V1\ConfigurationInstance + */ + public function buildInstance(array $payload): ConfigurationInstance + { + return new ConfigurationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptContext.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptContext.php new file mode 100755 index 0000000..3943330 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptContext.php @@ -0,0 +1,93 @@ +solution = [ + 'conversationSid' => + $conversationSid, + 'messageSid' => + $messageSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Receipts/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DeliveryReceiptInstance + * + * @return DeliveryReceiptInstance Fetched DeliveryReceiptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeliveryReceiptInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeliveryReceiptInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.DeliveryReceiptContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptInstance.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptInstance.php new file mode 100755 index 0000000..f72d783 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'messageSid' => Values::array_get($payload, 'message_sid'), + 'channelMessageSid' => Values::array_get($payload, 'channel_message_sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'status' => Values::array_get($payload, 'status'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['conversationSid' => $conversationSid, 'messageSid' => $messageSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeliveryReceiptContext Context for this DeliveryReceiptInstance + */ + protected function proxy(): DeliveryReceiptContext + { + if (!$this->context) { + $this->context = new DeliveryReceiptContext( + $this->version, + $this->solution['conversationSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DeliveryReceiptInstance + * + * @return DeliveryReceiptInstance Fetched DeliveryReceiptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeliveryReceiptInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.DeliveryReceiptInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptList.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptList.php new file mode 100755 index 0000000..9bd7f2e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptList.php @@ -0,0 +1,175 @@ +solution = [ + 'conversationSid' => + $conversationSid, + + 'messageSid' => + $messageSid, + + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Receipts'; + } + + /** + * Reads DeliveryReceiptInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeliveryReceiptInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeliveryReceiptInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeliveryReceiptInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeliveryReceiptPage Page of DeliveryReceiptInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeliveryReceiptPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeliveryReceiptPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeliveryReceiptInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeliveryReceiptPage Page of DeliveryReceiptInstance + */ + public function getPage(string $targetUrl): DeliveryReceiptPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeliveryReceiptPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeliveryReceiptContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): DeliveryReceiptContext + { + return new DeliveryReceiptContext( + $this->version, + $this->solution['conversationSid'], + $this->solution['messageSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.DeliveryReceiptList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptPage.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptPage.php new file mode 100755 index 0000000..d79c53c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/Message/DeliveryReceiptPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeliveryReceiptInstance \Twilio\Rest\Conversations\V1\Conversation\Message\DeliveryReceiptInstance + */ + public function buildInstance(array $payload): DeliveryReceiptInstance + { + return new DeliveryReceiptInstance($this->version, $payload, $this->solution['conversationSid'], $this->solution['messageSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.DeliveryReceiptPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageContext.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageContext.php new file mode 100755 index 0000000..44b9073 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageContext.php @@ -0,0 +1,205 @@ +solution = [ + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Author' => + $options['author'], + 'Body' => + $options['body'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the deliveryReceipts + */ + protected function getDeliveryReceipts(): DeliveryReceiptList + { + if (!$this->_deliveryReceipts) { + $this->_deliveryReceipts = new DeliveryReceiptList( + $this->version, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->_deliveryReceipts; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageInstance.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageInstance.php new file mode 100755 index 0000000..a06cbf0 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageInstance.php @@ -0,0 +1,184 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'index' => Values::array_get($payload, 'index'), + 'author' => Values::array_get($payload, 'author'), + 'body' => Values::array_get($payload, 'body'), + 'media' => Values::array_get($payload, 'media'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'delivery' => Values::array_get($payload, 'delivery'), + 'links' => Values::array_get($payload, 'links'), + 'contentSid' => Values::array_get($payload, 'content_sid'), + ]; + + $this->solution = ['conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the deliveryReceipts + */ + protected function getDeliveryReceipts(): DeliveryReceiptList + { + return $this->proxy()->deliveryReceipts; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageList.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageList.php new file mode 100755 index 0000000..4a97f13 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageList.php @@ -0,0 +1,220 @@ +solution = [ + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Author' => + $options['author'], + 'Body' => + $options['body'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MediaSid' => + $options['mediaSid'], + 'ContentSid' => + $options['contentSid'], + 'ContentVariables' => + $options['contentVariables'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['conversationSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageOptions.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageOptions.php new file mode 100755 index 0000000..33fc515 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessageOptions.php @@ -0,0 +1,468 @@ +options['author'] = $author; + $this->options['body'] = $body; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['mediaSid'] = $mediaSid; + $this->options['contentSid'] = $contentSid; + $this->options['contentVariables'] = $contentVariables; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The channel specific identifier of the message's author. Defaults to `system`. + * + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @return $this Fluent Builder + */ + public function setAuthor(string $author): self + { + $this->options['author'] = $author; + return $this; + } + + /** + * The content of the message, can be up to 1,600 characters long. + * + * @param string $body The content of the message, can be up to 1,600 characters long. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. `null` if the message has not been edited. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The Media SID to be attached to the new Message. + * + * @param string $mediaSid The Media SID to be attached to the new Message. + * @return $this Fluent Builder + */ + public function setMediaSid(string $mediaSid): self + { + $this->options['mediaSid'] = $mediaSid; + return $this; + } + + /** + * The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content-api) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + * + * @param string $contentSid The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content-api) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + * @return $this Fluent Builder + */ + public function setContentSid(string $contentSid): self + { + $this->options['contentSid'] = $contentSid; + return $this; + } + + /** + * A structurally valid JSON string that contains values to resolve Rich Content template variables. + * + * @param string $contentVariables A structurally valid JSON string that contains values to resolve Rich Content template variables. + * @return $this Fluent Builder + */ + public function setContentVariables(string $contentVariables): self + { + $this->options['contentVariables'] = $contentVariables; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateMessageOptions ' . $options . ']'; + } +} + +class DeleteMessageOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteMessageOptions ' . $options . ']'; + } +} + + +class ReadMessageOptions extends Options + { + /** + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + * + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @param string $body The content of the message, can be up to 1,600 characters long. + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $author = Values::NONE, + string $body = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['author'] = $author; + $this->options['body'] = $body; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The channel specific identifier of the message's author. Defaults to `system`. + * + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @return $this Fluent Builder + */ + public function setAuthor(string $author): self + { + $this->options['author'] = $author; + return $this; + } + + /** + * The content of the message, can be up to 1,600 characters long. + * + * @param string $body The content of the message, can be up to 1,600 characters long. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. `null` if the message has not been edited. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/MessagePage.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessagePage.php new file mode 100755 index 0000000..54c2235 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\Conversations\V1\Conversation\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantContext.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantContext.php new file mode 100755 index 0000000..b1277f1 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantContext.php @@ -0,0 +1,154 @@ +solution = [ + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Participants/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + 'MessagingBinding.ProxyAddress' => + $options['messagingBindingProxyAddress'], + 'MessagingBinding.ProjectedAddress' => + $options['messagingBindingProjectedAddress'], + 'Identity' => + $options['identity'], + 'LastReadMessageIndex' => + $options['lastReadMessageIndex'], + 'LastReadTimestamp' => + $options['lastReadTimestamp'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantInstance.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantInstance.php new file mode 100755 index 0000000..e60698b --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'messagingBinding' => Values::array_get($payload, 'messaging_binding'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'lastReadMessageIndex' => Values::array_get($payload, 'last_read_message_index'), + 'lastReadTimestamp' => Values::array_get($payload, 'last_read_timestamp'), + ]; + + $this->solution = ['conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantList.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantList.php new file mode 100755 index 0000000..ebc55d8 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantList.php @@ -0,0 +1,214 @@ +solution = [ + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Participants'; + } + + /** + * Create the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Created ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $options['identity'], + 'MessagingBinding.Address' => + $options['messagingBindingAddress'], + 'MessagingBinding.ProxyAddress' => + $options['messagingBindingProxyAddress'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MessagingBinding.ProjectedAddress' => + $options['messagingBindingProjectedAddress'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['conversationSid'] + ); + } + + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantOptions.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantOptions.php new file mode 100755 index 0000000..5728a80 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantOptions.php @@ -0,0 +1,490 @@ +options['identity'] = $identity; + $this->options['messagingBindingAddress'] = $messagingBindingAddress; + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * + * @param string $messagingBindingAddress The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * @return $this Fluent Builder + */ + public function setMessagingBindingAddress(string $messagingBindingAddress): self + { + $this->options['messagingBindingAddress'] = $messagingBindingAddress; + return $this; + } + + /** + * The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * + * @param string $messagingBindingProxyAddress The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * @return $this Fluent Builder + */ + public function setMessagingBindingProxyAddress(string $messagingBindingProxyAddress): self + { + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + * + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + * @return $this Fluent Builder + */ + public function setMessagingBindingProjectedAddress(string $messagingBindingProjectedAddress): self + { + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + return $this; + } + + /** + * The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateParticipantOptions ' . $options . ']'; + } +} + +class DeleteParticipantOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteParticipantOptions ' . $options . ']'; + } +} + + + +class UpdateParticipantOptions extends Options + { + /** + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @param string $messagingBindingProxyAddress The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * @param int $lastReadMessageIndex Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @param string $lastReadTimestamp Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $roleSid = Values::NONE, + string $messagingBindingProxyAddress = Values::NONE, + string $messagingBindingProjectedAddress = Values::NONE, + string $identity = Values::NONE, + int $lastReadMessageIndex = Values::INT_NONE, + string $lastReadTimestamp = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + $this->options['identity'] = $identity; + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * + * @param string $messagingBindingProxyAddress The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * @return $this Fluent Builder + */ + public function setMessagingBindingProxyAddress(string $messagingBindingProxyAddress): self + { + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + return $this; + } + + /** + * The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * @return $this Fluent Builder + */ + public function setMessagingBindingProjectedAddress(string $messagingBindingProjectedAddress): self + { + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + return $this; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * + * @param int $lastReadMessageIndex Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @return $this Fluent Builder + */ + public function setLastReadMessageIndex(int $lastReadMessageIndex): self + { + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + return $this; + } + + /** + * Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * + * @param string $lastReadTimestamp Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @return $this Fluent Builder + */ + public function setLastReadTimestamp(string $lastReadTimestamp): self + { + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateParticipantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantPage.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantPage.php new file mode 100755 index 0000000..843ef14 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Conversations\V1\Conversation\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookContext.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookContext.php new file mode 100755 index 0000000..51078ad --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookContext.php @@ -0,0 +1,139 @@ +solution = [ + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookInstance.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookInstance.php new file mode 100755 index 0000000..6be9963 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'target' => Values::array_get($payload, 'target'), + 'url' => Values::array_get($payload, 'url'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookList.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookList.php new file mode 100755 index 0000000..261ce1d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookList.php @@ -0,0 +1,211 @@ +solution = [ + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Conversations/' . \rawurlencode($conversationSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $target + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $target, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Target' => + $target, + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.ReplayAfter' => + $options['configurationReplayAfter'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['conversationSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookOptions.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookOptions.php new file mode 100755 index 0000000..9a24d33 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookOptions.php @@ -0,0 +1,292 @@ +options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationReplayAfter'] = $configurationReplayAfter; + } + + /** + * The absolute url the webhook request should be sent to. + * + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. + * + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * The list of keywords, firing webhook event for this Conversation. + * + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The studio flow SID, where the webhook should be sent to. + * + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * The message index for which and it's successors the webhook will be replayed. Not set by default + * + * @param int $configurationReplayAfter The message index for which and it's successors the webhook will be replayed. Not set by default + * @return $this Fluent Builder + */ + public function setConfigurationReplayAfter(int $configurationReplayAfter): self + { + $this->options['configurationReplayAfter'] = $configurationReplayAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @param string $configurationMethod + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + */ + public function __construct( + + string $configurationUrl = Values::NONE, + string $configurationMethod = Values::NONE, + array $configurationFilters = Values::ARRAY_NONE, + array $configurationTriggers = Values::ARRAY_NONE, + string $configurationFlowSid = Values::NONE + + ) { + $this->options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + } + + /** + * The absolute url the webhook request should be sent to. + * + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. + * + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * The list of keywords, firing webhook event for this Conversation. + * + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The studio flow SID, where the webhook should be sent to. + * + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookPage.php b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookPage.php new file mode 100755 index 0000000..5c79106 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Conversation/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Conversations\V1\Conversation\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConversationContext.php b/app/api/Twilio/Rest/Conversations/V1/ConversationContext.php new file mode 100755 index 0000000..afced2c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConversationContext.php @@ -0,0 +1,243 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Conversations/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ConversationInstance + * + * @return ConversationInstance Fetched ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConversationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConversationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Updated ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'State' => + $options['state'], + 'Timers.Inactive' => + $options['timersInactive'], + 'Timers.Closed' => + $options['timersClosed'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ConversationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConversationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/ConversationInstance.php new file mode 100755 index 0000000..c4a4c1d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConversationInstance.php @@ -0,0 +1,200 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'state' => Values::array_get($payload, 'state'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'timers' => Values::array_get($payload, 'timers'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'bindings' => Values::array_get($payload, 'bindings'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConversationContext Context for this ConversationInstance + */ + protected function proxy(): ConversationContext + { + if (!$this->context) { + $this->context = new ConversationContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ConversationInstance + * + * @return ConversationInstance Fetched ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConversationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Updated ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConversationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConversationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ConversationList.php b/app/api/Twilio/Rest/Conversations/V1/ConversationList.php new file mode 100755 index 0000000..1e51d0e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConversationList.php @@ -0,0 +1,218 @@ +solution = [ + ]; + + $this->uri = '/Conversations'; + } + + /** + * Create the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Created ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'Attributes' => + $options['attributes'], + 'State' => + $options['state'], + 'Timers.Inactive' => + $options['timersInactive'], + 'Timers.Closed' => + $options['timersClosed'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ConversationInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConversationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConversationPage Page of ConversationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConversationPage + { + $options = new Values($options); + + $params = Values::of([ + 'StartDate' => + $options['startDate'], + 'EndDate' => + $options['endDate'], + 'State' => + $options['state'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConversationPage Page of ConversationInstance + */ + public function getPage(string $targetUrl): ConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConversationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConversationContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + */ + public function getContext( + string $sid + + ): ConversationContext + { + return new ConversationContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/ConversationOptions.php new file mode 100755 index 0000000..efe901d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConversationOptions.php @@ -0,0 +1,590 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['attributes'] = $attributes; + $this->options['state'] = $state; + $this->options['timersInactive'] = $timersInactive; + $this->options['timersClosed'] = $timersClosed; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The human-readable name of this conversation, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $state + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @return $this Fluent Builder + */ + public function setTimersInactive(string $timersInactive): self + { + $this->options['timersInactive'] = $timersInactive; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @return $this Fluent Builder + */ + public function setTimersClosed(string $timersClosed): self + { + $this->options['timersClosed'] = $timersClosed; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateConversationOptions ' . $options . ']'; + } +} + +class DeleteConversationOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteConversationOptions ' . $options . ']'; + } +} + + +class ReadConversationOptions extends Options + { + /** + * @param string $startDate Start date in ISO8601 format for sorting and filtering list of Conversations. + * @param string $endDate End date in ISO8601 format for sorting and filtering list of Conversations. + * @param string $state State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + */ + public function __construct( + + string $startDate = Values::NONE, + string $endDate = Values::NONE, + string $state = Values::NONE + + ) { + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['state'] = $state; + } + + /** + * Start date in ISO8601 format for sorting and filtering list of Conversations. + * + * @param string $startDate Start date in ISO8601 format for sorting and filtering list of Conversations. + * @return $this Fluent Builder + */ + public function setStartDate(string $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * End date in ISO8601 format for sorting and filtering list of Conversations. + * + * @param string $endDate End date in ISO8601 format for sorting and filtering list of Conversations. + * @return $this Fluent Builder + */ + public function setEndDate(string $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + * + * @param string $state State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadConversationOptions ' . $options . ']'; + } +} + +class UpdateConversationOptions extends Options + { + /** + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @param string $state + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $messagingServiceSid = Values::NONE, + string $state = Values::NONE, + string $timersInactive = Values::NONE, + string $timersClosed = Values::NONE, + string $uniqueName = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['state'] = $state; + $this->options['timersInactive'] = $timersInactive; + $this->options['timersClosed'] = $timersClosed; + $this->options['uniqueName'] = $uniqueName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The human-readable name of this conversation, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * @param string $state + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @return $this Fluent Builder + */ + public function setTimersInactive(string $timersInactive): self + { + $this->options['timersInactive'] = $timersInactive; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @return $this Fluent Builder + */ + public function setTimersClosed(string $timersClosed): self + { + $this->options['timersClosed'] = $timersClosed; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/ConversationPage.php new file mode 100755 index 0000000..66ac13d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConversationInstance \Twilio\Rest\Conversations\V1\ConversationInstance + */ + public function buildInstance(array $payload): ConversationInstance + { + return new ConversationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/CredentialContext.php b/app/api/Twilio/Rest/Conversations/V1/CredentialContext.php new file mode 100755 index 0000000..1895569 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/CredentialContext.php @@ -0,0 +1,136 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $options['type'], + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/CredentialInstance.php b/app/api/Twilio/Rest/Conversations/V1/CredentialInstance.php new file mode 100755 index 0000000..affca12 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/CredentialList.php b/app/api/Twilio/Rest/Conversations/V1/CredentialList.php new file mode 100755 index 0000000..82c9d46 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/CredentialOptions.php b/app/api/Twilio/Rest/Conversations/V1/CredentialOptions.php new file mode 100755 index 0000000..468124c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/CredentialOptions.php @@ -0,0 +1,330 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $type + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + */ + public function __construct( + + string $type = Values::NONE, + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['type'] = $type; + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + * + * @param string $certificate [APN only] The URL encoded representation of the certificate. For example, `-----BEGIN CERTIFICATE----- MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEF.....A== -----END CERTIFICATE-----`. + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + * + * @param string $privateKey [APN only] The URL encoded representation of the private key. For example, `-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fG... -----END RSA PRIVATE KEY-----`. + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * + * @param string $apiKey [GCM only] The API key for the project that was obtained from the Google Developer console for your GCM Service application credential. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The **Server key** of your project from the Firebase console, found under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/CredentialPage.php b/app/api/Twilio/Rest/Conversations/V1/CredentialPage.php new file mode 100755 index 0000000..f13db25 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Conversations\V1\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationInstance.php new file mode 100755 index 0000000..8e4aae4 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationInstance.php @@ -0,0 +1,111 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'participantUserSid' => Values::array_get($payload, 'participant_user_sid'), + 'participantIdentity' => Values::array_get($payload, 'participant_identity'), + 'participantMessagingBinding' => Values::array_get($payload, 'participant_messaging_binding'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'conversationUniqueName' => Values::array_get($payload, 'conversation_unique_name'), + 'conversationFriendlyName' => Values::array_get($payload, 'conversation_friendly_name'), + 'conversationAttributes' => Values::array_get($payload, 'conversation_attributes'), + 'conversationDateCreated' => Deserialize::dateTime(Values::array_get($payload, 'conversation_date_created')), + 'conversationDateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'conversation_date_updated')), + 'conversationCreatedBy' => Values::array_get($payload, 'conversation_created_by'), + 'conversationState' => Values::array_get($payload, 'conversation_state'), + 'conversationTimers' => Values::array_get($payload, 'conversation_timers'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationList.php b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationList.php new file mode 100755 index 0000000..23e42db --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationList.php @@ -0,0 +1,154 @@ +solution = [ + ]; + + $this->uri = '/ParticipantConversations'; + } + + /** + * Reads ParticipantConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantConversationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ParticipantConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantConversationPage Page of ParticipantConversationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantConversationPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + $options['identity'], + 'Address' => + $options['address'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantConversationPage Page of ParticipantConversationInstance + */ + public function getPage(string $targetUrl): ParticipantConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantConversationPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationOptions.php new file mode 100755 index 0000000..72820b0 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationOptions.php @@ -0,0 +1,94 @@ +options['identity'] = $identity; + $this->options['address'] = $address; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + * + * @param string $address A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + * @return $this Fluent Builder + */ + public function setAddress(string $address): self + { + $this->options['address'] = $address; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadParticipantConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationPage.php new file mode 100755 index 0000000..9eb96ee --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ParticipantConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantConversationInstance \Twilio\Rest\Conversations\V1\ParticipantConversationInstance + */ + public function buildInstance(array $payload): ParticipantConversationInstance + { + return new ParticipantConversationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/RoleContext.php b/app/api/Twilio/Rest/Conversations/V1/RoleContext.php new file mode 100755 index 0000000..138c542 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/RoleContext.php @@ -0,0 +1,121 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/RoleInstance.php b/app/api/Twilio/Rest/Conversations/V1/RoleInstance.php new file mode 100755 index 0000000..a6d81e6 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/RoleInstance.php @@ -0,0 +1,157 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/RoleList.php b/app/api/Twilio/Rest/Conversations/V1/RoleList.php new file mode 100755 index 0000000..24d4513 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/RoleList.php @@ -0,0 +1,193 @@ +solution = [ + ]; + + $this->uri = '/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @param string $type + * @param string[] $permission A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid The SID of the Role resource to delete. + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/RolePage.php b/app/api/Twilio/Rest/Conversations/V1/RolePage.php new file mode 100755 index 0000000..a77813f --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\Conversations\V1\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/BindingContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/BindingContext.php new file mode 100755 index 0000000..fbc3b23 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/BindingContext.php @@ -0,0 +1,100 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BindingInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.BindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/BindingInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/BindingInstance.php new file mode 100755 index 0000000..8e9a20d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/BindingInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'messageTypes' => Values::array_get($payload, 'message_types'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BindingContext Context for this BindingInstance + */ + protected function proxy(): BindingContext + { + if (!$this->context) { + $this->context = new BindingContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.BindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/BindingList.php b/app/api/Twilio/Rest/Conversations/V1/Service/BindingList.php new file mode 100755 index 0000000..3e85bc8 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/BindingList.php @@ -0,0 +1,178 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Bindings'; + } + + /** + * Reads BindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BindingPage Page of BindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'BindingType' => + $options['bindingType'], + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BindingPage Page of BindingInstance + */ + public function getPage(string $targetUrl): BindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BindingContext + * + * @param string $sid The SID of the Binding resource to delete. + */ + public function getContext( + string $sid + + ): BindingContext + { + return new BindingContext( + $this->version, + $this->solution['chatServiceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.BindingList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/BindingOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/BindingOptions.php new file mode 100755 index 0000000..ae88aa4 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/BindingOptions.php @@ -0,0 +1,98 @@ +options['bindingType'] = $bindingType; + $this->options['identity'] = $identity; + } + + /** + * The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * + * @param string $bindingType The push technology used by the Binding resources to read. Can be: `apn`, `gcm`, or `fcm`. See [push notification configuration](https://www.twilio.com/docs/chat/push-notification-configuration) for more info. + * @return $this Fluent Builder + */ + public function setBindingType(array $bindingType): self + { + $this->options['bindingType'] = $bindingType; + return $this; + } + + /** + * The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + * + * @param string[] $identity The identity of a [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource) this binding belongs to. See [access tokens](https://www.twilio.com/docs/conversations/create-tokens) for more details. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/BindingPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/BindingPage.php new file mode 100755 index 0000000..24193eb --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/BindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BindingInstance \Twilio\Rest\Conversations\V1\Service\BindingInstance + */ + public function buildInstance(array $payload): BindingInstance + { + return new BindingInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.BindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationContext.php new file mode 100755 index 0000000..941ce2a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationContext.php @@ -0,0 +1,135 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Configuration/Notifications'; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Update the NotificationInstance + * + * @param array|Options $options Optional Arguments + * @return NotificationInstance Updated NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): NotificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'LogEnabled' => + Serialize::booleanToString($options['logEnabled']), + 'NewMessage.Enabled' => + Serialize::booleanToString($options['newMessageEnabled']), + 'NewMessage.Template' => + $options['newMessageTemplate'], + 'NewMessage.Sound' => + $options['newMessageSound'], + 'NewMessage.BadgeCountEnabled' => + Serialize::booleanToString($options['newMessageBadgeCountEnabled']), + 'AddedToConversation.Enabled' => + Serialize::booleanToString($options['addedToConversationEnabled']), + 'AddedToConversation.Template' => + $options['addedToConversationTemplate'], + 'AddedToConversation.Sound' => + $options['addedToConversationSound'], + 'RemovedFromConversation.Enabled' => + Serialize::booleanToString($options['removedFromConversationEnabled']), + 'RemovedFromConversation.Template' => + $options['removedFromConversationTemplate'], + 'RemovedFromConversation.Sound' => + $options['removedFromConversationSound'], + 'NewMessage.WithMedia.Enabled' => + Serialize::booleanToString($options['newMessageWithMediaEnabled']), + 'NewMessage.WithMedia.Template' => + $options['newMessageWithMediaTemplate'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.NotificationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationInstance.php new file mode 100755 index 0000000..0467920 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationInstance.php @@ -0,0 +1,141 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'newMessage' => Values::array_get($payload, 'new_message'), + 'addedToConversation' => Values::array_get($payload, 'added_to_conversation'), + 'removedFromConversation' => Values::array_get($payload, 'removed_from_conversation'), + 'logEnabled' => Values::array_get($payload, 'log_enabled'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NotificationContext Context for this NotificationInstance + */ + protected function proxy(): NotificationContext + { + if (!$this->context) { + $this->context = new NotificationContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the NotificationInstance + * + * @return NotificationInstance Fetched NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NotificationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the NotificationInstance + * + * @param array|Options $options Optional Arguments + * @return NotificationInstance Updated NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): NotificationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.NotificationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationList.php new file mode 100755 index 0000000..00e9fcf --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationList.php @@ -0,0 +1,67 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + } + + /** + * Constructs a NotificationContext + */ + public function getContext( + + ): NotificationContext + { + return new NotificationContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.NotificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationOptions.php new file mode 100755 index 0000000..1d8ebb1 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationOptions.php @@ -0,0 +1,294 @@ +options['logEnabled'] = $logEnabled; + $this->options['newMessageEnabled'] = $newMessageEnabled; + $this->options['newMessageTemplate'] = $newMessageTemplate; + $this->options['newMessageSound'] = $newMessageSound; + $this->options['newMessageBadgeCountEnabled'] = $newMessageBadgeCountEnabled; + $this->options['addedToConversationEnabled'] = $addedToConversationEnabled; + $this->options['addedToConversationTemplate'] = $addedToConversationTemplate; + $this->options['addedToConversationSound'] = $addedToConversationSound; + $this->options['removedFromConversationEnabled'] = $removedFromConversationEnabled; + $this->options['removedFromConversationTemplate'] = $removedFromConversationTemplate; + $this->options['removedFromConversationSound'] = $removedFromConversationSound; + $this->options['newMessageWithMediaEnabled'] = $newMessageWithMediaEnabled; + $this->options['newMessageWithMediaTemplate'] = $newMessageWithMediaTemplate; + } + + /** + * Weather the notification logging is enabled. + * + * @param bool $logEnabled Weather the notification logging is enabled. + * @return $this Fluent Builder + */ + public function setLogEnabled(bool $logEnabled): self + { + $this->options['logEnabled'] = $logEnabled; + return $this; + } + + /** + * Whether to send a notification when a new message is added to a conversation. The default is `false`. + * + * @param bool $newMessageEnabled Whether to send a notification when a new message is added to a conversation. The default is `false`. + * @return $this Fluent Builder + */ + public function setNewMessageEnabled(bool $newMessageEnabled): self + { + $this->options['newMessageEnabled'] = $newMessageEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + * + * @param string $newMessageTemplate The template to use to create the notification text displayed when a new message is added to a conversation and `new_message.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNewMessageTemplate(string $newMessageTemplate): self + { + $this->options['newMessageTemplate'] = $newMessageTemplate; + return $this; + } + + /** + * The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + * + * @param string $newMessageSound The name of the sound to play when a new message is added to a conversation and `new_message.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNewMessageSound(string $newMessageSound): self + { + $this->options['newMessageSound'] = $newMessageSound; + return $this; + } + + /** + * Whether the new message badge is enabled. The default is `false`. + * + * @param bool $newMessageBadgeCountEnabled Whether the new message badge is enabled. The default is `false`. + * @return $this Fluent Builder + */ + public function setNewMessageBadgeCountEnabled(bool $newMessageBadgeCountEnabled): self + { + $this->options['newMessageBadgeCountEnabled'] = $newMessageBadgeCountEnabled; + return $this; + } + + /** + * Whether to send a notification when a participant is added to a conversation. The default is `false`. + * + * @param bool $addedToConversationEnabled Whether to send a notification when a participant is added to a conversation. The default is `false`. + * @return $this Fluent Builder + */ + public function setAddedToConversationEnabled(bool $addedToConversationEnabled): self + { + $this->options['addedToConversationEnabled'] = $addedToConversationEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + * + * @param string $addedToConversationTemplate The template to use to create the notification text displayed when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setAddedToConversationTemplate(string $addedToConversationTemplate): self + { + $this->options['addedToConversationTemplate'] = $addedToConversationTemplate; + return $this; + } + + /** + * The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + * + * @param string $addedToConversationSound The name of the sound to play when a participant is added to a conversation and `added_to_conversation.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setAddedToConversationSound(string $addedToConversationSound): self + { + $this->options['addedToConversationSound'] = $addedToConversationSound; + return $this; + } + + /** + * Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + * + * @param bool $removedFromConversationEnabled Whether to send a notification to a user when they are removed from a conversation. The default is `false`. + * @return $this Fluent Builder + */ + public function setRemovedFromConversationEnabled(bool $removedFromConversationEnabled): self + { + $this->options['removedFromConversationEnabled'] = $removedFromConversationEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + * + * @param string $removedFromConversationTemplate The template to use to create the notification text displayed to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setRemovedFromConversationTemplate(string $removedFromConversationTemplate): self + { + $this->options['removedFromConversationTemplate'] = $removedFromConversationTemplate; + return $this; + } + + /** + * The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + * + * @param string $removedFromConversationSound The name of the sound to play to a user when they are removed from a conversation and `removed_from_conversation.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setRemovedFromConversationSound(string $removedFromConversationSound): self + { + $this->options['removedFromConversationSound'] = $removedFromConversationSound; + return $this; + } + + /** + * Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + * + * @param bool $newMessageWithMediaEnabled Whether to send a notification when a new message with media/file attachments is added to a conversation. The default is `false`. + * @return $this Fluent Builder + */ + public function setNewMessageWithMediaEnabled(bool $newMessageWithMediaEnabled): self + { + $this->options['newMessageWithMediaEnabled'] = $newMessageWithMediaEnabled; + return $this; + } + + /** + * The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + * + * @param string $newMessageWithMediaTemplate The template to use to create the notification text displayed when a new message with media/file attachments is added to a conversation and `new_message.attachments.enabled` is `true`. + * @return $this Fluent Builder + */ + public function setNewMessageWithMediaTemplate(string $newMessageWithMediaTemplate): self + { + $this->options['newMessageWithMediaTemplate'] = $newMessageWithMediaTemplate; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateNotificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationPage.php new file mode 100755 index 0000000..031ac82 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/NotificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NotificationInstance \Twilio\Rest\Conversations\V1\Service\Configuration\NotificationInstance + */ + public function buildInstance(array $payload): NotificationInstance + { + return new NotificationInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.NotificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookContext.php new file mode 100755 index 0000000..e95bcf2 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookContext.php @@ -0,0 +1,117 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Configuration/Webhooks'; + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'Filters' => + Serialize::map($options['filters'], function ($e) { return $e; }), + 'Method' => + $options['method'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookInstance.php new file mode 100755 index 0000000..ed316bf --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookInstance.php @@ -0,0 +1,141 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'filters' => Values::array_get($payload, 'filters'), + 'method' => Values::array_get($payload, 'method'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookList.php new file mode 100755 index 0000000..8fb622a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookList.php @@ -0,0 +1,67 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + } + + /** + * Constructs a WebhookContext + */ + public function getContext( + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookOptions.php new file mode 100755 index 0000000..3933b3c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookOptions.php @@ -0,0 +1,132 @@ +options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['filters'] = $filters; + $this->options['method'] = $method; + } + + /** + * The absolute url the pre-event webhook request should be sent to. + * + * @param string $preWebhookUrl The absolute url the pre-event webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * The absolute url the post-event webhook request should be sent to. + * + * @param string $postWebhookUrl The absolute url the post-event webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + * + * @param string[] $filters The list of events that your configured webhook targets will receive. Events not configured here will not fire. Possible values are `onParticipantAdd`, `onParticipantAdded`, `onDeliveryUpdated`, `onConversationUpdated`, `onConversationRemove`, `onParticipantRemove`, `onConversationUpdate`, `onMessageAdd`, `onMessageRemoved`, `onParticipantUpdated`, `onConversationAdded`, `onMessageAdded`, `onConversationAdd`, `onConversationRemoved`, `onParticipantUpdate`, `onMessageRemove`, `onMessageUpdated`, `onParticipantRemoved`, `onMessageUpdate` or `onConversationStateUpdated`. + * @return $this Fluent Builder + */ + public function setFilters(array $filters): self + { + $this->options['filters'] = $filters; + return $this; + } + + /** + * The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + * + * @param string $method The HTTP method to be used when sending a webhook request. One of `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setMethod(string $method): self + { + $this->options['method'] = $method; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookPage.php new file mode 100755 index 0000000..6a60ce3 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Configuration/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Conversations\V1\Service\Configuration\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationContext.php new file mode 100755 index 0000000..171a35a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationContext.php @@ -0,0 +1,117 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Configuration'; + } + + /** + * Fetch the ConfigurationInstance + * + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConfigurationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConfigurationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Update the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Updated ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConfigurationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DefaultConversationCreatorRoleSid' => + $options['defaultConversationCreatorRoleSid'], + 'DefaultConversationRoleSid' => + $options['defaultConversationRoleSid'], + 'DefaultChatServiceRoleSid' => + $options['defaultChatServiceRoleSid'], + 'ReachabilityEnabled' => + Serialize::booleanToString($options['reachabilityEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConfigurationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationInstance.php new file mode 100755 index 0000000..e548d45 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationInstance.php @@ -0,0 +1,141 @@ +properties = [ + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'defaultConversationCreatorRoleSid' => Values::array_get($payload, 'default_conversation_creator_role_sid'), + 'defaultConversationRoleSid' => Values::array_get($payload, 'default_conversation_role_sid'), + 'defaultChatServiceRoleSid' => Values::array_get($payload, 'default_chat_service_role_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'reachabilityEnabled' => Values::array_get($payload, 'reachability_enabled'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConfigurationContext Context for this ConfigurationInstance + */ + protected function proxy(): ConfigurationContext + { + if (!$this->context) { + $this->context = new ConfigurationContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ConfigurationInstance + * + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConfigurationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Updated ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConfigurationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationList.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationList.php new file mode 100755 index 0000000..45063ca --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationList.php @@ -0,0 +1,143 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + } + + /** + * Constructs a ConfigurationContext + */ + public function getContext( + + ): ConfigurationContext + { + return new ConfigurationContext( + $this->version, + $this->solution['chatServiceSid'] + ); + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + if (!$this->_notifications) { + $this->_notifications = new NotificationList( + $this->version, + $this->solution['chatServiceSid'] + ); + } + return $this->_notifications; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['chatServiceSid'] + ); + } + return $this->_webhooks; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationOptions.php new file mode 100755 index 0000000..ef3986b --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationOptions.php @@ -0,0 +1,132 @@ +options['defaultConversationCreatorRoleSid'] = $defaultConversationCreatorRoleSid; + $this->options['defaultConversationRoleSid'] = $defaultConversationRoleSid; + $this->options['defaultChatServiceRoleSid'] = $defaultChatServiceRoleSid; + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + } + + /** + * The conversation-level role assigned to a conversation creator when they join a new conversation. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * + * @param string $defaultConversationCreatorRoleSid The conversation-level role assigned to a conversation creator when they join a new conversation. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultConversationCreatorRoleSid(string $defaultConversationCreatorRoleSid): self + { + $this->options['defaultConversationCreatorRoleSid'] = $defaultConversationCreatorRoleSid; + return $this; + } + + /** + * The conversation-level role assigned to users when they are added to a conversation. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * + * @param string $defaultConversationRoleSid The conversation-level role assigned to users when they are added to a conversation. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultConversationRoleSid(string $defaultConversationRoleSid): self + { + $this->options['defaultConversationRoleSid'] = $defaultConversationRoleSid; + return $this; + } + + /** + * The service-level role assigned to users when they are added to the service. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * + * @param string $defaultChatServiceRoleSid The service-level role assigned to users when they are added to the service. See the [Conversation Role](https://www.twilio.com/docs/conversations/api/role-resource) for more info about roles. + * @return $this Fluent Builder + */ + public function setDefaultChatServiceRoleSid(string $defaultChatServiceRoleSid): self + { + $this->options['defaultChatServiceRoleSid'] = $defaultChatServiceRoleSid; + return $this; + } + + /** + * Whether the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) is enabled for this Conversations Service. The default is `false`. + * + * @param bool $reachabilityEnabled Whether the [Reachability Indicator](https://www.twilio.com/docs/chat/reachability-indicator) is enabled for this Conversations Service. The default is `false`. + * @return $this Fluent Builder + */ + public function setReachabilityEnabled(bool $reachabilityEnabled): self + { + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateConfigurationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationPage.php new file mode 100755 index 0000000..bb7f2f0 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConfigurationInstance \Twilio\Rest\Conversations\V1\Service\ConfigurationInstance + */ + public function buildInstance(array $payload): ConfigurationInstance + { + return new ConfigurationInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptContext.php new file mode 100755 index 0000000..e647a35 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptContext.php @@ -0,0 +1,99 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'conversationSid' => + $conversationSid, + 'messageSid' => + $messageSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Receipts/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DeliveryReceiptInstance + * + * @return DeliveryReceiptInstance Fetched DeliveryReceiptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeliveryReceiptInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeliveryReceiptInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.DeliveryReceiptContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptInstance.php new file mode 100755 index 0000000..67c779b --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'messageSid' => Values::array_get($payload, 'message_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'channelMessageSid' => Values::array_get($payload, 'channel_message_sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'status' => Values::array_get($payload, 'status'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'conversationSid' => $conversationSid, 'messageSid' => $messageSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeliveryReceiptContext Context for this DeliveryReceiptInstance + */ + protected function proxy(): DeliveryReceiptContext + { + if (!$this->context) { + $this->context = new DeliveryReceiptContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['messageSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DeliveryReceiptInstance + * + * @return DeliveryReceiptInstance Fetched DeliveryReceiptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeliveryReceiptInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.DeliveryReceiptInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptList.php new file mode 100755 index 0000000..cfe20fc --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptList.php @@ -0,0 +1,182 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + 'conversationSid' => + $conversationSid, + + 'messageSid' => + $messageSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($messageSid) + .'/Receipts'; + } + + /** + * Reads DeliveryReceiptInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeliveryReceiptInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeliveryReceiptInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeliveryReceiptInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeliveryReceiptPage Page of DeliveryReceiptInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeliveryReceiptPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeliveryReceiptPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeliveryReceiptInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeliveryReceiptPage Page of DeliveryReceiptInstance + */ + public function getPage(string $targetUrl): DeliveryReceiptPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeliveryReceiptPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeliveryReceiptContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): DeliveryReceiptContext + { + return new DeliveryReceiptContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['messageSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.DeliveryReceiptList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptPage.php new file mode 100755 index 0000000..de25204 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/Message/DeliveryReceiptPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeliveryReceiptInstance \Twilio\Rest\Conversations\V1\Service\Conversation\Message\DeliveryReceiptInstance + */ + public function buildInstance(array $payload): DeliveryReceiptInstance + { + return new DeliveryReceiptInstance($this->version, $payload, $this->solution['chatServiceSid'], $this->solution['conversationSid'], $this->solution['messageSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.DeliveryReceiptPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageContext.php new file mode 100755 index 0000000..d416ff9 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageContext.php @@ -0,0 +1,213 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Author' => + $options['author'], + 'Body' => + $options['body'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the deliveryReceipts + */ + protected function getDeliveryReceipts(): DeliveryReceiptList + { + if (!$this->_deliveryReceipts) { + $this->_deliveryReceipts = new DeliveryReceiptList( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->_deliveryReceipts; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageInstance.php new file mode 100755 index 0000000..650110e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageInstance.php @@ -0,0 +1,188 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'index' => Values::array_get($payload, 'index'), + 'author' => Values::array_get($payload, 'author'), + 'body' => Values::array_get($payload, 'body'), + 'media' => Values::array_get($payload, 'media'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'delivery' => Values::array_get($payload, 'delivery'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'contentSid' => Values::array_get($payload, 'content_sid'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the deliveryReceipts + */ + protected function getDeliveryReceipts(): DeliveryReceiptList + { + return $this->proxy()->deliveryReceipts; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageList.php new file mode 100755 index 0000000..df2e9c5 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageList.php @@ -0,0 +1,228 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Author' => + $options['author'], + 'Body' => + $options['body'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MediaSid' => + $options['mediaSid'], + 'ContentSid' => + $options['contentSid'], + 'ContentVariables' => + $options['contentVariables'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageOptions.php new file mode 100755 index 0000000..6e12a1e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessageOptions.php @@ -0,0 +1,468 @@ +options['author'] = $author; + $this->options['body'] = $body; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['mediaSid'] = $mediaSid; + $this->options['contentSid'] = $contentSid; + $this->options['contentVariables'] = $contentVariables; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The channel specific identifier of the message's author. Defaults to `system`. + * + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @return $this Fluent Builder + */ + public function setAuthor(string $author): self + { + $this->options['author'] = $author; + return $this; + } + + /** + * The content of the message, can be up to 1,600 characters long. + * + * @param string $body The content of the message, can be up to 1,600 characters long. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. `null` if the message has not been edited. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The Media SID to be attached to the new Message. + * + * @param string $mediaSid The Media SID to be attached to the new Message. + * @return $this Fluent Builder + */ + public function setMediaSid(string $mediaSid): self + { + $this->options['mediaSid'] = $mediaSid; + return $this; + } + + /** + * The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content-api) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + * + * @param string $contentSid The unique ID of the multi-channel [Rich Content](https://www.twilio.com/docs/content-api) template, required for template-generated messages. **Note** that if this field is set, `Body` and `MediaSid` parameters are ignored. + * @return $this Fluent Builder + */ + public function setContentSid(string $contentSid): self + { + $this->options['contentSid'] = $contentSid; + return $this; + } + + /** + * A structurally valid JSON string that contains values to resolve Rich Content template variables. + * + * @param string $contentVariables A structurally valid JSON string that contains values to resolve Rich Content template variables. + * @return $this Fluent Builder + */ + public function setContentVariables(string $contentVariables): self + { + $this->options['contentVariables'] = $contentVariables; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateMessageOptions ' . $options . ']'; + } +} + +class DeleteMessageOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteMessageOptions ' . $options . ']'; + } +} + + +class ReadMessageOptions extends Options + { + /** + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + * + * @param string $order The sort order of the returned messages. Can be: `asc` (ascending) or `desc` (descending), with `asc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @param string $body The content of the message, can be up to 1,600 characters long. + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $author = Values::NONE, + string $body = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['author'] = $author; + $this->options['body'] = $body; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The channel specific identifier of the message's author. Defaults to `system`. + * + * @param string $author The channel specific identifier of the message's author. Defaults to `system`. + * @return $this Fluent Builder + */ + public function setAuthor(string $author): self + { + $this->options['author'] = $author; + return $this; + } + + /** + * The content of the message, can be up to 1,600 characters long. + * + * @param string $body The content of the message, can be up to 1,600 characters long. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. `null` if the message has not been edited. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. `null` if the message has not been edited. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes A string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessagePage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessagePage.php new file mode 100755 index 0000000..d123fc0 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\Conversations\V1\Service\Conversation\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['chatServiceSid'], $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantContext.php new file mode 100755 index 0000000..16abb8c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantContext.php @@ -0,0 +1,161 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Participants/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Identity' => + $options['identity'], + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + 'MessagingBinding.ProxyAddress' => + $options['messagingBindingProxyAddress'], + 'MessagingBinding.ProjectedAddress' => + $options['messagingBindingProjectedAddress'], + 'LastReadMessageIndex' => + $options['lastReadMessageIndex'], + 'LastReadTimestamp' => + $options['lastReadTimestamp'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantInstance.php new file mode 100755 index 0000000..2286f6e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'messagingBinding' => Values::array_get($payload, 'messaging_binding'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'lastReadMessageIndex' => Values::array_get($payload, 'last_read_message_index'), + 'lastReadTimestamp' => Values::array_get($payload, 'last_read_timestamp'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantList.php new file mode 100755 index 0000000..88e221c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantList.php @@ -0,0 +1,222 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Participants'; + } + + /** + * Create the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Created ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $options['identity'], + 'MessagingBinding.Address' => + $options['messagingBindingAddress'], + 'MessagingBinding.ProxyAddress' => + $options['messagingBindingProxyAddress'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MessagingBinding.ProjectedAddress' => + $options['messagingBindingProjectedAddress'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantOptions.php new file mode 100755 index 0000000..9c77a27 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantOptions.php @@ -0,0 +1,490 @@ +options['identity'] = $identity; + $this->options['messagingBindingAddress'] = $messagingBindingAddress; + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversation SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversation SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * + * @param string $messagingBindingAddress The address of the participant's device, e.g. a phone or WhatsApp number. Together with the Proxy address, this determines a participant uniquely. This field (with proxy_address) is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * @return $this Fluent Builder + */ + public function setMessagingBindingAddress(string $messagingBindingAddress): self + { + $this->options['messagingBindingAddress'] = $messagingBindingAddress; + return $this; + } + + /** + * The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * + * @param string $messagingBindingProxyAddress The address of the Twilio phone number (or WhatsApp number) that the participant is in contact with. This field, together with participant address, is only null when the participant is interacting from an SDK endpoint (see the 'identity' field). + * @return $this Fluent Builder + */ + public function setMessagingBindingProxyAddress(string $messagingBindingProxyAddress): self + { + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + * + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. Communication mask for the Conversation participant with Identity. + * @return $this Fluent Builder + */ + public function setMessagingBindingProjectedAddress(string $messagingBindingProjectedAddress): self + { + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + return $this; + } + + /** + * The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateParticipantOptions ' . $options . ']'; + } +} + +class DeleteParticipantOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteParticipantOptions ' . $options . ']'; + } +} + + + +class UpdateParticipantOptions extends Options + { + /** + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversation SDK to communicate. Limited to 256 characters. + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @param string $messagingBindingProxyAddress The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * @param int $lastReadMessageIndex Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @param string $lastReadTimestamp Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $identity = Values::NONE, + string $attributes = Values::NONE, + string $roleSid = Values::NONE, + string $messagingBindingProxyAddress = Values::NONE, + string $messagingBindingProjectedAddress = Values::NONE, + int $lastReadMessageIndex = Values::INT_NONE, + string $lastReadTimestamp = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['identity'] = $identity; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversation SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversation SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * + * @param string $roleSid The SID of a conversation-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the participant. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * + * @param string $messagingBindingProxyAddress The address of the Twilio phone number that the participant is in contact with. 'null' value will remove it. + * @return $this Fluent Builder + */ + public function setMessagingBindingProxyAddress(string $messagingBindingProxyAddress): self + { + $this->options['messagingBindingProxyAddress'] = $messagingBindingProxyAddress; + return $this; + } + + /** + * The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * + * @param string $messagingBindingProjectedAddress The address of the Twilio phone number that is used in Group MMS. 'null' value will remove it. + * @return $this Fluent Builder + */ + public function setMessagingBindingProjectedAddress(string $messagingBindingProjectedAddress): self + { + $this->options['messagingBindingProjectedAddress'] = $messagingBindingProjectedAddress; + return $this; + } + + /** + * Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * + * @param int $lastReadMessageIndex Index of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @return $this Fluent Builder + */ + public function setLastReadMessageIndex(int $lastReadMessageIndex): self + { + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + return $this; + } + + /** + * Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * + * @param string $lastReadTimestamp Timestamp of last “read” message in the [Conversation](https://www.twilio.com/docs/conversations/api/conversation-resource) for the Participant. + * @return $this Fluent Builder + */ + public function setLastReadTimestamp(string $lastReadTimestamp): self + { + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateParticipantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantPage.php new file mode 100755 index 0000000..c180e50 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Conversations\V1\Service\Conversation\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['chatServiceSid'], $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookContext.php new file mode 100755 index 0000000..c0b9c8f --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookContext.php @@ -0,0 +1,146 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'conversationSid' => + $conversationSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookInstance.php new file mode 100755 index 0000000..137306e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'target' => Values::array_get($payload, 'target'), + 'url' => Values::array_get($payload, 'url'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'conversationSid' => $conversationSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookList.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookList.php new file mode 100755 index 0000000..004f642 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookList.php @@ -0,0 +1,219 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + 'conversationSid' => + $conversationSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $target + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $target, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Target' => + $target, + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.ReplayAfter' => + $options['configurationReplayAfter'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['conversationSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookOptions.php new file mode 100755 index 0000000..26305af --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookOptions.php @@ -0,0 +1,292 @@ +options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationReplayAfter'] = $configurationReplayAfter; + } + + /** + * The absolute url the webhook request should be sent to. + * + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. + * + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * The list of keywords, firing webhook event for this Conversation. + * + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The studio flow SID, where the webhook should be sent to. + * + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * The message index for which and it's successors the webhook will be replayed. Not set by default + * + * @param int $configurationReplayAfter The message index for which and it's successors the webhook will be replayed. Not set by default + * @return $this Fluent Builder + */ + public function setConfigurationReplayAfter(int $configurationReplayAfter): self + { + $this->options['configurationReplayAfter'] = $configurationReplayAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @param string $configurationMethod + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + */ + public function __construct( + + string $configurationUrl = Values::NONE, + string $configurationMethod = Values::NONE, + array $configurationFilters = Values::ARRAY_NONE, + array $configurationTriggers = Values::ARRAY_NONE, + string $configurationFlowSid = Values::NONE + + ) { + $this->options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + } + + /** + * The absolute url the webhook request should be sent to. + * + * @param string $configurationUrl The absolute url the webhook request should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * The list of events, firing webhook event for this Conversation. + * + * @param string[] $configurationFilters The list of events, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * The list of keywords, firing webhook event for this Conversation. + * + * @param string[] $configurationTriggers The list of keywords, firing webhook event for this Conversation. + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * The studio flow SID, where the webhook should be sent to. + * + * @param string $configurationFlowSid The studio flow SID, where the webhook should be sent to. + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookPage.php new file mode 100755 index 0000000..c03be0a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/Conversation/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Conversations\V1\Service\Conversation\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['chatServiceSid'], $this->solution['conversationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConversationContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationContext.php new file mode 100755 index 0000000..e60c4b1 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationContext.php @@ -0,0 +1,253 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ConversationInstance + * + * @return ConversationInstance Fetched ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConversationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConversationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Updated ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'State' => + $options['state'], + 'Timers.Inactive' => + $options['timersInactive'], + 'Timers.Closed' => + $options['timersClosed'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ConversationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConversationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationInstance.php new file mode 100755 index 0000000..3c2a980 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationInstance.php @@ -0,0 +1,202 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'state' => Values::array_get($payload, 'state'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'timers' => Values::array_get($payload, 'timers'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'bindings' => Values::array_get($payload, 'bindings'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConversationContext Context for this ConversationInstance + */ + protected function proxy(): ConversationContext + { + if (!$this->context) { + $this->context = new ConversationContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ConversationInstance + * + * @return ConversationInstance Fetched ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConversationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Updated ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConversationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ConversationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConversationList.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationList.php new file mode 100755 index 0000000..eba357a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationList.php @@ -0,0 +1,226 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Conversations'; + } + + /** + * Create the ConversationInstance + * + * @param array|Options $options Optional Arguments + * @return ConversationInstance Created ConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'State' => + $options['state'], + 'Timers.Inactive' => + $options['timersInactive'], + 'Timers.Closed' => + $options['timersClosed'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ConversationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Reads ConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConversationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConversationPage Page of ConversationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConversationPage + { + $options = new Values($options); + + $params = Values::of([ + 'StartDate' => + $options['startDate'], + 'EndDate' => + $options['endDate'], + 'State' => + $options['state'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConversationPage Page of ConversationInstance + */ + public function getPage(string $targetUrl): ConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConversationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConversationContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. Can also be the `unique_name` of the Conversation. + */ + public function getContext( + string $sid + + ): ConversationContext + { + return new ConversationContext( + $this->version, + $this->solution['chatServiceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationOptions.php new file mode 100755 index 0000000..8c47fe5 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationOptions.php @@ -0,0 +1,590 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['state'] = $state; + $this->options['timersInactive'] = $timersInactive; + $this->options['timersClosed'] = $timersClosed; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The human-readable name of this conversation, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * @param string $state + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @return $this Fluent Builder + */ + public function setTimersInactive(string $timersInactive): self + { + $this->options['timersInactive'] = $timersInactive; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @return $this Fluent Builder + */ + public function setTimersClosed(string $timersClosed): self + { + $this->options['timersClosed'] = $timersClosed; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateConversationOptions ' . $options . ']'; + } +} + +class DeleteConversationOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteConversationOptions ' . $options . ']'; + } +} + + +class ReadConversationOptions extends Options + { + /** + * @param string $startDate Start date in ISO8601 format for sorting and filtering list of Conversations. + * @param string $endDate End date in ISO8601 format for sorting and filtering list of Conversations. + * @param string $state State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + */ + public function __construct( + + string $startDate = Values::NONE, + string $endDate = Values::NONE, + string $state = Values::NONE + + ) { + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['state'] = $state; + } + + /** + * Start date in ISO8601 format for sorting and filtering list of Conversations. + * + * @param string $startDate Start date in ISO8601 format for sorting and filtering list of Conversations. + * @return $this Fluent Builder + */ + public function setStartDate(string $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * End date in ISO8601 format for sorting and filtering list of Conversations. + * + * @param string $endDate End date in ISO8601 format for sorting and filtering list of Conversations. + * @return $this Fluent Builder + */ + public function setEndDate(string $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + * + * @param string $state State for sorting and filtering list of Conversations. Can be `active`, `inactive` or `closed` + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadConversationOptions ' . $options . ']'; + } +} + +class UpdateConversationOptions extends Options + { + /** + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @param \DateTime $dateCreated The date that this resource was created. + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @param string $state + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $messagingServiceSid = Values::NONE, + string $state = Values::NONE, + string $timersInactive = Values::NONE, + string $timersClosed = Values::NONE, + string $uniqueName = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['state'] = $state; + $this->options['timersInactive'] = $timersInactive; + $this->options['timersClosed'] = $timersClosed; + $this->options['uniqueName'] = $uniqueName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The human-readable name of this conversation, limited to 256 characters. Optional. + * + * @param string $friendlyName The human-readable name of this conversation, limited to 256 characters. Optional. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The date that this resource was created. + * + * @param \DateTime $dateCreated The date that this resource was created. + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * The date that this resource was last updated. + * + * @param \DateTime $dateUpdated The date that this resource was last updated. + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * + * @param string $attributes An optional string metadata field you can use to store any data you wish. The string value must contain structurally valid JSON if specified. **Note** that if the attributes are not set \\\"{}\\\" will be returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * + * @param string $messagingServiceSid The unique ID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) this conversation belongs to. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * @param string $state + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * + * @param string $timersInactive ISO8601 duration when conversation will be switched to `inactive` state. Minimum value for this timer is 1 minute. + * @return $this Fluent Builder + */ + public function setTimersInactive(string $timersInactive): self + { + $this->options['timersInactive'] = $timersInactive; + return $this; + } + + /** + * ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * + * @param string $timersClosed ISO8601 duration when conversation will be switched to `closed` state. Minimum value for this timer is 10 minutes. + * @return $this Fluent Builder + */ + public function setTimersClosed(string $timersClosed): self + { + $this->options['timersClosed'] = $timersClosed; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used to address the resource in place of the resource's `sid` in the URL. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationPage.php new file mode 100755 index 0000000..f8bf706 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConversationInstance \Twilio\Rest\Conversations\V1\Service\ConversationInstance + */ + public function buildInstance(array $payload): ConversationInstance + { + return new ConversationInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationInstance.php new file mode 100755 index 0000000..ec9a825 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationInstance.php @@ -0,0 +1,112 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'participantUserSid' => Values::array_get($payload, 'participant_user_sid'), + 'participantIdentity' => Values::array_get($payload, 'participant_identity'), + 'participantMessagingBinding' => Values::array_get($payload, 'participant_messaging_binding'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'conversationUniqueName' => Values::array_get($payload, 'conversation_unique_name'), + 'conversationFriendlyName' => Values::array_get($payload, 'conversation_friendly_name'), + 'conversationAttributes' => Values::array_get($payload, 'conversation_attributes'), + 'conversationDateCreated' => Deserialize::dateTime(Values::array_get($payload, 'conversation_date_created')), + 'conversationDateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'conversation_date_updated')), + 'conversationCreatedBy' => Values::array_get($payload, 'conversation_created_by'), + 'conversationState' => Values::array_get($payload, 'conversation_state'), + 'conversationTimers' => Values::array_get($payload, 'conversation_timers'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationList.php b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationList.php new file mode 100755 index 0000000..ec507bb --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationList.php @@ -0,0 +1,160 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/ParticipantConversations'; + } + + /** + * Reads ParticipantConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantConversationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ParticipantConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantConversationPage Page of ParticipantConversationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantConversationPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + $options['identity'], + 'Address' => + $options['address'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantConversationPage Page of ParticipantConversationInstance + */ + public function getPage(string $targetUrl): ParticipantConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantConversationPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationOptions.php new file mode 100755 index 0000000..63cf694 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationOptions.php @@ -0,0 +1,94 @@ +options['identity'] = $identity; + $this->options['address'] = $address; + } + + /** + * A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * + * @param string $identity A unique string identifier for the conversation participant as [Conversation User](https://www.twilio.com/docs/conversations/api/user-resource). This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. Limited to 256 characters. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + * + * @param string $address A unique string identifier for the conversation participant who's not a Conversation User. This parameter could be found in messaging_binding.address field of Participant resource. It should be url-encoded. + * @return $this Fluent Builder + */ + public function setAddress(string $address): self + { + $this->options['address'] = $address; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.ReadParticipantConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationPage.php new file mode 100755 index 0000000..c6f5103 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/ParticipantConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantConversationInstance \Twilio\Rest\Conversations\V1\Service\ParticipantConversationInstance + */ + public function buildInstance(array $payload): ParticipantConversationInstance + { + return new ParticipantConversationInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ParticipantConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/RoleContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/RoleContext.php new file mode 100755 index 0000000..9cf0eee --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/RoleContext.php @@ -0,0 +1,128 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/RoleInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/RoleInstance.php new file mode 100755 index 0000000..80f1a87 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/RoleInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission A permission that you grant to the role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. Note that the update action replaces all previously assigned permissions with those defined in the update action. To remove a permission, do not include it in the subsequent update action. The values for this parameter depend on the role's `type`. + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/RoleList.php b/app/api/Twilio/Rest/Conversations/V1/Service/RoleList.php new file mode 100755 index 0000000..0d8ff00 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/RoleList.php @@ -0,0 +1,201 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new resource. It can be up to 64 characters long. + * @param string $type + * @param string[] $permission A permission that you grant to the new role. Only one permission can be granted per parameter. To assign more than one permission, repeat this parameter for each permission value. The values for this parameter depend on the role's `type`. + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid The SID of the Role resource to delete. + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $this->solution['chatServiceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/RolePage.php b/app/api/Twilio/Rest/Conversations/V1/Service/RolePage.php new file mode 100755 index 0000000..74a0040 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\Conversations\V1\Service\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationContext.php new file mode 100755 index 0000000..0ec5339 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationContext.php @@ -0,0 +1,142 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'userSid' => + $userSid, + 'conversationSid' => + $conversationSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .''; + } + + /** + * Delete the UserConversationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserConversationInstance + * + * @return UserConversationInstance Fetched UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserConversationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserConversationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Update the UserConversationInstance + * + * @param array|Options $options Optional Arguments + * @return UserConversationInstance Updated UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'NotificationLevel' => + $options['notificationLevel'], + 'LastReadTimestamp' => + Serialize::iso8601DateTime($options['lastReadTimestamp']), + 'LastReadMessageIndex' => + $options['lastReadMessageIndex'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserConversationInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserConversationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationInstance.php new file mode 100755 index 0000000..07dcc45 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationInstance.php @@ -0,0 +1,180 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'lastReadMessageIndex' => Values::array_get($payload, 'last_read_message_index'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'conversationState' => Values::array_get($payload, 'conversation_state'), + 'timers' => Values::array_get($payload, 'timers'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'notificationLevel' => Values::array_get($payload, 'notification_level'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'userSid' => $userSid, 'conversationSid' => $conversationSid ?: $this->properties['conversationSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserConversationContext Context for this UserConversationInstance + */ + protected function proxy(): UserConversationContext + { + if (!$this->context) { + $this->context = new UserConversationContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserConversationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserConversationInstance + * + * @return UserConversationInstance Fetched UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserConversationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserConversationInstance + * + * @param array|Options $options Optional Arguments + * @return UserConversationInstance Updated UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserConversationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserConversationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationList.php b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationList.php new file mode 100755 index 0000000..2c0373c --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationList.php @@ -0,0 +1,175 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Conversations'; + } + + /** + * Reads UserConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserConversationInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserConversationPage Page of UserConversationInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserConversationPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserConversationPage Page of UserConversationInstance + */ + public function getPage(string $targetUrl): UserConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserConversationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserConversationContext + * + * @param string $conversationSid The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + */ + public function getContext( + string $conversationSid + + ): UserConversationContext + { + return new UserConversationContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['userSid'], + $conversationSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationOptions.php new file mode 100755 index 0000000..e0c1728 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationOptions.php @@ -0,0 +1,116 @@ +options['notificationLevel'] = $notificationLevel; + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + } + + /** + * @param string $notificationLevel + * @return $this Fluent Builder + */ + public function setNotificationLevel(string $notificationLevel): self + { + $this->options['notificationLevel'] = $notificationLevel; + return $this; + } + + /** + * The date of the last message read in conversation by the user, given in ISO 8601 format. + * + * @param \DateTime $lastReadTimestamp The date of the last message read in conversation by the user, given in ISO 8601 format. + * @return $this Fluent Builder + */ + public function setLastReadTimestamp(\DateTime $lastReadTimestamp): self + { + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + return $this; + } + + /** + * The index of the last Message in the Conversation that the Participant has read. + * + * @param int $lastReadMessageIndex The index of the last Message in the Conversation that the Participant has read. + * @return $this Fluent Builder + */ + public function setLastReadMessageIndex(int $lastReadMessageIndex): self + { + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateUserConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationPage.php new file mode 100755 index 0000000..4622748 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/User/UserConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserConversationInstance \Twilio\Rest\Conversations\V1\Service\User\UserConversationInstance + */ + public function buildInstance(array $payload): UserConversationInstance + { + return new UserConversationInstance($this->version, $payload, $this->solution['chatServiceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/UserContext.php b/app/api/Twilio/Rest/Conversations/V1/Service/UserContext.php new file mode 100755 index 0000000..4ab011b --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/UserContext.php @@ -0,0 +1,200 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the userConversations + */ + protected function getUserConversations(): UserConversationList + { + if (!$this->_userConversations) { + $this->_userConversations = new UserConversationList( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->_userConversations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/UserInstance.php b/app/api/Twilio/Rest/Conversations/V1/Service/UserInstance.php new file mode 100755 index 0000000..6796c65 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/UserInstance.php @@ -0,0 +1,180 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['chatServiceSid' => $chatServiceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['chatServiceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userConversations + */ + protected function getUserConversations(): UserConversationList + { + return $this->proxy()->userConversations; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/UserList.php b/app/api/Twilio/Rest/Conversations/V1/Service/UserList.php new file mode 100755 index 0000000..7213877 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/UserList.php @@ -0,0 +1,206 @@ +solution = [ + 'chatServiceSid' => + $chatServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($chatServiceSid) + .'/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['chatServiceSid'] + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid The SID of the User resource to delete. This value can be either the `sid` or the `identity` of the User resource to delete. + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $this->solution['chatServiceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/UserOptions.php b/app/api/Twilio/Rest/Conversations/V1/Service/UserOptions.php new file mode 100755 index 0000000..20ae2d5 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/UserOptions.php @@ -0,0 +1,292 @@ +options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateUserOptions ' . $options . ']'; + } +} + +class DeleteUserOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteUserOptions ' . $options . ']'; + } +} + + + +class UpdateUserOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $attributes = Values::NONE, + string $roleSid = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/Service/UserPage.php b/app/api/Twilio/Rest/Conversations/V1/Service/UserPage.php new file mode 100755 index 0000000..e0d52f5 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/Service/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\Conversations\V1\Service\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload, $this->solution['chatServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ServiceContext.php b/app/api/Twilio/Rest/Conversations/V1/ServiceContext.php new file mode 100755 index 0000000..1872e35 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ServiceContext.php @@ -0,0 +1,246 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the users + */ + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_users; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + if (!$this->_bindings) { + $this->_bindings = new BindingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_bindings; + } + + /** + * Access the participantConversations + */ + protected function getParticipantConversations(): ParticipantConversationList + { + if (!$this->_participantConversations) { + $this->_participantConversations = new ParticipantConversationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_participantConversations; + } + + /** + * Access the conversations + */ + protected function getConversations(): ConversationList + { + if (!$this->_conversations) { + $this->_conversations = new ConversationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_conversations; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_roles; + } + + /** + * Access the configuration + */ + protected function getConfiguration(): ConfigurationList + { + if (!$this->_configuration) { + $this->_configuration = new ConfigurationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_configuration; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ServiceInstance.php b/app/api/Twilio/Rest/Conversations/V1/ServiceInstance.php new file mode 100755 index 0000000..7fbd715 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ServiceInstance.php @@ -0,0 +1,201 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + return $this->proxy()->users; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + return $this->proxy()->bindings; + } + + /** + * Access the participantConversations + */ + protected function getParticipantConversations(): ParticipantConversationList + { + return $this->proxy()->participantConversations; + } + + /** + * Access the conversations + */ + protected function getConversations(): ConversationList + { + return $this->proxy()->conversations; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + return $this->proxy()->roles; + } + + /** + * Access the configuration + */ + protected function getConfiguration(): ConfigurationList + { + return $this->proxy()->configuration; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/ServiceList.php b/app/api/Twilio/Rest/Conversations/V1/ServiceList.php new file mode 100755 index 0000000..5b291a9 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ServiceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName The human-readable name of this service, limited to 256 characters. Optional. + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): ServiceInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/ServicePage.php b/app/api/Twilio/Rest/Conversations/V1/ServicePage.php new file mode 100755 index 0000000..38b4558 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Conversations\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/User/UserConversationContext.php b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationContext.php new file mode 100755 index 0000000..24bf39d --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationContext.php @@ -0,0 +1,135 @@ +solution = [ + 'userSid' => + $userSid, + 'conversationSid' => + $conversationSid, + ]; + + $this->uri = '/Users/' . \rawurlencode($userSid) + .'/Conversations/' . \rawurlencode($conversationSid) + .''; + } + + /** + * Delete the UserConversationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserConversationInstance + * + * @return UserConversationInstance Fetched UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserConversationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserConversationInstance( + $this->version, + $payload, + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Update the UserConversationInstance + * + * @param array|Options $options Optional Arguments + * @return UserConversationInstance Updated UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserConversationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'NotificationLevel' => + $options['notificationLevel'], + 'LastReadTimestamp' => + Serialize::iso8601DateTime($options['lastReadTimestamp']), + 'LastReadMessageIndex' => + $options['lastReadMessageIndex'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserConversationInstance( + $this->version, + $payload, + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserConversationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/User/UserConversationInstance.php b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationInstance.php new file mode 100755 index 0000000..ab73746 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationInstance.php @@ -0,0 +1,178 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'lastReadMessageIndex' => Values::array_get($payload, 'last_read_message_index'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'conversationState' => Values::array_get($payload, 'conversation_state'), + 'timers' => Values::array_get($payload, 'timers'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'notificationLevel' => Values::array_get($payload, 'notification_level'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['userSid' => $userSid, 'conversationSid' => $conversationSid ?: $this->properties['conversationSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserConversationContext Context for this UserConversationInstance + */ + protected function proxy(): UserConversationContext + { + if (!$this->context) { + $this->context = new UserConversationContext( + $this->version, + $this->solution['userSid'], + $this->solution['conversationSid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserConversationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserConversationInstance + * + * @return UserConversationInstance Fetched UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserConversationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserConversationInstance + * + * @param array|Options $options Optional Arguments + * @return UserConversationInstance Updated UserConversationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserConversationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserConversationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/User/UserConversationList.php b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationList.php new file mode 100755 index 0000000..546261e --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationList.php @@ -0,0 +1,168 @@ +solution = [ + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Users/' . \rawurlencode($userSid) + .'/Conversations'; + } + + /** + * Reads UserConversationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserConversationInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserConversationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserConversationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserConversationPage Page of UserConversationInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserConversationPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserConversationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserConversationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserConversationPage Page of UserConversationInstance + */ + public function getPage(string $targetUrl): UserConversationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserConversationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserConversationContext + * + * @param string $conversationSid The unique SID identifier of the Conversation. This value can be either the `sid` or the `unique_name` of the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource). + */ + public function getContext( + string $conversationSid + + ): UserConversationContext + { + return new UserConversationContext( + $this->version, + $this->solution['userSid'], + $conversationSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserConversationList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/User/UserConversationOptions.php b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationOptions.php new file mode 100755 index 0000000..2b6a85a --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationOptions.php @@ -0,0 +1,116 @@ +options['notificationLevel'] = $notificationLevel; + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + } + + /** + * @param string $notificationLevel + * @return $this Fluent Builder + */ + public function setNotificationLevel(string $notificationLevel): self + { + $this->options['notificationLevel'] = $notificationLevel; + return $this; + } + + /** + * The date of the last message read in conversation by the user, given in ISO 8601 format. + * + * @param \DateTime $lastReadTimestamp The date of the last message read in conversation by the user, given in ISO 8601 format. + * @return $this Fluent Builder + */ + public function setLastReadTimestamp(\DateTime $lastReadTimestamp): self + { + $this->options['lastReadTimestamp'] = $lastReadTimestamp; + return $this; + } + + /** + * The index of the last Message in the Conversation that the Participant has read. + * + * @param int $lastReadMessageIndex The index of the last Message in the Conversation that the Participant has read. + * @return $this Fluent Builder + */ + public function setLastReadMessageIndex(int $lastReadMessageIndex): self + { + $this->options['lastReadMessageIndex'] = $lastReadMessageIndex; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateUserConversationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/User/UserConversationPage.php b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationPage.php new file mode 100755 index 0000000..b0fd1ff --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/User/UserConversationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserConversationInstance \Twilio\Rest\Conversations\V1\User\UserConversationInstance + */ + public function buildInstance(array $payload): UserConversationInstance + { + return new UserConversationInstance($this->version, $payload, $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserConversationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/UserContext.php b/app/api/Twilio/Rest/Conversations/V1/UserContext.php new file mode 100755 index 0000000..172d3c6 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/UserContext.php @@ -0,0 +1,192 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the userConversations + */ + protected function getUserConversations(): UserConversationList + { + if (!$this->_userConversations) { + $this->_userConversations = new UserConversationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_userConversations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/UserInstance.php b/app/api/Twilio/Rest/Conversations/V1/UserInstance.php new file mode 100755 index 0000000..756498f --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/UserInstance.php @@ -0,0 +1,178 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userConversations + */ + protected function getUserConversations(): UserConversationList + { + return $this->proxy()->userConversations; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Conversations.V1.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/UserList.php b/app/api/Twilio/Rest/Conversations/V1/UserList.php new file mode 100755 index 0000000..7baca06 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/UserList.php @@ -0,0 +1,198 @@ +solution = [ + ]; + + $this->uri = '/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity The application-defined string that uniquely identifies the resource's User within the [Conversation Service](https://www.twilio.com/docs/conversations/api/service-resource). This value is often a username or an email address, and is case-sensitive. + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + $options['attributes'], + 'RoleSid' => + $options['roleSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid The SID of the User resource to delete. This value can be either the `sid` or the `identity` of the User resource to delete. + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/Conversations/V1/UserOptions.php b/app/api/Twilio/Rest/Conversations/V1/UserOptions.php new file mode 100755 index 0000000..af05ebb --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/UserOptions.php @@ -0,0 +1,292 @@ +options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.CreateUserOptions ' . $options . ']'; + } +} + +class DeleteUserOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.DeleteUserOptions ' . $options . ']'; + } +} + + + +class UpdateUserOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $attributes = Values::NONE, + string $roleSid = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + $this->options['roleSid'] = $roleSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * + * @param string $attributes The JSON Object string that stores application-specific data. If attributes have not been set, `{}` is returned. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * + * @param string $roleSid The SID of a service-level [Role](https://www.twilio.com/docs/conversations/api/role-resource) to assign to the user. + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Conversations.V1.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Conversations/V1/UserPage.php b/app/api/Twilio/Rest/Conversations/V1/UserPage.php new file mode 100755 index 0000000..dc08985 --- /dev/null +++ b/app/api/Twilio/Rest/Conversations/V1/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\Conversations\V1\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Conversations.V1.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/ConversationsBase.php b/app/api/Twilio/Rest/ConversationsBase.php new file mode 100755 index 0000000..fb80aa5 --- /dev/null +++ b/app/api/Twilio/Rest/ConversationsBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://conversations.twilio.com'; + } + + + /** + * @return V1 Version v1 of conversations + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Conversations]'; + } +} diff --git a/app/api/Twilio/Rest/Events.php b/app/api/Twilio/Rest/Events.php new file mode 100755 index 0000000..8a2d68b --- /dev/null +++ b/app/api/Twilio/Rest/Events.php @@ -0,0 +1,76 @@ +eventTypes instead. + */ + protected function getEventTypes(): \Twilio\Rest\Events\V1\EventTypeList { + echo "eventTypes is deprecated. Use v1->eventTypes instead."; + return $this->v1->eventTypes; + } + + /** + * @deprecated Use v1->eventTypes(\$type) instead. + * @param string $type A string that uniquely identifies this Event Type. + */ + protected function contextEventTypes(string $type): \Twilio\Rest\Events\V1\EventTypeContext { + echo "eventTypes(\$type) is deprecated. Use v1->eventTypes(\$type) instead."; + return $this->v1->eventTypes($type); + } + + /** + * @deprecated Use v1->schemas instead. + */ + protected function getSchemas(): \Twilio\Rest\Events\V1\SchemaList { + echo "schemas is deprecated. Use v1->schemas instead."; + return $this->v1->schemas; + } + + /** + * @deprecated Use v1->schemas(\$id) instead. + * @param string $id The unique identifier of the schema. + */ + protected function contextSchemas(string $id): \Twilio\Rest\Events\V1\SchemaContext { + echo "schemas(\$id) is deprecated. Use v1->schemas(\$id) instead."; + return $this->v1->schemas($id); + } + + /** + * @deprecated Use v1->sinks instead. + */ + protected function getSinks(): \Twilio\Rest\Events\V1\SinkList { + echo "sinks is deprecated. Use v1->sinks instead."; + return $this->v1->sinks; + } + + /** + * @deprecated Use v1->sinks(\$sid) instead + * @param string $sid A string that uniquely identifies this Sink. + */ + protected function contextSinks(string $sid): \Twilio\Rest\Events\V1\SinkContext { + echo "sinks(\$sid) is deprecated. Use v1->sinks(\$sid) instead."; + return $this->v1->sinks($sid); + } + + /** + * @deprecated Use v1->subscriptions instead. + */ + protected function getSubscriptions(): \Twilio\Rest\Events\V1\SubscriptionList { + echo "subscriptions is deprecated. Use v1->subscriptions instead."; + return $this->v1->subscriptions; + } + + /** + * @deprecated Use v1->subscriptions(\$sid) instead. + * @param string $sid A string that uniquely identifies this Subscription. + */ + protected function contextSubscriptions(string $sid): \Twilio\Rest\Events\V1\SubscriptionContext { + echo "subscriptions(\$sid) is deprecated. Use v1->subscriptions(\$sid) instead."; + return $this->v1->subscriptions($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Events/V1.php b/app/api/Twilio/Rest/Events/V1.php new file mode 100755 index 0000000..194793a --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1.php @@ -0,0 +1,131 @@ +version = 'v1'; + } + + protected function getEventTypes(): EventTypeList + { + if (!$this->_eventTypes) { + $this->_eventTypes = new EventTypeList($this); + } + return $this->_eventTypes; + } + + protected function getSchemas(): SchemaList + { + if (!$this->_schemas) { + $this->_schemas = new SchemaList($this); + } + return $this->_schemas; + } + + protected function getSinks(): SinkList + { + if (!$this->_sinks) { + $this->_sinks = new SinkList($this); + } + return $this->_sinks; + } + + protected function getSubscriptions(): SubscriptionList + { + if (!$this->_subscriptions) { + $this->_subscriptions = new SubscriptionList($this); + } + return $this->_subscriptions; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/EventTypeContext.php b/app/api/Twilio/Rest/Events/V1/EventTypeContext.php new file mode 100755 index 0000000..91e213e --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/EventTypeContext.php @@ -0,0 +1,81 @@ +solution = [ + 'type' => + $type, + ]; + + $this->uri = '/Types/' . \rawurlencode($type) + .''; + } + + /** + * Fetch the EventTypeInstance + * + * @return EventTypeInstance Fetched EventTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EventTypeInstance( + $this->version, + $payload, + $this->solution['type'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.EventTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/EventTypeInstance.php b/app/api/Twilio/Rest/Events/V1/EventTypeInstance.php new file mode 100755 index 0000000..6e8a7a0 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/EventTypeInstance.php @@ -0,0 +1,128 @@ +properties = [ + 'type' => Values::array_get($payload, 'type'), + 'schemaId' => Values::array_get($payload, 'schema_id'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'description' => Values::array_get($payload, 'description'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['type' => $type ?: $this->properties['type'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EventTypeContext Context for this EventTypeInstance + */ + protected function proxy(): EventTypeContext + { + if (!$this->context) { + $this->context = new EventTypeContext( + $this->version, + $this->solution['type'] + ); + } + + return $this->context; + } + + /** + * Fetch the EventTypeInstance + * + * @return EventTypeInstance Fetched EventTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.EventTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/EventTypeList.php b/app/api/Twilio/Rest/Events/V1/EventTypeList.php new file mode 100755 index 0000000..e39c0fa --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/EventTypeList.php @@ -0,0 +1,168 @@ +solution = [ + ]; + + $this->uri = '/Types'; + } + + /** + * Reads EventTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EventTypeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams EventTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EventTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EventTypePage Page of EventTypeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EventTypePage + { + $options = new Values($options); + + $params = Values::of([ + 'SchemaId' => + $options['schemaId'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EventTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EventTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EventTypePage Page of EventTypeInstance + */ + public function getPage(string $targetUrl): EventTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EventTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EventTypeContext + * + * @param string $type A string that uniquely identifies this Event Type. + */ + public function getContext( + string $type + + ): EventTypeContext + { + return new EventTypeContext( + $this->version, + $type + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.EventTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/EventTypeOptions.php b/app/api/Twilio/Rest/Events/V1/EventTypeOptions.php new file mode 100755 index 0000000..defde2e --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/EventTypeOptions.php @@ -0,0 +1,78 @@ +options['schemaId'] = $schemaId; + } + + /** + * A string parameter filtering the results to return only the Event Types using a given schema. + * + * @param string $schemaId A string parameter filtering the results to return only the Event Types using a given schema. + * @return $this Fluent Builder + */ + public function setSchemaId(string $schemaId): self + { + $this->options['schemaId'] = $schemaId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.ReadEventTypeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/EventTypePage.php b/app/api/Twilio/Rest/Events/V1/EventTypePage.php new file mode 100755 index 0000000..407377d --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/EventTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EventTypeInstance \Twilio\Rest\Events\V1\EventTypeInstance + */ + public function buildInstance(array $payload): EventTypeInstance + { + return new EventTypeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.EventTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionContext.php b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionContext.php new file mode 100755 index 0000000..6ae1e09 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionContext.php @@ -0,0 +1,87 @@ +solution = [ + 'id' => + $id, + 'schemaVersion' => + $schemaVersion, + ]; + + $this->uri = '/Schemas/' . \rawurlencode($id) + .'/Versions/' . \rawurlencode($schemaVersion) + .''; + } + + /** + * Fetch the SchemaVersionInstance + * + * @return SchemaVersionInstance Fetched SchemaVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SchemaVersionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SchemaVersionInstance( + $this->version, + $payload, + $this->solution['id'], + $this->solution['schemaVersion'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SchemaVersionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionInstance.php b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionInstance.php new file mode 100755 index 0000000..7842e69 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionInstance.php @@ -0,0 +1,126 @@ +properties = [ + 'id' => Values::array_get($payload, 'id'), + 'schemaVersion' => Values::array_get($payload, 'schema_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + 'raw' => Values::array_get($payload, 'raw'), + ]; + + $this->solution = ['id' => $id, 'schemaVersion' => $schemaVersion ?: $this->properties['schemaVersion'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SchemaVersionContext Context for this SchemaVersionInstance + */ + protected function proxy(): SchemaVersionContext + { + if (!$this->context) { + $this->context = new SchemaVersionContext( + $this->version, + $this->solution['id'], + $this->solution['schemaVersion'] + ); + } + + return $this->context; + } + + /** + * Fetch the SchemaVersionInstance + * + * @return SchemaVersionInstance Fetched SchemaVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SchemaVersionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SchemaVersionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionList.php b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionList.php new file mode 100755 index 0000000..8c5ac8b --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionList.php @@ -0,0 +1,168 @@ +solution = [ + 'id' => + $id, + + ]; + + $this->uri = '/Schemas/' . \rawurlencode($id) + .'/Versions'; + } + + /** + * Reads SchemaVersionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SchemaVersionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SchemaVersionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SchemaVersionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SchemaVersionPage Page of SchemaVersionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SchemaVersionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SchemaVersionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SchemaVersionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SchemaVersionPage Page of SchemaVersionInstance + */ + public function getPage(string $targetUrl): SchemaVersionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SchemaVersionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SchemaVersionContext + * + * @param int $schemaVersion The version of the schema + */ + public function getContext( + int $schemaVersion + + ): SchemaVersionContext + { + return new SchemaVersionContext( + $this->version, + $this->solution['id'], + $schemaVersion + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SchemaVersionList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionPage.php b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionPage.php new file mode 100755 index 0000000..0735412 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Schema/SchemaVersionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SchemaVersionInstance \Twilio\Rest\Events\V1\Schema\SchemaVersionInstance + */ + public function buildInstance(array $payload): SchemaVersionInstance + { + return new SchemaVersionInstance($this->version, $payload, $this->solution['id']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SchemaVersionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SchemaContext.php b/app/api/Twilio/Rest/Events/V1/SchemaContext.php new file mode 100755 index 0000000..e1a9fa0 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SchemaContext.php @@ -0,0 +1,139 @@ +solution = [ + 'id' => + $id, + ]; + + $this->uri = '/Schemas/' . \rawurlencode($id) + .''; + } + + /** + * Fetch the SchemaInstance + * + * @return SchemaInstance Fetched SchemaInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SchemaInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SchemaInstance( + $this->version, + $payload, + $this->solution['id'] + ); + } + + + /** + * Access the versions + */ + protected function getVersions(): SchemaVersionList + { + if (!$this->_versions) { + $this->_versions = new SchemaVersionList( + $this->version, + $this->solution['id'] + ); + } + + return $this->_versions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SchemaContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SchemaInstance.php b/app/api/Twilio/Rest/Events/V1/SchemaInstance.php new file mode 100755 index 0000000..a0a3850 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SchemaInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'id' => Values::array_get($payload, 'id'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'latestVersionDateCreated' => Deserialize::dateTime(Values::array_get($payload, 'latest_version_date_created')), + 'latestVersion' => Values::array_get($payload, 'latest_version'), + ]; + + $this->solution = ['id' => $id ?: $this->properties['id'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SchemaContext Context for this SchemaInstance + */ + protected function proxy(): SchemaContext + { + if (!$this->context) { + $this->context = new SchemaContext( + $this->version, + $this->solution['id'] + ); + } + + return $this->context; + } + + /** + * Fetch the SchemaInstance + * + * @return SchemaInstance Fetched SchemaInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SchemaInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the versions + */ + protected function getVersions(): SchemaVersionList + { + return $this->proxy()->versions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SchemaInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/SchemaList.php b/app/api/Twilio/Rest/Events/V1/SchemaList.php new file mode 100755 index 0000000..49adcf6 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SchemaList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a SchemaContext + * + * @param string $id The unique identifier of the schema. Each schema can have multiple versions, that share the same id. + */ + public function getContext( + string $id + + ): SchemaContext + { + return new SchemaContext( + $this->version, + $id + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SchemaList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SchemaPage.php b/app/api/Twilio/Rest/Events/V1/SchemaPage.php new file mode 100755 index 0000000..d37fb29 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SchemaPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SchemaInstance \Twilio\Rest\Events\V1\SchemaInstance + */ + public function buildInstance(array $payload): SchemaInstance + { + return new SchemaInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SchemaPage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkTestInstance.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestInstance.php new file mode 100755 index 0000000..bf9d439 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestInstance.php @@ -0,0 +1,81 @@ +properties = [ + 'result' => Values::array_get($payload, 'result'), + ]; + + $this->solution = ['sid' => $sid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkTestInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkTestList.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestList.php new file mode 100755 index 0000000..0fcfd87 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestList.php @@ -0,0 +1,77 @@ +solution = [ + 'sid' => + $sid, + + ]; + + $this->uri = '/Sinks/' . \rawurlencode($sid) + .'/Test'; + } + + /** + * Create the SinkTestInstance + * + * @return SinkTestInstance Created SinkTestInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): SinkTestInstance + { + + $payload = $this->version->create('POST', $this->uri); + + return new SinkTestInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkTestList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkTestPage.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestPage.php new file mode 100755 index 0000000..bbd5bfe --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkTestPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SinkTestInstance \Twilio\Rest\Events\V1\Sink\SinkTestInstance + */ + public function buildInstance(array $payload): SinkTestInstance + { + return new SinkTestInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkTestPage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateInstance.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateInstance.php new file mode 100755 index 0000000..528dd4a --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateInstance.php @@ -0,0 +1,81 @@ +properties = [ + 'result' => Values::array_get($payload, 'result'), + ]; + + $this->solution = ['sid' => $sid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkValidateInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateList.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateList.php new file mode 100755 index 0000000..e5f063a --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidateList.php @@ -0,0 +1,84 @@ +solution = [ + 'sid' => + $sid, + + ]; + + $this->uri = '/Sinks/' . \rawurlencode($sid) + .'/Validate'; + } + + /** + * Create the SinkValidateInstance + * + * @param string $testId A 34 character string that uniquely identifies the test event for a Sink being validated. + * @return SinkValidateInstance Created SinkValidateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $testId): SinkValidateInstance + { + + $data = Values::of([ + 'TestId' => + $testId, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SinkValidateInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkValidateList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Sink/SinkValidatePage.php b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidatePage.php new file mode 100755 index 0000000..10f335e --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Sink/SinkValidatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SinkValidateInstance \Twilio\Rest\Events\V1\Sink\SinkValidateInstance + */ + public function buildInstance(array $payload): SinkValidateInstance + { + return new SinkValidateInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkValidatePage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SinkContext.php b/app/api/Twilio/Rest/Events/V1/SinkContext.php new file mode 100755 index 0000000..e48365d --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SinkContext.php @@ -0,0 +1,195 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Sinks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SinkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SinkInstance + * + * @return SinkInstance Fetched SinkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SinkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SinkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SinkInstance + * + * @param string $description A human readable description for the Sink **This value should not contain PII.** + * @return SinkInstance Updated SinkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $description): SinkInstance + { + + $data = Values::of([ + 'Description' => + $description, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SinkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the sinkTest + */ + protected function getSinkTest(): SinkTestList + { + if (!$this->_sinkTest) { + $this->_sinkTest = new SinkTestList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_sinkTest; + } + + /** + * Access the sinkValidate + */ + protected function getSinkValidate(): SinkValidateList + { + if (!$this->_sinkValidate) { + $this->_sinkValidate = new SinkValidateList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_sinkValidate; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SinkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SinkInstance.php b/app/api/Twilio/Rest/Events/V1/SinkInstance.php new file mode 100755 index 0000000..0edd82b --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SinkInstance.php @@ -0,0 +1,178 @@ +properties = [ + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'description' => Values::array_get($payload, 'description'), + 'sid' => Values::array_get($payload, 'sid'), + 'sinkConfiguration' => Values::array_get($payload, 'sink_configuration'), + 'sinkType' => Values::array_get($payload, 'sink_type'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SinkContext Context for this SinkInstance + */ + protected function proxy(): SinkContext + { + if (!$this->context) { + $this->context = new SinkContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SinkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SinkInstance + * + * @return SinkInstance Fetched SinkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SinkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SinkInstance + * + * @param string $description A human readable description for the Sink **This value should not contain PII.** + * @return SinkInstance Updated SinkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $description): SinkInstance + { + + return $this->proxy()->update($description); + } + + /** + * Access the sinkTest + */ + protected function getSinkTest(): SinkTestList + { + return $this->proxy()->sinkTest; + } + + /** + * Access the sinkValidate + */ + protected function getSinkValidate(): SinkValidateList + { + return $this->proxy()->sinkValidate; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SinkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/SinkList.php b/app/api/Twilio/Rest/Events/V1/SinkList.php new file mode 100755 index 0000000..922d61e --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SinkList.php @@ -0,0 +1,202 @@ +solution = [ + ]; + + $this->uri = '/Sinks'; + } + + /** + * Create the SinkInstance + * + * @param string $description A human readable description for the Sink **This value should not contain PII.** + * @param array $sinkConfiguration The information required for Twilio to connect to the provided Sink encoded as JSON. + * @param string $sinkType + * @return SinkInstance Created SinkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $description, array $sinkConfiguration, string $sinkType): SinkInstance + { + + $data = Values::of([ + 'Description' => + $description, + 'SinkConfiguration' => + Serialize::jsonObject($sinkConfiguration), + 'SinkType' => + $sinkType, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SinkInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SinkInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SinkInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SinkInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SinkInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SinkPage Page of SinkInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SinkPage + { + $options = new Values($options); + + $params = Values::of([ + 'InUse' => + Serialize::booleanToString($options['inUse']), + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SinkPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SinkInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SinkPage Page of SinkInstance + */ + public function getPage(string $targetUrl): SinkPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SinkPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SinkContext + * + * @param string $sid A 34 character string that uniquely identifies this Sink. + */ + public function getContext( + string $sid + + ): SinkContext + { + return new SinkContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SinkOptions.php b/app/api/Twilio/Rest/Events/V1/SinkOptions.php new file mode 100755 index 0000000..944fdc3 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SinkOptions.php @@ -0,0 +1,102 @@ +options['inUse'] = $inUse; + $this->options['status'] = $status; + } + + /** + * A boolean query parameter filtering the results to return sinks used/not used by a subscription. + * + * @param bool $inUse A boolean query parameter filtering the results to return sinks used/not used by a subscription. + * @return $this Fluent Builder + */ + public function setInUse(bool $inUse): self + { + $this->options['inUse'] = $inUse; + return $this; + } + + /** + * A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + * + * @param string $status A String query parameter filtering the results by status `initialized`, `validating`, `active` or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.ReadSinkOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Events/V1/SinkPage.php b/app/api/Twilio/Rest/Events/V1/SinkPage.php new file mode 100755 index 0000000..87edc23 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SinkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SinkInstance \Twilio\Rest\Events\V1\SinkInstance + */ + public function buildInstance(array $payload): SinkInstance + { + return new SinkInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SinkPage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventContext.php b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventContext.php new file mode 100755 index 0000000..540552f --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventContext.php @@ -0,0 +1,130 @@ +solution = [ + 'subscriptionSid' => + $subscriptionSid, + 'type' => + $type, + ]; + + $this->uri = '/Subscriptions/' . \rawurlencode($subscriptionSid) + .'/SubscribedEvents/' . \rawurlencode($type) + .''; + } + + /** + * Delete the SubscribedEventInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SubscribedEventInstance + * + * @return SubscribedEventInstance Fetched SubscribedEventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscribedEventInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SubscribedEventInstance( + $this->version, + $payload, + $this->solution['subscriptionSid'], + $this->solution['type'] + ); + } + + + /** + * Update the SubscribedEventInstance + * + * @param array|Options $options Optional Arguments + * @return SubscribedEventInstance Updated SubscribedEventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SubscribedEventInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'SchemaVersion' => + $options['schemaVersion'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SubscribedEventInstance( + $this->version, + $payload, + $this->solution['subscriptionSid'], + $this->solution['type'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SubscribedEventContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventInstance.php b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventInstance.php new file mode 100755 index 0000000..15b68b8 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventInstance.php @@ -0,0 +1,151 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'type' => Values::array_get($payload, 'type'), + 'schemaVersion' => Values::array_get($payload, 'schema_version'), + 'subscriptionSid' => Values::array_get($payload, 'subscription_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['subscriptionSid' => $subscriptionSid, 'type' => $type ?: $this->properties['type'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SubscribedEventContext Context for this SubscribedEventInstance + */ + protected function proxy(): SubscribedEventContext + { + if (!$this->context) { + $this->context = new SubscribedEventContext( + $this->version, + $this->solution['subscriptionSid'], + $this->solution['type'] + ); + } + + return $this->context; + } + + /** + * Delete the SubscribedEventInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SubscribedEventInstance + * + * @return SubscribedEventInstance Fetched SubscribedEventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscribedEventInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SubscribedEventInstance + * + * @param array|Options $options Optional Arguments + * @return SubscribedEventInstance Updated SubscribedEventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SubscribedEventInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SubscribedEventInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventList.php b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventList.php new file mode 100755 index 0000000..de6db0f --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventList.php @@ -0,0 +1,200 @@ +solution = [ + 'subscriptionSid' => + $subscriptionSid, + + ]; + + $this->uri = '/Subscriptions/' . \rawurlencode($subscriptionSid) + .'/SubscribedEvents'; + } + + /** + * Create the SubscribedEventInstance + * + * @param string $type Type of event being subscribed to. + * @param array|Options $options Optional Arguments + * @return SubscribedEventInstance Created SubscribedEventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): SubscribedEventInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'SchemaVersion' => + $options['schemaVersion'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SubscribedEventInstance( + $this->version, + $payload, + $this->solution['subscriptionSid'] + ); + } + + + /** + * Reads SubscribedEventInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SubscribedEventInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SubscribedEventInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SubscribedEventInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SubscribedEventPage Page of SubscribedEventInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SubscribedEventPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SubscribedEventPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SubscribedEventInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SubscribedEventPage Page of SubscribedEventInstance + */ + public function getPage(string $targetUrl): SubscribedEventPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SubscribedEventPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SubscribedEventContext + * + * @param string $type Type of event being subscribed to. + */ + public function getContext( + string $type + + ): SubscribedEventContext + { + return new SubscribedEventContext( + $this->version, + $this->solution['subscriptionSid'], + $type + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SubscribedEventList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventOptions.php b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventOptions.php new file mode 100755 index 0000000..04c7215 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventOptions.php @@ -0,0 +1,134 @@ +options['schemaVersion'] = $schemaVersion; + } + + /** + * The schema version that the subscription should use. + * + * @param int $schemaVersion The schema version that the subscription should use. + * @return $this Fluent Builder + */ + public function setSchemaVersion(int $schemaVersion): self + { + $this->options['schemaVersion'] = $schemaVersion; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.CreateSubscribedEventOptions ' . $options . ']'; + } +} + + + + +class UpdateSubscribedEventOptions extends Options + { + /** + * @param int $schemaVersion The schema version that the subscription should use. + */ + public function __construct( + + int $schemaVersion = Values::INT_NONE + + ) { + $this->options['schemaVersion'] = $schemaVersion; + } + + /** + * The schema version that the subscription should use. + * + * @param int $schemaVersion The schema version that the subscription should use. + * @return $this Fluent Builder + */ + public function setSchemaVersion(int $schemaVersion): self + { + $this->options['schemaVersion'] = $schemaVersion; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.UpdateSubscribedEventOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventPage.php b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventPage.php new file mode 100755 index 0000000..5ffe691 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/Subscription/SubscribedEventPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SubscribedEventInstance \Twilio\Rest\Events\V1\Subscription\SubscribedEventInstance + */ + public function buildInstance(array $payload): SubscribedEventInstance + { + return new SubscribedEventInstance($this->version, $payload, $this->solution['subscriptionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SubscribedEventPage]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SubscriptionContext.php b/app/api/Twilio/Rest/Events/V1/SubscriptionContext.php new file mode 100755 index 0000000..23e2427 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SubscriptionContext.php @@ -0,0 +1,183 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Subscriptions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SubscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SubscriptionInstance + * + * @return SubscriptionInstance Fetched SubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscriptionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SubscriptionInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SubscriptionInstance + * + * @param array|Options $options Optional Arguments + * @return SubscriptionInstance Updated SubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SubscriptionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Description' => + $options['description'], + 'SinkSid' => + $options['sinkSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SubscriptionInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the subscribedEvents + */ + protected function getSubscribedEvents(): SubscribedEventList + { + if (!$this->_subscribedEvents) { + $this->_subscribedEvents = new SubscribedEventList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_subscribedEvents; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SubscriptionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SubscriptionInstance.php b/app/api/Twilio/Rest/Events/V1/SubscriptionInstance.php new file mode 100755 index 0000000..6afd8a5 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SubscriptionInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'description' => Values::array_get($payload, 'description'), + 'sinkSid' => Values::array_get($payload, 'sink_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SubscriptionContext Context for this SubscriptionInstance + */ + protected function proxy(): SubscriptionContext + { + if (!$this->context) { + $this->context = new SubscriptionContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SubscriptionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SubscriptionInstance + * + * @return SubscriptionInstance Fetched SubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscriptionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SubscriptionInstance + * + * @param array|Options $options Optional Arguments + * @return SubscriptionInstance Updated SubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SubscriptionInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the subscribedEvents + */ + protected function getSubscribedEvents(): SubscribedEventList + { + return $this->proxy()->subscribedEvents; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Events.V1.SubscriptionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/SubscriptionList.php b/app/api/Twilio/Rest/Events/V1/SubscriptionList.php new file mode 100755 index 0000000..44214d7 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SubscriptionList.php @@ -0,0 +1,200 @@ +solution = [ + ]; + + $this->uri = '/Subscriptions'; + } + + /** + * Create the SubscriptionInstance + * + * @param string $description A human readable description for the Subscription **This value should not contain PII.** + * @param string $sinkSid The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + * @param array[] $types An array of objects containing the subscribed Event Types + * @return SubscriptionInstance Created SubscriptionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $description, string $sinkSid, array $types): SubscriptionInstance + { + + $data = Values::of([ + 'Description' => + $description, + 'SinkSid' => + $sinkSid, + 'Types' => + Serialize::map($types,function ($e) { return Serialize::jsonObject($e); }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SubscriptionInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SubscriptionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SubscriptionInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SubscriptionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SubscriptionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SubscriptionPage Page of SubscriptionInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SubscriptionPage + { + $options = new Values($options); + + $params = Values::of([ + 'SinkSid' => + $options['sinkSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SubscriptionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SubscriptionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SubscriptionPage Page of SubscriptionInstance + */ + public function getPage(string $targetUrl): SubscriptionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SubscriptionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SubscriptionContext + * + * @param string $sid A 34 character string that uniquely identifies this Subscription. + */ + public function getContext( + string $sid + + ): SubscriptionContext + { + return new SubscriptionContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SubscriptionList]'; + } +} diff --git a/app/api/Twilio/Rest/Events/V1/SubscriptionOptions.php b/app/api/Twilio/Rest/Events/V1/SubscriptionOptions.php new file mode 100755 index 0000000..4eaf325 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SubscriptionOptions.php @@ -0,0 +1,152 @@ +options['sinkSid'] = $sinkSid; + } + + /** + * The SID of the sink that the list of Subscriptions should be filtered by. + * + * @param string $sinkSid The SID of the sink that the list of Subscriptions should be filtered by. + * @return $this Fluent Builder + */ + public function setSinkSid(string $sinkSid): self + { + $this->options['sinkSid'] = $sinkSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.ReadSubscriptionOptions ' . $options . ']'; + } +} + +class UpdateSubscriptionOptions extends Options + { + /** + * @param string $description A human readable description for the Subscription. + * @param string $sinkSid The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + */ + public function __construct( + + string $description = Values::NONE, + string $sinkSid = Values::NONE + + ) { + $this->options['description'] = $description; + $this->options['sinkSid'] = $sinkSid; + } + + /** + * A human readable description for the Subscription. + * + * @param string $description A human readable description for the Subscription. + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + * + * @param string $sinkSid The SID of the sink that events selected by this subscription should be sent to. Sink must be active for the subscription to be created. + * @return $this Fluent Builder + */ + public function setSinkSid(string $sinkSid): self + { + $this->options['sinkSid'] = $sinkSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Events.V1.UpdateSubscriptionOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Events/V1/SubscriptionPage.php b/app/api/Twilio/Rest/Events/V1/SubscriptionPage.php new file mode 100755 index 0000000..fe7d211 --- /dev/null +++ b/app/api/Twilio/Rest/Events/V1/SubscriptionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SubscriptionInstance \Twilio\Rest\Events\V1\SubscriptionInstance + */ + public function buildInstance(array $payload): SubscriptionInstance + { + return new SubscriptionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Events.V1.SubscriptionPage]'; + } +} diff --git a/app/api/Twilio/Rest/EventsBase.php b/app/api/Twilio/Rest/EventsBase.php new file mode 100755 index 0000000..98388a2 --- /dev/null +++ b/app/api/Twilio/Rest/EventsBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://events.twilio.com'; + } + + + /** + * @return V1 Version v1 of events + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Events]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi.php b/app/api/Twilio/Rest/FlexApi.php new file mode 100755 index 0000000..0feb53b --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi.php @@ -0,0 +1,118 @@ +assessments instead. + */ + protected function getAssessments(): \Twilio\Rest\FlexApi\V1\AssessmentsList { + echo "assessments is deprecated. Use v1->assessments instead."; + return $this->v1->assessments; + } + + /** + * @deprecated Use v1->assessments() instead. + */ + protected function contextAssessments(): \Twilio\Rest\FlexApi\V1\AssessmentsContext { + echo "assessments() is deprecated. Use v1->assessments() instead."; + return $this->v1->assessments(); + } + + /** + * @deprecated Use v1->channel instead. + */ + protected function getChannel(): \Twilio\Rest\FlexApi\V1\ChannelList { + echo "channel is deprecated. Use v1->channel instead."; + return $this->v1->channel; + } + + /** + * @deprecated Use v1->channel(\$sid) instead. + * @param string $sid The SID that identifies the Flex chat channel resource to + * fetch + */ + protected function contextChannel(string $sid): \Twilio\Rest\FlexApi\V1\ChannelContext { + echo "channel(\$sid) is deprecated. Use v1->channel(\$sid) instead."; + return $this->v1->channel($sid); + } + + /** + * @deprecated Use v1->configuration instead. + */ + protected function getConfiguration(): \Twilio\Rest\FlexApi\V1\ConfigurationList { + echo "configuration is deprecated. Use v1->configuration instead."; + return $this->v1->configuration; + } + + /** + * @deprecated Use v1->configuration() instead. + */ + protected function contextConfiguration(): \Twilio\Rest\FlexApi\V1\ConfigurationContext { + echo "configuration() is deprecated. Use v1->configuration() instead."; + return $this->v1->configuration(); + } + + /** + * @deprecated Use v1->flexFlow instead. + */ + protected function getFlexFlow(): \Twilio\Rest\FlexApi\V1\FlexFlowList { + echo "flexFlow is deprecated. Use v1->flexFlow instead."; + return $this->v1->flexFlow; + } + + /** + * @deprecated Use v1->flexFlow(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextFlexFlow(string $sid): \Twilio\Rest\FlexApi\V1\FlexFlowContext { + echo "flexFlow(\$sid) is deprecated. Use v1->flexFlow(\$sid) instead."; + return $this->v1->flexFlow($sid); + } + + /** + * @deprecated Use v1->interaction instead. + */ + protected function getInteraction(): \Twilio\Rest\FlexApi\V1\InteractionList { + echo "interaction is deprecated. Use v1->interaction instead."; + return $this->v1->interaction; + } + + /** + * @deprecated Use v1->interaction(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextInteraction(string $sid): \Twilio\Rest\FlexApi\V1\InteractionContext { + echo "interaction(\$sid) is deprecated. Use v1->interaction(\$sid) instead."; + return $this->v1->interaction($sid); + } + + /** + * @deprecated Use v1->webChannel instead. + */ + protected function getWebChannel(): \Twilio\Rest\FlexApi\V1\WebChannelList { + echo "webChannel is deprecated. Use v1->webChannel instead."; + return $this->v1->webChannel; + } + + /** + * @deprecated Use v1->webChannel(\$sid) instead. + * @param string $sid The SID of the WebChannel resource to fetch + */ + protected function contextWebChannel(string $sid): \Twilio\Rest\FlexApi\V1\WebChannelContext { + echo "webChannel(\$sid) is deprecated. Use v1->webChannel(\$sid) instead."; + return $this->v1->webChannel($sid); + } + + /** + * @deprecated Use v2->webChannels instead. + */ + protected function getWebChannels(): \Twilio\Rest\FlexApi\V2\WebChannelsList { + echo "webChannels is deprecated. Use v2->webChannels instead."; + return $this->v2->webChannels; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/FlexApi/V1.php b/app/api/Twilio/Rest/FlexApi/V1.php new file mode 100755 index 0000000..791688d --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1.php @@ -0,0 +1,268 @@ +version = 'v1'; + } + + protected function getAssessments(): AssessmentsList + { + if (!$this->_assessments) { + $this->_assessments = new AssessmentsList($this); + } + return $this->_assessments; + } + + protected function getChannel(): ChannelList + { + if (!$this->_channel) { + $this->_channel = new ChannelList($this); + } + return $this->_channel; + } + + protected function getConfiguration(): ConfigurationList + { + if (!$this->_configuration) { + $this->_configuration = new ConfigurationList($this); + } + return $this->_configuration; + } + + protected function getFlexFlow(): FlexFlowList + { + if (!$this->_flexFlow) { + $this->_flexFlow = new FlexFlowList($this); + } + return $this->_flexFlow; + } + + protected function getInsightsAssessmentsComment(): InsightsAssessmentsCommentList + { + if (!$this->_insightsAssessmentsComment) { + $this->_insightsAssessmentsComment = new InsightsAssessmentsCommentList($this); + } + return $this->_insightsAssessmentsComment; + } + + protected function getInsightsConversations(): InsightsConversationsList + { + if (!$this->_insightsConversations) { + $this->_insightsConversations = new InsightsConversationsList($this); + } + return $this->_insightsConversations; + } + + protected function getInsightsQuestionnaires(): InsightsQuestionnairesList + { + if (!$this->_insightsQuestionnaires) { + $this->_insightsQuestionnaires = new InsightsQuestionnairesList($this); + } + return $this->_insightsQuestionnaires; + } + + protected function getInsightsQuestionnairesCategory(): InsightsQuestionnairesCategoryList + { + if (!$this->_insightsQuestionnairesCategory) { + $this->_insightsQuestionnairesCategory = new InsightsQuestionnairesCategoryList($this); + } + return $this->_insightsQuestionnairesCategory; + } + + protected function getInsightsQuestionnairesQuestion(): InsightsQuestionnairesQuestionList + { + if (!$this->_insightsQuestionnairesQuestion) { + $this->_insightsQuestionnairesQuestion = new InsightsQuestionnairesQuestionList($this); + } + return $this->_insightsQuestionnairesQuestion; + } + + protected function getInsightsSegments(): InsightsSegmentsList + { + if (!$this->_insightsSegments) { + $this->_insightsSegments = new InsightsSegmentsList($this); + } + return $this->_insightsSegments; + } + + protected function getInsightsSession(): InsightsSessionList + { + if (!$this->_insightsSession) { + $this->_insightsSession = new InsightsSessionList($this); + } + return $this->_insightsSession; + } + + protected function getInsightsSettingsAnswerSets(): InsightsSettingsAnswerSetsList + { + if (!$this->_insightsSettingsAnswerSets) { + $this->_insightsSettingsAnswerSets = new InsightsSettingsAnswerSetsList($this); + } + return $this->_insightsSettingsAnswerSets; + } + + protected function getInsightsSettingsComment(): InsightsSettingsCommentList + { + if (!$this->_insightsSettingsComment) { + $this->_insightsSettingsComment = new InsightsSettingsCommentList($this); + } + return $this->_insightsSettingsComment; + } + + protected function getInsightsUserRoles(): InsightsUserRolesList + { + if (!$this->_insightsUserRoles) { + $this->_insightsUserRoles = new InsightsUserRolesList($this); + } + return $this->_insightsUserRoles; + } + + protected function getInteraction(): InteractionList + { + if (!$this->_interaction) { + $this->_interaction = new InteractionList($this); + } + return $this->_interaction; + } + + protected function getWebChannel(): WebChannelList + { + if (!$this->_webChannel) { + $this->_webChannel = new WebChannelList($this); + } + return $this->_webChannel; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/AssessmentsContext.php b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsContext.php new file mode 100755 index 0000000..2316faf --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsContext.php @@ -0,0 +1,100 @@ +solution = [ + 'assessmentId' => + $assessmentId, + ]; + + $this->uri = '/Insights/QM/Assessments/' . \rawurlencode($assessmentId) + .''; + } + + /** + * Update the AssessmentsInstance + * + * @param string $offset The offset of the conversation + * @param string $answerText The answer text selected by user + * @param string $answerId The id of the answer selected by user + * @param array|Options $options Optional Arguments + * @return AssessmentsInstance Updated AssessmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $offset, string $answerText, string $answerId, array $options = []): AssessmentsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Offset' => + $offset, + 'AnswerText' => + $answerText, + 'AnswerId' => + $answerId, + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new AssessmentsInstance( + $this->version, + $payload, + $this->solution['assessmentId'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.AssessmentsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/AssessmentsInstance.php b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsInstance.php new file mode 100755 index 0000000..8953046 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsInstance.php @@ -0,0 +1,146 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assessmentId' => Values::array_get($payload, 'assessment_id'), + 'offset' => Values::array_get($payload, 'offset'), + 'report' => Values::array_get($payload, 'report'), + 'weight' => Values::array_get($payload, 'weight'), + 'agentId' => Values::array_get($payload, 'agent_id'), + 'segmentId' => Values::array_get($payload, 'segment_id'), + 'userName' => Values::array_get($payload, 'user_name'), + 'userEmail' => Values::array_get($payload, 'user_email'), + 'answerText' => Values::array_get($payload, 'answer_text'), + 'answerId' => Values::array_get($payload, 'answer_id'), + 'assessment' => Values::array_get($payload, 'assessment'), + 'timestamp' => Values::array_get($payload, 'timestamp'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assessmentId' => $assessmentId ?: $this->properties['assessmentId'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssessmentsContext Context for this AssessmentsInstance + */ + protected function proxy(): AssessmentsContext + { + if (!$this->context) { + $this->context = new AssessmentsContext( + $this->version, + $this->solution['assessmentId'] + ); + } + + return $this->context; + } + + /** + * Update the AssessmentsInstance + * + * @param string $offset The offset of the conversation + * @param string $answerText The answer text selected by user + * @param string $answerId The id of the answer selected by user + * @param array|Options $options Optional Arguments + * @return AssessmentsInstance Updated AssessmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $offset, string $answerText, string $answerId, array $options = []): AssessmentsInstance + { + + return $this->proxy()->update($offset, $answerText, $answerId, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.AssessmentsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/AssessmentsList.php b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsList.php new file mode 100755 index 0000000..8b4f840 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsList.php @@ -0,0 +1,233 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Assessments'; + } + + /** + * Create the AssessmentsInstance + * + * @param string $categoryId The id of the category + * @param string $categoryName The name of the category + * @param string $segmentId Segment Id of the conversation + * @param string $userName Name of the user assessing conversation + * @param string $userEmail Email of the user assessing conversation + * @param string $agentId The id of the Agent + * @param string $offset The offset of the conversation. + * @param string $metricId The question Id selected for assessment + * @param string $metricName The question name of the assessment + * @param string $answerText The answer text selected by user + * @param string $answerId The id of the answer selected by user + * @param string $questionnaireId Questionnaire Id of the associated question + * @param array|Options $options Optional Arguments + * @return AssessmentsInstance Created AssessmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $categoryId, string $categoryName, string $segmentId, string $userName, string $userEmail, string $agentId, string $offset, string $metricId, string $metricName, string $answerText, string $answerId, string $questionnaireId, array $options = []): AssessmentsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CategoryId' => + $categoryId, + 'CategoryName' => + $categoryName, + 'SegmentId' => + $segmentId, + 'UserName' => + $userName, + 'UserEmail' => + $userEmail, + 'AgentId' => + $agentId, + 'Offset' => + $offset, + 'MetricId' => + $metricId, + 'MetricName' => + $metricName, + 'AnswerText' => + $answerText, + 'AnswerId' => + $answerId, + 'QuestionnaireId' => + $questionnaireId, + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new AssessmentsInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AssessmentsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssessmentsInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AssessmentsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssessmentsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssessmentsPage Page of AssessmentsInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssessmentsPage + { + $options = new Values($options); + + $params = Values::of([ + 'SegmentId' => + $options['segmentId'], + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssessmentsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssessmentsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssessmentsPage Page of AssessmentsInstance + */ + public function getPage(string $targetUrl): AssessmentsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssessmentsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssessmentsContext + * + * @param string $assessmentId The id of the assessment to be modified + */ + public function getContext( + string $assessmentId + + ): AssessmentsContext + { + return new AssessmentsContext( + $this->version, + $assessmentId + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.AssessmentsList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/AssessmentsOptions.php b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsOptions.php new file mode 100755 index 0000000..48caa08 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsOptions.php @@ -0,0 +1,198 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateAssessmentsOptions ' . $options . ']'; + } +} + +class ReadAssessmentsOptions extends Options + { + /** + * @param string $segmentId The id of the segment. + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $segmentId = Values::NONE, + string $token = Values::NONE + + ) { + $this->options['segmentId'] = $segmentId; + $this->options['token'] = $token; + } + + /** + * The id of the segment. + * + * @param string $segmentId The id of the segment. + * @return $this Fluent Builder + */ + public function setSegmentId(string $segmentId): self + { + $this->options['segmentId'] = $segmentId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadAssessmentsOptions ' . $options . ']'; + } +} + +class UpdateAssessmentsOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateAssessmentsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/AssessmentsPage.php b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsPage.php new file mode 100755 index 0000000..dbe0931 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/AssessmentsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssessmentsInstance \Twilio\Rest\FlexApi\V1\AssessmentsInstance + */ + public function buildInstance(array $payload): AssessmentsInstance + { + return new AssessmentsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.AssessmentsPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ChannelContext.php b/app/api/Twilio/Rest/FlexApi/V1/ChannelContext.php new file mode 100755 index 0000000..279dba5 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ChannelContext.php @@ -0,0 +1,94 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ChannelInstance.php b/app/api/Twilio/Rest/FlexApi/V1/ChannelInstance.php new file mode 100755 index 0000000..a5d0767 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ChannelInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flexFlowSid' => Values::array_get($payload, 'flex_flow_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'url' => Values::array_get($payload, 'url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/ChannelList.php b/app/api/Twilio/Rest/FlexApi/V1/ChannelList.php new file mode 100755 index 0000000..9f50190 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ChannelList.php @@ -0,0 +1,212 @@ +solution = [ + ]; + + $this->uri = '/Channels'; + } + + /** + * Create the ChannelInstance + * + * @param string $flexFlowSid The SID of the Flex Flow. + * @param string $identity The `identity` value that uniquely identifies the new resource's chat User. + * @param string $chatUserFriendlyName The chat participant's friendly name. + * @param string $chatFriendlyName The chat channel's friendly name. + * @param array|Options $options Optional Arguments + * @return ChannelInstance Created ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $flexFlowSid, string $identity, string $chatUserFriendlyName, string $chatFriendlyName, array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FlexFlowSid' => + $flexFlowSid, + 'Identity' => + $identity, + 'ChatUserFriendlyName' => + $chatUserFriendlyName, + 'ChatFriendlyName' => + $chatFriendlyName, + 'Target' => + $options['target'], + 'ChatUniqueName' => + $options['chatUniqueName'], + 'PreEngagementData' => + $options['preEngagementData'], + 'TaskSid' => + $options['taskSid'], + 'TaskAttributes' => + $options['taskAttributes'], + 'LongLived' => + Serialize::booleanToString($options['longLived']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ChannelInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChannelPage Page of ChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChannelPage Page of ChannelInstance + */ + public function getPage(string $targetUrl): ChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChannelContext + * + * @param string $sid The SID of the Flex chat channel resource to delete. + */ + public function getContext( + string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ChannelOptions.php b/app/api/Twilio/Rest/FlexApi/V1/ChannelOptions.php new file mode 100755 index 0000000..f314839 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ChannelOptions.php @@ -0,0 +1,172 @@ +options['target'] = $target; + $this->options['chatUniqueName'] = $chatUniqueName; + $this->options['preEngagementData'] = $preEngagementData; + $this->options['taskSid'] = $taskSid; + $this->options['taskAttributes'] = $taskAttributes; + $this->options['longLived'] = $longLived; + } + + /** + * The Target Contact Identity, for example the phone number of an SMS. + * + * @param string $target The Target Contact Identity, for example the phone number of an SMS. + * @return $this Fluent Builder + */ + public function setTarget(string $target): self + { + $this->options['target'] = $target; + return $this; + } + + /** + * The chat channel's unique name. + * + * @param string $chatUniqueName The chat channel's unique name. + * @return $this Fluent Builder + */ + public function setChatUniqueName(string $chatUniqueName): self + { + $this->options['chatUniqueName'] = $chatUniqueName; + return $this; + } + + /** + * The pre-engagement data. + * + * @param string $preEngagementData The pre-engagement data. + * @return $this Fluent Builder + */ + public function setPreEngagementData(string $preEngagementData): self + { + $this->options['preEngagementData'] = $preEngagementData; + return $this; + } + + /** + * The SID of the TaskRouter Task. Only valid when integration type is `task`. `null` for integration types `studio` & `external` + * + * @param string $taskSid The SID of the TaskRouter Task. Only valid when integration type is `task`. `null` for integration types `studio` & `external` + * @return $this Fluent Builder + */ + public function setTaskSid(string $taskSid): self + { + $this->options['taskSid'] = $taskSid; + return $this; + } + + /** + * The Task attributes to be added for the TaskRouter Task. + * + * @param string $taskAttributes The Task attributes to be added for the TaskRouter Task. + * @return $this Fluent Builder + */ + public function setTaskAttributes(string $taskAttributes): self + { + $this->options['taskAttributes'] = $taskAttributes; + return $this; + } + + /** + * Whether to create the channel as long-lived. + * + * @param bool $longLived Whether to create the channel as long-lived. + * @return $this Fluent Builder + */ + public function setLongLived(bool $longLived): self + { + $this->options['longLived'] = $longLived; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateChannelOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/FlexApi/V1/ChannelPage.php b/app/api/Twilio/Rest/FlexApi/V1/ChannelPage.php new file mode 100755 index 0000000..14be074 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\FlexApi\V1\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ConfigurationContext.php b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationContext.php new file mode 100755 index 0000000..04b2ff2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationContext.php @@ -0,0 +1,85 @@ +solution = [ + ]; + + $this->uri = '/Configuration'; + } + + /** + * Fetch the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): ConfigurationInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'UiVersion' => + $options['uiVersion'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new ConfigurationInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.ConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ConfigurationInstance.php b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationInstance.php new file mode 100755 index 0000000..796fb93 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationInstance.php @@ -0,0 +1,204 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'attributes' => Values::array_get($payload, 'attributes'), + 'status' => Values::array_get($payload, 'status'), + 'taskrouterWorkspaceSid' => Values::array_get($payload, 'taskrouter_workspace_sid'), + 'taskrouterTargetWorkflowSid' => Values::array_get($payload, 'taskrouter_target_workflow_sid'), + 'taskrouterTargetTaskqueueSid' => Values::array_get($payload, 'taskrouter_target_taskqueue_sid'), + 'taskrouterTaskqueues' => Values::array_get($payload, 'taskrouter_taskqueues'), + 'taskrouterSkills' => Values::array_get($payload, 'taskrouter_skills'), + 'taskrouterWorkerChannels' => Values::array_get($payload, 'taskrouter_worker_channels'), + 'taskrouterWorkerAttributes' => Values::array_get($payload, 'taskrouter_worker_attributes'), + 'taskrouterOfflineActivitySid' => Values::array_get($payload, 'taskrouter_offline_activity_sid'), + 'runtimeDomain' => Values::array_get($payload, 'runtime_domain'), + 'messagingServiceInstanceSid' => Values::array_get($payload, 'messaging_service_instance_sid'), + 'chatServiceInstanceSid' => Values::array_get($payload, 'chat_service_instance_sid'), + 'flexServiceInstanceSid' => Values::array_get($payload, 'flex_service_instance_sid'), + 'uiLanguage' => Values::array_get($payload, 'ui_language'), + 'uiAttributes' => Values::array_get($payload, 'ui_attributes'), + 'uiDependencies' => Values::array_get($payload, 'ui_dependencies'), + 'uiVersion' => Values::array_get($payload, 'ui_version'), + 'serviceVersion' => Values::array_get($payload, 'service_version'), + 'callRecordingEnabled' => Values::array_get($payload, 'call_recording_enabled'), + 'callRecordingWebhookUrl' => Values::array_get($payload, 'call_recording_webhook_url'), + 'crmEnabled' => Values::array_get($payload, 'crm_enabled'), + 'crmType' => Values::array_get($payload, 'crm_type'), + 'crmCallbackUrl' => Values::array_get($payload, 'crm_callback_url'), + 'crmFallbackUrl' => Values::array_get($payload, 'crm_fallback_url'), + 'crmAttributes' => Values::array_get($payload, 'crm_attributes'), + 'publicAttributes' => Values::array_get($payload, 'public_attributes'), + 'pluginServiceEnabled' => Values::array_get($payload, 'plugin_service_enabled'), + 'pluginServiceAttributes' => Values::array_get($payload, 'plugin_service_attributes'), + 'integrations' => Values::array_get($payload, 'integrations'), + 'outboundCallFlows' => Values::array_get($payload, 'outbound_call_flows'), + 'serverlessServiceSids' => Values::array_get($payload, 'serverless_service_sids'), + 'queueStatsConfiguration' => Values::array_get($payload, 'queue_stats_configuration'), + 'notifications' => Values::array_get($payload, 'notifications'), + 'markdown' => Values::array_get($payload, 'markdown'), + 'url' => Values::array_get($payload, 'url'), + 'flexInsightsHr' => Values::array_get($payload, 'flex_insights_hr'), + 'flexInsightsDrilldown' => Values::array_get($payload, 'flex_insights_drilldown'), + 'flexUrl' => Values::array_get($payload, 'flex_url'), + 'channelConfigs' => Values::array_get($payload, 'channel_configs'), + 'debuggerIntegration' => Values::array_get($payload, 'debugger_integration'), + 'flexUiStatusReport' => Values::array_get($payload, 'flex_ui_status_report'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConfigurationContext Context for this ConfigurationInstance + */ + protected function proxy(): ConfigurationContext + { + if (!$this->context) { + $this->context = new ConfigurationContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the ConfigurationInstance + * + * @param array|Options $options Optional Arguments + * @return ConfigurationInstance Fetched ConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): ConfigurationInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.ConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/ConfigurationList.php b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationList.php new file mode 100755 index 0000000..cee952e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a ConfigurationContext + */ + public function getContext( + + ): ConfigurationContext + { + return new ConfigurationContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.ConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/ConfigurationOptions.php b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationOptions.php new file mode 100755 index 0000000..00c5537 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationOptions.php @@ -0,0 +1,76 @@ +options['uiVersion'] = $uiVersion; + } + + /** + * The Pinned UI version of the Configuration resource to fetch. + * + * @param string $uiVersion The Pinned UI version of the Configuration resource to fetch. + * @return $this Fluent Builder + */ + public function setUiVersion(string $uiVersion): self + { + $this->options['uiVersion'] = $uiVersion; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchConfigurationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/ConfigurationPage.php b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationPage.php new file mode 100755 index 0000000..530f24e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/ConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConfigurationInstance \Twilio\Rest\FlexApi\V1\ConfigurationInstance + */ + public function buildInstance(array $payload): ConfigurationInstance + { + return new ConfigurationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.ConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/FlexFlowContext.php b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowContext.php new file mode 100755 index 0000000..4e90ec4 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowContext.php @@ -0,0 +1,156 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/FlexFlows/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FlexFlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FlexFlowInstance + * + * @return FlexFlowInstance Fetched FlexFlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlexFlowInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FlexFlowInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the FlexFlowInstance + * + * @param array|Options $options Optional Arguments + * @return FlexFlowInstance Updated FlexFlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FlexFlowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ChatServiceSid' => + $options['chatServiceSid'], + 'ChannelType' => + $options['channelType'], + 'ContactIdentity' => + $options['contactIdentity'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'IntegrationType' => + $options['integrationType'], + 'Integration.FlowSid' => + $options['integrationFlowSid'], + 'Integration.Url' => + $options['integrationUrl'], + 'Integration.WorkspaceSid' => + $options['integrationWorkspaceSid'], + 'Integration.WorkflowSid' => + $options['integrationWorkflowSid'], + 'Integration.Channel' => + $options['integrationChannel'], + 'Integration.Timeout' => + $options['integrationTimeout'], + 'Integration.Priority' => + $options['integrationPriority'], + 'Integration.CreationOnMessage' => + Serialize::booleanToString($options['integrationCreationOnMessage']), + 'LongLived' => + Serialize::booleanToString($options['longLived']), + 'JanitorEnabled' => + Serialize::booleanToString($options['janitorEnabled']), + 'Integration.RetryCount' => + $options['integrationRetryCount'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FlexFlowInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.FlexFlowContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/FlexFlowInstance.php b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowInstance.php new file mode 100755 index 0000000..9d613fc --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'chatServiceSid' => Values::array_get($payload, 'chat_service_sid'), + 'channelType' => Values::array_get($payload, 'channel_type'), + 'contactIdentity' => Values::array_get($payload, 'contact_identity'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'integrationType' => Values::array_get($payload, 'integration_type'), + 'integration' => Values::array_get($payload, 'integration'), + 'longLived' => Values::array_get($payload, 'long_lived'), + 'janitorEnabled' => Values::array_get($payload, 'janitor_enabled'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FlexFlowContext Context for this FlexFlowInstance + */ + protected function proxy(): FlexFlowContext + { + if (!$this->context) { + $this->context = new FlexFlowContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FlexFlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FlexFlowInstance + * + * @return FlexFlowInstance Fetched FlexFlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlexFlowInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FlexFlowInstance + * + * @param array|Options $options Optional Arguments + * @return FlexFlowInstance Updated FlexFlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FlexFlowInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.FlexFlowInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/FlexFlowList.php b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowList.php new file mode 100755 index 0000000..6fad68c --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowList.php @@ -0,0 +1,231 @@ +solution = [ + ]; + + $this->uri = '/FlexFlows'; + } + + /** + * Create the FlexFlowInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Flex Flow resource. + * @param string $chatServiceSid The SID of the chat service. + * @param string $channelType + * @param array|Options $options Optional Arguments + * @return FlexFlowInstance Created FlexFlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $chatServiceSid, string $channelType, array $options = []): FlexFlowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'ChatServiceSid' => + $chatServiceSid, + 'ChannelType' => + $channelType, + 'ContactIdentity' => + $options['contactIdentity'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'IntegrationType' => + $options['integrationType'], + 'Integration.FlowSid' => + $options['integrationFlowSid'], + 'Integration.Url' => + $options['integrationUrl'], + 'Integration.WorkspaceSid' => + $options['integrationWorkspaceSid'], + 'Integration.WorkflowSid' => + $options['integrationWorkflowSid'], + 'Integration.Channel' => + $options['integrationChannel'], + 'Integration.Timeout' => + $options['integrationTimeout'], + 'Integration.Priority' => + $options['integrationPriority'], + 'Integration.CreationOnMessage' => + Serialize::booleanToString($options['integrationCreationOnMessage']), + 'LongLived' => + Serialize::booleanToString($options['longLived']), + 'JanitorEnabled' => + Serialize::booleanToString($options['janitorEnabled']), + 'Integration.RetryCount' => + $options['integrationRetryCount'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FlexFlowInstance( + $this->version, + $payload + ); + } + + + /** + * Reads FlexFlowInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FlexFlowInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams FlexFlowInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FlexFlowInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FlexFlowPage Page of FlexFlowInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FlexFlowPage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FlexFlowPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FlexFlowInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FlexFlowPage Page of FlexFlowInstance + */ + public function getPage(string $targetUrl): FlexFlowPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FlexFlowPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FlexFlowContext + * + * @param string $sid The SID of the Flex Flow resource to delete. + */ + public function getContext( + string $sid + + ): FlexFlowContext + { + return new FlexFlowContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.FlexFlowList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/FlexFlowOptions.php b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowOptions.php new file mode 100755 index 0000000..423f891 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowOptions.php @@ -0,0 +1,700 @@ +options['contactIdentity'] = $contactIdentity; + $this->options['enabled'] = $enabled; + $this->options['integrationType'] = $integrationType; + $this->options['integrationFlowSid'] = $integrationFlowSid; + $this->options['integrationUrl'] = $integrationUrl; + $this->options['integrationWorkspaceSid'] = $integrationWorkspaceSid; + $this->options['integrationWorkflowSid'] = $integrationWorkflowSid; + $this->options['integrationChannel'] = $integrationChannel; + $this->options['integrationTimeout'] = $integrationTimeout; + $this->options['integrationPriority'] = $integrationPriority; + $this->options['integrationCreationOnMessage'] = $integrationCreationOnMessage; + $this->options['longLived'] = $longLived; + $this->options['janitorEnabled'] = $janitorEnabled; + $this->options['integrationRetryCount'] = $integrationRetryCount; + } + + /** + * The channel contact's Identity. + * + * @param string $contactIdentity The channel contact's Identity. + * @return $this Fluent Builder + */ + public function setContactIdentity(string $contactIdentity): self + { + $this->options['contactIdentity'] = $contactIdentity; + return $this; + } + + /** + * Whether the new Flex Flow is enabled. + * + * @param bool $enabled Whether the new Flex Flow is enabled. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * @param string $integrationType + * @return $this Fluent Builder + */ + public function setIntegrationType(string $integrationType): self + { + $this->options['integrationType'] = $integrationType; + return $this; + } + + /** + * The SID of the Studio Flow. Required when `integrationType` is `studio`. + * + * @param string $integrationFlowSid The SID of the Studio Flow. Required when `integrationType` is `studio`. + * @return $this Fluent Builder + */ + public function setIntegrationFlowSid(string $integrationFlowSid): self + { + $this->options['integrationFlowSid'] = $integrationFlowSid; + return $this; + } + + /** + * The URL of the external webhook. Required when `integrationType` is `external`. + * + * @param string $integrationUrl The URL of the external webhook. Required when `integrationType` is `external`. + * @return $this Fluent Builder + */ + public function setIntegrationUrl(string $integrationUrl): self + { + $this->options['integrationUrl'] = $integrationUrl; + return $this; + } + + /** + * The Workspace SID for a new Task. Required when `integrationType` is `task`. + * + * @param string $integrationWorkspaceSid The Workspace SID for a new Task. Required when `integrationType` is `task`. + * @return $this Fluent Builder + */ + public function setIntegrationWorkspaceSid(string $integrationWorkspaceSid): self + { + $this->options['integrationWorkspaceSid'] = $integrationWorkspaceSid; + return $this; + } + + /** + * The Workflow SID for a new Task. Required when `integrationType` is `task`. + * + * @param string $integrationWorkflowSid The Workflow SID for a new Task. Required when `integrationType` is `task`. + * @return $this Fluent Builder + */ + public function setIntegrationWorkflowSid(string $integrationWorkflowSid): self + { + $this->options['integrationWorkflowSid'] = $integrationWorkflowSid; + return $this; + } + + /** + * The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + * + * @param string $integrationChannel The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + * @return $this Fluent Builder + */ + public function setIntegrationChannel(string $integrationChannel): self + { + $this->options['integrationChannel'] = $integrationChannel; + return $this; + } + + /** + * The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + * + * @param int $integrationTimeout The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationTimeout(int $integrationTimeout): self + { + $this->options['integrationTimeout'] = $integrationTimeout; + return $this; + } + + /** + * The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + * + * @param int $integrationPriority The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationPriority(int $integrationPriority): self + { + $this->options['integrationPriority'] = $integrationPriority; + return $this; + } + + /** + * In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + * + * @param bool $integrationCreationOnMessage In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + * @return $this Fluent Builder + */ + public function setIntegrationCreationOnMessage(bool $integrationCreationOnMessage): self + { + $this->options['integrationCreationOnMessage'] = $integrationCreationOnMessage; + return $this; + } + + /** + * When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + * + * @param bool $longLived When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + * @return $this Fluent Builder + */ + public function setLongLived(bool $longLived): self + { + $this->options['longLived'] = $longLived; + return $this; + } + + /** + * When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + * + * @param bool $janitorEnabled When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + * @return $this Fluent Builder + */ + public function setJanitorEnabled(bool $janitorEnabled): self + { + $this->options['janitorEnabled'] = $janitorEnabled; + return $this; + } + + /** + * The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + * + * @param int $integrationRetryCount The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationRetryCount(int $integrationRetryCount): self + { + $this->options['integrationRetryCount'] = $integrationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateFlexFlowOptions ' . $options . ']'; + } +} + + + +class ReadFlexFlowOptions extends Options + { + /** + * @param string $friendlyName The `friendly_name` of the Flex Flow resources to read. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The `friendly_name` of the Flex Flow resources to read. + * + * @param string $friendlyName The `friendly_name` of the Flex Flow resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadFlexFlowOptions ' . $options . ']'; + } +} + +class UpdateFlexFlowOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the Flex Flow resource. + * @param string $chatServiceSid The SID of the chat service. + * @param string $channelType + * @param string $contactIdentity The channel contact's Identity. + * @param bool $enabled Whether the new Flex Flow is enabled. + * @param string $integrationType + * @param string $integrationFlowSid The SID of the Studio Flow. Required when `integrationType` is `studio`. + * @param string $integrationUrl The URL of the external webhook. Required when `integrationType` is `external`. + * @param string $integrationWorkspaceSid The Workspace SID for a new Task. Required when `integrationType` is `task`. + * @param string $integrationWorkflowSid The Workflow SID for a new Task. Required when `integrationType` is `task`. + * @param string $integrationChannel The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + * @param int $integrationTimeout The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + * @param int $integrationPriority The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + * @param bool $integrationCreationOnMessage In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + * @param bool $longLived When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + * @param bool $janitorEnabled When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + * @param int $integrationRetryCount The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $chatServiceSid = Values::NONE, + string $channelType = Values::NONE, + string $contactIdentity = Values::NONE, + bool $enabled = Values::BOOL_NONE, + string $integrationType = Values::NONE, + string $integrationFlowSid = Values::NONE, + string $integrationUrl = Values::NONE, + string $integrationWorkspaceSid = Values::NONE, + string $integrationWorkflowSid = Values::NONE, + string $integrationChannel = Values::NONE, + int $integrationTimeout = Values::INT_NONE, + int $integrationPriority = Values::INT_NONE, + bool $integrationCreationOnMessage = Values::BOOL_NONE, + bool $longLived = Values::BOOL_NONE, + bool $janitorEnabled = Values::BOOL_NONE, + int $integrationRetryCount = Values::INT_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['chatServiceSid'] = $chatServiceSid; + $this->options['channelType'] = $channelType; + $this->options['contactIdentity'] = $contactIdentity; + $this->options['enabled'] = $enabled; + $this->options['integrationType'] = $integrationType; + $this->options['integrationFlowSid'] = $integrationFlowSid; + $this->options['integrationUrl'] = $integrationUrl; + $this->options['integrationWorkspaceSid'] = $integrationWorkspaceSid; + $this->options['integrationWorkflowSid'] = $integrationWorkflowSid; + $this->options['integrationChannel'] = $integrationChannel; + $this->options['integrationTimeout'] = $integrationTimeout; + $this->options['integrationPriority'] = $integrationPriority; + $this->options['integrationCreationOnMessage'] = $integrationCreationOnMessage; + $this->options['longLived'] = $longLived; + $this->options['janitorEnabled'] = $janitorEnabled; + $this->options['integrationRetryCount'] = $integrationRetryCount; + } + + /** + * A descriptive string that you create to describe the Flex Flow resource. + * + * @param string $friendlyName A descriptive string that you create to describe the Flex Flow resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the chat service. + * + * @param string $chatServiceSid The SID of the chat service. + * @return $this Fluent Builder + */ + public function setChatServiceSid(string $chatServiceSid): self + { + $this->options['chatServiceSid'] = $chatServiceSid; + return $this; + } + + /** + * @param string $channelType + * @return $this Fluent Builder + */ + public function setChannelType(string $channelType): self + { + $this->options['channelType'] = $channelType; + return $this; + } + + /** + * The channel contact's Identity. + * + * @param string $contactIdentity The channel contact's Identity. + * @return $this Fluent Builder + */ + public function setContactIdentity(string $contactIdentity): self + { + $this->options['contactIdentity'] = $contactIdentity; + return $this; + } + + /** + * Whether the new Flex Flow is enabled. + * + * @param bool $enabled Whether the new Flex Flow is enabled. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * @param string $integrationType + * @return $this Fluent Builder + */ + public function setIntegrationType(string $integrationType): self + { + $this->options['integrationType'] = $integrationType; + return $this; + } + + /** + * The SID of the Studio Flow. Required when `integrationType` is `studio`. + * + * @param string $integrationFlowSid The SID of the Studio Flow. Required when `integrationType` is `studio`. + * @return $this Fluent Builder + */ + public function setIntegrationFlowSid(string $integrationFlowSid): self + { + $this->options['integrationFlowSid'] = $integrationFlowSid; + return $this; + } + + /** + * The URL of the external webhook. Required when `integrationType` is `external`. + * + * @param string $integrationUrl The URL of the external webhook. Required when `integrationType` is `external`. + * @return $this Fluent Builder + */ + public function setIntegrationUrl(string $integrationUrl): self + { + $this->options['integrationUrl'] = $integrationUrl; + return $this; + } + + /** + * The Workspace SID for a new Task. Required when `integrationType` is `task`. + * + * @param string $integrationWorkspaceSid The Workspace SID for a new Task. Required when `integrationType` is `task`. + * @return $this Fluent Builder + */ + public function setIntegrationWorkspaceSid(string $integrationWorkspaceSid): self + { + $this->options['integrationWorkspaceSid'] = $integrationWorkspaceSid; + return $this; + } + + /** + * The Workflow SID for a new Task. Required when `integrationType` is `task`. + * + * @param string $integrationWorkflowSid The Workflow SID for a new Task. Required when `integrationType` is `task`. + * @return $this Fluent Builder + */ + public function setIntegrationWorkflowSid(string $integrationWorkflowSid): self + { + $this->options['integrationWorkflowSid'] = $integrationWorkflowSid; + return $this; + } + + /** + * The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + * + * @param string $integrationChannel The Task Channel SID (TCXXXX) or unique name (e.g., `sms`) to use for the Task that will be created. Applicable and required when `integrationType` is `task`. The default value is `default`. + * @return $this Fluent Builder + */ + public function setIntegrationChannel(string $integrationChannel): self + { + $this->options['integrationChannel'] = $integrationChannel; + return $this; + } + + /** + * The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + * + * @param int $integrationTimeout The Task timeout in seconds for a new Task. Default is 86,400 seconds (24 hours). Optional when `integrationType` is `task`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationTimeout(int $integrationTimeout): self + { + $this->options['integrationTimeout'] = $integrationTimeout; + return $this; + } + + /** + * The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + * + * @param int $integrationPriority The Task priority of a new Task. The default priority is 0. Optional when `integrationType` is `task`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationPriority(int $integrationPriority): self + { + $this->options['integrationPriority'] = $integrationPriority; + return $this; + } + + /** + * In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + * + * @param bool $integrationCreationOnMessage In the context of outbound messaging, defines whether to create a Task immediately (and therefore reserve the conversation to current agent), or delay Task creation until the customer sends the first response. Set to false to create immediately, true to delay Task creation. This setting is only applicable for outbound messaging. + * @return $this Fluent Builder + */ + public function setIntegrationCreationOnMessage(bool $integrationCreationOnMessage): self + { + $this->options['integrationCreationOnMessage'] = $integrationCreationOnMessage; + return $this; + } + + /** + * When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + * + * @param bool $longLived When enabled, Flex will keep the chat channel active so that it may be used for subsequent interactions with a contact identity. Defaults to `false`. + * @return $this Fluent Builder + */ + public function setLongLived(bool $longLived): self + { + $this->options['longLived'] = $longLived; + return $this; + } + + /** + * When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + * + * @param bool $janitorEnabled When enabled, the Messaging Channel Janitor will remove active Proxy sessions if the associated Task is deleted outside of the Flex UI. Defaults to `false`. + * @return $this Fluent Builder + */ + public function setJanitorEnabled(bool $janitorEnabled): self + { + $this->options['janitorEnabled'] = $janitorEnabled; + return $this; + } + + /** + * The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + * + * @param int $integrationRetryCount The number of times to retry the Studio Flow or webhook in case of failure. Takes integer values from 0 to 3 with the default being 3. Optional when `integrationType` is `studio` or `external`, not applicable otherwise. + * @return $this Fluent Builder + */ + public function setIntegrationRetryCount(int $integrationRetryCount): self + { + $this->options['integrationRetryCount'] = $integrationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateFlexFlowOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/FlexFlowPage.php b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowPage.php new file mode 100755 index 0000000..55fbc49 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/FlexFlowPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlexFlowInstance \Twilio\Rest\FlexApi\V1\FlexFlowInstance + */ + public function buildInstance(array $payload): FlexFlowInstance + { + return new FlexFlowInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.FlexFlowPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentInstance.php new file mode 100755 index 0000000..c60ba33 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentInstance.php @@ -0,0 +1,102 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assessmentId' => Values::array_get($payload, 'assessment_id'), + 'comment' => Values::array_get($payload, 'comment'), + 'offset' => Values::array_get($payload, 'offset'), + 'report' => Values::array_get($payload, 'report'), + 'weight' => Values::array_get($payload, 'weight'), + 'agentId' => Values::array_get($payload, 'agent_id'), + 'segmentId' => Values::array_get($payload, 'segment_id'), + 'userName' => Values::array_get($payload, 'user_name'), + 'userEmail' => Values::array_get($payload, 'user_email'), + 'timestamp' => Values::array_get($payload, 'timestamp'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsAssessmentsCommentInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentList.php new file mode 100755 index 0000000..b36ce16 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentList.php @@ -0,0 +1,207 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Assessments/Comments'; + } + + /** + * Create the InsightsAssessmentsCommentInstance + * + * @param string $categoryId The ID of the category + * @param string $categoryName The name of the category + * @param string $comment The Assessment comment. + * @param string $segmentId The id of the segment. + * @param string $userName The name of the user. + * @param string $userEmail The email id of the user. + * @param string $agentId The id of the agent. + * @param string $offset The offset + * @param array|Options $options Optional Arguments + * @return InsightsAssessmentsCommentInstance Created InsightsAssessmentsCommentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $categoryId, string $categoryName, string $comment, string $segmentId, string $userName, string $userEmail, string $agentId, string $offset, array $options = []): InsightsAssessmentsCommentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CategoryId' => + $categoryId, + 'CategoryName' => + $categoryName, + 'Comment' => + $comment, + 'SegmentId' => + $segmentId, + 'UserName' => + $userName, + 'UserEmail' => + $userEmail, + 'AgentId' => + $agentId, + 'Offset' => + $offset, + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new InsightsAssessmentsCommentInstance( + $this->version, + $payload + ); + } + + + /** + * Reads InsightsAssessmentsCommentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsAssessmentsCommentInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InsightsAssessmentsCommentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsAssessmentsCommentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsAssessmentsCommentPage Page of InsightsAssessmentsCommentInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsAssessmentsCommentPage + { + $options = new Values($options); + + $params = Values::of([ + 'SegmentId' => + $options['segmentId'], + 'AgentId' => + $options['agentId'], + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsAssessmentsCommentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsAssessmentsCommentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsAssessmentsCommentPage Page of InsightsAssessmentsCommentInstance + */ + public function getPage(string $targetUrl): InsightsAssessmentsCommentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsAssessmentsCommentPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsAssessmentsCommentList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentOptions.php new file mode 100755 index 0000000..7a52ca2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentOptions.php @@ -0,0 +1,164 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateInsightsAssessmentsCommentOptions ' . $options . ']'; + } +} + +class ReadInsightsAssessmentsCommentOptions extends Options + { + /** + * @param string $segmentId The id of the segment. + * @param string $agentId The id of the agent. + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $segmentId = Values::NONE, + string $agentId = Values::NONE, + string $token = Values::NONE + + ) { + $this->options['segmentId'] = $segmentId; + $this->options['agentId'] = $agentId; + $this->options['token'] = $token; + } + + /** + * The id of the segment. + * + * @param string $segmentId The id of the segment. + * @return $this Fluent Builder + */ + public function setSegmentId(string $segmentId): self + { + $this->options['segmentId'] = $segmentId; + return $this; + } + + /** + * The id of the agent. + * + * @param string $agentId The id of the agent. + * @return $this Fluent Builder + */ + public function setAgentId(string $agentId): self + { + $this->options['agentId'] = $agentId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsAssessmentsCommentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentPage.php new file mode 100755 index 0000000..e4a7618 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsAssessmentsCommentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsAssessmentsCommentInstance \Twilio\Rest\FlexApi\V1\InsightsAssessmentsCommentInstance + */ + public function buildInstance(array $payload): InsightsAssessmentsCommentInstance + { + return new InsightsAssessmentsCommentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsAssessmentsCommentPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsInstance.php new file mode 100755 index 0000000..ab121a2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsInstance.php @@ -0,0 +1,86 @@ +properties = [ + 'accountId' => Values::array_get($payload, 'account_id'), + 'conversationId' => Values::array_get($payload, 'conversation_id'), + 'segmentCount' => Values::array_get($payload, 'segment_count'), + 'segments' => Values::array_get($payload, 'segments'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsConversationsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsList.php new file mode 100755 index 0000000..69a09f2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsList.php @@ -0,0 +1,154 @@ +solution = [ + ]; + + $this->uri = '/Insights/Conversations'; + } + + /** + * Reads InsightsConversationsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsConversationsInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InsightsConversationsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsConversationsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsConversationsPage Page of InsightsConversationsInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsConversationsPage + { + $options = new Values($options); + + $params = Values::of([ + 'SegmentId' => + $options['segmentId'], + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsConversationsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsConversationsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsConversationsPage Page of InsightsConversationsInstance + */ + public function getPage(string $targetUrl): InsightsConversationsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsConversationsPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsConversationsList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsOptions.php new file mode 100755 index 0000000..96de182 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsOptions.php @@ -0,0 +1,94 @@ +options['segmentId'] = $segmentId; + $this->options['token'] = $token; + } + + /** + * Unique Id of the segment for which conversation details needs to be fetched + * + * @param string $segmentId Unique Id of the segment for which conversation details needs to be fetched + * @return $this Fluent Builder + */ + public function setSegmentId(string $segmentId): self + { + $this->options['segmentId'] = $segmentId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsConversationsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsPage.php new file mode 100755 index 0000000..7dc82b3 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsConversationsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsConversationsInstance \Twilio\Rest\FlexApi\V1\InsightsConversationsInstance + */ + public function buildInstance(array $payload): InsightsConversationsInstance + { + return new InsightsConversationsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsConversationsPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryContext.php new file mode 100755 index 0000000..70d832b --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryContext.php @@ -0,0 +1,112 @@ +solution = [ + 'categoryId' => + $categoryId, + ]; + + $this->uri = '/Insights/QM/Categories/' . \rawurlencode($categoryId) + .''; + } + + /** + * Delete the InsightsQuestionnairesCategoryInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Update the InsightsQuestionnairesCategoryInstance + * + * @param string $name The name of this category. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesCategoryInstance Updated InsightsQuestionnairesCategoryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $name, array $options = []): InsightsQuestionnairesCategoryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Name' => + $name, + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesCategoryInstance( + $this->version, + $payload, + $this->solution['categoryId'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesCategoryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryInstance.php new file mode 100755 index 0000000..5d477aa --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryInstance.php @@ -0,0 +1,137 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'categoryId' => Values::array_get($payload, 'category_id'), + 'name' => Values::array_get($payload, 'name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['categoryId' => $categoryId ?: $this->properties['categoryId'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsQuestionnairesCategoryContext Context for this InsightsQuestionnairesCategoryInstance + */ + protected function proxy(): InsightsQuestionnairesCategoryContext + { + if (!$this->context) { + $this->context = new InsightsQuestionnairesCategoryContext( + $this->version, + $this->solution['categoryId'] + ); + } + + return $this->context; + } + + /** + * Delete the InsightsQuestionnairesCategoryInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Update the InsightsQuestionnairesCategoryInstance + * + * @param string $name The name of this category. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesCategoryInstance Updated InsightsQuestionnairesCategoryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $name, array $options = []): InsightsQuestionnairesCategoryInstance + { + + return $this->proxy()->update($name, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesCategoryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryList.php new file mode 100755 index 0000000..03639e9 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryList.php @@ -0,0 +1,194 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Categories'; + } + + /** + * Create the InsightsQuestionnairesCategoryInstance + * + * @param string $name The name of this category. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesCategoryInstance Created InsightsQuestionnairesCategoryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $name, array $options = []): InsightsQuestionnairesCategoryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Name' => + $name, + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesCategoryInstance( + $this->version, + $payload + ); + } + + + /** + * Reads InsightsQuestionnairesCategoryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsQuestionnairesCategoryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InsightsQuestionnairesCategoryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsQuestionnairesCategoryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsQuestionnairesCategoryPage Page of InsightsQuestionnairesCategoryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsQuestionnairesCategoryPage + { + + $params = Values::of([ + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsQuestionnairesCategoryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsQuestionnairesCategoryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsQuestionnairesCategoryPage Page of InsightsQuestionnairesCategoryInstance + */ + public function getPage(string $targetUrl): InsightsQuestionnairesCategoryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsQuestionnairesCategoryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InsightsQuestionnairesCategoryContext + * + * @param string $categoryId The ID of the category to be deleted + */ + public function getContext( + string $categoryId + + ): InsightsQuestionnairesCategoryContext + { + return new InsightsQuestionnairesCategoryContext( + $this->version, + $categoryId + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesCategoryList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryOptions.php new file mode 100755 index 0000000..427562e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryOptions.php @@ -0,0 +1,232 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateInsightsQuestionnairesCategoryOptions ' . $options . ']'; + } +} + +class DeleteInsightsQuestionnairesCategoryOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.DeleteInsightsQuestionnairesCategoryOptions ' . $options . ']'; + } +} + +class ReadInsightsQuestionnairesCategoryOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsQuestionnairesCategoryOptions ' . $options . ']'; + } +} + +class UpdateInsightsQuestionnairesCategoryOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateInsightsQuestionnairesCategoryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryPage.php new file mode 100755 index 0000000..bdc1793 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesCategoryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsQuestionnairesCategoryInstance \Twilio\Rest\FlexApi\V1\InsightsQuestionnairesCategoryInstance + */ + public function buildInstance(array $payload): InsightsQuestionnairesCategoryInstance + { + return new InsightsQuestionnairesCategoryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesCategoryPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesContext.php new file mode 100755 index 0000000..cb17beb --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesContext.php @@ -0,0 +1,143 @@ +solution = [ + 'id' => + $id, + ]; + + $this->uri = '/Insights/QM/Questionnaires/' . \rawurlencode($id) + .''; + } + + /** + * Delete the InsightsQuestionnairesInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the InsightsQuestionnairesInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesInstance Fetched InsightsQuestionnairesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsQuestionnairesInstance + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->fetch('GET', $this->uri, [], [], $headers); + + return new InsightsQuestionnairesInstance( + $this->version, + $payload, + $this->solution['id'] + ); + } + + + /** + * Update the InsightsQuestionnairesInstance + * + * @param bool $active The flag to enable or disable questionnaire + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesInstance Updated InsightsQuestionnairesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $active, array $options = []): InsightsQuestionnairesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Active' => + Serialize::booleanToString($active), + 'Name' => + $options['name'], + 'Description' => + $options['description'], + 'QuestionIds' => + Serialize::map($options['questionIds'], function ($e) { return $e; }), + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesInstance( + $this->version, + $payload, + $this->solution['id'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesInstance.php new file mode 100755 index 0000000..f9ab4e7 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'id' => Values::array_get($payload, 'id'), + 'name' => Values::array_get($payload, 'name'), + 'description' => Values::array_get($payload, 'description'), + 'active' => Values::array_get($payload, 'active'), + 'questions' => Values::array_get($payload, 'questions'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['id' => $id ?: $this->properties['id'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsQuestionnairesContext Context for this InsightsQuestionnairesInstance + */ + protected function proxy(): InsightsQuestionnairesContext + { + if (!$this->context) { + $this->context = new InsightsQuestionnairesContext( + $this->version, + $this->solution['id'] + ); + } + + return $this->context; + } + + /** + * Delete the InsightsQuestionnairesInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the InsightsQuestionnairesInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesInstance Fetched InsightsQuestionnairesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsQuestionnairesInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Update the InsightsQuestionnairesInstance + * + * @param bool $active The flag to enable or disable questionnaire + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesInstance Updated InsightsQuestionnairesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $active, array $options = []): InsightsQuestionnairesInstance + { + + return $this->proxy()->update($active, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesList.php new file mode 100755 index 0000000..7d9ba32 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesList.php @@ -0,0 +1,207 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Questionnaires'; + } + + /** + * Create the InsightsQuestionnairesInstance + * + * @param string $name The name of this questionnaire + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesInstance Created InsightsQuestionnairesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $name, array $options = []): InsightsQuestionnairesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Name' => + $name, + 'Description' => + $options['description'], + 'Active' => + Serialize::booleanToString($options['active']), + 'QuestionIds' => + Serialize::map($options['questionIds'], function ($e) { return $e; }), + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesInstance( + $this->version, + $payload + ); + } + + + /** + * Reads InsightsQuestionnairesInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsQuestionnairesInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InsightsQuestionnairesInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsQuestionnairesInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsQuestionnairesPage Page of InsightsQuestionnairesInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsQuestionnairesPage + { + $options = new Values($options); + + $params = Values::of([ + 'IncludeInactive' => + Serialize::booleanToString($options['includeInactive']), + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsQuestionnairesPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsQuestionnairesInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsQuestionnairesPage Page of InsightsQuestionnairesInstance + */ + public function getPage(string $targetUrl): InsightsQuestionnairesPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsQuestionnairesPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InsightsQuestionnairesContext + * + * @param string $id The unique ID of the questionnaire + */ + public function getContext( + string $id + + ): InsightsQuestionnairesContext + { + return new InsightsQuestionnairesContext( + $this->version, + $id + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesOptions.php new file mode 100755 index 0000000..af0386f --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesOptions.php @@ -0,0 +1,410 @@ +options['description'] = $description; + $this->options['active'] = $active; + $this->options['questionIds'] = $questionIds; + $this->options['token'] = $token; + } + + /** + * The description of this questionnaire + * + * @param string $description The description of this questionnaire + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * The flag to enable or disable questionnaire + * + * @param bool $active The flag to enable or disable questionnaire + * @return $this Fluent Builder + */ + public function setActive(bool $active): self + { + $this->options['active'] = $active; + return $this; + } + + /** + * The list of questions ids under a questionnaire + * + * @param string[] $questionIds The list of questions ids under a questionnaire + * @return $this Fluent Builder + */ + public function setQuestionIds(array $questionIds): self + { + $this->options['questionIds'] = $questionIds; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateInsightsQuestionnairesOptions ' . $options . ']'; + } +} + +class DeleteInsightsQuestionnairesOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.DeleteInsightsQuestionnairesOptions ' . $options . ']'; + } +} + +class FetchInsightsQuestionnairesOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchInsightsQuestionnairesOptions ' . $options . ']'; + } +} + +class ReadInsightsQuestionnairesOptions extends Options + { + /** + * @param bool $includeInactive Flag indicating whether to include inactive questionnaires or not + * @param string $token The Token HTTP request header + */ + public function __construct( + + bool $includeInactive = Values::BOOL_NONE, + string $token = Values::NONE + + ) { + $this->options['includeInactive'] = $includeInactive; + $this->options['token'] = $token; + } + + /** + * Flag indicating whether to include inactive questionnaires or not + * + * @param bool $includeInactive Flag indicating whether to include inactive questionnaires or not + * @return $this Fluent Builder + */ + public function setIncludeInactive(bool $includeInactive): self + { + $this->options['includeInactive'] = $includeInactive; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsQuestionnairesOptions ' . $options . ']'; + } +} + +class UpdateInsightsQuestionnairesOptions extends Options + { + /** + * @param string $name The name of this questionnaire + * @param string $description The description of this questionnaire + * @param string[] $questionIds The list of questions ids under a questionnaire + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $name = Values::NONE, + string $description = Values::NONE, + array $questionIds = Values::ARRAY_NONE, + string $token = Values::NONE + + ) { + $this->options['name'] = $name; + $this->options['description'] = $description; + $this->options['questionIds'] = $questionIds; + $this->options['token'] = $token; + } + + /** + * The name of this questionnaire + * + * @param string $name The name of this questionnaire + * @return $this Fluent Builder + */ + public function setName(string $name): self + { + $this->options['name'] = $name; + return $this; + } + + /** + * The description of this questionnaire + * + * @param string $description The description of this questionnaire + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * The list of questions ids under a questionnaire + * + * @param string[] $questionIds The list of questions ids under a questionnaire + * @return $this Fluent Builder + */ + public function setQuestionIds(array $questionIds): self + { + $this->options['questionIds'] = $questionIds; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateInsightsQuestionnairesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesPage.php new file mode 100755 index 0000000..c60d8e3 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsQuestionnairesInstance \Twilio\Rest\FlexApi\V1\InsightsQuestionnairesInstance + */ + public function buildInstance(array $payload): InsightsQuestionnairesInstance + { + return new InsightsQuestionnairesInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionContext.php new file mode 100755 index 0000000..e9d4859 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionContext.php @@ -0,0 +1,121 @@ +solution = [ + 'questionId' => + $questionId, + ]; + + $this->uri = '/Insights/QM/Questions/' . \rawurlencode($questionId) + .''; + } + + /** + * Delete the InsightsQuestionnairesQuestionInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Update the InsightsQuestionnairesQuestionInstance + * + * @param bool $allowNa The flag to enable for disable NA for answer. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesQuestionInstance Updated InsightsQuestionnairesQuestionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $allowNa, array $options = []): InsightsQuestionnairesQuestionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AllowNa' => + Serialize::booleanToString($allowNa), + 'CategoryId' => + $options['categoryId'], + 'Question' => + $options['question'], + 'Description' => + $options['description'], + 'AnswerSetId' => + $options['answerSetId'], + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesQuestionInstance( + $this->version, + $payload, + $this->solution['questionId'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesQuestionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionInstance.php new file mode 100755 index 0000000..105a065 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'questionId' => Values::array_get($payload, 'question_id'), + 'question' => Values::array_get($payload, 'question'), + 'description' => Values::array_get($payload, 'description'), + 'category' => Values::array_get($payload, 'category'), + 'answerSetId' => Values::array_get($payload, 'answer_set_id'), + 'allowNa' => Values::array_get($payload, 'allow_na'), + 'usage' => Values::array_get($payload, 'usage'), + 'answerSet' => Values::array_get($payload, 'answer_set'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['questionId' => $questionId ?: $this->properties['questionId'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsQuestionnairesQuestionContext Context for this InsightsQuestionnairesQuestionInstance + */ + protected function proxy(): InsightsQuestionnairesQuestionContext + { + if (!$this->context) { + $this->context = new InsightsQuestionnairesQuestionContext( + $this->version, + $this->solution['questionId'] + ); + } + + return $this->context; + } + + /** + * Delete the InsightsQuestionnairesQuestionInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Update the InsightsQuestionnairesQuestionInstance + * + * @param bool $allowNa The flag to enable for disable NA for answer. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesQuestionInstance Updated InsightsQuestionnairesQuestionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $allowNa, array $options = []): InsightsQuestionnairesQuestionInstance + { + + return $this->proxy()->update($allowNa, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsQuestionnairesQuestionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionList.php new file mode 100755 index 0000000..65b8fe1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionList.php @@ -0,0 +1,212 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Questions'; + } + + /** + * Create the InsightsQuestionnairesQuestionInstance + * + * @param string $categoryId The ID of the category + * @param string $question The question. + * @param string $answerSetId The answer_set for the question. + * @param bool $allowNa The flag to enable for disable NA for answer. + * @param array|Options $options Optional Arguments + * @return InsightsQuestionnairesQuestionInstance Created InsightsQuestionnairesQuestionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $categoryId, string $question, string $answerSetId, bool $allowNa, array $options = []): InsightsQuestionnairesQuestionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CategoryId' => + $categoryId, + 'Question' => + $question, + 'AnswerSetId' => + $answerSetId, + 'AllowNa' => + Serialize::booleanToString($allowNa), + 'Description' => + $options['description'], + ]); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new InsightsQuestionnairesQuestionInstance( + $this->version, + $payload + ); + } + + + /** + * Reads InsightsQuestionnairesQuestionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsQuestionnairesQuestionInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InsightsQuestionnairesQuestionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsQuestionnairesQuestionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsQuestionnairesQuestionPage Page of InsightsQuestionnairesQuestionInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsQuestionnairesQuestionPage + { + $options = new Values($options); + + $params = Values::of([ + 'CategoryId' => + Serialize::map($options['categoryId'], function ($e) { return $e; }), + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsQuestionnairesQuestionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsQuestionnairesQuestionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsQuestionnairesQuestionPage Page of InsightsQuestionnairesQuestionInstance + */ + public function getPage(string $targetUrl): InsightsQuestionnairesQuestionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsQuestionnairesQuestionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InsightsQuestionnairesQuestionContext + * + * @param string $questionId The unique ID of the question + */ + public function getContext( + string $questionId + + ): InsightsQuestionnairesQuestionContext + { + return new InsightsQuestionnairesQuestionContext( + $this->version, + $questionId + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesQuestionList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionOptions.php new file mode 100755 index 0000000..7686a99 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionOptions.php @@ -0,0 +1,340 @@ +options['description'] = $description; + $this->options['token'] = $token; + } + + /** + * The description for the question. + * + * @param string $description The description for the question. + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateInsightsQuestionnairesQuestionOptions ' . $options . ']'; + } +} + +class DeleteInsightsQuestionnairesQuestionOptions extends Options + { + /** + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $token = Values::NONE + + ) { + $this->options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.DeleteInsightsQuestionnairesQuestionOptions ' . $options . ']'; + } +} + +class ReadInsightsQuestionnairesQuestionOptions extends Options + { + /** + * @param string[] $categoryId The list of category IDs + * @param string $token The Token HTTP request header + */ + public function __construct( + + array $categoryId = Values::ARRAY_NONE, + string $token = Values::NONE + + ) { + $this->options['categoryId'] = $categoryId; + $this->options['token'] = $token; + } + + /** + * The list of category IDs + * + * @param string[] $categoryId The list of category IDs + * @return $this Fluent Builder + */ + public function setCategoryId(array $categoryId): self + { + $this->options['categoryId'] = $categoryId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsQuestionnairesQuestionOptions ' . $options . ']'; + } +} + +class UpdateInsightsQuestionnairesQuestionOptions extends Options + { + /** + * @param string $categoryId The ID of the category + * @param string $question The question. + * @param string $description The description for the question. + * @param string $answerSetId The answer_set for the question. + * @param string $token The Token HTTP request header + */ + public function __construct( + + string $categoryId = Values::NONE, + string $question = Values::NONE, + string $description = Values::NONE, + string $answerSetId = Values::NONE, + string $token = Values::NONE + + ) { + $this->options['categoryId'] = $categoryId; + $this->options['question'] = $question; + $this->options['description'] = $description; + $this->options['answerSetId'] = $answerSetId; + $this->options['token'] = $token; + } + + /** + * The ID of the category + * + * @param string $categoryId The ID of the category + * @return $this Fluent Builder + */ + public function setCategoryId(string $categoryId): self + { + $this->options['categoryId'] = $categoryId; + return $this; + } + + /** + * The question. + * + * @param string $question The question. + * @return $this Fluent Builder + */ + public function setQuestion(string $question): self + { + $this->options['question'] = $question; + return $this; + } + + /** + * The description for the question. + * + * @param string $description The description for the question. + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * The answer_set for the question. + * + * @param string $answerSetId The answer_set for the question. + * @return $this Fluent Builder + */ + public function setAnswerSetId(string $answerSetId): self + { + $this->options['answerSetId'] = $answerSetId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateInsightsQuestionnairesQuestionOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionPage.php new file mode 100755 index 0000000..25819bb --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsQuestionnairesQuestionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsQuestionnairesQuestionInstance \Twilio\Rest\FlexApi\V1\InsightsQuestionnairesQuestionInstance + */ + public function buildInstance(array $payload): InsightsQuestionnairesQuestionInstance + { + return new InsightsQuestionnairesQuestionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsQuestionnairesQuestionPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsContext.php new file mode 100755 index 0000000..1f88688 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsContext.php @@ -0,0 +1,88 @@ +solution = [ + 'segmentId' => + $segmentId, + ]; + + $this->uri = '/Insights/Segments/' . \rawurlencode($segmentId) + .''; + } + + /** + * Fetch the InsightsSegmentsInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSegmentsInstance Fetched InsightsSegmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsSegmentsInstance + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->fetch('GET', $this->uri, [], [], $headers); + + return new InsightsSegmentsInstance( + $this->version, + $payload, + $this->solution['segmentId'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsSegmentsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsInstance.php new file mode 100755 index 0000000..ffbe0a8 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'segmentId' => Values::array_get($payload, 'segment_id'), + 'externalId' => Values::array_get($payload, 'external_id'), + 'queue' => Values::array_get($payload, 'queue'), + 'externalContact' => Values::array_get($payload, 'external_contact'), + 'externalSegmentLinkId' => Values::array_get($payload, 'external_segment_link_id'), + 'date' => Values::array_get($payload, 'date'), + 'accountId' => Values::array_get($payload, 'account_id'), + 'externalSegmentLink' => Values::array_get($payload, 'external_segment_link'), + 'agentId' => Values::array_get($payload, 'agent_id'), + 'agentPhone' => Values::array_get($payload, 'agent_phone'), + 'agentName' => Values::array_get($payload, 'agent_name'), + 'agentTeamName' => Values::array_get($payload, 'agent_team_name'), + 'agentTeamNameInHierarchy' => Values::array_get($payload, 'agent_team_name_in_hierarchy'), + 'agentLink' => Values::array_get($payload, 'agent_link'), + 'customerPhone' => Values::array_get($payload, 'customer_phone'), + 'customerName' => Values::array_get($payload, 'customer_name'), + 'customerLink' => Values::array_get($payload, 'customer_link'), + 'segmentRecordingOffset' => Values::array_get($payload, 'segment_recording_offset'), + 'media' => Values::array_get($payload, 'media'), + 'assessmentType' => Values::array_get($payload, 'assessment_type'), + 'assessmentPercentage' => Values::array_get($payload, 'assessment_percentage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['segmentId' => $segmentId ?: $this->properties['segmentId'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsSegmentsContext Context for this InsightsSegmentsInstance + */ + protected function proxy(): InsightsSegmentsContext + { + if (!$this->context) { + $this->context = new InsightsSegmentsContext( + $this->version, + $this->solution['segmentId'] + ); + } + + return $this->context; + } + + /** + * Fetch the InsightsSegmentsInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSegmentsInstance Fetched InsightsSegmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsSegmentsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsSegmentsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsList.php new file mode 100755 index 0000000..625a74c --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsList.php @@ -0,0 +1,171 @@ +solution = [ + ]; + + $this->uri = '/Insights/Segments'; + } + + /** + * Reads InsightsSegmentsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InsightsSegmentsInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InsightsSegmentsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InsightsSegmentsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InsightsSegmentsPage Page of InsightsSegmentsInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InsightsSegmentsPage + { + $options = new Values($options); + + $params = Values::of([ + 'ReservationId' => + Serialize::map($options['reservationId'], function ($e) { return $e; }), + 'Token' => + $options['token'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InsightsSegmentsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InsightsSegmentsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InsightsSegmentsPage Page of InsightsSegmentsInstance + */ + public function getPage(string $targetUrl): InsightsSegmentsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InsightsSegmentsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InsightsSegmentsContext + * + * @param string $segmentId To unique id of the segment + */ + public function getContext( + string $segmentId + + ): InsightsSegmentsContext + { + return new InsightsSegmentsContext( + $this->version, + $segmentId + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSegmentsList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsOptions.php new file mode 100755 index 0000000..fbed69d --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsOptions.php @@ -0,0 +1,146 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchInsightsSegmentsOptions ' . $options . ']'; + } +} + +class ReadInsightsSegmentsOptions extends Options + { + /** + * @param string[] $reservationId The list of reservation Ids + * @param string $token The Token HTTP request header + */ + public function __construct( + + array $reservationId = Values::ARRAY_NONE, + string $token = Values::NONE + + ) { + $this->options['reservationId'] = $reservationId; + $this->options['token'] = $token; + } + + /** + * The list of reservation Ids + * + * @param string[] $reservationId The list of reservation Ids + * @return $this Fluent Builder + */ + public function setReservationId(array $reservationId): self + { + $this->options['reservationId'] = $reservationId; + return $this; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.ReadInsightsSegmentsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsPage.php new file mode 100755 index 0000000..baae31f --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSegmentsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsSegmentsInstance \Twilio\Rest\FlexApi\V1\InsightsSegmentsInstance + */ + public function buildInstance(array $payload): InsightsSegmentsInstance + { + return new InsightsSegmentsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSegmentsPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionContext.php new file mode 100755 index 0000000..fa3363f --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionContext.php @@ -0,0 +1,82 @@ +solution = [ + ]; + + $this->uri = '/Insights/Session'; + } + + /** + * Create the InsightsSessionInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSessionInstance Created InsightsSessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): InsightsSessionInstance + { + + $options = new Values($options); + + $headers = Values::of(['Authorization' => $options['authorization']]); + + $payload = $this->version->create('POST', $this->uri, [], [], $headers); + + return new InsightsSessionInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsSessionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionInstance.php new file mode 100755 index 0000000..4ce88b2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'workspaceId' => Values::array_get($payload, 'workspace_id'), + 'sessionExpiry' => Values::array_get($payload, 'session_expiry'), + 'sessionId' => Values::array_get($payload, 'session_id'), + 'baseUrl' => Values::array_get($payload, 'base_url'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsSessionContext Context for this InsightsSessionInstance + */ + protected function proxy(): InsightsSessionContext + { + if (!$this->context) { + $this->context = new InsightsSessionContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Create the InsightsSessionInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSessionInstance Created InsightsSessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): InsightsSessionInstance + { + + return $this->proxy()->create($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsSessionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionList.php new file mode 100755 index 0000000..5ac93d1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a InsightsSessionContext + */ + public function getContext( + + ): InsightsSessionContext + { + return new InsightsSessionContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSessionList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionOptions.php new file mode 100755 index 0000000..46087bf --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionOptions.php @@ -0,0 +1,76 @@ +options['authorization'] = $authorization; + } + + /** + * The Authorization HTTP request header + * + * @param string $authorization The Authorization HTTP request header + * @return $this Fluent Builder + */ + public function setAuthorization(string $authorization): self + { + $this->options['authorization'] = $authorization; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateInsightsSessionOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionPage.php new file mode 100755 index 0000000..468107a --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSessionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsSessionInstance \Twilio\Rest\FlexApi\V1\InsightsSessionInstance + */ + public function buildInstance(array $payload): InsightsSessionInstance + { + return new InsightsSessionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSessionPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsInstance.php new file mode 100755 index 0000000..b810f15 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsInstance.php @@ -0,0 +1,88 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'answerSets' => Values::array_get($payload, 'answer_sets'), + 'answerSetCategories' => Values::array_get($payload, 'answer_set_categories'), + 'notApplicable' => Values::array_get($payload, 'not_applicable'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsAnswerSetsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsList.php new file mode 100755 index 0000000..4842eaa --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsList.php @@ -0,0 +1,77 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Settings/AnswerSets'; + } + + /** + * Fetch the InsightsSettingsAnswerSetsInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSettingsAnswerSetsInstance Fetched InsightsSettingsAnswerSetsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsSettingsAnswerSetsInstance + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->fetch('GET', $this->uri, [], [], $headers); + + return new InsightsSettingsAnswerSetsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsAnswerSetsList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsOptions.php new file mode 100755 index 0000000..06c9688 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsOptions.php @@ -0,0 +1,76 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchInsightsSettingsAnswerSetsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsPage.php new file mode 100755 index 0000000..3eec3c3 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsAnswerSetsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsSettingsAnswerSetsInstance \Twilio\Rest\FlexApi\V1\InsightsSettingsAnswerSetsInstance + */ + public function buildInstance(array $payload): InsightsSettingsAnswerSetsInstance + { + return new InsightsSettingsAnswerSetsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsAnswerSetsPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentInstance.php new file mode 100755 index 0000000..0b32fb2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentInstance.php @@ -0,0 +1,84 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'comments' => Values::array_get($payload, 'comments'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsCommentInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentList.php new file mode 100755 index 0000000..0da084e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentList.php @@ -0,0 +1,77 @@ +solution = [ + ]; + + $this->uri = '/Insights/QM/Settings/CommentTags'; + } + + /** + * Fetch the InsightsSettingsCommentInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsSettingsCommentInstance Fetched InsightsSettingsCommentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsSettingsCommentInstance + { + + $options = new Values($options); + + $headers = Values::of(['Token' => $options['token']]); + + $payload = $this->version->fetch('GET', $this->uri, [], [], $headers); + + return new InsightsSettingsCommentInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsCommentList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentOptions.php new file mode 100755 index 0000000..3fbb5a0 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentOptions.php @@ -0,0 +1,76 @@ +options['token'] = $token; + } + + /** + * The Token HTTP request header + * + * @param string $token The Token HTTP request header + * @return $this Fluent Builder + */ + public function setToken(string $token): self + { + $this->options['token'] = $token; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchInsightsSettingsCommentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentPage.php new file mode 100755 index 0000000..4529e4e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsSettingsCommentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsSettingsCommentInstance \Twilio\Rest\FlexApi\V1\InsightsSettingsCommentInstance + */ + public function buildInstance(array $payload): InsightsSettingsCommentInstance + { + return new InsightsSettingsCommentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsSettingsCommentPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesContext.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesContext.php new file mode 100755 index 0000000..1ce45d1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesContext.php @@ -0,0 +1,82 @@ +solution = [ + ]; + + $this->uri = '/Insights/UserRoles'; + } + + /** + * Fetch the InsightsUserRolesInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsUserRolesInstance Fetched InsightsUserRolesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsUserRolesInstance + { + + $options = new Values($options); + + $headers = Values::of(['Authorization' => $options['authorization']]); + + $payload = $this->version->fetch('GET', $this->uri, [], [], $headers); + + return new InsightsUserRolesInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsUserRolesContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesInstance.php new file mode 100755 index 0000000..c4b0eba --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesInstance.php @@ -0,0 +1,117 @@ +properties = [ + 'roles' => Values::array_get($payload, 'roles'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InsightsUserRolesContext Context for this InsightsUserRolesInstance + */ + protected function proxy(): InsightsUserRolesContext + { + if (!$this->context) { + $this->context = new InsightsUserRolesContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the InsightsUserRolesInstance + * + * @param array|Options $options Optional Arguments + * @return InsightsUserRolesInstance Fetched InsightsUserRolesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): InsightsUserRolesInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InsightsUserRolesInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesList.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesList.php new file mode 100755 index 0000000..9b42ac2 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a InsightsUserRolesContext + */ + public function getContext( + + ): InsightsUserRolesContext + { + return new InsightsUserRolesContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsUserRolesList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesOptions.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesOptions.php new file mode 100755 index 0000000..288d6c6 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesOptions.php @@ -0,0 +1,76 @@ +options['authorization'] = $authorization; + } + + /** + * The Authorization HTTP request header + * + * @param string $authorization The Authorization HTTP request header + * @return $this Fluent Builder + */ + public function setAuthorization(string $authorization): self + { + $this->options['authorization'] = $authorization; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.FetchInsightsUserRolesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesPage.php b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesPage.php new file mode 100755 index 0000000..85ca36c --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InsightsUserRolesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InsightsUserRolesInstance \Twilio\Rest\FlexApi\V1\InsightsUserRolesInstance + */ + public function buildInstance(array $payload): InsightsUserRolesInstance + { + return new InsightsUserRolesInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InsightsUserRolesPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteInstance.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteInstance.php new file mode 100755 index 0000000..450ea52 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteInstance.php @@ -0,0 +1,90 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'interactionSid' => Values::array_get($payload, 'interaction_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'routing' => Values::array_get($payload, 'routing'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['interactionSid' => $interactionSid, 'channelSid' => $channelSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelInviteInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteList.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteList.php new file mode 100755 index 0000000..055c5cb --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInviteList.php @@ -0,0 +1,185 @@ +solution = [ + 'interactionSid' => + $interactionSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Interactions/' . \rawurlencode($interactionSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites'; + } + + /** + * Create the InteractionChannelInviteInstance + * + * @param array $routing The Interaction's routing logic. + * @return InteractionChannelInviteInstance Created InteractionChannelInviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $routing): InteractionChannelInviteInstance + { + + $data = Values::of([ + 'Routing' => + Serialize::jsonObject($routing), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InteractionChannelInviteInstance( + $this->version, + $payload, + $this->solution['interactionSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InteractionChannelInviteInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InteractionChannelInviteInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InteractionChannelInviteInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InteractionChannelInviteInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InteractionChannelInvitePage Page of InteractionChannelInviteInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InteractionChannelInvitePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InteractionChannelInvitePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InteractionChannelInviteInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InteractionChannelInvitePage Page of InteractionChannelInviteInstance + */ + public function getPage(string $targetUrl): InteractionChannelInvitePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InteractionChannelInvitePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelInviteList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInvitePage.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInvitePage.php new file mode 100755 index 0000000..fedcbd1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelInvitePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InteractionChannelInviteInstance \Twilio\Rest\FlexApi\V1\Interaction\InteractionChannel\InteractionChannelInviteInstance + */ + public function buildInstance(array $payload): InteractionChannelInviteInstance + { + return new InteractionChannelInviteInstance($this->version, $payload, $this->solution['interactionSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelInvitePage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantContext.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantContext.php new file mode 100755 index 0000000..461896a --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantContext.php @@ -0,0 +1,100 @@ +solution = [ + 'interactionSid' => + $interactionSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Interactions/' . \rawurlencode($interactionSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Participants/' . \rawurlencode($sid) + .''; + } + + /** + * Update the InteractionChannelParticipantInstance + * + * @param string $status + * @return InteractionChannelParticipantInstance Updated InteractionChannelParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): InteractionChannelParticipantInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new InteractionChannelParticipantInstance( + $this->version, + $payload, + $this->solution['interactionSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionChannelParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantInstance.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantInstance.php new file mode 100755 index 0000000..cb6a30a --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantInstance.php @@ -0,0 +1,128 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'type' => Values::array_get($payload, 'type'), + 'interactionSid' => Values::array_get($payload, 'interaction_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['interactionSid' => $interactionSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InteractionChannelParticipantContext Context for this InteractionChannelParticipantInstance + */ + protected function proxy(): InteractionChannelParticipantContext + { + if (!$this->context) { + $this->context = new InteractionChannelParticipantContext( + $this->version, + $this->solution['interactionSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the InteractionChannelParticipantInstance + * + * @param string $status + * @return InteractionChannelParticipantInstance Updated InteractionChannelParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): InteractionChannelParticipantInstance + { + + return $this->proxy()->update($status); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionChannelParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantList.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantList.php new file mode 100755 index 0000000..1d04029 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantList.php @@ -0,0 +1,206 @@ +solution = [ + 'interactionSid' => + $interactionSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Interactions/' . \rawurlencode($interactionSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Participants'; + } + + /** + * Create the InteractionChannelParticipantInstance + * + * @param string $type + * @param array $mediaProperties JSON representing the Media Properties for the new Participant. + * @return InteractionChannelParticipantInstance Created InteractionChannelParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $mediaProperties): InteractionChannelParticipantInstance + { + + $data = Values::of([ + 'Type' => + $type, + 'MediaProperties' => + Serialize::jsonObject($mediaProperties), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InteractionChannelParticipantInstance( + $this->version, + $payload, + $this->solution['interactionSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InteractionChannelParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InteractionChannelParticipantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InteractionChannelParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InteractionChannelParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InteractionChannelParticipantPage Page of InteractionChannelParticipantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InteractionChannelParticipantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InteractionChannelParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InteractionChannelParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InteractionChannelParticipantPage Page of InteractionChannelParticipantInstance + */ + public function getPage(string $targetUrl): InteractionChannelParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InteractionChannelParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InteractionChannelParticipantContext + * + * @param string $sid The unique string created by Twilio to identify an Interaction Channel resource. + */ + public function getContext( + string $sid + + ): InteractionChannelParticipantContext + { + return new InteractionChannelParticipantContext( + $this->version, + $this->solution['interactionSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantPage.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantPage.php new file mode 100755 index 0000000..74539f5 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannel/InteractionChannelParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InteractionChannelParticipantInstance \Twilio\Rest\FlexApi\V1\Interaction\InteractionChannel\InteractionChannelParticipantInstance + */ + public function buildInstance(array $payload): InteractionChannelParticipantInstance + { + return new InteractionChannelParticipantInstance($this->version, $payload, $this->solution['interactionSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelContext.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelContext.php new file mode 100755 index 0000000..7ac1599 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelContext.php @@ -0,0 +1,199 @@ +solution = [ + 'interactionSid' => + $interactionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Interactions/' . \rawurlencode($interactionSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the InteractionChannelInstance + * + * @return InteractionChannelInstance Fetched InteractionChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InteractionChannelInstance( + $this->version, + $payload, + $this->solution['interactionSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the InteractionChannelInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return InteractionChannelInstance Updated InteractionChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): InteractionChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $status, + 'Routing' => + Serialize::jsonObject($options['routing']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new InteractionChannelInstance( + $this->version, + $payload, + $this->solution['interactionSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the participants + */ + protected function getParticipants(): InteractionChannelParticipantList + { + if (!$this->_participants) { + $this->_participants = new InteractionChannelParticipantList( + $this->version, + $this->solution['interactionSid'], + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the invites + */ + protected function getInvites(): InteractionChannelInviteList + { + if (!$this->_invites) { + $this->_invites = new InteractionChannelInviteList( + $this->version, + $this->solution['interactionSid'], + $this->solution['sid'] + ); + } + + return $this->_invites; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelInstance.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelInstance.php new file mode 100755 index 0000000..ea8bc42 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'interactionSid' => Values::array_get($payload, 'interaction_sid'), + 'type' => Values::array_get($payload, 'type'), + 'status' => Values::array_get($payload, 'status'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'errorMessage' => Values::array_get($payload, 'error_message'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['interactionSid' => $interactionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InteractionChannelContext Context for this InteractionChannelInstance + */ + protected function proxy(): InteractionChannelContext + { + if (!$this->context) { + $this->context = new InteractionChannelContext( + $this->version, + $this->solution['interactionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the InteractionChannelInstance + * + * @return InteractionChannelInstance Fetched InteractionChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the InteractionChannelInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return InteractionChannelInstance Updated InteractionChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): InteractionChannelInstance + { + + return $this->proxy()->update($status, $options); + } + + /** + * Access the participants + */ + protected function getParticipants(): InteractionChannelParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the invites + */ + protected function getInvites(): InteractionChannelInviteList + { + return $this->proxy()->invites; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelList.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelList.php new file mode 100755 index 0000000..b18966d --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelList.php @@ -0,0 +1,168 @@ +solution = [ + 'interactionSid' => + $interactionSid, + + ]; + + $this->uri = '/Interactions/' . \rawurlencode($interactionSid) + .'/Channels'; + } + + /** + * Reads InteractionChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InteractionChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InteractionChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InteractionChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InteractionChannelPage Page of InteractionChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InteractionChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InteractionChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InteractionChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InteractionChannelPage Page of InteractionChannelInstance + */ + public function getPage(string $targetUrl): InteractionChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InteractionChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InteractionChannelContext + * + * @param string $sid The unique string created by Twilio to identify an Interaction Channel resource, prefixed with UO. + */ + public function getContext( + string $sid + + ): InteractionChannelContext + { + return new InteractionChannelContext( + $this->version, + $this->solution['interactionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelOptions.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelOptions.php new file mode 100755 index 0000000..062c274 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelOptions.php @@ -0,0 +1,80 @@ +options['routing'] = $routing; + } + + /** + * Optional. The state of associated tasks. If not specified, all tasks will be set to `wrapping`. + * + * @param array $routing Optional. The state of associated tasks. If not specified, all tasks will be set to `wrapping`. + * @return $this Fluent Builder + */ + public function setRouting(array $routing): self + { + $this->options['routing'] = $routing; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateInteractionChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelPage.php b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelPage.php new file mode 100755 index 0000000..cd2255e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/Interaction/InteractionChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InteractionChannelInstance \Twilio\Rest\FlexApi\V1\Interaction\InteractionChannelInstance + */ + public function buildInstance(array $payload): InteractionChannelInstance + { + return new InteractionChannelInstance($this->version, $payload, $this->solution['interactionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InteractionContext.php b/app/api/Twilio/Rest/FlexApi/V1/InteractionContext.php new file mode 100755 index 0000000..bcc89f1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InteractionContext.php @@ -0,0 +1,139 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Interactions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the InteractionInstance + * + * @return InteractionInstance Fetched InteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InteractionInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the channels + */ + protected function getChannels(): InteractionChannelList + { + if (!$this->_channels) { + $this->_channels = new InteractionChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_channels; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InteractionInstance.php b/app/api/Twilio/Rest/FlexApi/V1/InteractionInstance.php new file mode 100755 index 0000000..71b20ab --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InteractionInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'channel' => Values::array_get($payload, 'channel'), + 'routing' => Values::array_get($payload, 'routing'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InteractionContext Context for this InteractionInstance + */ + protected function proxy(): InteractionContext + { + if (!$this->context) { + $this->context = new InteractionContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the InteractionInstance + * + * @return InteractionInstance Fetched InteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the channels + */ + protected function getChannels(): InteractionChannelList + { + return $this->proxy()->channels; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.InteractionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/InteractionList.php b/app/api/Twilio/Rest/FlexApi/V1/InteractionList.php new file mode 100755 index 0000000..92253b1 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InteractionList.php @@ -0,0 +1,97 @@ +solution = [ + ]; + + $this->uri = '/Interactions'; + } + + /** + * Create the InteractionInstance + * + * @param array $channel The Interaction's channel. + * @param array $routing The Interaction's routing logic. + * @return InteractionInstance Created InteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $channel, array $routing): InteractionInstance + { + + $data = Values::of([ + 'Channel' => + Serialize::jsonObject($channel), + 'Routing' => + Serialize::jsonObject($routing), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InteractionInstance( + $this->version, + $payload + ); + } + + + /** + * Constructs a InteractionContext + * + * @param string $sid The SID of the Interaction resource to fetch. + */ + public function getContext( + string $sid + + ): InteractionContext + { + return new InteractionContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/InteractionPage.php b/app/api/Twilio/Rest/FlexApi/V1/InteractionPage.php new file mode 100755 index 0000000..9c79fd3 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/InteractionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InteractionInstance \Twilio\Rest\FlexApi\V1\InteractionInstance + */ + public function buildInstance(array $payload): InteractionInstance + { + return new InteractionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.InteractionPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/WebChannelContext.php b/app/api/Twilio/Rest/FlexApi/V1/WebChannelContext.php new file mode 100755 index 0000000..adf25f7 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/WebChannelContext.php @@ -0,0 +1,125 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/WebChannels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebChannelInstance + * + * @return WebChannelInstance Fetched WebChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebChannelInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the WebChannelInstance + * + * @param array|Options $options Optional Arguments + * @return WebChannelInstance Updated WebChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ChatStatus' => + $options['chatStatus'], + 'PostEngagementData' => + $options['postEngagementData'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebChannelInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.WebChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/WebChannelInstance.php b/app/api/Twilio/Rest/FlexApi/V1/WebChannelInstance.php new file mode 100755 index 0000000..7d3d41b --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/WebChannelInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flexFlowSid' => Values::array_get($payload, 'flex_flow_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebChannelContext Context for this WebChannelInstance + */ + protected function proxy(): WebChannelContext + { + if (!$this->context) { + $this->context = new WebChannelContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebChannelInstance + * + * @return WebChannelInstance Fetched WebChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebChannelInstance + * + * @param array|Options $options Optional Arguments + * @return WebChannelInstance Updated WebChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FlexApi.V1.WebChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/WebChannelList.php b/app/api/Twilio/Rest/FlexApi/V1/WebChannelList.php new file mode 100755 index 0000000..b7e992e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/WebChannelList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/WebChannels'; + } + + /** + * Create the WebChannelInstance + * + * @param string $flexFlowSid The SID of the Flex Flow. + * @param string $identity The chat identity. + * @param string $customerFriendlyName The chat participant's friendly name. + * @param string $chatFriendlyName The chat channel's friendly name. + * @param array|Options $options Optional Arguments + * @return WebChannelInstance Created WebChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $flexFlowSid, string $identity, string $customerFriendlyName, string $chatFriendlyName, array $options = []): WebChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FlexFlowSid' => + $flexFlowSid, + 'Identity' => + $identity, + 'CustomerFriendlyName' => + $customerFriendlyName, + 'ChatFriendlyName' => + $chatFriendlyName, + 'ChatUniqueName' => + $options['chatUniqueName'], + 'PreEngagementData' => + $options['preEngagementData'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebChannelInstance( + $this->version, + $payload + ); + } + + + /** + * Reads WebChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebChannelPage Page of WebChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebChannelPage Page of WebChannelInstance + */ + public function getPage(string $targetUrl): WebChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebChannelContext + * + * @param string $sid The SID of the WebChannel resource to delete. + */ + public function getContext( + string $sid + + ): WebChannelContext + { + return new WebChannelContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.WebChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V1/WebChannelOptions.php b/app/api/Twilio/Rest/FlexApi/V1/WebChannelOptions.php new file mode 100755 index 0000000..8c01d4a --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/WebChannelOptions.php @@ -0,0 +1,168 @@ +options['chatUniqueName'] = $chatUniqueName; + $this->options['preEngagementData'] = $preEngagementData; + } + + /** + * The chat channel's unique name. + * + * @param string $chatUniqueName The chat channel's unique name. + * @return $this Fluent Builder + */ + public function setChatUniqueName(string $chatUniqueName): self + { + $this->options['chatUniqueName'] = $chatUniqueName; + return $this; + } + + /** + * The pre-engagement data. + * + * @param string $preEngagementData The pre-engagement data. + * @return $this Fluent Builder + */ + public function setPreEngagementData(string $preEngagementData): self + { + $this->options['preEngagementData'] = $preEngagementData; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.CreateWebChannelOptions ' . $options . ']'; + } +} + + + + +class UpdateWebChannelOptions extends Options + { + /** + * @param string $chatStatus + * @param string $postEngagementData The post-engagement data. + */ + public function __construct( + + string $chatStatus = Values::NONE, + string $postEngagementData = Values::NONE + + ) { + $this->options['chatStatus'] = $chatStatus; + $this->options['postEngagementData'] = $postEngagementData; + } + + /** + * @param string $chatStatus + * @return $this Fluent Builder + */ + public function setChatStatus(string $chatStatus): self + { + $this->options['chatStatus'] = $chatStatus; + return $this; + } + + /** + * The post-engagement data. + * + * @param string $postEngagementData The post-engagement data. + * @return $this Fluent Builder + */ + public function setPostEngagementData(string $postEngagementData): self + { + $this->options['postEngagementData'] = $postEngagementData; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V1.UpdateWebChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V1/WebChannelPage.php b/app/api/Twilio/Rest/FlexApi/V1/WebChannelPage.php new file mode 100755 index 0000000..db3304d --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V1/WebChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebChannelInstance \Twilio\Rest\FlexApi\V1\WebChannelInstance + */ + public function buildInstance(array $payload): WebChannelInstance + { + return new WebChannelInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V1.WebChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V2.php b/app/api/Twilio/Rest/FlexApi/V2.php new file mode 100755 index 0000000..9ddacb8 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V2.php @@ -0,0 +1,94 @@ +version = 'v2'; + } + + protected function getWebChannels(): WebChannelsList + { + if (!$this->_webChannels) { + $this->_webChannels = new WebChannelsList($this); + } + return $this->_webChannels; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V2]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V2/WebChannelsInstance.php b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsInstance.php new file mode 100755 index 0000000..d7f5250 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsInstance.php @@ -0,0 +1,82 @@ +properties = [ + 'conversationSid' => Values::array_get($payload, 'conversation_sid'), + 'identity' => Values::array_get($payload, 'identity'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V2.WebChannelsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V2/WebChannelsList.php b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsList.php new file mode 100755 index 0000000..e0a785e --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsList.php @@ -0,0 +1,87 @@ +solution = [ + ]; + + $this->uri = '/WebChats'; + } + + /** + * Create the WebChannelsInstance + * + * @param string $addressSid The SID of the Conversations Address. See [Address Configuration Resource](https://www.twilio.com/docs/conversations/api/address-configuration-resource) for configuration details. When a conversation is created on the Flex backend, the callback URL will be set to the corresponding Studio Flow SID or webhook URL in your address configuration. + * @param array|Options $options Optional Arguments + * @return WebChannelsInstance Created WebChannelsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $addressSid, array $options = []): WebChannelsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AddressSid' => + $addressSid, + 'ChatFriendlyName' => + $options['chatFriendlyName'], + 'CustomerFriendlyName' => + $options['customerFriendlyName'], + 'PreEngagementData' => + $options['preEngagementData'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebChannelsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V2.WebChannelsList]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApi/V2/WebChannelsOptions.php b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsOptions.php new file mode 100755 index 0000000..fc31760 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsOptions.php @@ -0,0 +1,112 @@ +options['chatFriendlyName'] = $chatFriendlyName; + $this->options['customerFriendlyName'] = $customerFriendlyName; + $this->options['preEngagementData'] = $preEngagementData; + } + + /** + * The Conversation's friendly name. See the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource) for an example. + * + * @param string $chatFriendlyName The Conversation's friendly name. See the [Conversation resource](https://www.twilio.com/docs/conversations/api/conversation-resource) for an example. + * @return $this Fluent Builder + */ + public function setChatFriendlyName(string $chatFriendlyName): self + { + $this->options['chatFriendlyName'] = $chatFriendlyName; + return $this; + } + + /** + * The Conversation participant's friendly name. See the [Conversation Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) for an example. + * + * @param string $customerFriendlyName The Conversation participant's friendly name. See the [Conversation Participant Resource](https://www.twilio.com/docs/conversations/api/conversation-participant-resource) for an example. + * @return $this Fluent Builder + */ + public function setCustomerFriendlyName(string $customerFriendlyName): self + { + $this->options['customerFriendlyName'] = $customerFriendlyName; + return $this; + } + + /** + * The pre-engagement data. + * + * @param string $preEngagementData The pre-engagement data. + * @return $this Fluent Builder + */ + public function setPreEngagementData(string $preEngagementData): self + { + $this->options['preEngagementData'] = $preEngagementData; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FlexApi.V2.CreateWebChannelsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FlexApi/V2/WebChannelsPage.php b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsPage.php new file mode 100755 index 0000000..273096d --- /dev/null +++ b/app/api/Twilio/Rest/FlexApi/V2/WebChannelsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebChannelsInstance \Twilio\Rest\FlexApi\V2\WebChannelsInstance + */ + public function buildInstance(array $payload): WebChannelsInstance + { + return new WebChannelsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FlexApi.V2.WebChannelsPage]'; + } +} diff --git a/app/api/Twilio/Rest/FlexApiBase.php b/app/api/Twilio/Rest/FlexApiBase.php new file mode 100755 index 0000000..20978b6 --- /dev/null +++ b/app/api/Twilio/Rest/FlexApiBase.php @@ -0,0 +1,101 @@ +baseUrl = 'https://flex-api.twilio.com'; + } + + + /** + * @return V1 Version v1 of flex-api + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of flex-api + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.FlexApi]'; + } +} diff --git a/app/api/Twilio/Rest/FrontlineApi.php b/app/api/Twilio/Rest/FrontlineApi.php new file mode 100755 index 0000000..24a80f5 --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi.php @@ -0,0 +1,25 @@ +users instead. + */ + protected function getUsers(): \Twilio\Rest\FrontlineApi\V1\UserList { + echo "users is deprecated. Use v1->users instead."; + return $this->v1->users; + } + + /** + * @deprecated Use v1->users(\$sid) instead. + * @param string $sid The SID of the User resource to fetch + */ + protected function contextUsers(string $sid): \Twilio\Rest\FrontlineApi\V1\UserContext { + echo "users(\$sid) is deprecated. Use v1->users(\$sid) instead."; + return $this->v1->users($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/FrontlineApi/V1.php b/app/api/Twilio/Rest/FrontlineApi/V1.php new file mode 100755 index 0000000..afc4e4f --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList($this); + } + return $this->_users; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FrontlineApi.V1]'; + } +} diff --git a/app/api/Twilio/Rest/FrontlineApi/V1/UserContext.php b/app/api/Twilio/Rest/FrontlineApi/V1/UserContext.php new file mode 100755 index 0000000..c66ef22 --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1/UserContext.php @@ -0,0 +1,117 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Avatar' => + $options['avatar'], + 'State' => + $options['state'], + 'IsAvailable' => + Serialize::booleanToString($options['isAvailable']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FrontlineApi.V1.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/FrontlineApi/V1/UserInstance.php b/app/api/Twilio/Rest/FrontlineApi/V1/UserInstance.php new file mode 100755 index 0000000..1b86cf4 --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1/UserInstance.php @@ -0,0 +1,141 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'avatar' => Values::array_get($payload, 'avatar'), + 'state' => Values::array_get($payload, 'state'), + 'isAvailable' => Values::array_get($payload, 'is_available'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.FrontlineApi.V1.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FrontlineApi/V1/UserList.php b/app/api/Twilio/Rest/FrontlineApi/V1/UserList.php new file mode 100755 index 0000000..9540bac --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1/UserList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a UserContext + * + * @param string $sid The SID of the User resource to fetch. This value can be either the `sid` or the `identity` of the User resource to fetch. + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FrontlineApi.V1.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/FrontlineApi/V1/UserOptions.php b/app/api/Twilio/Rest/FrontlineApi/V1/UserOptions.php new file mode 100755 index 0000000..4626809 --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1/UserOptions.php @@ -0,0 +1,130 @@ +options['friendlyName'] = $friendlyName; + $this->options['avatar'] = $avatar; + $this->options['state'] = $state; + $this->options['isAvailable'] = $isAvailable; + } + + /** + * The string that you assigned to describe the User. + * + * @param string $friendlyName The string that you assigned to describe the User. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The avatar URL which will be shown in Frontline application. + * + * @param string $avatar The avatar URL which will be shown in Frontline application. + * @return $this Fluent Builder + */ + public function setAvatar(string $avatar): self + { + $this->options['avatar'] = $avatar; + return $this; + } + + /** + * @param string $state + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + * + * @param bool $isAvailable Whether the User is available for new conversations. Set to `false` to prevent User from receiving new inbound conversations if you are using [Pool Routing](https://www.twilio.com/docs/frontline/handle-incoming-conversations#3-pool-routing). + * @return $this Fluent Builder + */ + public function setIsAvailable(bool $isAvailable): self + { + $this->options['isAvailable'] = $isAvailable; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.FrontlineApi.V1.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/FrontlineApi/V1/UserPage.php b/app/api/Twilio/Rest/FrontlineApi/V1/UserPage.php new file mode 100755 index 0000000..a03a8fc --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApi/V1/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\FrontlineApi\V1\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.FrontlineApi.V1.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/FrontlineApiBase.php b/app/api/Twilio/Rest/FrontlineApiBase.php new file mode 100755 index 0000000..bdd5225 --- /dev/null +++ b/app/api/Twilio/Rest/FrontlineApiBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://frontline-api.twilio.com'; + } + + + /** + * @return V1 Version v1 of frontline-api + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.FrontlineApi]'; + } +} diff --git a/app/api/Twilio/Rest/Insights.php b/app/api/Twilio/Rest/Insights.php new file mode 100755 index 0000000..5b1261d --- /dev/null +++ b/app/api/Twilio/Rest/Insights.php @@ -0,0 +1,83 @@ +settings instead. + */ + protected function getSettings(): \Twilio\Rest\Insights\V1\SettingList { + echo "settings is deprecated. Use v1->settings instead."; + return $this->v1->settings; + } + + /** + * @deprecated Use v1->settings() instead. + */ + protected function contextSettings(): \Twilio\Rest\Insights\V1\SettingContext { + echo "settings() is deprecated. Use v1->settings() instead."; + return $this->v1->settings(); + } + + /** + * @deprecated Use v1->calls instead. + */ + protected function getCalls(): \Twilio\Rest\Insights\V1\CallList { + echo "calls is deprecated. Use v1->calls instead."; + return $this->v1->calls; + } + + /** + * @deprecated Use v1->calls(\$sid) instead. + * @param string $sid The sid + */ + protected function contextCalls(string $sid): \Twilio\Rest\Insights\V1\CallContext { + echo "calls(\$sid) is deprecated. Use v1->calls(\$sid) instead."; + return $this->v1->calls($sid); + } + + /** + * @deprecated Use v1->callSummaries instead. + */ + protected function getCallSummaries(): \Twilio\Rest\Insights\V1\CallSummariesList { + echo "callSummaries is deprecated. Use v1->callSummaries instead."; + return $this->v1->callSummaries; + } + + /** + * @deprecated Use v1->conferences instead. + */ + protected function getConferences(): \Twilio\Rest\Insights\V1\ConferenceList { + echo "conferences is deprecated. Use v1->conferences instead."; + return $this->v1->conferences; + } + + /** + * @deprecated Use v1->conferences(\$conferenceSid) instead. + * @param string $conferenceSid Conference SID. + */ + protected function contextConferences(string $conferenceSid): \Twilio\Rest\Insights\V1\ConferenceContext { + echo "conferences(\$conferenceSid) is deprecated. Use v1->conferences(\$conferenceSid) instead."; + return $this->v1->conferences($conferenceSid); + } + + /** + * @deprecated Use v1->rooms instead. + */ + protected function getRooms(): \Twilio\Rest\Insights\V1\RoomList { + echo "rooms is deprecated. Use v1->rooms instead."; + return $this->v1->rooms; + } + + /** + * @deprecated Use v1->rooms(\$roomSid) instead. + * @param string $roomSid The SID of the Room resource. + */ + protected function contextRooms(string $roomSid): \Twilio\Rest\Insights\V1\RoomContext { + echo "rooms(\$roomSid) is deprecated. Use v1->rooms(\$roomSid) instead."; + return $this->v1->rooms($roomSid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Insights/V1.php b/app/api/Twilio/Rest/Insights/V1.php new file mode 100755 index 0000000..d75c5d3 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1.php @@ -0,0 +1,141 @@ +version = 'v1'; + } + + protected function getCalls(): CallList + { + if (!$this->_calls) { + $this->_calls = new CallList($this); + } + return $this->_calls; + } + + protected function getCallSummaries(): CallSummariesList + { + if (!$this->_callSummaries) { + $this->_callSummaries = new CallSummariesList($this); + } + return $this->_callSummaries; + } + + protected function getConferences(): ConferenceList + { + if (!$this->_conferences) { + $this->_conferences = new ConferenceList($this); + } + return $this->_conferences; + } + + protected function getRooms(): RoomList + { + if (!$this->_rooms) { + $this->_rooms = new RoomList($this); + } + return $this->_rooms; + } + + protected function getSettings(): SettingList + { + if (!$this->_settings) { + $this->_settings = new SettingList($this); + } + return $this->_settings; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/AnnotationContext.php b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationContext.php new file mode 100755 index 0000000..1563932 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationContext.php @@ -0,0 +1,123 @@ +solution = [ + 'callSid' => + $callSid, + ]; + + $this->uri = '/Voice/' . \rawurlencode($callSid) + .'/Annotation'; + } + + /** + * Fetch the AnnotationInstance + * + * @return AnnotationInstance Fetched AnnotationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AnnotationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AnnotationInstance( + $this->version, + $payload, + $this->solution['callSid'] + ); + } + + + /** + * Update the AnnotationInstance + * + * @param array|Options $options Optional Arguments + * @return AnnotationInstance Updated AnnotationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AnnotationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AnsweredBy' => + $options['answeredBy'], + 'ConnectivityIssue' => + $options['connectivityIssue'], + 'QualityIssues' => + $options['qualityIssues'], + 'Spam' => + Serialize::booleanToString($options['spam']), + 'CallScore' => + $options['callScore'], + 'Comment' => + $options['comment'], + 'Incident' => + $options['incident'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AnnotationInstance( + $this->version, + $payload, + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.AnnotationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/AnnotationInstance.php b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationInstance.php new file mode 100755 index 0000000..6fc3e63 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationInstance.php @@ -0,0 +1,147 @@ +properties = [ + 'callSid' => Values::array_get($payload, 'call_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'answeredBy' => Values::array_get($payload, 'answered_by'), + 'connectivityIssue' => Values::array_get($payload, 'connectivity_issue'), + 'qualityIssues' => Values::array_get($payload, 'quality_issues'), + 'spam' => Values::array_get($payload, 'spam'), + 'callScore' => Values::array_get($payload, 'call_score'), + 'comment' => Values::array_get($payload, 'comment'), + 'incident' => Values::array_get($payload, 'incident'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['callSid' => $callSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AnnotationContext Context for this AnnotationInstance + */ + protected function proxy(): AnnotationContext + { + if (!$this->context) { + $this->context = new AnnotationContext( + $this->version, + $this->solution['callSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AnnotationInstance + * + * @return AnnotationInstance Fetched AnnotationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AnnotationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AnnotationInstance + * + * @param array|Options $options Optional Arguments + * @return AnnotationInstance Updated AnnotationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AnnotationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.AnnotationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/AnnotationList.php b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationList.php new file mode 100755 index 0000000..7f4b7d0 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationList.php @@ -0,0 +1,67 @@ +solution = [ + 'callSid' => + $callSid, + + ]; + } + + /** + * Constructs a AnnotationContext + */ + public function getContext( + + ): AnnotationContext + { + return new AnnotationContext( + $this->version, + $this->solution['callSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.AnnotationList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/AnnotationOptions.php b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationOptions.php new file mode 100755 index 0000000..3c83864 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationOptions.php @@ -0,0 +1,182 @@ +options['answeredBy'] = $answeredBy; + $this->options['connectivityIssue'] = $connectivityIssue; + $this->options['qualityIssues'] = $qualityIssues; + $this->options['spam'] = $spam; + $this->options['callScore'] = $callScore; + $this->options['comment'] = $comment; + $this->options['incident'] = $incident; + } + + /** + * @param string $answeredBy + * @return $this Fluent Builder + */ + public function setAnsweredBy(string $answeredBy): self + { + $this->options['answeredBy'] = $answeredBy; + return $this; + } + + /** + * @param string $connectivityIssue + * @return $this Fluent Builder + */ + public function setConnectivityIssue(string $connectivityIssue): self + { + $this->options['connectivityIssue'] = $connectivityIssue; + return $this; + } + + /** + * Specify if the call had any subjective quality issues. Possible values, one or more of: no_quality_issue, low_volume, choppy_robotic, echo, dtmf, latency, owa, static_noise. Use comma separated values to indicate multiple quality issues for the same call + * + * @param string $qualityIssues Specify if the call had any subjective quality issues. Possible values, one or more of: no_quality_issue, low_volume, choppy_robotic, echo, dtmf, latency, owa, static_noise. Use comma separated values to indicate multiple quality issues for the same call + * @return $this Fluent Builder + */ + public function setQualityIssues(string $qualityIssues): self + { + $this->options['qualityIssues'] = $qualityIssues; + return $this; + } + + /** + * Specify if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Is of type Boolean: true, false. Use true if the call was a spam call. + * + * @param bool $spam Specify if the call was a spam call. Use this to provide feedback on whether calls placed from your account were marked as spam, or if inbound calls received by your account were unwanted spam. Is of type Boolean: true, false. Use true if the call was a spam call. + * @return $this Fluent Builder + */ + public function setSpam(bool $spam): self + { + $this->options['spam'] = $spam; + return $this; + } + + /** + * Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + * + * @param int $callScore Specify the call score. This is of type integer. Use a range of 1-5 to indicate the call experience score, with the following mapping as a reference for rating the call [5: Excellent, 4: Good, 3 : Fair, 2 : Poor, 1: Bad]. + * @return $this Fluent Builder + */ + public function setCallScore(int $callScore): self + { + $this->options['callScore'] = $callScore; + return $this; + } + + /** + * Specify any comments pertaining to the call. This of type string with a max limit of 100 characters. Twilio does not treat this field as PII, so don’t put any PII in here. + * + * @param string $comment Specify any comments pertaining to the call. This of type string with a max limit of 100 characters. Twilio does not treat this field as PII, so don’t put any PII in here. + * @return $this Fluent Builder + */ + public function setComment(string $comment): self + { + $this->options['comment'] = $comment; + return $this; + } + + /** + * Associate this call with an incident or support ticket. This is of type string with a max limit of 100 characters. Twilio does not treat this field as PII, so don’t put any PII in here. + * + * @param string $incident Associate this call with an incident or support ticket. This is of type string with a max limit of 100 characters. Twilio does not treat this field as PII, so don’t put any PII in here. + * @return $this Fluent Builder + */ + public function setIncident(string $incident): self + { + $this->options['incident'] = $incident; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.UpdateAnnotationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/AnnotationPage.php b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationPage.php new file mode 100755 index 0000000..9d28798 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/AnnotationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AnnotationInstance \Twilio\Rest\Insights\V1\Call\AnnotationInstance + */ + public function buildInstance(array $payload): AnnotationInstance + { + return new AnnotationInstance($this->version, $payload, $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.AnnotationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryContext.php b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryContext.php new file mode 100755 index 0000000..ff88a98 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryContext.php @@ -0,0 +1,91 @@ +solution = [ + 'callSid' => + $callSid, + ]; + + $this->uri = '/Voice/' . \rawurlencode($callSid) + .'/Summary'; + } + + /** + * Fetch the CallSummaryInstance + * + * @param array|Options $options Optional Arguments + * @return CallSummaryInstance Fetched CallSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): CallSummaryInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'ProcessingState' => + $options['processingState'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new CallSummaryInstance( + $this->version, + $payload, + $this->solution['callSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.CallSummaryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryInstance.php b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryInstance.php new file mode 100755 index 0000000..0aba4e0 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'callType' => Values::array_get($payload, 'call_type'), + 'callState' => Values::array_get($payload, 'call_state'), + 'answeredBy' => Values::array_get($payload, 'answered_by'), + 'processingState' => Values::array_get($payload, 'processing_state'), + 'createdTime' => Deserialize::dateTime(Values::array_get($payload, 'created_time')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'connectDuration' => Values::array_get($payload, 'connect_duration'), + 'from' => Values::array_get($payload, 'from'), + 'to' => Values::array_get($payload, 'to'), + 'carrierEdge' => Values::array_get($payload, 'carrier_edge'), + 'clientEdge' => Values::array_get($payload, 'client_edge'), + 'sdkEdge' => Values::array_get($payload, 'sdk_edge'), + 'sipEdge' => Values::array_get($payload, 'sip_edge'), + 'tags' => Values::array_get($payload, 'tags'), + 'url' => Values::array_get($payload, 'url'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'properties' => Values::array_get($payload, 'properties'), + 'trust' => Values::array_get($payload, 'trust'), + 'annotation' => Values::array_get($payload, 'annotation'), + ]; + + $this->solution = ['callSid' => $callSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CallSummaryContext Context for this CallSummaryInstance + */ + protected function proxy(): CallSummaryContext + { + if (!$this->context) { + $this->context = new CallSummaryContext( + $this->version, + $this->solution['callSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the CallSummaryInstance + * + * @param array|Options $options Optional Arguments + * @return CallSummaryInstance Fetched CallSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): CallSummaryInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.CallSummaryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryList.php b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryList.php new file mode 100755 index 0000000..15d24a2 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryList.php @@ -0,0 +1,67 @@ +solution = [ + 'callSid' => + $callSid, + + ]; + } + + /** + * Constructs a CallSummaryContext + */ + public function getContext( + + ): CallSummaryContext + { + return new CallSummaryContext( + $this->version, + $this->solution['callSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallSummaryList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryOptions.php b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryOptions.php new file mode 100755 index 0000000..3de57d9 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryOptions.php @@ -0,0 +1,76 @@ +options['processingState'] = $processingState; + } + + /** + * + * + * @param string $processingState + * @return $this Fluent Builder + */ + public function setProcessingState(string $processingState): self + { + $this->options['processingState'] = $processingState; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.FetchCallSummaryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryPage.php b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryPage.php new file mode 100755 index 0000000..6c44c2c --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/CallSummaryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CallSummaryInstance \Twilio\Rest\Insights\V1\Call\CallSummaryInstance + */ + public function buildInstance(array $payload): CallSummaryInstance + { + return new CallSummaryInstance($this->version, $payload, $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallSummaryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/EventInstance.php b/app/api/Twilio/Rest/Insights/V1/Call/EventInstance.php new file mode 100755 index 0000000..5559186 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/EventInstance.php @@ -0,0 +1,101 @@ +properties = [ + 'timestamp' => Values::array_get($payload, 'timestamp'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'edge' => Values::array_get($payload, 'edge'), + 'group' => Values::array_get($payload, 'group'), + 'level' => Values::array_get($payload, 'level'), + 'name' => Values::array_get($payload, 'name'), + 'carrierEdge' => Values::array_get($payload, 'carrier_edge'), + 'sipEdge' => Values::array_get($payload, 'sip_edge'), + 'sdkEdge' => Values::array_get($payload, 'sdk_edge'), + 'clientEdge' => Values::array_get($payload, 'client_edge'), + ]; + + $this->solution = ['callSid' => $callSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.EventInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/EventList.php b/app/api/Twilio/Rest/Insights/V1/Call/EventList.php new file mode 100755 index 0000000..475f447 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/EventList.php @@ -0,0 +1,158 @@ +solution = [ + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Voice/' . \rawurlencode($callSid) + .'/Events'; + } + + /** + * Reads EventInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EventInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams EventInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EventInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EventPage Page of EventInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EventPage + { + $options = new Values($options); + + $params = Values::of([ + 'Edge' => + $options['edge'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EventPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EventInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EventPage Page of EventInstance + */ + public function getPage(string $targetUrl): EventPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EventPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.EventList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/EventOptions.php b/app/api/Twilio/Rest/Insights/V1/Call/EventOptions.php new file mode 100755 index 0000000..d38f365 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/EventOptions.php @@ -0,0 +1,76 @@ +options['edge'] = $edge; + } + + /** + * + * + * @param string $edge + * @return $this Fluent Builder + */ + public function setEdge(string $edge): self + { + $this->options['edge'] = $edge; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadEventOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/EventPage.php b/app/api/Twilio/Rest/Insights/V1/Call/EventPage.php new file mode 100755 index 0000000..f9d3683 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/EventPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EventInstance \Twilio\Rest\Insights\V1\Call\EventInstance + */ + public function buildInstance(array $payload): EventInstance + { + return new EventInstance($this->version, $payload, $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.EventPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/MetricInstance.php b/app/api/Twilio/Rest/Insights/V1/Call/MetricInstance.php new file mode 100755 index 0000000..2f3429c --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/MetricInstance.php @@ -0,0 +1,97 @@ +properties = [ + 'timestamp' => Values::array_get($payload, 'timestamp'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'edge' => Values::array_get($payload, 'edge'), + 'direction' => Values::array_get($payload, 'direction'), + 'carrierEdge' => Values::array_get($payload, 'carrier_edge'), + 'sipEdge' => Values::array_get($payload, 'sip_edge'), + 'sdkEdge' => Values::array_get($payload, 'sdk_edge'), + 'clientEdge' => Values::array_get($payload, 'client_edge'), + ]; + + $this->solution = ['callSid' => $callSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.MetricInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/MetricList.php b/app/api/Twilio/Rest/Insights/V1/Call/MetricList.php new file mode 100755 index 0000000..1bb6799 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/MetricList.php @@ -0,0 +1,160 @@ +solution = [ + 'callSid' => + $callSid, + + ]; + + $this->uri = '/Voice/' . \rawurlencode($callSid) + .'/Metrics'; + } + + /** + * Reads MetricInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MetricInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MetricInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MetricInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MetricPage Page of MetricInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MetricPage + { + $options = new Values($options); + + $params = Values::of([ + 'Edge' => + $options['edge'], + 'Direction' => + $options['direction'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MetricPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MetricInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MetricPage Page of MetricInstance + */ + public function getPage(string $targetUrl): MetricPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MetricPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.MetricList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Call/MetricOptions.php b/app/api/Twilio/Rest/Insights/V1/Call/MetricOptions.php new file mode 100755 index 0000000..7784838 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/MetricOptions.php @@ -0,0 +1,94 @@ +options['edge'] = $edge; + $this->options['direction'] = $direction; + } + + /** + * + * + * @param string $edge + * @return $this Fluent Builder + */ + public function setEdge(string $edge): self + { + $this->options['edge'] = $edge; + return $this; + } + + /** + * + * + * @param string $direction + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadMetricOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Call/MetricPage.php b/app/api/Twilio/Rest/Insights/V1/Call/MetricPage.php new file mode 100755 index 0000000..d2ce864 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Call/MetricPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MetricInstance \Twilio\Rest\Insights\V1\Call\MetricInstance + */ + public function buildInstance(array $payload): MetricInstance + { + return new MetricInstance($this->version, $payload, $this->solution['callSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.MetricPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/CallContext.php b/app/api/Twilio/Rest/Insights/V1/CallContext.php new file mode 100755 index 0000000..bd18f84 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallContext.php @@ -0,0 +1,194 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Voice/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the CallInstance + * + * @return CallInstance Fetched CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CallInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CallInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the metrics + */ + protected function getMetrics(): MetricList + { + if (!$this->_metrics) { + $this->_metrics = new MetricList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_metrics; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + if (!$this->_events) { + $this->_events = new EventList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_events; + } + + /** + * Access the summary + */ + protected function getSummary(): CallSummaryList + { + if (!$this->_summary) { + $this->_summary = new CallSummaryList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_summary; + } + + /** + * Access the annotation + */ + protected function getAnnotation(): AnnotationList + { + if (!$this->_annotation) { + $this->_annotation = new AnnotationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_annotation; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.CallContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/CallInstance.php b/app/api/Twilio/Rest/Insights/V1/CallInstance.php new file mode 100755 index 0000000..74b6c60 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CallContext Context for this CallInstance + */ + protected function proxy(): CallContext + { + if (!$this->context) { + $this->context = new CallContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the CallInstance + * + * @return CallInstance Fetched CallInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CallInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the metrics + */ + protected function getMetrics(): MetricList + { + return $this->proxy()->metrics; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + return $this->proxy()->events; + } + + /** + * Access the summary + */ + protected function getSummary(): CallSummaryList + { + return $this->proxy()->summary; + } + + /** + * Access the annotation + */ + protected function getAnnotation(): AnnotationList + { + return $this->proxy()->annotation; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.CallInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/CallList.php b/app/api/Twilio/Rest/Insights/V1/CallList.php new file mode 100755 index 0000000..b162d2c --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a CallContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): CallContext + { + return new CallContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/CallPage.php b/app/api/Twilio/Rest/Insights/V1/CallPage.php new file mode 100755 index 0000000..48e5ebe --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CallInstance \Twilio\Rest\Insights\V1\CallInstance + */ + public function buildInstance(array $payload): CallInstance + { + return new CallInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/CallSummariesInstance.php b/app/api/Twilio/Rest/Insights/V1/CallSummariesInstance.php new file mode 100755 index 0000000..a624c03 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallSummariesInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'answeredBy' => Values::array_get($payload, 'answered_by'), + 'callType' => Values::array_get($payload, 'call_type'), + 'callState' => Values::array_get($payload, 'call_state'), + 'processingState' => Values::array_get($payload, 'processing_state'), + 'createdTime' => Deserialize::dateTime(Values::array_get($payload, 'created_time')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'connectDuration' => Values::array_get($payload, 'connect_duration'), + 'from' => Values::array_get($payload, 'from'), + 'to' => Values::array_get($payload, 'to'), + 'carrierEdge' => Values::array_get($payload, 'carrier_edge'), + 'clientEdge' => Values::array_get($payload, 'client_edge'), + 'sdkEdge' => Values::array_get($payload, 'sdk_edge'), + 'sipEdge' => Values::array_get($payload, 'sip_edge'), + 'tags' => Values::array_get($payload, 'tags'), + 'url' => Values::array_get($payload, 'url'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'properties' => Values::array_get($payload, 'properties'), + 'trust' => Values::array_get($payload, 'trust'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallSummariesInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/CallSummariesList.php b/app/api/Twilio/Rest/Insights/V1/CallSummariesList.php new file mode 100755 index 0000000..4971ff2 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallSummariesList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/Voice/Summaries'; + } + + /** + * Reads CallSummariesInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CallSummariesInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CallSummariesInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CallSummariesInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CallSummariesPage Page of CallSummariesInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CallSummariesPage + { + $options = new Values($options); + + $params = Values::of([ + 'From' => + $options['from'], + 'To' => + $options['to'], + 'FromCarrier' => + $options['fromCarrier'], + 'ToCarrier' => + $options['toCarrier'], + 'FromCountryCode' => + $options['fromCountryCode'], + 'ToCountryCode' => + $options['toCountryCode'], + 'Branded' => + Serialize::booleanToString($options['branded']), + 'VerifiedCaller' => + Serialize::booleanToString($options['verifiedCaller']), + 'HasTag' => + Serialize::booleanToString($options['hasTag']), + 'StartTime' => + $options['startTime'], + 'EndTime' => + $options['endTime'], + 'CallType' => + $options['callType'], + 'CallState' => + $options['callState'], + 'Direction' => + $options['direction'], + 'ProcessingState' => + $options['processingState'], + 'SortBy' => + $options['sortBy'], + 'Subaccount' => + $options['subaccount'], + 'AbnormalSession' => + Serialize::booleanToString($options['abnormalSession']), + 'AnsweredBy' => + $options['answeredBy'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CallSummariesPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CallSummariesInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CallSummariesPage Page of CallSummariesInstance + */ + public function getPage(string $targetUrl): CallSummariesPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CallSummariesPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallSummariesList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/CallSummariesOptions.php b/app/api/Twilio/Rest/Insights/V1/CallSummariesOptions.php new file mode 100755 index 0000000..4843f63 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallSummariesOptions.php @@ -0,0 +1,400 @@ +options['from'] = $from; + $this->options['to'] = $to; + $this->options['fromCarrier'] = $fromCarrier; + $this->options['toCarrier'] = $toCarrier; + $this->options['fromCountryCode'] = $fromCountryCode; + $this->options['toCountryCode'] = $toCountryCode; + $this->options['branded'] = $branded; + $this->options['verifiedCaller'] = $verifiedCaller; + $this->options['hasTag'] = $hasTag; + $this->options['startTime'] = $startTime; + $this->options['endTime'] = $endTime; + $this->options['callType'] = $callType; + $this->options['callState'] = $callState; + $this->options['direction'] = $direction; + $this->options['processingState'] = $processingState; + $this->options['sortBy'] = $sortBy; + $this->options['subaccount'] = $subaccount; + $this->options['abnormalSession'] = $abnormalSession; + $this->options['answeredBy'] = $answeredBy; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * + * + * @param string $to + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * + * + * @param string $fromCarrier + * @return $this Fluent Builder + */ + public function setFromCarrier(string $fromCarrier): self + { + $this->options['fromCarrier'] = $fromCarrier; + return $this; + } + + /** + * + * + * @param string $toCarrier + * @return $this Fluent Builder + */ + public function setToCarrier(string $toCarrier): self + { + $this->options['toCarrier'] = $toCarrier; + return $this; + } + + /** + * + * + * @param string $fromCountryCode + * @return $this Fluent Builder + */ + public function setFromCountryCode(string $fromCountryCode): self + { + $this->options['fromCountryCode'] = $fromCountryCode; + return $this; + } + + /** + * + * + * @param string $toCountryCode + * @return $this Fluent Builder + */ + public function setToCountryCode(string $toCountryCode): self + { + $this->options['toCountryCode'] = $toCountryCode; + return $this; + } + + /** + * + * + * @param bool $branded + * @return $this Fluent Builder + */ + public function setBranded(bool $branded): self + { + $this->options['branded'] = $branded; + return $this; + } + + /** + * + * + * @param bool $verifiedCaller + * @return $this Fluent Builder + */ + public function setVerifiedCaller(bool $verifiedCaller): self + { + $this->options['verifiedCaller'] = $verifiedCaller; + return $this; + } + + /** + * + * + * @param bool $hasTag + * @return $this Fluent Builder + */ + public function setHasTag(bool $hasTag): self + { + $this->options['hasTag'] = $hasTag; + return $this; + } + + /** + * + * + * @param string $startTime + * @return $this Fluent Builder + */ + public function setStartTime(string $startTime): self + { + $this->options['startTime'] = $startTime; + return $this; + } + + /** + * + * + * @param string $endTime + * @return $this Fluent Builder + */ + public function setEndTime(string $endTime): self + { + $this->options['endTime'] = $endTime; + return $this; + } + + /** + * + * + * @param string $callType + * @return $this Fluent Builder + */ + public function setCallType(string $callType): self + { + $this->options['callType'] = $callType; + return $this; + } + + /** + * + * + * @param string $callState + * @return $this Fluent Builder + */ + public function setCallState(string $callState): self + { + $this->options['callState'] = $callState; + return $this; + } + + /** + * + * + * @param string $direction + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * + * + * @param string $processingState + * @return $this Fluent Builder + */ + public function setProcessingState(string $processingState): self + { + $this->options['processingState'] = $processingState; + return $this; + } + + /** + * + * + * @param string $sortBy + * @return $this Fluent Builder + */ + public function setSortBy(string $sortBy): self + { + $this->options['sortBy'] = $sortBy; + return $this; + } + + /** + * + * + * @param string $subaccount + * @return $this Fluent Builder + */ + public function setSubaccount(string $subaccount): self + { + $this->options['subaccount'] = $subaccount; + return $this; + } + + /** + * + * + * @param bool $abnormalSession + * @return $this Fluent Builder + */ + public function setAbnormalSession(bool $abnormalSession): self + { + $this->options['abnormalSession'] = $abnormalSession; + return $this; + } + + /** + * + * + * @param string $answeredBy + * @return $this Fluent Builder + */ + public function setAnsweredBy(string $answeredBy): self + { + $this->options['answeredBy'] = $answeredBy; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadCallSummariesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/CallSummariesPage.php b/app/api/Twilio/Rest/Insights/V1/CallSummariesPage.php new file mode 100755 index 0000000..798901d --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/CallSummariesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CallSummariesInstance \Twilio\Rest\Insights\V1\CallSummariesInstance + */ + public function buildInstance(array $payload): CallSummariesInstance + { + return new CallSummariesInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.CallSummariesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantContext.php b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantContext.php new file mode 100755 index 0000000..12434dd --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantContext.php @@ -0,0 +1,99 @@ +solution = [ + 'conferenceSid' => + $conferenceSid, + 'participantSid' => + $participantSid, + ]; + + $this->uri = '/Conferences/' . \rawurlencode($conferenceSid) + .'/Participants/' . \rawurlencode($participantSid) + .''; + } + + /** + * Fetch the ConferenceParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ConferenceParticipantInstance Fetched ConferenceParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): ConferenceParticipantInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Events' => + $options['events'], + 'Metrics' => + $options['metrics'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new ConferenceParticipantInstance( + $this->version, + $payload, + $this->solution['conferenceSid'], + $this->solution['participantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ConferenceParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantInstance.php b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantInstance.php new file mode 100755 index 0000000..68f4676 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantInstance.php @@ -0,0 +1,172 @@ +properties = [ + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'label' => Values::array_get($payload, 'label'), + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'callSid' => Values::array_get($payload, 'call_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'callDirection' => Values::array_get($payload, 'call_direction'), + 'from' => Values::array_get($payload, 'from'), + 'to' => Values::array_get($payload, 'to'), + 'callStatus' => Values::array_get($payload, 'call_status'), + 'countryCode' => Values::array_get($payload, 'country_code'), + 'isModerator' => Values::array_get($payload, 'is_moderator'), + 'joinTime' => Deserialize::dateTime(Values::array_get($payload, 'join_time')), + 'leaveTime' => Deserialize::dateTime(Values::array_get($payload, 'leave_time')), + 'durationSeconds' => Values::array_get($payload, 'duration_seconds'), + 'outboundQueueLength' => Values::array_get($payload, 'outbound_queue_length'), + 'outboundTimeInQueue' => Values::array_get($payload, 'outbound_time_in_queue'), + 'jitterBufferSize' => Values::array_get($payload, 'jitter_buffer_size'), + 'isCoach' => Values::array_get($payload, 'is_coach'), + 'coachedParticipants' => Values::array_get($payload, 'coached_participants'), + 'participantRegion' => Values::array_get($payload, 'participant_region'), + 'conferenceRegion' => Values::array_get($payload, 'conference_region'), + 'callType' => Values::array_get($payload, 'call_type'), + 'processingState' => Values::array_get($payload, 'processing_state'), + 'properties' => Values::array_get($payload, 'properties'), + 'events' => Values::array_get($payload, 'events'), + 'metrics' => Values::array_get($payload, 'metrics'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['conferenceSid' => $conferenceSid, 'participantSid' => $participantSid ?: $this->properties['participantSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConferenceParticipantContext Context for this ConferenceParticipantInstance + */ + protected function proxy(): ConferenceParticipantContext + { + if (!$this->context) { + $this->context = new ConferenceParticipantContext( + $this->version, + $this->solution['conferenceSid'], + $this->solution['participantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ConferenceParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ConferenceParticipantInstance Fetched ConferenceParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): ConferenceParticipantInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ConferenceParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantList.php b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantList.php new file mode 100755 index 0000000..01dd43e --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantList.php @@ -0,0 +1,179 @@ +solution = [ + 'conferenceSid' => + $conferenceSid, + + ]; + + $this->uri = '/Conferences/' . \rawurlencode($conferenceSid) + .'/Participants'; + } + + /** + * Reads ConferenceParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConferenceParticipantInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ConferenceParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConferenceParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConferenceParticipantPage Page of ConferenceParticipantInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConferenceParticipantPage + { + $options = new Values($options); + + $params = Values::of([ + 'ParticipantSid' => + $options['participantSid'], + 'Label' => + $options['label'], + 'Events' => + $options['events'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConferenceParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConferenceParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConferenceParticipantPage Page of ConferenceParticipantInstance + */ + public function getPage(string $targetUrl): ConferenceParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConferenceParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConferenceParticipantContext + * + * @param string $participantSid The unique SID identifier of the Participant. + */ + public function getContext( + string $participantSid + + ): ConferenceParticipantContext + { + return new ConferenceParticipantContext( + $this->version, + $this->solution['conferenceSid'], + $participantSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ConferenceParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantOptions.php b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantOptions.php new file mode 100755 index 0000000..5e2af0b --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantOptions.php @@ -0,0 +1,182 @@ +options['events'] = $events; + $this->options['metrics'] = $metrics; + } + + /** + * Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + * + * @param string $events Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + * @return $this Fluent Builder + */ + public function setEvents(string $events): self + { + $this->options['events'] = $events; + return $this; + } + + /** + * Object. Contains participant call quality metrics. + * + * @param string $metrics Object. Contains participant call quality metrics. + * @return $this Fluent Builder + */ + public function setMetrics(string $metrics): self + { + $this->options['metrics'] = $metrics; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.FetchConferenceParticipantOptions ' . $options . ']'; + } +} + +class ReadConferenceParticipantOptions extends Options + { + /** + * @param string $participantSid The unique SID identifier of the Participant. + * @param string $label User-specified label for a participant. + * @param string $events Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + */ + public function __construct( + + string $participantSid = Values::NONE, + string $label = Values::NONE, + string $events = Values::NONE + + ) { + $this->options['participantSid'] = $participantSid; + $this->options['label'] = $label; + $this->options['events'] = $events; + } + + /** + * The unique SID identifier of the Participant. + * + * @param string $participantSid The unique SID identifier of the Participant. + * @return $this Fluent Builder + */ + public function setParticipantSid(string $participantSid): self + { + $this->options['participantSid'] = $participantSid; + return $this; + } + + /** + * User-specified label for a participant. + * + * @param string $label User-specified label for a participant. + * @return $this Fluent Builder + */ + public function setLabel(string $label): self + { + $this->options['label'] = $label; + return $this; + } + + /** + * Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + * + * @param string $events Conference events generated by application or participant activity; e.g. `hold`, `mute`, etc. + * @return $this Fluent Builder + */ + public function setEvents(string $events): self + { + $this->options['events'] = $events; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadConferenceParticipantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantPage.php b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantPage.php new file mode 100755 index 0000000..4be81f1 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Conference/ConferenceParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConferenceParticipantInstance \Twilio\Rest\Insights\V1\Conference\ConferenceParticipantInstance + */ + public function buildInstance(array $payload): ConferenceParticipantInstance + { + return new ConferenceParticipantInstance($this->version, $payload, $this->solution['conferenceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ConferenceParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/ConferenceContext.php b/app/api/Twilio/Rest/Insights/V1/ConferenceContext.php new file mode 100755 index 0000000..31df4cd --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/ConferenceContext.php @@ -0,0 +1,139 @@ +solution = [ + 'conferenceSid' => + $conferenceSid, + ]; + + $this->uri = '/Conferences/' . \rawurlencode($conferenceSid) + .''; + } + + /** + * Fetch the ConferenceInstance + * + * @return ConferenceInstance Fetched ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConferenceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConferenceInstance( + $this->version, + $payload, + $this->solution['conferenceSid'] + ); + } + + + /** + * Access the conferenceParticipants + */ + protected function getConferenceParticipants(): ConferenceParticipantList + { + if (!$this->_conferenceParticipants) { + $this->_conferenceParticipants = new ConferenceParticipantList( + $this->version, + $this->solution['conferenceSid'] + ); + } + + return $this->_conferenceParticipants; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ConferenceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/ConferenceInstance.php b/app/api/Twilio/Rest/Insights/V1/ConferenceInstance.php new file mode 100755 index 0000000..3e01762 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/ConferenceInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'conferenceSid' => Values::array_get($payload, 'conference_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'createTime' => Deserialize::dateTime(Values::array_get($payload, 'create_time')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'durationSeconds' => Values::array_get($payload, 'duration_seconds'), + 'connectDurationSeconds' => Values::array_get($payload, 'connect_duration_seconds'), + 'status' => Values::array_get($payload, 'status'), + 'maxParticipants' => Values::array_get($payload, 'max_participants'), + 'maxConcurrentParticipants' => Values::array_get($payload, 'max_concurrent_participants'), + 'uniqueParticipants' => Values::array_get($payload, 'unique_participants'), + 'endReason' => Values::array_get($payload, 'end_reason'), + 'endedBy' => Values::array_get($payload, 'ended_by'), + 'mixerRegion' => Values::array_get($payload, 'mixer_region'), + 'mixerRegionRequested' => Values::array_get($payload, 'mixer_region_requested'), + 'recordingEnabled' => Values::array_get($payload, 'recording_enabled'), + 'detectedIssues' => Values::array_get($payload, 'detected_issues'), + 'tags' => Values::array_get($payload, 'tags'), + 'tagInfo' => Values::array_get($payload, 'tag_info'), + 'processingState' => Values::array_get($payload, 'processing_state'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['conferenceSid' => $conferenceSid ?: $this->properties['conferenceSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConferenceContext Context for this ConferenceInstance + */ + protected function proxy(): ConferenceContext + { + if (!$this->context) { + $this->context = new ConferenceContext( + $this->version, + $this->solution['conferenceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ConferenceInstance + * + * @return ConferenceInstance Fetched ConferenceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConferenceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the conferenceParticipants + */ + protected function getConferenceParticipants(): ConferenceParticipantList + { + return $this->proxy()->conferenceParticipants; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ConferenceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/ConferenceList.php b/app/api/Twilio/Rest/Insights/V1/ConferenceList.php new file mode 100755 index 0000000..4024563 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/ConferenceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Conferences'; + } + + /** + * Reads ConferenceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConferenceInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ConferenceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConferenceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConferencePage Page of ConferenceInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConferencePage + { + $options = new Values($options); + + $params = Values::of([ + 'ConferenceSid' => + $options['conferenceSid'], + 'FriendlyName' => + $options['friendlyName'], + 'Status' => + $options['status'], + 'CreatedAfter' => + $options['createdAfter'], + 'CreatedBefore' => + $options['createdBefore'], + 'MixerRegion' => + $options['mixerRegion'], + 'Tags' => + $options['tags'], + 'Subaccount' => + $options['subaccount'], + 'DetectedIssues' => + $options['detectedIssues'], + 'EndReason' => + $options['endReason'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConferencePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConferenceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConferencePage Page of ConferenceInstance + */ + public function getPage(string $targetUrl): ConferencePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConferencePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConferenceContext + * + * @param string $conferenceSid The unique SID identifier of the Conference. + */ + public function getContext( + string $conferenceSid + + ): ConferenceContext + { + return new ConferenceContext( + $this->version, + $conferenceSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ConferenceList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/ConferenceOptions.php b/app/api/Twilio/Rest/Insights/V1/ConferenceOptions.php new file mode 100755 index 0000000..edf616a --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/ConferenceOptions.php @@ -0,0 +1,240 @@ +options['conferenceSid'] = $conferenceSid; + $this->options['friendlyName'] = $friendlyName; + $this->options['status'] = $status; + $this->options['createdAfter'] = $createdAfter; + $this->options['createdBefore'] = $createdBefore; + $this->options['mixerRegion'] = $mixerRegion; + $this->options['tags'] = $tags; + $this->options['subaccount'] = $subaccount; + $this->options['detectedIssues'] = $detectedIssues; + $this->options['endReason'] = $endReason; + } + + /** + * The SID of the conference. + * + * @param string $conferenceSid The SID of the conference. + * @return $this Fluent Builder + */ + public function setConferenceSid(string $conferenceSid): self + { + $this->options['conferenceSid'] = $conferenceSid; + return $this; + } + + /** + * Custom label for the conference resource, up to 64 characters. + * + * @param string $friendlyName Custom label for the conference resource, up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Conference status. + * + * @param string $status Conference status. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Conferences created after the provided timestamp specified in ISO 8601 format + * + * @param string $createdAfter Conferences created after the provided timestamp specified in ISO 8601 format + * @return $this Fluent Builder + */ + public function setCreatedAfter(string $createdAfter): self + { + $this->options['createdAfter'] = $createdAfter; + return $this; + } + + /** + * Conferences created before the provided timestamp specified in ISO 8601 format. + * + * @param string $createdBefore Conferences created before the provided timestamp specified in ISO 8601 format. + * @return $this Fluent Builder + */ + public function setCreatedBefore(string $createdBefore): self + { + $this->options['createdBefore'] = $createdBefore; + return $this; + } + + /** + * Twilio region where the conference media was mixed. + * + * @param string $mixerRegion Twilio region where the conference media was mixed. + * @return $this Fluent Builder + */ + public function setMixerRegion(string $mixerRegion): self + { + $this->options['mixerRegion'] = $mixerRegion; + return $this; + } + + /** + * Tags applied by Twilio for common potential configuration, quality, or performance issues. + * + * @param string $tags Tags applied by Twilio for common potential configuration, quality, or performance issues. + * @return $this Fluent Builder + */ + public function setTags(string $tags): self + { + $this->options['tags'] = $tags; + return $this; + } + + /** + * Account SID for the subaccount whose resources you wish to retrieve. + * + * @param string $subaccount Account SID for the subaccount whose resources you wish to retrieve. + * @return $this Fluent Builder + */ + public function setSubaccount(string $subaccount): self + { + $this->options['subaccount'] = $subaccount; + return $this; + } + + /** + * Potential configuration, behavior, or performance issues detected during the conference. + * + * @param string $detectedIssues Potential configuration, behavior, or performance issues detected during the conference. + * @return $this Fluent Builder + */ + public function setDetectedIssues(string $detectedIssues): self + { + $this->options['detectedIssues'] = $detectedIssues; + return $this; + } + + /** + * Conference end reason; e.g. last participant left, modified by API, etc. + * + * @param string $endReason Conference end reason; e.g. last participant left, modified by API, etc. + * @return $this Fluent Builder + */ + public function setEndReason(string $endReason): self + { + $this->options['endReason'] = $endReason; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadConferenceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/ConferencePage.php b/app/api/Twilio/Rest/Insights/V1/ConferencePage.php new file mode 100755 index 0000000..6636fee --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/ConferencePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConferenceInstance \Twilio\Rest\Insights\V1\ConferenceInstance + */ + public function buildInstance(array $payload): ConferenceInstance + { + return new ConferenceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ConferencePage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Room/ParticipantContext.php b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantContext.php new file mode 100755 index 0000000..9723f21 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantContext.php @@ -0,0 +1,87 @@ +solution = [ + 'roomSid' => + $roomSid, + 'participantSid' => + $participantSid, + ]; + + $this->uri = '/Video/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .''; + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['participantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Room/ParticipantInstance.php b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantInstance.php new file mode 100755 index 0000000..8d2f724 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'participantIdentity' => Values::array_get($payload, 'participant_identity'), + 'joinTime' => Deserialize::dateTime(Values::array_get($payload, 'join_time')), + 'leaveTime' => Deserialize::dateTime(Values::array_get($payload, 'leave_time')), + 'durationSec' => Values::array_get($payload, 'duration_sec'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'status' => Values::array_get($payload, 'status'), + 'codecs' => Values::array_get($payload, 'codecs'), + 'endReason' => Values::array_get($payload, 'end_reason'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'errorCodeUrl' => Values::array_get($payload, 'error_code_url'), + 'mediaRegion' => Values::array_get($payload, 'media_region'), + 'properties' => Values::array_get($payload, 'properties'), + 'edgeLocation' => Values::array_get($payload, 'edge_location'), + 'publisherInfo' => Values::array_get($payload, 'publisher_info'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'participantSid' => $participantSid ?: $this->properties['participantSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['roomSid'], + $this->solution['participantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/Room/ParticipantList.php b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantList.php new file mode 100755 index 0000000..aba8b08 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantList.php @@ -0,0 +1,168 @@ +solution = [ + 'roomSid' => + $roomSid, + + ]; + + $this->uri = '/Video/Rooms/' . \rawurlencode($roomSid) + .'/Participants'; + } + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $participantSid The SID of the Participant resource. + */ + public function getContext( + string $participantSid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['roomSid'], + $participantSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/Room/ParticipantPage.php b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantPage.php new file mode 100755 index 0000000..b04dfa2 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/Room/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Insights\V1\Room\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['roomSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/RoomContext.php b/app/api/Twilio/Rest/Insights/V1/RoomContext.php new file mode 100755 index 0000000..d26f18f --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/RoomContext.php @@ -0,0 +1,139 @@ +solution = [ + 'roomSid' => + $roomSid, + ]; + + $this->uri = '/Video/Rooms/' . \rawurlencode($roomSid) + .''; + } + + /** + * Fetch the RoomInstance + * + * @return RoomInstance Fetched RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoomInstance( + $this->version, + $payload, + $this->solution['roomSid'] + ); + } + + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['roomSid'] + ); + } + + return $this->_participants; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.RoomContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/RoomInstance.php b/app/api/Twilio/Rest/Insights/V1/RoomInstance.php new file mode 100755 index 0000000..83382a6 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/RoomInstance.php @@ -0,0 +1,177 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'roomName' => Values::array_get($payload, 'room_name'), + 'createTime' => Deserialize::dateTime(Values::array_get($payload, 'create_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'roomType' => Values::array_get($payload, 'room_type'), + 'roomStatus' => Values::array_get($payload, 'room_status'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'createdMethod' => Values::array_get($payload, 'created_method'), + 'endReason' => Values::array_get($payload, 'end_reason'), + 'maxParticipants' => Values::array_get($payload, 'max_participants'), + 'uniqueParticipants' => Values::array_get($payload, 'unique_participants'), + 'uniqueParticipantIdentities' => Values::array_get($payload, 'unique_participant_identities'), + 'concurrentParticipants' => Values::array_get($payload, 'concurrent_participants'), + 'maxConcurrentParticipants' => Values::array_get($payload, 'max_concurrent_participants'), + 'codecs' => Values::array_get($payload, 'codecs'), + 'mediaRegion' => Values::array_get($payload, 'media_region'), + 'durationSec' => Values::array_get($payload, 'duration_sec'), + 'totalParticipantDurationSec' => Values::array_get($payload, 'total_participant_duration_sec'), + 'totalRecordingDurationSec' => Values::array_get($payload, 'total_recording_duration_sec'), + 'processingState' => Values::array_get($payload, 'processing_state'), + 'recordingEnabled' => Values::array_get($payload, 'recording_enabled'), + 'edgeLocation' => Values::array_get($payload, 'edge_location'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['roomSid' => $roomSid ?: $this->properties['roomSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoomContext Context for this RoomInstance + */ + protected function proxy(): RoomContext + { + if (!$this->context) { + $this->context = new RoomContext( + $this->version, + $this->solution['roomSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the RoomInstance + * + * @return RoomInstance Fetched RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.RoomInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/RoomList.php b/app/api/Twilio/Rest/Insights/V1/RoomList.php new file mode 100755 index 0000000..63d1dff --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/RoomList.php @@ -0,0 +1,177 @@ +solution = [ + ]; + + $this->uri = '/Video/Rooms'; + } + + /** + * Reads RoomInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoomInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RoomInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoomInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RoomPage Page of RoomInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RoomPage + { + $options = new Values($options); + + $params = Values::of([ + 'RoomType' => + $options['roomType'], + 'Codec' => + $options['codec'], + 'RoomName' => + $options['roomName'], + 'CreatedAfter' => + Serialize::iso8601DateTime($options['createdAfter']), + 'CreatedBefore' => + Serialize::iso8601DateTime($options['createdBefore']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RoomPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoomInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RoomPage Page of RoomInstance + */ + public function getPage(string $targetUrl): RoomPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RoomPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoomContext + * + * @param string $roomSid The SID of the Room resource. + */ + public function getContext( + string $roomSid + + ): RoomContext + { + return new RoomContext( + $this->version, + $roomSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.RoomList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/RoomOptions.php b/app/api/Twilio/Rest/Insights/V1/RoomOptions.php new file mode 100755 index 0000000..dfb930a --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/RoomOptions.php @@ -0,0 +1,150 @@ +options['roomType'] = $roomType; + $this->options['codec'] = $codec; + $this->options['roomName'] = $roomName; + $this->options['createdAfter'] = $createdAfter; + $this->options['createdBefore'] = $createdBefore; + } + + /** + * Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + * + * @param string $roomType Type of room. Can be `go`, `peer_to_peer`, `group`, or `group_small`. + * @return $this Fluent Builder + */ + public function setRoomType(array $roomType): self + { + $this->options['roomType'] = $roomType; + return $this; + } + + /** + * Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + * + * @param string $codec Codecs used by participants in the room. Can be `VP8`, `H264`, or `VP9`. + * @return $this Fluent Builder + */ + public function setCodec(array $codec): self + { + $this->options['codec'] = $codec; + return $this; + } + + /** + * Room friendly name. + * + * @param string $roomName Room friendly name. + * @return $this Fluent Builder + */ + public function setRoomName(string $roomName): self + { + $this->options['roomName'] = $roomName; + return $this; + } + + /** + * Only read rooms that started on or after this ISO 8601 timestamp. + * + * @param \DateTime $createdAfter Only read rooms that started on or after this ISO 8601 timestamp. + * @return $this Fluent Builder + */ + public function setCreatedAfter(\DateTime $createdAfter): self + { + $this->options['createdAfter'] = $createdAfter; + return $this; + } + + /** + * Only read rooms that started before this ISO 8601 timestamp. + * + * @param \DateTime $createdBefore Only read rooms that started before this ISO 8601 timestamp. + * @return $this Fluent Builder + */ + public function setCreatedBefore(\DateTime $createdBefore): self + { + $this->options['createdBefore'] = $createdBefore; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.ReadRoomOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/RoomPage.php b/app/api/Twilio/Rest/Insights/V1/RoomPage.php new file mode 100755 index 0000000..5ede3bf --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/RoomPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoomInstance \Twilio\Rest\Insights\V1\RoomInstance + */ + public function buildInstance(array $payload): RoomInstance + { + return new RoomInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.RoomPage]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/SettingContext.php b/app/api/Twilio/Rest/Insights/V1/SettingContext.php new file mode 100755 index 0000000..8e7198c --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/SettingContext.php @@ -0,0 +1,116 @@ +solution = [ + ]; + + $this->uri = '/Voice/Settings'; + } + + /** + * Fetch the SettingInstance + * + * @param array|Options $options Optional Arguments + * @return SettingInstance Fetched SettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): SettingInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'SubaccountSid' => + $options['subaccountSid'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new SettingInstance( + $this->version, + $payload + ); + } + + + /** + * Update the SettingInstance + * + * @param array|Options $options Optional Arguments + * @return SettingInstance Updated SettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SettingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AdvancedFeatures' => + Serialize::booleanToString($options['advancedFeatures']), + 'VoiceTrace' => + Serialize::booleanToString($options['voiceTrace']), + 'SubaccountSid' => + $options['subaccountSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SettingInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.SettingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/SettingInstance.php b/app/api/Twilio/Rest/Insights/V1/SettingInstance.php new file mode 100755 index 0000000..3c83ab7 --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/SettingInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'advancedFeatures' => Values::array_get($payload, 'advanced_features'), + 'voiceTrace' => Values::array_get($payload, 'voice_trace'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SettingContext Context for this SettingInstance + */ + protected function proxy(): SettingContext + { + if (!$this->context) { + $this->context = new SettingContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the SettingInstance + * + * @param array|Options $options Optional Arguments + * @return SettingInstance Fetched SettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): SettingInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Update the SettingInstance + * + * @param array|Options $options Optional Arguments + * @return SettingInstance Updated SettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SettingInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Insights.V1.SettingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/SettingList.php b/app/api/Twilio/Rest/Insights/V1/SettingList.php new file mode 100755 index 0000000..14a58ab --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/SettingList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a SettingContext + */ + public function getContext( + + ): SettingContext + { + return new SettingContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.SettingList]'; + } +} diff --git a/app/api/Twilio/Rest/Insights/V1/SettingOptions.php b/app/api/Twilio/Rest/Insights/V1/SettingOptions.php new file mode 100755 index 0000000..1491d5d --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/SettingOptions.php @@ -0,0 +1,164 @@ +options['subaccountSid'] = $subaccountSid; + } + + /** + * + * + * @param string $subaccountSid + * @return $this Fluent Builder + */ + public function setSubaccountSid(string $subaccountSid): self + { + $this->options['subaccountSid'] = $subaccountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.FetchSettingOptions ' . $options . ']'; + } +} + +class UpdateSettingOptions extends Options + { + /** + * @param bool $advancedFeatures + * @param bool $voiceTrace + * @param string $subaccountSid + */ + public function __construct( + + bool $advancedFeatures = Values::BOOL_NONE, + bool $voiceTrace = Values::BOOL_NONE, + string $subaccountSid = Values::NONE + + ) { + $this->options['advancedFeatures'] = $advancedFeatures; + $this->options['voiceTrace'] = $voiceTrace; + $this->options['subaccountSid'] = $subaccountSid; + } + + /** + * + * + * @param bool $advancedFeatures + * @return $this Fluent Builder + */ + public function setAdvancedFeatures(bool $advancedFeatures): self + { + $this->options['advancedFeatures'] = $advancedFeatures; + return $this; + } + + /** + * + * + * @param bool $voiceTrace + * @return $this Fluent Builder + */ + public function setVoiceTrace(bool $voiceTrace): self + { + $this->options['voiceTrace'] = $voiceTrace; + return $this; + } + + /** + * + * + * @param string $subaccountSid + * @return $this Fluent Builder + */ + public function setSubaccountSid(string $subaccountSid): self + { + $this->options['subaccountSid'] = $subaccountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Insights.V1.UpdateSettingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Insights/V1/SettingPage.php b/app/api/Twilio/Rest/Insights/V1/SettingPage.php new file mode 100755 index 0000000..b95986b --- /dev/null +++ b/app/api/Twilio/Rest/Insights/V1/SettingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SettingInstance \Twilio\Rest\Insights\V1\SettingInstance + */ + public function buildInstance(array $payload): SettingInstance + { + return new SettingInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Insights.V1.SettingPage]'; + } +} diff --git a/app/api/Twilio/Rest/InsightsBase.php b/app/api/Twilio/Rest/InsightsBase.php new file mode 100755 index 0000000..59838be --- /dev/null +++ b/app/api/Twilio/Rest/InsightsBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://insights.twilio.com'; + } + + + /** + * @return V1 Version v1 of insights + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Insights]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging.php b/app/api/Twilio/Rest/IpMessaging.php new file mode 100755 index 0000000..40d259b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging.php @@ -0,0 +1,42 @@ +credentials instead. + */ + protected function getCredentials(): \Twilio\Rest\IpMessaging\V2\CredentialList { + echo "credentials is deprecated. Use v2->credentials instead."; + return $this->v2->credentials; + } + + /** + * @deprecated Use v2->credentials(\$sid) instead. + * @param string $sid The sid + */ + protected function contextCredentials(string $sid): \Twilio\Rest\IpMessaging\V2\CredentialContext { + echo "credentials(\$sid) is deprecated. Use v2->credentials(\$sid) instead."; + return $this->v2->credentials($sid); + } + + /** + * @deprecated Use v2->services instead. + */ + protected function getServices(): \Twilio\Rest\IpMessaging\V2\ServiceList { + echo "services is deprecated. Use v2->services instead."; + return $this->v2->services; + } + + /** + * @deprecated Use v2->services(\$sid) instead. + * @param string $sid The sid + */ + protected function contextServices(string $sid): \Twilio\Rest\IpMessaging\V2\ServiceContext { + echo "services($sid) is deprecated. Use v2->services(\$sid) instead."; + return $this->v2->services($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/IpMessaging/V1.php b/app/api/Twilio/Rest/IpMessaging/V1.php new file mode 100755 index 0000000..dc7506e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1.php @@ -0,0 +1,107 @@ +version = 'v1'; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/CredentialContext.php b/app/api/Twilio/Rest/IpMessaging/V1/CredentialContext.php new file mode 100755 index 0000000..a254eb4 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/CredentialContext.php @@ -0,0 +1,134 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/CredentialInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/CredentialInstance.php new file mode 100755 index 0000000..3723a8e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/CredentialList.php b/app/api/Twilio/Rest/IpMessaging/V1/CredentialList.php new file mode 100755 index 0000000..19b1b1b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/CredentialOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/CredentialOptions.php new file mode 100755 index 0000000..e43d686 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/CredentialOptions.php @@ -0,0 +1,314 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $certificate + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * + * + * @param string $privateKey + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * + * + * @param bool $sandbox + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * + * + * @param string $apiKey + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * + * + * @param string $secret + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $friendlyName + * @param string $certificate + * @param string $privateKey + * @param bool $sandbox + * @param string $apiKey + * @param string $secret + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $certificate + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * + * + * @param string $privateKey + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * + * + * @param bool $sandbox + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * + * + * @param string $apiKey + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * + * + * @param string $secret + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/CredentialPage.php b/app/api/Twilio/Rest/IpMessaging/V1/CredentialPage.php new file mode 100755 index 0000000..70c5f65 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\IpMessaging\V1\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteContext.php new file mode 100755 index 0000000..2fc22dd --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.InviteContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteInstance.php new file mode 100755 index 0000000..8fb31de --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InviteContext Context for this InviteInstance + */ + protected function proxy(): InviteContext + { + if (!$this->context) { + $this->context = new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.InviteInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteList.php new file mode 100755 index 0000000..f0d2648 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites'; + } + + /** + * Create the InviteInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return InviteInstance Created InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): InviteInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InviteInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InviteInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InviteInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InviteInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InvitePage Page of InviteInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InvitePage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InvitePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InviteInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InvitePage Page of InviteInstance + */ + public function getPage(string $targetUrl): InvitePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InvitePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InviteContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): InviteContext + { + return new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.InviteList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteOptions.php new file mode 100755 index 0000000..d77d0f8 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InviteOptions.php @@ -0,0 +1,132 @@ +options['roleSid'] = $roleSid; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateInviteOptions ' . $options . ']'; + } +} + + + +class ReadInviteOptions extends Options + { + /** + * @param string[] $identity + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * + * + * @param string[] $identity + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.ReadInviteOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InvitePage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InvitePage.php new file mode 100755 index 0000000..8fde214 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/InvitePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InviteInstance \Twilio\Rest\IpMessaging\V1\Service\Channel\InviteInstance + */ + public function buildInstance(array $payload): InviteInstance + { + return new InviteInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.InvitePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberContext.php new file mode 100755 index 0000000..59e4b96 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MemberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.MemberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberInstance.php new file mode 100755 index 0000000..cf2f2df --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'lastConsumptionTimestamp' => Deserialize::dateTime(Values::array_get($payload, 'last_consumption_timestamp')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MemberContext Context for this MemberInstance + */ + protected function proxy(): MemberContext + { + if (!$this->context) { + $this->context = new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MemberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.MemberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberList.php new file mode 100755 index 0000000..67bdece --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members'; + } + + /** + * Create the MemberInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return MemberInstance Created MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MemberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MemberInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MemberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MemberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MemberPage Page of MemberInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MemberPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MemberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MemberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MemberPage Page of MemberInstance + */ + public function getPage(string $targetUrl): MemberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MemberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MemberContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): MemberContext + { + return new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.MemberList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberOptions.php new file mode 100755 index 0000000..ba2bf69 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberOptions.php @@ -0,0 +1,202 @@ +options['roleSid'] = $roleSid; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateMemberOptions ' . $options . ']'; + } +} + + + +class ReadMemberOptions extends Options + { + /** + * @param string[] $identity + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * + * + * @param string[] $identity + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.ReadMemberOptions ' . $options . ']'; + } +} + +class UpdateMemberOptions extends Options + { + /** + * @param string $roleSid + * @param int $lastConsumedMessageIndex + */ + public function __construct( + + string $roleSid = Values::NONE, + int $lastConsumedMessageIndex = Values::INT_NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param int $lastConsumedMessageIndex + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateMemberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberPage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberPage.php new file mode 100755 index 0000000..ae17377 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MemberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MemberInstance \Twilio\Rest\IpMessaging\V1\Service\Channel\MemberInstance + */ + public function buildInstance(array $payload): MemberInstance + { + return new MemberInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.MemberPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageContext.php new file mode 100755 index 0000000..afeb29f --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageInstance.php new file mode 100755 index 0000000..3d6cc94 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageInstance.php @@ -0,0 +1,170 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'wasEdited' => Values::array_get($payload, 'was_edited'), + 'from' => Values::array_get($payload, 'from'), + 'body' => Values::array_get($payload, 'body'), + 'index' => Values::array_get($payload, 'index'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageList.php new file mode 100755 index 0000000..dff81bc --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageList.php @@ -0,0 +1,216 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param string $body + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $body, array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $body, + 'From' => + $options['from'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageOptions.php new file mode 100755 index 0000000..ee385c7 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessageOptions.php @@ -0,0 +1,220 @@ +options['from'] = $from; + $this->options['attributes'] = $attributes; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateMessageOptions ' . $options . ']'; + } +} + + + +class ReadMessageOptions extends Options + { + /** + * @param string $order + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * + * + * @param string $order + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $body + * @param string $attributes + */ + public function __construct( + + string $body = Values::NONE, + string $attributes = Values::NONE + + ) { + $this->options['body'] = $body; + $this->options['attributes'] = $attributes; + } + + /** + * + * + * @param string $body + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessagePage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessagePage.php new file mode 100755 index 0000000..51a8be4 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/Channel/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\IpMessaging\V1\Service\Channel\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelContext.php new file mode 100755 index 0000000..7f52ca7 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelContext.php @@ -0,0 +1,233 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + if (!$this->_members) { + $this->_members = new MemberList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + if (!$this->_invites) { + $this->_invites = new InviteList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_invites; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelInstance.php new file mode 100755 index 0000000..841f55e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelInstance.php @@ -0,0 +1,201 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'type' => Values::array_get($payload, 'type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'membersCount' => Values::array_get($payload, 'members_count'), + 'messagesCount' => Values::array_get($payload, 'messages_count'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + return $this->proxy()->members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + return $this->proxy()->invites; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelList.php new file mode 100755 index 0000000..b7004c1 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelList.php @@ -0,0 +1,209 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels'; + } + + /** + * Create the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Created ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'Type' => + $options['type'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChannelInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChannelPage Page of ChannelInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChannelPage + { + $options = new Values($options); + + $params = Values::of([ + 'Type' => + $options['type'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChannelPage Page of ChannelInstance + */ + public function getPage(string $targetUrl): ChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChannelContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelOptions.php new file mode 100755 index 0000000..cd14b7e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelOptions.php @@ -0,0 +1,272 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['type'] = $type; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateChannelOptions ' . $options . ']'; + } +} + + + +class ReadChannelOptions extends Options + { + /** + * @param string $type + */ + public function __construct( + + array $type = Values::ARRAY_NONE + + ) { + $this->options['type'] = $type; + } + + /** + * + * + * @param string $type + * @return $this Fluent Builder + */ + public function setType(array $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.ReadChannelOptions ' . $options . ']'; + } +} + +class UpdateChannelOptions extends Options + { + /** + * @param string $friendlyName + * @param string $uniqueName + * @param string $attributes + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + string $attributes = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelPage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelPage.php new file mode 100755 index 0000000..aa5ce99 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\IpMessaging\V1\Service\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleContext.php new file mode 100755 index 0000000..3808922 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleContext.php @@ -0,0 +1,128 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleInstance.php new file mode 100755 index 0000000..6a622db --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleList.php new file mode 100755 index 0000000..0302cc5 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/RoleList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName + * @param string $type + * @param string[] $permission + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/RolePage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/RolePage.php new file mode 100755 index 0000000..e448ee1 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\IpMessaging\V1\Service\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelInstance.php new file mode 100755 index 0000000..cff2090 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelInstance.php @@ -0,0 +1,96 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'memberSid' => Values::array_get($payload, 'member_sid'), + 'status' => Values::array_get($payload, 'status'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.UserChannelInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelList.php new file mode 100755 index 0000000..924918b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelList.php @@ -0,0 +1,157 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels'; + } + + /** + * Reads UserChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserChannelPage Page of UserChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserChannelPage Page of UserChannelInstance + */ + public function getPage(string $targetUrl): UserChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.UserChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelPage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelPage.php new file mode 100755 index 0000000..d145b97 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/User/UserChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserChannelInstance \Twilio\Rest\IpMessaging\V1\Service\User\UserChannelInstance + */ + public function buildInstance(array $payload): UserChannelInstance + { + return new UserChannelInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.UserChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/UserContext.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserContext.php new file mode 100755 index 0000000..2cd756c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserContext.php @@ -0,0 +1,192 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + if (!$this->_userChannels) { + $this->_userChannels = new UserChannelList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userChannels; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/UserInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserInstance.php new file mode 100755 index 0000000..a2e9303 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserInstance.php @@ -0,0 +1,181 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'joinedChannelsCount' => Values::array_get($payload, 'joined_channels_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + return $this->proxy()->userChannels; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/UserList.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserList.php new file mode 100755 index 0000000..b0625f5 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserList.php @@ -0,0 +1,204 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/UserOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserOptions.php new file mode 100755 index 0000000..07f61aa --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserOptions.php @@ -0,0 +1,206 @@ +options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.CreateUserOptions ' . $options . ']'; + } +} + + + + +class UpdateUserOptions extends Options + { + /** + * @param string $roleSid + * @param string $attributes + * @param string $friendlyName + */ + public function __construct( + + string $roleSid = Values::NONE, + string $attributes = Values::NONE, + string $friendlyName = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/Service/UserPage.php b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserPage.php new file mode 100755 index 0000000..ca2668e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/Service/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\IpMessaging\V1\Service\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/ServiceContext.php b/app/api/Twilio/Rest/IpMessaging/V1/ServiceContext.php new file mode 100755 index 0000000..634060a --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/ServiceContext.php @@ -0,0 +1,326 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DefaultServiceRoleSid' => + $options['defaultServiceRoleSid'], + 'DefaultChannelRoleSid' => + $options['defaultChannelRoleSid'], + 'DefaultChannelCreatorRoleSid' => + $options['defaultChannelCreatorRoleSid'], + 'ReadStatusEnabled' => + Serialize::booleanToString($options['readStatusEnabled']), + 'ReachabilityEnabled' => + Serialize::booleanToString($options['reachabilityEnabled']), + 'TypingIndicatorTimeout' => + $options['typingIndicatorTimeout'], + 'ConsumptionReportInterval' => + $options['consumptionReportInterval'], + 'Notifications.NewMessage.Enabled' => + Serialize::booleanToString($options['notificationsNewMessageEnabled']), + 'Notifications.NewMessage.Template' => + $options['notificationsNewMessageTemplate'], + 'Notifications.AddedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsAddedToChannelEnabled']), + 'Notifications.AddedToChannel.Template' => + $options['notificationsAddedToChannelTemplate'], + 'Notifications.RemovedFromChannel.Enabled' => + Serialize::booleanToString($options['notificationsRemovedFromChannelEnabled']), + 'Notifications.RemovedFromChannel.Template' => + $options['notificationsRemovedFromChannelTemplate'], + 'Notifications.InvitedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsInvitedToChannelEnabled']), + 'Notifications.InvitedToChannel.Template' => + $options['notificationsInvitedToChannelTemplate'], + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + 'WebhookFilters' => + Serialize::map($options['webhookFilters'], function ($e) { return $e; }), + 'Webhooks.OnMessageSend.Url' => + $options['webhooksOnMessageSendUrl'], + 'Webhooks.OnMessageSend.Method' => + $options['webhooksOnMessageSendMethod'], + 'Webhooks.OnMessageUpdate.Url' => + $options['webhooksOnMessageUpdateUrl'], + 'Webhooks.OnMessageUpdate.Method' => + $options['webhooksOnMessageUpdateMethod'], + 'Webhooks.OnMessageRemove.Url' => + $options['webhooksOnMessageRemoveUrl'], + 'Webhooks.OnMessageRemove.Method' => + $options['webhooksOnMessageRemoveMethod'], + 'Webhooks.OnChannelAdd.Url' => + $options['webhooksOnChannelAddUrl'], + 'Webhooks.OnChannelAdd.Method' => + $options['webhooksOnChannelAddMethod'], + 'Webhooks.OnChannelDestroy.Url' => + $options['webhooksOnChannelDestroyUrl'], + 'Webhooks.OnChannelDestroy.Method' => + $options['webhooksOnChannelDestroyMethod'], + 'Webhooks.OnChannelUpdate.Url' => + $options['webhooksOnChannelUpdateUrl'], + 'Webhooks.OnChannelUpdate.Method' => + $options['webhooksOnChannelUpdateMethod'], + 'Webhooks.OnMemberAdd.Url' => + $options['webhooksOnMemberAddUrl'], + 'Webhooks.OnMemberAdd.Method' => + $options['webhooksOnMemberAddMethod'], + 'Webhooks.OnMemberRemove.Url' => + $options['webhooksOnMemberRemoveUrl'], + 'Webhooks.OnMemberRemove.Method' => + $options['webhooksOnMemberRemoveMethod'], + 'Webhooks.OnMessageSent.Url' => + $options['webhooksOnMessageSentUrl'], + 'Webhooks.OnMessageSent.Method' => + $options['webhooksOnMessageSentMethod'], + 'Webhooks.OnMessageUpdated.Url' => + $options['webhooksOnMessageUpdatedUrl'], + 'Webhooks.OnMessageUpdated.Method' => + $options['webhooksOnMessageUpdatedMethod'], + 'Webhooks.OnMessageRemoved.Url' => + $options['webhooksOnMessageRemovedUrl'], + 'Webhooks.OnMessageRemoved.Method' => + $options['webhooksOnMessageRemovedMethod'], + 'Webhooks.OnChannelAdded.Url' => + $options['webhooksOnChannelAddedUrl'], + 'Webhooks.OnChannelAdded.Method' => + $options['webhooksOnChannelAddedMethod'], + 'Webhooks.OnChannelDestroyed.Url' => + $options['webhooksOnChannelDestroyedUrl'], + 'Webhooks.OnChannelDestroyed.Method' => + $options['webhooksOnChannelDestroyedMethod'], + 'Webhooks.OnChannelUpdated.Url' => + $options['webhooksOnChannelUpdatedUrl'], + 'Webhooks.OnChannelUpdated.Method' => + $options['webhooksOnChannelUpdatedMethod'], + 'Webhooks.OnMemberAdded.Url' => + $options['webhooksOnMemberAddedUrl'], + 'Webhooks.OnMemberAdded.Method' => + $options['webhooksOnMemberAddedMethod'], + 'Webhooks.OnMemberRemoved.Url' => + $options['webhooksOnMemberRemovedUrl'], + 'Webhooks.OnMemberRemoved.Method' => + $options['webhooksOnMemberRemovedMethod'], + 'Limits.ChannelMembers' => + $options['limitsChannelMembers'], + 'Limits.UserChannels' => + $options['limitsUserChannels'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + if (!$this->_channels) { + $this->_channels = new ChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_channels; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_users; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/ServiceInstance.php b/app/api/Twilio/Rest/IpMessaging/V1/ServiceInstance.php new file mode 100755 index 0000000..9d8b618 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/ServiceInstance.php @@ -0,0 +1,213 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'defaultServiceRoleSid' => Values::array_get($payload, 'default_service_role_sid'), + 'defaultChannelRoleSid' => Values::array_get($payload, 'default_channel_role_sid'), + 'defaultChannelCreatorRoleSid' => Values::array_get($payload, 'default_channel_creator_role_sid'), + 'readStatusEnabled' => Values::array_get($payload, 'read_status_enabled'), + 'reachabilityEnabled' => Values::array_get($payload, 'reachability_enabled'), + 'typingIndicatorTimeout' => Values::array_get($payload, 'typing_indicator_timeout'), + 'consumptionReportInterval' => Values::array_get($payload, 'consumption_report_interval'), + 'limits' => Values::array_get($payload, 'limits'), + 'webhooks' => Values::array_get($payload, 'webhooks'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'webhookFilters' => Values::array_get($payload, 'webhook_filters'), + 'notifications' => Values::array_get($payload, 'notifications'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + return $this->proxy()->channels; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + return $this->proxy()->roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + return $this->proxy()->users; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/ServiceList.php b/app/api/Twilio/Rest/IpMessaging/V1/ServiceList.php new file mode 100755 index 0000000..361eb3d --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/ServiceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): ServiceInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V1/ServiceOptions.php b/app/api/Twilio/Rest/IpMessaging/V1/ServiceOptions.php new file mode 100755 index 0000000..ca9b2fb --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/ServiceOptions.php @@ -0,0 +1,1038 @@ +options['friendlyName'] = $friendlyName; + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + $this->options['readStatusEnabled'] = $readStatusEnabled; + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + $this->options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + $this->options['webhookFilters'] = $webhookFilters; + $this->options['webhooksOnMessageSendUrl'] = $webhooksOnMessageSendUrl; + $this->options['webhooksOnMessageSendMethod'] = $webhooksOnMessageSendMethod; + $this->options['webhooksOnMessageUpdateUrl'] = $webhooksOnMessageUpdateUrl; + $this->options['webhooksOnMessageUpdateMethod'] = $webhooksOnMessageUpdateMethod; + $this->options['webhooksOnMessageRemoveUrl'] = $webhooksOnMessageRemoveUrl; + $this->options['webhooksOnMessageRemoveMethod'] = $webhooksOnMessageRemoveMethod; + $this->options['webhooksOnChannelAddUrl'] = $webhooksOnChannelAddUrl; + $this->options['webhooksOnChannelAddMethod'] = $webhooksOnChannelAddMethod; + $this->options['webhooksOnChannelDestroyUrl'] = $webhooksOnChannelDestroyUrl; + $this->options['webhooksOnChannelDestroyMethod'] = $webhooksOnChannelDestroyMethod; + $this->options['webhooksOnChannelUpdateUrl'] = $webhooksOnChannelUpdateUrl; + $this->options['webhooksOnChannelUpdateMethod'] = $webhooksOnChannelUpdateMethod; + $this->options['webhooksOnMemberAddUrl'] = $webhooksOnMemberAddUrl; + $this->options['webhooksOnMemberAddMethod'] = $webhooksOnMemberAddMethod; + $this->options['webhooksOnMemberRemoveUrl'] = $webhooksOnMemberRemoveUrl; + $this->options['webhooksOnMemberRemoveMethod'] = $webhooksOnMemberRemoveMethod; + $this->options['webhooksOnMessageSentUrl'] = $webhooksOnMessageSentUrl; + $this->options['webhooksOnMessageSentMethod'] = $webhooksOnMessageSentMethod; + $this->options['webhooksOnMessageUpdatedUrl'] = $webhooksOnMessageUpdatedUrl; + $this->options['webhooksOnMessageUpdatedMethod'] = $webhooksOnMessageUpdatedMethod; + $this->options['webhooksOnMessageRemovedUrl'] = $webhooksOnMessageRemovedUrl; + $this->options['webhooksOnMessageRemovedMethod'] = $webhooksOnMessageRemovedMethod; + $this->options['webhooksOnChannelAddedUrl'] = $webhooksOnChannelAddedUrl; + $this->options['webhooksOnChannelAddedMethod'] = $webhooksOnChannelAddedMethod; + $this->options['webhooksOnChannelDestroyedUrl'] = $webhooksOnChannelDestroyedUrl; + $this->options['webhooksOnChannelDestroyedMethod'] = $webhooksOnChannelDestroyedMethod; + $this->options['webhooksOnChannelUpdatedUrl'] = $webhooksOnChannelUpdatedUrl; + $this->options['webhooksOnChannelUpdatedMethod'] = $webhooksOnChannelUpdatedMethod; + $this->options['webhooksOnMemberAddedUrl'] = $webhooksOnMemberAddedUrl; + $this->options['webhooksOnMemberAddedMethod'] = $webhooksOnMemberAddedMethod; + $this->options['webhooksOnMemberRemovedUrl'] = $webhooksOnMemberRemovedUrl; + $this->options['webhooksOnMemberRemovedMethod'] = $webhooksOnMemberRemovedMethod; + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + $this->options['limitsUserChannels'] = $limitsUserChannels; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $defaultServiceRoleSid + * @return $this Fluent Builder + */ + public function setDefaultServiceRoleSid(string $defaultServiceRoleSid): self + { + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + return $this; + } + + /** + * + * + * @param string $defaultChannelRoleSid + * @return $this Fluent Builder + */ + public function setDefaultChannelRoleSid(string $defaultChannelRoleSid): self + { + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + return $this; + } + + /** + * + * + * @param string $defaultChannelCreatorRoleSid + * @return $this Fluent Builder + */ + public function setDefaultChannelCreatorRoleSid(string $defaultChannelCreatorRoleSid): self + { + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + return $this; + } + + /** + * + * + * @param bool $readStatusEnabled + * @return $this Fluent Builder + */ + public function setReadStatusEnabled(bool $readStatusEnabled): self + { + $this->options['readStatusEnabled'] = $readStatusEnabled; + return $this; + } + + /** + * + * + * @param bool $reachabilityEnabled + * @return $this Fluent Builder + */ + public function setReachabilityEnabled(bool $reachabilityEnabled): self + { + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + return $this; + } + + /** + * + * + * @param int $typingIndicatorTimeout + * @return $this Fluent Builder + */ + public function setTypingIndicatorTimeout(int $typingIndicatorTimeout): self + { + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + return $this; + } + + /** + * + * + * @param int $consumptionReportInterval + * @return $this Fluent Builder + */ + public function setConsumptionReportInterval(int $consumptionReportInterval): self + { + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + return $this; + } + + /** + * + * + * @param bool $notificationsNewMessageEnabled + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageEnabled(bool $notificationsNewMessageEnabled): self + { + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsNewMessageTemplate + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageTemplate(string $notificationsNewMessageTemplate): self + { + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + return $this; + } + + /** + * + * + * @param bool $notificationsAddedToChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelEnabled(bool $notificationsAddedToChannelEnabled): self + { + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsAddedToChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelTemplate(string $notificationsAddedToChannelTemplate): self + { + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + return $this; + } + + /** + * + * + * @param bool $notificationsRemovedFromChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelEnabled(bool $notificationsRemovedFromChannelEnabled): self + { + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsRemovedFromChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelTemplate(string $notificationsRemovedFromChannelTemplate): self + { + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + return $this; + } + + /** + * + * + * @param bool $notificationsInvitedToChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelEnabled(bool $notificationsInvitedToChannelEnabled): self + { + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsInvitedToChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelTemplate(string $notificationsInvitedToChannelTemplate): self + { + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + return $this; + } + + /** + * + * + * @param string $preWebhookUrl + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * + * + * @param string $postWebhookUrl + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * + * + * @param string $webhookMethod + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * + * + * @param string[] $webhookFilters + * @return $this Fluent Builder + */ + public function setWebhookFilters(array $webhookFilters): self + { + $this->options['webhookFilters'] = $webhookFilters; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageSendUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSendUrl(string $webhooksOnMessageSendUrl): self + { + $this->options['webhooksOnMessageSendUrl'] = $webhooksOnMessageSendUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageSendMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSendMethod(string $webhooksOnMessageSendMethod): self + { + $this->options['webhooksOnMessageSendMethod'] = $webhooksOnMessageSendMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageUpdateUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdateUrl(string $webhooksOnMessageUpdateUrl): self + { + $this->options['webhooksOnMessageUpdateUrl'] = $webhooksOnMessageUpdateUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageUpdateMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdateMethod(string $webhooksOnMessageUpdateMethod): self + { + $this->options['webhooksOnMessageUpdateMethod'] = $webhooksOnMessageUpdateMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageRemoveUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemoveUrl(string $webhooksOnMessageRemoveUrl): self + { + $this->options['webhooksOnMessageRemoveUrl'] = $webhooksOnMessageRemoveUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageRemoveMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemoveMethod(string $webhooksOnMessageRemoveMethod): self + { + $this->options['webhooksOnMessageRemoveMethod'] = $webhooksOnMessageRemoveMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelAddUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddUrl(string $webhooksOnChannelAddUrl): self + { + $this->options['webhooksOnChannelAddUrl'] = $webhooksOnChannelAddUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelAddMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddMethod(string $webhooksOnChannelAddMethod): self + { + $this->options['webhooksOnChannelAddMethod'] = $webhooksOnChannelAddMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelDestroyUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyUrl(string $webhooksOnChannelDestroyUrl): self + { + $this->options['webhooksOnChannelDestroyUrl'] = $webhooksOnChannelDestroyUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelDestroyMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyMethod(string $webhooksOnChannelDestroyMethod): self + { + $this->options['webhooksOnChannelDestroyMethod'] = $webhooksOnChannelDestroyMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelUpdateUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdateUrl(string $webhooksOnChannelUpdateUrl): self + { + $this->options['webhooksOnChannelUpdateUrl'] = $webhooksOnChannelUpdateUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelUpdateMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdateMethod(string $webhooksOnChannelUpdateMethod): self + { + $this->options['webhooksOnChannelUpdateMethod'] = $webhooksOnChannelUpdateMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberAddUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddUrl(string $webhooksOnMemberAddUrl): self + { + $this->options['webhooksOnMemberAddUrl'] = $webhooksOnMemberAddUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberAddMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddMethod(string $webhooksOnMemberAddMethod): self + { + $this->options['webhooksOnMemberAddMethod'] = $webhooksOnMemberAddMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberRemoveUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemoveUrl(string $webhooksOnMemberRemoveUrl): self + { + $this->options['webhooksOnMemberRemoveUrl'] = $webhooksOnMemberRemoveUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberRemoveMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemoveMethod(string $webhooksOnMemberRemoveMethod): self + { + $this->options['webhooksOnMemberRemoveMethod'] = $webhooksOnMemberRemoveMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageSentUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSentUrl(string $webhooksOnMessageSentUrl): self + { + $this->options['webhooksOnMessageSentUrl'] = $webhooksOnMessageSentUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageSentMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageSentMethod(string $webhooksOnMessageSentMethod): self + { + $this->options['webhooksOnMessageSentMethod'] = $webhooksOnMessageSentMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageUpdatedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdatedUrl(string $webhooksOnMessageUpdatedUrl): self + { + $this->options['webhooksOnMessageUpdatedUrl'] = $webhooksOnMessageUpdatedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageUpdatedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageUpdatedMethod(string $webhooksOnMessageUpdatedMethod): self + { + $this->options['webhooksOnMessageUpdatedMethod'] = $webhooksOnMessageUpdatedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageRemovedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemovedUrl(string $webhooksOnMessageRemovedUrl): self + { + $this->options['webhooksOnMessageRemovedUrl'] = $webhooksOnMessageRemovedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMessageRemovedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMessageRemovedMethod(string $webhooksOnMessageRemovedMethod): self + { + $this->options['webhooksOnMessageRemovedMethod'] = $webhooksOnMessageRemovedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelAddedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddedUrl(string $webhooksOnChannelAddedUrl): self + { + $this->options['webhooksOnChannelAddedUrl'] = $webhooksOnChannelAddedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelAddedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelAddedMethod(string $webhooksOnChannelAddedMethod): self + { + $this->options['webhooksOnChannelAddedMethod'] = $webhooksOnChannelAddedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelDestroyedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyedUrl(string $webhooksOnChannelDestroyedUrl): self + { + $this->options['webhooksOnChannelDestroyedUrl'] = $webhooksOnChannelDestroyedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelDestroyedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelDestroyedMethod(string $webhooksOnChannelDestroyedMethod): self + { + $this->options['webhooksOnChannelDestroyedMethod'] = $webhooksOnChannelDestroyedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelUpdatedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdatedUrl(string $webhooksOnChannelUpdatedUrl): self + { + $this->options['webhooksOnChannelUpdatedUrl'] = $webhooksOnChannelUpdatedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnChannelUpdatedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnChannelUpdatedMethod(string $webhooksOnChannelUpdatedMethod): self + { + $this->options['webhooksOnChannelUpdatedMethod'] = $webhooksOnChannelUpdatedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberAddedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddedUrl(string $webhooksOnMemberAddedUrl): self + { + $this->options['webhooksOnMemberAddedUrl'] = $webhooksOnMemberAddedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberAddedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberAddedMethod(string $webhooksOnMemberAddedMethod): self + { + $this->options['webhooksOnMemberAddedMethod'] = $webhooksOnMemberAddedMethod; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberRemovedUrl + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemovedUrl(string $webhooksOnMemberRemovedUrl): self + { + $this->options['webhooksOnMemberRemovedUrl'] = $webhooksOnMemberRemovedUrl; + return $this; + } + + /** + * + * + * @param string $webhooksOnMemberRemovedMethod + * @return $this Fluent Builder + */ + public function setWebhooksOnMemberRemovedMethod(string $webhooksOnMemberRemovedMethod): self + { + $this->options['webhooksOnMemberRemovedMethod'] = $webhooksOnMemberRemovedMethod; + return $this; + } + + /** + * + * + * @param int $limitsChannelMembers + * @return $this Fluent Builder + */ + public function setLimitsChannelMembers(int $limitsChannelMembers): self + { + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + return $this; + } + + /** + * + * + * @param int $limitsUserChannels + * @return $this Fluent Builder + */ + public function setLimitsUserChannels(int $limitsUserChannels): self + { + $this->options['limitsUserChannels'] = $limitsUserChannels; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V1/ServicePage.php b/app/api/Twilio/Rest/IpMessaging/V1/ServicePage.php new file mode 100755 index 0000000..9ce2f22 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\IpMessaging\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2.php b/app/api/Twilio/Rest/IpMessaging/V2.php new file mode 100755 index 0000000..deed5eb --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2.php @@ -0,0 +1,107 @@ +version = 'v2'; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/CredentialContext.php b/app/api/Twilio/Rest/IpMessaging/V2/CredentialContext.php new file mode 100755 index 0000000..2889e32 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/CredentialContext.php @@ -0,0 +1,134 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/CredentialInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/CredentialInstance.php new file mode 100755 index 0000000..88870be --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/CredentialList.php b/app/api/Twilio/Rest/IpMessaging/V2/CredentialList.php new file mode 100755 index 0000000..63a491d --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/CredentialOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/CredentialOptions.php new file mode 100755 index 0000000..a3b17da --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/CredentialOptions.php @@ -0,0 +1,314 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $certificate + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * + * + * @param string $privateKey + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * + * + * @param bool $sandbox + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * + * + * @param string $apiKey + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * + * + * @param string $secret + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $friendlyName + * @param string $certificate + * @param string $privateKey + * @param bool $sandbox + * @param string $apiKey + * @param string $secret + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $certificate + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * + * + * @param string $privateKey + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * + * + * @param bool $sandbox + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * + * + * @param string $apiKey + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * + * + * @param string $secret + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/CredentialPage.php b/app/api/Twilio/Rest/IpMessaging/V2/CredentialPage.php new file mode 100755 index 0000000..5fce353 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\IpMessaging\V2\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingContext.php new file mode 100755 index 0000000..004b433 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.BindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingInstance.php new file mode 100755 index 0000000..be10a33 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'messageTypes' => Values::array_get($payload, 'message_types'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BindingContext Context for this BindingInstance + */ + protected function proxy(): BindingContext + { + if (!$this->context) { + $this->context = new BindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.BindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingList.php new file mode 100755 index 0000000..f0dcbd0 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingList.php @@ -0,0 +1,178 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings'; + } + + /** + * Reads BindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BindingPage Page of BindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'BindingType' => + $options['bindingType'], + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BindingPage Page of BindingInstance + */ + public function getPage(string $targetUrl): BindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BindingContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): BindingContext + { + return new BindingContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.BindingList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingOptions.php new file mode 100755 index 0000000..ac934fd --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingOptions.php @@ -0,0 +1,98 @@ +options['bindingType'] = $bindingType; + $this->options['identity'] = $identity; + } + + /** + * + * + * @param string $bindingType + * @return $this Fluent Builder + */ + public function setBindingType(array $bindingType): self + { + $this->options['bindingType'] = $bindingType; + return $this; + } + + /** + * + * + * @param string[] $identity + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingPage.php new file mode 100755 index 0000000..c347d01 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/BindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BindingInstance \Twilio\Rest\IpMessaging\V2\Service\BindingInstance + */ + public function buildInstance(array $payload): BindingInstance + { + return new BindingInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.BindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteContext.php new file mode 100755 index 0000000..c7efa2a --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.InviteContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteInstance.php new file mode 100755 index 0000000..c4e276e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InviteContext Context for this InviteInstance + */ + protected function proxy(): InviteContext + { + if (!$this->context) { + $this->context = new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InviteInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InviteInstance + * + * @return InviteInstance Fetched InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InviteInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.InviteInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteList.php new file mode 100755 index 0000000..bfee9a2 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteList.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Invites'; + } + + /** + * Create the InviteInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return InviteInstance Created InviteInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): InviteInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InviteInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads InviteInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InviteInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams InviteInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InviteInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InvitePage Page of InviteInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InvitePage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InvitePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InviteInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InvitePage Page of InviteInstance + */ + public function getPage(string $targetUrl): InvitePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InvitePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InviteContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): InviteContext + { + return new InviteContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.InviteList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteOptions.php new file mode 100755 index 0000000..b36cd8e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InviteOptions.php @@ -0,0 +1,132 @@ +options['roleSid'] = $roleSid; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateInviteOptions ' . $options . ']'; + } +} + + + +class ReadInviteOptions extends Options + { + /** + * @param string[] $identity + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * + * + * @param string[] $identity + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadInviteOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InvitePage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InvitePage.php new file mode 100755 index 0000000..ced4e9c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/InvitePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InviteInstance \Twilio\Rest\IpMessaging\V2\Service\Channel\InviteInstance + */ + public function buildInstance(array $payload): InviteInstance + { + return new InviteInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.InvitePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberContext.php new file mode 100755 index 0000000..6918156 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberContext.php @@ -0,0 +1,155 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.MemberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberInstance.php new file mode 100755 index 0000000..a9ee6bd --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberInstance.php @@ -0,0 +1,169 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'lastConsumptionTimestamp' => Deserialize::dateTime(Values::array_get($payload, 'last_consumption_timestamp')), + 'url' => Values::array_get($payload, 'url'), + 'attributes' => Values::array_get($payload, 'attributes'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MemberContext Context for this MemberInstance + */ + protected function proxy(): MemberContext + { + if (!$this->context) { + $this->context = new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MemberInstance + * + * @return MemberInstance Fetched MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MemberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MemberInstance + * + * @param array|Options $options Optional Arguments + * @return MemberInstance Updated MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MemberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.MemberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberList.php new file mode 100755 index 0000000..008b123 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberList.php @@ -0,0 +1,227 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Members'; + } + + /** + * Create the MemberInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return MemberInstance Created MemberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): MemberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'Attributes' => + $options['attributes'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MemberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MemberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MemberInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MemberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MemberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MemberPage Page of MemberInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MemberPage + { + $options = new Values($options); + + $params = Values::of([ + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MemberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MemberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MemberPage Page of MemberInstance + */ + public function getPage(string $targetUrl): MemberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MemberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MemberContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): MemberContext + { + return new MemberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.MemberList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberOptions.php new file mode 100755 index 0000000..1e6dec2 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberOptions.php @@ -0,0 +1,450 @@ +options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param int $lastConsumedMessageIndex + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * + * + * @param \DateTime $lastConsumptionTimestamp + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateMemberOptions ' . $options . ']'; + } +} + +class DeleteMemberOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.DeleteMemberOptions ' . $options . ']'; + } +} + + +class ReadMemberOptions extends Options + { + /** + * @param string[] $identity + */ + public function __construct( + + array $identity = Values::ARRAY_NONE + + ) { + $this->options['identity'] = $identity; + } + + /** + * + * + * @param string[] $identity + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadMemberOptions ' . $options . ']'; + } +} + +class UpdateMemberOptions extends Options + { + /** + * @param string $roleSid + * @param int $lastConsumedMessageIndex + * @param \DateTime $lastConsumptionTimestamp + * @param \DateTime $dateCreated + * @param \DateTime $dateUpdated + * @param string $attributes + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $roleSid = Values::NONE, + int $lastConsumedMessageIndex = Values::INT_NONE, + \DateTime $lastConsumptionTimestamp = null, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $attributes = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['attributes'] = $attributes; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param int $lastConsumedMessageIndex + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * + * + * @param \DateTime $lastConsumptionTimestamp + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateMemberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberPage.php new file mode 100755 index 0000000..305c78c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MemberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MemberInstance \Twilio\Rest\IpMessaging\V2\Service\Channel\MemberInstance + */ + public function buildInstance(array $payload): MemberInstance + { + return new MemberInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.MemberPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageContext.php new file mode 100755 index 0000000..2e47ec1 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageContext.php @@ -0,0 +1,155 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'LastUpdatedBy' => + $options['lastUpdatedBy'], + 'From' => + $options['from'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.MessageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageInstance.php new file mode 100755 index 0000000..0d221a7 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageInstance.php @@ -0,0 +1,177 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'lastUpdatedBy' => Values::array_get($payload, 'last_updated_by'), + 'wasEdited' => Values::array_get($payload, 'was_edited'), + 'from' => Values::array_get($payload, 'from'), + 'body' => Values::array_get($payload, 'body'), + 'index' => Values::array_get($payload, 'index'), + 'type' => Values::array_get($payload, 'type'), + 'media' => Values::array_get($payload, 'media'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageContext Context for this MessageInstance + */ + protected function proxy(): MessageContext + { + if (!$this->context) { + $this->context = new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the MessageInstance + * + * @return MessageInstance Fetched MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Updated MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): MessageInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.MessageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageList.php new file mode 100755 index 0000000..a9ae551 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageList.php @@ -0,0 +1,226 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Messages'; + } + + /** + * Create the MessageInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInstance Created MessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): MessageInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'From' => + $options['from'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'LastUpdatedBy' => + $options['lastUpdatedBy'], + 'Body' => + $options['body'], + 'MediaSid' => + $options['mediaSid'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new MessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads MessageInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MessageInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagePage Page of MessageInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagePage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagePage Page of MessageInstance + */ + public function getPage(string $targetUrl): MessagePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): MessageContext + { + return new MessageContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.MessageList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageOptions.php new file mode 100755 index 0000000..f139beb --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessageOptions.php @@ -0,0 +1,468 @@ +options['from'] = $from; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + $this->options['body'] = $body; + $this->options['mediaSid'] = $mediaSid; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $lastUpdatedBy + * @return $this Fluent Builder + */ + public function setLastUpdatedBy(string $lastUpdatedBy): self + { + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + return $this; + } + + /** + * + * + * @param string $body + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * + * + * @param string $mediaSid + * @return $this Fluent Builder + */ + public function setMediaSid(string $mediaSid): self + { + $this->options['mediaSid'] = $mediaSid; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateMessageOptions ' . $options . ']'; + } +} + +class DeleteMessageOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.DeleteMessageOptions ' . $options . ']'; + } +} + + +class ReadMessageOptions extends Options + { + /** + * @param string $order + */ + public function __construct( + + string $order = Values::NONE + + ) { + $this->options['order'] = $order; + } + + /** + * + * + * @param string $order + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadMessageOptions ' . $options . ']'; + } +} + +class UpdateMessageOptions extends Options + { + /** + * @param string $body + * @param string $attributes + * @param \DateTime $dateCreated + * @param \DateTime $dateUpdated + * @param string $lastUpdatedBy + * @param string $from + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $body = Values::NONE, + string $attributes = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $lastUpdatedBy = Values::NONE, + string $from = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['body'] = $body; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + $this->options['from'] = $from; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $body + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $lastUpdatedBy + * @return $this Fluent Builder + */ + public function setLastUpdatedBy(string $lastUpdatedBy): self + { + $this->options['lastUpdatedBy'] = $lastUpdatedBy; + return $this; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateMessageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessagePage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessagePage.php new file mode 100755 index 0000000..dec49dd --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/MessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInstance \Twilio\Rest\IpMessaging\V2\Service\Channel\MessageInstance + */ + public function buildInstance(array $payload): MessageInstance + { + return new MessageInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.MessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookContext.php new file mode 100755 index 0000000..314e218 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookContext.php @@ -0,0 +1,148 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'channelSid' => + $channelSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.RetryCount' => + $options['configurationRetryCount'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookInstance.php new file mode 100755 index 0000000..961e45c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'type' => Values::array_get($payload, 'type'), + 'url' => Values::array_get($payload, 'url'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'channelSid' => $channelSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookList.php new file mode 100755 index 0000000..638b7d2 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookList.php @@ -0,0 +1,219 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'channelSid' => + $channelSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($channelSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'Configuration.Url' => + $options['configurationUrl'], + 'Configuration.Method' => + $options['configurationMethod'], + 'Configuration.Filters' => + Serialize::map($options['configurationFilters'], function ($e) { return $e; }), + 'Configuration.Triggers' => + Serialize::map($options['configurationTriggers'], function ($e) { return $e; }), + 'Configuration.FlowSid' => + $options['configurationFlowSid'], + 'Configuration.RetryCount' => + $options['configurationRetryCount'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['channelSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookOptions.php new file mode 100755 index 0000000..ac7cd9b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookOptions.php @@ -0,0 +1,310 @@ +options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationRetryCount'] = $configurationRetryCount; + } + + /** + * + * + * @param string $configurationUrl + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * + * + * @param string[] $configurationFilters + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * + * + * @param string[] $configurationTriggers + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * + * + * @param string $configurationFlowSid + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * + * + * @param int $configurationRetryCount + * @return $this Fluent Builder + */ + public function setConfigurationRetryCount(int $configurationRetryCount): self + { + $this->options['configurationRetryCount'] = $configurationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $configurationUrl + * @param string $configurationMethod + * @param string[] $configurationFilters + * @param string[] $configurationTriggers + * @param string $configurationFlowSid + * @param int $configurationRetryCount + */ + public function __construct( + + string $configurationUrl = Values::NONE, + string $configurationMethod = Values::NONE, + array $configurationFilters = Values::ARRAY_NONE, + array $configurationTriggers = Values::ARRAY_NONE, + string $configurationFlowSid = Values::NONE, + int $configurationRetryCount = Values::INT_NONE + + ) { + $this->options['configurationUrl'] = $configurationUrl; + $this->options['configurationMethod'] = $configurationMethod; + $this->options['configurationFilters'] = $configurationFilters; + $this->options['configurationTriggers'] = $configurationTriggers; + $this->options['configurationFlowSid'] = $configurationFlowSid; + $this->options['configurationRetryCount'] = $configurationRetryCount; + } + + /** + * + * + * @param string $configurationUrl + * @return $this Fluent Builder + */ + public function setConfigurationUrl(string $configurationUrl): self + { + $this->options['configurationUrl'] = $configurationUrl; + return $this; + } + + /** + * @param string $configurationMethod + * @return $this Fluent Builder + */ + public function setConfigurationMethod(string $configurationMethod): self + { + $this->options['configurationMethod'] = $configurationMethod; + return $this; + } + + /** + * + * + * @param string[] $configurationFilters + * @return $this Fluent Builder + */ + public function setConfigurationFilters(array $configurationFilters): self + { + $this->options['configurationFilters'] = $configurationFilters; + return $this; + } + + /** + * + * + * @param string[] $configurationTriggers + * @return $this Fluent Builder + */ + public function setConfigurationTriggers(array $configurationTriggers): self + { + $this->options['configurationTriggers'] = $configurationTriggers; + return $this; + } + + /** + * + * + * @param string $configurationFlowSid + * @return $this Fluent Builder + */ + public function setConfigurationFlowSid(string $configurationFlowSid): self + { + $this->options['configurationFlowSid'] = $configurationFlowSid; + return $this; + } + + /** + * + * + * @param int $configurationRetryCount + * @return $this Fluent Builder + */ + public function setConfigurationRetryCount(int $configurationRetryCount): self + { + $this->options['configurationRetryCount'] = $configurationRetryCount; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookPage.php new file mode 100755 index 0000000..e88351b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/Channel/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\IpMessaging\V2\Service\Channel\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['channelSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelContext.php new file mode 100755 index 0000000..576465d --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelContext.php @@ -0,0 +1,267 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'CreatedBy' => + $options['createdBy'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + if (!$this->_members) { + $this->_members = new MemberList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + if (!$this->_invites) { + $this->_invites = new InviteList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_invites; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + if (!$this->_messages) { + $this->_messages = new MessageList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_messages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.ChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelInstance.php new file mode 100755 index 0000000..1759db4 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelInstance.php @@ -0,0 +1,212 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'type' => Values::array_get($payload, 'type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + 'membersCount' => Values::array_get($payload, 'members_count'), + 'messagesCount' => Values::array_get($payload, 'messages_count'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChannelContext Context for this ChannelInstance + */ + protected function proxy(): ChannelContext + { + if (!$this->context) { + $this->context = new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the ChannelInstance + * + * @return ChannelInstance Fetched ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Updated ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the members + */ + protected function getMembers(): MemberList + { + return $this->proxy()->members; + } + + /** + * Access the invites + */ + protected function getInvites(): InviteList + { + return $this->proxy()->invites; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the messages + */ + protected function getMessages(): MessageList + { + return $this->proxy()->messages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.ChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelList.php new file mode 100755 index 0000000..3fa5692 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelList.php @@ -0,0 +1,218 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Channels'; + } + + /** + * Create the ChannelInstance + * + * @param array|Options $options Optional Arguments + * @return ChannelInstance Created ChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Attributes' => + $options['attributes'], + 'Type' => + $options['type'], + 'DateCreated' => + Serialize::iso8601DateTime($options['dateCreated']), + 'DateUpdated' => + Serialize::iso8601DateTime($options['dateUpdated']), + 'CreatedBy' => + $options['createdBy'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new ChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChannelInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChannelPage Page of ChannelInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChannelPage + { + $options = new Values($options); + + $params = Values::of([ + 'Type' => + $options['type'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChannelPage Page of ChannelInstance + */ + public function getPage(string $targetUrl): ChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChannelContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ChannelContext + { + return new ChannelContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.ChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelOptions.php new file mode 100755 index 0000000..6b54606 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelOptions.php @@ -0,0 +1,466 @@ +options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['type'] = $type; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['createdBy'] = $createdBy; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $createdBy + * @return $this Fluent Builder + */ + public function setCreatedBy(string $createdBy): self + { + $this->options['createdBy'] = $createdBy; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateChannelOptions ' . $options . ']'; + } +} + +class DeleteChannelOptions extends Options + { + /** + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.DeleteChannelOptions ' . $options . ']'; + } +} + + +class ReadChannelOptions extends Options + { + /** + * @param string $type + */ + public function __construct( + + array $type = Values::ARRAY_NONE + + ) { + $this->options['type'] = $type; + } + + /** + * + * + * @param string $type + * @return $this Fluent Builder + */ + public function setType(array $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadChannelOptions ' . $options . ']'; + } +} + +class UpdateChannelOptions extends Options + { + /** + * @param string $friendlyName + * @param string $uniqueName + * @param string $attributes + * @param \DateTime $dateCreated + * @param \DateTime $dateUpdated + * @param string $createdBy + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + string $attributes = Values::NONE, + \DateTime $dateCreated = null, + \DateTime $dateUpdated = null, + string $createdBy = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['attributes'] = $attributes; + $this->options['dateCreated'] = $dateCreated; + $this->options['dateUpdated'] = $dateUpdated; + $this->options['createdBy'] = $createdBy; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param \DateTime $dateCreated + * @return $this Fluent Builder + */ + public function setDateCreated(\DateTime $dateCreated): self + { + $this->options['dateCreated'] = $dateCreated; + return $this; + } + + /** + * + * + * @param \DateTime $dateUpdated + * @return $this Fluent Builder + */ + public function setDateUpdated(\DateTime $dateUpdated): self + { + $this->options['dateUpdated'] = $dateUpdated; + return $this; + } + + /** + * + * + * @param string $createdBy + * @return $this Fluent Builder + */ + public function setCreatedBy(string $createdBy): self + { + $this->options['createdBy'] = $createdBy; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelPage.php new file mode 100755 index 0000000..83066e8 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/ChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChannelInstance \Twilio\Rest\IpMessaging\V2\Service\ChannelInstance + */ + public function buildInstance(array $payload): ChannelInstance + { + return new ChannelInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.ChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleContext.php new file mode 100755 index 0000000..2d6b9fc --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleContext.php @@ -0,0 +1,128 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RoleInstance + * + * @param string[] $permission + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + $data = Values::of([ + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.RoleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleInstance.php new file mode 100755 index 0000000..d8a7b6a --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'permissions' => Values::array_get($payload, 'permissions'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoleContext Context for this RoleInstance + */ + protected function proxy(): RoleContext + { + if (!$this->context) { + $this->context = new RoleContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoleInstance + * + * @return RoleInstance Fetched RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoleInstance + * + * @param string[] $permission + * @return RoleInstance Updated RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $permission): RoleInstance + { + + return $this->proxy()->update($permission); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.RoleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleList.php new file mode 100755 index 0000000..3f94839 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/RoleList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Roles'; + } + + /** + * Create the RoleInstance + * + * @param string $friendlyName + * @param string $type + * @param string[] $permission + * @return RoleInstance Created RoleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $permission): RoleInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Permission' => + Serialize::map($permission,function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoleInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads RoleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoleInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RoleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RolePage Page of RoleInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RolePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RolePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RolePage Page of RoleInstance + */ + public function getPage(string $targetUrl): RolePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RolePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoleContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): RoleContext + { + return new RoleContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.RoleList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/RolePage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/RolePage.php new file mode 100755 index 0000000..3952673 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/RolePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoleInstance \Twilio\Rest\IpMessaging\V2\Service\RoleInstance + */ + public function buildInstance(array $payload): RoleInstance + { + return new RoleInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.RolePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingContext.php new file mode 100755 index 0000000..8024927 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'userSid' => + $userSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserBindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserBindingInstance + * + * @return UserBindingInstance Fetched UserBindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserBindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserBindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserBindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingInstance.php new file mode 100755 index 0000000..e349f9c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'messageTypes' => Values::array_get($payload, 'message_types'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserBindingContext Context for this UserBindingInstance + */ + protected function proxy(): UserBindingContext + { + if (!$this->context) { + $this->context = new UserBindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserBindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserBindingInstance + * + * @return UserBindingInstance Fetched UserBindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserBindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserBindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingList.php new file mode 100755 index 0000000..efc5929 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingList.php @@ -0,0 +1,182 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Bindings'; + } + + /** + * Reads UserBindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserBindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams UserBindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserBindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserBindingPage Page of UserBindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserBindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'BindingType' => + $options['bindingType'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserBindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserBindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserBindingPage Page of UserBindingInstance + */ + public function getPage(string $targetUrl): UserBindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserBindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserBindingContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): UserBindingContext + { + return new UserBindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserBindingList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingOptions.php new file mode 100755 index 0000000..1f4000a --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingOptions.php @@ -0,0 +1,80 @@ +options['bindingType'] = $bindingType; + } + + /** + * + * + * @param string $bindingType + * @return $this Fluent Builder + */ + public function setBindingType(array $bindingType): self + { + $this->options['bindingType'] = $bindingType; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.ReadUserBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingPage.php new file mode 100755 index 0000000..f6d4273 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserBindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserBindingInstance \Twilio\Rest\IpMessaging\V2\Service\User\UserBindingInstance + */ + public function buildInstance(array $payload): UserBindingInstance + { + return new UserBindingInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserBindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelContext.php new file mode 100755 index 0000000..a233b7d --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelContext.php @@ -0,0 +1,142 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'userSid' => + $userSid, + 'channelSid' => + $channelSid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels/' . \rawurlencode($channelSid) + .''; + } + + /** + * Delete the UserChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserChannelInstance + * + * @return UserChannelInstance Fetched UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Update the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return UserChannelInstance Updated UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'NotificationLevel' => + $options['notificationLevel'], + 'LastConsumedMessageIndex' => + $options['lastConsumedMessageIndex'], + 'LastConsumptionTimestamp' => + Serialize::iso8601DateTime($options['lastConsumptionTimestamp']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new UserChannelInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelInstance.php new file mode 100755 index 0000000..f178cbf --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelInstance.php @@ -0,0 +1,165 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'channelSid' => Values::array_get($payload, 'channel_sid'), + 'userSid' => Values::array_get($payload, 'user_sid'), + 'memberSid' => Values::array_get($payload, 'member_sid'), + 'status' => Values::array_get($payload, 'status'), + 'lastConsumedMessageIndex' => Values::array_get($payload, 'last_consumed_message_index'), + 'unreadMessagesCount' => Values::array_get($payload, 'unread_messages_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + 'notificationLevel' => Values::array_get($payload, 'notification_level'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'userSid' => $userSid, 'channelSid' => $channelSid ?: $this->properties['channelSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserChannelContext Context for this UserChannelInstance + */ + protected function proxy(): UserChannelContext + { + if (!$this->context) { + $this->context = new UserChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $this->solution['channelSid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserChannelInstance + * + * @return UserChannelInstance Fetched UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserChannelInstance + * + * @param array|Options $options Optional Arguments + * @return UserChannelInstance Updated UserChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelList.php new file mode 100755 index 0000000..d01c523 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'userSid' => + $userSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($userSid) + .'/Channels'; + } + + /** + * Reads UserChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserChannelPage Page of UserChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserChannelPage Page of UserChannelInstance + */ + public function getPage(string $targetUrl): UserChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserChannelContext + * + * @param string $channelSid + */ + public function getContext( + string $channelSid + + ): UserChannelContext + { + return new UserChannelContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['userSid'], + $channelSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelOptions.php new file mode 100755 index 0000000..cf7a337 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelOptions.php @@ -0,0 +1,116 @@ +options['notificationLevel'] = $notificationLevel; + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + } + + /** + * @param string $notificationLevel + * @return $this Fluent Builder + */ + public function setNotificationLevel(string $notificationLevel): self + { + $this->options['notificationLevel'] = $notificationLevel; + return $this; + } + + /** + * + * + * @param int $lastConsumedMessageIndex + * @return $this Fluent Builder + */ + public function setLastConsumedMessageIndex(int $lastConsumedMessageIndex): self + { + $this->options['lastConsumedMessageIndex'] = $lastConsumedMessageIndex; + return $this; + } + + /** + * + * + * @param \DateTime $lastConsumptionTimestamp + * @return $this Fluent Builder + */ + public function setLastConsumptionTimestamp(\DateTime $lastConsumptionTimestamp): self + { + $this->options['lastConsumptionTimestamp'] = $lastConsumptionTimestamp; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateUserChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelPage.php new file mode 100755 index 0000000..ce38b2c --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/User/UserChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserChannelInstance \Twilio\Rest\IpMessaging\V2\Service\User\UserChannelInstance + */ + public function buildInstance(array $payload): UserChannelInstance + { + return new UserChannelInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['userSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/UserContext.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserContext.php new file mode 100755 index 0000000..ef2e2a8 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserContext.php @@ -0,0 +1,215 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the userBindings + */ + protected function getUserBindings(): UserBindingList + { + if (!$this->_userBindings) { + $this->_userBindings = new UserBindingList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userBindings; + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + if (!$this->_userChannels) { + $this->_userChannels = new UserChannelList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_userChannels; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/UserInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserInstance.php new file mode 100755 index 0000000..90275cd --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserInstance.php @@ -0,0 +1,191 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'roleSid' => Values::array_get($payload, 'role_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'isOnline' => Values::array_get($payload, 'is_online'), + 'isNotifiable' => Values::array_get($payload, 'is_notifiable'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'joinedChannelsCount' => Values::array_get($payload, 'joined_channels_count'), + 'links' => Values::array_get($payload, 'links'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserContext Context for this UserInstance + */ + protected function proxy(): UserContext + { + if (!$this->context) { + $this->context = new UserContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UserInstance + * + * @return UserInstance Fetched UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the UserInstance + * + * @param array|Options $options Optional Arguments + * @return UserInstance Updated UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): UserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the userBindings + */ + protected function getUserBindings(): UserBindingList + { + return $this->proxy()->userBindings; + } + + /** + * Access the userChannels + */ + protected function getUserChannels(): UserChannelList + { + return $this->proxy()->userChannels; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.UserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/UserList.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserList.php new file mode 100755 index 0000000..ae1f1d6 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserList.php @@ -0,0 +1,206 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Users'; + } + + /** + * Create the UserInstance + * + * @param string $identity + * @param array|Options $options Optional Arguments + * @return UserInstance Created UserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, array $options = []): UserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'RoleSid' => + $options['roleSid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $headers = Values::of(['X-Twilio-Webhook-Enabled' => $options['xTwilioWebhookEnabled']]); + + $payload = $this->version->create('POST', $this->uri, [], $data, $headers); + + return new UserInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads UserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UserPage Page of UserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UserPage Page of UserInstance + */ + public function getPage(string $targetUrl): UserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UserContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): UserContext + { + return new UserContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/UserOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserOptions.php new file mode 100755 index 0000000..3d15e0d --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserOptions.php @@ -0,0 +1,242 @@ +options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.CreateUserOptions ' . $options . ']'; + } +} + + + + +class UpdateUserOptions extends Options + { + /** + * @param string $roleSid + * @param string $attributes + * @param string $friendlyName + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + */ + public function __construct( + + string $roleSid = Values::NONE, + string $attributes = Values::NONE, + string $friendlyName = Values::NONE, + string $xTwilioWebhookEnabled = Values::NONE + + ) { + $this->options['roleSid'] = $roleSid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + } + + /** + * + * + * @param string $roleSid + * @return $this Fluent Builder + */ + public function setRoleSid(string $roleSid): self + { + $this->options['roleSid'] = $roleSid; + return $this; + } + + /** + * + * + * @param string $attributes + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The X-Twilio-Webhook-Enabled HTTP request header + * + * @param string $xTwilioWebhookEnabled The X-Twilio-Webhook-Enabled HTTP request header + * @return $this Fluent Builder + */ + public function setXTwilioWebhookEnabled(string $xTwilioWebhookEnabled): self + { + $this->options['xTwilioWebhookEnabled'] = $xTwilioWebhookEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/Service/UserPage.php b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserPage.php new file mode 100755 index 0000000..d938de7 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/Service/UserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInstance \Twilio\Rest\IpMessaging\V2\Service\UserInstance + */ + public function buildInstance(array $payload): UserInstance + { + return new UserInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.UserPage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/ServiceContext.php b/app/api/Twilio/Rest/IpMessaging/V2/ServiceContext.php new file mode 100755 index 0000000..3e43c10 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/ServiceContext.php @@ -0,0 +1,299 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DefaultServiceRoleSid' => + $options['defaultServiceRoleSid'], + 'DefaultChannelRoleSid' => + $options['defaultChannelRoleSid'], + 'DefaultChannelCreatorRoleSid' => + $options['defaultChannelCreatorRoleSid'], + 'ReadStatusEnabled' => + Serialize::booleanToString($options['readStatusEnabled']), + 'ReachabilityEnabled' => + Serialize::booleanToString($options['reachabilityEnabled']), + 'TypingIndicatorTimeout' => + $options['typingIndicatorTimeout'], + 'ConsumptionReportInterval' => + $options['consumptionReportInterval'], + 'Notifications.NewMessage.Enabled' => + Serialize::booleanToString($options['notificationsNewMessageEnabled']), + 'Notifications.NewMessage.Template' => + $options['notificationsNewMessageTemplate'], + 'Notifications.NewMessage.Sound' => + $options['notificationsNewMessageSound'], + 'Notifications.NewMessage.BadgeCountEnabled' => + Serialize::booleanToString($options['notificationsNewMessageBadgeCountEnabled']), + 'Notifications.AddedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsAddedToChannelEnabled']), + 'Notifications.AddedToChannel.Template' => + $options['notificationsAddedToChannelTemplate'], + 'Notifications.AddedToChannel.Sound' => + $options['notificationsAddedToChannelSound'], + 'Notifications.RemovedFromChannel.Enabled' => + Serialize::booleanToString($options['notificationsRemovedFromChannelEnabled']), + 'Notifications.RemovedFromChannel.Template' => + $options['notificationsRemovedFromChannelTemplate'], + 'Notifications.RemovedFromChannel.Sound' => + $options['notificationsRemovedFromChannelSound'], + 'Notifications.InvitedToChannel.Enabled' => + Serialize::booleanToString($options['notificationsInvitedToChannelEnabled']), + 'Notifications.InvitedToChannel.Template' => + $options['notificationsInvitedToChannelTemplate'], + 'Notifications.InvitedToChannel.Sound' => + $options['notificationsInvitedToChannelSound'], + 'PreWebhookUrl' => + $options['preWebhookUrl'], + 'PostWebhookUrl' => + $options['postWebhookUrl'], + 'WebhookMethod' => + $options['webhookMethod'], + 'WebhookFilters' => + Serialize::map($options['webhookFilters'], function ($e) { return $e; }), + 'Limits.ChannelMembers' => + $options['limitsChannelMembers'], + 'Limits.UserChannels' => + $options['limitsUserChannels'], + 'Media.CompatibilityMessage' => + $options['mediaCompatibilityMessage'], + 'PreWebhookRetryCount' => + $options['preWebhookRetryCount'], + 'PostWebhookRetryCount' => + $options['postWebhookRetryCount'], + 'Notifications.LogEnabled' => + Serialize::booleanToString($options['notificationsLogEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + if (!$this->_channels) { + $this->_channels = new ChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_channels; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + if (!$this->_bindings) { + $this->_bindings = new BindingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_bindings; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + if (!$this->_roles) { + $this->_roles = new RoleList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + if (!$this->_users) { + $this->_users = new UserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_users; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/ServiceInstance.php b/app/api/Twilio/Rest/IpMessaging/V2/ServiceInstance.php new file mode 100755 index 0000000..268d333 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/ServiceInstance.php @@ -0,0 +1,227 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'defaultServiceRoleSid' => Values::array_get($payload, 'default_service_role_sid'), + 'defaultChannelRoleSid' => Values::array_get($payload, 'default_channel_role_sid'), + 'defaultChannelCreatorRoleSid' => Values::array_get($payload, 'default_channel_creator_role_sid'), + 'readStatusEnabled' => Values::array_get($payload, 'read_status_enabled'), + 'reachabilityEnabled' => Values::array_get($payload, 'reachability_enabled'), + 'typingIndicatorTimeout' => Values::array_get($payload, 'typing_indicator_timeout'), + 'consumptionReportInterval' => Values::array_get($payload, 'consumption_report_interval'), + 'limits' => Values::array_get($payload, 'limits'), + 'preWebhookUrl' => Values::array_get($payload, 'pre_webhook_url'), + 'postWebhookUrl' => Values::array_get($payload, 'post_webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'webhookFilters' => Values::array_get($payload, 'webhook_filters'), + 'preWebhookRetryCount' => Values::array_get($payload, 'pre_webhook_retry_count'), + 'postWebhookRetryCount' => Values::array_get($payload, 'post_webhook_retry_count'), + 'notifications' => Values::array_get($payload, 'notifications'), + 'media' => Values::array_get($payload, 'media'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the channels + */ + protected function getChannels(): ChannelList + { + return $this->proxy()->channels; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + return $this->proxy()->bindings; + } + + /** + * Access the roles + */ + protected function getRoles(): RoleList + { + return $this->proxy()->roles; + } + + /** + * Access the users + */ + protected function getUsers(): UserList + { + return $this->proxy()->users; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.IpMessaging.V2.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/ServiceList.php b/app/api/Twilio/Rest/IpMessaging/V2/ServiceList.php new file mode 100755 index 0000000..3755d8a --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/ServiceList.php @@ -0,0 +1,186 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): ServiceInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessaging/V2/ServiceOptions.php b/app/api/Twilio/Rest/IpMessaging/V2/ServiceOptions.php new file mode 100755 index 0000000..f153d4b --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/ServiceOptions.php @@ -0,0 +1,624 @@ +options['friendlyName'] = $friendlyName; + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + $this->options['readStatusEnabled'] = $readStatusEnabled; + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + $this->options['notificationsNewMessageSound'] = $notificationsNewMessageSound; + $this->options['notificationsNewMessageBadgeCountEnabled'] = $notificationsNewMessageBadgeCountEnabled; + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + $this->options['notificationsAddedToChannelSound'] = $notificationsAddedToChannelSound; + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + $this->options['notificationsRemovedFromChannelSound'] = $notificationsRemovedFromChannelSound; + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + $this->options['notificationsInvitedToChannelSound'] = $notificationsInvitedToChannelSound; + $this->options['preWebhookUrl'] = $preWebhookUrl; + $this->options['postWebhookUrl'] = $postWebhookUrl; + $this->options['webhookMethod'] = $webhookMethod; + $this->options['webhookFilters'] = $webhookFilters; + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + $this->options['limitsUserChannels'] = $limitsUserChannels; + $this->options['mediaCompatibilityMessage'] = $mediaCompatibilityMessage; + $this->options['preWebhookRetryCount'] = $preWebhookRetryCount; + $this->options['postWebhookRetryCount'] = $postWebhookRetryCount; + $this->options['notificationsLogEnabled'] = $notificationsLogEnabled; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $defaultServiceRoleSid + * @return $this Fluent Builder + */ + public function setDefaultServiceRoleSid(string $defaultServiceRoleSid): self + { + $this->options['defaultServiceRoleSid'] = $defaultServiceRoleSid; + return $this; + } + + /** + * + * + * @param string $defaultChannelRoleSid + * @return $this Fluent Builder + */ + public function setDefaultChannelRoleSid(string $defaultChannelRoleSid): self + { + $this->options['defaultChannelRoleSid'] = $defaultChannelRoleSid; + return $this; + } + + /** + * + * + * @param string $defaultChannelCreatorRoleSid + * @return $this Fluent Builder + */ + public function setDefaultChannelCreatorRoleSid(string $defaultChannelCreatorRoleSid): self + { + $this->options['defaultChannelCreatorRoleSid'] = $defaultChannelCreatorRoleSid; + return $this; + } + + /** + * + * + * @param bool $readStatusEnabled + * @return $this Fluent Builder + */ + public function setReadStatusEnabled(bool $readStatusEnabled): self + { + $this->options['readStatusEnabled'] = $readStatusEnabled; + return $this; + } + + /** + * + * + * @param bool $reachabilityEnabled + * @return $this Fluent Builder + */ + public function setReachabilityEnabled(bool $reachabilityEnabled): self + { + $this->options['reachabilityEnabled'] = $reachabilityEnabled; + return $this; + } + + /** + * + * + * @param int $typingIndicatorTimeout + * @return $this Fluent Builder + */ + public function setTypingIndicatorTimeout(int $typingIndicatorTimeout): self + { + $this->options['typingIndicatorTimeout'] = $typingIndicatorTimeout; + return $this; + } + + /** + * + * + * @param int $consumptionReportInterval + * @return $this Fluent Builder + */ + public function setConsumptionReportInterval(int $consumptionReportInterval): self + { + $this->options['consumptionReportInterval'] = $consumptionReportInterval; + return $this; + } + + /** + * + * + * @param bool $notificationsNewMessageEnabled + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageEnabled(bool $notificationsNewMessageEnabled): self + { + $this->options['notificationsNewMessageEnabled'] = $notificationsNewMessageEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsNewMessageTemplate + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageTemplate(string $notificationsNewMessageTemplate): self + { + $this->options['notificationsNewMessageTemplate'] = $notificationsNewMessageTemplate; + return $this; + } + + /** + * + * + * @param string $notificationsNewMessageSound + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageSound(string $notificationsNewMessageSound): self + { + $this->options['notificationsNewMessageSound'] = $notificationsNewMessageSound; + return $this; + } + + /** + * + * + * @param bool $notificationsNewMessageBadgeCountEnabled + * @return $this Fluent Builder + */ + public function setNotificationsNewMessageBadgeCountEnabled(bool $notificationsNewMessageBadgeCountEnabled): self + { + $this->options['notificationsNewMessageBadgeCountEnabled'] = $notificationsNewMessageBadgeCountEnabled; + return $this; + } + + /** + * + * + * @param bool $notificationsAddedToChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelEnabled(bool $notificationsAddedToChannelEnabled): self + { + $this->options['notificationsAddedToChannelEnabled'] = $notificationsAddedToChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsAddedToChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelTemplate(string $notificationsAddedToChannelTemplate): self + { + $this->options['notificationsAddedToChannelTemplate'] = $notificationsAddedToChannelTemplate; + return $this; + } + + /** + * + * + * @param string $notificationsAddedToChannelSound + * @return $this Fluent Builder + */ + public function setNotificationsAddedToChannelSound(string $notificationsAddedToChannelSound): self + { + $this->options['notificationsAddedToChannelSound'] = $notificationsAddedToChannelSound; + return $this; + } + + /** + * + * + * @param bool $notificationsRemovedFromChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelEnabled(bool $notificationsRemovedFromChannelEnabled): self + { + $this->options['notificationsRemovedFromChannelEnabled'] = $notificationsRemovedFromChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsRemovedFromChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelTemplate(string $notificationsRemovedFromChannelTemplate): self + { + $this->options['notificationsRemovedFromChannelTemplate'] = $notificationsRemovedFromChannelTemplate; + return $this; + } + + /** + * + * + * @param string $notificationsRemovedFromChannelSound + * @return $this Fluent Builder + */ + public function setNotificationsRemovedFromChannelSound(string $notificationsRemovedFromChannelSound): self + { + $this->options['notificationsRemovedFromChannelSound'] = $notificationsRemovedFromChannelSound; + return $this; + } + + /** + * + * + * @param bool $notificationsInvitedToChannelEnabled + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelEnabled(bool $notificationsInvitedToChannelEnabled): self + { + $this->options['notificationsInvitedToChannelEnabled'] = $notificationsInvitedToChannelEnabled; + return $this; + } + + /** + * + * + * @param string $notificationsInvitedToChannelTemplate + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelTemplate(string $notificationsInvitedToChannelTemplate): self + { + $this->options['notificationsInvitedToChannelTemplate'] = $notificationsInvitedToChannelTemplate; + return $this; + } + + /** + * + * + * @param string $notificationsInvitedToChannelSound + * @return $this Fluent Builder + */ + public function setNotificationsInvitedToChannelSound(string $notificationsInvitedToChannelSound): self + { + $this->options['notificationsInvitedToChannelSound'] = $notificationsInvitedToChannelSound; + return $this; + } + + /** + * + * + * @param string $preWebhookUrl + * @return $this Fluent Builder + */ + public function setPreWebhookUrl(string $preWebhookUrl): self + { + $this->options['preWebhookUrl'] = $preWebhookUrl; + return $this; + } + + /** + * + * + * @param string $postWebhookUrl + * @return $this Fluent Builder + */ + public function setPostWebhookUrl(string $postWebhookUrl): self + { + $this->options['postWebhookUrl'] = $postWebhookUrl; + return $this; + } + + /** + * + * + * @param string $webhookMethod + * @return $this Fluent Builder + */ + public function setWebhookMethod(string $webhookMethod): self + { + $this->options['webhookMethod'] = $webhookMethod; + return $this; + } + + /** + * + * + * @param string[] $webhookFilters + * @return $this Fluent Builder + */ + public function setWebhookFilters(array $webhookFilters): self + { + $this->options['webhookFilters'] = $webhookFilters; + return $this; + } + + /** + * + * + * @param int $limitsChannelMembers + * @return $this Fluent Builder + */ + public function setLimitsChannelMembers(int $limitsChannelMembers): self + { + $this->options['limitsChannelMembers'] = $limitsChannelMembers; + return $this; + } + + /** + * + * + * @param int $limitsUserChannels + * @return $this Fluent Builder + */ + public function setLimitsUserChannels(int $limitsUserChannels): self + { + $this->options['limitsUserChannels'] = $limitsUserChannels; + return $this; + } + + /** + * + * + * @param string $mediaCompatibilityMessage + * @return $this Fluent Builder + */ + public function setMediaCompatibilityMessage(string $mediaCompatibilityMessage): self + { + $this->options['mediaCompatibilityMessage'] = $mediaCompatibilityMessage; + return $this; + } + + /** + * + * + * @param int $preWebhookRetryCount + * @return $this Fluent Builder + */ + public function setPreWebhookRetryCount(int $preWebhookRetryCount): self + { + $this->options['preWebhookRetryCount'] = $preWebhookRetryCount; + return $this; + } + + /** + * + * + * @param int $postWebhookRetryCount + * @return $this Fluent Builder + */ + public function setPostWebhookRetryCount(int $postWebhookRetryCount): self + { + $this->options['postWebhookRetryCount'] = $postWebhookRetryCount; + return $this; + } + + /** + * + * + * @param bool $notificationsLogEnabled + * @return $this Fluent Builder + */ + public function setNotificationsLogEnabled(bool $notificationsLogEnabled): self + { + $this->options['notificationsLogEnabled'] = $notificationsLogEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.IpMessaging.V2.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/IpMessaging/V2/ServicePage.php b/app/api/Twilio/Rest/IpMessaging/V2/ServicePage.php new file mode 100755 index 0000000..3c72d5e --- /dev/null +++ b/app/api/Twilio/Rest/IpMessaging/V2/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\IpMessaging\V2\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.IpMessaging.V2.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/IpMessagingBase.php b/app/api/Twilio/Rest/IpMessagingBase.php new file mode 100755 index 0000000..2e1b8e5 --- /dev/null +++ b/app/api/Twilio/Rest/IpMessagingBase.php @@ -0,0 +1,101 @@ +baseUrl = 'https://ip-messaging.twilio.com'; + } + + + /** + * @return V1 Version v1 of ip-messaging + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of ip-messaging + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.IpMessaging]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups.php b/app/api/Twilio/Rest/Lookups.php new file mode 100755 index 0000000..e16afa1 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups.php @@ -0,0 +1,25 @@ +phoneNumbers instead. + */ + protected function getPhoneNumbers(): \Twilio\Rest\Lookups\V1\PhoneNumberList { + echo "phoneNumbers is deprecated. Use v1->phoneNumbers instead."; + return $this->v1->phoneNumbers; + } + + /** + * @deprecated Use v1->phoneNumbers(\$phoneNumber) instead. + * @param string $phoneNumber The phone number to fetch in E.164 format + */ + protected function contextPhoneNumbers(string $phoneNumber): \Twilio\Rest\Lookups\V1\PhoneNumberContext { + echo "phoneNumbers(\$phoneNumber) is deprecated. Use v1->phoneNumbers(\$phoneNumber) instead."; + return $this->v1->phoneNumbers($phoneNumber); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Lookups/V1.php b/app/api/Twilio/Rest/Lookups/V1.php new file mode 100755 index 0000000..27d6350 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList($this); + } + return $this->_phoneNumbers; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V1/PhoneNumberContext.php b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberContext.php new file mode 100755 index 0000000..66845b4 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberContext.php @@ -0,0 +1,97 @@ +solution = [ + 'phoneNumber' => + $phoneNumber, + ]; + + $this->uri = '/PhoneNumbers/' . \rawurlencode($phoneNumber) + .''; + } + + /** + * Fetch the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): PhoneNumberInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'CountryCode' => + $options['countryCode'], + 'Type' => + Serialize::map($options['type'], function ($e) { return $e; }), + 'AddOns' => + Serialize::map($options['addOns'], function ($e) { return $e; }), + ]); + $params = \array_merge($params, Serialize::prefixedCollapsibleMap($options['addOnsData'], 'AddOns')); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['phoneNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Lookups.V1.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V1/PhoneNumberInstance.php b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberInstance.php new file mode 100755 index 0000000..e59be9c --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'callerName' => Values::array_get($payload, 'caller_name'), + 'countryCode' => Values::array_get($payload, 'country_code'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'nationalFormat' => Values::array_get($payload, 'national_format'), + 'carrier' => Values::array_get($payload, 'carrier'), + 'addOns' => Values::array_get($payload, 'add_ons'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['phoneNumber' => $phoneNumber ?: $this->properties['phoneNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['phoneNumber'] + ); + } + + return $this->context; + } + + /** + * Fetch the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): PhoneNumberInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Lookups.V1.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Lookups/V1/PhoneNumberList.php b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberList.php new file mode 100755 index 0000000..5919089 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a PhoneNumberContext + * + * @param string $phoneNumber The phone number to lookup in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, which consists of a + followed by the country code and subscriber number. + */ + public function getContext( + string $phoneNumber + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $phoneNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V1.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V1/PhoneNumberOptions.php b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberOptions.php new file mode 100755 index 0000000..0a02749 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberOptions.php @@ -0,0 +1,130 @@ +options['countryCode'] = $countryCode; + $this->options['type'] = $type; + $this->options['addOns'] = $addOns; + $this->options['addOnsData'] = $addOnsData; + } + + /** + * The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + * + * @param string $countryCode The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the phone number to fetch. This is used to specify the country when the phone number is provided in a national format. + * @return $this Fluent Builder + */ + public function setCountryCode(string $countryCode): self + { + $this->options['countryCode'] = $countryCode; + return $this; + } + + /** + * The type of information to return. Can be: `carrier` or `caller-name`. The default is null. Carrier information costs $0.005 per phone number looked up. Caller Name information is currently available only in the US and costs $0.01 per phone number looked up. To retrieve both types on information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + * + * @param string[] $type The type of information to return. Can be: `carrier` or `caller-name`. The default is null. Carrier information costs $0.005 per phone number looked up. Caller Name information is currently available only in the US and costs $0.01 per phone number looked up. To retrieve both types on information, specify this parameter twice; once with `carrier` and once with `caller-name` as the value. + * @return $this Fluent Builder + */ + public function setType(array $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + * + * @param string[] $addOns The `unique_name` of an Add-on you would like to invoke. Can be the `unique_name` of an Add-on that is installed on your account. You can specify multiple instances of this parameter to invoke multiple Add-ons. For more information about Add-ons, see the [Add-ons documentation](https://www.twilio.com/docs/add-ons). + * @return $this Fluent Builder + */ + public function setAddOns(array $addOns): self + { + $this->options['addOns'] = $addOns; + return $this; + } + + /** + * Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + * + * @param string $addOnsData Data specific to the add-on you would like to invoke. The content and format of this value depends on the add-on. + * @return $this Fluent Builder + */ + public function setAddOnsData(string $addOnsData): self + { + $this->options['addOnsData'] = $addOnsData; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Lookups.V1.FetchPhoneNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Lookups/V1/PhoneNumberPage.php b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberPage.php new file mode 100755 index 0000000..a2954c4 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V1/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Lookups\V1\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V1.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V2.php b/app/api/Twilio/Rest/Lookups/V2.php new file mode 100755 index 0000000..cec6204 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2.php @@ -0,0 +1,95 @@ +version = 'v2'; + } + + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList($this); + } + return $this->_phoneNumbers; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V2/PhoneNumberContext.php b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberContext.php new file mode 100755 index 0000000..e2ced22 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberContext.php @@ -0,0 +1,113 @@ +solution = [ + 'phoneNumber' => + $phoneNumber, + ]; + + $this->uri = '/PhoneNumbers/' . \rawurlencode($phoneNumber) + .''; + } + + /** + * Fetch the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): PhoneNumberInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Fields' => + $options['fields'], + 'CountryCode' => + $options['countryCode'], + 'FirstName' => + $options['firstName'], + 'LastName' => + $options['lastName'], + 'AddressLine1' => + $options['addressLine1'], + 'AddressLine2' => + $options['addressLine2'], + 'City' => + $options['city'], + 'State' => + $options['state'], + 'PostalCode' => + $options['postalCode'], + 'AddressCountryCode' => + $options['addressCountryCode'], + 'NationalId' => + $options['nationalId'], + 'DateOfBirth' => + $options['dateOfBirth'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['phoneNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Lookups.V2.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V2/PhoneNumberInstance.php b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberInstance.php new file mode 100755 index 0000000..2be5ea8 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberInstance.php @@ -0,0 +1,143 @@ +properties = [ + 'callingCountryCode' => Values::array_get($payload, 'calling_country_code'), + 'countryCode' => Values::array_get($payload, 'country_code'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'nationalFormat' => Values::array_get($payload, 'national_format'), + 'valid' => Values::array_get($payload, 'valid'), + 'validationErrors' => Values::array_get($payload, 'validation_errors'), + 'callerName' => Values::array_get($payload, 'caller_name'), + 'simSwap' => Values::array_get($payload, 'sim_swap'), + 'callForwarding' => Values::array_get($payload, 'call_forwarding'), + 'liveActivity' => Values::array_get($payload, 'live_activity'), + 'lineTypeIntelligence' => Values::array_get($payload, 'line_type_intelligence'), + 'identityMatch' => Values::array_get($payload, 'identity_match'), + 'smsPumpingRisk' => Values::array_get($payload, 'sms_pumping_risk'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['phoneNumber' => $phoneNumber ?: $this->properties['phoneNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['phoneNumber'] + ); + } + + return $this->context; + } + + /** + * Fetch the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): PhoneNumberInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Lookups.V2.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Lookups/V2/PhoneNumberList.php b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberList.php new file mode 100755 index 0000000..1a4c3e1 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a PhoneNumberContext + * + * @param string $phoneNumber The phone number to lookup in E.164 or national format. Default country code is +1 (North America). + */ + public function getContext( + string $phoneNumber + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $phoneNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V2.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Lookups/V2/PhoneNumberOptions.php b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberOptions.php new file mode 100755 index 0000000..364cda7 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberOptions.php @@ -0,0 +1,274 @@ +options['fields'] = $fields; + $this->options['countryCode'] = $countryCode; + $this->options['firstName'] = $firstName; + $this->options['lastName'] = $lastName; + $this->options['addressLine1'] = $addressLine1; + $this->options['addressLine2'] = $addressLine2; + $this->options['city'] = $city; + $this->options['state'] = $state; + $this->options['postalCode'] = $postalCode; + $this->options['addressCountryCode'] = $addressCountryCode; + $this->options['nationalId'] = $nationalId; + $this->options['dateOfBirth'] = $dateOfBirth; + } + + /** + * A comma-separated list of fields to return. Possible values are caller_name, sim_swap, call_forwarding, live_activity, line_type_intelligence, identity_match. + * + * @param string $fields A comma-separated list of fields to return. Possible values are caller_name, sim_swap, call_forwarding, live_activity, line_type_intelligence, identity_match. + * @return $this Fluent Builder + */ + public function setFields(string $fields): self + { + $this->options['fields'] = $fields; + return $this; + } + + /** + * The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + * + * @param string $countryCode The [country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) used if the phone number provided is in national format. + * @return $this Fluent Builder + */ + public function setCountryCode(string $countryCode): self + { + $this->options['countryCode'] = $countryCode; + return $this; + } + + /** + * User’s first name. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $firstName User’s first name. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setFirstName(string $firstName): self + { + $this->options['firstName'] = $firstName; + return $this; + } + + /** + * User’s last name. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $lastName User’s last name. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setLastName(string $lastName): self + { + $this->options['lastName'] = $lastName; + return $this; + } + + /** + * User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $addressLine1 User’s first address line. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setAddressLine1(string $addressLine1): self + { + $this->options['addressLine1'] = $addressLine1; + return $this; + } + + /** + * User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $addressLine2 User’s second address line. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setAddressLine2(string $addressLine2): self + { + $this->options['addressLine2'] = $addressLine2; + return $this; + } + + /** + * User’s city. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $city User’s city. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setCity(string $city): self + { + $this->options['city'] = $city; + return $this; + } + + /** + * User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $state User’s country subdivision, such as state, province, or locality. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setState(string $state): self + { + $this->options['state'] = $state; + return $this; + } + + /** + * User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $postalCode User’s postal zip code. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setPostalCode(string $postalCode): self + { + $this->options['postalCode'] = $postalCode; + return $this; + } + + /** + * User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $addressCountryCode User’s country, up to two characters. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setAddressCountryCode(string $addressCountryCode): self + { + $this->options['addressCountryCode'] = $addressCountryCode; + return $this; + } + + /** + * User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $nationalId User’s national ID, such as SSN or Passport ID. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setNationalId(string $nationalId): self + { + $this->options['nationalId'] = $nationalId; + return $this; + } + + /** + * User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + * + * @param string $dateOfBirth User’s date of birth, in YYYYMMDD format. This query parameter is only used (optionally) for identity_match package requests. + * @return $this Fluent Builder + */ + public function setDateOfBirth(string $dateOfBirth): self + { + $this->options['dateOfBirth'] = $dateOfBirth; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Lookups.V2.FetchPhoneNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Lookups/V2/PhoneNumberPage.php b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberPage.php new file mode 100755 index 0000000..ae8e3c2 --- /dev/null +++ b/app/api/Twilio/Rest/Lookups/V2/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Lookups\V2\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Lookups.V2.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/LookupsBase.php b/app/api/Twilio/Rest/LookupsBase.php new file mode 100755 index 0000000..2b3cc59 --- /dev/null +++ b/app/api/Twilio/Rest/LookupsBase.php @@ -0,0 +1,101 @@ +baseUrl = 'https://lookups.twilio.com'; + } + + + /** + * @return V1 Version v1 of lookups + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of lookups + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Lookups]'; + } +} diff --git a/app/api/Twilio/Rest/Media.php b/app/api/Twilio/Rest/Media.php new file mode 100755 index 0000000..c7b7362 --- /dev/null +++ b/app/api/Twilio/Rest/Media.php @@ -0,0 +1,59 @@ +mediaProcessor instead. + */ + protected function getMediaProcessor(): \Twilio\Rest\Media\V1\MediaProcessorList { + echo "mediaProcessor is deprecated. Use v1->mediaProcessor instead."; + return $this->v1->mediaProcessor; + } + + /** + * @deprecated Use v1->mediaProcessor(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextMediaProcessor(string $sid): \Twilio\Rest\Media\V1\MediaProcessorContext { + echo "mediaProcessor(\$sid) is deprecated. Use v1->mediaProcessor(\$sid) instead."; + return $this->v1->mediaProcessor($sid); + } + + /** + * @deprecated Use v1->mediaRecording instead. + */ + protected function getMediaRecording(): \Twilio\Rest\Media\V1\MediaRecordingList { + echo "mediaRecording is deprecated. Use v1->mediaRecording instead."; + return $this->v1->mediaRecording; + } + + /** + * @deprecated Use v1->mediaRecording(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextMediaRecording(string $sid): \Twilio\Rest\Media\V1\MediaRecordingContext { + echo "mediaRecording(\$sid) is deprecated. Use v1->mediaRecording(\$sid) instead."; + return $this->v1->mediaRecording($sid); + } + + /** + * @deprecated Use v1->playerStreamer instead. + */ + protected function getPlayerStreamer(): \Twilio\Rest\Media\V1\PlayerStreamerList { + echo "playerStreamer is deprecated. Use v1->playerStreamer instead."; + return $this->v1->playerStreamer; + } + + /** + * @deprecated Use v1->playerStreamer(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextPlayerStreamer(string $sid): \Twilio\Rest\Media\V1\PlayerStreamerContext { + echo "playerStreamer(\$sid) is deprecated. Use v1->playerStreamer(\$sid) instead."; + return $this->v1->playerStreamer($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Media/V1.php b/app/api/Twilio/Rest/Media/V1.php new file mode 100755 index 0000000..8c8d0d3 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1.php @@ -0,0 +1,119 @@ +version = 'v1'; + } + + protected function getMediaProcessor(): MediaProcessorList + { + if (!$this->_mediaProcessor) { + $this->_mediaProcessor = new MediaProcessorList($this); + } + return $this->_mediaProcessor; + } + + protected function getMediaRecording(): MediaRecordingList + { + if (!$this->_mediaRecording) { + $this->_mediaRecording = new MediaRecordingList($this); + } + return $this->_mediaRecording; + } + + protected function getPlayerStreamer(): PlayerStreamerList + { + if (!$this->_playerStreamer) { + $this->_playerStreamer = new PlayerStreamerList($this); + } + return $this->_playerStreamer; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaProcessorContext.php b/app/api/Twilio/Rest/Media/V1/MediaProcessorContext.php new file mode 100755 index 0000000..64ae9ec --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaProcessorContext.php @@ -0,0 +1,107 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/MediaProcessors/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the MediaProcessorInstance + * + * @return MediaProcessorInstance Fetched MediaProcessorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaProcessorInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MediaProcessorInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the MediaProcessorInstance + * + * @param string $status + * @return MediaProcessorInstance Updated MediaProcessorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): MediaProcessorInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MediaProcessorInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.MediaProcessorContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaProcessorInstance.php b/app/api/Twilio/Rest/Media/V1/MediaProcessorInstance.php new file mode 100755 index 0000000..2eb2ce7 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaProcessorInstance.php @@ -0,0 +1,151 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'extension' => Values::array_get($payload, 'extension'), + 'extensionContext' => Values::array_get($payload, 'extension_context'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'endedReason' => Values::array_get($payload, 'ended_reason'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'maxDuration' => Values::array_get($payload, 'max_duration'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MediaProcessorContext Context for this MediaProcessorInstance + */ + protected function proxy(): MediaProcessorContext + { + if (!$this->context) { + $this->context = new MediaProcessorContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the MediaProcessorInstance + * + * @return MediaProcessorInstance Fetched MediaProcessorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaProcessorInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MediaProcessorInstance + * + * @param string $status + * @return MediaProcessorInstance Updated MediaProcessorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): MediaProcessorInstance + { + + return $this->proxy()->update($status); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.MediaProcessorInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Media/V1/MediaProcessorList.php b/app/api/Twilio/Rest/Media/V1/MediaProcessorList.php new file mode 100755 index 0000000..f5ef159 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaProcessorList.php @@ -0,0 +1,210 @@ +solution = [ + ]; + + $this->uri = '/MediaProcessors'; + } + + /** + * Create the MediaProcessorInstance + * + * @param string $extension The [Media Extension](/docs/live/api/media-extensions-overview) name or URL. Ex: `video-composer-v2` + * @param string $extensionContext The context of the Media Extension, represented as a JSON dictionary. See the documentation for the specific [Media Extension](/docs/live/api/media-extensions-overview) you are using for more information about the context to send. + * @param array|Options $options Optional Arguments + * @return MediaProcessorInstance Created MediaProcessorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $extension, string $extensionContext, array $options = []): MediaProcessorInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Extension' => + $extension, + 'ExtensionContext' => + $extensionContext, + 'ExtensionEnvironment' => + Serialize::jsonObject($options['extensionEnvironment']), + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'MaxDuration' => + $options['maxDuration'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MediaProcessorInstance( + $this->version, + $payload + ); + } + + + /** + * Reads MediaProcessorInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MediaProcessorInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MediaProcessorInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MediaProcessorInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MediaProcessorPage Page of MediaProcessorInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MediaProcessorPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MediaProcessorPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MediaProcessorInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MediaProcessorPage Page of MediaProcessorInstance + */ + public function getPage(string $targetUrl): MediaProcessorPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MediaProcessorPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MediaProcessorContext + * + * @param string $sid The SID of the MediaProcessor resource to fetch. + */ + public function getContext( + string $sid + + ): MediaProcessorContext + { + return new MediaProcessorContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.MediaProcessorList]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaProcessorOptions.php b/app/api/Twilio/Rest/Media/V1/MediaProcessorOptions.php new file mode 100755 index 0000000..0cbf5c3 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaProcessorOptions.php @@ -0,0 +1,204 @@ +options['extensionEnvironment'] = $extensionEnvironment; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['maxDuration'] = $maxDuration; + } + + /** + * User-defined environment variables for the Media Extension, represented as a JSON dictionary of key/value strings. See the documentation for the specific [Media Extension](/docs/live/api/media-extensions-overview) you are using for more information about whether you need to provide this. + * + * @param array $extensionEnvironment User-defined environment variables for the Media Extension, represented as a JSON dictionary of key/value strings. See the documentation for the specific [Media Extension](/docs/live/api/media-extensions-overview) you are using for more information about whether you need to provide this. + * @return $this Fluent Builder + */ + public function setExtensionEnvironment(array $extensionEnvironment): self + { + $this->options['extensionEnvironment'] = $extensionEnvironment; + return $this; + } + + /** + * The URL to which Twilio will send asynchronous webhook requests for every MediaProcessor event. See [Status Callbacks](/docs/live/status-callbacks) for details. + * + * @param string $statusCallback The URL to which Twilio will send asynchronous webhook requests for every MediaProcessor event. See [Status Callbacks](/docs/live/status-callbacks) for details. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method Twilio should use to call the `status_callback` URL. Can be `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method Twilio should use to call the `status_callback` URL. Can be `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The maximum time, in seconds, that the MediaProcessor can run before automatically ends. The default value is 300 seconds, and the maximum value is 90000 seconds. Once this maximum duration is reached, Twilio will end the MediaProcessor, regardless of whether media is still streaming. + * + * @param int $maxDuration The maximum time, in seconds, that the MediaProcessor can run before automatically ends. The default value is 300 seconds, and the maximum value is 90000 seconds. Once this maximum duration is reached, Twilio will end the MediaProcessor, regardless of whether media is still streaming. + * @return $this Fluent Builder + */ + public function setMaxDuration(int $maxDuration): self + { + $this->options['maxDuration'] = $maxDuration; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.CreateMediaProcessorOptions ' . $options . ']'; + } +} + + +class ReadMediaProcessorOptions extends Options + { + /** + * @param string $order The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * @param string $status Status to filter by, with possible values `started`, `ended` or `failed`. + */ + public function __construct( + + string $order = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['status'] = $status; + } + + /** + * The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * + * @param string $order The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Status to filter by, with possible values `started`, `ended` or `failed`. + * + * @param string $status Status to filter by, with possible values `started`, `ended` or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.ReadMediaProcessorOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Media/V1/MediaProcessorPage.php b/app/api/Twilio/Rest/Media/V1/MediaProcessorPage.php new file mode 100755 index 0000000..e1e74a4 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaProcessorPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MediaProcessorInstance \Twilio\Rest\Media\V1\MediaProcessorInstance + */ + public function buildInstance(array $payload): MediaProcessorInstance + { + return new MediaProcessorInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.MediaProcessorPage]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaRecordingContext.php b/app/api/Twilio/Rest/Media/V1/MediaRecordingContext.php new file mode 100755 index 0000000..5185bfc --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaRecordingContext.php @@ -0,0 +1,94 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/MediaRecordings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the MediaRecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MediaRecordingInstance + * + * @return MediaRecordingInstance Fetched MediaRecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaRecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MediaRecordingInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.MediaRecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaRecordingInstance.php b/app/api/Twilio/Rest/Media/V1/MediaRecordingInstance.php new file mode 100755 index 0000000..c1623d1 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaRecordingInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'duration' => Values::array_get($payload, 'duration'), + 'format' => Values::array_get($payload, 'format'), + 'links' => Values::array_get($payload, 'links'), + 'processorSid' => Values::array_get($payload, 'processor_sid'), + 'resolution' => Values::array_get($payload, 'resolution'), + 'sourceSid' => Values::array_get($payload, 'source_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'mediaSize' => Values::array_get($payload, 'media_size'), + 'status' => Values::array_get($payload, 'status'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MediaRecordingContext Context for this MediaRecordingInstance + */ + protected function proxy(): MediaRecordingContext + { + if (!$this->context) { + $this->context = new MediaRecordingContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the MediaRecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MediaRecordingInstance + * + * @return MediaRecordingInstance Fetched MediaRecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MediaRecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.MediaRecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Media/V1/MediaRecordingList.php b/app/api/Twilio/Rest/Media/V1/MediaRecordingList.php new file mode 100755 index 0000000..ffc73d6 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaRecordingList.php @@ -0,0 +1,174 @@ +solution = [ + ]; + + $this->uri = '/MediaRecordings'; + } + + /** + * Reads MediaRecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MediaRecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams MediaRecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MediaRecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MediaRecordingPage Page of MediaRecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MediaRecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'Status' => + $options['status'], + 'ProcessorSid' => + $options['processorSid'], + 'SourceSid' => + $options['sourceSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MediaRecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MediaRecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MediaRecordingPage Page of MediaRecordingInstance + */ + public function getPage(string $targetUrl): MediaRecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MediaRecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MediaRecordingContext + * + * @param string $sid The SID of the MediaRecording resource to delete. + */ + public function getContext( + string $sid + + ): MediaRecordingContext + { + return new MediaRecordingContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.MediaRecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/MediaRecordingOptions.php b/app/api/Twilio/Rest/Media/V1/MediaRecordingOptions.php new file mode 100755 index 0000000..6dcbf38 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaRecordingOptions.php @@ -0,0 +1,134 @@ +options['order'] = $order; + $this->options['status'] = $status; + $this->options['processorSid'] = $processorSid; + $this->options['sourceSid'] = $sourceSid; + } + + /** + * The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * + * @param string $order The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Status to filter by, with possible values `processing`, `completed`, `deleted`, or `failed`. + * + * @param string $status Status to filter by, with possible values `processing`, `completed`, `deleted`, or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * SID of a MediaProcessor to filter by. + * + * @param string $processorSid SID of a MediaProcessor to filter by. + * @return $this Fluent Builder + */ + public function setProcessorSid(string $processorSid): self + { + $this->options['processorSid'] = $processorSid; + return $this; + } + + /** + * SID of a MediaRecording source to filter by. + * + * @param string $sourceSid SID of a MediaRecording source to filter by. + * @return $this Fluent Builder + */ + public function setSourceSid(string $sourceSid): self + { + $this->options['sourceSid'] = $sourceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.ReadMediaRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Media/V1/MediaRecordingPage.php b/app/api/Twilio/Rest/Media/V1/MediaRecordingPage.php new file mode 100755 index 0000000..338286c --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/MediaRecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MediaRecordingInstance \Twilio\Rest\Media\V1\MediaRecordingInstance + */ + public function buildInstance(array $payload): MediaRecordingInstance + { + return new MediaRecordingInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.MediaRecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantContext.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantContext.php new file mode 100755 index 0000000..e4c0a30 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantContext.php @@ -0,0 +1,112 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/PlayerStreamers/' . \rawurlencode($sid) + .'/PlaybackGrant'; + } + + /** + * Create the PlaybackGrantInstance + * + * @param array|Options $options Optional Arguments + * @return PlaybackGrantInstance Created PlaybackGrantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): PlaybackGrantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + 'AccessControlAllowOrigin' => + $options['accessControlAllowOrigin'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PlaybackGrantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Fetch the PlaybackGrantInstance + * + * @return PlaybackGrantInstance Fetched PlaybackGrantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PlaybackGrantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PlaybackGrantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.PlaybackGrantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantInstance.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantInstance.php new file mode 100755 index 0000000..f0b2983 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantInstance.php @@ -0,0 +1,138 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'grant' => Values::array_get($payload, 'grant'), + ]; + + $this->solution = ['sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PlaybackGrantContext Context for this PlaybackGrantInstance + */ + protected function proxy(): PlaybackGrantContext + { + if (!$this->context) { + $this->context = new PlaybackGrantContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Create the PlaybackGrantInstance + * + * @param array|Options $options Optional Arguments + * @return PlaybackGrantInstance Created PlaybackGrantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): PlaybackGrantInstance + { + + return $this->proxy()->create($options); + } + + /** + * Fetch the PlaybackGrantInstance + * + * @return PlaybackGrantInstance Fetched PlaybackGrantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PlaybackGrantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.PlaybackGrantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantList.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantList.php new file mode 100755 index 0000000..97ce6f6 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantList.php @@ -0,0 +1,67 @@ +solution = [ + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a PlaybackGrantContext + */ + public function getContext( + + ): PlaybackGrantContext + { + return new PlaybackGrantContext( + $this->version, + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.PlaybackGrantList]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantOptions.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantOptions.php new file mode 100755 index 0000000..35f6fc0 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantOptions.php @@ -0,0 +1,96 @@ +options['ttl'] = $ttl; + $this->options['accessControlAllowOrigin'] = $accessControlAllowOrigin; + } + + /** + * The time to live of the PlaybackGrant. Default value is 15 seconds. Maximum value is 60 seconds. + * + * @param int $ttl The time to live of the PlaybackGrant. Default value is 15 seconds. Maximum value is 60 seconds. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * The full origin URL where the livestream can be streamed. If this is not provided, it can be streamed from any domain. + * + * @param string $accessControlAllowOrigin The full origin URL where the livestream can be streamed. If this is not provided, it can be streamed from any domain. + * @return $this Fluent Builder + */ + public function setAccessControlAllowOrigin(string $accessControlAllowOrigin): self + { + $this->options['accessControlAllowOrigin'] = $accessControlAllowOrigin; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.CreatePlaybackGrantOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantPage.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantPage.php new file mode 100755 index 0000000..78186b3 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamer/PlaybackGrantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PlaybackGrantInstance \Twilio\Rest\Media\V1\PlayerStreamer\PlaybackGrantInstance + */ + public function buildInstance(array $payload): PlaybackGrantInstance + { + return new PlaybackGrantInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.PlaybackGrantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamerContext.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamerContext.php new file mode 100755 index 0000000..cb18f35 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamerContext.php @@ -0,0 +1,165 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/PlayerStreamers/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the PlayerStreamerInstance + * + * @return PlayerStreamerInstance Fetched PlayerStreamerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PlayerStreamerInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PlayerStreamerInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the PlayerStreamerInstance + * + * @param string $status + * @return PlayerStreamerInstance Updated PlayerStreamerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): PlayerStreamerInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new PlayerStreamerInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the playbackGrant + */ + protected function getPlaybackGrant(): PlaybackGrantList + { + if (!$this->_playbackGrant) { + $this->_playbackGrant = new PlaybackGrantList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_playbackGrant; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.PlayerStreamerContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamerInstance.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamerInstance.php new file mode 100755 index 0000000..d0a515b --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamerInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'video' => Values::array_get($payload, 'video'), + 'links' => Values::array_get($payload, 'links'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'endedReason' => Values::array_get($payload, 'ended_reason'), + 'maxDuration' => Values::array_get($payload, 'max_duration'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PlayerStreamerContext Context for this PlayerStreamerInstance + */ + protected function proxy(): PlayerStreamerContext + { + if (!$this->context) { + $this->context = new PlayerStreamerContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the PlayerStreamerInstance + * + * @return PlayerStreamerInstance Fetched PlayerStreamerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PlayerStreamerInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the PlayerStreamerInstance + * + * @param string $status + * @return PlayerStreamerInstance Updated PlayerStreamerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): PlayerStreamerInstance + { + + return $this->proxy()->update($status); + } + + /** + * Access the playbackGrant + */ + protected function getPlaybackGrant(): PlaybackGrantList + { + return $this->proxy()->playbackGrant; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Media.V1.PlayerStreamerInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamerList.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamerList.php new file mode 100755 index 0000000..92b34fa --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamerList.php @@ -0,0 +1,204 @@ +solution = [ + ]; + + $this->uri = '/PlayerStreamers'; + } + + /** + * Create the PlayerStreamerInstance + * + * @param array|Options $options Optional Arguments + * @return PlayerStreamerInstance Created PlayerStreamerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): PlayerStreamerInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Video' => + Serialize::booleanToString($options['video']), + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'MaxDuration' => + $options['maxDuration'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PlayerStreamerInstance( + $this->version, + $payload + ); + } + + + /** + * Reads PlayerStreamerInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PlayerStreamerInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams PlayerStreamerInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PlayerStreamerInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PlayerStreamerPage Page of PlayerStreamerInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PlayerStreamerPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PlayerStreamerPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PlayerStreamerInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PlayerStreamerPage Page of PlayerStreamerInstance + */ + public function getPage(string $targetUrl): PlayerStreamerPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PlayerStreamerPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PlayerStreamerContext + * + * @param string $sid The SID of the PlayerStreamer resource to fetch. + */ + public function getContext( + string $sid + + ): PlayerStreamerContext + { + return new PlayerStreamerContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.PlayerStreamerList]'; + } +} diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamerOptions.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamerOptions.php new file mode 100755 index 0000000..0348334 --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamerOptions.php @@ -0,0 +1,204 @@ +options['video'] = $video; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['maxDuration'] = $maxDuration; + } + + /** + * Specifies whether the PlayerStreamer is configured to stream video. Defaults to `true`. + * + * @param bool $video Specifies whether the PlayerStreamer is configured to stream video. Defaults to `true`. + * @return $this Fluent Builder + */ + public function setVideo(bool $video): self + { + $this->options['video'] = $video; + return $this; + } + + /** + * The URL to which Twilio will send asynchronous webhook requests for every PlayerStreamer event. See [Status Callbacks](/docs/live/status-callbacks) for more details. + * + * @param string $statusCallback The URL to which Twilio will send asynchronous webhook requests for every PlayerStreamer event. See [Status Callbacks](/docs/live/status-callbacks) for more details. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method Twilio should use to call the `status_callback` URL. Can be `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method Twilio should use to call the `status_callback` URL. Can be `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The maximum time, in seconds, that the PlayerStreamer is active (`created` or `started`) before automatically ends. The default value is 300 seconds, and the maximum value is 90000 seconds. Once this maximum duration is reached, Twilio will end the PlayerStreamer, regardless of whether media is still streaming. + * + * @param int $maxDuration The maximum time, in seconds, that the PlayerStreamer is active (`created` or `started`) before automatically ends. The default value is 300 seconds, and the maximum value is 90000 seconds. Once this maximum duration is reached, Twilio will end the PlayerStreamer, regardless of whether media is still streaming. + * @return $this Fluent Builder + */ + public function setMaxDuration(int $maxDuration): self + { + $this->options['maxDuration'] = $maxDuration; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.CreatePlayerStreamerOptions ' . $options . ']'; + } +} + + +class ReadPlayerStreamerOptions extends Options + { + /** + * @param string $order The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * @param string $status Status to filter by, with possible values `created`, `started`, `ended`, or `failed`. + */ + public function __construct( + + string $order = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['status'] = $status; + } + + /** + * The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * + * @param string $order The sort order of the list by `date_created`. Can be: `asc` (ascending) or `desc` (descending) with `desc` as the default. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Status to filter by, with possible values `created`, `started`, `ended`, or `failed`. + * + * @param string $status Status to filter by, with possible values `created`, `started`, `ended`, or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Media.V1.ReadPlayerStreamerOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Media/V1/PlayerStreamerPage.php b/app/api/Twilio/Rest/Media/V1/PlayerStreamerPage.php new file mode 100755 index 0000000..76cdc6a --- /dev/null +++ b/app/api/Twilio/Rest/Media/V1/PlayerStreamerPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PlayerStreamerInstance \Twilio\Rest\Media\V1\PlayerStreamerInstance + */ + public function buildInstance(array $payload): PlayerStreamerInstance + { + return new PlayerStreamerInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Media.V1.PlayerStreamerPage]'; + } +} diff --git a/app/api/Twilio/Rest/MediaBase.php b/app/api/Twilio/Rest/MediaBase.php new file mode 100755 index 0000000..00b0c3c --- /dev/null +++ b/app/api/Twilio/Rest/MediaBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://media.twilio.com'; + } + + + /** + * @return V1 Version v1 of media + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Media]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging.php b/app/api/Twilio/Rest/Messaging.php new file mode 100755 index 0000000..5d14e38 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging.php @@ -0,0 +1,126 @@ +brandRegistrations instead."; + return $this->v1->brandRegistrations; + } + + /** + * @deprecated + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextBrandRegistrations(string $sid): \Twilio\Rest\Messaging\V1\BrandRegistrationContext { + echo "brandRegistrations(\$sid) is deprecated. Use v1->brandRegistrations(\$sid) instead."; + return $this->v1->brandRegistrations($sid); + } + + /** + * @deprecated + */ + protected function getDeactivations(): \Twilio\Rest\Messaging\V1\DeactivationsList { + echo "deactivations is deprecated. Use v1->deactivations instead."; + return $this->v1->deactivations; + } + + /** + * @deprecated Use v1->deactivations() instead. + */ + protected function contextDeactivations(): \Twilio\Rest\Messaging\V1\DeactivationsContext { + echo "deactivations() is deprecated. Use v1->deactivations() instead."; + return $this->v1->deactivations(); + } + + /** + * @deprecated Use v1->domainCerts instead. + */ + protected function getDomainCerts(): \Twilio\Rest\Messaging\V1\DomainCertsList { + echo "domainCerts is deprecated. Use v1->domainCerts instead."; + return $this->v1->domainCerts; + } + + /** + * @deprecated Use v1->domainCerts(\$domainSid) instead. + * @param string $domainSid Unique string used to identify the domain that this + * certificate should be associated with. + */ + protected function contextDomainCerts(string $domainSid): \Twilio\Rest\Messaging\V1\DomainCertsContext { + echo "domainCerts(\$domainSid) is deprecated. Use v1->domainCerts(\$domainSid) instead."; + return $this->v1->domainCerts($domainSid); + } + + /** + * @deprecated Use v1->domainConfig instead. + */ + protected function getDomainConfig(): \Twilio\Rest\Messaging\V1\DomainConfigList { + echo "domainConfig is deprecated. Use v1->domainConfig instead."; + return $this->v1->domainConfig; + } + + /** + * @deprecated Use v1->domainConfig(\$domainSid) instead. + * @param string $domainSid Unique string used to identify the domain that this + * config should be associated with. + */ + protected function contextDomainConfig(string $domainSid): \Twilio\Rest\Messaging\V1\DomainConfigContext { + echo "domainConfig(\$domainSid) is deprecated. Use v1->domainConfig(\$domainSid) instead."; + return $this->v1->domainConfig($domainSid); + } + + /** + * @deprecated Use v1->externalCampaign instead. + */ + protected function getExternalCampaign(): \Twilio\Rest\Messaging\V1\ExternalCampaignList { + echo "externalCampaign is deprecated. Use v1->externalCampaign instead."; + return $this->v1->externalCampaign; + } + + /** + * @deprecated Use v1->services instead. + */ + protected function getServices(): \Twilio\Rest\Messaging\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextServices(string $sid): \Twilio\Rest\Messaging\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } + + /** + * @deprecated Use v1->tollfreeVerifications instead. + */ + protected function getTollfreeVerifications(): \Twilio\Rest\Messaging\V1\TollfreeVerificationList { + echo "tollfreeVerifications is deprecated. Use v1->tollfreeVerifications instead."; + return $this->v1->tollfreeVerifications; + } + + /** + * @deprecated Use v1->tollfreeVerifications(\$sid) instead. + * @param string $sid Tollfree Verification Sid + */ + protected function contextTollfreeVerifications(string $sid): \Twilio\Rest\Messaging\V1\TollfreeVerificationContext { + echo "tollfreeVerifications(\$sid) is deprecated. Use v1->tollfreeVerifications(\$sid) instead."; + return $this->v1->tollfreeVerifications($sid); + } + + /** + * @deprecated Use v1->usecases instead. + */ + protected function getUsecases(): \Twilio\Rest\Messaging\V1\UsecaseList { + echo "usecases is deprecated. Use v1->usecases instead."; + return $this->v1->usecases; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Messaging/V1.php b/app/api/Twilio/Rest/Messaging/V1.php new file mode 100755 index 0000000..3537242 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1.php @@ -0,0 +1,197 @@ +version = 'v1'; + } + + protected function getBrandRegistrations(): BrandRegistrationList + { + if (!$this->_brandRegistrations) { + $this->_brandRegistrations = new BrandRegistrationList($this); + } + return $this->_brandRegistrations; + } + + protected function getDeactivations(): DeactivationsList + { + if (!$this->_deactivations) { + $this->_deactivations = new DeactivationsList($this); + } + return $this->_deactivations; + } + + protected function getDomainCerts(): DomainCertsList + { + if (!$this->_domainCerts) { + $this->_domainCerts = new DomainCertsList($this); + } + return $this->_domainCerts; + } + + protected function getDomainConfig(): DomainConfigList + { + if (!$this->_domainConfig) { + $this->_domainConfig = new DomainConfigList($this); + } + return $this->_domainConfig; + } + + protected function getDomainConfigMessagingService(): DomainConfigMessagingServiceList + { + if (!$this->_domainConfigMessagingService) { + $this->_domainConfigMessagingService = new DomainConfigMessagingServiceList($this); + } + return $this->_domainConfigMessagingService; + } + + protected function getExternalCampaign(): ExternalCampaignList + { + if (!$this->_externalCampaign) { + $this->_externalCampaign = new ExternalCampaignList($this); + } + return $this->_externalCampaign; + } + + protected function getLinkshorteningMessagingService(): LinkshorteningMessagingServiceList + { + if (!$this->_linkshorteningMessagingService) { + $this->_linkshorteningMessagingService = new LinkshorteningMessagingServiceList($this); + } + return $this->_linkshorteningMessagingService; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + protected function getTollfreeVerifications(): TollfreeVerificationList + { + if (!$this->_tollfreeVerifications) { + $this->_tollfreeVerifications = new TollfreeVerificationList($this); + } + return $this->_tollfreeVerifications; + } + + protected function getUsecases(): UsecaseList + { + if (!$this->_usecases) { + $this->_usecases = new UsecaseList($this); + } + return $this->_usecases; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpInstance.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpInstance.php new file mode 100755 index 0000000..c51ea30 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpInstance.php @@ -0,0 +1,83 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'brandRegistrationSid' => Values::array_get($payload, 'brand_registration_sid'), + ]; + + $this->solution = ['brandRegistrationSid' => $brandRegistrationSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandRegistrationOtpInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpList.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpList.php new file mode 100755 index 0000000..71f95ac --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpList.php @@ -0,0 +1,77 @@ +solution = [ + 'brandRegistrationSid' => + $brandRegistrationSid, + + ]; + + $this->uri = '/a2p/BrandRegistrations/' . \rawurlencode($brandRegistrationSid) + .'/SmsOtp'; + } + + /** + * Create the BrandRegistrationOtpInstance + * + * @return BrandRegistrationOtpInstance Created BrandRegistrationOtpInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): BrandRegistrationOtpInstance + { + + $payload = $this->version->create('POST', $this->uri); + + return new BrandRegistrationOtpInstance( + $this->version, + $payload, + $this->solution['brandRegistrationSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandRegistrationOtpList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpPage.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpPage.php new file mode 100755 index 0000000..00c495b --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandRegistrationOtpPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BrandRegistrationOtpInstance \Twilio\Rest\Messaging\V1\BrandRegistration\BrandRegistrationOtpInstance + */ + public function buildInstance(array $payload): BrandRegistrationOtpInstance + { + return new BrandRegistrationOtpInstance($this->version, $payload, $this->solution['brandRegistrationSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandRegistrationOtpPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingContext.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingContext.php new file mode 100755 index 0000000..41794e3 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingContext.php @@ -0,0 +1,87 @@ +solution = [ + 'brandSid' => + $brandSid, + 'brandVettingSid' => + $brandVettingSid, + ]; + + $this->uri = '/a2p/BrandRegistrations/' . \rawurlencode($brandSid) + .'/Vettings/' . \rawurlencode($brandVettingSid) + .''; + } + + /** + * Fetch the BrandVettingInstance + * + * @return BrandVettingInstance Fetched BrandVettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BrandVettingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BrandVettingInstance( + $this->version, + $payload, + $this->solution['brandSid'], + $this->solution['brandVettingSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.BrandVettingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingInstance.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingInstance.php new file mode 100755 index 0000000..a1ab914 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'brandSid' => Values::array_get($payload, 'brand_sid'), + 'brandVettingSid' => Values::array_get($payload, 'brand_vetting_sid'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'vettingId' => Values::array_get($payload, 'vetting_id'), + 'vettingClass' => Values::array_get($payload, 'vetting_class'), + 'vettingStatus' => Values::array_get($payload, 'vetting_status'), + 'vettingProvider' => Values::array_get($payload, 'vetting_provider'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['brandSid' => $brandSid, 'brandVettingSid' => $brandVettingSid ?: $this->properties['brandVettingSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BrandVettingContext Context for this BrandVettingInstance + */ + protected function proxy(): BrandVettingContext + { + if (!$this->context) { + $this->context = new BrandVettingContext( + $this->version, + $this->solution['brandSid'], + $this->solution['brandVettingSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the BrandVettingInstance + * + * @return BrandVettingInstance Fetched BrandVettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BrandVettingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.BrandVettingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingList.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingList.php new file mode 100755 index 0000000..b323f7d --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingList.php @@ -0,0 +1,206 @@ +solution = [ + 'brandSid' => + $brandSid, + + ]; + + $this->uri = '/a2p/BrandRegistrations/' . \rawurlencode($brandSid) + .'/Vettings'; + } + + /** + * Create the BrandVettingInstance + * + * @param string $vettingProvider + * @param array|Options $options Optional Arguments + * @return BrandVettingInstance Created BrandVettingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $vettingProvider, array $options = []): BrandVettingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'VettingProvider' => + $vettingProvider, + 'VettingId' => + $options['vettingId'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BrandVettingInstance( + $this->version, + $payload, + $this->solution['brandSid'] + ); + } + + + /** + * Reads BrandVettingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BrandVettingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BrandVettingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BrandVettingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BrandVettingPage Page of BrandVettingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BrandVettingPage + { + $options = new Values($options); + + $params = Values::of([ + 'VettingProvider' => + $options['vettingProvider'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BrandVettingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BrandVettingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BrandVettingPage Page of BrandVettingInstance + */ + public function getPage(string $targetUrl): BrandVettingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BrandVettingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BrandVettingContext + * + * @param string $brandVettingSid The Twilio SID of the third-party vetting record. + */ + public function getContext( + string $brandVettingSid + + ): BrandVettingContext + { + return new BrandVettingContext( + $this->version, + $this->solution['brandSid'], + $brandVettingSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandVettingList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingOptions.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingOptions.php new file mode 100755 index 0000000..405f9b6 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingOptions.php @@ -0,0 +1,130 @@ +options['vettingId'] = $vettingId; + } + + /** + * The unique ID of the vetting + * + * @param string $vettingId The unique ID of the vetting + * @return $this Fluent Builder + */ + public function setVettingId(string $vettingId): self + { + $this->options['vettingId'] = $vettingId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.CreateBrandVettingOptions ' . $options . ']'; + } +} + + +class ReadBrandVettingOptions extends Options + { + /** + * @param string $vettingProvider The third-party provider of the vettings to read + */ + public function __construct( + + string $vettingProvider = Values::NONE + + ) { + $this->options['vettingProvider'] = $vettingProvider; + } + + /** + * The third-party provider of the vettings to read + * + * @param string $vettingProvider The third-party provider of the vettings to read + * @return $this Fluent Builder + */ + public function setVettingProvider(string $vettingProvider): self + { + $this->options['vettingProvider'] = $vettingProvider; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.ReadBrandVettingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingPage.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingPage.php new file mode 100755 index 0000000..aafad15 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistration/BrandVettingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BrandVettingInstance \Twilio\Rest\Messaging\V1\BrandRegistration\BrandVettingInstance + */ + public function buildInstance(array $payload): BrandVettingInstance + { + return new BrandVettingInstance($this->version, $payload, $this->solution['brandSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandVettingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationContext.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationContext.php new file mode 100755 index 0000000..d016a66 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationContext.php @@ -0,0 +1,176 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/a2p/BrandRegistrations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the BrandRegistrationInstance + * + * @return BrandRegistrationInstance Fetched BrandRegistrationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BrandRegistrationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BrandRegistrationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the BrandRegistrationInstance + * + * @return BrandRegistrationInstance Updated BrandRegistrationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): BrandRegistrationInstance + { + + $payload = $this->version->update('POST', $this->uri); + + return new BrandRegistrationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the brandRegistrationOtps + */ + protected function getBrandRegistrationOtps(): BrandRegistrationOtpList + { + if (!$this->_brandRegistrationOtps) { + $this->_brandRegistrationOtps = new BrandRegistrationOtpList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_brandRegistrationOtps; + } + + /** + * Access the brandVettings + */ + protected function getBrandVettings(): BrandVettingList + { + if (!$this->_brandVettings) { + $this->_brandVettings = new BrandVettingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_brandVettings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.BrandRegistrationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationInstance.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationInstance.php new file mode 100755 index 0000000..f42b472 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationInstance.php @@ -0,0 +1,187 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'customerProfileBundleSid' => Values::array_get($payload, 'customer_profile_bundle_sid'), + 'a2PProfileBundleSid' => Values::array_get($payload, 'a2p_profile_bundle_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'brandType' => Values::array_get($payload, 'brand_type'), + 'status' => Values::array_get($payload, 'status'), + 'tcrId' => Values::array_get($payload, 'tcr_id'), + 'failureReason' => Values::array_get($payload, 'failure_reason'), + 'url' => Values::array_get($payload, 'url'), + 'brandScore' => Values::array_get($payload, 'brand_score'), + 'brandFeedback' => Values::array_get($payload, 'brand_feedback'), + 'identityStatus' => Values::array_get($payload, 'identity_status'), + 'russell3000' => Values::array_get($payload, 'russell_3000'), + 'governmentEntity' => Values::array_get($payload, 'government_entity'), + 'taxExemptStatus' => Values::array_get($payload, 'tax_exempt_status'), + 'skipAutomaticSecVet' => Values::array_get($payload, 'skip_automatic_sec_vet'), + 'mock' => Values::array_get($payload, 'mock'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BrandRegistrationContext Context for this BrandRegistrationInstance + */ + protected function proxy(): BrandRegistrationContext + { + if (!$this->context) { + $this->context = new BrandRegistrationContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the BrandRegistrationInstance + * + * @return BrandRegistrationInstance Fetched BrandRegistrationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BrandRegistrationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the BrandRegistrationInstance + * + * @return BrandRegistrationInstance Updated BrandRegistrationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): BrandRegistrationInstance + { + + return $this->proxy()->update(); + } + + /** + * Access the brandRegistrationOtps + */ + protected function getBrandRegistrationOtps(): BrandRegistrationOtpList + { + return $this->proxy()->brandRegistrationOtps; + } + + /** + * Access the brandVettings + */ + protected function getBrandVettings(): BrandVettingList + { + return $this->proxy()->brandVettings; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.BrandRegistrationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationList.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationList.php new file mode 100755 index 0000000..fa7f720 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationList.php @@ -0,0 +1,200 @@ +solution = [ + ]; + + $this->uri = '/a2p/BrandRegistrations'; + } + + /** + * Create the BrandRegistrationInstance + * + * @param string $customerProfileBundleSid Customer Profile Bundle Sid. + * @param string $a2PProfileBundleSid A2P Messaging Profile Bundle Sid. + * @param array|Options $options Optional Arguments + * @return BrandRegistrationInstance Created BrandRegistrationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $customerProfileBundleSid, string $a2PProfileBundleSid, array $options = []): BrandRegistrationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CustomerProfileBundleSid' => + $customerProfileBundleSid, + 'A2PProfileBundleSid' => + $a2PProfileBundleSid, + 'BrandType' => + $options['brandType'], + 'Mock' => + Serialize::booleanToString($options['mock']), + 'SkipAutomaticSecVet' => + Serialize::booleanToString($options['skipAutomaticSecVet']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BrandRegistrationInstance( + $this->version, + $payload + ); + } + + + /** + * Reads BrandRegistrationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BrandRegistrationInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams BrandRegistrationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BrandRegistrationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BrandRegistrationPage Page of BrandRegistrationInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BrandRegistrationPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BrandRegistrationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BrandRegistrationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BrandRegistrationPage Page of BrandRegistrationInstance + */ + public function getPage(string $targetUrl): BrandRegistrationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BrandRegistrationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BrandRegistrationContext + * + * @param string $sid The SID of the Brand Registration resource to fetch. + */ + public function getContext( + string $sid + + ): BrandRegistrationContext + { + return new BrandRegistrationContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandRegistrationList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationOptions.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationOptions.php new file mode 100755 index 0000000..6981621 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationOptions.php @@ -0,0 +1,118 @@ +options['brandType'] = $brandType; + $this->options['mock'] = $mock; + $this->options['skipAutomaticSecVet'] = $skipAutomaticSecVet; + } + + /** + * Type of brand being created. One of: \\\"STANDARD\\\", \\\"SOLE_PROPRIETOR\\\". SOLE_PROPRIETOR is for low volume, SOLE_PROPRIETOR use cases. STANDARD is for all other use cases. + * + * @param string $brandType Type of brand being created. One of: \\\"STANDARD\\\", \\\"SOLE_PROPRIETOR\\\". SOLE_PROPRIETOR is for low volume, SOLE_PROPRIETOR use cases. STANDARD is for all other use cases. + * @return $this Fluent Builder + */ + public function setBrandType(string $brandType): self + { + $this->options['brandType'] = $brandType; + return $this; + } + + /** + * A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided. + * + * @param bool $mock A boolean that specifies whether brand should be a mock or not. If true, brand will be registered as a mock brand. Defaults to false if no value is provided. + * @return $this Fluent Builder + */ + public function setMock(bool $mock): self + { + $this->options['mock'] = $mock; + return $this; + } + + /** + * A flag to disable automatic secondary vetting for brands which it would otherwise be done. + * + * @param bool $skipAutomaticSecVet A flag to disable automatic secondary vetting for brands which it would otherwise be done. + * @return $this Fluent Builder + */ + public function setSkipAutomaticSecVet(bool $skipAutomaticSecVet): self + { + $this->options['skipAutomaticSecVet'] = $skipAutomaticSecVet; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.CreateBrandRegistrationOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationPage.php b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationPage.php new file mode 100755 index 0000000..ad731ea --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/BrandRegistrationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BrandRegistrationInstance \Twilio\Rest\Messaging\V1\BrandRegistrationInstance + */ + public function buildInstance(array $payload): BrandRegistrationInstance + { + return new BrandRegistrationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.BrandRegistrationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DeactivationsContext.php b/app/api/Twilio/Rest/Messaging/V1/DeactivationsContext.php new file mode 100755 index 0000000..d96639d --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DeactivationsContext.php @@ -0,0 +1,86 @@ +solution = [ + ]; + + $this->uri = '/Deactivations'; + } + + /** + * Fetch the DeactivationsInstance + * + * @param array|Options $options Optional Arguments + * @return DeactivationsInstance Fetched DeactivationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): DeactivationsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Date' => + Serialize::iso8601Date($options['date']), + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new DeactivationsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DeactivationsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DeactivationsInstance.php b/app/api/Twilio/Rest/Messaging/V1/DeactivationsInstance.php new file mode 100755 index 0000000..67e3ebe --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DeactivationsInstance.php @@ -0,0 +1,115 @@ +properties = [ + 'redirectTo' => Values::array_get($payload, 'redirect_to'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeactivationsContext Context for this DeactivationsInstance + */ + protected function proxy(): DeactivationsContext + { + if (!$this->context) { + $this->context = new DeactivationsContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the DeactivationsInstance + * + * @param array|Options $options Optional Arguments + * @return DeactivationsInstance Fetched DeactivationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): DeactivationsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DeactivationsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DeactivationsList.php b/app/api/Twilio/Rest/Messaging/V1/DeactivationsList.php new file mode 100755 index 0000000..f7d8cf3 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DeactivationsList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a DeactivationsContext + */ + public function getContext( + + ): DeactivationsContext + { + return new DeactivationsContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DeactivationsList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DeactivationsOptions.php b/app/api/Twilio/Rest/Messaging/V1/DeactivationsOptions.php new file mode 100755 index 0000000..e4343d8 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DeactivationsOptions.php @@ -0,0 +1,76 @@ +options['date'] = $date; + } + + /** + * The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + * + * @param \DateTime $date The request will return a list of all United States Phone Numbers that were deactivated on the day specified by this parameter. This date should be specified in YYYY-MM-DD format. + * @return $this Fluent Builder + */ + public function setDate(\DateTime $date): self + { + $this->options['date'] = $date; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.FetchDeactivationsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DeactivationsPage.php b/app/api/Twilio/Rest/Messaging/V1/DeactivationsPage.php new file mode 100755 index 0000000..9b28de3 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DeactivationsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeactivationsInstance \Twilio\Rest\Messaging\V1\DeactivationsInstance + */ + public function buildInstance(array $payload): DeactivationsInstance + { + return new DeactivationsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DeactivationsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainCertsContext.php b/app/api/Twilio/Rest/Messaging/V1/DomainCertsContext.php new file mode 100755 index 0000000..867499d --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainCertsContext.php @@ -0,0 +1,120 @@ +solution = [ + 'domainSid' => + $domainSid, + ]; + + $this->uri = '/LinkShortening/Domains/' . \rawurlencode($domainSid) + .'/Certificate'; + } + + /** + * Delete the DomainCertsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DomainCertsInstance + * + * @return DomainCertsInstance Fetched DomainCertsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainCertsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DomainCertsInstance( + $this->version, + $payload, + $this->solution['domainSid'] + ); + } + + + /** + * Update the DomainCertsInstance + * + * @param string $tlsCert Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + * @return DomainCertsInstance Updated DomainCertsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $tlsCert): DomainCertsInstance + { + + $data = Values::of([ + 'TlsCert' => + $tlsCert, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DomainCertsInstance( + $this->version, + $payload, + $this->solution['domainSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainCertsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainCertsInstance.php b/app/api/Twilio/Rest/Messaging/V1/DomainCertsInstance.php new file mode 100755 index 0000000..a50e9d8 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainCertsInstance.php @@ -0,0 +1,155 @@ +properties = [ + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'domainName' => Values::array_get($payload, 'domain_name'), + 'certificateSid' => Values::array_get($payload, 'certificate_sid'), + 'url' => Values::array_get($payload, 'url'), + 'certInValidation' => Values::array_get($payload, 'cert_in_validation'), + ]; + + $this->solution = ['domainSid' => $domainSid ?: $this->properties['domainSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DomainCertsContext Context for this DomainCertsInstance + */ + protected function proxy(): DomainCertsContext + { + if (!$this->context) { + $this->context = new DomainCertsContext( + $this->version, + $this->solution['domainSid'] + ); + } + + return $this->context; + } + + /** + * Delete the DomainCertsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DomainCertsInstance + * + * @return DomainCertsInstance Fetched DomainCertsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainCertsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DomainCertsInstance + * + * @param string $tlsCert Contains the full TLS certificate and private for this domain in PEM format: https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail. Twilio uses this information to process HTTPS traffic sent to your domain. + * @return DomainCertsInstance Updated DomainCertsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $tlsCert): DomainCertsInstance + { + + return $this->proxy()->update($tlsCert); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainCertsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainCertsList.php b/app/api/Twilio/Rest/Messaging/V1/DomainCertsList.php new file mode 100755 index 0000000..1f98176 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainCertsList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a DomainCertsContext + * + * @param string $domainSid Unique string used to identify the domain that this certificate should be associated with. + */ + public function getContext( + string $domainSid + + ): DomainCertsContext + { + return new DomainCertsContext( + $this->version, + $domainSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainCertsList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainCertsPage.php b/app/api/Twilio/Rest/Messaging/V1/DomainCertsPage.php new file mode 100755 index 0000000..1593c04 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainCertsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DomainCertsInstance \Twilio\Rest\Messaging\V1\DomainCertsInstance + */ + public function buildInstance(array $payload): DomainCertsInstance + { + return new DomainCertsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainCertsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigContext.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigContext.php new file mode 100755 index 0000000..59bce36 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigContext.php @@ -0,0 +1,118 @@ +solution = [ + 'domainSid' => + $domainSid, + ]; + + $this->uri = '/LinkShortening/Domains/' . \rawurlencode($domainSid) + .'/Config'; + } + + /** + * Fetch the DomainConfigInstance + * + * @return DomainConfigInstance Fetched DomainConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainConfigInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DomainConfigInstance( + $this->version, + $payload, + $this->solution['domainSid'] + ); + } + + + /** + * Update the DomainConfigInstance + * + * @param string[] $messagingServiceSids A list of messagingServiceSids (with prefix MG) + * @param array|Options $options Optional Arguments + * @return DomainConfigInstance Updated DomainConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $messagingServiceSids, array $options = []): DomainConfigInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'MessagingServiceSids' => + Serialize::map($messagingServiceSids,function ($e) { return $e; }), + 'FallbackUrl' => + $options['fallbackUrl'], + 'CallbackUrl' => + $options['callbackUrl'], + 'MessagingServiceSidsAction' => + $options['messagingServiceSidsAction'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DomainConfigInstance( + $this->version, + $payload, + $this->solution['domainSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainConfigContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigInstance.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigInstance.php new file mode 100755 index 0000000..46526a4 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigInstance.php @@ -0,0 +1,145 @@ +properties = [ + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'configSid' => Values::array_get($payload, 'config_sid'), + 'messagingServiceSids' => Values::array_get($payload, 'messaging_service_sids'), + 'fallbackUrl' => Values::array_get($payload, 'fallback_url'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['domainSid' => $domainSid ?: $this->properties['domainSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DomainConfigContext Context for this DomainConfigInstance + */ + protected function proxy(): DomainConfigContext + { + if (!$this->context) { + $this->context = new DomainConfigContext( + $this->version, + $this->solution['domainSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DomainConfigInstance + * + * @return DomainConfigInstance Fetched DomainConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainConfigInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DomainConfigInstance + * + * @param string[] $messagingServiceSids A list of messagingServiceSids (with prefix MG) + * @param array|Options $options Optional Arguments + * @return DomainConfigInstance Updated DomainConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $messagingServiceSids, array $options = []): DomainConfigInstance + { + + return $this->proxy()->update($messagingServiceSids, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainConfigInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigList.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigList.php new file mode 100755 index 0000000..78f17a1 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a DomainConfigContext + * + * @param string $domainSid Unique string used to identify the domain that this config should be associated with. + */ + public function getContext( + string $domainSid + + ): DomainConfigContext + { + return new DomainConfigContext( + $this->version, + $domainSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainConfigList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceContext.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceContext.php new file mode 100755 index 0000000..0727c15 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceContext.php @@ -0,0 +1,81 @@ +solution = [ + 'messagingServiceSid' => + $messagingServiceSid, + ]; + + $this->uri = '/LinkShortening/MessagingService/' . \rawurlencode($messagingServiceSid) + .'/DomainConfig'; + } + + /** + * Fetch the DomainConfigMessagingServiceInstance + * + * @return DomainConfigMessagingServiceInstance Fetched DomainConfigMessagingServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainConfigMessagingServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DomainConfigMessagingServiceInstance( + $this->version, + $payload, + $this->solution['messagingServiceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainConfigMessagingServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceInstance.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceInstance.php new file mode 100755 index 0000000..2a92eb5 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceInstance.php @@ -0,0 +1,130 @@ +properties = [ + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'configSid' => Values::array_get($payload, 'config_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'fallbackUrl' => Values::array_get($payload, 'fallback_url'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['messagingServiceSid' => $messagingServiceSid ?: $this->properties['messagingServiceSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DomainConfigMessagingServiceContext Context for this DomainConfigMessagingServiceInstance + */ + protected function proxy(): DomainConfigMessagingServiceContext + { + if (!$this->context) { + $this->context = new DomainConfigMessagingServiceContext( + $this->version, + $this->solution['messagingServiceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DomainConfigMessagingServiceInstance + * + * @return DomainConfigMessagingServiceInstance Fetched DomainConfigMessagingServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DomainConfigMessagingServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.DomainConfigMessagingServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceList.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceList.php new file mode 100755 index 0000000..3bf6c57 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServiceList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a DomainConfigMessagingServiceContext + * + * @param string $messagingServiceSid Unique string used to identify the Messaging service that this domain should be associated with. + */ + public function getContext( + string $messagingServiceSid + + ): DomainConfigMessagingServiceContext + { + return new DomainConfigMessagingServiceContext( + $this->version, + $messagingServiceSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainConfigMessagingServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServicePage.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServicePage.php new file mode 100755 index 0000000..f52bfba --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigMessagingServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DomainConfigMessagingServiceInstance \Twilio\Rest\Messaging\V1\DomainConfigMessagingServiceInstance + */ + public function buildInstance(array $payload): DomainConfigMessagingServiceInstance + { + return new DomainConfigMessagingServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainConfigMessagingServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigOptions.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigOptions.php new file mode 100755 index 0000000..ca3fbdd --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigOptions.php @@ -0,0 +1,114 @@ +options['fallbackUrl'] = $fallbackUrl; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['messagingServiceSidsAction'] = $messagingServiceSidsAction; + } + + /** + * Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + * + * @param string $fallbackUrl Any requests we receive to this domain that do not match an existing shortened message will be redirected to the fallback url. These will likely be either expired messages, random misdirected traffic, or intentional scraping. + * @return $this Fluent Builder + */ + public function setFallbackUrl(string $fallbackUrl): self + { + $this->options['fallbackUrl'] = $fallbackUrl; + return $this; + } + + /** + * URL to receive click events to your webhook whenever the recipients click on the shortened links + * + * @param string $callbackUrl URL to receive click events to your webhook whenever the recipients click on the shortened links + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * An action type for messaging_service_sids operation (ADD, DELETE, REPLACE) + * + * @param string $messagingServiceSidsAction An action type for messaging_service_sids operation (ADD, DELETE, REPLACE) + * @return $this Fluent Builder + */ + public function setMessagingServiceSidsAction(string $messagingServiceSidsAction): self + { + $this->options['messagingServiceSidsAction'] = $messagingServiceSidsAction; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.UpdateDomainConfigOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/DomainConfigPage.php b/app/api/Twilio/Rest/Messaging/V1/DomainConfigPage.php new file mode 100755 index 0000000..21c1d1c --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/DomainConfigPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DomainConfigInstance \Twilio\Rest\Messaging\V1\DomainConfigInstance + */ + public function buildInstance(array $payload): DomainConfigInstance + { + return new DomainConfigInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.DomainConfigPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignInstance.php b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignInstance.php new file mode 100755 index 0000000..4c173d7 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'campaignId' => Values::array_get($payload, 'campaign_id'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ExternalCampaignInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignList.php b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignList.php new file mode 100755 index 0000000..45101ab --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignList.php @@ -0,0 +1,80 @@ +solution = [ + ]; + + $this->uri = '/Services/PreregisteredUsa2p'; + } + + /** + * Create the ExternalCampaignInstance + * + * @param string $campaignId ID of the preregistered campaign. + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/messaging/services/api) that the resource is associated with. + * @return ExternalCampaignInstance Created ExternalCampaignInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $campaignId, string $messagingServiceSid): ExternalCampaignInstance + { + + $data = Values::of([ + 'CampaignId' => + $campaignId, + 'MessagingServiceSid' => + $messagingServiceSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ExternalCampaignInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ExternalCampaignList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignPage.php b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignPage.php new file mode 100755 index 0000000..3f692c6 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ExternalCampaignPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExternalCampaignInstance \Twilio\Rest\Messaging\V1\ExternalCampaignInstance + */ + public function buildInstance(array $payload): ExternalCampaignInstance + { + return new ExternalCampaignInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ExternalCampaignPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceContext.php b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceContext.php new file mode 100755 index 0000000..3bce3c0 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceContext.php @@ -0,0 +1,100 @@ +solution = [ + 'domainSid' => + $domainSid, + 'messagingServiceSid' => + $messagingServiceSid, + ]; + + $this->uri = '/LinkShortening/Domains/' . \rawurlencode($domainSid) + .'/MessagingServices/' . \rawurlencode($messagingServiceSid) + .''; + } + + /** + * Create the LinkshorteningMessagingServiceInstance + * + * @return LinkshorteningMessagingServiceInstance Created LinkshorteningMessagingServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): LinkshorteningMessagingServiceInstance + { + + $payload = $this->version->create('POST', $this->uri); + + return new LinkshorteningMessagingServiceInstance( + $this->version, + $payload, + $this->solution['domainSid'], + $this->solution['messagingServiceSid'] + ); + } + + + /** + * Delete the LinkshorteningMessagingServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.LinkshorteningMessagingServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceInstance.php b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceInstance.php new file mode 100755 index 0000000..562cb01 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceInstance.php @@ -0,0 +1,133 @@ +properties = [ + 'domainSid' => Values::array_get($payload, 'domain_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['domainSid' => $domainSid ?: $this->properties['domainSid'], 'messagingServiceSid' => $messagingServiceSid ?: $this->properties['messagingServiceSid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return LinkshorteningMessagingServiceContext Context for this LinkshorteningMessagingServiceInstance + */ + protected function proxy(): LinkshorteningMessagingServiceContext + { + if (!$this->context) { + $this->context = new LinkshorteningMessagingServiceContext( + $this->version, + $this->solution['domainSid'], + $this->solution['messagingServiceSid'] + ); + } + + return $this->context; + } + + /** + * Create the LinkshorteningMessagingServiceInstance + * + * @return LinkshorteningMessagingServiceInstance Created LinkshorteningMessagingServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): LinkshorteningMessagingServiceInstance + { + + return $this->proxy()->create(); + } + + /** + * Delete the LinkshorteningMessagingServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.LinkshorteningMessagingServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceList.php b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceList.php new file mode 100755 index 0000000..7197e41 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServiceList.php @@ -0,0 +1,69 @@ +solution = [ + ]; + } + + /** + * Constructs a LinkshorteningMessagingServiceContext + * + * @param string $domainSid The domain SID to associate with a messaging service. With URL shortening enabled, links in messages sent with the associated messaging service will be shortened to the provided domain + * + * @param string $messagingServiceSid A messaging service SID to associate with a domain. With URL shortening enabled, links in messages sent with the provided messaging service will be shortened to the associated domain + */ + public function getContext( + string $domainSid + , string $messagingServiceSid + + ): LinkshorteningMessagingServiceContext + { + return new LinkshorteningMessagingServiceContext( + $this->version, + $domainSid, + $messagingServiceSid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.LinkshorteningMessagingServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServicePage.php b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServicePage.php new file mode 100755 index 0000000..1ff415e --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/LinkshorteningMessagingServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LinkshorteningMessagingServiceInstance \Twilio\Rest\Messaging\V1\LinkshorteningMessagingServiceInstance + */ + public function buildInstance(array $payload): LinkshorteningMessagingServiceInstance + { + return new LinkshorteningMessagingServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.LinkshorteningMessagingServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderContext.php b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderContext.php new file mode 100755 index 0000000..479359c --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/AlphaSenders/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AlphaSenderInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AlphaSenderInstance + * + * @return AlphaSenderInstance Fetched AlphaSenderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AlphaSenderInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AlphaSenderInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.AlphaSenderContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderInstance.php b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderInstance.php new file mode 100755 index 0000000..0b62a4e --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'alphaSender' => Values::array_get($payload, 'alpha_sender'), + 'capabilities' => Values::array_get($payload, 'capabilities'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AlphaSenderContext Context for this AlphaSenderInstance + */ + protected function proxy(): AlphaSenderContext + { + if (!$this->context) { + $this->context = new AlphaSenderContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AlphaSenderInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AlphaSenderInstance + * + * @return AlphaSenderInstance Fetched AlphaSenderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AlphaSenderInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.AlphaSenderInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderList.php b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderList.php new file mode 100755 index 0000000..8d6ba2c --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/AlphaSenders'; + } + + /** + * Create the AlphaSenderInstance + * + * @param string $alphaSender The Alphanumeric Sender ID string. Can be up to 11 characters long. Valid characters are A-Z, a-z, 0-9, space, hyphen `-`, plus `+`, underscore `_` and ampersand `&`. This value cannot contain only numbers. + * @return AlphaSenderInstance Created AlphaSenderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $alphaSender): AlphaSenderInstance + { + + $data = Values::of([ + 'AlphaSender' => + $alphaSender, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AlphaSenderInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads AlphaSenderInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AlphaSenderInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AlphaSenderInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AlphaSenderInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AlphaSenderPage Page of AlphaSenderInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AlphaSenderPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AlphaSenderPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AlphaSenderInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AlphaSenderPage Page of AlphaSenderInstance + */ + public function getPage(string $targetUrl): AlphaSenderPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AlphaSenderPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AlphaSenderContext + * + * @param string $sid The SID of the AlphaSender resource to delete. + */ + public function getContext( + string $sid + + ): AlphaSenderContext + { + return new AlphaSenderContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.AlphaSenderList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderPage.php b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderPage.php new file mode 100755 index 0000000..aa5b53e --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/AlphaSenderPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AlphaSenderInstance \Twilio\Rest\Messaging\V1\Service\AlphaSenderInstance + */ + public function buildInstance(array $payload): AlphaSenderInstance + { + return new AlphaSenderInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.AlphaSenderPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberContext.php b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberContext.php new file mode 100755 index 0000000..5d69cf6 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/PhoneNumbers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberInstance.php b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberInstance.php new file mode 100755 index 0000000..f3c7245 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberInstance.php @@ -0,0 +1,146 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'countryCode' => Values::array_get($payload, 'country_code'), + 'capabilities' => Values::array_get($payload, 'capabilities'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberList.php b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberList.php new file mode 100755 index 0000000..0b592bc --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/PhoneNumbers'; + } + + /** + * Create the PhoneNumberInstance + * + * @param string $phoneNumberSid The SID of the Phone Number being added to the Service. + * @return PhoneNumberInstance Created PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumberSid): PhoneNumberInstance + { + + $data = Values::of([ + 'PhoneNumberSid' => + $phoneNumberSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads PhoneNumberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PhoneNumberInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PhoneNumberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PhoneNumberPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function getPage(string $targetUrl): PhoneNumberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PhoneNumberContext + * + * @param string $sid The SID of the PhoneNumber resource to delete. + */ + public function getContext( + string $sid + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberPage.php b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberPage.php new file mode 100755 index 0000000..7642291 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Messaging\V1\Service\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeContext.php b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeContext.php new file mode 100755 index 0000000..cbcbfaa --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/ShortCodes/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ShortCodeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.ShortCodeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeInstance.php b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeInstance.php new file mode 100755 index 0000000..65ba3b1 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeInstance.php @@ -0,0 +1,146 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'shortCode' => Values::array_get($payload, 'short_code'), + 'countryCode' => Values::array_get($payload, 'country_code'), + 'capabilities' => Values::array_get($payload, 'capabilities'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ShortCodeContext Context for this ShortCodeInstance + */ + protected function proxy(): ShortCodeContext + { + if (!$this->context) { + $this->context = new ShortCodeContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ShortCodeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.ShortCodeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeList.php b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeList.php new file mode 100755 index 0000000..7076a1f --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodeList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/ShortCodes'; + } + + /** + * Create the ShortCodeInstance + * + * @param string $shortCodeSid The SID of the ShortCode resource being added to the Service. + * @return ShortCodeInstance Created ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $shortCodeSid): ShortCodeInstance + { + + $data = Values::of([ + 'ShortCodeSid' => + $shortCodeSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ShortCodeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ShortCodeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ShortCodeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ShortCodePage Page of ShortCodeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ShortCodePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ShortCodePage Page of ShortCodeInstance + */ + public function getPage(string $targetUrl): ShortCodePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ShortCodeContext + * + * @param string $sid The SID of the ShortCode resource to delete. + */ + public function getContext( + string $sid + + ): ShortCodeContext + { + return new ShortCodeContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ShortCodeList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodePage.php b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodePage.php new file mode 100755 index 0000000..7fa3179 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/ShortCodePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ShortCodeInstance \Twilio\Rest\Messaging\V1\Service\ShortCodeInstance + */ + public function buildInstance(array $payload): ShortCodeInstance + { + return new ShortCodeInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ShortCodePage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonContext.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonContext.php new file mode 100755 index 0000000..4a256b6 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonContext.php @@ -0,0 +1,100 @@ +solution = [ + 'messagingServiceSid' => + $messagingServiceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($messagingServiceSid) + .'/Compliance/Usa2p/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the UsAppToPersonInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the UsAppToPersonInstance + * + * @return UsAppToPersonInstance Fetched UsAppToPersonInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UsAppToPersonInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UsAppToPersonInstance( + $this->version, + $payload, + $this->solution['messagingServiceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.UsAppToPersonContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonInstance.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonInstance.php new file mode 100755 index 0000000..244679b --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonInstance.php @@ -0,0 +1,176 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'brandRegistrationSid' => Values::array_get($payload, 'brand_registration_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'description' => Values::array_get($payload, 'description'), + 'messageSamples' => Values::array_get($payload, 'message_samples'), + 'usAppToPersonUsecase' => Values::array_get($payload, 'us_app_to_person_usecase'), + 'hasEmbeddedLinks' => Values::array_get($payload, 'has_embedded_links'), + 'hasEmbeddedPhone' => Values::array_get($payload, 'has_embedded_phone'), + 'campaignStatus' => Values::array_get($payload, 'campaign_status'), + 'campaignId' => Values::array_get($payload, 'campaign_id'), + 'isExternallyRegistered' => Values::array_get($payload, 'is_externally_registered'), + 'rateLimits' => Values::array_get($payload, 'rate_limits'), + 'messageFlow' => Values::array_get($payload, 'message_flow'), + 'optInMessage' => Values::array_get($payload, 'opt_in_message'), + 'optOutMessage' => Values::array_get($payload, 'opt_out_message'), + 'helpMessage' => Values::array_get($payload, 'help_message'), + 'optInKeywords' => Values::array_get($payload, 'opt_in_keywords'), + 'optOutKeywords' => Values::array_get($payload, 'opt_out_keywords'), + 'helpKeywords' => Values::array_get($payload, 'help_keywords'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'mock' => Values::array_get($payload, 'mock'), + ]; + + $this->solution = ['messagingServiceSid' => $messagingServiceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UsAppToPersonContext Context for this UsAppToPersonInstance + */ + protected function proxy(): UsAppToPersonContext + { + if (!$this->context) { + $this->context = new UsAppToPersonContext( + $this->version, + $this->solution['messagingServiceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the UsAppToPersonInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the UsAppToPersonInstance + * + * @return UsAppToPersonInstance Fetched UsAppToPersonInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UsAppToPersonInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.UsAppToPersonInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonList.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonList.php new file mode 100755 index 0000000..c3d6b61 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonList.php @@ -0,0 +1,229 @@ +solution = [ + 'messagingServiceSid' => + $messagingServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($messagingServiceSid) + .'/Compliance/Usa2p'; + } + + /** + * Create the UsAppToPersonInstance + * + * @param string $brandRegistrationSid A2P Brand Registration SID + * @param string $description A short description of what this SMS campaign does. Min length: 40 characters. Max length: 4096 characters. + * @param string $messageFlow Required for all Campaigns. Details around how a consumer opts-in to their campaign, therefore giving consent to receive their messages. If multiple opt-in methods can be used for the same campaign, they must all be listed. 40 character minimum. 2048 character maximum. + * @param string[] $messageSamples Message samples, at least 1 and up to 5 sample messages (at least 2 for sole proprietor), >=20 chars, <=1024 chars each. + * @param string $usAppToPersonUsecase A2P Campaign Use Case. Examples: [ 2FA, EMERGENCY, MARKETING..] + * @param bool $hasEmbeddedLinks Indicates that this SMS campaign will send messages that contain links. + * @param bool $hasEmbeddedPhone Indicates that this SMS campaign will send messages that contain phone numbers. + * @param array|Options $options Optional Arguments + * @return UsAppToPersonInstance Created UsAppToPersonInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $brandRegistrationSid, string $description, string $messageFlow, array $messageSamples, string $usAppToPersonUsecase, bool $hasEmbeddedLinks, bool $hasEmbeddedPhone, array $options = []): UsAppToPersonInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'BrandRegistrationSid' => + $brandRegistrationSid, + 'Description' => + $description, + 'MessageFlow' => + $messageFlow, + 'MessageSamples' => + Serialize::map($messageSamples,function ($e) { return $e; }), + 'UsAppToPersonUsecase' => + $usAppToPersonUsecase, + 'HasEmbeddedLinks' => + Serialize::booleanToString($hasEmbeddedLinks), + 'HasEmbeddedPhone' => + Serialize::booleanToString($hasEmbeddedPhone), + 'OptInMessage' => + $options['optInMessage'], + 'OptOutMessage' => + $options['optOutMessage'], + 'HelpMessage' => + $options['helpMessage'], + 'OptInKeywords' => + Serialize::map($options['optInKeywords'], function ($e) { return $e; }), + 'OptOutKeywords' => + Serialize::map($options['optOutKeywords'], function ($e) { return $e; }), + 'HelpKeywords' => + Serialize::map($options['helpKeywords'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new UsAppToPersonInstance( + $this->version, + $payload, + $this->solution['messagingServiceSid'] + ); + } + + + /** + * Reads UsAppToPersonInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UsAppToPersonInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams UsAppToPersonInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UsAppToPersonInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UsAppToPersonPage Page of UsAppToPersonInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UsAppToPersonPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UsAppToPersonPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UsAppToPersonInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UsAppToPersonPage Page of UsAppToPersonInstance + */ + public function getPage(string $targetUrl): UsAppToPersonPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UsAppToPersonPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a UsAppToPersonContext + * + * @param string $sid The SID of the US A2P Compliance resource to delete `QE2c6890da8086d771620e9b13fadeba0b`. + */ + public function getContext( + string $sid + + ): UsAppToPersonContext + { + return new UsAppToPersonContext( + $this->version, + $this->solution['messagingServiceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsAppToPersonList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonOptions.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonOptions.php new file mode 100755 index 0000000..9ac2155 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonOptions.php @@ -0,0 +1,172 @@ +options['optInMessage'] = $optInMessage; + $this->options['optOutMessage'] = $optOutMessage; + $this->options['helpMessage'] = $helpMessage; + $this->options['optInKeywords'] = $optInKeywords; + $this->options['optOutKeywords'] = $optOutKeywords; + $this->options['helpKeywords'] = $helpKeywords; + } + + /** + * If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out. This field is required if end users can text in a keyword to start receiving messages from this campaign. 20 character minimum. 320 character maximum. + * + * @param string $optInMessage If end users can text in a keyword to start receiving messages from this campaign, the auto-reply messages sent to the end users must be provided. The opt-in response should include the Brand name, confirmation of opt-in enrollment to a recurring message campaign, how to get help, and clear description of how to opt-out. This field is required if end users can text in a keyword to start receiving messages from this campaign. 20 character minimum. 320 character maximum. + * @return $this Fluent Builder + */ + public function setOptInMessage(string $optInMessage): self + { + $this->options['optInMessage'] = $optInMessage; + return $this; + } + + /** + * Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + * + * @param string $optOutMessage Upon receiving the opt-out keywords from the end users, Twilio customers are expected to send back an auto-generated response, which must provide acknowledgment of the opt-out request and confirmation that no further messages will be sent. It is also recommended that these opt-out messages include the brand name. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + * @return $this Fluent Builder + */ + public function setOptOutMessage(string $optOutMessage): self + { + $this->options['optOutMessage'] = $optOutMessage; + return $this; + } + + /** + * When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + * + * @param string $helpMessage When customers receive the help keywords from their end users, Twilio customers are expected to send back an auto-generated response; this may include the brand name and additional support contact information. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). 20 character minimum. 320 character maximum. + * @return $this Fluent Builder + */ + public function setHelpMessage(string $helpMessage): self + { + $this->options['helpMessage'] = $helpMessage; + return $this; + } + + /** + * If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided. This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. 255 character maximum. + * + * @param string[] $optInKeywords If end users can text in a keyword to start receiving messages from this campaign, those keywords must be provided. This field is required if end users can text in a keyword to start receiving messages from this campaign. Values must be alphanumeric. 255 character maximum. + * @return $this Fluent Builder + */ + public function setOptInKeywords(array $optInKeywords): self + { + $this->options['optInKeywords'] = $optInKeywords; + return $this; + } + + /** + * End users should be able to text in a keyword to stop receiving messages from this campaign. Those keywords must be provided. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + * + * @param string[] $optOutKeywords End users should be able to text in a keyword to stop receiving messages from this campaign. Those keywords must be provided. This field is required if managing opt out keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + * @return $this Fluent Builder + */ + public function setOptOutKeywords(array $optOutKeywords): self + { + $this->options['optOutKeywords'] = $optOutKeywords; + return $this; + } + + /** + * End users should be able to text in a keyword to receive help. Those keywords must be provided as part of the campaign registration request. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + * + * @param string[] $helpKeywords End users should be able to text in a keyword to receive help. Those keywords must be provided as part of the campaign registration request. This field is required if managing help keywords yourself (i.e. not using Twilio's Default or Advanced Opt Out features). Values must be alphanumeric. 255 character maximum. + * @return $this Fluent Builder + */ + public function setHelpKeywords(array $helpKeywords): self + { + $this->options['helpKeywords'] = $helpKeywords; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.CreateUsAppToPersonOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonPage.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonPage.php new file mode 100755 index 0000000..f7fcada --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsAppToPersonInstance \Twilio\Rest\Messaging\V1\Service\UsAppToPersonInstance + */ + public function buildInstance(array $payload): UsAppToPersonInstance + { + return new UsAppToPersonInstance($this->version, $payload, $this->solution['messagingServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsAppToPersonPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseInstance.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseInstance.php new file mode 100755 index 0000000..5ebcbfc --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseInstance.php @@ -0,0 +1,81 @@ +properties = [ + 'usAppToPersonUsecases' => Values::array_get($payload, 'us_app_to_person_usecases'), + ]; + + $this->solution = ['messagingServiceSid' => $messagingServiceSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsAppToPersonUsecaseInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseList.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseList.php new file mode 100755 index 0000000..0e83425 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseList.php @@ -0,0 +1,87 @@ +solution = [ + 'messagingServiceSid' => + $messagingServiceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($messagingServiceSid) + .'/Compliance/Usa2p/Usecases'; + } + + /** + * Fetch the UsAppToPersonUsecaseInstance + * + * @param array|Options $options Optional Arguments + * @return UsAppToPersonUsecaseInstance Fetched UsAppToPersonUsecaseInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): UsAppToPersonUsecaseInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'BrandRegistrationSid' => + $options['brandRegistrationSid'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new UsAppToPersonUsecaseInstance( + $this->version, + $payload, + $this->solution['messagingServiceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsAppToPersonUsecaseList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseOptions.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseOptions.php new file mode 100755 index 0000000..3d59b21 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecaseOptions.php @@ -0,0 +1,76 @@ +options['brandRegistrationSid'] = $brandRegistrationSid; + } + + /** + * The unique string to identify the A2P brand. + * + * @param string $brandRegistrationSid The unique string to identify the A2P brand. + * @return $this Fluent Builder + */ + public function setBrandRegistrationSid(string $brandRegistrationSid): self + { + $this->options['brandRegistrationSid'] = $brandRegistrationSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.FetchUsAppToPersonUsecaseOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecasePage.php b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecasePage.php new file mode 100755 index 0000000..3dff3d7 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/Service/UsAppToPersonUsecasePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsAppToPersonUsecaseInstance \Twilio\Rest\Messaging\V1\Service\UsAppToPersonUsecaseInstance + */ + public function buildInstance(array $payload): UsAppToPersonUsecaseInstance + { + return new UsAppToPersonUsecaseInstance($this->version, $payload, $this->solution['messagingServiceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsAppToPersonUsecasePage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/ServiceContext.php b/app/api/Twilio/Rest/Messaging/V1/ServiceContext.php new file mode 100755 index 0000000..0fe8a16 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ServiceContext.php @@ -0,0 +1,287 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'InboundRequestUrl' => + $options['inboundRequestUrl'], + 'InboundMethod' => + $options['inboundMethod'], + 'FallbackUrl' => + $options['fallbackUrl'], + 'FallbackMethod' => + $options['fallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StickySender' => + Serialize::booleanToString($options['stickySender']), + 'MmsConverter' => + Serialize::booleanToString($options['mmsConverter']), + 'SmartEncoding' => + Serialize::booleanToString($options['smartEncoding']), + 'ScanMessageContent' => + $options['scanMessageContent'], + 'FallbackToLongCode' => + Serialize::booleanToString($options['fallbackToLongCode']), + 'AreaCodeGeomatch' => + Serialize::booleanToString($options['areaCodeGeomatch']), + 'ValidityPeriod' => + $options['validityPeriod'], + 'SynchronousValidation' => + Serialize::booleanToString($options['synchronousValidation']), + 'Usecase' => + $options['usecase'], + 'UseInboundWebhookOnNumber' => + Serialize::booleanToString($options['useInboundWebhookOnNumber']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the alphaSenders + */ + protected function getAlphaSenders(): AlphaSenderList + { + if (!$this->_alphaSenders) { + $this->_alphaSenders = new AlphaSenderList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_alphaSenders; + } + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_phoneNumbers; + } + + /** + * Access the usAppToPersonUsecases + */ + protected function getUsAppToPersonUsecases(): UsAppToPersonUsecaseList + { + if (!$this->_usAppToPersonUsecases) { + $this->_usAppToPersonUsecases = new UsAppToPersonUsecaseList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_usAppToPersonUsecases; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + if (!$this->_shortCodes) { + $this->_shortCodes = new ShortCodeList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_shortCodes; + } + + /** + * Access the usAppToPerson + */ + protected function getUsAppToPerson(): UsAppToPersonList + { + if (!$this->_usAppToPerson) { + $this->_usAppToPerson = new UsAppToPersonList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_usAppToPerson; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/ServiceInstance.php b/app/api/Twilio/Rest/Messaging/V1/ServiceInstance.php new file mode 100755 index 0000000..79fcec3 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ServiceInstance.php @@ -0,0 +1,237 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'inboundRequestUrl' => Values::array_get($payload, 'inbound_request_url'), + 'inboundMethod' => Values::array_get($payload, 'inbound_method'), + 'fallbackUrl' => Values::array_get($payload, 'fallback_url'), + 'fallbackMethod' => Values::array_get($payload, 'fallback_method'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'stickySender' => Values::array_get($payload, 'sticky_sender'), + 'mmsConverter' => Values::array_get($payload, 'mms_converter'), + 'smartEncoding' => Values::array_get($payload, 'smart_encoding'), + 'scanMessageContent' => Values::array_get($payload, 'scan_message_content'), + 'fallbackToLongCode' => Values::array_get($payload, 'fallback_to_long_code'), + 'areaCodeGeomatch' => Values::array_get($payload, 'area_code_geomatch'), + 'synchronousValidation' => Values::array_get($payload, 'synchronous_validation'), + 'validityPeriod' => Values::array_get($payload, 'validity_period'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'usecase' => Values::array_get($payload, 'usecase'), + 'usAppToPersonRegistered' => Values::array_get($payload, 'us_app_to_person_registered'), + 'useInboundWebhookOnNumber' => Values::array_get($payload, 'use_inbound_webhook_on_number'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the alphaSenders + */ + protected function getAlphaSenders(): AlphaSenderList + { + return $this->proxy()->alphaSenders; + } + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + return $this->proxy()->phoneNumbers; + } + + /** + * Access the usAppToPersonUsecases + */ + protected function getUsAppToPersonUsecases(): UsAppToPersonUsecaseList + { + return $this->proxy()->usAppToPersonUsecases; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + return $this->proxy()->shortCodes; + } + + /** + * Access the usAppToPerson + */ + protected function getUsAppToPerson(): UsAppToPersonList + { + return $this->proxy()->usAppToPerson; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/ServiceList.php b/app/api/Twilio/Rest/Messaging/V1/ServiceList.php new file mode 100755 index 0000000..b7425d4 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ServiceList.php @@ -0,0 +1,221 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'InboundRequestUrl' => + $options['inboundRequestUrl'], + 'InboundMethod' => + $options['inboundMethod'], + 'FallbackUrl' => + $options['fallbackUrl'], + 'FallbackMethod' => + $options['fallbackMethod'], + 'StatusCallback' => + $options['statusCallback'], + 'StickySender' => + Serialize::booleanToString($options['stickySender']), + 'MmsConverter' => + Serialize::booleanToString($options['mmsConverter']), + 'SmartEncoding' => + Serialize::booleanToString($options['smartEncoding']), + 'ScanMessageContent' => + $options['scanMessageContent'], + 'FallbackToLongCode' => + Serialize::booleanToString($options['fallbackToLongCode']), + 'AreaCodeGeomatch' => + Serialize::booleanToString($options['areaCodeGeomatch']), + 'ValidityPeriod' => + $options['validityPeriod'], + 'SynchronousValidation' => + Serialize::booleanToString($options['synchronousValidation']), + 'Usecase' => + $options['usecase'], + 'UseInboundWebhookOnNumber' => + Serialize::booleanToString($options['useInboundWebhookOnNumber']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The SID of the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/ServiceOptions.php b/app/api/Twilio/Rest/Messaging/V1/ServiceOptions.php new file mode 100755 index 0000000..fb75d13 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ServiceOptions.php @@ -0,0 +1,652 @@ +options['inboundRequestUrl'] = $inboundRequestUrl; + $this->options['inboundMethod'] = $inboundMethod; + $this->options['fallbackUrl'] = $fallbackUrl; + $this->options['fallbackMethod'] = $fallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['stickySender'] = $stickySender; + $this->options['mmsConverter'] = $mmsConverter; + $this->options['smartEncoding'] = $smartEncoding; + $this->options['scanMessageContent'] = $scanMessageContent; + $this->options['fallbackToLongCode'] = $fallbackToLongCode; + $this->options['areaCodeGeomatch'] = $areaCodeGeomatch; + $this->options['validityPeriod'] = $validityPeriod; + $this->options['synchronousValidation'] = $synchronousValidation; + $this->options['usecase'] = $usecase; + $this->options['useInboundWebhookOnNumber'] = $useInboundWebhookOnNumber; + } + + /** + * The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + * + * @param string $inboundRequestUrl The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setInboundRequestUrl(string $inboundRequestUrl): self + { + $this->options['inboundRequestUrl'] = $inboundRequestUrl; + return $this; + } + + /** + * The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + * + * @param string $inboundMethod The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setInboundMethod(string $inboundMethod): self + { + $this->options['inboundMethod'] = $inboundMethod; + return $this; + } + + /** + * The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + * + * @param string $fallbackUrl The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setFallbackUrl(string $fallbackUrl): self + { + $this->options['fallbackUrl'] = $fallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + * + * @param string $fallbackMethod The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setFallbackMethod(string $fallbackMethod): self + { + $this->options['fallbackMethod'] = $fallbackMethod; + return $this; + } + + /** + * The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + * + * @param string $statusCallback The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * Whether to enable [Sticky Sender](https://www.twilio.com/docs/sms/services#sticky-sender) on the Service instance. + * + * @param bool $stickySender Whether to enable [Sticky Sender](https://www.twilio.com/docs/sms/services#sticky-sender) on the Service instance. + * @return $this Fluent Builder + */ + public function setStickySender(bool $stickySender): self + { + $this->options['stickySender'] = $stickySender; + return $this; + } + + /** + * Whether to enable the [MMS Converter](https://www.twilio.com/docs/sms/services#mms-converter) for messages sent through the Service instance. + * + * @param bool $mmsConverter Whether to enable the [MMS Converter](https://www.twilio.com/docs/sms/services#mms-converter) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setMmsConverter(bool $mmsConverter): self + { + $this->options['mmsConverter'] = $mmsConverter; + return $this; + } + + /** + * Whether to enable [Smart Encoding](https://www.twilio.com/docs/sms/services#smart-encoding) for messages sent through the Service instance. + * + * @param bool $smartEncoding Whether to enable [Smart Encoding](https://www.twilio.com/docs/sms/services#smart-encoding) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setSmartEncoding(bool $smartEncoding): self + { + $this->options['smartEncoding'] = $smartEncoding; + return $this; + } + + /** + * @param string $scanMessageContent + * @return $this Fluent Builder + */ + public function setScanMessageContent(string $scanMessageContent): self + { + $this->options['scanMessageContent'] = $scanMessageContent; + return $this; + } + + /** + * Whether to enable [Fallback to Long Code](https://www.twilio.com/docs/sms/services#fallback-to-long-code) for messages sent through the Service instance. + * + * @param bool $fallbackToLongCode Whether to enable [Fallback to Long Code](https://www.twilio.com/docs/sms/services#fallback-to-long-code) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setFallbackToLongCode(bool $fallbackToLongCode): self + { + $this->options['fallbackToLongCode'] = $fallbackToLongCode; + return $this; + } + + /** + * Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/sms/services#area-code-geomatch) on the Service Instance. + * + * @param bool $areaCodeGeomatch Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/sms/services#area-code-geomatch) on the Service Instance. + * @return $this Fluent Builder + */ + public function setAreaCodeGeomatch(bool $areaCodeGeomatch): self + { + $this->options['areaCodeGeomatch'] = $areaCodeGeomatch; + return $this; + } + + /** + * How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. + * + * @param int $validityPeriod How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. + * @return $this Fluent Builder + */ + public function setValidityPeriod(int $validityPeriod): self + { + $this->options['validityPeriod'] = $validityPeriod; + return $this; + } + + /** + * Reserved. + * + * @param bool $synchronousValidation Reserved. + * @return $this Fluent Builder + */ + public function setSynchronousValidation(bool $synchronousValidation): self + { + $this->options['synchronousValidation'] = $synchronousValidation; + return $this; + } + + /** + * A string that describes the scenario in which the Messaging Service will be used. Examples: [notification, marketing, verification, poll ..]. + * + * @param string $usecase A string that describes the scenario in which the Messaging Service will be used. Examples: [notification, marketing, verification, poll ..]. + * @return $this Fluent Builder + */ + public function setUsecase(string $usecase): self + { + $this->options['usecase'] = $usecase; + return $this; + } + + /** + * A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + * + * @param bool $useInboundWebhookOnNumber A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setUseInboundWebhookOnNumber(bool $useInboundWebhookOnNumber): self + { + $this->options['useInboundWebhookOnNumber'] = $useInboundWebhookOnNumber; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $inboundRequestUrl The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + * @param string $inboundMethod The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + * @param string $fallbackUrl The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + * @param string $fallbackMethod The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + * @param string $statusCallback The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + * @param bool $stickySender Whether to enable [Sticky Sender](https://www.twilio.com/docs/sms/services#sticky-sender) on the Service instance. + * @param bool $mmsConverter Whether to enable the [MMS Converter](https://www.twilio.com/docs/sms/services#mms-converter) for messages sent through the Service instance. + * @param bool $smartEncoding Whether to enable [Smart Encoding](https://www.twilio.com/docs/sms/services#smart-encoding) for messages sent through the Service instance. + * @param string $scanMessageContent + * @param bool $fallbackToLongCode Whether to enable [Fallback to Long Code](https://www.twilio.com/docs/sms/services#fallback-to-long-code) for messages sent through the Service instance. + * @param bool $areaCodeGeomatch Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/sms/services#area-code-geomatch) on the Service Instance. + * @param int $validityPeriod How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. + * @param bool $synchronousValidation Reserved. + * @param string $usecase A string that describes the scenario in which the Messaging Service will be used. Examples: [notification, marketing, verification, poll ..] + * @param bool $useInboundWebhookOnNumber A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $inboundRequestUrl = Values::NONE, + string $inboundMethod = Values::NONE, + string $fallbackUrl = Values::NONE, + string $fallbackMethod = Values::NONE, + string $statusCallback = Values::NONE, + bool $stickySender = Values::BOOL_NONE, + bool $mmsConverter = Values::BOOL_NONE, + bool $smartEncoding = Values::BOOL_NONE, + string $scanMessageContent = Values::NONE, + bool $fallbackToLongCode = Values::BOOL_NONE, + bool $areaCodeGeomatch = Values::BOOL_NONE, + int $validityPeriod = Values::INT_NONE, + bool $synchronousValidation = Values::BOOL_NONE, + string $usecase = Values::NONE, + bool $useInboundWebhookOnNumber = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['inboundRequestUrl'] = $inboundRequestUrl; + $this->options['inboundMethod'] = $inboundMethod; + $this->options['fallbackUrl'] = $fallbackUrl; + $this->options['fallbackMethod'] = $fallbackMethod; + $this->options['statusCallback'] = $statusCallback; + $this->options['stickySender'] = $stickySender; + $this->options['mmsConverter'] = $mmsConverter; + $this->options['smartEncoding'] = $smartEncoding; + $this->options['scanMessageContent'] = $scanMessageContent; + $this->options['fallbackToLongCode'] = $fallbackToLongCode; + $this->options['areaCodeGeomatch'] = $areaCodeGeomatch; + $this->options['validityPeriod'] = $validityPeriod; + $this->options['synchronousValidation'] = $synchronousValidation; + $this->options['usecase'] = $usecase; + $this->options['useInboundWebhookOnNumber'] = $useInboundWebhookOnNumber; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + * + * @param string $inboundRequestUrl The URL we call using `inbound_method` when a message is received by any phone number or short code in the Service. When this property is `null`, receiving inbound messages is disabled. All messages sent to the Twilio phone number or short code will not be logged and received on the Account. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `inbound_request_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setInboundRequestUrl(string $inboundRequestUrl): self + { + $this->options['inboundRequestUrl'] = $inboundRequestUrl; + return $this; + } + + /** + * The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + * + * @param string $inboundMethod The HTTP method we should use to call `inbound_request_url`. Can be `GET` or `POST` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setInboundMethod(string $inboundMethod): self + { + $this->options['inboundMethod'] = $inboundMethod; + return $this; + } + + /** + * The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + * + * @param string $fallbackUrl The URL that we call using `fallback_method` if an error occurs while retrieving or executing the TwiML from the Inbound Request URL. If the `use_inbound_webhook_on_number` field is enabled then the webhook url defined on the phone number will override the `fallback_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setFallbackUrl(string $fallbackUrl): self + { + $this->options['fallbackUrl'] = $fallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + * + * @param string $fallbackMethod The HTTP method we should use to call `fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setFallbackMethod(string $fallbackMethod): self + { + $this->options['fallbackMethod'] = $fallbackMethod; + return $this; + } + + /** + * The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + * + * @param string $statusCallback The URL we should call to [pass status updates](https://www.twilio.com/docs/sms/api/message-resource#message-status-values) about message delivery. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * Whether to enable [Sticky Sender](https://www.twilio.com/docs/sms/services#sticky-sender) on the Service instance. + * + * @param bool $stickySender Whether to enable [Sticky Sender](https://www.twilio.com/docs/sms/services#sticky-sender) on the Service instance. + * @return $this Fluent Builder + */ + public function setStickySender(bool $stickySender): self + { + $this->options['stickySender'] = $stickySender; + return $this; + } + + /** + * Whether to enable the [MMS Converter](https://www.twilio.com/docs/sms/services#mms-converter) for messages sent through the Service instance. + * + * @param bool $mmsConverter Whether to enable the [MMS Converter](https://www.twilio.com/docs/sms/services#mms-converter) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setMmsConverter(bool $mmsConverter): self + { + $this->options['mmsConverter'] = $mmsConverter; + return $this; + } + + /** + * Whether to enable [Smart Encoding](https://www.twilio.com/docs/sms/services#smart-encoding) for messages sent through the Service instance. + * + * @param bool $smartEncoding Whether to enable [Smart Encoding](https://www.twilio.com/docs/sms/services#smart-encoding) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setSmartEncoding(bool $smartEncoding): self + { + $this->options['smartEncoding'] = $smartEncoding; + return $this; + } + + /** + * @param string $scanMessageContent + * @return $this Fluent Builder + */ + public function setScanMessageContent(string $scanMessageContent): self + { + $this->options['scanMessageContent'] = $scanMessageContent; + return $this; + } + + /** + * Whether to enable [Fallback to Long Code](https://www.twilio.com/docs/sms/services#fallback-to-long-code) for messages sent through the Service instance. + * + * @param bool $fallbackToLongCode Whether to enable [Fallback to Long Code](https://www.twilio.com/docs/sms/services#fallback-to-long-code) for messages sent through the Service instance. + * @return $this Fluent Builder + */ + public function setFallbackToLongCode(bool $fallbackToLongCode): self + { + $this->options['fallbackToLongCode'] = $fallbackToLongCode; + return $this; + } + + /** + * Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/sms/services#area-code-geomatch) on the Service Instance. + * + * @param bool $areaCodeGeomatch Whether to enable [Area Code Geomatch](https://www.twilio.com/docs/sms/services#area-code-geomatch) on the Service Instance. + * @return $this Fluent Builder + */ + public function setAreaCodeGeomatch(bool $areaCodeGeomatch): self + { + $this->options['areaCodeGeomatch'] = $areaCodeGeomatch; + return $this; + } + + /** + * How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. + * + * @param int $validityPeriod How long, in seconds, messages sent from the Service are valid. Can be an integer from `1` to `14,400`. + * @return $this Fluent Builder + */ + public function setValidityPeriod(int $validityPeriod): self + { + $this->options['validityPeriod'] = $validityPeriod; + return $this; + } + + /** + * Reserved. + * + * @param bool $synchronousValidation Reserved. + * @return $this Fluent Builder + */ + public function setSynchronousValidation(bool $synchronousValidation): self + { + $this->options['synchronousValidation'] = $synchronousValidation; + return $this; + } + + /** + * A string that describes the scenario in which the Messaging Service will be used. Examples: [notification, marketing, verification, poll ..] + * + * @param string $usecase A string that describes the scenario in which the Messaging Service will be used. Examples: [notification, marketing, verification, poll ..] + * @return $this Fluent Builder + */ + public function setUsecase(string $usecase): self + { + $this->options['usecase'] = $usecase; + return $this; + } + + /** + * A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + * + * @param bool $useInboundWebhookOnNumber A boolean value that indicates either the webhook url configured on the phone number will be used or `inbound_request_url`/`fallback_url` url will be called when a message is received from the phone number. If this field is enabled then the webhook url defined on the phone number will override the `inbound_request_url`/`fallback_url` defined for the Messaging Service. + * @return $this Fluent Builder + */ + public function setUseInboundWebhookOnNumber(bool $useInboundWebhookOnNumber): self + { + $this->options['useInboundWebhookOnNumber'] = $useInboundWebhookOnNumber; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/ServicePage.php b/app/api/Twilio/Rest/Messaging/V1/ServicePage.php new file mode 100755 index 0000000..d888989 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Messaging\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationContext.php b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationContext.php new file mode 100755 index 0000000..ab8a107 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationContext.php @@ -0,0 +1,149 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Tollfree/Verifications/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the TollfreeVerificationInstance + * + * @return TollfreeVerificationInstance Fetched TollfreeVerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TollfreeVerificationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TollfreeVerificationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the TollfreeVerificationInstance + * + * @param array|Options $options Optional Arguments + * @return TollfreeVerificationInstance Updated TollfreeVerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TollfreeVerificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'BusinessName' => + $options['businessName'], + 'BusinessWebsite' => + $options['businessWebsite'], + 'NotificationEmail' => + $options['notificationEmail'], + 'UseCaseCategories' => + Serialize::map($options['useCaseCategories'], function ($e) { return $e; }), + 'UseCaseSummary' => + $options['useCaseSummary'], + 'ProductionMessageSample' => + $options['productionMessageSample'], + 'OptInImageUrls' => + Serialize::map($options['optInImageUrls'], function ($e) { return $e; }), + 'OptInType' => + $options['optInType'], + 'MessageVolume' => + $options['messageVolume'], + 'BusinessStreetAddress' => + $options['businessStreetAddress'], + 'BusinessStreetAddress2' => + $options['businessStreetAddress2'], + 'BusinessCity' => + $options['businessCity'], + 'BusinessStateProvinceRegion' => + $options['businessStateProvinceRegion'], + 'BusinessPostalCode' => + $options['businessPostalCode'], + 'BusinessCountry' => + $options['businessCountry'], + 'AdditionalInformation' => + $options['additionalInformation'], + 'BusinessContactFirstName' => + $options['businessContactFirstName'], + 'BusinessContactLastName' => + $options['businessContactLastName'], + 'BusinessContactEmail' => + $options['businessContactEmail'], + 'BusinessContactPhone' => + $options['businessContactPhone'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TollfreeVerificationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.TollfreeVerificationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationInstance.php b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationInstance.php new file mode 100755 index 0000000..1763c03 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationInstance.php @@ -0,0 +1,192 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'customerProfileSid' => Values::array_get($payload, 'customer_profile_sid'), + 'trustProductSid' => Values::array_get($payload, 'trust_product_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'regulatedItemSid' => Values::array_get($payload, 'regulated_item_sid'), + 'businessName' => Values::array_get($payload, 'business_name'), + 'businessStreetAddress' => Values::array_get($payload, 'business_street_address'), + 'businessStreetAddress2' => Values::array_get($payload, 'business_street_address2'), + 'businessCity' => Values::array_get($payload, 'business_city'), + 'businessStateProvinceRegion' => Values::array_get($payload, 'business_state_province_region'), + 'businessPostalCode' => Values::array_get($payload, 'business_postal_code'), + 'businessCountry' => Values::array_get($payload, 'business_country'), + 'businessWebsite' => Values::array_get($payload, 'business_website'), + 'businessContactFirstName' => Values::array_get($payload, 'business_contact_first_name'), + 'businessContactLastName' => Values::array_get($payload, 'business_contact_last_name'), + 'businessContactEmail' => Values::array_get($payload, 'business_contact_email'), + 'businessContactPhone' => Values::array_get($payload, 'business_contact_phone'), + 'notificationEmail' => Values::array_get($payload, 'notification_email'), + 'useCaseCategories' => Values::array_get($payload, 'use_case_categories'), + 'useCaseSummary' => Values::array_get($payload, 'use_case_summary'), + 'productionMessageSample' => Values::array_get($payload, 'production_message_sample'), + 'optInImageUrls' => Values::array_get($payload, 'opt_in_image_urls'), + 'optInType' => Values::array_get($payload, 'opt_in_type'), + 'messageVolume' => Values::array_get($payload, 'message_volume'), + 'additionalInformation' => Values::array_get($payload, 'additional_information'), + 'tollfreePhoneNumberSid' => Values::array_get($payload, 'tollfree_phone_number_sid'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'resourceLinks' => Values::array_get($payload, 'resource_links'), + 'externalReferenceId' => Values::array_get($payload, 'external_reference_id'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TollfreeVerificationContext Context for this TollfreeVerificationInstance + */ + protected function proxy(): TollfreeVerificationContext + { + if (!$this->context) { + $this->context = new TollfreeVerificationContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TollfreeVerificationInstance + * + * @return TollfreeVerificationInstance Fetched TollfreeVerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TollfreeVerificationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TollfreeVerificationInstance + * + * @param array|Options $options Optional Arguments + * @return TollfreeVerificationInstance Updated TollfreeVerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TollfreeVerificationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Messaging.V1.TollfreeVerificationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationList.php b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationList.php new file mode 100755 index 0000000..971327f --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationList.php @@ -0,0 +1,252 @@ +solution = [ + ]; + + $this->uri = '/Tollfree/Verifications'; + } + + /** + * Create the TollfreeVerificationInstance + * + * @param string $businessName The name of the business or organization using the Tollfree number. + * @param string $businessWebsite The website of the business or organization using the Tollfree number. + * @param string $notificationEmail The email address to receive the notification about the verification result. . + * @param string[] $useCaseCategories The category of the use case for the Tollfree Number. List as many are applicable.. + * @param string $useCaseSummary Use this to further explain how messaging is used by the business or organization. + * @param string $productionMessageSample An example of message content, i.e. a sample message. + * @param string[] $optInImageUrls Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + * @param string $optInType + * @param string $messageVolume Estimate monthly volume of messages from the Tollfree Number. + * @param string $tollfreePhoneNumberSid The SID of the Phone Number associated with the Tollfree Verification. + * @param array|Options $options Optional Arguments + * @return TollfreeVerificationInstance Created TollfreeVerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $businessName, string $businessWebsite, string $notificationEmail, array $useCaseCategories, string $useCaseSummary, string $productionMessageSample, array $optInImageUrls, string $optInType, string $messageVolume, string $tollfreePhoneNumberSid, array $options = []): TollfreeVerificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'BusinessName' => + $businessName, + 'BusinessWebsite' => + $businessWebsite, + 'NotificationEmail' => + $notificationEmail, + 'UseCaseCategories' => + Serialize::map($useCaseCategories,function ($e) { return $e; }), + 'UseCaseSummary' => + $useCaseSummary, + 'ProductionMessageSample' => + $productionMessageSample, + 'OptInImageUrls' => + Serialize::map($optInImageUrls,function ($e) { return $e; }), + 'OptInType' => + $optInType, + 'MessageVolume' => + $messageVolume, + 'TollfreePhoneNumberSid' => + $tollfreePhoneNumberSid, + 'CustomerProfileSid' => + $options['customerProfileSid'], + 'BusinessStreetAddress' => + $options['businessStreetAddress'], + 'BusinessStreetAddress2' => + $options['businessStreetAddress2'], + 'BusinessCity' => + $options['businessCity'], + 'BusinessStateProvinceRegion' => + $options['businessStateProvinceRegion'], + 'BusinessPostalCode' => + $options['businessPostalCode'], + 'BusinessCountry' => + $options['businessCountry'], + 'AdditionalInformation' => + $options['additionalInformation'], + 'BusinessContactFirstName' => + $options['businessContactFirstName'], + 'BusinessContactLastName' => + $options['businessContactLastName'], + 'BusinessContactEmail' => + $options['businessContactEmail'], + 'BusinessContactPhone' => + $options['businessContactPhone'], + 'ExternalReferenceId' => + $options['externalReferenceId'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TollfreeVerificationInstance( + $this->version, + $payload + ); + } + + + /** + * Reads TollfreeVerificationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TollfreeVerificationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TollfreeVerificationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TollfreeVerificationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TollfreeVerificationPage Page of TollfreeVerificationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TollfreeVerificationPage + { + $options = new Values($options); + + $params = Values::of([ + 'TollfreePhoneNumberSid' => + $options['tollfreePhoneNumberSid'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TollfreeVerificationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TollfreeVerificationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TollfreeVerificationPage Page of TollfreeVerificationInstance + */ + public function getPage(string $targetUrl): TollfreeVerificationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TollfreeVerificationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TollfreeVerificationContext + * + * @param string $sid The unique string to identify Tollfree Verification. + */ + public function getContext( + string $sid + + ): TollfreeVerificationContext + { + return new TollfreeVerificationContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.TollfreeVerificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationOptions.php b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationOptions.php new file mode 100755 index 0000000..53e2279 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationOptions.php @@ -0,0 +1,756 @@ +options['customerProfileSid'] = $customerProfileSid; + $this->options['businessStreetAddress'] = $businessStreetAddress; + $this->options['businessStreetAddress2'] = $businessStreetAddress2; + $this->options['businessCity'] = $businessCity; + $this->options['businessStateProvinceRegion'] = $businessStateProvinceRegion; + $this->options['businessPostalCode'] = $businessPostalCode; + $this->options['businessCountry'] = $businessCountry; + $this->options['additionalInformation'] = $additionalInformation; + $this->options['businessContactFirstName'] = $businessContactFirstName; + $this->options['businessContactLastName'] = $businessContactLastName; + $this->options['businessContactEmail'] = $businessContactEmail; + $this->options['businessContactPhone'] = $businessContactPhone; + $this->options['externalReferenceId'] = $externalReferenceId; + } + + /** + * Customer's Profile Bundle BundleSid. + * + * @param string $customerProfileSid Customer's Profile Bundle BundleSid. + * @return $this Fluent Builder + */ + public function setCustomerProfileSid(string $customerProfileSid): self + { + $this->options['customerProfileSid'] = $customerProfileSid; + return $this; + } + + /** + * The address of the business or organization using the Tollfree number. + * + * @param string $businessStreetAddress The address of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStreetAddress(string $businessStreetAddress): self + { + $this->options['businessStreetAddress'] = $businessStreetAddress; + return $this; + } + + /** + * The address of the business or organization using the Tollfree number. + * + * @param string $businessStreetAddress2 The address of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStreetAddress2(string $businessStreetAddress2): self + { + $this->options['businessStreetAddress2'] = $businessStreetAddress2; + return $this; + } + + /** + * The city of the business or organization using the Tollfree number. + * + * @param string $businessCity The city of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessCity(string $businessCity): self + { + $this->options['businessCity'] = $businessCity; + return $this; + } + + /** + * The state/province/region of the business or organization using the Tollfree number. + * + * @param string $businessStateProvinceRegion The state/province/region of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStateProvinceRegion(string $businessStateProvinceRegion): self + { + $this->options['businessStateProvinceRegion'] = $businessStateProvinceRegion; + return $this; + } + + /** + * The postal code of the business or organization using the Tollfree number. + * + * @param string $businessPostalCode The postal code of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessPostalCode(string $businessPostalCode): self + { + $this->options['businessPostalCode'] = $businessPostalCode; + return $this; + } + + /** + * The country of the business or organization using the Tollfree number. + * + * @param string $businessCountry The country of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessCountry(string $businessCountry): self + { + $this->options['businessCountry'] = $businessCountry; + return $this; + } + + /** + * Additional information to be provided for verification. + * + * @param string $additionalInformation Additional information to be provided for verification. + * @return $this Fluent Builder + */ + public function setAdditionalInformation(string $additionalInformation): self + { + $this->options['additionalInformation'] = $additionalInformation; + return $this; + } + + /** + * The first name of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactFirstName The first name of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactFirstName(string $businessContactFirstName): self + { + $this->options['businessContactFirstName'] = $businessContactFirstName; + return $this; + } + + /** + * The last name of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactLastName The last name of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactLastName(string $businessContactLastName): self + { + $this->options['businessContactLastName'] = $businessContactLastName; + return $this; + } + + /** + * The email address of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactEmail The email address of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactEmail(string $businessContactEmail): self + { + $this->options['businessContactEmail'] = $businessContactEmail; + return $this; + } + + /** + * The phone number of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactPhone The phone number of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactPhone(string $businessContactPhone): self + { + $this->options['businessContactPhone'] = $businessContactPhone; + return $this; + } + + /** + * An optional external reference ID supplied by customer and echoed back on status retrieval. + * + * @param string $externalReferenceId An optional external reference ID supplied by customer and echoed back on status retrieval. + * @return $this Fluent Builder + */ + public function setExternalReferenceId(string $externalReferenceId): self + { + $this->options['externalReferenceId'] = $externalReferenceId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.CreateTollfreeVerificationOptions ' . $options . ']'; + } +} + + +class ReadTollfreeVerificationOptions extends Options + { + /** + * @param string $tollfreePhoneNumberSid The SID of the Phone Number associated with the Tollfree Verification. + * @param string $status The compliance status of the Tollfree Verification record. + */ + public function __construct( + + string $tollfreePhoneNumberSid = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['tollfreePhoneNumberSid'] = $tollfreePhoneNumberSid; + $this->options['status'] = $status; + } + + /** + * The SID of the Phone Number associated with the Tollfree Verification. + * + * @param string $tollfreePhoneNumberSid The SID of the Phone Number associated with the Tollfree Verification. + * @return $this Fluent Builder + */ + public function setTollfreePhoneNumberSid(string $tollfreePhoneNumberSid): self + { + $this->options['tollfreePhoneNumberSid'] = $tollfreePhoneNumberSid; + return $this; + } + + /** + * The compliance status of the Tollfree Verification record. + * + * @param string $status The compliance status of the Tollfree Verification record. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.ReadTollfreeVerificationOptions ' . $options . ']'; + } +} + +class UpdateTollfreeVerificationOptions extends Options + { + /** + * @param string $businessName The name of the business or organization using the Tollfree number. + * @param string $businessWebsite The website of the business or organization using the Tollfree number. + * @param string $notificationEmail The email address to receive the notification about the verification result. . + * @param string[] $useCaseCategories The category of the use case for the Tollfree Number. List as many are applicable.. + * @param string $useCaseSummary Use this to further explain how messaging is used by the business or organization. + * @param string $productionMessageSample An example of message content, i.e. a sample message. + * @param string[] $optInImageUrls Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + * @param string $optInType + * @param string $messageVolume Estimate monthly volume of messages from the Tollfree Number. + * @param string $businessStreetAddress The address of the business or organization using the Tollfree number. + * @param string $businessStreetAddress2 The address of the business or organization using the Tollfree number. + * @param string $businessCity The city of the business or organization using the Tollfree number. + * @param string $businessStateProvinceRegion The state/province/region of the business or organization using the Tollfree number. + * @param string $businessPostalCode The postal code of the business or organization using the Tollfree number. + * @param string $businessCountry The country of the business or organization using the Tollfree number. + * @param string $additionalInformation Additional information to be provided for verification. + * @param string $businessContactFirstName The first name of the contact for the business or organization using the Tollfree number. + * @param string $businessContactLastName The last name of the contact for the business or organization using the Tollfree number. + * @param string $businessContactEmail The email address of the contact for the business or organization using the Tollfree number. + * @param string $businessContactPhone The phone number of the contact for the business or organization using the Tollfree number. + */ + public function __construct( + + string $businessName = Values::NONE, + string $businessWebsite = Values::NONE, + string $notificationEmail = Values::NONE, + array $useCaseCategories = Values::ARRAY_NONE, + string $useCaseSummary = Values::NONE, + string $productionMessageSample = Values::NONE, + array $optInImageUrls = Values::ARRAY_NONE, + string $optInType = Values::NONE, + string $messageVolume = Values::NONE, + string $businessStreetAddress = Values::NONE, + string $businessStreetAddress2 = Values::NONE, + string $businessCity = Values::NONE, + string $businessStateProvinceRegion = Values::NONE, + string $businessPostalCode = Values::NONE, + string $businessCountry = Values::NONE, + string $additionalInformation = Values::NONE, + string $businessContactFirstName = Values::NONE, + string $businessContactLastName = Values::NONE, + string $businessContactEmail = Values::NONE, + string $businessContactPhone = Values::NONE + + ) { + $this->options['businessName'] = $businessName; + $this->options['businessWebsite'] = $businessWebsite; + $this->options['notificationEmail'] = $notificationEmail; + $this->options['useCaseCategories'] = $useCaseCategories; + $this->options['useCaseSummary'] = $useCaseSummary; + $this->options['productionMessageSample'] = $productionMessageSample; + $this->options['optInImageUrls'] = $optInImageUrls; + $this->options['optInType'] = $optInType; + $this->options['messageVolume'] = $messageVolume; + $this->options['businessStreetAddress'] = $businessStreetAddress; + $this->options['businessStreetAddress2'] = $businessStreetAddress2; + $this->options['businessCity'] = $businessCity; + $this->options['businessStateProvinceRegion'] = $businessStateProvinceRegion; + $this->options['businessPostalCode'] = $businessPostalCode; + $this->options['businessCountry'] = $businessCountry; + $this->options['additionalInformation'] = $additionalInformation; + $this->options['businessContactFirstName'] = $businessContactFirstName; + $this->options['businessContactLastName'] = $businessContactLastName; + $this->options['businessContactEmail'] = $businessContactEmail; + $this->options['businessContactPhone'] = $businessContactPhone; + } + + /** + * The name of the business or organization using the Tollfree number. + * + * @param string $businessName The name of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessName(string $businessName): self + { + $this->options['businessName'] = $businessName; + return $this; + } + + /** + * The website of the business or organization using the Tollfree number. + * + * @param string $businessWebsite The website of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessWebsite(string $businessWebsite): self + { + $this->options['businessWebsite'] = $businessWebsite; + return $this; + } + + /** + * The email address to receive the notification about the verification result. . + * + * @param string $notificationEmail The email address to receive the notification about the verification result. . + * @return $this Fluent Builder + */ + public function setNotificationEmail(string $notificationEmail): self + { + $this->options['notificationEmail'] = $notificationEmail; + return $this; + } + + /** + * The category of the use case for the Tollfree Number. List as many are applicable.. + * + * @param string[] $useCaseCategories The category of the use case for the Tollfree Number. List as many are applicable.. + * @return $this Fluent Builder + */ + public function setUseCaseCategories(array $useCaseCategories): self + { + $this->options['useCaseCategories'] = $useCaseCategories; + return $this; + } + + /** + * Use this to further explain how messaging is used by the business or organization. + * + * @param string $useCaseSummary Use this to further explain how messaging is used by the business or organization. + * @return $this Fluent Builder + */ + public function setUseCaseSummary(string $useCaseSummary): self + { + $this->options['useCaseSummary'] = $useCaseSummary; + return $this; + } + + /** + * An example of message content, i.e. a sample message. + * + * @param string $productionMessageSample An example of message content, i.e. a sample message. + * @return $this Fluent Builder + */ + public function setProductionMessageSample(string $productionMessageSample): self + { + $this->options['productionMessageSample'] = $productionMessageSample; + return $this; + } + + /** + * Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + * + * @param string[] $optInImageUrls Link to an image that shows the opt-in workflow. Multiple images allowed and must be a publicly hosted URL. + * @return $this Fluent Builder + */ + public function setOptInImageUrls(array $optInImageUrls): self + { + $this->options['optInImageUrls'] = $optInImageUrls; + return $this; + } + + /** + * @param string $optInType + * @return $this Fluent Builder + */ + public function setOptInType(string $optInType): self + { + $this->options['optInType'] = $optInType; + return $this; + } + + /** + * Estimate monthly volume of messages from the Tollfree Number. + * + * @param string $messageVolume Estimate monthly volume of messages from the Tollfree Number. + * @return $this Fluent Builder + */ + public function setMessageVolume(string $messageVolume): self + { + $this->options['messageVolume'] = $messageVolume; + return $this; + } + + /** + * The address of the business or organization using the Tollfree number. + * + * @param string $businessStreetAddress The address of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStreetAddress(string $businessStreetAddress): self + { + $this->options['businessStreetAddress'] = $businessStreetAddress; + return $this; + } + + /** + * The address of the business or organization using the Tollfree number. + * + * @param string $businessStreetAddress2 The address of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStreetAddress2(string $businessStreetAddress2): self + { + $this->options['businessStreetAddress2'] = $businessStreetAddress2; + return $this; + } + + /** + * The city of the business or organization using the Tollfree number. + * + * @param string $businessCity The city of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessCity(string $businessCity): self + { + $this->options['businessCity'] = $businessCity; + return $this; + } + + /** + * The state/province/region of the business or organization using the Tollfree number. + * + * @param string $businessStateProvinceRegion The state/province/region of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessStateProvinceRegion(string $businessStateProvinceRegion): self + { + $this->options['businessStateProvinceRegion'] = $businessStateProvinceRegion; + return $this; + } + + /** + * The postal code of the business or organization using the Tollfree number. + * + * @param string $businessPostalCode The postal code of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessPostalCode(string $businessPostalCode): self + { + $this->options['businessPostalCode'] = $businessPostalCode; + return $this; + } + + /** + * The country of the business or organization using the Tollfree number. + * + * @param string $businessCountry The country of the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessCountry(string $businessCountry): self + { + $this->options['businessCountry'] = $businessCountry; + return $this; + } + + /** + * Additional information to be provided for verification. + * + * @param string $additionalInformation Additional information to be provided for verification. + * @return $this Fluent Builder + */ + public function setAdditionalInformation(string $additionalInformation): self + { + $this->options['additionalInformation'] = $additionalInformation; + return $this; + } + + /** + * The first name of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactFirstName The first name of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactFirstName(string $businessContactFirstName): self + { + $this->options['businessContactFirstName'] = $businessContactFirstName; + return $this; + } + + /** + * The last name of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactLastName The last name of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactLastName(string $businessContactLastName): self + { + $this->options['businessContactLastName'] = $businessContactLastName; + return $this; + } + + /** + * The email address of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactEmail The email address of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactEmail(string $businessContactEmail): self + { + $this->options['businessContactEmail'] = $businessContactEmail; + return $this; + } + + /** + * The phone number of the contact for the business or organization using the Tollfree number. + * + * @param string $businessContactPhone The phone number of the contact for the business or organization using the Tollfree number. + * @return $this Fluent Builder + */ + public function setBusinessContactPhone(string $businessContactPhone): self + { + $this->options['businessContactPhone'] = $businessContactPhone; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Messaging.V1.UpdateTollfreeVerificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationPage.php b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationPage.php new file mode 100755 index 0000000..19636ce --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/TollfreeVerificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TollfreeVerificationInstance \Twilio\Rest\Messaging\V1\TollfreeVerificationInstance + */ + public function buildInstance(array $payload): TollfreeVerificationInstance + { + return new TollfreeVerificationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.TollfreeVerificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/UsecaseInstance.php b/app/api/Twilio/Rest/Messaging/V1/UsecaseInstance.php new file mode 100755 index 0000000..6043e61 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/UsecaseInstance.php @@ -0,0 +1,80 @@ +properties = [ + 'usecases' => Values::array_get($payload, 'usecases'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsecaseInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Messaging/V1/UsecaseList.php b/app/api/Twilio/Rest/Messaging/V1/UsecaseList.php new file mode 100755 index 0000000..61dc995 --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/UsecaseList.php @@ -0,0 +1,70 @@ +solution = [ + ]; + + $this->uri = '/Services/Usecases'; + } + + /** + * Fetch the UsecaseInstance + * + * @return UsecaseInstance Fetched UsecaseInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UsecaseInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UsecaseInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsecaseList]'; + } +} diff --git a/app/api/Twilio/Rest/Messaging/V1/UsecasePage.php b/app/api/Twilio/Rest/Messaging/V1/UsecasePage.php new file mode 100755 index 0000000..a1a893d --- /dev/null +++ b/app/api/Twilio/Rest/Messaging/V1/UsecasePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsecaseInstance \Twilio\Rest\Messaging\V1\UsecaseInstance + */ + public function buildInstance(array $payload): UsecaseInstance + { + return new UsecaseInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Messaging.V1.UsecasePage]'; + } +} diff --git a/app/api/Twilio/Rest/MessagingBase.php b/app/api/Twilio/Rest/MessagingBase.php new file mode 100755 index 0000000..b8318ec --- /dev/null +++ b/app/api/Twilio/Rest/MessagingBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://messaging.twilio.com'; + } + + + /** + * @return V1 Version v1 of messaging + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Messaging]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor.php b/app/api/Twilio/Rest/Microvisor.php new file mode 100755 index 0000000..6d5e56e --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor.php @@ -0,0 +1,42 @@ +apps instead. + */ + protected function getApps(): \Twilio\Rest\Microvisor\V1\AppList { + echo "apps is deprecated. Use v1->apps instead."; + return $this->v1->apps; + } + + /** + * @deprecated Use v1->apps(\$sid) instead. + * @param string $sid A string that uniquely identifies this App. + */ + protected function contextApps(string $sid): \Twilio\Rest\Microvisor\V1\AppContext { + echo "apps(\$sid) is deprecated. Use v1->apps(\$sid) instead."; + return $this->v1->apps($sid); + } + + /** + * @deprecated Use v1->devices instead. + */ + protected function getDevices(): \Twilio\Rest\Microvisor\V1\DeviceList { + echo "devices is deprecated. Use v1->devices instead."; + return $this->v1->devices; + } + + /** + * @deprecated Use v1->devices(\$sid) instead. + * @param string $sid A string that uniquely identifies this Device. + */ + protected function contextDevices(string $sid): \Twilio\Rest\Microvisor\V1\DeviceContext { + echo "devices(\$sid) is deprecated. Use v1->devices(\$sid) instead."; + return $this->v1->devices($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Microvisor/V1.php b/app/api/Twilio/Rest/Microvisor/V1.php new file mode 100755 index 0000000..2de63bb --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1.php @@ -0,0 +1,131 @@ +version = 'v1'; + } + + protected function getAccountConfigs(): AccountConfigList + { + if (!$this->_accountConfigs) { + $this->_accountConfigs = new AccountConfigList($this); + } + return $this->_accountConfigs; + } + + protected function getAccountSecrets(): AccountSecretList + { + if (!$this->_accountSecrets) { + $this->_accountSecrets = new AccountSecretList($this); + } + return $this->_accountSecrets; + } + + protected function getApps(): AppList + { + if (!$this->_apps) { + $this->_apps = new AppList($this); + } + return $this->_apps; + } + + protected function getDevices(): DeviceList + { + if (!$this->_devices) { + $this->_devices = new DeviceList($this); + } + return $this->_devices; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountConfigContext.php b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigContext.php new file mode 100755 index 0000000..92cd96f --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigContext.php @@ -0,0 +1,120 @@ +solution = [ + 'key' => + $key, + ]; + + $this->uri = '/Configs/' . \rawurlencode($key) + .''; + } + + /** + * Delete the AccountConfigInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AccountConfigInstance + * + * @return AccountConfigInstance Fetched AccountConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountConfigInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AccountConfigInstance( + $this->version, + $payload, + $this->solution['key'] + ); + } + + + /** + * Update the AccountConfigInstance + * + * @param string $value The config value; up to 4096 characters. + * @return AccountConfigInstance Updated AccountConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): AccountConfigInstance + { + + $data = Values::of([ + 'Value' => + $value, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AccountConfigInstance( + $this->version, + $payload, + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AccountConfigContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountConfigInstance.php b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigInstance.php new file mode 100755 index 0000000..bd58b93 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigInstance.php @@ -0,0 +1,147 @@ +properties = [ + 'key' => Values::array_get($payload, 'key'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'value' => Values::array_get($payload, 'value'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AccountConfigContext Context for this AccountConfigInstance + */ + protected function proxy(): AccountConfigContext + { + if (!$this->context) { + $this->context = new AccountConfigContext( + $this->version, + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the AccountConfigInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AccountConfigInstance + * + * @return AccountConfigInstance Fetched AccountConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountConfigInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AccountConfigInstance + * + * @param string $value The config value; up to 4096 characters. + * @return AccountConfigInstance Updated AccountConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): AccountConfigInstance + { + + return $this->proxy()->update($value); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AccountConfigInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountConfigList.php b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigList.php new file mode 100755 index 0000000..1a81b85 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/Configs'; + } + + /** + * Create the AccountConfigInstance + * + * @param string $key The config key; up to 100 characters. + * @param string $value The config value; up to 4096 characters. + * @return AccountConfigInstance Created AccountConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, string $value): AccountConfigInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Value' => + $value, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AccountConfigInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AccountConfigInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AccountConfigInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AccountConfigInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AccountConfigInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AccountConfigPage Page of AccountConfigInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AccountConfigPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AccountConfigPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AccountConfigInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AccountConfigPage Page of AccountConfigInstance + */ + public function getPage(string $targetUrl): AccountConfigPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AccountConfigPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AccountConfigContext + * + * @param string $key The config key; up to 100 characters. + */ + public function getContext( + string $key + + ): AccountConfigContext + { + return new AccountConfigContext( + $this->version, + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AccountConfigList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountConfigPage.php b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigPage.php new file mode 100755 index 0000000..d01e97d --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountConfigPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AccountConfigInstance \Twilio\Rest\Microvisor\V1\AccountConfigInstance + */ + public function buildInstance(array $payload): AccountConfigInstance + { + return new AccountConfigInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AccountConfigPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountSecretContext.php b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretContext.php new file mode 100755 index 0000000..b7c5d74 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretContext.php @@ -0,0 +1,120 @@ +solution = [ + 'key' => + $key, + ]; + + $this->uri = '/Secrets/' . \rawurlencode($key) + .''; + } + + /** + * Delete the AccountSecretInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AccountSecretInstance + * + * @return AccountSecretInstance Fetched AccountSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountSecretInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AccountSecretInstance( + $this->version, + $payload, + $this->solution['key'] + ); + } + + + /** + * Update the AccountSecretInstance + * + * @param string $value The secret value; up to 4096 characters. + * @return AccountSecretInstance Updated AccountSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): AccountSecretInstance + { + + $data = Values::of([ + 'Value' => + $value, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AccountSecretInstance( + $this->version, + $payload, + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AccountSecretContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountSecretInstance.php b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretInstance.php new file mode 100755 index 0000000..34621e9 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretInstance.php @@ -0,0 +1,145 @@ +properties = [ + 'key' => Values::array_get($payload, 'key'), + 'dateRotated' => Deserialize::dateTime(Values::array_get($payload, 'date_rotated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AccountSecretContext Context for this AccountSecretInstance + */ + protected function proxy(): AccountSecretContext + { + if (!$this->context) { + $this->context = new AccountSecretContext( + $this->version, + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the AccountSecretInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AccountSecretInstance + * + * @return AccountSecretInstance Fetched AccountSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccountSecretInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AccountSecretInstance + * + * @param string $value The secret value; up to 4096 characters. + * @return AccountSecretInstance Updated AccountSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): AccountSecretInstance + { + + return $this->proxy()->update($value); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AccountSecretInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountSecretList.php b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretList.php new file mode 100755 index 0000000..60361f6 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/Secrets'; + } + + /** + * Create the AccountSecretInstance + * + * @param string $key The secret key; up to 100 characters. + * @param string $value The secret value; up to 4096 characters. + * @return AccountSecretInstance Created AccountSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, string $value): AccountSecretInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Value' => + $value, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AccountSecretInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AccountSecretInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AccountSecretInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AccountSecretInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AccountSecretInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AccountSecretPage Page of AccountSecretInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AccountSecretPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AccountSecretPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AccountSecretInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AccountSecretPage Page of AccountSecretInstance + */ + public function getPage(string $targetUrl): AccountSecretPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AccountSecretPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AccountSecretContext + * + * @param string $key The secret key; up to 100 characters. + */ + public function getContext( + string $key + + ): AccountSecretContext + { + return new AccountSecretContext( + $this->version, + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AccountSecretList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AccountSecretPage.php b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretPage.php new file mode 100755 index 0000000..9ee7c0d --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AccountSecretPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AccountSecretInstance \Twilio\Rest\Microvisor\V1\AccountSecretInstance + */ + public function buildInstance(array $payload): AccountSecretInstance + { + return new AccountSecretInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AccountSecretPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestContext.php b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestContext.php new file mode 100755 index 0000000..a527c5e --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestContext.php @@ -0,0 +1,81 @@ +solution = [ + 'appSid' => + $appSid, + ]; + + $this->uri = '/Apps/' . \rawurlencode($appSid) + .'/Manifest'; + } + + /** + * Fetch the AppManifestInstance + * + * @return AppManifestInstance Fetched AppManifestInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AppManifestInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AppManifestInstance( + $this->version, + $payload, + $this->solution['appSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AppManifestContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestInstance.php b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestInstance.php new file mode 100755 index 0000000..b0c82a9 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestInstance.php @@ -0,0 +1,121 @@ +properties = [ + 'appSid' => Values::array_get($payload, 'app_sid'), + 'hash' => Values::array_get($payload, 'hash'), + 'encodedBytes' => Values::array_get($payload, 'encoded_bytes'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['appSid' => $appSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AppManifestContext Context for this AppManifestInstance + */ + protected function proxy(): AppManifestContext + { + if (!$this->context) { + $this->context = new AppManifestContext( + $this->version, + $this->solution['appSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AppManifestInstance + * + * @return AppManifestInstance Fetched AppManifestInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AppManifestInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AppManifestInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestList.php b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestList.php new file mode 100755 index 0000000..aac719c --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestList.php @@ -0,0 +1,67 @@ +solution = [ + 'appSid' => + $appSid, + + ]; + } + + /** + * Constructs a AppManifestContext + */ + public function getContext( + + ): AppManifestContext + { + return new AppManifestContext( + $this->version, + $this->solution['appSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AppManifestList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestPage.php b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestPage.php new file mode 100755 index 0000000..6cde952 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/App/AppManifestPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AppManifestInstance \Twilio\Rest\Microvisor\V1\App\AppManifestInstance + */ + public function buildInstance(array $payload): AppManifestInstance + { + return new AppManifestInstance($this->version, $payload, $this->solution['appSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AppManifestPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AppContext.php b/app/api/Twilio/Rest/Microvisor/V1/AppContext.php new file mode 100755 index 0000000..6b19438 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AppContext.php @@ -0,0 +1,152 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Apps/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AppInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AppInstance + * + * @return AppInstance Fetched AppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AppInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AppInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the appManifests + */ + protected function getAppManifests(): AppManifestList + { + if (!$this->_appManifests) { + $this->_appManifests = new AppManifestList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_appManifests; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AppContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AppInstance.php b/app/api/Twilio/Rest/Microvisor/V1/AppInstance.php new file mode 100755 index 0000000..97c1b1a --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AppInstance.php @@ -0,0 +1,153 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'hash' => Values::array_get($payload, 'hash'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AppContext Context for this AppInstance + */ + protected function proxy(): AppContext + { + if (!$this->context) { + $this->context = new AppContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AppInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AppInstance + * + * @return AppInstance Fetched AppInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AppInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the appManifests + */ + protected function getAppManifests(): AppManifestList + { + return $this->proxy()->appManifests; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.AppInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/AppList.php b/app/api/Twilio/Rest/Microvisor/V1/AppList.php new file mode 100755 index 0000000..1952ae0 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AppList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Apps'; + } + + /** + * Reads AppInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AppInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AppInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AppInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AppPage Page of AppInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AppPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AppPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AppInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AppPage Page of AppInstance + */ + public function getPage(string $targetUrl): AppPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AppPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AppContext + * + * @param string $sid A 34-character string that uniquely identifies this App. + */ + public function getContext( + string $sid + + ): AppContext + { + return new AppContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AppList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/AppPage.php b/app/api/Twilio/Rest/Microvisor/V1/AppPage.php new file mode 100755 index 0000000..269864f --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/AppPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AppInstance \Twilio\Rest\Microvisor\V1\AppInstance + */ + public function buildInstance(array $payload): AppInstance + { + return new AppInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.AppPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigContext.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigContext.php new file mode 100755 index 0000000..e6be918 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigContext.php @@ -0,0 +1,127 @@ +solution = [ + 'deviceSid' => + $deviceSid, + 'key' => + $key, + ]; + + $this->uri = '/Devices/' . \rawurlencode($deviceSid) + .'/Configs/' . \rawurlencode($key) + .''; + } + + /** + * Delete the DeviceConfigInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DeviceConfigInstance + * + * @return DeviceConfigInstance Fetched DeviceConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceConfigInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeviceConfigInstance( + $this->version, + $payload, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + + /** + * Update the DeviceConfigInstance + * + * @param string $value The config value; up to 4096 characters. + * @return DeviceConfigInstance Updated DeviceConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): DeviceConfigInstance + { + + $data = Values::of([ + 'Value' => + $value, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DeviceConfigInstance( + $this->version, + $payload, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceConfigContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigInstance.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigInstance.php new file mode 100755 index 0000000..34dc439 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigInstance.php @@ -0,0 +1,151 @@ +properties = [ + 'deviceSid' => Values::array_get($payload, 'device_sid'), + 'key' => Values::array_get($payload, 'key'), + 'value' => Values::array_get($payload, 'value'), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['deviceSid' => $deviceSid, 'key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeviceConfigContext Context for this DeviceConfigInstance + */ + protected function proxy(): DeviceConfigContext + { + if (!$this->context) { + $this->context = new DeviceConfigContext( + $this->version, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the DeviceConfigInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DeviceConfigInstance + * + * @return DeviceConfigInstance Fetched DeviceConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceConfigInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DeviceConfigInstance + * + * @param string $value The config value; up to 4096 characters. + * @return DeviceConfigInstance Updated DeviceConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): DeviceConfigInstance + { + + return $this->proxy()->update($value); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceConfigInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigList.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigList.php new file mode 100755 index 0000000..71e6716 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigList.php @@ -0,0 +1,197 @@ +solution = [ + 'deviceSid' => + $deviceSid, + + ]; + + $this->uri = '/Devices/' . \rawurlencode($deviceSid) + .'/Configs'; + } + + /** + * Create the DeviceConfigInstance + * + * @param string $key The config key; up to 100 characters. + * @param string $value The config value; up to 4096 characters. + * @return DeviceConfigInstance Created DeviceConfigInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, string $value): DeviceConfigInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Value' => + $value, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeviceConfigInstance( + $this->version, + $payload, + $this->solution['deviceSid'] + ); + } + + + /** + * Reads DeviceConfigInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeviceConfigInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeviceConfigInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeviceConfigInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeviceConfigPage Page of DeviceConfigInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeviceConfigPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeviceConfigPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeviceConfigInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeviceConfigPage Page of DeviceConfigInstance + */ + public function getPage(string $targetUrl): DeviceConfigPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeviceConfigPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeviceConfigContext + * + * @param string $key The config key; up to 100 characters. + */ + public function getContext( + string $key + + ): DeviceConfigContext + { + return new DeviceConfigContext( + $this->version, + $this->solution['deviceSid'], + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DeviceConfigList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigPage.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigPage.php new file mode 100755 index 0000000..07a0273 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceConfigPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeviceConfigInstance \Twilio\Rest\Microvisor\V1\Device\DeviceConfigInstance + */ + public function buildInstance(array $payload): DeviceConfigInstance + { + return new DeviceConfigInstance($this->version, $payload, $this->solution['deviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DeviceConfigPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretContext.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretContext.php new file mode 100755 index 0000000..2f6be31 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretContext.php @@ -0,0 +1,127 @@ +solution = [ + 'deviceSid' => + $deviceSid, + 'key' => + $key, + ]; + + $this->uri = '/Devices/' . \rawurlencode($deviceSid) + .'/Secrets/' . \rawurlencode($key) + .''; + } + + /** + * Delete the DeviceSecretInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DeviceSecretInstance + * + * @return DeviceSecretInstance Fetched DeviceSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceSecretInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeviceSecretInstance( + $this->version, + $payload, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + + /** + * Update the DeviceSecretInstance + * + * @param string $value The secret value; up to 4096 characters. + * @return DeviceSecretInstance Updated DeviceSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): DeviceSecretInstance + { + + $data = Values::of([ + 'Value' => + $value, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DeviceSecretInstance( + $this->version, + $payload, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceSecretContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretInstance.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretInstance.php new file mode 100755 index 0000000..eb22836 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretInstance.php @@ -0,0 +1,149 @@ +properties = [ + 'deviceSid' => Values::array_get($payload, 'device_sid'), + 'key' => Values::array_get($payload, 'key'), + 'dateRotated' => Deserialize::dateTime(Values::array_get($payload, 'date_rotated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['deviceSid' => $deviceSid, 'key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeviceSecretContext Context for this DeviceSecretInstance + */ + protected function proxy(): DeviceSecretContext + { + if (!$this->context) { + $this->context = new DeviceSecretContext( + $this->version, + $this->solution['deviceSid'], + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the DeviceSecretInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DeviceSecretInstance + * + * @return DeviceSecretInstance Fetched DeviceSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceSecretInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DeviceSecretInstance + * + * @param string $value The secret value; up to 4096 characters. + * @return DeviceSecretInstance Updated DeviceSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $value): DeviceSecretInstance + { + + return $this->proxy()->update($value); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceSecretInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretList.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretList.php new file mode 100755 index 0000000..784e85e --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretList.php @@ -0,0 +1,197 @@ +solution = [ + 'deviceSid' => + $deviceSid, + + ]; + + $this->uri = '/Devices/' . \rawurlencode($deviceSid) + .'/Secrets'; + } + + /** + * Create the DeviceSecretInstance + * + * @param string $key The secret key; up to 100 characters. + * @param string $value The secret value; up to 4096 characters. + * @return DeviceSecretInstance Created DeviceSecretInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, string $value): DeviceSecretInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Value' => + $value, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeviceSecretInstance( + $this->version, + $payload, + $this->solution['deviceSid'] + ); + } + + + /** + * Reads DeviceSecretInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeviceSecretInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeviceSecretInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeviceSecretInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeviceSecretPage Page of DeviceSecretInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeviceSecretPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeviceSecretPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeviceSecretInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeviceSecretPage Page of DeviceSecretInstance + */ + public function getPage(string $targetUrl): DeviceSecretPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeviceSecretPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeviceSecretContext + * + * @param string $key The secret key; up to 100 characters. + */ + public function getContext( + string $key + + ): DeviceSecretContext + { + return new DeviceSecretContext( + $this->version, + $this->solution['deviceSid'], + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DeviceSecretList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretPage.php b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretPage.php new file mode 100755 index 0000000..f840fd7 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/Device/DeviceSecretPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeviceSecretInstance \Twilio\Rest\Microvisor\V1\Device\DeviceSecretInstance + */ + public function buildInstance(array $payload): DeviceSecretInstance + { + return new DeviceSecretInstance($this->version, $payload, $this->solution['deviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DeviceSecretPage]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/DeviceContext.php b/app/api/Twilio/Rest/Microvisor/V1/DeviceContext.php new file mode 100755 index 0000000..d594021 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/DeviceContext.php @@ -0,0 +1,192 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Devices/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DeviceInstance + * + * @return DeviceInstance Fetched DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeviceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the DeviceInstance + * + * @param array|Options $options Optional Arguments + * @return DeviceInstance Updated DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeviceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'TargetApp' => + $options['targetApp'], + 'LoggingEnabled' => + Serialize::booleanToString($options['loggingEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DeviceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the deviceConfigs + */ + protected function getDeviceConfigs(): DeviceConfigList + { + if (!$this->_deviceConfigs) { + $this->_deviceConfigs = new DeviceConfigList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_deviceConfigs; + } + + /** + * Access the deviceSecrets + */ + protected function getDeviceSecrets(): DeviceSecretList + { + if (!$this->_deviceSecrets) { + $this->_deviceSecrets = new DeviceSecretList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_deviceSecrets; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/DeviceInstance.php b/app/api/Twilio/Rest/Microvisor/V1/DeviceInstance.php new file mode 100755 index 0000000..71fad0b --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/DeviceInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'app' => Values::array_get($payload, 'app'), + 'logging' => Values::array_get($payload, 'logging'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeviceContext Context for this DeviceInstance + */ + protected function proxy(): DeviceContext + { + if (!$this->context) { + $this->context = new DeviceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DeviceInstance + * + * @return DeviceInstance Fetched DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DeviceInstance + * + * @param array|Options $options Optional Arguments + * @return DeviceInstance Updated DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeviceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the deviceConfigs + */ + protected function getDeviceConfigs(): DeviceConfigList + { + return $this->proxy()->deviceConfigs; + } + + /** + * Access the deviceSecrets + */ + protected function getDeviceSecrets(): DeviceSecretList + { + return $this->proxy()->deviceSecrets; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Microvisor.V1.DeviceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/DeviceList.php b/app/api/Twilio/Rest/Microvisor/V1/DeviceList.php new file mode 100755 index 0000000..5ab4067 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/DeviceList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Devices'; + } + + /** + * Reads DeviceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeviceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeviceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeviceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DevicePage Page of DeviceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DevicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DevicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeviceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DevicePage Page of DeviceInstance + */ + public function getPage(string $targetUrl): DevicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DevicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeviceContext + * + * @param string $sid A 34-character string that uniquely identifies this Device. + */ + public function getContext( + string $sid + + ): DeviceContext + { + return new DeviceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DeviceList]'; + } +} diff --git a/app/api/Twilio/Rest/Microvisor/V1/DeviceOptions.php b/app/api/Twilio/Rest/Microvisor/V1/DeviceOptions.php new file mode 100755 index 0000000..03010f8 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/DeviceOptions.php @@ -0,0 +1,116 @@ +options['uniqueName'] = $uniqueName; + $this->options['targetApp'] = $targetApp; + $this->options['loggingEnabled'] = $loggingEnabled; + } + + /** + * A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + * + * @param string $uniqueName A unique and addressable name to be assigned to this Device by the developer. It may be used in place of the Device SID. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The SID or unique name of the App to be targeted to the Device. + * + * @param string $targetApp The SID or unique name of the App to be targeted to the Device. + * @return $this Fluent Builder + */ + public function setTargetApp(string $targetApp): self + { + $this->options['targetApp'] = $targetApp; + return $this; + } + + /** + * A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + * + * @param bool $loggingEnabled A Boolean flag specifying whether to enable application logging. Logs will be enabled or extended for 24 hours. + * @return $this Fluent Builder + */ + public function setLoggingEnabled(bool $loggingEnabled): self + { + $this->options['loggingEnabled'] = $loggingEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Microvisor.V1.UpdateDeviceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Microvisor/V1/DevicePage.php b/app/api/Twilio/Rest/Microvisor/V1/DevicePage.php new file mode 100755 index 0000000..0c12eb5 --- /dev/null +++ b/app/api/Twilio/Rest/Microvisor/V1/DevicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeviceInstance \Twilio\Rest\Microvisor\V1\DeviceInstance + */ + public function buildInstance(array $payload): DeviceInstance + { + return new DeviceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Microvisor.V1.DevicePage]'; + } +} diff --git a/app/api/Twilio/Rest/MicrovisorBase.php b/app/api/Twilio/Rest/MicrovisorBase.php new file mode 100755 index 0000000..e998f18 --- /dev/null +++ b/app/api/Twilio/Rest/MicrovisorBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://microvisor.twilio.com'; + } + + + /** + * @return V1 Version v1 of microvisor + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Microvisor]'; + } +} diff --git a/app/api/Twilio/Rest/Monitor.php b/app/api/Twilio/Rest/Monitor.php new file mode 100755 index 0000000..f9631d6 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor.php @@ -0,0 +1,41 @@ +alerts instead. + */ + protected function getAlerts(): \Twilio\Rest\Monitor\V1\AlertList { + echo "alerts is deprecated. Use v1->alerts instead."; + return $this->v1->alerts; + } + + /** + * @deprecated Use v1->alerts(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextAlerts(string $sid): \Twilio\Rest\Monitor\V1\AlertContext { + echo "alerts(\$sid) is deprecated. Use v1->alerts(\$sid) instead."; + return $this->v1->alerts($sid); + } + + /** + * @deprecated Use v1->events instead. + */ + protected function getEvents(): \Twilio\Rest\Monitor\V1\EventList { + echo "events is deprecated. Use v1->events instead."; + return $this->v1->events; + } + + /** + * @deprecated Use v1->events(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextEvents(string $sid): \Twilio\Rest\Monitor\V1\EventContext { + echo "events(\$sid) is deprecated. Use v1->events(\$sid) instead."; + return $this->v1->events($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Monitor/V1.php b/app/api/Twilio/Rest/Monitor/V1.php new file mode 100755 index 0000000..68a13a5 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1.php @@ -0,0 +1,107 @@ +version = 'v1'; + } + + protected function getAlerts(): AlertList + { + if (!$this->_alerts) { + $this->_alerts = new AlertList($this); + } + return $this->_alerts; + } + + protected function getEvents(): EventList + { + if (!$this->_events) { + $this->_events = new EventList($this); + } + return $this->_events; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Monitor.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/AlertContext.php b/app/api/Twilio/Rest/Monitor/V1/AlertContext.php new file mode 100755 index 0000000..ab0c6ec --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/AlertContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Alerts/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AlertInstance + * + * @return AlertInstance Fetched AlertInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AlertInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AlertInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Monitor.V1.AlertContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/AlertInstance.php b/app/api/Twilio/Rest/Monitor/V1/AlertInstance.php new file mode 100755 index 0000000..455b321 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/AlertInstance.php @@ -0,0 +1,152 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'alertText' => Values::array_get($payload, 'alert_text'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateGenerated' => Deserialize::dateTime(Values::array_get($payload, 'date_generated')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'logLevel' => Values::array_get($payload, 'log_level'), + 'moreInfo' => Values::array_get($payload, 'more_info'), + 'requestMethod' => Values::array_get($payload, 'request_method'), + 'requestUrl' => Values::array_get($payload, 'request_url'), + 'requestVariables' => Values::array_get($payload, 'request_variables'), + 'resourceSid' => Values::array_get($payload, 'resource_sid'), + 'responseBody' => Values::array_get($payload, 'response_body'), + 'responseHeaders' => Values::array_get($payload, 'response_headers'), + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'requestHeaders' => Values::array_get($payload, 'request_headers'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AlertContext Context for this AlertInstance + */ + protected function proxy(): AlertContext + { + if (!$this->context) { + $this->context = new AlertContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AlertInstance + * + * @return AlertInstance Fetched AlertInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AlertInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Monitor.V1.AlertInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Monitor/V1/AlertList.php b/app/api/Twilio/Rest/Monitor/V1/AlertList.php new file mode 100755 index 0000000..1b67bed --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/AlertList.php @@ -0,0 +1,173 @@ +solution = [ + ]; + + $this->uri = '/Alerts'; + } + + /** + * Reads AlertInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AlertInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AlertInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AlertInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AlertPage Page of AlertInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AlertPage + { + $options = new Values($options); + + $params = Values::of([ + 'LogLevel' => + $options['logLevel'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AlertPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AlertInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AlertPage Page of AlertInstance + */ + public function getPage(string $targetUrl): AlertPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AlertPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AlertContext + * + * @param string $sid The SID of the Alert resource to fetch. + */ + public function getContext( + string $sid + + ): AlertContext + { + return new AlertContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Monitor.V1.AlertList]'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/AlertOptions.php b/app/api/Twilio/Rest/Monitor/V1/AlertOptions.php new file mode 100755 index 0000000..ac48e87 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/AlertOptions.php @@ -0,0 +1,114 @@ +options['logLevel'] = $logLevel; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + } + + /** + * Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + * + * @param string $logLevel Only show alerts for this log-level. Can be: `error`, `warning`, `notice`, or `debug`. + * @return $this Fluent Builder + */ + public function setLogLevel(string $logLevel): self + { + $this->options['logLevel'] = $logLevel; + return $this; + } + + /** + * Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + * + * @param \DateTime $startDate Only include alerts that occurred on or after this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + * + * @param \DateTime $endDate Only include alerts that occurred on or before this date and time. Specify the date and time in GMT and format as `YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ssZ`. Queries for alerts older than 30 days are not supported. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Monitor.V1.ReadAlertOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Monitor/V1/AlertPage.php b/app/api/Twilio/Rest/Monitor/V1/AlertPage.php new file mode 100755 index 0000000..c89356c --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/AlertPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AlertInstance \Twilio\Rest\Monitor\V1\AlertInstance + */ + public function buildInstance(array $payload): AlertInstance + { + return new AlertInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Monitor.V1.AlertPage]'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/EventContext.php b/app/api/Twilio/Rest/Monitor/V1/EventContext.php new file mode 100755 index 0000000..d4b1d6b --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/EventContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Events/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EventInstance + * + * @return EventInstance Fetched EventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EventInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Monitor.V1.EventContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/EventInstance.php b/app/api/Twilio/Rest/Monitor/V1/EventInstance.php new file mode 100755 index 0000000..36ca6d0 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/EventInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'actorSid' => Values::array_get($payload, 'actor_sid'), + 'actorType' => Values::array_get($payload, 'actor_type'), + 'description' => Values::array_get($payload, 'description'), + 'eventData' => Values::array_get($payload, 'event_data'), + 'eventDate' => Deserialize::dateTime(Values::array_get($payload, 'event_date')), + 'eventType' => Values::array_get($payload, 'event_type'), + 'resourceSid' => Values::array_get($payload, 'resource_sid'), + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'sid' => Values::array_get($payload, 'sid'), + 'source' => Values::array_get($payload, 'source'), + 'sourceIpAddress' => Values::array_get($payload, 'source_ip_address'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EventContext Context for this EventInstance + */ + protected function proxy(): EventContext + { + if (!$this->context) { + $this->context = new EventContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EventInstance + * + * @return EventInstance Fetched EventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Monitor.V1.EventInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Monitor/V1/EventList.php b/app/api/Twilio/Rest/Monitor/V1/EventList.php new file mode 100755 index 0000000..872d107 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/EventList.php @@ -0,0 +1,179 @@ +solution = [ + ]; + + $this->uri = '/Events'; + } + + /** + * Reads EventInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EventInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams EventInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EventInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EventPage Page of EventInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EventPage + { + $options = new Values($options); + + $params = Values::of([ + 'ActorSid' => + $options['actorSid'], + 'EventType' => + $options['eventType'], + 'ResourceSid' => + $options['resourceSid'], + 'SourceIpAddress' => + $options['sourceIpAddress'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EventPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EventInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EventPage Page of EventInstance + */ + public function getPage(string $targetUrl): EventPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EventPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EventContext + * + * @param string $sid The SID of the Event resource to fetch. + */ + public function getContext( + string $sid + + ): EventContext + { + return new EventContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Monitor.V1.EventList]'; + } +} diff --git a/app/api/Twilio/Rest/Monitor/V1/EventOptions.php b/app/api/Twilio/Rest/Monitor/V1/EventOptions.php new file mode 100755 index 0000000..bf89c00 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/EventOptions.php @@ -0,0 +1,168 @@ +options['actorSid'] = $actorSid; + $this->options['eventType'] = $eventType; + $this->options['resourceSid'] = $resourceSid; + $this->options['sourceIpAddress'] = $sourceIpAddress; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + } + + /** + * Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + * + * @param string $actorSid Only include events initiated by this Actor. Useful for auditing actions taken by specific users or API credentials. + * @return $this Fluent Builder + */ + public function setActorSid(string $actorSid): self + { + $this->options['actorSid'] = $actorSid; + return $this; + } + + /** + * Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + * + * @param string $eventType Only include events of this [Event Type](https://www.twilio.com/docs/usage/monitor-events#event-types). + * @return $this Fluent Builder + */ + public function setEventType(string $eventType): self + { + $this->options['eventType'] = $eventType; + return $this; + } + + /** + * Only include events that refer to this resource. Useful for discovering the history of a specific resource. + * + * @param string $resourceSid Only include events that refer to this resource. Useful for discovering the history of a specific resource. + * @return $this Fluent Builder + */ + public function setResourceSid(string $resourceSid): self + { + $this->options['resourceSid'] = $resourceSid; + return $this; + } + + /** + * Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + * + * @param string $sourceIpAddress Only include events that originated from this IP address. Useful for tracking suspicious activity originating from the API or the Twilio Console. + * @return $this Fluent Builder + */ + public function setSourceIpAddress(string $sourceIpAddress): self + { + $this->options['sourceIpAddress'] = $sourceIpAddress; + return $this; + } + + /** + * Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only include events that occurred on or after this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $endDate Only include events that occurred on or before this date. Specify the date in GMT and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Monitor.V1.ReadEventOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Monitor/V1/EventPage.php b/app/api/Twilio/Rest/Monitor/V1/EventPage.php new file mode 100755 index 0000000..ff4c717 --- /dev/null +++ b/app/api/Twilio/Rest/Monitor/V1/EventPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EventInstance \Twilio\Rest\Monitor\V1\EventInstance + */ + public function buildInstance(array $payload): EventInstance + { + return new EventInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Monitor.V1.EventPage]'; + } +} diff --git a/app/api/Twilio/Rest/MonitorBase.php b/app/api/Twilio/Rest/MonitorBase.php new file mode 100755 index 0000000..4f9f9a9 --- /dev/null +++ b/app/api/Twilio/Rest/MonitorBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://monitor.twilio.com'; + } + + + /** + * @return V1 Version v1 of monitor + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Monitor]'; + } +} diff --git a/app/api/Twilio/Rest/Notify.php b/app/api/Twilio/Rest/Notify.php new file mode 100755 index 0000000..e109165 --- /dev/null +++ b/app/api/Twilio/Rest/Notify.php @@ -0,0 +1,41 @@ +credentials instead. + */ + protected function getCredentials(): \Twilio\Rest\Notify\V1\CredentialList { + echo "credentials is deprecated. Use v1->credentials instead."; + return $this->v1->credentials; + } + + /** + * @deprecated Use v1->credentials(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextCredentials(string $sid): \Twilio\Rest\Notify\V1\CredentialContext { + echo "credentials(\$sid) is deprecated. Use v1->credentials(\$sid) instead."; + return $this->v1->credentials($sid); + } + + /** + * @deprecated Use v1->services instead. + */ + protected function getServices(): \Twilio\Rest\Notify\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextServices(string $sid): \Twilio\Rest\Notify\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Notify/V1.php b/app/api/Twilio/Rest/Notify/V1.php new file mode 100755 index 0000000..051e8f2 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1.php @@ -0,0 +1,107 @@ +version = 'v1'; + } + + protected function getCredentials(): CredentialList + { + if (!$this->_credentials) { + $this->_credentials = new CredentialList($this); + } + return $this->_credentials; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/CredentialContext.php b/app/api/Twilio/Rest/Notify/V1/CredentialContext.php new file mode 100755 index 0000000..f93b90a --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/CredentialContext.php @@ -0,0 +1,134 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Credentials/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.CredentialContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/CredentialInstance.php b/app/api/Twilio/Rest/Notify/V1/CredentialInstance.php new file mode 100755 index 0000000..a2f0e9b --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/CredentialInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'sandbox' => Values::array_get($payload, 'sandbox'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialContext Context for this CredentialInstance + */ + protected function proxy(): CredentialContext + { + if (!$this->context) { + $this->context = new CredentialContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialInstance + * + * @return CredentialInstance Fetched CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CredentialInstance + * + * @param array|Options $options Optional Arguments + * @return CredentialInstance Updated CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CredentialInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.CredentialInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/CredentialList.php b/app/api/Twilio/Rest/Notify/V1/CredentialList.php new file mode 100755 index 0000000..5d453ec --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/CredentialList.php @@ -0,0 +1,203 @@ +solution = [ + ]; + + $this->uri = '/Credentials'; + } + + /** + * Create the CredentialInstance + * + * @param string $type + * @param array|Options $options Optional Arguments + * @return CredentialInstance Created CredentialInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $type, array $options = []): CredentialInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Type' => + $type, + 'FriendlyName' => + $options['friendlyName'], + 'Certificate' => + $options['certificate'], + 'PrivateKey' => + $options['privateKey'], + 'Sandbox' => + Serialize::booleanToString($options['sandbox']), + 'ApiKey' => + $options['apiKey'], + 'Secret' => + $options['secret'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CredentialInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialPage Page of CredentialInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialPage Page of CredentialInstance + */ + public function getPage(string $targetUrl): CredentialPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Credential resource to delete. + */ + public function getContext( + string $sid + + ): CredentialContext + { + return new CredentialContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.CredentialList]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/CredentialOptions.php b/app/api/Twilio/Rest/Notify/V1/CredentialOptions.php new file mode 100755 index 0000000..542b6ad --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/CredentialOptions.php @@ -0,0 +1,314 @@ +options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * + * @param string $apiKey [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.CreateCredentialOptions ' . $options . ']'; + } +} + + + + +class UpdateCredentialOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $certificate [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + * @param string $privateKey [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @param string $apiKey [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * @param string $secret [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $certificate = Values::NONE, + string $privateKey = Values::NONE, + bool $sandbox = Values::BOOL_NONE, + string $apiKey = Values::NONE, + string $secret = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['certificate'] = $certificate; + $this->options['privateKey'] = $privateKey; + $this->options['sandbox'] = $sandbox; + $this->options['apiKey'] = $apiKey; + $this->options['secret'] = $secret; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + * + * @param string $certificate [APN only] The URL-encoded representation of the certificate. Strip everything outside of the headers, e.g. `-----BEGIN CERTIFICATE-----MIIFnTCCBIWgAwIBAgIIAjy9H849+E8wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV.....A==-----END CERTIFICATE-----` + * @return $this Fluent Builder + */ + public function setCertificate(string $certificate): self + { + $this->options['certificate'] = $certificate; + return $this; + } + + /** + * [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + * + * @param string $privateKey [APN only] The URL-encoded representation of the private key. Strip everything outside of the headers, e.g. `-----BEGIN RSA PRIVATE KEY-----MIIEpQIBAAKCAQEAuyf/lNrH9ck8DmNyo3fGgvCI1l9s+cmBY3WIz+cUDqmxiieR\\\\n.-----END RSA PRIVATE KEY-----` + * @return $this Fluent Builder + */ + public function setPrivateKey(string $privateKey): self + { + $this->options['privateKey'] = $privateKey; + return $this; + } + + /** + * [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * + * @param bool $sandbox [APN only] Whether to send the credential to sandbox APNs. Can be `true` to send to sandbox APNs or `false` to send to production. + * @return $this Fluent Builder + */ + public function setSandbox(bool $sandbox): self + { + $this->options['sandbox'] = $sandbox; + return $this; + } + + /** + * [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * + * @param string $apiKey [GCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setApiKey(string $apiKey): self + { + $this->options['apiKey'] = $apiKey; + return $this; + } + + /** + * [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * + * @param string $secret [FCM only] The `Server key` of your project from Firebase console under Settings / Cloud messaging. + * @return $this Fluent Builder + */ + public function setSecret(string $secret): self + { + $this->options['secret'] = $secret; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.UpdateCredentialOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/CredentialPage.php b/app/api/Twilio/Rest/Notify/V1/CredentialPage.php new file mode 100755 index 0000000..29ac769 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/CredentialPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialInstance \Twilio\Rest\Notify\V1\CredentialInstance + */ + public function buildInstance(array $payload): CredentialInstance + { + return new CredentialInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.CredentialPage]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/Service/BindingContext.php b/app/api/Twilio/Rest/Notify/V1/Service/BindingContext.php new file mode 100755 index 0000000..4873bfc --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/BindingContext.php @@ -0,0 +1,100 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.BindingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/Service/BindingInstance.php b/app/api/Twilio/Rest/Notify/V1/Service/BindingInstance.php new file mode 100755 index 0000000..89f3231 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/BindingInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'credentialSid' => Values::array_get($payload, 'credential_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'notificationProtocolVersion' => Values::array_get($payload, 'notification_protocol_version'), + 'endpoint' => Values::array_get($payload, 'endpoint'), + 'identity' => Values::array_get($payload, 'identity'), + 'bindingType' => Values::array_get($payload, 'binding_type'), + 'address' => Values::array_get($payload, 'address'), + 'tags' => Values::array_get($payload, 'tags'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BindingContext Context for this BindingInstance + */ + protected function proxy(): BindingContext + { + if (!$this->context) { + $this->context = new BindingContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BindingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BindingInstance + * + * @return BindingInstance Fetched BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BindingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.BindingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/Service/BindingList.php b/app/api/Twilio/Rest/Notify/V1/Service/BindingList.php new file mode 100755 index 0000000..5a24029 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/BindingList.php @@ -0,0 +1,225 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Bindings'; + } + + /** + * Create the BindingInstance + * + * @param string $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Up to 20 Bindings can be created for the same Identity in a given Service. + * @param string $bindingType + * @param string $address The channel-specific address. For APNS, the device token. For FCM and GCM, the registration token. For SMS, a phone number in E.164 format. For Facebook Messenger, the Messenger ID of the user or a phone number in E.164 format. + * @param array|Options $options Optional Arguments + * @return BindingInstance Created BindingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, string $bindingType, string $address, array $options = []): BindingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'BindingType' => + $bindingType, + 'Address' => + $address, + 'Tag' => + Serialize::map($options['tag'], function ($e) { return $e; }), + 'NotificationProtocolVersion' => + $options['notificationProtocolVersion'], + 'CredentialSid' => + $options['credentialSid'], + 'Endpoint' => + $options['endpoint'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BindingInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads BindingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BindingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BindingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BindingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BindingPage Page of BindingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BindingPage + { + $options = new Values($options); + + $params = Values::of([ + 'StartDate' => + Serialize::iso8601Date($options['startDate']), + 'EndDate' => + Serialize::iso8601Date($options['endDate']), + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'Tag' => + Serialize::map($options['tag'], function ($e) { return $e; }), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BindingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BindingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BindingPage Page of BindingInstance + */ + public function getPage(string $targetUrl): BindingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BindingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BindingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Binding resource to delete. + */ + public function getContext( + string $sid + + ): BindingContext + { + return new BindingContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.BindingList]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/Service/BindingOptions.php b/app/api/Twilio/Rest/Notify/V1/Service/BindingOptions.php new file mode 100755 index 0000000..93a9562 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/BindingOptions.php @@ -0,0 +1,240 @@ +options['tag'] = $tag; + $this->options['notificationProtocolVersion'] = $notificationProtocolVersion; + $this->options['credentialSid'] = $credentialSid; + $this->options['endpoint'] = $endpoint; + } + + /** + * A tag that can be used to select the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 20 tags. + * + * @param string[] $tag A tag that can be used to select the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 20 tags. + * @return $this Fluent Builder + */ + public function setTag(array $tag): self + { + $this->options['tag'] = $tag; + return $this; + } + + /** + * The protocol version to use to send the notification. This defaults to the value of `default_xxxx_notification_protocol_version` for the protocol in the [Service](https://www.twilio.com/docs/notify/api/service-resource). The current version is `\\\"3\\\"` for `apn`, `fcm`, and `gcm` type Bindings. The parameter is not applicable to `sms` and `facebook-messenger` type Bindings as the data format is fixed. + * + * @param string $notificationProtocolVersion The protocol version to use to send the notification. This defaults to the value of `default_xxxx_notification_protocol_version` for the protocol in the [Service](https://www.twilio.com/docs/notify/api/service-resource). The current version is `\\\"3\\\"` for `apn`, `fcm`, and `gcm` type Bindings. The parameter is not applicable to `sms` and `facebook-messenger` type Bindings as the data format is fixed. + * @return $this Fluent Builder + */ + public function setNotificationProtocolVersion(string $notificationProtocolVersion): self + { + $this->options['notificationProtocolVersion'] = $notificationProtocolVersion; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) resource to be used to send notifications to this Binding. If present, this overrides the Credential specified in the Service resource. Applies to only `apn`, `fcm`, and `gcm` type Bindings. + * + * @param string $credentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) resource to be used to send notifications to this Binding. If present, this overrides the Credential specified in the Service resource. Applies to only `apn`, `fcm`, and `gcm` type Bindings. + * @return $this Fluent Builder + */ + public function setCredentialSid(string $credentialSid): self + { + $this->options['credentialSid'] = $credentialSid; + return $this; + } + + /** + * Deprecated. + * + * @param string $endpoint Deprecated. + * @return $this Fluent Builder + */ + public function setEndpoint(string $endpoint): self + { + $this->options['endpoint'] = $endpoint; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.CreateBindingOptions ' . $options . ']'; + } +} + + + +class ReadBindingOptions extends Options + { + /** + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + * @param string[] $tag Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + */ + public function __construct( + + \DateTime $startDate = null, + \DateTime $endDate = null, + array $identity = Values::ARRAY_NONE, + array $tag = Values::ARRAY_NONE + + ) { + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['identity'] = $identity; + $this->options['tag'] = $tag; + } + + /** + * Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * + * @param \DateTime $startDate Only include usage that has occurred on or after this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date. Specify the date in GMT and format as `YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + * + * @param string[] $identity The [User](https://www.twilio.com/docs/chat/rest/user-resource)'s `identity` value of the resources to read. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + * + * @param string[] $tag Only list Bindings that have all of the specified Tags. The following implicit tags are available: `all`, `apn`, `fcm`, `gcm`, `sms`, `facebook-messenger`. Up to 5 tags are allowed. + * @return $this Fluent Builder + */ + public function setTag(array $tag): self + { + $this->options['tag'] = $tag; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.ReadBindingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/Service/BindingPage.php b/app/api/Twilio/Rest/Notify/V1/Service/BindingPage.php new file mode 100755 index 0000000..8417265 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/BindingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BindingInstance \Twilio\Rest\Notify\V1\Service\BindingInstance + */ + public function buildInstance(array $payload): BindingInstance + { + return new BindingInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.BindingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/Service/NotificationInstance.php b/app/api/Twilio/Rest/Notify/V1/Service/NotificationInstance.php new file mode 100755 index 0000000..22c13f8 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/NotificationInstance.php @@ -0,0 +1,120 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'identities' => Values::array_get($payload, 'identities'), + 'tags' => Values::array_get($payload, 'tags'), + 'segments' => Values::array_get($payload, 'segments'), + 'priority' => Values::array_get($payload, 'priority'), + 'ttl' => Values::array_get($payload, 'ttl'), + 'title' => Values::array_get($payload, 'title'), + 'body' => Values::array_get($payload, 'body'), + 'sound' => Values::array_get($payload, 'sound'), + 'action' => Values::array_get($payload, 'action'), + 'data' => Values::array_get($payload, 'data'), + 'apn' => Values::array_get($payload, 'apn'), + 'gcm' => Values::array_get($payload, 'gcm'), + 'fcm' => Values::array_get($payload, 'fcm'), + 'sms' => Values::array_get($payload, 'sms'), + 'facebookMessenger' => Values::array_get($payload, 'facebook_messenger'), + 'alexa' => Values::array_get($payload, 'alexa'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.NotificationInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/Service/NotificationList.php b/app/api/Twilio/Rest/Notify/V1/Service/NotificationList.php new file mode 100755 index 0000000..5651e55 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/NotificationList.php @@ -0,0 +1,122 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Notifications'; + } + + /** + * Create the NotificationInstance + * + * @param array|Options $options Optional Arguments + * @return NotificationInstance Created NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): NotificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'Priority' => + $options['priority'], + 'Ttl' => + $options['ttl'], + 'Title' => + $options['title'], + 'Sound' => + $options['sound'], + 'Action' => + $options['action'], + 'Data' => + Serialize::jsonObject($options['data']), + 'Apn' => + Serialize::jsonObject($options['apn']), + 'Gcm' => + Serialize::jsonObject($options['gcm']), + 'Sms' => + Serialize::jsonObject($options['sms']), + 'FacebookMessenger' => + Serialize::jsonObject($options['facebookMessenger']), + 'Fcm' => + Serialize::jsonObject($options['fcm']), + 'Segment' => + Serialize::map($options['segment'], function ($e) { return $e; }), + 'Alexa' => + Serialize::jsonObject($options['alexa']), + 'ToBinding' => + Serialize::map($options['toBinding'], function ($e) { return $e; }), + 'DeliveryCallbackUrl' => + $options['deliveryCallbackUrl'], + 'Identity' => + Serialize::map($options['identity'], function ($e) { return $e; }), + 'Tag' => + Serialize::map($options['tag'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.NotificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/Service/NotificationOptions.php b/app/api/Twilio/Rest/Notify/V1/Service/NotificationOptions.php new file mode 100755 index 0000000..da569d6 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/NotificationOptions.php @@ -0,0 +1,380 @@ +options['identity'] = $identity; + $this->options['tag'] = $tag; + $this->options['body'] = $body; + $this->options['priority'] = $priority; + $this->options['ttl'] = $ttl; + $this->options['title'] = $title; + $this->options['sound'] = $sound; + $this->options['action'] = $action; + $this->options['data'] = $data; + $this->options['apn'] = $apn; + $this->options['gcm'] = $gcm; + $this->options['sms'] = $sms; + $this->options['facebookMessenger'] = $facebookMessenger; + $this->options['fcm'] = $fcm; + $this->options['segment'] = $segment; + $this->options['alexa'] = $alexa; + $this->options['toBinding'] = $toBinding; + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + } + + /** + * The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Delivery will be attempted only to Bindings with an Identity in this list. No more than 20 items are allowed in this list. + * + * @param string[] $identity The `identity` value that uniquely identifies the new resource's [User](https://www.twilio.com/docs/chat/rest/user-resource) within the [Service](https://www.twilio.com/docs/notify/api/service-resource). Delivery will be attempted only to Bindings with an Identity in this list. No more than 20 items are allowed in this list. + * @return $this Fluent Builder + */ + public function setIdentity(array $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * A tag that selects the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 5 tags. The implicit tag `all` is available to notify all Bindings in a Service instance. Similarly, the implicit tags `apn`, `fcm`, `gcm`, `sms` and `facebook-messenger` are available to notify all Bindings in a specific channel. + * + * @param string[] $tag A tag that selects the Bindings to notify. Repeat this parameter to specify more than one tag, up to a total of 5 tags. The implicit tag `all` is available to notify all Bindings in a Service instance. Similarly, the implicit tags `apn`, `fcm`, `gcm`, `sms` and `facebook-messenger` are available to notify all Bindings in a specific channel. + * @return $this Fluent Builder + */ + public function setTag(array $tag): self + { + $this->options['tag'] = $tag; + return $this; + } + + /** + * The notification text. For FCM and GCM, translates to `data.twi_body`. For APNS, translates to `aps.alert.body`. For SMS, translates to `body`. SMS requires either this `body` value, or `media_urls` attribute defined in the `sms` parameter of the notification. + * + * @param string $body The notification text. For FCM and GCM, translates to `data.twi_body`. For APNS, translates to `aps.alert.body`. For SMS, translates to `body`. SMS requires either this `body` value, or `media_urls` attribute defined in the `sms` parameter of the notification. + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * @param string $priority + * @return $this Fluent Builder + */ + public function setPriority(string $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * How long, in seconds, the notification is valid. Can be an integer between 0 and 2,419,200, which is 4 weeks, the default and the maximum supported time to live (TTL). Delivery should be attempted if the device is offline until the TTL elapses. Zero means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. SMS does not support this property. + * + * @param int $ttl How long, in seconds, the notification is valid. Can be an integer between 0 and 2,419,200, which is 4 weeks, the default and the maximum supported time to live (TTL). Delivery should be attempted if the device is offline until the TTL elapses. Zero means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. SMS does not support this property. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * The notification title. For FCM and GCM, this translates to the `data.twi_title` value. For APNS, this translates to the `aps.alert.title` value. SMS does not support this property. This field is not visible on iOS phones and tablets but appears on Apple Watch and Android devices. + * + * @param string $title The notification title. For FCM and GCM, this translates to the `data.twi_title` value. For APNS, this translates to the `aps.alert.title` value. SMS does not support this property. This field is not visible on iOS phones and tablets but appears on Apple Watch and Android devices. + * @return $this Fluent Builder + */ + public function setTitle(string $title): self + { + $this->options['title'] = $title; + return $this; + } + + /** + * The name of the sound to be played for the notification. For FCM and GCM, this Translates to `data.twi_sound`. For APNS, this translates to `aps.sound`. SMS does not support this property. + * + * @param string $sound The name of the sound to be played for the notification. For FCM and GCM, this Translates to `data.twi_sound`. For APNS, this translates to `aps.sound`. SMS does not support this property. + * @return $this Fluent Builder + */ + public function setSound(string $sound): self + { + $this->options['sound'] = $sound; + return $this; + } + + /** + * The actions to display for the notification. For APNS, translates to the `aps.category` value. For GCM, translates to the `data.twi_action` value. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + * + * @param string $action The actions to display for the notification. For APNS, translates to the `aps.category` value. For GCM, translates to the `data.twi_action` value. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + * @return $this Fluent Builder + */ + public function setAction(string $action): self + { + $this->options['action'] = $action; + return $this; + } + + /** + * The custom key-value pairs of the notification's payload. For FCM and GCM, this value translates to `data` in the FCM and GCM payloads. FCM and GCM [reserve certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref) that cannot be used in those channels. For APNS, attributes of `data` are inserted into the APNS payload as custom properties outside of the `aps` dictionary. In all channels, we reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed and are rejected as 400 Bad request with no delivery attempted. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + * + * @param array $data The custom key-value pairs of the notification's payload. For FCM and GCM, this value translates to `data` in the FCM and GCM payloads. FCM and GCM [reserve certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref) that cannot be used in those channels. For APNS, attributes of `data` are inserted into the APNS payload as custom properties outside of the `aps` dictionary. In all channels, we reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed and are rejected as 400 Bad request with no delivery attempted. For SMS, this parameter is not supported and is omitted from deliveries to those channels. + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * The APNS-specific payload that overrides corresponding attributes in the generic payload for APNS Bindings. This property maps to the APNS `Payload` item, therefore the `aps` key must be used to change standard attributes. Adds custom key-value pairs to the root of the dictionary. See the [APNS documentation](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html) for more details. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + * + * @param array $apn The APNS-specific payload that overrides corresponding attributes in the generic payload for APNS Bindings. This property maps to the APNS `Payload` item, therefore the `aps` key must be used to change standard attributes. Adds custom key-value pairs to the root of the dictionary. See the [APNS documentation](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html) for more details. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. + * @return $this Fluent Builder + */ + public function setApn(array $apn): self + { + $this->options['apn'] = $apn; + return $this; + } + + /** + * The GCM-specific payload that overrides corresponding attributes in the generic payload for GCM Bindings. This property maps to the root JSON dictionary. See the [GCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref) for more details. Target parameters `to`, `registration_ids`, and `notification_key` are not allowed. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. GCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref). + * + * @param array $gcm The GCM-specific payload that overrides corresponding attributes in the generic payload for GCM Bindings. This property maps to the root JSON dictionary. See the [GCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref) for more details. Target parameters `to`, `registration_ids`, and `notification_key` are not allowed. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. GCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref). + * @return $this Fluent Builder + */ + public function setGcm(array $gcm): self + { + $this->options['gcm'] = $gcm; + return $this; + } + + /** + * The SMS-specific payload that overrides corresponding attributes in the generic payload for SMS Bindings. Each attribute in this value maps to the corresponding `form` parameter of the Twilio [Message](https://www.twilio.com/docs/sms/send-messages) resource. These parameters of the Message resource are supported in snake case format: `body`, `media_urls`, `status_callback`, and `max_price`. The `status_callback` parameter overrides the corresponding parameter in the messaging service, if configured. The `media_urls` property expects a JSON array. + * + * @param array $sms The SMS-specific payload that overrides corresponding attributes in the generic payload for SMS Bindings. Each attribute in this value maps to the corresponding `form` parameter of the Twilio [Message](https://www.twilio.com/docs/sms/send-messages) resource. These parameters of the Message resource are supported in snake case format: `body`, `media_urls`, `status_callback`, and `max_price`. The `status_callback` parameter overrides the corresponding parameter in the messaging service, if configured. The `media_urls` property expects a JSON array. + * @return $this Fluent Builder + */ + public function setSms(array $sms): self + { + $this->options['sms'] = $sms; + return $this; + } + + /** + * Deprecated. + * + * @param array $facebookMessenger Deprecated. + * @return $this Fluent Builder + */ + public function setFacebookMessenger(array $facebookMessenger): self + { + $this->options['facebookMessenger'] = $facebookMessenger; + return $this; + } + + /** + * The FCM-specific payload that overrides corresponding attributes in the generic payload for FCM Bindings. This property maps to the root JSON dictionary. See the [FCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream) for more details. Target parameters `to`, `registration_ids`, `condition`, and `notification_key` are not allowed in this parameter. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. FCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref), which cannot be used in that channel. + * + * @param array $fcm The FCM-specific payload that overrides corresponding attributes in the generic payload for FCM Bindings. This property maps to the root JSON dictionary. See the [FCM documentation](https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream) for more details. Target parameters `to`, `registration_ids`, `condition`, and `notification_key` are not allowed in this parameter. We reserve keys that start with `twi_` for future use. Custom keys that start with `twi_` are not allowed. FCM also [reserves certain keys](https://firebase.google.com/docs/cloud-messaging/http-server-ref), which cannot be used in that channel. + * @return $this Fluent Builder + */ + public function setFcm(array $fcm): self + { + $this->options['fcm'] = $fcm; + return $this; + } + + /** + * The Segment resource is deprecated. Use the `tag` parameter, instead. + * + * @param string[] $segment The Segment resource is deprecated. Use the `tag` parameter, instead. + * @return $this Fluent Builder + */ + public function setSegment(array $segment): self + { + $this->options['segment'] = $segment; + return $this; + } + + /** + * Deprecated. + * + * @param array $alexa Deprecated. + * @return $this Fluent Builder + */ + public function setAlexa(array $alexa): self + { + $this->options['alexa'] = $alexa; + return $this; + } + + /** + * The destination address specified as a JSON string. Multiple `to_binding` parameters can be included but the total size of the request entity should not exceed 1MB. This is typically sufficient for 10,000 phone numbers. + * + * @param string[] $toBinding The destination address specified as a JSON string. Multiple `to_binding` parameters can be included but the total size of the request entity should not exceed 1MB. This is typically sufficient for 10,000 phone numbers. + * @return $this Fluent Builder + */ + public function setToBinding(array $toBinding): self + { + $this->options['toBinding'] = $toBinding; + return $this; + } + + /** + * URL to send webhooks. + * + * @param string $deliveryCallbackUrl URL to send webhooks. + * @return $this Fluent Builder + */ + public function setDeliveryCallbackUrl(string $deliveryCallbackUrl): self + { + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.CreateNotificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/Service/NotificationPage.php b/app/api/Twilio/Rest/Notify/V1/Service/NotificationPage.php new file mode 100755 index 0000000..272007c --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/Service/NotificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NotificationInstance \Twilio\Rest\Notify\V1\Service\NotificationInstance + */ + public function buildInstance(array $payload): NotificationInstance + { + return new NotificationInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.NotificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/ServiceContext.php b/app/api/Twilio/Rest/Notify/V1/ServiceContext.php new file mode 100755 index 0000000..fdab62c --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/ServiceContext.php @@ -0,0 +1,226 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ApnCredentialSid' => + $options['apnCredentialSid'], + 'GcmCredentialSid' => + $options['gcmCredentialSid'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'FacebookMessengerPageId' => + $options['facebookMessengerPageId'], + 'DefaultApnNotificationProtocolVersion' => + $options['defaultApnNotificationProtocolVersion'], + 'DefaultGcmNotificationProtocolVersion' => + $options['defaultGcmNotificationProtocolVersion'], + 'FcmCredentialSid' => + $options['fcmCredentialSid'], + 'DefaultFcmNotificationProtocolVersion' => + $options['defaultFcmNotificationProtocolVersion'], + 'LogEnabled' => + Serialize::booleanToString($options['logEnabled']), + 'AlexaSkillId' => + $options['alexaSkillId'], + 'DefaultAlexaNotificationProtocolVersion' => + $options['defaultAlexaNotificationProtocolVersion'], + 'DeliveryCallbackUrl' => + $options['deliveryCallbackUrl'], + 'DeliveryCallbackEnabled' => + Serialize::booleanToString($options['deliveryCallbackEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + if (!$this->_notifications) { + $this->_notifications = new NotificationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_notifications; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + if (!$this->_bindings) { + $this->_bindings = new BindingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_bindings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/ServiceInstance.php b/app/api/Twilio/Rest/Notify/V1/ServiceInstance.php new file mode 100755 index 0000000..d856dd9 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/ServiceInstance.php @@ -0,0 +1,201 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'apnCredentialSid' => Values::array_get($payload, 'apn_credential_sid'), + 'gcmCredentialSid' => Values::array_get($payload, 'gcm_credential_sid'), + 'fcmCredentialSid' => Values::array_get($payload, 'fcm_credential_sid'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'facebookMessengerPageId' => Values::array_get($payload, 'facebook_messenger_page_id'), + 'defaultApnNotificationProtocolVersion' => Values::array_get($payload, 'default_apn_notification_protocol_version'), + 'defaultGcmNotificationProtocolVersion' => Values::array_get($payload, 'default_gcm_notification_protocol_version'), + 'defaultFcmNotificationProtocolVersion' => Values::array_get($payload, 'default_fcm_notification_protocol_version'), + 'logEnabled' => Values::array_get($payload, 'log_enabled'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'alexaSkillId' => Values::array_get($payload, 'alexa_skill_id'), + 'defaultAlexaNotificationProtocolVersion' => Values::array_get($payload, 'default_alexa_notification_protocol_version'), + 'deliveryCallbackUrl' => Values::array_get($payload, 'delivery_callback_url'), + 'deliveryCallbackEnabled' => Values::array_get($payload, 'delivery_callback_enabled'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + return $this->proxy()->notifications; + } + + /** + * Access the bindings + */ + protected function getBindings(): BindingList + { + return $this->proxy()->bindings; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Notify.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/ServiceList.php b/app/api/Twilio/Rest/Notify/V1/ServiceList.php new file mode 100755 index 0000000..c007e8a --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/ServiceList.php @@ -0,0 +1,222 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ApnCredentialSid' => + $options['apnCredentialSid'], + 'GcmCredentialSid' => + $options['gcmCredentialSid'], + 'MessagingServiceSid' => + $options['messagingServiceSid'], + 'FacebookMessengerPageId' => + $options['facebookMessengerPageId'], + 'DefaultApnNotificationProtocolVersion' => + $options['defaultApnNotificationProtocolVersion'], + 'DefaultGcmNotificationProtocolVersion' => + $options['defaultGcmNotificationProtocolVersion'], + 'FcmCredentialSid' => + $options['fcmCredentialSid'], + 'DefaultFcmNotificationProtocolVersion' => + $options['defaultFcmNotificationProtocolVersion'], + 'LogEnabled' => + Serialize::booleanToString($options['logEnabled']), + 'AlexaSkillId' => + $options['alexaSkillId'], + 'DefaultAlexaNotificationProtocolVersion' => + $options['defaultAlexaNotificationProtocolVersion'], + 'DeliveryCallbackUrl' => + $options['deliveryCallbackUrl'], + 'DeliveryCallbackEnabled' => + Serialize::booleanToString($options['deliveryCallbackEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Notify/V1/ServiceOptions.php b/app/api/Twilio/Rest/Notify/V1/ServiceOptions.php new file mode 100755 index 0000000..7b7e687 --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/ServiceOptions.php @@ -0,0 +1,652 @@ +options['friendlyName'] = $friendlyName; + $this->options['apnCredentialSid'] = $apnCredentialSid; + $this->options['gcmCredentialSid'] = $gcmCredentialSid; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['facebookMessengerPageId'] = $facebookMessengerPageId; + $this->options['defaultApnNotificationProtocolVersion'] = $defaultApnNotificationProtocolVersion; + $this->options['defaultGcmNotificationProtocolVersion'] = $defaultGcmNotificationProtocolVersion; + $this->options['fcmCredentialSid'] = $fcmCredentialSid; + $this->options['defaultFcmNotificationProtocolVersion'] = $defaultFcmNotificationProtocolVersion; + $this->options['logEnabled'] = $logEnabled; + $this->options['alexaSkillId'] = $alexaSkillId; + $this->options['defaultAlexaNotificationProtocolVersion'] = $defaultAlexaNotificationProtocolVersion; + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + $this->options['deliveryCallbackEnabled'] = $deliveryCallbackEnabled; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + * + * @param string $apnCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + * @return $this Fluent Builder + */ + public function setApnCredentialSid(string $apnCredentialSid): self + { + $this->options['apnCredentialSid'] = $apnCredentialSid; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + * + * @param string $gcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + * @return $this Fluent Builder + */ + public function setGcmCredentialSid(string $gcmCredentialSid): self + { + $this->options['gcmCredentialSid'] = $gcmCredentialSid; + return $this; + } + + /** + * The SID of the [Messaging Service](https://www.twilio.com/docs/sms/send-messages#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + * + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/send-messages#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * Deprecated. + * + * @param string $facebookMessengerPageId Deprecated. + * @return $this Fluent Builder + */ + public function setFacebookMessengerPageId(string $facebookMessengerPageId): self + { + $this->options['facebookMessengerPageId'] = $facebookMessengerPageId; + return $this; + } + + /** + * The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultApnNotificationProtocolVersion The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultApnNotificationProtocolVersion(string $defaultApnNotificationProtocolVersion): self + { + $this->options['defaultApnNotificationProtocolVersion'] = $defaultApnNotificationProtocolVersion; + return $this; + } + + /** + * The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultGcmNotificationProtocolVersion The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultGcmNotificationProtocolVersion(string $defaultGcmNotificationProtocolVersion): self + { + $this->options['defaultGcmNotificationProtocolVersion'] = $defaultGcmNotificationProtocolVersion; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + * + * @param string $fcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + * @return $this Fluent Builder + */ + public function setFcmCredentialSid(string $fcmCredentialSid): self + { + $this->options['fcmCredentialSid'] = $fcmCredentialSid; + return $this; + } + + /** + * The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultFcmNotificationProtocolVersion The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultFcmNotificationProtocolVersion(string $defaultFcmNotificationProtocolVersion): self + { + $this->options['defaultFcmNotificationProtocolVersion'] = $defaultFcmNotificationProtocolVersion; + return $this; + } + + /** + * Whether to log notifications. Can be: `true` or `false` and the default is `true`. + * + * @param bool $logEnabled Whether to log notifications. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setLogEnabled(bool $logEnabled): self + { + $this->options['logEnabled'] = $logEnabled; + return $this; + } + + /** + * Deprecated. + * + * @param string $alexaSkillId Deprecated. + * @return $this Fluent Builder + */ + public function setAlexaSkillId(string $alexaSkillId): self + { + $this->options['alexaSkillId'] = $alexaSkillId; + return $this; + } + + /** + * Deprecated. + * + * @param string $defaultAlexaNotificationProtocolVersion Deprecated. + * @return $this Fluent Builder + */ + public function setDefaultAlexaNotificationProtocolVersion(string $defaultAlexaNotificationProtocolVersion): self + { + $this->options['defaultAlexaNotificationProtocolVersion'] = $defaultAlexaNotificationProtocolVersion; + return $this; + } + + /** + * URL to send delivery status callback. + * + * @param string $deliveryCallbackUrl URL to send delivery status callback. + * @return $this Fluent Builder + */ + public function setDeliveryCallbackUrl(string $deliveryCallbackUrl): self + { + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + return $this; + } + + /** + * Callback configuration that enables delivery callbacks, default false + * + * @param bool $deliveryCallbackEnabled Callback configuration that enables delivery callbacks, default false + * @return $this Fluent Builder + */ + public function setDeliveryCallbackEnabled(bool $deliveryCallbackEnabled): self + { + $this->options['deliveryCallbackEnabled'] = $deliveryCallbackEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.CreateServiceOptions ' . $options . ']'; + } +} + + + +class ReadServiceOptions extends Options + { + /** + * @param string $friendlyName The string that identifies the Service resources to read. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The string that identifies the Service resources to read. + * + * @param string $friendlyName The string that identifies the Service resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.ReadServiceOptions ' . $options . ']'; + } +} + +class UpdateServiceOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $apnCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + * @param string $gcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/send-messages#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + * @param string $facebookMessengerPageId Deprecated. + * @param string $defaultApnNotificationProtocolVersion The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @param string $defaultGcmNotificationProtocolVersion The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @param string $fcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + * @param string $defaultFcmNotificationProtocolVersion The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @param bool $logEnabled Whether to log notifications. Can be: `true` or `false` and the default is `true`. + * @param string $alexaSkillId Deprecated. + * @param string $defaultAlexaNotificationProtocolVersion Deprecated. + * @param string $deliveryCallbackUrl URL to send delivery status callback. + * @param bool $deliveryCallbackEnabled Callback configuration that enables delivery callbacks, default false + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $apnCredentialSid = Values::NONE, + string $gcmCredentialSid = Values::NONE, + string $messagingServiceSid = Values::NONE, + string $facebookMessengerPageId = Values::NONE, + string $defaultApnNotificationProtocolVersion = Values::NONE, + string $defaultGcmNotificationProtocolVersion = Values::NONE, + string $fcmCredentialSid = Values::NONE, + string $defaultFcmNotificationProtocolVersion = Values::NONE, + bool $logEnabled = Values::BOOL_NONE, + string $alexaSkillId = Values::NONE, + string $defaultAlexaNotificationProtocolVersion = Values::NONE, + string $deliveryCallbackUrl = Values::NONE, + bool $deliveryCallbackEnabled = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['apnCredentialSid'] = $apnCredentialSid; + $this->options['gcmCredentialSid'] = $gcmCredentialSid; + $this->options['messagingServiceSid'] = $messagingServiceSid; + $this->options['facebookMessengerPageId'] = $facebookMessengerPageId; + $this->options['defaultApnNotificationProtocolVersion'] = $defaultApnNotificationProtocolVersion; + $this->options['defaultGcmNotificationProtocolVersion'] = $defaultGcmNotificationProtocolVersion; + $this->options['fcmCredentialSid'] = $fcmCredentialSid; + $this->options['defaultFcmNotificationProtocolVersion'] = $defaultFcmNotificationProtocolVersion; + $this->options['logEnabled'] = $logEnabled; + $this->options['alexaSkillId'] = $alexaSkillId; + $this->options['defaultAlexaNotificationProtocolVersion'] = $defaultAlexaNotificationProtocolVersion; + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + $this->options['deliveryCallbackEnabled'] = $deliveryCallbackEnabled; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + * + * @param string $apnCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for APN Bindings. + * @return $this Fluent Builder + */ + public function setApnCredentialSid(string $apnCredentialSid): self + { + $this->options['apnCredentialSid'] = $apnCredentialSid; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + * + * @param string $gcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for GCM Bindings. + * @return $this Fluent Builder + */ + public function setGcmCredentialSid(string $gcmCredentialSid): self + { + $this->options['gcmCredentialSid'] = $gcmCredentialSid; + return $this; + } + + /** + * The SID of the [Messaging Service](https://www.twilio.com/docs/sms/send-messages#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + * + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/send-messages#messaging-services) to use for SMS Bindings. This parameter must be set in order to send SMS notifications. + * @return $this Fluent Builder + */ + public function setMessagingServiceSid(string $messagingServiceSid): self + { + $this->options['messagingServiceSid'] = $messagingServiceSid; + return $this; + } + + /** + * Deprecated. + * + * @param string $facebookMessengerPageId Deprecated. + * @return $this Fluent Builder + */ + public function setFacebookMessengerPageId(string $facebookMessengerPageId): self + { + $this->options['facebookMessengerPageId'] = $facebookMessengerPageId; + return $this; + } + + /** + * The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultApnNotificationProtocolVersion The protocol version to use for sending APNS notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultApnNotificationProtocolVersion(string $defaultApnNotificationProtocolVersion): self + { + $this->options['defaultApnNotificationProtocolVersion'] = $defaultApnNotificationProtocolVersion; + return $this; + } + + /** + * The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultGcmNotificationProtocolVersion The protocol version to use for sending GCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultGcmNotificationProtocolVersion(string $defaultGcmNotificationProtocolVersion): self + { + $this->options['defaultGcmNotificationProtocolVersion'] = $defaultGcmNotificationProtocolVersion; + return $this; + } + + /** + * The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + * + * @param string $fcmCredentialSid The SID of the [Credential](https://www.twilio.com/docs/notify/api/credential-resource) to use for FCM Bindings. + * @return $this Fluent Builder + */ + public function setFcmCredentialSid(string $fcmCredentialSid): self + { + $this->options['fcmCredentialSid'] = $fcmCredentialSid; + return $this; + } + + /** + * The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * + * @param string $defaultFcmNotificationProtocolVersion The protocol version to use for sending FCM notifications. Can be overridden on a Binding by Binding basis when creating a [Binding](https://www.twilio.com/docs/notify/api/binding-resource) resource. + * @return $this Fluent Builder + */ + public function setDefaultFcmNotificationProtocolVersion(string $defaultFcmNotificationProtocolVersion): self + { + $this->options['defaultFcmNotificationProtocolVersion'] = $defaultFcmNotificationProtocolVersion; + return $this; + } + + /** + * Whether to log notifications. Can be: `true` or `false` and the default is `true`. + * + * @param bool $logEnabled Whether to log notifications. Can be: `true` or `false` and the default is `true`. + * @return $this Fluent Builder + */ + public function setLogEnabled(bool $logEnabled): self + { + $this->options['logEnabled'] = $logEnabled; + return $this; + } + + /** + * Deprecated. + * + * @param string $alexaSkillId Deprecated. + * @return $this Fluent Builder + */ + public function setAlexaSkillId(string $alexaSkillId): self + { + $this->options['alexaSkillId'] = $alexaSkillId; + return $this; + } + + /** + * Deprecated. + * + * @param string $defaultAlexaNotificationProtocolVersion Deprecated. + * @return $this Fluent Builder + */ + public function setDefaultAlexaNotificationProtocolVersion(string $defaultAlexaNotificationProtocolVersion): self + { + $this->options['defaultAlexaNotificationProtocolVersion'] = $defaultAlexaNotificationProtocolVersion; + return $this; + } + + /** + * URL to send delivery status callback. + * + * @param string $deliveryCallbackUrl URL to send delivery status callback. + * @return $this Fluent Builder + */ + public function setDeliveryCallbackUrl(string $deliveryCallbackUrl): self + { + $this->options['deliveryCallbackUrl'] = $deliveryCallbackUrl; + return $this; + } + + /** + * Callback configuration that enables delivery callbacks, default false + * + * @param bool $deliveryCallbackEnabled Callback configuration that enables delivery callbacks, default false + * @return $this Fluent Builder + */ + public function setDeliveryCallbackEnabled(bool $deliveryCallbackEnabled): self + { + $this->options['deliveryCallbackEnabled'] = $deliveryCallbackEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Notify.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Notify/V1/ServicePage.php b/app/api/Twilio/Rest/Notify/V1/ServicePage.php new file mode 100755 index 0000000..42befbd --- /dev/null +++ b/app/api/Twilio/Rest/Notify/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Notify\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Notify.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/NotifyBase.php b/app/api/Twilio/Rest/NotifyBase.php new file mode 100755 index 0000000..d58b14c --- /dev/null +++ b/app/api/Twilio/Rest/NotifyBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://notify.twilio.com'; + } + + + /** + * @return V1 Version v1 of notify + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Notify]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers.php b/app/api/Twilio/Rest/Numbers.php new file mode 100755 index 0000000..a27c291 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers.php @@ -0,0 +1,16 @@ +regulatoryCompliance instead. + */ + protected function getRegulatoryCompliance(): \Twilio\Rest\Numbers\V2\RegulatoryComplianceList { + echo "regulatoryCompliance is deprecated. Use v2->regulatoryCompliance instead."; + return $this->v2->regulatoryCompliance; + } + +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Numbers/V2.php b/app/api/Twilio/Rest/Numbers/V2.php new file mode 100755 index 0000000..2de1d88 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2.php @@ -0,0 +1,94 @@ +version = 'v2'; + } + + protected function getRegulatoryCompliance(): RegulatoryComplianceList + { + if (!$this->_regulatoryCompliance) { + $this->_regulatoryCompliance = new RegulatoryComplianceList($this); + } + return $this->_regulatoryCompliance; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyInstance.php new file mode 100755 index 0000000..38243ac --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyInstance.php @@ -0,0 +1,100 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'regulationSid' => Values::array_get($payload, 'regulation_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'validUntil' => Deserialize::dateTime(Values::array_get($payload, 'valid_until')), + 'email' => Values::array_get($payload, 'email'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['bundleSid' => $bundleSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.BundleCopyInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyList.php new file mode 100755 index 0000000..e9245b6 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyList.php @@ -0,0 +1,180 @@ +solution = [ + 'bundleSid' => + $bundleSid, + + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/Copies'; + } + + /** + * Create the BundleCopyInstance + * + * @param array|Options $options Optional Arguments + * @return BundleCopyInstance Created BundleCopyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): BundleCopyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BundleCopyInstance( + $this->version, + $payload, + $this->solution['bundleSid'] + ); + } + + + /** + * Reads BundleCopyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BundleCopyInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams BundleCopyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BundleCopyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BundleCopyPage Page of BundleCopyInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BundleCopyPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BundleCopyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BundleCopyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BundleCopyPage Page of BundleCopyInstance + */ + public function getPage(string $targetUrl): BundleCopyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BundleCopyPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.BundleCopyList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyOptions.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyOptions.php new file mode 100755 index 0000000..7d889e0 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyOptions.php @@ -0,0 +1,78 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * The string that you assigned to describe the copied bundle. + * + * @param string $friendlyName The string that you assigned to describe the copied bundle. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.CreateBundleCopyOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyPage.php new file mode 100755 index 0000000..c68b526 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/BundleCopyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BundleCopyInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\Bundle\BundleCopyInstance + */ + public function buildInstance(array $payload): BundleCopyInstance + { + return new BundleCopyInstance($this->version, $payload, $this->solution['bundleSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.BundleCopyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationContext.php new file mode 100755 index 0000000..aa94064 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationContext.php @@ -0,0 +1,87 @@ +solution = [ + 'bundleSid' => + $bundleSid, + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/Evaluations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EvaluationInstance + * + * @return EvaluationInstance Fetched EvaluationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EvaluationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EvaluationInstance( + $this->version, + $payload, + $this->solution['bundleSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EvaluationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationInstance.php new file mode 100755 index 0000000..53642b3 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationInstance.php @@ -0,0 +1,132 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'regulationSid' => Values::array_get($payload, 'regulation_sid'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'status' => Values::array_get($payload, 'status'), + 'results' => Values::array_get($payload, 'results'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['bundleSid' => $bundleSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EvaluationContext Context for this EvaluationInstance + */ + protected function proxy(): EvaluationContext + { + if (!$this->context) { + $this->context = new EvaluationContext( + $this->version, + $this->solution['bundleSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EvaluationInstance + * + * @return EvaluationInstance Fetched EvaluationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EvaluationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EvaluationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationList.php new file mode 100755 index 0000000..9c318c9 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationList.php @@ -0,0 +1,188 @@ +solution = [ + 'bundleSid' => + $bundleSid, + + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/Evaluations'; + } + + /** + * Create the EvaluationInstance + * + * @return EvaluationInstance Created EvaluationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(): EvaluationInstance + { + + $payload = $this->version->create('POST', $this->uri); + + return new EvaluationInstance( + $this->version, + $payload, + $this->solution['bundleSid'] + ); + } + + + /** + * Reads EvaluationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EvaluationInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EvaluationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EvaluationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EvaluationPage Page of EvaluationInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EvaluationPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EvaluationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EvaluationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EvaluationPage Page of EvaluationInstance + */ + public function getPage(string $targetUrl): EvaluationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EvaluationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EvaluationContext + * + * @param string $sid The unique string that identifies the Evaluation resource. + */ + public function getContext( + string $sid + + ): EvaluationContext + { + return new EvaluationContext( + $this->version, + $this->solution['bundleSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EvaluationList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationPage.php new file mode 100755 index 0000000..38b2093 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/EvaluationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EvaluationInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\Bundle\EvaluationInstance + */ + public function buildInstance(array $payload): EvaluationInstance + { + return new EvaluationInstance($this->version, $payload, $this->solution['bundleSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EvaluationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentContext.php new file mode 100755 index 0000000..23ca7ef --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentContext.php @@ -0,0 +1,100 @@ +solution = [ + 'bundleSid' => + $bundleSid, + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/ItemAssignments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ItemAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ItemAssignmentInstance + * + * @return ItemAssignmentInstance Fetched ItemAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ItemAssignmentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ItemAssignmentInstance( + $this->version, + $payload, + $this->solution['bundleSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.ItemAssignmentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentInstance.php new file mode 100755 index 0000000..8d4df41 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'bundleSid' => Values::array_get($payload, 'bundle_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'objectSid' => Values::array_get($payload, 'object_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['bundleSid' => $bundleSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ItemAssignmentContext Context for this ItemAssignmentInstance + */ + protected function proxy(): ItemAssignmentContext + { + if (!$this->context) { + $this->context = new ItemAssignmentContext( + $this->version, + $this->solution['bundleSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ItemAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ItemAssignmentInstance + * + * @return ItemAssignmentInstance Fetched ItemAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ItemAssignmentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.ItemAssignmentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentList.php new file mode 100755 index 0000000..7f464f0 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentList.php @@ -0,0 +1,194 @@ +solution = [ + 'bundleSid' => + $bundleSid, + + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/ItemAssignments'; + } + + /** + * Create the ItemAssignmentInstance + * + * @param string $objectSid The SID of an object bag that holds information of the different items. + * @return ItemAssignmentInstance Created ItemAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $objectSid): ItemAssignmentInstance + { + + $data = Values::of([ + 'ObjectSid' => + $objectSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ItemAssignmentInstance( + $this->version, + $payload, + $this->solution['bundleSid'] + ); + } + + + /** + * Reads ItemAssignmentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ItemAssignmentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ItemAssignmentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ItemAssignmentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ItemAssignmentPage Page of ItemAssignmentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ItemAssignmentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ItemAssignmentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ItemAssignmentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ItemAssignmentPage Page of ItemAssignmentInstance + */ + public function getPage(string $targetUrl): ItemAssignmentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ItemAssignmentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ItemAssignmentContext + * + * @param string $sid The unique string that we created to identify the Identity resource. + */ + public function getContext( + string $sid + + ): ItemAssignmentContext + { + return new ItemAssignmentContext( + $this->version, + $this->solution['bundleSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.ItemAssignmentList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentPage.php new file mode 100755 index 0000000..7866eaa --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ItemAssignmentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ItemAssignmentInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\Bundle\ItemAssignmentInstance + */ + public function buildInstance(array $payload): ItemAssignmentInstance + { + return new ItemAssignmentInstance($this->version, $payload, $this->solution['bundleSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.ItemAssignmentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsInstance.php new file mode 100755 index 0000000..6dc5153 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsInstance.php @@ -0,0 +1,100 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'regulationSid' => Values::array_get($payload, 'regulation_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'validUntil' => Deserialize::dateTime(Values::array_get($payload, 'valid_until')), + 'email' => Values::array_get($payload, 'email'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['bundleSid' => $bundleSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.ReplaceItemsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsList.php new file mode 100755 index 0000000..fe68f05 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsList.php @@ -0,0 +1,84 @@ +solution = [ + 'bundleSid' => + $bundleSid, + + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($bundleSid) + .'/ReplaceItems'; + } + + /** + * Create the ReplaceItemsInstance + * + * @param string $fromBundleSid The source bundle sid to copy the item assignments from. + * @return ReplaceItemsInstance Created ReplaceItemsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $fromBundleSid): ReplaceItemsInstance + { + + $data = Values::of([ + 'FromBundleSid' => + $fromBundleSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ReplaceItemsInstance( + $this->version, + $payload, + $this->solution['bundleSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.ReplaceItemsList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsPage.php new file mode 100755 index 0000000..8efde21 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/Bundle/ReplaceItemsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ReplaceItemsInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\Bundle\ReplaceItemsInstance + */ + public function buildInstance(array $payload): ReplaceItemsInstance + { + return new ReplaceItemsInstance($this->version, $payload, $this->solution['bundleSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.ReplaceItemsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleContext.php new file mode 100755 index 0000000..55acdfe --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleContext.php @@ -0,0 +1,242 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/Bundles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BundleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BundleInstance + * + * @return BundleInstance Fetched BundleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BundleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BundleInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the BundleInstance + * + * @param array|Options $options Optional Arguments + * @return BundleInstance Updated BundleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): BundleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $options['status'], + 'StatusCallback' => + $options['statusCallback'], + 'FriendlyName' => + $options['friendlyName'], + 'Email' => + $options['email'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new BundleInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the bundleCopies + */ + protected function getBundleCopies(): BundleCopyList + { + if (!$this->_bundleCopies) { + $this->_bundleCopies = new BundleCopyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_bundleCopies; + } + + /** + * Access the replaceItems + */ + protected function getReplaceItems(): ReplaceItemsList + { + if (!$this->_replaceItems) { + $this->_replaceItems = new ReplaceItemsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_replaceItems; + } + + /** + * Access the evaluations + */ + protected function getEvaluations(): EvaluationList + { + if (!$this->_evaluations) { + $this->_evaluations = new EvaluationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_evaluations; + } + + /** + * Access the itemAssignments + */ + protected function getItemAssignments(): ItemAssignmentList + { + if (!$this->_itemAssignments) { + $this->_itemAssignments = new ItemAssignmentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_itemAssignments; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.BundleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleInstance.php new file mode 100755 index 0000000..cb0fd45 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleInstance.php @@ -0,0 +1,205 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'regulationSid' => Values::array_get($payload, 'regulation_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'validUntil' => Deserialize::dateTime(Values::array_get($payload, 'valid_until')), + 'email' => Values::array_get($payload, 'email'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BundleContext Context for this BundleInstance + */ + protected function proxy(): BundleContext + { + if (!$this->context) { + $this->context = new BundleContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BundleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BundleInstance + * + * @return BundleInstance Fetched BundleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BundleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the BundleInstance + * + * @param array|Options $options Optional Arguments + * @return BundleInstance Updated BundleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): BundleInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the bundleCopies + */ + protected function getBundleCopies(): BundleCopyList + { + return $this->proxy()->bundleCopies; + } + + /** + * Access the replaceItems + */ + protected function getReplaceItems(): ReplaceItemsList + { + return $this->proxy()->replaceItems; + } + + /** + * Access the evaluations + */ + protected function getEvaluations(): EvaluationList + { + return $this->proxy()->evaluations; + } + + /** + * Access the itemAssignments + */ + protected function getItemAssignments(): ItemAssignmentList + { + return $this->proxy()->itemAssignments; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.BundleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleList.php new file mode 100755 index 0000000..4379f08 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleList.php @@ -0,0 +1,230 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/Bundles'; + } + + /** + * Create the BundleInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Bundle resource changes status. + * @param array|Options $options Optional Arguments + * @return BundleInstance Created BundleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $email, array $options = []): BundleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Email' => + $email, + 'StatusCallback' => + $options['statusCallback'], + 'RegulationSid' => + $options['regulationSid'], + 'IsoCountry' => + $options['isoCountry'], + 'EndUserType' => + $options['endUserType'], + 'NumberType' => + $options['numberType'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BundleInstance( + $this->version, + $payload + ); + } + + + /** + * Reads BundleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BundleInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams BundleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BundleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BundlePage Page of BundleInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BundlePage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'FriendlyName' => + $options['friendlyName'], + 'RegulationSid' => + $options['regulationSid'], + 'IsoCountry' => + $options['isoCountry'], + 'NumberType' => + $options['numberType'], + 'HasValidUntilDate' => + Serialize::booleanToString($options['hasValidUntilDate']), + 'SortBy' => + $options['sortBy'], + 'SortDirection' => + $options['sortDirection'], + 'ValidUntilDate<' => + Serialize::iso8601DateTime($options['validUntilDateBefore']), + 'ValidUntilDate' => + Serialize::iso8601DateTime($options['validUntilDate']), + 'ValidUntilDate>' => + Serialize::iso8601DateTime($options['validUntilDateAfter']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BundlePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BundleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BundlePage Page of BundleInstance + */ + public function getPage(string $targetUrl): BundlePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BundlePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BundleContext + * + * @param string $sid The unique string that we created to identify the Bundle resource. + */ + public function getContext( + string $sid + + ): BundleContext + { + return new BundleContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.BundleList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleOptions.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleOptions.php new file mode 100755 index 0000000..17a2c08 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundleOptions.php @@ -0,0 +1,486 @@ +=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @param string $validUntilDate Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @param string $validUntilDateAfter Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @return ReadBundleOptions Options builder + */ + public static function read( + + string $status = Values::NONE, + string $friendlyName = Values::NONE, + string $regulationSid = Values::NONE, + string $isoCountry = Values::NONE, + string $numberType = Values::NONE, + bool $hasValidUntilDate = Values::BOOL_NONE, + string $sortBy = Values::NONE, + string $sortDirection = Values::NONE, + string $validUntilDateBefore = null, + string $validUntilDate = null, + string $validUntilDateAfter = null + + ): ReadBundleOptions + { + return new ReadBundleOptions( + $status, + $friendlyName, + $regulationSid, + $isoCountry, + $numberType, + $hasValidUntilDate, + $sortBy, + $sortDirection, + $validUntilDateBefore, + $validUntilDate, + $validUntilDateAfter + ); + } + + /** + * @param string $status + * @param string $statusCallback The URL we call to inform your application of status changes. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Bundle resource changes status. + * @return UpdateBundleOptions Options builder + */ + public static function update( + + string $status = Values::NONE, + string $statusCallback = Values::NONE, + string $friendlyName = Values::NONE, + string $email = Values::NONE + + ): UpdateBundleOptions + { + return new UpdateBundleOptions( + $status, + $statusCallback, + $friendlyName, + $email + ); + } + +} + +class CreateBundleOptions extends Options + { + /** + * @param string $statusCallback The URL we call to inform your application of status changes. + * @param string $regulationSid The unique string of a regulation that is associated to the Bundle resource. + * @param string $isoCountry The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * @param string $endUserType + * @param string $numberType The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll free`. + */ + public function __construct( + + string $statusCallback = Values::NONE, + string $regulationSid = Values::NONE, + string $isoCountry = Values::NONE, + string $endUserType = Values::NONE, + string $numberType = Values::NONE + + ) { + $this->options['statusCallback'] = $statusCallback; + $this->options['regulationSid'] = $regulationSid; + $this->options['isoCountry'] = $isoCountry; + $this->options['endUserType'] = $endUserType; + $this->options['numberType'] = $numberType; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The unique string of a regulation that is associated to the Bundle resource. + * + * @param string $regulationSid The unique string of a regulation that is associated to the Bundle resource. + * @return $this Fluent Builder + */ + public function setRegulationSid(string $regulationSid): self + { + $this->options['regulationSid'] = $regulationSid; + return $this; + } + + /** + * The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * + * @param string $isoCountry The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * @param string $endUserType + * @return $this Fluent Builder + */ + public function setEndUserType(string $endUserType): self + { + $this->options['endUserType'] = $endUserType; + return $this; + } + + /** + * The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll free`. + * + * @param string $numberType The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `toll free`. + * @return $this Fluent Builder + */ + public function setNumberType(string $numberType): self + { + $this->options['numberType'] = $numberType; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.CreateBundleOptions ' . $options . ']'; + } +} + + + +class ReadBundleOptions extends Options + { + /** + * @param string $status The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + * @param string $friendlyName The string that you assigned to describe the resource. The column can contain 255 variable characters. + * @param string $regulationSid The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + * @param string $isoCountry The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * @param string $numberType The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `tollfree`. + * @param bool $hasValidUntilDate Indicates that the Bundle is a valid Bundle until a specified expiration date. + * @param string $sortBy Can be `valid-until` or `date-updated`. Defaults to `date-created`. + * @param string $sortDirection Default is `DESC`. Can be `ASC` or `DESC`. + * @param string $validUntilDateBefore Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @param string $validUntilDate Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @param string $validUntilDateAfter Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + */ + public function __construct( + + string $status = Values::NONE, + string $friendlyName = Values::NONE, + string $regulationSid = Values::NONE, + string $isoCountry = Values::NONE, + string $numberType = Values::NONE, + bool $hasValidUntilDate = Values::BOOL_NONE, + string $sortBy = Values::NONE, + string $sortDirection = Values::NONE, + string $validUntilDateBefore = null, + string $validUntilDate = null, + string $validUntilDateAfter = null + + ) { + $this->options['status'] = $status; + $this->options['friendlyName'] = $friendlyName; + $this->options['regulationSid'] = $regulationSid; + $this->options['isoCountry'] = $isoCountry; + $this->options['numberType'] = $numberType; + $this->options['hasValidUntilDate'] = $hasValidUntilDate; + $this->options['sortBy'] = $sortBy; + $this->options['sortDirection'] = $sortDirection; + $this->options['validUntilDateBefore'] = $validUntilDateBefore; + $this->options['validUntilDate'] = $validUntilDate; + $this->options['validUntilDateAfter'] = $validUntilDateAfter; + } + + /** + * The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + * + * @param string $status The verification status of the Bundle resource. Please refer to [Bundle Statuses](https://www.twilio.com/docs/phone-numbers/regulatory/api/bundles#bundle-statuses) for more details. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The string that you assigned to describe the resource. The column can contain 255 variable characters. + * + * @param string $friendlyName The string that you assigned to describe the resource. The column can contain 255 variable characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + * + * @param string $regulationSid The unique string of a [Regulation resource](https://www.twilio.com/docs/phone-numbers/regulatory/api/regulations) that is associated to the Bundle resource. + * @return $this Fluent Builder + */ + public function setRegulationSid(string $regulationSid): self + { + $this->options['regulationSid'] = $regulationSid; + return $this; + } + + /** + * The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * + * @param string $isoCountry The 2-digit [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Bundle's phone number country ownership request. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `tollfree`. + * + * @param string $numberType The type of phone number of the Bundle's ownership request. Can be `local`, `mobile`, `national`, or `tollfree`. + * @return $this Fluent Builder + */ + public function setNumberType(string $numberType): self + { + $this->options['numberType'] = $numberType; + return $this; + } + + /** + * Indicates that the Bundle is a valid Bundle until a specified expiration date. + * + * @param bool $hasValidUntilDate Indicates that the Bundle is a valid Bundle until a specified expiration date. + * @return $this Fluent Builder + */ + public function setHasValidUntilDate(bool $hasValidUntilDate): self + { + $this->options['hasValidUntilDate'] = $hasValidUntilDate; + return $this; + } + + /** + * Can be `valid-until` or `date-updated`. Defaults to `date-created`. + * + * @param string $sortBy Can be `valid-until` or `date-updated`. Defaults to `date-created`. + * @return $this Fluent Builder + */ + public function setSortBy(string $sortBy): self + { + $this->options['sortBy'] = $sortBy; + return $this; + } + + /** + * Default is `DESC`. Can be `ASC` or `DESC`. + * + * @param string $sortDirection Default is `DESC`. Can be `ASC` or `DESC`. + * @return $this Fluent Builder + */ + public function setSortDirection(string $sortDirection): self + { + $this->options['sortDirection'] = $sortDirection; + return $this; + } + + /** + * Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * + * @param string $validUntilDateBefore Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @return $this Fluent Builder + */ + public function setValidUntilDateBefore(string $validUntilDateBefore): self + { + $this->options['validUntilDateBefore'] = $validUntilDateBefore; + return $this; + } + + /** + * Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * + * @param string $validUntilDate Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @return $this Fluent Builder + */ + public function setValidUntilDate(string $validUntilDate): self + { + $this->options['validUntilDate'] = $validUntilDate; + return $this; + } + + /** + * Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * + * @param string $validUntilDateAfter Date to filter Bundles having their `valid_until_date` before or after the specified date. Can be `ValidUntilDate>=` or `ValidUntilDate<=`. Both can be used in conjunction as well. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the acceptable date format. + * @return $this Fluent Builder + */ + public function setValidUntilDateAfter(string $validUntilDateAfter): self + { + $this->options['validUntilDateAfter'] = $validUntilDateAfter; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.ReadBundleOptions ' . $options . ']'; + } +} + +class UpdateBundleOptions extends Options + { + /** + * @param string $status + * @param string $statusCallback The URL we call to inform your application of status changes. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Bundle resource changes status. + */ + public function __construct( + + string $status = Values::NONE, + string $statusCallback = Values::NONE, + string $friendlyName = Values::NONE, + string $email = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['statusCallback'] = $statusCallback; + $this->options['friendlyName'] = $friendlyName; + $this->options['email'] = $email; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The email address that will receive updates when the Bundle resource changes status. + * + * @param string $email The email address that will receive updates when the Bundle resource changes status. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.UpdateBundleOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundlePage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundlePage.php new file mode 100755 index 0000000..55d0f6b --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/BundlePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BundleInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\BundleInstance + */ + public function buildInstance(array $payload): BundleInstance + { + return new BundleInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.BundlePage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserContext.php new file mode 100755 index 0000000..e237793 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserContext.php @@ -0,0 +1,126 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/EndUsers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the EndUserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the EndUserInstance + * + * @return EndUserInstance Fetched EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EndUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the EndUserInstance + * + * @param array|Options $options Optional Arguments + * @return EndUserInstance Updated EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): EndUserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new EndUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EndUserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserInstance.php new file mode 100755 index 0000000..002d136 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EndUserContext Context for this EndUserInstance + */ + protected function proxy(): EndUserContext + { + if (!$this->context) { + $this->context = new EndUserContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the EndUserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the EndUserInstance + * + * @return EndUserInstance Fetched EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the EndUserInstance + * + * @param array|Options $options Optional Arguments + * @return EndUserInstance Updated EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): EndUserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EndUserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserList.php new file mode 100755 index 0000000..64ce128 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserList.php @@ -0,0 +1,196 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/EndUsers'; + } + + /** + * Create the EndUserInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $type + * @param array|Options $options Optional Arguments + * @return EndUserInstance Created EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $options = []): EndUserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EndUserInstance( + $this->version, + $payload + ); + } + + + /** + * Reads EndUserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EndUserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EndUserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EndUserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EndUserPage Page of EndUserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EndUserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EndUserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EndUserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EndUserPage Page of EndUserInstance + */ + public function getPage(string $targetUrl): EndUserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EndUserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EndUserContext + * + * @param string $sid The unique string created by Twilio to identify the End User resource. + */ + public function getContext( + string $sid + + ): EndUserContext + { + return new EndUserContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EndUserList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserOptions.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserOptions.php new file mode 100755 index 0000000..e4e2f24 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserOptions.php @@ -0,0 +1,152 @@ +options['attributes'] = $attributes; + } + + /** + * The set of parameters that are the attributes of the End User resource which are derived End User Types. + * + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.CreateEndUserOptions ' . $options . ']'; + } +} + + + + +class UpdateEndUserOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $attributes = Values::ARRAY_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The set of parameters that are the attributes of the End User resource which are derived End User Types. + * + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.UpdateEndUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserPage.php new file mode 100755 index 0000000..8f4639c --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EndUserInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\EndUserInstance + */ + public function buildInstance(array $payload): EndUserInstance + { + return new EndUserInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EndUserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeContext.php new file mode 100755 index 0000000..066ebf2 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/EndUserTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EndUserTypeInstance + * + * @return EndUserTypeInstance Fetched EndUserTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EndUserTypeInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EndUserTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeInstance.php new file mode 100755 index 0000000..ab5e46c --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'machineName' => Values::array_get($payload, 'machine_name'), + 'fields' => Values::array_get($payload, 'fields'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EndUserTypeContext Context for this EndUserTypeInstance + */ + protected function proxy(): EndUserTypeContext + { + if (!$this->context) { + $this->context = new EndUserTypeContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EndUserTypeInstance + * + * @return EndUserTypeInstance Fetched EndUserTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.EndUserTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeList.php new file mode 100755 index 0000000..74e4d36 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypeList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/EndUserTypes'; + } + + /** + * Reads EndUserTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EndUserTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EndUserTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EndUserTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EndUserTypePage Page of EndUserTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EndUserTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EndUserTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EndUserTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EndUserTypePage Page of EndUserTypeInstance + */ + public function getPage(string $targetUrl): EndUserTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EndUserTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EndUserTypeContext + * + * @param string $sid The unique string that identifies the End-User Type resource. + */ + public function getContext( + string $sid + + ): EndUserTypeContext + { + return new EndUserTypeContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EndUserTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypePage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypePage.php new file mode 100755 index 0000000..63d64b7 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/EndUserTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EndUserTypeInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\EndUserTypeInstance + */ + public function buildInstance(array $payload): EndUserTypeInstance + { + return new EndUserTypeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.EndUserTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationContext.php new file mode 100755 index 0000000..049e1c7 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/Regulations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the RegulationInstance + * + * @return RegulationInstance Fetched RegulationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RegulationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RegulationInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.RegulationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationInstance.php new file mode 100755 index 0000000..d2bafee --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'numberType' => Values::array_get($payload, 'number_type'), + 'endUserType' => Values::array_get($payload, 'end_user_type'), + 'requirements' => Values::array_get($payload, 'requirements'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RegulationContext Context for this RegulationInstance + */ + protected function proxy(): RegulationContext + { + if (!$this->context) { + $this->context = new RegulationContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the RegulationInstance + * + * @return RegulationInstance Fetched RegulationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RegulationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.RegulationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationList.php new file mode 100755 index 0000000..f41cad7 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationList.php @@ -0,0 +1,172 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/Regulations'; + } + + /** + * Reads RegulationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RegulationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RegulationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RegulationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RegulationPage Page of RegulationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RegulationPage + { + $options = new Values($options); + + $params = Values::of([ + 'EndUserType' => + $options['endUserType'], + 'IsoCountry' => + $options['isoCountry'], + 'NumberType' => + $options['numberType'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RegulationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RegulationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RegulationPage Page of RegulationInstance + */ + public function getPage(string $targetUrl): RegulationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RegulationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RegulationContext + * + * @param string $sid The unique string that identifies the Regulation resource. + */ + public function getContext( + string $sid + + ): RegulationContext + { + return new RegulationContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.RegulationList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationOptions.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationOptions.php new file mode 100755 index 0000000..386f654 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationOptions.php @@ -0,0 +1,114 @@ +options['endUserType'] = $endUserType; + $this->options['isoCountry'] = $isoCountry; + $this->options['numberType'] = $numberType; + } + + /** + * The type of End User the regulation requires - can be `individual` or `business`. + * + * @param string $endUserType The type of End User the regulation requires - can be `individual` or `business`. + * @return $this Fluent Builder + */ + public function setEndUserType(string $endUserType): self + { + $this->options['endUserType'] = $endUserType; + return $this; + } + + /** + * The ISO country code of the phone number's country. + * + * @param string $isoCountry The ISO country code of the phone number's country. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * The type of phone number that the regulatory requiremnt is restricting. + * + * @param string $numberType The type of phone number that the regulatory requiremnt is restricting. + * @return $this Fluent Builder + */ + public function setNumberType(string $numberType): self + { + $this->options['numberType'] = $numberType; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.ReadRegulationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationPage.php new file mode 100755 index 0000000..e19c056 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/RegulationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RegulationInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\RegulationInstance + */ + public function buildInstance(array $payload): RegulationInstance + { + return new RegulationInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.RegulationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentContext.php new file mode 100755 index 0000000..558313a --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentContext.php @@ -0,0 +1,126 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/SupportingDocuments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SupportingDocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SupportingDocumentInstance + * + * @return SupportingDocumentInstance Fetched SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SupportingDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SupportingDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Updated SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SupportingDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SupportingDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.SupportingDocumentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentInstance.php new file mode 100755 index 0000000..334b330 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'mimeType' => Values::array_get($payload, 'mime_type'), + 'status' => Values::array_get($payload, 'status'), + 'failureReason' => Values::array_get($payload, 'failure_reason'), + 'type' => Values::array_get($payload, 'type'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SupportingDocumentContext Context for this SupportingDocumentInstance + */ + protected function proxy(): SupportingDocumentContext + { + if (!$this->context) { + $this->context = new SupportingDocumentContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SupportingDocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SupportingDocumentInstance + * + * @return SupportingDocumentInstance Fetched SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SupportingDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Updated SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SupportingDocumentInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.SupportingDocumentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentList.php new file mode 100755 index 0000000..d59150f --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentList.php @@ -0,0 +1,196 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/SupportingDocuments'; + } + + /** + * Create the SupportingDocumentInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $type The type of the Supporting Document. + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Created SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $options = []): SupportingDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SupportingDocumentInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SupportingDocumentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SupportingDocumentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SupportingDocumentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SupportingDocumentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SupportingDocumentPage Page of SupportingDocumentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SupportingDocumentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SupportingDocumentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SupportingDocumentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SupportingDocumentPage Page of SupportingDocumentInstance + */ + public function getPage(string $targetUrl): SupportingDocumentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SupportingDocumentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SupportingDocumentContext + * + * @param string $sid The unique string created by Twilio to identify the Supporting Document resource. + */ + public function getContext( + string $sid + + ): SupportingDocumentContext + { + return new SupportingDocumentContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.SupportingDocumentList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentOptions.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentOptions.php new file mode 100755 index 0000000..935b34c --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentOptions.php @@ -0,0 +1,152 @@ +options['attributes'] = $attributes; + } + + /** + * The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + * + * @param array $attributes The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.CreateSupportingDocumentOptions ' . $options . ']'; + } +} + + + + +class UpdateSupportingDocumentOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param array $attributes The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $attributes = Values::ARRAY_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + * + * @param array $attributes The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Numbers.V2.UpdateSupportingDocumentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentPage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentPage.php new file mode 100755 index 0000000..ad54c83 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SupportingDocumentInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\SupportingDocumentInstance + */ + public function buildInstance(array $payload): SupportingDocumentInstance + { + return new SupportingDocumentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.SupportingDocumentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeContext.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeContext.php new file mode 100755 index 0000000..c55a4b3 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RegulatoryCompliance/SupportingDocumentTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SupportingDocumentTypeInstance + * + * @return SupportingDocumentTypeInstance Fetched SupportingDocumentTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SupportingDocumentTypeInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.SupportingDocumentTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeInstance.php new file mode 100755 index 0000000..32c5ef6 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'machineName' => Values::array_get($payload, 'machine_name'), + 'fields' => Values::array_get($payload, 'fields'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SupportingDocumentTypeContext Context for this SupportingDocumentTypeInstance + */ + protected function proxy(): SupportingDocumentTypeContext + { + if (!$this->context) { + $this->context = new SupportingDocumentTypeContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SupportingDocumentTypeInstance + * + * @return SupportingDocumentTypeInstance Fetched SupportingDocumentTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Numbers.V2.SupportingDocumentTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeList.php new file mode 100755 index 0000000..88073a2 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypeList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/RegulatoryCompliance/SupportingDocumentTypes'; + } + + /** + * Reads SupportingDocumentTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SupportingDocumentTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SupportingDocumentTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SupportingDocumentTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SupportingDocumentTypePage Page of SupportingDocumentTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SupportingDocumentTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SupportingDocumentTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SupportingDocumentTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SupportingDocumentTypePage Page of SupportingDocumentTypeInstance + */ + public function getPage(string $targetUrl): SupportingDocumentTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SupportingDocumentTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SupportingDocumentTypeContext + * + * @param string $sid The unique string that identifies the Supporting Document Type resource. + */ + public function getContext( + string $sid + + ): SupportingDocumentTypeContext + { + return new SupportingDocumentTypeContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.SupportingDocumentTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypePage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypePage.php new file mode 100755 index 0000000..ff4f1ea --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliance/SupportingDocumentTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SupportingDocumentTypeInstance \Twilio\Rest\Numbers\V2\RegulatoryCompliance\SupportingDocumentTypeInstance + */ + public function buildInstance(array $payload): SupportingDocumentTypeInstance + { + return new SupportingDocumentTypeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.SupportingDocumentTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceInstance.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceInstance.php new file mode 100755 index 0000000..c2d5854 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.RegulatoryComplianceInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceList.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceList.php new file mode 100755 index 0000000..e8df117 --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryComplianceList.php @@ -0,0 +1,191 @@ +solution = [ + ]; + } + + /** + * Access the bundles + */ + protected function getBundles(): BundleList + { + if (!$this->_bundles) { + $this->_bundles = new BundleList( + $this->version + ); + } + return $this->_bundles; + } + + /** + * Access the regulations + */ + protected function getRegulations(): RegulationList + { + if (!$this->_regulations) { + $this->_regulations = new RegulationList( + $this->version + ); + } + return $this->_regulations; + } + + /** + * Access the endUserTypes + */ + protected function getEndUserTypes(): EndUserTypeList + { + if (!$this->_endUserTypes) { + $this->_endUserTypes = new EndUserTypeList( + $this->version + ); + } + return $this->_endUserTypes; + } + + /** + * Access the endUsers + */ + protected function getEndUsers(): EndUserList + { + if (!$this->_endUsers) { + $this->_endUsers = new EndUserList( + $this->version + ); + } + return $this->_endUsers; + } + + /** + * Access the supportingDocumentTypes + */ + protected function getSupportingDocumentTypes(): SupportingDocumentTypeList + { + if (!$this->_supportingDocumentTypes) { + $this->_supportingDocumentTypes = new SupportingDocumentTypeList( + $this->version + ); + } + return $this->_supportingDocumentTypes; + } + + /** + * Access the supportingDocuments + */ + protected function getSupportingDocuments(): SupportingDocumentList + { + if (!$this->_supportingDocuments) { + $this->_supportingDocuments = new SupportingDocumentList( + $this->version + ); + } + return $this->_supportingDocuments; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.RegulatoryComplianceList]'; + } +} diff --git a/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliancePage.php b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliancePage.php new file mode 100755 index 0000000..b406a1f --- /dev/null +++ b/app/api/Twilio/Rest/Numbers/V2/RegulatoryCompliancePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RegulatoryComplianceInstance \Twilio\Rest\Numbers\V2\RegulatoryComplianceInstance + */ + public function buildInstance(array $payload): RegulatoryComplianceInstance + { + return new RegulatoryComplianceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Numbers.V2.RegulatoryCompliancePage]'; + } +} diff --git a/app/api/Twilio/Rest/NumbersBase.php b/app/api/Twilio/Rest/NumbersBase.php new file mode 100755 index 0000000..365ded2 --- /dev/null +++ b/app/api/Twilio/Rest/NumbersBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://numbers.twilio.com'; + } + + + /** + * @return V2 Version v2 of numbers + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Numbers]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth.php b/app/api/Twilio/Rest/Oauth.php new file mode 100755 index 0000000..a1c8830 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth.php @@ -0,0 +1,71 @@ +oauth instead. + */ + protected function getOauth(): \Twilio\Rest\Oauth\V1\OauthList { + echo "oauth is deprecated. Use v1->oauth instead."; + return $this->v1->oauth; + } + + /** + * @deprecated Use v1->oauth() instead. + */ + protected function contextOauth(): \Twilio\Rest\Oauth\V1\OauthContext { + echo "oauth() is deprecated. Use v1->oauth() instead."; + return $this->v1->oauth(); + } + + /** + * @deprecated Use v1->deviceCode instead. + */ + protected function getDeviceCode(): \Twilio\Rest\Oauth\V1\DeviceCodeList { + echo "deviceCode is deprecated. Use v1->deviceCode instead."; + return $this->v1->deviceCode; + } + + /** + * @deprecated Use v1->openidDiscovery instead. + */ + protected function getOpenidDiscovery(): \Twilio\Rest\Oauth\V1\OpenidDiscoveryList { + echo "openidDiscovery is deprecated. Use v1->openidDiscovery instead."; + return $this->v1->openidDiscovery; + } + + /** + * @deprecated Use v1->openidDiscovery() instead. + */ + protected function contextOpenidDiscovery(): \Twilio\Rest\Oauth\V1\OpenidDiscoveryContext { + echo "openidDiscovery() is deprecated. Use v1->openidDiscovery() instead."; + return $this->v1->openidDiscovery(); + } + + /** + * @deprecated Use v1->token instead. + */ + protected function getToken(): \Twilio\Rest\Oauth\V1\TokenList { + echo "token is deprecated. Use v1->token instead."; + return $this->v1->token; + } + + /** + * @deprecated Use v1->userInfo instead. + */ + protected function getUserInfo(): \Twilio\Rest\Oauth\V1\UserInfoList { + echo "userInfo is deprecated. Use v1->userInfo instead."; + return $this->v1->userInfo; + } + + /** + * @deprecated Use v1->userInfo() instead. + */ + protected function contextUserInfo(): \Twilio\Rest\Oauth\V1\UserInfoContext { + echo "userInfo() is deprecated. Use v1->userInfo() instead."; + return $this->v1->userInfo(); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Oauth/V1.php b/app/api/Twilio/Rest/Oauth/V1.php new file mode 100755 index 0000000..a4d1db6 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1.php @@ -0,0 +1,138 @@ +version = 'v1'; + } + + protected function getDeviceCode(): DeviceCodeList + { + if (!$this->_deviceCode) { + $this->_deviceCode = new DeviceCodeList($this); + } + return $this->_deviceCode; + } + + protected function getOauth(): OauthList + { + if (!$this->_oauth) { + $this->_oauth = new OauthList($this); + } + return $this->_oauth; + } + + protected function getOpenidDiscovery(): OpenidDiscoveryList + { + if (!$this->_openidDiscovery) { + $this->_openidDiscovery = new OpenidDiscoveryList($this); + } + return $this->_openidDiscovery; + } + + protected function getToken(): TokenList + { + if (!$this->_token) { + $this->_token = new TokenList($this); + } + return $this->_token; + } + + protected function getUserInfo(): UserInfoList + { + if (!$this->_userInfo) { + $this->_userInfo = new UserInfoList($this); + } + return $this->_userInfo; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/DeviceCodeInstance.php b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeInstance.php new file mode 100755 index 0000000..e938a83 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeInstance.php @@ -0,0 +1,90 @@ +properties = [ + 'deviceCode' => Values::array_get($payload, 'device_code'), + 'userCode' => Values::array_get($payload, 'user_code'), + 'verificationUri' => Values::array_get($payload, 'verification_uri'), + 'verificationUriComplete' => Values::array_get($payload, 'verification_uri_complete'), + 'expiresIn' => Values::array_get($payload, 'expires_in'), + 'interval' => Values::array_get($payload, 'interval'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.DeviceCodeInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/DeviceCodeList.php b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeList.php new file mode 100755 index 0000000..606a677 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeList.php @@ -0,0 +1,87 @@ +solution = [ + ]; + + $this->uri = '/device/code'; + } + + /** + * Create the DeviceCodeInstance + * + * @param string $clientSid A 34 character string that uniquely identifies this OAuth App. + * @param string[] $scopes An Array of scopes for authorization request + * @param array|Options $options Optional Arguments + * @return DeviceCodeInstance Created DeviceCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $clientSid, array $scopes, array $options = []): DeviceCodeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ClientSid' => + $clientSid, + 'Scopes' => + Serialize::map($scopes,function ($e) { return $e; }), + 'Audiences' => + Serialize::map($options['audiences'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeviceCodeInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.DeviceCodeList]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/DeviceCodeOptions.php b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeOptions.php new file mode 100755 index 0000000..8d52d79 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/DeviceCodeOptions.php @@ -0,0 +1,76 @@ +options['audiences'] = $audiences; + } + + /** + * An array of intended audiences for token requests + * + * @param string[] $audiences An array of intended audiences for token requests + * @return $this Fluent Builder + */ + public function setAudiences(array $audiences): self + { + $this->options['audiences'] = $audiences; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Oauth.V1.CreateDeviceCodeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/DeviceCodePage.php b/app/api/Twilio/Rest/Oauth/V1/DeviceCodePage.php new file mode 100755 index 0000000..b9f21bf --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/DeviceCodePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeviceCodeInstance \Twilio\Rest\Oauth\V1\DeviceCodeInstance + */ + public function buildInstance(array $payload): DeviceCodeInstance + { + return new DeviceCodeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.DeviceCodePage]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OauthContext.php b/app/api/Twilio/Rest/Oauth/V1/OauthContext.php new file mode 100755 index 0000000..402cd93 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OauthContext.php @@ -0,0 +1,75 @@ +solution = [ + ]; + + $this->uri = '/certs'; + } + + /** + * Fetch the OauthInstance + * + * @return OauthInstance Fetched OauthInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OauthInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new OauthInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.OauthContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OauthInstance.php b/app/api/Twilio/Rest/Oauth/V1/OauthInstance.php new file mode 100755 index 0000000..cbf3f66 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OauthInstance.php @@ -0,0 +1,115 @@ +properties = [ + 'keys' => Values::array_get($payload, 'keys'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return OauthContext Context for this OauthInstance + */ + protected function proxy(): OauthContext + { + if (!$this->context) { + $this->context = new OauthContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the OauthInstance + * + * @return OauthInstance Fetched OauthInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OauthInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.OauthInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/OauthList.php b/app/api/Twilio/Rest/Oauth/V1/OauthList.php new file mode 100755 index 0000000..ca0a893 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OauthList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a OauthContext + */ + public function getContext( + + ): OauthContext + { + return new OauthContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.OauthList]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OauthPage.php b/app/api/Twilio/Rest/Oauth/V1/OauthPage.php new file mode 100755 index 0000000..ac426e8 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OauthPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return OauthInstance \Twilio\Rest\Oauth\V1\OauthInstance + */ + public function buildInstance(array $payload): OauthInstance + { + return new OauthInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.OauthPage]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryContext.php b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryContext.php new file mode 100755 index 0000000..f2fbbd0 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryContext.php @@ -0,0 +1,75 @@ +solution = [ + ]; + + $this->uri = '/.well-known/openid-configuration'; + } + + /** + * Fetch the OpenidDiscoveryInstance + * + * @return OpenidDiscoveryInstance Fetched OpenidDiscoveryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OpenidDiscoveryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new OpenidDiscoveryInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.OpenidDiscoveryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryInstance.php b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryInstance.php new file mode 100755 index 0000000..6d4a2e0 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryInstance.php @@ -0,0 +1,137 @@ +properties = [ + 'issuer' => Values::array_get($payload, 'issuer'), + 'authorizationEndpoint' => Values::array_get($payload, 'authorization_endpoint'), + 'deviceAuthorizationEndpoint' => Values::array_get($payload, 'device_authorization_endpoint'), + 'tokenEndpoint' => Values::array_get($payload, 'token_endpoint'), + 'userinfoEndpoint' => Values::array_get($payload, 'userinfo_endpoint'), + 'revocationEndpoint' => Values::array_get($payload, 'revocation_endpoint'), + 'jwkUri' => Values::array_get($payload, 'jwk_uri'), + 'responseTypeSupported' => Values::array_get($payload, 'response_type_supported'), + 'subjectTypeSupported' => Values::array_get($payload, 'subject_type_supported'), + 'idTokenSigningAlgValuesSupported' => Values::array_get($payload, 'id_token_signing_alg_values_supported'), + 'scopesSupported' => Values::array_get($payload, 'scopes_supported'), + 'claimsSupported' => Values::array_get($payload, 'claims_supported'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return OpenidDiscoveryContext Context for this OpenidDiscoveryInstance + */ + protected function proxy(): OpenidDiscoveryContext + { + if (!$this->context) { + $this->context = new OpenidDiscoveryContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the OpenidDiscoveryInstance + * + * @return OpenidDiscoveryInstance Fetched OpenidDiscoveryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OpenidDiscoveryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.OpenidDiscoveryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryList.php b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryList.php new file mode 100755 index 0000000..64302d0 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a OpenidDiscoveryContext + */ + public function getContext( + + ): OpenidDiscoveryContext + { + return new OpenidDiscoveryContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.OpenidDiscoveryList]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryPage.php b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryPage.php new file mode 100755 index 0000000..637a2c1 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/OpenidDiscoveryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return OpenidDiscoveryInstance \Twilio\Rest\Oauth\V1\OpenidDiscoveryInstance + */ + public function buildInstance(array $payload): OpenidDiscoveryInstance + { + return new OpenidDiscoveryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.OpenidDiscoveryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/TokenInstance.php b/app/api/Twilio/Rest/Oauth/V1/TokenInstance.php new file mode 100755 index 0000000..cfc0157 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/TokenInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'accessToken' => Values::array_get($payload, 'access_token'), + 'refreshToken' => Values::array_get($payload, 'refresh_token'), + 'idToken' => Values::array_get($payload, 'id_token'), + 'refreshTokenExpiresAt' => Deserialize::dateTime(Values::array_get($payload, 'refresh_token_expires_at')), + 'accessTokenExpiresAt' => Deserialize::dateTime(Values::array_get($payload, 'access_token_expires_at')), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.TokenInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/TokenList.php b/app/api/Twilio/Rest/Oauth/V1/TokenList.php new file mode 100755 index 0000000..a67f1ee --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/TokenList.php @@ -0,0 +1,96 @@ +solution = [ + ]; + + $this->uri = '/token'; + } + + /** + * Create the TokenInstance + * + * @param string $grantType Grant type is a credential representing resource owner's authorization which can be used by client to obtain access token. + * @param string $clientSid A 34 character string that uniquely identifies this OAuth App. + * @param array|Options $options Optional Arguments + * @return TokenInstance Created TokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $grantType, string $clientSid, array $options = []): TokenInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'GrantType' => + $grantType, + 'ClientSid' => + $clientSid, + 'ClientSecret' => + $options['clientSecret'], + 'Code' => + $options['code'], + 'CodeVerifier' => + $options['codeVerifier'], + 'DeviceCode' => + $options['deviceCode'], + 'RefreshToken' => + $options['refreshToken'], + 'DeviceId' => + $options['deviceId'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TokenInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.TokenList]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/TokenOptions.php b/app/api/Twilio/Rest/Oauth/V1/TokenOptions.php new file mode 100755 index 0000000..a35e105 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/TokenOptions.php @@ -0,0 +1,166 @@ +options['clientSecret'] = $clientSecret; + $this->options['code'] = $code; + $this->options['codeVerifier'] = $codeVerifier; + $this->options['deviceCode'] = $deviceCode; + $this->options['refreshToken'] = $refreshToken; + $this->options['deviceId'] = $deviceId; + } + + /** + * The credential for confidential OAuth App. + * + * @param string $clientSecret The credential for confidential OAuth App. + * @return $this Fluent Builder + */ + public function setClientSecret(string $clientSecret): self + { + $this->options['clientSecret'] = $clientSecret; + return $this; + } + + /** + * JWT token related to the authorization code grant type. + * + * @param string $code JWT token related to the authorization code grant type. + * @return $this Fluent Builder + */ + public function setCode(string $code): self + { + $this->options['code'] = $code; + return $this; + } + + /** + * A code which is generation cryptographically. + * + * @param string $codeVerifier A code which is generation cryptographically. + * @return $this Fluent Builder + */ + public function setCodeVerifier(string $codeVerifier): self + { + $this->options['codeVerifier'] = $codeVerifier; + return $this; + } + + /** + * JWT token related to the device code grant type. + * + * @param string $deviceCode JWT token related to the device code grant type. + * @return $this Fluent Builder + */ + public function setDeviceCode(string $deviceCode): self + { + $this->options['deviceCode'] = $deviceCode; + return $this; + } + + /** + * JWT token related to the refresh token grant type. + * + * @param string $refreshToken JWT token related to the refresh token grant type. + * @return $this Fluent Builder + */ + public function setRefreshToken(string $refreshToken): self + { + $this->options['refreshToken'] = $refreshToken; + return $this; + } + + /** + * The Id of the device associated with the token (refresh token). + * + * @param string $deviceId The Id of the device associated with the token (refresh token). + * @return $this Fluent Builder + */ + public function setDeviceId(string $deviceId): self + { + $this->options['deviceId'] = $deviceId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Oauth.V1.CreateTokenOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/TokenPage.php b/app/api/Twilio/Rest/Oauth/V1/TokenPage.php new file mode 100755 index 0000000..74f37e6 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/TokenPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TokenInstance \Twilio\Rest\Oauth\V1\TokenInstance + */ + public function buildInstance(array $payload): TokenInstance + { + return new TokenInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.TokenPage]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/UserInfoContext.php b/app/api/Twilio/Rest/Oauth/V1/UserInfoContext.php new file mode 100755 index 0000000..db19eea --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/UserInfoContext.php @@ -0,0 +1,75 @@ +solution = [ + ]; + + $this->uri = '/userinfo'; + } + + /** + * Fetch the UserInfoInstance + * + * @return UserInfoInstance Fetched UserInfoInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInfoInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new UserInfoInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.UserInfoContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/UserInfoInstance.php b/app/api/Twilio/Rest/Oauth/V1/UserInfoInstance.php new file mode 100755 index 0000000..265598c --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/UserInfoInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'userSid' => Values::array_get($payload, 'user_sid'), + 'firstName' => Values::array_get($payload, 'first_name'), + 'lastName' => Values::array_get($payload, 'last_name'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'email' => Values::array_get($payload, 'email'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UserInfoContext Context for this UserInfoInstance + */ + protected function proxy(): UserInfoContext + { + if (!$this->context) { + $this->context = new UserInfoContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the UserInfoInstance + * + * @return UserInfoInstance Fetched UserInfoInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): UserInfoInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Oauth.V1.UserInfoInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Oauth/V1/UserInfoList.php b/app/api/Twilio/Rest/Oauth/V1/UserInfoList.php new file mode 100755 index 0000000..cd79d32 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/UserInfoList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a UserInfoContext + */ + public function getContext( + + ): UserInfoContext + { + return new UserInfoContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.UserInfoList]'; + } +} diff --git a/app/api/Twilio/Rest/Oauth/V1/UserInfoPage.php b/app/api/Twilio/Rest/Oauth/V1/UserInfoPage.php new file mode 100755 index 0000000..b6697b4 --- /dev/null +++ b/app/api/Twilio/Rest/Oauth/V1/UserInfoPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UserInfoInstance \Twilio\Rest\Oauth\V1\UserInfoInstance + */ + public function buildInstance(array $payload): UserInfoInstance + { + return new UserInfoInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Oauth.V1.UserInfoPage]'; + } +} diff --git a/app/api/Twilio/Rest/OauthBase.php b/app/api/Twilio/Rest/OauthBase.php new file mode 100755 index 0000000..381384c --- /dev/null +++ b/app/api/Twilio/Rest/OauthBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://oauth.twilio.com'; + } + + + /** + * @return V1 Version v1 of oauth + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Oauth]'; + } +} diff --git a/app/api/Twilio/Rest/Preview.php b/app/api/Twilio/Rest/Preview.php new file mode 100755 index 0000000..8611ee0 --- /dev/null +++ b/app/api/Twilio/Rest/Preview.php @@ -0,0 +1,178 @@ +fleets instead. + */ + protected function getFleets(): \Twilio\Rest\Preview\DeployedDevices\FleetList { + echo "fleets is deprecated. Use deployedDevices->fleets instead."; + return $this->deployedDevices->fleets; + } + + /** + * @deprecated Use deployedDevices->fleets(\$sid) instead. + * @param string $sid A string that uniquely identifies the Fleet. + */ + protected function contextFleets(string $sid): \Twilio\Rest\Preview\DeployedDevices\FleetContext { + echo "fleets(\$sid) is deprecated. Use deployedDevices->fleets(\$sid) instead."; + return $this->deployedDevices->fleets($sid); + } + + /** + * @deprecated Use hostedNumbers->authorizationDocuments instead. + */ + protected function getAuthorizationDocuments(): \Twilio\Rest\Preview\HostedNumbers\AuthorizationDocumentList { + echo "authorizationDocuments is deprecated. Use hostedNumbers->authorizationDocuments instead."; + return $this->hostedNumbers->authorizationDocuments; + } + + /** + * @deprecated Use hostedNumbers->authorizationDocuments(\$sid) instead. + * @param string $sid AuthorizationDocument sid. + */ + protected function contextAuthorizationDocuments(string $sid): \Twilio\Rest\Preview\HostedNumbers\AuthorizationDocumentContext { + echo "authorizationDocuments(\$sid) is deprecated. Use hostedNumbers->authorizationDocuments(\$sid) instead."; + return $this->hostedNumbers->authorizationDocuments($sid); + } + + /** + * @deprecated Use hostedNumbers->hostedNumberOrders instead. + */ + protected function getHostedNumberOrders(): \Twilio\Rest\Preview\HostedNumbers\HostedNumberOrderList { + echo "hostedNumberOrders is deprecated. Use hostedNumbers->hostedNumberOrders instead."; + return $this->hostedNumbers->hostedNumberOrders; + } + + /** + * @deprecated Use hostedNumbers->hostedNumberOrders(\$sid) instead + * @param string $sid HostedNumberOrder sid. + */ + protected function contextHostedNumberOrders(string $sid): \Twilio\Rest\Preview\HostedNumbers\HostedNumberOrderContext { + echo "hostedNumberOrders(\$sid) is deprecated. Use hostedNumbers->hostedNumberOrders(\$sid) instead."; + return $this->hostedNumbers->hostedNumberOrders($sid); + } + + /** + * @deprecated Use marketplace->availableAddOns instead. + */ + protected function getAvailableAddOns(): \Twilio\Rest\Preview\Marketplace\AvailableAddOnList { + echo "availableAddOns is deprecated. Use marketplace->availableAddOns instead."; + return $this->marketplace->availableAddOns; + } + + /** + * @deprecated Use marketplace->availableAddOns(\$sid) instead. + * @param string $sid The SID of the AvailableAddOn resource to fetch + */ + protected function contextAvailableAddOns(string $sid): \Twilio\Rest\Preview\Marketplace\AvailableAddOnContext { + echo "availableAddOns(\$sid) is deprecated. Use marketplace->availableAddOns(\$sid) instead."; + return $this->marketplace->availableAddOns($sid); + } + + /** + * @deprecated Use marketplace->installedAddOns instead. + */ + protected function getInstalledAddOns(): \Twilio\Rest\Preview\Marketplace\InstalledAddOnList { + echo "installedAddOns is deprecated. Use marketplace->installedAddOns instead."; + return $this->marketplace->installedAddOns; + } + + /** + * @deprecated Use marketplace->installedAddOns(\$sid) instead. + * @param string $sid The SID of the InstalledAddOn resource to fetch + */ + protected function contextInstalledAddOns(string $sid): \Twilio\Rest\Preview\Marketplace\InstalledAddOnContext { + echo "installedAddOns(\$sid) is deprecated. Use marketplace->installedAddOns(\$sid) instead."; + return $this->marketplace->installedAddOns($sid); + } + + /** + * @deprecated Use sync->services instead. + */ + protected function getServices(): \Twilio\Rest\Preview\Sync\ServiceList { + echo "services is deprecated. Use sync->services instead."; + return $this->sync->services; + } + + /** + * @deprecated Use sync->services(\$sid) instead. + * @param string $sid The sid + */ + protected function contextServices(string $sid): \Twilio\Rest\Preview\Sync\ServiceContext { + echo "services(\$sid) is deprecated. Use sync->services(\$sid) instead."; + return $this->sync->services($sid); + } + + /** + * @deprecated Use understand->assistants instead. + */ + protected function getAssistants(): \Twilio\Rest\Preview\Understand\AssistantList { + echo "assistants is deprecated. Use understand->assistants instead."; + return $this->understand->assistants; + } + + /** + * @deprecated Use understand->assistants(\$sid) instead. + * @param string $sid A 34 character string that uniquely identifies this + * resource. + */ + protected function contextAssistants(string $sid): \Twilio\Rest\Preview\Understand\AssistantContext { + echo "assistants(\$sid) is deprecated. Use understand->assistants(\$sid) instead."; + return $this->understand->assistants($sid); + } + + /** + * @deprecated Use wireless->commands instead. + */ + protected function getCommands(): \Twilio\Rest\Preview\Wireless\CommandList { + echo "commands is deprecated. Use wireless->commands instead."; + return $this->wireless->commands; + } + + /** + * @deprecated Use wireless->commands(\$sid) instead. + * @param string $sid The sid + */ + protected function contextCommands(string $sid): \Twilio\Rest\Preview\Wireless\CommandContext { + echo "commands(\$sid) is deprecated. Use wireless->commands(\$sid) instead."; + return $this->wireless->commands($sid); + } + + /** + * @deprecated Use wireless->ratePlans instead. + */ + protected function getRatePlans(): \Twilio\Rest\Preview\Wireless\RatePlanList { + echo "ratePlans is deprecated. Use wireless->ratePlans instead."; + return $this->wireless->ratePlans; + } + + /** + * @deprecated Use wireless->ratePlans(\$sid) instead. + * @param string $sid The sid + */ + protected function contextRatePlans(string $sid): \Twilio\Rest\Preview\Wireless\RatePlanContext { + echo "ratePlans(\$sid) is deprecated. Use wireless->ratePlans(\$sid) instead."; + return $this->wireless->ratePlans($sid); + } + + /** + * @deprecated Use wireless->sims instead. + */ + protected function getSims(): \Twilio\Rest\Preview\Wireless\SimList { + echo "sims is deprecated. Use wireless->sims instead."; + return $this->wireless->sims; + } + + /** + * @deprecated Use wireless->sims(\$sid) instead. + * @param string $sid The sid + */ + protected function contextSims(string $sid): \Twilio\Rest\Preview\Wireless\SimContext { + echo "sims(\$sid) is deprecated. Use wireless->sims(\$sid) instead."; + return $this->wireless->sims($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices.php b/app/api/Twilio/Rest/Preview/DeployedDevices.php new file mode 100755 index 0000000..8c6907e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices.php @@ -0,0 +1,95 @@ +version = 'DeployedDevices'; + } + + protected function getFleets(): FleetList + { + if (!$this->_fleets) { + $this->_fleets = new FleetList($this); + } + return $this->_fleets; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateContext.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateContext.php new file mode 100755 index 0000000..40ede4e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateContext.php @@ -0,0 +1,132 @@ +solution = [ + 'fleetSid' => + $fleetSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Certificates/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CertificateInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CertificateInstance + * + * @return CertificateInstance Fetched CertificateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CertificateInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CertificateInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the CertificateInstance + * + * @param array|Options $options Optional Arguments + * @return CertificateInstance Updated CertificateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CertificateInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DeviceSid' => + $options['deviceSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CertificateInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.CertificateContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateInstance.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateInstance.php new file mode 100755 index 0000000..8e5805c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'deviceSid' => Values::array_get($payload, 'device_sid'), + 'thumbprint' => Values::array_get($payload, 'thumbprint'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['fleetSid' => $fleetSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CertificateContext Context for this CertificateInstance + */ + protected function proxy(): CertificateContext + { + if (!$this->context) { + $this->context = new CertificateContext( + $this->version, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CertificateInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CertificateInstance + * + * @return CertificateInstance Fetched CertificateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CertificateInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CertificateInstance + * + * @param array|Options $options Optional Arguments + * @return CertificateInstance Updated CertificateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CertificateInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.CertificateInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateList.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateList.php new file mode 100755 index 0000000..e650cf1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateList.php @@ -0,0 +1,208 @@ +solution = [ + 'fleetSid' => + $fleetSid, + + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Certificates'; + } + + /** + * Create the CertificateInstance + * + * @param string $certificateData Provides a URL encoded representation of the public certificate in PEM format. + * @param array|Options $options Optional Arguments + * @return CertificateInstance Created CertificateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $certificateData, array $options = []): CertificateInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CertificateData' => + $certificateData, + 'FriendlyName' => + $options['friendlyName'], + 'DeviceSid' => + $options['deviceSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CertificateInstance( + $this->version, + $payload, + $this->solution['fleetSid'] + ); + } + + + /** + * Reads CertificateInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CertificateInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CertificateInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CertificateInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CertificatePage Page of CertificateInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CertificatePage + { + $options = new Values($options); + + $params = Values::of([ + 'DeviceSid' => + $options['deviceSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CertificatePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CertificateInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CertificatePage Page of CertificateInstance + */ + public function getPage(string $targetUrl): CertificatePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CertificatePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CertificateContext + * + * @param string $sid Provides a 34 character string that uniquely identifies the requested Certificate credential resource. + */ + public function getContext( + string $sid + + ): CertificateContext + { + return new CertificateContext( + $this->version, + $this->solution['fleetSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.CertificateList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateOptions.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateOptions.php new file mode 100755 index 0000000..a649a3f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificateOptions.php @@ -0,0 +1,220 @@ +options['friendlyName'] = $friendlyName; + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Provides a human readable descriptive text for this Certificate credential, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Certificate credential, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of an existing Device to become authenticated with this Certificate credential. + * + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Certificate credential. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.CreateCertificateOptions ' . $options . ']'; + } +} + + + +class ReadCertificateOptions extends Options + { + /** + * @param string $deviceSid Filters the resulting list of Certificates by a unique string identifier of an authenticated Device. + */ + public function __construct( + + string $deviceSid = Values::NONE + + ) { + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Filters the resulting list of Certificates by a unique string identifier of an authenticated Device. + * + * @param string $deviceSid Filters the resulting list of Certificates by a unique string identifier of an authenticated Device. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.ReadCertificateOptions ' . $options . ']'; + } +} + +class UpdateCertificateOptions extends Options + { + /** + * @param string $friendlyName Provides a human readable descriptive text for this Certificate credential, up to 256 characters long. + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Certificate credential. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $deviceSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Provides a human readable descriptive text for this Certificate credential, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Certificate credential, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of an existing Device to become authenticated with this Certificate credential. + * + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Certificate credential. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.UpdateCertificateOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificatePage.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificatePage.php new file mode 100755 index 0000000..05e2401 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/CertificatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CertificateInstance \Twilio\Rest\Preview\DeployedDevices\Fleet\CertificateInstance + */ + public function buildInstance(array $payload): CertificateInstance + { + return new CertificateInstance($this->version, $payload, $this->solution['fleetSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.CertificatePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentContext.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentContext.php new file mode 100755 index 0000000..d6ee46b --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentContext.php @@ -0,0 +1,132 @@ +solution = [ + 'fleetSid' => + $fleetSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Deployments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the DeploymentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DeploymentInstance + * + * @return DeploymentInstance Fetched DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeploymentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeploymentInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the DeploymentInstance + * + * @param array|Options $options Optional Arguments + * @return DeploymentInstance Updated DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeploymentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'SyncServiceSid' => + $options['syncServiceSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DeploymentInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.DeploymentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentInstance.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentInstance.php new file mode 100755 index 0000000..855eb8b --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'syncServiceSid' => Values::array_get($payload, 'sync_service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['fleetSid' => $fleetSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeploymentContext Context for this DeploymentInstance + */ + protected function proxy(): DeploymentContext + { + if (!$this->context) { + $this->context = new DeploymentContext( + $this->version, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the DeploymentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DeploymentInstance + * + * @return DeploymentInstance Fetched DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeploymentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DeploymentInstance + * + * @param array|Options $options Optional Arguments + * @return DeploymentInstance Updated DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeploymentInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.DeploymentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentList.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentList.php new file mode 100755 index 0000000..bfc6b56 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentList.php @@ -0,0 +1,199 @@ +solution = [ + 'fleetSid' => + $fleetSid, + + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Deployments'; + } + + /** + * Create the DeploymentInstance + * + * @param array|Options $options Optional Arguments + * @return DeploymentInstance Created DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): DeploymentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'SyncServiceSid' => + $options['syncServiceSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeploymentInstance( + $this->version, + $payload, + $this->solution['fleetSid'] + ); + } + + + /** + * Reads DeploymentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeploymentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeploymentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeploymentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeploymentPage Page of DeploymentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeploymentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeploymentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeploymentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeploymentPage Page of DeploymentInstance + */ + public function getPage(string $targetUrl): DeploymentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeploymentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeploymentContext + * + * @param string $sid Provides a 34 character string that uniquely identifies the requested Deployment resource. + */ + public function getContext( + string $sid + + ): DeploymentContext + { + return new DeploymentContext( + $this->version, + $this->solution['fleetSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.DeploymentList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentOptions.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentOptions.php new file mode 100755 index 0000000..f8e2b0a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentOptions.php @@ -0,0 +1,170 @@ +options['friendlyName'] = $friendlyName; + $this->options['syncServiceSid'] = $syncServiceSid; + } + + /** + * Provides a human readable descriptive text for this Deployment, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Deployment, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of the Twilio Sync service instance that will be linked to and accessible by this Deployment. + * + * @param string $syncServiceSid Provides the unique string identifier of the Twilio Sync service instance that will be linked to and accessible by this Deployment. + * @return $this Fluent Builder + */ + public function setSyncServiceSid(string $syncServiceSid): self + { + $this->options['syncServiceSid'] = $syncServiceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.CreateDeploymentOptions ' . $options . ']'; + } +} + + + + +class UpdateDeploymentOptions extends Options + { + /** + * @param string $friendlyName Provides a human readable descriptive text for this Deployment, up to 64 characters long + * @param string $syncServiceSid Provides the unique string identifier of the Twilio Sync service instance that will be linked to and accessible by this Deployment. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $syncServiceSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['syncServiceSid'] = $syncServiceSid; + } + + /** + * Provides a human readable descriptive text for this Deployment, up to 64 characters long + * + * @param string $friendlyName Provides a human readable descriptive text for this Deployment, up to 64 characters long + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of the Twilio Sync service instance that will be linked to and accessible by this Deployment. + * + * @param string $syncServiceSid Provides the unique string identifier of the Twilio Sync service instance that will be linked to and accessible by this Deployment. + * @return $this Fluent Builder + */ + public function setSyncServiceSid(string $syncServiceSid): self + { + $this->options['syncServiceSid'] = $syncServiceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.UpdateDeploymentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentPage.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentPage.php new file mode 100755 index 0000000..2c027b8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeploymentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeploymentInstance \Twilio\Rest\Preview\DeployedDevices\Fleet\DeploymentInstance + */ + public function buildInstance(array $payload): DeploymentInstance + { + return new DeploymentInstance($this->version, $payload, $this->solution['fleetSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.DeploymentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceContext.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceContext.php new file mode 100755 index 0000000..e588ced --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceContext.php @@ -0,0 +1,137 @@ +solution = [ + 'fleetSid' => + $fleetSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Devices/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the DeviceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DeviceInstance + * + * @return DeviceInstance Fetched DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeviceInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the DeviceInstance + * + * @param array|Options $options Optional Arguments + * @return DeviceInstance Updated DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeviceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Identity' => + $options['identity'], + 'DeploymentSid' => + $options['deploymentSid'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DeviceInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.DeviceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceInstance.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceInstance.php new file mode 100755 index 0000000..6049823 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'deploymentSid' => Values::array_get($payload, 'deployment_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'dateAuthenticated' => Deserialize::dateTime(Values::array_get($payload, 'date_authenticated')), + ]; + + $this->solution = ['fleetSid' => $fleetSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeviceContext Context for this DeviceInstance + */ + protected function proxy(): DeviceContext + { + if (!$this->context) { + $this->context = new DeviceContext( + $this->version, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the DeviceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DeviceInstance + * + * @return DeviceInstance Fetched DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeviceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DeviceInstance + * + * @param array|Options $options Optional Arguments + * @return DeviceInstance Updated DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DeviceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.DeviceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceList.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceList.php new file mode 100755 index 0000000..d0b11d7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceList.php @@ -0,0 +1,212 @@ +solution = [ + 'fleetSid' => + $fleetSid, + + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Devices'; + } + + /** + * Create the DeviceInstance + * + * @param array|Options $options Optional Arguments + * @return DeviceInstance Created DeviceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): DeviceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'FriendlyName' => + $options['friendlyName'], + 'Identity' => + $options['identity'], + 'DeploymentSid' => + $options['deploymentSid'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeviceInstance( + $this->version, + $payload, + $this->solution['fleetSid'] + ); + } + + + /** + * Reads DeviceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeviceInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams DeviceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeviceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DevicePage Page of DeviceInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DevicePage + { + $options = new Values($options); + + $params = Values::of([ + 'DeploymentSid' => + $options['deploymentSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DevicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeviceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DevicePage Page of DeviceInstance + */ + public function getPage(string $targetUrl): DevicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DevicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeviceContext + * + * @param string $sid Provides a 34 character string that uniquely identifies the requested Device resource. + */ + public function getContext( + string $sid + + ): DeviceContext + { + return new DeviceContext( + $this->version, + $this->solution['fleetSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.DeviceList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceOptions.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceOptions.php new file mode 100755 index 0000000..9f4d7e2 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DeviceOptions.php @@ -0,0 +1,310 @@ +options['uniqueName'] = $uniqueName; + $this->options['friendlyName'] = $friendlyName; + $this->options['identity'] = $identity; + $this->options['deploymentSid'] = $deploymentSid; + $this->options['enabled'] = $enabled; + } + + /** + * Provides a unique and addressable name to be assigned to this Device, to be used in addition to SID, up to 128 characters long. + * + * @param string $uniqueName Provides a unique and addressable name to be assigned to this Device, to be used in addition to SID, up to 128 characters long. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provides a human readable descriptive text to be assigned to this Device, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text to be assigned to this Device, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides an arbitrary string identifier representing a human user to be associated with this Device, up to 256 characters long. + * + * @param string $identity Provides an arbitrary string identifier representing a human user to be associated with this Device, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Specifies the unique string identifier of the Deployment group that this Device is going to be associated with. + * + * @param string $deploymentSid Specifies the unique string identifier of the Deployment group that this Device is going to be associated with. + * @return $this Fluent Builder + */ + public function setDeploymentSid(string $deploymentSid): self + { + $this->options['deploymentSid'] = $deploymentSid; + return $this; + } + + /** + * + * + * @param bool $enabled + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.CreateDeviceOptions ' . $options . ']'; + } +} + + + +class ReadDeviceOptions extends Options + { + /** + * @param string $deploymentSid Filters the resulting list of Devices by a unique string identifier of the Deployment they are associated with. + */ + public function __construct( + + string $deploymentSid = Values::NONE + + ) { + $this->options['deploymentSid'] = $deploymentSid; + } + + /** + * Filters the resulting list of Devices by a unique string identifier of the Deployment they are associated with. + * + * @param string $deploymentSid Filters the resulting list of Devices by a unique string identifier of the Deployment they are associated with. + * @return $this Fluent Builder + */ + public function setDeploymentSid(string $deploymentSid): self + { + $this->options['deploymentSid'] = $deploymentSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.ReadDeviceOptions ' . $options . ']'; + } +} + +class UpdateDeviceOptions extends Options + { + /** + * @param string $friendlyName Provides a human readable descriptive text to be assigned to this Device, up to 256 characters long. + * @param string $identity Provides an arbitrary string identifier representing a human user to be associated with this Device, up to 256 characters long. + * @param string $deploymentSid Specifies the unique string identifier of the Deployment group that this Device is going to be associated with. + * @param bool $enabled + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $identity = Values::NONE, + string $deploymentSid = Values::NONE, + bool $enabled = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['identity'] = $identity; + $this->options['deploymentSid'] = $deploymentSid; + $this->options['enabled'] = $enabled; + } + + /** + * Provides a human readable descriptive text to be assigned to this Device, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text to be assigned to this Device, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides an arbitrary string identifier representing a human user to be associated with this Device, up to 256 characters long. + * + * @param string $identity Provides an arbitrary string identifier representing a human user to be associated with this Device, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Specifies the unique string identifier of the Deployment group that this Device is going to be associated with. + * + * @param string $deploymentSid Specifies the unique string identifier of the Deployment group that this Device is going to be associated with. + * @return $this Fluent Builder + */ + public function setDeploymentSid(string $deploymentSid): self + { + $this->options['deploymentSid'] = $deploymentSid; + return $this; + } + + /** + * + * + * @param bool $enabled + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.UpdateDeviceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DevicePage.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DevicePage.php new file mode 100755 index 0000000..e5831bb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/DevicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeviceInstance \Twilio\Rest\Preview\DeployedDevices\Fleet\DeviceInstance + */ + public function buildInstance(array $payload): DeviceInstance + { + return new DeviceInstance($this->version, $payload, $this->solution['fleetSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.DevicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyContext.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyContext.php new file mode 100755 index 0000000..7dc4c1e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyContext.php @@ -0,0 +1,132 @@ +solution = [ + 'fleetSid' => + $fleetSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Keys/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the KeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the KeyInstance + * + * @return KeyInstance Fetched KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): KeyInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new KeyInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the KeyInstance + * + * @param array|Options $options Optional Arguments + * @return KeyInstance Updated KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): KeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DeviceSid' => + $options['deviceSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new KeyInstance( + $this->version, + $payload, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.KeyContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyInstance.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyInstance.php new file mode 100755 index 0000000..a339e82 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'deviceSid' => Values::array_get($payload, 'device_sid'), + 'secret' => Values::array_get($payload, 'secret'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['fleetSid' => $fleetSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return KeyContext Context for this KeyInstance + */ + protected function proxy(): KeyContext + { + if (!$this->context) { + $this->context = new KeyContext( + $this->version, + $this->solution['fleetSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the KeyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the KeyInstance + * + * @return KeyInstance Fetched KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): KeyInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the KeyInstance + * + * @param array|Options $options Optional Arguments + * @return KeyInstance Updated KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): KeyInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.KeyInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyList.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyList.php new file mode 100755 index 0000000..c3cc577 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyList.php @@ -0,0 +1,205 @@ +solution = [ + 'fleetSid' => + $fleetSid, + + ]; + + $this->uri = '/Fleets/' . \rawurlencode($fleetSid) + .'/Keys'; + } + + /** + * Create the KeyInstance + * + * @param array|Options $options Optional Arguments + * @return KeyInstance Created KeyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): KeyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DeviceSid' => + $options['deviceSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new KeyInstance( + $this->version, + $payload, + $this->solution['fleetSid'] + ); + } + + + /** + * Reads KeyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return KeyInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams KeyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of KeyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return KeyPage Page of KeyInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): KeyPage + { + $options = new Values($options); + + $params = Values::of([ + 'DeviceSid' => + $options['deviceSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new KeyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of KeyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return KeyPage Page of KeyInstance + */ + public function getPage(string $targetUrl): KeyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new KeyPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a KeyContext + * + * @param string $sid Provides a 34 character string that uniquely identifies the requested Key credential resource. + */ + public function getContext( + string $sid + + ): KeyContext + { + return new KeyContext( + $this->version, + $this->solution['fleetSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.KeyList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyOptions.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyOptions.php new file mode 100755 index 0000000..effaecf --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyOptions.php @@ -0,0 +1,220 @@ +options['friendlyName'] = $friendlyName; + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Provides a human readable descriptive text for this Key credential, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Key credential, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of an existing Device to become authenticated with this Key credential. + * + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Key credential. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.CreateKeyOptions ' . $options . ']'; + } +} + + + +class ReadKeyOptions extends Options + { + /** + * @param string $deviceSid Filters the resulting list of Keys by a unique string identifier of an authenticated Device. + */ + public function __construct( + + string $deviceSid = Values::NONE + + ) { + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Filters the resulting list of Keys by a unique string identifier of an authenticated Device. + * + * @param string $deviceSid Filters the resulting list of Keys by a unique string identifier of an authenticated Device. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.ReadKeyOptions ' . $options . ']'; + } +} + +class UpdateKeyOptions extends Options + { + /** + * @param string $friendlyName Provides a human readable descriptive text for this Key credential, up to 256 characters long. + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Key credential. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $deviceSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['deviceSid'] = $deviceSid; + } + + /** + * Provides a human readable descriptive text for this Key credential, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Key credential, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides the unique string identifier of an existing Device to become authenticated with this Key credential. + * + * @param string $deviceSid Provides the unique string identifier of an existing Device to become authenticated with this Key credential. + * @return $this Fluent Builder + */ + public function setDeviceSid(string $deviceSid): self + { + $this->options['deviceSid'] = $deviceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.UpdateKeyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyPage.php b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyPage.php new file mode 100755 index 0000000..3456222 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/Fleet/KeyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return KeyInstance \Twilio\Rest\Preview\DeployedDevices\Fleet\KeyInstance + */ + public function buildInstance(array $payload): KeyInstance + { + return new KeyInstance($this->version, $payload, $this->solution['fleetSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.KeyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/FleetContext.php b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetContext.php new file mode 100755 index 0000000..b5c4f2b --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetContext.php @@ -0,0 +1,240 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FleetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FleetInstance + * + * @return FleetInstance Fetched FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FleetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FleetInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the FleetInstance + * + * @param array|Options $options Optional Arguments + * @return FleetInstance Updated FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FleetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DefaultDeploymentSid' => + $options['defaultDeploymentSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FleetInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the certificates + */ + protected function getCertificates(): CertificateList + { + if (!$this->_certificates) { + $this->_certificates = new CertificateList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_certificates; + } + + /** + * Access the devices + */ + protected function getDevices(): DeviceList + { + if (!$this->_devices) { + $this->_devices = new DeviceList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_devices; + } + + /** + * Access the keys + */ + protected function getKeys(): KeyList + { + if (!$this->_keys) { + $this->_keys = new KeyList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_keys; + } + + /** + * Access the deployments + */ + protected function getDeployments(): DeploymentList + { + if (!$this->_deployments) { + $this->_deployments = new DeploymentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_deployments; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.FleetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/FleetInstance.php b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetInstance.php new file mode 100755 index 0000000..349a1ff --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetInstance.php @@ -0,0 +1,199 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'defaultDeploymentSid' => Values::array_get($payload, 'default_deployment_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FleetContext Context for this FleetInstance + */ + protected function proxy(): FleetContext + { + if (!$this->context) { + $this->context = new FleetContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FleetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FleetInstance + * + * @return FleetInstance Fetched FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FleetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FleetInstance + * + * @param array|Options $options Optional Arguments + * @return FleetInstance Updated FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FleetInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the certificates + */ + protected function getCertificates(): CertificateList + { + return $this->proxy()->certificates; + } + + /** + * Access the devices + */ + protected function getDevices(): DeviceList + { + return $this->proxy()->devices; + } + + /** + * Access the keys + */ + protected function getKeys(): KeyList + { + return $this->proxy()->keys; + } + + /** + * Access the deployments + */ + protected function getDeployments(): DeploymentList + { + return $this->proxy()->deployments; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.DeployedDevices.FleetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/FleetList.php b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetList.php new file mode 100755 index 0000000..eb4b995 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/Fleets'; + } + + /** + * Create the FleetInstance + * + * @param array|Options $options Optional Arguments + * @return FleetInstance Created FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): FleetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FleetInstance( + $this->version, + $payload + ); + } + + + /** + * Reads FleetInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FleetInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FleetInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FleetInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FleetPage Page of FleetInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FleetPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FleetPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FleetInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FleetPage Page of FleetInstance + */ + public function getPage(string $targetUrl): FleetPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FleetPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FleetContext + * + * @param string $sid Provides a 34 character string that uniquely identifies the requested Fleet resource. + */ + public function getContext( + string $sid + + ): FleetContext + { + return new FleetContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.FleetList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/FleetOptions.php b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetOptions.php new file mode 100755 index 0000000..92d7e5d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * Provides a human readable descriptive text for this Fleet, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Fleet, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.CreateFleetOptions ' . $options . ']'; + } +} + + + + +class UpdateFleetOptions extends Options + { + /** + * @param string $friendlyName Provides a human readable descriptive text for this Fleet, up to 256 characters long. + * @param string $defaultDeploymentSid Provides a string identifier of a Deployment that is going to be used as a default one for this Fleet. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $defaultDeploymentSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['defaultDeploymentSid'] = $defaultDeploymentSid; + } + + /** + * Provides a human readable descriptive text for this Fleet, up to 256 characters long. + * + * @param string $friendlyName Provides a human readable descriptive text for this Fleet, up to 256 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides a string identifier of a Deployment that is going to be used as a default one for this Fleet. + * + * @param string $defaultDeploymentSid Provides a string identifier of a Deployment that is going to be used as a default one for this Fleet. + * @return $this Fluent Builder + */ + public function setDefaultDeploymentSid(string $defaultDeploymentSid): self + { + $this->options['defaultDeploymentSid'] = $defaultDeploymentSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.DeployedDevices.UpdateFleetOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/DeployedDevices/FleetPage.php b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetPage.php new file mode 100755 index 0000000..a187aa5 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/DeployedDevices/FleetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FleetInstance \Twilio\Rest\Preview\DeployedDevices\FleetInstance + */ + public function buildInstance(array $payload): FleetInstance + { + return new FleetInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.DeployedDevices.FleetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers.php b/app/api/Twilio/Rest/Preview/HostedNumbers.php new file mode 100755 index 0000000..19e1bd3 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers.php @@ -0,0 +1,107 @@ +version = 'HostedNumbers'; + } + + protected function getAuthorizationDocuments(): AuthorizationDocumentList + { + if (!$this->_authorizationDocuments) { + $this->_authorizationDocuments = new AuthorizationDocumentList($this); + } + return $this->_authorizationDocuments; + } + + protected function getHostedNumberOrders(): HostedNumberOrderList + { + if (!$this->_hostedNumberOrders) { + $this->_hostedNumberOrders = new HostedNumberOrderList($this); + } + return $this->_hostedNumberOrders; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderInstance.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderInstance.php new file mode 100755 index 0000000..cb085a8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'incomingPhoneNumberSid' => Values::array_get($payload, 'incoming_phone_number_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'signingDocumentSid' => Values::array_get($payload, 'signing_document_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'status' => Values::array_get($payload, 'status'), + 'failureReason' => Values::array_get($payload, 'failure_reason'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'verificationAttempts' => Values::array_get($payload, 'verification_attempts'), + 'email' => Values::array_get($payload, 'email'), + 'ccEmails' => Values::array_get($payload, 'cc_emails'), + 'verificationType' => Values::array_get($payload, 'verification_type'), + 'verificationDocumentSid' => Values::array_get($payload, 'verification_document_sid'), + 'extension' => Values::array_get($payload, 'extension'), + 'callDelay' => Values::array_get($payload, 'call_delay'), + 'verificationCode' => Values::array_get($payload, 'verification_code'), + 'verificationCallSids' => Values::array_get($payload, 'verification_call_sids'), + ]; + + $this->solution = ['signingDocumentSid' => $signingDocumentSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.DependentHostedNumberOrderInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderList.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderList.php new file mode 100755 index 0000000..5512f90 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderList.php @@ -0,0 +1,166 @@ +solution = [ + 'signingDocumentSid' => + $signingDocumentSid, + + ]; + + $this->uri = '/AuthorizationDocuments/' . \rawurlencode($signingDocumentSid) + .'/DependentHostedNumberOrders'; + } + + /** + * Reads DependentHostedNumberOrderInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DependentHostedNumberOrderInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams DependentHostedNumberOrderInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DependentHostedNumberOrderInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DependentHostedNumberOrderPage Page of DependentHostedNumberOrderInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DependentHostedNumberOrderPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'PhoneNumber' => + $options['phoneNumber'], + 'IncomingPhoneNumberSid' => + $options['incomingPhoneNumberSid'], + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DependentHostedNumberOrderPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DependentHostedNumberOrderInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DependentHostedNumberOrderPage Page of DependentHostedNumberOrderInstance + */ + public function getPage(string $targetUrl): DependentHostedNumberOrderPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DependentHostedNumberOrderPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.DependentHostedNumberOrderList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderOptions.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderOptions.php new file mode 100755 index 0000000..5b04b97 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderOptions.php @@ -0,0 +1,148 @@ +options['status'] = $status; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['incomingPhoneNumberSid'] = $incomingPhoneNumberSid; + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/api/phone-numbers/hosted-number-authorization-documents#status-values) for more information on each of these statuses. + * + * @param string $status Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/api/phone-numbers/hosted-number-authorization-documents#status-values) for more information on each of these statuses. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * An E164 formatted phone number hosted by this HostedNumberOrder. + * + * @param string $phoneNumber An E164 formatted phone number hosted by this HostedNumberOrder. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + * + * @param string $incomingPhoneNumberSid A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + * @return $this Fluent Builder + */ + public function setIncomingPhoneNumberSid(string $incomingPhoneNumberSid): self + { + $this->options['incomingPhoneNumberSid'] = $incomingPhoneNumberSid; + return $this; + } + + /** + * A human readable description of this resource, up to 64 characters. + * + * @param string $friendlyName A human readable description of this resource, up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * + * @param string $uniqueName Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.ReadDependentHostedNumberOrderOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderPage.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderPage.php new file mode 100755 index 0000000..fa42291 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocument/DependentHostedNumberOrderPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DependentHostedNumberOrderInstance \Twilio\Rest\Preview\HostedNumbers\AuthorizationDocument\DependentHostedNumberOrderInstance + */ + public function buildInstance(array $payload): DependentHostedNumberOrderInstance + { + return new DependentHostedNumberOrderInstance($this->version, $payload, $this->solution['signingDocumentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.DependentHostedNumberOrderPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentContext.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentContext.php new file mode 100755 index 0000000..87a6754 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentContext.php @@ -0,0 +1,180 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/AuthorizationDocuments/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AuthorizationDocumentInstance + * + * @return AuthorizationDocumentInstance Fetched AuthorizationDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthorizationDocumentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AuthorizationDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AuthorizationDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return AuthorizationDocumentInstance Updated AuthorizationDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AuthorizationDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'HostedNumberOrderSids' => + Serialize::map($options['hostedNumberOrderSids'], function ($e) { return $e; }), + 'AddressSid' => + $options['addressSid'], + 'Email' => + $options['email'], + 'CcEmails' => + Serialize::map($options['ccEmails'], function ($e) { return $e; }), + 'Status' => + $options['status'], + 'ContactTitle' => + $options['contactTitle'], + 'ContactPhoneNumber' => + $options['contactPhoneNumber'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AuthorizationDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the dependentHostedNumberOrders + */ + protected function getDependentHostedNumberOrders(): DependentHostedNumberOrderList + { + if (!$this->_dependentHostedNumberOrders) { + $this->_dependentHostedNumberOrders = new DependentHostedNumberOrderList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_dependentHostedNumberOrders; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.HostedNumbers.AuthorizationDocumentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentInstance.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentInstance.php new file mode 100755 index 0000000..85dbe4e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentInstance.php @@ -0,0 +1,157 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'status' => Values::array_get($payload, 'status'), + 'email' => Values::array_get($payload, 'email'), + 'ccEmails' => Values::array_get($payload, 'cc_emails'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AuthorizationDocumentContext Context for this AuthorizationDocumentInstance + */ + protected function proxy(): AuthorizationDocumentContext + { + if (!$this->context) { + $this->context = new AuthorizationDocumentContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AuthorizationDocumentInstance + * + * @return AuthorizationDocumentInstance Fetched AuthorizationDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AuthorizationDocumentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AuthorizationDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return AuthorizationDocumentInstance Updated AuthorizationDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AuthorizationDocumentInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the dependentHostedNumberOrders + */ + protected function getDependentHostedNumberOrders(): DependentHostedNumberOrderList + { + return $this->proxy()->dependentHostedNumberOrders; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.HostedNumbers.AuthorizationDocumentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentList.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentList.php new file mode 100755 index 0000000..74ca1f7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentList.php @@ -0,0 +1,213 @@ +solution = [ + ]; + + $this->uri = '/AuthorizationDocuments'; + } + + /** + * Create the AuthorizationDocumentInstance + * + * @param string[] $hostedNumberOrderSids A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + * @param string $addressSid A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + * @param string $email Email that this AuthorizationDocument will be sent to for signing. + * @param string $contactTitle The title of the person authorized to sign the Authorization Document for this phone number. + * @param string $contactPhoneNumber The contact phone number of the person authorized to sign the Authorization Document. + * @param array|Options $options Optional Arguments + * @return AuthorizationDocumentInstance Created AuthorizationDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $hostedNumberOrderSids, string $addressSid, string $email, string $contactTitle, string $contactPhoneNumber, array $options = []): AuthorizationDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'HostedNumberOrderSids' => + Serialize::map($hostedNumberOrderSids,function ($e) { return $e; }), + 'AddressSid' => + $addressSid, + 'Email' => + $email, + 'ContactTitle' => + $contactTitle, + 'ContactPhoneNumber' => + $contactPhoneNumber, + 'CcEmails' => + Serialize::map($options['ccEmails'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AuthorizationDocumentInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AuthorizationDocumentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AuthorizationDocumentInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams AuthorizationDocumentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AuthorizationDocumentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AuthorizationDocumentPage Page of AuthorizationDocumentInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AuthorizationDocumentPage + { + $options = new Values($options); + + $params = Values::of([ + 'Email' => + $options['email'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AuthorizationDocumentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AuthorizationDocumentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AuthorizationDocumentPage Page of AuthorizationDocumentInstance + */ + public function getPage(string $targetUrl): AuthorizationDocumentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AuthorizationDocumentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AuthorizationDocumentContext + * + * @param string $sid A 34 character string that uniquely identifies this AuthorizationDocument. + */ + public function getContext( + string $sid + + ): AuthorizationDocumentContext + { + return new AuthorizationDocumentContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.AuthorizationDocumentList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentOptions.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentOptions.php new file mode 100755 index 0000000..f0c7e93 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentOptions.php @@ -0,0 +1,306 @@ +options['ccEmails'] = $ccEmails; + } + + /** + * Email recipients who will be informed when an Authorization Document has been sent and signed. + * + * @param string[] $ccEmails Email recipients who will be informed when an Authorization Document has been sent and signed. + * @return $this Fluent Builder + */ + public function setCcEmails(array $ccEmails): self + { + $this->options['ccEmails'] = $ccEmails; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.CreateAuthorizationDocumentOptions ' . $options . ']'; + } +} + + +class ReadAuthorizationDocumentOptions extends Options + { + /** + * @param string $email Email that this AuthorizationDocument will be sent to for signing. + * @param string $status Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/api/phone-numbers/hosted-number-authorization-documents#status-values) for more information on each of these statuses. + */ + public function __construct( + + string $email = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['email'] = $email; + $this->options['status'] = $status; + } + + /** + * Email that this AuthorizationDocument will be sent to for signing. + * + * @param string $email Email that this AuthorizationDocument will be sent to for signing. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/api/phone-numbers/hosted-number-authorization-documents#status-values) for more information on each of these statuses. + * + * @param string $status Status of an instance resource. It can hold one of the values: 1. opened 2. signing, 3. signed LOA, 4. canceled, 5. failed. See the section entitled [Status Values](https://www.twilio.com/docs/api/phone-numbers/hosted-number-authorization-documents#status-values) for more information on each of these statuses. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.ReadAuthorizationDocumentOptions ' . $options . ']'; + } +} + +class UpdateAuthorizationDocumentOptions extends Options + { + /** + * @param string[] $hostedNumberOrderSids A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + * @param string $addressSid A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + * @param string $email Email that this AuthorizationDocument will be sent to for signing. + * @param string[] $ccEmails Email recipients who will be informed when an Authorization Document has been sent and signed + * @param string $status + * @param string $contactTitle The title of the person authorized to sign the Authorization Document for this phone number. + * @param string $contactPhoneNumber The contact phone number of the person authorized to sign the Authorization Document. + */ + public function __construct( + + array $hostedNumberOrderSids = Values::ARRAY_NONE, + string $addressSid = Values::NONE, + string $email = Values::NONE, + array $ccEmails = Values::ARRAY_NONE, + string $status = Values::NONE, + string $contactTitle = Values::NONE, + string $contactPhoneNumber = Values::NONE + + ) { + $this->options['hostedNumberOrderSids'] = $hostedNumberOrderSids; + $this->options['addressSid'] = $addressSid; + $this->options['email'] = $email; + $this->options['ccEmails'] = $ccEmails; + $this->options['status'] = $status; + $this->options['contactTitle'] = $contactTitle; + $this->options['contactPhoneNumber'] = $contactPhoneNumber; + } + + /** + * A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + * + * @param string[] $hostedNumberOrderSids A list of HostedNumberOrder sids that this AuthorizationDocument will authorize for hosting phone number capabilities on Twilio's platform. + * @return $this Fluent Builder + */ + public function setHostedNumberOrderSids(array $hostedNumberOrderSids): self + { + $this->options['hostedNumberOrderSids'] = $hostedNumberOrderSids; + return $this; + } + + /** + * A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + * + * @param string $addressSid A 34 character string that uniquely identifies the Address resource that is associated with this AuthorizationDocument. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * Email that this AuthorizationDocument will be sent to for signing. + * + * @param string $email Email that this AuthorizationDocument will be sent to for signing. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Email recipients who will be informed when an Authorization Document has been sent and signed + * + * @param string[] $ccEmails Email recipients who will be informed when an Authorization Document has been sent and signed + * @return $this Fluent Builder + */ + public function setCcEmails(array $ccEmails): self + { + $this->options['ccEmails'] = $ccEmails; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The title of the person authorized to sign the Authorization Document for this phone number. + * + * @param string $contactTitle The title of the person authorized to sign the Authorization Document for this phone number. + * @return $this Fluent Builder + */ + public function setContactTitle(string $contactTitle): self + { + $this->options['contactTitle'] = $contactTitle; + return $this; + } + + /** + * The contact phone number of the person authorized to sign the Authorization Document. + * + * @param string $contactPhoneNumber The contact phone number of the person authorized to sign the Authorization Document. + * @return $this Fluent Builder + */ + public function setContactPhoneNumber(string $contactPhoneNumber): self + { + $this->options['contactPhoneNumber'] = $contactPhoneNumber; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.UpdateAuthorizationDocumentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentPage.php b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentPage.php new file mode 100755 index 0000000..39a5af8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/AuthorizationDocumentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AuthorizationDocumentInstance \Twilio\Rest\Preview\HostedNumbers\AuthorizationDocumentInstance + */ + public function buildInstance(array $payload): AuthorizationDocumentInstance + { + return new AuthorizationDocumentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.AuthorizationDocumentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderContext.php b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderContext.php new file mode 100755 index 0000000..752b309 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderContext.php @@ -0,0 +1,142 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/HostedNumberOrders/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the HostedNumberOrderInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the HostedNumberOrderInstance + * + * @return HostedNumberOrderInstance Fetched HostedNumberOrderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): HostedNumberOrderInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new HostedNumberOrderInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the HostedNumberOrderInstance + * + * @param array|Options $options Optional Arguments + * @return HostedNumberOrderInstance Updated HostedNumberOrderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): HostedNumberOrderInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Email' => + $options['email'], + 'CcEmails' => + Serialize::map($options['ccEmails'], function ($e) { return $e; }), + 'Status' => + $options['status'], + 'VerificationCode' => + $options['verificationCode'], + 'VerificationType' => + $options['verificationType'], + 'VerificationDocumentSid' => + $options['verificationDocumentSid'], + 'Extension' => + $options['extension'], + 'CallDelay' => + $options['callDelay'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new HostedNumberOrderInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.HostedNumbers.HostedNumberOrderContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderInstance.php b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderInstance.php new file mode 100755 index 0000000..489e068 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderInstance.php @@ -0,0 +1,187 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'incomingPhoneNumberSid' => Values::array_get($payload, 'incoming_phone_number_sid'), + 'addressSid' => Values::array_get($payload, 'address_sid'), + 'signingDocumentSid' => Values::array_get($payload, 'signing_document_sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'status' => Values::array_get($payload, 'status'), + 'failureReason' => Values::array_get($payload, 'failure_reason'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'verificationAttempts' => Values::array_get($payload, 'verification_attempts'), + 'email' => Values::array_get($payload, 'email'), + 'ccEmails' => Values::array_get($payload, 'cc_emails'), + 'url' => Values::array_get($payload, 'url'), + 'verificationType' => Values::array_get($payload, 'verification_type'), + 'verificationDocumentSid' => Values::array_get($payload, 'verification_document_sid'), + 'extension' => Values::array_get($payload, 'extension'), + 'callDelay' => Values::array_get($payload, 'call_delay'), + 'verificationCode' => Values::array_get($payload, 'verification_code'), + 'verificationCallSids' => Values::array_get($payload, 'verification_call_sids'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return HostedNumberOrderContext Context for this HostedNumberOrderInstance + */ + protected function proxy(): HostedNumberOrderContext + { + if (!$this->context) { + $this->context = new HostedNumberOrderContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the HostedNumberOrderInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the HostedNumberOrderInstance + * + * @return HostedNumberOrderInstance Fetched HostedNumberOrderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): HostedNumberOrderInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the HostedNumberOrderInstance + * + * @param array|Options $options Optional Arguments + * @return HostedNumberOrderInstance Updated HostedNumberOrderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): HostedNumberOrderInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.HostedNumbers.HostedNumberOrderInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderList.php b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderList.php new file mode 100755 index 0000000..bd68626 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderList.php @@ -0,0 +1,238 @@ +solution = [ + ]; + + $this->uri = '/HostedNumberOrders'; + } + + /** + * Create the HostedNumberOrderInstance + * + * @param string $phoneNumber The number to host in [+E.164](https://en.wikipedia.org/wiki/E.164) format + * @param bool $smsCapability Used to specify that the SMS capability will be hosted on Twilio's platform. + * @param array|Options $options Optional Arguments + * @return HostedNumberOrderInstance Created HostedNumberOrderInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber, bool $smsCapability, array $options = []): HostedNumberOrderInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + 'SmsCapability' => + Serialize::booleanToString($smsCapability), + 'AccountSid' => + $options['accountSid'], + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'CcEmails' => + Serialize::map($options['ccEmails'], function ($e) { return $e; }), + 'SmsUrl' => + $options['smsUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'StatusCallbackUrl' => + $options['statusCallbackUrl'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'SmsApplicationSid' => + $options['smsApplicationSid'], + 'AddressSid' => + $options['addressSid'], + 'Email' => + $options['email'], + 'VerificationType' => + $options['verificationType'], + 'VerificationDocumentSid' => + $options['verificationDocumentSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new HostedNumberOrderInstance( + $this->version, + $payload + ); + } + + + /** + * Reads HostedNumberOrderInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return HostedNumberOrderInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams HostedNumberOrderInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of HostedNumberOrderInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return HostedNumberOrderPage Page of HostedNumberOrderInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): HostedNumberOrderPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'PhoneNumber' => + $options['phoneNumber'], + 'IncomingPhoneNumberSid' => + $options['incomingPhoneNumberSid'], + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new HostedNumberOrderPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of HostedNumberOrderInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return HostedNumberOrderPage Page of HostedNumberOrderInstance + */ + public function getPage(string $targetUrl): HostedNumberOrderPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new HostedNumberOrderPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a HostedNumberOrderContext + * + * @param string $sid A 34 character string that uniquely identifies this HostedNumberOrder. + */ + public function getContext( + string $sid + + ): HostedNumberOrderContext + { + return new HostedNumberOrderContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.HostedNumberOrderList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderOptions.php b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderOptions.php new file mode 100755 index 0000000..e2113f6 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderOptions.php @@ -0,0 +1,664 @@ +options['accountSid'] = $accountSid; + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['ccEmails'] = $ccEmails; + $this->options['smsUrl'] = $smsUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['smsApplicationSid'] = $smsApplicationSid; + $this->options['addressSid'] = $addressSid; + $this->options['email'] = $email; + $this->options['verificationType'] = $verificationType; + $this->options['verificationDocumentSid'] = $verificationDocumentSid; + } + + /** + * This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + * + * @param string $accountSid This defaults to the AccountSid of the authorization the user is using. This can be provided to specify a subaccount to add the HostedNumberOrder to. + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * A 64 character string that is a human readable text that describes this resource. + * + * @param string $friendlyName A 64 character string that is a human readable text that describes this resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Optional. Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * + * @param string $uniqueName Optional. Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + * + * @param string[] $ccEmails Optional. A list of emails that the LOA document for this HostedNumberOrder will be carbon copied to. + * @return $this Fluent Builder + */ + public function setCcEmails(array $ccEmails): self + { + $this->options['ccEmails'] = $ccEmails; + return $this; + } + + /** + * The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + * + * @param string $smsUrl The URL that Twilio should request when somebody sends an SMS to the phone number. This will be copied onto the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + * + * @param string $smsMethod The HTTP method that should be used to request the SmsUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + * + * @param string $smsFallbackUrl A URL that Twilio will request if an error occurs requesting or executing the TwiML defined by SmsUrl. This will be copied onto the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + * + * @param string $smsFallbackMethod The HTTP method that should be used to request the SmsFallbackUrl. Must be either `GET` or `POST`. This will be copied onto the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + * + * @param string $statusCallbackUrl Optional. The Status Callback URL attached to the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setStatusCallbackUrl(string $statusCallbackUrl): self + { + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + return $this; + } + + /** + * Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + * + * @param string $statusCallbackMethod Optional. The Status Callback Method attached to the IncomingPhoneNumber resource. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + * + * @param string $smsApplicationSid Optional. The 34 character sid of the application Twilio should use to handle SMS messages sent to this number. If a `SmsApplicationSid` is present, Twilio will ignore all of the SMS urls above and use those set on the application. + * @return $this Fluent Builder + */ + public function setSmsApplicationSid(string $smsApplicationSid): self + { + $this->options['smsApplicationSid'] = $smsApplicationSid; + return $this; + } + + /** + * Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + * + * @param string $addressSid Optional. A 34 character string that uniquely identifies the Address resource that represents the address of the owner of this phone number. + * @return $this Fluent Builder + */ + public function setAddressSid(string $addressSid): self + { + $this->options['addressSid'] = $addressSid; + return $this; + } + + /** + * Optional. Email of the owner of this phone number that is being hosted. + * + * @param string $email Optional. Email of the owner of this phone number that is being hosted. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * @param string $verificationType + * @return $this Fluent Builder + */ + public function setVerificationType(string $verificationType): self + { + $this->options['verificationType'] = $verificationType; + return $this; + } + + /** + * Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + * + * @param string $verificationDocumentSid Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + * @return $this Fluent Builder + */ + public function setVerificationDocumentSid(string $verificationDocumentSid): self + { + $this->options['verificationDocumentSid'] = $verificationDocumentSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.CreateHostedNumberOrderOptions ' . $options . ']'; + } +} + + + +class ReadHostedNumberOrderOptions extends Options + { + /** + * @param string $status The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + * @param string $phoneNumber An E164 formatted phone number hosted by this HostedNumberOrder. + * @param string $incomingPhoneNumberSid A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + * @param string $friendlyName A human readable description of this resource, up to 64 characters. + * @param string $uniqueName Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + */ + public function __construct( + + string $status = Values::NONE, + string $phoneNumber = Values::NONE, + string $incomingPhoneNumberSid = Values::NONE, + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['incomingPhoneNumberSid'] = $incomingPhoneNumberSid; + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + * + * @param string $status The Status of this HostedNumberOrder. One of `received`, `pending-verification`, `verified`, `pending-loa`, `carrier-processing`, `testing`, `completed`, `failed`, or `action-required`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * An E164 formatted phone number hosted by this HostedNumberOrder. + * + * @param string $phoneNumber An E164 formatted phone number hosted by this HostedNumberOrder. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + * + * @param string $incomingPhoneNumberSid A 34 character string that uniquely identifies the IncomingPhoneNumber resource created by this HostedNumberOrder. + * @return $this Fluent Builder + */ + public function setIncomingPhoneNumberSid(string $incomingPhoneNumberSid): self + { + $this->options['incomingPhoneNumberSid'] = $incomingPhoneNumberSid; + return $this; + } + + /** + * A human readable description of this resource, up to 64 characters. + * + * @param string $friendlyName A human readable description of this resource, up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * + * @param string $uniqueName Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.ReadHostedNumberOrderOptions ' . $options . ']'; + } +} + +class UpdateHostedNumberOrderOptions extends Options + { + /** + * @param string $friendlyName A 64 character string that is a human readable text that describes this resource. + * @param string $uniqueName Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * @param string $email Email of the owner of this phone number that is being hosted. + * @param string[] $ccEmails Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + * @param string $status + * @param string $verificationCode A verification code that is given to the user via a phone call to the phone number that is being hosted. + * @param string $verificationType + * @param string $verificationDocumentSid Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + * @param string $extension Digits to dial after connecting the verification call. + * @param int $callDelay The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + string $email = Values::NONE, + array $ccEmails = Values::ARRAY_NONE, + string $status = Values::NONE, + string $verificationCode = Values::NONE, + string $verificationType = Values::NONE, + string $verificationDocumentSid = Values::NONE, + string $extension = Values::NONE, + int $callDelay = Values::INT_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['email'] = $email; + $this->options['ccEmails'] = $ccEmails; + $this->options['status'] = $status; + $this->options['verificationCode'] = $verificationCode; + $this->options['verificationType'] = $verificationType; + $this->options['verificationDocumentSid'] = $verificationDocumentSid; + $this->options['extension'] = $extension; + $this->options['callDelay'] = $callDelay; + } + + /** + * A 64 character string that is a human readable text that describes this resource. + * + * @param string $friendlyName A 64 character string that is a human readable text that describes this resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * + * @param string $uniqueName Provides a unique and addressable name to be assigned to this HostedNumberOrder, assigned by the developer, to be optionally used in addition to SID. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Email of the owner of this phone number that is being hosted. + * + * @param string $email Email of the owner of this phone number that is being hosted. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + * + * @param string[] $ccEmails Optional. A list of emails that LOA document for this HostedNumberOrder will be carbon copied to. + * @return $this Fluent Builder + */ + public function setCcEmails(array $ccEmails): self + { + $this->options['ccEmails'] = $ccEmails; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * A verification code that is given to the user via a phone call to the phone number that is being hosted. + * + * @param string $verificationCode A verification code that is given to the user via a phone call to the phone number that is being hosted. + * @return $this Fluent Builder + */ + public function setVerificationCode(string $verificationCode): self + { + $this->options['verificationCode'] = $verificationCode; + return $this; + } + + /** + * @param string $verificationType + * @return $this Fluent Builder + */ + public function setVerificationType(string $verificationType): self + { + $this->options['verificationType'] = $verificationType; + return $this; + } + + /** + * Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + * + * @param string $verificationDocumentSid Optional. The unique sid identifier of the Identity Document that represents the document for verifying ownership of the number to be hosted. Required when VerificationType is phone-bill. + * @return $this Fluent Builder + */ + public function setVerificationDocumentSid(string $verificationDocumentSid): self + { + $this->options['verificationDocumentSid'] = $verificationDocumentSid; + return $this; + } + + /** + * Digits to dial after connecting the verification call. + * + * @param string $extension Digits to dial after connecting the verification call. + * @return $this Fluent Builder + */ + public function setExtension(string $extension): self + { + $this->options['extension'] = $extension; + return $this; + } + + /** + * The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + * + * @param int $callDelay The number of seconds, between 0 and 60, to delay before initiating the verification call. Defaults to 0. + * @return $this Fluent Builder + */ + public function setCallDelay(int $callDelay): self + { + $this->options['callDelay'] = $callDelay; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.HostedNumbers.UpdateHostedNumberOrderOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderPage.php b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderPage.php new file mode 100755 index 0000000..0a7bd87 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/HostedNumbers/HostedNumberOrderPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return HostedNumberOrderInstance \Twilio\Rest\Preview\HostedNumbers\HostedNumberOrderInstance + */ + public function buildInstance(array $payload): HostedNumberOrderInstance + { + return new HostedNumberOrderInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.HostedNumbers.HostedNumberOrderPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace.php b/app/api/Twilio/Rest/Preview/Marketplace.php new file mode 100755 index 0000000..e4e9689 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace.php @@ -0,0 +1,107 @@ +version = 'marketplace'; + } + + protected function getAvailableAddOns(): AvailableAddOnList + { + if (!$this->_availableAddOns) { + $this->_availableAddOns = new AvailableAddOnList($this); + } + return $this->_availableAddOns; + } + + protected function getInstalledAddOns(): InstalledAddOnList + { + if (!$this->_installedAddOns) { + $this->_installedAddOns = new InstalledAddOnList($this); + } + return $this->_installedAddOns; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionContext.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionContext.php new file mode 100755 index 0000000..035d39c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionContext.php @@ -0,0 +1,87 @@ +solution = [ + 'availableAddOnSid' => + $availableAddOnSid, + 'sid' => + $sid, + ]; + + $this->uri = '/AvailableAddOns/' . \rawurlencode($availableAddOnSid) + .'/Extensions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AvailableAddOnExtensionInstance + * + * @return AvailableAddOnExtensionInstance Fetched AvailableAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailableAddOnExtensionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AvailableAddOnExtensionInstance( + $this->version, + $payload, + $this->solution['availableAddOnSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.AvailableAddOnExtensionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionInstance.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionInstance.php new file mode 100755 index 0000000..568b24c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'availableAddOnSid' => Values::array_get($payload, 'available_add_on_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'productName' => Values::array_get($payload, 'product_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['availableAddOnSid' => $availableAddOnSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AvailableAddOnExtensionContext Context for this AvailableAddOnExtensionInstance + */ + protected function proxy(): AvailableAddOnExtensionContext + { + if (!$this->context) { + $this->context = new AvailableAddOnExtensionContext( + $this->version, + $this->solution['availableAddOnSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AvailableAddOnExtensionInstance + * + * @return AvailableAddOnExtensionInstance Fetched AvailableAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailableAddOnExtensionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.AvailableAddOnExtensionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionList.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionList.php new file mode 100755 index 0000000..3199859 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionList.php @@ -0,0 +1,168 @@ +solution = [ + 'availableAddOnSid' => + $availableAddOnSid, + + ]; + + $this->uri = '/AvailableAddOns/' . \rawurlencode($availableAddOnSid) + .'/Extensions'; + } + + /** + * Reads AvailableAddOnExtensionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AvailableAddOnExtensionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AvailableAddOnExtensionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AvailableAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AvailableAddOnExtensionPage Page of AvailableAddOnExtensionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AvailableAddOnExtensionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AvailableAddOnExtensionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AvailableAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AvailableAddOnExtensionPage Page of AvailableAddOnExtensionInstance + */ + public function getPage(string $targetUrl): AvailableAddOnExtensionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AvailableAddOnExtensionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AvailableAddOnExtensionContext + * + * @param string $sid The SID of the AvailableAddOn Extension resource to fetch. + */ + public function getContext( + string $sid + + ): AvailableAddOnExtensionContext + { + return new AvailableAddOnExtensionContext( + $this->version, + $this->solution['availableAddOnSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.AvailableAddOnExtensionList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionPage.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionPage.php new file mode 100755 index 0000000..6637620 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOn/AvailableAddOnExtensionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AvailableAddOnExtensionInstance \Twilio\Rest\Preview\Marketplace\AvailableAddOn\AvailableAddOnExtensionInstance + */ + public function buildInstance(array $payload): AvailableAddOnExtensionInstance + { + return new AvailableAddOnExtensionInstance($this->version, $payload, $this->solution['availableAddOnSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.AvailableAddOnExtensionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnContext.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnContext.php new file mode 100755 index 0000000..3d010a5 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnContext.php @@ -0,0 +1,139 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/AvailableAddOns/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AvailableAddOnInstance + * + * @return AvailableAddOnInstance Fetched AvailableAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailableAddOnInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AvailableAddOnInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the extensions + */ + protected function getExtensions(): AvailableAddOnExtensionList + { + if (!$this->_extensions) { + $this->_extensions = new AvailableAddOnExtensionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_extensions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.AvailableAddOnContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnInstance.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnInstance.php new file mode 100755 index 0000000..4bc33ef --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnInstance.php @@ -0,0 +1,138 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'description' => Values::array_get($payload, 'description'), + 'pricingType' => Values::array_get($payload, 'pricing_type'), + 'configurationSchema' => Values::array_get($payload, 'configuration_schema'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AvailableAddOnContext Context for this AvailableAddOnInstance + */ + protected function proxy(): AvailableAddOnContext + { + if (!$this->context) { + $this->context = new AvailableAddOnContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AvailableAddOnInstance + * + * @return AvailableAddOnInstance Fetched AvailableAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AvailableAddOnInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the extensions + */ + protected function getExtensions(): AvailableAddOnExtensionList + { + return $this->proxy()->extensions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.AvailableAddOnInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnList.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnList.php new file mode 100755 index 0000000..703dd78 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/AvailableAddOns'; + } + + /** + * Reads AvailableAddOnInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AvailableAddOnInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AvailableAddOnInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AvailableAddOnInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AvailableAddOnPage Page of AvailableAddOnInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AvailableAddOnPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AvailableAddOnPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AvailableAddOnInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AvailableAddOnPage Page of AvailableAddOnInstance + */ + public function getPage(string $targetUrl): AvailableAddOnPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AvailableAddOnPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AvailableAddOnContext + * + * @param string $sid The SID of the AvailableAddOn resource to fetch. + */ + public function getContext( + string $sid + + ): AvailableAddOnContext + { + return new AvailableAddOnContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.AvailableAddOnList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnPage.php b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnPage.php new file mode 100755 index 0000000..9f41e71 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/AvailableAddOnPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AvailableAddOnInstance \Twilio\Rest\Preview\Marketplace\AvailableAddOnInstance + */ + public function buildInstance(array $payload): AvailableAddOnInstance + { + return new AvailableAddOnInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.AvailableAddOnPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionContext.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionContext.php new file mode 100755 index 0000000..7c909cb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionContext.php @@ -0,0 +1,115 @@ +solution = [ + 'installedAddOnSid' => + $installedAddOnSid, + 'sid' => + $sid, + ]; + + $this->uri = '/InstalledAddOns/' . \rawurlencode($installedAddOnSid) + .'/Extensions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the InstalledAddOnExtensionInstance + * + * @return InstalledAddOnExtensionInstance Fetched InstalledAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InstalledAddOnExtensionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InstalledAddOnExtensionInstance( + $this->version, + $payload, + $this->solution['installedAddOnSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the InstalledAddOnExtensionInstance + * + * @param bool $enabled Whether the Extension should be invoked. + * @return InstalledAddOnExtensionInstance Updated InstalledAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $enabled): InstalledAddOnExtensionInstance + { + + $data = Values::of([ + 'Enabled' => + Serialize::booleanToString($enabled), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new InstalledAddOnExtensionInstance( + $this->version, + $payload, + $this->solution['installedAddOnSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.InstalledAddOnExtensionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionInstance.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionInstance.php new file mode 100755 index 0000000..143ee8f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'installedAddOnSid' => Values::array_get($payload, 'installed_add_on_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'productName' => Values::array_get($payload, 'product_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['installedAddOnSid' => $installedAddOnSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InstalledAddOnExtensionContext Context for this InstalledAddOnExtensionInstance + */ + protected function proxy(): InstalledAddOnExtensionContext + { + if (!$this->context) { + $this->context = new InstalledAddOnExtensionContext( + $this->version, + $this->solution['installedAddOnSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the InstalledAddOnExtensionInstance + * + * @return InstalledAddOnExtensionInstance Fetched InstalledAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InstalledAddOnExtensionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the InstalledAddOnExtensionInstance + * + * @param bool $enabled Whether the Extension should be invoked. + * @return InstalledAddOnExtensionInstance Updated InstalledAddOnExtensionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $enabled): InstalledAddOnExtensionInstance + { + + return $this->proxy()->update($enabled); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.InstalledAddOnExtensionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionList.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionList.php new file mode 100755 index 0000000..c705dbe --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionList.php @@ -0,0 +1,168 @@ +solution = [ + 'installedAddOnSid' => + $installedAddOnSid, + + ]; + + $this->uri = '/InstalledAddOns/' . \rawurlencode($installedAddOnSid) + .'/Extensions'; + } + + /** + * Reads InstalledAddOnExtensionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InstalledAddOnExtensionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InstalledAddOnExtensionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InstalledAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InstalledAddOnExtensionPage Page of InstalledAddOnExtensionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InstalledAddOnExtensionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InstalledAddOnExtensionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InstalledAddOnExtensionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InstalledAddOnExtensionPage Page of InstalledAddOnExtensionInstance + */ + public function getPage(string $targetUrl): InstalledAddOnExtensionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InstalledAddOnExtensionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InstalledAddOnExtensionContext + * + * @param string $sid The SID of the InstalledAddOn Extension resource to fetch. + */ + public function getContext( + string $sid + + ): InstalledAddOnExtensionContext + { + return new InstalledAddOnExtensionContext( + $this->version, + $this->solution['installedAddOnSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.InstalledAddOnExtensionList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionPage.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionPage.php new file mode 100755 index 0000000..c41f99d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOn/InstalledAddOnExtensionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InstalledAddOnExtensionInstance \Twilio\Rest\Preview\Marketplace\InstalledAddOn\InstalledAddOnExtensionInstance + */ + public function buildInstance(array $payload): InstalledAddOnExtensionInstance + { + return new InstalledAddOnExtensionInstance($this->version, $payload, $this->solution['installedAddOnSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.InstalledAddOnExtensionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnContext.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnContext.php new file mode 100755 index 0000000..6399a53 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnContext.php @@ -0,0 +1,184 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/InstalledAddOns/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InstalledAddOnInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InstalledAddOnInstance + * + * @return InstalledAddOnInstance Fetched InstalledAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InstalledAddOnInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InstalledAddOnInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the InstalledAddOnInstance + * + * @param array|Options $options Optional Arguments + * @return InstalledAddOnInstance Updated InstalledAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): InstalledAddOnInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Configuration' => + Serialize::jsonObject($options['configuration']), + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new InstalledAddOnInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the extensions + */ + protected function getExtensions(): InstalledAddOnExtensionList + { + if (!$this->_extensions) { + $this->_extensions = new InstalledAddOnExtensionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_extensions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.InstalledAddOnContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnInstance.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnInstance.php new file mode 100755 index 0000000..2d225de --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'description' => Values::array_get($payload, 'description'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InstalledAddOnContext Context for this InstalledAddOnInstance + */ + protected function proxy(): InstalledAddOnContext + { + if (!$this->context) { + $this->context = new InstalledAddOnContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InstalledAddOnInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InstalledAddOnInstance + * + * @return InstalledAddOnInstance Fetched InstalledAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InstalledAddOnInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the InstalledAddOnInstance + * + * @param array|Options $options Optional Arguments + * @return InstalledAddOnInstance Updated InstalledAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): InstalledAddOnInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the extensions + */ + protected function getExtensions(): InstalledAddOnExtensionList + { + return $this->proxy()->extensions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Marketplace.InstalledAddOnInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnList.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnList.php new file mode 100755 index 0000000..ef18cd1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnList.php @@ -0,0 +1,198 @@ +solution = [ + ]; + + $this->uri = '/InstalledAddOns'; + } + + /** + * Create the InstalledAddOnInstance + * + * @param string $availableAddOnSid The SID of the AvaliableAddOn to install. + * @param bool $acceptTermsOfService Whether the Terms of Service were accepted. + * @param array|Options $options Optional Arguments + * @return InstalledAddOnInstance Created InstalledAddOnInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $availableAddOnSid, bool $acceptTermsOfService, array $options = []): InstalledAddOnInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AvailableAddOnSid' => + $availableAddOnSid, + 'AcceptTermsOfService' => + Serialize::booleanToString($acceptTermsOfService), + 'Configuration' => + Serialize::jsonObject($options['configuration']), + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new InstalledAddOnInstance( + $this->version, + $payload + ); + } + + + /** + * Reads InstalledAddOnInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InstalledAddOnInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InstalledAddOnInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InstalledAddOnInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InstalledAddOnPage Page of InstalledAddOnInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InstalledAddOnPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InstalledAddOnPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InstalledAddOnInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InstalledAddOnPage Page of InstalledAddOnInstance + */ + public function getPage(string $targetUrl): InstalledAddOnPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InstalledAddOnPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InstalledAddOnContext + * + * @param string $sid The SID of the InstalledAddOn resource to delete. + */ + public function getContext( + string $sid + + ): InstalledAddOnContext + { + return new InstalledAddOnContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.InstalledAddOnList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnOptions.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnOptions.php new file mode 100755 index 0000000..018f23e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnOptions.php @@ -0,0 +1,170 @@ +options['configuration'] = $configuration; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * The JSON object that represents the configuration of the new Add-on being installed. + * + * @param array $configuration The JSON object that represents the configuration of the new Add-on being installed. + * @return $this Fluent Builder + */ + public function setConfiguration(array $configuration): self + { + $this->options['configuration'] = $configuration; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Marketplace.CreateInstalledAddOnOptions ' . $options . ']'; + } +} + + + + +class UpdateInstalledAddOnOptions extends Options + { + /** + * @param array $configuration Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + */ + public function __construct( + + array $configuration = Values::ARRAY_NONE, + string $uniqueName = Values::NONE + + ) { + $this->options['configuration'] = $configuration; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + * + * @param array $configuration Valid JSON object that conform to the configuration schema exposed by the associated AvailableAddOn resource. This is only required by Add-ons that need to be configured + * @return $this Fluent Builder + */ + public function setConfiguration(array $configuration): self + { + $this->options['configuration'] = $configuration; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be unique within the Account. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Marketplace.UpdateInstalledAddOnOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnPage.php b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnPage.php new file mode 100755 index 0000000..9b8cd39 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Marketplace/InstalledAddOnPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InstalledAddOnInstance \Twilio\Rest\Preview\Marketplace\InstalledAddOnInstance + */ + public function buildInstance(array $payload): InstalledAddOnInstance + { + return new InstalledAddOnInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Marketplace.InstalledAddOnPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync.php b/app/api/Twilio/Rest/Preview/Sync.php new file mode 100755 index 0000000..b2efcfe --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync.php @@ -0,0 +1,95 @@ +version = 'Sync'; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionContext.php new file mode 100755 index 0000000..06848dc --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'documentSid' => + $documentSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($documentSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the DocumentPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DocumentPermissionInstance + * + * @return DocumentPermissionInstance Fetched DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DocumentPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the DocumentPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync Document. + * @param bool $write Boolean flag specifying whether the identity can update the Sync Document. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync Document. + * @return DocumentPermissionInstance Updated DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): DocumentPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DocumentPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.DocumentPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionInstance.php new file mode 100755 index 0000000..cc92dc6 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'documentSid' => Values::array_get($payload, 'document_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'documentSid' => $documentSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DocumentPermissionContext Context for this DocumentPermissionInstance + */ + protected function proxy(): DocumentPermissionContext + { + if (!$this->context) { + $this->context = new DocumentPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the DocumentPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DocumentPermissionInstance + * + * @return DocumentPermissionInstance Fetched DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DocumentPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync Document. + * @param bool $write Boolean flag specifying whether the identity can update the Sync Document. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync Document. + * @return DocumentPermissionInstance Updated DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): DocumentPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.DocumentPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionList.php b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionList.php new file mode 100755 index 0000000..8bf0e92 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'documentSid' => + $documentSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($documentSid) + .'/Permissions'; + } + + /** + * Reads DocumentPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DocumentPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DocumentPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DocumentPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DocumentPermissionPage Page of DocumentPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DocumentPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DocumentPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DocumentPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DocumentPermissionPage Page of DocumentPermissionInstance + */ + public function getPage(string $targetUrl): DocumentPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DocumentPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DocumentPermissionContext + * + * @param string $identity Arbitrary string identifier representing a user associated with an FPA token, assigned by the developer. + */ + public function getContext( + string $identity + + ): DocumentPermissionContext + { + return new DocumentPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.DocumentPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionPage.php new file mode 100755 index 0000000..6e1409f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/Document/DocumentPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DocumentPermissionInstance \Twilio\Rest\Preview\Sync\Service\Document\DocumentPermissionInstance + */ + public function buildInstance(array $payload): DocumentPermissionInstance + { + return new DocumentPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['documentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.DocumentPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/DocumentContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentContext.php new file mode 100755 index 0000000..28b16e1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentContext.php @@ -0,0 +1,193 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the DocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DocumentInstance + * + * @return DocumentInstance Fetched DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the DocumentInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return DocumentInstance Updated DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): DocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the documentPermissions + */ + protected function getDocumentPermissions(): DocumentPermissionList + { + if (!$this->_documentPermissions) { + $this->_documentPermissions = new DocumentPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_documentPermissions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.DocumentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/DocumentInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentInstance.php new file mode 100755 index 0000000..6b8c930 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentInstance.php @@ -0,0 +1,176 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DocumentContext Context for this DocumentInstance + */ + protected function proxy(): DocumentContext + { + if (!$this->context) { + $this->context = new DocumentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the DocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DocumentInstance + * + * @return DocumentInstance Fetched DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DocumentInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return DocumentInstance Updated DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): DocumentInstance + { + + return $this->proxy()->update($data, $options); + } + + /** + * Access the documentPermissions + */ + protected function getDocumentPermissions(): DocumentPermissionList + { + return $this->proxy()->documentPermissions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.DocumentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/DocumentList.php b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentList.php new file mode 100755 index 0000000..dbdf228 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentList.php @@ -0,0 +1,200 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents'; + } + + /** + * Create the DocumentInstance + * + * @param array|Options $options Optional Arguments + * @return DocumentInstance Created DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): DocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Data' => + Serialize::jsonObject($options['data']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads DocumentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DocumentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DocumentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DocumentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DocumentPage Page of DocumentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DocumentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DocumentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DocumentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DocumentPage Page of DocumentInstance + */ + public function getPage(string $targetUrl): DocumentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DocumentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DocumentContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): DocumentContext + { + return new DocumentContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.DocumentList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/DocumentOptions.php b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentOptions.php new file mode 100755 index 0000000..a4bed4b --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentOptions.php @@ -0,0 +1,152 @@ +options['uniqueName'] = $uniqueName; + $this->options['data'] = $data; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param array $data + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.CreateDocumentOptions ' . $options . ']'; + } +} + + + + +class UpdateDocumentOptions extends Options + { + /** + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.UpdateDocumentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/DocumentPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentPage.php new file mode 100755 index 0000000..eed3804 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/DocumentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DocumentInstance \Twilio\Rest\Preview\Sync\Service\DocumentInstance + */ + public function buildInstance(array $payload): DocumentInstance + { + return new DocumentInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.DocumentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemContext.php new file mode 100755 index 0000000..2d04e4f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemContext.php @@ -0,0 +1,146 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'listSid' => + $listSid, + 'index' => + $index, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Items/' . \rawurlencode($index) + .''; + } + + /** + * Delete the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the SyncListItemInstance + * + * @return SyncListItemInstance Fetched SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListItemInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + + /** + * Update the SyncListItemInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return SyncListItemInstance Updated SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): SyncListItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListItemContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemInstance.php new file mode 100755 index 0000000..37ef8a6 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'index' => Values::array_get($payload, 'index'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'listSid' => Values::array_get($payload, 'list_sid'), + 'url' => Values::array_get($payload, 'url'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'listSid' => $listSid, 'index' => $index ?: $this->properties['index'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListItemContext Context for this SyncListItemInstance + */ + protected function proxy(): SyncListItemContext + { + if (!$this->context) { + $this->context = new SyncListItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the SyncListItemInstance + * + * @return SyncListItemInstance Fetched SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListItemInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncListItemInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return SyncListItemInstance Updated SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): SyncListItemInstance + { + + return $this->proxy()->update($data, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListItemInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemList.php new file mode 100755 index 0000000..e2dc1dc --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemList.php @@ -0,0 +1,214 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'listSid' => + $listSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Items'; + } + + /** + * Create the SyncListItemInstance + * + * @param array $data + * @return SyncListItemInstance Created SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $data): SyncListItemInstance + { + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'] + ); + } + + + /** + * Reads SyncListItemInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListItemInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SyncListItemInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListItemInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListItemPage Page of SyncListItemInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListItemPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'From' => + $options['from'], + 'Bounds' => + $options['bounds'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListItemPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListItemInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListItemPage Page of SyncListItemInstance + */ + public function getPage(string $targetUrl): SyncListItemPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListItemPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListItemContext + * + * @param int $index + */ + public function getContext( + int $index + + ): SyncListItemContext + { + return new SyncListItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $index + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListItemList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemOptions.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemOptions.php new file mode 100755 index 0000000..b08546f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemOptions.php @@ -0,0 +1,220 @@ +options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.DeleteSyncListItemOptions ' . $options . ']'; + } +} + + +class ReadSyncListItemOptions extends Options + { + /** + * @param string $order + * @param string $from + * @param string $bounds + */ + public function __construct( + + string $order = Values::NONE, + string $from = Values::NONE, + string $bounds = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['from'] = $from; + $this->options['bounds'] = $bounds; + } + + /** + * + * + * @param string $order + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * + * + * @param string $bounds + * @return $this Fluent Builder + */ + public function setBounds(string $bounds): self + { + $this->options['bounds'] = $bounds; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.ReadSyncListItemOptions ' . $options . ']'; + } +} + +class UpdateSyncListItemOptions extends Options + { + /** + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.UpdateSyncListItemOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemPage.php new file mode 100755 index 0000000..5d1579d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListItemPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListItemInstance \Twilio\Rest\Preview\Sync\Service\SyncList\SyncListItemInstance + */ + public function buildInstance(array $payload): SyncListItemInstance + { + return new SyncListItemInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['listSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListItemPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionContext.php new file mode 100755 index 0000000..e7b0520 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'listSid' => + $listSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the SyncListPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncListPermissionInstance + * + * @return SyncListPermissionInstance Fetched SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the SyncListPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync List. + * @param bool $write Boolean flag specifying whether the identity can create, update and delete Items of the Sync List. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync List. + * @return SyncListPermissionInstance Updated SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncListPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncListPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionInstance.php new file mode 100755 index 0000000..b765197 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'listSid' => Values::array_get($payload, 'list_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'listSid' => $listSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListPermissionContext Context for this SyncListPermissionInstance + */ + protected function proxy(): SyncListPermissionContext + { + if (!$this->context) { + $this->context = new SyncListPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncListPermissionInstance + * + * @return SyncListPermissionInstance Fetched SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncListPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync List. + * @param bool $write Boolean flag specifying whether the identity can create, update and delete Items of the Sync List. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync List. + * @return SyncListPermissionInstance Updated SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncListPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionList.php new file mode 100755 index 0000000..f99ca08 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'listSid' => + $listSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Permissions'; + } + + /** + * Reads SyncListPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncListPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListPermissionPage Page of SyncListPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListPermissionPage Page of SyncListPermissionInstance + */ + public function getPage(string $targetUrl): SyncListPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListPermissionContext + * + * @param string $identity Arbitrary string identifier representing a user associated with an FPA token, assigned by the developer. + */ + public function getContext( + string $identity + + ): SyncListPermissionContext + { + return new SyncListPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionPage.php new file mode 100755 index 0000000..50c4447 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncList/SyncListPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListPermissionInstance \Twilio\Rest\Preview\Sync\Service\SyncList\SyncListPermissionInstance + */ + public function buildInstance(array $payload): SyncListPermissionInstance + { + return new SyncListPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['listSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncListContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListContext.php new file mode 100755 index 0000000..14bd953 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListContext.php @@ -0,0 +1,179 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SyncListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncListInstance + * + * @return SyncListInstance Fetched SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the syncListPermissions + */ + protected function getSyncListPermissions(): SyncListPermissionList + { + if (!$this->_syncListPermissions) { + $this->_syncListPermissions = new SyncListPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncListPermissions; + } + + /** + * Access the syncListItems + */ + protected function getSyncListItems(): SyncListItemList + { + if (!$this->_syncListItems) { + $this->_syncListItems = new SyncListItemList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncListItems; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncListInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListInstance.php new file mode 100755 index 0000000..daef219 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListInstance.php @@ -0,0 +1,169 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListContext Context for this SyncListInstance + */ + protected function proxy(): SyncListContext + { + if (!$this->context) { + $this->context = new SyncListContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncListInstance + * + * @return SyncListInstance Fetched SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the syncListPermissions + */ + protected function getSyncListPermissions(): SyncListPermissionList + { + return $this->proxy()->syncListPermissions; + } + + /** + * Access the syncListItems + */ + protected function getSyncListItems(): SyncListItemList + { + return $this->proxy()->syncListItems; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncListList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListList.php new file mode 100755 index 0000000..339097d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListList.php @@ -0,0 +1,197 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists'; + } + + /** + * Create the SyncListInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListInstance Created SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SyncListInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncListInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SyncListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListPage Page of SyncListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListPage Page of SyncListInstance + */ + public function getPage(string $targetUrl): SyncListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): SyncListContext + { + return new SyncListContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncListOptions.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListOptions.php new file mode 100755 index 0000000..cd3d4b1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListOptions.php @@ -0,0 +1,82 @@ +options['uniqueName'] = $uniqueName; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.CreateSyncListOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncListPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListPage.php new file mode 100755 index 0000000..4153c9f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListInstance \Twilio\Rest\Preview\Sync\Service\SyncListInstance + */ + public function buildInstance(array $payload): SyncListInstance + { + return new SyncListInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemContext.php new file mode 100755 index 0000000..f4fb940 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemContext.php @@ -0,0 +1,146 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'mapSid' => + $mapSid, + 'key' => + $key, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Items/' . \rawurlencode($key) + .''; + } + + /** + * Delete the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the SyncMapItemInstance + * + * @return SyncMapItemInstance Fetched SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapItemInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + + /** + * Update the SyncMapItemInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return SyncMapItemInstance Updated SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): SyncMapItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapItemContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemInstance.php new file mode 100755 index 0000000..79139e8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'key' => Values::array_get($payload, 'key'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'mapSid' => Values::array_get($payload, 'map_sid'), + 'url' => Values::array_get($payload, 'url'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'mapSid' => $mapSid, 'key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapItemContext Context for this SyncMapItemInstance + */ + protected function proxy(): SyncMapItemContext + { + if (!$this->context) { + $this->context = new SyncMapItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the SyncMapItemInstance + * + * @return SyncMapItemInstance Fetched SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapItemInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncMapItemInstance + * + * @param array $data + * @param array|Options $options Optional Arguments + * @return SyncMapItemInstance Updated SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $data, array $options = []): SyncMapItemInstance + { + + return $this->proxy()->update($data, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapItemInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemList.php new file mode 100755 index 0000000..bbe64c7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemList.php @@ -0,0 +1,217 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'mapSid' => + $mapSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Items'; + } + + /** + * Create the SyncMapItemInstance + * + * @param string $key + * @param array $data + * @return SyncMapItemInstance Created SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, array $data): SyncMapItemInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Data' => + Serialize::jsonObject($data), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'] + ); + } + + + /** + * Reads SyncMapItemInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapItemInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SyncMapItemInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapItemInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapItemPage Page of SyncMapItemInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapItemPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'From' => + $options['from'], + 'Bounds' => + $options['bounds'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapItemPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapItemInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapItemPage Page of SyncMapItemInstance + */ + public function getPage(string $targetUrl): SyncMapItemPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapItemPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapItemContext + * + * @param string $key + */ + public function getContext( + string $key + + ): SyncMapItemContext + { + return new SyncMapItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapItemList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemOptions.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemOptions.php new file mode 100755 index 0000000..7b7d061 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemOptions.php @@ -0,0 +1,220 @@ +options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.DeleteSyncMapItemOptions ' . $options . ']'; + } +} + + +class ReadSyncMapItemOptions extends Options + { + /** + * @param string $order + * @param string $from + * @param string $bounds + */ + public function __construct( + + string $order = Values::NONE, + string $from = Values::NONE, + string $bounds = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['from'] = $from; + $this->options['bounds'] = $bounds; + } + + /** + * + * + * @param string $order + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * + * + * @param string $from + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * + * + * @param string $bounds + * @return $this Fluent Builder + */ + public function setBounds(string $bounds): self + { + $this->options['bounds'] = $bounds; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.ReadSyncMapItemOptions ' . $options . ']'; + } +} + +class UpdateSyncMapItemOptions extends Options + { + /** + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.UpdateSyncMapItemOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemPage.php new file mode 100755 index 0000000..07b803e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapItemPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapItemInstance \Twilio\Rest\Preview\Sync\Service\SyncMap\SyncMapItemInstance + */ + public function buildInstance(array $payload): SyncMapItemInstance + { + return new SyncMapItemInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['mapSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapItemPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionContext.php new file mode 100755 index 0000000..ba722d9 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'mapSid' => + $mapSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the SyncMapPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncMapPermissionInstance + * + * @return SyncMapPermissionInstance Fetched SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the SyncMapPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync Map. + * @param bool $write Boolean flag specifying whether the identity can create, update and delete Items of the Sync Map. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync Map. + * @return SyncMapPermissionInstance Updated SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncMapPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncMapPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionInstance.php new file mode 100755 index 0000000..11ae120 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'mapSid' => Values::array_get($payload, 'map_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'mapSid' => $mapSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapPermissionContext Context for this SyncMapPermissionInstance + */ + protected function proxy(): SyncMapPermissionContext + { + if (!$this->context) { + $this->context = new SyncMapPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncMapPermissionInstance + * + * @return SyncMapPermissionInstance Fetched SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncMapPermissionInstance + * + * @param bool $read Boolean flag specifying whether the identity can read the Sync Map. + * @param bool $write Boolean flag specifying whether the identity can create, update and delete Items of the Sync Map. + * @param bool $manage Boolean flag specifying whether the identity can delete the Sync Map. + * @return SyncMapPermissionInstance Updated SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncMapPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionList.php new file mode 100755 index 0000000..1f5b8bc --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'mapSid' => + $mapSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Permissions'; + } + + /** + * Reads SyncMapPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncMapPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapPermissionPage Page of SyncMapPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapPermissionPage Page of SyncMapPermissionInstance + */ + public function getPage(string $targetUrl): SyncMapPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapPermissionContext + * + * @param string $identity Arbitrary string identifier representing a user associated with an FPA token, assigned by the developer. + */ + public function getContext( + string $identity + + ): SyncMapPermissionContext + { + return new SyncMapPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionPage.php new file mode 100755 index 0000000..32b9a5e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMap/SyncMapPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapPermissionInstance \Twilio\Rest\Preview\Sync\Service\SyncMap\SyncMapPermissionInstance + */ + public function buildInstance(array $payload): SyncMapPermissionInstance + { + return new SyncMapPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['mapSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapContext.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapContext.php new file mode 100755 index 0000000..e35ed57 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapContext.php @@ -0,0 +1,179 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SyncMapInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncMapInstance + * + * @return SyncMapInstance Fetched SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the syncMapItems + */ + protected function getSyncMapItems(): SyncMapItemList + { + if (!$this->_syncMapItems) { + $this->_syncMapItems = new SyncMapItemList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncMapItems; + } + + /** + * Access the syncMapPermissions + */ + protected function getSyncMapPermissions(): SyncMapPermissionList + { + if (!$this->_syncMapPermissions) { + $this->_syncMapPermissions = new SyncMapPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncMapPermissions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapInstance.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapInstance.php new file mode 100755 index 0000000..9ef6196 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapInstance.php @@ -0,0 +1,169 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapContext Context for this SyncMapInstance + */ + protected function proxy(): SyncMapContext + { + if (!$this->context) { + $this->context = new SyncMapContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncMapInstance + * + * @return SyncMapInstance Fetched SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the syncMapItems + */ + protected function getSyncMapItems(): SyncMapItemList + { + return $this->proxy()->syncMapItems; + } + + /** + * Access the syncMapPermissions + */ + protected function getSyncMapPermissions(): SyncMapPermissionList + { + return $this->proxy()->syncMapPermissions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.SyncMapInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapList.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapList.php new file mode 100755 index 0000000..7702661 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapList.php @@ -0,0 +1,197 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps'; + } + + /** + * Create the SyncMapInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapInstance Created SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SyncMapInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncMapInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SyncMapInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncMapInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapPage Page of SyncMapInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapPage Page of SyncMapInstance + */ + public function getPage(string $targetUrl): SyncMapPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): SyncMapContext + { + return new SyncMapContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapOptions.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapOptions.php new file mode 100755 index 0000000..4980d2c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapOptions.php @@ -0,0 +1,82 @@ +options['uniqueName'] = $uniqueName; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.CreateSyncMapOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapPage.php b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapPage.php new file mode 100755 index 0000000..9bab77f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/Service/SyncMapPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapInstance \Twilio\Rest\Preview\Sync\Service\SyncMapInstance + */ + public function buildInstance(array $payload): SyncMapInstance + { + return new SyncMapInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.SyncMapPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/ServiceContext.php b/app/api/Twilio/Rest/Preview/Sync/ServiceContext.php new file mode 100755 index 0000000..d9e0d9a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/ServiceContext.php @@ -0,0 +1,226 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'WebhookUrl' => + $options['webhookUrl'], + 'FriendlyName' => + $options['friendlyName'], + 'ReachabilityWebhooksEnabled' => + Serialize::booleanToString($options['reachabilityWebhooksEnabled']), + 'AclEnabled' => + Serialize::booleanToString($options['aclEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the syncLists + */ + protected function getSyncLists(): SyncListList + { + if (!$this->_syncLists) { + $this->_syncLists = new SyncListList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_syncLists; + } + + /** + * Access the documents + */ + protected function getDocuments(): DocumentList + { + if (!$this->_documents) { + $this->_documents = new DocumentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_documents; + } + + /** + * Access the syncMaps + */ + protected function getSyncMaps(): SyncMapList + { + if (!$this->_syncMaps) { + $this->_syncMaps = new SyncMapList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_syncMaps; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/ServiceInstance.php b/app/api/Twilio/Rest/Preview/Sync/ServiceInstance.php new file mode 100755 index 0000000..f03f563 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/ServiceInstance.php @@ -0,0 +1,191 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'reachabilityWebhooksEnabled' => Values::array_get($payload, 'reachability_webhooks_enabled'), + 'aclEnabled' => Values::array_get($payload, 'acl_enabled'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the syncLists + */ + protected function getSyncLists(): SyncListList + { + return $this->proxy()->syncLists; + } + + /** + * Access the documents + */ + protected function getDocuments(): DocumentList + { + return $this->proxy()->documents; + } + + /** + * Access the syncMaps + */ + protected function getSyncMaps(): SyncMapList + { + return $this->proxy()->syncMaps; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Sync.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/ServiceList.php b/app/api/Twilio/Rest/Preview/Sync/ServiceList.php new file mode 100755 index 0000000..a3bea4a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/ServiceList.php @@ -0,0 +1,196 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'WebhookUrl' => + $options['webhookUrl'], + 'ReachabilityWebhooksEnabled' => + Serialize::booleanToString($options['reachabilityWebhooksEnabled']), + 'AclEnabled' => + Serialize::booleanToString($options['aclEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Sync/ServiceOptions.php b/app/api/Twilio/Rest/Preview/Sync/ServiceOptions.php new file mode 100755 index 0000000..b637e22 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/ServiceOptions.php @@ -0,0 +1,242 @@ +options['friendlyName'] = $friendlyName; + $this->options['webhookUrl'] = $webhookUrl; + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + $this->options['aclEnabled'] = $aclEnabled; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $webhookUrl + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * + * + * @param bool $reachabilityWebhooksEnabled + * @return $this Fluent Builder + */ + public function setReachabilityWebhooksEnabled(bool $reachabilityWebhooksEnabled): self + { + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + return $this; + } + + /** + * + * + * @param bool $aclEnabled + * @return $this Fluent Builder + */ + public function setAclEnabled(bool $aclEnabled): self + { + $this->options['aclEnabled'] = $aclEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param string $webhookUrl + * @param string $friendlyName + * @param bool $reachabilityWebhooksEnabled + * @param bool $aclEnabled + */ + public function __construct( + + string $webhookUrl = Values::NONE, + string $friendlyName = Values::NONE, + bool $reachabilityWebhooksEnabled = Values::BOOL_NONE, + bool $aclEnabled = Values::BOOL_NONE + + ) { + $this->options['webhookUrl'] = $webhookUrl; + $this->options['friendlyName'] = $friendlyName; + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + $this->options['aclEnabled'] = $aclEnabled; + } + + /** + * + * + * @param string $webhookUrl + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param bool $reachabilityWebhooksEnabled + * @return $this Fluent Builder + */ + public function setReachabilityWebhooksEnabled(bool $reachabilityWebhooksEnabled): self + { + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + return $this; + } + + /** + * + * + * @param bool $aclEnabled + * @return $this Fluent Builder + */ + public function setAclEnabled(bool $aclEnabled): self + { + $this->options['aclEnabled'] = $aclEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Sync.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Sync/ServicePage.php b/app/api/Twilio/Rest/Preview/Sync/ServicePage.php new file mode 100755 index 0000000..686ae87 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Sync/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Preview\Sync\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Sync.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand.php b/app/api/Twilio/Rest/Preview/Understand.php new file mode 100755 index 0000000..b7256dd --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand.php @@ -0,0 +1,95 @@ +version = 'understand'; + } + + protected function getAssistants(): AssistantList + { + if (!$this->_assistants) { + $this->_assistants = new AssistantList($this); + } + return $this->_assistants; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsContext.php new file mode 100755 index 0000000..02cafbb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsContext.php @@ -0,0 +1,111 @@ +solution = [ + 'assistantSid' => + $assistantSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FallbackActions'; + } + + /** + * Fetch the AssistantFallbackActionsInstance + * + * @return AssistantFallbackActionsInstance Fetched AssistantFallbackActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantFallbackActionsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssistantFallbackActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Update the AssistantFallbackActionsInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantFallbackActionsInstance Updated AssistantFallbackActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantFallbackActionsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FallbackActions' => + Serialize::jsonObject($options['fallbackActions']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AssistantFallbackActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantFallbackActionsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsInstance.php new file mode 100755 index 0000000..5f5ea64 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssistantFallbackActionsContext Context for this AssistantFallbackActionsInstance + */ + protected function proxy(): AssistantFallbackActionsContext + { + if (!$this->context) { + $this->context = new AssistantFallbackActionsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AssistantFallbackActionsInstance + * + * @return AssistantFallbackActionsInstance Fetched AssistantFallbackActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantFallbackActionsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AssistantFallbackActionsInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantFallbackActionsInstance Updated AssistantFallbackActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantFallbackActionsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantFallbackActionsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsList.php new file mode 100755 index 0000000..2e3e47f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsList.php @@ -0,0 +1,67 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a AssistantFallbackActionsContext + */ + public function getContext( + + ): AssistantFallbackActionsContext + { + return new AssistantFallbackActionsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantFallbackActionsList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsOptions.php new file mode 100755 index 0000000..dbb57aa --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsOptions.php @@ -0,0 +1,78 @@ +options['fallbackActions'] = $fallbackActions; + } + + /** + * + * + * @param array $fallbackActions + * @return $this Fluent Builder + */ + public function setFallbackActions(array $fallbackActions): self + { + $this->options['fallbackActions'] = $fallbackActions; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateAssistantFallbackActionsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsPage.php new file mode 100755 index 0000000..c7cf2ae --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantFallbackActionsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssistantFallbackActionsInstance \Twilio\Rest\Preview\Understand\Assistant\AssistantFallbackActionsInstance + */ + public function buildInstance(array $payload): AssistantFallbackActionsInstance + { + return new AssistantFallbackActionsInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantFallbackActionsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsContext.php new file mode 100755 index 0000000..c879e19 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsContext.php @@ -0,0 +1,111 @@ +solution = [ + 'assistantSid' => + $assistantSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/InitiationActions'; + } + + /** + * Fetch the AssistantInitiationActionsInstance + * + * @return AssistantInitiationActionsInstance Fetched AssistantInitiationActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInitiationActionsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssistantInitiationActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Update the AssistantInitiationActionsInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInitiationActionsInstance Updated AssistantInitiationActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInitiationActionsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'InitiationActions' => + Serialize::jsonObject($options['initiationActions']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AssistantInitiationActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantInitiationActionsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsInstance.php new file mode 100755 index 0000000..10ff3b7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssistantInitiationActionsContext Context for this AssistantInitiationActionsInstance + */ + protected function proxy(): AssistantInitiationActionsContext + { + if (!$this->context) { + $this->context = new AssistantInitiationActionsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AssistantInitiationActionsInstance + * + * @return AssistantInitiationActionsInstance Fetched AssistantInitiationActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInitiationActionsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AssistantInitiationActionsInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInitiationActionsInstance Updated AssistantInitiationActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInitiationActionsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantInitiationActionsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsList.php new file mode 100755 index 0000000..35cbbe8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsList.php @@ -0,0 +1,67 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a AssistantInitiationActionsContext + */ + public function getContext( + + ): AssistantInitiationActionsContext + { + return new AssistantInitiationActionsContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantInitiationActionsList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsOptions.php new file mode 100755 index 0000000..9830b36 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsOptions.php @@ -0,0 +1,78 @@ +options['initiationActions'] = $initiationActions; + } + + /** + * + * + * @param array $initiationActions + * @return $this Fluent Builder + */ + public function setInitiationActions(array $initiationActions): self + { + $this->options['initiationActions'] = $initiationActions; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateAssistantInitiationActionsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsPage.php new file mode 100755 index 0000000..c2bdb17 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/AssistantInitiationActionsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssistantInitiationActionsInstance \Twilio\Rest\Preview\Understand\Assistant\AssistantInitiationActionsInstance + */ + public function buildInstance(array $payload): AssistantInitiationActionsInstance + { + return new AssistantInitiationActionsInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantInitiationActionsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueContext.php new file mode 100755 index 0000000..8b2914f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueContext.php @@ -0,0 +1,87 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Dialogues/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DialogueInstance + * + * @return DialogueInstance Fetched DialogueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DialogueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DialogueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.DialogueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueInstance.php new file mode 100755 index 0000000..eb25262 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'data' => Values::array_get($payload, 'data'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DialogueContext Context for this DialogueInstance + */ + protected function proxy(): DialogueContext + { + if (!$this->context) { + $this->context = new DialogueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DialogueInstance + * + * @return DialogueInstance Fetched DialogueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DialogueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.DialogueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueList.php new file mode 100755 index 0000000..b33b21a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialogueList.php @@ -0,0 +1,71 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a DialogueContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): DialogueContext + { + return new DialogueContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.DialogueList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/DialoguePage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialoguePage.php new file mode 100755 index 0000000..966e2d7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/DialoguePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DialogueInstance \Twilio\Rest\Preview\Understand\Assistant\DialogueInstance + */ + public function buildInstance(array $payload): DialogueInstance + { + return new DialogueInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.DialoguePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueContext.php new file mode 100755 index 0000000..c472385 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueContext.php @@ -0,0 +1,106 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'fieldTypeSid' => + $fieldTypeSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($fieldTypeSid) + .'/FieldValues/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldValueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldValueInstance + * + * @return FieldValueInstance Fetched FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldValueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldValueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldValueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueInstance.php new file mode 100755 index 0000000..abbb9ba --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'fieldTypeSid' => Values::array_get($payload, 'field_type_sid'), + 'language' => Values::array_get($payload, 'language'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'value' => Values::array_get($payload, 'value'), + 'url' => Values::array_get($payload, 'url'), + 'synonymOf' => Values::array_get($payload, 'synonym_of'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'fieldTypeSid' => $fieldTypeSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldValueContext Context for this FieldValueInstance + */ + protected function proxy(): FieldValueContext + { + if (!$this->context) { + $this->context = new FieldValueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldValueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldValueInstance + * + * @return FieldValueInstance Fetched FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldValueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldValueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueList.php new file mode 100755 index 0000000..999cfbf --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'fieldTypeSid' => + $fieldTypeSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($fieldTypeSid) + .'/FieldValues'; + } + + /** + * Create the FieldValueInstance + * + * @param string $language An ISO language-country string of the value. + * @param string $value A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return FieldValueInstance Created FieldValueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $value, array $options = []): FieldValueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'Value' => + $value, + 'SynonymOf' => + $options['synonymOf'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldValueInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'] + ); + } + + + /** + * Reads FieldValueInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldValueInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams FieldValueInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldValueInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldValuePage Page of FieldValueInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldValuePage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldValuePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldValueInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldValuePage Page of FieldValueInstance + */ + public function getPage(string $targetUrl): FieldValuePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldValuePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldValueContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): FieldValueContext + { + return new FieldValueContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['fieldTypeSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldValueList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueOptions.php new file mode 100755 index 0000000..2015c7f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValueOptions.php @@ -0,0 +1,132 @@ +options['synonymOf'] = $synonymOf; + } + + /** + * A value that indicates this field value is a synonym of. Empty if the value is not a synonym. + * + * @param string $synonymOf A value that indicates this field value is a synonym of. Empty if the value is not a synonym. + * @return $this Fluent Builder + */ + public function setSynonymOf(string $synonymOf): self + { + $this->options['synonymOf'] = $synonymOf; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateFieldValueOptions ' . $options . ']'; + } +} + + + +class ReadFieldValueOptions extends Options + { + /** + * @param string $language An ISO language-country string of the value. For example: *en-US* + */ + public function __construct( + + string $language = Values::NONE + + ) { + $this->options['language'] = $language; + } + + /** + * An ISO language-country string of the value. For example: *en-US* + * + * @param string $language An ISO language-country string of the value. For example: *en-US* + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.ReadFieldValueOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValuePage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValuePage.php new file mode 100755 index 0000000..49e78e1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldType/FieldValuePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldValueInstance \Twilio\Rest\Preview\Understand\Assistant\FieldType\FieldValueInstance + */ + public function buildInstance(array $payload): FieldValueInstance + { + return new FieldValueInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['fieldTypeSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldValuePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeContext.php new file mode 100755 index 0000000..a02bceb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeContext.php @@ -0,0 +1,191 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldTypeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldTypeInstance + * + * @return FieldTypeInstance Fetched FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the FieldTypeInstance + * + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Updated FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FieldTypeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the fieldValues + */ + protected function getFieldValues(): FieldValueList + { + if (!$this->_fieldValues) { + $this->_fieldValues = new FieldValueList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_fieldValues; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeInstance.php new file mode 100755 index 0000000..a153fd6 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'links' => Values::array_get($payload, 'links'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldTypeContext Context for this FieldTypeInstance + */ + protected function proxy(): FieldTypeContext + { + if (!$this->context) { + $this->context = new FieldTypeContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldTypeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldTypeInstance + * + * @return FieldTypeInstance Fetched FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FieldTypeInstance + * + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Updated FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FieldTypeInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the fieldValues + */ + protected function getFieldValues(): FieldValueList + { + return $this->proxy()->fieldValues; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeList.php new file mode 100755 index 0000000..24e9c6e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeList.php @@ -0,0 +1,200 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/FieldTypes'; + } + + /** + * Create the FieldTypeInstance + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return FieldTypeInstance Created FieldTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): FieldTypeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldTypeInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads FieldTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FieldTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldTypePage Page of FieldTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldTypePage Page of FieldTypeInstance + */ + public function getPage(string $targetUrl): FieldTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldTypeContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): FieldTypeContext + { + return new FieldTypeContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeOptions.php new file mode 100755 index 0000000..10120dc --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypeOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateFieldTypeOptions ' . $options . ']'; + } +} + + + + +class UpdateFieldTypeOptions extends Options + { + /** + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateFieldTypeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypePage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypePage.php new file mode 100755 index 0000000..cc9359a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/FieldTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldTypeInstance \Twilio\Rest\Preview\Understand\Assistant\FieldTypeInstance + */ + public function buildInstance(array $payload): FieldTypeInstance + { + return new FieldTypeInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildContext.php new file mode 100755 index 0000000..2a038ee --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildContext.php @@ -0,0 +1,130 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/ModelBuilds/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ModelBuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ModelBuildInstance + * + * @return ModelBuildInstance Fetched ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ModelBuildInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Updated ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ModelBuildInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.ModelBuildContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildInstance.php new file mode 100755 index 0000000..bb04db3 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'buildDuration' => Values::array_get($payload, 'build_duration'), + 'errorCode' => Values::array_get($payload, 'error_code'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ModelBuildContext Context for this ModelBuildInstance + */ + protected function proxy(): ModelBuildContext + { + if (!$this->context) { + $this->context = new ModelBuildContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ModelBuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ModelBuildInstance + * + * @return ModelBuildInstance Fetched ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ModelBuildInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Updated ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ModelBuildInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.ModelBuildInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildList.php new file mode 100755 index 0000000..4928181 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildList.php @@ -0,0 +1,199 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/ModelBuilds'; + } + + /** + * Create the ModelBuildInstance + * + * @param array|Options $options Optional Arguments + * @return ModelBuildInstance Created ModelBuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ModelBuildInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StatusCallback' => + $options['statusCallback'], + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ModelBuildInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads ModelBuildInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ModelBuildInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ModelBuildInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ModelBuildInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ModelBuildPage Page of ModelBuildInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ModelBuildPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ModelBuildPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ModelBuildInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ModelBuildPage Page of ModelBuildInstance + */ + public function getPage(string $targetUrl): ModelBuildPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ModelBuildPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ModelBuildContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): ModelBuildContext + { + return new ModelBuildContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.ModelBuildList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildOptions.php new file mode 100755 index 0000000..908560f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildOptions.php @@ -0,0 +1,152 @@ +options['statusCallback'] = $statusCallback; + $this->options['uniqueName'] = $uniqueName; + } + + /** + * + * + * @param string $statusCallback + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. For example: v0.1 + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. For example: v0.1 + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateModelBuildOptions ' . $options . ']'; + } +} + + + + +class UpdateModelBuildOptions extends Options + { + /** + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. For example: v0.1 + */ + public function __construct( + + string $uniqueName = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. For example: v0.1 + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. For example: v0.1 + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateModelBuildOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildPage.php new file mode 100755 index 0000000..80529d7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/ModelBuildPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ModelBuildInstance \Twilio\Rest\Preview\Understand\Assistant\ModelBuildInstance + */ + public function buildInstance(array $payload): ModelBuildInstance + { + return new ModelBuildInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.ModelBuildPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryContext.php new file mode 100755 index 0000000..b1b2c3d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryContext.php @@ -0,0 +1,132 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Queries/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the QueryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the QueryInstance + * + * @return QueryInstance Fetched QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the QueryInstance + * + * @param array|Options $options Optional Arguments + * @return QueryInstance Updated QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'SampleSid' => + $options['sampleSid'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.QueryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryInstance.php new file mode 100755 index 0000000..c1faf9e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'results' => Values::array_get($payload, 'results'), + 'language' => Values::array_get($payload, 'language'), + 'modelBuildSid' => Values::array_get($payload, 'model_build_sid'), + 'query' => Values::array_get($payload, 'query'), + 'sampleSid' => Values::array_get($payload, 'sample_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + 'sourceChannel' => Values::array_get($payload, 'source_channel'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return QueryContext Context for this QueryInstance + */ + protected function proxy(): QueryContext + { + if (!$this->context) { + $this->context = new QueryContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the QueryInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the QueryInstance + * + * @return QueryInstance Fetched QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): QueryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the QueryInstance + * + * @param array|Options $options Optional Arguments + * @return QueryInstance Updated QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): QueryInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.QueryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryList.php new file mode 100755 index 0000000..3894c7a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Queries'; + } + + /** + * Create the QueryInstance + * + * @param string $language An ISO language-country string of the sample. + * @param string $query A user-provided string that uniquely identifies this resource as an alternative to the sid. It can be up to 2048 characters long. + * @param array|Options $options Optional Arguments + * @return QueryInstance Created QueryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $query, array $options = []): QueryInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'Query' => + $query, + 'Tasks' => + $options['tasks'], + 'ModelBuild' => + $options['modelBuild'], + 'Field' => + $options['field'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new QueryInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads QueryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return QueryInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams QueryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of QueryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return QueryPage Page of QueryInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): QueryPage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'ModelBuild' => + $options['modelBuild'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new QueryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of QueryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return QueryPage Page of QueryInstance + */ + public function getPage(string $targetUrl): QueryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new QueryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a QueryContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): QueryContext + { + return new QueryContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.QueryList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryOptions.php new file mode 100755 index 0000000..44d2714 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryOptions.php @@ -0,0 +1,274 @@ +options['tasks'] = $tasks; + $this->options['modelBuild'] = $modelBuild; + $this->options['field'] = $field; + } + + /** + * Constraints the query to a set of tasks. Useful when you need to constrain the paths the user can take. Tasks should be comma separated *task-unique-name-1*, *task-unique-name-2* + * + * @param string $tasks Constraints the query to a set of tasks. Useful when you need to constrain the paths the user can take. Tasks should be comma separated *task-unique-name-1*, *task-unique-name-2* + * @return $this Fluent Builder + */ + public function setTasks(string $tasks): self + { + $this->options['tasks'] = $tasks; + return $this; + } + + /** + * The Model Build Sid or unique name of the Model Build to be queried. + * + * @param string $modelBuild The Model Build Sid or unique name of the Model Build to be queried. + * @return $this Fluent Builder + */ + public function setModelBuild(string $modelBuild): self + { + $this->options['modelBuild'] = $modelBuild; + return $this; + } + + /** + * Constraints the query to a given Field with an task. Useful when you know the Field you are expecting. It accepts one field in the format *task-unique-name-1*:*field-unique-name* + * + * @param string $field Constraints the query to a given Field with an task. Useful when you know the Field you are expecting. It accepts one field in the format *task-unique-name-1*:*field-unique-name* + * @return $this Fluent Builder + */ + public function setField(string $field): self + { + $this->options['field'] = $field; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateQueryOptions ' . $options . ']'; + } +} + + + +class ReadQueryOptions extends Options + { + /** + * @param string $language An ISO language-country string of the sample. + * @param string $modelBuild The Model Build Sid or unique name of the Model Build to be queried. + * @param string $status A string that described the query status. The values can be: pending_review, reviewed, discarded + */ + public function __construct( + + string $language = Values::NONE, + string $modelBuild = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['language'] = $language; + $this->options['modelBuild'] = $modelBuild; + $this->options['status'] = $status; + } + + /** + * An ISO language-country string of the sample. + * + * @param string $language An ISO language-country string of the sample. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * The Model Build Sid or unique name of the Model Build to be queried. + * + * @param string $modelBuild The Model Build Sid or unique name of the Model Build to be queried. + * @return $this Fluent Builder + */ + public function setModelBuild(string $modelBuild): self + { + $this->options['modelBuild'] = $modelBuild; + return $this; + } + + /** + * A string that described the query status. The values can be: pending_review, reviewed, discarded + * + * @param string $status A string that described the query status. The values can be: pending_review, reviewed, discarded + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.ReadQueryOptions ' . $options . ']'; + } +} + +class UpdateQueryOptions extends Options + { + /** + * @param string $sampleSid An optional reference to the Sample created from this query. + * @param string $status A string that described the query status. The values can be: pending_review, reviewed, discarded + */ + public function __construct( + + string $sampleSid = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['sampleSid'] = $sampleSid; + $this->options['status'] = $status; + } + + /** + * An optional reference to the Sample created from this query. + * + * @param string $sampleSid An optional reference to the Sample created from this query. + * @return $this Fluent Builder + */ + public function setSampleSid(string $sampleSid): self + { + $this->options['sampleSid'] = $sampleSid; + return $this; + } + + /** + * A string that described the query status. The values can be: pending_review, reviewed, discarded + * + * @param string $status A string that described the query status. The values can be: pending_review, reviewed, discarded + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateQueryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryPage.php new file mode 100755 index 0000000..22f7012 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/QueryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return QueryInstance \Twilio\Rest\Preview\Understand\Assistant\QueryInstance + */ + public function buildInstance(array $payload): QueryInstance + { + return new QueryInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.QueryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetContext.php new file mode 100755 index 0000000..3280c70 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetContext.php @@ -0,0 +1,111 @@ +solution = [ + 'assistantSid' => + $assistantSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/StyleSheet'; + } + + /** + * Fetch the StyleSheetInstance + * + * @return StyleSheetInstance Fetched StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StyleSheetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new StyleSheetInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Update the StyleSheetInstance + * + * @param array|Options $options Optional Arguments + * @return StyleSheetInstance Updated StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): StyleSheetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new StyleSheetInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.StyleSheetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetInstance.php new file mode 100755 index 0000000..034c99c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return StyleSheetContext Context for this StyleSheetInstance + */ + protected function proxy(): StyleSheetContext + { + if (!$this->context) { + $this->context = new StyleSheetContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the StyleSheetInstance + * + * @return StyleSheetInstance Fetched StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StyleSheetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the StyleSheetInstance + * + * @param array|Options $options Optional Arguments + * @return StyleSheetInstance Updated StyleSheetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): StyleSheetInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.StyleSheetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetList.php new file mode 100755 index 0000000..3945724 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetList.php @@ -0,0 +1,67 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + } + + /** + * Constructs a StyleSheetContext + */ + public function getContext( + + ): StyleSheetContext + { + return new StyleSheetContext( + $this->version, + $this->solution['assistantSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.StyleSheetList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetOptions.php new file mode 100755 index 0000000..997e07f --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetOptions.php @@ -0,0 +1,78 @@ +options['styleSheet'] = $styleSheet; + } + + /** + * The JSON Style sheet string + * + * @param array $styleSheet The JSON Style sheet string + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateStyleSheetOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetPage.php new file mode 100755 index 0000000..7965e85 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/StyleSheetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StyleSheetInstance \Twilio\Rest\Preview\Understand\Assistant\StyleSheetInstance + */ + public function buildInstance(array $payload): StyleSheetInstance + { + return new StyleSheetInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.StyleSheetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldContext.php new file mode 100755 index 0000000..73b9a9e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldContext.php @@ -0,0 +1,106 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Fields/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FieldInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FieldInstance + * + * @return FieldInstance Fetched FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FieldInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldInstance.php new file mode 100755 index 0000000..c077e82 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldInstance.php @@ -0,0 +1,148 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'fieldType' => Values::array_get($payload, 'field_type'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FieldContext Context for this FieldInstance + */ + protected function proxy(): FieldContext + { + if (!$this->context) { + $this->context = new FieldContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FieldInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FieldInstance + * + * @return FieldInstance Fetched FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FieldInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.FieldInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldList.php new file mode 100755 index 0000000..d7f9fd8 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldList.php @@ -0,0 +1,205 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Fields'; + } + + /** + * Create the FieldInstance + * + * @param string $fieldType The unique name or sid of the FieldType. It can be any [Built-in Field Type](https://www.twilio.com/docs/assistant/api/built-in-field-types) or the unique_name or the Field Type sid of a custom Field Type. + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @return FieldInstance Created FieldInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $fieldType, string $uniqueName): FieldInstance + { + + $data = Values::of([ + 'FieldType' => + $fieldType, + 'UniqueName' => + $uniqueName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FieldInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Reads FieldInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FieldInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FieldInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FieldInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FieldPage Page of FieldInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FieldPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FieldPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FieldInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FieldPage Page of FieldInstance + */ + public function getPage(string $targetUrl): FieldPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FieldPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FieldContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): FieldContext + { + return new FieldContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldPage.php new file mode 100755 index 0000000..b50d7f6 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/FieldPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FieldInstance \Twilio\Rest\Preview\Understand\Assistant\Task\FieldInstance + */ + public function buildInstance(array $payload): FieldInstance + { + return new FieldInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.FieldPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleContext.php new file mode 100755 index 0000000..c4a62f1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleContext.php @@ -0,0 +1,141 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Samples/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SampleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SampleInstance + * + * @return SampleInstance Fetched SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SampleInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SampleInstance + * + * @param array|Options $options Optional Arguments + * @return SampleInstance Updated SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SampleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $options['language'], + 'TaggedText' => + $options['taggedText'], + 'SourceChannel' => + $options['sourceChannel'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.SampleContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleInstance.php new file mode 100755 index 0000000..fdf20e5 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleInstance.php @@ -0,0 +1,164 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'language' => Values::array_get($payload, 'language'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'taggedText' => Values::array_get($payload, 'tagged_text'), + 'url' => Values::array_get($payload, 'url'), + 'sourceChannel' => Values::array_get($payload, 'source_channel'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SampleContext Context for this SampleInstance + */ + protected function proxy(): SampleContext + { + if (!$this->context) { + $this->context = new SampleContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SampleInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SampleInstance + * + * @return SampleInstance Fetched SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SampleInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SampleInstance + * + * @param array|Options $options Optional Arguments + * @return SampleInstance Updated SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SampleInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.SampleInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleList.php new file mode 100755 index 0000000..e1ac32a --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleList.php @@ -0,0 +1,217 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Samples'; + } + + /** + * Create the SampleInstance + * + * @param string $language An ISO language-country string of the sample. + * @param string $taggedText The text example of how end-users may express this task. The sample may contain Field tag blocks. + * @param array|Options $options Optional Arguments + * @return SampleInstance Created SampleInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $language, string $taggedText, array $options = []): SampleInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Language' => + $language, + 'TaggedText' => + $taggedText, + 'SourceChannel' => + $options['sourceChannel'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SampleInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Reads SampleInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SampleInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SampleInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SampleInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SamplePage Page of SampleInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SamplePage + { + $options = new Values($options); + + $params = Values::of([ + 'Language' => + $options['language'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SamplePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SampleInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SamplePage Page of SampleInstance + */ + public function getPage(string $targetUrl): SamplePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SamplePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SampleContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): SampleContext + { + return new SampleContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.SampleList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleOptions.php new file mode 100755 index 0000000..ee0e6b4 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SampleOptions.php @@ -0,0 +1,220 @@ +options['sourceChannel'] = $sourceChannel; + } + + /** + * The communication channel the sample was captured. It can be: *voice*, *sms*, *chat*, *alexa*, *google-assistant*, or *slack*. If not included the value will be null + * + * @param string $sourceChannel The communication channel the sample was captured. It can be: *voice*, *sms*, *chat*, *alexa*, *google-assistant*, or *slack*. If not included the value will be null + * @return $this Fluent Builder + */ + public function setSourceChannel(string $sourceChannel): self + { + $this->options['sourceChannel'] = $sourceChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateSampleOptions ' . $options . ']'; + } +} + + + +class ReadSampleOptions extends Options + { + /** + * @param string $language An ISO language-country string of the sample. + */ + public function __construct( + + string $language = Values::NONE + + ) { + $this->options['language'] = $language; + } + + /** + * An ISO language-country string of the sample. + * + * @param string $language An ISO language-country string of the sample. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.ReadSampleOptions ' . $options . ']'; + } +} + +class UpdateSampleOptions extends Options + { + /** + * @param string $language An ISO language-country string of the sample. + * @param string $taggedText The text example of how end-users may express this task. The sample may contain Field tag blocks. + * @param string $sourceChannel The communication channel the sample was captured. It can be: *voice*, *sms*, *chat*, *alexa*, *google-assistant*, or *slack*. If not included the value will be null + */ + public function __construct( + + string $language = Values::NONE, + string $taggedText = Values::NONE, + string $sourceChannel = Values::NONE + + ) { + $this->options['language'] = $language; + $this->options['taggedText'] = $taggedText; + $this->options['sourceChannel'] = $sourceChannel; + } + + /** + * An ISO language-country string of the sample. + * + * @param string $language An ISO language-country string of the sample. + * @return $this Fluent Builder + */ + public function setLanguage(string $language): self + { + $this->options['language'] = $language; + return $this; + } + + /** + * The text example of how end-users may express this task. The sample may contain Field tag blocks. + * + * @param string $taggedText The text example of how end-users may express this task. The sample may contain Field tag blocks. + * @return $this Fluent Builder + */ + public function setTaggedText(string $taggedText): self + { + $this->options['taggedText'] = $taggedText; + return $this; + } + + /** + * The communication channel the sample was captured. It can be: *voice*, *sms*, *chat*, *alexa*, *google-assistant*, or *slack*. If not included the value will be null + * + * @param string $sourceChannel The communication channel the sample was captured. It can be: *voice*, *sms*, *chat*, *alexa*, *google-assistant*, or *slack*. If not included the value will be null + * @return $this Fluent Builder + */ + public function setSourceChannel(string $sourceChannel): self + { + $this->options['sourceChannel'] = $sourceChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateSampleOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SamplePage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SamplePage.php new file mode 100755 index 0000000..bf03113 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/SamplePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SampleInstance \Twilio\Rest\Preview\Understand\Assistant\Task\SampleInstance + */ + public function buildInstance(array $payload): SampleInstance + { + return new SampleInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.SamplePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsContext.php new file mode 100755 index 0000000..91e1656 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsContext.php @@ -0,0 +1,118 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Actions'; + } + + /** + * Fetch the TaskActionsInstance + * + * @return TaskActionsInstance Fetched TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskActionsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Update the TaskActionsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskActionsInstance Updated TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskActionsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Actions' => + Serialize::jsonObject($options['actions']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskActionsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskActionsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsInstance.php new file mode 100755 index 0000000..fa919e3 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsInstance.php @@ -0,0 +1,139 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'url' => Values::array_get($payload, 'url'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskActionsContext Context for this TaskActionsInstance + */ + protected function proxy(): TaskActionsContext + { + if (!$this->context) { + $this->context = new TaskActionsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskActionsInstance + * + * @return TaskActionsInstance Fetched TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskActionsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskActionsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskActionsInstance Updated TaskActionsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskActionsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskActionsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsList.php new file mode 100755 index 0000000..2309bee --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsList.php @@ -0,0 +1,73 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + } + + /** + * Constructs a TaskActionsContext + */ + public function getContext( + + ): TaskActionsContext + { + return new TaskActionsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskActionsList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsOptions.php new file mode 100755 index 0000000..3926115 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsOptions.php @@ -0,0 +1,78 @@ +options['actions'] = $actions; + } + + /** + * The JSON actions that instruct the Assistant how to perform this task. + * + * @param array $actions The JSON actions that instruct the Assistant how to perform this task. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateTaskActionsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsPage.php new file mode 100755 index 0000000..71ada3c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskActionsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskActionsInstance \Twilio\Rest\Preview\Understand\Assistant\Task\TaskActionsInstance + */ + public function buildInstance(array $payload): TaskActionsInstance + { + return new TaskActionsInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskActionsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsContext.php new file mode 100755 index 0000000..76c4f05 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsContext.php @@ -0,0 +1,87 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'taskSid' => + $taskSid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Statistics'; + } + + /** + * Fetch the TaskStatisticsInstance + * + * @return TaskStatisticsInstance Fetched TaskStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskStatisticsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskStatisticsInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsInstance.php new file mode 100755 index 0000000..c04c9d4 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'samplesCount' => Values::array_get($payload, 'samples_count'), + 'fieldsCount' => Values::array_get($payload, 'fields_count'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'taskSid' => $taskSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskStatisticsContext Context for this TaskStatisticsInstance + */ + protected function proxy(): TaskStatisticsContext + { + if (!$this->context) { + $this->context = new TaskStatisticsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskStatisticsInstance + * + * @return TaskStatisticsInstance Fetched TaskStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskStatisticsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsList.php new file mode 100755 index 0000000..1bbfb71 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + 'taskSid' => + $taskSid, + + ]; + } + + /** + * Constructs a TaskStatisticsContext + */ + public function getContext( + + ): TaskStatisticsContext + { + return new TaskStatisticsContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['taskSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsPage.php new file mode 100755 index 0000000..1c4c664 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/Task/TaskStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskStatisticsInstance \Twilio\Rest\Preview\Understand\Assistant\Task\TaskStatisticsInstance + */ + public function buildInstance(array $payload): TaskStatisticsInstance + { + return new TaskStatisticsInstance($this->version, $payload, $this->solution['assistantSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskContext.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskContext.php new file mode 100755 index 0000000..b8f5831 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskContext.php @@ -0,0 +1,256 @@ +solution = [ + 'assistantSid' => + $assistantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TaskInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'UniqueName' => + $options['uniqueName'], + 'Actions' => + Serialize::jsonObject($options['actions']), + 'ActionsUrl' => + $options['actionsUrl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the samples + */ + protected function getSamples(): SampleList + { + if (!$this->_samples) { + $this->_samples = new SampleList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_samples; + } + + /** + * Access the fields + */ + protected function getFields(): FieldList + { + if (!$this->_fields) { + $this->_fields = new FieldList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_fields; + } + + /** + * Access the taskActions + */ + protected function getTaskActions(): TaskActionsList + { + if (!$this->_taskActions) { + $this->_taskActions = new TaskActionsList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_taskActions; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new TaskStatisticsList( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskInstance.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskInstance.php new file mode 100755 index 0000000..cd45cde --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskInstance.php @@ -0,0 +1,203 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'links' => Values::array_get($payload, 'links'), + 'assistantSid' => Values::array_get($payload, 'assistant_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'actionsUrl' => Values::array_get($payload, 'actions_url'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['assistantSid' => $assistantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskContext Context for this TaskInstance + */ + protected function proxy(): TaskContext + { + if (!$this->context) { + $this->context = new TaskContext( + $this->version, + $this->solution['assistantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TaskInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the samples + */ + protected function getSamples(): SampleList + { + return $this->proxy()->samples; + } + + /** + * Access the fields + */ + protected function getFields(): FieldList + { + return $this->proxy()->fields; + } + + /** + * Access the taskActions + */ + protected function getTaskActions(): TaskActionsList + { + return $this->proxy()->taskActions; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.TaskInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskList.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskList.php new file mode 100755 index 0000000..e3680cb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskList.php @@ -0,0 +1,205 @@ +solution = [ + 'assistantSid' => + $assistantSid, + + ]; + + $this->uri = '/Assistants/' . \rawurlencode($assistantSid) + .'/Tasks'; + } + + /** + * Create the TaskInstance + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return TaskInstance Created TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'FriendlyName' => + $options['friendlyName'], + 'Actions' => + Serialize::jsonObject($options['actions']), + 'ActionsUrl' => + $options['actionsUrl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['assistantSid'] + ); + } + + + /** + * Reads TaskInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TaskInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskPage Page of TaskInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskPage Page of TaskInstance + */ + public function getPage(string $targetUrl): TaskPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TaskContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): TaskContext + { + return new TaskContext( + $this->version, + $this->solution['assistantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskOptions.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskOptions.php new file mode 100755 index 0000000..06ad740 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskOptions.php @@ -0,0 +1,224 @@ +options['friendlyName'] = $friendlyName; + $this->options['actions'] = $actions; + $this->options['actionsUrl'] = $actionsUrl; + } + + /** + * A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A user-provided JSON object encoded as a string to specify the actions for this task. It is optional and non-unique. + * + * @param array $actions A user-provided JSON object encoded as a string to specify the actions for this task. It is optional and non-unique. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * User-provided HTTP endpoint where from the assistant fetches actions + * + * @param string $actionsUrl User-provided HTTP endpoint where from the assistant fetches actions + * @return $this Fluent Builder + */ + public function setActionsUrl(string $actionsUrl): self + { + $this->options['actionsUrl'] = $actionsUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateTaskOptions ' . $options . ']'; + } +} + + + + +class UpdateTaskOptions extends Options + { + /** + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @param array $actions A user-provided JSON object encoded as a string to specify the actions for this task. It is optional and non-unique. + * @param string $actionsUrl User-provided HTTP endpoint where from the assistant fetches actions + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $uniqueName = Values::NONE, + array $actions = Values::ARRAY_NONE, + string $actionsUrl = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['uniqueName'] = $uniqueName; + $this->options['actions'] = $actions; + $this->options['actionsUrl'] = $actionsUrl; + } + + /** + * A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A user-provided string that identifies this resource. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A user-provided JSON object encoded as a string to specify the actions for this task. It is optional and non-unique. + * + * @param array $actions A user-provided JSON object encoded as a string to specify the actions for this task. It is optional and non-unique. + * @return $this Fluent Builder + */ + public function setActions(array $actions): self + { + $this->options['actions'] = $actions; + return $this; + } + + /** + * User-provided HTTP endpoint where from the assistant fetches actions + * + * @param string $actionsUrl User-provided HTTP endpoint where from the assistant fetches actions + * @return $this Fluent Builder + */ + public function setActionsUrl(string $actionsUrl): self + { + $this->options['actionsUrl'] = $actionsUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateTaskOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskPage.php b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskPage.php new file mode 100755 index 0000000..34fcff3 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/Assistant/TaskPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskInstance \Twilio\Rest\Preview\Understand\Assistant\TaskInstance + */ + public function buildInstance(array $payload): TaskInstance + { + return new TaskInstance($this->version, $payload, $this->solution['assistantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.TaskPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/AssistantContext.php b/app/api/Twilio/Rest/Preview/Understand/AssistantContext.php new file mode 100755 index 0000000..898887b --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/AssistantContext.php @@ -0,0 +1,329 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Assistants/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AssistantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AssistantInstance + * + * @return AssistantInstance Fetched AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssistantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Updated AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'LogQueries' => + Serialize::booleanToString($options['logQueries']), + 'UniqueName' => + $options['uniqueName'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackEvents' => + $options['callbackEvents'], + 'FallbackActions' => + Serialize::jsonObject($options['fallbackActions']), + 'InitiationActions' => + Serialize::jsonObject($options['initiationActions']), + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AssistantInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the fieldTypes + */ + protected function getFieldTypes(): FieldTypeList + { + if (!$this->_fieldTypes) { + $this->_fieldTypes = new FieldTypeList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_fieldTypes; + } + + /** + * Access the queries + */ + protected function getQueries(): QueryList + { + if (!$this->_queries) { + $this->_queries = new QueryList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_queries; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + if (!$this->_tasks) { + $this->_tasks = new TaskList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_tasks; + } + + /** + * Access the modelBuilds + */ + protected function getModelBuilds(): ModelBuildList + { + if (!$this->_modelBuilds) { + $this->_modelBuilds = new ModelBuildList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_modelBuilds; + } + + /** + * Access the assistantFallbackActions + */ + protected function getAssistantFallbackActions(): AssistantFallbackActionsList + { + if (!$this->_assistantFallbackActions) { + $this->_assistantFallbackActions = new AssistantFallbackActionsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_assistantFallbackActions; + } + + /** + * Access the assistantInitiationActions + */ + protected function getAssistantInitiationActions(): AssistantInitiationActionsList + { + if (!$this->_assistantInitiationActions) { + $this->_assistantInitiationActions = new AssistantInitiationActionsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_assistantInitiationActions; + } + + /** + * Access the styleSheet + */ + protected function getStyleSheet(): StyleSheetList + { + if (!$this->_styleSheet) { + $this->_styleSheet = new StyleSheetList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_styleSheet; + } + + /** + * Access the dialogues + */ + protected function getDialogues(): DialogueList + { + if (!$this->_dialogues) { + $this->_dialogues = new DialogueList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_dialogues; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/AssistantInstance.php b/app/api/Twilio/Rest/Preview/Understand/AssistantInstance.php new file mode 100755 index 0000000..30fd7d2 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/AssistantInstance.php @@ -0,0 +1,245 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'latestModelBuildSid' => Values::array_get($payload, 'latest_model_build_sid'), + 'links' => Values::array_get($payload, 'links'), + 'logQueries' => Values::array_get($payload, 'log_queries'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'url' => Values::array_get($payload, 'url'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'callbackEvents' => Values::array_get($payload, 'callback_events'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssistantContext Context for this AssistantInstance + */ + protected function proxy(): AssistantContext + { + if (!$this->context) { + $this->context = new AssistantContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AssistantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AssistantInstance + * + * @return AssistantInstance Fetched AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssistantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Updated AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): AssistantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the fieldTypes + */ + protected function getFieldTypes(): FieldTypeList + { + return $this->proxy()->fieldTypes; + } + + /** + * Access the queries + */ + protected function getQueries(): QueryList + { + return $this->proxy()->queries; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + return $this->proxy()->tasks; + } + + /** + * Access the modelBuilds + */ + protected function getModelBuilds(): ModelBuildList + { + return $this->proxy()->modelBuilds; + } + + /** + * Access the assistantFallbackActions + */ + protected function getAssistantFallbackActions(): AssistantFallbackActionsList + { + return $this->proxy()->assistantFallbackActions; + } + + /** + * Access the assistantInitiationActions + */ + protected function getAssistantInitiationActions(): AssistantInitiationActionsList + { + return $this->proxy()->assistantInitiationActions; + } + + /** + * Access the styleSheet + */ + protected function getStyleSheet(): StyleSheetList + { + return $this->proxy()->styleSheet; + } + + /** + * Access the dialogues + */ + protected function getDialogues(): DialogueList + { + return $this->proxy()->dialogues; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Understand.AssistantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/AssistantList.php b/app/api/Twilio/Rest/Preview/Understand/AssistantList.php new file mode 100755 index 0000000..386a7bb --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/AssistantList.php @@ -0,0 +1,204 @@ +solution = [ + ]; + + $this->uri = '/Assistants'; + } + + /** + * Create the AssistantInstance + * + * @param array|Options $options Optional Arguments + * @return AssistantInstance Created AssistantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): AssistantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'LogQueries' => + Serialize::booleanToString($options['logQueries']), + 'UniqueName' => + $options['uniqueName'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackEvents' => + $options['callbackEvents'], + 'FallbackActions' => + Serialize::jsonObject($options['fallbackActions']), + 'InitiationActions' => + Serialize::jsonObject($options['initiationActions']), + 'StyleSheet' => + Serialize::jsonObject($options['styleSheet']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AssistantInstance( + $this->version, + $payload + ); + } + + + /** + * Reads AssistantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssistantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssistantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssistantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssistantPage Page of AssistantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssistantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssistantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssistantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssistantPage Page of AssistantInstance + */ + public function getPage(string $targetUrl): AssistantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssistantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssistantContext + * + * @param string $sid A 34 character string that uniquely identifies this resource. + */ + public function getContext( + string $sid + + ): AssistantContext + { + return new AssistantContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Understand/AssistantOptions.php b/app/api/Twilio/Rest/Preview/Understand/AssistantOptions.php new file mode 100755 index 0000000..caa13f9 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/AssistantOptions.php @@ -0,0 +1,386 @@ +options['friendlyName'] = $friendlyName; + $this->options['logQueries'] = $logQueries; + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackEvents'] = $callbackEvents; + $this->options['fallbackActions'] = $fallbackActions; + $this->options['initiationActions'] = $initiationActions; + $this->options['styleSheet'] = $styleSheet; + } + + /** + * A text description for the Assistant. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A text description for the Assistant. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A boolean that specifies whether queries should be logged for 30 days further training. If false, no queries will be stored, if true, queries will be stored for 30 days and deleted thereafter. Defaults to true if no value is provided. + * + * @param bool $logQueries A boolean that specifies whether queries should be logged for 30 days further training. If false, no queries will be stored, if true, queries will be stored for 30 days and deleted thereafter. Defaults to true if no value is provided. + * @return $this Fluent Builder + */ + public function setLogQueries(bool $logQueries): self + { + $this->options['logQueries'] = $logQueries; + return $this; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A user-provided URL to send event callbacks to. + * + * @param string $callbackUrl A user-provided URL to send event callbacks to. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * Space-separated list of callback events that will trigger callbacks. + * + * @param string $callbackEvents Space-separated list of callback events that will trigger callbacks. + * @return $this Fluent Builder + */ + public function setCallbackEvents(string $callbackEvents): self + { + $this->options['callbackEvents'] = $callbackEvents; + return $this; + } + + /** + * The JSON actions to be executed when the user's input is not recognized as matching any Task. + * + * @param array $fallbackActions The JSON actions to be executed when the user's input is not recognized as matching any Task. + * @return $this Fluent Builder + */ + public function setFallbackActions(array $fallbackActions): self + { + $this->options['fallbackActions'] = $fallbackActions; + return $this; + } + + /** + * The JSON actions to be executed on inbound phone calls when the Assistant has to say something first. + * + * @param array $initiationActions The JSON actions to be executed on inbound phone calls when the Assistant has to say something first. + * @return $this Fluent Builder + */ + public function setInitiationActions(array $initiationActions): self + { + $this->options['initiationActions'] = $initiationActions; + return $this; + } + + /** + * The JSON object that holds the style sheet for the assistant + * + * @param array $styleSheet The JSON object that holds the style sheet for the assistant + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.CreateAssistantOptions ' . $options . ']'; + } +} + + + + +class UpdateAssistantOptions extends Options + { + /** + * @param string $friendlyName A text description for the Assistant. It is non-unique and can up to 255 characters long. + * @param bool $logQueries A boolean that specifies whether queries should be logged for 30 days further training. If false, no queries will be stored, if true, queries will be stored for 30 days and deleted thereafter. Defaults to true if no value is provided. + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @param string $callbackUrl A user-provided URL to send event callbacks to. + * @param string $callbackEvents Space-separated list of callback events that will trigger callbacks. + * @param array $fallbackActions The JSON actions to be executed when the user's input is not recognized as matching any Task. + * @param array $initiationActions The JSON actions to be executed on inbound phone calls when the Assistant has to say something first. + * @param array $styleSheet The JSON object that holds the style sheet for the assistant + */ + public function __construct( + + string $friendlyName = Values::NONE, + bool $logQueries = Values::BOOL_NONE, + string $uniqueName = Values::NONE, + string $callbackUrl = Values::NONE, + string $callbackEvents = Values::NONE, + array $fallbackActions = Values::ARRAY_NONE, + array $initiationActions = Values::ARRAY_NONE, + array $styleSheet = Values::ARRAY_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['logQueries'] = $logQueries; + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackEvents'] = $callbackEvents; + $this->options['fallbackActions'] = $fallbackActions; + $this->options['initiationActions'] = $initiationActions; + $this->options['styleSheet'] = $styleSheet; + } + + /** + * A text description for the Assistant. It is non-unique and can up to 255 characters long. + * + * @param string $friendlyName A text description for the Assistant. It is non-unique and can up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A boolean that specifies whether queries should be logged for 30 days further training. If false, no queries will be stored, if true, queries will be stored for 30 days and deleted thereafter. Defaults to true if no value is provided. + * + * @param bool $logQueries A boolean that specifies whether queries should be logged for 30 days further training. If false, no queries will be stored, if true, queries will be stored for 30 days and deleted thereafter. Defaults to true if no value is provided. + * @return $this Fluent Builder + */ + public function setLogQueries(bool $logQueries): self + { + $this->options['logQueries'] = $logQueries; + return $this; + } + + /** + * A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * + * @param string $uniqueName A user-provided string that uniquely identifies this resource as an alternative to the sid. Unique up to 64 characters long. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A user-provided URL to send event callbacks to. + * + * @param string $callbackUrl A user-provided URL to send event callbacks to. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * Space-separated list of callback events that will trigger callbacks. + * + * @param string $callbackEvents Space-separated list of callback events that will trigger callbacks. + * @return $this Fluent Builder + */ + public function setCallbackEvents(string $callbackEvents): self + { + $this->options['callbackEvents'] = $callbackEvents; + return $this; + } + + /** + * The JSON actions to be executed when the user's input is not recognized as matching any Task. + * + * @param array $fallbackActions The JSON actions to be executed when the user's input is not recognized as matching any Task. + * @return $this Fluent Builder + */ + public function setFallbackActions(array $fallbackActions): self + { + $this->options['fallbackActions'] = $fallbackActions; + return $this; + } + + /** + * The JSON actions to be executed on inbound phone calls when the Assistant has to say something first. + * + * @param array $initiationActions The JSON actions to be executed on inbound phone calls when the Assistant has to say something first. + * @return $this Fluent Builder + */ + public function setInitiationActions(array $initiationActions): self + { + $this->options['initiationActions'] = $initiationActions; + return $this; + } + + /** + * The JSON object that holds the style sheet for the assistant + * + * @param array $styleSheet The JSON object that holds the style sheet for the assistant + * @return $this Fluent Builder + */ + public function setStyleSheet(array $styleSheet): self + { + $this->options['styleSheet'] = $styleSheet; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Understand.UpdateAssistantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Understand/AssistantPage.php b/app/api/Twilio/Rest/Preview/Understand/AssistantPage.php new file mode 100755 index 0000000..ea84175 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Understand/AssistantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssistantInstance \Twilio\Rest\Preview\Understand\AssistantInstance + */ + public function buildInstance(array $payload): AssistantInstance + { + return new AssistantInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Understand.AssistantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless.php b/app/api/Twilio/Rest/Preview/Wireless.php new file mode 100755 index 0000000..46f6642 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless.php @@ -0,0 +1,119 @@ +version = 'wireless'; + } + + protected function getCommands(): CommandList + { + if (!$this->_commands) { + $this->_commands = new CommandList($this); + } + return $this->_commands; + } + + protected function getRatePlans(): RatePlanList + { + if (!$this->_ratePlans) { + $this->_ratePlans = new RatePlanList($this); + } + return $this->_ratePlans; + } + + protected function getSims(): SimList + { + if (!$this->_sims) { + $this->_sims = new SimList($this); + } + return $this->_sims; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/CommandContext.php b/app/api/Twilio/Rest/Preview/Wireless/CommandContext.php new file mode 100755 index 0000000..55fb017 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/CommandContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Commands/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the CommandInstance + * + * @return CommandInstance Fetched CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CommandInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CommandInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.CommandContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/CommandInstance.php b/app/api/Twilio/Rest/Preview/Wireless/CommandInstance.php new file mode 100755 index 0000000..037e16e --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/CommandInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'deviceSid' => Values::array_get($payload, 'device_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'command' => Values::array_get($payload, 'command'), + 'commandMode' => Values::array_get($payload, 'command_mode'), + 'status' => Values::array_get($payload, 'status'), + 'direction' => Values::array_get($payload, 'direction'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CommandContext Context for this CommandInstance + */ + protected function proxy(): CommandContext + { + if (!$this->context) { + $this->context = new CommandContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the CommandInstance + * + * @return CommandInstance Fetched CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CommandInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.CommandInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/CommandList.php b/app/api/Twilio/Rest/Preview/Wireless/CommandList.php new file mode 100755 index 0000000..365d9ce --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/CommandList.php @@ -0,0 +1,214 @@ +solution = [ + ]; + + $this->uri = '/Commands'; + } + + /** + * Create the CommandInstance + * + * @param string $command + * @param array|Options $options Optional Arguments + * @return CommandInstance Created CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $command, array $options = []): CommandInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Command' => + $command, + 'Device' => + $options['device'], + 'Sim' => + $options['sim'], + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CommandMode' => + $options['commandMode'], + 'IncludeSid' => + $options['includeSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CommandInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CommandInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CommandInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CommandInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CommandInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CommandPage Page of CommandInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CommandPage + { + $options = new Values($options); + + $params = Values::of([ + 'Device' => + $options['device'], + 'Sim' => + $options['sim'], + 'Status' => + $options['status'], + 'Direction' => + $options['direction'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CommandPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CommandInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CommandPage Page of CommandInstance + */ + public function getPage(string $targetUrl): CommandPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CommandPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CommandContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): CommandContext + { + return new CommandContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.CommandList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/CommandOptions.php b/app/api/Twilio/Rest/Preview/Wireless/CommandOptions.php new file mode 100755 index 0000000..747d156 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/CommandOptions.php @@ -0,0 +1,274 @@ +options['device'] = $device; + $this->options['sim'] = $sim; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['commandMode'] = $commandMode; + $this->options['includeSid'] = $includeSid; + } + + /** + * + * + * @param string $device + * @return $this Fluent Builder + */ + public function setDevice(string $device): self + { + $this->options['device'] = $device; + return $this; + } + + /** + * + * + * @param string $sim + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * + * + * @param string $callbackMethod + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * + * + * @param string $callbackUrl + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * + * + * @param string $commandMode + * @return $this Fluent Builder + */ + public function setCommandMode(string $commandMode): self + { + $this->options['commandMode'] = $commandMode; + return $this; + } + + /** + * + * + * @param string $includeSid + * @return $this Fluent Builder + */ + public function setIncludeSid(string $includeSid): self + { + $this->options['includeSid'] = $includeSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.CreateCommandOptions ' . $options . ']'; + } +} + + +class ReadCommandOptions extends Options + { + /** + * @param string $device + * @param string $sim + * @param string $status + * @param string $direction + */ + public function __construct( + + string $device = Values::NONE, + string $sim = Values::NONE, + string $status = Values::NONE, + string $direction = Values::NONE + + ) { + $this->options['device'] = $device; + $this->options['sim'] = $sim; + $this->options['status'] = $status; + $this->options['direction'] = $direction; + } + + /** + * + * + * @param string $device + * @return $this Fluent Builder + */ + public function setDevice(string $device): self + { + $this->options['device'] = $device; + return $this; + } + + /** + * + * + * @param string $sim + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * + * + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * + * + * @param string $direction + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.ReadCommandOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/CommandPage.php b/app/api/Twilio/Rest/Preview/Wireless/CommandPage.php new file mode 100755 index 0000000..fe0522c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/CommandPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CommandInstance \Twilio\Rest\Preview\Wireless\CommandInstance + */ + public function buildInstance(array $payload): CommandInstance + { + return new CommandInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.CommandPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/RatePlanContext.php b/app/api/Twilio/Rest/Preview/Wireless/RatePlanContext.php new file mode 100755 index 0000000..7d3f34d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/RatePlanContext.php @@ -0,0 +1,125 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RatePlans/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RatePlanInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RatePlanInstance + * + * @return RatePlanInstance Fetched RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RatePlanInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RatePlanInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Updated RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RatePlanInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RatePlanInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.RatePlanContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/RatePlanInstance.php b/app/api/Twilio/Rest/Preview/Wireless/RatePlanInstance.php new file mode 100755 index 0000000..54be0e1 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/RatePlanInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dataEnabled' => Values::array_get($payload, 'data_enabled'), + 'dataMetering' => Values::array_get($payload, 'data_metering'), + 'dataLimit' => Values::array_get($payload, 'data_limit'), + 'messagingEnabled' => Values::array_get($payload, 'messaging_enabled'), + 'voiceEnabled' => Values::array_get($payload, 'voice_enabled'), + 'nationalRoamingEnabled' => Values::array_get($payload, 'national_roaming_enabled'), + 'internationalRoaming' => Values::array_get($payload, 'international_roaming'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RatePlanContext Context for this RatePlanInstance + */ + protected function proxy(): RatePlanContext + { + if (!$this->context) { + $this->context = new RatePlanContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RatePlanInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RatePlanInstance + * + * @return RatePlanInstance Fetched RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RatePlanInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Updated RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RatePlanInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.RatePlanInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/RatePlanList.php b/app/api/Twilio/Rest/Preview/Wireless/RatePlanList.php new file mode 100755 index 0000000..20fcec0 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/RatePlanList.php @@ -0,0 +1,208 @@ +solution = [ + ]; + + $this->uri = '/RatePlans'; + } + + /** + * Create the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Created RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): RatePlanInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'FriendlyName' => + $options['friendlyName'], + 'DataEnabled' => + Serialize::booleanToString($options['dataEnabled']), + 'DataLimit' => + $options['dataLimit'], + 'DataMetering' => + $options['dataMetering'], + 'MessagingEnabled' => + Serialize::booleanToString($options['messagingEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'CommandsEnabled' => + Serialize::booleanToString($options['commandsEnabled']), + 'NationalRoamingEnabled' => + Serialize::booleanToString($options['nationalRoamingEnabled']), + 'InternationalRoaming' => + Serialize::map($options['internationalRoaming'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RatePlanInstance( + $this->version, + $payload + ); + } + + + /** + * Reads RatePlanInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RatePlanInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RatePlanInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RatePlanInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RatePlanPage Page of RatePlanInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RatePlanPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RatePlanPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RatePlanInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RatePlanPage Page of RatePlanInstance + */ + public function getPage(string $targetUrl): RatePlanPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RatePlanPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RatePlanContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): RatePlanContext + { + return new RatePlanContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.RatePlanList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/RatePlanOptions.php b/app/api/Twilio/Rest/Preview/Wireless/RatePlanOptions.php new file mode 100755 index 0000000..7021e46 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/RatePlanOptions.php @@ -0,0 +1,314 @@ +options['uniqueName'] = $uniqueName; + $this->options['friendlyName'] = $friendlyName; + $this->options['dataEnabled'] = $dataEnabled; + $this->options['dataLimit'] = $dataLimit; + $this->options['dataMetering'] = $dataMetering; + $this->options['messagingEnabled'] = $messagingEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['commandsEnabled'] = $commandsEnabled; + $this->options['nationalRoamingEnabled'] = $nationalRoamingEnabled; + $this->options['internationalRoaming'] = $internationalRoaming; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param bool $dataEnabled + * @return $this Fluent Builder + */ + public function setDataEnabled(bool $dataEnabled): self + { + $this->options['dataEnabled'] = $dataEnabled; + return $this; + } + + /** + * + * + * @param int $dataLimit + * @return $this Fluent Builder + */ + public function setDataLimit(int $dataLimit): self + { + $this->options['dataLimit'] = $dataLimit; + return $this; + } + + /** + * + * + * @param string $dataMetering + * @return $this Fluent Builder + */ + public function setDataMetering(string $dataMetering): self + { + $this->options['dataMetering'] = $dataMetering; + return $this; + } + + /** + * + * + * @param bool $messagingEnabled + * @return $this Fluent Builder + */ + public function setMessagingEnabled(bool $messagingEnabled): self + { + $this->options['messagingEnabled'] = $messagingEnabled; + return $this; + } + + /** + * + * + * @param bool $voiceEnabled + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * + * + * @param bool $commandsEnabled + * @return $this Fluent Builder + */ + public function setCommandsEnabled(bool $commandsEnabled): self + { + $this->options['commandsEnabled'] = $commandsEnabled; + return $this; + } + + /** + * + * + * @param bool $nationalRoamingEnabled + * @return $this Fluent Builder + */ + public function setNationalRoamingEnabled(bool $nationalRoamingEnabled): self + { + $this->options['nationalRoamingEnabled'] = $nationalRoamingEnabled; + return $this; + } + + /** + * + * + * @param string[] $internationalRoaming + * @return $this Fluent Builder + */ + public function setInternationalRoaming(array $internationalRoaming): self + { + $this->options['internationalRoaming'] = $internationalRoaming; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.CreateRatePlanOptions ' . $options . ']'; + } +} + + + + +class UpdateRatePlanOptions extends Options + { + /** + * @param string $uniqueName + * @param string $friendlyName + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $friendlyName = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.UpdateRatePlanOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/RatePlanPage.php b/app/api/Twilio/Rest/Preview/Wireless/RatePlanPage.php new file mode 100755 index 0000000..724d10c --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/RatePlanPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RatePlanInstance \Twilio\Rest\Preview\Wireless\RatePlanInstance + */ + public function buildInstance(array $payload): RatePlanInstance + { + return new RatePlanInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.RatePlanPage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageContext.php b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageContext.php new file mode 100755 index 0000000..4278736 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageContext.php @@ -0,0 +1,93 @@ +solution = [ + 'simSid' => + $simSid, + ]; + + $this->uri = '/Sims/' . \rawurlencode($simSid) + .'/Usage'; + } + + /** + * Fetch the UsageInstance + * + * @param array|Options $options Optional Arguments + * @return UsageInstance Fetched UsageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): UsageInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'End' => + $options['end'], + 'Start' => + $options['start'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new UsageInstance( + $this->version, + $payload, + $this->solution['simSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.UsageContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageInstance.php b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageInstance.php new file mode 100755 index 0000000..7ec8118 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageInstance.php @@ -0,0 +1,133 @@ +properties = [ + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'simUniqueName' => Values::array_get($payload, 'sim_unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'period' => Values::array_get($payload, 'period'), + 'commandsUsage' => Values::array_get($payload, 'commands_usage'), + 'commandsCosts' => Values::array_get($payload, 'commands_costs'), + 'dataUsage' => Values::array_get($payload, 'data_usage'), + 'dataCosts' => Values::array_get($payload, 'data_costs'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['simSid' => $simSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return UsageContext Context for this UsageInstance + */ + protected function proxy(): UsageContext + { + if (!$this->context) { + $this->context = new UsageContext( + $this->version, + $this->solution['simSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the UsageInstance + * + * @param array|Options $options Optional Arguments + * @return UsageInstance Fetched UsageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): UsageInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.UsageInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageList.php b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageList.php new file mode 100755 index 0000000..aa86e33 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageList.php @@ -0,0 +1,67 @@ +solution = [ + 'simSid' => + $simSid, + + ]; + } + + /** + * Constructs a UsageContext + */ + public function getContext( + + ): UsageContext + { + return new UsageContext( + $this->version, + $this->solution['simSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.UsageList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageOptions.php b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageOptions.php new file mode 100755 index 0000000..4f0fb2d --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsageOptions.php @@ -0,0 +1,94 @@ +options['end'] = $end; + $this->options['start'] = $start; + } + + /** + * + * + * @param string $end + * @return $this Fluent Builder + */ + public function setEnd(string $end): self + { + $this->options['end'] = $end; + return $this; + } + + /** + * + * + * @param string $start + * @return $this Fluent Builder + */ + public function setStart(string $start): self + { + $this->options['start'] = $start; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.FetchUsageOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/Sim/UsagePage.php b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsagePage.php new file mode 100755 index 0000000..8e777a7 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/Sim/UsagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsageInstance \Twilio\Rest\Preview\Wireless\Sim\UsageInstance + */ + public function buildInstance(array $payload): UsageInstance + { + return new UsageInstance($this->version, $payload, $this->solution['simSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.UsagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/SimContext.php b/app/api/Twilio/Rest/Preview/Wireless/SimContext.php new file mode 100755 index 0000000..22e33f0 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/SimContext.php @@ -0,0 +1,198 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Sims/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + 'FriendlyName' => + $options['friendlyName'], + 'RatePlan' => + $options['ratePlan'], + 'Status' => + $options['status'], + 'CommandsCallbackMethod' => + $options['commandsCallbackMethod'], + 'CommandsCallbackUrl' => + $options['commandsCallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the usage + */ + protected function getUsage(): UsageList + { + if (!$this->_usage) { + $this->_usage = new UsageList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_usage; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.SimContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/SimInstance.php b/app/api/Twilio/Rest/Preview/Wireless/SimInstance.php new file mode 100755 index 0000000..f527688 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/SimInstance.php @@ -0,0 +1,183 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'ratePlanSid' => Values::array_get($payload, 'rate_plan_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'iccid' => Values::array_get($payload, 'iccid'), + 'eId' => Values::array_get($payload, 'e_id'), + 'status' => Values::array_get($payload, 'status'), + 'commandsCallbackUrl' => Values::array_get($payload, 'commands_callback_url'), + 'commandsCallbackMethod' => Values::array_get($payload, 'commands_callback_method'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SimContext Context for this SimInstance + */ + protected function proxy(): SimContext + { + if (!$this->context) { + $this->context = new SimContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the usage + */ + protected function getUsage(): UsageList + { + return $this->proxy()->usage; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Preview.Wireless.SimInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/SimList.php b/app/api/Twilio/Rest/Preview/Wireless/SimList.php new file mode 100755 index 0000000..935b2f3 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/SimList.php @@ -0,0 +1,176 @@ +solution = [ + ]; + + $this->uri = '/Sims'; + } + + /** + * Reads SimInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SimInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SimInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SimInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SimPage Page of SimInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SimPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'Iccid' => + $options['iccid'], + 'RatePlan' => + $options['ratePlan'], + 'EId' => + $options['eId'], + 'SimRegistrationCode' => + $options['simRegistrationCode'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SimPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SimInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SimPage Page of SimInstance + */ + public function getPage(string $targetUrl): SimPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SimPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SimContext + * + * @param string $sid + */ + public function getContext( + string $sid + + ): SimContext + { + return new SimContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.SimList]'; + } +} diff --git a/app/api/Twilio/Rest/Preview/Wireless/SimOptions.php b/app/api/Twilio/Rest/Preview/Wireless/SimOptions.php new file mode 100755 index 0000000..49532ff --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/SimOptions.php @@ -0,0 +1,472 @@ +options['status'] = $status; + $this->options['iccid'] = $iccid; + $this->options['ratePlan'] = $ratePlan; + $this->options['eId'] = $eId; + $this->options['simRegistrationCode'] = $simRegistrationCode; + } + + /** + * + * + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * + * + * @param string $iccid + * @return $this Fluent Builder + */ + public function setIccid(string $iccid): self + { + $this->options['iccid'] = $iccid; + return $this; + } + + /** + * + * + * @param string $ratePlan + * @return $this Fluent Builder + */ + public function setRatePlan(string $ratePlan): self + { + $this->options['ratePlan'] = $ratePlan; + return $this; + } + + /** + * + * + * @param string $eId + * @return $this Fluent Builder + */ + public function setEId(string $eId): self + { + $this->options['eId'] = $eId; + return $this; + } + + /** + * + * + * @param string $simRegistrationCode + * @return $this Fluent Builder + */ + public function setSimRegistrationCode(string $simRegistrationCode): self + { + $this->options['simRegistrationCode'] = $simRegistrationCode; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.ReadSimOptions ' . $options . ']'; + } +} + +class UpdateSimOptions extends Options + { + /** + * @param string $uniqueName + * @param string $callbackMethod + * @param string $callbackUrl + * @param string $friendlyName + * @param string $ratePlan + * @param string $status + * @param string $commandsCallbackMethod + * @param string $commandsCallbackUrl + * @param string $smsFallbackMethod + * @param string $smsFallbackUrl + * @param string $smsMethod + * @param string $smsUrl + * @param string $voiceFallbackMethod + * @param string $voiceFallbackUrl + * @param string $voiceMethod + * @param string $voiceUrl + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $callbackMethod = Values::NONE, + string $callbackUrl = Values::NONE, + string $friendlyName = Values::NONE, + string $ratePlan = Values::NONE, + string $status = Values::NONE, + string $commandsCallbackMethod = Values::NONE, + string $commandsCallbackUrl = Values::NONE, + string $smsFallbackMethod = Values::NONE, + string $smsFallbackUrl = Values::NONE, + string $smsMethod = Values::NONE, + string $smsUrl = Values::NONE, + string $voiceFallbackMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceUrl = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['friendlyName'] = $friendlyName; + $this->options['ratePlan'] = $ratePlan; + $this->options['status'] = $status; + $this->options['commandsCallbackMethod'] = $commandsCallbackMethod; + $this->options['commandsCallbackUrl'] = $commandsCallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + } + + /** + * + * + * @param string $uniqueName + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * + * + * @param string $callbackMethod + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * + * + * @param string $callbackUrl + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * + * + * @param string $ratePlan + * @return $this Fluent Builder + */ + public function setRatePlan(string $ratePlan): self + { + $this->options['ratePlan'] = $ratePlan; + return $this; + } + + /** + * + * + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * + * + * @param string $commandsCallbackMethod + * @return $this Fluent Builder + */ + public function setCommandsCallbackMethod(string $commandsCallbackMethod): self + { + $this->options['commandsCallbackMethod'] = $commandsCallbackMethod; + return $this; + } + + /** + * + * + * @param string $commandsCallbackUrl + * @return $this Fluent Builder + */ + public function setCommandsCallbackUrl(string $commandsCallbackUrl): self + { + $this->options['commandsCallbackUrl'] = $commandsCallbackUrl; + return $this; + } + + /** + * + * + * @param string $smsFallbackMethod + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * + * + * @param string $smsFallbackUrl + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * + * + * @param string $smsMethod + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * + * + * @param string $smsUrl + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * + * + * @param string $voiceFallbackMethod + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * + * + * @param string $voiceFallbackUrl + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * + * + * @param string $voiceMethod + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * + * + * @param string $voiceUrl + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Preview.Wireless.UpdateSimOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Preview/Wireless/SimPage.php b/app/api/Twilio/Rest/Preview/Wireless/SimPage.php new file mode 100755 index 0000000..b2ce025 --- /dev/null +++ b/app/api/Twilio/Rest/Preview/Wireless/SimPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SimInstance \Twilio\Rest\Preview\Wireless\SimInstance + */ + public function buildInstance(array $payload): SimInstance + { + return new SimInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Preview.Wireless.SimPage]'; + } +} diff --git a/app/api/Twilio/Rest/PreviewBase.php b/app/api/Twilio/Rest/PreviewBase.php new file mode 100755 index 0000000..3e747f0 --- /dev/null +++ b/app/api/Twilio/Rest/PreviewBase.php @@ -0,0 +1,153 @@ +baseUrl = 'https://preview.twilio.com'; + } + + + /** + * @return DeployedDevices Version deployedDevices of preview + */ + protected function getDeployedDevices(): DeployedDevices { + if (!$this->_deployedDevices) { + $this->_deployedDevices = new DeployedDevices($this); + } + return $this->_deployedDevices; + } + + /** + * @return HostedNumbers Version hostedNumbers of preview + */ + protected function getHostedNumbers(): HostedNumbers { + if (!$this->_hostedNumbers) { + $this->_hostedNumbers = new HostedNumbers($this); + } + return $this->_hostedNumbers; + } + + /** + * @return Sync Version sync of preview + */ + protected function getSync(): Sync { + if (!$this->_sync) { + $this->_sync = new Sync($this); + } + return $this->_sync; + } + + /** + * @return Marketplace Version marketplace of preview + */ + protected function getMarketplace(): Marketplace { + if (!$this->_marketplace) { + $this->_marketplace = new Marketplace($this); + } + return $this->_marketplace; + } + + /** + * @return Understand Version understand of preview + */ + protected function getUnderstand(): Understand { + if (!$this->_understand) { + $this->_understand = new Understand($this); + } + return $this->_understand; + } + + /** + * @return Wireless Version wireless of preview + */ + protected function getWireless(): Wireless { + if (!$this->_wireless) { + $this->_wireless = new Wireless($this); + } + return $this->_wireless; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Preview]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing.php b/app/api/Twilio/Rest/Pricing.php new file mode 100755 index 0000000..de239d3 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing.php @@ -0,0 +1,68 @@ +messaging instead. + */ + protected function getMessaging(): \Twilio\Rest\Pricing\V1\MessagingList { + echo "messaging is deprecated. Use v1->messaging instead."; + return $this->v1->messaging; + } + + /** + * @deprecated Use v1->phoneNumbers instead. + */ + protected function getPhoneNumbers(): \Twilio\Rest\Pricing\V1\PhoneNumberList { + echo "phoneNumbers is deprecated. Use v1->phoneNumbers instead."; + return $this->v1->phoneNumbers; + } + + /** + * @deprecated Use v2->voice instead. + */ + protected function getVoice(): \Twilio\Rest\Pricing\V2\VoiceList { + echo "voice is deprecated. Use v2->voice instead."; + return $this->v2->voice; + } + + /** + * @deprecated Use v2->countries instead. + */ + protected function getCountries(): \Twilio\Rest\Pricing\V2\CountryList { + echo "countries is deprecated. Use v2->countries instead."; + return $this->v2->countries; + } + + /** + * @deprecated Use v2->countries(\$isoCountry) instead. + * @param string $isoCountry The ISO country code of the pricing information to + * fetch + */ + protected function contextCountries(string $isoCountry): \Twilio\Rest\Pricing\V2\CountryContext { + echo "countries(\$isoCountry) is deprecated. Use v2->countries(\$isoCountry) instead."; + return $this->v2->countries($isoCountry); + } + + /** + * @deprecated Use v2->numbers instead. + */ + protected function getNumbers(): \Twilio\Rest\Pricing\V2\NumberList { + echo "numbers is deprecated. Use v2->numbers instead."; + return $this->v2->numbers; + } + + /** + * @deprecated Use v2->numbers(\$destinationNumber) instead. + * @param string $destinationNumber The destination number for which to fetch + * pricing information + */ + protected function contextNumbers(string $destinationNumber): \Twilio\Rest\Pricing\V2\NumberContext { + echo "numbers(\$destinationNumber) is deprecated. Use v2->numbers(\$destinationNumber) instead."; + return $this->v2->numbers($destinationNumber); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Pricing/V1.php b/app/api/Twilio/Rest/Pricing/V1.php new file mode 100755 index 0000000..7597112 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1.php @@ -0,0 +1,116 @@ +version = 'v1'; + } + + protected function getMessaging(): MessagingList + { + if (!$this->_messaging) { + $this->_messaging = new MessagingList($this); + } + return $this->_messaging; + } + + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList($this); + } + return $this->_phoneNumbers; + } + + protected function getVoice(): VoiceList + { + if (!$this->_voice) { + $this->_voice = new VoiceList($this); + } + return $this->_voice; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryContext.php b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryContext.php new file mode 100755 index 0000000..4fc32fd --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryContext.php @@ -0,0 +1,81 @@ +solution = [ + 'isoCountry' => + $isoCountry, + ]; + + $this->uri = '/Messaging/Countries/' . \rawurlencode($isoCountry) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCountry'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryInstance.php b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryInstance.php new file mode 100755 index 0000000..426fe02 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'outboundSmsPrices' => Values::array_get($payload, 'outbound_sms_prices'), + 'inboundSmsPrices' => Values::array_get($payload, 'inbound_sms_prices'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['isoCountry' => $isoCountry ?: $this->properties['isoCountry'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCountry'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryList.php b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryList.php new file mode 100755 index 0000000..9bcb868 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Messaging/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCountry The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + */ + public function getContext( + string $isoCountry + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCountry + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryPage.php b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryPage.php new file mode 100755 index 0000000..a9b4034 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Messaging/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Pricing\V1\Messaging\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/MessagingInstance.php b/app/api/Twilio/Rest/Pricing/V1/MessagingInstance.php new file mode 100755 index 0000000..6daaf96 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/MessagingInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.MessagingInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/MessagingList.php b/app/api/Twilio/Rest/Pricing/V1/MessagingList.php new file mode 100755 index 0000000..ba9b0d8 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/MessagingList.php @@ -0,0 +1,106 @@ +solution = [ + ]; + } + + /** + * Access the countries + */ + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList( + $this->version + ); + } + return $this->_countries; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.MessagingList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/MessagingPage.php b/app/api/Twilio/Rest/Pricing/V1/MessagingPage.php new file mode 100755 index 0000000..3be5737 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/MessagingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessagingInstance \Twilio\Rest\Pricing\V1\MessagingInstance + */ + public function buildInstance(array $payload): MessagingInstance + { + return new MessagingInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.MessagingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryContext.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryContext.php new file mode 100755 index 0000000..b16cf50 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryContext.php @@ -0,0 +1,81 @@ +solution = [ + 'isoCountry' => + $isoCountry, + ]; + + $this->uri = '/PhoneNumbers/Countries/' . \rawurlencode($isoCountry) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCountry'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryInstance.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryInstance.php new file mode 100755 index 0000000..4a34b65 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'phoneNumberPrices' => Values::array_get($payload, 'phone_number_prices'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['isoCountry' => $isoCountry ?: $this->properties['isoCountry'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCountry'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryList.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryList.php new file mode 100755 index 0000000..60ca5cf --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/PhoneNumbers/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCountry The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + */ + public function getContext( + string $isoCountry + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCountry + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryPage.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryPage.php new file mode 100755 index 0000000..91bc5d8 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumber/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Pricing\V1\PhoneNumber\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumberInstance.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberInstance.php new file mode 100755 index 0000000..2f64415 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.PhoneNumberInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumberList.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberList.php new file mode 100755 index 0000000..fa8d05b --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberList.php @@ -0,0 +1,106 @@ +solution = [ + ]; + } + + /** + * Access the countries + */ + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList( + $this->version + ); + } + return $this->_countries; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/PhoneNumberPage.php b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberPage.php new file mode 100755 index 0000000..6571f5b --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Pricing\V1\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/CountryContext.php b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryContext.php new file mode 100755 index 0000000..b1c8de0 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryContext.php @@ -0,0 +1,81 @@ +solution = [ + 'isoCountry' => + $isoCountry, + ]; + + $this->uri = '/Voice/Countries/' . \rawurlencode($isoCountry) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCountry'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/CountryInstance.php b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryInstance.php new file mode 100755 index 0000000..feab23f --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'outboundPrefixPrices' => Values::array_get($payload, 'outbound_prefix_prices'), + 'inboundCallPrices' => Values::array_get($payload, 'inbound_call_prices'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['isoCountry' => $isoCountry ?: $this->properties['isoCountry'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCountry'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/CountryList.php b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryList.php new file mode 100755 index 0000000..242d495 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Voice/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCountry The [ISO country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the pricing information to fetch. + */ + public function getContext( + string $isoCountry + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCountry + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/CountryPage.php b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryPage.php new file mode 100755 index 0000000..ecdbd2a --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Pricing\V1\Voice\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/NumberContext.php b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberContext.php new file mode 100755 index 0000000..e4f9972 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberContext.php @@ -0,0 +1,81 @@ +solution = [ + 'number' => + $number, + ]; + + $this->uri = '/Voice/Numbers/' . \rawurlencode($number) + .''; + } + + /** + * Fetch the NumberInstance + * + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NumberInstance( + $this->version, + $payload, + $this->solution['number'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.NumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/NumberInstance.php b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberInstance.php new file mode 100755 index 0000000..a23a460 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'number' => Values::array_get($payload, 'number'), + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'outboundCallPrice' => Values::array_get($payload, 'outbound_call_price'), + 'inboundCallPrice' => Values::array_get($payload, 'inbound_call_price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['number' => $number ?: $this->properties['number'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NumberContext Context for this NumberInstance + */ + protected function proxy(): NumberContext + { + if (!$this->context) { + $this->context = new NumberContext( + $this->version, + $this->solution['number'] + ); + } + + return $this->context; + } + + /** + * Fetch the NumberInstance + * + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V1.NumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/NumberList.php b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberList.php new file mode 100755 index 0000000..cacc324 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a NumberContext + * + * @param string $number The phone number to fetch. + */ + public function getContext( + string $number + + ): NumberContext + { + return new NumberContext( + $this->version, + $number + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.NumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/Voice/NumberPage.php b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberPage.php new file mode 100755 index 0000000..f29bbfe --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/Voice/NumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NumberInstance \Twilio\Rest\Pricing\V1\Voice\NumberInstance + */ + public function buildInstance(array $payload): NumberInstance + { + return new NumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.NumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/VoiceInstance.php b/app/api/Twilio/Rest/Pricing/V1/VoiceInstance.php new file mode 100755 index 0000000..9086d3c --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/VoiceInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.VoiceInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V1/VoiceList.php b/app/api/Twilio/Rest/Pricing/V1/VoiceList.php new file mode 100755 index 0000000..54609fc --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/VoiceList.php @@ -0,0 +1,123 @@ +solution = [ + ]; + } + + /** + * Access the countries + */ + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList( + $this->version + ); + } + return $this->_countries; + } + + /** + * Access the numbers + */ + protected function getNumbers(): NumberList + { + if (!$this->_numbers) { + $this->_numbers = new NumberList( + $this->version + ); + } + return $this->_numbers; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.VoiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V1/VoicePage.php b/app/api/Twilio/Rest/Pricing/V1/VoicePage.php new file mode 100755 index 0000000..10f58d2 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V1/VoicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VoiceInstance \Twilio\Rest\Pricing\V1\VoiceInstance + */ + public function buildInstance(array $payload): VoiceInstance + { + return new VoiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V1.VoicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2.php b/app/api/Twilio/Rest/Pricing/V2.php new file mode 100755 index 0000000..049b162 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2.php @@ -0,0 +1,118 @@ +version = 'v2'; + } + + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList($this); + } + return $this->_countries; + } + + protected function getNumbers(): NumberList + { + if (!$this->_numbers) { + $this->_numbers = new NumberList($this); + } + return $this->_numbers; + } + + protected function getVoice(): VoiceList + { + if (!$this->_voice) { + $this->_voice = new VoiceList($this); + } + return $this->_voice; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/CountryContext.php b/app/api/Twilio/Rest/Pricing/V2/CountryContext.php new file mode 100755 index 0000000..8442615 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/CountryContext.php @@ -0,0 +1,81 @@ +solution = [ + 'isoCountry' => + $isoCountry, + ]; + + $this->uri = '/Trunking/Countries/' . \rawurlencode($isoCountry) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCountry'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/CountryInstance.php b/app/api/Twilio/Rest/Pricing/V2/CountryInstance.php new file mode 100755 index 0000000..14e1655 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/CountryInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'terminatingPrefixPrices' => Values::array_get($payload, 'terminating_prefix_prices'), + 'originatingCallPrices' => Values::array_get($payload, 'originating_call_prices'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['isoCountry' => $isoCountry ?: $this->properties['isoCountry'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCountry'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/CountryList.php b/app/api/Twilio/Rest/Pricing/V2/CountryList.php new file mode 100755 index 0000000..7a21f4c --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/CountryList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Trunking/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCountry The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + */ + public function getContext( + string $isoCountry + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCountry + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/CountryPage.php b/app/api/Twilio/Rest/Pricing/V2/CountryPage.php new file mode 100755 index 0000000..2a062b3 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Pricing\V2\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/NumberContext.php b/app/api/Twilio/Rest/Pricing/V2/NumberContext.php new file mode 100755 index 0000000..7e8c73c --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/NumberContext.php @@ -0,0 +1,91 @@ +solution = [ + 'destinationNumber' => + $destinationNumber, + ]; + + $this->uri = '/Trunking/Numbers/' . \rawurlencode($destinationNumber) + .''; + } + + /** + * Fetch the NumberInstance + * + * @param array|Options $options Optional Arguments + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): NumberInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'OriginationNumber' => + $options['originationNumber'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new NumberInstance( + $this->version, + $payload, + $this->solution['destinationNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.NumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/NumberInstance.php b/app/api/Twilio/Rest/Pricing/V2/NumberInstance.php new file mode 100755 index 0000000..bbbed66 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/NumberInstance.php @@ -0,0 +1,131 @@ +properties = [ + 'destinationNumber' => Values::array_get($payload, 'destination_number'), + 'originationNumber' => Values::array_get($payload, 'origination_number'), + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'terminatingPrefixPrices' => Values::array_get($payload, 'terminating_prefix_prices'), + 'originatingCallPrice' => Values::array_get($payload, 'originating_call_price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['destinationNumber' => $destinationNumber ?: $this->properties['destinationNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NumberContext Context for this NumberInstance + */ + protected function proxy(): NumberContext + { + if (!$this->context) { + $this->context = new NumberContext( + $this->version, + $this->solution['destinationNumber'] + ); + } + + return $this->context; + } + + /** + * Fetch the NumberInstance + * + * @param array|Options $options Optional Arguments + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): NumberInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.NumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/NumberList.php b/app/api/Twilio/Rest/Pricing/V2/NumberList.php new file mode 100755 index 0000000..185a9ab --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/NumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a NumberContext + * + * @param string $destinationNumber The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + */ + public function getContext( + string $destinationNumber + + ): NumberContext + { + return new NumberContext( + $this->version, + $destinationNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.NumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/NumberOptions.php b/app/api/Twilio/Rest/Pricing/V2/NumberOptions.php new file mode 100755 index 0000000..5f54ff1 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/NumberOptions.php @@ -0,0 +1,76 @@ +options['originationNumber'] = $originationNumber; + } + + /** + * The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + * + * @param string $originationNumber The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + * @return $this Fluent Builder + */ + public function setOriginationNumber(string $originationNumber): self + { + $this->options['originationNumber'] = $originationNumber; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Pricing.V2.FetchNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/NumberPage.php b/app/api/Twilio/Rest/Pricing/V2/NumberPage.php new file mode 100755 index 0000000..57d41a2 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/NumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NumberInstance \Twilio\Rest\Pricing\V2\NumberInstance + */ + public function buildInstance(array $payload): NumberInstance + { + return new NumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.NumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/CountryContext.php b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryContext.php new file mode 100755 index 0000000..e093357 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryContext.php @@ -0,0 +1,81 @@ +solution = [ + 'isoCountry' => + $isoCountry, + ]; + + $this->uri = '/Voice/Countries/' . \rawurlencode($isoCountry) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCountry'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/CountryInstance.php b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryInstance.php new file mode 100755 index 0000000..fb4211f --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'outboundPrefixPrices' => Values::array_get($payload, 'outbound_prefix_prices'), + 'inboundCallPrices' => Values::array_get($payload, 'inbound_call_prices'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['isoCountry' => $isoCountry ?: $this->properties['isoCountry'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCountry'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/CountryList.php b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryList.php new file mode 100755 index 0000000..462ebc8 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Voice/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCountry The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the origin-based voice pricing information to fetch. + */ + public function getContext( + string $isoCountry + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCountry + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/CountryPage.php b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryPage.php new file mode 100755 index 0000000..bd7a461 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Pricing\V2\Voice\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/NumberContext.php b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberContext.php new file mode 100755 index 0000000..88be2cd --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberContext.php @@ -0,0 +1,91 @@ +solution = [ + 'destinationNumber' => + $destinationNumber, + ]; + + $this->uri = '/Voice/Numbers/' . \rawurlencode($destinationNumber) + .''; + } + + /** + * Fetch the NumberInstance + * + * @param array|Options $options Optional Arguments + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): NumberInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'OriginationNumber' => + $options['originationNumber'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new NumberInstance( + $this->version, + $payload, + $this->solution['destinationNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.NumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/NumberInstance.php b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberInstance.php new file mode 100755 index 0000000..584d63b --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberInstance.php @@ -0,0 +1,131 @@ +properties = [ + 'destinationNumber' => Values::array_get($payload, 'destination_number'), + 'originationNumber' => Values::array_get($payload, 'origination_number'), + 'country' => Values::array_get($payload, 'country'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'outboundCallPrices' => Values::array_get($payload, 'outbound_call_prices'), + 'inboundCallPrice' => Values::array_get($payload, 'inbound_call_price'), + 'priceUnit' => Values::array_get($payload, 'price_unit'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['destinationNumber' => $destinationNumber ?: $this->properties['destinationNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NumberContext Context for this NumberInstance + */ + protected function proxy(): NumberContext + { + if (!$this->context) { + $this->context = new NumberContext( + $this->version, + $this->solution['destinationNumber'] + ); + } + + return $this->context; + } + + /** + * Fetch the NumberInstance + * + * @param array|Options $options Optional Arguments + * @return NumberInstance Fetched NumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): NumberInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Pricing.V2.NumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/NumberList.php b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberList.php new file mode 100755 index 0000000..66d800b --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a NumberContext + * + * @param string $destinationNumber The destination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + */ + public function getContext( + string $destinationNumber + + ): NumberContext + { + return new NumberContext( + $this->version, + $destinationNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.NumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/NumberOptions.php b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberOptions.php new file mode 100755 index 0000000..310d180 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberOptions.php @@ -0,0 +1,76 @@ +options['originationNumber'] = $originationNumber; + } + + /** + * The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + * + * @param string $originationNumber The origination phone number, in [E.164](https://www.twilio.com/docs/glossary/what-e164) format, for which to fetch the origin-based voice pricing information. E.164 format consists of a + followed by the country code and subscriber number. + * @return $this Fluent Builder + */ + public function setOriginationNumber(string $originationNumber): self + { + $this->options['originationNumber'] = $originationNumber; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Pricing.V2.FetchNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/Voice/NumberPage.php b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberPage.php new file mode 100755 index 0000000..45702eb --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/Voice/NumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NumberInstance \Twilio\Rest\Pricing\V2\Voice\NumberInstance + */ + public function buildInstance(array $payload): NumberInstance + { + return new NumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.NumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/VoiceInstance.php b/app/api/Twilio/Rest/Pricing/V2/VoiceInstance.php new file mode 100755 index 0000000..39ab5c0 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/VoiceInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.VoiceInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Pricing/V2/VoiceList.php b/app/api/Twilio/Rest/Pricing/V2/VoiceList.php new file mode 100755 index 0000000..ab6ee94 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/VoiceList.php @@ -0,0 +1,123 @@ +solution = [ + ]; + } + + /** + * Access the countries + */ + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList( + $this->version + ); + } + return $this->_countries; + } + + /** + * Access the numbers + */ + protected function getNumbers(): NumberList + { + if (!$this->_numbers) { + $this->_numbers = new NumberList( + $this->version + ); + } + return $this->_numbers; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.VoiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Pricing/V2/VoicePage.php b/app/api/Twilio/Rest/Pricing/V2/VoicePage.php new file mode 100755 index 0000000..3d04135 --- /dev/null +++ b/app/api/Twilio/Rest/Pricing/V2/VoicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VoiceInstance \Twilio\Rest\Pricing\V2\VoiceInstance + */ + public function buildInstance(array $payload): VoiceInstance + { + return new VoiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Pricing.V2.VoicePage]'; + } +} diff --git a/app/api/Twilio/Rest/PricingBase.php b/app/api/Twilio/Rest/PricingBase.php new file mode 100755 index 0000000..a08bd9d --- /dev/null +++ b/app/api/Twilio/Rest/PricingBase.php @@ -0,0 +1,101 @@ +baseUrl = 'https://pricing.twilio.com'; + } + + + /** + * @return V1 Version v1 of pricing + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of pricing + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Pricing]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy.php b/app/api/Twilio/Rest/Proxy.php new file mode 100755 index 0000000..a7ca292 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy.php @@ -0,0 +1,25 @@ +services instead. + */ + protected function getServices(): \Twilio\Rest\Proxy\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextServices(string $sid): \Twilio\Rest\Proxy\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Proxy/V1.php b/app/api/Twilio/Rest/Proxy/V1.php new file mode 100755 index 0000000..d9c67cd --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberContext.php new file mode 100755 index 0000000..65bd3ea --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberContext.php @@ -0,0 +1,131 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/PhoneNumbers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Updated PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PhoneNumberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IsReserved' => + Serialize::booleanToString($options['isReserved']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberInstance.php new file mode 100755 index 0000000..764226d --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'url' => Values::array_get($payload, 'url'), + 'isReserved' => Values::array_get($payload, 'is_reserved'), + 'inUse' => Values::array_get($payload, 'in_use'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Updated PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PhoneNumberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberList.php b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberList.php new file mode 100755 index 0000000..7a824f8 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberList.php @@ -0,0 +1,202 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/PhoneNumbers'; + } + + /** + * Create the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Created PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): PhoneNumberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Sid' => + $options['sid'], + 'PhoneNumber' => + $options['phoneNumber'], + 'IsReserved' => + Serialize::booleanToString($options['isReserved']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads PhoneNumberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PhoneNumberInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PhoneNumberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PhoneNumberPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function getPage(string $targetUrl): PhoneNumberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PhoneNumberContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the PhoneNumber resource to delete. + */ + public function getContext( + string $sid + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberOptions.php b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberOptions.php new file mode 100755 index 0000000..d15e852 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberOptions.php @@ -0,0 +1,170 @@ +options['sid'] = $sid; + $this->options['phoneNumber'] = $phoneNumber; + $this->options['isReserved'] = $isReserved; + } + + /** + * The SID of a Twilio [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the Twilio Number you would like to assign to your Proxy Service. + * + * @param string $sid The SID of a Twilio [IncomingPhoneNumber](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) resource that represents the Twilio Number you would like to assign to your Proxy Service. + * @return $this Fluent Builder + */ + public function setSid(string $sid): self + { + $this->options['sid'] = $sid; + return $this; + } + + /** + * The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * + * @param string $phoneNumber The phone number in [E.164](https://www.twilio.com/docs/glossary/what-e164) format. E.164 phone numbers consist of a + followed by the country code and subscriber number without punctuation characters. For example, +14155551234. + * @return $this Fluent Builder + */ + public function setPhoneNumber(string $phoneNumber): self + { + $this->options['phoneNumber'] = $phoneNumber; + return $this; + } + + /** + * Whether the new phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * + * @param bool $isReserved Whether the new phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * @return $this Fluent Builder + */ + public function setIsReserved(bool $isReserved): self + { + $this->options['isReserved'] = $isReserved; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.CreatePhoneNumberOptions ' . $options . ']'; + } +} + + + + +class UpdatePhoneNumberOptions extends Options + { + /** + * @param bool $isReserved Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + */ + public function __construct( + + bool $isReserved = Values::BOOL_NONE + + ) { + $this->options['isReserved'] = $isReserved; + } + + /** + * Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * + * @param bool $isReserved Whether the phone number should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * @return $this Fluent Builder + */ + public function setIsReserved(bool $isReserved): self + { + $this->options['isReserved'] = $isReserved; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.UpdatePhoneNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberPage.php b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberPage.php new file mode 100755 index 0000000..a062040 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Proxy\V1\Service\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionContext.php new file mode 100755 index 0000000..15e0d42 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionContext.php @@ -0,0 +1,106 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sessionSid' => + $sessionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Interactions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the InteractionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the InteractionInstance + * + * @return InteractionInstance Fetched InteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new InteractionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.InteractionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionInstance.php new file mode 100755 index 0000000..819b96c --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'sessionSid' => Values::array_get($payload, 'session_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'data' => Values::array_get($payload, 'data'), + 'type' => Values::array_get($payload, 'type'), + 'inboundParticipantSid' => Values::array_get($payload, 'inbound_participant_sid'), + 'inboundResourceSid' => Values::array_get($payload, 'inbound_resource_sid'), + 'inboundResourceStatus' => Values::array_get($payload, 'inbound_resource_status'), + 'inboundResourceType' => Values::array_get($payload, 'inbound_resource_type'), + 'inboundResourceUrl' => Values::array_get($payload, 'inbound_resource_url'), + 'outboundParticipantSid' => Values::array_get($payload, 'outbound_participant_sid'), + 'outboundResourceSid' => Values::array_get($payload, 'outbound_resource_sid'), + 'outboundResourceStatus' => Values::array_get($payload, 'outbound_resource_status'), + 'outboundResourceType' => Values::array_get($payload, 'outbound_resource_type'), + 'outboundResourceUrl' => Values::array_get($payload, 'outbound_resource_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sessionSid' => $sessionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return InteractionContext Context for this InteractionInstance + */ + protected function proxy(): InteractionContext + { + if (!$this->context) { + $this->context = new InteractionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the InteractionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the InteractionInstance + * + * @return InteractionInstance Fetched InteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): InteractionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.InteractionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionList.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionList.php new file mode 100755 index 0000000..25e7f09 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'sessionSid' => + $sessionSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Interactions'; + } + + /** + * Reads InteractionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return InteractionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams InteractionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of InteractionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return InteractionPage Page of InteractionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): InteractionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new InteractionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of InteractionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return InteractionPage Page of InteractionInstance + */ + public function getPage(string $targetUrl): InteractionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new InteractionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a InteractionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Interaction resource to delete. + */ + public function getContext( + string $sid + + ): InteractionContext + { + return new InteractionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.InteractionList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionPage.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionPage.php new file mode 100755 index 0000000..e5e7971 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/InteractionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return InteractionInstance \Twilio\Rest\Proxy\V1\Service\Session\InteractionInstance + */ + public function buildInstance(array $payload): InteractionInstance + { + return new InteractionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['sessionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.InteractionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionContext.php new file mode 100755 index 0000000..15a84f2 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionContext.php @@ -0,0 +1,99 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sessionSid' => + $sessionSid, + 'participantSid' => + $participantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/MessageInteractions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the MessageInteractionInstance + * + * @return MessageInteractionInstance Fetched MessageInteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInteractionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessageInteractionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.MessageInteractionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionInstance.php new file mode 100755 index 0000000..17207aa --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'sessionSid' => Values::array_get($payload, 'session_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'data' => Values::array_get($payload, 'data'), + 'type' => Values::array_get($payload, 'type'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'inboundParticipantSid' => Values::array_get($payload, 'inbound_participant_sid'), + 'inboundResourceSid' => Values::array_get($payload, 'inbound_resource_sid'), + 'inboundResourceStatus' => Values::array_get($payload, 'inbound_resource_status'), + 'inboundResourceType' => Values::array_get($payload, 'inbound_resource_type'), + 'inboundResourceUrl' => Values::array_get($payload, 'inbound_resource_url'), + 'outboundParticipantSid' => Values::array_get($payload, 'outbound_participant_sid'), + 'outboundResourceSid' => Values::array_get($payload, 'outbound_resource_sid'), + 'outboundResourceStatus' => Values::array_get($payload, 'outbound_resource_status'), + 'outboundResourceType' => Values::array_get($payload, 'outbound_resource_type'), + 'outboundResourceUrl' => Values::array_get($payload, 'outbound_resource_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sessionSid' => $sessionSid, 'participantSid' => $participantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessageInteractionContext Context for this MessageInteractionInstance + */ + protected function proxy(): MessageInteractionContext + { + if (!$this->context) { + $this->context = new MessageInteractionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the MessageInteractionInstance + * + * @return MessageInteractionInstance Fetched MessageInteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessageInteractionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.MessageInteractionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionList.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionList.php new file mode 100755 index 0000000..600b7d4 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionList.php @@ -0,0 +1,216 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'sessionSid' => + $sessionSid, + + 'participantSid' => + $participantSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/MessageInteractions'; + } + + /** + * Create the MessageInteractionInstance + * + * @param array|Options $options Optional Arguments + * @return MessageInteractionInstance Created MessageInteractionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): MessageInteractionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Body' => + $options['body'], + 'MediaUrl' => + Serialize::map($options['mediaUrl'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MessageInteractionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['participantSid'] + ); + } + + + /** + * Reads MessageInteractionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessageInteractionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams MessageInteractionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessageInteractionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessageInteractionPage Page of MessageInteractionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessageInteractionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessageInteractionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessageInteractionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessageInteractionPage Page of MessageInteractionInstance + */ + public function getPage(string $targetUrl): MessageInteractionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessageInteractionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessageInteractionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the MessageInteraction resource to fetch. + */ + public function getContext( + string $sid + + ): MessageInteractionContext + { + return new MessageInteractionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['participantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.MessageInteractionList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionOptions.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionOptions.php new file mode 100755 index 0000000..4d481a0 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionOptions.php @@ -0,0 +1,98 @@ +options['body'] = $body; + $this->options['mediaUrl'] = $mediaUrl; + } + + /** + * The message to send to the participant + * + * @param string $body The message to send to the participant + * @return $this Fluent Builder + */ + public function setBody(string $body): self + { + $this->options['body'] = $body; + return $this; + } + + /** + * Reserved. Not currently supported. + * + * @param string[] $mediaUrl Reserved. Not currently supported. + * @return $this Fluent Builder + */ + public function setMediaUrl(array $mediaUrl): self + { + $this->options['mediaUrl'] = $mediaUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.CreateMessageInteractionOptions ' . $options . ']'; + } +} + + + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionPage.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionPage.php new file mode 100755 index 0000000..6983b36 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/Participant/MessageInteractionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessageInteractionInstance \Twilio\Rest\Proxy\V1\Service\Session\Participant\MessageInteractionInstance + */ + public function buildInstance(array $payload): MessageInteractionInstance + { + return new MessageInteractionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['sessionSid'], $this->solution['participantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.MessageInteractionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantContext.php new file mode 100755 index 0000000..3bf84aa --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantContext.php @@ -0,0 +1,166 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sessionSid' => + $sessionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Participants/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ParticipantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the messageInteractions + */ + protected function getMessageInteractions(): MessageInteractionList + { + if (!$this->_messageInteractions) { + $this->_messageInteractions = new MessageInteractionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['sid'] + ); + } + + return $this->_messageInteractions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantInstance.php new file mode 100755 index 0000000..e595ad7 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'sessionSid' => Values::array_get($payload, 'session_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'identifier' => Values::array_get($payload, 'identifier'), + 'proxyIdentifier' => Values::array_get($payload, 'proxy_identifier'), + 'proxyIdentifierSid' => Values::array_get($payload, 'proxy_identifier_sid'), + 'dateDeleted' => Deserialize::dateTime(Values::array_get($payload, 'date_deleted')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sessionSid' => $sessionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ParticipantInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the messageInteractions + */ + protected function getMessageInteractions(): MessageInteractionList + { + return $this->proxy()->messageInteractions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantList.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantList.php new file mode 100755 index 0000000..0740ffb --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantList.php @@ -0,0 +1,212 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'sessionSid' => + $sessionSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sessionSid) + .'/Participants'; + } + + /** + * Create the ParticipantInstance + * + * @param string $identifier The phone number of the Participant. + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Created ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identifier, array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identifier' => + $identifier, + 'FriendlyName' => + $options['friendlyName'], + 'ProxyIdentifier' => + $options['proxyIdentifier'], + 'ProxyIdentifierSid' => + $options['proxyIdentifierSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sessionSid'] + ); + } + + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Participant resource to delete. + */ + public function getContext( + string $sid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sessionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantOptions.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantOptions.php new file mode 100755 index 0000000..0f79064 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantOptions.php @@ -0,0 +1,118 @@ +options['friendlyName'] = $friendlyName; + $this->options['proxyIdentifier'] = $proxyIdentifier; + $this->options['proxyIdentifierSid'] = $proxyIdentifierSid; + } + + /** + * The string that you assigned to describe the participant. This value must be 255 characters or fewer. **This value should not have PII.** + * + * @param string $friendlyName The string that you assigned to describe the participant. This value must be 255 characters or fewer. **This value should not have PII.** + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The proxy phone number to use for the Participant. If not specified, Proxy will select a number from the pool. + * + * @param string $proxyIdentifier The proxy phone number to use for the Participant. If not specified, Proxy will select a number from the pool. + * @return $this Fluent Builder + */ + public function setProxyIdentifier(string $proxyIdentifier): self + { + $this->options['proxyIdentifier'] = $proxyIdentifier; + return $this; + } + + /** + * The SID of the Proxy Identifier to assign to the Participant. + * + * @param string $proxyIdentifierSid The SID of the Proxy Identifier to assign to the Participant. + * @return $this Fluent Builder + */ + public function setProxyIdentifierSid(string $proxyIdentifierSid): self + { + $this->options['proxyIdentifierSid'] = $proxyIdentifierSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.CreateParticipantOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantPage.php b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantPage.php new file mode 100755 index 0000000..bbff61d --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/Session/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Proxy\V1\Service\Session\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['sessionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/SessionContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/SessionContext.php new file mode 100755 index 0000000..4819844 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/SessionContext.php @@ -0,0 +1,214 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SessionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SessionInstance + * + * @return SessionInstance Fetched SessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SessionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SessionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SessionInstance + * + * @param array|Options $options Optional Arguments + * @return SessionInstance Updated SessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SessionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DateExpiry' => + Serialize::iso8601DateTime($options['dateExpiry']), + 'Ttl' => + $options['ttl'], + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SessionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the interactions + */ + protected function getInteractions(): InteractionList + { + if (!$this->_interactions) { + $this->_interactions = new InteractionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_interactions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.SessionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/SessionInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/SessionInstance.php new file mode 100755 index 0000000..a91fdf9 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/SessionInstance.php @@ -0,0 +1,195 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateStarted' => Deserialize::dateTime(Values::array_get($payload, 'date_started')), + 'dateEnded' => Deserialize::dateTime(Values::array_get($payload, 'date_ended')), + 'dateLastInteraction' => Deserialize::dateTime(Values::array_get($payload, 'date_last_interaction')), + 'dateExpiry' => Deserialize::dateTime(Values::array_get($payload, 'date_expiry')), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'status' => Values::array_get($payload, 'status'), + 'closedReason' => Values::array_get($payload, 'closed_reason'), + 'ttl' => Values::array_get($payload, 'ttl'), + 'mode' => Values::array_get($payload, 'mode'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SessionContext Context for this SessionInstance + */ + protected function proxy(): SessionContext + { + if (!$this->context) { + $this->context = new SessionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SessionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SessionInstance + * + * @return SessionInstance Fetched SessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SessionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SessionInstance + * + * @param array|Options $options Optional Arguments + * @return SessionInstance Updated SessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SessionInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the interactions + */ + protected function getInteractions(): InteractionList + { + return $this->proxy()->interactions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.SessionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/SessionList.php b/app/api/Twilio/Rest/Proxy/V1/Service/SessionList.php new file mode 100755 index 0000000..06d9a1e --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/SessionList.php @@ -0,0 +1,208 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Sessions'; + } + + /** + * Create the SessionInstance + * + * @param array|Options $options Optional Arguments + * @return SessionInstance Created SessionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SessionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'DateExpiry' => + Serialize::iso8601DateTime($options['dateExpiry']), + 'Ttl' => + $options['ttl'], + 'Mode' => + $options['mode'], + 'Status' => + $options['status'], + 'Participants' => + Serialize::map($options['participants'], function ($e) { return Serialize::jsonObject($e); }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SessionInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SessionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SessionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SessionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SessionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SessionPage Page of SessionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SessionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SessionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SessionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SessionPage Page of SessionInstance + */ + public function getPage(string $targetUrl): SessionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SessionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SessionContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Session resource to delete. + */ + public function getContext( + string $sid + + ): SessionContext + { + return new SessionContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.SessionList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/SessionOptions.php b/app/api/Twilio/Rest/Proxy/V1/Service/SessionOptions.php new file mode 100755 index 0000000..7955256 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/SessionOptions.php @@ -0,0 +1,254 @@ +options['uniqueName'] = $uniqueName; + $this->options['dateExpiry'] = $dateExpiry; + $this->options['ttl'] = $ttl; + $this->options['mode'] = $mode; + $this->options['status'] = $status; + $this->options['participants'] = $participants; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + * + * @param \DateTime $dateExpiry The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + * @return $this Fluent Builder + */ + public function setDateExpiry(\DateTime $dateExpiry): self + { + $this->options['dateExpiry'] = $dateExpiry; + return $this; + } + + /** + * The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + * + * @param int $ttl The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * @param string $mode + * @return $this Fluent Builder + */ + public function setMode(string $mode): self + { + $this->options['mode'] = $mode; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The Participant objects to include in the new session. + * + * @param array[] $participants The Participant objects to include in the new session. + * @return $this Fluent Builder + */ + public function setParticipants(array $participants): self + { + $this->options['participants'] = $participants; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.CreateSessionOptions ' . $options . ']'; + } +} + + + + +class UpdateSessionOptions extends Options + { + /** + * @param \DateTime $dateExpiry The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + * @param int $ttl The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + * @param string $status + */ + public function __construct( + + \DateTime $dateExpiry = null, + int $ttl = Values::INT_NONE, + string $status = Values::NONE + + ) { + $this->options['dateExpiry'] = $dateExpiry; + $this->options['ttl'] = $ttl; + $this->options['status'] = $status; + } + + /** + * The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + * + * @param \DateTime $dateExpiry The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date when the Session should expire. If this is value is present, it overrides the `ttl` value. + * @return $this Fluent Builder + */ + public function setDateExpiry(\DateTime $dateExpiry): self + { + $this->options['dateExpiry'] = $dateExpiry; + return $this; + } + + /** + * The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + * + * @param int $ttl The time, in seconds, when the session will expire. The time is measured from the last Session create or the Session's last Interaction. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.UpdateSessionOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/SessionPage.php b/app/api/Twilio/Rest/Proxy/V1/Service/SessionPage.php new file mode 100755 index 0000000..662a318 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/SessionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SessionInstance \Twilio\Rest\Proxy\V1\Service\SessionInstance + */ + public function buildInstance(array $payload): SessionInstance + { + return new SessionInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.SessionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeContext.php b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeContext.php new file mode 100755 index 0000000..467f350 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeContext.php @@ -0,0 +1,131 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/ShortCodes/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ShortCodeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ShortCodeInstance + * + * @param array|Options $options Optional Arguments + * @return ShortCodeInstance Updated ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ShortCodeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IsReserved' => + Serialize::booleanToString($options['isReserved']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ShortCodeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeInstance.php b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeInstance.php new file mode 100755 index 0000000..ff352b9 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeInstance.php @@ -0,0 +1,163 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'shortCode' => Values::array_get($payload, 'short_code'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'capabilities' => Deserialize::phoneNumberCapabilities(Values::array_get($payload, 'capabilities')), + 'url' => Values::array_get($payload, 'url'), + 'isReserved' => Values::array_get($payload, 'is_reserved'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ShortCodeContext Context for this ShortCodeInstance + */ + protected function proxy(): ShortCodeContext + { + if (!$this->context) { + $this->context = new ShortCodeContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ShortCodeInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ShortCodeInstance + * + * @return ShortCodeInstance Fetched ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ShortCodeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ShortCodeInstance + * + * @param array|Options $options Optional Arguments + * @return ShortCodeInstance Updated ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ShortCodeInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ShortCodeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeList.php b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeList.php new file mode 100755 index 0000000..ffad631 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/ShortCodes'; + } + + /** + * Create the ShortCodeInstance + * + * @param string $sid The SID of a Twilio [ShortCode](https://www.twilio.com/docs/sms/api/short-code) resource that represents the short code you would like to assign to your Proxy Service. + * @return ShortCodeInstance Created ShortCodeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $sid): ShortCodeInstance + { + + $data = Values::of([ + 'Sid' => + $sid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ShortCodeInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads ShortCodeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ShortCodeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ShortCodeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ShortCodePage Page of ShortCodeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ShortCodePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ShortCodeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ShortCodePage Page of ShortCodeInstance + */ + public function getPage(string $targetUrl): ShortCodePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ShortCodePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ShortCodeContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the ShortCode resource to delete. + */ + public function getContext( + string $sid + + ): ShortCodeContext + { + return new ShortCodeContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ShortCodeList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeOptions.php b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeOptions.php new file mode 100755 index 0000000..34d8616 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodeOptions.php @@ -0,0 +1,84 @@ +options['isReserved'] = $isReserved; + } + + /** + * Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * + * @param bool $isReserved Whether the short code should be reserved and not be assigned to a participant using proxy pool logic. See [Reserved Phone Numbers](https://www.twilio.com/docs/proxy/reserved-phone-numbers) for more information. + * @return $this Fluent Builder + */ + public function setIsReserved(bool $isReserved): self + { + $this->options['isReserved'] = $isReserved; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.UpdateShortCodeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodePage.php b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodePage.php new file mode 100755 index 0000000..dc95d1c --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/Service/ShortCodePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ShortCodeInstance \Twilio\Rest\Proxy\V1\Service\ShortCodeInstance + */ + public function buildInstance(array $payload): ShortCodeInstance + { + return new ShortCodeInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ShortCodePage]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/ServiceContext.php b/app/api/Twilio/Rest/Proxy/V1/ServiceContext.php new file mode 100755 index 0000000..6104839 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/ServiceContext.php @@ -0,0 +1,233 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'DefaultTtl' => + $options['defaultTtl'], + 'CallbackUrl' => + $options['callbackUrl'], + 'GeoMatchLevel' => + $options['geoMatchLevel'], + 'NumberSelectionBehavior' => + $options['numberSelectionBehavior'], + 'InterceptCallbackUrl' => + $options['interceptCallbackUrl'], + 'OutOfSessionCallbackUrl' => + $options['outOfSessionCallbackUrl'], + 'ChatInstanceSid' => + $options['chatInstanceSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_phoneNumbers; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + if (!$this->_shortCodes) { + $this->_shortCodes = new ShortCodeList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_shortCodes; + } + + /** + * Access the sessions + */ + protected function getSessions(): SessionList + { + if (!$this->_sessions) { + $this->_sessions = new SessionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_sessions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/ServiceInstance.php b/app/api/Twilio/Rest/Proxy/V1/ServiceInstance.php new file mode 100755 index 0000000..fc23a50 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/ServiceInstance.php @@ -0,0 +1,199 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'chatInstanceSid' => Values::array_get($payload, 'chat_instance_sid'), + 'callbackUrl' => Values::array_get($payload, 'callback_url'), + 'defaultTtl' => Values::array_get($payload, 'default_ttl'), + 'numberSelectionBehavior' => Values::array_get($payload, 'number_selection_behavior'), + 'geoMatchLevel' => Values::array_get($payload, 'geo_match_level'), + 'interceptCallbackUrl' => Values::array_get($payload, 'intercept_callback_url'), + 'outOfSessionCallbackUrl' => Values::array_get($payload, 'out_of_session_callback_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + return $this->proxy()->phoneNumbers; + } + + /** + * Access the shortCodes + */ + protected function getShortCodes(): ShortCodeList + { + return $this->proxy()->shortCodes; + } + + /** + * Access the sessions + */ + protected function getSessions(): SessionList + { + return $this->proxy()->sessions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Proxy.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/ServiceList.php b/app/api/Twilio/Rest/Proxy/V1/ServiceList.php new file mode 100755 index 0000000..03ac6bf --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/ServiceList.php @@ -0,0 +1,204 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'DefaultTtl' => + $options['defaultTtl'], + 'CallbackUrl' => + $options['callbackUrl'], + 'GeoMatchLevel' => + $options['geoMatchLevel'], + 'NumberSelectionBehavior' => + $options['numberSelectionBehavior'], + 'InterceptCallbackUrl' => + $options['interceptCallbackUrl'], + 'OutOfSessionCallbackUrl' => + $options['outOfSessionCallbackUrl'], + 'ChatInstanceSid' => + $options['chatInstanceSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Proxy/V1/ServiceOptions.php b/app/api/Twilio/Rest/Proxy/V1/ServiceOptions.php new file mode 100755 index 0000000..d6307b7 --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/ServiceOptions.php @@ -0,0 +1,360 @@ +options['defaultTtl'] = $defaultTtl; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['geoMatchLevel'] = $geoMatchLevel; + $this->options['numberSelectionBehavior'] = $numberSelectionBehavior; + $this->options['interceptCallbackUrl'] = $interceptCallbackUrl; + $this->options['outOfSessionCallbackUrl'] = $outOfSessionCallbackUrl; + $this->options['chatInstanceSid'] = $chatInstanceSid; + } + + /** + * The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + * + * @param int $defaultTtl The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + * @return $this Fluent Builder + */ + public function setDefaultTtl(int $defaultTtl): self + { + $this->options['defaultTtl'] = $defaultTtl; + return $this; + } + + /** + * The URL we should call when the interaction status changes. + * + * @param string $callbackUrl The URL we should call when the interaction status changes. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * @param string $geoMatchLevel + * @return $this Fluent Builder + */ + public function setGeoMatchLevel(string $geoMatchLevel): self + { + $this->options['geoMatchLevel'] = $geoMatchLevel; + return $this; + } + + /** + * @param string $numberSelectionBehavior + * @return $this Fluent Builder + */ + public function setNumberSelectionBehavior(string $numberSelectionBehavior): self + { + $this->options['numberSelectionBehavior'] = $numberSelectionBehavior; + return $this; + } + + /** + * The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + * + * @param string $interceptCallbackUrl The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + * @return $this Fluent Builder + */ + public function setInterceptCallbackUrl(string $interceptCallbackUrl): self + { + $this->options['interceptCallbackUrl'] = $interceptCallbackUrl; + return $this; + } + + /** + * The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + * + * @param string $outOfSessionCallbackUrl The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + * @return $this Fluent Builder + */ + public function setOutOfSessionCallbackUrl(string $outOfSessionCallbackUrl): self + { + $this->options['outOfSessionCallbackUrl'] = $outOfSessionCallbackUrl; + return $this; + } + + /** + * The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + * + * @param string $chatInstanceSid The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + * @return $this Fluent Builder + */ + public function setChatInstanceSid(string $chatInstanceSid): self + { + $this->options['chatInstanceSid'] = $chatInstanceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * @param int $defaultTtl The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + * @param string $callbackUrl The URL we should call when the interaction status changes. + * @param string $geoMatchLevel + * @param string $numberSelectionBehavior + * @param string $interceptCallbackUrl The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + * @param string $outOfSessionCallbackUrl The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + * @param string $chatInstanceSid The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + */ + public function __construct( + + string $uniqueName = Values::NONE, + int $defaultTtl = Values::INT_NONE, + string $callbackUrl = Values::NONE, + string $geoMatchLevel = Values::NONE, + string $numberSelectionBehavior = Values::NONE, + string $interceptCallbackUrl = Values::NONE, + string $outOfSessionCallbackUrl = Values::NONE, + string $chatInstanceSid = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['defaultTtl'] = $defaultTtl; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['geoMatchLevel'] = $geoMatchLevel; + $this->options['numberSelectionBehavior'] = $numberSelectionBehavior; + $this->options['interceptCallbackUrl'] = $interceptCallbackUrl; + $this->options['outOfSessionCallbackUrl'] = $outOfSessionCallbackUrl; + $this->options['chatInstanceSid'] = $chatInstanceSid; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be 191 characters or fewer in length and be unique. **This value should not have PII.** + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + * + * @param int $defaultTtl The default `ttl` value to set for Sessions created in the Service. The TTL (time to live) is measured in seconds after the Session's last create or last Interaction. The default value of `0` indicates an unlimited Session length. You can override a Session's default TTL value by setting its `ttl` value. + * @return $this Fluent Builder + */ + public function setDefaultTtl(int $defaultTtl): self + { + $this->options['defaultTtl'] = $defaultTtl; + return $this; + } + + /** + * The URL we should call when the interaction status changes. + * + * @param string $callbackUrl The URL we should call when the interaction status changes. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * @param string $geoMatchLevel + * @return $this Fluent Builder + */ + public function setGeoMatchLevel(string $geoMatchLevel): self + { + $this->options['geoMatchLevel'] = $geoMatchLevel; + return $this; + } + + /** + * @param string $numberSelectionBehavior + * @return $this Fluent Builder + */ + public function setNumberSelectionBehavior(string $numberSelectionBehavior): self + { + $this->options['numberSelectionBehavior'] = $numberSelectionBehavior; + return $this; + } + + /** + * The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + * + * @param string $interceptCallbackUrl The URL we call on each interaction. If we receive a 403 status, we block the interaction; otherwise the interaction continues. + * @return $this Fluent Builder + */ + public function setInterceptCallbackUrl(string $interceptCallbackUrl): self + { + $this->options['interceptCallbackUrl'] = $interceptCallbackUrl; + return $this; + } + + /** + * The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + * + * @param string $outOfSessionCallbackUrl The URL we should call when an inbound call or SMS action occurs on a closed or non-existent Session. If your server (or a Twilio [function](https://www.twilio.com/functions)) responds with valid [TwiML](https://www.twilio.com/docs/voice/twiml), we will process it. This means it is possible, for example, to play a message for a call, send an automated text message response, or redirect a call to another Phone Number. See [Out-of-Session Callback Response Guide](https://www.twilio.com/docs/proxy/out-session-callback-response-guide) for more information. + * @return $this Fluent Builder + */ + public function setOutOfSessionCallbackUrl(string $outOfSessionCallbackUrl): self + { + $this->options['outOfSessionCallbackUrl'] = $outOfSessionCallbackUrl; + return $this; + } + + /** + * The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + * + * @param string $chatInstanceSid The SID of the Chat Service Instance managed by Proxy Service. The Chat Service enables Proxy to forward SMS and channel messages to this chat instance. This is a one-to-one relationship. + * @return $this Fluent Builder + */ + public function setChatInstanceSid(string $chatInstanceSid): self + { + $this->options['chatInstanceSid'] = $chatInstanceSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Proxy.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Proxy/V1/ServicePage.php b/app/api/Twilio/Rest/Proxy/V1/ServicePage.php new file mode 100755 index 0000000..cc5ccdb --- /dev/null +++ b/app/api/Twilio/Rest/Proxy/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Proxy\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Proxy.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/ProxyBase.php b/app/api/Twilio/Rest/ProxyBase.php new file mode 100755 index 0000000..ae10d21 --- /dev/null +++ b/app/api/Twilio/Rest/ProxyBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://proxy.twilio.com'; + } + + + /** + * @return V1 Version v1 of proxy + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Proxy]'; + } +} diff --git a/app/api/Twilio/Rest/Routes.php b/app/api/Twilio/Rest/Routes.php new file mode 100755 index 0000000..72bc8f9 --- /dev/null +++ b/app/api/Twilio/Rest/Routes.php @@ -0,0 +1,58 @@ +phoneNumbers instead. + */ + protected function getPhoneNumbers(): \Twilio\Rest\Routes\V2\PhoneNumberList { + echo "phoneNumbers is deprecated. Use v2->phoneNumbers instead."; + return $this->v2->phoneNumbers; + } + + /** + * @deprecated Use v2->phoneNumbers(\$phoneNumber) instead. + * @param string $phoneNumber The phone number + */ + protected function contextPhoneNumbers(string $phoneNumber): \Twilio\Rest\Routes\V2\PhoneNumberContext { + echo "phoneNumbers(\$phoneNumber) is deprecated. Use v2->phoneNumbers(\$phoneNumber) instead."; + return $this->v2->phoneNumbers($phoneNumber); + } + + /** + * @deprecated Use v2->sipDomains instead. + */ + protected function getSipDomains(): \Twilio\Rest\Routes\V2\SipDomainList { + echo "sipDomains is deprecated. Use v2->sipDomains instead."; + return $this->v2->sipDomains; + } + + /** + * @deprecated Use v2->sipDomains(\$sipDomain) instead. + * @param string $sipDomain The sip_domain + */ + protected function contextSipDomains(string $sipDomain): \Twilio\Rest\Routes\V2\SipDomainContext { + echo "sipDomains(\$sipDomain) is deprecated. Use v2->sipDomains(\$sipDomain) instead."; + return $this->v2->sipDomains($sipDomain); + } + + /** + * @deprecated Use v2->trunks instead. + */ + protected function getTrunks(): \Twilio\Rest\Routes\V2\TrunkList { + echo "trunks is deprecated. Use v2->trunks instead."; + return $this->v2->trunks; + } + + /** + * @deprecated Use v2->trunks(\$sipTrunkDomain instead. + * @param string $sipTrunkDomain The SIP Trunk + */ + protected function contextTrunks(string $sipTrunkDomain): \Twilio\Rest\Routes\V2\TrunkContext { + echo "trunks(\$sipTrunkDomain) is deprecated. Use v2->trunks(\$sipTrunkDomain instead."; + return $this->v2->trunks($sipTrunkDomain); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Routes/V2.php b/app/api/Twilio/Rest/Routes/V2.php new file mode 100755 index 0000000..16a6599 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2.php @@ -0,0 +1,119 @@ +version = 'v2'; + } + + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList($this); + } + return $this->_phoneNumbers; + } + + protected function getSipDomains(): SipDomainList + { + if (!$this->_sipDomains) { + $this->_sipDomains = new SipDomainList($this); + } + return $this->_sipDomains; + } + + protected function getTrunks(): TrunkList + { + if (!$this->_trunks) { + $this->_trunks = new TrunkList($this); + } + return $this->_trunks; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/PhoneNumberContext.php b/app/api/Twilio/Rest/Routes/V2/PhoneNumberContext.php new file mode 100755 index 0000000..a0f2854 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/PhoneNumberContext.php @@ -0,0 +1,112 @@ +solution = [ + 'phoneNumber' => + $phoneNumber, + ]; + + $this->uri = '/PhoneNumbers/' . \rawurlencode($phoneNumber) + .''; + } + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['phoneNumber'] + ); + } + + + /** + * Update the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Updated PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PhoneNumberInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'VoiceRegion' => + $options['voiceRegion'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['phoneNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/PhoneNumberInstance.php b/app/api/Twilio/Rest/Routes/V2/PhoneNumberInstance.php new file mode 100755 index 0000000..1d5a13a --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/PhoneNumberInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'url' => Values::array_get($payload, 'url'), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'voiceRegion' => Values::array_get($payload, 'voice_region'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['phoneNumber' => $phoneNumber ?: $this->properties['phoneNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['phoneNumber'] + ); + } + + return $this->context; + } + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the PhoneNumberInstance + * + * @param array|Options $options Optional Arguments + * @return PhoneNumberInstance Updated PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): PhoneNumberInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/PhoneNumberList.php b/app/api/Twilio/Rest/Routes/V2/PhoneNumberList.php new file mode 100755 index 0000000..981b1c8 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/PhoneNumberList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a PhoneNumberContext + * + * @param string $phoneNumber The phone number in E.164 format + */ + public function getContext( + string $phoneNumber + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $phoneNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/PhoneNumberOptions.php b/app/api/Twilio/Rest/Routes/V2/PhoneNumberOptions.php new file mode 100755 index 0000000..7bf598c --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/PhoneNumberOptions.php @@ -0,0 +1,96 @@ +options['voiceRegion'] = $voiceRegion; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The Inbound Processing Region used for this phone number for voice + * + * @param string $voiceRegion The Inbound Processing Region used for this phone number for voice + * @return $this Fluent Builder + */ + public function setVoiceRegion(string $voiceRegion): self + { + $this->options['voiceRegion'] = $voiceRegion; + return $this; + } + + /** + * A human readable description of this resource, up to 64 characters. + * + * @param string $friendlyName A human readable description of this resource, up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Routes.V2.UpdatePhoneNumberOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/PhoneNumberPage.php b/app/api/Twilio/Rest/Routes/V2/PhoneNumberPage.php new file mode 100755 index 0000000..5e5f07f --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Routes\V2\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/SipDomainContext.php b/app/api/Twilio/Rest/Routes/V2/SipDomainContext.php new file mode 100755 index 0000000..6af829c --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/SipDomainContext.php @@ -0,0 +1,112 @@ +solution = [ + 'sipDomain' => + $sipDomain, + ]; + + $this->uri = '/SipDomains/' . \rawurlencode($sipDomain) + .''; + } + + /** + * Fetch the SipDomainInstance + * + * @return SipDomainInstance Fetched SipDomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SipDomainInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SipDomainInstance( + $this->version, + $payload, + $this->solution['sipDomain'] + ); + } + + + /** + * Update the SipDomainInstance + * + * @param array|Options $options Optional Arguments + * @return SipDomainInstance Updated SipDomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SipDomainInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'VoiceRegion' => + $options['voiceRegion'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SipDomainInstance( + $this->version, + $payload, + $this->solution['sipDomain'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.SipDomainContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/SipDomainInstance.php b/app/api/Twilio/Rest/Routes/V2/SipDomainInstance.php new file mode 100755 index 0000000..e9e63cb --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/SipDomainInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'sipDomain' => Values::array_get($payload, 'sip_domain'), + 'url' => Values::array_get($payload, 'url'), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'voiceRegion' => Values::array_get($payload, 'voice_region'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['sipDomain' => $sipDomain ?: $this->properties['sipDomain'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SipDomainContext Context for this SipDomainInstance + */ + protected function proxy(): SipDomainContext + { + if (!$this->context) { + $this->context = new SipDomainContext( + $this->version, + $this->solution['sipDomain'] + ); + } + + return $this->context; + } + + /** + * Fetch the SipDomainInstance + * + * @return SipDomainInstance Fetched SipDomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SipDomainInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SipDomainInstance + * + * @param array|Options $options Optional Arguments + * @return SipDomainInstance Updated SipDomainInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SipDomainInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.SipDomainInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/SipDomainList.php b/app/api/Twilio/Rest/Routes/V2/SipDomainList.php new file mode 100755 index 0000000..26ac0a2 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/SipDomainList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a SipDomainContext + * + * @param string $sipDomain + */ + public function getContext( + string $sipDomain + + ): SipDomainContext + { + return new SipDomainContext( + $this->version, + $sipDomain + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.SipDomainList]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/SipDomainOptions.php b/app/api/Twilio/Rest/Routes/V2/SipDomainOptions.php new file mode 100755 index 0000000..7022c8f --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/SipDomainOptions.php @@ -0,0 +1,96 @@ +options['voiceRegion'] = $voiceRegion; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * + * + * @param string $voiceRegion + * @return $this Fluent Builder + */ + public function setVoiceRegion(string $voiceRegion): self + { + $this->options['voiceRegion'] = $voiceRegion; + return $this; + } + + /** + * + * + * @param string $friendlyName + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Routes.V2.UpdateSipDomainOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/SipDomainPage.php b/app/api/Twilio/Rest/Routes/V2/SipDomainPage.php new file mode 100755 index 0000000..187c5d4 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/SipDomainPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SipDomainInstance \Twilio\Rest\Routes\V2\SipDomainInstance + */ + public function buildInstance(array $payload): SipDomainInstance + { + return new SipDomainInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.SipDomainPage]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/TrunkContext.php b/app/api/Twilio/Rest/Routes/V2/TrunkContext.php new file mode 100755 index 0000000..f700037 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/TrunkContext.php @@ -0,0 +1,112 @@ +solution = [ + 'sipTrunkDomain' => + $sipTrunkDomain, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($sipTrunkDomain) + .''; + } + + /** + * Fetch the TrunkInstance + * + * @return TrunkInstance Fetched TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrunkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrunkInstance( + $this->version, + $payload, + $this->solution['sipTrunkDomain'] + ); + } + + + /** + * Update the TrunkInstance + * + * @param array|Options $options Optional Arguments + * @return TrunkInstance Updated TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrunkInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'VoiceRegion' => + $options['voiceRegion'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TrunkInstance( + $this->version, + $payload, + $this->solution['sipTrunkDomain'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.TrunkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/TrunkInstance.php b/app/api/Twilio/Rest/Routes/V2/TrunkInstance.php new file mode 100755 index 0000000..adae534 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/TrunkInstance.php @@ -0,0 +1,144 @@ +properties = [ + 'sipTrunkDomain' => Values::array_get($payload, 'sip_trunk_domain'), + 'url' => Values::array_get($payload, 'url'), + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'voiceRegion' => Values::array_get($payload, 'voice_region'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['sipTrunkDomain' => $sipTrunkDomain ?: $this->properties['sipTrunkDomain'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrunkContext Context for this TrunkInstance + */ + protected function proxy(): TrunkContext + { + if (!$this->context) { + $this->context = new TrunkContext( + $this->version, + $this->solution['sipTrunkDomain'] + ); + } + + return $this->context; + } + + /** + * Fetch the TrunkInstance + * + * @return TrunkInstance Fetched TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrunkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TrunkInstance + * + * @param array|Options $options Optional Arguments + * @return TrunkInstance Updated TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrunkInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Routes.V2.TrunkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/TrunkList.php b/app/api/Twilio/Rest/Routes/V2/TrunkList.php new file mode 100755 index 0000000..11eb531 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/TrunkList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a TrunkContext + * + * @param string $sipTrunkDomain The absolute URL of the SIP Trunk + */ + public function getContext( + string $sipTrunkDomain + + ): TrunkContext + { + return new TrunkContext( + $this->version, + $sipTrunkDomain + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.TrunkList]'; + } +} diff --git a/app/api/Twilio/Rest/Routes/V2/TrunkOptions.php b/app/api/Twilio/Rest/Routes/V2/TrunkOptions.php new file mode 100755 index 0000000..e60b30d --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/TrunkOptions.php @@ -0,0 +1,96 @@ +options['voiceRegion'] = $voiceRegion; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The Inbound Processing Region used for this SIP Trunk for voice + * + * @param string $voiceRegion The Inbound Processing Region used for this SIP Trunk for voice + * @return $this Fluent Builder + */ + public function setVoiceRegion(string $voiceRegion): self + { + $this->options['voiceRegion'] = $voiceRegion; + return $this; + } + + /** + * A human readable description of this resource, up to 64 characters. + * + * @param string $friendlyName A human readable description of this resource, up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Routes.V2.UpdateTrunkOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Routes/V2/TrunkPage.php b/app/api/Twilio/Rest/Routes/V2/TrunkPage.php new file mode 100755 index 0000000..b1bc050 --- /dev/null +++ b/app/api/Twilio/Rest/Routes/V2/TrunkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrunkInstance \Twilio\Rest\Routes\V2\TrunkInstance + */ + public function buildInstance(array $payload): TrunkInstance + { + return new TrunkInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Routes.V2.TrunkPage]'; + } +} diff --git a/app/api/Twilio/Rest/RoutesBase.php b/app/api/Twilio/Rest/RoutesBase.php new file mode 100755 index 0000000..8a4c893 --- /dev/null +++ b/app/api/Twilio/Rest/RoutesBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://routes.twilio.com'; + } + + + /** + * @return V2 Version v2 of routes + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Routes]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless.php b/app/api/Twilio/Rest/Serverless.php new file mode 100755 index 0000000..f684c62 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless.php @@ -0,0 +1,24 @@ +services instead. + */ + protected function getServices(): \Twilio\Rest\Serverless\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid The SID of the Service resource to fetch + */ + protected function contextServices(string $sid): \Twilio\Rest\Serverless\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Serverless/V1.php b/app/api/Twilio/Rest/Serverless/V1.php new file mode 100755 index 0000000..a2f00f1 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionContext.php new file mode 100755 index 0000000..07aac75 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionContext.php @@ -0,0 +1,93 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'assetSid' => + $assetSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Assets/' . \rawurlencode($assetSid) + .'/Versions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AssetVersionInstance + * + * @return AssetVersionInstance Fetched AssetVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssetVersionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssetVersionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['assetSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.AssetVersionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionInstance.php new file mode 100755 index 0000000..e4b6993 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'assetSid' => Values::array_get($payload, 'asset_sid'), + 'path' => Values::array_get($payload, 'path'), + 'visibility' => Values::array_get($payload, 'visibility'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'assetSid' => $assetSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssetVersionContext Context for this AssetVersionInstance + */ + protected function proxy(): AssetVersionContext + { + if (!$this->context) { + $this->context = new AssetVersionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['assetSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AssetVersionInstance + * + * @return AssetVersionInstance Fetched AssetVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssetVersionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.AssetVersionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionList.php b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionList.php new file mode 100755 index 0000000..7e51c49 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'assetSid' => + $assetSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Assets/' . \rawurlencode($assetSid) + .'/Versions'; + } + + /** + * Reads AssetVersionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssetVersionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssetVersionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssetVersionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssetVersionPage Page of AssetVersionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssetVersionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssetVersionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssetVersionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssetVersionPage Page of AssetVersionInstance + */ + public function getPage(string $targetUrl): AssetVersionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssetVersionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssetVersionContext + * + * @param string $sid The SID of the Asset Version resource to fetch. + */ + public function getContext( + string $sid + + ): AssetVersionContext + { + return new AssetVersionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['assetSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.AssetVersionList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionPage.php new file mode 100755 index 0000000..83595f3 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Asset/AssetVersionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssetVersionInstance \Twilio\Rest\Serverless\V1\Service\Asset\AssetVersionInstance + */ + public function buildInstance(array $payload): AssetVersionInstance + { + return new AssetVersionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['assetSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.AssetVersionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/AssetContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/AssetContext.php new file mode 100755 index 0000000..69282a6 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/AssetContext.php @@ -0,0 +1,186 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Assets/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the AssetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the AssetInstance + * + * @return AssetInstance Fetched AssetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AssetInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the AssetInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Asset resource. It can be a maximum of 255 characters. + * @return AssetInstance Updated AssetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): AssetInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new AssetInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the assetVersions + */ + protected function getAssetVersions(): AssetVersionList + { + if (!$this->_assetVersions) { + $this->_assetVersions = new AssetVersionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_assetVersions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.AssetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/AssetInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/AssetInstance.php new file mode 100755 index 0000000..a06eb7d --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/AssetInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AssetContext Context for this AssetInstance + */ + protected function proxy(): AssetContext + { + if (!$this->context) { + $this->context = new AssetContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the AssetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the AssetInstance + * + * @return AssetInstance Fetched AssetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AssetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the AssetInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Asset resource. It can be a maximum of 255 characters. + * @return AssetInstance Updated AssetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): AssetInstance + { + + return $this->proxy()->update($friendlyName); + } + + /** + * Access the assetVersions + */ + protected function getAssetVersions(): AssetVersionList + { + return $this->proxy()->assetVersions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.AssetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/AssetList.php b/app/api/Twilio/Rest/Serverless/V1/Service/AssetList.php new file mode 100755 index 0000000..e087363 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/AssetList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Assets'; + } + + /** + * Create the AssetInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Asset resource. It can be a maximum of 255 characters. + * @return AssetInstance Created AssetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): AssetInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AssetInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads AssetInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return AssetInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams AssetInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of AssetInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return AssetPage Page of AssetInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): AssetPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new AssetPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of AssetInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return AssetPage Page of AssetInstance + */ + public function getPage(string $targetUrl): AssetPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new AssetPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a AssetContext + * + * @param string $sid The SID that identifies the Asset resource to delete. + */ + public function getContext( + string $sid + + ): AssetContext + { + return new AssetContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.AssetList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/AssetPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/AssetPage.php new file mode 100755 index 0000000..dc56904 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/AssetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AssetInstance \Twilio\Rest\Serverless\V1\Service\AssetInstance + */ + public function buildInstance(array $payload): AssetInstance + { + return new AssetInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.AssetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusContext.php new file mode 100755 index 0000000..a228129 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusContext.php @@ -0,0 +1,87 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Builds/' . \rawurlencode($sid) + .'/Status'; + } + + /** + * Fetch the BuildStatusInstance + * + * @return BuildStatusInstance Fetched BuildStatusInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BuildStatusInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BuildStatusInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.BuildStatusContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusInstance.php new file mode 100755 index 0000000..5fd906a --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'status' => Values::array_get($payload, 'status'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BuildStatusContext Context for this BuildStatusInstance + */ + protected function proxy(): BuildStatusContext + { + if (!$this->context) { + $this->context = new BuildStatusContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the BuildStatusInstance + * + * @return BuildStatusInstance Fetched BuildStatusInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BuildStatusInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.BuildStatusInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusList.php b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusList.php new file mode 100755 index 0000000..6fa7ec7 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusList.php @@ -0,0 +1,73 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a BuildStatusContext + */ + public function getContext( + + ): BuildStatusContext + { + return new BuildStatusContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.BuildStatusList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusPage.php new file mode 100755 index 0000000..23941b2 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Build/BuildStatusPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BuildStatusInstance \Twilio\Rest\Serverless\V1\Service\Build\BuildStatusInstance + */ + public function buildInstance(array $payload): BuildStatusInstance + { + return new BuildStatusInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.BuildStatusPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/BuildContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/BuildContext.php new file mode 100755 index 0000000..b24c99f --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/BuildContext.php @@ -0,0 +1,159 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Builds/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BuildInstance + * + * @return BuildInstance Fetched BuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BuildInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BuildInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the buildStatus + */ + protected function getBuildStatus(): BuildStatusList + { + if (!$this->_buildStatus) { + $this->_buildStatus = new BuildStatusList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_buildStatus; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.BuildContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/BuildInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/BuildInstance.php new file mode 100755 index 0000000..6c3f137 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/BuildInstance.php @@ -0,0 +1,163 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'status' => Values::array_get($payload, 'status'), + 'assetVersions' => Values::array_get($payload, 'asset_versions'), + 'functionVersions' => Values::array_get($payload, 'function_versions'), + 'dependencies' => Values::array_get($payload, 'dependencies'), + 'runtime' => Values::array_get($payload, 'runtime'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BuildContext Context for this BuildInstance + */ + protected function proxy(): BuildContext + { + if (!$this->context) { + $this->context = new BuildContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BuildInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BuildInstance + * + * @return BuildInstance Fetched BuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BuildInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the buildStatus + */ + protected function getBuildStatus(): BuildStatusList + { + return $this->proxy()->buildStatus; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.BuildInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/BuildList.php b/app/api/Twilio/Rest/Serverless/V1/Service/BuildList.php new file mode 100755 index 0000000..94f26b3 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/BuildList.php @@ -0,0 +1,204 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Builds'; + } + + /** + * Create the BuildInstance + * + * @param array|Options $options Optional Arguments + * @return BuildInstance Created BuildInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): BuildInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AssetVersions' => + Serialize::map($options['assetVersions'], function ($e) { return $e; }), + 'FunctionVersions' => + Serialize::map($options['functionVersions'], function ($e) { return $e; }), + 'Dependencies' => + $options['dependencies'], + 'Runtime' => + $options['runtime'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BuildInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads BuildInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BuildInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams BuildInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BuildInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BuildPage Page of BuildInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BuildPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BuildPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BuildInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BuildPage Page of BuildInstance + */ + public function getPage(string $targetUrl): BuildPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BuildPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BuildContext + * + * @param string $sid The SID of the Build resource to delete. + */ + public function getContext( + string $sid + + ): BuildContext + { + return new BuildContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.BuildList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/BuildOptions.php b/app/api/Twilio/Rest/Serverless/V1/Service/BuildOptions.php new file mode 100755 index 0000000..9febd0b --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/BuildOptions.php @@ -0,0 +1,137 @@ +options['assetVersions'] = $assetVersions; + $this->options['functionVersions'] = $functionVersions; + $this->options['dependencies'] = $dependencies; + $this->options['runtime'] = $runtime; + } + + /** + * The list of Asset Version resource SIDs to include in the Build. + * + * @param string[] $assetVersions The list of Asset Version resource SIDs to include in the Build. + * @return $this Fluent Builder + */ + public function setAssetVersions(array $assetVersions): self + { + $this->options['assetVersions'] = $assetVersions; + return $this; + } + + /** + * The list of the Function Version resource SIDs to include in the Build. + * + * @param string[] $functionVersions The list of the Function Version resource SIDs to include in the Build. + * @return $this Fluent Builder + */ + public function setFunctionVersions(array $functionVersions): self + { + $this->options['functionVersions'] = $functionVersions; + return $this; + } + + /** + * A list of objects that describe the Dependencies included in the Build. Each object contains the `name` and `version` of the dependency. + * + * @param string $dependencies A list of objects that describe the Dependencies included in the Build. Each object contains the `name` and `version` of the dependency. + * @return $this Fluent Builder + */ + public function setDependencies(string $dependencies): self + { + $this->options['dependencies'] = $dependencies; + return $this; + } + + /** + * The Runtime version that will be used to run the Build resource when it is deployed. + * + * @param string $runtime The Runtime version that will be used to run the Build resource when it is deployed. + * @return $this Fluent Builder + */ + public function setRuntime(string $runtime): self + { + $this->options['runtime'] = $runtime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.CreateBuildOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/BuildPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/BuildPage.php new file mode 100755 index 0000000..492571f --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/BuildPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BuildInstance \Twilio\Rest\Serverless\V1\Service\BuildInstance + */ + public function buildInstance(array $payload): BuildInstance + { + return new BuildInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.BuildPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentContext.php new file mode 100755 index 0000000..e04784a --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentContext.php @@ -0,0 +1,93 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'environmentSid' => + $environmentSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Deployments/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the DeploymentInstance + * + * @return DeploymentInstance Fetched DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeploymentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DeploymentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.DeploymentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentInstance.php new file mode 100755 index 0000000..39ea005 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentInstance.php @@ -0,0 +1,134 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'environmentSid' => Values::array_get($payload, 'environment_sid'), + 'buildSid' => Values::array_get($payload, 'build_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'environmentSid' => $environmentSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DeploymentContext Context for this DeploymentInstance + */ + protected function proxy(): DeploymentContext + { + if (!$this->context) { + $this->context = new DeploymentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the DeploymentInstance + * + * @return DeploymentInstance Fetched DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DeploymentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.DeploymentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentList.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentList.php new file mode 100755 index 0000000..31c2ed4 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentList.php @@ -0,0 +1,205 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'environmentSid' => + $environmentSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Deployments'; + } + + /** + * Create the DeploymentInstance + * + * @param array|Options $options Optional Arguments + * @return DeploymentInstance Created DeploymentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): DeploymentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'BuildSid' => + $options['buildSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DeploymentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'] + ); + } + + + /** + * Reads DeploymentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DeploymentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DeploymentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DeploymentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DeploymentPage Page of DeploymentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DeploymentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DeploymentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DeploymentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DeploymentPage Page of DeploymentInstance + */ + public function getPage(string $targetUrl): DeploymentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DeploymentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DeploymentContext + * + * @param string $sid The SID that identifies the Deployment resource to fetch. + */ + public function getContext( + string $sid + + ): DeploymentContext + { + return new DeploymentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.DeploymentList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentOptions.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentOptions.php new file mode 100755 index 0000000..6342f53 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentOptions.php @@ -0,0 +1,80 @@ +options['buildSid'] = $buildSid; + } + + /** + * The SID of the Build for the Deployment. + * + * @param string $buildSid The SID of the Build for the Deployment. + * @return $this Fluent Builder + */ + public function setBuildSid(string $buildSid): self + { + $this->options['buildSid'] = $buildSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.CreateDeploymentOptions ' . $options . ']'; + } +} + + + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentPage.php new file mode 100755 index 0000000..ae93053 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/DeploymentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DeploymentInstance \Twilio\Rest\Serverless\V1\Service\Environment\DeploymentInstance + */ + public function buildInstance(array $payload): DeploymentInstance + { + return new DeploymentInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['environmentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.DeploymentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogContext.php new file mode 100755 index 0000000..5521948 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogContext.php @@ -0,0 +1,93 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'environmentSid' => + $environmentSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Logs/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the LogInstance + * + * @return LogInstance Fetched LogInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): LogInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new LogInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.LogContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogInstance.php new file mode 100755 index 0000000..c340688 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'environmentSid' => Values::array_get($payload, 'environment_sid'), + 'buildSid' => Values::array_get($payload, 'build_sid'), + 'deploymentSid' => Values::array_get($payload, 'deployment_sid'), + 'functionSid' => Values::array_get($payload, 'function_sid'), + 'requestSid' => Values::array_get($payload, 'request_sid'), + 'level' => Values::array_get($payload, 'level'), + 'message' => Values::array_get($payload, 'message'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'environmentSid' => $environmentSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return LogContext Context for this LogInstance + */ + protected function proxy(): LogContext + { + if (!$this->context) { + $this->context = new LogContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the LogInstance + * + * @return LogInstance Fetched LogInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): LogInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.LogInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogList.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogList.php new file mode 100755 index 0000000..cf5ef6e --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogList.php @@ -0,0 +1,187 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'environmentSid' => + $environmentSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Logs'; + } + + /** + * Reads LogInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return LogInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams LogInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of LogInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return LogPage Page of LogInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): LogPage + { + $options = new Values($options); + + $params = Values::of([ + 'FunctionSid' => + $options['functionSid'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new LogPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of LogInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return LogPage Page of LogInstance + */ + public function getPage(string $targetUrl): LogPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new LogPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a LogContext + * + * @param string $sid The SID of the Log resource to fetch. + */ + public function getContext( + string $sid + + ): LogContext + { + return new LogContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.LogList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogOptions.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogOptions.php new file mode 100755 index 0000000..f650b0c --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogOptions.php @@ -0,0 +1,114 @@ +options['functionSid'] = $functionSid; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + } + + /** + * The SID of the function whose invocation produced the Log resources to read. + * + * @param string $functionSid The SID of the function whose invocation produced the Log resources to read. + * @return $this Fluent Builder + */ + public function setFunctionSid(string $functionSid): self + { + $this->options['functionSid'] = $functionSid; + return $this; + } + + /** + * The date/time (in GMT, ISO 8601) after which the Log resources must have been created. Defaults to 1 day prior to current date/time. + * + * @param \DateTime $startDate The date/time (in GMT, ISO 8601) after which the Log resources must have been created. Defaults to 1 day prior to current date/time. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * The date/time (in GMT, ISO 8601) before which the Log resources must have been created. Defaults to current date/time. + * + * @param \DateTime $endDate The date/time (in GMT, ISO 8601) before which the Log resources must have been created. Defaults to current date/time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.ReadLogOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogPage.php new file mode 100755 index 0000000..35a96b3 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/LogPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return LogInstance \Twilio\Rest\Serverless\V1\Service\Environment\LogInstance + */ + public function buildInstance(array $payload): LogInstance + { + return new LogInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['environmentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.LogPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableContext.php new file mode 100755 index 0000000..0b1dec6 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'environmentSid' => + $environmentSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Variables/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the VariableInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the VariableInstance + * + * @return VariableInstance Fetched VariableInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VariableInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new VariableInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the VariableInstance + * + * @param array|Options $options Optional Arguments + * @return VariableInstance Updated VariableInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): VariableInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Key' => + $options['key'], + 'Value' => + $options['value'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new VariableInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.VariableContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableInstance.php new file mode 100755 index 0000000..3fce47b --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'environmentSid' => Values::array_get($payload, 'environment_sid'), + 'key' => Values::array_get($payload, 'key'), + 'value' => Values::array_get($payload, 'value'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'environmentSid' => $environmentSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return VariableContext Context for this VariableInstance + */ + protected function proxy(): VariableContext + { + if (!$this->context) { + $this->context = new VariableContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the VariableInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the VariableInstance + * + * @return VariableInstance Fetched VariableInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VariableInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the VariableInstance + * + * @param array|Options $options Optional Arguments + * @return VariableInstance Updated VariableInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): VariableInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.VariableInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableList.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableList.php new file mode 100755 index 0000000..f1ca3f5 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableList.php @@ -0,0 +1,205 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'environmentSid' => + $environmentSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($environmentSid) + .'/Variables'; + } + + /** + * Create the VariableInstance + * + * @param string $key A string by which the Variable resource can be referenced. It can be a maximum of 128 characters. + * @param string $value A string that contains the actual value of the Variable. It can be a maximum of 450 bytes in size. + * @return VariableInstance Created VariableInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, string $value): VariableInstance + { + + $data = Values::of([ + 'Key' => + $key, + 'Value' => + $value, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new VariableInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['environmentSid'] + ); + } + + + /** + * Reads VariableInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return VariableInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams VariableInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of VariableInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return VariablePage Page of VariableInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): VariablePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new VariablePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of VariableInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return VariablePage Page of VariableInstance + */ + public function getPage(string $targetUrl): VariablePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new VariablePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a VariableContext + * + * @param string $sid The SID of the Variable resource to delete. + */ + public function getContext( + string $sid + + ): VariableContext + { + return new VariableContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['environmentSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.VariableList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableOptions.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableOptions.php new file mode 100755 index 0000000..1a340f6 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariableOptions.php @@ -0,0 +1,102 @@ +options['key'] = $key; + $this->options['value'] = $value; + } + + /** + * A string by which the Variable resource can be referenced. It can be a maximum of 128 characters. + * + * @param string $key A string by which the Variable resource can be referenced. It can be a maximum of 128 characters. + * @return $this Fluent Builder + */ + public function setKey(string $key): self + { + $this->options['key'] = $key; + return $this; + } + + /** + * A string that contains the actual value of the Variable. It can be a maximum of 450 bytes in size. + * + * @param string $value A string that contains the actual value of the Variable. It can be a maximum of 450 bytes in size. + * @return $this Fluent Builder + */ + public function setValue(string $value): self + { + $this->options['value'] = $value; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.UpdateVariableOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariablePage.php b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariablePage.php new file mode 100755 index 0000000..9983fb3 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/Environment/VariablePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VariableInstance \Twilio\Rest\Serverless\V1\Service\Environment\VariableInstance + */ + public function buildInstance(array $payload): VariableInstance + { + return new VariableInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['environmentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.VariablePage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentContext.php new file mode 100755 index 0000000..e28b20e --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentContext.php @@ -0,0 +1,199 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the EnvironmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the EnvironmentInstance + * + * @return EnvironmentInstance Fetched EnvironmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EnvironmentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EnvironmentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the logs + */ + protected function getLogs(): LogList + { + if (!$this->_logs) { + $this->_logs = new LogList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_logs; + } + + /** + * Access the deployments + */ + protected function getDeployments(): DeploymentList + { + if (!$this->_deployments) { + $this->_deployments = new DeploymentList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_deployments; + } + + /** + * Access the variables + */ + protected function getVariables(): VariableList + { + if (!$this->_variables) { + $this->_variables = new VariableList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_variables; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.EnvironmentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentInstance.php new file mode 100755 index 0000000..c97f3e8 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentInstance.php @@ -0,0 +1,181 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'buildSid' => Values::array_get($payload, 'build_sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'domainSuffix' => Values::array_get($payload, 'domain_suffix'), + 'domainName' => Values::array_get($payload, 'domain_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EnvironmentContext Context for this EnvironmentInstance + */ + protected function proxy(): EnvironmentContext + { + if (!$this->context) { + $this->context = new EnvironmentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the EnvironmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the EnvironmentInstance + * + * @return EnvironmentInstance Fetched EnvironmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EnvironmentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the logs + */ + protected function getLogs(): LogList + { + return $this->proxy()->logs; + } + + /** + * Access the deployments + */ + protected function getDeployments(): DeploymentList + { + return $this->proxy()->deployments; + } + + /** + * Access the variables + */ + protected function getVariables(): VariableList + { + return $this->proxy()->variables; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.EnvironmentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentList.php b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentList.php new file mode 100755 index 0000000..ed04b52 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentList.php @@ -0,0 +1,200 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Environments'; + } + + /** + * Create the EnvironmentInstance + * + * @param string $uniqueName A user-defined string that uniquely identifies the Environment resource. It can be a maximum of 100 characters. + * @param array|Options $options Optional Arguments + * @return EnvironmentInstance Created EnvironmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): EnvironmentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'DomainSuffix' => + $options['domainSuffix'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EnvironmentInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads EnvironmentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EnvironmentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EnvironmentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EnvironmentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EnvironmentPage Page of EnvironmentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EnvironmentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EnvironmentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EnvironmentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EnvironmentPage Page of EnvironmentInstance + */ + public function getPage(string $targetUrl): EnvironmentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EnvironmentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EnvironmentContext + * + * @param string $sid The SID of the Environment resource to delete. + */ + public function getContext( + string $sid + + ): EnvironmentContext + { + return new EnvironmentContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.EnvironmentList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentOptions.php b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentOptions.php new file mode 100755 index 0000000..666fae9 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentOptions.php @@ -0,0 +1,82 @@ +options['domainSuffix'] = $domainSuffix; + } + + /** + * A URL-friendly name that represents the environment and forms part of the domain name. It can be a maximum of 16 characters. + * + * @param string $domainSuffix A URL-friendly name that represents the environment and forms part of the domain name. It can be a maximum of 16 characters. + * @return $this Fluent Builder + */ + public function setDomainSuffix(string $domainSuffix): self + { + $this->options['domainSuffix'] = $domainSuffix; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.CreateEnvironmentOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentPage.php new file mode 100755 index 0000000..d4a854f --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/EnvironmentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EnvironmentInstance \Twilio\Rest\Serverless\V1\Service\EnvironmentInstance + */ + public function buildInstance(array $payload): EnvironmentInstance + { + return new EnvironmentInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.EnvironmentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/FunctionContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionContext.php new file mode 100755 index 0000000..75d3742 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionContext.php @@ -0,0 +1,186 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Functions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FunctionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FunctionInstance + * + * @return FunctionInstance Fetched FunctionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FunctionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the FunctionInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Function resource. It can be a maximum of 255 characters. + * @return FunctionInstance Updated FunctionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): FunctionInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FunctionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the functionVersions + */ + protected function getFunctionVersions(): FunctionVersionList + { + if (!$this->_functionVersions) { + $this->_functionVersions = new FunctionVersionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_functionVersions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/FunctionInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionInstance.php new file mode 100755 index 0000000..f6178fb --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FunctionContext Context for this FunctionInstance + */ + protected function proxy(): FunctionContext + { + if (!$this->context) { + $this->context = new FunctionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FunctionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FunctionInstance + * + * @return FunctionInstance Fetched FunctionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FunctionInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Function resource. It can be a maximum of 255 characters. + * @return FunctionInstance Updated FunctionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName): FunctionInstance + { + + return $this->proxy()->update($friendlyName); + } + + /** + * Access the functionVersions + */ + protected function getFunctionVersions(): FunctionVersionList + { + return $this->proxy()->functionVersions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/FunctionList.php b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionList.php new file mode 100755 index 0000000..4d17693 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Functions'; + } + + /** + * Create the FunctionInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Function resource. It can be a maximum of 255 characters. + * @return FunctionInstance Created FunctionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName): FunctionInstance + { + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FunctionInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads FunctionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FunctionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FunctionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FunctionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FunctionPage Page of FunctionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FunctionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FunctionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FunctionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FunctionPage Page of FunctionInstance + */ + public function getPage(string $targetUrl): FunctionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FunctionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FunctionContext + * + * @param string $sid The SID of the Function resource to delete. + */ + public function getContext( + string $sid + + ): FunctionContext + { + return new FunctionContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/FunctionPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionPage.php new file mode 100755 index 0000000..e27f7fb --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/FunctionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FunctionInstance \Twilio\Rest\Serverless\V1\Service\FunctionInstance + */ + public function buildInstance(array $payload): FunctionInstance + { + return new FunctionInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentContext.php new file mode 100755 index 0000000..7e86721 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentContext.php @@ -0,0 +1,93 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'functionSid' => + $functionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Functions/' . \rawurlencode($functionSid) + .'/Versions/' . \rawurlencode($sid) + .'/Content'; + } + + /** + * Fetch the FunctionVersionContentInstance + * + * @return FunctionVersionContentInstance Fetched FunctionVersionContentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionVersionContentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FunctionVersionContentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionVersionContentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentInstance.php new file mode 100755 index 0000000..8f8af5b --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'functionSid' => Values::array_get($payload, 'function_sid'), + 'content' => Values::array_get($payload, 'content'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'functionSid' => $functionSid, 'sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FunctionVersionContentContext Context for this FunctionVersionContentInstance + */ + protected function proxy(): FunctionVersionContentContext + { + if (!$this->context) { + $this->context = new FunctionVersionContentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the FunctionVersionContentInstance + * + * @return FunctionVersionContentInstance Fetched FunctionVersionContentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionVersionContentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionVersionContentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentList.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentList.php new file mode 100755 index 0000000..03576cd --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentList.php @@ -0,0 +1,79 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'functionSid' => + $functionSid, + + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a FunctionVersionContentContext + */ + public function getContext( + + ): FunctionVersionContentContext + { + return new FunctionVersionContentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionVersionContentList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentPage.php new file mode 100755 index 0000000..9a0acbb --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersion/FunctionVersionContentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FunctionVersionContentInstance \Twilio\Rest\Serverless\V1\Service\TwilioFunction\FunctionVersion\FunctionVersionContentInstance + */ + public function buildInstance(array $payload): FunctionVersionContentInstance + { + return new FunctionVersionContentInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['functionSid'], $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionVersionContentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionContext.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionContext.php new file mode 100755 index 0000000..b86a086 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionContext.php @@ -0,0 +1,153 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'functionSid' => + $functionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Functions/' . \rawurlencode($functionSid) + .'/Versions/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the FunctionVersionInstance + * + * @return FunctionVersionInstance Fetched FunctionVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionVersionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FunctionVersionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the functionVersionContent + */ + protected function getFunctionVersionContent(): FunctionVersionContentList + { + if (!$this->_functionVersionContent) { + $this->_functionVersionContent = new FunctionVersionContentList( + $this->version, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + return $this->_functionVersionContent; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionVersionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionInstance.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionInstance.php new file mode 100755 index 0000000..ee43bdf --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionInstance.php @@ -0,0 +1,147 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'functionSid' => Values::array_get($payload, 'function_sid'), + 'path' => Values::array_get($payload, 'path'), + 'visibility' => Values::array_get($payload, 'visibility'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'functionSid' => $functionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FunctionVersionContext Context for this FunctionVersionInstance + */ + protected function proxy(): FunctionVersionContext + { + if (!$this->context) { + $this->context = new FunctionVersionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the FunctionVersionInstance + * + * @return FunctionVersionInstance Fetched FunctionVersionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FunctionVersionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the functionVersionContent + */ + protected function getFunctionVersionContent(): FunctionVersionContentList + { + return $this->proxy()->functionVersionContent; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.FunctionVersionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionList.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionList.php new file mode 100755 index 0000000..0852da4 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'functionSid' => + $functionSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Functions/' . \rawurlencode($functionSid) + .'/Versions'; + } + + /** + * Reads FunctionVersionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FunctionVersionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FunctionVersionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FunctionVersionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FunctionVersionPage Page of FunctionVersionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FunctionVersionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FunctionVersionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FunctionVersionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FunctionVersionPage Page of FunctionVersionInstance + */ + public function getPage(string $targetUrl): FunctionVersionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FunctionVersionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FunctionVersionContext + * + * @param string $sid The SID of the Function Version resource to fetch. + */ + public function getContext( + string $sid + + ): FunctionVersionContext + { + return new FunctionVersionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['functionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionVersionList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionPage.php b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionPage.php new file mode 100755 index 0000000..218745a --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/Service/TwilioFunction/FunctionVersionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FunctionVersionInstance \Twilio\Rest\Serverless\V1\Service\TwilioFunction\FunctionVersionInstance + */ + public function buildInstance(array $payload): FunctionVersionInstance + { + return new FunctionVersionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['functionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.FunctionVersionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/ServiceContext.php b/app/api/Twilio/Rest/Serverless/V1/ServiceContext.php new file mode 100755 index 0000000..68985cc --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/ServiceContext.php @@ -0,0 +1,243 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IncludeCredentials' => + Serialize::booleanToString($options['includeCredentials']), + 'FriendlyName' => + $options['friendlyName'], + 'UiEditable' => + Serialize::booleanToString($options['uiEditable']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the functions + */ + protected function getFunctions(): FunctionList + { + if (!$this->_functions) { + $this->_functions = new FunctionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_functions; + } + + /** + * Access the builds + */ + protected function getBuilds(): BuildList + { + if (!$this->_builds) { + $this->_builds = new BuildList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_builds; + } + + /** + * Access the environments + */ + protected function getEnvironments(): EnvironmentList + { + if (!$this->_environments) { + $this->_environments = new EnvironmentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_environments; + } + + /** + * Access the assets + */ + protected function getAssets(): AssetList + { + if (!$this->_assets) { + $this->_assets = new AssetList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_assets; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/ServiceInstance.php b/app/api/Twilio/Rest/Serverless/V1/ServiceInstance.php new file mode 100755 index 0000000..44e06a9 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/ServiceInstance.php @@ -0,0 +1,203 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'includeCredentials' => Values::array_get($payload, 'include_credentials'), + 'uiEditable' => Values::array_get($payload, 'ui_editable'), + 'domainBase' => Values::array_get($payload, 'domain_base'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the functions + */ + protected function getFunctions(): FunctionList + { + return $this->proxy()->functions; + } + + /** + * Access the builds + */ + protected function getBuilds(): BuildList + { + return $this->proxy()->builds; + } + + /** + * Access the environments + */ + protected function getEnvironments(): EnvironmentList + { + return $this->proxy()->environments; + } + + /** + * Access the assets + */ + protected function getAssets(): AssetList + { + return $this->proxy()->assets; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Serverless.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/ServiceList.php b/app/api/Twilio/Rest/Serverless/V1/ServiceList.php new file mode 100755 index 0000000..f97a47b --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/ServiceList.php @@ -0,0 +1,198 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $uniqueName A user-defined string that uniquely identifies the Service resource. It can be used as an alternative to the `sid` in the URL path to address the Service resource. This value must be 50 characters or less in length and be unique. + * @param string $friendlyName A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, string $friendlyName, array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'FriendlyName' => + $friendlyName, + 'IncludeCredentials' => + Serialize::booleanToString($options['includeCredentials']), + 'UiEditable' => + Serialize::booleanToString($options['uiEditable']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The `sid` or `unique_name` of the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Serverless/V1/ServiceOptions.php b/app/api/Twilio/Rest/Serverless/V1/ServiceOptions.php new file mode 100755 index 0000000..8283d99 --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/ServiceOptions.php @@ -0,0 +1,188 @@ +options['includeCredentials'] = $includeCredentials; + $this->options['uiEditable'] = $uiEditable; + } + + /** + * Whether to inject Account credentials into a function invocation context. The default value is `true`. + * + * @param bool $includeCredentials Whether to inject Account credentials into a function invocation context. The default value is `true`. + * @return $this Fluent Builder + */ + public function setIncludeCredentials(bool $includeCredentials): self + { + $this->options['includeCredentials'] = $includeCredentials; + return $this; + } + + /** + * Whether the Service's properties and subresources can be edited via the UI. The default value is `false`. + * + * @param bool $uiEditable Whether the Service's properties and subresources can be edited via the UI. The default value is `false`. + * @return $this Fluent Builder + */ + public function setUiEditable(bool $uiEditable): self + { + $this->options['uiEditable'] = $uiEditable; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param bool $includeCredentials Whether to inject Account credentials into a function invocation context. + * @param string $friendlyName A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + * @param bool $uiEditable Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + */ + public function __construct( + + bool $includeCredentials = Values::BOOL_NONE, + string $friendlyName = Values::NONE, + bool $uiEditable = Values::BOOL_NONE + + ) { + $this->options['includeCredentials'] = $includeCredentials; + $this->options['friendlyName'] = $friendlyName; + $this->options['uiEditable'] = $uiEditable; + } + + /** + * Whether to inject Account credentials into a function invocation context. + * + * @param bool $includeCredentials Whether to inject Account credentials into a function invocation context. + * @return $this Fluent Builder + */ + public function setIncludeCredentials(bool $includeCredentials): self + { + $this->options['includeCredentials'] = $includeCredentials; + return $this; + } + + /** + * A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + * + * @param string $friendlyName A descriptive string that you create to describe the Service resource. It can be a maximum of 255 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + * + * @param bool $uiEditable Whether the Service resource's properties and subresources can be edited via the UI. The default value is `false`. + * @return $this Fluent Builder + */ + public function setUiEditable(bool $uiEditable): self + { + $this->options['uiEditable'] = $uiEditable; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Serverless.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Serverless/V1/ServicePage.php b/app/api/Twilio/Rest/Serverless/V1/ServicePage.php new file mode 100755 index 0000000..ad29d7f --- /dev/null +++ b/app/api/Twilio/Rest/Serverless/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Serverless\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Serverless.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/ServerlessBase.php b/app/api/Twilio/Rest/ServerlessBase.php new file mode 100755 index 0000000..4aa8d51 --- /dev/null +++ b/app/api/Twilio/Rest/ServerlessBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://serverless.twilio.com'; + } + + + /** + * @return V1 Version v1 of serverless + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Serverless]'; + } +} diff --git a/app/api/Twilio/Rest/Studio.php b/app/api/Twilio/Rest/Studio.php new file mode 100755 index 0000000..ddb3f32 --- /dev/null +++ b/app/api/Twilio/Rest/Studio.php @@ -0,0 +1,32 @@ +flows instead. + */ + protected function getFlows(): \Twilio\Rest\Studio\V2\FlowList { + echo "flows is deprecated. Use v2->flows instead."; + return $this->v2->flows; + } + + /** + * @deprecated Use v2->flows(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextFlows(string $sid): \Twilio\Rest\Studio\V2\FlowContext { + echo "flows(\$sid) is deprecated. Use v2->flows(\$sid) instead."; + return $this->v2->flows($sid); + } + + /** + * @deprecated Use v2->flowValidate instead. + */ + protected function getFlowValidate(): \Twilio\Rest\Studio\V2\FlowValidateList { + echo "flowValidate is deprecated. Use v2->flowValidate instead."; + return $this->v2->flowValidate; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Studio/V1.php b/app/api/Twilio/Rest/Studio/V1.php new file mode 100755 index 0000000..a58c38a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getFlows(): FlowList + { + if (!$this->_flows) { + $this->_flows = new FlowList($this); + } + return $this->_flows; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextContext.php new file mode 100755 index 0000000..16b084a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextContext.php @@ -0,0 +1,87 @@ +solution = [ + 'flowSid' => + $flowSid, + 'engagementSid' => + $engagementSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements/' . \rawurlencode($engagementSid) + .'/Context'; + } + + /** + * Fetch the EngagementContextInstance + * + * @return EngagementContextInstance Fetched EngagementContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EngagementContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EngagementContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['engagementSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.EngagementContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextInstance.php new file mode 100755 index 0000000..49029d2 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'engagementSid' => Values::array_get($payload, 'engagement_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'engagementSid' => $engagementSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EngagementContextContext Context for this EngagementContextInstance + */ + protected function proxy(): EngagementContextContext + { + if (!$this->context) { + $this->context = new EngagementContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EngagementContextInstance + * + * @return EngagementContextInstance Fetched EngagementContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EngagementContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.EngagementContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextList.php new file mode 100755 index 0000000..770d620 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextList.php @@ -0,0 +1,73 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'engagementSid' => + $engagementSid, + + ]; + } + + /** + * Constructs a EngagementContextContext + */ + public function getContext( + + ): EngagementContextContext + { + return new EngagementContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.EngagementContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextPage.php new file mode 100755 index 0000000..5becce0 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/EngagementContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EngagementContextInstance \Twilio\Rest\Studio\V1\Flow\Engagement\EngagementContextInstance + */ + public function buildInstance(array $payload): EngagementContextInstance + { + return new EngagementContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['engagementSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.EngagementContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextContext.php new file mode 100755 index 0000000..4b9d7a3 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextContext.php @@ -0,0 +1,93 @@ +solution = [ + 'flowSid' => + $flowSid, + 'engagementSid' => + $engagementSid, + 'stepSid' => + $stepSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements/' . \rawurlencode($engagementSid) + .'/Steps/' . \rawurlencode($stepSid) + .'/Context'; + } + + /** + * Fetch the StepContextInstance + * + * @return StepContextInstance Fetched StepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StepContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new StepContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['stepSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.StepContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextInstance.php new file mode 100755 index 0000000..8d57aa1 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'engagementSid' => Values::array_get($payload, 'engagement_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'stepSid' => Values::array_get($payload, 'step_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'engagementSid' => $engagementSid, 'stepSid' => $stepSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return StepContextContext Context for this StepContextInstance + */ + protected function proxy(): StepContextContext + { + if (!$this->context) { + $this->context = new StepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['stepSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the StepContextInstance + * + * @return StepContextInstance Fetched StepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StepContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.StepContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextList.php new file mode 100755 index 0000000..5dbb608 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextList.php @@ -0,0 +1,79 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'engagementSid' => + $engagementSid, + + 'stepSid' => + $stepSid, + + ]; + } + + /** + * Constructs a StepContextContext + */ + public function getContext( + + ): StepContextContext + { + return new StepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['stepSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.StepContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextPage.php new file mode 100755 index 0000000..587d083 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/Step/StepContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StepContextInstance \Twilio\Rest\Studio\V1\Flow\Engagement\Step\StepContextInstance + */ + public function buildInstance(array $payload): StepContextInstance + { + return new StepContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['engagementSid'], $this->solution['stepSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.StepContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepContext.php new file mode 100755 index 0000000..5c58a8a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepContext.php @@ -0,0 +1,153 @@ +solution = [ + 'flowSid' => + $flowSid, + 'engagementSid' => + $engagementSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements/' . \rawurlencode($engagementSid) + .'/Steps/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the StepInstance + * + * @return StepInstance Fetched StepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StepInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new StepInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the stepContext + */ + protected function getStepContext(): StepContextList + { + if (!$this->_stepContext) { + $this->_stepContext = new StepContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['sid'] + ); + } + + return $this->_stepContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.StepContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepInstance.php new file mode 100755 index 0000000..4d6cabf --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepInstance.php @@ -0,0 +1,153 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'engagementSid' => Values::array_get($payload, 'engagement_sid'), + 'name' => Values::array_get($payload, 'name'), + 'context' => Values::array_get($payload, 'context'), + 'transitionedFrom' => Values::array_get($payload, 'transitioned_from'), + 'transitionedTo' => Values::array_get($payload, 'transitioned_to'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'engagementSid' => $engagementSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return StepContext Context for this StepInstance + */ + protected function proxy(): StepContext + { + if (!$this->context) { + $this->context = new StepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the StepInstance + * + * @return StepInstance Fetched StepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): StepInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the stepContext + */ + protected function getStepContext(): StepContextList + { + return $this->proxy()->stepContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.StepInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepList.php new file mode 100755 index 0000000..7f52e9c --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepList.php @@ -0,0 +1,175 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'engagementSid' => + $engagementSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements/' . \rawurlencode($engagementSid) + .'/Steps'; + } + + /** + * Reads StepInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return StepInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams StepInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of StepInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return StepPage Page of StepInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): StepPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new StepPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of StepInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return StepPage Page of StepInstance + */ + public function getPage(string $targetUrl): StepPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new StepPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a StepContext + * + * @param string $sid The SID of the Step resource to fetch. + */ + public function getContext( + string $sid + + ): StepContext + { + return new StepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['engagementSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.StepList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepPage.php new file mode 100755 index 0000000..73360c6 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Engagement/StepPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StepInstance \Twilio\Rest\Studio\V1\Flow\Engagement\StepInstance + */ + public function buildInstance(array $payload): StepInstance + { + return new StepInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['engagementSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.StepPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/EngagementContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementContext.php new file mode 100755 index 0000000..d1066f2 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementContext.php @@ -0,0 +1,179 @@ +solution = [ + 'flowSid' => + $flowSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the EngagementInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the EngagementInstance + * + * @return EngagementInstance Fetched EngagementInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EngagementInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EngagementInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the steps + */ + protected function getSteps(): StepList + { + if (!$this->_steps) { + $this->_steps = new StepList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_steps; + } + + /** + * Access the engagementContext + */ + protected function getEngagementContext(): EngagementContextList + { + if (!$this->_engagementContext) { + $this->_engagementContext = new EngagementContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_engagementContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.EngagementContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/EngagementInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementInstance.php new file mode 100755 index 0000000..a537162 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'contactSid' => Values::array_get($payload, 'contact_sid'), + 'contactChannelAddress' => Values::array_get($payload, 'contact_channel_address'), + 'context' => Values::array_get($payload, 'context'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EngagementContext Context for this EngagementInstance + */ + protected function proxy(): EngagementContext + { + if (!$this->context) { + $this->context = new EngagementContext( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the EngagementInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the EngagementInstance + * + * @return EngagementInstance Fetched EngagementInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EngagementInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the steps + */ + protected function getSteps(): StepList + { + return $this->proxy()->steps; + } + + /** + * Access the engagementContext + */ + protected function getEngagementContext(): EngagementContextList + { + return $this->proxy()->engagementContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.EngagementInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/EngagementList.php b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementList.php new file mode 100755 index 0000000..6f9706a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementList.php @@ -0,0 +1,204 @@ +solution = [ + 'flowSid' => + $flowSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Engagements'; + } + + /** + * Create the EngagementInstance + * + * @param string $to The Contact phone number to start a Studio Flow Engagement, available as variable `{{contact.channel.address}}`. + * @param string $from The Twilio phone number to send messages or initiate calls from during the Flow Engagement. Available as variable `{{flow.channel.address}}` + * @param array|Options $options Optional Arguments + * @return EngagementInstance Created EngagementInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, string $from, array $options = []): EngagementInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'From' => + $from, + 'Parameters' => + Serialize::jsonObject($options['parameters']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EngagementInstance( + $this->version, + $payload, + $this->solution['flowSid'] + ); + } + + + /** + * Reads EngagementInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EngagementInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EngagementInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EngagementInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EngagementPage Page of EngagementInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EngagementPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EngagementPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EngagementInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EngagementPage Page of EngagementInstance + */ + public function getPage(string $targetUrl): EngagementPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EngagementPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EngagementContext + * + * @param string $sid The SID of the Engagement resource to delete. + */ + public function getContext( + string $sid + + ): EngagementContext + { + return new EngagementContext( + $this->version, + $this->solution['flowSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.EngagementList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/EngagementOptions.php b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementOptions.php new file mode 100755 index 0000000..28acbf5 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementOptions.php @@ -0,0 +1,82 @@ +options['parameters'] = $parameters; + } + + /** + * A JSON string we will add to your flow's context and that you can access as variables inside your flow. For example, if you pass in `Parameters={'name':'Zeke'}` then inside a widget you can reference the variable `{{flow.data.name}}` which will return the string 'Zeke'. Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode your JSON string. + * + * @param array $parameters A JSON string we will add to your flow's context and that you can access as variables inside your flow. For example, if you pass in `Parameters={'name':'Zeke'}` then inside a widget you can reference the variable `{{flow.data.name}}` which will return the string 'Zeke'. Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode your JSON string. + * @return $this Fluent Builder + */ + public function setParameters(array $parameters): self + { + $this->options['parameters'] = $parameters; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V1.CreateEngagementOptions ' . $options . ']'; + } +} + + + + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/EngagementPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementPage.php new file mode 100755 index 0000000..627a64b --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/EngagementPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EngagementInstance \Twilio\Rest\Studio\V1\Flow\EngagementInstance + */ + public function buildInstance(array $payload): EngagementInstance + { + return new EngagementInstance($this->version, $payload, $this->solution['flowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.EngagementPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextContext.php new file mode 100755 index 0000000..e27aeab --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextContext.php @@ -0,0 +1,87 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Context'; + } + + /** + * Fetch the ExecutionContextInstance + * + * @return ExecutionContextInstance Fetched ExecutionContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextInstance.php new file mode 100755 index 0000000..e6b80b7 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionContextContext Context for this ExecutionContextInstance + */ + protected function proxy(): ExecutionContextContext + { + if (!$this->context) { + $this->context = new ExecutionContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionContextInstance + * + * @return ExecutionContextInstance Fetched ExecutionContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextList.php new file mode 100755 index 0000000..cff0094 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextList.php @@ -0,0 +1,73 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + ]; + } + + /** + * Constructs a ExecutionContextContext + */ + public function getContext( + + ): ExecutionContextContext + { + return new ExecutionContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextPage.php new file mode 100755 index 0000000..5f721f4 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionContextInstance \Twilio\Rest\Studio\V1\Flow\Execution\ExecutionContextInstance + */ + public function buildInstance(array $payload): ExecutionContextInstance + { + return new ExecutionContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php new file mode 100755 index 0000000..0785945 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php @@ -0,0 +1,93 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + 'stepSid' => + $stepSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps/' . \rawurlencode($stepSid) + .'/Context'; + } + + /** + * Fetch the ExecutionStepContextInstance + * + * @return ExecutionStepContextInstance Fetched ExecutionStepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionStepContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionStepContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php new file mode 100755 index 0000000..020e1a8 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'stepSid' => Values::array_get($payload, 'step_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, 'stepSid' => $stepSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionStepContextContext Context for this ExecutionStepContextInstance + */ + protected function proxy(): ExecutionStepContextContext + { + if (!$this->context) { + $this->context = new ExecutionStepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionStepContextInstance + * + * @return ExecutionStepContextInstance Fetched ExecutionStepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionStepContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextList.php new file mode 100755 index 0000000..ae0de6b --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextList.php @@ -0,0 +1,79 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + 'stepSid' => + $stepSid, + + ]; + } + + /** + * Constructs a ExecutionStepContextContext + */ + public function getContext( + + ): ExecutionStepContextContext + { + return new ExecutionStepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionStepContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php new file mode 100755 index 0000000..2f52038 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionStepContextInstance \Twilio\Rest\Studio\V1\Flow\Execution\ExecutionStep\ExecutionStepContextInstance + */ + public function buildInstance(array $payload): ExecutionStepContextInstance + { + return new ExecutionStepContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid'], $this->solution['stepSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionStepContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepContext.php new file mode 100755 index 0000000..4b7a4a5 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepContext.php @@ -0,0 +1,153 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ExecutionStepInstance + * + * @return ExecutionStepInstance Fetched ExecutionStepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionStepInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the stepContext + */ + protected function getStepContext(): ExecutionStepContextList + { + if (!$this->_stepContext) { + $this->_stepContext = new ExecutionStepContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + return $this->_stepContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionStepContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepInstance.php new file mode 100755 index 0000000..758e153 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepInstance.php @@ -0,0 +1,153 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'name' => Values::array_get($payload, 'name'), + 'context' => Values::array_get($payload, 'context'), + 'transitionedFrom' => Values::array_get($payload, 'transitioned_from'), + 'transitionedTo' => Values::array_get($payload, 'transitioned_to'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionStepContext Context for this ExecutionStepInstance + */ + protected function proxy(): ExecutionStepContext + { + if (!$this->context) { + $this->context = new ExecutionStepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionStepInstance + * + * @return ExecutionStepInstance Fetched ExecutionStepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the stepContext + */ + protected function getStepContext(): ExecutionStepContextList + { + return $this->proxy()->stepContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionStepInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepList.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepList.php new file mode 100755 index 0000000..8b4dbe9 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepList.php @@ -0,0 +1,175 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps'; + } + + /** + * Reads ExecutionStepInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ExecutionStepInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ExecutionStepInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ExecutionStepInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ExecutionStepPage Page of ExecutionStepInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ExecutionStepPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ExecutionStepPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ExecutionStepInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ExecutionStepPage Page of ExecutionStepInstance + */ + public function getPage(string $targetUrl): ExecutionStepPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ExecutionStepPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ExecutionStepContext + * + * @param string $sid The SID of the ExecutionStep resource to fetch. + */ + public function getContext( + string $sid + + ): ExecutionStepContext + { + return new ExecutionStepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionStepList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepPage.php new file mode 100755 index 0000000..a8468b0 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/Execution/ExecutionStepPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionStepInstance \Twilio\Rest\Studio\V1\Flow\Execution\ExecutionStepInstance + */ + public function buildInstance(array $payload): ExecutionStepInstance + { + return new ExecutionStepInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionStepPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionContext.php b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionContext.php new file mode 100755 index 0000000..bac9ae7 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionContext.php @@ -0,0 +1,206 @@ +solution = [ + 'flowSid' => + $flowSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ExecutionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ExecutionInstance + * + * @return ExecutionInstance Fetched ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ExecutionInstance + * + * @param string $status + * @return ExecutionInstance Updated ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): ExecutionInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the steps + */ + protected function getSteps(): ExecutionStepList + { + if (!$this->_steps) { + $this->_steps = new ExecutionStepList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_steps; + } + + /** + * Access the executionContext + */ + protected function getExecutionContext(): ExecutionContextList + { + if (!$this->_executionContext) { + $this->_executionContext = new ExecutionContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_executionContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionInstance.php b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionInstance.php new file mode 100755 index 0000000..bfe4a4d --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionInstance.php @@ -0,0 +1,184 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'contactSid' => Values::array_get($payload, 'contact_sid'), + 'contactChannelAddress' => Values::array_get($payload, 'contact_channel_address'), + 'context' => Values::array_get($payload, 'context'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionContext Context for this ExecutionInstance + */ + protected function proxy(): ExecutionContext + { + if (!$this->context) { + $this->context = new ExecutionContext( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ExecutionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ExecutionInstance + * + * @return ExecutionInstance Fetched ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ExecutionInstance + * + * @param string $status + * @return ExecutionInstance Updated ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): ExecutionInstance + { + + return $this->proxy()->update($status); + } + + /** + * Access the steps + */ + protected function getSteps(): ExecutionStepList + { + return $this->proxy()->steps; + } + + /** + * Access the executionContext + */ + protected function getExecutionContext(): ExecutionContextList + { + return $this->proxy()->executionContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.ExecutionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionList.php b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionList.php new file mode 100755 index 0000000..df47681 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionList.php @@ -0,0 +1,212 @@ +solution = [ + 'flowSid' => + $flowSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions'; + } + + /** + * Create the ExecutionInstance + * + * @param string $to The Contact phone number to start a Studio Flow Execution, available as variable `{{contact.channel.address}}`. + * @param string $from The Twilio phone number to send messages or initiate calls from during the Flow's Execution. Available as variable `{{flow.channel.address}}`. For SMS, this can also be a Messaging Service SID. + * @param array|Options $options Optional Arguments + * @return ExecutionInstance Created ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, string $from, array $options = []): ExecutionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'From' => + $from, + 'Parameters' => + Serialize::jsonObject($options['parameters']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'] + ); + } + + + /** + * Reads ExecutionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ExecutionInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ExecutionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ExecutionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ExecutionPage Page of ExecutionInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ExecutionPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreatedFrom' => + Serialize::iso8601DateTime($options['dateCreatedFrom']), + 'DateCreatedTo' => + Serialize::iso8601DateTime($options['dateCreatedTo']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ExecutionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ExecutionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ExecutionPage Page of ExecutionInstance + */ + public function getPage(string $targetUrl): ExecutionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ExecutionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ExecutionContext + * + * @param string $sid The SID of the Execution resource to delete. + */ + public function getContext( + string $sid + + ): ExecutionContext + { + return new ExecutionContext( + $this->version, + $this->solution['flowSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionOptions.php b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionOptions.php new file mode 100755 index 0000000..3c685ff --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionOptions.php @@ -0,0 +1,152 @@ +options['parameters'] = $parameters; + } + + /** + * JSON data that will be added to the Flow's context and that can be accessed as variables inside your Flow. For example, if you pass in `Parameters={\\\"name\\\":\\\"Zeke\\\"}`, a widget in your Flow can reference the variable `{{flow.data.name}}`, which returns \\\"Zeke\\\". Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode the JSON string. + * + * @param array $parameters JSON data that will be added to the Flow's context and that can be accessed as variables inside your Flow. For example, if you pass in `Parameters={\\\"name\\\":\\\"Zeke\\\"}`, a widget in your Flow can reference the variable `{{flow.data.name}}`, which returns \\\"Zeke\\\". Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode the JSON string. + * @return $this Fluent Builder + */ + public function setParameters(array $parameters): self + { + $this->options['parameters'] = $parameters; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V1.CreateExecutionOptions ' . $options . ']'; + } +} + + + +class ReadExecutionOptions extends Options + { + /** + * @param \DateTime $dateCreatedFrom Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @param \DateTime $dateCreatedTo Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + */ + public function __construct( + + \DateTime $dateCreatedFrom = null, + \DateTime $dateCreatedTo = null + + ) { + $this->options['dateCreatedFrom'] = $dateCreatedFrom; + $this->options['dateCreatedTo'] = $dateCreatedTo; + } + + /** + * Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * + * @param \DateTime $dateCreatedFrom Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @return $this Fluent Builder + */ + public function setDateCreatedFrom(\DateTime $dateCreatedFrom): self + { + $this->options['dateCreatedFrom'] = $dateCreatedFrom; + return $this; + } + + /** + * Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * + * @param \DateTime $dateCreatedTo Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @return $this Fluent Builder + */ + public function setDateCreatedTo(\DateTime $dateCreatedTo): self + { + $this->options['dateCreatedTo'] = $dateCreatedTo; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V1.ReadExecutionOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionPage.php b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionPage.php new file mode 100755 index 0000000..d2c180c --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/Flow/ExecutionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionInstance \Twilio\Rest\Studio\V1\Flow\ExecutionInstance + */ + public function buildInstance(array $payload): ExecutionInstance + { + return new ExecutionInstance($this->version, $payload, $this->solution['flowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.ExecutionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/FlowContext.php b/app/api/Twilio/Rest/Studio/V1/FlowContext.php new file mode 100755 index 0000000..13f011a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/FlowContext.php @@ -0,0 +1,171 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FlowInstance + * + * @return FlowInstance Fetched FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FlowInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the engagements + */ + protected function getEngagements(): EngagementList + { + if (!$this->_engagements) { + $this->_engagements = new EngagementList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_engagements; + } + + /** + * Access the executions + */ + protected function getExecutions(): ExecutionList + { + if (!$this->_executions) { + $this->_executions = new ExecutionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_executions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.FlowContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/FlowInstance.php b/app/api/Twilio/Rest/Studio/V1/FlowInstance.php new file mode 100755 index 0000000..89e92e9 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/FlowInstance.php @@ -0,0 +1,165 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'version' => Values::array_get($payload, 'version'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FlowContext Context for this FlowInstance + */ + protected function proxy(): FlowContext + { + if (!$this->context) { + $this->context = new FlowContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FlowInstance + * + * @return FlowInstance Fetched FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the engagements + */ + protected function getEngagements(): EngagementList + { + return $this->proxy()->engagements; + } + + /** + * Access the executions + */ + protected function getExecutions(): ExecutionList + { + return $this->proxy()->executions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V1.FlowInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V1/FlowList.php b/app/api/Twilio/Rest/Studio/V1/FlowList.php new file mode 100755 index 0000000..600aeb0 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/FlowList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Flows'; + } + + /** + * Reads FlowInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FlowInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FlowInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FlowInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FlowPage Page of FlowInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FlowPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FlowPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FlowInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FlowPage Page of FlowInstance + */ + public function getPage(string $targetUrl): FlowPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FlowPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FlowContext + * + * @param string $sid The SID of the Flow resource to delete. + */ + public function getContext( + string $sid + + ): FlowContext + { + return new FlowContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.FlowList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V1/FlowPage.php b/app/api/Twilio/Rest/Studio/V1/FlowPage.php new file mode 100755 index 0000000..0636aac --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V1/FlowPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlowInstance \Twilio\Rest\Studio\V1\FlowInstance + */ + public function buildInstance(array $payload): FlowInstance + { + return new FlowInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V1.FlowPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2.php b/app/api/Twilio/Rest/Studio/V2.php new file mode 100755 index 0000000..9fd95c7 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2.php @@ -0,0 +1,106 @@ +version = 'v2'; + } + + protected function getFlows(): FlowList + { + if (!$this->_flows) { + $this->_flows = new FlowList($this); + } + return $this->_flows; + } + + protected function getFlowValidate(): FlowValidateList + { + if (!$this->_flowValidate) { + $this->_flowValidate = new FlowValidateList($this); + } + return $this->_flowValidate; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextContext.php new file mode 100755 index 0000000..db77b12 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextContext.php @@ -0,0 +1,87 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Context'; + } + + /** + * Fetch the ExecutionContextInstance + * + * @return ExecutionContextInstance Fetched ExecutionContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextInstance.php new file mode 100755 index 0000000..82a65cc --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionContextContext Context for this ExecutionContextInstance + */ + protected function proxy(): ExecutionContextContext + { + if (!$this->context) { + $this->context = new ExecutionContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionContextInstance + * + * @return ExecutionContextInstance Fetched ExecutionContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextList.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextList.php new file mode 100755 index 0000000..1d57ca2 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextList.php @@ -0,0 +1,73 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + ]; + } + + /** + * Constructs a ExecutionContextContext + */ + public function getContext( + + ): ExecutionContextContext + { + return new ExecutionContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextPage.php new file mode 100755 index 0000000..2f219f9 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionContextInstance \Twilio\Rest\Studio\V2\Flow\Execution\ExecutionContextInstance + */ + public function buildInstance(array $payload): ExecutionContextInstance + { + return new ExecutionContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php new file mode 100755 index 0000000..5382866 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextContext.php @@ -0,0 +1,93 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + 'stepSid' => + $stepSid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps/' . \rawurlencode($stepSid) + .'/Context'; + } + + /** + * Fetch the ExecutionStepContextInstance + * + * @return ExecutionStepContextInstance Fetched ExecutionStepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepContextInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionStepContextInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionStepContextContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php new file mode 100755 index 0000000..f7d3e38 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'context' => Values::array_get($payload, 'context'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'stepSid' => Values::array_get($payload, 'step_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, 'stepSid' => $stepSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionStepContextContext Context for this ExecutionStepContextInstance + */ + protected function proxy(): ExecutionStepContextContext + { + if (!$this->context) { + $this->context = new ExecutionStepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionStepContextInstance + * + * @return ExecutionStepContextInstance Fetched ExecutionStepContextInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepContextInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionStepContextInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextList.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextList.php new file mode 100755 index 0000000..1d2686d --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextList.php @@ -0,0 +1,79 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + 'stepSid' => + $stepSid, + + ]; + } + + /** + * Constructs a ExecutionStepContextContext + */ + public function getContext( + + ): ExecutionStepContextContext + { + return new ExecutionStepContextContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['stepSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionStepContextList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php new file mode 100755 index 0000000..97d4c4f --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStep/ExecutionStepContextPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionStepContextInstance \Twilio\Rest\Studio\V2\Flow\Execution\ExecutionStep\ExecutionStepContextInstance + */ + public function buildInstance(array $payload): ExecutionStepContextInstance + { + return new ExecutionStepContextInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid'], $this->solution['stepSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionStepContextPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepContext.php new file mode 100755 index 0000000..6787aa1 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepContext.php @@ -0,0 +1,153 @@ +solution = [ + 'flowSid' => + $flowSid, + 'executionSid' => + $executionSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ExecutionStepInstance + * + * @return ExecutionStepInstance Fetched ExecutionStepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionStepInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the stepContext + */ + protected function getStepContext(): ExecutionStepContextList + { + if (!$this->_stepContext) { + $this->_stepContext = new ExecutionStepContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + return $this->_stepContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionStepContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepInstance.php new file mode 100755 index 0000000..fab3406 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepInstance.php @@ -0,0 +1,153 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'executionSid' => Values::array_get($payload, 'execution_sid'), + 'name' => Values::array_get($payload, 'name'), + 'context' => Values::array_get($payload, 'context'), + 'transitionedFrom' => Values::array_get($payload, 'transitioned_from'), + 'transitionedTo' => Values::array_get($payload, 'transitioned_to'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'executionSid' => $executionSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionStepContext Context for this ExecutionStepInstance + */ + protected function proxy(): ExecutionStepContext + { + if (!$this->context) { + $this->context = new ExecutionStepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ExecutionStepInstance + * + * @return ExecutionStepInstance Fetched ExecutionStepInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionStepInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the stepContext + */ + protected function getStepContext(): ExecutionStepContextList + { + return $this->proxy()->stepContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionStepInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepList.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepList.php new file mode 100755 index 0000000..f2d7d61 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepList.php @@ -0,0 +1,175 @@ +solution = [ + 'flowSid' => + $flowSid, + + 'executionSid' => + $executionSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($executionSid) + .'/Steps'; + } + + /** + * Reads ExecutionStepInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ExecutionStepInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ExecutionStepInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ExecutionStepInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ExecutionStepPage Page of ExecutionStepInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ExecutionStepPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ExecutionStepPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ExecutionStepInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ExecutionStepPage Page of ExecutionStepInstance + */ + public function getPage(string $targetUrl): ExecutionStepPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ExecutionStepPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ExecutionStepContext + * + * @param string $sid The SID of the ExecutionStep resource to fetch. + */ + public function getContext( + string $sid + + ): ExecutionStepContext + { + return new ExecutionStepContext( + $this->version, + $this->solution['flowSid'], + $this->solution['executionSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionStepList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepPage.php new file mode 100755 index 0000000..c667097 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/Execution/ExecutionStepPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionStepInstance \Twilio\Rest\Studio\V2\Flow\Execution\ExecutionStepInstance + */ + public function buildInstance(array $payload): ExecutionStepInstance + { + return new ExecutionStepInstance($this->version, $payload, $this->solution['flowSid'], $this->solution['executionSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionStepPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionContext.php new file mode 100755 index 0000000..b1e1559 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionContext.php @@ -0,0 +1,206 @@ +solution = [ + 'flowSid' => + $flowSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ExecutionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ExecutionInstance + * + * @return ExecutionInstance Fetched ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ExecutionInstance + * + * @param string $status + * @return ExecutionInstance Updated ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): ExecutionInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the steps + */ + protected function getSteps(): ExecutionStepList + { + if (!$this->_steps) { + $this->_steps = new ExecutionStepList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_steps; + } + + /** + * Access the executionContext + */ + protected function getExecutionContext(): ExecutionContextList + { + if (!$this->_executionContext) { + $this->_executionContext = new ExecutionContextList( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->_executionContext; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionInstance.php new file mode 100755 index 0000000..ce6a7c7 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionInstance.php @@ -0,0 +1,182 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'flowSid' => Values::array_get($payload, 'flow_sid'), + 'contactChannelAddress' => Values::array_get($payload, 'contact_channel_address'), + 'context' => Values::array_get($payload, 'context'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['flowSid' => $flowSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ExecutionContext Context for this ExecutionInstance + */ + protected function proxy(): ExecutionContext + { + if (!$this->context) { + $this->context = new ExecutionContext( + $this->version, + $this->solution['flowSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ExecutionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ExecutionInstance + * + * @return ExecutionInstance Fetched ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ExecutionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ExecutionInstance + * + * @param string $status + * @return ExecutionInstance Updated ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): ExecutionInstance + { + + return $this->proxy()->update($status); + } + + /** + * Access the steps + */ + protected function getSteps(): ExecutionStepList + { + return $this->proxy()->steps; + } + + /** + * Access the executionContext + */ + protected function getExecutionContext(): ExecutionContextList + { + return $this->proxy()->executionContext; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.ExecutionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionList.php b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionList.php new file mode 100755 index 0000000..74b8e07 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionList.php @@ -0,0 +1,212 @@ +solution = [ + 'flowSid' => + $flowSid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($flowSid) + .'/Executions'; + } + + /** + * Create the ExecutionInstance + * + * @param string $to The Contact phone number to start a Studio Flow Execution, available as variable `{{contact.channel.address}}`. + * @param string $from The Twilio phone number to send messages or initiate calls from during the Flow's Execution. Available as variable `{{flow.channel.address}}`. For SMS, this can also be a Messaging Service SID. + * @param array|Options $options Optional Arguments + * @return ExecutionInstance Created ExecutionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, string $from, array $options = []): ExecutionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'From' => + $from, + 'Parameters' => + Serialize::jsonObject($options['parameters']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ExecutionInstance( + $this->version, + $payload, + $this->solution['flowSid'] + ); + } + + + /** + * Reads ExecutionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ExecutionInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ExecutionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ExecutionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ExecutionPage Page of ExecutionInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ExecutionPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreatedFrom' => + Serialize::iso8601DateTime($options['dateCreatedFrom']), + 'DateCreatedTo' => + Serialize::iso8601DateTime($options['dateCreatedTo']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ExecutionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ExecutionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ExecutionPage Page of ExecutionInstance + */ + public function getPage(string $targetUrl): ExecutionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ExecutionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ExecutionContext + * + * @param string $sid The SID of the Execution resource to delete. + */ + public function getContext( + string $sid + + ): ExecutionContext + { + return new ExecutionContext( + $this->version, + $this->solution['flowSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionOptions.php b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionOptions.php new file mode 100755 index 0000000..d07a5d3 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionOptions.php @@ -0,0 +1,152 @@ +options['parameters'] = $parameters; + } + + /** + * JSON data that will be added to the Flow's context and that can be accessed as variables inside your Flow. For example, if you pass in `Parameters={\\\"name\\\":\\\"Zeke\\\"}`, a widget in your Flow can reference the variable `{{flow.data.name}}`, which returns \\\"Zeke\\\". Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode the JSON string. + * + * @param array $parameters JSON data that will be added to the Flow's context and that can be accessed as variables inside your Flow. For example, if you pass in `Parameters={\\\"name\\\":\\\"Zeke\\\"}`, a widget in your Flow can reference the variable `{{flow.data.name}}`, which returns \\\"Zeke\\\". Note: the JSON value must explicitly be passed as a string, not as a hash object. Depending on your particular HTTP library, you may need to add quotes or URL encode the JSON string. + * @return $this Fluent Builder + */ + public function setParameters(array $parameters): self + { + $this->options['parameters'] = $parameters; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V2.CreateExecutionOptions ' . $options . ']'; + } +} + + + +class ReadExecutionOptions extends Options + { + /** + * @param \DateTime $dateCreatedFrom Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @param \DateTime $dateCreatedTo Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + */ + public function __construct( + + \DateTime $dateCreatedFrom = null, + \DateTime $dateCreatedTo = null + + ) { + $this->options['dateCreatedFrom'] = $dateCreatedFrom; + $this->options['dateCreatedTo'] = $dateCreatedTo; + } + + /** + * Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * + * @param \DateTime $dateCreatedFrom Only show Execution resources starting on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @return $this Fluent Builder + */ + public function setDateCreatedFrom(\DateTime $dateCreatedFrom): self + { + $this->options['dateCreatedFrom'] = $dateCreatedFrom; + return $this; + } + + /** + * Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * + * @param \DateTime $dateCreatedTo Only show Execution resources starting before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time, given as `YYYY-MM-DDThh:mm:ss-hh:mm`. + * @return $this Fluent Builder + */ + public function setDateCreatedTo(\DateTime $dateCreatedTo): self + { + $this->options['dateCreatedTo'] = $dateCreatedTo; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V2.ReadExecutionOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionPage.php new file mode 100755 index 0000000..1429493 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/ExecutionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ExecutionInstance \Twilio\Rest\Studio\V2\Flow\ExecutionInstance + */ + public function buildInstance(array $payload): ExecutionInstance + { + return new ExecutionInstance($this->version, $payload, $this->solution['flowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.ExecutionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionContext.php new file mode 100755 index 0000000..4b8669b --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionContext.php @@ -0,0 +1,87 @@ +solution = [ + 'sid' => + $sid, + 'revision' => + $revision, + ]; + + $this->uri = '/Flows/' . \rawurlencode($sid) + .'/Revisions/' . \rawurlencode($revision) + .''; + } + + /** + * Fetch the FlowRevisionInstance + * + * @return FlowRevisionInstance Fetched FlowRevisionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowRevisionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FlowRevisionInstance( + $this->version, + $payload, + $this->solution['sid'], + $this->solution['revision'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowRevisionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionInstance.php new file mode 100755 index 0000000..81221df --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'definition' => Values::array_get($payload, 'definition'), + 'status' => Values::array_get($payload, 'status'), + 'revision' => Values::array_get($payload, 'revision'), + 'commitMessage' => Values::array_get($payload, 'commit_message'), + 'valid' => Values::array_get($payload, 'valid'), + 'errors' => Values::array_get($payload, 'errors'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid, 'revision' => $revision ?: $this->properties['revision'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FlowRevisionContext Context for this FlowRevisionInstance + */ + protected function proxy(): FlowRevisionContext + { + if (!$this->context) { + $this->context = new FlowRevisionContext( + $this->version, + $this->solution['sid'], + $this->solution['revision'] + ); + } + + return $this->context; + } + + /** + * Fetch the FlowRevisionInstance + * + * @return FlowRevisionInstance Fetched FlowRevisionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowRevisionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowRevisionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionList.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionList.php new file mode 100755 index 0000000..f721d0f --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionList.php @@ -0,0 +1,168 @@ +solution = [ + 'sid' => + $sid, + + ]; + + $this->uri = '/Flows/' . \rawurlencode($sid) + .'/Revisions'; + } + + /** + * Reads FlowRevisionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FlowRevisionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FlowRevisionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FlowRevisionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FlowRevisionPage Page of FlowRevisionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FlowRevisionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FlowRevisionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FlowRevisionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FlowRevisionPage Page of FlowRevisionInstance + */ + public function getPage(string $targetUrl): FlowRevisionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FlowRevisionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FlowRevisionContext + * + * @param string $revision Specific Revision number or can be `LatestPublished` and `LatestRevision`. + */ + public function getContext( + string $revision + + ): FlowRevisionContext + { + return new FlowRevisionContext( + $this->version, + $this->solution['sid'], + $revision + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowRevisionList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionPage.php new file mode 100755 index 0000000..7379825 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowRevisionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlowRevisionInstance \Twilio\Rest\Studio\V2\Flow\FlowRevisionInstance + */ + public function buildInstance(array $payload): FlowRevisionInstance + { + return new FlowRevisionInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowRevisionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserContext.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserContext.php new file mode 100755 index 0000000..8be3584 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserContext.php @@ -0,0 +1,108 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($sid) + .'/TestUsers'; + } + + /** + * Fetch the FlowTestUserInstance + * + * @return FlowTestUserInstance Fetched FlowTestUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowTestUserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FlowTestUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the FlowTestUserInstance + * + * @param string[] $testUsers List of test user identities that can test draft versions of the flow. + * @return FlowTestUserInstance Updated FlowTestUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $testUsers): FlowTestUserInstance + { + + $data = Values::of([ + 'TestUsers' => + Serialize::map($testUsers,function ($e) { return $e; }), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FlowTestUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowTestUserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserInstance.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserInstance.php new file mode 100755 index 0000000..f48e9cc --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserInstance.php @@ -0,0 +1,132 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'testUsers' => Values::array_get($payload, 'test_users'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FlowTestUserContext Context for this FlowTestUserInstance + */ + protected function proxy(): FlowTestUserContext + { + if (!$this->context) { + $this->context = new FlowTestUserContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the FlowTestUserInstance + * + * @return FlowTestUserInstance Fetched FlowTestUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowTestUserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FlowTestUserInstance + * + * @param string[] $testUsers List of test user identities that can test draft versions of the flow. + * @return FlowTestUserInstance Updated FlowTestUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $testUsers): FlowTestUserInstance + { + + return $this->proxy()->update($testUsers); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowTestUserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserList.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserList.php new file mode 100755 index 0000000..8be85b3 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserList.php @@ -0,0 +1,67 @@ +solution = [ + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a FlowTestUserContext + */ + public function getContext( + + ): FlowTestUserContext + { + return new FlowTestUserContext( + $this->version, + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowTestUserList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserPage.php b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserPage.php new file mode 100755 index 0000000..c505364 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/Flow/FlowTestUserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlowTestUserInstance \Twilio\Rest\Studio\V2\Flow\FlowTestUserInstance + */ + public function buildInstance(array $payload): FlowTestUserInstance + { + return new FlowTestUserInstance($this->version, $payload, $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowTestUserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/FlowContext.php b/app/api/Twilio/Rest/Studio/V2/FlowContext.php new file mode 100755 index 0000000..1a145f1 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowContext.php @@ -0,0 +1,227 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Flows/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FlowInstance + * + * @return FlowInstance Fetched FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FlowInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the FlowInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return FlowInstance Updated FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): FlowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $status, + 'FriendlyName' => + $options['friendlyName'], + 'Definition' => + Serialize::jsonObject($options['definition']), + 'CommitMessage' => + $options['commitMessage'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FlowInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the executions + */ + protected function getExecutions(): ExecutionList + { + if (!$this->_executions) { + $this->_executions = new ExecutionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_executions; + } + + /** + * Access the revisions + */ + protected function getRevisions(): FlowRevisionList + { + if (!$this->_revisions) { + $this->_revisions = new FlowRevisionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_revisions; + } + + /** + * Access the testUsers + */ + protected function getTestUsers(): FlowTestUserList + { + if (!$this->_testUsers) { + $this->_testUsers = new FlowTestUserList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_testUsers; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/FlowInstance.php b/app/api/Twilio/Rest/Studio/V2/FlowInstance.php new file mode 100755 index 0000000..96443b6 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowInstance.php @@ -0,0 +1,202 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'definition' => Values::array_get($payload, 'definition'), + 'status' => Values::array_get($payload, 'status'), + 'revision' => Values::array_get($payload, 'revision'), + 'commitMessage' => Values::array_get($payload, 'commit_message'), + 'valid' => Values::array_get($payload, 'valid'), + 'errors' => Values::array_get($payload, 'errors'), + 'warnings' => Values::array_get($payload, 'warnings'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FlowContext Context for this FlowInstance + */ + protected function proxy(): FlowContext + { + if (!$this->context) { + $this->context = new FlowContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FlowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FlowInstance + * + * @return FlowInstance Fetched FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FlowInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FlowInstance + * + * @param string $status + * @param array|Options $options Optional Arguments + * @return FlowInstance Updated FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status, array $options = []): FlowInstance + { + + return $this->proxy()->update($status, $options); + } + + /** + * Access the executions + */ + protected function getExecutions(): ExecutionList + { + return $this->proxy()->executions; + } + + /** + * Access the revisions + */ + protected function getRevisions(): FlowRevisionList + { + return $this->proxy()->revisions; + } + + /** + * Access the testUsers + */ + protected function getTestUsers(): FlowTestUserList + { + return $this->proxy()->testUsers; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Studio.V2.FlowInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/FlowList.php b/app/api/Twilio/Rest/Studio/V2/FlowList.php new file mode 100755 index 0000000..8385529 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowList.php @@ -0,0 +1,199 @@ +solution = [ + ]; + + $this->uri = '/Flows'; + } + + /** + * Create the FlowInstance + * + * @param string $friendlyName The string that you assigned to describe the Flow. + * @param string $status + * @param array $definition JSON representation of flow definition. + * @param array|Options $options Optional Arguments + * @return FlowInstance Created FlowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $status, array $definition, array $options = []): FlowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Status' => + $status, + 'Definition' => + Serialize::jsonObject($definition), + 'CommitMessage' => + $options['commitMessage'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FlowInstance( + $this->version, + $payload + ); + } + + + /** + * Reads FlowInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FlowInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FlowInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FlowInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FlowPage Page of FlowInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FlowPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FlowPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FlowInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FlowPage Page of FlowInstance + */ + public function getPage(string $targetUrl): FlowPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FlowPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FlowContext + * + * @param string $sid The SID of the Flow resource to delete. + */ + public function getContext( + string $sid + + ): FlowContext + { + return new FlowContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/FlowOptions.php b/app/api/Twilio/Rest/Studio/V2/FlowOptions.php new file mode 100755 index 0000000..c614aa4 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowOptions.php @@ -0,0 +1,170 @@ +options['commitMessage'] = $commitMessage; + } + + /** + * Description of change made in the revision. + * + * @param string $commitMessage Description of change made in the revision. + * @return $this Fluent Builder + */ + public function setCommitMessage(string $commitMessage): self + { + $this->options['commitMessage'] = $commitMessage; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V2.CreateFlowOptions ' . $options . ']'; + } +} + + + + +class UpdateFlowOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the Flow. + * @param array $definition JSON representation of flow definition. + * @param string $commitMessage Description of change made in the revision. + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $definition = Values::ARRAY_NONE, + string $commitMessage = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['definition'] = $definition; + $this->options['commitMessage'] = $commitMessage; + } + + /** + * The string that you assigned to describe the Flow. + * + * @param string $friendlyName The string that you assigned to describe the Flow. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * JSON representation of flow definition. + * + * @param array $definition JSON representation of flow definition. + * @return $this Fluent Builder + */ + public function setDefinition(array $definition): self + { + $this->options['definition'] = $definition; + return $this; + } + + /** + * Description of change made in the revision. + * + * @param string $commitMessage Description of change made in the revision. + * @return $this Fluent Builder + */ + public function setCommitMessage(string $commitMessage): self + { + $this->options['commitMessage'] = $commitMessage; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V2.UpdateFlowOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/FlowPage.php b/app/api/Twilio/Rest/Studio/V2/FlowPage.php new file mode 100755 index 0000000..c450212 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlowInstance \Twilio\Rest\Studio\V2\FlowInstance + */ + public function buildInstance(array $payload): FlowInstance + { + return new FlowInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowPage]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/FlowValidateInstance.php b/app/api/Twilio/Rest/Studio/V2/FlowValidateInstance.php new file mode 100755 index 0000000..59bc7bc --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowValidateInstance.php @@ -0,0 +1,80 @@ +properties = [ + 'valid' => Values::array_get($payload, 'valid'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowValidateInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/FlowValidateList.php b/app/api/Twilio/Rest/Studio/V2/FlowValidateList.php new file mode 100755 index 0000000..89c3bd0 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowValidateList.php @@ -0,0 +1,90 @@ +solution = [ + ]; + + $this->uri = '/Flows/Validate'; + } + + /** + * Update the FlowValidateInstance + * + * @param string $friendlyName The string that you assigned to describe the Flow. + * @param string $status + * @param array $definition JSON representation of flow definition. + * @param array|Options $options Optional Arguments + * @return FlowValidateInstance Updated FlowValidateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName, string $status, array $definition, array $options = []): FlowValidateInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Status' => + $status, + 'Definition' => + Serialize::jsonObject($definition), + 'CommitMessage' => + $options['commitMessage'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FlowValidateInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowValidateList]'; + } +} diff --git a/app/api/Twilio/Rest/Studio/V2/FlowValidateOptions.php b/app/api/Twilio/Rest/Studio/V2/FlowValidateOptions.php new file mode 100755 index 0000000..97468b5 --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowValidateOptions.php @@ -0,0 +1,76 @@ +options['commitMessage'] = $commitMessage; + } + + /** + * Description of change made in the revision. + * + * @param string $commitMessage Description of change made in the revision. + * @return $this Fluent Builder + */ + public function setCommitMessage(string $commitMessage): self + { + $this->options['commitMessage'] = $commitMessage; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Studio.V2.UpdateFlowValidateOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Studio/V2/FlowValidatePage.php b/app/api/Twilio/Rest/Studio/V2/FlowValidatePage.php new file mode 100755 index 0000000..6f22c6a --- /dev/null +++ b/app/api/Twilio/Rest/Studio/V2/FlowValidatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FlowValidateInstance \Twilio\Rest\Studio\V2\FlowValidateInstance + */ + public function buildInstance(array $payload): FlowValidateInstance + { + return new FlowValidateInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Studio.V2.FlowValidatePage]'; + } +} diff --git a/app/api/Twilio/Rest/StudioBase.php b/app/api/Twilio/Rest/StudioBase.php new file mode 100755 index 0000000..2b5da14 --- /dev/null +++ b/app/api/Twilio/Rest/StudioBase.php @@ -0,0 +1,101 @@ +baseUrl = 'https://studio.twilio.com'; + } + + + /** + * @return V1 Version v1 of studio + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * @return V2 Version v2 of studio + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Studio]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim.php b/app/api/Twilio/Rest/Supersim.php new file mode 100755 index 0000000..3b08f48 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim.php @@ -0,0 +1,142 @@ +esimProfiles instead. + */ + protected function getEsimProfiles(): \Twilio\Rest\Supersim\V1\EsimProfileList { + echo "esimProfiles is deprecated. Use v1->esimProfiles instead."; + return $this->v1->esimProfiles; + } + + /** + * @deprecated Use v1->esimProfiles(\$sid) instead. + * @param string $sid The SID of the eSIM Profile resource to fetch + */ + protected function contextEsimProfiles(string $sid): \Twilio\Rest\Supersim\V1\EsimProfileContext { + echo "esimProfiles(\$sid) is deprecated. Use v1->esimProfiles(\$sid) instead."; + return $this->v1->esimProfiles($sid); + } + + /** + * @deprecated Use v1->fleets instead. + */ + protected function getFleets(): \Twilio\Rest\Supersim\V1\FleetList { + echo "fleets is deprecated. Use v1->fleets instead."; + return $this->v1->fleets; + } + + /** + * @deprecated Use v1->fleets(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextFleets(string $sid): \Twilio\Rest\Supersim\V1\FleetContext { + echo "fleets(\$sid) is deprecated. Use v1->fleets(\$sid) instead."; + return $this->v1->fleets($sid); + } + + /** + * @deprecated Use v1->ipCommands instead. + */ + protected function getIpCommands(): \Twilio\Rest\Supersim\V1\IpCommandList { + echo "ipCommands is deprecated. Use v1->ipCommands instead."; + return $this->v1->ipCommands; + } + + /** + * @deprecated Use v1->ipCommands(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextIpCommands(string $sid): \Twilio\Rest\Supersim\V1\IpCommandContext { + echo "ipCommands(\$sid) is deprecated. Use v1->ipCommands(\$sid) instead."; + return $this->v1->ipCommands($sid); + } + + /** + * @deprecated Use v1->networks instead. + */ + protected function getNetworks(): \Twilio\Rest\Supersim\V1\NetworkList { + echo "networks is deprecated. Use v1->networks instead."; + return $this->v1->networks; + } + + /** + * @deprecated Use v1->networks(\$sid) instead. + * @param string $sid The SID of the Network resource to fetch + */ + protected function contextNetworks(string $sid): \Twilio\Rest\Supersim\V1\NetworkContext { + echo "networks(\$sid) is deprecated. Use v1->networks(\$sid) instead."; + return $this->v1->networks($sid); + } + + /** + * @deprecated Use v1->networkAccessProfiles instead. + */ + protected function getNetworkAccessProfiles(): \Twilio\Rest\Supersim\V1\NetworkAccessProfileList { + echo "networkAccessProfiles is deprecated. Use v1->networkAccessProfiles instead."; + return $this->v1->networkAccessProfiles; + } + + /** + * @deprecated Use v1->networkAccessProfiles(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextNetworkAccessProfiles(string $sid): \Twilio\Rest\Supersim\V1\NetworkAccessProfileContext { + echo "networkAccessProfiles(\$sid) is deprecated. Use v1->networkAccessProfiles(\$sid) instead."; + return $this->v1->networkAccessProfiles($sid); + } + + /** + * @deprecated Use v1->settingsUpdates instead. + */ + protected function getSettingsUpdates(): \Twilio\Rest\Supersim\V1\SettingsUpdateList { + echo "settingsUpdates is deprecated. Use v1->settingsUpdates instead."; + return $this->v1->settingsUpdates; + } + + /** + * @deprecated Use v1->sims instead. + */ + protected function getSims(): \Twilio\Rest\Supersim\V1\SimList { + echo "sims is deprecated. Use v1->sims instead."; + return $this->v1->sims; + } + + /** + * @deprecated Use v1->sims(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextSims(string $sid): \Twilio\Rest\Supersim\V1\SimContext { + echo "sims(\$sid) is deprecated. Use v1->sims(\$sid) instead."; + return $this->v1->sims($sid); + } + + /** + * @deprecated Use v1->smsCommands instead. + */ + protected function getSmsCommands(): \Twilio\Rest\Supersim\V1\SmsCommandList { + echo "smsCommands is deprecated. Use v1->smsCommands instead."; + return $this->v1->smsCommands; + } + + /** + * @deprecated Use v1->smsCommands(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextSmsCommands(string $sid): \Twilio\Rest\Supersim\V1\SmsCommandContext { + echo "smsCommands(\$sid) is deprecated. Use v1->smsCommands(\$sid) instead."; + return $this->v1->smsCommands($sid); + } + + /** + * @deprecated Use v1->usageRecords instead. + */ + protected function getUsageRecords(): \Twilio\Rest\Supersim\V1\UsageRecordList { + echo "usageRecords is deprecated. Use v1->usageRecords instead."; + return $this->v1->usageRecords; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Supersim/V1.php b/app/api/Twilio/Rest/Supersim/V1.php new file mode 100755 index 0000000..1d46543 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1.php @@ -0,0 +1,189 @@ +version = 'v1'; + } + + protected function getEsimProfiles(): EsimProfileList + { + if (!$this->_esimProfiles) { + $this->_esimProfiles = new EsimProfileList($this); + } + return $this->_esimProfiles; + } + + protected function getFleets(): FleetList + { + if (!$this->_fleets) { + $this->_fleets = new FleetList($this); + } + return $this->_fleets; + } + + protected function getIpCommands(): IpCommandList + { + if (!$this->_ipCommands) { + $this->_ipCommands = new IpCommandList($this); + } + return $this->_ipCommands; + } + + protected function getNetworks(): NetworkList + { + if (!$this->_networks) { + $this->_networks = new NetworkList($this); + } + return $this->_networks; + } + + protected function getNetworkAccessProfiles(): NetworkAccessProfileList + { + if (!$this->_networkAccessProfiles) { + $this->_networkAccessProfiles = new NetworkAccessProfileList($this); + } + return $this->_networkAccessProfiles; + } + + protected function getSettingsUpdates(): SettingsUpdateList + { + if (!$this->_settingsUpdates) { + $this->_settingsUpdates = new SettingsUpdateList($this); + } + return $this->_settingsUpdates; + } + + protected function getSims(): SimList + { + if (!$this->_sims) { + $this->_sims = new SimList($this); + } + return $this->_sims; + } + + protected function getSmsCommands(): SmsCommandList + { + if (!$this->_smsCommands) { + $this->_smsCommands = new SmsCommandList($this); + } + return $this->_smsCommands; + } + + protected function getUsageRecords(): UsageRecordList + { + if (!$this->_usageRecords) { + $this->_usageRecords = new UsageRecordList($this); + } + return $this->_usageRecords; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/EsimProfileContext.php b/app/api/Twilio/Rest/Supersim/V1/EsimProfileContext.php new file mode 100755 index 0000000..30744de --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/EsimProfileContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/ESimProfiles/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EsimProfileInstance + * + * @return EsimProfileInstance Fetched EsimProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EsimProfileInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EsimProfileInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.EsimProfileContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/EsimProfileInstance.php b/app/api/Twilio/Rest/Supersim/V1/EsimProfileInstance.php new file mode 100755 index 0000000..7b7c12c --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/EsimProfileInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'iccid' => Values::array_get($payload, 'iccid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'status' => Values::array_get($payload, 'status'), + 'eid' => Values::array_get($payload, 'eid'), + 'smdpPlusAddress' => Values::array_get($payload, 'smdp_plus_address'), + 'matchingId' => Values::array_get($payload, 'matching_id'), + 'activationCode' => Values::array_get($payload, 'activation_code'), + 'errorCode' => Values::array_get($payload, 'error_code'), + 'errorMessage' => Values::array_get($payload, 'error_message'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EsimProfileContext Context for this EsimProfileInstance + */ + protected function proxy(): EsimProfileContext + { + if (!$this->context) { + $this->context = new EsimProfileContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EsimProfileInstance + * + * @return EsimProfileInstance Fetched EsimProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EsimProfileInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.EsimProfileInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/EsimProfileList.php b/app/api/Twilio/Rest/Supersim/V1/EsimProfileList.php new file mode 100755 index 0000000..0ef92b4 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/EsimProfileList.php @@ -0,0 +1,206 @@ +solution = [ + ]; + + $this->uri = '/ESimProfiles'; + } + + /** + * Create the EsimProfileInstance + * + * @param array|Options $options Optional Arguments + * @return EsimProfileInstance Created EsimProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): EsimProfileInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackMethod' => + $options['callbackMethod'], + 'GenerateMatchingId' => + Serialize::booleanToString($options['generateMatchingId']), + 'Eid' => + $options['eid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EsimProfileInstance( + $this->version, + $payload + ); + } + + + /** + * Reads EsimProfileInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EsimProfileInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams EsimProfileInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EsimProfileInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EsimProfilePage Page of EsimProfileInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EsimProfilePage + { + $options = new Values($options); + + $params = Values::of([ + 'Eid' => + $options['eid'], + 'SimSid' => + $options['simSid'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EsimProfilePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EsimProfileInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EsimProfilePage Page of EsimProfileInstance + */ + public function getPage(string $targetUrl): EsimProfilePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EsimProfilePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EsimProfileContext + * + * @param string $sid The SID of the eSIM Profile resource to fetch. + */ + public function getContext( + string $sid + + ): EsimProfileContext + { + return new EsimProfileContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.EsimProfileList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/EsimProfileOptions.php b/app/api/Twilio/Rest/Supersim/V1/EsimProfileOptions.php new file mode 100755 index 0000000..585b6f1 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/EsimProfileOptions.php @@ -0,0 +1,220 @@ +options['callbackUrl'] = $callbackUrl; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['generateMatchingId'] = $generateMatchingId; + $this->options['eid'] = $eid; + } + + /** + * The URL we should call using the `callback_method` when the status of the eSIM Profile changes. At this stage of the eSIM Profile pilot, the a request to the URL will only be called when the ESimProfile resource changes from `reserving` to `available`. + * + * @param string $callbackUrl The URL we should call using the `callback_method` when the status of the eSIM Profile changes. At this stage of the eSIM Profile pilot, the a request to the URL will only be called when the ESimProfile resource changes from `reserving` to `available`. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * When set to `true`, a value for `Eid` does not need to be provided. Instead, when the eSIM profile is reserved, a matching ID will be generated and returned via the `matching_id` property. This identifies the specific eSIM profile that can be used by any capable device to claim and download the profile. + * + * @param bool $generateMatchingId When set to `true`, a value for `Eid` does not need to be provided. Instead, when the eSIM profile is reserved, a matching ID will be generated and returned via the `matching_id` property. This identifies the specific eSIM profile that can be used by any capable device to claim and download the profile. + * @return $this Fluent Builder + */ + public function setGenerateMatchingId(bool $generateMatchingId): self + { + $this->options['generateMatchingId'] = $generateMatchingId; + return $this; + } + + /** + * Identifier of the eUICC that will claim the eSIM Profile. + * + * @param string $eid Identifier of the eUICC that will claim the eSIM Profile. + * @return $this Fluent Builder + */ + public function setEid(string $eid): self + { + $this->options['eid'] = $eid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.CreateEsimProfileOptions ' . $options . ']'; + } +} + + +class ReadEsimProfileOptions extends Options + { + /** + * @param string $eid List the eSIM Profiles that have been associated with an EId. + * @param string $simSid Find the eSIM Profile resource related to a [Sim](https://www.twilio.com/docs/wireless/api/sim-resource) resource by providing the SIM SID. Will always return an array with either 1 or 0 records. + * @param string $status List the eSIM Profiles that are in a given status. + */ + public function __construct( + + string $eid = Values::NONE, + string $simSid = Values::NONE, + string $status = Values::NONE + + ) { + $this->options['eid'] = $eid; + $this->options['simSid'] = $simSid; + $this->options['status'] = $status; + } + + /** + * List the eSIM Profiles that have been associated with an EId. + * + * @param string $eid List the eSIM Profiles that have been associated with an EId. + * @return $this Fluent Builder + */ + public function setEid(string $eid): self + { + $this->options['eid'] = $eid; + return $this; + } + + /** + * Find the eSIM Profile resource related to a [Sim](https://www.twilio.com/docs/wireless/api/sim-resource) resource by providing the SIM SID. Will always return an array with either 1 or 0 records. + * + * @param string $simSid Find the eSIM Profile resource related to a [Sim](https://www.twilio.com/docs/wireless/api/sim-resource) resource by providing the SIM SID. Will always return an array with either 1 or 0 records. + * @return $this Fluent Builder + */ + public function setSimSid(string $simSid): self + { + $this->options['simSid'] = $simSid; + return $this; + } + + /** + * List the eSIM Profiles that are in a given status. + * + * @param string $status List the eSIM Profiles that are in a given status. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadEsimProfileOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/EsimProfilePage.php b/app/api/Twilio/Rest/Supersim/V1/EsimProfilePage.php new file mode 100755 index 0000000..033c4d9 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/EsimProfilePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EsimProfileInstance \Twilio\Rest\Supersim\V1\EsimProfileInstance + */ + public function buildInstance(array $payload): EsimProfileInstance + { + return new EsimProfileInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.EsimProfilePage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/FleetContext.php b/app/api/Twilio/Rest/Supersim/V1/FleetContext.php new file mode 100755 index 0000000..cf4d989 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/FleetContext.php @@ -0,0 +1,122 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Fleets/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the FleetInstance + * + * @return FleetInstance Fetched FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FleetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FleetInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the FleetInstance + * + * @param array|Options $options Optional Arguments + * @return FleetInstance Updated FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FleetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'NetworkAccessProfile' => + $options['networkAccessProfile'], + 'IpCommandsUrl' => + $options['ipCommandsUrl'], + 'IpCommandsMethod' => + $options['ipCommandsMethod'], + 'SmsCommandsUrl' => + $options['smsCommandsUrl'], + 'SmsCommandsMethod' => + $options['smsCommandsMethod'], + 'DataLimit' => + $options['dataLimit'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FleetInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.FleetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/FleetInstance.php b/app/api/Twilio/Rest/Supersim/V1/FleetInstance.php new file mode 100755 index 0000000..00b43f6 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/FleetInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'dataEnabled' => Values::array_get($payload, 'data_enabled'), + 'dataLimit' => Values::array_get($payload, 'data_limit'), + 'dataMetering' => Values::array_get($payload, 'data_metering'), + 'smsCommandsEnabled' => Values::array_get($payload, 'sms_commands_enabled'), + 'smsCommandsUrl' => Values::array_get($payload, 'sms_commands_url'), + 'smsCommandsMethod' => Values::array_get($payload, 'sms_commands_method'), + 'networkAccessProfileSid' => Values::array_get($payload, 'network_access_profile_sid'), + 'ipCommandsUrl' => Values::array_get($payload, 'ip_commands_url'), + 'ipCommandsMethod' => Values::array_get($payload, 'ip_commands_method'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FleetContext Context for this FleetInstance + */ + protected function proxy(): FleetContext + { + if (!$this->context) { + $this->context = new FleetContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the FleetInstance + * + * @return FleetInstance Fetched FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FleetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FleetInstance + * + * @param array|Options $options Optional Arguments + * @return FleetInstance Updated FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FleetInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.FleetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/FleetList.php b/app/api/Twilio/Rest/Supersim/V1/FleetList.php new file mode 100755 index 0000000..ebb67d7 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/FleetList.php @@ -0,0 +1,213 @@ +solution = [ + ]; + + $this->uri = '/Fleets'; + } + + /** + * Create the FleetInstance + * + * @param string $networkAccessProfile The SID or unique name of the Network Access Profile that will control which cellular networks the Fleet's SIMs can connect to. + * @param array|Options $options Optional Arguments + * @return FleetInstance Created FleetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $networkAccessProfile, array $options = []): FleetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'NetworkAccessProfile' => + $networkAccessProfile, + 'UniqueName' => + $options['uniqueName'], + 'DataEnabled' => + Serialize::booleanToString($options['dataEnabled']), + 'DataLimit' => + $options['dataLimit'], + 'IpCommandsUrl' => + $options['ipCommandsUrl'], + 'IpCommandsMethod' => + $options['ipCommandsMethod'], + 'SmsCommandsEnabled' => + Serialize::booleanToString($options['smsCommandsEnabled']), + 'SmsCommandsUrl' => + $options['smsCommandsUrl'], + 'SmsCommandsMethod' => + $options['smsCommandsMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new FleetInstance( + $this->version, + $payload + ); + } + + + /** + * Reads FleetInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FleetInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams FleetInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FleetInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FleetPage Page of FleetInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FleetPage + { + $options = new Values($options); + + $params = Values::of([ + 'NetworkAccessProfile' => + $options['networkAccessProfile'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FleetPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FleetInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FleetPage Page of FleetInstance + */ + public function getPage(string $targetUrl): FleetPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FleetPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FleetContext + * + * @param string $sid The SID of the Fleet resource to fetch. + */ + public function getContext( + string $sid + + ): FleetContext + { + return new FleetContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.FleetList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/FleetOptions.php b/app/api/Twilio/Rest/Supersim/V1/FleetOptions.php new file mode 100755 index 0000000..7f9ccf8 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/FleetOptions.php @@ -0,0 +1,416 @@ +options['uniqueName'] = $uniqueName; + $this->options['dataEnabled'] = $dataEnabled; + $this->options['dataLimit'] = $dataLimit; + $this->options['ipCommandsUrl'] = $ipCommandsUrl; + $this->options['ipCommandsMethod'] = $ipCommandsMethod; + $this->options['smsCommandsEnabled'] = $smsCommandsEnabled; + $this->options['smsCommandsUrl'] = $smsCommandsUrl; + $this->options['smsCommandsMethod'] = $smsCommandsMethod; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Defines whether SIMs in the Fleet are capable of using 2G/3G/4G/LTE/CAT-M data connectivity. Defaults to `true`. + * + * @param bool $dataEnabled Defines whether SIMs in the Fleet are capable of using 2G/3G/4G/LTE/CAT-M data connectivity. Defaults to `true`. + * @return $this Fluent Builder + */ + public function setDataEnabled(bool $dataEnabled): self + { + $this->options['dataEnabled'] = $dataEnabled; + return $this; + } + + /** + * The total data usage (download and upload combined) in Megabytes that each Super SIM assigned to the Fleet can consume during a billing period (normally one month). Value must be between 1MB (1) and 2TB (2,000,000). Defaults to 1GB (1,000). + * + * @param int $dataLimit The total data usage (download and upload combined) in Megabytes that each Super SIM assigned to the Fleet can consume during a billing period (normally one month). Value must be between 1MB (1) and 2TB (2,000,000). Defaults to 1GB (1,000). + * @return $this Fluent Builder + */ + public function setDataLimit(int $dataLimit): self + { + $this->options['dataLimit'] = $dataLimit; + return $this; + } + + /** + * The URL that will receive a webhook when a Super SIM in the Fleet is used to send an IP Command from your device to a special IP address. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * + * @param string $ipCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an IP Command from your device to a special IP address. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @return $this Fluent Builder + */ + public function setIpCommandsUrl(string $ipCommandsUrl): self + { + $this->options['ipCommandsUrl'] = $ipCommandsUrl; + return $this; + } + + /** + * A string representing the HTTP method to use when making a request to `ip_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * + * @param string $ipCommandsMethod A string representing the HTTP method to use when making a request to `ip_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @return $this Fluent Builder + */ + public function setIpCommandsMethod(string $ipCommandsMethod): self + { + $this->options['ipCommandsMethod'] = $ipCommandsMethod; + return $this; + } + + /** + * Defines whether SIMs in the Fleet are capable of sending and receiving machine-to-machine SMS via Commands. Defaults to `true`. + * + * @param bool $smsCommandsEnabled Defines whether SIMs in the Fleet are capable of sending and receiving machine-to-machine SMS via Commands. Defaults to `true`. + * @return $this Fluent Builder + */ + public function setSmsCommandsEnabled(bool $smsCommandsEnabled): self + { + $this->options['smsCommandsEnabled'] = $smsCommandsEnabled; + return $this; + } + + /** + * The URL that will receive a webhook when a Super SIM in the Fleet is used to send an SMS from your device to the SMS Commands number. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * + * @param string $smsCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an SMS from your device to the SMS Commands number. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @return $this Fluent Builder + */ + public function setSmsCommandsUrl(string $smsCommandsUrl): self + { + $this->options['smsCommandsUrl'] = $smsCommandsUrl; + return $this; + } + + /** + * A string representing the HTTP method to use when making a request to `sms_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * + * @param string $smsCommandsMethod A string representing the HTTP method to use when making a request to `sms_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsCommandsMethod(string $smsCommandsMethod): self + { + $this->options['smsCommandsMethod'] = $smsCommandsMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.CreateFleetOptions ' . $options . ']'; + } +} + + +class ReadFleetOptions extends Options + { + /** + * @param string $networkAccessProfile The SID or unique name of the Network Access Profile that controls which cellular networks the Fleet's SIMs can connect to. + */ + public function __construct( + + string $networkAccessProfile = Values::NONE + + ) { + $this->options['networkAccessProfile'] = $networkAccessProfile; + } + + /** + * The SID or unique name of the Network Access Profile that controls which cellular networks the Fleet's SIMs can connect to. + * + * @param string $networkAccessProfile The SID or unique name of the Network Access Profile that controls which cellular networks the Fleet's SIMs can connect to. + * @return $this Fluent Builder + */ + public function setNetworkAccessProfile(string $networkAccessProfile): self + { + $this->options['networkAccessProfile'] = $networkAccessProfile; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadFleetOptions ' . $options . ']'; + } +} + +class UpdateFleetOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @param string $networkAccessProfile The SID or unique name of the Network Access Profile that will control which cellular networks the Fleet's SIMs can connect to. + * @param string $ipCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an IP Command from your device to a special IP address. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @param string $ipCommandsMethod A string representing the HTTP method to use when making a request to `ip_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @param string $smsCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an SMS from your device to the SMS Commands number. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @param string $smsCommandsMethod A string representing the HTTP method to use when making a request to `sms_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @param int $dataLimit The total data usage (download and upload combined) in Megabytes that each Super SIM assigned to the Fleet can consume during a billing period (normally one month). Value must be between 1MB (1) and 2TB (2,000,000). Defaults to 1GB (1,000). + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $networkAccessProfile = Values::NONE, + string $ipCommandsUrl = Values::NONE, + string $ipCommandsMethod = Values::NONE, + string $smsCommandsUrl = Values::NONE, + string $smsCommandsMethod = Values::NONE, + int $dataLimit = Values::INT_NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['networkAccessProfile'] = $networkAccessProfile; + $this->options['ipCommandsUrl'] = $ipCommandsUrl; + $this->options['ipCommandsMethod'] = $ipCommandsMethod; + $this->options['smsCommandsUrl'] = $smsCommandsUrl; + $this->options['smsCommandsMethod'] = $smsCommandsMethod; + $this->options['dataLimit'] = $dataLimit; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The SID or unique name of the Network Access Profile that will control which cellular networks the Fleet's SIMs can connect to. + * + * @param string $networkAccessProfile The SID or unique name of the Network Access Profile that will control which cellular networks the Fleet's SIMs can connect to. + * @return $this Fluent Builder + */ + public function setNetworkAccessProfile(string $networkAccessProfile): self + { + $this->options['networkAccessProfile'] = $networkAccessProfile; + return $this; + } + + /** + * The URL that will receive a webhook when a Super SIM in the Fleet is used to send an IP Command from your device to a special IP address. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * + * @param string $ipCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an IP Command from your device to a special IP address. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @return $this Fluent Builder + */ + public function setIpCommandsUrl(string $ipCommandsUrl): self + { + $this->options['ipCommandsUrl'] = $ipCommandsUrl; + return $this; + } + + /** + * A string representing the HTTP method to use when making a request to `ip_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * + * @param string $ipCommandsMethod A string representing the HTTP method to use when making a request to `ip_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @return $this Fluent Builder + */ + public function setIpCommandsMethod(string $ipCommandsMethod): self + { + $this->options['ipCommandsMethod'] = $ipCommandsMethod; + return $this; + } + + /** + * The URL that will receive a webhook when a Super SIM in the Fleet is used to send an SMS from your device to the SMS Commands number. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * + * @param string $smsCommandsUrl The URL that will receive a webhook when a Super SIM in the Fleet is used to send an SMS from your device to the SMS Commands number. Your server should respond with an HTTP status code in the 200 range; any response body will be ignored. + * @return $this Fluent Builder + */ + public function setSmsCommandsUrl(string $smsCommandsUrl): self + { + $this->options['smsCommandsUrl'] = $smsCommandsUrl; + return $this; + } + + /** + * A string representing the HTTP method to use when making a request to `sms_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * + * @param string $smsCommandsMethod A string representing the HTTP method to use when making a request to `sms_commands_url`. Can be one of `POST` or `GET`. Defaults to `POST`. + * @return $this Fluent Builder + */ + public function setSmsCommandsMethod(string $smsCommandsMethod): self + { + $this->options['smsCommandsMethod'] = $smsCommandsMethod; + return $this; + } + + /** + * The total data usage (download and upload combined) in Megabytes that each Super SIM assigned to the Fleet can consume during a billing period (normally one month). Value must be between 1MB (1) and 2TB (2,000,000). Defaults to 1GB (1,000). + * + * @param int $dataLimit The total data usage (download and upload combined) in Megabytes that each Super SIM assigned to the Fleet can consume during a billing period (normally one month). Value must be between 1MB (1) and 2TB (2,000,000). Defaults to 1GB (1,000). + * @return $this Fluent Builder + */ + public function setDataLimit(int $dataLimit): self + { + $this->options['dataLimit'] = $dataLimit; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.UpdateFleetOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/FleetPage.php b/app/api/Twilio/Rest/Supersim/V1/FleetPage.php new file mode 100755 index 0000000..81b77b7 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/FleetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FleetInstance \Twilio\Rest\Supersim\V1\FleetInstance + */ + public function buildInstance(array $payload): FleetInstance + { + return new FleetInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.FleetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/IpCommandContext.php b/app/api/Twilio/Rest/Supersim/V1/IpCommandContext.php new file mode 100755 index 0000000..6a12a35 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/IpCommandContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/IpCommands/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the IpCommandInstance + * + * @return IpCommandInstance Fetched IpCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpCommandInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpCommandInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.IpCommandContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/IpCommandInstance.php b/app/api/Twilio/Rest/Supersim/V1/IpCommandInstance.php new file mode 100755 index 0000000..08d61c0 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/IpCommandInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'simIccid' => Values::array_get($payload, 'sim_iccid'), + 'status' => Values::array_get($payload, 'status'), + 'direction' => Values::array_get($payload, 'direction'), + 'deviceIp' => Values::array_get($payload, 'device_ip'), + 'devicePort' => Values::array_get($payload, 'device_port'), + 'payloadType' => Values::array_get($payload, 'payload_type'), + 'payload' => Values::array_get($payload, 'payload'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpCommandContext Context for this IpCommandInstance + */ + protected function proxy(): IpCommandContext + { + if (!$this->context) { + $this->context = new IpCommandContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the IpCommandInstance + * + * @return IpCommandInstance Fetched IpCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpCommandInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.IpCommandInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/IpCommandList.php b/app/api/Twilio/Rest/Supersim/V1/IpCommandList.php new file mode 100755 index 0000000..c371e75 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/IpCommandList.php @@ -0,0 +1,214 @@ +solution = [ + ]; + + $this->uri = '/IpCommands'; + } + + /** + * Create the IpCommandInstance + * + * @param string $sim The `sid` or `unique_name` of the [Super SIM](https://www.twilio.com/docs/iot/supersim/api/sim-resource) to send the IP Command to. + * @param string $payload The data that will be sent to the device. The payload cannot exceed 1300 bytes. If the PayloadType is set to text, the payload is encoded in UTF-8. If PayloadType is set to binary, the payload is encoded in Base64. + * @param int $devicePort The device port to which the IP Command will be sent. + * @param array|Options $options Optional Arguments + * @return IpCommandInstance Created IpCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $sim, string $payload, int $devicePort, array $options = []): IpCommandInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Sim' => + $sim, + 'Payload' => + $payload, + 'DevicePort' => + $devicePort, + 'PayloadType' => + $options['payloadType'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackMethod' => + $options['callbackMethod'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpCommandInstance( + $this->version, + $payload + ); + } + + + /** + * Reads IpCommandInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpCommandInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams IpCommandInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpCommandInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpCommandPage Page of IpCommandInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpCommandPage + { + $options = new Values($options); + + $params = Values::of([ + 'Sim' => + $options['sim'], + 'SimIccid' => + $options['simIccid'], + 'Status' => + $options['status'], + 'Direction' => + $options['direction'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpCommandPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpCommandInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpCommandPage Page of IpCommandInstance + */ + public function getPage(string $targetUrl): IpCommandPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpCommandPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpCommandContext + * + * @param string $sid The SID of the IP Command resource to fetch. + */ + public function getContext( + string $sid + + ): IpCommandContext + { + return new IpCommandContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.IpCommandList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/IpCommandOptions.php b/app/api/Twilio/Rest/Supersim/V1/IpCommandOptions.php new file mode 100755 index 0000000..900da96 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/IpCommandOptions.php @@ -0,0 +1,218 @@ +options['payloadType'] = $payloadType; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackMethod'] = $callbackMethod; + } + + /** + * @param string $payloadType + * @return $this Fluent Builder + */ + public function setPayloadType(string $payloadType): self + { + $this->options['payloadType'] = $payloadType; + return $this; + } + + /** + * The URL we should call using the `callback_method` after we have sent the IP Command. + * + * @param string $callbackUrl The URL we should call using the `callback_method` after we have sent the IP Command. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be `GET` or `POST`, and the default is `POST`. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be `GET` or `POST`, and the default is `POST`. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.CreateIpCommandOptions ' . $options . ']'; + } +} + + +class ReadIpCommandOptions extends Options + { + /** + * @param string $sim The SID or unique name of the Sim resource that IP Command was sent to or from. + * @param string $simIccid The ICCID of the Sim resource that IP Command was sent to or from. + * @param string $status The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/wireless/api/ipcommand-resource#status-values) for a description of each. + * @param string $direction The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + */ + public function __construct( + + string $sim = Values::NONE, + string $simIccid = Values::NONE, + string $status = Values::NONE, + string $direction = Values::NONE + + ) { + $this->options['sim'] = $sim; + $this->options['simIccid'] = $simIccid; + $this->options['status'] = $status; + $this->options['direction'] = $direction; + } + + /** + * The SID or unique name of the Sim resource that IP Command was sent to or from. + * + * @param string $sim The SID or unique name of the Sim resource that IP Command was sent to or from. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * The ICCID of the Sim resource that IP Command was sent to or from. + * + * @param string $simIccid The ICCID of the Sim resource that IP Command was sent to or from. + * @return $this Fluent Builder + */ + public function setSimIccid(string $simIccid): self + { + $this->options['simIccid'] = $simIccid; + return $this; + } + + /** + * The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/wireless/api/ipcommand-resource#status-values) for a description of each. + * + * @param string $status The status of the IP Command. Can be: `queued`, `sent`, `received` or `failed`. See the [IP Command Status Values](https://www.twilio.com/docs/wireless/api/ipcommand-resource#status-values) for a description of each. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + * + * @param string $direction The direction of the IP Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadIpCommandOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/IpCommandPage.php b/app/api/Twilio/Rest/Supersim/V1/IpCommandPage.php new file mode 100755 index 0000000..79d5b1f --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/IpCommandPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpCommandInstance \Twilio\Rest\Supersim\V1\IpCommandInstance + */ + public function buildInstance(array $payload): IpCommandInstance + { + return new IpCommandInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.IpCommandPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkContext.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkContext.php new file mode 100755 index 0000000..0c69fb6 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkContext.php @@ -0,0 +1,100 @@ +solution = [ + 'networkAccessProfileSid' => + $networkAccessProfileSid, + 'sid' => + $sid, + ]; + + $this->uri = '/NetworkAccessProfiles/' . \rawurlencode($networkAccessProfileSid) + .'/Networks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the NetworkAccessProfileNetworkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the NetworkAccessProfileNetworkInstance + * + * @return NetworkAccessProfileNetworkInstance Fetched NetworkAccessProfileNetworkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkAccessProfileNetworkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NetworkAccessProfileNetworkInstance( + $this->version, + $payload, + $this->solution['networkAccessProfileSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkAccessProfileNetworkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkInstance.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkInstance.php new file mode 100755 index 0000000..d19ca8e --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkInstance.php @@ -0,0 +1,139 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'networkAccessProfileSid' => Values::array_get($payload, 'network_access_profile_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'identifiers' => Values::array_get($payload, 'identifiers'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['networkAccessProfileSid' => $networkAccessProfileSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NetworkAccessProfileNetworkContext Context for this NetworkAccessProfileNetworkInstance + */ + protected function proxy(): NetworkAccessProfileNetworkContext + { + if (!$this->context) { + $this->context = new NetworkAccessProfileNetworkContext( + $this->version, + $this->solution['networkAccessProfileSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the NetworkAccessProfileNetworkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the NetworkAccessProfileNetworkInstance + * + * @return NetworkAccessProfileNetworkInstance Fetched NetworkAccessProfileNetworkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkAccessProfileNetworkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkAccessProfileNetworkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkList.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkList.php new file mode 100755 index 0000000..4ab3d9d --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkList.php @@ -0,0 +1,194 @@ +solution = [ + 'networkAccessProfileSid' => + $networkAccessProfileSid, + + ]; + + $this->uri = '/NetworkAccessProfiles/' . \rawurlencode($networkAccessProfileSid) + .'/Networks'; + } + + /** + * Create the NetworkAccessProfileNetworkInstance + * + * @param string $network The SID of the Network resource to be added to the Network Access Profile resource. + * @return NetworkAccessProfileNetworkInstance Created NetworkAccessProfileNetworkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $network): NetworkAccessProfileNetworkInstance + { + + $data = Values::of([ + 'Network' => + $network, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NetworkAccessProfileNetworkInstance( + $this->version, + $payload, + $this->solution['networkAccessProfileSid'] + ); + } + + + /** + * Reads NetworkAccessProfileNetworkInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NetworkAccessProfileNetworkInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams NetworkAccessProfileNetworkInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NetworkAccessProfileNetworkInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NetworkAccessProfileNetworkPage Page of NetworkAccessProfileNetworkInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NetworkAccessProfileNetworkPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NetworkAccessProfileNetworkPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NetworkAccessProfileNetworkInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NetworkAccessProfileNetworkPage Page of NetworkAccessProfileNetworkInstance + */ + public function getPage(string $targetUrl): NetworkAccessProfileNetworkPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NetworkAccessProfileNetworkPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a NetworkAccessProfileNetworkContext + * + * @param string $sid The SID of the Network resource to be removed from the Network Access Profile resource. + */ + public function getContext( + string $sid + + ): NetworkAccessProfileNetworkContext + { + return new NetworkAccessProfileNetworkContext( + $this->version, + $this->solution['networkAccessProfileSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkAccessProfileNetworkList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkPage.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkPage.php new file mode 100755 index 0000000..1e1e8fd --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfile/NetworkAccessProfileNetworkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NetworkAccessProfileNetworkInstance \Twilio\Rest\Supersim\V1\NetworkAccessProfile\NetworkAccessProfileNetworkInstance + */ + public function buildInstance(array $payload): NetworkAccessProfileNetworkInstance + { + return new NetworkAccessProfileNetworkInstance($this->version, $payload, $this->solution['networkAccessProfileSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkAccessProfileNetworkPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileContext.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileContext.php new file mode 100755 index 0000000..e27298b --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileContext.php @@ -0,0 +1,168 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/NetworkAccessProfiles/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the NetworkAccessProfileInstance + * + * @return NetworkAccessProfileInstance Fetched NetworkAccessProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkAccessProfileInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NetworkAccessProfileInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the NetworkAccessProfileInstance + * + * @param array|Options $options Optional Arguments + * @return NetworkAccessProfileInstance Updated NetworkAccessProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): NetworkAccessProfileInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new NetworkAccessProfileInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the networks + */ + protected function getNetworks(): NetworkAccessProfileNetworkList + { + if (!$this->_networks) { + $this->_networks = new NetworkAccessProfileNetworkList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_networks; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkAccessProfileContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileInstance.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileInstance.php new file mode 100755 index 0000000..e94a7cf --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileInstance.php @@ -0,0 +1,153 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NetworkAccessProfileContext Context for this NetworkAccessProfileInstance + */ + protected function proxy(): NetworkAccessProfileContext + { + if (!$this->context) { + $this->context = new NetworkAccessProfileContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the NetworkAccessProfileInstance + * + * @return NetworkAccessProfileInstance Fetched NetworkAccessProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkAccessProfileInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the NetworkAccessProfileInstance + * + * @param array|Options $options Optional Arguments + * @return NetworkAccessProfileInstance Updated NetworkAccessProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): NetworkAccessProfileInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the networks + */ + protected function getNetworks(): NetworkAccessProfileNetworkList + { + return $this->proxy()->networks; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkAccessProfileInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileList.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileList.php new file mode 100755 index 0000000..daf1ead --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileList.php @@ -0,0 +1,192 @@ +solution = [ + ]; + + $this->uri = '/NetworkAccessProfiles'; + } + + /** + * Create the NetworkAccessProfileInstance + * + * @param array|Options $options Optional Arguments + * @return NetworkAccessProfileInstance Created NetworkAccessProfileInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): NetworkAccessProfileInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Networks' => + Serialize::map($options['networks'], function ($e) { return $e; }), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NetworkAccessProfileInstance( + $this->version, + $payload + ); + } + + + /** + * Reads NetworkAccessProfileInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NetworkAccessProfileInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams NetworkAccessProfileInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NetworkAccessProfileInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NetworkAccessProfilePage Page of NetworkAccessProfileInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NetworkAccessProfilePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NetworkAccessProfilePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NetworkAccessProfileInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NetworkAccessProfilePage Page of NetworkAccessProfileInstance + */ + public function getPage(string $targetUrl): NetworkAccessProfilePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NetworkAccessProfilePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a NetworkAccessProfileContext + * + * @param string $sid The SID of the Network Access Profile resource to fetch. + */ + public function getContext( + string $sid + + ): NetworkAccessProfileContext + { + return new NetworkAccessProfileContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkAccessProfileList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileOptions.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileOptions.php new file mode 100755 index 0000000..ff73c3c --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfileOptions.php @@ -0,0 +1,150 @@ +options['uniqueName'] = $uniqueName; + $this->options['networks'] = $networks; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * List of Network SIDs that this Network Access Profile will allow connections to. + * + * @param string[] $networks List of Network SIDs that this Network Access Profile will allow connections to. + * @return $this Fluent Builder + */ + public function setNetworks(array $networks): self + { + $this->options['networks'] = $networks; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.CreateNetworkAccessProfileOptions ' . $options . ']'; + } +} + + + +class UpdateNetworkAccessProfileOptions extends Options + { + /** + * @param string $uniqueName The new unique name of the Network Access Profile. + */ + public function __construct( + + string $uniqueName = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + } + + /** + * The new unique name of the Network Access Profile. + * + * @param string $uniqueName The new unique name of the Network Access Profile. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.UpdateNetworkAccessProfileOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfilePage.php b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfilePage.php new file mode 100755 index 0000000..11358a9 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkAccessProfilePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NetworkAccessProfileInstance \Twilio\Rest\Supersim\V1\NetworkAccessProfileInstance + */ + public function buildInstance(array $payload): NetworkAccessProfileInstance + { + return new NetworkAccessProfileInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkAccessProfilePage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkContext.php b/app/api/Twilio/Rest/Supersim/V1/NetworkContext.php new file mode 100755 index 0000000..1632421 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Networks/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the NetworkInstance + * + * @return NetworkInstance Fetched NetworkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new NetworkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkInstance.php b/app/api/Twilio/Rest/Supersim/V1/NetworkInstance.php new file mode 100755 index 0000000..874c2bd --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'url' => Values::array_get($payload, 'url'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'identifiers' => Values::array_get($payload, 'identifiers'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return NetworkContext Context for this NetworkInstance + */ + protected function proxy(): NetworkContext + { + if (!$this->context) { + $this->context = new NetworkContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the NetworkInstance + * + * @return NetworkInstance Fetched NetworkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): NetworkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.NetworkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkList.php b/app/api/Twilio/Rest/Supersim/V1/NetworkList.php new file mode 100755 index 0000000..bc1674f --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkList.php @@ -0,0 +1,172 @@ +solution = [ + ]; + + $this->uri = '/Networks'; + } + + /** + * Reads NetworkInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return NetworkInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams NetworkInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of NetworkInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return NetworkPage Page of NetworkInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): NetworkPage + { + $options = new Values($options); + + $params = Values::of([ + 'IsoCountry' => + $options['isoCountry'], + 'Mcc' => + $options['mcc'], + 'Mnc' => + $options['mnc'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new NetworkPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of NetworkInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return NetworkPage Page of NetworkInstance + */ + public function getPage(string $targetUrl): NetworkPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new NetworkPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a NetworkContext + * + * @param string $sid The SID of the Network resource to fetch. + */ + public function getContext( + string $sid + + ): NetworkContext + { + return new NetworkContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkOptions.php b/app/api/Twilio/Rest/Supersim/V1/NetworkOptions.php new file mode 100755 index 0000000..d6d6b07 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkOptions.php @@ -0,0 +1,114 @@ +options['isoCountry'] = $isoCountry; + $this->options['mcc'] = $mcc; + $this->options['mnc'] = $mnc; + } + + /** + * The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Network resources to read. + * + * @param string $isoCountry The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the Network resources to read. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * The 'mobile country code' of a country. Network resources with this `mcc` in their `identifiers` will be read. + * + * @param string $mcc The 'mobile country code' of a country. Network resources with this `mcc` in their `identifiers` will be read. + * @return $this Fluent Builder + */ + public function setMcc(string $mcc): self + { + $this->options['mcc'] = $mcc; + return $this; + } + + /** + * The 'mobile network code' of a mobile operator network. Network resources with this `mnc` in their `identifiers` will be read. + * + * @param string $mnc The 'mobile network code' of a mobile operator network. Network resources with this `mnc` in their `identifiers` will be read. + * @return $this Fluent Builder + */ + public function setMnc(string $mnc): self + { + $this->options['mnc'] = $mnc; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadNetworkOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/NetworkPage.php b/app/api/Twilio/Rest/Supersim/V1/NetworkPage.php new file mode 100755 index 0000000..31ab76f --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/NetworkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NetworkInstance \Twilio\Rest\Supersim\V1\NetworkInstance + */ + public function buildInstance(array $payload): NetworkInstance + { + return new NetworkInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.NetworkPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateInstance.php b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateInstance.php new file mode 100755 index 0000000..b36ce32 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateInstance.php @@ -0,0 +1,95 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'iccid' => Values::array_get($payload, 'iccid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'status' => Values::array_get($payload, 'status'), + 'packages' => Values::array_get($payload, 'packages'), + 'dateCompleted' => Deserialize::dateTime(Values::array_get($payload, 'date_completed')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SettingsUpdateInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateList.php b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateList.php new file mode 100755 index 0000000..754e841 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateList.php @@ -0,0 +1,154 @@ +solution = [ + ]; + + $this->uri = '/SettingsUpdates'; + } + + /** + * Reads SettingsUpdateInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SettingsUpdateInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SettingsUpdateInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SettingsUpdateInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SettingsUpdatePage Page of SettingsUpdateInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SettingsUpdatePage + { + $options = new Values($options); + + $params = Values::of([ + 'Sim' => + $options['sim'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SettingsUpdatePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SettingsUpdateInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SettingsUpdatePage Page of SettingsUpdateInstance + */ + public function getPage(string $targetUrl): SettingsUpdatePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SettingsUpdatePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SettingsUpdateList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateOptions.php b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateOptions.php new file mode 100755 index 0000000..facde9f --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdateOptions.php @@ -0,0 +1,94 @@ +options['sim'] = $sim; + $this->options['status'] = $status; + } + + /** + * Filter the Settings Updates by a Super SIM's SID or UniqueName. + * + * @param string $sim Filter the Settings Updates by a Super SIM's SID or UniqueName. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * Filter the Settings Updates by status. Can be `scheduled`, `in-progress`, `successful`, or `failed`. + * + * @param string $status Filter the Settings Updates by status. Can be `scheduled`, `in-progress`, `successful`, or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadSettingsUpdateOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SettingsUpdatePage.php b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdatePage.php new file mode 100755 index 0000000..ba870e6 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SettingsUpdatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SettingsUpdateInstance \Twilio\Rest\Supersim\V1\SettingsUpdateInstance + */ + public function buildInstance(array $payload): SettingsUpdateInstance + { + return new SettingsUpdateInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SettingsUpdatePage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodInstance.php b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodInstance.php new file mode 100755 index 0000000..a0acb1d --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodInstance.php @@ -0,0 +1,96 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'periodType' => Values::array_get($payload, 'period_type'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['simSid' => $simSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.BillingPeriodInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodList.php b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodList.php new file mode 100755 index 0000000..b010f86 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodList.php @@ -0,0 +1,151 @@ +solution = [ + 'simSid' => + $simSid, + + ]; + + $this->uri = '/Sims/' . \rawurlencode($simSid) + .'/BillingPeriods'; + } + + /** + * Reads BillingPeriodInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BillingPeriodInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams BillingPeriodInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BillingPeriodInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BillingPeriodPage Page of BillingPeriodInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BillingPeriodPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BillingPeriodPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BillingPeriodInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BillingPeriodPage Page of BillingPeriodInstance + */ + public function getPage(string $targetUrl): BillingPeriodPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BillingPeriodPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.BillingPeriodList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodPage.php b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodPage.php new file mode 100755 index 0000000..556604d --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/BillingPeriodPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BillingPeriodInstance \Twilio\Rest\Supersim\V1\Sim\BillingPeriodInstance + */ + public function buildInstance(array $payload): BillingPeriodInstance + { + return new BillingPeriodInstance($this->version, $payload, $this->solution['simSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.BillingPeriodPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressInstance.php b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressInstance.php new file mode 100755 index 0000000..ffc8f91 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressInstance.php @@ -0,0 +1,83 @@ +properties = [ + 'ipAddress' => Values::array_get($payload, 'ip_address'), + 'ipAddressVersion' => Values::array_get($payload, 'ip_address_version'), + ]; + + $this->solution = ['simSid' => $simSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SimIpAddressInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressList.php b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressList.php new file mode 100755 index 0000000..6020815 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressList.php @@ -0,0 +1,151 @@ +solution = [ + 'simSid' => + $simSid, + + ]; + + $this->uri = '/Sims/' . \rawurlencode($simSid) + .'/IpAddresses'; + } + + /** + * Reads SimIpAddressInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SimIpAddressInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SimIpAddressInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SimIpAddressInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SimIpAddressPage Page of SimIpAddressInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SimIpAddressPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SimIpAddressPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SimIpAddressInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SimIpAddressPage Page of SimIpAddressInstance + */ + public function getPage(string $targetUrl): SimIpAddressPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SimIpAddressPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SimIpAddressList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressPage.php b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressPage.php new file mode 100755 index 0000000..9a48651 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/Sim/SimIpAddressPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SimIpAddressInstance \Twilio\Rest\Supersim\V1\Sim\SimIpAddressInstance + */ + public function buildInstance(array $payload): SimIpAddressInstance + { + return new SimIpAddressInstance($this->version, $payload, $this->solution['simSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SimIpAddressPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SimContext.php b/app/api/Twilio/Rest/Supersim/V1/SimContext.php new file mode 100755 index 0000000..c6d3741 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SimContext.php @@ -0,0 +1,195 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Sims/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Status' => + $options['status'], + 'Fleet' => + $options['fleet'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CallbackMethod' => + $options['callbackMethod'], + 'AccountSid' => + $options['accountSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the billingPeriods + */ + protected function getBillingPeriods(): BillingPeriodList + { + if (!$this->_billingPeriods) { + $this->_billingPeriods = new BillingPeriodList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_billingPeriods; + } + + /** + * Access the simIpAddresses + */ + protected function getSimIpAddresses(): SimIpAddressList + { + if (!$this->_simIpAddresses) { + $this->_simIpAddresses = new SimIpAddressList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_simIpAddresses; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.SimContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SimInstance.php b/app/api/Twilio/Rest/Supersim/V1/SimInstance.php new file mode 100755 index 0000000..0c83afd --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SimInstance.php @@ -0,0 +1,169 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'iccid' => Values::array_get($payload, 'iccid'), + 'status' => Values::array_get($payload, 'status'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SimContext Context for this SimInstance + */ + protected function proxy(): SimContext + { + if (!$this->context) { + $this->context = new SimContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the billingPeriods + */ + protected function getBillingPeriods(): BillingPeriodList + { + return $this->proxy()->billingPeriods; + } + + /** + * Access the simIpAddresses + */ + protected function getSimIpAddresses(): SimIpAddressList + { + return $this->proxy()->simIpAddresses; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.SimInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SimList.php b/app/api/Twilio/Rest/Supersim/V1/SimList.php new file mode 100755 index 0000000..150114a --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SimList.php @@ -0,0 +1,200 @@ +solution = [ + ]; + + $this->uri = '/Sims'; + } + + /** + * Create the SimInstance + * + * @param string $iccid The [ICCID](https://en.wikipedia.org/wiki/Subscriber_identity_module#ICCID) of the Super SIM to be added to your Account. + * @param string $registrationCode The 10-digit code required to claim the Super SIM for your Account. + * @return SimInstance Created SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $iccid, string $registrationCode): SimInstance + { + + $data = Values::of([ + 'Iccid' => + $iccid, + 'RegistrationCode' => + $registrationCode, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SimInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SimInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SimInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SimInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SimInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SimPage Page of SimInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SimPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'Fleet' => + $options['fleet'], + 'Iccid' => + $options['iccid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SimPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SimInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SimPage Page of SimInstance + */ + public function getPage(string $targetUrl): SimPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SimPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SimContext + * + * @param string $sid The SID of the Sim resource to fetch. + */ + public function getContext( + string $sid + + ): SimContext + { + return new SimContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SimList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SimOptions.php b/app/api/Twilio/Rest/Supersim/V1/SimOptions.php new file mode 100755 index 0000000..feb14a9 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SimOptions.php @@ -0,0 +1,256 @@ +options['status'] = $status; + $this->options['fleet'] = $fleet; + $this->options['iccid'] = $iccid; + } + + /** + * The status of the Sim resources to read. Can be `new`, `ready`, `active`, `inactive`, or `scheduled`. + * + * @param string $status The status of the Sim resources to read. Can be `new`, `ready`, `active`, `inactive`, or `scheduled`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The SID or unique name of the Fleet to which a list of Sims are assigned. + * + * @param string $fleet The SID or unique name of the Fleet to which a list of Sims are assigned. + * @return $this Fluent Builder + */ + public function setFleet(string $fleet): self + { + $this->options['fleet'] = $fleet; + return $this; + } + + /** + * The [ICCID](https://en.wikipedia.org/wiki/Subscriber_identity_module#ICCID) associated with a Super SIM to filter the list by. Passing this parameter will always return a list containing zero or one SIMs. + * + * @param string $iccid The [ICCID](https://en.wikipedia.org/wiki/Subscriber_identity_module#ICCID) associated with a Super SIM to filter the list by. Passing this parameter will always return a list containing zero or one SIMs. + * @return $this Fluent Builder + */ + public function setIccid(string $iccid): self + { + $this->options['iccid'] = $iccid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadSimOptions ' . $options . ']'; + } +} + +class UpdateSimOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @param string $status + * @param string $fleet The SID or unique name of the Fleet to which the SIM resource should be assigned. + * @param string $callbackUrl The URL we should call using the `callback_method` after an asynchronous update has finished. + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * @param string $accountSid The SID of the Account to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a Subaccount of the requesting Account. Only valid when the Sim resource's status is new. + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $status = Values::NONE, + string $fleet = Values::NONE, + string $callbackUrl = Values::NONE, + string $callbackMethod = Values::NONE, + string $accountSid = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['status'] = $status; + $this->options['fleet'] = $fleet; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['accountSid'] = $accountSid; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The SID or unique name of the Fleet to which the SIM resource should be assigned. + * + * @param string $fleet The SID or unique name of the Fleet to which the SIM resource should be assigned. + * @return $this Fluent Builder + */ + public function setFleet(string $fleet): self + { + $this->options['fleet'] = $fleet; + return $this; + } + + /** + * The URL we should call using the `callback_method` after an asynchronous update has finished. + * + * @param string $callbackUrl The URL we should call using the `callback_method` after an asynchronous update has finished. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * The SID of the Account to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a Subaccount of the requesting Account. Only valid when the Sim resource's status is new. + * + * @param string $accountSid The SID of the Account to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a Subaccount of the requesting Account. Only valid when the Sim resource's status is new. + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.UpdateSimOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SimPage.php b/app/api/Twilio/Rest/Supersim/V1/SimPage.php new file mode 100755 index 0000000..1fa81bf --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SimPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SimInstance \Twilio\Rest\Supersim\V1\SimInstance + */ + public function buildInstance(array $payload): SimInstance + { + return new SimInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SimPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SmsCommandContext.php b/app/api/Twilio/Rest/Supersim/V1/SmsCommandContext.php new file mode 100755 index 0000000..9792fa4 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SmsCommandContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/SmsCommands/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SmsCommandInstance + * + * @return SmsCommandInstance Fetched SmsCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SmsCommandInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SmsCommandInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.SmsCommandContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SmsCommandInstance.php b/app/api/Twilio/Rest/Supersim/V1/SmsCommandInstance.php new file mode 100755 index 0000000..3e0dd49 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SmsCommandInstance.php @@ -0,0 +1,132 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'payload' => Values::array_get($payload, 'payload'), + 'status' => Values::array_get($payload, 'status'), + 'direction' => Values::array_get($payload, 'direction'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SmsCommandContext Context for this SmsCommandInstance + */ + protected function proxy(): SmsCommandContext + { + if (!$this->context) { + $this->context = new SmsCommandContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SmsCommandInstance + * + * @return SmsCommandInstance Fetched SmsCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SmsCommandInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Supersim.V1.SmsCommandInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SmsCommandList.php b/app/api/Twilio/Rest/Supersim/V1/SmsCommandList.php new file mode 100755 index 0000000..8e556e4 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SmsCommandList.php @@ -0,0 +1,207 @@ +solution = [ + ]; + + $this->uri = '/SmsCommands'; + } + + /** + * Create the SmsCommandInstance + * + * @param string $sim The `sid` or `unique_name` of the [SIM](https://www.twilio.com/docs/iot/supersim/api/sim-resource) to send the SMS Command to. + * @param string $payload The message body of the SMS Command. + * @param array|Options $options Optional Arguments + * @return SmsCommandInstance Created SmsCommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $sim, string $payload, array $options = []): SmsCommandInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Sim' => + $sim, + 'Payload' => + $payload, + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SmsCommandInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SmsCommandInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SmsCommandInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SmsCommandInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SmsCommandInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SmsCommandPage Page of SmsCommandInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SmsCommandPage + { + $options = new Values($options); + + $params = Values::of([ + 'Sim' => + $options['sim'], + 'Status' => + $options['status'], + 'Direction' => + $options['direction'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SmsCommandPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SmsCommandInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SmsCommandPage Page of SmsCommandInstance + */ + public function getPage(string $targetUrl): SmsCommandPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SmsCommandPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SmsCommandContext + * + * @param string $sid The SID of the SMS Command resource to fetch. + */ + public function getContext( + string $sid + + ): SmsCommandContext + { + return new SmsCommandContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SmsCommandList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/SmsCommandOptions.php b/app/api/Twilio/Rest/Supersim/V1/SmsCommandOptions.php new file mode 100755 index 0000000..6dccca5 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SmsCommandOptions.php @@ -0,0 +1,184 @@ +options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `GET` or `POST` and the default is POST. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * The URL we should call using the `callback_method` after we have sent the command. + * + * @param string $callbackUrl The URL we should call using the `callback_method` after we have sent the command. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.CreateSmsCommandOptions ' . $options . ']'; + } +} + + +class ReadSmsCommandOptions extends Options + { + /** + * @param string $sim The SID or unique name of the Sim resource that SMS Command was sent to or from. + * @param string $status The status of the SMS Command. Can be: `queued`, `sent`, `delivered`, `received` or `failed`. See the [SMS Command Status Values](https://www.twilio.com/docs/iot/supersim/api/smscommand-resource#status-values) for a description of each. + * @param string $direction The direction of the SMS Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + */ + public function __construct( + + string $sim = Values::NONE, + string $status = Values::NONE, + string $direction = Values::NONE + + ) { + $this->options['sim'] = $sim; + $this->options['status'] = $status; + $this->options['direction'] = $direction; + } + + /** + * The SID or unique name of the Sim resource that SMS Command was sent to or from. + * + * @param string $sim The SID or unique name of the Sim resource that SMS Command was sent to or from. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * The status of the SMS Command. Can be: `queued`, `sent`, `delivered`, `received` or `failed`. See the [SMS Command Status Values](https://www.twilio.com/docs/iot/supersim/api/smscommand-resource#status-values) for a description of each. + * + * @param string $status The status of the SMS Command. Can be: `queued`, `sent`, `delivered`, `received` or `failed`. See the [SMS Command Status Values](https://www.twilio.com/docs/iot/supersim/api/smscommand-resource#status-values) for a description of each. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The direction of the SMS Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + * + * @param string $direction The direction of the SMS Command. Can be `to_sim` or `from_sim`. The value of `to_sim` is synonymous with the term `mobile terminated`, and `from_sim` is synonymous with the term `mobile originated`. + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadSmsCommandOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/SmsCommandPage.php b/app/api/Twilio/Rest/Supersim/V1/SmsCommandPage.php new file mode 100755 index 0000000..ac095d8 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/SmsCommandPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SmsCommandInstance \Twilio\Rest\Supersim\V1\SmsCommandInstance + */ + public function buildInstance(array $payload): SmsCommandInstance + { + return new SmsCommandInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.SmsCommandPage]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/UsageRecordInstance.php b/app/api/Twilio/Rest/Supersim/V1/UsageRecordInstance.php new file mode 100755 index 0000000..bf72053 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/UsageRecordInstance.php @@ -0,0 +1,100 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'networkSid' => Values::array_get($payload, 'network_sid'), + 'fleetSid' => Values::array_get($payload, 'fleet_sid'), + 'isoCountry' => Values::array_get($payload, 'iso_country'), + 'period' => Values::array_get($payload, 'period'), + 'dataUpload' => Values::array_get($payload, 'data_upload'), + 'dataDownload' => Values::array_get($payload, 'data_download'), + 'dataTotal' => Values::array_get($payload, 'data_total'), + 'dataTotalBilled' => Values::array_get($payload, 'data_total_billed'), + 'billedUnit' => Values::array_get($payload, 'billed_unit'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.UsageRecordInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/UsageRecordList.php b/app/api/Twilio/Rest/Supersim/V1/UsageRecordList.php new file mode 100755 index 0000000..f1c7897 --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/UsageRecordList.php @@ -0,0 +1,167 @@ +solution = [ + ]; + + $this->uri = '/UsageRecords'; + } + + /** + * Reads UsageRecordInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UsageRecordInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams UsageRecordInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UsageRecordPage + { + $options = new Values($options); + + $params = Values::of([ + 'Sim' => + $options['sim'], + 'Fleet' => + $options['fleet'], + 'Network' => + $options['network'], + 'IsoCountry' => + $options['isoCountry'], + 'Group' => + $options['group'], + 'Granularity' => + $options['granularity'], + 'StartTime' => + Serialize::iso8601DateTime($options['startTime']), + 'EndTime' => + Serialize::iso8601DateTime($options['endTime']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function getPage(string $targetUrl): UsageRecordPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.UsageRecordList]'; + } +} diff --git a/app/api/Twilio/Rest/Supersim/V1/UsageRecordOptions.php b/app/api/Twilio/Rest/Supersim/V1/UsageRecordOptions.php new file mode 100755 index 0000000..1222c5a --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/UsageRecordOptions.php @@ -0,0 +1,202 @@ +options['sim'] = $sim; + $this->options['fleet'] = $fleet; + $this->options['network'] = $network; + $this->options['isoCountry'] = $isoCountry; + $this->options['group'] = $group; + $this->options['granularity'] = $granularity; + $this->options['startTime'] = $startTime; + $this->options['endTime'] = $endTime; + } + + /** + * SID or unique name of a Sim resource. Only show UsageRecords representing usage incurred by this Super SIM. + * + * @param string $sim SID or unique name of a Sim resource. Only show UsageRecords representing usage incurred by this Super SIM. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * SID or unique name of a Fleet resource. Only show UsageRecords representing usage for Super SIMs belonging to this Fleet resource at the time the usage occurred. + * + * @param string $fleet SID or unique name of a Fleet resource. Only show UsageRecords representing usage for Super SIMs belonging to this Fleet resource at the time the usage occurred. + * @return $this Fluent Builder + */ + public function setFleet(string $fleet): self + { + $this->options['fleet'] = $fleet; + return $this; + } + + /** + * SID of a Network resource. Only show UsageRecords representing usage on this network. + * + * @param string $network SID of a Network resource. Only show UsageRecords representing usage on this network. + * @return $this Fluent Builder + */ + public function setNetwork(string $network): self + { + $this->options['network'] = $network; + return $this; + } + + /** + * Alpha-2 ISO Country Code. Only show UsageRecords representing usage in this country. + * + * @param string $isoCountry Alpha-2 ISO Country Code. Only show UsageRecords representing usage in this country. + * @return $this Fluent Builder + */ + public function setIsoCountry(string $isoCountry): self + { + $this->options['isoCountry'] = $isoCountry; + return $this; + } + + /** + * Dimension over which to aggregate usage records. Can be: `sim`, `fleet`, `network`, `isoCountry`. Default is to not aggregate across any of these dimensions, UsageRecords will be aggregated into the time buckets described by the `Granularity` parameter. + * + * @param string $group Dimension over which to aggregate usage records. Can be: `sim`, `fleet`, `network`, `isoCountry`. Default is to not aggregate across any of these dimensions, UsageRecords will be aggregated into the time buckets described by the `Granularity` parameter. + * @return $this Fluent Builder + */ + public function setGroup(string $group): self + { + $this->options['group'] = $group; + return $this; + } + + /** + * Time-based grouping that UsageRecords should be aggregated by. Can be: `hour`, `day`, or `all`. Default is `all`. `all` returns one UsageRecord that describes the usage for the entire period. + * + * @param string $granularity Time-based grouping that UsageRecords should be aggregated by. Can be: `hour`, `day`, or `all`. Default is `all`. `all` returns one UsageRecord that describes the usage for the entire period. + * @return $this Fluent Builder + */ + public function setGranularity(string $granularity): self + { + $this->options['granularity'] = $granularity; + return $this; + } + + /** + * Only include usage that occurred at or after this time, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Default is one month before the `end_time`. + * + * @param \DateTime $startTime Only include usage that occurred at or after this time, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Default is one month before the `end_time`. + * @return $this Fluent Builder + */ + public function setStartTime(\DateTime $startTime): self + { + $this->options['startTime'] = $startTime; + return $this; + } + + /** + * Only include usage that occurred before this time (exclusive), specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Default is the current time. + * + * @param \DateTime $endTime Only include usage that occurred before this time (exclusive), specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Default is the current time. + * @return $this Fluent Builder + */ + public function setEndTime(\DateTime $endTime): self + { + $this->options['endTime'] = $endTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Supersim.V1.ReadUsageRecordOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Supersim/V1/UsageRecordPage.php b/app/api/Twilio/Rest/Supersim/V1/UsageRecordPage.php new file mode 100755 index 0000000..c0ebffa --- /dev/null +++ b/app/api/Twilio/Rest/Supersim/V1/UsageRecordPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsageRecordInstance \Twilio\Rest\Supersim\V1\UsageRecordInstance + */ + public function buildInstance(array $payload): UsageRecordInstance + { + return new UsageRecordInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Supersim.V1.UsageRecordPage]'; + } +} diff --git a/app/api/Twilio/Rest/SupersimBase.php b/app/api/Twilio/Rest/SupersimBase.php new file mode 100755 index 0000000..ac9d29a --- /dev/null +++ b/app/api/Twilio/Rest/SupersimBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://supersim.twilio.com'; + } + + + /** + * @return V1 Version v1 of supersim + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Supersim]'; + } +} diff --git a/app/api/Twilio/Rest/Sync.php b/app/api/Twilio/Rest/Sync.php new file mode 100755 index 0000000..0cc1d02 --- /dev/null +++ b/app/api/Twilio/Rest/Sync.php @@ -0,0 +1,23 @@ +services instead. + */ + protected function getServices(): \Twilio\Rest\Sync\V1\ServiceList { + echo "services is deprecated. Use v1->services instead."; + return $this->v1->services; + } + + /** + * @deprecated Use v1->services(\$sid) instead. + * @param string $sid The SID of the Service resource to fetch + */ + protected function contextServices(string $sid): \Twilio\Rest\Sync\V1\ServiceContext { + echo "services(\$sid) is deprecated. Use v1->services(\$sid) instead."; + return $this->v1->services($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Sync/V1.php b/app/api/Twilio/Rest/Sync/V1.php new file mode 100755 index 0000000..118aab9 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionContext.php b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionContext.php new file mode 100755 index 0000000..c2ddbf1 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'documentSid' => + $documentSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($documentSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the DocumentPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DocumentPermissionInstance + * + * @return DocumentPermissionInstance Fetched DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DocumentPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the DocumentPermissionInstance + * + * @param bool $read Whether the identity can read the Sync Document. Default value is `false`. + * @param bool $write Whether the identity can update the Sync Document. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync Document. Default value is `false`. + * @return DocumentPermissionInstance Updated DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): DocumentPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new DocumentPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.DocumentPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionInstance.php new file mode 100755 index 0000000..a23ef54 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'documentSid' => Values::array_get($payload, 'document_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'documentSid' => $documentSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DocumentPermissionContext Context for this DocumentPermissionInstance + */ + protected function proxy(): DocumentPermissionContext + { + if (!$this->context) { + $this->context = new DocumentPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the DocumentPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DocumentPermissionInstance + * + * @return DocumentPermissionInstance Fetched DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DocumentPermissionInstance + * + * @param bool $read Whether the identity can read the Sync Document. Default value is `false`. + * @param bool $write Whether the identity can update the Sync Document. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync Document. Default value is `false`. + * @return DocumentPermissionInstance Updated DocumentPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): DocumentPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.DocumentPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionList.php b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionList.php new file mode 100755 index 0000000..0935be7 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'documentSid' => + $documentSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($documentSid) + .'/Permissions'; + } + + /** + * Reads DocumentPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DocumentPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DocumentPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DocumentPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DocumentPermissionPage Page of DocumentPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DocumentPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DocumentPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DocumentPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DocumentPermissionPage Page of DocumentPermissionInstance + */ + public function getPage(string $targetUrl): DocumentPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DocumentPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DocumentPermissionContext + * + * @param string $identity The application-defined string that uniquely identifies the User's Document Permission resource to delete. + */ + public function getContext( + string $identity + + ): DocumentPermissionContext + { + return new DocumentPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['documentSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.DocumentPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionPage.php b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionPage.php new file mode 100755 index 0000000..60c02d8 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/Document/DocumentPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DocumentPermissionInstance \Twilio\Rest\Sync\V1\Service\Document\DocumentPermissionInstance + */ + public function buildInstance(array $payload): DocumentPermissionInstance + { + return new DocumentPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['documentSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.DocumentPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/DocumentContext.php b/app/api/Twilio/Rest/Sync/V1/Service/DocumentContext.php new file mode 100755 index 0000000..95cef18 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/DocumentContext.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the DocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the DocumentInstance + * + * @return DocumentInstance Fetched DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the DocumentInstance + * + * @param array|Options $options Optional Arguments + * @return DocumentInstance Updated DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($options['data']), + 'Ttl' => + $options['ttl'], + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the documentPermissions + */ + protected function getDocumentPermissions(): DocumentPermissionList + { + if (!$this->_documentPermissions) { + $this->_documentPermissions = new DocumentPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_documentPermissions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.DocumentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/DocumentInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/DocumentInstance.php new file mode 100755 index 0000000..f878914 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/DocumentInstance.php @@ -0,0 +1,177 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return DocumentContext Context for this DocumentInstance + */ + protected function proxy(): DocumentContext + { + if (!$this->context) { + $this->context = new DocumentContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the DocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the DocumentInstance + * + * @return DocumentInstance Fetched DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): DocumentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the DocumentInstance + * + * @param array|Options $options Optional Arguments + * @return DocumentInstance Updated DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): DocumentInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the documentPermissions + */ + protected function getDocumentPermissions(): DocumentPermissionList + { + return $this->proxy()->documentPermissions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.DocumentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/DocumentList.php b/app/api/Twilio/Rest/Sync/V1/Service/DocumentList.php new file mode 100755 index 0000000..1eac8a4 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/DocumentList.php @@ -0,0 +1,202 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Documents'; + } + + /** + * Create the DocumentInstance + * + * @param array|Options $options Optional Arguments + * @return DocumentInstance Created DocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): DocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Data' => + Serialize::jsonObject($options['data']), + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new DocumentInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads DocumentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DocumentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DocumentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DocumentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DocumentPage Page of DocumentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DocumentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DocumentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DocumentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DocumentPage Page of DocumentInstance + */ + public function getPage(string $targetUrl): DocumentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DocumentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a DocumentContext + * + * @param string $sid The SID of the Document resource to delete. Can be the Document resource's `sid` or its `unique_name`. + */ + public function getContext( + string $sid + + ): DocumentContext + { + return new DocumentContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.DocumentList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/DocumentOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/DocumentOptions.php new file mode 100755 index 0000000..c07dcc9 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/DocumentOptions.php @@ -0,0 +1,206 @@ +options['uniqueName'] = $uniqueName; + $this->options['data'] = $data; + $this->options['ttl'] = $ttl; + } + + /** + * An application-defined string that uniquely identifies the Sync Document + * + * @param string $uniqueName An application-defined string that uniquely identifies the Sync Document + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A JSON string that represents an arbitrary, schema-less object that the Sync Document stores. Can be up to 16 KiB in length. + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Sync Document stores. Can be up to 16 KiB in length. + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Document expires and is deleted (the Sync Document's time-to-live). + * + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Document expires and is deleted (the Sync Document's time-to-live). + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateDocumentOptions ' . $options . ']'; + } +} + + + + +class UpdateDocumentOptions extends Options + { + /** + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Sync Document stores. Can be up to 16 KiB in length. + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Document expires and is deleted (time-to-live). + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + array $data = Values::ARRAY_NONE, + int $ttl = Values::INT_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['data'] = $data; + $this->options['ttl'] = $ttl; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * A JSON string that represents an arbitrary, schema-less object that the Sync Document stores. Can be up to 16 KiB in length. + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Sync Document stores. Can be up to 16 KiB in length. + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Document expires and is deleted (time-to-live). + * + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Document expires and is deleted (time-to-live). + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateDocumentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/DocumentPage.php b/app/api/Twilio/Rest/Sync/V1/Service/DocumentPage.php new file mode 100755 index 0000000..dc74437 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/DocumentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DocumentInstance \Twilio\Rest\Sync\V1\Service\DocumentInstance + */ + public function buildInstance(array $payload): DocumentInstance + { + return new DocumentInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.DocumentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemContext.php new file mode 100755 index 0000000..205f11a --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemContext.php @@ -0,0 +1,151 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'listSid' => + $listSid, + 'index' => + $index, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Items/' . \rawurlencode($index) + .''; + } + + /** + * Delete the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the SyncListItemInstance + * + * @return SyncListItemInstance Fetched SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListItemInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + + /** + * Update the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListItemInstance Updated SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncListItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($options['data']), + 'Ttl' => + $options['ttl'], + 'ItemTtl' => + $options['itemTtl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListItemContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemInstance.php new file mode 100755 index 0000000..786ccc9 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'index' => Values::array_get($payload, 'index'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'listSid' => Values::array_get($payload, 'list_sid'), + 'url' => Values::array_get($payload, 'url'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'listSid' => $listSid, 'index' => $index ?: $this->properties['index'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListItemContext Context for this SyncListItemInstance + */ + protected function proxy(): SyncListItemContext + { + if (!$this->context) { + $this->context = new SyncListItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['index'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the SyncListItemInstance + * + * @return SyncListItemInstance Fetched SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListItemInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncListItemInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListItemInstance Updated SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncListItemInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListItemInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemList.php new file mode 100755 index 0000000..c5cd8cb --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemList.php @@ -0,0 +1,223 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'listSid' => + $listSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Items'; + } + + /** + * Create the SyncListItemInstance + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that the List Item stores. Can be up to 16 KiB in length. + * @param array|Options $options Optional Arguments + * @return SyncListItemInstance Created SyncListItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $data, array $options = []): SyncListItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + 'Ttl' => + $options['ttl'], + 'ItemTtl' => + $options['itemTtl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncListItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'] + ); + } + + + /** + * Reads SyncListItemInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListItemInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SyncListItemInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListItemInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListItemPage Page of SyncListItemInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListItemPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'From' => + $options['from'], + 'Bounds' => + $options['bounds'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListItemPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListItemInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListItemPage Page of SyncListItemInstance + */ + public function getPage(string $targetUrl): SyncListItemPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListItemPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListItemContext + * + * @param int $index The index of the Sync List Item resource to delete. + */ + public function getContext( + int $index + + ): SyncListItemContext + { + return new SyncListItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $index + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListItemList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemOptions.php new file mode 100755 index 0000000..a58db9d --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemOptions.php @@ -0,0 +1,378 @@ +options['ttl'] = $ttl; + $this->options['itemTtl'] = $itemTtl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item expires (time-to-live) and is deleted. + * + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setItemTtl(int $itemTtl): self + { + $this->options['itemTtl'] = $itemTtl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item's parent Sync List expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item's parent Sync List expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateSyncListItemOptions ' . $options . ']'; + } +} + +class DeleteSyncListItemOptions extends Options + { + /** + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.DeleteSyncListItemOptions ' . $options . ']'; + } +} + + +class ReadSyncListItemOptions extends Options + { + /** + * @param string $order How to order the List Items returned by their `index` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. + * @param string $from The `index` of the first Sync List Item resource to read. See also `bounds`. + * @param string $bounds Whether to include the List Item referenced by the `from` parameter. Can be: `inclusive` to include the List Item referenced by the `from` parameter or `exclusive` to start with the next List Item. The default value is `inclusive`. + */ + public function __construct( + + string $order = Values::NONE, + string $from = Values::NONE, + string $bounds = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['from'] = $from; + $this->options['bounds'] = $bounds; + } + + /** + * How to order the List Items returned by their `index` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. + * + * @param string $order How to order the List Items returned by their `index` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * The `index` of the first Sync List Item resource to read. See also `bounds`. + * + * @param string $from The `index` of the first Sync List Item resource to read. See also `bounds`. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * Whether to include the List Item referenced by the `from` parameter. Can be: `inclusive` to include the List Item referenced by the `from` parameter or `exclusive` to start with the next List Item. The default value is `inclusive`. + * + * @param string $bounds Whether to include the List Item referenced by the `from` parameter. Can be: `inclusive` to include the List Item referenced by the `from` parameter or `exclusive` to start with the next List Item. The default value is `inclusive`. + * @return $this Fluent Builder + */ + public function setBounds(string $bounds): self + { + $this->options['bounds'] = $bounds; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.ReadSyncListItemOptions ' . $options . ']'; + } +} + +class UpdateSyncListItemOptions extends Options + { + /** + * @param array $data A JSON string that represents an arbitrary, schema-less object that the List Item stores. Can be up to 16 KiB in length. + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item expires (time-to-live) and is deleted. + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item's parent Sync List expires (time-to-live) and is deleted. This parameter can only be used when the List Item's `data` or `ttl` is updated in the same request. + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + array $data = Values::ARRAY_NONE, + int $ttl = Values::INT_NONE, + int $itemTtl = Values::INT_NONE, + int $collectionTtl = Values::INT_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['data'] = $data; + $this->options['ttl'] = $ttl; + $this->options['itemTtl'] = $itemTtl; + $this->options['collectionTtl'] = $collectionTtl; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * A JSON string that represents an arbitrary, schema-less object that the List Item stores. Can be up to 16 KiB in length. + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that the List Item stores. Can be up to 16 KiB in length. + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item expires (time-to-live) and is deleted. + * + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setItemTtl(int $itemTtl): self + { + $this->options['itemTtl'] = $itemTtl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item's parent Sync List expires (time-to-live) and is deleted. This parameter can only be used when the List Item's `data` or `ttl` is updated in the same request. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the List Item's parent Sync List expires (time-to-live) and is deleted. This parameter can only be used when the List Item's `data` or `ttl` is updated in the same request. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateSyncListItemOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemPage.php new file mode 100755 index 0000000..b9c7450 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListItemPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListItemInstance \Twilio\Rest\Sync\V1\Service\SyncList\SyncListItemInstance + */ + public function buildInstance(array $payload): SyncListItemInstance + { + return new SyncListItemInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['listSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListItemPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionContext.php new file mode 100755 index 0000000..6343e84 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'listSid' => + $listSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the SyncListPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncListPermissionInstance + * + * @return SyncListPermissionInstance Fetched SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the SyncListPermissionInstance + * + * @param bool $read Whether the identity can read the Sync List and its Items. Default value is `false`. + * @param bool $write Whether the identity can create, update, and delete Items in the Sync List. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync List. Default value is `false`. + * @return SyncListPermissionInstance Updated SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncListPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncListPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionInstance.php new file mode 100755 index 0000000..32a20c1 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'listSid' => Values::array_get($payload, 'list_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'listSid' => $listSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListPermissionContext Context for this SyncListPermissionInstance + */ + protected function proxy(): SyncListPermissionContext + { + if (!$this->context) { + $this->context = new SyncListPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncListPermissionInstance + * + * @return SyncListPermissionInstance Fetched SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncListPermissionInstance + * + * @param bool $read Whether the identity can read the Sync List and its Items. Default value is `false`. + * @param bool $write Whether the identity can create, update, and delete Items in the Sync List. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync List. Default value is `false`. + * @return SyncListPermissionInstance Updated SyncListPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncListPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionList.php new file mode 100755 index 0000000..cc67844 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'listSid' => + $listSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($listSid) + .'/Permissions'; + } + + /** + * Reads SyncListPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncListPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListPermissionPage Page of SyncListPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListPermissionPage Page of SyncListPermissionInstance + */ + public function getPage(string $targetUrl): SyncListPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListPermissionContext + * + * @param string $identity The application-defined string that uniquely identifies the User's Sync List Permission resource to delete. + */ + public function getContext( + string $identity + + ): SyncListPermissionContext + { + return new SyncListPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['listSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionPage.php new file mode 100755 index 0000000..e143977 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncList/SyncListPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListPermissionInstance \Twilio\Rest\Sync\V1\Service\SyncList\SyncListPermissionInstance + */ + public function buildInstance(array $payload): SyncListPermissionInstance + { + return new SyncListPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['listSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncListContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncListContext.php new file mode 100755 index 0000000..987633a --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncListContext.php @@ -0,0 +1,211 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SyncListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncListInstance + * + * @return SyncListInstance Fetched SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncListInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SyncListInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListInstance Updated SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncListInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncListInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the syncListPermissions + */ + protected function getSyncListPermissions(): SyncListPermissionList + { + if (!$this->_syncListPermissions) { + $this->_syncListPermissions = new SyncListPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncListPermissions; + } + + /** + * Access the syncListItems + */ + protected function getSyncListItems(): SyncListItemList + { + if (!$this->_syncListItems) { + $this->_syncListItems = new SyncListItemList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncListItems; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncListInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncListInstance.php new file mode 100755 index 0000000..0925ea0 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncListInstance.php @@ -0,0 +1,185 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncListContext Context for this SyncListInstance + */ + protected function proxy(): SyncListContext + { + if (!$this->context) { + $this->context = new SyncListContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncListInstance + * + * @return SyncListInstance Fetched SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncListInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListInstance Updated SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncListInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the syncListPermissions + */ + protected function getSyncListPermissions(): SyncListPermissionList + { + return $this->proxy()->syncListPermissions; + } + + /** + * Access the syncListItems + */ + protected function getSyncListItems(): SyncListItemList + { + return $this->proxy()->syncListItems; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncListList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncListList.php new file mode 100755 index 0000000..d86f4bb --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncListList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Lists'; + } + + /** + * Create the SyncListInstance + * + * @param array|Options $options Optional Arguments + * @return SyncListInstance Created SyncListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SyncListInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Ttl' => + $options['ttl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncListInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SyncListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncListPage Page of SyncListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncListPage Page of SyncListInstance + */ + public function getPage(string $targetUrl): SyncListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncListContext + * + * @param string $sid The SID of the Sync List resource to delete. Can be the Sync List resource's `sid` or its `unique_name`. + */ + public function getContext( + string $sid + + ): SyncListContext + { + return new SyncListContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncListOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncListOptions.php new file mode 100755 index 0000000..bff4efa --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncListOptions.php @@ -0,0 +1,188 @@ +options['uniqueName'] = $uniqueName; + $this->options['ttl'] = $ttl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be unique within its Service and it can be up to 320 characters long. The `unique_name` value can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be unique within its Service and it can be up to 320 characters long. The `unique_name` value can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Alias for collection_ttl. If both are provided, this value is ignored. + * + * @param int $ttl Alias for collection_ttl. If both are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync List expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync List expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateSyncListOptions ' . $options . ']'; + } +} + + + + +class UpdateSyncListOptions extends Options + { + /** + * @param int $ttl An alias for `collection_ttl`. If both are provided, this value is ignored. + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync List expires (time-to-live) and is deleted. + */ + public function __construct( + + int $ttl = Values::INT_NONE, + int $collectionTtl = Values::INT_NONE + + ) { + $this->options['ttl'] = $ttl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An alias for `collection_ttl`. If both are provided, this value is ignored. + * + * @param int $ttl An alias for `collection_ttl`. If both are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync List expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync List expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateSyncListOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncListPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncListPage.php new file mode 100755 index 0000000..4876506 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncListInstance \Twilio\Rest\Sync\V1\Service\SyncListInstance + */ + public function buildInstance(array $payload): SyncListInstance + { + return new SyncListInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemContext.php new file mode 100755 index 0000000..de01ff6 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemContext.php @@ -0,0 +1,151 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'mapSid' => + $mapSid, + 'key' => + $key, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Items/' . \rawurlencode($key) + .''; + } + + /** + * Delete the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the SyncMapItemInstance + * + * @return SyncMapItemInstance Fetched SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapItemInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + + /** + * Update the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapItemInstance Updated SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncMapItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($options['data']), + 'Ttl' => + $options['ttl'], + 'ItemTtl' => + $options['itemTtl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapItemContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemInstance.php new file mode 100755 index 0000000..0b80b6c --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemInstance.php @@ -0,0 +1,167 @@ +properties = [ + 'key' => Values::array_get($payload, 'key'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'mapSid' => Values::array_get($payload, 'map_sid'), + 'url' => Values::array_get($payload, 'url'), + 'revision' => Values::array_get($payload, 'revision'), + 'data' => Values::array_get($payload, 'data'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'mapSid' => $mapSid, 'key' => $key ?: $this->properties['key'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapItemContext Context for this SyncMapItemInstance + */ + protected function proxy(): SyncMapItemContext + { + if (!$this->context) { + $this->context = new SyncMapItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['key'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the SyncMapItemInstance + * + * @return SyncMapItemInstance Fetched SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapItemInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncMapItemInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapItemInstance Updated SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncMapItemInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapItemInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemList.php new file mode 100755 index 0000000..533d5f2 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemList.php @@ -0,0 +1,226 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'mapSid' => + $mapSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Items'; + } + + /** + * Create the SyncMapItemInstance + * + * @param string $key The unique, user-defined key for the Map Item. Can be up to 320 characters long. + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Map Item stores. Can be up to 16 KiB in length. + * @param array|Options $options Optional Arguments + * @return SyncMapItemInstance Created SyncMapItemInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $key, array $data, array $options = []): SyncMapItemInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Key' => + $key, + 'Data' => + Serialize::jsonObject($data), + 'Ttl' => + $options['ttl'], + 'ItemTtl' => + $options['itemTtl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncMapItemInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'] + ); + } + + + /** + * Reads SyncMapItemInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapItemInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SyncMapItemInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapItemInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapItemPage Page of SyncMapItemInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapItemPage + { + $options = new Values($options); + + $params = Values::of([ + 'Order' => + $options['order'], + 'From' => + $options['from'], + 'Bounds' => + $options['bounds'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapItemPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapItemInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapItemPage Page of SyncMapItemInstance + */ + public function getPage(string $targetUrl): SyncMapItemPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapItemPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapItemContext + * + * @param string $key The `key` value of the Sync Map Item resource to delete. + */ + public function getContext( + string $key + + ): SyncMapItemContext + { + return new SyncMapItemContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $key + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapItemList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemOptions.php new file mode 100755 index 0000000..36c841c --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemOptions.php @@ -0,0 +1,378 @@ +options['ttl'] = $ttl; + $this->options['itemTtl'] = $itemTtl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item expires (time-to-live) and is deleted. + * + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setItemTtl(int $itemTtl): self + { + $this->options['itemTtl'] = $itemTtl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item's parent Sync Map expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item's parent Sync Map expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateSyncMapItemOptions ' . $options . ']'; + } +} + +class DeleteSyncMapItemOptions extends Options + { + /** + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.DeleteSyncMapItemOptions ' . $options . ']'; + } +} + + +class ReadSyncMapItemOptions extends Options + { + /** + * @param string $order How to order the Map Items returned by their `key` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. Map Items are [ordered lexicographically](https://en.wikipedia.org/wiki/Lexicographical_order) by Item key. + * @param string $from The `key` of the first Sync Map Item resource to read. See also `bounds`. + * @param string $bounds Whether to include the Map Item referenced by the `from` parameter. Can be: `inclusive` to include the Map Item referenced by the `from` parameter or `exclusive` to start with the next Map Item. The default value is `inclusive`. + */ + public function __construct( + + string $order = Values::NONE, + string $from = Values::NONE, + string $bounds = Values::NONE + + ) { + $this->options['order'] = $order; + $this->options['from'] = $from; + $this->options['bounds'] = $bounds; + } + + /** + * How to order the Map Items returned by their `key` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. Map Items are [ordered lexicographically](https://en.wikipedia.org/wiki/Lexicographical_order) by Item key. + * + * @param string $order How to order the Map Items returned by their `key` value. Can be: `asc` (ascending) or `desc` (descending) and the default is ascending. Map Items are [ordered lexicographically](https://en.wikipedia.org/wiki/Lexicographical_order) by Item key. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * The `key` of the first Sync Map Item resource to read. See also `bounds`. + * + * @param string $from The `key` of the first Sync Map Item resource to read. See also `bounds`. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * Whether to include the Map Item referenced by the `from` parameter. Can be: `inclusive` to include the Map Item referenced by the `from` parameter or `exclusive` to start with the next Map Item. The default value is `inclusive`. + * + * @param string $bounds Whether to include the Map Item referenced by the `from` parameter. Can be: `inclusive` to include the Map Item referenced by the `from` parameter or `exclusive` to start with the next Map Item. The default value is `inclusive`. + * @return $this Fluent Builder + */ + public function setBounds(string $bounds): self + { + $this->options['bounds'] = $bounds; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.ReadSyncMapItemOptions ' . $options . ']'; + } +} + +class UpdateSyncMapItemOptions extends Options + { + /** + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Map Item stores. Can be up to 16 KiB in length. + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item expires (time-to-live) and is deleted. + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item's parent Sync Map expires (time-to-live) and is deleted. This parameter can only be used when the Map Item's `data` or `ttl` is updated in the same request. + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + array $data = Values::ARRAY_NONE, + int $ttl = Values::INT_NONE, + int $itemTtl = Values::INT_NONE, + int $collectionTtl = Values::INT_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['data'] = $data; + $this->options['ttl'] = $ttl; + $this->options['itemTtl'] = $itemTtl; + $this->options['collectionTtl'] = $collectionTtl; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * A JSON string that represents an arbitrary, schema-less object that the Map Item stores. Can be up to 16 KiB in length. + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that the Map Item stores. Can be up to 16 KiB in length. + * @return $this Fluent Builder + */ + public function setData(array $data): self + { + $this->options['data'] = $data; + return $this; + } + + /** + * An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `item_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item expires (time-to-live) and is deleted. + * + * @param int $itemTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setItemTtl(int $itemTtl): self + { + $this->options['itemTtl'] = $itemTtl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item's parent Sync Map expires (time-to-live) and is deleted. This parameter can only be used when the Map Item's `data` or `ttl` is updated in the same request. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Map Item's parent Sync Map expires (time-to-live) and is deleted. This parameter can only be used when the Map Item's `data` or `ttl` is updated in the same request. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, applies this mutation if (and only if) the “revision” field of this [map item] matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateSyncMapItemOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemPage.php new file mode 100755 index 0000000..430981a --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapItemPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapItemInstance \Twilio\Rest\Sync\V1\Service\SyncMap\SyncMapItemInstance + */ + public function buildInstance(array $payload): SyncMapItemInstance + { + return new SyncMapItemInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['mapSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapItemPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionContext.php new file mode 100755 index 0000000..6c693d0 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionContext.php @@ -0,0 +1,141 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'mapSid' => + $mapSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Permissions/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the SyncMapPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncMapPermissionInstance + * + * @return SyncMapPermissionInstance Fetched SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapPermissionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + + /** + * Update the SyncMapPermissionInstance + * + * @param bool $read Whether the identity can read the Sync Map and its Items. Default value is `false`. + * @param bool $write Whether the identity can create, update, and delete Items in the Sync Map. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync Map. Default value is `false`. + * @return SyncMapPermissionInstance Updated SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncMapPermissionInstance + { + + $data = Values::of([ + 'Read' => + Serialize::booleanToString($read), + 'Write' => + Serialize::booleanToString($write), + 'Manage' => + Serialize::booleanToString($manage), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncMapPermissionInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapPermissionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionInstance.php new file mode 100755 index 0000000..2dce6de --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'mapSid' => Values::array_get($payload, 'map_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'read' => Values::array_get($payload, 'read'), + 'write' => Values::array_get($payload, 'write'), + 'manage' => Values::array_get($payload, 'manage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'mapSid' => $mapSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapPermissionContext Context for this SyncMapPermissionInstance + */ + protected function proxy(): SyncMapPermissionContext + { + if (!$this->context) { + $this->context = new SyncMapPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapPermissionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncMapPermissionInstance + * + * @return SyncMapPermissionInstance Fetched SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapPermissionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncMapPermissionInstance + * + * @param bool $read Whether the identity can read the Sync Map and its Items. Default value is `false`. + * @param bool $write Whether the identity can create, update, and delete Items in the Sync Map. Default value is `false`. + * @param bool $manage Whether the identity can delete the Sync Map. Default value is `false`. + * @return SyncMapPermissionInstance Updated SyncMapPermissionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(bool $read, bool $write, bool $manage): SyncMapPermissionInstance + { + + return $this->proxy()->update($read, $write, $manage); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapPermissionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionList.php new file mode 100755 index 0000000..85b6cb7 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'mapSid' => + $mapSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($mapSid) + .'/Permissions'; + } + + /** + * Reads SyncMapPermissionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapPermissionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncMapPermissionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapPermissionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapPermissionPage Page of SyncMapPermissionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapPermissionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapPermissionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapPermissionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapPermissionPage Page of SyncMapPermissionInstance + */ + public function getPage(string $targetUrl): SyncMapPermissionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapPermissionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapPermissionContext + * + * @param string $identity The application-defined string that uniquely identifies the User's Sync Map Permission resource to delete. + */ + public function getContext( + string $identity + + ): SyncMapPermissionContext + { + return new SyncMapPermissionContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['mapSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapPermissionList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionPage.php new file mode 100755 index 0000000..e737356 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMap/SyncMapPermissionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapPermissionInstance \Twilio\Rest\Sync\V1\Service\SyncMap\SyncMapPermissionInstance + */ + public function buildInstance(array $payload): SyncMapPermissionInstance + { + return new SyncMapPermissionInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['mapSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapPermissionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMapContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapContext.php new file mode 100755 index 0000000..86e298d --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapContext.php @@ -0,0 +1,211 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SyncMapInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncMapInstance + * + * @return SyncMapInstance Fetched SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncMapInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SyncMapInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapInstance Updated SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncMapInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncMapInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the syncMapItems + */ + protected function getSyncMapItems(): SyncMapItemList + { + if (!$this->_syncMapItems) { + $this->_syncMapItems = new SyncMapItemList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncMapItems; + } + + /** + * Access the syncMapPermissions + */ + protected function getSyncMapPermissions(): SyncMapPermissionList + { + if (!$this->_syncMapPermissions) { + $this->_syncMapPermissions = new SyncMapPermissionList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_syncMapPermissions; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMapInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapInstance.php new file mode 100755 index 0000000..84c0834 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapInstance.php @@ -0,0 +1,185 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'revision' => Values::array_get($payload, 'revision'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncMapContext Context for this SyncMapInstance + */ + protected function proxy(): SyncMapContext + { + if (!$this->context) { + $this->context = new SyncMapContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncMapInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncMapInstance + * + * @return SyncMapInstance Fetched SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncMapInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncMapInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapInstance Updated SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncMapInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the syncMapItems + */ + protected function getSyncMapItems(): SyncMapItemList + { + return $this->proxy()->syncMapItems; + } + + /** + * Access the syncMapPermissions + */ + protected function getSyncMapPermissions(): SyncMapPermissionList + { + return $this->proxy()->syncMapPermissions; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncMapInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMapList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapList.php new file mode 100755 index 0000000..0d516ff --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapList.php @@ -0,0 +1,201 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Maps'; + } + + /** + * Create the SyncMapInstance + * + * @param array|Options $options Optional Arguments + * @return SyncMapInstance Created SyncMapInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SyncMapInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Ttl' => + $options['ttl'], + 'CollectionTtl' => + $options['collectionTtl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncMapInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SyncMapInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncMapInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncMapInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncMapInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncMapPage Page of SyncMapInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncMapPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncMapPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncMapInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncMapPage Page of SyncMapInstance + */ + public function getPage(string $targetUrl): SyncMapPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncMapPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncMapContext + * + * @param string $sid The SID of the Sync Map resource to delete. Can be the Sync Map's `sid` or its `unique_name`. + */ + public function getContext( + string $sid + + ): SyncMapContext + { + return new SyncMapContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMapOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapOptions.php new file mode 100755 index 0000000..2469f12 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapOptions.php @@ -0,0 +1,188 @@ +options['uniqueName'] = $uniqueName; + $this->options['ttl'] = $ttl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * An alias for `collection_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `collection_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Map expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Map expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateSyncMapOptions ' . $options . ']'; + } +} + + + + +class UpdateSyncMapOptions extends Options + { + /** + * @param int $ttl An alias for `collection_ttl`. If both parameters are provided, this value is ignored. + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Map expires (time-to-live) and is deleted. + */ + public function __construct( + + int $ttl = Values::INT_NONE, + int $collectionTtl = Values::INT_NONE + + ) { + $this->options['ttl'] = $ttl; + $this->options['collectionTtl'] = $collectionTtl; + } + + /** + * An alias for `collection_ttl`. If both parameters are provided, this value is ignored. + * + * @param int $ttl An alias for `collection_ttl`. If both parameters are provided, this value is ignored. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Map expires (time-to-live) and is deleted. + * + * @param int $collectionTtl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Sync Map expires (time-to-live) and is deleted. + * @return $this Fluent Builder + */ + public function setCollectionTtl(int $collectionTtl): self + { + $this->options['collectionTtl'] = $collectionTtl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateSyncMapOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncMapPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapPage.php new file mode 100755 index 0000000..e8049fa --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncMapPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncMapInstance \Twilio\Rest\Sync\V1\Service\SyncMapInstance + */ + public function buildInstance(array $payload): SyncMapInstance + { + return new SyncMapInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncMapPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageInstance.php new file mode 100755 index 0000000..6eb22bc --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageInstance.php @@ -0,0 +1,85 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'streamSid' => $streamSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.StreamMessageInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageList.php new file mode 100755 index 0000000..dc7b408 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessageList.php @@ -0,0 +1,93 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'streamSid' => + $streamSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Streams/' . \rawurlencode($streamSid) + .'/Messages'; + } + + /** + * Create the StreamMessageInstance + * + * @param array $data A JSON string that represents an arbitrary, schema-less object that makes up the Stream Message body. Can be up to 4 KiB in length. + * @return StreamMessageInstance Created StreamMessageInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $data): StreamMessageInstance + { + + $data = Values::of([ + 'Data' => + Serialize::jsonObject($data), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new StreamMessageInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['streamSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.StreamMessageList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessagePage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessagePage.php new file mode 100755 index 0000000..2839d50 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStream/StreamMessagePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return StreamMessageInstance \Twilio\Rest\Sync\V1\Service\SyncStream\StreamMessageInstance + */ + public function buildInstance(array $payload): StreamMessageInstance + { + return new StreamMessageInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['streamSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.StreamMessagePage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamContext.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamContext.php new file mode 100755 index 0000000..d2ba6f4 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamContext.php @@ -0,0 +1,189 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Streams/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SyncStreamInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SyncStreamInstance + * + * @return SyncStreamInstance Fetched SyncStreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncStreamInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SyncStreamInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the SyncStreamInstance + * + * @param array|Options $options Optional Arguments + * @return SyncStreamInstance Updated SyncStreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncStreamInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SyncStreamInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the streamMessages + */ + protected function getStreamMessages(): StreamMessageList + { + if (!$this->_streamMessages) { + $this->_streamMessages = new StreamMessageList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_streamMessages; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncStreamContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamInstance.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamInstance.php new file mode 100755 index 0000000..f8ed299 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamInstance.php @@ -0,0 +1,174 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'dateExpires' => Deserialize::dateTime(Values::array_get($payload, 'date_expires')), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'createdBy' => Values::array_get($payload, 'created_by'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SyncStreamContext Context for this SyncStreamInstance + */ + protected function proxy(): SyncStreamContext + { + if (!$this->context) { + $this->context = new SyncStreamContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SyncStreamInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SyncStreamInstance + * + * @return SyncStreamInstance Fetched SyncStreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SyncStreamInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SyncStreamInstance + * + * @param array|Options $options Optional Arguments + * @return SyncStreamInstance Updated SyncStreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SyncStreamInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the streamMessages + */ + protected function getStreamMessages(): StreamMessageList + { + return $this->proxy()->streamMessages; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.SyncStreamInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamList.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamList.php new file mode 100755 index 0000000..c1c2653 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamList.php @@ -0,0 +1,199 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Streams'; + } + + /** + * Create the SyncStreamInstance + * + * @param array|Options $options Optional Arguments + * @return SyncStreamInstance Created SyncStreamInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): SyncStreamInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SyncStreamInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads SyncStreamInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SyncStreamInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SyncStreamInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SyncStreamInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SyncStreamPage Page of SyncStreamInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SyncStreamPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SyncStreamPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SyncStreamInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SyncStreamPage Page of SyncStreamInstance + */ + public function getPage(string $targetUrl): SyncStreamPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SyncStreamPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SyncStreamContext + * + * @param string $sid The SID of the Stream resource to delete. + */ + public function getContext( + string $sid + + ): SyncStreamContext + { + return new SyncStreamContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncStreamList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamOptions.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamOptions.php new file mode 100755 index 0000000..ee7d99a --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamOptions.php @@ -0,0 +1,153 @@ +options['uniqueName'] = $uniqueName; + $this->options['ttl'] = $ttl; + } + + /** + * An application-defined string that uniquely identifies the resource. This value must be unique within its Service and it can be up to 320 characters long. The `unique_name` value can be used as an alternative to the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. This value must be unique within its Service and it can be up to 320 characters long. The `unique_name` value can be used as an alternative to the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Stream expires and is deleted (time-to-live). + * + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Stream expires and is deleted (time-to-live). + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateSyncStreamOptions ' . $options . ']'; + } +} + + + + +class UpdateSyncStreamOptions extends Options + { + /** + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Stream expires and is deleted (time-to-live). + */ + public function __construct( + + int $ttl = Values::INT_NONE + + ) { + $this->options['ttl'] = $ttl; + } + + /** + * How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Stream expires and is deleted (time-to-live). + * + * @param int $ttl How long, [in seconds](https://www.twilio.com/docs/sync/limits#sync-payload-limits), before the Stream expires and is deleted (time-to-live). + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateSyncStreamOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamPage.php b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamPage.php new file mode 100755 index 0000000..b08b9bb --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/Service/SyncStreamPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SyncStreamInstance \Twilio\Rest\Sync\V1\Service\SyncStreamInstance + */ + public function buildInstance(array $payload): SyncStreamInstance + { + return new SyncStreamInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.SyncStreamPage]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/ServiceContext.php b/app/api/Twilio/Rest/Sync/V1/ServiceContext.php new file mode 100755 index 0000000..08edf7a --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/ServiceContext.php @@ -0,0 +1,251 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'WebhookUrl' => + $options['webhookUrl'], + 'FriendlyName' => + $options['friendlyName'], + 'ReachabilityWebhooksEnabled' => + Serialize::booleanToString($options['reachabilityWebhooksEnabled']), + 'AclEnabled' => + Serialize::booleanToString($options['aclEnabled']), + 'ReachabilityDebouncingEnabled' => + Serialize::booleanToString($options['reachabilityDebouncingEnabled']), + 'ReachabilityDebouncingWindow' => + $options['reachabilityDebouncingWindow'], + 'WebhooksFromRestEnabled' => + Serialize::booleanToString($options['webhooksFromRestEnabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the syncLists + */ + protected function getSyncLists(): SyncListList + { + if (!$this->_syncLists) { + $this->_syncLists = new SyncListList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_syncLists; + } + + /** + * Access the syncStreams + */ + protected function getSyncStreams(): SyncStreamList + { + if (!$this->_syncStreams) { + $this->_syncStreams = new SyncStreamList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_syncStreams; + } + + /** + * Access the documents + */ + protected function getDocuments(): DocumentList + { + if (!$this->_documents) { + $this->_documents = new DocumentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_documents; + } + + /** + * Access the syncMaps + */ + protected function getSyncMaps(): SyncMapList + { + if (!$this->_syncMaps) { + $this->_syncMaps = new SyncMapList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_syncMaps; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/ServiceInstance.php b/app/api/Twilio/Rest/Sync/V1/ServiceInstance.php new file mode 100755 index 0000000..cb9fdaa --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/ServiceInstance.php @@ -0,0 +1,209 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhooksFromRestEnabled' => Values::array_get($payload, 'webhooks_from_rest_enabled'), + 'reachabilityWebhooksEnabled' => Values::array_get($payload, 'reachability_webhooks_enabled'), + 'aclEnabled' => Values::array_get($payload, 'acl_enabled'), + 'reachabilityDebouncingEnabled' => Values::array_get($payload, 'reachability_debouncing_enabled'), + 'reachabilityDebouncingWindow' => Values::array_get($payload, 'reachability_debouncing_window'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the syncLists + */ + protected function getSyncLists(): SyncListList + { + return $this->proxy()->syncLists; + } + + /** + * Access the syncStreams + */ + protected function getSyncStreams(): SyncStreamList + { + return $this->proxy()->syncStreams; + } + + /** + * Access the documents + */ + protected function getDocuments(): DocumentList + { + return $this->proxy()->documents; + } + + /** + * Access the syncMaps + */ + protected function getSyncMaps(): SyncMapList + { + return $this->proxy()->syncMaps; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Sync.V1.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/ServiceList.php b/app/api/Twilio/Rest/Sync/V1/ServiceList.php new file mode 100755 index 0000000..43fc792 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/ServiceList.php @@ -0,0 +1,202 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'WebhookUrl' => + $options['webhookUrl'], + 'ReachabilityWebhooksEnabled' => + Serialize::booleanToString($options['reachabilityWebhooksEnabled']), + 'AclEnabled' => + Serialize::booleanToString($options['aclEnabled']), + 'ReachabilityDebouncingEnabled' => + Serialize::booleanToString($options['reachabilityDebouncingEnabled']), + 'ReachabilityDebouncingWindow' => + $options['reachabilityDebouncingWindow'], + 'WebhooksFromRestEnabled' => + Serialize::booleanToString($options['webhooksFromRestEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The SID of the Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Sync/V1/ServiceOptions.php b/app/api/Twilio/Rest/Sync/V1/ServiceOptions.php new file mode 100755 index 0000000..e9d0938 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/ServiceOptions.php @@ -0,0 +1,350 @@ +options['friendlyName'] = $friendlyName; + $this->options['webhookUrl'] = $webhookUrl; + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + $this->options['aclEnabled'] = $aclEnabled; + $this->options['reachabilityDebouncingEnabled'] = $reachabilityDebouncingEnabled; + $this->options['reachabilityDebouncingWindow'] = $reachabilityDebouncingWindow; + $this->options['webhooksFromRestEnabled'] = $webhooksFromRestEnabled; + } + + /** + * A string that you assign to describe the resource. + * + * @param string $friendlyName A string that you assign to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL we should call when Sync objects are manipulated. + * + * @param string $webhookUrl The URL we should call when Sync objects are manipulated. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * Whether the service instance should call `webhook_url` when client endpoints connect to Sync. The default is `false`. + * + * @param bool $reachabilityWebhooksEnabled Whether the service instance should call `webhook_url` when client endpoints connect to Sync. The default is `false`. + * @return $this Fluent Builder + */ + public function setReachabilityWebhooksEnabled(bool $reachabilityWebhooksEnabled): self + { + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + return $this; + } + + /** + * Whether token identities in the Service must be granted access to Sync objects by using the [Permissions](https://www.twilio.com/docs/sync/api/sync-permissions) resource. + * + * @param bool $aclEnabled Whether token identities in the Service must be granted access to Sync objects by using the [Permissions](https://www.twilio.com/docs/sync/api/sync-permissions) resource. + * @return $this Fluent Builder + */ + public function setAclEnabled(bool $aclEnabled): self + { + $this->options['aclEnabled'] = $aclEnabled; + return $this; + } + + /** + * Whether every `endpoint_disconnected` event should occur after a configurable delay. The default is `false`, where the `endpoint_disconnected` event occurs immediately after disconnection. When `true`, intervening reconnections can prevent the `endpoint_disconnected` event. + * + * @param bool $reachabilityDebouncingEnabled Whether every `endpoint_disconnected` event should occur after a configurable delay. The default is `false`, where the `endpoint_disconnected` event occurs immediately after disconnection. When `true`, intervening reconnections can prevent the `endpoint_disconnected` event. + * @return $this Fluent Builder + */ + public function setReachabilityDebouncingEnabled(bool $reachabilityDebouncingEnabled): self + { + $this->options['reachabilityDebouncingEnabled'] = $reachabilityDebouncingEnabled; + return $this; + } + + /** + * The reachability event delay in milliseconds if `reachability_debouncing_enabled` = `true`. Must be between 1,000 and 30,000 and defaults to 5,000. This is the number of milliseconds after the last running client disconnects, and a Sync identity is declared offline, before the `webhook_url` is called if all endpoints remain offline. A reconnection from the same identity by any endpoint during this interval prevents the call to `webhook_url`. + * + * @param int $reachabilityDebouncingWindow The reachability event delay in milliseconds if `reachability_debouncing_enabled` = `true`. Must be between 1,000 and 30,000 and defaults to 5,000. This is the number of milliseconds after the last running client disconnects, and a Sync identity is declared offline, before the `webhook_url` is called if all endpoints remain offline. A reconnection from the same identity by any endpoint during this interval prevents the call to `webhook_url`. + * @return $this Fluent Builder + */ + public function setReachabilityDebouncingWindow(int $reachabilityDebouncingWindow): self + { + $this->options['reachabilityDebouncingWindow'] = $reachabilityDebouncingWindow; + return $this; + } + + /** + * Whether the Service instance should call `webhook_url` when the REST API is used to update Sync objects. The default is `false`. + * + * @param bool $webhooksFromRestEnabled Whether the Service instance should call `webhook_url` when the REST API is used to update Sync objects. The default is `false`. + * @return $this Fluent Builder + */ + public function setWebhooksFromRestEnabled(bool $webhooksFromRestEnabled): self + { + $this->options['webhooksFromRestEnabled'] = $webhooksFromRestEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param string $webhookUrl The URL we should call when Sync objects are manipulated. + * @param string $friendlyName A string that you assign to describe the resource. + * @param bool $reachabilityWebhooksEnabled Whether the service instance should call `webhook_url` when client endpoints connect to Sync. The default is `false`. + * @param bool $aclEnabled Whether token identities in the Service must be granted access to Sync objects by using the [Permissions](https://www.twilio.com/docs/sync/api/sync-permissions) resource. + * @param bool $reachabilityDebouncingEnabled Whether every `endpoint_disconnected` event should occur after a configurable delay. The default is `false`, where the `endpoint_disconnected` event occurs immediately after disconnection. When `true`, intervening reconnections can prevent the `endpoint_disconnected` event. + * @param int $reachabilityDebouncingWindow The reachability event delay in milliseconds if `reachability_debouncing_enabled` = `true`. Must be between 1,000 and 30,000 and defaults to 5,000. This is the number of milliseconds after the last running client disconnects, and a Sync identity is declared offline, before the webhook is called if all endpoints remain offline. A reconnection from the same identity by any endpoint during this interval prevents the webhook from being called. + * @param bool $webhooksFromRestEnabled Whether the Service instance should call `webhook_url` when the REST API is used to update Sync objects. The default is `false`. + */ + public function __construct( + + string $webhookUrl = Values::NONE, + string $friendlyName = Values::NONE, + bool $reachabilityWebhooksEnabled = Values::BOOL_NONE, + bool $aclEnabled = Values::BOOL_NONE, + bool $reachabilityDebouncingEnabled = Values::BOOL_NONE, + int $reachabilityDebouncingWindow = Values::INT_NONE, + bool $webhooksFromRestEnabled = Values::BOOL_NONE + + ) { + $this->options['webhookUrl'] = $webhookUrl; + $this->options['friendlyName'] = $friendlyName; + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + $this->options['aclEnabled'] = $aclEnabled; + $this->options['reachabilityDebouncingEnabled'] = $reachabilityDebouncingEnabled; + $this->options['reachabilityDebouncingWindow'] = $reachabilityDebouncingWindow; + $this->options['webhooksFromRestEnabled'] = $webhooksFromRestEnabled; + } + + /** + * The URL we should call when Sync objects are manipulated. + * + * @param string $webhookUrl The URL we should call when Sync objects are manipulated. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * A string that you assign to describe the resource. + * + * @param string $friendlyName A string that you assign to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether the service instance should call `webhook_url` when client endpoints connect to Sync. The default is `false`. + * + * @param bool $reachabilityWebhooksEnabled Whether the service instance should call `webhook_url` when client endpoints connect to Sync. The default is `false`. + * @return $this Fluent Builder + */ + public function setReachabilityWebhooksEnabled(bool $reachabilityWebhooksEnabled): self + { + $this->options['reachabilityWebhooksEnabled'] = $reachabilityWebhooksEnabled; + return $this; + } + + /** + * Whether token identities in the Service must be granted access to Sync objects by using the [Permissions](https://www.twilio.com/docs/sync/api/sync-permissions) resource. + * + * @param bool $aclEnabled Whether token identities in the Service must be granted access to Sync objects by using the [Permissions](https://www.twilio.com/docs/sync/api/sync-permissions) resource. + * @return $this Fluent Builder + */ + public function setAclEnabled(bool $aclEnabled): self + { + $this->options['aclEnabled'] = $aclEnabled; + return $this; + } + + /** + * Whether every `endpoint_disconnected` event should occur after a configurable delay. The default is `false`, where the `endpoint_disconnected` event occurs immediately after disconnection. When `true`, intervening reconnections can prevent the `endpoint_disconnected` event. + * + * @param bool $reachabilityDebouncingEnabled Whether every `endpoint_disconnected` event should occur after a configurable delay. The default is `false`, where the `endpoint_disconnected` event occurs immediately after disconnection. When `true`, intervening reconnections can prevent the `endpoint_disconnected` event. + * @return $this Fluent Builder + */ + public function setReachabilityDebouncingEnabled(bool $reachabilityDebouncingEnabled): self + { + $this->options['reachabilityDebouncingEnabled'] = $reachabilityDebouncingEnabled; + return $this; + } + + /** + * The reachability event delay in milliseconds if `reachability_debouncing_enabled` = `true`. Must be between 1,000 and 30,000 and defaults to 5,000. This is the number of milliseconds after the last running client disconnects, and a Sync identity is declared offline, before the webhook is called if all endpoints remain offline. A reconnection from the same identity by any endpoint during this interval prevents the webhook from being called. + * + * @param int $reachabilityDebouncingWindow The reachability event delay in milliseconds if `reachability_debouncing_enabled` = `true`. Must be between 1,000 and 30,000 and defaults to 5,000. This is the number of milliseconds after the last running client disconnects, and a Sync identity is declared offline, before the webhook is called if all endpoints remain offline. A reconnection from the same identity by any endpoint during this interval prevents the webhook from being called. + * @return $this Fluent Builder + */ + public function setReachabilityDebouncingWindow(int $reachabilityDebouncingWindow): self + { + $this->options['reachabilityDebouncingWindow'] = $reachabilityDebouncingWindow; + return $this; + } + + /** + * Whether the Service instance should call `webhook_url` when the REST API is used to update Sync objects. The default is `false`. + * + * @param bool $webhooksFromRestEnabled Whether the Service instance should call `webhook_url` when the REST API is used to update Sync objects. The default is `false`. + * @return $this Fluent Builder + */ + public function setWebhooksFromRestEnabled(bool $webhooksFromRestEnabled): self + { + $this->options['webhooksFromRestEnabled'] = $webhooksFromRestEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Sync.V1.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Sync/V1/ServicePage.php b/app/api/Twilio/Rest/Sync/V1/ServicePage.php new file mode 100755 index 0000000..8e7ca91 --- /dev/null +++ b/app/api/Twilio/Rest/Sync/V1/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Sync\V1\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Sync.V1.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/SyncBase.php b/app/api/Twilio/Rest/SyncBase.php new file mode 100755 index 0000000..ec071ba --- /dev/null +++ b/app/api/Twilio/Rest/SyncBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://sync.twilio.com'; + } + + + /** + * @return V1 Version v1 of sync + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Sync]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter.php b/app/api/Twilio/Rest/Taskrouter.php new file mode 100755 index 0000000..f400c0d --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter.php @@ -0,0 +1,24 @@ +workspaces instead. + */ + protected function getWorkspaces(): \Twilio\Rest\Taskrouter\V1\WorkspaceList { + echo "workspaces is deprecated. Use v1->workspaces instead."; + return $this->v1->workspaces; + } + + /** + * @deprecated Use v1->workspaces(\$sid) instead. + * @param string $sid The SID of the resource to fetch + */ + protected function contextWorkspaces(string $sid): \Twilio\Rest\Taskrouter\V1\WorkspaceContext { + echo "workspaces(\$sid) is deprecated. Use v1->workspaces(\$sid) instead."; + return $this->v1->workspaces($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Taskrouter/V1.php b/app/api/Twilio/Rest/Taskrouter/V1.php new file mode 100755 index 0000000..0deda2d --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getWorkspaces(): WorkspaceList + { + if (!$this->_workspaces) { + $this->_workspaces = new WorkspaceList($this); + } + return $this->_workspaces; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityContext.php new file mode 100755 index 0000000..213dd36 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityContext.php @@ -0,0 +1,130 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Activities/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ActivityInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ActivityInstance + * + * @return ActivityInstance Fetched ActivityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ActivityInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ActivityInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ActivityInstance + * + * @param array|Options $options Optional Arguments + * @return ActivityInstance Updated ActivityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ActivityInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ActivityInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ActivityContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityInstance.php new file mode 100755 index 0000000..783b337 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'available' => Values::array_get($payload, 'available'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ActivityContext Context for this ActivityInstance + */ + protected function proxy(): ActivityContext + { + if (!$this->context) { + $this->context = new ActivityContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ActivityInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ActivityInstance + * + * @return ActivityInstance Fetched ActivityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ActivityInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ActivityInstance + * + * @param array|Options $options Optional Arguments + * @return ActivityInstance Updated ActivityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ActivityInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ActivityInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityList.php new file mode 100755 index 0000000..8b7b021 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityList.php @@ -0,0 +1,209 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Activities'; + } + + /** + * Create the ActivityInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Activity resource. It can be up to 64 characters long. These names are used to calculate and expose statistics about Workers, and provide visibility into the state of each Worker. Examples of friendly names include: `on-call`, `break`, and `email`. + * @param array|Options $options Optional Arguments + * @return ActivityInstance Created ActivityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): ActivityInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Available' => + Serialize::booleanToString($options['available']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ActivityInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads ActivityInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ActivityInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ActivityInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ActivityInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ActivityPage Page of ActivityInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ActivityPage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Available' => + $options['available'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ActivityPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ActivityInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ActivityPage Page of ActivityInstance + */ + public function getPage(string $targetUrl): ActivityPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ActivityPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ActivityContext + * + * @param string $sid The SID of the Activity resource to delete. + */ + public function getContext( + string $sid + + ): ActivityContext + { + return new ActivityContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ActivityList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityOptions.php new file mode 100755 index 0000000..05924a8 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityOptions.php @@ -0,0 +1,202 @@ +options['available'] = $available; + } + + /** + * Whether the Worker should be eligible to receive a Task when it occupies the Activity. A value of `true`, `1`, or `yes` specifies the Activity is available. All other values specify that it is not. The value cannot be changed after the Activity is created. + * + * @param bool $available Whether the Worker should be eligible to receive a Task when it occupies the Activity. A value of `true`, `1`, or `yes` specifies the Activity is available. All other values specify that it is not. The value cannot be changed after the Activity is created. + * @return $this Fluent Builder + */ + public function setAvailable(bool $available): self + { + $this->options['available'] = $available; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateActivityOptions ' . $options . ']'; + } +} + + + +class ReadActivityOptions extends Options + { + /** + * @param string $friendlyName The `friendly_name` of the Activity resources to read. + * @param string $available Whether return only Activity resources that are available or unavailable. A value of `true` returns only available activities. Values of '1' or `yes` also indicate `true`. All other values represent `false` and return activities that are unavailable. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $available = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['available'] = $available; + } + + /** + * The `friendly_name` of the Activity resources to read. + * + * @param string $friendlyName The `friendly_name` of the Activity resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether return only Activity resources that are available or unavailable. A value of `true` returns only available activities. Values of '1' or `yes` also indicate `true`. All other values represent `false` and return activities that are unavailable. + * + * @param string $available Whether return only Activity resources that are available or unavailable. A value of `true` returns only available activities. Values of '1' or `yes` also indicate `true`. All other values represent `false` and return activities that are unavailable. + * @return $this Fluent Builder + */ + public function setAvailable(string $available): self + { + $this->options['available'] = $available; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadActivityOptions ' . $options . ']'; + } +} + +class UpdateActivityOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the Activity resource. It can be up to 64 characters long. These names are used to calculate and expose statistics about Workers, and provide visibility into the state of each Worker. Examples of friendly names include: `on-call`, `break`, and `email`. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the Activity resource. It can be up to 64 characters long. These names are used to calculate and expose statistics about Workers, and provide visibility into the state of each Worker. Examples of friendly names include: `on-call`, `break`, and `email`. + * + * @param string $friendlyName A descriptive string that you create to describe the Activity resource. It can be up to 64 characters long. These names are used to calculate and expose statistics about Workers, and provide visibility into the state of each Worker. Examples of friendly names include: `on-call`, `break`, and `email`. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateActivityOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityPage.php new file mode 100755 index 0000000..f2ca3cf --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/ActivityPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ActivityInstance \Twilio\Rest\Taskrouter\V1\Workspace\ActivityInstance + */ + public function buildInstance(array $payload): ActivityInstance + { + return new ActivityInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ActivityPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventContext.php new file mode 100755 index 0000000..f01329a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventContext.php @@ -0,0 +1,87 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Events/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EventInstance + * + * @return EventInstance Fetched EventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EventInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.EventContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventInstance.php new file mode 100755 index 0000000..a2b36c6 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'actorSid' => Values::array_get($payload, 'actor_sid'), + 'actorType' => Values::array_get($payload, 'actor_type'), + 'actorUrl' => Values::array_get($payload, 'actor_url'), + 'description' => Values::array_get($payload, 'description'), + 'eventData' => Values::array_get($payload, 'event_data'), + 'eventDate' => Deserialize::dateTime(Values::array_get($payload, 'event_date')), + 'eventDateMs' => Values::array_get($payload, 'event_date_ms'), + 'eventType' => Values::array_get($payload, 'event_type'), + 'resourceSid' => Values::array_get($payload, 'resource_sid'), + 'resourceType' => Values::array_get($payload, 'resource_type'), + 'resourceUrl' => Values::array_get($payload, 'resource_url'), + 'sid' => Values::array_get($payload, 'sid'), + 'source' => Values::array_get($payload, 'source'), + 'sourceIpAddress' => Values::array_get($payload, 'source_ip_address'), + 'url' => Values::array_get($payload, 'url'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EventContext Context for this EventInstance + */ + protected function proxy(): EventContext + { + if (!$this->context) { + $this->context = new EventContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EventInstance + * + * @return EventInstance Fetched EventInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EventInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.EventInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventList.php new file mode 100755 index 0000000..f371426 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventList.php @@ -0,0 +1,196 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Events'; + } + + /** + * Reads EventInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EventInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams EventInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EventInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EventPage Page of EventInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EventPage + { + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'EventType' => + $options['eventType'], + 'Minutes' => + $options['minutes'], + 'ReservationSid' => + $options['reservationSid'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskQueueSid' => + $options['taskQueueSid'], + 'TaskSid' => + $options['taskSid'], + 'WorkerSid' => + $options['workerSid'], + 'WorkflowSid' => + $options['workflowSid'], + 'TaskChannel' => + $options['taskChannel'], + 'Sid' => + $options['sid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EventPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EventInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EventPage Page of EventInstance + */ + public function getPage(string $targetUrl): EventPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EventPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EventContext + * + * @param string $sid The SID of the Event resource to fetch. + */ + public function getContext( + string $sid + + ): EventContext + { + return new EventContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.EventList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventOptions.php new file mode 100755 index 0000000..ef9afd4 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventOptions.php @@ -0,0 +1,258 @@ +options['endDate'] = $endDate; + $this->options['eventType'] = $eventType; + $this->options['minutes'] = $minutes; + $this->options['reservationSid'] = $reservationSid; + $this->options['startDate'] = $startDate; + $this->options['taskQueueSid'] = $taskQueueSid; + $this->options['taskSid'] = $taskSid; + $this->options['workerSid'] = $workerSid; + $this->options['workflowSid'] = $workflowSid; + $this->options['taskChannel'] = $taskChannel; + $this->options['sid'] = $sid; + } + + /** + * Only include Events that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only include Events that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * The type of Events to read. Returns only Events of the type specified. + * + * @param string $eventType The type of Events to read. Returns only Events of the type specified. + * @return $this Fluent Builder + */ + public function setEventType(string $eventType): self + { + $this->options['eventType'] = $eventType; + return $this; + } + + /** + * The period of events to read in minutes. Returns only Events that occurred since this many minutes in the past. The default is `15` minutes. Task Attributes for Events occuring more 43,200 minutes ago will be redacted. + * + * @param int $minutes The period of events to read in minutes. Returns only Events that occurred since this many minutes in the past. The default is `15` minutes. Task Attributes for Events occuring more 43,200 minutes ago will be redacted. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * The SID of the Reservation with the Events to read. Returns only Events that pertain to the specified Reservation. + * + * @param string $reservationSid The SID of the Reservation with the Events to read. Returns only Events that pertain to the specified Reservation. + * @return $this Fluent Builder + */ + public function setReservationSid(string $reservationSid): self + { + $this->options['reservationSid'] = $reservationSid; + return $this; + } + + /** + * Only include Events from on or after this date and time, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Task Attributes for Events older than 30 days will be redacted. + * + * @param \DateTime $startDate Only include Events from on or after this date and time, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Task Attributes for Events older than 30 days will be redacted. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * The SID of the TaskQueue with the Events to read. Returns only the Events that pertain to the specified TaskQueue. + * + * @param string $taskQueueSid The SID of the TaskQueue with the Events to read. Returns only the Events that pertain to the specified TaskQueue. + * @return $this Fluent Builder + */ + public function setTaskQueueSid(string $taskQueueSid): self + { + $this->options['taskQueueSid'] = $taskQueueSid; + return $this; + } + + /** + * The SID of the Task with the Events to read. Returns only the Events that pertain to the specified Task. + * + * @param string $taskSid The SID of the Task with the Events to read. Returns only the Events that pertain to the specified Task. + * @return $this Fluent Builder + */ + public function setTaskSid(string $taskSid): self + { + $this->options['taskSid'] = $taskSid; + return $this; + } + + /** + * The SID of the Worker with the Events to read. Returns only the Events that pertain to the specified Worker. + * + * @param string $workerSid The SID of the Worker with the Events to read. Returns only the Events that pertain to the specified Worker. + * @return $this Fluent Builder + */ + public function setWorkerSid(string $workerSid): self + { + $this->options['workerSid'] = $workerSid; + return $this; + } + + /** + * The SID of the Workflow with the Events to read. Returns only the Events that pertain to the specified Workflow. + * + * @param string $workflowSid The SID of the Workflow with the Events to read. Returns only the Events that pertain to the specified Workflow. + * @return $this Fluent Builder + */ + public function setWorkflowSid(string $workflowSid): self + { + $this->options['workflowSid'] = $workflowSid; + return $this; + } + + /** + * The TaskChannel with the Events to read. Returns only the Events that pertain to the specified TaskChannel. + * + * @param string $taskChannel The TaskChannel with the Events to read. Returns only the Events that pertain to the specified TaskChannel. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * The SID of the Event resource to read. + * + * @param string $sid The SID of the Event resource to read. + * @return $this Fluent Builder + */ + public function setSid(string $sid): self + { + $this->options['sid'] = $sid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadEventOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventPage.php new file mode 100755 index 0000000..ab7992e --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/EventPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EventInstance \Twilio\Rest\Taskrouter\V1\Workspace\EventInstance + */ + public function buildInstance(array $payload): EventInstance + { + return new EventInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.EventPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationContext.php new file mode 100755 index 0000000..880ec99 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationContext.php @@ -0,0 +1,231 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'taskSid' => + $taskSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Reservations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ReservationInstance + * + * @return ReservationInstance Fetched ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ReservationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ReservationInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ReservationInstance + * + * @param array|Options $options Optional Arguments + * @return ReservationInstance Updated ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ReservationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ReservationStatus' => + $options['reservationStatus'], + 'WorkerActivitySid' => + $options['workerActivitySid'], + 'Instruction' => + $options['instruction'], + 'DequeuePostWorkActivitySid' => + $options['dequeuePostWorkActivitySid'], + 'DequeueFrom' => + $options['dequeueFrom'], + 'DequeueRecord' => + $options['dequeueRecord'], + 'DequeueTimeout' => + $options['dequeueTimeout'], + 'DequeueTo' => + $options['dequeueTo'], + 'DequeueStatusCallbackUrl' => + $options['dequeueStatusCallbackUrl'], + 'CallFrom' => + $options['callFrom'], + 'CallRecord' => + $options['callRecord'], + 'CallTimeout' => + $options['callTimeout'], + 'CallTo' => + $options['callTo'], + 'CallUrl' => + $options['callUrl'], + 'CallStatusCallbackUrl' => + $options['callStatusCallbackUrl'], + 'CallAccept' => + Serialize::booleanToString($options['callAccept']), + 'RedirectCallSid' => + $options['redirectCallSid'], + 'RedirectAccept' => + Serialize::booleanToString($options['redirectAccept']), + 'RedirectUrl' => + $options['redirectUrl'], + 'To' => + $options['to'], + 'From' => + $options['from'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'StatusCallbackEvent' => + $options['statusCallbackEvent'], + 'Timeout' => + $options['timeout'], + 'Record' => + Serialize::booleanToString($options['record']), + 'Muted' => + Serialize::booleanToString($options['muted']), + 'Beep' => + $options['beep'], + 'StartConferenceOnEnter' => + Serialize::booleanToString($options['startConferenceOnEnter']), + 'EndConferenceOnExit' => + Serialize::booleanToString($options['endConferenceOnExit']), + 'WaitUrl' => + $options['waitUrl'], + 'WaitMethod' => + $options['waitMethod'], + 'EarlyMedia' => + Serialize::booleanToString($options['earlyMedia']), + 'MaxParticipants' => + $options['maxParticipants'], + 'ConferenceStatusCallback' => + $options['conferenceStatusCallback'], + 'ConferenceStatusCallbackMethod' => + $options['conferenceStatusCallbackMethod'], + 'ConferenceStatusCallbackEvent' => + $options['conferenceStatusCallbackEvent'], + 'ConferenceRecord' => + $options['conferenceRecord'], + 'ConferenceTrim' => + $options['conferenceTrim'], + 'RecordingChannels' => + $options['recordingChannels'], + 'RecordingStatusCallback' => + $options['recordingStatusCallback'], + 'RecordingStatusCallbackMethod' => + $options['recordingStatusCallbackMethod'], + 'ConferenceRecordingStatusCallback' => + $options['conferenceRecordingStatusCallback'], + 'ConferenceRecordingStatusCallbackMethod' => + $options['conferenceRecordingStatusCallbackMethod'], + 'Region' => + $options['region'], + 'SipAuthUsername' => + $options['sipAuthUsername'], + 'SipAuthPassword' => + $options['sipAuthPassword'], + 'DequeueStatusCallbackEvent' => + Serialize::map($options['dequeueStatusCallbackEvent'], function ($e) { return $e; }), + 'PostWorkActivitySid' => + $options['postWorkActivitySid'], + 'SupervisorMode' => + $options['supervisorMode'], + 'Supervisor' => + $options['supervisor'], + 'EndConferenceOnCustomerExit' => + Serialize::booleanToString($options['endConferenceOnCustomerExit']), + 'BeepOnCustomerEntrance' => + Serialize::booleanToString($options['beepOnCustomerEntrance']), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ReservationInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ReservationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationInstance.php new file mode 100755 index 0000000..977719e --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'reservationStatus' => Values::array_get($payload, 'reservation_status'), + 'sid' => Values::array_get($payload, 'sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'workerName' => Values::array_get($payload, 'worker_name'), + 'workerSid' => Values::array_get($payload, 'worker_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'taskSid' => $taskSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ReservationContext Context for this ReservationInstance + */ + protected function proxy(): ReservationContext + { + if (!$this->context) { + $this->context = new ReservationContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ReservationInstance + * + * @return ReservationInstance Fetched ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ReservationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ReservationInstance + * + * @param array|Options $options Optional Arguments + * @return ReservationInstance Updated ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ReservationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ReservationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationList.php new file mode 100755 index 0000000..e530469 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationList.php @@ -0,0 +1,184 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'taskSid' => + $taskSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Tasks/' . \rawurlencode($taskSid) + .'/Reservations'; + } + + /** + * Reads ReservationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ReservationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ReservationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ReservationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ReservationPage Page of ReservationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ReservationPage + { + $options = new Values($options); + + $params = Values::of([ + 'ReservationStatus' => + $options['reservationStatus'], + 'WorkerSid' => + $options['workerSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ReservationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ReservationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ReservationPage Page of ReservationInstance + */ + public function getPage(string $targetUrl): ReservationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ReservationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ReservationContext + * + * @param string $sid The SID of the TaskReservation resource to fetch. + */ + public function getContext( + string $sid + + ): ReservationContext + { + return new ReservationContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ReservationList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationOptions.php new file mode 100755 index 0000000..90e3121 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationOptions.php @@ -0,0 +1,1098 @@ +options['reservationStatus'] = $reservationStatus; + $this->options['workerSid'] = $workerSid; + } + + /** + * Returns the list of reservations for a task with a specified ReservationStatus. Can be: `pending`, `accepted`, `rejected`, or `timeout`. + * + * @param string $reservationStatus Returns the list of reservations for a task with a specified ReservationStatus. Can be: `pending`, `accepted`, `rejected`, or `timeout`. + * @return $this Fluent Builder + */ + public function setReservationStatus(string $reservationStatus): self + { + $this->options['reservationStatus'] = $reservationStatus; + return $this; + } + + /** + * The SID of the reserved Worker resource to read. + * + * @param string $workerSid The SID of the reserved Worker resource to read. + * @return $this Fluent Builder + */ + public function setWorkerSid(string $workerSid): self + { + $this->options['workerSid'] = $workerSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadReservationOptions ' . $options . ']'; + } +} + +class UpdateReservationOptions extends Options + { + /** + * @param string $reservationStatus + * @param string $workerActivitySid The new worker activity SID if rejecting a reservation. + * @param string $instruction The assignment instruction for reservation. + * @param string $dequeuePostWorkActivitySid The SID of the Activity resource to start after executing a Dequeue instruction. + * @param string $dequeueFrom The Caller ID of the call to the worker when executing a Dequeue instruction. + * @param string $dequeueRecord Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * @param int $dequeueTimeout Timeout for call when executing a Dequeue instruction. + * @param string $dequeueTo The Contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $dequeueStatusCallbackUrl The Callback URL for completed call event when executing a Dequeue instruction. + * @param string $callFrom The Caller ID of the outbound call when executing a Call instruction. + * @param string $callRecord Whether to record both legs of a call when executing a Call instruction or which leg to record. + * @param int $callTimeout Timeout for call when executing a Call instruction. + * @param string $callTo The Contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $callUrl TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * @param string $callStatusCallbackUrl The URL to call for the completed call event when executing a Call instruction. + * @param bool $callAccept Whether to accept a reservation when executing a Call instruction. + * @param string $redirectCallSid The Call SID of the call parked in the queue when executing a Redirect instruction. + * @param bool $redirectAccept Whether the reservation should be accepted when executing a Redirect instruction. + * @param string $redirectUrl TwiML URI to redirect the call to when executing the Redirect instruction. + * @param string $to The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $from The Caller ID of the call to the worker when executing a Conference instruction. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @param string $statusCallbackEvent The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * @param int $timeout Timeout for call when executing a Conference instruction. + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. The default is `false`. + * @param bool $muted Whether the agent is muted in the conference. The default is `false`. + * @param string $beep Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. The default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @param bool $endConferenceOnExit Whether to end the conference when the agent leaves. + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * @param int $maxParticipants The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $conferenceStatusCallbackEvent The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * @param string $conferenceRecord Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @param string $conferenceTrim How to trim the leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @param string $sipAuthUsername The SIP username used for authentication. + * @param string $sipAuthPassword The SIP password for authentication. + * @param string[] $dequeueStatusCallbackEvent The Call progress events sent via webhooks as a result of a Dequeue instruction. + * @param string $postWorkActivitySid The new worker activity SID after executing a Conference instruction. + * @param string $supervisorMode + * @param string $supervisor The Supervisor SID/URI when executing the Supervise instruction. + * @param bool $endConferenceOnCustomerExit Whether to end the conference when the customer leaves. + * @param bool $beepOnCustomerEntrance Whether to play a notification beep when the customer joins. + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $reservationStatus = Values::NONE, + string $workerActivitySid = Values::NONE, + string $instruction = Values::NONE, + string $dequeuePostWorkActivitySid = Values::NONE, + string $dequeueFrom = Values::NONE, + string $dequeueRecord = Values::NONE, + int $dequeueTimeout = Values::INT_NONE, + string $dequeueTo = Values::NONE, + string $dequeueStatusCallbackUrl = Values::NONE, + string $callFrom = Values::NONE, + string $callRecord = Values::NONE, + int $callTimeout = Values::INT_NONE, + string $callTo = Values::NONE, + string $callUrl = Values::NONE, + string $callStatusCallbackUrl = Values::NONE, + bool $callAccept = Values::BOOL_NONE, + string $redirectCallSid = Values::NONE, + bool $redirectAccept = Values::BOOL_NONE, + string $redirectUrl = Values::NONE, + string $to = Values::NONE, + string $from = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + array $statusCallbackEvent = Values::ARRAY_NONE, + int $timeout = Values::INT_NONE, + bool $record = Values::BOOL_NONE, + bool $muted = Values::BOOL_NONE, + string $beep = Values::NONE, + bool $startConferenceOnEnter = Values::BOOL_NONE, + bool $endConferenceOnExit = Values::BOOL_NONE, + string $waitUrl = Values::NONE, + string $waitMethod = Values::NONE, + bool $earlyMedia = Values::BOOL_NONE, + int $maxParticipants = Values::INT_NONE, + string $conferenceStatusCallback = Values::NONE, + string $conferenceStatusCallbackMethod = Values::NONE, + array $conferenceStatusCallbackEvent = Values::ARRAY_NONE, + string $conferenceRecord = Values::NONE, + string $conferenceTrim = Values::NONE, + string $recordingChannels = Values::NONE, + string $recordingStatusCallback = Values::NONE, + string $recordingStatusCallbackMethod = Values::NONE, + string $conferenceRecordingStatusCallback = Values::NONE, + string $conferenceRecordingStatusCallbackMethod = Values::NONE, + string $region = Values::NONE, + string $sipAuthUsername = Values::NONE, + string $sipAuthPassword = Values::NONE, + array $dequeueStatusCallbackEvent = Values::ARRAY_NONE, + string $postWorkActivitySid = Values::NONE, + string $supervisorMode = Values::NONE, + string $supervisor = Values::NONE, + bool $endConferenceOnCustomerExit = Values::BOOL_NONE, + bool $beepOnCustomerEntrance = Values::BOOL_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['reservationStatus'] = $reservationStatus; + $this->options['workerActivitySid'] = $workerActivitySid; + $this->options['instruction'] = $instruction; + $this->options['dequeuePostWorkActivitySid'] = $dequeuePostWorkActivitySid; + $this->options['dequeueFrom'] = $dequeueFrom; + $this->options['dequeueRecord'] = $dequeueRecord; + $this->options['dequeueTimeout'] = $dequeueTimeout; + $this->options['dequeueTo'] = $dequeueTo; + $this->options['dequeueStatusCallbackUrl'] = $dequeueStatusCallbackUrl; + $this->options['callFrom'] = $callFrom; + $this->options['callRecord'] = $callRecord; + $this->options['callTimeout'] = $callTimeout; + $this->options['callTo'] = $callTo; + $this->options['callUrl'] = $callUrl; + $this->options['callStatusCallbackUrl'] = $callStatusCallbackUrl; + $this->options['callAccept'] = $callAccept; + $this->options['redirectCallSid'] = $redirectCallSid; + $this->options['redirectAccept'] = $redirectAccept; + $this->options['redirectUrl'] = $redirectUrl; + $this->options['to'] = $to; + $this->options['from'] = $from; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + $this->options['timeout'] = $timeout; + $this->options['record'] = $record; + $this->options['muted'] = $muted; + $this->options['beep'] = $beep; + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + $this->options['waitUrl'] = $waitUrl; + $this->options['waitMethod'] = $waitMethod; + $this->options['earlyMedia'] = $earlyMedia; + $this->options['maxParticipants'] = $maxParticipants; + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + $this->options['conferenceRecord'] = $conferenceRecord; + $this->options['conferenceTrim'] = $conferenceTrim; + $this->options['recordingChannels'] = $recordingChannels; + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + $this->options['region'] = $region; + $this->options['sipAuthUsername'] = $sipAuthUsername; + $this->options['sipAuthPassword'] = $sipAuthPassword; + $this->options['dequeueStatusCallbackEvent'] = $dequeueStatusCallbackEvent; + $this->options['postWorkActivitySid'] = $postWorkActivitySid; + $this->options['supervisorMode'] = $supervisorMode; + $this->options['supervisor'] = $supervisor; + $this->options['endConferenceOnCustomerExit'] = $endConferenceOnCustomerExit; + $this->options['beepOnCustomerEntrance'] = $beepOnCustomerEntrance; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * @param string $reservationStatus + * @return $this Fluent Builder + */ + public function setReservationStatus(string $reservationStatus): self + { + $this->options['reservationStatus'] = $reservationStatus; + return $this; + } + + /** + * The new worker activity SID if rejecting a reservation. + * + * @param string $workerActivitySid The new worker activity SID if rejecting a reservation. + * @return $this Fluent Builder + */ + public function setWorkerActivitySid(string $workerActivitySid): self + { + $this->options['workerActivitySid'] = $workerActivitySid; + return $this; + } + + /** + * The assignment instruction for reservation. + * + * @param string $instruction The assignment instruction for reservation. + * @return $this Fluent Builder + */ + public function setInstruction(string $instruction): self + { + $this->options['instruction'] = $instruction; + return $this; + } + + /** + * The SID of the Activity resource to start after executing a Dequeue instruction. + * + * @param string $dequeuePostWorkActivitySid The SID of the Activity resource to start after executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeuePostWorkActivitySid(string $dequeuePostWorkActivitySid): self + { + $this->options['dequeuePostWorkActivitySid'] = $dequeuePostWorkActivitySid; + return $this; + } + + /** + * The Caller ID of the call to the worker when executing a Dequeue instruction. + * + * @param string $dequeueFrom The Caller ID of the call to the worker when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueFrom(string $dequeueFrom): self + { + $this->options['dequeueFrom'] = $dequeueFrom; + return $this; + } + + /** + * Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * + * @param string $dequeueRecord Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * @return $this Fluent Builder + */ + public function setDequeueRecord(string $dequeueRecord): self + { + $this->options['dequeueRecord'] = $dequeueRecord; + return $this; + } + + /** + * Timeout for call when executing a Dequeue instruction. + * + * @param int $dequeueTimeout Timeout for call when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueTimeout(int $dequeueTimeout): self + { + $this->options['dequeueTimeout'] = $dequeueTimeout; + return $this; + } + + /** + * The Contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $dequeueTo The Contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setDequeueTo(string $dequeueTo): self + { + $this->options['dequeueTo'] = $dequeueTo; + return $this; + } + + /** + * The Callback URL for completed call event when executing a Dequeue instruction. + * + * @param string $dequeueStatusCallbackUrl The Callback URL for completed call event when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueStatusCallbackUrl(string $dequeueStatusCallbackUrl): self + { + $this->options['dequeueStatusCallbackUrl'] = $dequeueStatusCallbackUrl; + return $this; + } + + /** + * The Caller ID of the outbound call when executing a Call instruction. + * + * @param string $callFrom The Caller ID of the outbound call when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallFrom(string $callFrom): self + { + $this->options['callFrom'] = $callFrom; + return $this; + } + + /** + * Whether to record both legs of a call when executing a Call instruction or which leg to record. + * + * @param string $callRecord Whether to record both legs of a call when executing a Call instruction or which leg to record. + * @return $this Fluent Builder + */ + public function setCallRecord(string $callRecord): self + { + $this->options['callRecord'] = $callRecord; + return $this; + } + + /** + * Timeout for call when executing a Call instruction. + * + * @param int $callTimeout Timeout for call when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallTimeout(int $callTimeout): self + { + $this->options['callTimeout'] = $callTimeout; + return $this; + } + + /** + * The Contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $callTo The Contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setCallTo(string $callTo): self + { + $this->options['callTo'] = $callTo; + return $this; + } + + /** + * TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * + * @param string $callUrl TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * @return $this Fluent Builder + */ + public function setCallUrl(string $callUrl): self + { + $this->options['callUrl'] = $callUrl; + return $this; + } + + /** + * The URL to call for the completed call event when executing a Call instruction. + * + * @param string $callStatusCallbackUrl The URL to call for the completed call event when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallStatusCallbackUrl(string $callStatusCallbackUrl): self + { + $this->options['callStatusCallbackUrl'] = $callStatusCallbackUrl; + return $this; + } + + /** + * Whether to accept a reservation when executing a Call instruction. + * + * @param bool $callAccept Whether to accept a reservation when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallAccept(bool $callAccept): self + { + $this->options['callAccept'] = $callAccept; + return $this; + } + + /** + * The Call SID of the call parked in the queue when executing a Redirect instruction. + * + * @param string $redirectCallSid The Call SID of the call parked in the queue when executing a Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectCallSid(string $redirectCallSid): self + { + $this->options['redirectCallSid'] = $redirectCallSid; + return $this; + } + + /** + * Whether the reservation should be accepted when executing a Redirect instruction. + * + * @param bool $redirectAccept Whether the reservation should be accepted when executing a Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectAccept(bool $redirectAccept): self + { + $this->options['redirectAccept'] = $redirectAccept; + return $this; + } + + /** + * TwiML URI to redirect the call to when executing the Redirect instruction. + * + * @param string $redirectUrl TwiML URI to redirect the call to when executing the Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectUrl(string $redirectUrl): self + { + $this->options['redirectUrl'] = $redirectUrl; + return $this; + } + + /** + * The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $to The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * The Caller ID of the call to the worker when executing a Conference instruction. + * + * @param string $from The Caller ID of the call to the worker when executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * + * @param string $statusCallbackEvent The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * @return $this Fluent Builder + */ + public function setStatusCallbackEvent(array $statusCallbackEvent): self + { + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + return $this; + } + + /** + * Timeout for call when executing a Conference instruction. + * + * @param int $timeout Timeout for call when executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * Whether to record the participant and their conferences, including the time between conferences. The default is `false`. + * + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. The default is `false`. + * @return $this Fluent Builder + */ + public function setRecord(bool $record): self + { + $this->options['record'] = $record; + return $this; + } + + /** + * Whether the agent is muted in the conference. The default is `false`. + * + * @param bool $muted Whether the agent is muted in the conference. The default is `false`. + * @return $this Fluent Builder + */ + public function setMuted(bool $muted): self + { + $this->options['muted'] = $muted; + return $this; + } + + /** + * Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * + * @param string $beep Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @return $this Fluent Builder + */ + public function setBeep(string $beep): self + { + $this->options['beep'] = $beep; + return $this; + } + + /** + * Whether to start the conference when the participant joins, if it has not already started. The default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. The default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @return $this Fluent Builder + */ + public function setStartConferenceOnEnter(bool $startConferenceOnEnter): self + { + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + return $this; + } + + /** + * Whether to end the conference when the agent leaves. + * + * @param bool $endConferenceOnExit Whether to end the conference when the agent leaves. + * @return $this Fluent Builder + */ + public function setEndConferenceOnExit(bool $endConferenceOnExit): self + { + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + return $this; + } + + /** + * The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @return $this Fluent Builder + */ + public function setWaitUrl(string $waitUrl): self + { + $this->options['waitUrl'] = $waitUrl; + return $this; + } + + /** + * The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @return $this Fluent Builder + */ + public function setWaitMethod(string $waitMethod): self + { + $this->options['waitMethod'] = $waitMethod; + return $this; + } + + /** + * Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * @return $this Fluent Builder + */ + public function setEarlyMedia(bool $earlyMedia): self + { + $this->options['earlyMedia'] = $earlyMedia; + return $this; + } + + /** + * The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * + * @param int $maxParticipants The maximum number of participants in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @return $this Fluent Builder + */ + public function setMaxParticipants(int $maxParticipants): self + { + $this->options['maxParticipants'] = $maxParticipants; + return $this; + } + + /** + * The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallback(string $conferenceStatusCallback): self + { + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackMethod(string $conferenceStatusCallbackMethod): self + { + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + return $this; + } + + /** + * The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * + * @param string $conferenceStatusCallbackEvent The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackEvent(array $conferenceStatusCallbackEvent): self + { + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + return $this; + } + + /** + * Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * + * @param string $conferenceRecord Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @return $this Fluent Builder + */ + public function setConferenceRecord(string $conferenceRecord): self + { + $this->options['conferenceRecord'] = $conferenceRecord; + return $this; + } + + /** + * How to trim the leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * + * @param string $conferenceTrim How to trim the leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @return $this Fluent Builder + */ + public function setConferenceTrim(string $conferenceTrim): self + { + $this->options['conferenceTrim'] = $conferenceTrim; + return $this; + } + + /** + * The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @return $this Fluent Builder + */ + public function setRecordingChannels(string $recordingChannels): self + { + $this->options['recordingChannels'] = $recordingChannels; + return $this; + } + + /** + * The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallback(string $recordingStatusCallback): self + { + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackMethod(string $recordingStatusCallbackMethod): self + { + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + return $this; + } + + /** + * The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallback(string $conferenceRecordingStatusCallback): self + { + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallbackMethod(string $conferenceRecordingStatusCallbackMethod): self + { + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + return $this; + } + + /** + * The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @return $this Fluent Builder + */ + public function setRegion(string $region): self + { + $this->options['region'] = $region; + return $this; + } + + /** + * The SIP username used for authentication. + * + * @param string $sipAuthUsername The SIP username used for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthUsername(string $sipAuthUsername): self + { + $this->options['sipAuthUsername'] = $sipAuthUsername; + return $this; + } + + /** + * The SIP password for authentication. + * + * @param string $sipAuthPassword The SIP password for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthPassword(string $sipAuthPassword): self + { + $this->options['sipAuthPassword'] = $sipAuthPassword; + return $this; + } + + /** + * The Call progress events sent via webhooks as a result of a Dequeue instruction. + * + * @param string[] $dequeueStatusCallbackEvent The Call progress events sent via webhooks as a result of a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueStatusCallbackEvent(array $dequeueStatusCallbackEvent): self + { + $this->options['dequeueStatusCallbackEvent'] = $dequeueStatusCallbackEvent; + return $this; + } + + /** + * The new worker activity SID after executing a Conference instruction. + * + * @param string $postWorkActivitySid The new worker activity SID after executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setPostWorkActivitySid(string $postWorkActivitySid): self + { + $this->options['postWorkActivitySid'] = $postWorkActivitySid; + return $this; + } + + /** + * @param string $supervisorMode + * @return $this Fluent Builder + */ + public function setSupervisorMode(string $supervisorMode): self + { + $this->options['supervisorMode'] = $supervisorMode; + return $this; + } + + /** + * The Supervisor SID/URI when executing the Supervise instruction. + * + * @param string $supervisor The Supervisor SID/URI when executing the Supervise instruction. + * @return $this Fluent Builder + */ + public function setSupervisor(string $supervisor): self + { + $this->options['supervisor'] = $supervisor; + return $this; + } + + /** + * Whether to end the conference when the customer leaves. + * + * @param bool $endConferenceOnCustomerExit Whether to end the conference when the customer leaves. + * @return $this Fluent Builder + */ + public function setEndConferenceOnCustomerExit(bool $endConferenceOnCustomerExit): self + { + $this->options['endConferenceOnCustomerExit'] = $endConferenceOnCustomerExit; + return $this; + } + + /** + * Whether to play a notification beep when the customer joins. + * + * @param bool $beepOnCustomerEntrance Whether to play a notification beep when the customer joins. + * @return $this Fluent Builder + */ + public function setBeepOnCustomerEntrance(bool $beepOnCustomerEntrance): self + { + $this->options['beepOnCustomerEntrance'] = $beepOnCustomerEntrance; + return $this; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateReservationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationPage.php new file mode 100755 index 0000000..e37398b --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Task/ReservationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ReservationInstance \Twilio\Rest\Taskrouter\V1\Workspace\Task\ReservationInstance + */ + public function buildInstance(array $payload): ReservationInstance + { + return new ReservationInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['taskSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ReservationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelContext.php new file mode 100755 index 0000000..e6b7626 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelContext.php @@ -0,0 +1,133 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskChannels/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TaskChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TaskChannelInstance + * + * @return TaskChannelInstance Fetched TaskChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskChannelInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TaskChannelInstance + * + * @param array|Options $options Optional Arguments + * @return TaskChannelInstance Updated TaskChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'ChannelOptimizedRouting' => + Serialize::booleanToString($options['channelOptimizedRouting']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskChannelInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelInstance.php new file mode 100755 index 0000000..997a57b --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'channelOptimizedRouting' => Values::array_get($payload, 'channel_optimized_routing'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskChannelContext Context for this TaskChannelInstance + */ + protected function proxy(): TaskChannelContext + { + if (!$this->context) { + $this->context = new TaskChannelContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TaskChannelInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TaskChannelInstance + * + * @return TaskChannelInstance Fetched TaskChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskChannelInstance + * + * @param array|Options $options Optional Arguments + * @return TaskChannelInstance Updated TaskChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelList.php new file mode 100755 index 0000000..6acaeb1 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelList.php @@ -0,0 +1,204 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskChannels'; + } + + /** + * Create the TaskChannelInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Task Channel. It can be up to 64 characters long. + * @param string $uniqueName An application-defined string that uniquely identifies the Task Channel, such as `voice` or `sms`. + * @param array|Options $options Optional Arguments + * @return TaskChannelInstance Created TaskChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $uniqueName, array $options = []): TaskChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'UniqueName' => + $uniqueName, + 'ChannelOptimizedRouting' => + Serialize::booleanToString($options['channelOptimizedRouting']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TaskChannelInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads TaskChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TaskChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskChannelPage Page of TaskChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskChannelPage Page of TaskChannelInstance + */ + public function getPage(string $targetUrl): TaskChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TaskChannelContext + * + * @param string $sid The SID of the Task Channel resource to delete. + */ + public function getContext( + string $sid + + ): TaskChannelContext + { + return new TaskChannelContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelOptions.php new file mode 100755 index 0000000..79bac30 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelOptions.php @@ -0,0 +1,152 @@ +options['channelOptimizedRouting'] = $channelOptimizedRouting; + } + + /** + * Whether the Task Channel should prioritize Workers that have been idle. If `true`, Workers that have been idle the longest are prioritized. + * + * @param bool $channelOptimizedRouting Whether the Task Channel should prioritize Workers that have been idle. If `true`, Workers that have been idle the longest are prioritized. + * @return $this Fluent Builder + */ + public function setChannelOptimizedRouting(bool $channelOptimizedRouting): self + { + $this->options['channelOptimizedRouting'] = $channelOptimizedRouting; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateTaskChannelOptions ' . $options . ']'; + } +} + + + + +class UpdateTaskChannelOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the Task Channel. It can be up to 64 characters long. + * @param bool $channelOptimizedRouting Whether the TaskChannel should prioritize Workers that have been idle. If `true`, Workers that have been idle the longest are prioritized. + */ + public function __construct( + + string $friendlyName = Values::NONE, + bool $channelOptimizedRouting = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['channelOptimizedRouting'] = $channelOptimizedRouting; + } + + /** + * A descriptive string that you create to describe the Task Channel. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the Task Channel. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether the TaskChannel should prioritize Workers that have been idle. If `true`, Workers that have been idle the longest are prioritized. + * + * @param bool $channelOptimizedRouting Whether the TaskChannel should prioritize Workers that have been idle. If `true`, Workers that have been idle the longest are prioritized. + * @return $this Fluent Builder + */ + public function setChannelOptimizedRouting(bool $channelOptimizedRouting): self + { + $this->options['channelOptimizedRouting'] = $channelOptimizedRouting; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateTaskChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelPage.php new file mode 100755 index 0000000..280fda6 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskChannelInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskChannelInstance + */ + public function buildInstance(array $payload): TaskChannelInstance + { + return new TaskChannelInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskContext.php new file mode 100755 index 0000000..1b54f27 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskContext.php @@ -0,0 +1,204 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Tasks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Attributes' => + $options['attributes'], + 'AssignmentStatus' => + $options['assignmentStatus'], + 'Reason' => + $options['reason'], + 'Priority' => + $options['priority'], + 'TaskChannel' => + $options['taskChannel'], + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the reservations + */ + protected function getReservations(): ReservationList + { + if (!$this->_reservations) { + $this->_reservations = new ReservationList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_reservations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskInstance.php new file mode 100755 index 0000000..35917b4 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskInstance.php @@ -0,0 +1,196 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'age' => Values::array_get($payload, 'age'), + 'assignmentStatus' => Values::array_get($payload, 'assignment_status'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'addons' => Values::array_get($payload, 'addons'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'taskQueueEnteredDate' => Deserialize::dateTime(Values::array_get($payload, 'task_queue_entered_date')), + 'priority' => Values::array_get($payload, 'priority'), + 'reason' => Values::array_get($payload, 'reason'), + 'sid' => Values::array_get($payload, 'sid'), + 'taskQueueSid' => Values::array_get($payload, 'task_queue_sid'), + 'taskQueueFriendlyName' => Values::array_get($payload, 'task_queue_friendly_name'), + 'taskChannelSid' => Values::array_get($payload, 'task_channel_sid'), + 'taskChannelUniqueName' => Values::array_get($payload, 'task_channel_unique_name'), + 'timeout' => Values::array_get($payload, 'timeout'), + 'workflowSid' => Values::array_get($payload, 'workflow_sid'), + 'workflowFriendlyName' => Values::array_get($payload, 'workflow_friendly_name'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskContext Context for this TaskInstance + */ + protected function proxy(): TaskContext + { + if (!$this->context) { + $this->context = new TaskContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the TaskInstance + * + * @return TaskInstance Fetched TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Updated TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the reservations + */ + protected function getReservations(): ReservationList + { + return $this->proxy()->reservations; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskList.php new file mode 100755 index 0000000..eae1a4c --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskList.php @@ -0,0 +1,228 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Tasks'; + } + + /** + * Create the TaskInstance + * + * @param array|Options $options Optional Arguments + * @return TaskInstance Created TaskInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): TaskInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Timeout' => + $options['timeout'], + 'Priority' => + $options['priority'], + 'TaskChannel' => + $options['taskChannel'], + 'WorkflowSid' => + $options['workflowSid'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TaskInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads TaskInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TaskInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskPage Page of TaskInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskPage + { + $options = new Values($options); + + $params = Values::of([ + 'Priority' => + $options['priority'], + 'AssignmentStatus' => + Serialize::map($options['assignmentStatus'], function ($e) { return $e; }), + 'WorkflowSid' => + $options['workflowSid'], + 'WorkflowName' => + $options['workflowName'], + 'TaskQueueSid' => + $options['taskQueueSid'], + 'TaskQueueName' => + $options['taskQueueName'], + 'EvaluateTaskAttributes' => + $options['evaluateTaskAttributes'], + 'Ordering' => + $options['ordering'], + 'HasAddons' => + Serialize::booleanToString($options['hasAddons']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskPage Page of TaskInstance + */ + public function getPage(string $targetUrl): TaskPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TaskContext + * + * @param string $sid The SID of the Task resource to delete. + */ + public function getContext( + string $sid + + ): TaskContext + { + return new TaskContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskOptions.php new file mode 100755 index 0000000..e8b4af8 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskOptions.php @@ -0,0 +1,538 @@ +options['timeout'] = $timeout; + $this->options['priority'] = $priority; + $this->options['taskChannel'] = $taskChannel; + $this->options['workflowSid'] = $workflowSid; + $this->options['attributes'] = $attributes; + } + + /** + * The amount of time in seconds the new task can live before being assigned. Can be up to a maximum of 2 weeks (1,209,600 seconds). The default value is 24 hours (86,400 seconds). On timeout, the `task.canceled` event will fire with description `Task TTL Exceeded`. + * + * @param int $timeout The amount of time in seconds the new task can live before being assigned. Can be up to a maximum of 2 weeks (1,209,600 seconds). The default value is 24 hours (86,400 seconds). On timeout, the `task.canceled` event will fire with description `Task TTL Exceeded`. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * The priority to assign the new task and override the default. When supplied, the new Task will have this priority unless it matches a Workflow Target with a Priority set. When not supplied, the new Task will have the priority of the matching Workflow Target. Value can be 0 to 2^31^ (2,147,483,647). + * + * @param int $priority The priority to assign the new task and override the default. When supplied, the new Task will have this priority unless it matches a Workflow Target with a Priority set. When not supplied, the new Task will have the priority of the matching Workflow Target. Value can be 0 to 2^31^ (2,147,483,647). + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * When MultiTasking is enabled, specify the TaskChannel by passing either its `unique_name` or `sid`. Default value is `default`. + * + * @param string $taskChannel When MultiTasking is enabled, specify the TaskChannel by passing either its `unique_name` or `sid`. Default value is `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * The SID of the Workflow that you would like to handle routing for the new Task. If there is only one Workflow defined for the Workspace that you are posting the new task to, this parameter is optional. + * + * @param string $workflowSid The SID of the Workflow that you would like to handle routing for the new Task. If there is only one Workflow defined for the Workspace that you are posting the new task to, this parameter is optional. + * @return $this Fluent Builder + */ + public function setWorkflowSid(string $workflowSid): self + { + $this->options['workflowSid'] = $workflowSid; + return $this; + } + + /** + * A URL-encoded JSON string with the attributes of the new task. This value is passed to the Workflow's `assignment_callback_url` when the Task is assigned to a Worker. For example: `{ \\\"task_type\\\": \\\"call\\\", \\\"twilio_call_sid\\\": \\\"CAxxx\\\", \\\"customer_ticket_number\\\": \\\"12345\\\" }`. + * + * @param string $attributes A URL-encoded JSON string with the attributes of the new task. This value is passed to the Workflow's `assignment_callback_url` when the Task is assigned to a Worker. For example: `{ \\\"task_type\\\": \\\"call\\\", \\\"twilio_call_sid\\\": \\\"CAxxx\\\", \\\"customer_ticket_number\\\": \\\"12345\\\" }`. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateTaskOptions ' . $options . ']'; + } +} + +class DeleteTaskOptions extends Options + { + /** + * @param string $ifMatch If provided, deletes this Task if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * If provided, deletes this Task if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, deletes this Task if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.DeleteTaskOptions ' . $options . ']'; + } +} + + +class ReadTaskOptions extends Options + { + /** + * @param int $priority The priority value of the Tasks to read. Returns the list of all Tasks in the Workspace with the specified priority. + * @param string[] $assignmentStatus The `assignment_status` of the Tasks you want to read. Can be: `pending`, `reserved`, `assigned`, `canceled`, `wrapping`, or `completed`. Returns all Tasks in the Workspace with the specified `assignment_status`. + * @param string $workflowSid The SID of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this SID. + * @param string $workflowName The friendly name of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this friendly name. + * @param string $taskQueueSid The SID of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this SID. + * @param string $taskQueueName The `friendly_name` of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this friendly name. + * @param string $evaluateTaskAttributes The attributes of the Tasks to read. Returns the Tasks that match the attributes specified in this parameter. + * @param string $ordering How to order the returned Task resources. y default, Tasks are sorted by ascending DateCreated. This value is specified as: `Attribute:Order`, where `Attribute` can be either `Priority` or `DateCreated` and `Order` can be either `asc` or `desc`. For example, `Priority:desc` returns Tasks ordered in descending order of their Priority. Multiple sort orders can be specified in a comma-separated list such as `Priority:desc,DateCreated:asc`, which returns the Tasks in descending Priority order and ascending DateCreated Order. + * @param bool $hasAddons Whether to read Tasks with addons. If `true`, returns only Tasks with addons. If `false`, returns only Tasks without addons. + */ + public function __construct( + + int $priority = Values::INT_NONE, + array $assignmentStatus = Values::ARRAY_NONE, + string $workflowSid = Values::NONE, + string $workflowName = Values::NONE, + string $taskQueueSid = Values::NONE, + string $taskQueueName = Values::NONE, + string $evaluateTaskAttributes = Values::NONE, + string $ordering = Values::NONE, + bool $hasAddons = Values::BOOL_NONE + + ) { + $this->options['priority'] = $priority; + $this->options['assignmentStatus'] = $assignmentStatus; + $this->options['workflowSid'] = $workflowSid; + $this->options['workflowName'] = $workflowName; + $this->options['taskQueueSid'] = $taskQueueSid; + $this->options['taskQueueName'] = $taskQueueName; + $this->options['evaluateTaskAttributes'] = $evaluateTaskAttributes; + $this->options['ordering'] = $ordering; + $this->options['hasAddons'] = $hasAddons; + } + + /** + * The priority value of the Tasks to read. Returns the list of all Tasks in the Workspace with the specified priority. + * + * @param int $priority The priority value of the Tasks to read. Returns the list of all Tasks in the Workspace with the specified priority. + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * The `assignment_status` of the Tasks you want to read. Can be: `pending`, `reserved`, `assigned`, `canceled`, `wrapping`, or `completed`. Returns all Tasks in the Workspace with the specified `assignment_status`. + * + * @param string[] $assignmentStatus The `assignment_status` of the Tasks you want to read. Can be: `pending`, `reserved`, `assigned`, `canceled`, `wrapping`, or `completed`. Returns all Tasks in the Workspace with the specified `assignment_status`. + * @return $this Fluent Builder + */ + public function setAssignmentStatus(array $assignmentStatus): self + { + $this->options['assignmentStatus'] = $assignmentStatus; + return $this; + } + + /** + * The SID of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this SID. + * + * @param string $workflowSid The SID of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this SID. + * @return $this Fluent Builder + */ + public function setWorkflowSid(string $workflowSid): self + { + $this->options['workflowSid'] = $workflowSid; + return $this; + } + + /** + * The friendly name of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this friendly name. + * + * @param string $workflowName The friendly name of the Workflow with the Tasks to read. Returns the Tasks controlled by the Workflow identified by this friendly name. + * @return $this Fluent Builder + */ + public function setWorkflowName(string $workflowName): self + { + $this->options['workflowName'] = $workflowName; + return $this; + } + + /** + * The SID of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this SID. + * + * @param string $taskQueueSid The SID of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this SID. + * @return $this Fluent Builder + */ + public function setTaskQueueSid(string $taskQueueSid): self + { + $this->options['taskQueueSid'] = $taskQueueSid; + return $this; + } + + /** + * The `friendly_name` of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this friendly name. + * + * @param string $taskQueueName The `friendly_name` of the TaskQueue with the Tasks to read. Returns the Tasks waiting in the TaskQueue identified by this friendly name. + * @return $this Fluent Builder + */ + public function setTaskQueueName(string $taskQueueName): self + { + $this->options['taskQueueName'] = $taskQueueName; + return $this; + } + + /** + * The attributes of the Tasks to read. Returns the Tasks that match the attributes specified in this parameter. + * + * @param string $evaluateTaskAttributes The attributes of the Tasks to read. Returns the Tasks that match the attributes specified in this parameter. + * @return $this Fluent Builder + */ + public function setEvaluateTaskAttributes(string $evaluateTaskAttributes): self + { + $this->options['evaluateTaskAttributes'] = $evaluateTaskAttributes; + return $this; + } + + /** + * How to order the returned Task resources. y default, Tasks are sorted by ascending DateCreated. This value is specified as: `Attribute:Order`, where `Attribute` can be either `Priority` or `DateCreated` and `Order` can be either `asc` or `desc`. For example, `Priority:desc` returns Tasks ordered in descending order of their Priority. Multiple sort orders can be specified in a comma-separated list such as `Priority:desc,DateCreated:asc`, which returns the Tasks in descending Priority order and ascending DateCreated Order. + * + * @param string $ordering How to order the returned Task resources. y default, Tasks are sorted by ascending DateCreated. This value is specified as: `Attribute:Order`, where `Attribute` can be either `Priority` or `DateCreated` and `Order` can be either `asc` or `desc`. For example, `Priority:desc` returns Tasks ordered in descending order of their Priority. Multiple sort orders can be specified in a comma-separated list such as `Priority:desc,DateCreated:asc`, which returns the Tasks in descending Priority order and ascending DateCreated Order. + * @return $this Fluent Builder + */ + public function setOrdering(string $ordering): self + { + $this->options['ordering'] = $ordering; + return $this; + } + + /** + * Whether to read Tasks with addons. If `true`, returns only Tasks with addons. If `false`, returns only Tasks without addons. + * + * @param bool $hasAddons Whether to read Tasks with addons. If `true`, returns only Tasks with addons. If `false`, returns only Tasks without addons. + * @return $this Fluent Builder + */ + public function setHasAddons(bool $hasAddons): self + { + $this->options['hasAddons'] = $hasAddons; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadTaskOptions ' . $options . ']'; + } +} + +class UpdateTaskOptions extends Options + { + /** + * @param string $attributes The JSON string that describes the custom attributes of the task. + * @param string $assignmentStatus + * @param string $reason The reason that the Task was canceled or completed. This parameter is required only if the Task is canceled or completed. Setting this value queues the task for deletion and logs the reason. + * @param int $priority The Task's new priority value. When supplied, the Task takes on the specified priority unless it matches a Workflow Target with a Priority set. Value can be 0 to 2^31^ (2,147,483,647). + * @param string $taskChannel When MultiTasking is enabled, specify the TaskChannel with the task to update. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @param string $ifMatch If provided, applies this mutation if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + */ + public function __construct( + + string $attributes = Values::NONE, + string $assignmentStatus = Values::NONE, + string $reason = Values::NONE, + int $priority = Values::INT_NONE, + string $taskChannel = Values::NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['attributes'] = $attributes; + $this->options['assignmentStatus'] = $assignmentStatus; + $this->options['reason'] = $reason; + $this->options['priority'] = $priority; + $this->options['taskChannel'] = $taskChannel; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The JSON string that describes the custom attributes of the task. + * + * @param string $attributes The JSON string that describes the custom attributes of the task. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * @param string $assignmentStatus + * @return $this Fluent Builder + */ + public function setAssignmentStatus(string $assignmentStatus): self + { + $this->options['assignmentStatus'] = $assignmentStatus; + return $this; + } + + /** + * The reason that the Task was canceled or completed. This parameter is required only if the Task is canceled or completed. Setting this value queues the task for deletion and logs the reason. + * + * @param string $reason The reason that the Task was canceled or completed. This parameter is required only if the Task is canceled or completed. Setting this value queues the task for deletion and logs the reason. + * @return $this Fluent Builder + */ + public function setReason(string $reason): self + { + $this->options['reason'] = $reason; + return $this; + } + + /** + * The Task's new priority value. When supplied, the Task takes on the specified priority unless it matches a Workflow Target with a Priority set. Value can be 0 to 2^31^ (2,147,483,647). + * + * @param int $priority The Task's new priority value. When supplied, the Task takes on the specified priority unless it matches a Workflow Target with a Priority set. Value can be 0 to 2^31^ (2,147,483,647). + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * When MultiTasking is enabled, specify the TaskChannel with the task to update. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel When MultiTasking is enabled, specify the TaskChannel with the task to update. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * If provided, applies this mutation if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * + * @param string $ifMatch If provided, applies this mutation if (and only if) the [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header of the Task matches the provided value. This matches the semantics of (and is implemented with) the HTTP [If-Match header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Match). + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateTaskOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskPage.php new file mode 100755 index 0000000..8ed271f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskInstance + */ + public function buildInstance(array $payload): TaskInstance + { + return new TaskInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsContext.php new file mode 100755 index 0000000..24c3d27 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsContext.php @@ -0,0 +1,106 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'taskQueueSid' => + $taskQueueSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues/' . \rawurlencode($taskQueueSid) + .'/CumulativeStatistics'; + } + + /** + * Fetch the TaskQueueCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueCumulativeStatisticsInstance Fetched TaskQueueCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueCumulativeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new TaskQueueCumulativeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueCumulativeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsInstance.php new file mode 100755 index 0000000..0c107e7 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'avgTaskAcceptanceTime' => Values::array_get($payload, 'avg_task_acceptance_time'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'reservationsCreated' => Values::array_get($payload, 'reservations_created'), + 'reservationsAccepted' => Values::array_get($payload, 'reservations_accepted'), + 'reservationsRejected' => Values::array_get($payload, 'reservations_rejected'), + 'reservationsTimedOut' => Values::array_get($payload, 'reservations_timed_out'), + 'reservationsCanceled' => Values::array_get($payload, 'reservations_canceled'), + 'reservationsRescinded' => Values::array_get($payload, 'reservations_rescinded'), + 'splitByWaitTime' => Values::array_get($payload, 'split_by_wait_time'), + 'taskQueueSid' => Values::array_get($payload, 'task_queue_sid'), + 'waitDurationUntilAccepted' => Values::array_get($payload, 'wait_duration_until_accepted'), + 'waitDurationUntilCanceled' => Values::array_get($payload, 'wait_duration_until_canceled'), + 'waitDurationInQueueUntilAccepted' => Values::array_get($payload, 'wait_duration_in_queue_until_accepted'), + 'tasksCanceled' => Values::array_get($payload, 'tasks_canceled'), + 'tasksCompleted' => Values::array_get($payload, 'tasks_completed'), + 'tasksDeleted' => Values::array_get($payload, 'tasks_deleted'), + 'tasksEntered' => Values::array_get($payload, 'tasks_entered'), + 'tasksMoved' => Values::array_get($payload, 'tasks_moved'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'taskQueueSid' => $taskQueueSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskQueueCumulativeStatisticsContext Context for this TaskQueueCumulativeStatisticsInstance + */ + protected function proxy(): TaskQueueCumulativeStatisticsContext + { + if (!$this->context) { + $this->context = new TaskQueueCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskQueueCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueCumulativeStatisticsInstance Fetched TaskQueueCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueCumulativeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueCumulativeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsList.php new file mode 100755 index 0000000..02bafef --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'taskQueueSid' => + $taskQueueSid, + + ]; + } + + /** + * Constructs a TaskQueueCumulativeStatisticsContext + */ + public function getContext( + + ): TaskQueueCumulativeStatisticsContext + { + return new TaskQueueCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueCumulativeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsOptions.php new file mode 100755 index 0000000..6f64cbe --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsOptions.php @@ -0,0 +1,148 @@ +options['endDate'] = $endDate; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. TaskRouter will calculate statistics on up to 10,000 Tasks/Reservations for any given threshold. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. TaskRouter will calculate statistics on up to 10,000 Tasks/Reservations for any given threshold. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchTaskQueueCumulativeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsPage.php new file mode 100755 index 0000000..6eb608a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueCumulativeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskQueueCumulativeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskQueue\TaskQueueCumulativeStatisticsInstance + */ + public function buildInstance(array $payload): TaskQueueCumulativeStatisticsInstance + { + return new TaskQueueCumulativeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['taskQueueSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueCumulativeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsContext.php new file mode 100755 index 0000000..62a8ad4 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsContext.php @@ -0,0 +1,97 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'taskQueueSid' => + $taskQueueSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues/' . \rawurlencode($taskQueueSid) + .'/RealTimeStatistics'; + } + + /** + * Fetch the TaskQueueRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueRealTimeStatisticsInstance Fetched TaskQueueRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueRealTimeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new TaskQueueRealTimeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueRealTimeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsInstance.php new file mode 100755 index 0000000..9f3d621 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsInstance.php @@ -0,0 +1,145 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'activityStatistics' => Values::array_get($payload, 'activity_statistics'), + 'longestTaskWaitingAge' => Values::array_get($payload, 'longest_task_waiting_age'), + 'longestTaskWaitingSid' => Values::array_get($payload, 'longest_task_waiting_sid'), + 'longestRelativeTaskAgeInQueue' => Values::array_get($payload, 'longest_relative_task_age_in_queue'), + 'longestRelativeTaskSidInQueue' => Values::array_get($payload, 'longest_relative_task_sid_in_queue'), + 'taskQueueSid' => Values::array_get($payload, 'task_queue_sid'), + 'tasksByPriority' => Values::array_get($payload, 'tasks_by_priority'), + 'tasksByStatus' => Values::array_get($payload, 'tasks_by_status'), + 'totalAvailableWorkers' => Values::array_get($payload, 'total_available_workers'), + 'totalEligibleWorkers' => Values::array_get($payload, 'total_eligible_workers'), + 'totalTasks' => Values::array_get($payload, 'total_tasks'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'taskQueueSid' => $taskQueueSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskQueueRealTimeStatisticsContext Context for this TaskQueueRealTimeStatisticsInstance + */ + protected function proxy(): TaskQueueRealTimeStatisticsContext + { + if (!$this->context) { + $this->context = new TaskQueueRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskQueueRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueRealTimeStatisticsInstance Fetched TaskQueueRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueRealTimeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueRealTimeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsList.php new file mode 100755 index 0000000..450503b --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'taskQueueSid' => + $taskQueueSid, + + ]; + } + + /** + * Constructs a TaskQueueRealTimeStatisticsContext + */ + public function getContext( + + ): TaskQueueRealTimeStatisticsContext + { + return new TaskQueueRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueRealTimeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsOptions.php new file mode 100755 index 0000000..860bb24 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsOptions.php @@ -0,0 +1,76 @@ +options['taskChannel'] = $taskChannel; + } + + /** + * The TaskChannel for which to fetch statistics. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel The TaskChannel for which to fetch statistics. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchTaskQueueRealTimeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsPage.php new file mode 100755 index 0000000..c70debd --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueRealTimeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskQueueRealTimeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskQueue\TaskQueueRealTimeStatisticsInstance + */ + public function buildInstance(array $payload): TaskQueueRealTimeStatisticsInstance + { + return new TaskQueueRealTimeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['taskQueueSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueRealTimeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsContext.php new file mode 100755 index 0000000..c27adcf --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsContext.php @@ -0,0 +1,106 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'taskQueueSid' => + $taskQueueSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues/' . \rawurlencode($taskQueueSid) + .'/Statistics'; + } + + /** + * Fetch the TaskQueueStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueStatisticsInstance Fetched TaskQueueStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new TaskQueueStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsInstance.php new file mode 100755 index 0000000..246294d --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'realtime' => Values::array_get($payload, 'realtime'), + 'taskQueueSid' => Values::array_get($payload, 'task_queue_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'taskQueueSid' => $taskQueueSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskQueueStatisticsContext Context for this TaskQueueStatisticsInstance + */ + protected function proxy(): TaskQueueStatisticsContext + { + if (!$this->context) { + $this->context = new TaskQueueStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TaskQueueStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueStatisticsInstance Fetched TaskQueueStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): TaskQueueStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsList.php new file mode 100755 index 0000000..95961de --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'taskQueueSid' => + $taskQueueSid, + + ]; + } + + /** + * Constructs a TaskQueueStatisticsContext + */ + public function getContext( + + ): TaskQueueStatisticsContext + { + return new TaskQueueStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['taskQueueSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsOptions.php new file mode 100755 index 0000000..d345f69 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsOptions.php @@ -0,0 +1,148 @@ +options['endDate'] = $endDate; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate real-time and cumulative statistics for the specified TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate real-time and cumulative statistics for the specified TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchTaskQueueStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsPage.php new file mode 100755 index 0000000..1500fdd --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueueStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskQueueStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskQueue\TaskQueueStatisticsInstance + */ + public function buildInstance(array $payload): TaskQueueStatisticsInstance + { + return new TaskQueueStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['taskQueueSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsInstance.php new file mode 100755 index 0000000..8793fcc --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'realtime' => Values::array_get($payload, 'realtime'), + 'taskQueueSid' => Values::array_get($payload, 'task_queue_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueuesStatisticsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsList.php new file mode 100755 index 0000000..a611422 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsList.php @@ -0,0 +1,169 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues/Statistics'; + } + + /** + * Reads TaskQueuesStatisticsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskQueuesStatisticsInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TaskQueuesStatisticsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskQueuesStatisticsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskQueuesStatisticsPage Page of TaskQueuesStatisticsInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskQueuesStatisticsPage + { + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'FriendlyName' => + $options['friendlyName'], + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskQueuesStatisticsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskQueuesStatisticsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskQueuesStatisticsPage Page of TaskQueuesStatisticsInstance + */ + public function getPage(string $targetUrl): TaskQueuesStatisticsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskQueuesStatisticsPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueuesStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsOptions.php new file mode 100755 index 0000000..b68221c --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsOptions.php @@ -0,0 +1,166 @@ +options['endDate'] = $endDate; + $this->options['friendlyName'] = $friendlyName; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * The `friendly_name` of the TaskQueue statistics to read. + * + * @param string $friendlyName The `friendly_name` of the TaskQueue statistics to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default is 15 minutes. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadTaskQueuesStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsPage.php new file mode 100755 index 0000000..8d13bab --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueue/TaskQueuesStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskQueuesStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskQueue\TaskQueuesStatisticsInstance + */ + public function buildInstance(array $payload): TaskQueuesStatisticsInstance + { + return new TaskQueuesStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueuesStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueContext.php new file mode 100755 index 0000000..5edb53a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueContext.php @@ -0,0 +1,239 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TaskQueueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TaskQueueInstance + * + * @return TaskQueueInstance Fetched TaskQueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskQueueInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TaskQueueInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the TaskQueueInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueInstance Updated TaskQueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskQueueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'TargetWorkers' => + $options['targetWorkers'], + 'ReservationActivitySid' => + $options['reservationActivitySid'], + 'AssignmentActivitySid' => + $options['assignmentActivitySid'], + 'MaxReservedWorkers' => + $options['maxReservedWorkers'], + 'TaskOrder' => + $options['taskOrder'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TaskQueueInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): TaskQueueCumulativeStatisticsList + { + if (!$this->_cumulativeStatistics) { + $this->_cumulativeStatistics = new TaskQueueCumulativeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_cumulativeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskQueueStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new TaskQueueStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): TaskQueueRealTimeStatisticsList + { + if (!$this->_realTimeStatistics) { + $this->_realTimeStatistics = new TaskQueueRealTimeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_realTimeStatistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueInstance.php new file mode 100755 index 0000000..f18ad1a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueInstance.php @@ -0,0 +1,203 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assignmentActivitySid' => Values::array_get($payload, 'assignment_activity_sid'), + 'assignmentActivityName' => Values::array_get($payload, 'assignment_activity_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'maxReservedWorkers' => Values::array_get($payload, 'max_reserved_workers'), + 'reservationActivitySid' => Values::array_get($payload, 'reservation_activity_sid'), + 'reservationActivityName' => Values::array_get($payload, 'reservation_activity_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'targetWorkers' => Values::array_get($payload, 'target_workers'), + 'taskOrder' => Values::array_get($payload, 'task_order'), + 'url' => Values::array_get($payload, 'url'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TaskQueueContext Context for this TaskQueueInstance + */ + protected function proxy(): TaskQueueContext + { + if (!$this->context) { + $this->context = new TaskQueueContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TaskQueueInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TaskQueueInstance + * + * @return TaskQueueInstance Fetched TaskQueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TaskQueueInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TaskQueueInstance + * + * @param array|Options $options Optional Arguments + * @return TaskQueueInstance Updated TaskQueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TaskQueueInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): TaskQueueCumulativeStatisticsList + { + return $this->proxy()->cumulativeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskQueueStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): TaskQueueRealTimeStatisticsList + { + return $this->proxy()->realTimeStatistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.TaskQueueInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueList.php new file mode 100755 index 0000000..692634b --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueList.php @@ -0,0 +1,276 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/TaskQueues'; + } + + /** + * Create the TaskQueueInstance + * + * @param string $friendlyName A descriptive string that you create to describe the TaskQueue. For example `Support-Tier 1`, `Sales`, or `Escalation`. + * @param array|Options $options Optional Arguments + * @return TaskQueueInstance Created TaskQueueInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): TaskQueueInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'TargetWorkers' => + $options['targetWorkers'], + 'MaxReservedWorkers' => + $options['maxReservedWorkers'], + 'TaskOrder' => + $options['taskOrder'], + 'ReservationActivitySid' => + $options['reservationActivitySid'], + 'AssignmentActivitySid' => + $options['assignmentActivitySid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TaskQueueInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads TaskQueueInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TaskQueueInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TaskQueueInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TaskQueueInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TaskQueuePage Page of TaskQueueInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TaskQueuePage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'EvaluateWorkerAttributes' => + $options['evaluateWorkerAttributes'], + 'WorkerSid' => + $options['workerSid'], + 'Ordering' => + $options['ordering'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TaskQueuePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TaskQueueInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TaskQueuePage Page of TaskQueueInstance + */ + public function getPage(string $targetUrl): TaskQueuePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TaskQueuePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TaskQueueContext + * + * @param string $sid The SID of the TaskQueue resource to delete. + */ + public function getContext( + string $sid + + ): TaskQueueContext + { + return new TaskQueueContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Access the statistics + */ + protected function getStatistics(): TaskQueuesStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new TaskQueuesStatisticsList( + $this->version, + $this->solution['workspaceSid'] + ); + } + return $this->_statistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueueList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueOptions.php new file mode 100755 index 0000000..3454c54 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueueOptions.php @@ -0,0 +1,396 @@ +options['targetWorkers'] = $targetWorkers; + $this->options['maxReservedWorkers'] = $maxReservedWorkers; + $this->options['taskOrder'] = $taskOrder; + $this->options['reservationActivitySid'] = $reservationActivitySid; + $this->options['assignmentActivitySid'] = $assignmentActivitySid; + } + + /** + * A string that describes the Worker selection criteria for any Tasks that enter the TaskQueue. For example, `'\\\"language\\\" == \\\"spanish\\\"'`. The default value is `1==1`. If this value is empty, Tasks will wait in the TaskQueue until they are deleted or moved to another TaskQueue. For more information about Worker selection, see [Describing Worker selection criteria](https://www.twilio.com/docs/taskrouter/api/taskqueues#target-workers). + * + * @param string $targetWorkers A string that describes the Worker selection criteria for any Tasks that enter the TaskQueue. For example, `'\\\"language\\\" == \\\"spanish\\\"'`. The default value is `1==1`. If this value is empty, Tasks will wait in the TaskQueue until they are deleted or moved to another TaskQueue. For more information about Worker selection, see [Describing Worker selection criteria](https://www.twilio.com/docs/taskrouter/api/taskqueues#target-workers). + * @return $this Fluent Builder + */ + public function setTargetWorkers(string $targetWorkers): self + { + $this->options['targetWorkers'] = $targetWorkers; + return $this; + } + + /** + * The maximum number of Workers to reserve for the assignment of a Task in the queue. Can be an integer between 1 and 50, inclusive and defaults to 1. + * + * @param int $maxReservedWorkers The maximum number of Workers to reserve for the assignment of a Task in the queue. Can be an integer between 1 and 50, inclusive and defaults to 1. + * @return $this Fluent Builder + */ + public function setMaxReservedWorkers(int $maxReservedWorkers): self + { + $this->options['maxReservedWorkers'] = $maxReservedWorkers; + return $this; + } + + /** + * @param string $taskOrder + * @return $this Fluent Builder + */ + public function setTaskOrder(string $taskOrder): self + { + $this->options['taskOrder'] = $taskOrder; + return $this; + } + + /** + * The SID of the Activity to assign Workers when a task is reserved for them. + * + * @param string $reservationActivitySid The SID of the Activity to assign Workers when a task is reserved for them. + * @return $this Fluent Builder + */ + public function setReservationActivitySid(string $reservationActivitySid): self + { + $this->options['reservationActivitySid'] = $reservationActivitySid; + return $this; + } + + /** + * The SID of the Activity to assign Workers when a task is assigned to them. + * + * @param string $assignmentActivitySid The SID of the Activity to assign Workers when a task is assigned to them. + * @return $this Fluent Builder + */ + public function setAssignmentActivitySid(string $assignmentActivitySid): self + { + $this->options['assignmentActivitySid'] = $assignmentActivitySid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateTaskQueueOptions ' . $options . ']'; + } +} + + + +class ReadTaskQueueOptions extends Options + { + /** + * @param string $friendlyName The `friendly_name` of the TaskQueue resources to read. + * @param string $evaluateWorkerAttributes The attributes of the Workers to read. Returns the TaskQueues with Workers that match the attributes specified in this parameter. + * @param string $workerSid The SID of the Worker with the TaskQueue resources to read. + * @param string $ordering Sorting parameter for TaskQueues + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $evaluateWorkerAttributes = Values::NONE, + string $workerSid = Values::NONE, + string $ordering = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['evaluateWorkerAttributes'] = $evaluateWorkerAttributes; + $this->options['workerSid'] = $workerSid; + $this->options['ordering'] = $ordering; + } + + /** + * The `friendly_name` of the TaskQueue resources to read. + * + * @param string $friendlyName The `friendly_name` of the TaskQueue resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The attributes of the Workers to read. Returns the TaskQueues with Workers that match the attributes specified in this parameter. + * + * @param string $evaluateWorkerAttributes The attributes of the Workers to read. Returns the TaskQueues with Workers that match the attributes specified in this parameter. + * @return $this Fluent Builder + */ + public function setEvaluateWorkerAttributes(string $evaluateWorkerAttributes): self + { + $this->options['evaluateWorkerAttributes'] = $evaluateWorkerAttributes; + return $this; + } + + /** + * The SID of the Worker with the TaskQueue resources to read. + * + * @param string $workerSid The SID of the Worker with the TaskQueue resources to read. + * @return $this Fluent Builder + */ + public function setWorkerSid(string $workerSid): self + { + $this->options['workerSid'] = $workerSid; + return $this; + } + + /** + * Sorting parameter for TaskQueues + * + * @param string $ordering Sorting parameter for TaskQueues + * @return $this Fluent Builder + */ + public function setOrdering(string $ordering): self + { + $this->options['ordering'] = $ordering; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadTaskQueueOptions ' . $options . ']'; + } +} + +class UpdateTaskQueueOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the TaskQueue. For example `Support-Tier 1`, `Sales`, or `Escalation`. + * @param string $targetWorkers A string describing the Worker selection criteria for any Tasks that enter the TaskQueue. For example '\\\"language\\\" == \\\"spanish\\\"' If no TargetWorkers parameter is provided, Tasks will wait in the queue until they are either deleted or moved to another queue. Additional examples on how to describing Worker selection criteria below. + * @param string $reservationActivitySid The SID of the Activity to assign Workers when a task is reserved for them. + * @param string $assignmentActivitySid The SID of the Activity to assign Workers when a task is assigned for them. + * @param int $maxReservedWorkers The maximum number of Workers to create reservations for the assignment of a task while in the queue. Maximum of 50. + * @param string $taskOrder + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $targetWorkers = Values::NONE, + string $reservationActivitySid = Values::NONE, + string $assignmentActivitySid = Values::NONE, + int $maxReservedWorkers = Values::INT_NONE, + string $taskOrder = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['targetWorkers'] = $targetWorkers; + $this->options['reservationActivitySid'] = $reservationActivitySid; + $this->options['assignmentActivitySid'] = $assignmentActivitySid; + $this->options['maxReservedWorkers'] = $maxReservedWorkers; + $this->options['taskOrder'] = $taskOrder; + } + + /** + * A descriptive string that you create to describe the TaskQueue. For example `Support-Tier 1`, `Sales`, or `Escalation`. + * + * @param string $friendlyName A descriptive string that you create to describe the TaskQueue. For example `Support-Tier 1`, `Sales`, or `Escalation`. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * A string describing the Worker selection criteria for any Tasks that enter the TaskQueue. For example '\\\"language\\\" == \\\"spanish\\\"' If no TargetWorkers parameter is provided, Tasks will wait in the queue until they are either deleted or moved to another queue. Additional examples on how to describing Worker selection criteria below. + * + * @param string $targetWorkers A string describing the Worker selection criteria for any Tasks that enter the TaskQueue. For example '\\\"language\\\" == \\\"spanish\\\"' If no TargetWorkers parameter is provided, Tasks will wait in the queue until they are either deleted or moved to another queue. Additional examples on how to describing Worker selection criteria below. + * @return $this Fluent Builder + */ + public function setTargetWorkers(string $targetWorkers): self + { + $this->options['targetWorkers'] = $targetWorkers; + return $this; + } + + /** + * The SID of the Activity to assign Workers when a task is reserved for them. + * + * @param string $reservationActivitySid The SID of the Activity to assign Workers when a task is reserved for them. + * @return $this Fluent Builder + */ + public function setReservationActivitySid(string $reservationActivitySid): self + { + $this->options['reservationActivitySid'] = $reservationActivitySid; + return $this; + } + + /** + * The SID of the Activity to assign Workers when a task is assigned for them. + * + * @param string $assignmentActivitySid The SID of the Activity to assign Workers when a task is assigned for them. + * @return $this Fluent Builder + */ + public function setAssignmentActivitySid(string $assignmentActivitySid): self + { + $this->options['assignmentActivitySid'] = $assignmentActivitySid; + return $this; + } + + /** + * The maximum number of Workers to create reservations for the assignment of a task while in the queue. Maximum of 50. + * + * @param int $maxReservedWorkers The maximum number of Workers to create reservations for the assignment of a task while in the queue. Maximum of 50. + * @return $this Fluent Builder + */ + public function setMaxReservedWorkers(int $maxReservedWorkers): self + { + $this->options['maxReservedWorkers'] = $maxReservedWorkers; + return $this; + } + + /** + * @param string $taskOrder + * @return $this Fluent Builder + */ + public function setTaskOrder(string $taskOrder): self + { + $this->options['taskOrder'] = $taskOrder; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateTaskQueueOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueuePage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueuePage.php new file mode 100755 index 0000000..6289874 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/TaskQueuePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TaskQueueInstance \Twilio\Rest\Taskrouter\V1\Workspace\TaskQueueInstance + */ + public function buildInstance(array $payload): TaskQueueInstance + { + return new TaskQueueInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.TaskQueuePage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationContext.php new file mode 100755 index 0000000..02de6f1 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationContext.php @@ -0,0 +1,227 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workerSid' => + $workerSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($workerSid) + .'/Reservations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ReservationInstance + * + * @return ReservationInstance Fetched ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ReservationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ReservationInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ReservationInstance + * + * @param array|Options $options Optional Arguments + * @return ReservationInstance Updated ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ReservationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ReservationStatus' => + $options['reservationStatus'], + 'WorkerActivitySid' => + $options['workerActivitySid'], + 'Instruction' => + $options['instruction'], + 'DequeuePostWorkActivitySid' => + $options['dequeuePostWorkActivitySid'], + 'DequeueFrom' => + $options['dequeueFrom'], + 'DequeueRecord' => + $options['dequeueRecord'], + 'DequeueTimeout' => + $options['dequeueTimeout'], + 'DequeueTo' => + $options['dequeueTo'], + 'DequeueStatusCallbackUrl' => + $options['dequeueStatusCallbackUrl'], + 'CallFrom' => + $options['callFrom'], + 'CallRecord' => + $options['callRecord'], + 'CallTimeout' => + $options['callTimeout'], + 'CallTo' => + $options['callTo'], + 'CallUrl' => + $options['callUrl'], + 'CallStatusCallbackUrl' => + $options['callStatusCallbackUrl'], + 'CallAccept' => + Serialize::booleanToString($options['callAccept']), + 'RedirectCallSid' => + $options['redirectCallSid'], + 'RedirectAccept' => + Serialize::booleanToString($options['redirectAccept']), + 'RedirectUrl' => + $options['redirectUrl'], + 'To' => + $options['to'], + 'From' => + $options['from'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'StatusCallbackEvent' => + $options['statusCallbackEvent'], + 'Timeout' => + $options['timeout'], + 'Record' => + Serialize::booleanToString($options['record']), + 'Muted' => + Serialize::booleanToString($options['muted']), + 'Beep' => + $options['beep'], + 'StartConferenceOnEnter' => + Serialize::booleanToString($options['startConferenceOnEnter']), + 'EndConferenceOnExit' => + Serialize::booleanToString($options['endConferenceOnExit']), + 'WaitUrl' => + $options['waitUrl'], + 'WaitMethod' => + $options['waitMethod'], + 'EarlyMedia' => + Serialize::booleanToString($options['earlyMedia']), + 'MaxParticipants' => + $options['maxParticipants'], + 'ConferenceStatusCallback' => + $options['conferenceStatusCallback'], + 'ConferenceStatusCallbackMethod' => + $options['conferenceStatusCallbackMethod'], + 'ConferenceStatusCallbackEvent' => + $options['conferenceStatusCallbackEvent'], + 'ConferenceRecord' => + $options['conferenceRecord'], + 'ConferenceTrim' => + $options['conferenceTrim'], + 'RecordingChannels' => + $options['recordingChannels'], + 'RecordingStatusCallback' => + $options['recordingStatusCallback'], + 'RecordingStatusCallbackMethod' => + $options['recordingStatusCallbackMethod'], + 'ConferenceRecordingStatusCallback' => + $options['conferenceRecordingStatusCallback'], + 'ConferenceRecordingStatusCallbackMethod' => + $options['conferenceRecordingStatusCallbackMethod'], + 'Region' => + $options['region'], + 'SipAuthUsername' => + $options['sipAuthUsername'], + 'SipAuthPassword' => + $options['sipAuthPassword'], + 'DequeueStatusCallbackEvent' => + Serialize::map($options['dequeueStatusCallbackEvent'], function ($e) { return $e; }), + 'PostWorkActivitySid' => + $options['postWorkActivitySid'], + 'EndConferenceOnCustomerExit' => + Serialize::booleanToString($options['endConferenceOnCustomerExit']), + 'BeepOnCustomerEntrance' => + Serialize::booleanToString($options['beepOnCustomerEntrance']), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new ReservationInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ReservationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationInstance.php new file mode 100755 index 0000000..8d41959 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationInstance.php @@ -0,0 +1,154 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'reservationStatus' => Values::array_get($payload, 'reservation_status'), + 'sid' => Values::array_get($payload, 'sid'), + 'taskSid' => Values::array_get($payload, 'task_sid'), + 'workerName' => Values::array_get($payload, 'worker_name'), + 'workerSid' => Values::array_get($payload, 'worker_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workerSid' => $workerSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ReservationContext Context for this ReservationInstance + */ + protected function proxy(): ReservationContext + { + if (!$this->context) { + $this->context = new ReservationContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ReservationInstance + * + * @return ReservationInstance Fetched ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ReservationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ReservationInstance + * + * @param array|Options $options Optional Arguments + * @return ReservationInstance Updated ReservationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ReservationInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.ReservationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationList.php new file mode 100755 index 0000000..e35ce70 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationList.php @@ -0,0 +1,182 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workerSid' => + $workerSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($workerSid) + .'/Reservations'; + } + + /** + * Reads ReservationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ReservationInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ReservationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ReservationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ReservationPage Page of ReservationInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ReservationPage + { + $options = new Values($options); + + $params = Values::of([ + 'ReservationStatus' => + $options['reservationStatus'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ReservationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ReservationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ReservationPage Page of ReservationInstance + */ + public function getPage(string $targetUrl): ReservationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ReservationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ReservationContext + * + * @param string $sid The SID of the WorkerReservation resource to fetch. + */ + public function getContext( + string $sid + + ): ReservationContext + { + return new ReservationContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ReservationList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationOptions.php new file mode 100755 index 0000000..0a525e4 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationOptions.php @@ -0,0 +1,1046 @@ +options['reservationStatus'] = $reservationStatus; + } + + /** + * Returns the list of reservations for a worker with a specified ReservationStatus. Can be: `pending`, `accepted`, `rejected`, `timeout`, `canceled`, or `rescinded`. + * + * @param string $reservationStatus Returns the list of reservations for a worker with a specified ReservationStatus. Can be: `pending`, `accepted`, `rejected`, `timeout`, `canceled`, or `rescinded`. + * @return $this Fluent Builder + */ + public function setReservationStatus(string $reservationStatus): self + { + $this->options['reservationStatus'] = $reservationStatus; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadReservationOptions ' . $options . ']'; + } +} + +class UpdateReservationOptions extends Options + { + /** + * @param string $reservationStatus + * @param string $workerActivitySid The new worker activity SID if rejecting a reservation. + * @param string $instruction The assignment instruction for the reservation. + * @param string $dequeuePostWorkActivitySid The SID of the Activity resource to start after executing a Dequeue instruction. + * @param string $dequeueFrom The caller ID of the call to the worker when executing a Dequeue instruction. + * @param string $dequeueRecord Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * @param int $dequeueTimeout The timeout for call when executing a Dequeue instruction. + * @param string $dequeueTo The contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $dequeueStatusCallbackUrl The callback URL for completed call event when executing a Dequeue instruction. + * @param string $callFrom The Caller ID of the outbound call when executing a Call instruction. + * @param string $callRecord Whether to record both legs of a call when executing a Call instruction. + * @param int $callTimeout The timeout for a call when executing a Call instruction. + * @param string $callTo The contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $callUrl TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * @param string $callStatusCallbackUrl The URL to call for the completed call event when executing a Call instruction. + * @param bool $callAccept Whether to accept a reservation when executing a Call instruction. + * @param string $redirectCallSid The Call SID of the call parked in the queue when executing a Redirect instruction. + * @param bool $redirectAccept Whether the reservation should be accepted when executing a Redirect instruction. + * @param string $redirectUrl TwiML URI to redirect the call to when executing the Redirect instruction. + * @param string $to The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @param string $from The caller ID of the call to the worker when executing a Conference instruction. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @param string $statusCallbackEvent The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * @param int $timeout The timeout for a call when executing a Conference instruction. + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * @param bool $muted Whether the agent is muted in the conference. Defaults to `false`. + * @param string $beep Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @param bool $endConferenceOnExit Whether to end the conference when the agent leaves. + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * @param int $maxParticipants The maximum number of participants allowed in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $conferenceStatusCallbackEvent The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * @param string $conferenceRecord Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @param string $conferenceTrim Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @param string $sipAuthUsername The SIP username used for authentication. + * @param string $sipAuthPassword The SIP password for authentication. + * @param string[] $dequeueStatusCallbackEvent The call progress events sent via webhooks as a result of a Dequeue instruction. + * @param string $postWorkActivitySid The new worker activity SID after executing a Conference instruction. + * @param bool $endConferenceOnCustomerExit Whether to end the conference when the customer leaves. + * @param bool $beepOnCustomerEntrance Whether to play a notification beep when the customer joins. + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $reservationStatus = Values::NONE, + string $workerActivitySid = Values::NONE, + string $instruction = Values::NONE, + string $dequeuePostWorkActivitySid = Values::NONE, + string $dequeueFrom = Values::NONE, + string $dequeueRecord = Values::NONE, + int $dequeueTimeout = Values::INT_NONE, + string $dequeueTo = Values::NONE, + string $dequeueStatusCallbackUrl = Values::NONE, + string $callFrom = Values::NONE, + string $callRecord = Values::NONE, + int $callTimeout = Values::INT_NONE, + string $callTo = Values::NONE, + string $callUrl = Values::NONE, + string $callStatusCallbackUrl = Values::NONE, + bool $callAccept = Values::BOOL_NONE, + string $redirectCallSid = Values::NONE, + bool $redirectAccept = Values::BOOL_NONE, + string $redirectUrl = Values::NONE, + string $to = Values::NONE, + string $from = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE, + array $statusCallbackEvent = Values::ARRAY_NONE, + int $timeout = Values::INT_NONE, + bool $record = Values::BOOL_NONE, + bool $muted = Values::BOOL_NONE, + string $beep = Values::NONE, + bool $startConferenceOnEnter = Values::BOOL_NONE, + bool $endConferenceOnExit = Values::BOOL_NONE, + string $waitUrl = Values::NONE, + string $waitMethod = Values::NONE, + bool $earlyMedia = Values::BOOL_NONE, + int $maxParticipants = Values::INT_NONE, + string $conferenceStatusCallback = Values::NONE, + string $conferenceStatusCallbackMethod = Values::NONE, + array $conferenceStatusCallbackEvent = Values::ARRAY_NONE, + string $conferenceRecord = Values::NONE, + string $conferenceTrim = Values::NONE, + string $recordingChannels = Values::NONE, + string $recordingStatusCallback = Values::NONE, + string $recordingStatusCallbackMethod = Values::NONE, + string $conferenceRecordingStatusCallback = Values::NONE, + string $conferenceRecordingStatusCallbackMethod = Values::NONE, + string $region = Values::NONE, + string $sipAuthUsername = Values::NONE, + string $sipAuthPassword = Values::NONE, + array $dequeueStatusCallbackEvent = Values::ARRAY_NONE, + string $postWorkActivitySid = Values::NONE, + bool $endConferenceOnCustomerExit = Values::BOOL_NONE, + bool $beepOnCustomerEntrance = Values::BOOL_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['reservationStatus'] = $reservationStatus; + $this->options['workerActivitySid'] = $workerActivitySid; + $this->options['instruction'] = $instruction; + $this->options['dequeuePostWorkActivitySid'] = $dequeuePostWorkActivitySid; + $this->options['dequeueFrom'] = $dequeueFrom; + $this->options['dequeueRecord'] = $dequeueRecord; + $this->options['dequeueTimeout'] = $dequeueTimeout; + $this->options['dequeueTo'] = $dequeueTo; + $this->options['dequeueStatusCallbackUrl'] = $dequeueStatusCallbackUrl; + $this->options['callFrom'] = $callFrom; + $this->options['callRecord'] = $callRecord; + $this->options['callTimeout'] = $callTimeout; + $this->options['callTo'] = $callTo; + $this->options['callUrl'] = $callUrl; + $this->options['callStatusCallbackUrl'] = $callStatusCallbackUrl; + $this->options['callAccept'] = $callAccept; + $this->options['redirectCallSid'] = $redirectCallSid; + $this->options['redirectAccept'] = $redirectAccept; + $this->options['redirectUrl'] = $redirectUrl; + $this->options['to'] = $to; + $this->options['from'] = $from; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + $this->options['timeout'] = $timeout; + $this->options['record'] = $record; + $this->options['muted'] = $muted; + $this->options['beep'] = $beep; + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + $this->options['waitUrl'] = $waitUrl; + $this->options['waitMethod'] = $waitMethod; + $this->options['earlyMedia'] = $earlyMedia; + $this->options['maxParticipants'] = $maxParticipants; + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + $this->options['conferenceRecord'] = $conferenceRecord; + $this->options['conferenceTrim'] = $conferenceTrim; + $this->options['recordingChannels'] = $recordingChannels; + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + $this->options['region'] = $region; + $this->options['sipAuthUsername'] = $sipAuthUsername; + $this->options['sipAuthPassword'] = $sipAuthPassword; + $this->options['dequeueStatusCallbackEvent'] = $dequeueStatusCallbackEvent; + $this->options['postWorkActivitySid'] = $postWorkActivitySid; + $this->options['endConferenceOnCustomerExit'] = $endConferenceOnCustomerExit; + $this->options['beepOnCustomerEntrance'] = $beepOnCustomerEntrance; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * @param string $reservationStatus + * @return $this Fluent Builder + */ + public function setReservationStatus(string $reservationStatus): self + { + $this->options['reservationStatus'] = $reservationStatus; + return $this; + } + + /** + * The new worker activity SID if rejecting a reservation. + * + * @param string $workerActivitySid The new worker activity SID if rejecting a reservation. + * @return $this Fluent Builder + */ + public function setWorkerActivitySid(string $workerActivitySid): self + { + $this->options['workerActivitySid'] = $workerActivitySid; + return $this; + } + + /** + * The assignment instruction for the reservation. + * + * @param string $instruction The assignment instruction for the reservation. + * @return $this Fluent Builder + */ + public function setInstruction(string $instruction): self + { + $this->options['instruction'] = $instruction; + return $this; + } + + /** + * The SID of the Activity resource to start after executing a Dequeue instruction. + * + * @param string $dequeuePostWorkActivitySid The SID of the Activity resource to start after executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeuePostWorkActivitySid(string $dequeuePostWorkActivitySid): self + { + $this->options['dequeuePostWorkActivitySid'] = $dequeuePostWorkActivitySid; + return $this; + } + + /** + * The caller ID of the call to the worker when executing a Dequeue instruction. + * + * @param string $dequeueFrom The caller ID of the call to the worker when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueFrom(string $dequeueFrom): self + { + $this->options['dequeueFrom'] = $dequeueFrom; + return $this; + } + + /** + * Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * + * @param string $dequeueRecord Whether to record both legs of a call when executing a Dequeue instruction or which leg to record. + * @return $this Fluent Builder + */ + public function setDequeueRecord(string $dequeueRecord): self + { + $this->options['dequeueRecord'] = $dequeueRecord; + return $this; + } + + /** + * The timeout for call when executing a Dequeue instruction. + * + * @param int $dequeueTimeout The timeout for call when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueTimeout(int $dequeueTimeout): self + { + $this->options['dequeueTimeout'] = $dequeueTimeout; + return $this; + } + + /** + * The contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $dequeueTo The contact URI of the worker when executing a Dequeue instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setDequeueTo(string $dequeueTo): self + { + $this->options['dequeueTo'] = $dequeueTo; + return $this; + } + + /** + * The callback URL for completed call event when executing a Dequeue instruction. + * + * @param string $dequeueStatusCallbackUrl The callback URL for completed call event when executing a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueStatusCallbackUrl(string $dequeueStatusCallbackUrl): self + { + $this->options['dequeueStatusCallbackUrl'] = $dequeueStatusCallbackUrl; + return $this; + } + + /** + * The Caller ID of the outbound call when executing a Call instruction. + * + * @param string $callFrom The Caller ID of the outbound call when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallFrom(string $callFrom): self + { + $this->options['callFrom'] = $callFrom; + return $this; + } + + /** + * Whether to record both legs of a call when executing a Call instruction. + * + * @param string $callRecord Whether to record both legs of a call when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallRecord(string $callRecord): self + { + $this->options['callRecord'] = $callRecord; + return $this; + } + + /** + * The timeout for a call when executing a Call instruction. + * + * @param int $callTimeout The timeout for a call when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallTimeout(int $callTimeout): self + { + $this->options['callTimeout'] = $callTimeout; + return $this; + } + + /** + * The contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $callTo The contact URI of the worker when executing a Call instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setCallTo(string $callTo): self + { + $this->options['callTo'] = $callTo; + return $this; + } + + /** + * TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * + * @param string $callUrl TwiML URI executed on answering the worker's leg as a result of the Call instruction. + * @return $this Fluent Builder + */ + public function setCallUrl(string $callUrl): self + { + $this->options['callUrl'] = $callUrl; + return $this; + } + + /** + * The URL to call for the completed call event when executing a Call instruction. + * + * @param string $callStatusCallbackUrl The URL to call for the completed call event when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallStatusCallbackUrl(string $callStatusCallbackUrl): self + { + $this->options['callStatusCallbackUrl'] = $callStatusCallbackUrl; + return $this; + } + + /** + * Whether to accept a reservation when executing a Call instruction. + * + * @param bool $callAccept Whether to accept a reservation when executing a Call instruction. + * @return $this Fluent Builder + */ + public function setCallAccept(bool $callAccept): self + { + $this->options['callAccept'] = $callAccept; + return $this; + } + + /** + * The Call SID of the call parked in the queue when executing a Redirect instruction. + * + * @param string $redirectCallSid The Call SID of the call parked in the queue when executing a Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectCallSid(string $redirectCallSid): self + { + $this->options['redirectCallSid'] = $redirectCallSid; + return $this; + } + + /** + * Whether the reservation should be accepted when executing a Redirect instruction. + * + * @param bool $redirectAccept Whether the reservation should be accepted when executing a Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectAccept(bool $redirectAccept): self + { + $this->options['redirectAccept'] = $redirectAccept; + return $this; + } + + /** + * TwiML URI to redirect the call to when executing the Redirect instruction. + * + * @param string $redirectUrl TwiML URI to redirect the call to when executing the Redirect instruction. + * @return $this Fluent Builder + */ + public function setRedirectUrl(string $redirectUrl): self + { + $this->options['redirectUrl'] = $redirectUrl; + return $this; + } + + /** + * The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * + * @param string $to The Contact URI of the worker when executing a Conference instruction. Can be the URI of the Twilio Client, the SIP URI for Programmable SIP, or the [E.164](https://www.twilio.com/docs/glossary/what-e164) formatted phone number, depending on the destination. + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * The caller ID of the call to the worker when executing a Conference instruction. + * + * @param string $from The caller ID of the call to the worker when executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setFrom(string $from): self + { + $this->options['from'] = $from; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * + * @param string $statusCallbackEvent The call progress events that we will send to `status_callback`. Can be: `initiated`, `ringing`, `answered`, or `completed`. + * @return $this Fluent Builder + */ + public function setStatusCallbackEvent(array $statusCallbackEvent): self + { + $this->options['statusCallbackEvent'] = $statusCallbackEvent; + return $this; + } + + /** + * The timeout for a call when executing a Conference instruction. + * + * @param int $timeout The timeout for a call when executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setTimeout(int $timeout): self + { + $this->options['timeout'] = $timeout; + return $this; + } + + /** + * Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * + * @param bool $record Whether to record the participant and their conferences, including the time between conferences. Can be `true` or `false` and the default is `false`. + * @return $this Fluent Builder + */ + public function setRecord(bool $record): self + { + $this->options['record'] = $record; + return $this; + } + + /** + * Whether the agent is muted in the conference. Defaults to `false`. + * + * @param bool $muted Whether the agent is muted in the conference. Defaults to `false`. + * @return $this Fluent Builder + */ + public function setMuted(bool $muted): self + { + $this->options['muted'] = $muted; + return $this; + } + + /** + * Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * + * @param string $beep Whether to play a notification beep when the participant joins or when to play a beep. Can be: `true`, `false`, `onEnter`, or `onExit`. The default value is `true`. + * @return $this Fluent Builder + */ + public function setBeep(string $beep): self + { + $this->options['beep'] = $beep; + return $this; + } + + /** + * Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * + * @param bool $startConferenceOnEnter Whether to start the conference when the participant joins, if it has not already started. Can be: `true` or `false` and the default is `true`. If `false` and the conference has not started, the participant is muted and hears background music until another participant starts the conference. + * @return $this Fluent Builder + */ + public function setStartConferenceOnEnter(bool $startConferenceOnEnter): self + { + $this->options['startConferenceOnEnter'] = $startConferenceOnEnter; + return $this; + } + + /** + * Whether to end the conference when the agent leaves. + * + * @param bool $endConferenceOnExit Whether to end the conference when the agent leaves. + * @return $this Fluent Builder + */ + public function setEndConferenceOnExit(bool $endConferenceOnExit): self + { + $this->options['endConferenceOnExit'] = $endConferenceOnExit; + return $this; + } + + /** + * The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * + * @param string $waitUrl The URL we should call using the `wait_method` for the music to play while participants are waiting for the conference to start. The default value is the URL of our standard hold music. [Learn more about hold music](https://www.twilio.com/labs/twimlets/holdmusic). + * @return $this Fluent Builder + */ + public function setWaitUrl(string $waitUrl): self + { + $this->options['waitUrl'] = $waitUrl; + return $this; + } + + /** + * The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * + * @param string $waitMethod The HTTP method we should use to call `wait_url`. Can be `GET` or `POST` and the default is `POST`. When using a static audio file, this should be `GET` so that we can cache the file. + * @return $this Fluent Builder + */ + public function setWaitMethod(string $waitMethod): self + { + $this->options['waitMethod'] = $waitMethod; + return $this; + } + + /** + * Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * + * @param bool $earlyMedia Whether to allow an agent to hear the state of the outbound call, including ringing or disconnect messages. The default is `true`. + * @return $this Fluent Builder + */ + public function setEarlyMedia(bool $earlyMedia): self + { + $this->options['earlyMedia'] = $earlyMedia; + return $this; + } + + /** + * The maximum number of participants allowed in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * + * @param int $maxParticipants The maximum number of participants allowed in the conference. Can be a positive integer from `2` to `250`. The default value is `250`. + * @return $this Fluent Builder + */ + public function setMaxParticipants(int $maxParticipants): self + { + $this->options['maxParticipants'] = $maxParticipants; + return $this; + } + + /** + * The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * + * @param string $conferenceStatusCallback The URL we should call using the `conference_status_callback_method` when the conference events in `conference_status_callback_event` occur. Only the value set by the first participant to join the conference is used. Subsequent `conference_status_callback` values are ignored. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallback(string $conferenceStatusCallback): self + { + $this->options['conferenceStatusCallback'] = $conferenceStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceStatusCallbackMethod The HTTP method we should use to call `conference_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackMethod(string $conferenceStatusCallbackMethod): self + { + $this->options['conferenceStatusCallbackMethod'] = $conferenceStatusCallbackMethod; + return $this; + } + + /** + * The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * + * @param string $conferenceStatusCallbackEvent The conference status events that we will send to `conference_status_callback`. Can be: `start`, `end`, `join`, `leave`, `mute`, `hold`, `speaker`. + * @return $this Fluent Builder + */ + public function setConferenceStatusCallbackEvent(array $conferenceStatusCallbackEvent): self + { + $this->options['conferenceStatusCallbackEvent'] = $conferenceStatusCallbackEvent; + return $this; + } + + /** + * Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * + * @param string $conferenceRecord Whether to record the conference the participant is joining or when to record the conference. Can be: `true`, `false`, `record-from-start`, and `do-not-record`. The default value is `false`. + * @return $this Fluent Builder + */ + public function setConferenceRecord(string $conferenceRecord): self + { + $this->options['conferenceRecord'] = $conferenceRecord; + return $this; + } + + /** + * Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * + * @param string $conferenceTrim Whether to trim leading and trailing silence from your recorded conference audio files. Can be: `trim-silence` or `do-not-trim` and defaults to `trim-silence`. + * @return $this Fluent Builder + */ + public function setConferenceTrim(string $conferenceTrim): self + { + $this->options['conferenceTrim'] = $conferenceTrim; + return $this; + } + + /** + * The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * + * @param string $recordingChannels The recording channels for the final recording. Can be: `mono` or `dual` and the default is `mono`. + * @return $this Fluent Builder + */ + public function setRecordingChannels(string $recordingChannels): self + { + $this->options['recordingChannels'] = $recordingChannels; + return $this; + } + + /** + * The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * + * @param string $recordingStatusCallback The URL that we should call using the `recording_status_callback_method` when the recording status changes. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallback(string $recordingStatusCallback): self + { + $this->options['recordingStatusCallback'] = $recordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $recordingStatusCallbackMethod The HTTP method we should use when we call `recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setRecordingStatusCallbackMethod(string $recordingStatusCallbackMethod): self + { + $this->options['recordingStatusCallbackMethod'] = $recordingStatusCallbackMethod; + return $this; + } + + /** + * The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * + * @param string $conferenceRecordingStatusCallback The URL we should call using the `conference_recording_status_callback_method` when the conference recording is available. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallback(string $conferenceRecordingStatusCallback): self + { + $this->options['conferenceRecordingStatusCallback'] = $conferenceRecordingStatusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * + * @param string $conferenceRecordingStatusCallbackMethod The HTTP method we should use to call `conference_recording_status_callback`. Can be: `GET` or `POST` and defaults to `POST`. + * @return $this Fluent Builder + */ + public function setConferenceRecordingStatusCallbackMethod(string $conferenceRecordingStatusCallbackMethod): self + { + $this->options['conferenceRecordingStatusCallbackMethod'] = $conferenceRecordingStatusCallbackMethod; + return $this; + } + + /** + * The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * + * @param string $region The [region](https://support.twilio.com/hc/en-us/articles/223132167-How-global-low-latency-routing-and-region-selection-work-for-conferences-and-Client-calls) where we should mix the recorded audio. Can be:`us1`, `ie1`, `de1`, `sg1`, `br1`, `au1`, or `jp1`. + * @return $this Fluent Builder + */ + public function setRegion(string $region): self + { + $this->options['region'] = $region; + return $this; + } + + /** + * The SIP username used for authentication. + * + * @param string $sipAuthUsername The SIP username used for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthUsername(string $sipAuthUsername): self + { + $this->options['sipAuthUsername'] = $sipAuthUsername; + return $this; + } + + /** + * The SIP password for authentication. + * + * @param string $sipAuthPassword The SIP password for authentication. + * @return $this Fluent Builder + */ + public function setSipAuthPassword(string $sipAuthPassword): self + { + $this->options['sipAuthPassword'] = $sipAuthPassword; + return $this; + } + + /** + * The call progress events sent via webhooks as a result of a Dequeue instruction. + * + * @param string[] $dequeueStatusCallbackEvent The call progress events sent via webhooks as a result of a Dequeue instruction. + * @return $this Fluent Builder + */ + public function setDequeueStatusCallbackEvent(array $dequeueStatusCallbackEvent): self + { + $this->options['dequeueStatusCallbackEvent'] = $dequeueStatusCallbackEvent; + return $this; + } + + /** + * The new worker activity SID after executing a Conference instruction. + * + * @param string $postWorkActivitySid The new worker activity SID after executing a Conference instruction. + * @return $this Fluent Builder + */ + public function setPostWorkActivitySid(string $postWorkActivitySid): self + { + $this->options['postWorkActivitySid'] = $postWorkActivitySid; + return $this; + } + + /** + * Whether to end the conference when the customer leaves. + * + * @param bool $endConferenceOnCustomerExit Whether to end the conference when the customer leaves. + * @return $this Fluent Builder + */ + public function setEndConferenceOnCustomerExit(bool $endConferenceOnCustomerExit): self + { + $this->options['endConferenceOnCustomerExit'] = $endConferenceOnCustomerExit; + return $this; + } + + /** + * Whether to play a notification beep when the customer joins. + * + * @param bool $beepOnCustomerEntrance Whether to play a notification beep when the customer joins. + * @return $this Fluent Builder + */ + public function setBeepOnCustomerEntrance(bool $beepOnCustomerEntrance): self + { + $this->options['beepOnCustomerEntrance'] = $beepOnCustomerEntrance; + return $this; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateReservationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationPage.php new file mode 100755 index 0000000..bca0154 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/ReservationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ReservationInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\ReservationInstance + */ + public function buildInstance(array $payload): ReservationInstance + { + return new ReservationInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workerSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.ReservationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelContext.php new file mode 100755 index 0000000..a3350ce --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelContext.php @@ -0,0 +1,127 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workerSid' => + $workerSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($workerSid) + .'/Channels/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the WorkerChannelInstance + * + * @return WorkerChannelInstance Fetched WorkerChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkerChannelInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WorkerChannelInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WorkerChannelInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerChannelInstance Updated WorkerChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkerChannelInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Capacity' => + $options['capacity'], + 'Available' => + Serialize::booleanToString($options['available']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WorkerChannelInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerChannelContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelInstance.php new file mode 100755 index 0000000..f400724 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assignedTasks' => Values::array_get($payload, 'assigned_tasks'), + 'available' => Values::array_get($payload, 'available'), + 'availableCapacityPercentage' => Values::array_get($payload, 'available_capacity_percentage'), + 'configuredCapacity' => Values::array_get($payload, 'configured_capacity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'taskChannelSid' => Values::array_get($payload, 'task_channel_sid'), + 'taskChannelUniqueName' => Values::array_get($payload, 'task_channel_unique_name'), + 'workerSid' => Values::array_get($payload, 'worker_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workerSid' => $workerSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkerChannelContext Context for this WorkerChannelInstance + */ + protected function proxy(): WorkerChannelContext + { + if (!$this->context) { + $this->context = new WorkerChannelContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkerChannelInstance + * + * @return WorkerChannelInstance Fetched WorkerChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkerChannelInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WorkerChannelInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerChannelInstance Updated WorkerChannelInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkerChannelInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerChannelInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelList.php new file mode 100755 index 0000000..08b20e1 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelList.php @@ -0,0 +1,175 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workerSid' => + $workerSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($workerSid) + .'/Channels'; + } + + /** + * Reads WorkerChannelInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WorkerChannelInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WorkerChannelInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WorkerChannelInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WorkerChannelPage Page of WorkerChannelInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WorkerChannelPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WorkerChannelPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WorkerChannelInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WorkerChannelPage Page of WorkerChannelInstance + */ + public function getPage(string $targetUrl): WorkerChannelPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WorkerChannelPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WorkerChannelContext + * + * @param string $sid The SID of the WorkerChannel to fetch. + */ + public function getContext( + string $sid + + ): WorkerChannelContext + { + return new WorkerChannelContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerChannelList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelOptions.php new file mode 100755 index 0000000..29a19b3 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelOptions.php @@ -0,0 +1,98 @@ +options['capacity'] = $capacity; + $this->options['available'] = $available; + } + + /** + * The total number of Tasks that the Worker should handle for the TaskChannel type. TaskRouter creates reservations for Tasks of this TaskChannel type up to the specified capacity. If the capacity is 0, no new reservations will be created. + * + * @param int $capacity The total number of Tasks that the Worker should handle for the TaskChannel type. TaskRouter creates reservations for Tasks of this TaskChannel type up to the specified capacity. If the capacity is 0, no new reservations will be created. + * @return $this Fluent Builder + */ + public function setCapacity(int $capacity): self + { + $this->options['capacity'] = $capacity; + return $this; + } + + /** + * Whether the WorkerChannel is available. Set to `false` to prevent the Worker from receiving any new Tasks of this TaskChannel type. + * + * @param bool $available Whether the WorkerChannel is available. Set to `false` to prevent the Worker from receiving any new Tasks of this TaskChannel type. + * @return $this Fluent Builder + */ + public function setAvailable(bool $available): self + { + $this->options['available'] = $available; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateWorkerChannelOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelPage.php new file mode 100755 index 0000000..37c856a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerChannelPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkerChannelInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\WorkerChannelInstance + */ + public function buildInstance(array $payload): WorkerChannelInstance + { + return new WorkerChannelInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workerSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerChannelPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsContext.php new file mode 100755 index 0000000..8414888 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsContext.php @@ -0,0 +1,104 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workerSid' => + $workerSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($workerSid) + .'/Statistics'; + } + + /** + * Fetch the WorkerStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerStatisticsInstance Fetched WorkerStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkerStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkerStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workerSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsInstance.php new file mode 100755 index 0000000..3b8370e --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsInstance.php @@ -0,0 +1,127 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'workerSid' => Values::array_get($payload, 'worker_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workerSid' => $workerSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkerStatisticsContext Context for this WorkerStatisticsInstance + */ + protected function proxy(): WorkerStatisticsContext + { + if (!$this->context) { + $this->context = new WorkerStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkerStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerStatisticsInstance Fetched WorkerStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkerStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsList.php new file mode 100755 index 0000000..d265d23 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workerSid' => + $workerSid, + + ]; + } + + /** + * Constructs a WorkerStatisticsContext + */ + public function getContext( + + ): WorkerStatisticsContext + { + return new WorkerStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workerSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsOptions.php new file mode 100755 index 0000000..aaec078 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsOptions.php @@ -0,0 +1,130 @@ +options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkerStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsPage.php new file mode 100755 index 0000000..8113217 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkerStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkerStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\WorkerStatisticsInstance + */ + public function buildInstance(array $payload): WorkerStatisticsInstance + { + return new WorkerStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workerSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsContext.php new file mode 100755 index 0000000..dac4f25 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsContext.php @@ -0,0 +1,98 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/CumulativeStatistics'; + } + + /** + * Fetch the WorkersCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersCumulativeStatisticsInstance Fetched WorkersCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersCumulativeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkersCumulativeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersCumulativeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsInstance.php new file mode 100755 index 0000000..e52b0e5 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'activityDurations' => Values::array_get($payload, 'activity_durations'), + 'reservationsCreated' => Values::array_get($payload, 'reservations_created'), + 'reservationsAccepted' => Values::array_get($payload, 'reservations_accepted'), + 'reservationsRejected' => Values::array_get($payload, 'reservations_rejected'), + 'reservationsTimedOut' => Values::array_get($payload, 'reservations_timed_out'), + 'reservationsCanceled' => Values::array_get($payload, 'reservations_canceled'), + 'reservationsRescinded' => Values::array_get($payload, 'reservations_rescinded'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkersCumulativeStatisticsContext Context for this WorkersCumulativeStatisticsInstance + */ + protected function proxy(): WorkersCumulativeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkersCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkersCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersCumulativeStatisticsInstance Fetched WorkersCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersCumulativeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersCumulativeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsList.php new file mode 100755 index 0000000..703889a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkersCumulativeStatisticsContext + */ + public function getContext( + + ): WorkersCumulativeStatisticsContext + { + return new WorkersCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersCumulativeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsOptions.php new file mode 100755 index 0000000..e6fcbae --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsOptions.php @@ -0,0 +1,130 @@ +options['endDate'] = $endDate; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkersCumulativeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsPage.php new file mode 100755 index 0000000..557c297 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersCumulativeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkersCumulativeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\WorkersCumulativeStatisticsInstance + */ + public function buildInstance(array $payload): WorkersCumulativeStatisticsInstance + { + return new WorkersCumulativeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersCumulativeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsContext.php new file mode 100755 index 0000000..23cdc38 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsContext.php @@ -0,0 +1,91 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/RealTimeStatistics'; + } + + /** + * Fetch the WorkersRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersRealTimeStatisticsInstance Fetched WorkersRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersRealTimeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkersRealTimeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersRealTimeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsInstance.php new file mode 100755 index 0000000..1ce06d8 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'activityStatistics' => Values::array_get($payload, 'activity_statistics'), + 'totalWorkers' => Values::array_get($payload, 'total_workers'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkersRealTimeStatisticsContext Context for this WorkersRealTimeStatisticsInstance + */ + protected function proxy(): WorkersRealTimeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkersRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkersRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersRealTimeStatisticsInstance Fetched WorkersRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersRealTimeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersRealTimeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsList.php new file mode 100755 index 0000000..897814a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkersRealTimeStatisticsContext + */ + public function getContext( + + ): WorkersRealTimeStatisticsContext + { + return new WorkersRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersRealTimeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsOptions.php new file mode 100755 index 0000000..501f31f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsOptions.php @@ -0,0 +1,76 @@ +options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkersRealTimeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsPage.php new file mode 100755 index 0000000..e9d5544 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersRealTimeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkersRealTimeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\WorkersRealTimeStatisticsInstance + */ + public function buildInstance(array $payload): WorkersRealTimeStatisticsInstance + { + return new WorkersRealTimeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersRealTimeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsContext.php new file mode 100755 index 0000000..908f431 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsContext.php @@ -0,0 +1,104 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/Statistics'; + } + + /** + * Fetch the WorkersStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersStatisticsInstance Fetched WorkersStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'TaskQueueSid' => + $options['taskQueueSid'], + 'TaskQueueName' => + $options['taskQueueName'], + 'FriendlyName' => + $options['friendlyName'], + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkersStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsInstance.php new file mode 100755 index 0000000..92bb182 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'realtime' => Values::array_get($payload, 'realtime'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkersStatisticsContext Context for this WorkersStatisticsInstance + */ + protected function proxy(): WorkersStatisticsContext + { + if (!$this->context) { + $this->context = new WorkersStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkersStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkersStatisticsInstance Fetched WorkersStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkersStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkersStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsList.php new file mode 100755 index 0000000..2b34279 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkersStatisticsContext + */ + public function getContext( + + ): WorkersStatisticsContext + { + return new WorkersStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsOptions.php new file mode 100755 index 0000000..194b9f3 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsOptions.php @@ -0,0 +1,184 @@ +options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['taskQueueSid'] = $taskQueueSid; + $this->options['taskQueueName'] = $taskQueueName; + $this->options['friendlyName'] = $friendlyName; + $this->options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * The SID of the TaskQueue for which to fetch Worker statistics. + * + * @param string $taskQueueSid The SID of the TaskQueue for which to fetch Worker statistics. + * @return $this Fluent Builder + */ + public function setTaskQueueSid(string $taskQueueSid): self + { + $this->options['taskQueueSid'] = $taskQueueSid; + return $this; + } + + /** + * The `friendly_name` of the TaskQueue for which to fetch Worker statistics. + * + * @param string $taskQueueName The `friendly_name` of the TaskQueue for which to fetch Worker statistics. + * @return $this Fluent Builder + */ + public function setTaskQueueName(string $taskQueueName): self + { + $this->options['taskQueueName'] = $taskQueueName; + return $this; + } + + /** + * Only include Workers with `friendly_name` values that match this parameter. + * + * @param string $friendlyName Only include Workers with `friendly_name` values that match this parameter. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkersStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsPage.php new file mode 100755 index 0000000..cc486ec --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Worker/WorkersStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkersStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Worker\WorkersStatisticsInstance + */ + public function buildInstance(array $payload): WorkersStatisticsInstance + { + return new WorkersStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkersStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerContext.php new file mode 100755 index 0000000..fb6e249 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerContext.php @@ -0,0 +1,283 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WorkerInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + $options = new Values($options); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + return $this->version->delete('DELETE', $this->uri, [], [], $headers); + } + + + /** + * Fetch the WorkerInstance + * + * @return WorkerInstance Fetched WorkerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkerInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WorkerInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WorkerInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerInstance Updated WorkerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkerInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'ActivitySid' => + $options['activitySid'], + 'Attributes' => + $options['attributes'], + 'FriendlyName' => + $options['friendlyName'], + 'RejectPendingReservations' => + Serialize::booleanToString($options['rejectPendingReservations']), + ]); + + $headers = Values::of(['If-Match' => $options['ifMatch']]); + + $payload = $this->version->update('POST', $this->uri, [], $data, $headers); + + return new WorkerInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the workerChannels + */ + protected function getWorkerChannels(): WorkerChannelList + { + if (!$this->_workerChannels) { + $this->_workerChannels = new WorkerChannelList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_workerChannels; + } + + /** + * Access the reservations + */ + protected function getReservations(): ReservationList + { + if (!$this->_reservations) { + $this->_reservations = new ReservationList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_reservations; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkersRealTimeStatisticsList + { + if (!$this->_realTimeStatistics) { + $this->_realTimeStatistics = new WorkersRealTimeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_realTimeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkerStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new WorkerStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkersCumulativeStatisticsList + { + if (!$this->_cumulativeStatistics) { + $this->_cumulativeStatistics = new WorkersCumulativeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_cumulativeStatistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerInstance.php new file mode 100755 index 0000000..c28f2fd --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerInstance.php @@ -0,0 +1,220 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'activityName' => Values::array_get($payload, 'activity_name'), + 'activitySid' => Values::array_get($payload, 'activity_sid'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'available' => Values::array_get($payload, 'available'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateStatusChanged' => Deserialize::dateTime(Values::array_get($payload, 'date_status_changed')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkerContext Context for this WorkerInstance + */ + protected function proxy(): WorkerContext + { + if (!$this->context) { + $this->context = new WorkerContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WorkerInstance + * + * @param array|Options $options Optional Arguments + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(array $options = []): bool + { + + return $this->proxy()->delete($options); + } + + /** + * Fetch the WorkerInstance + * + * @return WorkerInstance Fetched WorkerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkerInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WorkerInstance + * + * @param array|Options $options Optional Arguments + * @return WorkerInstance Updated WorkerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkerInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the workerChannels + */ + protected function getWorkerChannels(): WorkerChannelList + { + return $this->proxy()->workerChannels; + } + + /** + * Access the reservations + */ + protected function getReservations(): ReservationList + { + return $this->proxy()->reservations; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkersRealTimeStatisticsList + { + return $this->proxy()->realTimeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkerStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkersCumulativeStatisticsList + { + return $this->proxy()->cumulativeStatistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkerInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerList.php new file mode 100755 index 0000000..a4ff34c --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerList.php @@ -0,0 +1,279 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workers'; + } + + /** + * Create the WorkerInstance + * + * @param string $friendlyName A descriptive string that you create to describe the new Worker. It can be up to 64 characters long. + * @param array|Options $options Optional Arguments + * @return WorkerInstance Created WorkerInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): WorkerInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'ActivitySid' => + $options['activitySid'], + 'Attributes' => + $options['attributes'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WorkerInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads WorkerInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WorkerInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams WorkerInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WorkerInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WorkerPage Page of WorkerInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WorkerPage + { + $options = new Values($options); + + $params = Values::of([ + 'ActivityName' => + $options['activityName'], + 'ActivitySid' => + $options['activitySid'], + 'Available' => + $options['available'], + 'FriendlyName' => + $options['friendlyName'], + 'TargetWorkersExpression' => + $options['targetWorkersExpression'], + 'TaskQueueName' => + $options['taskQueueName'], + 'TaskQueueSid' => + $options['taskQueueSid'], + 'Ordering' => + $options['ordering'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WorkerPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WorkerInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WorkerPage Page of WorkerInstance + */ + public function getPage(string $targetUrl): WorkerPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WorkerPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WorkerContext + * + * @param string $sid The SID of the Worker resource to delete. + */ + public function getContext( + string $sid + + ): WorkerContext + { + return new WorkerContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkersStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new WorkersStatisticsList( + $this->version, + $this->solution['workspaceSid'] + ); + } + return $this->_statistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerOptions.php new file mode 100755 index 0000000..9215f28 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerOptions.php @@ -0,0 +1,450 @@ +options['activitySid'] = $activitySid; + $this->options['attributes'] = $attributes; + } + + /** + * The SID of a valid Activity that will describe the new Worker's initial state. See [Activities](https://www.twilio.com/docs/taskrouter/api/activity) for more information. If not provided, the new Worker's initial state is the `default_activity_sid` configured on the Workspace. + * + * @param string $activitySid The SID of a valid Activity that will describe the new Worker's initial state. See [Activities](https://www.twilio.com/docs/taskrouter/api/activity) for more information. If not provided, the new Worker's initial state is the `default_activity_sid` configured on the Workspace. + * @return $this Fluent Builder + */ + public function setActivitySid(string $activitySid): self + { + $this->options['activitySid'] = $activitySid; + return $this; + } + + /** + * A valid JSON string that describes the new Worker. For example: `{ \\\"email\\\": \\\"Bob@example.com\\\", \\\"phone\\\": \\\"+5095551234\\\" }`. This data is passed to the `assignment_callback_url` when TaskRouter assigns a Task to the Worker. Defaults to {}. + * + * @param string $attributes A valid JSON string that describes the new Worker. For example: `{ \\\"email\\\": \\\"Bob@example.com\\\", \\\"phone\\\": \\\"+5095551234\\\" }`. This data is passed to the `assignment_callback_url` when TaskRouter assigns a Task to the Worker. Defaults to {}. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateWorkerOptions ' . $options . ']'; + } +} + +class DeleteWorkerOptions extends Options + { + /** + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $ifMatch = Values::NONE + + ) { + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.DeleteWorkerOptions ' . $options . ']'; + } +} + + +class ReadWorkerOptions extends Options + { + /** + * @param string $activityName The `activity_name` of the Worker resources to read. + * @param string $activitySid The `activity_sid` of the Worker resources to read. + * @param string $available Whether to return only Worker resources that are available or unavailable. Can be `true`, `1`, or `yes` to return Worker resources that are available, and `false`, or any value returns the Worker resources that are not available. + * @param string $friendlyName The `friendly_name` of the Worker resources to read. + * @param string $targetWorkersExpression Filter by Workers that would match an expression on a TaskQueue. This is helpful for debugging which Workers would match a potential queue. + * @param string $taskQueueName The `friendly_name` of the TaskQueue that the Workers to read are eligible for. + * @param string $taskQueueSid The SID of the TaskQueue that the Workers to read are eligible for. + * @param string $ordering Sorting parameter for Workers + */ + public function __construct( + + string $activityName = Values::NONE, + string $activitySid = Values::NONE, + string $available = Values::NONE, + string $friendlyName = Values::NONE, + string $targetWorkersExpression = Values::NONE, + string $taskQueueName = Values::NONE, + string $taskQueueSid = Values::NONE, + string $ordering = Values::NONE + + ) { + $this->options['activityName'] = $activityName; + $this->options['activitySid'] = $activitySid; + $this->options['available'] = $available; + $this->options['friendlyName'] = $friendlyName; + $this->options['targetWorkersExpression'] = $targetWorkersExpression; + $this->options['taskQueueName'] = $taskQueueName; + $this->options['taskQueueSid'] = $taskQueueSid; + $this->options['ordering'] = $ordering; + } + + /** + * The `activity_name` of the Worker resources to read. + * + * @param string $activityName The `activity_name` of the Worker resources to read. + * @return $this Fluent Builder + */ + public function setActivityName(string $activityName): self + { + $this->options['activityName'] = $activityName; + return $this; + } + + /** + * The `activity_sid` of the Worker resources to read. + * + * @param string $activitySid The `activity_sid` of the Worker resources to read. + * @return $this Fluent Builder + */ + public function setActivitySid(string $activitySid): self + { + $this->options['activitySid'] = $activitySid; + return $this; + } + + /** + * Whether to return only Worker resources that are available or unavailable. Can be `true`, `1`, or `yes` to return Worker resources that are available, and `false`, or any value returns the Worker resources that are not available. + * + * @param string $available Whether to return only Worker resources that are available or unavailable. Can be `true`, `1`, or `yes` to return Worker resources that are available, and `false`, or any value returns the Worker resources that are not available. + * @return $this Fluent Builder + */ + public function setAvailable(string $available): self + { + $this->options['available'] = $available; + return $this; + } + + /** + * The `friendly_name` of the Worker resources to read. + * + * @param string $friendlyName The `friendly_name` of the Worker resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Filter by Workers that would match an expression on a TaskQueue. This is helpful for debugging which Workers would match a potential queue. + * + * @param string $targetWorkersExpression Filter by Workers that would match an expression on a TaskQueue. This is helpful for debugging which Workers would match a potential queue. + * @return $this Fluent Builder + */ + public function setTargetWorkersExpression(string $targetWorkersExpression): self + { + $this->options['targetWorkersExpression'] = $targetWorkersExpression; + return $this; + } + + /** + * The `friendly_name` of the TaskQueue that the Workers to read are eligible for. + * + * @param string $taskQueueName The `friendly_name` of the TaskQueue that the Workers to read are eligible for. + * @return $this Fluent Builder + */ + public function setTaskQueueName(string $taskQueueName): self + { + $this->options['taskQueueName'] = $taskQueueName; + return $this; + } + + /** + * The SID of the TaskQueue that the Workers to read are eligible for. + * + * @param string $taskQueueSid The SID of the TaskQueue that the Workers to read are eligible for. + * @return $this Fluent Builder + */ + public function setTaskQueueSid(string $taskQueueSid): self + { + $this->options['taskQueueSid'] = $taskQueueSid; + return $this; + } + + /** + * Sorting parameter for Workers + * + * @param string $ordering Sorting parameter for Workers + * @return $this Fluent Builder + */ + public function setOrdering(string $ordering): self + { + $this->options['ordering'] = $ordering; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadWorkerOptions ' . $options . ']'; + } +} + +class UpdateWorkerOptions extends Options + { + /** + * @param string $activitySid The SID of a valid Activity that will describe the Worker's initial state. See [Activities](https://www.twilio.com/docs/taskrouter/api/activity) for more information. + * @param string $attributes The JSON string that describes the Worker. For example: `{ \\\"email\\\": \\\"Bob@example.com\\\", \\\"phone\\\": \\\"+5095551234\\\" }`. This data is passed to the `assignment_callback_url` when TaskRouter assigns a Task to the Worker. Defaults to {}. + * @param string $friendlyName A descriptive string that you create to describe the Worker. It can be up to 64 characters long. + * @param bool $rejectPendingReservations Whether to reject the Worker's pending reservations. This option is only valid if the Worker's new [Activity](https://www.twilio.com/docs/taskrouter/api/activity) resource has its `availability` property set to `False`. + * @param string $ifMatch The If-Match HTTP request header + */ + public function __construct( + + string $activitySid = Values::NONE, + string $attributes = Values::NONE, + string $friendlyName = Values::NONE, + bool $rejectPendingReservations = Values::BOOL_NONE, + string $ifMatch = Values::NONE + + ) { + $this->options['activitySid'] = $activitySid; + $this->options['attributes'] = $attributes; + $this->options['friendlyName'] = $friendlyName; + $this->options['rejectPendingReservations'] = $rejectPendingReservations; + $this->options['ifMatch'] = $ifMatch; + } + + /** + * The SID of a valid Activity that will describe the Worker's initial state. See [Activities](https://www.twilio.com/docs/taskrouter/api/activity) for more information. + * + * @param string $activitySid The SID of a valid Activity that will describe the Worker's initial state. See [Activities](https://www.twilio.com/docs/taskrouter/api/activity) for more information. + * @return $this Fluent Builder + */ + public function setActivitySid(string $activitySid): self + { + $this->options['activitySid'] = $activitySid; + return $this; + } + + /** + * The JSON string that describes the Worker. For example: `{ \\\"email\\\": \\\"Bob@example.com\\\", \\\"phone\\\": \\\"+5095551234\\\" }`. This data is passed to the `assignment_callback_url` when TaskRouter assigns a Task to the Worker. Defaults to {}. + * + * @param string $attributes The JSON string that describes the Worker. For example: `{ \\\"email\\\": \\\"Bob@example.com\\\", \\\"phone\\\": \\\"+5095551234\\\" }`. This data is passed to the `assignment_callback_url` when TaskRouter assigns a Task to the Worker. Defaults to {}. + * @return $this Fluent Builder + */ + public function setAttributes(string $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * A descriptive string that you create to describe the Worker. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the Worker. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether to reject the Worker's pending reservations. This option is only valid if the Worker's new [Activity](https://www.twilio.com/docs/taskrouter/api/activity) resource has its `availability` property set to `False`. + * + * @param bool $rejectPendingReservations Whether to reject the Worker's pending reservations. This option is only valid if the Worker's new [Activity](https://www.twilio.com/docs/taskrouter/api/activity) resource has its `availability` property set to `False`. + * @return $this Fluent Builder + */ + public function setRejectPendingReservations(bool $rejectPendingReservations): self + { + $this->options['rejectPendingReservations'] = $rejectPendingReservations; + return $this; + } + + /** + * The If-Match HTTP request header + * + * @param string $ifMatch The If-Match HTTP request header + * @return $this Fluent Builder + */ + public function setIfMatch(string $ifMatch): self + { + $this->options['ifMatch'] = $ifMatch; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateWorkerOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerPage.php new file mode 100755 index 0000000..9c3d05d --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkerPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkerInstance \Twilio\Rest\Taskrouter\V1\Workspace\WorkerInstance + */ + public function buildInstance(array $payload): WorkerInstance + { + return new WorkerInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkerPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsContext.php new file mode 100755 index 0000000..93a00e9 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsContext.php @@ -0,0 +1,106 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workflowSid' => + $workflowSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workflows/' . \rawurlencode($workflowSid) + .'/CumulativeStatistics'; + } + + /** + * Fetch the WorkflowCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowCumulativeStatisticsInstance Fetched WorkflowCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowCumulativeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkflowCumulativeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowCumulativeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsInstance.php new file mode 100755 index 0000000..a43b7b5 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'avgTaskAcceptanceTime' => Values::array_get($payload, 'avg_task_acceptance_time'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'reservationsCreated' => Values::array_get($payload, 'reservations_created'), + 'reservationsAccepted' => Values::array_get($payload, 'reservations_accepted'), + 'reservationsRejected' => Values::array_get($payload, 'reservations_rejected'), + 'reservationsTimedOut' => Values::array_get($payload, 'reservations_timed_out'), + 'reservationsCanceled' => Values::array_get($payload, 'reservations_canceled'), + 'reservationsRescinded' => Values::array_get($payload, 'reservations_rescinded'), + 'splitByWaitTime' => Values::array_get($payload, 'split_by_wait_time'), + 'waitDurationUntilAccepted' => Values::array_get($payload, 'wait_duration_until_accepted'), + 'waitDurationUntilCanceled' => Values::array_get($payload, 'wait_duration_until_canceled'), + 'tasksCanceled' => Values::array_get($payload, 'tasks_canceled'), + 'tasksCompleted' => Values::array_get($payload, 'tasks_completed'), + 'tasksEntered' => Values::array_get($payload, 'tasks_entered'), + 'tasksDeleted' => Values::array_get($payload, 'tasks_deleted'), + 'tasksMoved' => Values::array_get($payload, 'tasks_moved'), + 'tasksTimedOutInWorkflow' => Values::array_get($payload, 'tasks_timed_out_in_workflow'), + 'workflowSid' => Values::array_get($payload, 'workflow_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workflowSid' => $workflowSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkflowCumulativeStatisticsContext Context for this WorkflowCumulativeStatisticsInstance + */ + protected function proxy(): WorkflowCumulativeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkflowCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkflowCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowCumulativeStatisticsInstance Fetched WorkflowCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowCumulativeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowCumulativeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsList.php new file mode 100755 index 0000000..a812f6f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workflowSid' => + $workflowSid, + + ]; + } + + /** + * Constructs a WorkflowCumulativeStatisticsContext + */ + public function getContext( + + ): WorkflowCumulativeStatisticsContext + { + return new WorkflowCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowCumulativeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsOptions.php new file mode 100755 index 0000000..3f9453a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsOptions.php @@ -0,0 +1,148 @@ +options['endDate'] = $endDate; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. TaskRouter will calculate statistics on up to 10,000 Tasks for any given threshold. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. TaskRouter will calculate statistics on up to 10,000 Tasks for any given threshold. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkflowCumulativeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsPage.php new file mode 100755 index 0000000..d057169 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowCumulativeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkflowCumulativeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Workflow\WorkflowCumulativeStatisticsInstance + */ + public function buildInstance(array $payload): WorkflowCumulativeStatisticsInstance + { + return new WorkflowCumulativeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workflowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowCumulativeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsContext.php new file mode 100755 index 0000000..d2ea85f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsContext.php @@ -0,0 +1,97 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workflowSid' => + $workflowSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workflows/' . \rawurlencode($workflowSid) + .'/RealTimeStatistics'; + } + + /** + * Fetch the WorkflowRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowRealTimeStatisticsInstance Fetched WorkflowRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowRealTimeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkflowRealTimeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowRealTimeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsInstance.php new file mode 100755 index 0000000..7d3003f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'longestTaskWaitingAge' => Values::array_get($payload, 'longest_task_waiting_age'), + 'longestTaskWaitingSid' => Values::array_get($payload, 'longest_task_waiting_sid'), + 'tasksByPriority' => Values::array_get($payload, 'tasks_by_priority'), + 'tasksByStatus' => Values::array_get($payload, 'tasks_by_status'), + 'totalTasks' => Values::array_get($payload, 'total_tasks'), + 'workflowSid' => Values::array_get($payload, 'workflow_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workflowSid' => $workflowSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkflowRealTimeStatisticsContext Context for this WorkflowRealTimeStatisticsInstance + */ + protected function proxy(): WorkflowRealTimeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkflowRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkflowRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowRealTimeStatisticsInstance Fetched WorkflowRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowRealTimeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowRealTimeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsList.php new file mode 100755 index 0000000..8bdd417 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workflowSid' => + $workflowSid, + + ]; + } + + /** + * Constructs a WorkflowRealTimeStatisticsContext + */ + public function getContext( + + ): WorkflowRealTimeStatisticsContext + { + return new WorkflowRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowRealTimeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsOptions.php new file mode 100755 index 0000000..cbd6a3e --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsOptions.php @@ -0,0 +1,76 @@ +options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkflowRealTimeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsPage.php new file mode 100755 index 0000000..1ea2944 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowRealTimeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkflowRealTimeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Workflow\WorkflowRealTimeStatisticsInstance + */ + public function buildInstance(array $payload): WorkflowRealTimeStatisticsInstance + { + return new WorkflowRealTimeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workflowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowRealTimeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsContext.php new file mode 100755 index 0000000..386f74e --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsContext.php @@ -0,0 +1,106 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'workflowSid' => + $workflowSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workflows/' . \rawurlencode($workflowSid) + .'/Statistics'; + } + + /** + * Fetch the WorkflowStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowStatisticsInstance Fetched WorkflowStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkflowStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsInstance.php new file mode 100755 index 0000000..7159e85 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'realtime' => Values::array_get($payload, 'realtime'), + 'workflowSid' => Values::array_get($payload, 'workflow_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'workflowSid' => $workflowSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkflowStatisticsContext Context for this WorkflowStatisticsInstance + */ + protected function proxy(): WorkflowStatisticsContext + { + if (!$this->context) { + $this->context = new WorkflowStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkflowStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowStatisticsInstance Fetched WorkflowStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkflowStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsList.php new file mode 100755 index 0000000..72c5d3d --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsList.php @@ -0,0 +1,73 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + 'workflowSid' => + $workflowSid, + + ]; + } + + /** + * Constructs a WorkflowStatisticsContext + */ + public function getContext( + + ): WorkflowStatisticsContext + { + return new WorkflowStatisticsContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['workflowSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsOptions.php new file mode 100755 index 0000000..b5f8e12 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsOptions.php @@ -0,0 +1,148 @@ +options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkflowStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsPage.php new file mode 100755 index 0000000..3d4cedf --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/Workflow/WorkflowStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkflowStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\Workflow\WorkflowStatisticsInstance + */ + public function buildInstance(array $payload): WorkflowStatisticsInstance + { + return new WorkflowStatisticsInstance($this->version, $payload, $this->solution['workspaceSid'], $this->solution['workflowSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowContext.php new file mode 100755 index 0000000..baed7ff --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowContext.php @@ -0,0 +1,239 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workflows/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WorkflowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WorkflowInstance + * + * @return WorkflowInstance Fetched WorkflowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkflowInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WorkflowInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WorkflowInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowInstance Updated WorkflowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkflowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'AssignmentCallbackUrl' => + $options['assignmentCallbackUrl'], + 'FallbackAssignmentCallbackUrl' => + $options['fallbackAssignmentCallbackUrl'], + 'Configuration' => + $options['configuration'], + 'TaskReservationTimeout' => + $options['taskReservationTimeout'], + 'ReEvaluateTasks' => + $options['reEvaluateTasks'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WorkflowInstance( + $this->version, + $payload, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the statistics + */ + protected function getStatistics(): WorkflowStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new WorkflowStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkflowCumulativeStatisticsList + { + if (!$this->_cumulativeStatistics) { + $this->_cumulativeStatistics = new WorkflowCumulativeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_cumulativeStatistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkflowRealTimeStatisticsList + { + if (!$this->_realTimeStatistics) { + $this->_realTimeStatistics = new WorkflowRealTimeStatisticsList( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->_realTimeStatistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowInstance.php new file mode 100755 index 0000000..f47fdfc --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowInstance.php @@ -0,0 +1,199 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'assignmentCallbackUrl' => Values::array_get($payload, 'assignment_callback_url'), + 'configuration' => Values::array_get($payload, 'configuration'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'documentContentType' => Values::array_get($payload, 'document_content_type'), + 'fallbackAssignmentCallbackUrl' => Values::array_get($payload, 'fallback_assignment_callback_url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'sid' => Values::array_get($payload, 'sid'), + 'taskReservationTimeout' => Values::array_get($payload, 'task_reservation_timeout'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkflowContext Context for this WorkflowInstance + */ + protected function proxy(): WorkflowContext + { + if (!$this->context) { + $this->context = new WorkflowContext( + $this->version, + $this->solution['workspaceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WorkflowInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WorkflowInstance + * + * @return WorkflowInstance Fetched WorkflowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkflowInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WorkflowInstance + * + * @param array|Options $options Optional Arguments + * @return WorkflowInstance Updated WorkflowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkflowInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkflowStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkflowCumulativeStatisticsList + { + return $this->proxy()->cumulativeStatistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkflowRealTimeStatisticsList + { + return $this->proxy()->realTimeStatistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkflowInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowList.php new file mode 100755 index 0000000..8170aa3 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowList.php @@ -0,0 +1,213 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Workflows'; + } + + /** + * Create the WorkflowInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Workflow resource. For example, `Inbound Call Workflow` or `2014 Outbound Campaign`. + * @param string $configuration A JSON string that contains the rules to apply to the Workflow. See [Configuring Workflows](https://www.twilio.com/docs/taskrouter/workflow-configuration) for more information. + * @param array|Options $options Optional Arguments + * @return WorkflowInstance Created WorkflowInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $configuration, array $options = []): WorkflowInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Configuration' => + $configuration, + 'AssignmentCallbackUrl' => + $options['assignmentCallbackUrl'], + 'FallbackAssignmentCallbackUrl' => + $options['fallbackAssignmentCallbackUrl'], + 'TaskReservationTimeout' => + $options['taskReservationTimeout'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WorkflowInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Reads WorkflowInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WorkflowInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams WorkflowInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WorkflowInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WorkflowPage Page of WorkflowInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WorkflowPage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WorkflowPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WorkflowInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WorkflowPage Page of WorkflowInstance + */ + public function getPage(string $targetUrl): WorkflowPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WorkflowPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WorkflowContext + * + * @param string $sid The SID of the Workflow resource to delete. + */ + public function getContext( + string $sid + + ): WorkflowContext + { + return new WorkflowContext( + $this->version, + $this->solution['workspaceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowOptions.php new file mode 100755 index 0000000..f2db863 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowOptions.php @@ -0,0 +1,310 @@ +options['assignmentCallbackUrl'] = $assignmentCallbackUrl; + $this->options['fallbackAssignmentCallbackUrl'] = $fallbackAssignmentCallbackUrl; + $this->options['taskReservationTimeout'] = $taskReservationTimeout; + } + + /** + * The URL from your application that will process task assignment events. See [Handling Task Assignment Callback](https://www.twilio.com/docs/taskrouter/handle-assignment-callbacks) for more details. + * + * @param string $assignmentCallbackUrl The URL from your application that will process task assignment events. See [Handling Task Assignment Callback](https://www.twilio.com/docs/taskrouter/handle-assignment-callbacks) for more details. + * @return $this Fluent Builder + */ + public function setAssignmentCallbackUrl(string $assignmentCallbackUrl): self + { + $this->options['assignmentCallbackUrl'] = $assignmentCallbackUrl; + return $this; + } + + /** + * The URL that we should call when a call to the `assignment_callback_url` fails. + * + * @param string $fallbackAssignmentCallbackUrl The URL that we should call when a call to the `assignment_callback_url` fails. + * @return $this Fluent Builder + */ + public function setFallbackAssignmentCallbackUrl(string $fallbackAssignmentCallbackUrl): self + { + $this->options['fallbackAssignmentCallbackUrl'] = $fallbackAssignmentCallbackUrl; + return $this; + } + + /** + * How long TaskRouter will wait for a confirmation response from your application after it assigns a Task to a Worker. Can be up to `86,400` (24 hours) and the default is `120`. + * + * @param int $taskReservationTimeout How long TaskRouter will wait for a confirmation response from your application after it assigns a Task to a Worker. Can be up to `86,400` (24 hours) and the default is `120`. + * @return $this Fluent Builder + */ + public function setTaskReservationTimeout(int $taskReservationTimeout): self + { + $this->options['taskReservationTimeout'] = $taskReservationTimeout; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateWorkflowOptions ' . $options . ']'; + } +} + + + +class ReadWorkflowOptions extends Options + { + /** + * @param string $friendlyName The `friendly_name` of the Workflow resources to read. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The `friendly_name` of the Workflow resources to read. + * + * @param string $friendlyName The `friendly_name` of the Workflow resources to read. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadWorkflowOptions ' . $options . ']'; + } +} + +class UpdateWorkflowOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the Workflow resource. For example, `Inbound Call Workflow` or `2014 Outbound Campaign`. + * @param string $assignmentCallbackUrl The URL from your application that will process task assignment events. See [Handling Task Assignment Callback](https://www.twilio.com/docs/taskrouter/handle-assignment-callbacks) for more details. + * @param string $fallbackAssignmentCallbackUrl The URL that we should call when a call to the `assignment_callback_url` fails. + * @param string $configuration A JSON string that contains the rules to apply to the Workflow. See [Configuring Workflows](https://www.twilio.com/docs/taskrouter/workflow-configuration) for more information. + * @param int $taskReservationTimeout How long TaskRouter will wait for a confirmation response from your application after it assigns a Task to a Worker. Can be up to `86,400` (24 hours) and the default is `120`. + * @param string $reEvaluateTasks Whether or not to re-evaluate Tasks. The default is `false`, which means Tasks in the Workflow will not be processed through the assignment loop again. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $assignmentCallbackUrl = Values::NONE, + string $fallbackAssignmentCallbackUrl = Values::NONE, + string $configuration = Values::NONE, + int $taskReservationTimeout = Values::INT_NONE, + string $reEvaluateTasks = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['assignmentCallbackUrl'] = $assignmentCallbackUrl; + $this->options['fallbackAssignmentCallbackUrl'] = $fallbackAssignmentCallbackUrl; + $this->options['configuration'] = $configuration; + $this->options['taskReservationTimeout'] = $taskReservationTimeout; + $this->options['reEvaluateTasks'] = $reEvaluateTasks; + } + + /** + * A descriptive string that you create to describe the Workflow resource. For example, `Inbound Call Workflow` or `2014 Outbound Campaign`. + * + * @param string $friendlyName A descriptive string that you create to describe the Workflow resource. For example, `Inbound Call Workflow` or `2014 Outbound Campaign`. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL from your application that will process task assignment events. See [Handling Task Assignment Callback](https://www.twilio.com/docs/taskrouter/handle-assignment-callbacks) for more details. + * + * @param string $assignmentCallbackUrl The URL from your application that will process task assignment events. See [Handling Task Assignment Callback](https://www.twilio.com/docs/taskrouter/handle-assignment-callbacks) for more details. + * @return $this Fluent Builder + */ + public function setAssignmentCallbackUrl(string $assignmentCallbackUrl): self + { + $this->options['assignmentCallbackUrl'] = $assignmentCallbackUrl; + return $this; + } + + /** + * The URL that we should call when a call to the `assignment_callback_url` fails. + * + * @param string $fallbackAssignmentCallbackUrl The URL that we should call when a call to the `assignment_callback_url` fails. + * @return $this Fluent Builder + */ + public function setFallbackAssignmentCallbackUrl(string $fallbackAssignmentCallbackUrl): self + { + $this->options['fallbackAssignmentCallbackUrl'] = $fallbackAssignmentCallbackUrl; + return $this; + } + + /** + * A JSON string that contains the rules to apply to the Workflow. See [Configuring Workflows](https://www.twilio.com/docs/taskrouter/workflow-configuration) for more information. + * + * @param string $configuration A JSON string that contains the rules to apply to the Workflow. See [Configuring Workflows](https://www.twilio.com/docs/taskrouter/workflow-configuration) for more information. + * @return $this Fluent Builder + */ + public function setConfiguration(string $configuration): self + { + $this->options['configuration'] = $configuration; + return $this; + } + + /** + * How long TaskRouter will wait for a confirmation response from your application after it assigns a Task to a Worker. Can be up to `86,400` (24 hours) and the default is `120`. + * + * @param int $taskReservationTimeout How long TaskRouter will wait for a confirmation response from your application after it assigns a Task to a Worker. Can be up to `86,400` (24 hours) and the default is `120`. + * @return $this Fluent Builder + */ + public function setTaskReservationTimeout(int $taskReservationTimeout): self + { + $this->options['taskReservationTimeout'] = $taskReservationTimeout; + return $this; + } + + /** + * Whether or not to re-evaluate Tasks. The default is `false`, which means Tasks in the Workflow will not be processed through the assignment loop again. + * + * @param string $reEvaluateTasks Whether or not to re-evaluate Tasks. The default is `false`, which means Tasks in the Workflow will not be processed through the assignment loop again. + * @return $this Fluent Builder + */ + public function setReEvaluateTasks(string $reEvaluateTasks): self + { + $this->options['reEvaluateTasks'] = $reEvaluateTasks; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateWorkflowOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowPage.php new file mode 100755 index 0000000..5e4fe44 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkflowPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkflowInstance \Twilio\Rest\Taskrouter\V1\Workspace\WorkflowInstance + */ + public function buildInstance(array $payload): WorkflowInstance + { + return new WorkflowInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkflowPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsContext.php new file mode 100755 index 0000000..d749397 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsContext.php @@ -0,0 +1,100 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/CumulativeStatistics'; + } + + /** + * Fetch the WorkspaceCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceCumulativeStatisticsInstance Fetched WorkspaceCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceCumulativeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkspaceCumulativeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceCumulativeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsInstance.php new file mode 100755 index 0000000..b808844 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsInstance.php @@ -0,0 +1,158 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'avgTaskAcceptanceTime' => Values::array_get($payload, 'avg_task_acceptance_time'), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'reservationsCreated' => Values::array_get($payload, 'reservations_created'), + 'reservationsAccepted' => Values::array_get($payload, 'reservations_accepted'), + 'reservationsRejected' => Values::array_get($payload, 'reservations_rejected'), + 'reservationsTimedOut' => Values::array_get($payload, 'reservations_timed_out'), + 'reservationsCanceled' => Values::array_get($payload, 'reservations_canceled'), + 'reservationsRescinded' => Values::array_get($payload, 'reservations_rescinded'), + 'splitByWaitTime' => Values::array_get($payload, 'split_by_wait_time'), + 'waitDurationUntilAccepted' => Values::array_get($payload, 'wait_duration_until_accepted'), + 'waitDurationUntilCanceled' => Values::array_get($payload, 'wait_duration_until_canceled'), + 'tasksCanceled' => Values::array_get($payload, 'tasks_canceled'), + 'tasksCompleted' => Values::array_get($payload, 'tasks_completed'), + 'tasksCreated' => Values::array_get($payload, 'tasks_created'), + 'tasksDeleted' => Values::array_get($payload, 'tasks_deleted'), + 'tasksMoved' => Values::array_get($payload, 'tasks_moved'), + 'tasksTimedOutInWorkflow' => Values::array_get($payload, 'tasks_timed_out_in_workflow'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkspaceCumulativeStatisticsContext Context for this WorkspaceCumulativeStatisticsInstance + */ + protected function proxy(): WorkspaceCumulativeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkspaceCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkspaceCumulativeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceCumulativeStatisticsInstance Fetched WorkspaceCumulativeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceCumulativeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceCumulativeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsList.php new file mode 100755 index 0000000..5d862be --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkspaceCumulativeStatisticsContext + */ + public function getContext( + + ): WorkspaceCumulativeStatisticsContext + { + return new WorkspaceCumulativeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceCumulativeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsOptions.php new file mode 100755 index 0000000..9591b21 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsOptions.php @@ -0,0 +1,148 @@ +options['endDate'] = $endDate; + $this->options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only include usage that occurred on or before this date, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate cumulative statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. TaskRouter will calculate statistics on up to 10,000 Tasks for any given threshold. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. TaskRouter will calculate statistics on up to 10,000 Tasks for any given threshold. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkspaceCumulativeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsPage.php new file mode 100755 index 0000000..1c2ff4a --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceCumulativeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkspaceCumulativeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\WorkspaceCumulativeStatisticsInstance + */ + public function buildInstance(array $payload): WorkspaceCumulativeStatisticsInstance + { + return new WorkspaceCumulativeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceCumulativeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsContext.php new file mode 100755 index 0000000..7bc048f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsContext.php @@ -0,0 +1,91 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/RealTimeStatistics'; + } + + /** + * Fetch the WorkspaceRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceRealTimeStatisticsInstance Fetched WorkspaceRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceRealTimeStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'TaskChannel' => + $options['taskChannel'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkspaceRealTimeStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceRealTimeStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsInstance.php new file mode 100755 index 0000000..7bcc89f --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsInstance.php @@ -0,0 +1,135 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'activityStatistics' => Values::array_get($payload, 'activity_statistics'), + 'longestTaskWaitingAge' => Values::array_get($payload, 'longest_task_waiting_age'), + 'longestTaskWaitingSid' => Values::array_get($payload, 'longest_task_waiting_sid'), + 'tasksByPriority' => Values::array_get($payload, 'tasks_by_priority'), + 'tasksByStatus' => Values::array_get($payload, 'tasks_by_status'), + 'totalTasks' => Values::array_get($payload, 'total_tasks'), + 'totalWorkers' => Values::array_get($payload, 'total_workers'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkspaceRealTimeStatisticsContext Context for this WorkspaceRealTimeStatisticsInstance + */ + protected function proxy(): WorkspaceRealTimeStatisticsContext + { + if (!$this->context) { + $this->context = new WorkspaceRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkspaceRealTimeStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceRealTimeStatisticsInstance Fetched WorkspaceRealTimeStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceRealTimeStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceRealTimeStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsList.php new file mode 100755 index 0000000..6a95354 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkspaceRealTimeStatisticsContext + */ + public function getContext( + + ): WorkspaceRealTimeStatisticsContext + { + return new WorkspaceRealTimeStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceRealTimeStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsOptions.php new file mode 100755 index 0000000..5458b08 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsOptions.php @@ -0,0 +1,76 @@ +options['taskChannel'] = $taskChannel; + } + + /** + * Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate real-time statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkspaceRealTimeStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsPage.php new file mode 100755 index 0000000..8e31491 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceRealTimeStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkspaceRealTimeStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\WorkspaceRealTimeStatisticsInstance + */ + public function buildInstance(array $payload): WorkspaceRealTimeStatisticsInstance + { + return new WorkspaceRealTimeStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceRealTimeStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsContext.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsContext.php new file mode 100755 index 0000000..a8bd605 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsContext.php @@ -0,0 +1,100 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($workspaceSid) + .'/Statistics'; + } + + /** + * Fetch the WorkspaceStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceStatisticsInstance Fetched WorkspaceStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceStatisticsInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'Minutes' => + $options['minutes'], + 'StartDate' => + Serialize::iso8601DateTime($options['startDate']), + 'EndDate' => + Serialize::iso8601DateTime($options['endDate']), + 'TaskChannel' => + $options['taskChannel'], + 'SplitByWaitTime' => + $options['splitByWaitTime'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new WorkspaceStatisticsInstance( + $this->version, + $payload, + $this->solution['workspaceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceStatisticsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsInstance.php new file mode 100755 index 0000000..7c22d90 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsInstance.php @@ -0,0 +1,125 @@ +properties = [ + 'realtime' => Values::array_get($payload, 'realtime'), + 'cumulative' => Values::array_get($payload, 'cumulative'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'workspaceSid' => Values::array_get($payload, 'workspace_sid'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['workspaceSid' => $workspaceSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkspaceStatisticsContext Context for this WorkspaceStatisticsInstance + */ + protected function proxy(): WorkspaceStatisticsContext + { + if (!$this->context) { + $this->context = new WorkspaceStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the WorkspaceStatisticsInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceStatisticsInstance Fetched WorkspaceStatisticsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): WorkspaceStatisticsInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceStatisticsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsList.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsList.php new file mode 100755 index 0000000..05016c6 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsList.php @@ -0,0 +1,67 @@ +solution = [ + 'workspaceSid' => + $workspaceSid, + + ]; + } + + /** + * Constructs a WorkspaceStatisticsContext + */ + public function getContext( + + ): WorkspaceStatisticsContext + { + return new WorkspaceStatisticsContext( + $this->version, + $this->solution['workspaceSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceStatisticsList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsOptions.php new file mode 100755 index 0000000..112ec58 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsOptions.php @@ -0,0 +1,148 @@ +options['minutes'] = $minutes; + $this->options['startDate'] = $startDate; + $this->options['endDate'] = $endDate; + $this->options['taskChannel'] = $taskChannel; + $this->options['splitByWaitTime'] = $splitByWaitTime; + } + + /** + * Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * + * @param int $minutes Only calculate statistics since this many minutes in the past. The default 15 minutes. This is helpful for displaying statistics for the last 15 minutes, 240 minutes (4 hours), and 480 minutes (8 hours) to see trends. + * @return $this Fluent Builder + */ + public function setMinutes(int $minutes): self + { + $this->options['minutes'] = $minutes; + return $this; + } + + /** + * Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * + * @param \DateTime $startDate Only calculate statistics from this date and time and later, specified in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. + * @return $this Fluent Builder + */ + public function setStartDate(\DateTime $startDate): self + { + $this->options['startDate'] = $startDate; + return $this; + } + + /** + * Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * + * @param \DateTime $endDate Only calculate statistics from this date and time and earlier, specified in GMT as an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time. + * @return $this Fluent Builder + */ + public function setEndDate(\DateTime $endDate): self + { + $this->options['endDate'] = $endDate; + return $this; + } + + /** + * Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * + * @param string $taskChannel Only calculate statistics on this TaskChannel. Can be the TaskChannel's SID or its `unique_name`, such as `voice`, `sms`, or `default`. + * @return $this Fluent Builder + */ + public function setTaskChannel(string $taskChannel): self + { + $this->options['taskChannel'] = $taskChannel; + return $this; + } + + /** + * A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. + * + * @param string $splitByWaitTime A comma separated list of values that describes the thresholds, in seconds, to calculate statistics on. For each threshold specified, the number of Tasks canceled and reservations accepted above and below the specified thresholds in seconds are computed. For example, `5,30` would show splits of Tasks that were canceled or accepted before and after 5 seconds and before and after 30 seconds. This can be used to show short abandoned Tasks or Tasks that failed to meet an SLA. + * @return $this Fluent Builder + */ + public function setSplitByWaitTime(string $splitByWaitTime): self + { + $this->options['splitByWaitTime'] = $splitByWaitTime; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.FetchWorkspaceStatisticsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsPage.php b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsPage.php new file mode 100755 index 0000000..c45edab --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/Workspace/WorkspaceStatisticsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkspaceStatisticsInstance \Twilio\Rest\Taskrouter\V1\Workspace\WorkspaceStatisticsInstance + */ + public function buildInstance(array $payload): WorkspaceStatisticsInstance + { + return new WorkspaceStatisticsInstance($this->version, $payload, $this->solution['workspaceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceStatisticsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceContext.php b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceContext.php new file mode 100755 index 0000000..bade717 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceContext.php @@ -0,0 +1,365 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Workspaces/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WorkspaceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WorkspaceInstance + * + * @return WorkspaceInstance Fetched WorkspaceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkspaceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WorkspaceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the WorkspaceInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceInstance Updated WorkspaceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkspaceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DefaultActivitySid' => + $options['defaultActivitySid'], + 'EventCallbackUrl' => + $options['eventCallbackUrl'], + 'EventsFilter' => + $options['eventsFilter'], + 'FriendlyName' => + $options['friendlyName'], + 'MultiTaskEnabled' => + Serialize::booleanToString($options['multiTaskEnabled']), + 'TimeoutActivitySid' => + $options['timeoutActivitySid'], + 'PrioritizeQueueOrder' => + $options['prioritizeQueueOrder'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WorkspaceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the taskQueues + */ + protected function getTaskQueues(): TaskQueueList + { + if (!$this->_taskQueues) { + $this->_taskQueues = new TaskQueueList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_taskQueues; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + if (!$this->_events) { + $this->_events = new EventList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_events; + } + + /** + * Access the taskChannels + */ + protected function getTaskChannels(): TaskChannelList + { + if (!$this->_taskChannels) { + $this->_taskChannels = new TaskChannelList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_taskChannels; + } + + /** + * Access the activities + */ + protected function getActivities(): ActivityList + { + if (!$this->_activities) { + $this->_activities = new ActivityList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_activities; + } + + /** + * Access the workers + */ + protected function getWorkers(): WorkerList + { + if (!$this->_workers) { + $this->_workers = new WorkerList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_workers; + } + + /** + * Access the workflows + */ + protected function getWorkflows(): WorkflowList + { + if (!$this->_workflows) { + $this->_workflows = new WorkflowList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_workflows; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + if (!$this->_tasks) { + $this->_tasks = new TaskList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_tasks; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkspaceCumulativeStatisticsList + { + if (!$this->_cumulativeStatistics) { + $this->_cumulativeStatistics = new WorkspaceCumulativeStatisticsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_cumulativeStatistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkspaceRealTimeStatisticsList + { + if (!$this->_realTimeStatistics) { + $this->_realTimeStatistics = new WorkspaceRealTimeStatisticsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_realTimeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkspaceStatisticsList + { + if (!$this->_statistics) { + $this->_statistics = new WorkspaceStatisticsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_statistics; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceInstance.php b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceInstance.php new file mode 100755 index 0000000..10b6ba3 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceInstance.php @@ -0,0 +1,271 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'defaultActivityName' => Values::array_get($payload, 'default_activity_name'), + 'defaultActivitySid' => Values::array_get($payload, 'default_activity_sid'), + 'eventCallbackUrl' => Values::array_get($payload, 'event_callback_url'), + 'eventsFilter' => Values::array_get($payload, 'events_filter'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'multiTaskEnabled' => Values::array_get($payload, 'multi_task_enabled'), + 'sid' => Values::array_get($payload, 'sid'), + 'timeoutActivityName' => Values::array_get($payload, 'timeout_activity_name'), + 'timeoutActivitySid' => Values::array_get($payload, 'timeout_activity_sid'), + 'prioritizeQueueOrder' => Values::array_get($payload, 'prioritize_queue_order'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WorkspaceContext Context for this WorkspaceInstance + */ + protected function proxy(): WorkspaceContext + { + if (!$this->context) { + $this->context = new WorkspaceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WorkspaceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WorkspaceInstance + * + * @return WorkspaceInstance Fetched WorkspaceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WorkspaceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WorkspaceInstance + * + * @param array|Options $options Optional Arguments + * @return WorkspaceInstance Updated WorkspaceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WorkspaceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the taskQueues + */ + protected function getTaskQueues(): TaskQueueList + { + return $this->proxy()->taskQueues; + } + + /** + * Access the events + */ + protected function getEvents(): EventList + { + return $this->proxy()->events; + } + + /** + * Access the taskChannels + */ + protected function getTaskChannels(): TaskChannelList + { + return $this->proxy()->taskChannels; + } + + /** + * Access the activities + */ + protected function getActivities(): ActivityList + { + return $this->proxy()->activities; + } + + /** + * Access the workers + */ + protected function getWorkers(): WorkerList + { + return $this->proxy()->workers; + } + + /** + * Access the workflows + */ + protected function getWorkflows(): WorkflowList + { + return $this->proxy()->workflows; + } + + /** + * Access the tasks + */ + protected function getTasks(): TaskList + { + return $this->proxy()->tasks; + } + + /** + * Access the cumulativeStatistics + */ + protected function getCumulativeStatistics(): WorkspaceCumulativeStatisticsList + { + return $this->proxy()->cumulativeStatistics; + } + + /** + * Access the realTimeStatistics + */ + protected function getRealTimeStatistics(): WorkspaceRealTimeStatisticsList + { + return $this->proxy()->realTimeStatistics; + } + + /** + * Access the statistics + */ + protected function getStatistics(): WorkspaceStatisticsList + { + return $this->proxy()->statistics; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Taskrouter.V1.WorkspaceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceList.php b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceList.php new file mode 100755 index 0000000..0fe8be5 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceList.php @@ -0,0 +1,207 @@ +solution = [ + ]; + + $this->uri = '/Workspaces'; + } + + /** + * Create the WorkspaceInstance + * + * @param string $friendlyName A descriptive string that you create to describe the Workspace resource. It can be up to 64 characters long. For example: `Customer Support` or `2014 Election Campaign`. + * @param array|Options $options Optional Arguments + * @return WorkspaceInstance Created WorkspaceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): WorkspaceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'EventCallbackUrl' => + $options['eventCallbackUrl'], + 'EventsFilter' => + $options['eventsFilter'], + 'MultiTaskEnabled' => + Serialize::booleanToString($options['multiTaskEnabled']), + 'Template' => + $options['template'], + 'PrioritizeQueueOrder' => + $options['prioritizeQueueOrder'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WorkspaceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads WorkspaceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WorkspaceInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams WorkspaceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WorkspaceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WorkspacePage Page of WorkspaceInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WorkspacePage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WorkspacePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WorkspaceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WorkspacePage Page of WorkspaceInstance + */ + public function getPage(string $targetUrl): WorkspacePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WorkspacePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WorkspaceContext + * + * @param string $sid The SID of the Workspace resource to delete. + */ + public function getContext( + string $sid + + ): WorkspaceContext + { + return new WorkspaceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspaceList]'; + } +} diff --git a/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceOptions.php b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceOptions.php new file mode 100755 index 0000000..0206adb --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/WorkspaceOptions.php @@ -0,0 +1,360 @@ +options['eventCallbackUrl'] = $eventCallbackUrl; + $this->options['eventsFilter'] = $eventsFilter; + $this->options['multiTaskEnabled'] = $multiTaskEnabled; + $this->options['template'] = $template; + $this->options['prioritizeQueueOrder'] = $prioritizeQueueOrder; + } + + /** + * The URL we should call when an event occurs. If provided, the Workspace will publish events to this URL, for example, to collect data for reporting. See [Workspace Events](https://www.twilio.com/docs/taskrouter/api/event) for more information. This parameter supports Twilio's [Webhooks (HTTP callbacks) Connection Overrides](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides). + * + * @param string $eventCallbackUrl The URL we should call when an event occurs. If provided, the Workspace will publish events to this URL, for example, to collect data for reporting. See [Workspace Events](https://www.twilio.com/docs/taskrouter/api/event) for more information. This parameter supports Twilio's [Webhooks (HTTP callbacks) Connection Overrides](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides). + * @return $this Fluent Builder + */ + public function setEventCallbackUrl(string $eventCallbackUrl): self + { + $this->options['eventCallbackUrl'] = $eventCallbackUrl; + return $this; + } + + /** + * The list of Workspace events for which to call event_callback_url. For example, if `EventsFilter=task.created, task.canceled, worker.activity.update`, then TaskRouter will call event_callback_url only when a task is created, canceled, or a Worker activity is updated. + * + * @param string $eventsFilter The list of Workspace events for which to call event_callback_url. For example, if `EventsFilter=task.created, task.canceled, worker.activity.update`, then TaskRouter will call event_callback_url only when a task is created, canceled, or a Worker activity is updated. + * @return $this Fluent Builder + */ + public function setEventsFilter(string $eventsFilter): self + { + $this->options['eventsFilter'] = $eventsFilter; + return $this; + } + + /** + * Whether to enable multi-tasking. Can be: `true` to enable multi-tasking, or `false` to disable it. However, all workspaces should be created as multi-tasking. The default is `true`. Multi-tasking allows Workers to handle multiple Tasks simultaneously. When enabled (`true`), each Worker can receive parallel reservations up to the per-channel maximums defined in the Workers section. In single-tasking mode (legacy mode), each Worker will only receive a new reservation when the previous task is completed. Learn more at [Multitasking](https://www.twilio.com/docs/taskrouter/multitasking). + * + * @param bool $multiTaskEnabled Whether to enable multi-tasking. Can be: `true` to enable multi-tasking, or `false` to disable it. However, all workspaces should be created as multi-tasking. The default is `true`. Multi-tasking allows Workers to handle multiple Tasks simultaneously. When enabled (`true`), each Worker can receive parallel reservations up to the per-channel maximums defined in the Workers section. In single-tasking mode (legacy mode), each Worker will only receive a new reservation when the previous task is completed. Learn more at [Multitasking](https://www.twilio.com/docs/taskrouter/multitasking). + * @return $this Fluent Builder + */ + public function setMultiTaskEnabled(bool $multiTaskEnabled): self + { + $this->options['multiTaskEnabled'] = $multiTaskEnabled; + return $this; + } + + /** + * An available template name. Can be: `NONE` or `FIFO` and the default is `NONE`. Pre-configures the Workspace with the Workflow and Activities specified in the template. `NONE` will create a Workspace with only a set of default activities. `FIFO` will configure TaskRouter with a set of default activities and a single TaskQueue for first-in, first-out distribution, which can be useful when you are getting started with TaskRouter. + * + * @param string $template An available template name. Can be: `NONE` or `FIFO` and the default is `NONE`. Pre-configures the Workspace with the Workflow and Activities specified in the template. `NONE` will create a Workspace with only a set of default activities. `FIFO` will configure TaskRouter with a set of default activities and a single TaskQueue for first-in, first-out distribution, which can be useful when you are getting started with TaskRouter. + * @return $this Fluent Builder + */ + public function setTemplate(string $template): self + { + $this->options['template'] = $template; + return $this; + } + + /** + * @param string $prioritizeQueueOrder + * @return $this Fluent Builder + */ + public function setPrioritizeQueueOrder(string $prioritizeQueueOrder): self + { + $this->options['prioritizeQueueOrder'] = $prioritizeQueueOrder; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.CreateWorkspaceOptions ' . $options . ']'; + } +} + + + +class ReadWorkspaceOptions extends Options + { + /** + * @param string $friendlyName The `friendly_name` of the Workspace resources to read. For example `Customer Support` or `2014 Election Campaign`. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * The `friendly_name` of the Workspace resources to read. For example `Customer Support` or `2014 Election Campaign`. + * + * @param string $friendlyName The `friendly_name` of the Workspace resources to read. For example `Customer Support` or `2014 Election Campaign`. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.ReadWorkspaceOptions ' . $options . ']'; + } +} + +class UpdateWorkspaceOptions extends Options + { + /** + * @param string $defaultActivitySid The SID of the Activity that will be used when new Workers are created in the Workspace. + * @param string $eventCallbackUrl The URL we should call when an event occurs. See [Workspace Events](https://www.twilio.com/docs/taskrouter/api/event) for more information. This parameter supports Twilio's [Webhooks (HTTP callbacks) Connection Overrides](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides). + * @param string $eventsFilter The list of Workspace events for which to call event_callback_url. For example if `EventsFilter=task.created,task.canceled,worker.activity.update`, then TaskRouter will call event_callback_url only when a task is created, canceled, or a Worker activity is updated. + * @param string $friendlyName A descriptive string that you create to describe the Workspace resource. For example: `Sales Call Center` or `Customer Support Team`. + * @param bool $multiTaskEnabled Whether to enable multi-tasking. Can be: `true` to enable multi-tasking, or `false` to disable it. However, all workspaces should be maintained as multi-tasking. There is no default when omitting this parameter. A multi-tasking Workspace can't be updated to single-tasking unless it is not a Flex Project and another (legacy) single-tasking Workspace exists. Multi-tasking allows Workers to handle multiple Tasks simultaneously. In multi-tasking mode, each Worker can receive parallel reservations up to the per-channel maximums defined in the Workers section. In single-tasking mode (legacy mode), each Worker will only receive a new reservation when the previous task is completed. Learn more at [Multitasking](https://www.twilio.com/docs/taskrouter/multitasking). + * @param string $timeoutActivitySid The SID of the Activity that will be assigned to a Worker when a Task reservation times out without a response. + * @param string $prioritizeQueueOrder + */ + public function __construct( + + string $defaultActivitySid = Values::NONE, + string $eventCallbackUrl = Values::NONE, + string $eventsFilter = Values::NONE, + string $friendlyName = Values::NONE, + bool $multiTaskEnabled = Values::BOOL_NONE, + string $timeoutActivitySid = Values::NONE, + string $prioritizeQueueOrder = Values::NONE + + ) { + $this->options['defaultActivitySid'] = $defaultActivitySid; + $this->options['eventCallbackUrl'] = $eventCallbackUrl; + $this->options['eventsFilter'] = $eventsFilter; + $this->options['friendlyName'] = $friendlyName; + $this->options['multiTaskEnabled'] = $multiTaskEnabled; + $this->options['timeoutActivitySid'] = $timeoutActivitySid; + $this->options['prioritizeQueueOrder'] = $prioritizeQueueOrder; + } + + /** + * The SID of the Activity that will be used when new Workers are created in the Workspace. + * + * @param string $defaultActivitySid The SID of the Activity that will be used when new Workers are created in the Workspace. + * @return $this Fluent Builder + */ + public function setDefaultActivitySid(string $defaultActivitySid): self + { + $this->options['defaultActivitySid'] = $defaultActivitySid; + return $this; + } + + /** + * The URL we should call when an event occurs. See [Workspace Events](https://www.twilio.com/docs/taskrouter/api/event) for more information. This parameter supports Twilio's [Webhooks (HTTP callbacks) Connection Overrides](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides). + * + * @param string $eventCallbackUrl The URL we should call when an event occurs. See [Workspace Events](https://www.twilio.com/docs/taskrouter/api/event) for more information. This parameter supports Twilio's [Webhooks (HTTP callbacks) Connection Overrides](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides). + * @return $this Fluent Builder + */ + public function setEventCallbackUrl(string $eventCallbackUrl): self + { + $this->options['eventCallbackUrl'] = $eventCallbackUrl; + return $this; + } + + /** + * The list of Workspace events for which to call event_callback_url. For example if `EventsFilter=task.created,task.canceled,worker.activity.update`, then TaskRouter will call event_callback_url only when a task is created, canceled, or a Worker activity is updated. + * + * @param string $eventsFilter The list of Workspace events for which to call event_callback_url. For example if `EventsFilter=task.created,task.canceled,worker.activity.update`, then TaskRouter will call event_callback_url only when a task is created, canceled, or a Worker activity is updated. + * @return $this Fluent Builder + */ + public function setEventsFilter(string $eventsFilter): self + { + $this->options['eventsFilter'] = $eventsFilter; + return $this; + } + + /** + * A descriptive string that you create to describe the Workspace resource. For example: `Sales Call Center` or `Customer Support Team`. + * + * @param string $friendlyName A descriptive string that you create to describe the Workspace resource. For example: `Sales Call Center` or `Customer Support Team`. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether to enable multi-tasking. Can be: `true` to enable multi-tasking, or `false` to disable it. However, all workspaces should be maintained as multi-tasking. There is no default when omitting this parameter. A multi-tasking Workspace can't be updated to single-tasking unless it is not a Flex Project and another (legacy) single-tasking Workspace exists. Multi-tasking allows Workers to handle multiple Tasks simultaneously. In multi-tasking mode, each Worker can receive parallel reservations up to the per-channel maximums defined in the Workers section. In single-tasking mode (legacy mode), each Worker will only receive a new reservation when the previous task is completed. Learn more at [Multitasking](https://www.twilio.com/docs/taskrouter/multitasking). + * + * @param bool $multiTaskEnabled Whether to enable multi-tasking. Can be: `true` to enable multi-tasking, or `false` to disable it. However, all workspaces should be maintained as multi-tasking. There is no default when omitting this parameter. A multi-tasking Workspace can't be updated to single-tasking unless it is not a Flex Project and another (legacy) single-tasking Workspace exists. Multi-tasking allows Workers to handle multiple Tasks simultaneously. In multi-tasking mode, each Worker can receive parallel reservations up to the per-channel maximums defined in the Workers section. In single-tasking mode (legacy mode), each Worker will only receive a new reservation when the previous task is completed. Learn more at [Multitasking](https://www.twilio.com/docs/taskrouter/multitasking). + * @return $this Fluent Builder + */ + public function setMultiTaskEnabled(bool $multiTaskEnabled): self + { + $this->options['multiTaskEnabled'] = $multiTaskEnabled; + return $this; + } + + /** + * The SID of the Activity that will be assigned to a Worker when a Task reservation times out without a response. + * + * @param string $timeoutActivitySid The SID of the Activity that will be assigned to a Worker when a Task reservation times out without a response. + * @return $this Fluent Builder + */ + public function setTimeoutActivitySid(string $timeoutActivitySid): self + { + $this->options['timeoutActivitySid'] = $timeoutActivitySid; + return $this; + } + + /** + * @param string $prioritizeQueueOrder + * @return $this Fluent Builder + */ + public function setPrioritizeQueueOrder(string $prioritizeQueueOrder): self + { + $this->options['prioritizeQueueOrder'] = $prioritizeQueueOrder; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Taskrouter.V1.UpdateWorkspaceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Taskrouter/V1/WorkspacePage.php b/app/api/Twilio/Rest/Taskrouter/V1/WorkspacePage.php new file mode 100755 index 0000000..b3627c6 --- /dev/null +++ b/app/api/Twilio/Rest/Taskrouter/V1/WorkspacePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WorkspaceInstance \Twilio\Rest\Taskrouter\V1\WorkspaceInstance + */ + public function buildInstance(array $payload): WorkspaceInstance + { + return new WorkspaceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Taskrouter.V1.WorkspacePage]'; + } +} diff --git a/app/api/Twilio/Rest/TaskrouterBase.php b/app/api/Twilio/Rest/TaskrouterBase.php new file mode 100755 index 0000000..00cfe8d --- /dev/null +++ b/app/api/Twilio/Rest/TaskrouterBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://taskrouter.twilio.com'; + } + + + /** + * @return V1 Version v1 of taskrouter + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Taskrouter]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking.php b/app/api/Twilio/Rest/Trunking.php new file mode 100755 index 0000000..da511ea --- /dev/null +++ b/app/api/Twilio/Rest/Trunking.php @@ -0,0 +1,24 @@ +trunks instead. + */ + protected function getTrunks(): \Twilio\Rest\Trunking\V1\TrunkList { + echo "trunks is deprecated. Use v1->trunks instead."; + return $this->v1->trunks; + } + + /** + * @deprecated Use v1->trunks(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextTrunks(string $sid): \Twilio\Rest\Trunking\V1\TrunkContext { + echo "trunks(\$sid) is deprecated. Use v1->trunks(\$sid) instead."; + return $this->v1->trunks($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Trunking/V1.php b/app/api/Twilio/Rest/Trunking/V1.php new file mode 100755 index 0000000..65e06a6 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1.php @@ -0,0 +1,95 @@ +version = 'v1'; + } + + protected function getTrunks(): TrunkList + { + if (!$this->_trunks) { + $this->_trunks = new TrunkList($this); + } + return $this->_trunks; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListContext.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListContext.php new file mode 100755 index 0000000..857213a --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListContext.php @@ -0,0 +1,100 @@ +solution = [ + 'trunkSid' => + $trunkSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/CredentialLists/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CredentialListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CredentialListInstance + * + * @return CredentialListInstance Fetched CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CredentialListInstance( + $this->version, + $payload, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.CredentialListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListInstance.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListInstance.php new file mode 100755 index 0000000..770eca7 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trunkSid' => $trunkSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CredentialListContext Context for this CredentialListInstance + */ + protected function proxy(): CredentialListContext + { + if (!$this->context) { + $this->context = new CredentialListContext( + $this->version, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CredentialListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CredentialListInstance + * + * @return CredentialListInstance Fetched CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CredentialListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.CredentialListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListList.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListList.php new file mode 100755 index 0000000..38c05b7 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListList.php @@ -0,0 +1,194 @@ +solution = [ + 'trunkSid' => + $trunkSid, + + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/CredentialLists'; + } + + /** + * Create the CredentialListInstance + * + * @param string $credentialListSid The SID of the [Credential List](https://www.twilio.com/docs/voice/sip/api/sip-credentiallist-resource) that you want to associate with the trunk. Once associated, we will authenticate access to the trunk against this list. + * @return CredentialListInstance Created CredentialListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $credentialListSid): CredentialListInstance + { + + $data = Values::of([ + 'CredentialListSid' => + $credentialListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CredentialListInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Reads CredentialListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CredentialListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CredentialListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CredentialListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CredentialListPage Page of CredentialListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CredentialListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CredentialListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CredentialListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CredentialListPage Page of CredentialListInstance + */ + public function getPage(string $targetUrl): CredentialListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CredentialListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CredentialListContext + * + * @param string $sid The unique string that we created to identify the CredentialList resource to delete. + */ + public function getContext( + string $sid + + ): CredentialListContext + { + return new CredentialListContext( + $this->version, + $this->solution['trunkSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.CredentialListList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListPage.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListPage.php new file mode 100755 index 0000000..eade2b1 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/CredentialListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CredentialListInstance \Twilio\Rest\Trunking\V1\Trunk\CredentialListInstance + */ + public function buildInstance(array $payload): CredentialListInstance + { + return new CredentialListInstance($this->version, $payload, $this->solution['trunkSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.CredentialListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListContext.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListContext.php new file mode 100755 index 0000000..18e748e --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListContext.php @@ -0,0 +1,100 @@ +solution = [ + 'trunkSid' => + $trunkSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/IpAccessControlLists/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the IpAccessControlListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IpAccessControlListInstance + * + * @return IpAccessControlListInstance Fetched IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpAccessControlListInstance( + $this->version, + $payload, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.IpAccessControlListContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListInstance.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListInstance.php new file mode 100755 index 0000000..550846b --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trunkSid' => $trunkSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpAccessControlListContext Context for this IpAccessControlListInstance + */ + protected function proxy(): IpAccessControlListContext + { + if (!$this->context) { + $this->context = new IpAccessControlListContext( + $this->version, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IpAccessControlListInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IpAccessControlListInstance + * + * @return IpAccessControlListInstance Fetched IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpAccessControlListInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.IpAccessControlListInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListList.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListList.php new file mode 100755 index 0000000..9574e4f --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListList.php @@ -0,0 +1,194 @@ +solution = [ + 'trunkSid' => + $trunkSid, + + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/IpAccessControlLists'; + } + + /** + * Create the IpAccessControlListInstance + * + * @param string $ipAccessControlListSid The SID of the [IP Access Control List](https://www.twilio.com/docs/voice/sip/api/sip-ipaccesscontrollist-resource) that you want to associate with the trunk. + * @return IpAccessControlListInstance Created IpAccessControlListInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $ipAccessControlListSid): IpAccessControlListInstance + { + + $data = Values::of([ + 'IpAccessControlListSid' => + $ipAccessControlListSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpAccessControlListInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Reads IpAccessControlListInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpAccessControlListInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams IpAccessControlListInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpAccessControlListInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpAccessControlListPage Page of IpAccessControlListInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpAccessControlListPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpAccessControlListPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpAccessControlListInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpAccessControlListPage Page of IpAccessControlListInstance + */ + public function getPage(string $targetUrl): IpAccessControlListPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpAccessControlListPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpAccessControlListContext + * + * @param string $sid The unique string that we created to identify the IpAccessControlList resource to delete. + */ + public function getContext( + string $sid + + ): IpAccessControlListContext + { + return new IpAccessControlListContext( + $this->version, + $this->solution['trunkSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.IpAccessControlListList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListPage.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListPage.php new file mode 100755 index 0000000..7a0559f --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/IpAccessControlListPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpAccessControlListInstance \Twilio\Rest\Trunking\V1\Trunk\IpAccessControlListInstance + */ + public function buildInstance(array $payload): IpAccessControlListInstance + { + return new IpAccessControlListInstance($this->version, $payload, $this->solution['trunkSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.IpAccessControlListPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlContext.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlContext.php new file mode 100755 index 0000000..f932b97 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlContext.php @@ -0,0 +1,139 @@ +solution = [ + 'trunkSid' => + $trunkSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/OriginationUrls/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the OriginationUrlInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the OriginationUrlInstance + * + * @return OriginationUrlInstance Fetched OriginationUrlInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OriginationUrlInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new OriginationUrlInstance( + $this->version, + $payload, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the OriginationUrlInstance + * + * @param array|Options $options Optional Arguments + * @return OriginationUrlInstance Updated OriginationUrlInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): OriginationUrlInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Weight' => + $options['weight'], + 'Priority' => + $options['priority'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'FriendlyName' => + $options['friendlyName'], + 'SipUrl' => + $options['sipUrl'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new OriginationUrlInstance( + $this->version, + $payload, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.OriginationUrlContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlInstance.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlInstance.php new file mode 100755 index 0000000..8efecc3 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlInstance.php @@ -0,0 +1,164 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'weight' => Values::array_get($payload, 'weight'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'sipUrl' => Values::array_get($payload, 'sip_url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'priority' => Values::array_get($payload, 'priority'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trunkSid' => $trunkSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return OriginationUrlContext Context for this OriginationUrlInstance + */ + protected function proxy(): OriginationUrlContext + { + if (!$this->context) { + $this->context = new OriginationUrlContext( + $this->version, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the OriginationUrlInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the OriginationUrlInstance + * + * @return OriginationUrlInstance Fetched OriginationUrlInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): OriginationUrlInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the OriginationUrlInstance + * + * @param array|Options $options Optional Arguments + * @return OriginationUrlInstance Updated OriginationUrlInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): OriginationUrlInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.OriginationUrlInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlList.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlList.php new file mode 100755 index 0000000..cbe9988 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlList.php @@ -0,0 +1,207 @@ +solution = [ + 'trunkSid' => + $trunkSid, + + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/OriginationUrls'; + } + + /** + * Create the OriginationUrlInstance + * + * @param int $weight The value that determines the relative share of the load the URI should receive compared to other URIs with the same priority. Can be an integer from 1 to 65535, inclusive, and the default is 10. URLs with higher values receive more load than those with lower ones with the same priority. + * @param int $priority The relative importance of the URI. Can be an integer from 0 to 65535, inclusive, and the default is 10. The lowest number represents the most important URI. + * @param bool $enabled Whether the URL is enabled. The default is `true`. + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $sipUrl The SIP address you want Twilio to route your Origination calls to. This must be a `sip:` schema. + * @return OriginationUrlInstance Created OriginationUrlInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(int $weight, int $priority, bool $enabled, string $friendlyName, string $sipUrl): OriginationUrlInstance + { + + $data = Values::of([ + 'Weight' => + $weight, + 'Priority' => + $priority, + 'Enabled' => + Serialize::booleanToString($enabled), + 'FriendlyName' => + $friendlyName, + 'SipUrl' => + $sipUrl, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new OriginationUrlInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Reads OriginationUrlInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return OriginationUrlInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams OriginationUrlInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of OriginationUrlInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return OriginationUrlPage Page of OriginationUrlInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): OriginationUrlPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new OriginationUrlPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of OriginationUrlInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return OriginationUrlPage Page of OriginationUrlInstance + */ + public function getPage(string $targetUrl): OriginationUrlPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new OriginationUrlPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a OriginationUrlContext + * + * @param string $sid The unique string that we created to identify the OriginationUrl resource to delete. + */ + public function getContext( + string $sid + + ): OriginationUrlContext + { + return new OriginationUrlContext( + $this->version, + $this->solution['trunkSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.OriginationUrlList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlOptions.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlOptions.php new file mode 100755 index 0000000..b9048c5 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlOptions.php @@ -0,0 +1,156 @@ +options['weight'] = $weight; + $this->options['priority'] = $priority; + $this->options['enabled'] = $enabled; + $this->options['friendlyName'] = $friendlyName; + $this->options['sipUrl'] = $sipUrl; + } + + /** + * The value that determines the relative share of the load the URI should receive compared to other URIs with the same priority. Can be an integer from 1 to 65535, inclusive, and the default is 10. URLs with higher values receive more load than those with lower ones with the same priority. + * + * @param int $weight The value that determines the relative share of the load the URI should receive compared to other URIs with the same priority. Can be an integer from 1 to 65535, inclusive, and the default is 10. URLs with higher values receive more load than those with lower ones with the same priority. + * @return $this Fluent Builder + */ + public function setWeight(int $weight): self + { + $this->options['weight'] = $weight; + return $this; + } + + /** + * The relative importance of the URI. Can be an integer from 0 to 65535, inclusive, and the default is 10. The lowest number represents the most important URI. + * + * @param int $priority The relative importance of the URI. Can be an integer from 0 to 65535, inclusive, and the default is 10. The lowest number represents the most important URI. + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * Whether the URL is enabled. The default is `true`. + * + * @param bool $enabled Whether the URL is enabled. The default is `true`. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SIP address you want Twilio to route your Origination calls to. This must be a `sip:` schema. `sips` is NOT supported. + * + * @param string $sipUrl The SIP address you want Twilio to route your Origination calls to. This must be a `sip:` schema. `sips` is NOT supported. + * @return $this Fluent Builder + */ + public function setSipUrl(string $sipUrl): self + { + $this->options['sipUrl'] = $sipUrl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trunking.V1.UpdateOriginationUrlOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlPage.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlPage.php new file mode 100755 index 0000000..85e1229 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/OriginationUrlPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return OriginationUrlInstance \Twilio\Rest\Trunking\V1\Trunk\OriginationUrlInstance + */ + public function buildInstance(array $payload): OriginationUrlInstance + { + return new OriginationUrlInstance($this->version, $payload, $this->solution['trunkSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.OriginationUrlPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberContext.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberContext.php new file mode 100755 index 0000000..04dba0d --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberContext.php @@ -0,0 +1,100 @@ +solution = [ + 'trunkSid' => + $trunkSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/PhoneNumbers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.PhoneNumberContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberInstance.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberInstance.php new file mode 100755 index 0000000..80fa4a4 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberInstance.php @@ -0,0 +1,180 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'addressRequirements' => Values::array_get($payload, 'address_requirements'), + 'apiVersion' => Values::array_get($payload, 'api_version'), + 'beta' => Values::array_get($payload, 'beta'), + 'capabilities' => Values::array_get($payload, 'capabilities'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'links' => Values::array_get($payload, 'links'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'sid' => Values::array_get($payload, 'sid'), + 'smsApplicationSid' => Values::array_get($payload, 'sms_application_sid'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'trunkSid' => Values::array_get($payload, 'trunk_sid'), + 'url' => Values::array_get($payload, 'url'), + 'voiceApplicationSid' => Values::array_get($payload, 'voice_application_sid'), + 'voiceCallerIdLookup' => Values::array_get($payload, 'voice_caller_id_lookup'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + ]; + + $this->solution = ['trunkSid' => $trunkSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PhoneNumberContext Context for this PhoneNumberInstance + */ + protected function proxy(): PhoneNumberContext + { + if (!$this->context) { + $this->context = new PhoneNumberContext( + $this->version, + $this->solution['trunkSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the PhoneNumberInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the PhoneNumberInstance + * + * @return PhoneNumberInstance Fetched PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PhoneNumberInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.PhoneNumberInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberList.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberList.php new file mode 100755 index 0000000..b8c956a --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberList.php @@ -0,0 +1,194 @@ +solution = [ + 'trunkSid' => + $trunkSid, + + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/PhoneNumbers'; + } + + /** + * Create the PhoneNumberInstance + * + * @param string $phoneNumberSid The SID of the [Incoming Phone Number](https://www.twilio.com/docs/phone-numbers/api/incomingphonenumber-resource) that you want to associate with the trunk. + * @return PhoneNumberInstance Created PhoneNumberInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumberSid): PhoneNumberInstance + { + + $data = Values::of([ + 'PhoneNumberSid' => + $phoneNumberSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new PhoneNumberInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Reads PhoneNumberInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PhoneNumberInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PhoneNumberInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PhoneNumberPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PhoneNumberInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PhoneNumberPage Page of PhoneNumberInstance + */ + public function getPage(string $targetUrl): PhoneNumberPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PhoneNumberPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PhoneNumberContext + * + * @param string $sid The unique string that we created to identify the PhoneNumber resource to delete. + */ + public function getContext( + string $sid + + ): PhoneNumberContext + { + return new PhoneNumberContext( + $this->version, + $this->solution['trunkSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.PhoneNumberList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberPage.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberPage.php new file mode 100755 index 0000000..6429546 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/PhoneNumberPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PhoneNumberInstance \Twilio\Rest\Trunking\V1\Trunk\PhoneNumberInstance + */ + public function buildInstance(array $payload): PhoneNumberInstance + { + return new PhoneNumberInstance($this->version, $payload, $this->solution['trunkSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.PhoneNumberPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingContext.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingContext.php new file mode 100755 index 0000000..ccb14ee --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingContext.php @@ -0,0 +1,112 @@ +solution = [ + 'trunkSid' => + $trunkSid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($trunkSid) + .'/Recording'; + } + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Update the RecordingInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RecordingInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Mode' => + $options['mode'], + 'Trim' => + $options['trim'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['trunkSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.RecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingInstance.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingInstance.php new file mode 100755 index 0000000..dfab9ce --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingInstance.php @@ -0,0 +1,131 @@ +properties = [ + 'mode' => Values::array_get($payload, 'mode'), + 'trim' => Values::array_get($payload, 'trim'), + ]; + + $this->solution = ['trunkSid' => $trunkSid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingContext Context for this RecordingInstance + */ + protected function proxy(): RecordingContext + { + if (!$this->context) { + $this->context = new RecordingContext( + $this->version, + $this->solution['trunkSid'] + ); + } + + return $this->context; + } + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RecordingInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingInstance Updated RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RecordingInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.RecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingList.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingList.php new file mode 100755 index 0000000..e1cdd4b --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingList.php @@ -0,0 +1,67 @@ +solution = [ + 'trunkSid' => + $trunkSid, + + ]; + } + + /** + * Constructs a RecordingContext + */ + public function getContext( + + ): RecordingContext + { + return new RecordingContext( + $this->version, + $this->solution['trunkSid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.RecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingOptions.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingOptions.php new file mode 100755 index 0000000..13a8345 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingOptions.php @@ -0,0 +1,92 @@ +options['mode'] = $mode; + $this->options['trim'] = $trim; + } + + /** + * @param string $mode + * @return $this Fluent Builder + */ + public function setMode(string $mode): self + { + $this->options['mode'] = $mode; + return $this; + } + + /** + * @param string $trim + * @return $this Fluent Builder + */ + public function setTrim(string $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trunking.V1.UpdateRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingPage.php b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingPage.php new file mode 100755 index 0000000..7ae87e7 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/Trunk/RecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingInstance \Twilio\Rest\Trunking\V1\Trunk\RecordingInstance + */ + public function buildInstance(array $payload): RecordingInstance + { + return new RecordingInstance($this->version, $payload, $this->solution['trunkSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.RecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/TrunkContext.php b/app/api/Twilio/Rest/Trunking/V1/TrunkContext.php new file mode 100755 index 0000000..02f0bcd --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/TrunkContext.php @@ -0,0 +1,272 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Trunks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TrunkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TrunkInstance + * + * @return TrunkInstance Fetched TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrunkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrunkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the TrunkInstance + * + * @param array|Options $options Optional Arguments + * @return TrunkInstance Updated TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrunkInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DomainName' => + $options['domainName'], + 'DisasterRecoveryUrl' => + $options['disasterRecoveryUrl'], + 'DisasterRecoveryMethod' => + $options['disasterRecoveryMethod'], + 'TransferMode' => + $options['transferMode'], + 'Secure' => + Serialize::booleanToString($options['secure']), + 'CnamLookupEnabled' => + Serialize::booleanToString($options['cnamLookupEnabled']), + 'TransferCallerId' => + $options['transferCallerId'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TrunkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the ipAccessControlLists + */ + protected function getIpAccessControlLists(): IpAccessControlListList + { + if (!$this->_ipAccessControlLists) { + $this->_ipAccessControlLists = new IpAccessControlListList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_ipAccessControlLists; + } + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + if (!$this->_phoneNumbers) { + $this->_phoneNumbers = new PhoneNumberList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_phoneNumbers; + } + + /** + * Access the credentialsLists + */ + protected function getCredentialsLists(): CredentialListList + { + if (!$this->_credentialsLists) { + $this->_credentialsLists = new CredentialListList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_credentialsLists; + } + + /** + * Access the originationUrls + */ + protected function getOriginationUrls(): OriginationUrlList + { + if (!$this->_originationUrls) { + $this->_originationUrls = new OriginationUrlList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_originationUrls; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RecordingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_recordings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.TrunkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/TrunkInstance.php b/app/api/Twilio/Rest/Trunking/V1/TrunkInstance.php new file mode 100755 index 0000000..6d1a84d --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/TrunkInstance.php @@ -0,0 +1,225 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'domainName' => Values::array_get($payload, 'domain_name'), + 'disasterRecoveryMethod' => Values::array_get($payload, 'disaster_recovery_method'), + 'disasterRecoveryUrl' => Values::array_get($payload, 'disaster_recovery_url'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'secure' => Values::array_get($payload, 'secure'), + 'recording' => Values::array_get($payload, 'recording'), + 'transferMode' => Values::array_get($payload, 'transfer_mode'), + 'transferCallerId' => Values::array_get($payload, 'transfer_caller_id'), + 'cnamLookupEnabled' => Values::array_get($payload, 'cnam_lookup_enabled'), + 'authType' => Values::array_get($payload, 'auth_type'), + 'authTypeSet' => Values::array_get($payload, 'auth_type_set'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrunkContext Context for this TrunkInstance + */ + protected function proxy(): TrunkContext + { + if (!$this->context) { + $this->context = new TrunkContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TrunkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TrunkInstance + * + * @return TrunkInstance Fetched TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrunkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TrunkInstance + * + * @param array|Options $options Optional Arguments + * @return TrunkInstance Updated TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrunkInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the ipAccessControlLists + */ + protected function getIpAccessControlLists(): IpAccessControlListList + { + return $this->proxy()->ipAccessControlLists; + } + + /** + * Access the phoneNumbers + */ + protected function getPhoneNumbers(): PhoneNumberList + { + return $this->proxy()->phoneNumbers; + } + + /** + * Access the credentialsLists + */ + protected function getCredentialsLists(): CredentialListList + { + return $this->proxy()->credentialsLists; + } + + /** + * Access the originationUrls + */ + protected function getOriginationUrls(): OriginationUrlList + { + return $this->proxy()->originationUrls; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RecordingList + { + return $this->proxy()->recordings; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trunking.V1.TrunkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/TrunkList.php b/app/api/Twilio/Rest/Trunking/V1/TrunkList.php new file mode 100755 index 0000000..957e56c --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/TrunkList.php @@ -0,0 +1,204 @@ +solution = [ + ]; + + $this->uri = '/Trunks'; + } + + /** + * Create the TrunkInstance + * + * @param array|Options $options Optional Arguments + * @return TrunkInstance Created TrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): TrunkInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'DomainName' => + $options['domainName'], + 'DisasterRecoveryUrl' => + $options['disasterRecoveryUrl'], + 'DisasterRecoveryMethod' => + $options['disasterRecoveryMethod'], + 'TransferMode' => + $options['transferMode'], + 'Secure' => + Serialize::booleanToString($options['secure']), + 'CnamLookupEnabled' => + Serialize::booleanToString($options['cnamLookupEnabled']), + 'TransferCallerId' => + $options['transferCallerId'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TrunkInstance( + $this->version, + $payload + ); + } + + + /** + * Reads TrunkInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TrunkInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TrunkInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TrunkInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TrunkPage Page of TrunkInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TrunkPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TrunkPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TrunkInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TrunkPage Page of TrunkInstance + */ + public function getPage(string $targetUrl): TrunkPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TrunkPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TrunkContext + * + * @param string $sid The unique string that we created to identify the Trunk resource to delete. + */ + public function getContext( + string $sid + + ): TrunkContext + { + return new TrunkContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.TrunkList]'; + } +} diff --git a/app/api/Twilio/Rest/Trunking/V1/TrunkOptions.php b/app/api/Twilio/Rest/Trunking/V1/TrunkOptions.php new file mode 100755 index 0000000..8fe7508 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/TrunkOptions.php @@ -0,0 +1,378 @@ +options['friendlyName'] = $friendlyName; + $this->options['domainName'] = $domainName; + $this->options['disasterRecoveryUrl'] = $disasterRecoveryUrl; + $this->options['disasterRecoveryMethod'] = $disasterRecoveryMethod; + $this->options['transferMode'] = $transferMode; + $this->options['secure'] = $secure; + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + $this->options['transferCallerId'] = $transferCallerId; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and `-` and must end with `pstn.twilio.com`. See [Termination Settings](https://www.twilio.com/docs/sip-trunking#termination) for more information. + * + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and `-` and must end with `pstn.twilio.com`. See [Termination Settings](https://www.twilio.com/docs/sip-trunking#termination) for more information. + * @return $this Fluent Builder + */ + public function setDomainName(string $domainName): self + { + $this->options['domainName'] = $domainName; + return $this; + } + + /** + * The URL we should call using the `disaster_recovery_method` if an error occurs while sending SIP traffic towards the configured Origination URL. We retrieve TwiML from the URL and execute the instructions like any other normal TwiML call. See [Disaster Recovery](https://www.twilio.com/docs/sip-trunking#disaster-recovery) for more information. + * + * @param string $disasterRecoveryUrl The URL we should call using the `disaster_recovery_method` if an error occurs while sending SIP traffic towards the configured Origination URL. We retrieve TwiML from the URL and execute the instructions like any other normal TwiML call. See [Disaster Recovery](https://www.twilio.com/docs/sip-trunking#disaster-recovery) for more information. + * @return $this Fluent Builder + */ + public function setDisasterRecoveryUrl(string $disasterRecoveryUrl): self + { + $this->options['disasterRecoveryUrl'] = $disasterRecoveryUrl; + return $this; + } + + /** + * The HTTP method we should use to call the `disaster_recovery_url`. Can be: `GET` or `POST`. + * + * @param string $disasterRecoveryMethod The HTTP method we should use to call the `disaster_recovery_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setDisasterRecoveryMethod(string $disasterRecoveryMethod): self + { + $this->options['disasterRecoveryMethod'] = $disasterRecoveryMethod; + return $this; + } + + /** + * @param string $transferMode + * @return $this Fluent Builder + */ + public function setTransferMode(string $transferMode): self + { + $this->options['transferMode'] = $transferMode; + return $this; + } + + /** + * Whether Secure Trunking is enabled for the trunk. If enabled, all calls going through the trunk will be secure using SRTP for media and TLS for signaling. If disabled, then RTP will be used for media. See [Secure Trunking](https://www.twilio.com/docs/sip-trunking#securetrunking) for more information. + * + * @param bool $secure Whether Secure Trunking is enabled for the trunk. If enabled, all calls going through the trunk will be secure using SRTP for media and TLS for signaling. If disabled, then RTP will be used for media. See [Secure Trunking](https://www.twilio.com/docs/sip-trunking#securetrunking) for more information. + * @return $this Fluent Builder + */ + public function setSecure(bool $secure): self + { + $this->options['secure'] = $secure; + return $this; + } + + /** + * Whether Caller ID Name (CNAM) lookup should be enabled for the trunk. If enabled, all inbound calls to the SIP Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup should be enabled for the trunk. If enabled, all inbound calls to the SIP Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @return $this Fluent Builder + */ + public function setCnamLookupEnabled(bool $cnamLookupEnabled): self + { + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + return $this; + } + + /** + * @param string $transferCallerId + * @return $this Fluent Builder + */ + public function setTransferCallerId(string $transferCallerId): self + { + $this->options['transferCallerId'] = $transferCallerId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trunking.V1.CreateTrunkOptions ' . $options . ']'; + } +} + + + + +class UpdateTrunkOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and `-` and must end with `pstn.twilio.com`. See [Termination Settings](https://www.twilio.com/docs/sip-trunking#termination) for more information. + * @param string $disasterRecoveryUrl The URL we should call using the `disaster_recovery_method` if an error occurs while sending SIP traffic towards the configured Origination URL. We retrieve TwiML from the URL and execute the instructions like any other normal TwiML call. See [Disaster Recovery](https://www.twilio.com/docs/sip-trunking#disaster-recovery) for more information. + * @param string $disasterRecoveryMethod The HTTP method we should use to call the `disaster_recovery_url`. Can be: `GET` or `POST`. + * @param string $transferMode + * @param bool $secure Whether Secure Trunking is enabled for the trunk. If enabled, all calls going through the trunk will be secure using SRTP for media and TLS for signaling. If disabled, then RTP will be used for media. See [Secure Trunking](https://www.twilio.com/docs/sip-trunking#securetrunking) for more information. + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup should be enabled for the trunk. If enabled, all inbound calls to the SIP Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @param string $transferCallerId + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $domainName = Values::NONE, + string $disasterRecoveryUrl = Values::NONE, + string $disasterRecoveryMethod = Values::NONE, + string $transferMode = Values::NONE, + bool $secure = Values::BOOL_NONE, + bool $cnamLookupEnabled = Values::BOOL_NONE, + string $transferCallerId = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['domainName'] = $domainName; + $this->options['disasterRecoveryUrl'] = $disasterRecoveryUrl; + $this->options['disasterRecoveryMethod'] = $disasterRecoveryMethod; + $this->options['transferMode'] = $transferMode; + $this->options['secure'] = $secure; + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + $this->options['transferCallerId'] = $transferCallerId; + } + + /** + * A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 64 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and `-` and must end with `pstn.twilio.com`. See [Termination Settings](https://www.twilio.com/docs/sip-trunking#termination) for more information. + * + * @param string $domainName The unique address you reserve on Twilio to which you route your SIP traffic. Domain names can contain letters, digits, and `-` and must end with `pstn.twilio.com`. See [Termination Settings](https://www.twilio.com/docs/sip-trunking#termination) for more information. + * @return $this Fluent Builder + */ + public function setDomainName(string $domainName): self + { + $this->options['domainName'] = $domainName; + return $this; + } + + /** + * The URL we should call using the `disaster_recovery_method` if an error occurs while sending SIP traffic towards the configured Origination URL. We retrieve TwiML from the URL and execute the instructions like any other normal TwiML call. See [Disaster Recovery](https://www.twilio.com/docs/sip-trunking#disaster-recovery) for more information. + * + * @param string $disasterRecoveryUrl The URL we should call using the `disaster_recovery_method` if an error occurs while sending SIP traffic towards the configured Origination URL. We retrieve TwiML from the URL and execute the instructions like any other normal TwiML call. See [Disaster Recovery](https://www.twilio.com/docs/sip-trunking#disaster-recovery) for more information. + * @return $this Fluent Builder + */ + public function setDisasterRecoveryUrl(string $disasterRecoveryUrl): self + { + $this->options['disasterRecoveryUrl'] = $disasterRecoveryUrl; + return $this; + } + + /** + * The HTTP method we should use to call the `disaster_recovery_url`. Can be: `GET` or `POST`. + * + * @param string $disasterRecoveryMethod The HTTP method we should use to call the `disaster_recovery_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setDisasterRecoveryMethod(string $disasterRecoveryMethod): self + { + $this->options['disasterRecoveryMethod'] = $disasterRecoveryMethod; + return $this; + } + + /** + * @param string $transferMode + * @return $this Fluent Builder + */ + public function setTransferMode(string $transferMode): self + { + $this->options['transferMode'] = $transferMode; + return $this; + } + + /** + * Whether Secure Trunking is enabled for the trunk. If enabled, all calls going through the trunk will be secure using SRTP for media and TLS for signaling. If disabled, then RTP will be used for media. See [Secure Trunking](https://www.twilio.com/docs/sip-trunking#securetrunking) for more information. + * + * @param bool $secure Whether Secure Trunking is enabled for the trunk. If enabled, all calls going through the trunk will be secure using SRTP for media and TLS for signaling. If disabled, then RTP will be used for media. See [Secure Trunking](https://www.twilio.com/docs/sip-trunking#securetrunking) for more information. + * @return $this Fluent Builder + */ + public function setSecure(bool $secure): self + { + $this->options['secure'] = $secure; + return $this; + } + + /** + * Whether Caller ID Name (CNAM) lookup should be enabled for the trunk. If enabled, all inbound calls to the SIP Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup should be enabled for the trunk. If enabled, all inbound calls to the SIP Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @return $this Fluent Builder + */ + public function setCnamLookupEnabled(bool $cnamLookupEnabled): self + { + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + return $this; + } + + /** + * @param string $transferCallerId + * @return $this Fluent Builder + */ + public function setTransferCallerId(string $transferCallerId): self + { + $this->options['transferCallerId'] = $transferCallerId; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trunking.V1.UpdateTrunkOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trunking/V1/TrunkPage.php b/app/api/Twilio/Rest/Trunking/V1/TrunkPage.php new file mode 100755 index 0000000..f343093 --- /dev/null +++ b/app/api/Twilio/Rest/Trunking/V1/TrunkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrunkInstance \Twilio\Rest\Trunking\V1\TrunkInstance + */ + public function buildInstance(array $payload): TrunkInstance + { + return new TrunkInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trunking.V1.TrunkPage]'; + } +} diff --git a/app/api/Twilio/Rest/TrunkingBase.php b/app/api/Twilio/Rest/TrunkingBase.php new file mode 100755 index 0000000..4e259ef --- /dev/null +++ b/app/api/Twilio/Rest/TrunkingBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://trunking.twilio.com'; + } + + + /** + * @return V1 Version v1 of trunking + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Trunking]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub.php b/app/api/Twilio/Rest/Trusthub.php new file mode 100755 index 0000000..9adab5b --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub.php @@ -0,0 +1,128 @@ +customerProfiles instead. + */ + protected function getCustomerProfiles(): \Twilio\Rest\Trusthub\V1\CustomerProfilesList { + echo "customerProfiles is deprecated. Use v1->customerProfiles instead."; + return $this->v1->customerProfiles; + } + + /** + * @deprecated Use v1->customerProfiles(\$sid) instead. + * @param string $sid The unique string that identifies the resource. + */ + protected function contextCustomerProfiles(string $sid): \Twilio\Rest\Trusthub\V1\CustomerProfilesContext { + echo "customerProfiles(\$sid) is deprecated. Use v1->customerProfiles(\$sid) instead."; + return $this->v1->customerProfiles($sid); + } + + /** + * @deprecated Use v1->endUsers instead. + */ + protected function getEndUsers(): \Twilio\Rest\Trusthub\V1\EndUserList { + echo "endUsers is deprecated. Use v1->endUsers instead."; + return $this->v1->endUsers; + } + + /** + * @deprecated Use v1->endUsers(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextEndUsers(string $sid): \Twilio\Rest\Trusthub\V1\EndUserContext { + echo "endUsers(\$sid) is deprecated. Use v1->endUsers(\$sid) instead."; + return $this->v1->endUsers($sid); + } + + /** + * @deprecated Use v1->endUserTypes instead. + */ + protected function getEndUserTypes(): \Twilio\Rest\Trusthub\V1\EndUserTypeList { + echo "endUserTypes is deprecated. Use v1->endUserTypes instead."; + return $this->v1->endUserTypes; + } + + /** + * @deprecated Use v1->endUserTypes(\$sid) instead. + * @param string $sid The unique string that identifies the End-User Type + * resource + */ + protected function contextEndUserTypes(string $sid): \Twilio\Rest\Trusthub\V1\EndUserTypeContext { + echo "endUserTypes(\$sid) is deprecated. Use v1->endUserTypes(\$sid) instead."; + return $this->v1->endUserTypes($sid); + } + + /** + * @deprecated Use v1->policies instead. + */ + protected function getPolicies(): \Twilio\Rest\Trusthub\V1\PoliciesList { + echo "policies is deprecated. Use v1->policies instead."; + return $this->v1->policies; + } + + /** + * @deprecated Use v1->policies(\$sid) instead. + * @param string $sid The unique string that identifies the Policy resource + */ + protected function contextPolicies(string $sid): \Twilio\Rest\Trusthub\V1\PoliciesContext { + echo "policies(\$sid) is deprecated. Use v1->policies(\$sid) instead."; + return $this->v1->policies($sid); + } + + /** + * @deprecated Use v1->supportingDocuments instead. + */ + protected function getSupportingDocuments(): \Twilio\Rest\Trusthub\V1\SupportingDocumentList { + echo "supportingDocuments is deprecated. Use v1->supportingDocuments instead."; + return $this->v1->supportingDocuments; + } + + /** + * @deprecated Use v1->supportingDocuments(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextSupportingDocuments(string $sid): \Twilio\Rest\Trusthub\V1\SupportingDocumentContext { + echo "supportingDocuments(\$sid) is deprecated. Use v1->supportingDocuments(\$sid) instead."; + return $this->v1->supportingDocuments($sid); + } + + /** + * @deprecated Use v1->supportingDocumentTypes instead. + */ + protected function getSupportingDocumentTypes(): \Twilio\Rest\Trusthub\V1\SupportingDocumentTypeList { + echo "supportingDocumentTypes is deprecated. Use v1->supportingDocumentTypes instead."; + return $this->v1->supportingDocumentTypes; + } + + /** + * @deprecated Use v1->supportingDocumentTypes(\$sid) instead. + * @param string $sid The unique string that identifies the Supporting Document + * Type resource + */ + protected function contextSupportingDocumentTypes(string $sid): \Twilio\Rest\Trusthub\V1\SupportingDocumentTypeContext { + echo "supportingDocumentTypes(\$sid) is deprecated. Use v1->supportingDocumentTypes(\$sid) instead."; + return $this->v1->supportingDocumentTypes($sid); + } + + /** + * @deprecated Use v1->trustProducts instead. + */ + protected function getTrustProducts(): \Twilio\Rest\Trusthub\V1\TrustProductsList { + echo "trustProducts is deprecated. Use v1->trustProducts instead."; + return $this->v1->trustProducts; + } + + /** + * @deprecated Use v1->trustProducts(\$sid) instead. + * @param string $sid The unique string that identifies the resource. + */ + protected function contextTrustProducts(string $sid): \Twilio\Rest\Trusthub\V1\TrustProductsContext { + echo "trustProducts(\$sid) is deprecated. Use v1->trustProducts(\$sid) instead."; + return $this->v1->trustProducts($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Trusthub/V1.php b/app/api/Twilio/Rest/Trusthub/V1.php new file mode 100755 index 0000000..cc57aac --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1.php @@ -0,0 +1,167 @@ +version = 'v1'; + } + + protected function getCustomerProfiles(): CustomerProfilesList + { + if (!$this->_customerProfiles) { + $this->_customerProfiles = new CustomerProfilesList($this); + } + return $this->_customerProfiles; + } + + protected function getEndUsers(): EndUserList + { + if (!$this->_endUsers) { + $this->_endUsers = new EndUserList($this); + } + return $this->_endUsers; + } + + protected function getEndUserTypes(): EndUserTypeList + { + if (!$this->_endUserTypes) { + $this->_endUserTypes = new EndUserTypeList($this); + } + return $this->_endUserTypes; + } + + protected function getPolicies(): PoliciesList + { + if (!$this->_policies) { + $this->_policies = new PoliciesList($this); + } + return $this->_policies; + } + + protected function getSupportingDocuments(): SupportingDocumentList + { + if (!$this->_supportingDocuments) { + $this->_supportingDocuments = new SupportingDocumentList($this); + } + return $this->_supportingDocuments; + } + + protected function getSupportingDocumentTypes(): SupportingDocumentTypeList + { + if (!$this->_supportingDocumentTypes) { + $this->_supportingDocumentTypes = new SupportingDocumentTypeList($this); + } + return $this->_supportingDocumentTypes; + } + + protected function getTrustProducts(): TrustProductsList + { + if (!$this->_trustProducts) { + $this->_trustProducts = new TrustProductsList($this); + } + return $this->_trustProducts; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentContext.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentContext.php new file mode 100755 index 0000000..a2e95bf --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentContext.php @@ -0,0 +1,100 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + 'sid' => + $sid, + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/ChannelEndpointAssignments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CustomerProfilesChannelEndpointAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CustomerProfilesChannelEndpointAssignmentInstance + * + * @return CustomerProfilesChannelEndpointAssignmentInstance Fetched CustomerProfilesChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesChannelEndpointAssignmentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CustomerProfilesChannelEndpointAssignmentInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesChannelEndpointAssignmentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentInstance.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentInstance.php new file mode 100755 index 0000000..33f9efb --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'customerProfileSid' => Values::array_get($payload, 'customer_profile_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelEndpointType' => Values::array_get($payload, 'channel_endpoint_type'), + 'channelEndpointSid' => Values::array_get($payload, 'channel_endpoint_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['customerProfileSid' => $customerProfileSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CustomerProfilesChannelEndpointAssignmentContext Context for this CustomerProfilesChannelEndpointAssignmentInstance + */ + protected function proxy(): CustomerProfilesChannelEndpointAssignmentContext + { + if (!$this->context) { + $this->context = new CustomerProfilesChannelEndpointAssignmentContext( + $this->version, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CustomerProfilesChannelEndpointAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CustomerProfilesChannelEndpointAssignmentInstance + * + * @return CustomerProfilesChannelEndpointAssignmentInstance Fetched CustomerProfilesChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesChannelEndpointAssignmentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesChannelEndpointAssignmentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentList.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentList.php new file mode 100755 index 0000000..f0ebe52 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentList.php @@ -0,0 +1,206 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/ChannelEndpointAssignments'; + } + + /** + * Create the CustomerProfilesChannelEndpointAssignmentInstance + * + * @param string $channelEndpointType The type of channel endpoint. eg: phone-number + * @param string $channelEndpointSid The SID of an channel endpoint + * @return CustomerProfilesChannelEndpointAssignmentInstance Created CustomerProfilesChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $channelEndpointType, string $channelEndpointSid): CustomerProfilesChannelEndpointAssignmentInstance + { + + $data = Values::of([ + 'ChannelEndpointType' => + $channelEndpointType, + 'ChannelEndpointSid' => + $channelEndpointSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CustomerProfilesChannelEndpointAssignmentInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'] + ); + } + + + /** + * Reads CustomerProfilesChannelEndpointAssignmentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CustomerProfilesChannelEndpointAssignmentInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CustomerProfilesChannelEndpointAssignmentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CustomerProfilesChannelEndpointAssignmentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CustomerProfilesChannelEndpointAssignmentPage Page of CustomerProfilesChannelEndpointAssignmentInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CustomerProfilesChannelEndpointAssignmentPage + { + $options = new Values($options); + + $params = Values::of([ + 'ChannelEndpointSid' => + $options['channelEndpointSid'], + 'ChannelEndpointSids' => + $options['channelEndpointSids'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CustomerProfilesChannelEndpointAssignmentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CustomerProfilesChannelEndpointAssignmentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CustomerProfilesChannelEndpointAssignmentPage Page of CustomerProfilesChannelEndpointAssignmentInstance + */ + public function getPage(string $targetUrl): CustomerProfilesChannelEndpointAssignmentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CustomerProfilesChannelEndpointAssignmentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CustomerProfilesChannelEndpointAssignmentContext + * + * @param string $sid The unique string that we created to identify the resource. + */ + public function getContext( + string $sid + + ): CustomerProfilesChannelEndpointAssignmentContext + { + return new CustomerProfilesChannelEndpointAssignmentContext( + $this->version, + $this->solution['customerProfileSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesChannelEndpointAssignmentList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentOptions.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentOptions.php new file mode 100755 index 0000000..62a5ab6 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentOptions.php @@ -0,0 +1,100 @@ +options['channelEndpointSid'] = $channelEndpointSid; + $this->options['channelEndpointSids'] = $channelEndpointSids; + } + + /** + * The SID of an channel endpoint + * + * @param string $channelEndpointSid The SID of an channel endpoint + * @return $this Fluent Builder + */ + public function setChannelEndpointSid(string $channelEndpointSid): self + { + $this->options['channelEndpointSid'] = $channelEndpointSid; + return $this; + } + + /** + * comma separated list of channel endpoint sids + * + * @param string $channelEndpointSids comma separated list of channel endpoint sids + * @return $this Fluent Builder + */ + public function setChannelEndpointSids(string $channelEndpointSids): self + { + $this->options['channelEndpointSids'] = $channelEndpointSids; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.ReadCustomerProfilesChannelEndpointAssignmentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentPage.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentPage.php new file mode 100755 index 0000000..e199b3f --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesChannelEndpointAssignmentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CustomerProfilesChannelEndpointAssignmentInstance \Twilio\Rest\Trusthub\V1\CustomerProfiles\CustomerProfilesChannelEndpointAssignmentInstance + */ + public function buildInstance(array $payload): CustomerProfilesChannelEndpointAssignmentInstance + { + return new CustomerProfilesChannelEndpointAssignmentInstance($this->version, $payload, $this->solution['customerProfileSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesChannelEndpointAssignmentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsContext.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsContext.php new file mode 100755 index 0000000..71521fd --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsContext.php @@ -0,0 +1,100 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + 'sid' => + $sid, + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/EntityAssignments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CustomerProfilesEntityAssignmentsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CustomerProfilesEntityAssignmentsInstance + * + * @return CustomerProfilesEntityAssignmentsInstance Fetched CustomerProfilesEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesEntityAssignmentsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CustomerProfilesEntityAssignmentsInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesEntityAssignmentsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsInstance.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsInstance.php new file mode 100755 index 0000000..a230c31 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'customerProfileSid' => Values::array_get($payload, 'customer_profile_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'objectSid' => Values::array_get($payload, 'object_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['customerProfileSid' => $customerProfileSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CustomerProfilesEntityAssignmentsContext Context for this CustomerProfilesEntityAssignmentsInstance + */ + protected function proxy(): CustomerProfilesEntityAssignmentsContext + { + if (!$this->context) { + $this->context = new CustomerProfilesEntityAssignmentsContext( + $this->version, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CustomerProfilesEntityAssignmentsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CustomerProfilesEntityAssignmentsInstance + * + * @return CustomerProfilesEntityAssignmentsInstance Fetched CustomerProfilesEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesEntityAssignmentsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesEntityAssignmentsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsList.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsList.php new file mode 100755 index 0000000..5db647c --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsList.php @@ -0,0 +1,194 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/EntityAssignments'; + } + + /** + * Create the CustomerProfilesEntityAssignmentsInstance + * + * @param string $objectSid The SID of an object bag that holds information of the different items. + * @return CustomerProfilesEntityAssignmentsInstance Created CustomerProfilesEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $objectSid): CustomerProfilesEntityAssignmentsInstance + { + + $data = Values::of([ + 'ObjectSid' => + $objectSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CustomerProfilesEntityAssignmentsInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'] + ); + } + + + /** + * Reads CustomerProfilesEntityAssignmentsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CustomerProfilesEntityAssignmentsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CustomerProfilesEntityAssignmentsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CustomerProfilesEntityAssignmentsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CustomerProfilesEntityAssignmentsPage Page of CustomerProfilesEntityAssignmentsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CustomerProfilesEntityAssignmentsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CustomerProfilesEntityAssignmentsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CustomerProfilesEntityAssignmentsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CustomerProfilesEntityAssignmentsPage Page of CustomerProfilesEntityAssignmentsInstance + */ + public function getPage(string $targetUrl): CustomerProfilesEntityAssignmentsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CustomerProfilesEntityAssignmentsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CustomerProfilesEntityAssignmentsContext + * + * @param string $sid The unique string that we created to identify the Identity resource. + */ + public function getContext( + string $sid + + ): CustomerProfilesEntityAssignmentsContext + { + return new CustomerProfilesEntityAssignmentsContext( + $this->version, + $this->solution['customerProfileSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesEntityAssignmentsList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsPage.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsPage.php new file mode 100755 index 0000000..2dddad5 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEntityAssignmentsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CustomerProfilesEntityAssignmentsInstance \Twilio\Rest\Trusthub\V1\CustomerProfiles\CustomerProfilesEntityAssignmentsInstance + */ + public function buildInstance(array $payload): CustomerProfilesEntityAssignmentsInstance + { + return new CustomerProfilesEntityAssignmentsInstance($this->version, $payload, $this->solution['customerProfileSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesEntityAssignmentsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsContext.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsContext.php new file mode 100755 index 0000000..cb91172 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsContext.php @@ -0,0 +1,87 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + 'sid' => + $sid, + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/Evaluations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the CustomerProfilesEvaluationsInstance + * + * @return CustomerProfilesEvaluationsInstance Fetched CustomerProfilesEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesEvaluationsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CustomerProfilesEvaluationsInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesEvaluationsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsInstance.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsInstance.php new file mode 100755 index 0000000..8023460 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsInstance.php @@ -0,0 +1,132 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'policySid' => Values::array_get($payload, 'policy_sid'), + 'customerProfileSid' => Values::array_get($payload, 'customer_profile_sid'), + 'status' => Values::array_get($payload, 'status'), + 'results' => Values::array_get($payload, 'results'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['customerProfileSid' => $customerProfileSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CustomerProfilesEvaluationsContext Context for this CustomerProfilesEvaluationsInstance + */ + protected function proxy(): CustomerProfilesEvaluationsContext + { + if (!$this->context) { + $this->context = new CustomerProfilesEvaluationsContext( + $this->version, + $this->solution['customerProfileSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the CustomerProfilesEvaluationsInstance + * + * @return CustomerProfilesEvaluationsInstance Fetched CustomerProfilesEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesEvaluationsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesEvaluationsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsList.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsList.php new file mode 100755 index 0000000..9f4837e --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsList.php @@ -0,0 +1,194 @@ +solution = [ + 'customerProfileSid' => + $customerProfileSid, + + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($customerProfileSid) + .'/Evaluations'; + } + + /** + * Create the CustomerProfilesEvaluationsInstance + * + * @param string $policySid The unique string of a policy that is associated to the customer_profile resource. + * @return CustomerProfilesEvaluationsInstance Created CustomerProfilesEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $policySid): CustomerProfilesEvaluationsInstance + { + + $data = Values::of([ + 'PolicySid' => + $policySid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CustomerProfilesEvaluationsInstance( + $this->version, + $payload, + $this->solution['customerProfileSid'] + ); + } + + + /** + * Reads CustomerProfilesEvaluationsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CustomerProfilesEvaluationsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams CustomerProfilesEvaluationsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CustomerProfilesEvaluationsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CustomerProfilesEvaluationsPage Page of CustomerProfilesEvaluationsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CustomerProfilesEvaluationsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CustomerProfilesEvaluationsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CustomerProfilesEvaluationsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CustomerProfilesEvaluationsPage Page of CustomerProfilesEvaluationsInstance + */ + public function getPage(string $targetUrl): CustomerProfilesEvaluationsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CustomerProfilesEvaluationsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CustomerProfilesEvaluationsContext + * + * @param string $sid The unique string that identifies the Evaluation resource. + */ + public function getContext( + string $sid + + ): CustomerProfilesEvaluationsContext + { + return new CustomerProfilesEvaluationsContext( + $this->version, + $this->solution['customerProfileSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesEvaluationsList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsPage.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsPage.php new file mode 100755 index 0000000..aabef1a --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfiles/CustomerProfilesEvaluationsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CustomerProfilesEvaluationsInstance \Twilio\Rest\Trusthub\V1\CustomerProfiles\CustomerProfilesEvaluationsInstance + */ + public function buildInstance(array $payload): CustomerProfilesEvaluationsInstance + { + return new CustomerProfilesEvaluationsInstance($this->version, $payload, $this->solution['customerProfileSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesEvaluationsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesContext.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesContext.php new file mode 100755 index 0000000..28e4cfb --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesContext.php @@ -0,0 +1,225 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/CustomerProfiles/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CustomerProfilesInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CustomerProfilesInstance + * + * @return CustomerProfilesInstance Fetched CustomerProfilesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CustomerProfilesInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CustomerProfilesInstance + * + * @param array|Options $options Optional Arguments + * @return CustomerProfilesInstance Updated CustomerProfilesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CustomerProfilesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $options['status'], + 'StatusCallback' => + $options['statusCallback'], + 'FriendlyName' => + $options['friendlyName'], + 'Email' => + $options['email'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CustomerProfilesInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the customerProfilesChannelEndpointAssignment + */ + protected function getCustomerProfilesChannelEndpointAssignment(): CustomerProfilesChannelEndpointAssignmentList + { + if (!$this->_customerProfilesChannelEndpointAssignment) { + $this->_customerProfilesChannelEndpointAssignment = new CustomerProfilesChannelEndpointAssignmentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_customerProfilesChannelEndpointAssignment; + } + + /** + * Access the customerProfilesEntityAssignments + */ + protected function getCustomerProfilesEntityAssignments(): CustomerProfilesEntityAssignmentsList + { + if (!$this->_customerProfilesEntityAssignments) { + $this->_customerProfilesEntityAssignments = new CustomerProfilesEntityAssignmentsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_customerProfilesEntityAssignments; + } + + /** + * Access the customerProfilesEvaluations + */ + protected function getCustomerProfilesEvaluations(): CustomerProfilesEvaluationsList + { + if (!$this->_customerProfilesEvaluations) { + $this->_customerProfilesEvaluations = new CustomerProfilesEvaluationsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_customerProfilesEvaluations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesInstance.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesInstance.php new file mode 100755 index 0000000..d41e21a --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesInstance.php @@ -0,0 +1,195 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'policySid' => Values::array_get($payload, 'policy_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'validUntil' => Deserialize::dateTime(Values::array_get($payload, 'valid_until')), + 'email' => Values::array_get($payload, 'email'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CustomerProfilesContext Context for this CustomerProfilesInstance + */ + protected function proxy(): CustomerProfilesContext + { + if (!$this->context) { + $this->context = new CustomerProfilesContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CustomerProfilesInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CustomerProfilesInstance + * + * @return CustomerProfilesInstance Fetched CustomerProfilesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CustomerProfilesInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CustomerProfilesInstance + * + * @param array|Options $options Optional Arguments + * @return CustomerProfilesInstance Updated CustomerProfilesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): CustomerProfilesInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the customerProfilesChannelEndpointAssignment + */ + protected function getCustomerProfilesChannelEndpointAssignment(): CustomerProfilesChannelEndpointAssignmentList + { + return $this->proxy()->customerProfilesChannelEndpointAssignment; + } + + /** + * Access the customerProfilesEntityAssignments + */ + protected function getCustomerProfilesEntityAssignments(): CustomerProfilesEntityAssignmentsList + { + return $this->proxy()->customerProfilesEntityAssignments; + } + + /** + * Access the customerProfilesEvaluations + */ + protected function getCustomerProfilesEvaluations(): CustomerProfilesEvaluationsList + { + return $this->proxy()->customerProfilesEvaluations; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.CustomerProfilesInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesList.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesList.php new file mode 100755 index 0000000..f48991a --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesList.php @@ -0,0 +1,208 @@ +solution = [ + ]; + + $this->uri = '/CustomerProfiles'; + } + + /** + * Create the CustomerProfilesInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + * @param array|Options $options Optional Arguments + * @return CustomerProfilesInstance Created CustomerProfilesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $email, string $policySid, array $options = []): CustomerProfilesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Email' => + $email, + 'PolicySid' => + $policySid, + 'StatusCallback' => + $options['statusCallback'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CustomerProfilesInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CustomerProfilesInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CustomerProfilesInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CustomerProfilesInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CustomerProfilesInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CustomerProfilesPage Page of CustomerProfilesInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CustomerProfilesPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'FriendlyName' => + $options['friendlyName'], + 'PolicySid' => + $options['policySid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CustomerProfilesPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CustomerProfilesInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CustomerProfilesPage Page of CustomerProfilesInstance + */ + public function getPage(string $targetUrl): CustomerProfilesPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CustomerProfilesPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CustomerProfilesContext + * + * @param string $sid The unique string that we created to identify the Customer-Profile resource. + */ + public function getContext( + string $sid + + ): CustomerProfilesContext + { + return new CustomerProfilesContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesOptions.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesOptions.php new file mode 100755 index 0000000..cf2af60 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesOptions.php @@ -0,0 +1,272 @@ +options['statusCallback'] = $statusCallback; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.CreateCustomerProfilesOptions ' . $options . ']'; + } +} + + + +class ReadCustomerProfilesOptions extends Options + { + /** + * @param string $status The verification status of the Customer-Profile resource. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + */ + public function __construct( + + string $status = Values::NONE, + string $friendlyName = Values::NONE, + string $policySid = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['friendlyName'] = $friendlyName; + $this->options['policySid'] = $policySid; + } + + /** + * The verification status of the Customer-Profile resource. + * + * @param string $status The verification status of the Customer-Profile resource. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The unique string of a policy that is associated to the Customer-Profile resource. + * + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + * @return $this Fluent Builder + */ + public function setPolicySid(string $policySid): self + { + $this->options['policySid'] = $policySid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.ReadCustomerProfilesOptions ' . $options . ']'; + } +} + +class UpdateCustomerProfilesOptions extends Options + { + /** + * @param string $status + * @param string $statusCallback The URL we call to inform your application of status changes. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + */ + public function __construct( + + string $status = Values::NONE, + string $statusCallback = Values::NONE, + string $friendlyName = Values::NONE, + string $email = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['statusCallback'] = $statusCallback; + $this->options['friendlyName'] = $friendlyName; + $this->options['email'] = $email; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The email address that will receive updates when the Customer-Profile resource changes status. + * + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.UpdateCustomerProfilesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesPage.php b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesPage.php new file mode 100755 index 0000000..d336304 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/CustomerProfilesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CustomerProfilesInstance \Twilio\Rest\Trusthub\V1\CustomerProfilesInstance + */ + public function buildInstance(array $payload): CustomerProfilesInstance + { + return new CustomerProfilesInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.CustomerProfilesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserContext.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserContext.php new file mode 100755 index 0000000..d14a476 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserContext.php @@ -0,0 +1,126 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/EndUsers/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the EndUserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the EndUserInstance + * + * @return EndUserInstance Fetched EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EndUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the EndUserInstance + * + * @param array|Options $options Optional Arguments + * @return EndUserInstance Updated EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): EndUserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new EndUserInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.EndUserContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserInstance.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserInstance.php new file mode 100755 index 0000000..19dda03 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'type' => Values::array_get($payload, 'type'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EndUserContext Context for this EndUserInstance + */ + protected function proxy(): EndUserContext + { + if (!$this->context) { + $this->context = new EndUserContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the EndUserInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the EndUserInstance + * + * @return EndUserInstance Fetched EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the EndUserInstance + * + * @param array|Options $options Optional Arguments + * @return EndUserInstance Updated EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): EndUserInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.EndUserInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserList.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserList.php new file mode 100755 index 0000000..61fc1b1 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserList.php @@ -0,0 +1,196 @@ +solution = [ + ]; + + $this->uri = '/EndUsers'; + } + + /** + * Create the EndUserInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $type The type of end user of the Bundle resource - can be `individual` or `business`. + * @param array|Options $options Optional Arguments + * @return EndUserInstance Created EndUserInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $options = []): EndUserInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EndUserInstance( + $this->version, + $payload + ); + } + + + /** + * Reads EndUserInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EndUserInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EndUserInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EndUserInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EndUserPage Page of EndUserInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EndUserPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EndUserPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EndUserInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EndUserPage Page of EndUserInstance + */ + public function getPage(string $targetUrl): EndUserPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EndUserPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EndUserContext + * + * @param string $sid The unique string created by Twilio to identify the End User resource. + */ + public function getContext( + string $sid + + ): EndUserContext + { + return new EndUserContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.EndUserList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserOptions.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserOptions.php new file mode 100755 index 0000000..c6b6df0 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserOptions.php @@ -0,0 +1,152 @@ +options['attributes'] = $attributes; + } + + /** + * The set of parameters that are the attributes of the End User resource which are derived End User Types. + * + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.CreateEndUserOptions ' . $options . ']'; + } +} + + + + +class UpdateEndUserOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $attributes = Values::ARRAY_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The set of parameters that are the attributes of the End User resource which are derived End User Types. + * + * @param array $attributes The set of parameters that are the attributes of the End User resource which are derived End User Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.UpdateEndUserOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserPage.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserPage.php new file mode 100755 index 0000000..46cbe04 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EndUserInstance \Twilio\Rest\Trusthub\V1\EndUserInstance + */ + public function buildInstance(array $payload): EndUserInstance + { + return new EndUserInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.EndUserPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeContext.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeContext.php new file mode 100755 index 0000000..f3676c2 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/EndUserTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the EndUserTypeInstance + * + * @return EndUserTypeInstance Fetched EndUserTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EndUserTypeInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.EndUserTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeInstance.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeInstance.php new file mode 100755 index 0000000..8dbc24e --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'machineName' => Values::array_get($payload, 'machine_name'), + 'fields' => Values::array_get($payload, 'fields'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EndUserTypeContext Context for this EndUserTypeInstance + */ + protected function proxy(): EndUserTypeContext + { + if (!$this->context) { + $this->context = new EndUserTypeContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the EndUserTypeInstance + * + * @return EndUserTypeInstance Fetched EndUserTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EndUserTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.EndUserTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeList.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeList.php new file mode 100755 index 0000000..1a49b4e --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypeList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/EndUserTypes'; + } + + /** + * Reads EndUserTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EndUserTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EndUserTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EndUserTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EndUserTypePage Page of EndUserTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EndUserTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EndUserTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EndUserTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EndUserTypePage Page of EndUserTypeInstance + */ + public function getPage(string $targetUrl): EndUserTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EndUserTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EndUserTypeContext + * + * @param string $sid The unique string that identifies the End-User Type resource. + */ + public function getContext( + string $sid + + ): EndUserTypeContext + { + return new EndUserTypeContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.EndUserTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/EndUserTypePage.php b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypePage.php new file mode 100755 index 0000000..31fd609 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/EndUserTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EndUserTypeInstance \Twilio\Rest\Trusthub\V1\EndUserTypeInstance + */ + public function buildInstance(array $payload): EndUserTypeInstance + { + return new EndUserTypeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.EndUserTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/PoliciesContext.php b/app/api/Twilio/Rest/Trusthub/V1/PoliciesContext.php new file mode 100755 index 0000000..09a024e --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/PoliciesContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Policies/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the PoliciesInstance + * + * @return PoliciesInstance Fetched PoliciesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PoliciesInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PoliciesInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.PoliciesContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/PoliciesInstance.php b/app/api/Twilio/Rest/Trusthub/V1/PoliciesInstance.php new file mode 100755 index 0000000..40794dc --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/PoliciesInstance.php @@ -0,0 +1,121 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'requirements' => Values::array_get($payload, 'requirements'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PoliciesContext Context for this PoliciesInstance + */ + protected function proxy(): PoliciesContext + { + if (!$this->context) { + $this->context = new PoliciesContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the PoliciesInstance + * + * @return PoliciesInstance Fetched PoliciesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PoliciesInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.PoliciesInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/PoliciesList.php b/app/api/Twilio/Rest/Trusthub/V1/PoliciesList.php new file mode 100755 index 0000000..d573eeb --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/PoliciesList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/Policies'; + } + + /** + * Reads PoliciesInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PoliciesInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PoliciesInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PoliciesInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PoliciesPage Page of PoliciesInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PoliciesPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PoliciesPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PoliciesInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PoliciesPage Page of PoliciesInstance + */ + public function getPage(string $targetUrl): PoliciesPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PoliciesPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PoliciesContext + * + * @param string $sid The unique string that identifies the Policy resource. + */ + public function getContext( + string $sid + + ): PoliciesContext + { + return new PoliciesContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.PoliciesList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/PoliciesPage.php b/app/api/Twilio/Rest/Trusthub/V1/PoliciesPage.php new file mode 100755 index 0000000..04274a7 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/PoliciesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PoliciesInstance \Twilio\Rest\Trusthub\V1\PoliciesInstance + */ + public function buildInstance(array $payload): PoliciesInstance + { + return new PoliciesInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.PoliciesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentContext.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentContext.php new file mode 100755 index 0000000..9e6a9ff --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentContext.php @@ -0,0 +1,126 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/SupportingDocuments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SupportingDocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SupportingDocumentInstance + * + * @return SupportingDocumentInstance Fetched SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SupportingDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SupportingDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Updated SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SupportingDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SupportingDocumentInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.SupportingDocumentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentInstance.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentInstance.php new file mode 100755 index 0000000..c62cd27 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentInstance.php @@ -0,0 +1,160 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'mimeType' => Values::array_get($payload, 'mime_type'), + 'status' => Values::array_get($payload, 'status'), + 'type' => Values::array_get($payload, 'type'), + 'attributes' => Values::array_get($payload, 'attributes'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SupportingDocumentContext Context for this SupportingDocumentInstance + */ + protected function proxy(): SupportingDocumentContext + { + if (!$this->context) { + $this->context = new SupportingDocumentContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SupportingDocumentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SupportingDocumentInstance + * + * @return SupportingDocumentInstance Fetched SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SupportingDocumentInstance + * + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Updated SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SupportingDocumentInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.SupportingDocumentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentList.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentList.php new file mode 100755 index 0000000..305ed07 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentList.php @@ -0,0 +1,196 @@ +solution = [ + ]; + + $this->uri = '/SupportingDocuments'; + } + + /** + * Create the SupportingDocumentInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $type The type of the Supporting Document. + * @param array|Options $options Optional Arguments + * @return SupportingDocumentInstance Created SupportingDocumentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $type, array $options = []): SupportingDocumentInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Type' => + $type, + 'Attributes' => + Serialize::jsonObject($options['attributes']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SupportingDocumentInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SupportingDocumentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SupportingDocumentInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SupportingDocumentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SupportingDocumentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SupportingDocumentPage Page of SupportingDocumentInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SupportingDocumentPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SupportingDocumentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SupportingDocumentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SupportingDocumentPage Page of SupportingDocumentInstance + */ + public function getPage(string $targetUrl): SupportingDocumentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SupportingDocumentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SupportingDocumentContext + * + * @param string $sid The unique string created by Twilio to identify the Supporting Document resource. + */ + public function getContext( + string $sid + + ): SupportingDocumentContext + { + return new SupportingDocumentContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.SupportingDocumentList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentOptions.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentOptions.php new file mode 100755 index 0000000..e0e55db --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentOptions.php @@ -0,0 +1,152 @@ +options['attributes'] = $attributes; + } + + /** + * The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + * + * @param array $attributes The set of parameters that are the attributes of the Supporting Documents resource which are derived Supporting Document Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.CreateSupportingDocumentOptions ' . $options . ']'; + } +} + + + + +class UpdateSupportingDocumentOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the resource. + * @param array $attributes The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $attributes = Values::ARRAY_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['attributes'] = $attributes; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + * + * @param array $attributes The set of parameters that are the attributes of the Supporting Document resource which are derived Supporting Document Types. + * @return $this Fluent Builder + */ + public function setAttributes(array $attributes): self + { + $this->options['attributes'] = $attributes; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.UpdateSupportingDocumentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentPage.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentPage.php new file mode 100755 index 0000000..11a6299 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SupportingDocumentInstance \Twilio\Rest\Trusthub\V1\SupportingDocumentInstance + */ + public function buildInstance(array $payload): SupportingDocumentInstance + { + return new SupportingDocumentInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.SupportingDocumentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeContext.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeContext.php new file mode 100755 index 0000000..09b3dec --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/SupportingDocumentTypes/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SupportingDocumentTypeInstance + * + * @return SupportingDocumentTypeInstance Fetched SupportingDocumentTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentTypeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SupportingDocumentTypeInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.SupportingDocumentTypeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeInstance.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeInstance.php new file mode 100755 index 0000000..f2cc00a --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'machineName' => Values::array_get($payload, 'machine_name'), + 'fields' => Values::array_get($payload, 'fields'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SupportingDocumentTypeContext Context for this SupportingDocumentTypeInstance + */ + protected function proxy(): SupportingDocumentTypeContext + { + if (!$this->context) { + $this->context = new SupportingDocumentTypeContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SupportingDocumentTypeInstance + * + * @return SupportingDocumentTypeInstance Fetched SupportingDocumentTypeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SupportingDocumentTypeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.SupportingDocumentTypeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeList.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeList.php new file mode 100755 index 0000000..2655a2a --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypeList.php @@ -0,0 +1,161 @@ +solution = [ + ]; + + $this->uri = '/SupportingDocumentTypes'; + } + + /** + * Reads SupportingDocumentTypeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SupportingDocumentTypeInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SupportingDocumentTypeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SupportingDocumentTypeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SupportingDocumentTypePage Page of SupportingDocumentTypeInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SupportingDocumentTypePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SupportingDocumentTypePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SupportingDocumentTypeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SupportingDocumentTypePage Page of SupportingDocumentTypeInstance + */ + public function getPage(string $targetUrl): SupportingDocumentTypePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SupportingDocumentTypePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SupportingDocumentTypeContext + * + * @param string $sid The unique string that identifies the Supporting Document Type resource. + */ + public function getContext( + string $sid + + ): SupportingDocumentTypeContext + { + return new SupportingDocumentTypeContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.SupportingDocumentTypeList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypePage.php b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypePage.php new file mode 100755 index 0000000..34bcdde --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/SupportingDocumentTypePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SupportingDocumentTypeInstance \Twilio\Rest\Trusthub\V1\SupportingDocumentTypeInstance + */ + public function buildInstance(array $payload): SupportingDocumentTypeInstance + { + return new SupportingDocumentTypeInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.SupportingDocumentTypePage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentContext.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentContext.php new file mode 100755 index 0000000..53071de --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentContext.php @@ -0,0 +1,100 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + 'sid' => + $sid, + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/ChannelEndpointAssignments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TrustProductsChannelEndpointAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TrustProductsChannelEndpointAssignmentInstance + * + * @return TrustProductsChannelEndpointAssignmentInstance Fetched TrustProductsChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsChannelEndpointAssignmentInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrustProductsChannelEndpointAssignmentInstance( + $this->version, + $payload, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsChannelEndpointAssignmentContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentInstance.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentInstance.php new file mode 100755 index 0000000..4431355 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'trustProductSid' => Values::array_get($payload, 'trust_product_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'channelEndpointType' => Values::array_get($payload, 'channel_endpoint_type'), + 'channelEndpointSid' => Values::array_get($payload, 'channel_endpoint_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trustProductSid' => $trustProductSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrustProductsChannelEndpointAssignmentContext Context for this TrustProductsChannelEndpointAssignmentInstance + */ + protected function proxy(): TrustProductsChannelEndpointAssignmentContext + { + if (!$this->context) { + $this->context = new TrustProductsChannelEndpointAssignmentContext( + $this->version, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TrustProductsChannelEndpointAssignmentInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TrustProductsChannelEndpointAssignmentInstance + * + * @return TrustProductsChannelEndpointAssignmentInstance Fetched TrustProductsChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsChannelEndpointAssignmentInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsChannelEndpointAssignmentInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentList.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentList.php new file mode 100755 index 0000000..11f99b0 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentList.php @@ -0,0 +1,206 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/ChannelEndpointAssignments'; + } + + /** + * Create the TrustProductsChannelEndpointAssignmentInstance + * + * @param string $channelEndpointType The type of channel endpoint. eg: phone-number + * @param string $channelEndpointSid The SID of an channel endpoint + * @return TrustProductsChannelEndpointAssignmentInstance Created TrustProductsChannelEndpointAssignmentInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $channelEndpointType, string $channelEndpointSid): TrustProductsChannelEndpointAssignmentInstance + { + + $data = Values::of([ + 'ChannelEndpointType' => + $channelEndpointType, + 'ChannelEndpointSid' => + $channelEndpointSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TrustProductsChannelEndpointAssignmentInstance( + $this->version, + $payload, + $this->solution['trustProductSid'] + ); + } + + + /** + * Reads TrustProductsChannelEndpointAssignmentInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TrustProductsChannelEndpointAssignmentInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TrustProductsChannelEndpointAssignmentInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TrustProductsChannelEndpointAssignmentInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TrustProductsChannelEndpointAssignmentPage Page of TrustProductsChannelEndpointAssignmentInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TrustProductsChannelEndpointAssignmentPage + { + $options = new Values($options); + + $params = Values::of([ + 'ChannelEndpointSid' => + $options['channelEndpointSid'], + 'ChannelEndpointSids' => + $options['channelEndpointSids'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TrustProductsChannelEndpointAssignmentPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TrustProductsChannelEndpointAssignmentInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TrustProductsChannelEndpointAssignmentPage Page of TrustProductsChannelEndpointAssignmentInstance + */ + public function getPage(string $targetUrl): TrustProductsChannelEndpointAssignmentPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TrustProductsChannelEndpointAssignmentPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TrustProductsChannelEndpointAssignmentContext + * + * @param string $sid The unique string that we created to identify the resource. + */ + public function getContext( + string $sid + + ): TrustProductsChannelEndpointAssignmentContext + { + return new TrustProductsChannelEndpointAssignmentContext( + $this->version, + $this->solution['trustProductSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsChannelEndpointAssignmentList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentOptions.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentOptions.php new file mode 100755 index 0000000..6dd2dbe --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentOptions.php @@ -0,0 +1,100 @@ +options['channelEndpointSid'] = $channelEndpointSid; + $this->options['channelEndpointSids'] = $channelEndpointSids; + } + + /** + * The SID of an channel endpoint + * + * @param string $channelEndpointSid The SID of an channel endpoint + * @return $this Fluent Builder + */ + public function setChannelEndpointSid(string $channelEndpointSid): self + { + $this->options['channelEndpointSid'] = $channelEndpointSid; + return $this; + } + + /** + * comma separated list of channel endpoint sids + * + * @param string $channelEndpointSids comma separated list of channel endpoint sids + * @return $this Fluent Builder + */ + public function setChannelEndpointSids(string $channelEndpointSids): self + { + $this->options['channelEndpointSids'] = $channelEndpointSids; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.ReadTrustProductsChannelEndpointAssignmentOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentPage.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentPage.php new file mode 100755 index 0000000..3255334 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsChannelEndpointAssignmentPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrustProductsChannelEndpointAssignmentInstance \Twilio\Rest\Trusthub\V1\TrustProducts\TrustProductsChannelEndpointAssignmentInstance + */ + public function buildInstance(array $payload): TrustProductsChannelEndpointAssignmentInstance + { + return new TrustProductsChannelEndpointAssignmentInstance($this->version, $payload, $this->solution['trustProductSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsChannelEndpointAssignmentPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsContext.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsContext.php new file mode 100755 index 0000000..bc5f0c9 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsContext.php @@ -0,0 +1,100 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + 'sid' => + $sid, + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/EntityAssignments/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TrustProductsEntityAssignmentsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TrustProductsEntityAssignmentsInstance + * + * @return TrustProductsEntityAssignmentsInstance Fetched TrustProductsEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsEntityAssignmentsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrustProductsEntityAssignmentsInstance( + $this->version, + $payload, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsEntityAssignmentsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsInstance.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsInstance.php new file mode 100755 index 0000000..1f86e6b --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsInstance.php @@ -0,0 +1,140 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'trustProductSid' => Values::array_get($payload, 'trust_product_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'objectSid' => Values::array_get($payload, 'object_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trustProductSid' => $trustProductSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrustProductsEntityAssignmentsContext Context for this TrustProductsEntityAssignmentsInstance + */ + protected function proxy(): TrustProductsEntityAssignmentsContext + { + if (!$this->context) { + $this->context = new TrustProductsEntityAssignmentsContext( + $this->version, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TrustProductsEntityAssignmentsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TrustProductsEntityAssignmentsInstance + * + * @return TrustProductsEntityAssignmentsInstance Fetched TrustProductsEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsEntityAssignmentsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsEntityAssignmentsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsList.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsList.php new file mode 100755 index 0000000..abf5c1e --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsList.php @@ -0,0 +1,194 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/EntityAssignments'; + } + + /** + * Create the TrustProductsEntityAssignmentsInstance + * + * @param string $objectSid The SID of an object bag that holds information of the different items. + * @return TrustProductsEntityAssignmentsInstance Created TrustProductsEntityAssignmentsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $objectSid): TrustProductsEntityAssignmentsInstance + { + + $data = Values::of([ + 'ObjectSid' => + $objectSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TrustProductsEntityAssignmentsInstance( + $this->version, + $payload, + $this->solution['trustProductSid'] + ); + } + + + /** + * Reads TrustProductsEntityAssignmentsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TrustProductsEntityAssignmentsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TrustProductsEntityAssignmentsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TrustProductsEntityAssignmentsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TrustProductsEntityAssignmentsPage Page of TrustProductsEntityAssignmentsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TrustProductsEntityAssignmentsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TrustProductsEntityAssignmentsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TrustProductsEntityAssignmentsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TrustProductsEntityAssignmentsPage Page of TrustProductsEntityAssignmentsInstance + */ + public function getPage(string $targetUrl): TrustProductsEntityAssignmentsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TrustProductsEntityAssignmentsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TrustProductsEntityAssignmentsContext + * + * @param string $sid The unique string that we created to identify the Identity resource. + */ + public function getContext( + string $sid + + ): TrustProductsEntityAssignmentsContext + { + return new TrustProductsEntityAssignmentsContext( + $this->version, + $this->solution['trustProductSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsEntityAssignmentsList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsPage.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsPage.php new file mode 100755 index 0000000..516ae3b --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEntityAssignmentsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrustProductsEntityAssignmentsInstance \Twilio\Rest\Trusthub\V1\TrustProducts\TrustProductsEntityAssignmentsInstance + */ + public function buildInstance(array $payload): TrustProductsEntityAssignmentsInstance + { + return new TrustProductsEntityAssignmentsInstance($this->version, $payload, $this->solution['trustProductSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsEntityAssignmentsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsContext.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsContext.php new file mode 100755 index 0000000..36f763c --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsContext.php @@ -0,0 +1,87 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + 'sid' => + $sid, + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/Evaluations/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the TrustProductsEvaluationsInstance + * + * @return TrustProductsEvaluationsInstance Fetched TrustProductsEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsEvaluationsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrustProductsEvaluationsInstance( + $this->version, + $payload, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsEvaluationsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsInstance.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsInstance.php new file mode 100755 index 0000000..e9d45dd --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsInstance.php @@ -0,0 +1,132 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'policySid' => Values::array_get($payload, 'policy_sid'), + 'trustProductSid' => Values::array_get($payload, 'trust_product_sid'), + 'status' => Values::array_get($payload, 'status'), + 'results' => Values::array_get($payload, 'results'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['trustProductSid' => $trustProductSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrustProductsEvaluationsContext Context for this TrustProductsEvaluationsInstance + */ + protected function proxy(): TrustProductsEvaluationsContext + { + if (!$this->context) { + $this->context = new TrustProductsEvaluationsContext( + $this->version, + $this->solution['trustProductSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the TrustProductsEvaluationsInstance + * + * @return TrustProductsEvaluationsInstance Fetched TrustProductsEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsEvaluationsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsEvaluationsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsList.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsList.php new file mode 100755 index 0000000..47d86a1 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsList.php @@ -0,0 +1,194 @@ +solution = [ + 'trustProductSid' => + $trustProductSid, + + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($trustProductSid) + .'/Evaluations'; + } + + /** + * Create the TrustProductsEvaluationsInstance + * + * @param string $policySid The unique string of a policy that is associated to the customer_profile resource. + * @return TrustProductsEvaluationsInstance Created TrustProductsEvaluationsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $policySid): TrustProductsEvaluationsInstance + { + + $data = Values::of([ + 'PolicySid' => + $policySid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TrustProductsEvaluationsInstance( + $this->version, + $payload, + $this->solution['trustProductSid'] + ); + } + + + /** + * Reads TrustProductsEvaluationsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TrustProductsEvaluationsInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams TrustProductsEvaluationsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TrustProductsEvaluationsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TrustProductsEvaluationsPage Page of TrustProductsEvaluationsInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TrustProductsEvaluationsPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TrustProductsEvaluationsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TrustProductsEvaluationsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TrustProductsEvaluationsPage Page of TrustProductsEvaluationsInstance + */ + public function getPage(string $targetUrl): TrustProductsEvaluationsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TrustProductsEvaluationsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TrustProductsEvaluationsContext + * + * @param string $sid The unique string that identifies the Evaluation resource. + */ + public function getContext( + string $sid + + ): TrustProductsEvaluationsContext + { + return new TrustProductsEvaluationsContext( + $this->version, + $this->solution['trustProductSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsEvaluationsList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsPage.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsPage.php new file mode 100755 index 0000000..66a8c15 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProducts/TrustProductsEvaluationsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrustProductsEvaluationsInstance \Twilio\Rest\Trusthub\V1\TrustProducts\TrustProductsEvaluationsInstance + */ + public function buildInstance(array $payload): TrustProductsEvaluationsInstance + { + return new TrustProductsEvaluationsInstance($this->version, $payload, $this->solution['trustProductSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsEvaluationsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProductsContext.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsContext.php new file mode 100755 index 0000000..f345fda --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsContext.php @@ -0,0 +1,225 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/TrustProducts/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the TrustProductsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the TrustProductsInstance + * + * @return TrustProductsInstance Fetched TrustProductsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new TrustProductsInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the TrustProductsInstance + * + * @param array|Options $options Optional Arguments + * @return TrustProductsInstance Updated TrustProductsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrustProductsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $options['status'], + 'StatusCallback' => + $options['statusCallback'], + 'FriendlyName' => + $options['friendlyName'], + 'Email' => + $options['email'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new TrustProductsInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the trustProductsChannelEndpointAssignment + */ + protected function getTrustProductsChannelEndpointAssignment(): TrustProductsChannelEndpointAssignmentList + { + if (!$this->_trustProductsChannelEndpointAssignment) { + $this->_trustProductsChannelEndpointAssignment = new TrustProductsChannelEndpointAssignmentList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_trustProductsChannelEndpointAssignment; + } + + /** + * Access the trustProductsEvaluations + */ + protected function getTrustProductsEvaluations(): TrustProductsEvaluationsList + { + if (!$this->_trustProductsEvaluations) { + $this->_trustProductsEvaluations = new TrustProductsEvaluationsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_trustProductsEvaluations; + } + + /** + * Access the trustProductsEntityAssignments + */ + protected function getTrustProductsEntityAssignments(): TrustProductsEntityAssignmentsList + { + if (!$this->_trustProductsEntityAssignments) { + $this->_trustProductsEntityAssignments = new TrustProductsEntityAssignmentsList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_trustProductsEntityAssignments; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProductsInstance.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsInstance.php new file mode 100755 index 0000000..245928f --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsInstance.php @@ -0,0 +1,195 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'policySid' => Values::array_get($payload, 'policy_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'validUntil' => Deserialize::dateTime(Values::array_get($payload, 'valid_until')), + 'email' => Values::array_get($payload, 'email'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return TrustProductsContext Context for this TrustProductsInstance + */ + protected function proxy(): TrustProductsContext + { + if (!$this->context) { + $this->context = new TrustProductsContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the TrustProductsInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the TrustProductsInstance + * + * @return TrustProductsInstance Fetched TrustProductsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): TrustProductsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the TrustProductsInstance + * + * @param array|Options $options Optional Arguments + * @return TrustProductsInstance Updated TrustProductsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): TrustProductsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the trustProductsChannelEndpointAssignment + */ + protected function getTrustProductsChannelEndpointAssignment(): TrustProductsChannelEndpointAssignmentList + { + return $this->proxy()->trustProductsChannelEndpointAssignment; + } + + /** + * Access the trustProductsEvaluations + */ + protected function getTrustProductsEvaluations(): TrustProductsEvaluationsList + { + return $this->proxy()->trustProductsEvaluations; + } + + /** + * Access the trustProductsEntityAssignments + */ + protected function getTrustProductsEntityAssignments(): TrustProductsEntityAssignmentsList + { + return $this->proxy()->trustProductsEntityAssignments; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Trusthub.V1.TrustProductsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProductsList.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsList.php new file mode 100755 index 0000000..84e7b94 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsList.php @@ -0,0 +1,208 @@ +solution = [ + ]; + + $this->uri = '/TrustProducts'; + } + + /** + * Create the TrustProductsInstance + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + * @param array|Options $options Optional Arguments + * @return TrustProductsInstance Created TrustProductsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $email, string $policySid, array $options = []): TrustProductsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Email' => + $email, + 'PolicySid' => + $policySid, + 'StatusCallback' => + $options['statusCallback'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new TrustProductsInstance( + $this->version, + $payload + ); + } + + + /** + * Reads TrustProductsInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TrustProductsInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TrustProductsInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TrustProductsInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TrustProductsPage Page of TrustProductsInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TrustProductsPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'FriendlyName' => + $options['friendlyName'], + 'PolicySid' => + $options['policySid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TrustProductsPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TrustProductsInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TrustProductsPage Page of TrustProductsInstance + */ + public function getPage(string $targetUrl): TrustProductsPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TrustProductsPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a TrustProductsContext + * + * @param string $sid The unique string that we created to identify the Customer-Profile resource. + */ + public function getContext( + string $sid + + ): TrustProductsContext + { + return new TrustProductsContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsList]'; + } +} diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProductsOptions.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsOptions.php new file mode 100755 index 0000000..beb8025 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsOptions.php @@ -0,0 +1,272 @@ +options['statusCallback'] = $statusCallback; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.CreateTrustProductsOptions ' . $options . ']'; + } +} + + + +class ReadTrustProductsOptions extends Options + { + /** + * @param string $status The verification status of the Customer-Profile resource. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + */ + public function __construct( + + string $status = Values::NONE, + string $friendlyName = Values::NONE, + string $policySid = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['friendlyName'] = $friendlyName; + $this->options['policySid'] = $policySid; + } + + /** + * The verification status of the Customer-Profile resource. + * + * @param string $status The verification status of the Customer-Profile resource. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The unique string of a policy that is associated to the Customer-Profile resource. + * + * @param string $policySid The unique string of a policy that is associated to the Customer-Profile resource. + * @return $this Fluent Builder + */ + public function setPolicySid(string $policySid): self + { + $this->options['policySid'] = $policySid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.ReadTrustProductsOptions ' . $options . ']'; + } +} + +class UpdateTrustProductsOptions extends Options + { + /** + * @param string $status + * @param string $statusCallback The URL we call to inform your application of status changes. + * @param string $friendlyName The string that you assigned to describe the resource. + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + */ + public function __construct( + + string $status = Values::NONE, + string $statusCallback = Values::NONE, + string $friendlyName = Values::NONE, + string $email = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['statusCallback'] = $statusCallback; + $this->options['friendlyName'] = $friendlyName; + $this->options['email'] = $email; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The URL we call to inform your application of status changes. + * + * @param string $statusCallback The URL we call to inform your application of status changes. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The string that you assigned to describe the resource. + * + * @param string $friendlyName The string that you assigned to describe the resource. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The email address that will receive updates when the Customer-Profile resource changes status. + * + * @param string $email The email address that will receive updates when the Customer-Profile resource changes status. + * @return $this Fluent Builder + */ + public function setEmail(string $email): self + { + $this->options['email'] = $email; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Trusthub.V1.UpdateTrustProductsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Trusthub/V1/TrustProductsPage.php b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsPage.php new file mode 100755 index 0000000..9ad4bf4 --- /dev/null +++ b/app/api/Twilio/Rest/Trusthub/V1/TrustProductsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TrustProductsInstance \Twilio\Rest\Trusthub\V1\TrustProductsInstance + */ + public function buildInstance(array $payload): TrustProductsInstance + { + return new TrustProductsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Trusthub.V1.TrustProductsPage]'; + } +} diff --git a/app/api/Twilio/Rest/TrusthubBase.php b/app/api/Twilio/Rest/TrusthubBase.php new file mode 100755 index 0000000..9cf35d3 --- /dev/null +++ b/app/api/Twilio/Rest/TrusthubBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://trusthub.twilio.com'; + } + + + /** + * @return V1 Version v1 of trusthub + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Trusthub]'; + } +} diff --git a/app/api/Twilio/Rest/Verify.php b/app/api/Twilio/Rest/Verify.php new file mode 100755 index 0000000..40ee9c0 --- /dev/null +++ b/app/api/Twilio/Rest/Verify.php @@ -0,0 +1,99 @@ +forms instead. + */ + protected function getForms(): \Twilio\Rest\Verify\V2\FormList { + echo "forms is deprecated. Use v2->forms instead."; + return $this->v2->forms; + } + + /** + * @deprecated Use v2->forms(\$formType) instead. + * @param string $formType The Type of this Form + */ + protected function contextForms(string $formType): \Twilio\Rest\Verify\V2\FormContext { + echo "forms(\$formType) is deprecated. Use v2->forms(\$formType) instead."; + return $this->v2->forms($formType); + } + + /** + * @deprecated Use v2->safelist instead. + */ + protected function getSafelist(): \Twilio\Rest\Verify\V2\SafelistList { + echo "safelist is deprecated. Use v2->safelist instead."; + return $this->v2->safelist; + } + + /** + * @deprecated Use v2->safelist(\$phoneNumber) instead. + * @param string $phoneNumber The phone number to be fetched from SafeList. + */ + protected function contextSafelist(string $phoneNumber): \Twilio\Rest\Verify\V2\SafelistContext { + echo "safelist(\$phoneNumber) is deprecated. Use v2->safelist(\$phoneNumber) instead."; + return $this->v2->safelist($phoneNumber); + } + + /** + * @deprecated Use v2->services instead. + */ + protected function getServices(): \Twilio\Rest\Verify\V2\ServiceList { + echo "services is deprecated. Use v2->services instead."; + return $this->v2->services; + } + + /** + * @deprecated Use v2->services(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextServices(string $sid): \Twilio\Rest\Verify\V2\ServiceContext { + echo "services(\$sid) is deprecated. Use v2->services(\$sid) instead."; + return $this->v2->services($sid); + } + + /** + * @deprecated Use v2->verificationAttempts instead. + */ + protected function getVerificationAttempts(): \Twilio\Rest\Verify\V2\VerificationAttemptList { + echo "verificationAttempts is deprecated. Use v2->verificationAttempts instead."; + return $this->v2->verificationAttempts; + } + + /** + * @deprecated Use v2->verificationAttempts(\$sid) instead. + * @param string $sid Verification Attempt Sid. + */ + protected function contextVerificationAttempts(string $sid): \Twilio\Rest\Verify\V2\VerificationAttemptContext { + echo "verificationAttempts(\$sid) is deprecated. Use v2->verificationAttempts(\$sid) instead."; + return $this->v2->verificationAttempts($sid); + } + + /** + * @deprecated Use v2->verificationAttemptsSummary instead. + */ + protected function getVerificationAttemptsSummary(): \Twilio\Rest\Verify\V2\VerificationAttemptsSummaryList { + echo "verificationAttemptsSummary is deprecated. Use v2->verificationAttemptsSummary instead."; + return $this->v2->verificationAttemptsSummary; + } + + /** + * @deprecated Use v2->verificationAttemptsSummary() instead. + */ + protected function contextVerificationAttemptsSummary(): \Twilio\Rest\Verify\V2\VerificationAttemptsSummaryContext { + echo "verificationAttemptsSummary() is deprecated. Use v2->verificationAttemptsSummary() instead."; + return $this->v2->verificationAttemptsSummary(); + } + + /** + * @deprecated Use v2->templates instead. + */ + protected function getTemplates(): \Twilio\Rest\Verify\V2\TemplateList { + echo "templates is deprecated. Use v2->templates instead."; + return $this->v2->templates; + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Verify/V2.php b/app/api/Twilio/Rest/Verify/V2.php new file mode 100755 index 0000000..38087b3 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2.php @@ -0,0 +1,153 @@ +version = 'v2'; + } + + protected function getForms(): FormList + { + if (!$this->_forms) { + $this->_forms = new FormList($this); + } + return $this->_forms; + } + + protected function getSafelist(): SafelistList + { + if (!$this->_safelist) { + $this->_safelist = new SafelistList($this); + } + return $this->_safelist; + } + + protected function getServices(): ServiceList + { + if (!$this->_services) { + $this->_services = new ServiceList($this); + } + return $this->_services; + } + + protected function getTemplates(): TemplateList + { + if (!$this->_templates) { + $this->_templates = new TemplateList($this); + } + return $this->_templates; + } + + protected function getVerificationAttempts(): VerificationAttemptList + { + if (!$this->_verificationAttempts) { + $this->_verificationAttempts = new VerificationAttemptList($this); + } + return $this->_verificationAttempts; + } + + protected function getVerificationAttemptsSummary(): VerificationAttemptsSummaryList + { + if (!$this->_verificationAttemptsSummary) { + $this->_verificationAttemptsSummary = new VerificationAttemptsSummaryList($this); + } + return $this->_verificationAttemptsSummary; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/FormContext.php b/app/api/Twilio/Rest/Verify/V2/FormContext.php new file mode 100755 index 0000000..337bdc5 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/FormContext.php @@ -0,0 +1,81 @@ +solution = [ + 'formType' => + $formType, + ]; + + $this->uri = '/Forms/' . \rawurlencode($formType) + .''; + } + + /** + * Fetch the FormInstance + * + * @return FormInstance Fetched FormInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FormInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FormInstance( + $this->version, + $payload, + $this->solution['formType'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.FormContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/FormInstance.php b/app/api/Twilio/Rest/Verify/V2/FormInstance.php new file mode 100755 index 0000000..d0258c4 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/FormInstance.php @@ -0,0 +1,121 @@ +properties = [ + 'formType' => Values::array_get($payload, 'form_type'), + 'forms' => Values::array_get($payload, 'forms'), + 'formMeta' => Values::array_get($payload, 'form_meta'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['formType' => $formType ?: $this->properties['formType'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FormContext Context for this FormInstance + */ + protected function proxy(): FormContext + { + if (!$this->context) { + $this->context = new FormContext( + $this->version, + $this->solution['formType'] + ); + } + + return $this->context; + } + + /** + * Fetch the FormInstance + * + * @return FormInstance Fetched FormInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FormInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.FormInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/FormList.php b/app/api/Twilio/Rest/Verify/V2/FormList.php new file mode 100755 index 0000000..02a79b4 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/FormList.php @@ -0,0 +1,65 @@ +solution = [ + ]; + } + + /** + * Constructs a FormContext + * + * @param string $formType The Type of this Form. Currently only `form-push` is supported. + */ + public function getContext( + string $formType + + ): FormContext + { + return new FormContext( + $this->version, + $formType + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.FormList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/FormPage.php b/app/api/Twilio/Rest/Verify/V2/FormPage.php new file mode 100755 index 0000000..9c0c80a --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/FormPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FormInstance \Twilio\Rest\Verify\V2\FormInstance + */ + public function buildInstance(array $payload): FormInstance + { + return new FormInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.FormPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/SafelistContext.php b/app/api/Twilio/Rest/Verify/V2/SafelistContext.php new file mode 100755 index 0000000..2c647e3 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/SafelistContext.php @@ -0,0 +1,94 @@ +solution = [ + 'phoneNumber' => + $phoneNumber, + ]; + + $this->uri = '/SafeList/Numbers/' . \rawurlencode($phoneNumber) + .''; + } + + /** + * Delete the SafelistInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SafelistInstance + * + * @return SafelistInstance Fetched SafelistInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SafelistInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SafelistInstance( + $this->version, + $payload, + $this->solution['phoneNumber'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.SafelistContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/SafelistInstance.php b/app/api/Twilio/Rest/Verify/V2/SafelistInstance.php new file mode 100755 index 0000000..2e53592 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/SafelistInstance.php @@ -0,0 +1,131 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'phoneNumber' => Values::array_get($payload, 'phone_number'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['phoneNumber' => $phoneNumber ?: $this->properties['phoneNumber'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SafelistContext Context for this SafelistInstance + */ + protected function proxy(): SafelistContext + { + if (!$this->context) { + $this->context = new SafelistContext( + $this->version, + $this->solution['phoneNumber'] + ); + } + + return $this->context; + } + + /** + * Delete the SafelistInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SafelistInstance + * + * @return SafelistInstance Fetched SafelistInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SafelistInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.SafelistInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/SafelistList.php b/app/api/Twilio/Rest/Verify/V2/SafelistList.php new file mode 100755 index 0000000..1170db3 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/SafelistList.php @@ -0,0 +1,93 @@ +solution = [ + ]; + + $this->uri = '/SafeList/Numbers'; + } + + /** + * Create the SafelistInstance + * + * @param string $phoneNumber The phone number to be added in SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + * @return SafelistInstance Created SafelistInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $phoneNumber): SafelistInstance + { + + $data = Values::of([ + 'PhoneNumber' => + $phoneNumber, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SafelistInstance( + $this->version, + $payload + ); + } + + + /** + * Constructs a SafelistContext + * + * @param string $phoneNumber The phone number to be removed from SafeList. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + */ + public function getContext( + string $phoneNumber + + ): SafelistContext + { + return new SafelistContext( + $this->version, + $phoneNumber + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.SafelistList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/SafelistPage.php b/app/api/Twilio/Rest/Verify/V2/SafelistPage.php new file mode 100755 index 0000000..a9975cb --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/SafelistPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SafelistInstance \Twilio\Rest\Verify\V2\SafelistInstance + */ + public function buildInstance(array $payload): SafelistInstance + { + return new SafelistInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.SafelistPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenContext.php b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenContext.php new file mode 100755 index 0000000..be1c6da --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenContext.php @@ -0,0 +1,87 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/AccessTokens/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the AccessTokenInstance + * + * @return AccessTokenInstance Fetched AccessTokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccessTokenInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new AccessTokenInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.AccessTokenContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenInstance.php new file mode 100755 index 0000000..0227b73 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'entityIdentity' => Values::array_get($payload, 'entity_identity'), + 'factorType' => Values::array_get($payload, 'factor_type'), + 'factorFriendlyName' => Values::array_get($payload, 'factor_friendly_name'), + 'token' => Values::array_get($payload, 'token'), + 'url' => Values::array_get($payload, 'url'), + 'ttl' => Values::array_get($payload, 'ttl'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AccessTokenContext Context for this AccessTokenInstance + */ + protected function proxy(): AccessTokenContext + { + if (!$this->context) { + $this->context = new AccessTokenContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the AccessTokenInstance + * + * @return AccessTokenInstance Fetched AccessTokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): AccessTokenInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.AccessTokenInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenList.php b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenList.php new file mode 100755 index 0000000..5ee91b0 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenList.php @@ -0,0 +1,112 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/AccessTokens'; + } + + /** + * Create the AccessTokenInstance + * + * @param string $identity The unique external identifier for the Entity of the Service. This identifier should be immutable, not PII, and generated by your external system, such as your user's UUID, GUID, or SID. + * @param string $factorType + * @param array|Options $options Optional Arguments + * @return AccessTokenInstance Created AccessTokenInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity, string $factorType, array $options = []): AccessTokenInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Identity' => + $identity, + 'FactorType' => + $factorType, + 'FactorFriendlyName' => + $options['factorFriendlyName'], + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new AccessTokenInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Constructs a AccessTokenContext + * + * @param string $sid A 34 character string that uniquely identifies this Access Token. + */ + public function getContext( + string $sid + + ): AccessTokenContext + { + return new AccessTokenContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.AccessTokenList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenOptions.php new file mode 100755 index 0000000..2e068b6 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenOptions.php @@ -0,0 +1,96 @@ +options['factorFriendlyName'] = $factorFriendlyName; + $this->options['ttl'] = $ttl; + } + + /** + * The friendly name of the factor that is going to be created with this access token + * + * @param string $factorFriendlyName The friendly name of the factor that is going to be created with this access token + * @return $this Fluent Builder + */ + public function setFactorFriendlyName(string $factorFriendlyName): self + { + $this->options['factorFriendlyName'] = $factorFriendlyName; + return $this; + } + + /** + * How long, in seconds, the access token is valid. Can be an integer between 60 and 300. Default is 60. + * + * @param int $ttl How long, in seconds, the access token is valid. Can be an integer between 60 and 300. Default is 60. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateAccessTokenOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenPage.php b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenPage.php new file mode 100755 index 0000000..ee61695 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/AccessTokenPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AccessTokenInstance \Twilio\Rest\Verify\V2\Service\AccessTokenInstance + */ + public function buildInstance(array $payload): AccessTokenInstance + { + return new AccessTokenInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.AccessTokenPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationInstance.php new file mode 100755 index 0000000..9d51017 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationInstance.php @@ -0,0 +1,100 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'entitySid' => Values::array_get($payload, 'entity_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'challengeSid' => Values::array_get($payload, 'challenge_sid'), + 'priority' => Values::array_get($payload, 'priority'), + 'ttl' => Values::array_get($payload, 'ttl'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'identity' => $identity, 'challengeSid' => $challengeSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NotificationInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationList.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationList.php new file mode 100755 index 0000000..17f5ef8 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationList.php @@ -0,0 +1,101 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'identity' => + $identity, + + 'challengeSid' => + $challengeSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Challenges/' . \rawurlencode($challengeSid) + .'/Notifications'; + } + + /** + * Create the NotificationInstance + * + * @param array|Options $options Optional Arguments + * @return NotificationInstance Created NotificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): NotificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Ttl' => + $options['ttl'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NotificationInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['challengeSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NotificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationOptions.php new file mode 100755 index 0000000..5e8bbeb --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationOptions.php @@ -0,0 +1,76 @@ +options['ttl'] = $ttl; + } + + /** + * How long, in seconds, the notification is valid. Can be an integer between 0 and 300. Default is 300. Delivery is attempted until the TTL elapses, even if the device is offline. 0 means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. + * + * @param int $ttl How long, in seconds, the notification is valid. Can be an integer between 0 and 300. Default is 300. Delivery is attempted until the TTL elapses, even if the device is offline. 0 means that the notification delivery is attempted immediately, only once, and is not stored for future delivery. + * @return $this Fluent Builder + */ + public function setTtl(int $ttl): self + { + $this->options['ttl'] = $ttl; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateNotificationOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationPage.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationPage.php new file mode 100755 index 0000000..8d32dd6 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/Challenge/NotificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NotificationInstance \Twilio\Rest\Verify\V2\Service\Entity\Challenge\NotificationInstance + */ + public function buildInstance(array $payload): NotificationInstance + { + return new NotificationInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['identity'], $this->solution['challengeSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NotificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeContext.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeContext.php new file mode 100755 index 0000000..e225ec3 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeContext.php @@ -0,0 +1,186 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'identity' => + $identity, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Challenges/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ChallengeInstance + * + * @return ChallengeInstance Fetched ChallengeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChallengeInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ChallengeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + + /** + * Update the ChallengeInstance + * + * @param array|Options $options Optional Arguments + * @return ChallengeInstance Updated ChallengeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChallengeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AuthPayload' => + $options['authPayload'], + 'Metadata' => + Serialize::jsonObject($options['metadata']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ChallengeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + if (!$this->_notifications) { + $this->_notifications = new NotificationList( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + return $this->_notifications; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.ChallengeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeInstance.php new file mode 100755 index 0000000..4179981 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeInstance.php @@ -0,0 +1,179 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'entitySid' => Values::array_get($payload, 'entity_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'factorSid' => Values::array_get($payload, 'factor_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'dateResponded' => Deserialize::dateTime(Values::array_get($payload, 'date_responded')), + 'expirationDate' => Deserialize::dateTime(Values::array_get($payload, 'expiration_date')), + 'status' => Values::array_get($payload, 'status'), + 'respondedReason' => Values::array_get($payload, 'responded_reason'), + 'details' => Values::array_get($payload, 'details'), + 'hiddenDetails' => Values::array_get($payload, 'hidden_details'), + 'metadata' => Values::array_get($payload, 'metadata'), + 'factorType' => Values::array_get($payload, 'factor_type'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'identity' => $identity, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ChallengeContext Context for this ChallengeInstance + */ + protected function proxy(): ChallengeContext + { + if (!$this->context) { + $this->context = new ChallengeContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ChallengeInstance + * + * @return ChallengeInstance Fetched ChallengeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ChallengeInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ChallengeInstance + * + * @param array|Options $options Optional Arguments + * @return ChallengeInstance Updated ChallengeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ChallengeInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the notifications + */ + protected function getNotifications(): NotificationList + { + return $this->proxy()->notifications; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.ChallengeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeList.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeList.php new file mode 100755 index 0000000..d9ca0bf --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeList.php @@ -0,0 +1,227 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'identity' => + $identity, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Challenges'; + } + + /** + * Create the ChallengeInstance + * + * @param string $factorSid The unique SID identifier of the Factor. + * @param array|Options $options Optional Arguments + * @return ChallengeInstance Created ChallengeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $factorSid, array $options = []): ChallengeInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FactorSid' => + $factorSid, + 'ExpirationDate' => + Serialize::iso8601DateTime($options['expirationDate']), + 'Details.Message' => + $options['detailsMessage'], + 'Details.Fields' => + Serialize::map($options['detailsFields'], function ($e) { return Serialize::jsonObject($e); }), + 'HiddenDetails' => + Serialize::jsonObject($options['hiddenDetails']), + 'AuthPayload' => + $options['authPayload'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ChallengeInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + + /** + * Reads ChallengeInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ChallengeInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ChallengeInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ChallengeInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ChallengePage Page of ChallengeInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ChallengePage + { + $options = new Values($options); + + $params = Values::of([ + 'FactorSid' => + $options['factorSid'], + 'Status' => + $options['status'], + 'Order' => + $options['order'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ChallengePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ChallengeInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ChallengePage Page of ChallengeInstance + */ + public function getPage(string $targetUrl): ChallengePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ChallengePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ChallengeContext + * + * @param string $sid A 34 character string that uniquely identifies this Challenge. + */ + public function getContext( + string $sid + + ): ChallengeContext + { + return new ChallengeContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.ChallengeList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeOptions.php new file mode 100755 index 0000000..00784bc --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengeOptions.php @@ -0,0 +1,308 @@ +options['expirationDate'] = $expirationDate; + $this->options['detailsMessage'] = $detailsMessage; + $this->options['detailsFields'] = $detailsFields; + $this->options['hiddenDetails'] = $hiddenDetails; + $this->options['authPayload'] = $authPayload; + } + + /** + * The date-time when this Challenge expires, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. The default value is five (5) minutes after Challenge creation. The max value is sixty (60) minutes after creation. + * + * @param \DateTime $expirationDate The date-time when this Challenge expires, given in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. The default value is five (5) minutes after Challenge creation. The max value is sixty (60) minutes after creation. + * @return $this Fluent Builder + */ + public function setExpirationDate(\DateTime $expirationDate): self + { + $this->options['expirationDate'] = $expirationDate; + return $this; + } + + /** + * Shown to the user when the push notification arrives. Required when `factor_type` is `push`. Can be up to 256 characters in length + * + * @param string $detailsMessage Shown to the user when the push notification arrives. Required when `factor_type` is `push`. Can be up to 256 characters in length + * @return $this Fluent Builder + */ + public function setDetailsMessage(string $detailsMessage): self + { + $this->options['detailsMessage'] = $detailsMessage; + return $this; + } + + /** + * A list of objects that describe the Fields included in the Challenge. Each object contains the label and value of the field, the label can be up to 36 characters in length and the value can be up to 128 characters in length. Used when `factor_type` is `push`. There can be up to 20 details fields. + * + * @param array[] $detailsFields A list of objects that describe the Fields included in the Challenge. Each object contains the label and value of the field, the label can be up to 36 characters in length and the value can be up to 128 characters in length. Used when `factor_type` is `push`. There can be up to 20 details fields. + * @return $this Fluent Builder + */ + public function setDetailsFields(array $detailsFields): self + { + $this->options['detailsFields'] = $detailsFields; + return $this; + } + + /** + * Details provided to give context about the Challenge. Not shown to the end user. It must be a stringified JSON with only strings values eg. `{\\\"ip\\\": \\\"172.168.1.234\\\"}`. Can be up to 1024 characters in length + * + * @param array $hiddenDetails Details provided to give context about the Challenge. Not shown to the end user. It must be a stringified JSON with only strings values eg. `{\\\"ip\\\": \\\"172.168.1.234\\\"}`. Can be up to 1024 characters in length + * @return $this Fluent Builder + */ + public function setHiddenDetails(array $hiddenDetails): self + { + $this->options['hiddenDetails'] = $hiddenDetails; + return $this; + } + + /** + * Optional payload used to verify the Challenge upon creation. Only used with a Factor of type `totp` to carry the TOTP code that needs to be verified. For `TOTP` this value must be between 3 and 8 characters long. + * + * @param string $authPayload Optional payload used to verify the Challenge upon creation. Only used with a Factor of type `totp` to carry the TOTP code that needs to be verified. For `TOTP` this value must be between 3 and 8 characters long. + * @return $this Fluent Builder + */ + public function setAuthPayload(string $authPayload): self + { + $this->options['authPayload'] = $authPayload; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateChallengeOptions ' . $options . ']'; + } +} + + +class ReadChallengeOptions extends Options + { + /** + * @param string $factorSid The unique SID identifier of the Factor. + * @param string $status The Status of the Challenges to fetch. One of `pending`, `expired`, `approved` or `denied`. + * @param string $order The desired sort order of the Challenges list. One of `asc` or `desc` for ascending and descending respectively. Defaults to `asc`. + */ + public function __construct( + + string $factorSid = Values::NONE, + string $status = Values::NONE, + string $order = Values::NONE + + ) { + $this->options['factorSid'] = $factorSid; + $this->options['status'] = $status; + $this->options['order'] = $order; + } + + /** + * The unique SID identifier of the Factor. + * + * @param string $factorSid The unique SID identifier of the Factor. + * @return $this Fluent Builder + */ + public function setFactorSid(string $factorSid): self + { + $this->options['factorSid'] = $factorSid; + return $this; + } + + /** + * The Status of the Challenges to fetch. One of `pending`, `expired`, `approved` or `denied`. + * + * @param string $status The Status of the Challenges to fetch. One of `pending`, `expired`, `approved` or `denied`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The desired sort order of the Challenges list. One of `asc` or `desc` for ascending and descending respectively. Defaults to `asc`. + * + * @param string $order The desired sort order of the Challenges list. One of `asc` or `desc` for ascending and descending respectively. Defaults to `asc`. + * @return $this Fluent Builder + */ + public function setOrder(string $order): self + { + $this->options['order'] = $order; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.ReadChallengeOptions ' . $options . ']'; + } +} + +class UpdateChallengeOptions extends Options + { + /** + * @param string $authPayload The optional payload needed to verify the Challenge. E.g., a TOTP would use the numeric code. For `TOTP` this value must be between 3 and 8 characters long. For `Push` this value can be up to 5456 characters in length + * @param array $metadata Custom metadata associated with the challenge. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length. + */ + public function __construct( + + string $authPayload = Values::NONE, + array $metadata = Values::ARRAY_NONE + + ) { + $this->options['authPayload'] = $authPayload; + $this->options['metadata'] = $metadata; + } + + /** + * The optional payload needed to verify the Challenge. E.g., a TOTP would use the numeric code. For `TOTP` this value must be between 3 and 8 characters long. For `Push` this value can be up to 5456 characters in length + * + * @param string $authPayload The optional payload needed to verify the Challenge. E.g., a TOTP would use the numeric code. For `TOTP` this value must be between 3 and 8 characters long. For `Push` this value can be up to 5456 characters in length + * @return $this Fluent Builder + */ + public function setAuthPayload(string $authPayload): self + { + $this->options['authPayload'] = $authPayload; + return $this; + } + + /** + * Custom metadata associated with the challenge. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length. + * + * @param array $metadata Custom metadata associated with the challenge. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length. + * @return $this Fluent Builder + */ + public function setMetadata(array $metadata): self + { + $this->options['metadata'] = $metadata; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateChallengeOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengePage.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengePage.php new file mode 100755 index 0000000..bad3ff5 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/ChallengePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ChallengeInstance \Twilio\Rest\Verify\V2\Service\Entity\ChallengeInstance + */ + public function buildInstance(array $payload): ChallengeInstance + { + return new ChallengeInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['identity']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.ChallengePage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorContext.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorContext.php new file mode 100755 index 0000000..e4369af --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorContext.php @@ -0,0 +1,153 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'identity' => + $identity, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Factors/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the FactorInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the FactorInstance + * + * @return FactorInstance Fetched FactorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FactorInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new FactorInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + + /** + * Update the FactorInstance + * + * @param array|Options $options Optional Arguments + * @return FactorInstance Updated FactorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FactorInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'AuthPayload' => + $options['authPayload'], + 'FriendlyName' => + $options['friendlyName'], + 'Config.NotificationToken' => + $options['configNotificationToken'], + 'Config.SdkVersion' => + $options['configSdkVersion'], + 'Config.TimeStep' => + $options['configTimeStep'], + 'Config.Skew' => + $options['configSkew'], + 'Config.CodeLength' => + $options['configCodeLength'], + 'Config.Alg' => + $options['configAlg'], + 'Config.NotificationPlatform' => + $options['configNotificationPlatform'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new FactorInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.FactorContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorInstance.php new file mode 100755 index 0000000..d6299f2 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorInstance.php @@ -0,0 +1,170 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'entitySid' => Values::array_get($payload, 'entity_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'factorType' => Values::array_get($payload, 'factor_type'), + 'config' => Values::array_get($payload, 'config'), + 'metadata' => Values::array_get($payload, 'metadata'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'identity' => $identity, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return FactorContext Context for this FactorInstance + */ + protected function proxy(): FactorContext + { + if (!$this->context) { + $this->context = new FactorContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the FactorInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the FactorInstance + * + * @return FactorInstance Fetched FactorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): FactorInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the FactorInstance + * + * @param array|Options $options Optional Arguments + * @return FactorInstance Updated FactorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): FactorInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.FactorInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorList.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorList.php new file mode 100755 index 0000000..dc48117 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorList.php @@ -0,0 +1,175 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'identity' => + $identity, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Factors'; + } + + /** + * Reads FactorInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return FactorInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams FactorInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of FactorInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return FactorPage Page of FactorInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): FactorPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new FactorPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of FactorInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return FactorPage Page of FactorInstance + */ + public function getPage(string $targetUrl): FactorPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new FactorPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a FactorContext + * + * @param string $sid A 34 character string that uniquely identifies this Factor. + */ + public function getContext( + string $sid + + ): FactorContext + { + return new FactorContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.FactorList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorOptions.php new file mode 100755 index 0000000..2939bb6 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorOptions.php @@ -0,0 +1,224 @@ +options['authPayload'] = $authPayload; + $this->options['friendlyName'] = $friendlyName; + $this->options['configNotificationToken'] = $configNotificationToken; + $this->options['configSdkVersion'] = $configSdkVersion; + $this->options['configTimeStep'] = $configTimeStep; + $this->options['configSkew'] = $configSkew; + $this->options['configCodeLength'] = $configCodeLength; + $this->options['configAlg'] = $configAlg; + $this->options['configNotificationPlatform'] = $configNotificationPlatform; + } + + /** + * The optional payload needed to verify the Factor for the first time. E.g. for a TOTP, the numeric code. + * + * @param string $authPayload The optional payload needed to verify the Factor for the first time. E.g. for a TOTP, the numeric code. + * @return $this Fluent Builder + */ + public function setAuthPayload(string $authPayload): self + { + $this->options['authPayload'] = $authPayload; + return $this; + } + + /** + * The new friendly name of this Factor. It can be up to 64 characters. + * + * @param string $friendlyName The new friendly name of this Factor. It can be up to 64 characters. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * For APN, the device token. For FCM, the registration token. It is used to send the push notifications. Required when `factor_type` is `push`. If specified, this value must be between 32 and 255 characters long. + * + * @param string $configNotificationToken For APN, the device token. For FCM, the registration token. It is used to send the push notifications. Required when `factor_type` is `push`. If specified, this value must be between 32 and 255 characters long. + * @return $this Fluent Builder + */ + public function setConfigNotificationToken(string $configNotificationToken): self + { + $this->options['configNotificationToken'] = $configNotificationToken; + return $this; + } + + /** + * The Verify Push SDK version used to configure the factor + * + * @param string $configSdkVersion The Verify Push SDK version used to configure the factor + * @return $this Fluent Builder + */ + public function setConfigSdkVersion(string $configSdkVersion): self + { + $this->options['configSdkVersion'] = $configSdkVersion; + return $this; + } + + /** + * Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive + * + * @param int $configTimeStep Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive + * @return $this Fluent Builder + */ + public function setConfigTimeStep(int $configTimeStep): self + { + $this->options['configTimeStep'] = $configTimeStep; + return $this; + } + + /** + * The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive + * + * @param int $configSkew The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive + * @return $this Fluent Builder + */ + public function setConfigSkew(int $configSkew): self + { + $this->options['configSkew'] = $configSkew; + return $this; + } + + /** + * Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive + * + * @param int $configCodeLength Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive + * @return $this Fluent Builder + */ + public function setConfigCodeLength(int $configCodeLength): self + { + $this->options['configCodeLength'] = $configCodeLength; + return $this; + } + + /** + * @param string $configAlg + * @return $this Fluent Builder + */ + public function setConfigAlg(string $configAlg): self + { + $this->options['configAlg'] = $configAlg; + return $this; + } + + /** + * The transport technology used to generate the Notification Token. Can be `apn`, `fcm` or `none`. Required when `factor_type` is `push`. + * + * @param string $configNotificationPlatform The transport technology used to generate the Notification Token. Can be `apn`, `fcm` or `none`. Required when `factor_type` is `push`. + * @return $this Fluent Builder + */ + public function setConfigNotificationPlatform(string $configNotificationPlatform): self + { + $this->options['configNotificationPlatform'] = $configNotificationPlatform; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateFactorOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorPage.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorPage.php new file mode 100755 index 0000000..571a6d5 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/FactorPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return FactorInstance \Twilio\Rest\Verify\V2\Service\Entity\FactorInstance + */ + public function buildInstance(array $payload): FactorInstance + { + return new FactorInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['identity']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.FactorPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorInstance.php new file mode 100755 index 0000000..fa49805 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorInstance.php @@ -0,0 +1,109 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'entitySid' => Values::array_get($payload, 'entity_sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'binding' => Values::array_get($payload, 'binding'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'status' => Values::array_get($payload, 'status'), + 'factorType' => Values::array_get($payload, 'factor_type'), + 'config' => Values::array_get($payload, 'config'), + 'metadata' => Values::array_get($payload, 'metadata'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'identity' => $identity, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NewFactorInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorList.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorList.php new file mode 100755 index 0000000..b330b22 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorList.php @@ -0,0 +1,123 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'identity' => + $identity, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .'/Factors'; + } + + /** + * Create the NewFactorInstance + * + * @param string $friendlyName The friendly name of this Factor. This can be any string up to 64 characters, meant for humans to distinguish between Factors. For `factor_type` `push`, this could be a device name. For `factor_type` `totp`, this value is used as the “account name” in constructing the `binding.uri` property. At the same time, we recommend avoiding providing PII. + * @param string $factorType + * @param array|Options $options Optional Arguments + * @return NewFactorInstance Created NewFactorInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, string $factorType, array $options = []): NewFactorInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'FactorType' => + $factorType, + 'Binding.Alg' => + $options['bindingAlg'], + 'Binding.PublicKey' => + $options['bindingPublicKey'], + 'Config.AppId' => + $options['configAppId'], + 'Config.NotificationPlatform' => + $options['configNotificationPlatform'], + 'Config.NotificationToken' => + $options['configNotificationToken'], + 'Config.SdkVersion' => + $options['configSdkVersion'], + 'Binding.Secret' => + $options['bindingSecret'], + 'Config.TimeStep' => + $options['configTimeStep'], + 'Config.Skew' => + $options['configSkew'], + 'Config.CodeLength' => + $options['configCodeLength'], + 'Config.Alg' => + $options['configAlg'], + 'Metadata' => + Serialize::jsonObject($options['metadata']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new NewFactorInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NewFactorList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorOptions.php new file mode 100755 index 0000000..b58b18d --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorOptions.php @@ -0,0 +1,270 @@ +options['bindingAlg'] = $bindingAlg; + $this->options['bindingPublicKey'] = $bindingPublicKey; + $this->options['configAppId'] = $configAppId; + $this->options['configNotificationPlatform'] = $configNotificationPlatform; + $this->options['configNotificationToken'] = $configNotificationToken; + $this->options['configSdkVersion'] = $configSdkVersion; + $this->options['bindingSecret'] = $bindingSecret; + $this->options['configTimeStep'] = $configTimeStep; + $this->options['configSkew'] = $configSkew; + $this->options['configCodeLength'] = $configCodeLength; + $this->options['configAlg'] = $configAlg; + $this->options['metadata'] = $metadata; + } + + /** + * The algorithm used when `factor_type` is `push`. Algorithm supported: `ES256` + * + * @param string $bindingAlg The algorithm used when `factor_type` is `push`. Algorithm supported: `ES256` + * @return $this Fluent Builder + */ + public function setBindingAlg(string $bindingAlg): self + { + $this->options['bindingAlg'] = $bindingAlg; + return $this; + } + + /** + * The Ecdsa public key in PKIX, ASN.1 DER format encoded in Base64. Required when `factor_type` is `push` + * + * @param string $bindingPublicKey The Ecdsa public key in PKIX, ASN.1 DER format encoded in Base64. Required when `factor_type` is `push` + * @return $this Fluent Builder + */ + public function setBindingPublicKey(string $bindingPublicKey): self + { + $this->options['bindingPublicKey'] = $bindingPublicKey; + return $this; + } + + /** + * The ID that uniquely identifies your app in the Google or Apple store, such as `com.example.myapp`. It can be up to 100 characters long. Required when `factor_type` is `push`. + * + * @param string $configAppId The ID that uniquely identifies your app in the Google or Apple store, such as `com.example.myapp`. It can be up to 100 characters long. Required when `factor_type` is `push`. + * @return $this Fluent Builder + */ + public function setConfigAppId(string $configAppId): self + { + $this->options['configAppId'] = $configAppId; + return $this; + } + + /** + * @param string $configNotificationPlatform + * @return $this Fluent Builder + */ + public function setConfigNotificationPlatform(string $configNotificationPlatform): self + { + $this->options['configNotificationPlatform'] = $configNotificationPlatform; + return $this; + } + + /** + * For APN, the device token. For FCM, the registration token. It is used to send the push notifications. Must be between 32 and 255 characters long. Required when `factor_type` is `push`. + * + * @param string $configNotificationToken For APN, the device token. For FCM, the registration token. It is used to send the push notifications. Must be between 32 and 255 characters long. Required when `factor_type` is `push`. + * @return $this Fluent Builder + */ + public function setConfigNotificationToken(string $configNotificationToken): self + { + $this->options['configNotificationToken'] = $configNotificationToken; + return $this; + } + + /** + * The Verify Push SDK version used to configure the factor Required when `factor_type` is `push` + * + * @param string $configSdkVersion The Verify Push SDK version used to configure the factor Required when `factor_type` is `push` + * @return $this Fluent Builder + */ + public function setConfigSdkVersion(string $configSdkVersion): self + { + $this->options['configSdkVersion'] = $configSdkVersion; + return $this; + } + + /** + * The shared secret for TOTP factors encoded in Base32. This can be provided when creating the Factor, otherwise it will be generated. Used when `factor_type` is `totp` + * + * @param string $bindingSecret The shared secret for TOTP factors encoded in Base32. This can be provided when creating the Factor, otherwise it will be generated. Used when `factor_type` is `totp` + * @return $this Fluent Builder + */ + public function setBindingSecret(string $bindingSecret): self + { + $this->options['bindingSecret'] = $bindingSecret; + return $this; + } + + /** + * Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. The default value is defined at the service level in the property `totp.time_step`. Defaults to 30 seconds if not configured. Used when `factor_type` is `totp` + * + * @param int $configTimeStep Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. The default value is defined at the service level in the property `totp.time_step`. Defaults to 30 seconds if not configured. Used when `factor_type` is `totp` + * @return $this Fluent Builder + */ + public function setConfigTimeStep(int $configTimeStep): self + { + $this->options['configTimeStep'] = $configTimeStep; + return $this; + } + + /** + * The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. The default value is defined at the service level in the property `totp.skew`. If not configured defaults to 1. Used when `factor_type` is `totp` + * + * @param int $configSkew The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. The default value is defined at the service level in the property `totp.skew`. If not configured defaults to 1. Used when `factor_type` is `totp` + * @return $this Fluent Builder + */ + public function setConfigSkew(int $configSkew): self + { + $this->options['configSkew'] = $configSkew; + return $this; + } + + /** + * Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. The default value is defined at the service level in the property `totp.code_length`. If not configured defaults to 6. Used when `factor_type` is `totp` + * + * @param int $configCodeLength Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. The default value is defined at the service level in the property `totp.code_length`. If not configured defaults to 6. Used when `factor_type` is `totp` + * @return $this Fluent Builder + */ + public function setConfigCodeLength(int $configCodeLength): self + { + $this->options['configCodeLength'] = $configCodeLength; + return $this; + } + + /** + * @param string $configAlg + * @return $this Fluent Builder + */ + public function setConfigAlg(string $configAlg): self + { + $this->options['configAlg'] = $configAlg; + return $this; + } + + /** + * Custom metadata associated with the factor. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length. + * + * @param array $metadata Custom metadata associated with the factor. This is added by the Device/SDK directly to allow for the inclusion of device information. It must be a stringified JSON with only strings values eg. `{\\\"os\\\": \\\"Android\\\"}`. Can be up to 1024 characters in length. + * @return $this Fluent Builder + */ + public function setMetadata(array $metadata): self + { + $this->options['metadata'] = $metadata; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateNewFactorOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorPage.php b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorPage.php new file mode 100755 index 0000000..00b1aec --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/Entity/NewFactorPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return NewFactorInstance \Twilio\Rest\Verify\V2\Service\Entity\NewFactorInstance + */ + public function buildInstance(array $payload): NewFactorInstance + { + return new NewFactorInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['identity']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.NewFactorPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/EntityContext.php b/app/api/Twilio/Rest/Verify/V2/Service/EntityContext.php new file mode 100755 index 0000000..fc2badd --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/EntityContext.php @@ -0,0 +1,198 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'identity' => + $identity, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities/' . \rawurlencode($identity) + .''; + } + + /** + * Delete the EntityInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the EntityInstance + * + * @return EntityInstance Fetched EntityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EntityInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new EntityInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + + /** + * Access the factors + */ + protected function getFactors(): FactorList + { + if (!$this->_factors) { + $this->_factors = new FactorList( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + return $this->_factors; + } + + /** + * Access the newFactors + */ + protected function getNewFactors(): NewFactorList + { + if (!$this->_newFactors) { + $this->_newFactors = new NewFactorList( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + return $this->_newFactors; + } + + /** + * Access the challenges + */ + protected function getChallenges(): ChallengeList + { + if (!$this->_challenges) { + $this->_challenges = new ChallengeList( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + return $this->_challenges; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.EntityContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/EntityInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/EntityInstance.php new file mode 100755 index 0000000..6af2d4d --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/EntityInstance.php @@ -0,0 +1,175 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'identity' => Values::array_get($payload, 'identity'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'identity' => $identity ?: $this->properties['identity'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return EntityContext Context for this EntityInstance + */ + protected function proxy(): EntityContext + { + if (!$this->context) { + $this->context = new EntityContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['identity'] + ); + } + + return $this->context; + } + + /** + * Delete the EntityInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the EntityInstance + * + * @return EntityInstance Fetched EntityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): EntityInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the factors + */ + protected function getFactors(): FactorList + { + return $this->proxy()->factors; + } + + /** + * Access the newFactors + */ + protected function getNewFactors(): NewFactorList + { + return $this->proxy()->newFactors; + } + + /** + * Access the challenges + */ + protected function getChallenges(): ChallengeList + { + return $this->proxy()->challenges; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.EntityInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/EntityList.php b/app/api/Twilio/Rest/Verify/V2/Service/EntityList.php new file mode 100755 index 0000000..28a10d6 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/EntityList.php @@ -0,0 +1,194 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Entities'; + } + + /** + * Create the EntityInstance + * + * @param string $identity The unique external identifier for the Entity of the Service. This identifier should be immutable, not PII, length between 8 and 64 characters, and generated by your external system, such as your user's UUID, GUID, or SID. It can only contain dash (-) separated alphanumeric characters. + * @return EntityInstance Created EntityInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $identity): EntityInstance + { + + $data = Values::of([ + 'Identity' => + $identity, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new EntityInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads EntityInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return EntityInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams EntityInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of EntityInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return EntityPage Page of EntityInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): EntityPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new EntityPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of EntityInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return EntityPage Page of EntityInstance + */ + public function getPage(string $targetUrl): EntityPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new EntityPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a EntityContext + * + * @param string $identity The unique external identifier for the Entity of the Service. This identifier should be immutable, not PII, length between 8 and 64 characters, and generated by your external system, such as your user's UUID, GUID, or SID. It can only contain dash (-) separated alphanumeric characters. + */ + public function getContext( + string $identity + + ): EntityContext + { + return new EntityContext( + $this->version, + $this->solution['serviceSid'], + $identity + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.EntityList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/EntityPage.php b/app/api/Twilio/Rest/Verify/V2/Service/EntityPage.php new file mode 100755 index 0000000..6430586 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/EntityPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return EntityInstance \Twilio\Rest\Verify\V2\Service\EntityInstance + */ + public function buildInstance(array $payload): EntityInstance + { + return new EntityInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.EntityPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationContext.php b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationContext.php new file mode 100755 index 0000000..ca1f73e --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationContext.php @@ -0,0 +1,127 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'country' => + $country, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/MessagingConfigurations/' . \rawurlencode($country) + .''; + } + + /** + * Delete the MessagingConfigurationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the MessagingConfigurationInstance + * + * @return MessagingConfigurationInstance Fetched MessagingConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessagingConfigurationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new MessagingConfigurationInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['country'] + ); + } + + + /** + * Update the MessagingConfigurationInstance + * + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) to be used to send SMS to the country of this configuration. + * @return MessagingConfigurationInstance Updated MessagingConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $messagingServiceSid): MessagingConfigurationInstance + { + + $data = Values::of([ + 'MessagingServiceSid' => + $messagingServiceSid, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new MessagingConfigurationInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['country'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.MessagingConfigurationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationInstance.php new file mode 100755 index 0000000..8530a46 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationInstance.php @@ -0,0 +1,155 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'country' => Values::array_get($payload, 'country'), + 'messagingServiceSid' => Values::array_get($payload, 'messaging_service_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'country' => $country ?: $this->properties['country'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return MessagingConfigurationContext Context for this MessagingConfigurationInstance + */ + protected function proxy(): MessagingConfigurationContext + { + if (!$this->context) { + $this->context = new MessagingConfigurationContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['country'] + ); + } + + return $this->context; + } + + /** + * Delete the MessagingConfigurationInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the MessagingConfigurationInstance + * + * @return MessagingConfigurationInstance Fetched MessagingConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): MessagingConfigurationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the MessagingConfigurationInstance + * + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) to be used to send SMS to the country of this configuration. + * @return MessagingConfigurationInstance Updated MessagingConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $messagingServiceSid): MessagingConfigurationInstance + { + + return $this->proxy()->update($messagingServiceSid); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.MessagingConfigurationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationList.php b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationList.php new file mode 100755 index 0000000..7d34284 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationList.php @@ -0,0 +1,197 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/MessagingConfigurations'; + } + + /** + * Create the MessagingConfigurationInstance + * + * @param string $country The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country this configuration will be applied to. If this is a global configuration, Country will take the value `all`. + * @param string $messagingServiceSid The SID of the [Messaging Service](https://www.twilio.com/docs/sms/services/api) to be used to send SMS to the country of this configuration. + * @return MessagingConfigurationInstance Created MessagingConfigurationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $country, string $messagingServiceSid): MessagingConfigurationInstance + { + + $data = Values::of([ + 'Country' => + $country, + 'MessagingServiceSid' => + $messagingServiceSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new MessagingConfigurationInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads MessagingConfigurationInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return MessagingConfigurationInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams MessagingConfigurationInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of MessagingConfigurationInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return MessagingConfigurationPage Page of MessagingConfigurationInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): MessagingConfigurationPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new MessagingConfigurationPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of MessagingConfigurationInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return MessagingConfigurationPage Page of MessagingConfigurationInstance + */ + public function getPage(string $targetUrl): MessagingConfigurationPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new MessagingConfigurationPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a MessagingConfigurationContext + * + * @param string $country The [ISO-3166-1](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code of the country this configuration will be applied to. If this is a global configuration, Country will take the value `all`. + */ + public function getContext( + string $country + + ): MessagingConfigurationContext + { + return new MessagingConfigurationContext( + $this->version, + $this->solution['serviceSid'], + $country + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.MessagingConfigurationList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationPage.php b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationPage.php new file mode 100755 index 0000000..010a04d --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/MessagingConfigurationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return MessagingConfigurationInstance \Twilio\Rest\Verify\V2\Service\MessagingConfigurationInstance + */ + public function buildInstance(array $payload): MessagingConfigurationInstance + { + return new MessagingConfigurationInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.MessagingConfigurationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketContext.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketContext.php new file mode 100755 index 0000000..ba6eb41 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'rateLimitSid' => + $rateLimitSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/RateLimits/' . \rawurlencode($rateLimitSid) + .'/Buckets/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the BucketInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the BucketInstance + * + * @return BucketInstance Fetched BucketInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BucketInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new BucketInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['rateLimitSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the BucketInstance + * + * @param array|Options $options Optional Arguments + * @return BucketInstance Updated BucketInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): BucketInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Max' => + $options['max'], + 'Interval' => + $options['interval'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new BucketInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['rateLimitSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.BucketContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketInstance.php new file mode 100755 index 0000000..c5441dd --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'rateLimitSid' => Values::array_get($payload, 'rate_limit_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'max' => Values::array_get($payload, 'max'), + 'interval' => Values::array_get($payload, 'interval'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'rateLimitSid' => $rateLimitSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return BucketContext Context for this BucketInstance + */ + protected function proxy(): BucketContext + { + if (!$this->context) { + $this->context = new BucketContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['rateLimitSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the BucketInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the BucketInstance + * + * @return BucketInstance Fetched BucketInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): BucketInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the BucketInstance + * + * @param array|Options $options Optional Arguments + * @return BucketInstance Updated BucketInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): BucketInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.BucketInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketList.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketList.php new file mode 100755 index 0000000..fa8d51f --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketList.php @@ -0,0 +1,205 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + 'rateLimitSid' => + $rateLimitSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/RateLimits/' . \rawurlencode($rateLimitSid) + .'/Buckets'; + } + + /** + * Create the BucketInstance + * + * @param int $max Maximum number of requests permitted in during the interval. + * @param int $interval Number of seconds that the rate limit will be enforced over. + * @return BucketInstance Created BucketInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(int $max, int $interval): BucketInstance + { + + $data = Values::of([ + 'Max' => + $max, + 'Interval' => + $interval, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BucketInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['rateLimitSid'] + ); + } + + + /** + * Reads BucketInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return BucketInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams BucketInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of BucketInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return BucketPage Page of BucketInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): BucketPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new BucketPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of BucketInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return BucketPage Page of BucketInstance + */ + public function getPage(string $targetUrl): BucketPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new BucketPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a BucketContext + * + * @param string $sid A 34 character string that uniquely identifies this Bucket. + */ + public function getContext( + string $sid + + ): BucketContext + { + return new BucketContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['rateLimitSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.BucketList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketOptions.php new file mode 100755 index 0000000..b2826c1 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketOptions.php @@ -0,0 +1,102 @@ +options['max'] = $max; + $this->options['interval'] = $interval; + } + + /** + * Maximum number of requests permitted in during the interval. + * + * @param int $max Maximum number of requests permitted in during the interval. + * @return $this Fluent Builder + */ + public function setMax(int $max): self + { + $this->options['max'] = $max; + return $this; + } + + /** + * Number of seconds that the rate limit will be enforced over. + * + * @param int $interval Number of seconds that the rate limit will be enforced over. + * @return $this Fluent Builder + */ + public function setInterval(int $interval): self + { + $this->options['interval'] = $interval; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateBucketOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketPage.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketPage.php new file mode 100755 index 0000000..9d760a2 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimit/BucketPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BucketInstance \Twilio\Rest\Verify\V2\Service\RateLimit\BucketInstance + */ + public function buildInstance(array $payload): BucketInstance + { + return new BucketInstance($this->version, $payload, $this->solution['serviceSid'], $this->solution['rateLimitSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.BucketPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimitContext.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitContext.php new file mode 100755 index 0000000..ad9954b --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitContext.php @@ -0,0 +1,189 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/RateLimits/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RateLimitInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RateLimitInstance + * + * @return RateLimitInstance Fetched RateLimitInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RateLimitInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RateLimitInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the RateLimitInstance + * + * @param array|Options $options Optional Arguments + * @return RateLimitInstance Updated RateLimitInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RateLimitInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Description' => + $options['description'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RateLimitInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the buckets + */ + protected function getBuckets(): BucketList + { + if (!$this->_buckets) { + $this->_buckets = new BucketList( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->_buckets; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.RateLimitContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimitInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitInstance.php new file mode 100755 index 0000000..a032814 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'description' => Values::array_get($payload, 'description'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RateLimitContext Context for this RateLimitInstance + */ + protected function proxy(): RateLimitContext + { + if (!$this->context) { + $this->context = new RateLimitContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RateLimitInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RateLimitInstance + * + * @return RateLimitInstance Fetched RateLimitInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RateLimitInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RateLimitInstance + * + * @param array|Options $options Optional Arguments + * @return RateLimitInstance Updated RateLimitInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RateLimitInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the buckets + */ + protected function getBuckets(): BucketList + { + return $this->proxy()->buckets; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.RateLimitInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimitList.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitList.php new file mode 100755 index 0000000..3c89057 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitList.php @@ -0,0 +1,200 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/RateLimits'; + } + + /** + * Create the RateLimitInstance + * + * @param string $uniqueName Provides a unique and addressable name to be assigned to this Rate Limit, assigned by the developer, to be optionally used in addition to SID. **This value should not contain PII.** + * @param array|Options $options Optional Arguments + * @return RateLimitInstance Created RateLimitInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $uniqueName, array $options = []): RateLimitInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $uniqueName, + 'Description' => + $options['description'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RateLimitInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads RateLimitInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RateLimitInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RateLimitInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RateLimitInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RateLimitPage Page of RateLimitInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RateLimitPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RateLimitPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RateLimitInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RateLimitPage Page of RateLimitInstance + */ + public function getPage(string $targetUrl): RateLimitPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RateLimitPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RateLimitContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Rate Limit resource to fetch. + */ + public function getContext( + string $sid + + ): RateLimitContext + { + return new RateLimitContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.RateLimitList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimitOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitOptions.php new file mode 100755 index 0000000..803da54 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitOptions.php @@ -0,0 +1,134 @@ +options['description'] = $description; + } + + /** + * Description of this Rate Limit + * + * @param string $description Description of this Rate Limit + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateRateLimitOptions ' . $options . ']'; + } +} + + + + +class UpdateRateLimitOptions extends Options + { + /** + * @param string $description Description of this Rate Limit + */ + public function __construct( + + string $description = Values::NONE + + ) { + $this->options['description'] = $description; + } + + /** + * Description of this Rate Limit + * + * @param string $description Description of this Rate Limit + * @return $this Fluent Builder + */ + public function setDescription(string $description): self + { + $this->options['description'] = $description; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateRateLimitOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/RateLimitPage.php b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitPage.php new file mode 100755 index 0000000..15e1ab1 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/RateLimitPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RateLimitInstance \Twilio\Rest\Verify\V2\Service\RateLimitInstance + */ + public function buildInstance(array $payload): RateLimitInstance + { + return new RateLimitInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.RateLimitPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckInstance.php new file mode 100755 index 0000000..f3ac0a7 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckInstance.php @@ -0,0 +1,104 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channel' => Values::array_get($payload, 'channel'), + 'status' => Values::array_get($payload, 'status'), + 'valid' => Values::array_get($payload, 'valid'), + 'amount' => Values::array_get($payload, 'amount'), + 'payee' => Values::array_get($payload, 'payee'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'snaAttemptsErrorCodes' => Values::array_get($payload, 'sna_attempts_error_codes'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationCheckInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckList.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckList.php new file mode 100755 index 0000000..eab513e --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckList.php @@ -0,0 +1,95 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/VerificationCheck'; + } + + /** + * Create the VerificationCheckInstance + * + * @param array|Options $options Optional Arguments + * @return VerificationCheckInstance Created VerificationCheckInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): VerificationCheckInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Code' => + $options['code'], + 'To' => + $options['to'], + 'VerificationSid' => + $options['verificationSid'], + 'Amount' => + $options['amount'], + 'Payee' => + $options['payee'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new VerificationCheckInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationCheckList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckOptions.php new file mode 100755 index 0000000..3e2d99b --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckOptions.php @@ -0,0 +1,148 @@ +options['code'] = $code; + $this->options['to'] = $to; + $this->options['verificationSid'] = $verificationSid; + $this->options['amount'] = $amount; + $this->options['payee'] = $payee; + } + + /** + * The 4-10 character string being verified. + * + * @param string $code The 4-10 character string being verified. + * @return $this Fluent Builder + */ + public function setCode(string $code): self + { + $this->options['code'] = $code; + return $this; + } + + /** + * The phone number or [email](https://www.twilio.com/docs/verify/email) to verify. Either this parameter or the `verification_sid` must be specified. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + * + * @param string $to The phone number or [email](https://www.twilio.com/docs/verify/email) to verify. Either this parameter or the `verification_sid` must be specified. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + * @return $this Fluent Builder + */ + public function setTo(string $to): self + { + $this->options['to'] = $to; + return $this; + } + + /** + * A SID that uniquely identifies the Verification Check. Either this parameter or the `to` phone number/[email](https://www.twilio.com/docs/verify/email) must be specified. + * + * @param string $verificationSid A SID that uniquely identifies the Verification Check. Either this parameter or the `to` phone number/[email](https://www.twilio.com/docs/verify/email) must be specified. + * @return $this Fluent Builder + */ + public function setVerificationSid(string $verificationSid): self + { + $this->options['verificationSid'] = $verificationSid; + return $this; + } + + /** + * The amount of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * + * @param string $amount The amount of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @return $this Fluent Builder + */ + public function setAmount(string $amount): self + { + $this->options['amount'] = $amount; + return $this; + } + + /** + * The payee of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * + * @param string $payee The payee of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @return $this Fluent Builder + */ + public function setPayee(string $payee): self + { + $this->options['payee'] = $payee; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateVerificationCheckOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckPage.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckPage.php new file mode 100755 index 0000000..38d6c0d --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationCheckPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VerificationCheckInstance \Twilio\Rest\Verify\V2\Service\VerificationCheckInstance + */ + public function buildInstance(array $payload): VerificationCheckInstance + { + return new VerificationCheckInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationCheckPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationContext.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationContext.php new file mode 100755 index 0000000..df4cd08 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationContext.php @@ -0,0 +1,114 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Verifications/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the VerificationInstance + * + * @return VerificationInstance Fetched VerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VerificationInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new VerificationInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the VerificationInstance + * + * @param string $status + * @return VerificationInstance Updated VerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): VerificationInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new VerificationInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationInstance.php new file mode 100755 index 0000000..5563cc5 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationInstance.php @@ -0,0 +1,159 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'to' => Values::array_get($payload, 'to'), + 'channel' => Values::array_get($payload, 'channel'), + 'status' => Values::array_get($payload, 'status'), + 'valid' => Values::array_get($payload, 'valid'), + 'lookup' => Values::array_get($payload, 'lookup'), + 'amount' => Values::array_get($payload, 'amount'), + 'payee' => Values::array_get($payload, 'payee'), + 'sendCodeAttempts' => Values::array_get($payload, 'send_code_attempts'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sna' => Values::array_get($payload, 'sna'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return VerificationContext Context for this VerificationInstance + */ + protected function proxy(): VerificationContext + { + if (!$this->context) { + $this->context = new VerificationContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the VerificationInstance + * + * @return VerificationInstance Fetched VerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VerificationInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the VerificationInstance + * + * @param string $status + * @return VerificationInstance Updated VerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): VerificationInstance + { + + return $this->proxy()->update($status); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationList.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationList.php new file mode 100755 index 0000000..4d90ee8 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationList.php @@ -0,0 +1,135 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Verifications'; + } + + /** + * Create the VerificationInstance + * + * @param string $to The phone number or [email](https://www.twilio.com/docs/verify/email) to verify. Phone numbers must be in [E.164 format](https://www.twilio.com/docs/glossary/what-e164). + * @param string $channel The verification method to use. One of: [`email`](https://www.twilio.com/docs/verify/email), `sms`, `whatsapp`, `call`, `sna` or `auto`. + * @param array|Options $options Optional Arguments + * @return VerificationInstance Created VerificationInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $to, string $channel, array $options = []): VerificationInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'To' => + $to, + 'Channel' => + $channel, + 'CustomFriendlyName' => + $options['customFriendlyName'], + 'CustomMessage' => + $options['customMessage'], + 'SendDigits' => + $options['sendDigits'], + 'Locale' => + $options['locale'], + 'CustomCode' => + $options['customCode'], + 'Amount' => + $options['amount'], + 'Payee' => + $options['payee'], + 'RateLimits' => + Serialize::jsonObject($options['rateLimits']), + 'ChannelConfiguration' => + Serialize::jsonObject($options['channelConfiguration']), + 'AppHash' => + $options['appHash'], + 'TemplateSid' => + $options['templateSid'], + 'TemplateCustomSubstitutions' => + $options['templateCustomSubstitutions'], + 'DeviceIp' => + $options['deviceIp'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new VerificationInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Constructs a VerificationContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Verification resource to fetch. + */ + public function getContext( + string $sid + + ): VerificationContext + { + return new VerificationContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationOptions.php new file mode 100755 index 0000000..b9575b4 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationOptions.php @@ -0,0 +1,296 @@ + Your AppName verification code is: 1234 He42w354ol9`. + * @param string $templateSid The message [template](https://www.twilio.com/docs/verify/api/templates). If provided, will override the default template for the Service. SMS and Voice channels only. + * @param string $templateCustomSubstitutions A stringified JSON object in which the keys are the template's special variables and the values are the variables substitutions. + * @param string $deviceIp Strongly encouraged if using the auto channel. The IP address of the client's device. If provided, it has to be a valid IPv4 or IPv6 address. + * @return CreateVerificationOptions Options builder + */ + public static function create( + + string $customFriendlyName = Values::NONE, + string $customMessage = Values::NONE, + string $sendDigits = Values::NONE, + string $locale = Values::NONE, + string $customCode = Values::NONE, + string $amount = Values::NONE, + string $payee = Values::NONE, + array $rateLimits = Values::ARRAY_NONE, + array $channelConfiguration = Values::ARRAY_NONE, + string $appHash = Values::NONE, + string $templateSid = Values::NONE, + string $templateCustomSubstitutions = Values::NONE, + string $deviceIp = Values::NONE + + ): CreateVerificationOptions + { + return new CreateVerificationOptions( + $customFriendlyName, + $customMessage, + $sendDigits, + $locale, + $customCode, + $amount, + $payee, + $rateLimits, + $channelConfiguration, + $appHash, + $templateSid, + $templateCustomSubstitutions, + $deviceIp + ); + } + + + +} + +class CreateVerificationOptions extends Options + { + /** + * @param string $customFriendlyName A custom user defined friendly name that overwrites the existing one in the verification message + * @param string $customMessage The text of a custom message to use for the verification. + * @param string $sendDigits The digits to send after a phone call is answered, for example, to dial an extension. For more information, see the Programmable Voice documentation of [sendDigits](https://www.twilio.com/docs/voice/twiml/number#attributes-sendDigits). + * @param string $locale Locale will automatically resolve based on phone number country code for SMS, WhatsApp, and call channel verifications. It will fallback to English or the template’s default translation if the selected translation is not available. This parameter will override the automatic locale resolution. [See supported languages and more information here](https://www.twilio.com/docs/verify/supported-languages). + * @param string $customCode A pre-generated code to use for verification. The code can be between 4 and 10 characters, inclusive. + * @param string $amount The amount of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @param string $payee The payee of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @param array $rateLimits The custom key-value pairs of Programmable Rate Limits. Keys correspond to `unique_name` fields defined when [creating your Rate Limit](https://www.twilio.com/docs/verify/api/service-rate-limits). Associated value pairs represent values in the request that you are rate limiting on. You may include multiple Rate Limit values in each request. + * @param array $channelConfiguration [`email`](https://www.twilio.com/docs/verify/email) channel configuration in json format. The fields 'from' and 'from_name' are optional but if included the 'from' field must have a valid email address. + * @param string $appHash Your [App Hash](https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string) to be appended at the end of your verification SMS body. Applies only to SMS. Example SMS body: `<#> Your AppName verification code is: 1234 He42w354ol9`. + * @param string $templateSid The message [template](https://www.twilio.com/docs/verify/api/templates). If provided, will override the default template for the Service. SMS and Voice channels only. + * @param string $templateCustomSubstitutions A stringified JSON object in which the keys are the template's special variables and the values are the variables substitutions. + * @param string $deviceIp Strongly encouraged if using the auto channel. The IP address of the client's device. If provided, it has to be a valid IPv4 or IPv6 address. + */ + public function __construct( + + string $customFriendlyName = Values::NONE, + string $customMessage = Values::NONE, + string $sendDigits = Values::NONE, + string $locale = Values::NONE, + string $customCode = Values::NONE, + string $amount = Values::NONE, + string $payee = Values::NONE, + array $rateLimits = Values::ARRAY_NONE, + array $channelConfiguration = Values::ARRAY_NONE, + string $appHash = Values::NONE, + string $templateSid = Values::NONE, + string $templateCustomSubstitutions = Values::NONE, + string $deviceIp = Values::NONE + + ) { + $this->options['customFriendlyName'] = $customFriendlyName; + $this->options['customMessage'] = $customMessage; + $this->options['sendDigits'] = $sendDigits; + $this->options['locale'] = $locale; + $this->options['customCode'] = $customCode; + $this->options['amount'] = $amount; + $this->options['payee'] = $payee; + $this->options['rateLimits'] = $rateLimits; + $this->options['channelConfiguration'] = $channelConfiguration; + $this->options['appHash'] = $appHash; + $this->options['templateSid'] = $templateSid; + $this->options['templateCustomSubstitutions'] = $templateCustomSubstitutions; + $this->options['deviceIp'] = $deviceIp; + } + + /** + * A custom user defined friendly name that overwrites the existing one in the verification message + * + * @param string $customFriendlyName A custom user defined friendly name that overwrites the existing one in the verification message + * @return $this Fluent Builder + */ + public function setCustomFriendlyName(string $customFriendlyName): self + { + $this->options['customFriendlyName'] = $customFriendlyName; + return $this; + } + + /** + * The text of a custom message to use for the verification. + * + * @param string $customMessage The text of a custom message to use for the verification. + * @return $this Fluent Builder + */ + public function setCustomMessage(string $customMessage): self + { + $this->options['customMessage'] = $customMessage; + return $this; + } + + /** + * The digits to send after a phone call is answered, for example, to dial an extension. For more information, see the Programmable Voice documentation of [sendDigits](https://www.twilio.com/docs/voice/twiml/number#attributes-sendDigits). + * + * @param string $sendDigits The digits to send after a phone call is answered, for example, to dial an extension. For more information, see the Programmable Voice documentation of [sendDigits](https://www.twilio.com/docs/voice/twiml/number#attributes-sendDigits). + * @return $this Fluent Builder + */ + public function setSendDigits(string $sendDigits): self + { + $this->options['sendDigits'] = $sendDigits; + return $this; + } + + /** + * Locale will automatically resolve based on phone number country code for SMS, WhatsApp, and call channel verifications. It will fallback to English or the template’s default translation if the selected translation is not available. This parameter will override the automatic locale resolution. [See supported languages and more information here](https://www.twilio.com/docs/verify/supported-languages). + * + * @param string $locale Locale will automatically resolve based on phone number country code for SMS, WhatsApp, and call channel verifications. It will fallback to English or the template’s default translation if the selected translation is not available. This parameter will override the automatic locale resolution. [See supported languages and more information here](https://www.twilio.com/docs/verify/supported-languages). + * @return $this Fluent Builder + */ + public function setLocale(string $locale): self + { + $this->options['locale'] = $locale; + return $this; + } + + /** + * A pre-generated code to use for verification. The code can be between 4 and 10 characters, inclusive. + * + * @param string $customCode A pre-generated code to use for verification. The code can be between 4 and 10 characters, inclusive. + * @return $this Fluent Builder + */ + public function setCustomCode(string $customCode): self + { + $this->options['customCode'] = $customCode; + return $this; + } + + /** + * The amount of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * + * @param string $amount The amount of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @return $this Fluent Builder + */ + public function setAmount(string $amount): self + { + $this->options['amount'] = $amount; + return $this; + } + + /** + * The payee of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * + * @param string $payee The payee of the associated PSD2 compliant transaction. Requires the PSD2 Service flag enabled. + * @return $this Fluent Builder + */ + public function setPayee(string $payee): self + { + $this->options['payee'] = $payee; + return $this; + } + + /** + * The custom key-value pairs of Programmable Rate Limits. Keys correspond to `unique_name` fields defined when [creating your Rate Limit](https://www.twilio.com/docs/verify/api/service-rate-limits). Associated value pairs represent values in the request that you are rate limiting on. You may include multiple Rate Limit values in each request. + * + * @param array $rateLimits The custom key-value pairs of Programmable Rate Limits. Keys correspond to `unique_name` fields defined when [creating your Rate Limit](https://www.twilio.com/docs/verify/api/service-rate-limits). Associated value pairs represent values in the request that you are rate limiting on. You may include multiple Rate Limit values in each request. + * @return $this Fluent Builder + */ + public function setRateLimits(array $rateLimits): self + { + $this->options['rateLimits'] = $rateLimits; + return $this; + } + + /** + * [`email`](https://www.twilio.com/docs/verify/email) channel configuration in json format. The fields 'from' and 'from_name' are optional but if included the 'from' field must have a valid email address. + * + * @param array $channelConfiguration [`email`](https://www.twilio.com/docs/verify/email) channel configuration in json format. The fields 'from' and 'from_name' are optional but if included the 'from' field must have a valid email address. + * @return $this Fluent Builder + */ + public function setChannelConfiguration(array $channelConfiguration): self + { + $this->options['channelConfiguration'] = $channelConfiguration; + return $this; + } + + /** + * Your [App Hash](https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string) to be appended at the end of your verification SMS body. Applies only to SMS. Example SMS body: `<#> Your AppName verification code is: 1234 He42w354ol9`. + * + * @param string $appHash Your [App Hash](https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string) to be appended at the end of your verification SMS body. Applies only to SMS. Example SMS body: `<#> Your AppName verification code is: 1234 He42w354ol9`. + * @return $this Fluent Builder + */ + public function setAppHash(string $appHash): self + { + $this->options['appHash'] = $appHash; + return $this; + } + + /** + * The message [template](https://www.twilio.com/docs/verify/api/templates). If provided, will override the default template for the Service. SMS and Voice channels only. + * + * @param string $templateSid The message [template](https://www.twilio.com/docs/verify/api/templates). If provided, will override the default template for the Service. SMS and Voice channels only. + * @return $this Fluent Builder + */ + public function setTemplateSid(string $templateSid): self + { + $this->options['templateSid'] = $templateSid; + return $this; + } + + /** + * A stringified JSON object in which the keys are the template's special variables and the values are the variables substitutions. + * + * @param string $templateCustomSubstitutions A stringified JSON object in which the keys are the template's special variables and the values are the variables substitutions. + * @return $this Fluent Builder + */ + public function setTemplateCustomSubstitutions(string $templateCustomSubstitutions): self + { + $this->options['templateCustomSubstitutions'] = $templateCustomSubstitutions; + return $this; + } + + /** + * Strongly encouraged if using the auto channel. The IP address of the client's device. If provided, it has to be a valid IPv4 or IPv6 address. + * + * @param string $deviceIp Strongly encouraged if using the auto channel. The IP address of the client's device. If provided, it has to be a valid IPv4 or IPv6 address. + * @return $this Fluent Builder + */ + public function setDeviceIp(string $deviceIp): self + { + $this->options['deviceIp'] = $deviceIp; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateVerificationOptions ' . $options . ']'; + } +} + + + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/VerificationPage.php b/app/api/Twilio/Rest/Verify/V2/Service/VerificationPage.php new file mode 100755 index 0000000..7c978f8 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/VerificationPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VerificationInstance \Twilio\Rest\Verify\V2\Service\VerificationInstance + */ + public function buildInstance(array $payload): VerificationInstance + { + return new VerificationInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/WebhookContext.php b/app/api/Twilio/Rest/Verify/V2/Service/WebhookContext.php new file mode 100755 index 0000000..d4447bf --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/WebhookContext.php @@ -0,0 +1,139 @@ +solution = [ + 'serviceSid' => + $serviceSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Webhooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'EventTypes' => + Serialize::map($options['eventTypes'], function ($e) { return $e; }), + 'WebhookUrl' => + $options['webhookUrl'], + 'Status' => + $options['status'], + 'Version' => + $options['version'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.WebhookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/WebhookInstance.php b/app/api/Twilio/Rest/Verify/V2/Service/WebhookInstance.php new file mode 100755 index 0000000..dd9e1ee --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/WebhookInstance.php @@ -0,0 +1,166 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'eventTypes' => Values::array_get($payload, 'event_types'), + 'status' => Values::array_get($payload, 'status'), + 'version' => Values::array_get($payload, 'version'), + 'webhookUrl' => Values::array_get($payload, 'webhook_url'), + 'webhookMethod' => Values::array_get($payload, 'webhook_method'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['serviceSid' => $serviceSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return WebhookContext Context for this WebhookInstance + */ + protected function proxy(): WebhookContext + { + if (!$this->context) { + $this->context = new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the WebhookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the WebhookInstance + * + * @return WebhookInstance Fetched WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): WebhookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the WebhookInstance + * + * @param array|Options $options Optional Arguments + * @return WebhookInstance Updated WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): WebhookInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.WebhookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/WebhookList.php b/app/api/Twilio/Rest/Verify/V2/Service/WebhookList.php new file mode 100755 index 0000000..e19ec0a --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/WebhookList.php @@ -0,0 +1,209 @@ +solution = [ + 'serviceSid' => + $serviceSid, + + ]; + + $this->uri = '/Services/' . \rawurlencode($serviceSid) + .'/Webhooks'; + } + + /** + * Create the WebhookInstance + * + * @param string $friendlyName The string that you assigned to describe the webhook. **This value should not contain PII.** + * @param string[] $eventTypes The array of events that this Webhook is subscribed to. Possible event types: `*, factor.deleted, factor.created, factor.verified, challenge.approved, challenge.denied` + * @param string $webhookUrl The URL associated with this Webhook. + * @param array|Options $options Optional Arguments + * @return WebhookInstance Created WebhookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $eventTypes, string $webhookUrl, array $options = []): WebhookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'EventTypes' => + Serialize::map($eventTypes,function ($e) { return $e; }), + 'WebhookUrl' => + $webhookUrl, + 'Status' => + $options['status'], + 'Version' => + $options['version'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new WebhookInstance( + $this->version, + $payload, + $this->solution['serviceSid'] + ); + } + + + /** + * Reads WebhookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return WebhookInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams WebhookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return WebhookPage Page of WebhookInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): WebhookPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new WebhookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of WebhookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return WebhookPage Page of WebhookInstance + */ + public function getPage(string $targetUrl): WebhookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new WebhookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a WebhookContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Webhook resource to delete. + */ + public function getContext( + string $sid + + ): WebhookContext + { + return new WebhookContext( + $this->version, + $this->solution['serviceSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.WebhookList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/Service/WebhookOptions.php b/app/api/Twilio/Rest/Verify/V2/Service/WebhookOptions.php new file mode 100755 index 0000000..8cb8d54 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/WebhookOptions.php @@ -0,0 +1,216 @@ +options['status'] = $status; + $this->options['version'] = $version; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * @param string $version + * @return $this Fluent Builder + */ + public function setVersion(string $version): self + { + $this->options['version'] = $version; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateWebhookOptions ' . $options . ']'; + } +} + + + + +class UpdateWebhookOptions extends Options + { + /** + * @param string $friendlyName The string that you assigned to describe the webhook. **This value should not contain PII.** + * @param string[] $eventTypes The array of events that this Webhook is subscribed to. Possible event types: `*, factor.deleted, factor.created, factor.verified, challenge.approved, challenge.denied` + * @param string $webhookUrl The URL associated with this Webhook. + * @param string $status + * @param string $version + */ + public function __construct( + + string $friendlyName = Values::NONE, + array $eventTypes = Values::ARRAY_NONE, + string $webhookUrl = Values::NONE, + string $status = Values::NONE, + string $version = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['eventTypes'] = $eventTypes; + $this->options['webhookUrl'] = $webhookUrl; + $this->options['status'] = $status; + $this->options['version'] = $version; + } + + /** + * The string that you assigned to describe the webhook. **This value should not contain PII.** + * + * @param string $friendlyName The string that you assigned to describe the webhook. **This value should not contain PII.** + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The array of events that this Webhook is subscribed to. Possible event types: `*, factor.deleted, factor.created, factor.verified, challenge.approved, challenge.denied` + * + * @param string[] $eventTypes The array of events that this Webhook is subscribed to. Possible event types: `*, factor.deleted, factor.created, factor.verified, challenge.approved, challenge.denied` + * @return $this Fluent Builder + */ + public function setEventTypes(array $eventTypes): self + { + $this->options['eventTypes'] = $eventTypes; + return $this; + } + + /** + * The URL associated with this Webhook. + * + * @param string $webhookUrl The URL associated with this Webhook. + * @return $this Fluent Builder + */ + public function setWebhookUrl(string $webhookUrl): self + { + $this->options['webhookUrl'] = $webhookUrl; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * @param string $version + * @return $this Fluent Builder + */ + public function setVersion(string $version): self + { + $this->options['version'] = $version; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateWebhookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/Service/WebhookPage.php b/app/api/Twilio/Rest/Verify/V2/Service/WebhookPage.php new file mode 100755 index 0000000..4ec0c53 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/Service/WebhookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return WebhookInstance \Twilio\Rest\Verify\V2\Service\WebhookInstance + */ + public function buildInstance(array $payload): WebhookInstance + { + return new WebhookInstance($this->version, $payload, $this->solution['serviceSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.WebhookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/ServiceContext.php b/app/api/Twilio/Rest/Verify/V2/ServiceContext.php new file mode 100755 index 0000000..93114a7 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/ServiceContext.php @@ -0,0 +1,327 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Services/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'CodeLength' => + $options['codeLength'], + 'LookupEnabled' => + Serialize::booleanToString($options['lookupEnabled']), + 'SkipSmsToLandlines' => + Serialize::booleanToString($options['skipSmsToLandlines']), + 'DtmfInputRequired' => + Serialize::booleanToString($options['dtmfInputRequired']), + 'TtsName' => + $options['ttsName'], + 'Psd2Enabled' => + Serialize::booleanToString($options['psd2Enabled']), + 'DoNotShareWarningEnabled' => + Serialize::booleanToString($options['doNotShareWarningEnabled']), + 'CustomCodeEnabled' => + Serialize::booleanToString($options['customCodeEnabled']), + 'Push.IncludeDate' => + Serialize::booleanToString($options['pushIncludeDate']), + 'Push.ApnCredentialSid' => + $options['pushApnCredentialSid'], + 'Push.FcmCredentialSid' => + $options['pushFcmCredentialSid'], + 'Totp.Issuer' => + $options['totpIssuer'], + 'Totp.TimeStep' => + $options['totpTimeStep'], + 'Totp.CodeLength' => + $options['totpCodeLength'], + 'Totp.Skew' => + $options['totpSkew'], + 'DefaultTemplateSid' => + $options['defaultTemplateSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the entities + */ + protected function getEntities(): EntityList + { + if (!$this->_entities) { + $this->_entities = new EntityList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_entities; + } + + /** + * Access the verificationChecks + */ + protected function getVerificationChecks(): VerificationCheckList + { + if (!$this->_verificationChecks) { + $this->_verificationChecks = new VerificationCheckList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_verificationChecks; + } + + /** + * Access the verifications + */ + protected function getVerifications(): VerificationList + { + if (!$this->_verifications) { + $this->_verifications = new VerificationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_verifications; + } + + /** + * Access the accessTokens + */ + protected function getAccessTokens(): AccessTokenList + { + if (!$this->_accessTokens) { + $this->_accessTokens = new AccessTokenList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_accessTokens; + } + + /** + * Access the rateLimits + */ + protected function getRateLimits(): RateLimitList + { + if (!$this->_rateLimits) { + $this->_rateLimits = new RateLimitList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_rateLimits; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + if (!$this->_webhooks) { + $this->_webhooks = new WebhookList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_webhooks; + } + + /** + * Access the messagingConfigurations + */ + protected function getMessagingConfigurations(): MessagingConfigurationList + { + if (!$this->_messagingConfigurations) { + $this->_messagingConfigurations = new MessagingConfigurationList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_messagingConfigurations; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.ServiceContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/ServiceInstance.php b/app/api/Twilio/Rest/Verify/V2/ServiceInstance.php new file mode 100755 index 0000000..59cc921 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/ServiceInstance.php @@ -0,0 +1,247 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'codeLength' => Values::array_get($payload, 'code_length'), + 'lookupEnabled' => Values::array_get($payload, 'lookup_enabled'), + 'psd2Enabled' => Values::array_get($payload, 'psd2_enabled'), + 'skipSmsToLandlines' => Values::array_get($payload, 'skip_sms_to_landlines'), + 'dtmfInputRequired' => Values::array_get($payload, 'dtmf_input_required'), + 'ttsName' => Values::array_get($payload, 'tts_name'), + 'doNotShareWarningEnabled' => Values::array_get($payload, 'do_not_share_warning_enabled'), + 'customCodeEnabled' => Values::array_get($payload, 'custom_code_enabled'), + 'push' => Values::array_get($payload, 'push'), + 'totp' => Values::array_get($payload, 'totp'), + 'defaultTemplateSid' => Values::array_get($payload, 'default_template_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ServiceContext Context for this ServiceInstance + */ + protected function proxy(): ServiceContext + { + if (!$this->context) { + $this->context = new ServiceContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ServiceInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ServiceInstance + * + * @return ServiceInstance Fetched ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ServiceInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ServiceInstance + * + * @param array|Options $options Optional Arguments + * @return ServiceInstance Updated ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ServiceInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the entities + */ + protected function getEntities(): EntityList + { + return $this->proxy()->entities; + } + + /** + * Access the verificationChecks + */ + protected function getVerificationChecks(): VerificationCheckList + { + return $this->proxy()->verificationChecks; + } + + /** + * Access the verifications + */ + protected function getVerifications(): VerificationList + { + return $this->proxy()->verifications; + } + + /** + * Access the accessTokens + */ + protected function getAccessTokens(): AccessTokenList + { + return $this->proxy()->accessTokens; + } + + /** + * Access the rateLimits + */ + protected function getRateLimits(): RateLimitList + { + return $this->proxy()->rateLimits; + } + + /** + * Access the webhooks + */ + protected function getWebhooks(): WebhookList + { + return $this->proxy()->webhooks; + } + + /** + * Access the messagingConfigurations + */ + protected function getMessagingConfigurations(): MessagingConfigurationList + { + return $this->proxy()->messagingConfigurations; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.ServiceInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/ServiceList.php b/app/api/Twilio/Rest/Verify/V2/ServiceList.php new file mode 100755 index 0000000..3367c75 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/ServiceList.php @@ -0,0 +1,223 @@ +solution = [ + ]; + + $this->uri = '/Services'; + } + + /** + * Create the ServiceInstance + * + * @param string $friendlyName A descriptive string that you create to describe the verification service. It can be up to 30 characters long. **This value should not contain PII.** + * @param array|Options $options Optional Arguments + * @return ServiceInstance Created ServiceInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): ServiceInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'CodeLength' => + $options['codeLength'], + 'LookupEnabled' => + Serialize::booleanToString($options['lookupEnabled']), + 'SkipSmsToLandlines' => + Serialize::booleanToString($options['skipSmsToLandlines']), + 'DtmfInputRequired' => + Serialize::booleanToString($options['dtmfInputRequired']), + 'TtsName' => + $options['ttsName'], + 'Psd2Enabled' => + Serialize::booleanToString($options['psd2Enabled']), + 'DoNotShareWarningEnabled' => + Serialize::booleanToString($options['doNotShareWarningEnabled']), + 'CustomCodeEnabled' => + Serialize::booleanToString($options['customCodeEnabled']), + 'Push.IncludeDate' => + Serialize::booleanToString($options['pushIncludeDate']), + 'Push.ApnCredentialSid' => + $options['pushApnCredentialSid'], + 'Push.FcmCredentialSid' => + $options['pushFcmCredentialSid'], + 'Totp.Issuer' => + $options['totpIssuer'], + 'Totp.TimeStep' => + $options['totpTimeStep'], + 'Totp.CodeLength' => + $options['totpCodeLength'], + 'Totp.Skew' => + $options['totpSkew'], + 'DefaultTemplateSid' => + $options['defaultTemplateSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ServiceInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ServiceInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ServiceInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ServiceInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ServicePage Page of ServiceInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ServicePage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ServicePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ServiceInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ServicePage Page of ServiceInstance + */ + public function getPage(string $targetUrl): ServicePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ServicePage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ServiceContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the Verification Service resource to delete. + */ + public function getContext( + string $sid + + ): ServiceContext + { + return new ServiceContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.ServiceList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/ServiceOptions.php b/app/api/Twilio/Rest/Verify/V2/ServiceOptions.php new file mode 100755 index 0000000..b410aa8 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/ServiceOptions.php @@ -0,0 +1,692 @@ +options['codeLength'] = $codeLength; + $this->options['lookupEnabled'] = $lookupEnabled; + $this->options['skipSmsToLandlines'] = $skipSmsToLandlines; + $this->options['dtmfInputRequired'] = $dtmfInputRequired; + $this->options['ttsName'] = $ttsName; + $this->options['psd2Enabled'] = $psd2Enabled; + $this->options['doNotShareWarningEnabled'] = $doNotShareWarningEnabled; + $this->options['customCodeEnabled'] = $customCodeEnabled; + $this->options['pushIncludeDate'] = $pushIncludeDate; + $this->options['pushApnCredentialSid'] = $pushApnCredentialSid; + $this->options['pushFcmCredentialSid'] = $pushFcmCredentialSid; + $this->options['totpIssuer'] = $totpIssuer; + $this->options['totpTimeStep'] = $totpTimeStep; + $this->options['totpCodeLength'] = $totpCodeLength; + $this->options['totpSkew'] = $totpSkew; + $this->options['defaultTemplateSid'] = $defaultTemplateSid; + } + + /** + * The length of the verification code to generate. Must be an integer value between 4 and 10, inclusive. + * + * @param int $codeLength The length of the verification code to generate. Must be an integer value between 4 and 10, inclusive. + * @return $this Fluent Builder + */ + public function setCodeLength(int $codeLength): self + { + $this->options['codeLength'] = $codeLength; + return $this; + } + + /** + * Whether to perform a lookup with each verification started and return info about the phone number. + * + * @param bool $lookupEnabled Whether to perform a lookup with each verification started and return info about the phone number. + * @return $this Fluent Builder + */ + public function setLookupEnabled(bool $lookupEnabled): self + { + $this->options['lookupEnabled'] = $lookupEnabled; + return $this; + } + + /** + * Whether to skip sending SMS verifications to landlines. Requires `lookup_enabled`. + * + * @param bool $skipSmsToLandlines Whether to skip sending SMS verifications to landlines. Requires `lookup_enabled`. + * @return $this Fluent Builder + */ + public function setSkipSmsToLandlines(bool $skipSmsToLandlines): self + { + $this->options['skipSmsToLandlines'] = $skipSmsToLandlines; + return $this; + } + + /** + * Whether to ask the user to press a number before delivering the verify code in a phone call. + * + * @param bool $dtmfInputRequired Whether to ask the user to press a number before delivering the verify code in a phone call. + * @return $this Fluent Builder + */ + public function setDtmfInputRequired(bool $dtmfInputRequired): self + { + $this->options['dtmfInputRequired'] = $dtmfInputRequired; + return $this; + } + + /** + * The name of an alternative text-to-speech service to use in phone calls. Applies only to TTS languages. + * + * @param string $ttsName The name of an alternative text-to-speech service to use in phone calls. Applies only to TTS languages. + * @return $this Fluent Builder + */ + public function setTtsName(string $ttsName): self + { + $this->options['ttsName'] = $ttsName; + return $this; + } + + /** + * Whether to pass PSD2 transaction parameters when starting a verification. + * + * @param bool $psd2Enabled Whether to pass PSD2 transaction parameters when starting a verification. + * @return $this Fluent Builder + */ + public function setPsd2Enabled(bool $psd2Enabled): self + { + $this->options['psd2Enabled'] = $psd2Enabled; + return $this; + } + + /** + * Whether to add a security warning at the end of an SMS verification body. Disabled by default and applies only to SMS. Example SMS body: `Your AppName verification code is: 1234. Don’t share this code with anyone; our employees will never ask for the code` + * + * @param bool $doNotShareWarningEnabled Whether to add a security warning at the end of an SMS verification body. Disabled by default and applies only to SMS. Example SMS body: `Your AppName verification code is: 1234. Don’t share this code with anyone; our employees will never ask for the code` + * @return $this Fluent Builder + */ + public function setDoNotShareWarningEnabled(bool $doNotShareWarningEnabled): self + { + $this->options['doNotShareWarningEnabled'] = $doNotShareWarningEnabled; + return $this; + } + + /** + * Whether to allow sending verifications with a custom code instead of a randomly generated one. Not available for all customers. + * + * @param bool $customCodeEnabled Whether to allow sending verifications with a custom code instead of a randomly generated one. Not available for all customers. + * @return $this Fluent Builder + */ + public function setCustomCodeEnabled(bool $customCodeEnabled): self + { + $this->options['customCodeEnabled'] = $customCodeEnabled; + return $this; + } + + /** + * Optional configuration for the Push factors. If true, include the date in the Challenge's response. Otherwise, the date is omitted from the response. See [Challenge](https://www.twilio.com/docs/verify/api/challenge) resource’s details parameter for more info. Default: false. **Deprecated** do not use this parameter. This timestamp value is the same one as the one found in `date_created`, please use that one instead. + * + * @param bool $pushIncludeDate Optional configuration for the Push factors. If true, include the date in the Challenge's response. Otherwise, the date is omitted from the response. See [Challenge](https://www.twilio.com/docs/verify/api/challenge) resource’s details parameter for more info. Default: false. **Deprecated** do not use this parameter. This timestamp value is the same one as the one found in `date_created`, please use that one instead. + * @return $this Fluent Builder + */ + public function setPushIncludeDate(bool $pushIncludeDate): self + { + $this->options['pushIncludeDate'] = $pushIncludeDate; + return $this; + } + + /** + * Optional configuration for the Push factors. Set the APN Credential for this service. This will allow to send push notifications to iOS devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * + * @param string $pushApnCredentialSid Optional configuration for the Push factors. Set the APN Credential for this service. This will allow to send push notifications to iOS devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @return $this Fluent Builder + */ + public function setPushApnCredentialSid(string $pushApnCredentialSid): self + { + $this->options['pushApnCredentialSid'] = $pushApnCredentialSid; + return $this; + } + + /** + * Optional configuration for the Push factors. Set the FCM Credential for this service. This will allow to send push notifications to Android devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * + * @param string $pushFcmCredentialSid Optional configuration for the Push factors. Set the FCM Credential for this service. This will allow to send push notifications to Android devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @return $this Fluent Builder + */ + public function setPushFcmCredentialSid(string $pushFcmCredentialSid): self + { + $this->options['pushFcmCredentialSid'] = $pushFcmCredentialSid; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Set TOTP Issuer for this service. This will allow to configure the issuer of the TOTP URI. Defaults to the service friendly name if not provided. + * + * @param string $totpIssuer Optional configuration for the TOTP factors. Set TOTP Issuer for this service. This will allow to configure the issuer of the TOTP URI. Defaults to the service friendly name if not provided. + * @return $this Fluent Builder + */ + public function setTotpIssuer(string $totpIssuer): self + { + $this->options['totpIssuer'] = $totpIssuer; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. Defaults to 30 seconds + * + * @param int $totpTimeStep Optional configuration for the TOTP factors. Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. Defaults to 30 seconds + * @return $this Fluent Builder + */ + public function setTotpTimeStep(int $totpTimeStep): self + { + $this->options['totpTimeStep'] = $totpTimeStep; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. Defaults to 6 + * + * @param int $totpCodeLength Optional configuration for the TOTP factors. Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. Defaults to 6 + * @return $this Fluent Builder + */ + public function setTotpCodeLength(int $totpCodeLength): self + { + $this->options['totpCodeLength'] = $totpCodeLength; + return $this; + } + + /** + * Optional configuration for the TOTP factors. The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. Defaults to 1 + * + * @param int $totpSkew Optional configuration for the TOTP factors. The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. Defaults to 1 + * @return $this Fluent Builder + */ + public function setTotpSkew(int $totpSkew): self + { + $this->options['totpSkew'] = $totpSkew; + return $this; + } + + /** + * The default message [template](https://www.twilio.com/docs/verify/api/templates). Will be used for all SMS verifications unless explicitly overriden. SMS channel only. + * + * @param string $defaultTemplateSid The default message [template](https://www.twilio.com/docs/verify/api/templates). Will be used for all SMS verifications unless explicitly overriden. SMS channel only. + * @return $this Fluent Builder + */ + public function setDefaultTemplateSid(string $defaultTemplateSid): self + { + $this->options['defaultTemplateSid'] = $defaultTemplateSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.CreateServiceOptions ' . $options . ']'; + } +} + + + + +class UpdateServiceOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the verification service. It can be up to 30 characters long. **This value should not contain PII.** + * @param int $codeLength The length of the verification code to generate. Must be an integer value between 4 and 10, inclusive. + * @param bool $lookupEnabled Whether to perform a lookup with each verification started and return info about the phone number. + * @param bool $skipSmsToLandlines Whether to skip sending SMS verifications to landlines. Requires `lookup_enabled`. + * @param bool $dtmfInputRequired Whether to ask the user to press a number before delivering the verify code in a phone call. + * @param string $ttsName The name of an alternative text-to-speech service to use in phone calls. Applies only to TTS languages. + * @param bool $psd2Enabled Whether to pass PSD2 transaction parameters when starting a verification. + * @param bool $doNotShareWarningEnabled Whether to add a privacy warning at the end of an SMS. **Disabled by default and applies only for SMS.** + * @param bool $customCodeEnabled Whether to allow sending verifications with a custom code instead of a randomly generated one. Not available for all customers. + * @param bool $pushIncludeDate Optional configuration for the Push factors. If true, include the date in the Challenge's response. Otherwise, the date is omitted from the response. See [Challenge](https://www.twilio.com/docs/verify/api/challenge) resource’s details parameter for more info. Default: false. **Deprecated** do not use this parameter. + * @param string $pushApnCredentialSid Optional configuration for the Push factors. Set the APN Credential for this service. This will allow to send push notifications to iOS devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @param string $pushFcmCredentialSid Optional configuration for the Push factors. Set the FCM Credential for this service. This will allow to send push notifications to Android devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @param string $totpIssuer Optional configuration for the TOTP factors. Set TOTP Issuer for this service. This will allow to configure the issuer of the TOTP URI. + * @param int $totpTimeStep Optional configuration for the TOTP factors. Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. Defaults to 30 seconds + * @param int $totpCodeLength Optional configuration for the TOTP factors. Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. Defaults to 6 + * @param int $totpSkew Optional configuration for the TOTP factors. The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. Defaults to 1 + * @param string $defaultTemplateSid The default message [template](https://www.twilio.com/docs/verify/api/templates). Will be used for all SMS verifications unless explicitly overriden. SMS channel only. + */ + public function __construct( + + string $friendlyName = Values::NONE, + int $codeLength = Values::INT_NONE, + bool $lookupEnabled = Values::BOOL_NONE, + bool $skipSmsToLandlines = Values::BOOL_NONE, + bool $dtmfInputRequired = Values::BOOL_NONE, + string $ttsName = Values::NONE, + bool $psd2Enabled = Values::BOOL_NONE, + bool $doNotShareWarningEnabled = Values::BOOL_NONE, + bool $customCodeEnabled = Values::BOOL_NONE, + bool $pushIncludeDate = Values::BOOL_NONE, + string $pushApnCredentialSid = Values::NONE, + string $pushFcmCredentialSid = Values::NONE, + string $totpIssuer = Values::NONE, + int $totpTimeStep = Values::INT_NONE, + int $totpCodeLength = Values::INT_NONE, + int $totpSkew = Values::INT_NONE, + string $defaultTemplateSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['codeLength'] = $codeLength; + $this->options['lookupEnabled'] = $lookupEnabled; + $this->options['skipSmsToLandlines'] = $skipSmsToLandlines; + $this->options['dtmfInputRequired'] = $dtmfInputRequired; + $this->options['ttsName'] = $ttsName; + $this->options['psd2Enabled'] = $psd2Enabled; + $this->options['doNotShareWarningEnabled'] = $doNotShareWarningEnabled; + $this->options['customCodeEnabled'] = $customCodeEnabled; + $this->options['pushIncludeDate'] = $pushIncludeDate; + $this->options['pushApnCredentialSid'] = $pushApnCredentialSid; + $this->options['pushFcmCredentialSid'] = $pushFcmCredentialSid; + $this->options['totpIssuer'] = $totpIssuer; + $this->options['totpTimeStep'] = $totpTimeStep; + $this->options['totpCodeLength'] = $totpCodeLength; + $this->options['totpSkew'] = $totpSkew; + $this->options['defaultTemplateSid'] = $defaultTemplateSid; + } + + /** + * A descriptive string that you create to describe the verification service. It can be up to 30 characters long. **This value should not contain PII.** + * + * @param string $friendlyName A descriptive string that you create to describe the verification service. It can be up to 30 characters long. **This value should not contain PII.** + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The length of the verification code to generate. Must be an integer value between 4 and 10, inclusive. + * + * @param int $codeLength The length of the verification code to generate. Must be an integer value between 4 and 10, inclusive. + * @return $this Fluent Builder + */ + public function setCodeLength(int $codeLength): self + { + $this->options['codeLength'] = $codeLength; + return $this; + } + + /** + * Whether to perform a lookup with each verification started and return info about the phone number. + * + * @param bool $lookupEnabled Whether to perform a lookup with each verification started and return info about the phone number. + * @return $this Fluent Builder + */ + public function setLookupEnabled(bool $lookupEnabled): self + { + $this->options['lookupEnabled'] = $lookupEnabled; + return $this; + } + + /** + * Whether to skip sending SMS verifications to landlines. Requires `lookup_enabled`. + * + * @param bool $skipSmsToLandlines Whether to skip sending SMS verifications to landlines. Requires `lookup_enabled`. + * @return $this Fluent Builder + */ + public function setSkipSmsToLandlines(bool $skipSmsToLandlines): self + { + $this->options['skipSmsToLandlines'] = $skipSmsToLandlines; + return $this; + } + + /** + * Whether to ask the user to press a number before delivering the verify code in a phone call. + * + * @param bool $dtmfInputRequired Whether to ask the user to press a number before delivering the verify code in a phone call. + * @return $this Fluent Builder + */ + public function setDtmfInputRequired(bool $dtmfInputRequired): self + { + $this->options['dtmfInputRequired'] = $dtmfInputRequired; + return $this; + } + + /** + * The name of an alternative text-to-speech service to use in phone calls. Applies only to TTS languages. + * + * @param string $ttsName The name of an alternative text-to-speech service to use in phone calls. Applies only to TTS languages. + * @return $this Fluent Builder + */ + public function setTtsName(string $ttsName): self + { + $this->options['ttsName'] = $ttsName; + return $this; + } + + /** + * Whether to pass PSD2 transaction parameters when starting a verification. + * + * @param bool $psd2Enabled Whether to pass PSD2 transaction parameters when starting a verification. + * @return $this Fluent Builder + */ + public function setPsd2Enabled(bool $psd2Enabled): self + { + $this->options['psd2Enabled'] = $psd2Enabled; + return $this; + } + + /** + * Whether to add a privacy warning at the end of an SMS. **Disabled by default and applies only for SMS.** + * + * @param bool $doNotShareWarningEnabled Whether to add a privacy warning at the end of an SMS. **Disabled by default and applies only for SMS.** + * @return $this Fluent Builder + */ + public function setDoNotShareWarningEnabled(bool $doNotShareWarningEnabled): self + { + $this->options['doNotShareWarningEnabled'] = $doNotShareWarningEnabled; + return $this; + } + + /** + * Whether to allow sending verifications with a custom code instead of a randomly generated one. Not available for all customers. + * + * @param bool $customCodeEnabled Whether to allow sending verifications with a custom code instead of a randomly generated one. Not available for all customers. + * @return $this Fluent Builder + */ + public function setCustomCodeEnabled(bool $customCodeEnabled): self + { + $this->options['customCodeEnabled'] = $customCodeEnabled; + return $this; + } + + /** + * Optional configuration for the Push factors. If true, include the date in the Challenge's response. Otherwise, the date is omitted from the response. See [Challenge](https://www.twilio.com/docs/verify/api/challenge) resource’s details parameter for more info. Default: false. **Deprecated** do not use this parameter. + * + * @param bool $pushIncludeDate Optional configuration for the Push factors. If true, include the date in the Challenge's response. Otherwise, the date is omitted from the response. See [Challenge](https://www.twilio.com/docs/verify/api/challenge) resource’s details parameter for more info. Default: false. **Deprecated** do not use this parameter. + * @return $this Fluent Builder + */ + public function setPushIncludeDate(bool $pushIncludeDate): self + { + $this->options['pushIncludeDate'] = $pushIncludeDate; + return $this; + } + + /** + * Optional configuration for the Push factors. Set the APN Credential for this service. This will allow to send push notifications to iOS devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * + * @param string $pushApnCredentialSid Optional configuration for the Push factors. Set the APN Credential for this service. This will allow to send push notifications to iOS devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @return $this Fluent Builder + */ + public function setPushApnCredentialSid(string $pushApnCredentialSid): self + { + $this->options['pushApnCredentialSid'] = $pushApnCredentialSid; + return $this; + } + + /** + * Optional configuration for the Push factors. Set the FCM Credential for this service. This will allow to send push notifications to Android devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * + * @param string $pushFcmCredentialSid Optional configuration for the Push factors. Set the FCM Credential for this service. This will allow to send push notifications to Android devices. See [Credential Resource](https://www.twilio.com/docs/notify/api/credential-resource) + * @return $this Fluent Builder + */ + public function setPushFcmCredentialSid(string $pushFcmCredentialSid): self + { + $this->options['pushFcmCredentialSid'] = $pushFcmCredentialSid; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Set TOTP Issuer for this service. This will allow to configure the issuer of the TOTP URI. + * + * @param string $totpIssuer Optional configuration for the TOTP factors. Set TOTP Issuer for this service. This will allow to configure the issuer of the TOTP URI. + * @return $this Fluent Builder + */ + public function setTotpIssuer(string $totpIssuer): self + { + $this->options['totpIssuer'] = $totpIssuer; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. Defaults to 30 seconds + * + * @param int $totpTimeStep Optional configuration for the TOTP factors. Defines how often, in seconds, are TOTP codes generated. i.e, a new TOTP code is generated every time_step seconds. Must be between 20 and 60 seconds, inclusive. Defaults to 30 seconds + * @return $this Fluent Builder + */ + public function setTotpTimeStep(int $totpTimeStep): self + { + $this->options['totpTimeStep'] = $totpTimeStep; + return $this; + } + + /** + * Optional configuration for the TOTP factors. Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. Defaults to 6 + * + * @param int $totpCodeLength Optional configuration for the TOTP factors. Number of digits for generated TOTP codes. Must be between 3 and 8, inclusive. Defaults to 6 + * @return $this Fluent Builder + */ + public function setTotpCodeLength(int $totpCodeLength): self + { + $this->options['totpCodeLength'] = $totpCodeLength; + return $this; + } + + /** + * Optional configuration for the TOTP factors. The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. Defaults to 1 + * + * @param int $totpSkew Optional configuration for the TOTP factors. The number of time-steps, past and future, that are valid for validation of TOTP codes. Must be between 0 and 2, inclusive. Defaults to 1 + * @return $this Fluent Builder + */ + public function setTotpSkew(int $totpSkew): self + { + $this->options['totpSkew'] = $totpSkew; + return $this; + } + + /** + * The default message [template](https://www.twilio.com/docs/verify/api/templates). Will be used for all SMS verifications unless explicitly overriden. SMS channel only. + * + * @param string $defaultTemplateSid The default message [template](https://www.twilio.com/docs/verify/api/templates). Will be used for all SMS verifications unless explicitly overriden. SMS channel only. + * @return $this Fluent Builder + */ + public function setDefaultTemplateSid(string $defaultTemplateSid): self + { + $this->options['defaultTemplateSid'] = $defaultTemplateSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.UpdateServiceOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/ServicePage.php b/app/api/Twilio/Rest/Verify/V2/ServicePage.php new file mode 100755 index 0000000..2da6d53 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/ServicePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ServiceInstance \Twilio\Rest\Verify\V2\ServiceInstance + */ + public function buildInstance(array $payload): ServiceInstance + { + return new ServiceInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.ServicePage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/TemplateInstance.php b/app/api/Twilio/Rest/Verify/V2/TemplateInstance.php new file mode 100755 index 0000000..6499b0b --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/TemplateInstance.php @@ -0,0 +1,88 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'channels' => Values::array_get($payload, 'channels'), + 'translations' => Values::array_get($payload, 'translations'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.TemplateInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/TemplateList.php b/app/api/Twilio/Rest/Verify/V2/TemplateList.php new file mode 100755 index 0000000..0be2598 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/TemplateList.php @@ -0,0 +1,152 @@ +solution = [ + ]; + + $this->uri = '/Templates'; + } + + /** + * Reads TemplateInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return TemplateInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams TemplateInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of TemplateInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return TemplatePage Page of TemplateInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): TemplatePage + { + $options = new Values($options); + + $params = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new TemplatePage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of TemplateInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return TemplatePage Page of TemplateInstance + */ + public function getPage(string $targetUrl): TemplatePage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new TemplatePage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.TemplateList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/TemplateOptions.php b/app/api/Twilio/Rest/Verify/V2/TemplateOptions.php new file mode 100755 index 0000000..b6316ae --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/TemplateOptions.php @@ -0,0 +1,76 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * String filter used to query templates with a given friendly name + * + * @param string $friendlyName String filter used to query templates with a given friendly name + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.ReadTemplateOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/TemplatePage.php b/app/api/Twilio/Rest/Verify/V2/TemplatePage.php new file mode 100755 index 0000000..2580a27 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/TemplatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return TemplateInstance \Twilio\Rest\Verify\V2\TemplateInstance + */ + public function buildInstance(array $payload): TemplateInstance + { + return new TemplateInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.TemplatePage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptContext.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptContext.php new file mode 100755 index 0000000..35469e1 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptContext.php @@ -0,0 +1,81 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Attempts/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the VerificationAttemptInstance + * + * @return VerificationAttemptInstance Fetched VerificationAttemptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VerificationAttemptInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new VerificationAttemptInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationAttemptContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptInstance.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptInstance.php new file mode 100755 index 0000000..e502462 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'serviceSid' => Values::array_get($payload, 'service_sid'), + 'verificationSid' => Values::array_get($payload, 'verification_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'conversionStatus' => Values::array_get($payload, 'conversion_status'), + 'channel' => Values::array_get($payload, 'channel'), + 'price' => Values::array_get($payload, 'price'), + 'channelData' => Values::array_get($payload, 'channel_data'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return VerificationAttemptContext Context for this VerificationAttemptInstance + */ + protected function proxy(): VerificationAttemptContext + { + if (!$this->context) { + $this->context = new VerificationAttemptContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the VerificationAttemptInstance + * + * @return VerificationAttemptInstance Fetched VerificationAttemptInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): VerificationAttemptInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationAttemptInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptList.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptList.php new file mode 100755 index 0000000..7ed54c9 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptList.php @@ -0,0 +1,183 @@ +solution = [ + ]; + + $this->uri = '/Attempts'; + } + + /** + * Reads VerificationAttemptInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return VerificationAttemptInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams VerificationAttemptInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of VerificationAttemptInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return VerificationAttemptPage Page of VerificationAttemptInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): VerificationAttemptPage + { + $options = new Values($options); + + $params = Values::of([ + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'ChannelData.To' => + $options['channelDataTo'], + 'Country' => + $options['country'], + 'Channel' => + $options['channel'], + 'VerifyServiceSid' => + $options['verifyServiceSid'], + 'VerificationSid' => + $options['verificationSid'], + 'Status' => + $options['status'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new VerificationAttemptPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of VerificationAttemptInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return VerificationAttemptPage Page of VerificationAttemptInstance + */ + public function getPage(string $targetUrl): VerificationAttemptPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new VerificationAttemptPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a VerificationAttemptContext + * + * @param string $sid The unique SID identifier of a Verification Attempt + */ + public function getContext( + string $sid + + ): VerificationAttemptContext + { + return new VerificationAttemptContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationAttemptList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptOptions.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptOptions.php new file mode 100755 index 0000000..e9041d9 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptOptions.php @@ -0,0 +1,204 @@ +options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['channelDataTo'] = $channelDataTo; + $this->options['country'] = $country; + $this->options['channel'] = $channel; + $this->options['verifyServiceSid'] = $verifyServiceSid; + $this->options['verificationSid'] = $verificationSid; + $this->options['status'] = $status; + } + + /** + * Datetime filter used to query Verification Attempts created after this datetime. Given as GMT in RFC 2822 format. + * + * @param \DateTime $dateCreatedAfter Datetime filter used to query Verification Attempts created after this datetime. Given as GMT in RFC 2822 format. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Datetime filter used to query Verification Attempts created before this datetime. Given as GMT in RFC 2822 format. + * + * @param \DateTime $dateCreatedBefore Datetime filter used to query Verification Attempts created before this datetime. Given as GMT in RFC 2822 format. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Destination of a verification. It is phone number in E.164 format. + * + * @param string $channelDataTo Destination of a verification. It is phone number in E.164 format. + * @return $this Fluent Builder + */ + public function setChannelDataTo(string $channelDataTo): self + { + $this->options['channelDataTo'] = $channelDataTo; + return $this; + } + + /** + * Filter used to query Verification Attempts sent to the specified destination country. + * + * @param string $country Filter used to query Verification Attempts sent to the specified destination country. + * @return $this Fluent Builder + */ + public function setCountry(string $country): self + { + $this->options['country'] = $country; + return $this; + } + + /** + * Filter used to query Verification Attempts by communication channel. Valid values are `SMS` and `CALL` + * + * @param string $channel Filter used to query Verification Attempts by communication channel. Valid values are `SMS` and `CALL` + * @return $this Fluent Builder + */ + public function setChannel(string $channel): self + { + $this->options['channel'] = $channel; + return $this; + } + + /** + * Filter used to query Verification Attempts by verify service. Only attempts of the provided SID will be returned. + * + * @param string $verifyServiceSid Filter used to query Verification Attempts by verify service. Only attempts of the provided SID will be returned. + * @return $this Fluent Builder + */ + public function setVerifyServiceSid(string $verifyServiceSid): self + { + $this->options['verifyServiceSid'] = $verifyServiceSid; + return $this; + } + + /** + * Filter used to return all the Verification Attempts of a single verification. Only attempts of the provided verification SID will be returned. + * + * @param string $verificationSid Filter used to return all the Verification Attempts of a single verification. Only attempts of the provided verification SID will be returned. + * @return $this Fluent Builder + */ + public function setVerificationSid(string $verificationSid): self + { + $this->options['verificationSid'] = $verificationSid; + return $this; + } + + /** + * Filter used to query Verification Attempts by conversion status. Valid values are `UNCONVERTED`, for attempts that were not converted, and `CONVERTED`, for attempts that were confirmed. + * + * @param string $status Filter used to query Verification Attempts by conversion status. Valid values are `UNCONVERTED`, for attempts that were not converted, and `CONVERTED`, for attempts that were confirmed. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.ReadVerificationAttemptOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptPage.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptPage.php new file mode 100755 index 0000000..0e2ad77 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VerificationAttemptInstance \Twilio\Rest\Verify\V2\VerificationAttemptInstance + */ + public function buildInstance(array $payload): VerificationAttemptInstance + { + return new VerificationAttemptInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationAttemptPage]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryContext.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryContext.php new file mode 100755 index 0000000..e73c6a7 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryContext.php @@ -0,0 +1,96 @@ +solution = [ + ]; + + $this->uri = '/Attempts/Summary'; + } + + /** + * Fetch the VerificationAttemptsSummaryInstance + * + * @param array|Options $options Optional Arguments + * @return VerificationAttemptsSummaryInstance Fetched VerificationAttemptsSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): VerificationAttemptsSummaryInstance + { + + $options = new Values($options); + + $params = Values::of([ + 'VerifyServiceSid' => + $options['verifyServiceSid'], + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'Country' => + $options['country'], + 'Channel' => + $options['channel'], + 'DestinationPrefix' => + $options['destinationPrefix'], + ]); + + $payload = $this->version->fetch('GET', $this->uri, $params); + + return new VerificationAttemptsSummaryInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationAttemptsSummaryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryInstance.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryInstance.php new file mode 100755 index 0000000..a549b4f --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryInstance.php @@ -0,0 +1,123 @@ +properties = [ + 'totalAttempts' => Values::array_get($payload, 'total_attempts'), + 'totalConverted' => Values::array_get($payload, 'total_converted'), + 'totalUnconverted' => Values::array_get($payload, 'total_unconverted'), + 'conversionRatePercentage' => Values::array_get($payload, 'conversion_rate_percentage'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return VerificationAttemptsSummaryContext Context for this VerificationAttemptsSummaryInstance + */ + protected function proxy(): VerificationAttemptsSummaryContext + { + if (!$this->context) { + $this->context = new VerificationAttemptsSummaryContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the VerificationAttemptsSummaryInstance + * + * @param array|Options $options Optional Arguments + * @return VerificationAttemptsSummaryInstance Fetched VerificationAttemptsSummaryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(array $options = []): VerificationAttemptsSummaryInstance + { + + return $this->proxy()->fetch($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Verify.V2.VerificationAttemptsSummaryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryList.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryList.php new file mode 100755 index 0000000..bfc543d --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a VerificationAttemptsSummaryContext + */ + public function getContext( + + ): VerificationAttemptsSummaryContext + { + return new VerificationAttemptsSummaryContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationAttemptsSummaryList]'; + } +} diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryOptions.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryOptions.php new file mode 100755 index 0000000..de99e39 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryOptions.php @@ -0,0 +1,166 @@ +options['verifyServiceSid'] = $verifyServiceSid; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['country'] = $country; + $this->options['channel'] = $channel; + $this->options['destinationPrefix'] = $destinationPrefix; + } + + /** + * Filter used to consider only Verification Attempts of the given verify service on the summary aggregation. + * + * @param string $verifyServiceSid Filter used to consider only Verification Attempts of the given verify service on the summary aggregation. + * @return $this Fluent Builder + */ + public function setVerifyServiceSid(string $verifyServiceSid): self + { + $this->options['verifyServiceSid'] = $verifyServiceSid; + return $this; + } + + /** + * Datetime filter used to consider only Verification Attempts created after this datetime on the summary aggregation. Given as GMT in RFC 2822 format. + * + * @param \DateTime $dateCreatedAfter Datetime filter used to consider only Verification Attempts created after this datetime on the summary aggregation. Given as GMT in RFC 2822 format. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Datetime filter used to consider only Verification Attempts created before this datetime on the summary aggregation. Given as GMT in RFC 2822 format. + * + * @param \DateTime $dateCreatedBefore Datetime filter used to consider only Verification Attempts created before this datetime on the summary aggregation. Given as GMT in RFC 2822 format. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Filter used to consider only Verification Attempts sent to the specified destination country on the summary aggregation. + * + * @param string $country Filter used to consider only Verification Attempts sent to the specified destination country on the summary aggregation. + * @return $this Fluent Builder + */ + public function setCountry(string $country): self + { + $this->options['country'] = $country; + return $this; + } + + /** + * Filter Verification Attempts considered on the summary aggregation by communication channel. Valid values are `SMS` and `CALL` + * + * @param string $channel Filter Verification Attempts considered on the summary aggregation by communication channel. Valid values are `SMS` and `CALL` + * @return $this Fluent Builder + */ + public function setChannel(string $channel): self + { + $this->options['channel'] = $channel; + return $this; + } + + /** + * Filter the Verification Attempts considered on the summary aggregation by Destination prefix. It is the prefix of a phone number in E.164 format. + * + * @param string $destinationPrefix Filter the Verification Attempts considered on the summary aggregation by Destination prefix. It is the prefix of a phone number in E.164 format. + * @return $this Fluent Builder + */ + public function setDestinationPrefix(string $destinationPrefix): self + { + $this->options['destinationPrefix'] = $destinationPrefix; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Verify.V2.FetchVerificationAttemptsSummaryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryPage.php b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryPage.php new file mode 100755 index 0000000..0faba54 --- /dev/null +++ b/app/api/Twilio/Rest/Verify/V2/VerificationAttemptsSummaryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return VerificationAttemptsSummaryInstance \Twilio\Rest\Verify\V2\VerificationAttemptsSummaryInstance + */ + public function buildInstance(array $payload): VerificationAttemptsSummaryInstance + { + return new VerificationAttemptsSummaryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Verify.V2.VerificationAttemptsSummaryPage]'; + } +} diff --git a/app/api/Twilio/Rest/VerifyBase.php b/app/api/Twilio/Rest/VerifyBase.php new file mode 100755 index 0000000..0cdf6a5 --- /dev/null +++ b/app/api/Twilio/Rest/VerifyBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://verify.twilio.com'; + } + + + /** + * @return V2 Version v2 of verify + */ + protected function getV2(): V2 { + if (!$this->_v2) { + $this->_v2 = new V2($this); + } + return $this->_v2; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Verify]'; + } +} diff --git a/app/api/Twilio/Rest/Video.php b/app/api/Twilio/Rest/Video.php new file mode 100755 index 0000000..e312dea --- /dev/null +++ b/app/api/Twilio/Rest/Video.php @@ -0,0 +1,107 @@ +compositions instead. + */ + protected function getCompositions(): \Twilio\Rest\Video\V1\CompositionList { + echo "compositions is deprecated. Use v1->compositions instead."; + return $this->v1->compositions; + } + + /** + * @deprecated Use v1->compositions(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextCompositions(string $sid): \Twilio\Rest\Video\V1\CompositionContext { + echo "compositions(\$sid) is deprecated. Use v1->compositions(\$sid) instead."; + return $this->v1->compositions($sid); + } + + /** + * @deprecated Use v1->compositionHooks instead. + */ + protected function getCompositionHooks(): \Twilio\Rest\Video\V1\CompositionHookList { + echo "compositionHooks is deprecated. Use v1->compositionHooks instead."; + return $this->v1->compositionHooks; + } + + /** + * @deprecated Use v1->compositionHooks(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextCompositionHooks(string $sid): \Twilio\Rest\Video\V1\CompositionHookContext { + echo "compositionHooks(\$sid) is deprecated. Use v1->compositionHooks(\$sid) instead."; + return $this->v1->compositionHooks($sid); + } + + /** + * @deprecated Use v1->compositionSettings instead. + */ + protected function getCompositionSettings(): \Twilio\Rest\Video\V1\CompositionSettingsList { + echo "compositionSettings is deprecated. Use v1->compositionSettings instead."; + return $this->v1->compositionSettings; + } + + /** + * @deprecated Use v1->compositionSettings() instead. + */ + protected function contextCompositionSettings(): \Twilio\Rest\Video\V1\CompositionSettingsContext { + echo "compositionSettings() is deprecated. Use v1->compositionSettings() instead."; + return $this->v1->compositionSettings(); + } + + /** + * @deprecated Use v1->recordings instead. + */ + protected function getRecordings(): \Twilio\Rest\Video\V1\RecordingList { + echo "recordings is deprecated. Use v1->recordings instead."; + return $this->v1->recordings; + } + + /** + * @deprecated Use v1->recordings(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextRecordings(string $sid): \Twilio\Rest\Video\V1\RecordingContext { + echo "recordings(\$sid) is deprecated. Use v1->recordings(\$sid) instead."; + return $this->v1->recordings($sid); + } + + /** + * @deprecated Use v1->recordingSettings instead. + */ + protected function getRecordingSettings(): \Twilio\Rest\Video\V1\RecordingSettingsList { + echo "recordingSettings is deprecated. Use v1->recordingSettings instead."; + return $this->v1->recordingSettings; + } + + /** + * @deprecated Use v1->recordingSettings() instead. + */ + protected function contextRecordingSettings(): \Twilio\Rest\Video\V1\RecordingSettingsContext { + echo "recordingSettings() is deprecated. Use v1->recordingSettings() instead."; + return $this->v1->recordingSettings(); + } + + /** + * @deprecated Use v1->rooms instead. + */ + protected function getRooms(): \Twilio\Rest\Video\V1\RoomList { + echo "rooms is deprecated. Use v1->rooms instead."; + return $this->v1->rooms; + } + + /** + * @deprecated Use v1->rooms(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextRooms(string $sid): \Twilio\Rest\Video\V1\RoomContext { + echo "rooms(\$sid) is deprecated. Use v1->rooms(\$sid) instead."; + return $this->v1->rooms($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Video/V1.php b/app/api/Twilio/Rest/Video/V1.php new file mode 100755 index 0000000..8905d13 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1.php @@ -0,0 +1,153 @@ +version = 'v1'; + } + + protected function getCompositions(): CompositionList + { + if (!$this->_compositions) { + $this->_compositions = new CompositionList($this); + } + return $this->_compositions; + } + + protected function getCompositionHooks(): CompositionHookList + { + if (!$this->_compositionHooks) { + $this->_compositionHooks = new CompositionHookList($this); + } + return $this->_compositionHooks; + } + + protected function getCompositionSettings(): CompositionSettingsList + { + if (!$this->_compositionSettings) { + $this->_compositionSettings = new CompositionSettingsList($this); + } + return $this->_compositionSettings; + } + + protected function getRecordings(): RecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RecordingList($this); + } + return $this->_recordings; + } + + protected function getRecordingSettings(): RecordingSettingsList + { + if (!$this->_recordingSettings) { + $this->_recordingSettings = new RecordingSettingsList($this); + } + return $this->_recordingSettings; + } + + protected function getRooms(): RoomList + { + if (!$this->_rooms) { + $this->_rooms = new RoomList($this); + } + return $this->_rooms; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionContext.php b/app/api/Twilio/Rest/Video/V1/CompositionContext.php new file mode 100755 index 0000000..b32be73 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionContext.php @@ -0,0 +1,94 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Compositions/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CompositionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CompositionInstance + * + * @return CompositionInstance Fetched CompositionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CompositionInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionHookContext.php b/app/api/Twilio/Rest/Video/V1/CompositionHookContext.php new file mode 100755 index 0000000..b1a0e61 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionHookContext.php @@ -0,0 +1,143 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/CompositionHooks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CompositionHookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CompositionHookInstance + * + * @return CompositionHookInstance Fetched CompositionHookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionHookInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CompositionHookInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the CompositionHookInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 100 characters long and it must be unique within the account. + * @param array|Options $options Optional Arguments + * @return CompositionHookInstance Updated CompositionHookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName, array $options = []): CompositionHookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'VideoLayout' => + Serialize::jsonObject($options['videoLayout']), + 'AudioSources' => + Serialize::map($options['audioSources'], function ($e) { return $e; }), + 'AudioSourcesExcluded' => + Serialize::map($options['audioSourcesExcluded'], function ($e) { return $e; }), + 'Trim' => + Serialize::booleanToString($options['trim']), + 'Format' => + $options['format'], + 'Resolution' => + $options['resolution'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new CompositionHookInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionHookContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionHookInstance.php b/app/api/Twilio/Rest/Video/V1/CompositionHookInstance.php new file mode 100755 index 0000000..64ceb37 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionHookInstance.php @@ -0,0 +1,171 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'sid' => Values::array_get($payload, 'sid'), + 'audioSources' => Values::array_get($payload, 'audio_sources'), + 'audioSourcesExcluded' => Values::array_get($payload, 'audio_sources_excluded'), + 'videoLayout' => Values::array_get($payload, 'video_layout'), + 'resolution' => Values::array_get($payload, 'resolution'), + 'trim' => Values::array_get($payload, 'trim'), + 'format' => Values::array_get($payload, 'format'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CompositionHookContext Context for this CompositionHookInstance + */ + protected function proxy(): CompositionHookContext + { + if (!$this->context) { + $this->context = new CompositionHookContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CompositionHookInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CompositionHookInstance + * + * @return CompositionHookInstance Fetched CompositionHookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionHookInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the CompositionHookInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 100 characters long and it must be unique within the account. + * @param array|Options $options Optional Arguments + * @return CompositionHookInstance Updated CompositionHookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $friendlyName, array $options = []): CompositionHookInstance + { + + return $this->proxy()->update($friendlyName, $options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionHookInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionHookList.php b/app/api/Twilio/Rest/Video/V1/CompositionHookList.php new file mode 100755 index 0000000..5c639bb --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionHookList.php @@ -0,0 +1,221 @@ +solution = [ + ]; + + $this->uri = '/CompositionHooks'; + } + + /** + * Create the CompositionHookInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It can be up to 100 characters long and it must be unique within the account. + * @param array|Options $options Optional Arguments + * @return CompositionHookInstance Created CompositionHookInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): CompositionHookInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'VideoLayout' => + Serialize::jsonObject($options['videoLayout']), + 'AudioSources' => + Serialize::map($options['audioSources'], function ($e) { return $e; }), + 'AudioSourcesExcluded' => + Serialize::map($options['audioSourcesExcluded'], function ($e) { return $e; }), + 'Resolution' => + $options['resolution'], + 'Format' => + $options['format'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'Trim' => + Serialize::booleanToString($options['trim']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CompositionHookInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CompositionHookInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CompositionHookInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CompositionHookInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CompositionHookInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CompositionHookPage Page of CompositionHookInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CompositionHookPage + { + $options = new Values($options); + + $params = Values::of([ + 'Enabled' => + Serialize::booleanToString($options['enabled']), + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'FriendlyName' => + $options['friendlyName'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CompositionHookPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CompositionHookInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CompositionHookPage Page of CompositionHookInstance + */ + public function getPage(string $targetUrl): CompositionHookPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CompositionHookPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CompositionHookContext + * + * @param string $sid The SID of the CompositionHook resource to delete. + */ + public function getContext( + string $sid + + ): CompositionHookContext + { + return new CompositionHookContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionHookList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionHookOptions.php b/app/api/Twilio/Rest/Video/V1/CompositionHookOptions.php new file mode 100755 index 0000000..0024248 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionHookOptions.php @@ -0,0 +1,522 @@ +options['enabled'] = $enabled; + $this->options['videoLayout'] = $videoLayout; + $this->options['audioSources'] = $audioSources; + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + $this->options['resolution'] = $resolution; + $this->options['format'] = $format; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['trim'] = $trim; + } + + /** + * Whether the composition hook is active. When `true`, the composition hook will be triggered for every completed Group Room in the account. When `false`, the composition hook will never be triggered. + * + * @param bool $enabled Whether the composition hook is active. When `true`, the composition hook will be triggered for every completed Group Room in the account. When `false`, the composition hook will never be triggered. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * An object that describes the video layout of the composition hook in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param array $videoLayout An object that describes the video layout of the composition hook in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setVideoLayout(array $videoLayout): self + { + $this->options['videoLayout'] = $videoLayout; + return $this; + } + + /** + * An array of track names from the same group room to merge into the compositions created by the composition hook. Can include zero or more track names. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` includes tracks named `student` as well as `studentTeam`. + * + * @param string[] $audioSources An array of track names from the same group room to merge into the compositions created by the composition hook. Can include zero or more track names. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` includes tracks named `student` as well as `studentTeam`. + * @return $this Fluent Builder + */ + public function setAudioSources(array $audioSources): self + { + $this->options['audioSources'] = $audioSources; + return $this; + } + + /** + * An array of track names to exclude. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * + * @param string[] $audioSourcesExcluded An array of track names to exclude. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * @return $this Fluent Builder + */ + public function setAudioSourcesExcluded(array $audioSourcesExcluded): self + { + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + return $this; + } + + /** + * A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param string $resolution A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setResolution(string $resolution): self + { + $this->options['resolution'] = $resolution; + return $this; + } + + /** + * @param string $format + * @return $this Fluent Builder + */ + public function setFormat(string $format): self + { + $this->options['format'] = $format; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether to clip the intervals where there is no active media in the Compositions triggered by the composition hook. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param bool $trim Whether to clip the intervals where there is no active media in the Compositions triggered by the composition hook. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setTrim(bool $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.CreateCompositionHookOptions ' . $options . ']'; + } +} + + + +class ReadCompositionHookOptions extends Options + { + /** + * @param bool $enabled Read only CompositionHook resources with an `enabled` value that matches this parameter. + * @param \DateTime $dateCreatedAfter Read only CompositionHook resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @param \DateTime $dateCreatedBefore Read only CompositionHook resources created before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @param string $friendlyName Read only CompositionHook resources with friendly names that match this string. The match is not case sensitive and can include asterisk `*` characters as wildcard match. + */ + public function __construct( + + bool $enabled = Values::BOOL_NONE, + \DateTime $dateCreatedAfter = null, + \DateTime $dateCreatedBefore = null, + string $friendlyName = Values::NONE + + ) { + $this->options['enabled'] = $enabled; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * Read only CompositionHook resources with an `enabled` value that matches this parameter. + * + * @param bool $enabled Read only CompositionHook resources with an `enabled` value that matches this parameter. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Read only CompositionHook resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * + * @param \DateTime $dateCreatedAfter Read only CompositionHook resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only CompositionHook resources created before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * + * @param \DateTime $dateCreatedBefore Read only CompositionHook resources created before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Read only CompositionHook resources with friendly names that match this string. The match is not case sensitive and can include asterisk `*` characters as wildcard match. + * + * @param string $friendlyName Read only CompositionHook resources with friendly names that match this string. The match is not case sensitive and can include asterisk `*` characters as wildcard match. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadCompositionHookOptions ' . $options . ']'; + } +} + +class UpdateCompositionHookOptions extends Options + { + /** + * @param bool $enabled Whether the composition hook is active. When `true`, the composition hook will be triggered for every completed Group Room in the account. When `false`, the composition hook never triggers. + * @param array $videoLayout A JSON object that describes the video layout of the composition hook in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @param string[] $audioSources An array of track names from the same group room to merge into the compositions created by the composition hook. Can include zero or more track names. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` includes tracks named `student` as well as `studentTeam`. + * @param string[] $audioSourcesExcluded An array of track names to exclude. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * @param bool $trim Whether to clip the intervals where there is no active media in the compositions triggered by the composition hook. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @param string $format + * @param string $resolution A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + */ + public function __construct( + + bool $enabled = Values::BOOL_NONE, + array $videoLayout = Values::ARRAY_NONE, + array $audioSources = Values::ARRAY_NONE, + array $audioSourcesExcluded = Values::ARRAY_NONE, + bool $trim = Values::BOOL_NONE, + string $format = Values::NONE, + string $resolution = Values::NONE, + string $statusCallback = Values::NONE, + string $statusCallbackMethod = Values::NONE + + ) { + $this->options['enabled'] = $enabled; + $this->options['videoLayout'] = $videoLayout; + $this->options['audioSources'] = $audioSources; + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + $this->options['trim'] = $trim; + $this->options['format'] = $format; + $this->options['resolution'] = $resolution; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + } + + /** + * Whether the composition hook is active. When `true`, the composition hook will be triggered for every completed Group Room in the account. When `false`, the composition hook never triggers. + * + * @param bool $enabled Whether the composition hook is active. When `true`, the composition hook will be triggered for every completed Group Room in the account. When `false`, the composition hook never triggers. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * A JSON object that describes the video layout of the composition hook in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param array $videoLayout A JSON object that describes the video layout of the composition hook in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setVideoLayout(array $videoLayout): self + { + $this->options['videoLayout'] = $videoLayout; + return $this; + } + + /** + * An array of track names from the same group room to merge into the compositions created by the composition hook. Can include zero or more track names. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` includes tracks named `student` as well as `studentTeam`. + * + * @param string[] $audioSources An array of track names from the same group room to merge into the compositions created by the composition hook. Can include zero or more track names. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` includes tracks named `student` as well as `studentTeam`. + * @return $this Fluent Builder + */ + public function setAudioSources(array $audioSources): self + { + $this->options['audioSources'] = $audioSources; + return $this; + } + + /** + * An array of track names to exclude. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * + * @param string[] $audioSourcesExcluded An array of track names to exclude. A composition triggered by the composition hook includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which matches zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * @return $this Fluent Builder + */ + public function setAudioSourcesExcluded(array $audioSourcesExcluded): self + { + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + return $this; + } + + /** + * Whether to clip the intervals where there is no active media in the compositions triggered by the composition hook. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param bool $trim Whether to clip the intervals where there is no active media in the compositions triggered by the composition hook. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setTrim(bool $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * @param string $format + * @return $this Fluent Builder + */ + public function setFormat(string $format): self + { + $this->options['format'] = $format; + return $this; + } + + /** + * A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param string $resolution A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setResolution(string $resolution): self + { + $this->options['resolution'] = $resolution; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.UpdateCompositionHookOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionHookPage.php b/app/api/Twilio/Rest/Video/V1/CompositionHookPage.php new file mode 100755 index 0000000..12b579b --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionHookPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CompositionHookInstance \Twilio\Rest\Video\V1\CompositionHookInstance + */ + public function buildInstance(array $payload): CompositionHookInstance + { + return new CompositionHookInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionHookPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionInstance.php b/app/api/Twilio/Rest/Video/V1/CompositionInstance.php new file mode 100755 index 0000000..f847525 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionInstance.php @@ -0,0 +1,168 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateCompleted' => Deserialize::dateTime(Values::array_get($payload, 'date_completed')), + 'dateDeleted' => Deserialize::dateTime(Values::array_get($payload, 'date_deleted')), + 'sid' => Values::array_get($payload, 'sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'audioSources' => Values::array_get($payload, 'audio_sources'), + 'audioSourcesExcluded' => Values::array_get($payload, 'audio_sources_excluded'), + 'videoLayout' => Values::array_get($payload, 'video_layout'), + 'resolution' => Values::array_get($payload, 'resolution'), + 'trim' => Values::array_get($payload, 'trim'), + 'format' => Values::array_get($payload, 'format'), + 'bitrate' => Values::array_get($payload, 'bitrate'), + 'size' => Values::array_get($payload, 'size'), + 'duration' => Values::array_get($payload, 'duration'), + 'mediaExternalLocation' => Values::array_get($payload, 'media_external_location'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CompositionContext Context for this CompositionInstance + */ + protected function proxy(): CompositionContext + { + if (!$this->context) { + $this->context = new CompositionContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CompositionInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CompositionInstance + * + * @return CompositionInstance Fetched CompositionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionList.php b/app/api/Twilio/Rest/Video/V1/CompositionList.php new file mode 100755 index 0000000..6100b1b --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionList.php @@ -0,0 +1,219 @@ +solution = [ + ]; + + $this->uri = '/Compositions'; + } + + /** + * Create the CompositionInstance + * + * @param string $roomSid The SID of the Group Room with the media tracks to be used as composition sources. + * @param array|Options $options Optional Arguments + * @return CompositionInstance Created CompositionInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $roomSid, array $options = []): CompositionInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'RoomSid' => + $roomSid, + 'VideoLayout' => + Serialize::jsonObject($options['videoLayout']), + 'AudioSources' => + Serialize::map($options['audioSources'], function ($e) { return $e; }), + 'AudioSourcesExcluded' => + Serialize::map($options['audioSourcesExcluded'], function ($e) { return $e; }), + 'Resolution' => + $options['resolution'], + 'Format' => + $options['format'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'Trim' => + Serialize::booleanToString($options['trim']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CompositionInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CompositionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CompositionInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CompositionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CompositionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CompositionPage Page of CompositionInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CompositionPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'RoomSid' => + $options['roomSid'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CompositionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CompositionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CompositionPage Page of CompositionInstance + */ + public function getPage(string $targetUrl): CompositionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CompositionPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CompositionContext + * + * @param string $sid The SID of the Composition resource to delete. + */ + public function getContext( + string $sid + + ): CompositionContext + { + return new CompositionContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionOptions.php b/app/api/Twilio/Rest/Video/V1/CompositionOptions.php new file mode 100755 index 0000000..b6b81f4 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionOptions.php @@ -0,0 +1,310 @@ +options['videoLayout'] = $videoLayout; + $this->options['audioSources'] = $audioSources; + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + $this->options['resolution'] = $resolution; + $this->options['format'] = $format; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['trim'] = $trim; + } + + /** + * An object that describes the video layout of the composition in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. Please, be aware that either video_layout or audio_sources have to be provided to get a valid creation request + * + * @param array $videoLayout An object that describes the video layout of the composition in terms of regions. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. Please, be aware that either video_layout or audio_sources have to be provided to get a valid creation request + * @return $this Fluent Builder + */ + public function setVideoLayout(array $videoLayout): self + { + $this->options['videoLayout'] = $videoLayout; + return $this; + } + + /** + * An array of track names from the same group room to merge into the new composition. Can include zero or more track names. The new composition includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which will match zero or more characters in a track name. For example, `student*` includes `student` as well as `studentTeam`. Please, be aware that either video_layout or audio_sources have to be provided to get a valid creation request + * + * @param string[] $audioSources An array of track names from the same group room to merge into the new composition. Can include zero or more track names. The new composition includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which will match zero or more characters in a track name. For example, `student*` includes `student` as well as `studentTeam`. Please, be aware that either video_layout or audio_sources have to be provided to get a valid creation request + * @return $this Fluent Builder + */ + public function setAudioSources(array $audioSources): self + { + $this->options['audioSources'] = $audioSources; + return $this; + } + + /** + * An array of track names to exclude. The new composition includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which will match zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * + * @param string[] $audioSourcesExcluded An array of track names to exclude. The new composition includes all audio sources specified in `audio_sources` except for those specified in `audio_sources_excluded`. The track names in this parameter can include an asterisk as a wild card character, which will match zero or more characters in a track name. For example, `student*` excludes `student` as well as `studentTeam`. This parameter can also be empty. + * @return $this Fluent Builder + */ + public function setAudioSourcesExcluded(array $audioSourcesExcluded): self + { + $this->options['audioSourcesExcluded'] = $audioSourcesExcluded; + return $this; + } + + /** + * A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param string $resolution A string that describes the columns (width) and rows (height) of the generated composed video in pixels. Defaults to `640x480`. The string's format is `{width}x{height}` where: * 16 <= `{width}` <= 1280 * 16 <= `{height}` <= 1280 * `{width}` * `{height}` <= 921,600 Typical values are: * HD = `1280x720` * PAL = `1024x576` * VGA = `640x480` * CIF = `320x240` Note that the `resolution` imposes an aspect ratio to the resulting composition. When the original video tracks are constrained by the aspect ratio, they are scaled to fit. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setResolution(string $resolution): self + { + $this->options['resolution'] = $resolution; + return $this; + } + + /** + * @param string $format + * @return $this Fluent Builder + */ + public function setFormat(string $format): self + { + $this->options['format'] = $format; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application on every composition event. If not provided, status callback events will not be dispatched. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be: `POST` or `GET` and the default is `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether to clip the intervals where there is no active media in the composition. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * + * @param bool $trim Whether to clip the intervals where there is no active media in the composition. The default is `true`. Compositions with `trim` enabled are shorter when the Room is created and no Participant joins for a while as well as if all the Participants leave the room and join later, because those gaps will be removed. See [Specifying Video Layouts](https://www.twilio.com/docs/video/api/compositions-resource#specifying-video-layouts) for more info. + * @return $this Fluent Builder + */ + public function setTrim(bool $trim): self + { + $this->options['trim'] = $trim; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.CreateCompositionOptions ' . $options . ']'; + } +} + + + +class ReadCompositionOptions extends Options + { + /** + * @param string $status Read only Composition resources with this status. Can be: `enqueued`, `processing`, `completed`, `deleted`, or `failed`. + * @param \DateTime $dateCreatedAfter Read only Composition resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone. + * @param \DateTime $dateCreatedBefore Read only Composition resources created before this ISO 8601 date-time with time zone. + * @param string $roomSid Read only Composition resources with this Room SID. + */ + public function __construct( + + string $status = Values::NONE, + \DateTime $dateCreatedAfter = null, + \DateTime $dateCreatedBefore = null, + string $roomSid = Values::NONE + + ) { + $this->options['status'] = $status; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['roomSid'] = $roomSid; + } + + /** + * Read only Composition resources with this status. Can be: `enqueued`, `processing`, `completed`, `deleted`, or `failed`. + * + * @param string $status Read only Composition resources with this status. Can be: `enqueued`, `processing`, `completed`, `deleted`, or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Read only Composition resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone. + * + * @param \DateTime $dateCreatedAfter Read only Composition resources created on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only Composition resources created before this ISO 8601 date-time with time zone. + * + * @param \DateTime $dateCreatedBefore Read only Composition resources created before this ISO 8601 date-time with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Read only Composition resources with this Room SID. + * + * @param string $roomSid Read only Composition resources with this Room SID. + * @return $this Fluent Builder + */ + public function setRoomSid(string $roomSid): self + { + $this->options['roomSid'] = $roomSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadCompositionOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionPage.php b/app/api/Twilio/Rest/Video/V1/CompositionPage.php new file mode 100755 index 0000000..2601d8e --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CompositionInstance \Twilio\Rest\Video\V1\CompositionInstance + */ + public function buildInstance(array $payload): CompositionInstance + { + return new CompositionInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionSettingsContext.php b/app/api/Twilio/Rest/Video/V1/CompositionSettingsContext.php new file mode 100755 index 0000000..e3822df --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionSettingsContext.php @@ -0,0 +1,115 @@ +solution = [ + ]; + + $this->uri = '/CompositionSettings/Default'; + } + + /** + * Create the CompositionSettingsInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource and show to the user in the console + * @param array|Options $options Optional Arguments + * @return CompositionSettingsInstance Created CompositionSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): CompositionSettingsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'AwsCredentialsSid' => + $options['awsCredentialsSid'], + 'EncryptionKeySid' => + $options['encryptionKeySid'], + 'AwsS3Url' => + $options['awsS3Url'], + 'AwsStorageEnabled' => + Serialize::booleanToString($options['awsStorageEnabled']), + 'EncryptionEnabled' => + Serialize::booleanToString($options['encryptionEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CompositionSettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Fetch the CompositionSettingsInstance + * + * @return CompositionSettingsInstance Fetched CompositionSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionSettingsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CompositionSettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionSettingsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionSettingsInstance.php b/app/api/Twilio/Rest/Video/V1/CompositionSettingsInstance.php new file mode 100755 index 0000000..027e203 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionSettingsInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'awsCredentialsSid' => Values::array_get($payload, 'aws_credentials_sid'), + 'awsS3Url' => Values::array_get($payload, 'aws_s3_url'), + 'awsStorageEnabled' => Values::array_get($payload, 'aws_storage_enabled'), + 'encryptionKeySid' => Values::array_get($payload, 'encryption_key_sid'), + 'encryptionEnabled' => Values::array_get($payload, 'encryption_enabled'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CompositionSettingsContext Context for this CompositionSettingsInstance + */ + protected function proxy(): CompositionSettingsContext + { + if (!$this->context) { + $this->context = new CompositionSettingsContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Create the CompositionSettingsInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource and show to the user in the console + * @param array|Options $options Optional Arguments + * @return CompositionSettingsInstance Created CompositionSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): CompositionSettingsInstance + { + + return $this->proxy()->create($friendlyName, $options); + } + + /** + * Fetch the CompositionSettingsInstance + * + * @return CompositionSettingsInstance Fetched CompositionSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CompositionSettingsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.CompositionSettingsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionSettingsList.php b/app/api/Twilio/Rest/Video/V1/CompositionSettingsList.php new file mode 100755 index 0000000..8be5511 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionSettingsList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a CompositionSettingsContext + */ + public function getContext( + + ): CompositionSettingsContext + { + return new CompositionSettingsContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionSettingsList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/CompositionSettingsOptions.php b/app/api/Twilio/Rest/Video/V1/CompositionSettingsOptions.php new file mode 100755 index 0000000..dd4d607 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionSettingsOptions.php @@ -0,0 +1,150 @@ +RFC 3986
. + * @param bool $awsStorageEnabled Whether all compositions should be written to the `aws_s3_url`. When `false`, all compositions are stored in our cloud. + * @param bool $encryptionEnabled Whether all compositions should be stored in an encrypted form. The default is `false`. + * @return CreateCompositionSettingsOptions Options builder + */ + public static function create( + + string $awsCredentialsSid = Values::NONE, + string $encryptionKeySid = Values::NONE, + string $awsS3Url = Values::NONE, + bool $awsStorageEnabled = Values::BOOL_NONE, + bool $encryptionEnabled = Values::BOOL_NONE + + ): CreateCompositionSettingsOptions + { + return new CreateCompositionSettingsOptions( + $awsCredentialsSid, + $encryptionKeySid, + $awsS3Url, + $awsStorageEnabled, + $encryptionEnabled + ); + } + + +} + +class CreateCompositionSettingsOptions extends Options + { + /** + * @param string $awsCredentialsSid The SID of the stored Credential resource. + * @param string $encryptionKeySid The SID of the Public Key resource to use for encryption. + * @param string $awsS3Url The URL of the AWS S3 bucket where the compositions should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/compositions`, where `compositions` is the path in which you want the compositions to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * @param bool $awsStorageEnabled Whether all compositions should be written to the `aws_s3_url`. When `false`, all compositions are stored in our cloud. + * @param bool $encryptionEnabled Whether all compositions should be stored in an encrypted form. The default is `false`. + */ + public function __construct( + + string $awsCredentialsSid = Values::NONE, + string $encryptionKeySid = Values::NONE, + string $awsS3Url = Values::NONE, + bool $awsStorageEnabled = Values::BOOL_NONE, + bool $encryptionEnabled = Values::BOOL_NONE + + ) { + $this->options['awsCredentialsSid'] = $awsCredentialsSid; + $this->options['encryptionKeySid'] = $encryptionKeySid; + $this->options['awsS3Url'] = $awsS3Url; + $this->options['awsStorageEnabled'] = $awsStorageEnabled; + $this->options['encryptionEnabled'] = $encryptionEnabled; + } + + /** + * The SID of the stored Credential resource. + * + * @param string $awsCredentialsSid The SID of the stored Credential resource. + * @return $this Fluent Builder + */ + public function setAwsCredentialsSid(string $awsCredentialsSid): self + { + $this->options['awsCredentialsSid'] = $awsCredentialsSid; + return $this; + } + + /** + * The SID of the Public Key resource to use for encryption. + * + * @param string $encryptionKeySid The SID of the Public Key resource to use for encryption. + * @return $this Fluent Builder + */ + public function setEncryptionKeySid(string $encryptionKeySid): self + { + $this->options['encryptionKeySid'] = $encryptionKeySid; + return $this; + } + + /** + * The URL of the AWS S3 bucket where the compositions should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/compositions`, where `compositions` is the path in which you want the compositions to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * + * @param string $awsS3Url The URL of the AWS S3 bucket where the compositions should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/compositions`, where `compositions` is the path in which you want the compositions to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * @return $this Fluent Builder + */ + public function setAwsS3Url(string $awsS3Url): self + { + $this->options['awsS3Url'] = $awsS3Url; + return $this; + } + + /** + * Whether all compositions should be written to the `aws_s3_url`. When `false`, all compositions are stored in our cloud. + * + * @param bool $awsStorageEnabled Whether all compositions should be written to the `aws_s3_url`. When `false`, all compositions are stored in our cloud. + * @return $this Fluent Builder + */ + public function setAwsStorageEnabled(bool $awsStorageEnabled): self + { + $this->options['awsStorageEnabled'] = $awsStorageEnabled; + return $this; + } + + /** + * Whether all compositions should be stored in an encrypted form. The default is `false`. + * + * @param bool $encryptionEnabled Whether all compositions should be stored in an encrypted form. The default is `false`. + * @return $this Fluent Builder + */ + public function setEncryptionEnabled(bool $encryptionEnabled): self + { + $this->options['encryptionEnabled'] = $encryptionEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.CreateCompositionSettingsOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Video/V1/CompositionSettingsPage.php b/app/api/Twilio/Rest/Video/V1/CompositionSettingsPage.php new file mode 100755 index 0000000..6d8ab4c --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/CompositionSettingsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CompositionSettingsInstance \Twilio\Rest\Video\V1\CompositionSettingsInstance + */ + public function buildInstance(array $payload): CompositionSettingsInstance + { + return new CompositionSettingsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.CompositionSettingsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingContext.php b/app/api/Twilio/Rest/Video/V1/RecordingContext.php new file mode 100755 index 0000000..03141fb --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingContext.php @@ -0,0 +1,94 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Recordings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingInstance.php b/app/api/Twilio/Rest/Video/V1/RecordingInstance.php new file mode 100755 index 0000000..e7e9e27 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'sid' => Values::array_get($payload, 'sid'), + 'sourceSid' => Values::array_get($payload, 'source_sid'), + 'size' => Values::array_get($payload, 'size'), + 'url' => Values::array_get($payload, 'url'), + 'type' => Values::array_get($payload, 'type'), + 'duration' => Values::array_get($payload, 'duration'), + 'containerFormat' => Values::array_get($payload, 'container_format'), + 'codec' => Values::array_get($payload, 'codec'), + 'groupingSids' => Values::array_get($payload, 'grouping_sids'), + 'trackName' => Values::array_get($payload, 'track_name'), + 'offset' => Values::array_get($payload, 'offset'), + 'mediaExternalLocation' => Values::array_get($payload, 'media_external_location'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingContext Context for this RecordingInstance + */ + protected function proxy(): RecordingContext + { + if (!$this->context) { + $this->context = new RecordingContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RecordingInstance + * + * @return RecordingInstance Fetched RecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/RecordingList.php b/app/api/Twilio/Rest/Video/V1/RecordingList.php new file mode 100755 index 0000000..0bf1394 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingList.php @@ -0,0 +1,179 @@ +solution = [ + ]; + + $this->uri = '/Recordings'; + } + + /** + * Reads RecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RecordingPage Page of RecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'SourceSid' => + $options['sourceSid'], + 'GroupingSid' => + Serialize::map($options['groupingSid'], function ($e) { return $e; }), + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'MediaType' => + $options['mediaType'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RecordingPage Page of RecordingInstance + */ + public function getPage(string $targetUrl): RecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RecordingContext + * + * @param string $sid The SID of the Recording resource to delete. + */ + public function getContext( + string $sid + + ): RecordingContext + { + return new RecordingContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingOptions.php b/app/api/Twilio/Rest/Video/V1/RecordingOptions.php new file mode 100755 index 0000000..6a5a74f --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingOptions.php @@ -0,0 +1,170 @@ +options['status'] = $status; + $this->options['sourceSid'] = $sourceSid; + $this->options['groupingSid'] = $groupingSid; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + $this->options['mediaType'] = $mediaType; + } + + /** + * Read only the recordings that have this status. Can be: `processing`, `completed`, or `deleted`. + * + * @param string $status Read only the recordings that have this status. Can be: `processing`, `completed`, or `deleted`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Read only the recordings that have this `source_sid`. + * + * @param string $sourceSid Read only the recordings that have this `source_sid`. + * @return $this Fluent Builder + */ + public function setSourceSid(string $sourceSid): self + { + $this->options['sourceSid'] = $sourceSid; + return $this; + } + + /** + * Read only recordings with this `grouping_sid`, which may include a `participant_sid` and/or a `room_sid`. + * + * @param string[] $groupingSid Read only recordings with this `grouping_sid`, which may include a `participant_sid` and/or a `room_sid`. + * @return $this Fluent Builder + */ + public function setGroupingSid(array $groupingSid): self + { + $this->options['groupingSid'] = $groupingSid; + return $this; + } + + /** + * Read only recordings that started on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone. + * + * @param \DateTime $dateCreatedAfter Read only recordings that started on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only recordings that started before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone, given as `YYYY-MM-DDThh:mm:ss+|-hh:mm` or `YYYY-MM-DDThh:mm:ssZ`. + * + * @param \DateTime $dateCreatedBefore Read only recordings that started before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time with time zone, given as `YYYY-MM-DDThh:mm:ss+|-hh:mm` or `YYYY-MM-DDThh:mm:ssZ`. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Read only recordings that have this media type. Can be either `audio` or `video`. + * + * @param string $mediaType Read only recordings that have this media type. Can be either `audio` or `video`. + * @return $this Fluent Builder + */ + public function setMediaType(string $mediaType): self + { + $this->options['mediaType'] = $mediaType; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/RecordingPage.php b/app/api/Twilio/Rest/Video/V1/RecordingPage.php new file mode 100755 index 0000000..79ff7f2 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingInstance \Twilio\Rest\Video\V1\RecordingInstance + */ + public function buildInstance(array $payload): RecordingInstance + { + return new RecordingInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingSettingsContext.php b/app/api/Twilio/Rest/Video/V1/RecordingSettingsContext.php new file mode 100755 index 0000000..5ca46e3 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingSettingsContext.php @@ -0,0 +1,115 @@ +solution = [ + ]; + + $this->uri = '/RecordingSettings/Default'; + } + + /** + * Create the RecordingSettingsInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource and be shown to users in the console + * @param array|Options $options Optional Arguments + * @return RecordingSettingsInstance Created RecordingSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): RecordingSettingsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $friendlyName, + 'AwsCredentialsSid' => + $options['awsCredentialsSid'], + 'EncryptionKeySid' => + $options['encryptionKeySid'], + 'AwsS3Url' => + $options['awsS3Url'], + 'AwsStorageEnabled' => + Serialize::booleanToString($options['awsStorageEnabled']), + 'EncryptionEnabled' => + Serialize::booleanToString($options['encryptionEnabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RecordingSettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Fetch the RecordingSettingsInstance + * + * @return RecordingSettingsInstance Fetched RecordingSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingSettingsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingSettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RecordingSettingsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingSettingsInstance.php b/app/api/Twilio/Rest/Video/V1/RecordingSettingsInstance.php new file mode 100755 index 0000000..ac09abe --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingSettingsInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'awsCredentialsSid' => Values::array_get($payload, 'aws_credentials_sid'), + 'awsS3Url' => Values::array_get($payload, 'aws_s3_url'), + 'awsStorageEnabled' => Values::array_get($payload, 'aws_storage_enabled'), + 'encryptionKeySid' => Values::array_get($payload, 'encryption_key_sid'), + 'encryptionEnabled' => Values::array_get($payload, 'encryption_enabled'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RecordingSettingsContext Context for this RecordingSettingsInstance + */ + protected function proxy(): RecordingSettingsContext + { + if (!$this->context) { + $this->context = new RecordingSettingsContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Create the RecordingSettingsInstance + * + * @param string $friendlyName A descriptive string that you create to describe the resource and be shown to users in the console + * @param array|Options $options Optional Arguments + * @return RecordingSettingsInstance Created RecordingSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $friendlyName, array $options = []): RecordingSettingsInstance + { + + return $this->proxy()->create($friendlyName, $options); + } + + /** + * Fetch the RecordingSettingsInstance + * + * @return RecordingSettingsInstance Fetched RecordingSettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingSettingsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RecordingSettingsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/RecordingSettingsList.php b/app/api/Twilio/Rest/Video/V1/RecordingSettingsList.php new file mode 100755 index 0000000..e85f1cf --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingSettingsList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a RecordingSettingsContext + */ + public function getContext( + + ): RecordingSettingsContext + { + return new RecordingSettingsContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingSettingsList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RecordingSettingsOptions.php b/app/api/Twilio/Rest/Video/V1/RecordingSettingsOptions.php new file mode 100755 index 0000000..999b09a --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingSettingsOptions.php @@ -0,0 +1,150 @@ +RFC 3986. + * @param bool $awsStorageEnabled Whether all recordings should be written to the `aws_s3_url`. When `false`, all recordings are stored in our cloud. + * @param bool $encryptionEnabled Whether all recordings should be stored in an encrypted form. The default is `false`. + * @return CreateRecordingSettingsOptions Options builder + */ + public static function create( + + string $awsCredentialsSid = Values::NONE, + string $encryptionKeySid = Values::NONE, + string $awsS3Url = Values::NONE, + bool $awsStorageEnabled = Values::BOOL_NONE, + bool $encryptionEnabled = Values::BOOL_NONE + + ): CreateRecordingSettingsOptions + { + return new CreateRecordingSettingsOptions( + $awsCredentialsSid, + $encryptionKeySid, + $awsS3Url, + $awsStorageEnabled, + $encryptionEnabled + ); + } + + +} + +class CreateRecordingSettingsOptions extends Options + { + /** + * @param string $awsCredentialsSid The SID of the stored Credential resource. + * @param string $encryptionKeySid The SID of the Public Key resource to use for encryption. + * @param string $awsS3Url The URL of the AWS S3 bucket where the recordings should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/recordings`, where `recordings` is the path in which you want the recordings to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * @param bool $awsStorageEnabled Whether all recordings should be written to the `aws_s3_url`. When `false`, all recordings are stored in our cloud. + * @param bool $encryptionEnabled Whether all recordings should be stored in an encrypted form. The default is `false`. + */ + public function __construct( + + string $awsCredentialsSid = Values::NONE, + string $encryptionKeySid = Values::NONE, + string $awsS3Url = Values::NONE, + bool $awsStorageEnabled = Values::BOOL_NONE, + bool $encryptionEnabled = Values::BOOL_NONE + + ) { + $this->options['awsCredentialsSid'] = $awsCredentialsSid; + $this->options['encryptionKeySid'] = $encryptionKeySid; + $this->options['awsS3Url'] = $awsS3Url; + $this->options['awsStorageEnabled'] = $awsStorageEnabled; + $this->options['encryptionEnabled'] = $encryptionEnabled; + } + + /** + * The SID of the stored Credential resource. + * + * @param string $awsCredentialsSid The SID of the stored Credential resource. + * @return $this Fluent Builder + */ + public function setAwsCredentialsSid(string $awsCredentialsSid): self + { + $this->options['awsCredentialsSid'] = $awsCredentialsSid; + return $this; + } + + /** + * The SID of the Public Key resource to use for encryption. + * + * @param string $encryptionKeySid The SID of the Public Key resource to use for encryption. + * @return $this Fluent Builder + */ + public function setEncryptionKeySid(string $encryptionKeySid): self + { + $this->options['encryptionKeySid'] = $encryptionKeySid; + return $this; + } + + /** + * The URL of the AWS S3 bucket where the recordings should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/recordings`, where `recordings` is the path in which you want the recordings to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * + * @param string $awsS3Url The URL of the AWS S3 bucket where the recordings should be stored. We only support DNS-compliant URLs like `https://documentation-example-twilio-bucket/recordings`, where `recordings` is the path in which you want the recordings to be stored. This URL accepts only URI-valid characters, as described in the RFC 3986. + * @return $this Fluent Builder + */ + public function setAwsS3Url(string $awsS3Url): self + { + $this->options['awsS3Url'] = $awsS3Url; + return $this; + } + + /** + * Whether all recordings should be written to the `aws_s3_url`. When `false`, all recordings are stored in our cloud. + * + * @param bool $awsStorageEnabled Whether all recordings should be written to the `aws_s3_url`. When `false`, all recordings are stored in our cloud. + * @return $this Fluent Builder + */ + public function setAwsStorageEnabled(bool $awsStorageEnabled): self + { + $this->options['awsStorageEnabled'] = $awsStorageEnabled; + return $this; + } + + /** + * Whether all recordings should be stored in an encrypted form. The default is `false`. + * + * @param bool $encryptionEnabled Whether all recordings should be stored in an encrypted form. The default is `false`. + * @return $this Fluent Builder + */ + public function setEncryptionEnabled(bool $encryptionEnabled): self + { + $this->options['encryptionEnabled'] = $encryptionEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.CreateRecordingSettingsOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Video/V1/RecordingSettingsPage.php b/app/api/Twilio/Rest/Video/V1/RecordingSettingsPage.php new file mode 100755 index 0000000..256152f --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RecordingSettingsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingSettingsInstance \Twilio\Rest\Video\V1\RecordingSettingsInstance + */ + public function buildInstance(array $payload): RecordingSettingsInstance + { + return new RecordingSettingsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingSettingsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeContext.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeContext.php new file mode 100755 index 0000000..ef0a64d --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeContext.php @@ -0,0 +1,87 @@ +solution = [ + 'roomSid' => + $roomSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($sid) + .'/Anonymize'; + } + + /** + * Update the AnonymizeInstance + * + * @return AnonymizeInstance Updated AnonymizeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): AnonymizeInstance + { + + $payload = $this->version->update('POST', $this->uri); + + return new AnonymizeInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.AnonymizeContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeInstance.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeInstance.php new file mode 100755 index 0000000..95f7f22 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeInstance.php @@ -0,0 +1,138 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'sid' => $sid, ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return AnonymizeContext Context for this AnonymizeInstance + */ + protected function proxy(): AnonymizeContext + { + if (!$this->context) { + $this->context = new AnonymizeContext( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Update the AnonymizeInstance + * + * @return AnonymizeInstance Updated AnonymizeInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(): AnonymizeInstance + { + + return $this->proxy()->update(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.AnonymizeInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeList.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeList.php new file mode 100755 index 0000000..e9d0420 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizeList.php @@ -0,0 +1,73 @@ +solution = [ + 'roomSid' => + $roomSid, + + 'sid' => + $sid, + + ]; + } + + /** + * Constructs a AnonymizeContext + */ + public function getContext( + + ): AnonymizeContext + { + return new AnonymizeContext( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.AnonymizeList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizePage.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizePage.php new file mode 100755 index 0000000..3eb1cd5 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/AnonymizePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return AnonymizeInstance \Twilio\Rest\Video\V1\Room\Participant\AnonymizeInstance + */ + public function buildInstance(array $payload): AnonymizeInstance + { + return new AnonymizeInstance($this->version, $payload, $this->solution['roomSid'], $this->solution['sid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.AnonymizePage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackContext.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackContext.php new file mode 100755 index 0000000..b5c55e2 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackContext.php @@ -0,0 +1,93 @@ +solution = [ + 'roomSid' => + $roomSid, + 'participantSid' => + $participantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/PublishedTracks/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the PublishedTrackInstance + * + * @return PublishedTrackInstance Fetched PublishedTrackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PublishedTrackInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new PublishedTrackInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.PublishedTrackContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackInstance.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackInstance.php new file mode 100755 index 0000000..a057cb2 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackInstance.php @@ -0,0 +1,136 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'name' => Values::array_get($payload, 'name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'enabled' => Values::array_get($payload, 'enabled'), + 'kind' => Values::array_get($payload, 'kind'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'participantSid' => $participantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return PublishedTrackContext Context for this PublishedTrackInstance + */ + protected function proxy(): PublishedTrackContext + { + if (!$this->context) { + $this->context = new PublishedTrackContext( + $this->version, + $this->solution['roomSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the PublishedTrackInstance + * + * @return PublishedTrackInstance Fetched PublishedTrackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): PublishedTrackInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.PublishedTrackInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackList.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackList.php new file mode 100755 index 0000000..c008d60 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackList.php @@ -0,0 +1,175 @@ +solution = [ + 'roomSid' => + $roomSid, + + 'participantSid' => + $participantSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/PublishedTracks'; + } + + /** + * Reads PublishedTrackInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return PublishedTrackInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams PublishedTrackInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of PublishedTrackInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return PublishedTrackPage Page of PublishedTrackInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): PublishedTrackPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new PublishedTrackPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of PublishedTrackInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return PublishedTrackPage Page of PublishedTrackInstance + */ + public function getPage(string $targetUrl): PublishedTrackPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new PublishedTrackPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a PublishedTrackContext + * + * @param string $sid The SID of the RoomParticipantPublishedTrack resource to fetch. + */ + public function getContext( + string $sid + + ): PublishedTrackContext + { + return new PublishedTrackContext( + $this->version, + $this->solution['roomSid'], + $this->solution['participantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.PublishedTrackList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackPage.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackPage.php new file mode 100755 index 0000000..d19fd1e --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/PublishedTrackPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return PublishedTrackInstance \Twilio\Rest\Video\V1\Room\Participant\PublishedTrackInstance + */ + public function buildInstance(array $payload): PublishedTrackInstance + { + return new PublishedTrackInstance($this->version, $payload, $this->solution['roomSid'], $this->solution['participantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.PublishedTrackPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesInstance.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesInstance.php new file mode 100755 index 0000000..5a0de4d --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesInstance.php @@ -0,0 +1,91 @@ +properties = [ + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'rules' => Values::array_get($payload, 'rules'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['roomSid' => $roomSid, 'participantSid' => $participantSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.SubscribeRulesInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesList.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesList.php new file mode 100755 index 0000000..d2bbd7e --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesList.php @@ -0,0 +1,115 @@ +solution = [ + 'roomSid' => + $roomSid, + + 'participantSid' => + $participantSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/SubscribeRules'; + } + + /** + * Fetch the SubscribeRulesInstance + * + * @return SubscribeRulesInstance Fetched SubscribeRulesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscribeRulesInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SubscribeRulesInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['participantSid'] + ); + } + + + /** + * Update the SubscribeRulesInstance + * + * @param array|Options $options Optional Arguments + * @return SubscribeRulesInstance Updated SubscribeRulesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SubscribeRulesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Rules' => + Serialize::jsonObject($options['rules']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SubscribeRulesInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['participantSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.SubscribeRulesList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesOptions.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesOptions.php new file mode 100755 index 0000000..b8d7cb5 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesOptions.php @@ -0,0 +1,78 @@ +options['rules'] = $rules; + } + + /** + * A JSON-encoded array of subscribe rules. See the [Specifying Subscribe Rules](https://www.twilio.com/docs/video/api/track-subscriptions#specifying-sr) section for further information. + * + * @param array $rules A JSON-encoded array of subscribe rules. See the [Specifying Subscribe Rules](https://www.twilio.com/docs/video/api/track-subscriptions#specifying-sr) section for further information. + * @return $this Fluent Builder + */ + public function setRules(array $rules): self + { + $this->options['rules'] = $rules; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.UpdateSubscribeRulesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesPage.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesPage.php new file mode 100755 index 0000000..e52f7cf --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribeRulesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SubscribeRulesInstance \Twilio\Rest\Video\V1\Room\Participant\SubscribeRulesInstance + */ + public function buildInstance(array $payload): SubscribeRulesInstance + { + return new SubscribeRulesInstance($this->version, $payload, $this->solution['roomSid'], $this->solution['participantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.SubscribeRulesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackContext.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackContext.php new file mode 100755 index 0000000..7db1440 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackContext.php @@ -0,0 +1,93 @@ +solution = [ + 'roomSid' => + $roomSid, + 'participantSid' => + $participantSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/SubscribedTracks/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the SubscribedTrackInstance + * + * @return SubscribedTrackInstance Fetched SubscribedTrackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscribedTrackInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SubscribedTrackInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.SubscribedTrackContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackInstance.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackInstance.php new file mode 100755 index 0000000..0b2a0b3 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackInstance.php @@ -0,0 +1,138 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'participantSid' => Values::array_get($payload, 'participant_sid'), + 'publisherSid' => Values::array_get($payload, 'publisher_sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'name' => Values::array_get($payload, 'name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'enabled' => Values::array_get($payload, 'enabled'), + 'kind' => Values::array_get($payload, 'kind'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'participantSid' => $participantSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SubscribedTrackContext Context for this SubscribedTrackInstance + */ + protected function proxy(): SubscribedTrackContext + { + if (!$this->context) { + $this->context = new SubscribedTrackContext( + $this->version, + $this->solution['roomSid'], + $this->solution['participantSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the SubscribedTrackInstance + * + * @return SubscribedTrackInstance Fetched SubscribedTrackInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SubscribedTrackInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.SubscribedTrackInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackList.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackList.php new file mode 100755 index 0000000..41da244 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackList.php @@ -0,0 +1,175 @@ +solution = [ + 'roomSid' => + $roomSid, + + 'participantSid' => + $participantSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($participantSid) + .'/SubscribedTracks'; + } + + /** + * Reads SubscribedTrackInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SubscribedTrackInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SubscribedTrackInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SubscribedTrackInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SubscribedTrackPage Page of SubscribedTrackInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SubscribedTrackPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SubscribedTrackPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SubscribedTrackInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SubscribedTrackPage Page of SubscribedTrackInstance + */ + public function getPage(string $targetUrl): SubscribedTrackPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SubscribedTrackPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SubscribedTrackContext + * + * @param string $sid The SID of the RoomParticipantSubscribedTrack resource to fetch. + */ + public function getContext( + string $sid + + ): SubscribedTrackContext + { + return new SubscribedTrackContext( + $this->version, + $this->solution['roomSid'], + $this->solution['participantSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.SubscribedTrackList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackPage.php b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackPage.php new file mode 100755 index 0000000..422d9d0 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/Participant/SubscribedTrackPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SubscribedTrackInstance \Twilio\Rest\Video\V1\Room\Participant\SubscribedTrackInstance + */ + public function buildInstance(array $payload): SubscribedTrackInstance + { + return new SubscribedTrackInstance($this->version, $payload, $this->solution['roomSid'], $this->solution['participantSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.SubscribedTrackPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/ParticipantContext.php b/app/api/Twilio/Rest/Video/V1/Room/ParticipantContext.php new file mode 100755 index 0000000..5eb271d --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/ParticipantContext.php @@ -0,0 +1,235 @@ +solution = [ + 'roomSid' => + $roomSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Status' => + $options['status'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ParticipantInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + + /** + * Access the subscribeRules + */ + protected function getSubscribeRules(): SubscribeRulesList + { + if (!$this->_subscribeRules) { + $this->_subscribeRules = new SubscribeRulesList( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->_subscribeRules; + } + + /** + * Access the subscribedTracks + */ + protected function getSubscribedTracks(): SubscribedTrackList + { + if (!$this->_subscribedTracks) { + $this->_subscribedTracks = new SubscribedTrackList( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->_subscribedTracks; + } + + /** + * Access the publishedTracks + */ + protected function getPublishedTracks(): PublishedTrackList + { + if (!$this->_publishedTracks) { + $this->_publishedTracks = new PublishedTrackList( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->_publishedTracks; + } + + /** + * Access the anonymize + */ + protected function getAnonymize(): AnonymizeList + { + if (!$this->_anonymize) { + $this->_anonymize = new AnonymizeList( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->_anonymize; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.ParticipantContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/ParticipantInstance.php b/app/api/Twilio/Rest/Video/V1/Room/ParticipantInstance.php new file mode 100755 index 0000000..4057e4b --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/ParticipantInstance.php @@ -0,0 +1,195 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'identity' => Values::array_get($payload, 'identity'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'startTime' => Deserialize::dateTime(Values::array_get($payload, 'start_time')), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ParticipantContext Context for this ParticipantInstance + */ + protected function proxy(): ParticipantContext + { + if (!$this->context) { + $this->context = new ParticipantContext( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the ParticipantInstance + * + * @return ParticipantInstance Fetched ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ParticipantInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ParticipantInstance + * + * @param array|Options $options Optional Arguments + * @return ParticipantInstance Updated ParticipantInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ParticipantInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the subscribeRules + */ + protected function getSubscribeRules(): SubscribeRulesList + { + return $this->proxy()->subscribeRules; + } + + /** + * Access the subscribedTracks + */ + protected function getSubscribedTracks(): SubscribedTrackList + { + return $this->proxy()->subscribedTracks; + } + + /** + * Access the publishedTracks + */ + protected function getPublishedTracks(): PublishedTrackList + { + return $this->proxy()->publishedTracks; + } + + /** + * Access the anonymize + */ + protected function getAnonymize(): AnonymizeList + { + return $this->proxy()->anonymize; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.ParticipantInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/ParticipantList.php b/app/api/Twilio/Rest/Video/V1/Room/ParticipantList.php new file mode 100755 index 0000000..95a63fd --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/ParticipantList.php @@ -0,0 +1,182 @@ +solution = [ + 'roomSid' => + $roomSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Participants'; + } + + /** + * Reads ParticipantInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ParticipantInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams ParticipantInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ParticipantPage Page of ParticipantInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ParticipantPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'Identity' => + $options['identity'], + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ParticipantInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ParticipantPage Page of ParticipantInstance + */ + public function getPage(string $targetUrl): ParticipantPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ParticipantPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ParticipantContext + * + * @param string $sid The SID of the RoomParticipant resource to fetch. + */ + public function getContext( + string $sid + + ): ParticipantContext + { + return new ParticipantContext( + $this->version, + $this->solution['roomSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.ParticipantList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/ParticipantOptions.php b/app/api/Twilio/Rest/Video/V1/Room/ParticipantOptions.php new file mode 100755 index 0000000..4fb1f33 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/ParticipantOptions.php @@ -0,0 +1,182 @@ +options['status'] = $status; + $this->options['identity'] = $identity; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + } + + /** + * Read only the participants with this status. Can be: `connected` or `disconnected`. For `in-progress` Rooms the default Status is `connected`, for `completed` Rooms only `disconnected` Participants are returned. + * + * @param string $status Read only the participants with this status. Can be: `connected` or `disconnected`. For `in-progress` Rooms the default Status is `connected`, for `completed` Rooms only `disconnected` Participants are returned. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Read only the Participants with this [User](https://www.twilio.com/docs/chat/rest/user-resource) `identity` value. + * + * @param string $identity Read only the Participants with this [User](https://www.twilio.com/docs/chat/rest/user-resource) `identity` value. + * @return $this Fluent Builder + */ + public function setIdentity(string $identity): self + { + $this->options['identity'] = $identity; + return $this; + } + + /** + * Read only Participants that started after this date in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#UTC) format. + * + * @param \DateTime $dateCreatedAfter Read only Participants that started after this date in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#UTC) format. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only Participants that started before this date in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#UTC) format. + * + * @param \DateTime $dateCreatedBefore Read only Participants that started before this date in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#UTC) format. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadParticipantOptions ' . $options . ']'; + } +} + +class UpdateParticipantOptions extends Options + { + /** + * @param string $status + */ + public function __construct( + + string $status = Values::NONE + + ) { + $this->options['status'] = $status; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.UpdateParticipantOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/ParticipantPage.php b/app/api/Twilio/Rest/Video/V1/Room/ParticipantPage.php new file mode 100755 index 0000000..91ad1d1 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/ParticipantPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ParticipantInstance \Twilio\Rest\Video\V1\Room\ParticipantInstance + */ + public function buildInstance(array $payload): ParticipantInstance + { + return new ParticipantInstance($this->version, $payload, $this->solution['roomSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.ParticipantPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesInstance.php b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesInstance.php new file mode 100755 index 0000000..fd7665b --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesInstance.php @@ -0,0 +1,88 @@ +properties = [ + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'rules' => Values::array_get($payload, 'rules'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + ]; + + $this->solution = ['roomSid' => $roomSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingRulesInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesList.php b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesList.php new file mode 100755 index 0000000..b22f503 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesList.php @@ -0,0 +1,107 @@ +solution = [ + 'roomSid' => + $roomSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/RecordingRules'; + } + + /** + * Fetch the RecordingRulesInstance + * + * @return RecordingRulesInstance Fetched RecordingRulesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RecordingRulesInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RecordingRulesInstance( + $this->version, + $payload, + $this->solution['roomSid'] + ); + } + + + /** + * Update the RecordingRulesInstance + * + * @param array|Options $options Optional Arguments + * @return RecordingRulesInstance Updated RecordingRulesInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RecordingRulesInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Rules' => + Serialize::jsonObject($options['rules']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RecordingRulesInstance( + $this->version, + $payload, + $this->solution['roomSid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingRulesList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesOptions.php b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesOptions.php new file mode 100755 index 0000000..f9f020e --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesOptions.php @@ -0,0 +1,78 @@ +options['rules'] = $rules; + } + + /** + * A JSON-encoded array of recording rules. + * + * @param array $rules A JSON-encoded array of recording rules. + * @return $this Fluent Builder + */ + public function setRules(array $rules): self + { + $this->options['rules'] = $rules; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.UpdateRecordingRulesOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesPage.php b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesPage.php new file mode 100755 index 0000000..ec52eec --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RecordingRulesPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RecordingRulesInstance \Twilio\Rest\Video\V1\Room\RecordingRulesInstance + */ + public function buildInstance(array $payload): RecordingRulesInstance + { + return new RecordingRulesInstance($this->version, $payload, $this->solution['roomSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RecordingRulesPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingContext.php b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingContext.php new file mode 100755 index 0000000..6535a9f --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingContext.php @@ -0,0 +1,100 @@ +solution = [ + 'roomSid' => + $roomSid, + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Recordings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RoomRecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RoomRecordingInstance + * + * @return RoomRecordingInstance Fetched RoomRecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomRecordingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoomRecordingInstance( + $this->version, + $payload, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RoomRecordingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingInstance.php b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingInstance.php new file mode 100755 index 0000000..153f821 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingInstance.php @@ -0,0 +1,162 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'sid' => Values::array_get($payload, 'sid'), + 'sourceSid' => Values::array_get($payload, 'source_sid'), + 'size' => Values::array_get($payload, 'size'), + 'url' => Values::array_get($payload, 'url'), + 'type' => Values::array_get($payload, 'type'), + 'duration' => Values::array_get($payload, 'duration'), + 'containerFormat' => Values::array_get($payload, 'container_format'), + 'codec' => Values::array_get($payload, 'codec'), + 'groupingSids' => Values::array_get($payload, 'grouping_sids'), + 'trackName' => Values::array_get($payload, 'track_name'), + 'offset' => Values::array_get($payload, 'offset'), + 'mediaExternalLocation' => Values::array_get($payload, 'media_external_location'), + 'roomSid' => Values::array_get($payload, 'room_sid'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['roomSid' => $roomSid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoomRecordingContext Context for this RoomRecordingInstance + */ + protected function proxy(): RoomRecordingContext + { + if (!$this->context) { + $this->context = new RoomRecordingContext( + $this->version, + $this->solution['roomSid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RoomRecordingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RoomRecordingInstance + * + * @return RoomRecordingInstance Fetched RoomRecordingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomRecordingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RoomRecordingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingList.php b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingList.php new file mode 100755 index 0000000..0ecbe73 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingList.php @@ -0,0 +1,182 @@ +solution = [ + 'roomSid' => + $roomSid, + + ]; + + $this->uri = '/Rooms/' . \rawurlencode($roomSid) + .'/Recordings'; + } + + /** + * Reads RoomRecordingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoomRecordingInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RoomRecordingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoomRecordingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RoomRecordingPage Page of RoomRecordingInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RoomRecordingPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'SourceSid' => + $options['sourceSid'], + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RoomRecordingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoomRecordingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RoomRecordingPage Page of RoomRecordingInstance + */ + public function getPage(string $targetUrl): RoomRecordingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RoomRecordingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoomRecordingContext + * + * @param string $sid The SID of the RoomRecording resource to delete. + */ + public function getContext( + string $sid + + ): RoomRecordingContext + { + return new RoomRecordingContext( + $this->version, + $this->solution['roomSid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RoomRecordingList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingOptions.php b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingOptions.php new file mode 100755 index 0000000..1934c37 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingOptions.php @@ -0,0 +1,134 @@ +options['status'] = $status; + $this->options['sourceSid'] = $sourceSid; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + } + + /** + * Read only the recordings with this status. Can be: `processing`, `completed`, or `deleted`. + * + * @param string $status Read only the recordings with this status. Can be: `processing`, `completed`, or `deleted`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Read only the recordings that have this `source_sid`. + * + * @param string $sourceSid Read only the recordings that have this `source_sid`. + * @return $this Fluent Builder + */ + public function setSourceSid(string $sourceSid): self + { + $this->options['sourceSid'] = $sourceSid; + return $this; + } + + /** + * Read only recordings that started on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * + * @param \DateTime $dateCreatedAfter Read only recordings that started on or after this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only Recordings that started before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * + * @param \DateTime $dateCreatedBefore Read only Recordings that started before this [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime with time zone. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadRoomRecordingOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingPage.php b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingPage.php new file mode 100755 index 0000000..38f1b01 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/Room/RoomRecordingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoomRecordingInstance \Twilio\Rest\Video\V1\Room\RoomRecordingInstance + */ + public function buildInstance(array $payload): RoomRecordingInstance + { + return new RoomRecordingInstance($this->version, $payload, $this->solution['roomSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RoomRecordingPage]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RoomContext.php b/app/api/Twilio/Rest/Video/V1/RoomContext.php new file mode 100755 index 0000000..9a1140c --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RoomContext.php @@ -0,0 +1,202 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Rooms/' . \rawurlencode($sid) + .''; + } + + /** + * Fetch the RoomInstance + * + * @return RoomInstance Fetched RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RoomInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the RoomInstance + * + * @param string $status + * @return RoomInstance Updated RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): RoomInstance + { + + $data = Values::of([ + 'Status' => + $status, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RoomInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the recordingRules + */ + protected function getRecordingRules(): RecordingRulesList + { + if (!$this->_recordingRules) { + $this->_recordingRules = new RecordingRulesList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_recordingRules; + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + if (!$this->_participants) { + $this->_participants = new ParticipantList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_participants; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RoomRecordingList + { + if (!$this->_recordings) { + $this->_recordings = new RoomRecordingList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_recordings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RoomContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RoomInstance.php b/app/api/Twilio/Rest/Video/V1/RoomInstance.php new file mode 100755 index 0000000..7c30f39 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RoomInstance.php @@ -0,0 +1,206 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'status' => Values::array_get($payload, 'status'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'enableTurn' => Values::array_get($payload, 'enable_turn'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'statusCallback' => Values::array_get($payload, 'status_callback'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'endTime' => Deserialize::dateTime(Values::array_get($payload, 'end_time')), + 'duration' => Values::array_get($payload, 'duration'), + 'type' => Values::array_get($payload, 'type'), + 'maxParticipants' => Values::array_get($payload, 'max_participants'), + 'maxParticipantDuration' => Values::array_get($payload, 'max_participant_duration'), + 'maxConcurrentPublishedTracks' => Values::array_get($payload, 'max_concurrent_published_tracks'), + 'recordParticipantsOnConnect' => Values::array_get($payload, 'record_participants_on_connect'), + 'videoCodecs' => Values::array_get($payload, 'video_codecs'), + 'mediaRegion' => Values::array_get($payload, 'media_region'), + 'audioOnly' => Values::array_get($payload, 'audio_only'), + 'emptyRoomTimeout' => Values::array_get($payload, 'empty_room_timeout'), + 'unusedRoomTimeout' => Values::array_get($payload, 'unused_room_timeout'), + 'largeRoom' => Values::array_get($payload, 'large_room'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RoomContext Context for this RoomInstance + */ + protected function proxy(): RoomContext + { + if (!$this->context) { + $this->context = new RoomContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Fetch the RoomInstance + * + * @return RoomInstance Fetched RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RoomInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RoomInstance + * + * @param string $status + * @return RoomInstance Updated RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $status): RoomInstance + { + + return $this->proxy()->update($status); + } + + /** + * Access the recordingRules + */ + protected function getRecordingRules(): RecordingRulesList + { + return $this->proxy()->recordingRules; + } + + /** + * Access the participants + */ + protected function getParticipants(): ParticipantList + { + return $this->proxy()->participants; + } + + /** + * Access the recordings + */ + protected function getRecordings(): RoomRecordingList + { + return $this->proxy()->recordings; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Video.V1.RoomInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Video/V1/RoomList.php b/app/api/Twilio/Rest/Video/V1/RoomList.php new file mode 100755 index 0000000..b505f8a --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RoomList.php @@ -0,0 +1,230 @@ +solution = [ + ]; + + $this->uri = '/Rooms'; + } + + /** + * Create the RoomInstance + * + * @param array|Options $options Optional Arguments + * @return RoomInstance Created RoomInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): RoomInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'EnableTurn' => + Serialize::booleanToString($options['enableTurn']), + 'Type' => + $options['type'], + 'UniqueName' => + $options['uniqueName'], + 'StatusCallback' => + $options['statusCallback'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'MaxParticipants' => + $options['maxParticipants'], + 'RecordParticipantsOnConnect' => + Serialize::booleanToString($options['recordParticipantsOnConnect']), + 'VideoCodecs' => + $options['videoCodecs'], + 'MediaRegion' => + $options['mediaRegion'], + 'RecordingRules' => + Serialize::jsonObject($options['recordingRules']), + 'AudioOnly' => + Serialize::booleanToString($options['audioOnly']), + 'MaxParticipantDuration' => + $options['maxParticipantDuration'], + 'EmptyRoomTimeout' => + $options['emptyRoomTimeout'], + 'UnusedRoomTimeout' => + $options['unusedRoomTimeout'], + 'LargeRoom' => + Serialize::booleanToString($options['largeRoom']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RoomInstance( + $this->version, + $payload + ); + } + + + /** + * Reads RoomInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RoomInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams RoomInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RoomInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RoomPage Page of RoomInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RoomPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'UniqueName' => + $options['uniqueName'], + 'DateCreatedAfter' => + Serialize::iso8601DateTime($options['dateCreatedAfter']), + 'DateCreatedBefore' => + Serialize::iso8601DateTime($options['dateCreatedBefore']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RoomPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RoomInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RoomPage Page of RoomInstance + */ + public function getPage(string $targetUrl): RoomPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RoomPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RoomContext + * + * @param string $sid The SID of the Room resource to fetch. + */ + public function getContext( + string $sid + + ): RoomContext + { + return new RoomContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RoomList]'; + } +} diff --git a/app/api/Twilio/Rest/Video/V1/RoomOptions.php b/app/api/Twilio/Rest/Video/V1/RoomOptions.php new file mode 100755 index 0000000..c32f866 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RoomOptions.php @@ -0,0 +1,436 @@ +options['enableTurn'] = $enableTurn; + $this->options['type'] = $type; + $this->options['uniqueName'] = $uniqueName; + $this->options['statusCallback'] = $statusCallback; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['maxParticipants'] = $maxParticipants; + $this->options['recordParticipantsOnConnect'] = $recordParticipantsOnConnect; + $this->options['videoCodecs'] = $videoCodecs; + $this->options['mediaRegion'] = $mediaRegion; + $this->options['recordingRules'] = $recordingRules; + $this->options['audioOnly'] = $audioOnly; + $this->options['maxParticipantDuration'] = $maxParticipantDuration; + $this->options['emptyRoomTimeout'] = $emptyRoomTimeout; + $this->options['unusedRoomTimeout'] = $unusedRoomTimeout; + $this->options['largeRoom'] = $largeRoom; + } + + /** + * Deprecated, now always considered to be true. + * + * @param bool $enableTurn Deprecated, now always considered to be true. + * @return $this Fluent Builder + */ + public function setEnableTurn(bool $enableTurn): self + { + $this->options['enableTurn'] = $enableTurn; + return $this; + } + + /** + * @param string $type + * @return $this Fluent Builder + */ + public function setType(string $type): self + { + $this->options['type'] = $type; + return $this; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used as a `room_sid` in place of the resource's `sid` in the URL to address the resource, assuming it does not contain any [reserved characters](https://tools.ietf.org/html/rfc3986#section-2.2) that would need to be URL encoded. This value is unique for `in-progress` rooms. SDK clients can use this name to connect to the room. REST API clients can use this name in place of the Room SID to interact with the room as long as the room is `in-progress`. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used as a `room_sid` in place of the resource's `sid` in the URL to address the resource, assuming it does not contain any [reserved characters](https://tools.ietf.org/html/rfc3986#section-2.2) that would need to be URL encoded. This value is unique for `in-progress` rooms. SDK clients can use this name to connect to the room. REST API clients can use this name in place of the Room SID to interact with the room as long as the room is `in-progress`. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The URL we should call using the `status_callback_method` to send status information to your application on every room event. See [Status Callbacks](https://www.twilio.com/docs/video/api/status-callbacks) for more info. + * + * @param string $statusCallback The URL we should call using the `status_callback_method` to send status information to your application on every room event. See [Status Callbacks](https://www.twilio.com/docs/video/api/status-callbacks) for more info. + * @return $this Fluent Builder + */ + public function setStatusCallback(string $statusCallback): self + { + $this->options['statusCallback'] = $statusCallback; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback`. Can be `POST` or `GET`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback`. Can be `POST` or `GET`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * The maximum number of concurrent Participants allowed in the room. Peer-to-peer rooms can have up to 10 Participants. Small Group rooms can have up to 4 Participants. Group rooms can have up to 50 Participants. + * + * @param int $maxParticipants The maximum number of concurrent Participants allowed in the room. Peer-to-peer rooms can have up to 10 Participants. Small Group rooms can have up to 4 Participants. Group rooms can have up to 50 Participants. + * @return $this Fluent Builder + */ + public function setMaxParticipants(int $maxParticipants): self + { + $this->options['maxParticipants'] = $maxParticipants; + return $this; + } + + /** + * Whether to start recording when Participants connect. ***This feature is not available in `peer-to-peer` rooms.*** + * + * @param bool $recordParticipantsOnConnect Whether to start recording when Participants connect. ***This feature is not available in `peer-to-peer` rooms.*** + * @return $this Fluent Builder + */ + public function setRecordParticipantsOnConnect(bool $recordParticipantsOnConnect): self + { + $this->options['recordParticipantsOnConnect'] = $recordParticipantsOnConnect; + return $this; + } + + /** + * An array of the video codecs that are supported when publishing a track in the room. Can be: `VP8` and `H264`. ***This feature is not available in `peer-to-peer` rooms*** + * + * @param string $videoCodecs An array of the video codecs that are supported when publishing a track in the room. Can be: `VP8` and `H264`. ***This feature is not available in `peer-to-peer` rooms*** + * @return $this Fluent Builder + */ + public function setVideoCodecs(array $videoCodecs): self + { + $this->options['videoCodecs'] = $videoCodecs; + return $this; + } + + /** + * The region for the media server in Group Rooms. Can be: one of the [available Media Regions](https://www.twilio.com/docs/video/ip-address-whitelisting#group-rooms-media-servers). ***This feature is not available in `peer-to-peer` rooms.*** + * + * @param string $mediaRegion The region for the media server in Group Rooms. Can be: one of the [available Media Regions](https://www.twilio.com/docs/video/ip-address-whitelisting#group-rooms-media-servers). ***This feature is not available in `peer-to-peer` rooms.*** + * @return $this Fluent Builder + */ + public function setMediaRegion(string $mediaRegion): self + { + $this->options['mediaRegion'] = $mediaRegion; + return $this; + } + + /** + * A collection of Recording Rules that describe how to include or exclude matching tracks for recording + * + * @param array $recordingRules A collection of Recording Rules that describe how to include or exclude matching tracks for recording + * @return $this Fluent Builder + */ + public function setRecordingRules(array $recordingRules): self + { + $this->options['recordingRules'] = $recordingRules; + return $this; + } + + /** + * When set to true, indicates that the participants in the room will only publish audio. No video tracks will be allowed. Group rooms only. + * + * @param bool $audioOnly When set to true, indicates that the participants in the room will only publish audio. No video tracks will be allowed. Group rooms only. + * @return $this Fluent Builder + */ + public function setAudioOnly(bool $audioOnly): self + { + $this->options['audioOnly'] = $audioOnly; + return $this; + } + + /** + * The maximum number of seconds a Participant can be connected to the room. The maximum possible value is 86400 seconds (24 hours). The default is 14400 seconds (4 hours). + * + * @param int $maxParticipantDuration The maximum number of seconds a Participant can be connected to the room. The maximum possible value is 86400 seconds (24 hours). The default is 14400 seconds (4 hours). + * @return $this Fluent Builder + */ + public function setMaxParticipantDuration(int $maxParticipantDuration): self + { + $this->options['maxParticipantDuration'] = $maxParticipantDuration; + return $this; + } + + /** + * Configures how long (in minutes) a room will remain active after last participant leaves. Valid values range from 1 to 60 minutes (no fractions). + * + * @param int $emptyRoomTimeout Configures how long (in minutes) a room will remain active after last participant leaves. Valid values range from 1 to 60 minutes (no fractions). + * @return $this Fluent Builder + */ + public function setEmptyRoomTimeout(int $emptyRoomTimeout): self + { + $this->options['emptyRoomTimeout'] = $emptyRoomTimeout; + return $this; + } + + /** + * Configures how long (in minutes) a room will remain active if no one joins. Valid values range from 1 to 60 minutes (no fractions). + * + * @param int $unusedRoomTimeout Configures how long (in minutes) a room will remain active if no one joins. Valid values range from 1 to 60 minutes (no fractions). + * @return $this Fluent Builder + */ + public function setUnusedRoomTimeout(int $unusedRoomTimeout): self + { + $this->options['unusedRoomTimeout'] = $unusedRoomTimeout; + return $this; + } + + /** + * When set to true, indicated that this is the large room. + * + * @param bool $largeRoom When set to true, indicated that this is the large room. + * @return $this Fluent Builder + */ + public function setLargeRoom(bool $largeRoom): self + { + $this->options['largeRoom'] = $largeRoom; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.CreateRoomOptions ' . $options . ']'; + } +} + + +class ReadRoomOptions extends Options + { + /** + * @param string $status Read only the rooms with this status. Can be: `in-progress` (default) or `completed` + * @param string $uniqueName Read only rooms with the this `unique_name`. + * @param \DateTime $dateCreatedAfter Read only rooms that started on or after this date, given as `YYYY-MM-DD`. + * @param \DateTime $dateCreatedBefore Read only rooms that started before this date, given as `YYYY-MM-DD`. + */ + public function __construct( + + string $status = Values::NONE, + string $uniqueName = Values::NONE, + \DateTime $dateCreatedAfter = null, + \DateTime $dateCreatedBefore = null + + ) { + $this->options['status'] = $status; + $this->options['uniqueName'] = $uniqueName; + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + } + + /** + * Read only the rooms with this status. Can be: `in-progress` (default) or `completed` + * + * @param string $status Read only the rooms with this status. Can be: `in-progress` (default) or `completed` + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Read only rooms with the this `unique_name`. + * + * @param string $uniqueName Read only rooms with the this `unique_name`. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * Read only rooms that started on or after this date, given as `YYYY-MM-DD`. + * + * @param \DateTime $dateCreatedAfter Read only rooms that started on or after this date, given as `YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateCreatedAfter(\DateTime $dateCreatedAfter): self + { + $this->options['dateCreatedAfter'] = $dateCreatedAfter; + return $this; + } + + /** + * Read only rooms that started before this date, given as `YYYY-MM-DD`. + * + * @param \DateTime $dateCreatedBefore Read only rooms that started before this date, given as `YYYY-MM-DD`. + * @return $this Fluent Builder + */ + public function setDateCreatedBefore(\DateTime $dateCreatedBefore): self + { + $this->options['dateCreatedBefore'] = $dateCreatedBefore; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Video.V1.ReadRoomOptions ' . $options . ']'; + } +} + + diff --git a/app/api/Twilio/Rest/Video/V1/RoomPage.php b/app/api/Twilio/Rest/Video/V1/RoomPage.php new file mode 100755 index 0000000..55675f7 --- /dev/null +++ b/app/api/Twilio/Rest/Video/V1/RoomPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RoomInstance \Twilio\Rest\Video\V1\RoomInstance + */ + public function buildInstance(array $payload): RoomInstance + { + return new RoomInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Video.V1.RoomPage]'; + } +} diff --git a/app/api/Twilio/Rest/VideoBase.php b/app/api/Twilio/Rest/VideoBase.php new file mode 100755 index 0000000..cde0c39 --- /dev/null +++ b/app/api/Twilio/Rest/VideoBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://video.twilio.com'; + } + + + /** + * @return V1 Version v1 of video + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Video]'; + } +} diff --git a/app/api/Twilio/Rest/Voice.php b/app/api/Twilio/Rest/Voice.php new file mode 100755 index 0000000..855afc9 --- /dev/null +++ b/app/api/Twilio/Rest/Voice.php @@ -0,0 +1,101 @@ +archivedCalls instead. + */ + protected function getArchivedCalls(): \Twilio\Rest\Voice\V1\ArchivedCallList { + echo "archivedCalls is deprecated. Use v1->archivedCalls instead."; + return $this->v1->archivedCalls; + } + + /** + * @deprecated Use v1->archivedCalls(\$date, \$sid) instead. + * @param \DateTime $date The date of the Call in UTC. + * @param string $sid The unique string that identifies this resource + */ + protected function contextArchivedCalls(\DateTime $date, string $sid): \Twilio\Rest\Voice\V1\ArchivedCallContext { + echo "archivedCalls(\$date, \$sid) is deprecated. Use v1->archivedCalls(\$date, \$sid) instead."; + return $this->v1->archivedCalls($date, $sid); + } + + /** + * @deprecated Use v1->byocTrunks instead. + */ + protected function getByocTrunks(): \Twilio\Rest\Voice\V1\ByocTrunkList { + echo "byocTrunks is deprecated. Use v1->byocTrunks instead."; + return $this->v1->byocTrunks; + } + + /** + * @deprecated Use v1->byocTrunks(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextByocTrunks(string $sid): \Twilio\Rest\Voice\V1\ByocTrunkContext { + echo "byocTrunks(\$sid) is deprecated. Use v1->byocTrunks(\$sid) instead."; + return $this->v1->byocTrunks($sid); + } + + /** + * @deprecated Use v1->connectionPolicies instead. + */ + protected function getConnectionPolicies(): \Twilio\Rest\Voice\V1\ConnectionPolicyList { + echo "connectionPolicies is deprecated. Use v1->connectionPolicies instead."; + return $this->v1->connectionPolicies; + } + + /** + * @deprecated Use v1->connectionPolicies(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextConnectionPolicies(string $sid): \Twilio\Rest\Voice\V1\ConnectionPolicyContext { + echo "connectionPolicies(\$sid) is deprecated. Use v1->connectionPolicies(\$sid) instead."; + return $this->v1->connectionPolicies($sid); + } + + /** + * @deprecated Use v1->dialingPermissions instead. + */ + protected function getDialingPermissions(): \Twilio\Rest\Voice\V1\DialingPermissionsList { + echo "dialingPermissions is deprecated. Use v1->dialingPermissions instead."; + return $this->v1->dialingPermissions; + } + + /** + * @deprecated Use v1->ipRecords instead. + */ + protected function getIpRecords(): \Twilio\Rest\Voice\V1\IpRecordList { + echo "ipRecords is deprecated. Use v1->ipRecords instead."; + return $this->v1->ipRecords; + } + + /** + * @deprecated Use v1->ipRecords(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextIpRecords(string $sid): \Twilio\Rest\Voice\V1\IpRecordContext { + echo "ipRecords(\$sid) is deprecated. Use v1->ipRecords(\$sid) instead."; + return $this->v1->ipRecords($sid); + } + + /** + * @deprecated Use v1->sourceIpMappings instead. + */ + protected function getSourceIpMappings(): \Twilio\Rest\Voice\V1\SourceIpMappingList { + echo "sourceIpMappings is deprecated. Use v1->sourceIpMappings instead."; + return $this->v1->sourceIpMappings; + } + + /** + * @deprecated Use v1->sourceIpMappings(\$sid) instead. + * @param string $sid The unique string that identifies the resource + */ + protected function contextSourceIpMappings(string $sid): \Twilio\Rest\Voice\V1\SourceIpMappingContext { + echo "sourceIpMappings(\$sid) is deprecated. Use v1->sourceIpMappings(\$sid) instead."; + return $this->v1->sourceIpMappings($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Voice/V1.php b/app/api/Twilio/Rest/Voice/V1.php new file mode 100755 index 0000000..4ecee2b --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1.php @@ -0,0 +1,154 @@ +version = 'v1'; + } + + protected function getArchivedCalls(): ArchivedCallList + { + if (!$this->_archivedCalls) { + $this->_archivedCalls = new ArchivedCallList($this); + } + return $this->_archivedCalls; + } + + protected function getByocTrunks(): ByocTrunkList + { + if (!$this->_byocTrunks) { + $this->_byocTrunks = new ByocTrunkList($this); + } + return $this->_byocTrunks; + } + + protected function getConnectionPolicies(): ConnectionPolicyList + { + if (!$this->_connectionPolicies) { + $this->_connectionPolicies = new ConnectionPolicyList($this); + } + return $this->_connectionPolicies; + } + + protected function getDialingPermissions(): DialingPermissionsList + { + if (!$this->_dialingPermissions) { + $this->_dialingPermissions = new DialingPermissionsList($this); + } + return $this->_dialingPermissions; + } + + protected function getIpRecords(): IpRecordList + { + if (!$this->_ipRecords) { + $this->_ipRecords = new IpRecordList($this); + } + return $this->_ipRecords; + } + + protected function getSourceIpMappings(): SourceIpMappingList + { + if (!$this->_sourceIpMappings) { + $this->_sourceIpMappings = new SourceIpMappingList($this); + } + return $this->_sourceIpMappings; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ArchivedCallContext.php b/app/api/Twilio/Rest/Voice/V1/ArchivedCallContext.php new file mode 100755 index 0000000..64b5bbd --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ArchivedCallContext.php @@ -0,0 +1,80 @@ +solution = [ + 'date' => + $date, + 'sid' => + $sid, + ]; + + $this->uri = '/Archives/' . \rawurlencode($date->format('Y-m-d')) + .'/Calls/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ArchivedCallInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ArchivedCallContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ArchivedCallInstance.php b/app/api/Twilio/Rest/Voice/V1/ArchivedCallInstance.php new file mode 100755 index 0000000..72f763c --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ArchivedCallInstance.php @@ -0,0 +1,108 @@ +solution = ['date' => $date ?: $this->properties['date'], 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ArchivedCallContext Context for this ArchivedCallInstance + */ + protected function proxy(): ArchivedCallContext + { + if (!$this->context) { + $this->context = new ArchivedCallContext( + $this->version, + $this->solution['date'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ArchivedCallInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ArchivedCallInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ArchivedCallList.php b/app/api/Twilio/Rest/Voice/V1/ArchivedCallList.php new file mode 100755 index 0000000..cd9b858 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ArchivedCallList.php @@ -0,0 +1,69 @@ +solution = [ + ]; + } + + /** + * Constructs a ArchivedCallContext + * + * @param \DateTime $date The date of the Call in UTC. + * + * @param string $sid The Twilio-provided Call SID that uniquely identifies the Call resource to delete + */ + public function getContext( + \DateTime $date + , string $sid + + ): ArchivedCallContext + { + return new ArchivedCallContext( + $this->version, + $date, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ArchivedCallList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ArchivedCallPage.php b/app/api/Twilio/Rest/Voice/V1/ArchivedCallPage.php new file mode 100755 index 0000000..dbc2301 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ArchivedCallPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ArchivedCallInstance \Twilio\Rest\Voice\V1\ArchivedCallInstance + */ + public function buildInstance(array $payload): ArchivedCallInstance + { + return new ArchivedCallInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ArchivedCallPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ByocTrunkContext.php b/app/api/Twilio/Rest/Voice/V1/ByocTrunkContext.php new file mode 100755 index 0000000..8295c1c --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ByocTrunkContext.php @@ -0,0 +1,142 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/ByocTrunks/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ByocTrunkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ByocTrunkInstance + * + * @return ByocTrunkInstance Fetched ByocTrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ByocTrunkInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ByocTrunkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ByocTrunkInstance + * + * @param array|Options $options Optional Arguments + * @return ByocTrunkInstance Updated ByocTrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ByocTrunkInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'VoiceUrl' => + $options['voiceUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'StatusCallbackUrl' => + $options['statusCallbackUrl'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'CnamLookupEnabled' => + Serialize::booleanToString($options['cnamLookupEnabled']), + 'ConnectionPolicySid' => + $options['connectionPolicySid'], + 'FromDomainSid' => + $options['fromDomainSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ByocTrunkInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ByocTrunkContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ByocTrunkInstance.php b/app/api/Twilio/Rest/Voice/V1/ByocTrunkInstance.php new file mode 100755 index 0000000..e8a2811 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ByocTrunkInstance.php @@ -0,0 +1,170 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'statusCallbackUrl' => Values::array_get($payload, 'status_callback_url'), + 'statusCallbackMethod' => Values::array_get($payload, 'status_callback_method'), + 'cnamLookupEnabled' => Values::array_get($payload, 'cnam_lookup_enabled'), + 'connectionPolicySid' => Values::array_get($payload, 'connection_policy_sid'), + 'fromDomainSid' => Values::array_get($payload, 'from_domain_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ByocTrunkContext Context for this ByocTrunkInstance + */ + protected function proxy(): ByocTrunkContext + { + if (!$this->context) { + $this->context = new ByocTrunkContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ByocTrunkInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ByocTrunkInstance + * + * @return ByocTrunkInstance Fetched ByocTrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ByocTrunkInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ByocTrunkInstance + * + * @param array|Options $options Optional Arguments + * @return ByocTrunkInstance Updated ByocTrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ByocTrunkInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ByocTrunkInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ByocTrunkList.php b/app/api/Twilio/Rest/Voice/V1/ByocTrunkList.php new file mode 100755 index 0000000..bc5b825 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ByocTrunkList.php @@ -0,0 +1,208 @@ +solution = [ + ]; + + $this->uri = '/ByocTrunks'; + } + + /** + * Create the ByocTrunkInstance + * + * @param array|Options $options Optional Arguments + * @return ByocTrunkInstance Created ByocTrunkInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ByocTrunkInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'VoiceUrl' => + $options['voiceUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'StatusCallbackUrl' => + $options['statusCallbackUrl'], + 'StatusCallbackMethod' => + $options['statusCallbackMethod'], + 'CnamLookupEnabled' => + Serialize::booleanToString($options['cnamLookupEnabled']), + 'ConnectionPolicySid' => + $options['connectionPolicySid'], + 'FromDomainSid' => + $options['fromDomainSid'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ByocTrunkInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ByocTrunkInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ByocTrunkInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ByocTrunkInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ByocTrunkInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ByocTrunkPage Page of ByocTrunkInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ByocTrunkPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ByocTrunkPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ByocTrunkInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ByocTrunkPage Page of ByocTrunkInstance + */ + public function getPage(string $targetUrl): ByocTrunkPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ByocTrunkPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ByocTrunkContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the BYOC Trunk resource to delete. + */ + public function getContext( + string $sid + + ): ByocTrunkContext + { + return new ByocTrunkContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ByocTrunkList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ByocTrunkOptions.php b/app/api/Twilio/Rest/Voice/V1/ByocTrunkOptions.php new file mode 100755 index 0000000..02c8273 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ByocTrunkOptions.php @@ -0,0 +1,458 @@ +options['friendlyName'] = $friendlyName; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + $this->options['connectionPolicySid'] = $connectionPolicySid; + $this->options['fromDomainSid'] = $fromDomainSid; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL we should call when the BYOC Trunk receives a call. + * + * @param string $voiceUrl The URL we should call when the BYOC Trunk receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML from `voice_url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call to pass status parameters (such as call ended) to your application. + * + * @param string $statusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @return $this Fluent Builder + */ + public function setStatusCallbackUrl(string $statusCallbackUrl): self + { + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback_url`. Can be: `GET` or `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether Caller ID Name (CNAM) lookup is enabled for the trunk. If enabled, all inbound calls to the BYOC Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup is enabled for the trunk. If enabled, all inbound calls to the BYOC Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @return $this Fluent Builder + */ + public function setCnamLookupEnabled(bool $cnamLookupEnabled): self + { + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + return $this; + } + + /** + * The SID of the Connection Policy that Twilio will use when routing traffic to your communications infrastructure. + * + * @param string $connectionPolicySid The SID of the Connection Policy that Twilio will use when routing traffic to your communications infrastructure. + * @return $this Fluent Builder + */ + public function setConnectionPolicySid(string $connectionPolicySid): self + { + $this->options['connectionPolicySid'] = $connectionPolicySid; + return $this; + } + + /** + * The SID of the SIP Domain that should be used in the `From` header of originating calls sent to your SIP infrastructure. If your SIP infrastructure allows users to \\\"call back\\\" an incoming call, configure this with a [SIP Domain](https://www.twilio.com/docs/voice/api/sending-sip) to ensure proper routing. If not configured, the from domain will default to \\\"sip.twilio.com\\\". + * + * @param string $fromDomainSid The SID of the SIP Domain that should be used in the `From` header of originating calls sent to your SIP infrastructure. If your SIP infrastructure allows users to \\\"call back\\\" an incoming call, configure this with a [SIP Domain](https://www.twilio.com/docs/voice/api/sending-sip) to ensure proper routing. If not configured, the from domain will default to \\\"sip.twilio.com\\\". + * @return $this Fluent Builder + */ + public function setFromDomainSid(string $fromDomainSid): self + { + $this->options['fromDomainSid'] = $fromDomainSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.CreateByocTrunkOptions ' . $options . ']'; + } +} + + + + +class UpdateByocTrunkOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @param string $voiceUrl The URL we should call when the BYOC Trunk receives a call. + * @param string $voiceMethod The HTTP method we should use to call `voice_url` + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @param string $statusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback_url`. Can be: `GET` or `POST`. + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup is enabled for the trunk. If enabled, all inbound calls to the BYOC Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @param string $connectionPolicySid The SID of the Connection Policy that Twilio will use when routing traffic to your communications infrastructure. + * @param string $fromDomainSid The SID of the SIP Domain that should be used in the `From` header of originating calls sent to your SIP infrastructure. If your SIP infrastructure allows users to \\\"call back\\\" an incoming call, configure this with a [SIP Domain](https://www.twilio.com/docs/voice/api/sending-sip) to ensure proper routing. If not configured, the from domain will default to \\\"sip.twilio.com\\\". + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $voiceUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceFallbackMethod = Values::NONE, + string $statusCallbackUrl = Values::NONE, + string $statusCallbackMethod = Values::NONE, + bool $cnamLookupEnabled = Values::BOOL_NONE, + string $connectionPolicySid = Values::NONE, + string $fromDomainSid = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + $this->options['connectionPolicySid'] = $connectionPolicySid; + $this->options['fromDomainSid'] = $fromDomainSid; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The URL we should call when the BYOC Trunk receives a call. + * + * @param string $voiceUrl The URL we should call when the BYOC Trunk receives a call. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_url` + * + * @param string $voiceMethod The HTTP method we should use to call `voice_url` + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * + * @param string $voiceFallbackUrl The URL that we should call when an error occurs while retrieving or executing the TwiML requested by `voice_url`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * + * @param string $voiceFallbackMethod The HTTP method we should use to call `voice_fallback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * The URL that we should call to pass status parameters (such as call ended) to your application. + * + * @param string $statusCallbackUrl The URL that we should call to pass status parameters (such as call ended) to your application. + * @return $this Fluent Builder + */ + public function setStatusCallbackUrl(string $statusCallbackUrl): self + { + $this->options['statusCallbackUrl'] = $statusCallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `status_callback_url`. Can be: `GET` or `POST`. + * + * @param string $statusCallbackMethod The HTTP method we should use to call `status_callback_url`. Can be: `GET` or `POST`. + * @return $this Fluent Builder + */ + public function setStatusCallbackMethod(string $statusCallbackMethod): self + { + $this->options['statusCallbackMethod'] = $statusCallbackMethod; + return $this; + } + + /** + * Whether Caller ID Name (CNAM) lookup is enabled for the trunk. If enabled, all inbound calls to the BYOC Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * + * @param bool $cnamLookupEnabled Whether Caller ID Name (CNAM) lookup is enabled for the trunk. If enabled, all inbound calls to the BYOC Trunk from the United States and Canada automatically perform a CNAM Lookup and display Caller ID data on your phone. See [CNAM Lookups](https://www.twilio.com/docs/sip-trunking#CNAM) for more information. + * @return $this Fluent Builder + */ + public function setCnamLookupEnabled(bool $cnamLookupEnabled): self + { + $this->options['cnamLookupEnabled'] = $cnamLookupEnabled; + return $this; + } + + /** + * The SID of the Connection Policy that Twilio will use when routing traffic to your communications infrastructure. + * + * @param string $connectionPolicySid The SID of the Connection Policy that Twilio will use when routing traffic to your communications infrastructure. + * @return $this Fluent Builder + */ + public function setConnectionPolicySid(string $connectionPolicySid): self + { + $this->options['connectionPolicySid'] = $connectionPolicySid; + return $this; + } + + /** + * The SID of the SIP Domain that should be used in the `From` header of originating calls sent to your SIP infrastructure. If your SIP infrastructure allows users to \\\"call back\\\" an incoming call, configure this with a [SIP Domain](https://www.twilio.com/docs/voice/api/sending-sip) to ensure proper routing. If not configured, the from domain will default to \\\"sip.twilio.com\\\". + * + * @param string $fromDomainSid The SID of the SIP Domain that should be used in the `From` header of originating calls sent to your SIP infrastructure. If your SIP infrastructure allows users to \\\"call back\\\" an incoming call, configure this with a [SIP Domain](https://www.twilio.com/docs/voice/api/sending-sip) to ensure proper routing. If not configured, the from domain will default to \\\"sip.twilio.com\\\". + * @return $this Fluent Builder + */ + public function setFromDomainSid(string $fromDomainSid): self + { + $this->options['fromDomainSid'] = $fromDomainSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.UpdateByocTrunkOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ByocTrunkPage.php b/app/api/Twilio/Rest/Voice/V1/ByocTrunkPage.php new file mode 100755 index 0000000..e59155a --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ByocTrunkPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ByocTrunkInstance \Twilio\Rest\Voice\V1\ByocTrunkInstance + */ + public function buildInstance(array $payload): ByocTrunkInstance + { + return new ByocTrunkInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ByocTrunkPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetContext.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetContext.php new file mode 100755 index 0000000..a07adb2 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetContext.php @@ -0,0 +1,139 @@ +solution = [ + 'connectionPolicySid' => + $connectionPolicySid, + 'sid' => + $sid, + ]; + + $this->uri = '/ConnectionPolicies/' . \rawurlencode($connectionPolicySid) + .'/Targets/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ConnectionPolicyTargetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ConnectionPolicyTargetInstance + * + * @return ConnectionPolicyTargetInstance Fetched ConnectionPolicyTargetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectionPolicyTargetInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConnectionPolicyTargetInstance( + $this->version, + $payload, + $this->solution['connectionPolicySid'], + $this->solution['sid'] + ); + } + + + /** + * Update the ConnectionPolicyTargetInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyTargetInstance Updated ConnectionPolicyTargetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectionPolicyTargetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + 'Target' => + $options['target'], + 'Priority' => + $options['priority'], + 'Weight' => + $options['weight'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConnectionPolicyTargetInstance( + $this->version, + $payload, + $this->solution['connectionPolicySid'], + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ConnectionPolicyTargetContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetInstance.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetInstance.php new file mode 100755 index 0000000..ba3926e --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetInstance.php @@ -0,0 +1,164 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'connectionPolicySid' => Values::array_get($payload, 'connection_policy_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'target' => Values::array_get($payload, 'target'), + 'priority' => Values::array_get($payload, 'priority'), + 'weight' => Values::array_get($payload, 'weight'), + 'enabled' => Values::array_get($payload, 'enabled'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['connectionPolicySid' => $connectionPolicySid, 'sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConnectionPolicyTargetContext Context for this ConnectionPolicyTargetInstance + */ + protected function proxy(): ConnectionPolicyTargetContext + { + if (!$this->context) { + $this->context = new ConnectionPolicyTargetContext( + $this->version, + $this->solution['connectionPolicySid'], + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ConnectionPolicyTargetInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ConnectionPolicyTargetInstance + * + * @return ConnectionPolicyTargetInstance Fetched ConnectionPolicyTargetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectionPolicyTargetInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConnectionPolicyTargetInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyTargetInstance Updated ConnectionPolicyTargetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectionPolicyTargetInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ConnectionPolicyTargetInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetList.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetList.php new file mode 100755 index 0000000..a6749e5 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetList.php @@ -0,0 +1,207 @@ +solution = [ + 'connectionPolicySid' => + $connectionPolicySid, + + ]; + + $this->uri = '/ConnectionPolicies/' . \rawurlencode($connectionPolicySid) + .'/Targets'; + } + + /** + * Create the ConnectionPolicyTargetInstance + * + * @param string $target The SIP address you want Twilio to route your calls to. This must be a `sip:` schema. `sips` is NOT supported. + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyTargetInstance Created ConnectionPolicyTargetInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $target, array $options = []): ConnectionPolicyTargetInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Target' => + $target, + 'FriendlyName' => + $options['friendlyName'], + 'Priority' => + $options['priority'], + 'Weight' => + $options['weight'], + 'Enabled' => + Serialize::booleanToString($options['enabled']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ConnectionPolicyTargetInstance( + $this->version, + $payload, + $this->solution['connectionPolicySid'] + ); + } + + + /** + * Reads ConnectionPolicyTargetInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConnectionPolicyTargetInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ConnectionPolicyTargetInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConnectionPolicyTargetInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConnectionPolicyTargetPage Page of ConnectionPolicyTargetInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConnectionPolicyTargetPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConnectionPolicyTargetPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConnectionPolicyTargetInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConnectionPolicyTargetPage Page of ConnectionPolicyTargetInstance + */ + public function getPage(string $targetUrl): ConnectionPolicyTargetPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConnectionPolicyTargetPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConnectionPolicyTargetContext + * + * @param string $sid The unique string that we created to identify the Target resource to delete. + */ + public function getContext( + string $sid + + ): ConnectionPolicyTargetContext + { + return new ConnectionPolicyTargetContext( + $this->version, + $this->solution['connectionPolicySid'], + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ConnectionPolicyTargetList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetOptions.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetOptions.php new file mode 100755 index 0000000..d7851ee --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetOptions.php @@ -0,0 +1,260 @@ +options['friendlyName'] = $friendlyName; + $this->options['priority'] = $priority; + $this->options['weight'] = $weight; + $this->options['enabled'] = $enabled; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The relative importance of the target. Can be an integer from 0 to 65535, inclusive, and the default is 10. The lowest number represents the most important target. + * + * @param int $priority The relative importance of the target. Can be an integer from 0 to 65535, inclusive, and the default is 10. The lowest number represents the most important target. + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * The value that determines the relative share of the load the Target should receive compared to other Targets with the same priority. Can be an integer from 1 to 65535, inclusive, and the default is 10. Targets with higher values receive more load than those with lower ones with the same priority. + * + * @param int $weight The value that determines the relative share of the load the Target should receive compared to other Targets with the same priority. Can be an integer from 1 to 65535, inclusive, and the default is 10. Targets with higher values receive more load than those with lower ones with the same priority. + * @return $this Fluent Builder + */ + public function setWeight(int $weight): self + { + $this->options['weight'] = $weight; + return $this; + } + + /** + * Whether the Target is enabled. The default is `true`. + * + * @param bool $enabled Whether the Target is enabled. The default is `true`. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.CreateConnectionPolicyTargetOptions ' . $options . ']'; + } +} + + + + +class UpdateConnectionPolicyTargetOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @param string $target The SIP address you want Twilio to route your calls to. This must be a `sip:` schema. `sips` is NOT supported. + * @param int $priority The relative importance of the target. Can be an integer from 0 to 65535, inclusive. The lowest number represents the most important target. + * @param int $weight The value that determines the relative share of the load the Target should receive compared to other Targets with the same priority. Can be an integer from 1 to 65535, inclusive. Targets with higher values receive more load than those with lower ones with the same priority. + * @param bool $enabled Whether the Target is enabled. + */ + public function __construct( + + string $friendlyName = Values::NONE, + string $target = Values::NONE, + int $priority = Values::INT_NONE, + int $weight = Values::INT_NONE, + bool $enabled = Values::BOOL_NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + $this->options['target'] = $target; + $this->options['priority'] = $priority; + $this->options['weight'] = $weight; + $this->options['enabled'] = $enabled; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SIP address you want Twilio to route your calls to. This must be a `sip:` schema. `sips` is NOT supported. + * + * @param string $target The SIP address you want Twilio to route your calls to. This must be a `sip:` schema. `sips` is NOT supported. + * @return $this Fluent Builder + */ + public function setTarget(string $target): self + { + $this->options['target'] = $target; + return $this; + } + + /** + * The relative importance of the target. Can be an integer from 0 to 65535, inclusive. The lowest number represents the most important target. + * + * @param int $priority The relative importance of the target. Can be an integer from 0 to 65535, inclusive. The lowest number represents the most important target. + * @return $this Fluent Builder + */ + public function setPriority(int $priority): self + { + $this->options['priority'] = $priority; + return $this; + } + + /** + * The value that determines the relative share of the load the Target should receive compared to other Targets with the same priority. Can be an integer from 1 to 65535, inclusive. Targets with higher values receive more load than those with lower ones with the same priority. + * + * @param int $weight The value that determines the relative share of the load the Target should receive compared to other Targets with the same priority. Can be an integer from 1 to 65535, inclusive. Targets with higher values receive more load than those with lower ones with the same priority. + * @return $this Fluent Builder + */ + public function setWeight(int $weight): self + { + $this->options['weight'] = $weight; + return $this; + } + + /** + * Whether the Target is enabled. + * + * @param bool $enabled Whether the Target is enabled. + * @return $this Fluent Builder + */ + public function setEnabled(bool $enabled): self + { + $this->options['enabled'] = $enabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.UpdateConnectionPolicyTargetOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetPage.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetPage.php new file mode 100755 index 0000000..cb0f1b1 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicy/ConnectionPolicyTargetPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConnectionPolicyTargetInstance \Twilio\Rest\Voice\V1\ConnectionPolicy\ConnectionPolicyTargetInstance + */ + public function buildInstance(array $payload): ConnectionPolicyTargetInstance + { + return new ConnectionPolicyTargetInstance($this->version, $payload, $this->solution['connectionPolicySid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ConnectionPolicyTargetPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyContext.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyContext.php new file mode 100755 index 0000000..1c5ab7f --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyContext.php @@ -0,0 +1,181 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/ConnectionPolicies/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the ConnectionPolicyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the ConnectionPolicyInstance + * + * @return ConnectionPolicyInstance Fetched ConnectionPolicyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectionPolicyInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new ConnectionPolicyInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the ConnectionPolicyInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyInstance Updated ConnectionPolicyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectionPolicyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new ConnectionPolicyInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the targets + */ + protected function getTargets(): ConnectionPolicyTargetList + { + if (!$this->_targets) { + $this->_targets = new ConnectionPolicyTargetList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_targets; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ConnectionPolicyContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyInstance.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyInstance.php new file mode 100755 index 0000000..b24f1e1 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyInstance.php @@ -0,0 +1,165 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return ConnectionPolicyContext Context for this ConnectionPolicyInstance + */ + protected function proxy(): ConnectionPolicyContext + { + if (!$this->context) { + $this->context = new ConnectionPolicyContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the ConnectionPolicyInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the ConnectionPolicyInstance + * + * @return ConnectionPolicyInstance Fetched ConnectionPolicyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): ConnectionPolicyInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the ConnectionPolicyInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyInstance Updated ConnectionPolicyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): ConnectionPolicyInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the targets + */ + protected function getTargets(): ConnectionPolicyTargetList + { + return $this->proxy()->targets; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.ConnectionPolicyInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyList.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyList.php new file mode 100755 index 0000000..bd2a346 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/ConnectionPolicies'; + } + + /** + * Create the ConnectionPolicyInstance + * + * @param array|Options $options Optional Arguments + * @return ConnectionPolicyInstance Created ConnectionPolicyInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): ConnectionPolicyInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new ConnectionPolicyInstance( + $this->version, + $payload + ); + } + + + /** + * Reads ConnectionPolicyInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return ConnectionPolicyInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams ConnectionPolicyInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of ConnectionPolicyInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return ConnectionPolicyPage Page of ConnectionPolicyInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): ConnectionPolicyPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new ConnectionPolicyPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of ConnectionPolicyInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return ConnectionPolicyPage Page of ConnectionPolicyInstance + */ + public function getPage(string $targetUrl): ConnectionPolicyPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new ConnectionPolicyPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a ConnectionPolicyContext + * + * @param string $sid The unique string that we created to identify the Connection Policy resource to delete. + */ + public function getContext( + string $sid + + ): ConnectionPolicyContext + { + return new ConnectionPolicyContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ConnectionPolicyList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyOptions.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyOptions.php new file mode 100755 index 0000000..2b9bfe4 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyOptions.php @@ -0,0 +1,134 @@ +options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.CreateConnectionPolicyOptions ' . $options . ']'; + } +} + + + + +class UpdateConnectionPolicyOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.UpdateConnectionPolicyOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyPage.php b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyPage.php new file mode 100755 index 0000000..571c5a8 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/ConnectionPolicyPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return ConnectionPolicyInstance \Twilio\Rest\Voice\V1\ConnectionPolicyInstance + */ + public function buildInstance(array $payload): ConnectionPolicyInstance + { + return new ConnectionPolicyInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.ConnectionPolicyPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateInstance.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateInstance.php new file mode 100755 index 0000000..1e84e6d --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateInstance.php @@ -0,0 +1,82 @@ +properties = [ + 'updateCount' => Values::array_get($payload, 'update_count'), + 'updateRequest' => Values::array_get($payload, 'update_request'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.BulkCountryUpdateInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateList.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateList.php new file mode 100755 index 0000000..216bc80 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdateList.php @@ -0,0 +1,77 @@ +solution = [ + ]; + + $this->uri = '/DialingPermissions/BulkCountryUpdates'; + } + + /** + * Create the BulkCountryUpdateInstance + * + * @param string $updateRequest URL encoded JSON array of update objects. example : `[ { \\\"iso_code\\\": \\\"GB\\\", \\\"low_risk_numbers_enabled\\\": \\\"true\\\", \\\"high_risk_special_numbers_enabled\\\":\\\"true\\\", \\\"high_risk_tollfraud_numbers_enabled\\\": \\\"false\\\" } ]` + * @return BulkCountryUpdateInstance Created BulkCountryUpdateInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $updateRequest): BulkCountryUpdateInstance + { + + $data = Values::of([ + 'UpdateRequest' => + $updateRequest, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new BulkCountryUpdateInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.BulkCountryUpdateList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdatePage.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdatePage.php new file mode 100755 index 0000000..947bf91 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/BulkCountryUpdatePage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return BulkCountryUpdateInstance \Twilio\Rest\Voice\V1\DialingPermissions\BulkCountryUpdateInstance + */ + public function buildInstance(array $payload): BulkCountryUpdateInstance + { + return new BulkCountryUpdateInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.BulkCountryUpdatePage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixInstance.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixInstance.php new file mode 100755 index 0000000..d6a9410 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixInstance.php @@ -0,0 +1,81 @@ +properties = [ + 'prefix' => Values::array_get($payload, 'prefix'), + ]; + + $this->solution = ['isoCode' => $isoCode, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.HighriskSpecialPrefixInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixList.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixList.php new file mode 100755 index 0000000..d9f95dd --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixList.php @@ -0,0 +1,151 @@ +solution = [ + 'isoCode' => + $isoCode, + + ]; + + $this->uri = '/DialingPermissions/Countries/' . \rawurlencode($isoCode) + .'/HighRiskSpecialPrefixes'; + } + + /** + * Reads HighriskSpecialPrefixInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return HighriskSpecialPrefixInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams HighriskSpecialPrefixInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of HighriskSpecialPrefixInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return HighriskSpecialPrefixPage Page of HighriskSpecialPrefixInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): HighriskSpecialPrefixPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new HighriskSpecialPrefixPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of HighriskSpecialPrefixInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return HighriskSpecialPrefixPage Page of HighriskSpecialPrefixInstance + */ + public function getPage(string $targetUrl): HighriskSpecialPrefixPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new HighriskSpecialPrefixPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.HighriskSpecialPrefixList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixPage.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixPage.php new file mode 100755 index 0000000..4414889 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/Country/HighriskSpecialPrefixPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return HighriskSpecialPrefixInstance \Twilio\Rest\Voice\V1\DialingPermissions\Country\HighriskSpecialPrefixInstance + */ + public function buildInstance(array $payload): HighriskSpecialPrefixInstance + { + return new HighriskSpecialPrefixInstance($this->version, $payload, $this->solution['isoCode']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.HighriskSpecialPrefixPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryContext.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryContext.php new file mode 100755 index 0000000..b5fc06d --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryContext.php @@ -0,0 +1,138 @@ +solution = [ + 'isoCode' => + $isoCode, + ]; + + $this->uri = '/DialingPermissions/Countries/' . \rawurlencode($isoCode) + .''; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CountryInstance( + $this->version, + $payload, + $this->solution['isoCode'] + ); + } + + + /** + * Access the highriskSpecialPrefixes + */ + protected function getHighriskSpecialPrefixes(): HighriskSpecialPrefixList + { + if (!$this->_highriskSpecialPrefixes) { + $this->_highriskSpecialPrefixes = new HighriskSpecialPrefixList( + $this->version, + $this->solution['isoCode'] + ); + } + + return $this->_highriskSpecialPrefixes; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.CountryContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryInstance.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryInstance.php new file mode 100755 index 0000000..b66112f --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryInstance.php @@ -0,0 +1,142 @@ +properties = [ + 'isoCode' => Values::array_get($payload, 'iso_code'), + 'name' => Values::array_get($payload, 'name'), + 'continent' => Values::array_get($payload, 'continent'), + 'countryCodes' => Values::array_get($payload, 'country_codes'), + 'lowRiskNumbersEnabled' => Values::array_get($payload, 'low_risk_numbers_enabled'), + 'highRiskSpecialNumbersEnabled' => Values::array_get($payload, 'high_risk_special_numbers_enabled'), + 'highRiskTollfraudNumbersEnabled' => Values::array_get($payload, 'high_risk_tollfraud_numbers_enabled'), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + ]; + + $this->solution = ['isoCode' => $isoCode ?: $this->properties['isoCode'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CountryContext Context for this CountryInstance + */ + protected function proxy(): CountryContext + { + if (!$this->context) { + $this->context = new CountryContext( + $this->version, + $this->solution['isoCode'] + ); + } + + return $this->context; + } + + /** + * Fetch the CountryInstance + * + * @return CountryInstance Fetched CountryInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CountryInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Access the highriskSpecialPrefixes + */ + protected function getHighriskSpecialPrefixes(): HighriskSpecialPrefixList + { + return $this->proxy()->highriskSpecialPrefixes; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.CountryInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryList.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryList.php new file mode 100755 index 0000000..5a13acb --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryList.php @@ -0,0 +1,179 @@ +solution = [ + ]; + + $this->uri = '/DialingPermissions/Countries'; + } + + /** + * Reads CountryInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CountryInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CountryInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CountryInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CountryPage Page of CountryInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CountryPage + { + $options = new Values($options); + + $params = Values::of([ + 'IsoCode' => + $options['isoCode'], + 'Continent' => + $options['continent'], + 'CountryCode' => + $options['countryCode'], + 'LowRiskNumbersEnabled' => + Serialize::booleanToString($options['lowRiskNumbersEnabled']), + 'HighRiskSpecialNumbersEnabled' => + Serialize::booleanToString($options['highRiskSpecialNumbersEnabled']), + 'HighRiskTollfraudNumbersEnabled' => + Serialize::booleanToString($options['highRiskTollfraudNumbersEnabled']), + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CountryPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CountryInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CountryPage Page of CountryInstance + */ + public function getPage(string $targetUrl): CountryPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CountryPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CountryContext + * + * @param string $isoCode The [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the DialingPermissions Country resource to fetch + */ + public function getContext( + string $isoCode + + ): CountryContext + { + return new CountryContext( + $this->version, + $isoCode + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.CountryList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryOptions.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryOptions.php new file mode 100755 index 0000000..51d7efd --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryOptions.php @@ -0,0 +1,168 @@ +options['isoCode'] = $isoCode; + $this->options['continent'] = $continent; + $this->options['countryCode'] = $countryCode; + $this->options['lowRiskNumbersEnabled'] = $lowRiskNumbersEnabled; + $this->options['highRiskSpecialNumbersEnabled'] = $highRiskSpecialNumbersEnabled; + $this->options['highRiskTollfraudNumbersEnabled'] = $highRiskTollfraudNumbersEnabled; + } + + /** + * Filter to retrieve the country permissions by specifying the [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + * + * @param string $isoCode Filter to retrieve the country permissions by specifying the [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + * @return $this Fluent Builder + */ + public function setIsoCode(string $isoCode): self + { + $this->options['isoCode'] = $isoCode; + return $this; + } + + /** + * Filter to retrieve the country permissions by specifying the continent + * + * @param string $continent Filter to retrieve the country permissions by specifying the continent + * @return $this Fluent Builder + */ + public function setContinent(string $continent): self + { + $this->options['continent'] = $continent; + return $this; + } + + /** + * Filter the results by specified [country codes](https://www.itu.int/itudoc/itu-t/ob-lists/icc/e164_763.html) + * + * @param string $countryCode Filter the results by specified [country codes](https://www.itu.int/itudoc/itu-t/ob-lists/icc/e164_763.html) + * @return $this Fluent Builder + */ + public function setCountryCode(string $countryCode): self + { + $this->options['countryCode'] = $countryCode; + return $this; + } + + /** + * Filter to retrieve the country permissions with dialing to low-risk numbers enabled. Can be: `true` or `false`. + * + * @param bool $lowRiskNumbersEnabled Filter to retrieve the country permissions with dialing to low-risk numbers enabled. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setLowRiskNumbersEnabled(bool $lowRiskNumbersEnabled): self + { + $this->options['lowRiskNumbersEnabled'] = $lowRiskNumbersEnabled; + return $this; + } + + /** + * Filter to retrieve the country permissions with dialing to high-risk special service numbers enabled. Can be: `true` or `false` + * + * @param bool $highRiskSpecialNumbersEnabled Filter to retrieve the country permissions with dialing to high-risk special service numbers enabled. Can be: `true` or `false` + * @return $this Fluent Builder + */ + public function setHighRiskSpecialNumbersEnabled(bool $highRiskSpecialNumbersEnabled): self + { + $this->options['highRiskSpecialNumbersEnabled'] = $highRiskSpecialNumbersEnabled; + return $this; + } + + /** + * Filter to retrieve the country permissions with dialing to high-risk [toll fraud](https://www.twilio.com/learn/voice-and-video/toll-fraud) numbers enabled. Can be: `true` or `false`. + * + * @param bool $highRiskTollfraudNumbersEnabled Filter to retrieve the country permissions with dialing to high-risk [toll fraud](https://www.twilio.com/learn/voice-and-video/toll-fraud) numbers enabled. Can be: `true` or `false`. + * @return $this Fluent Builder + */ + public function setHighRiskTollfraudNumbersEnabled(bool $highRiskTollfraudNumbersEnabled): self + { + $this->options['highRiskTollfraudNumbersEnabled'] = $highRiskTollfraudNumbersEnabled; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.ReadCountryOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryPage.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryPage.php new file mode 100755 index 0000000..b4b214b --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/CountryPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CountryInstance \Twilio\Rest\Voice\V1\DialingPermissions\CountryInstance + */ + public function buildInstance(array $payload): CountryInstance + { + return new CountryInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.CountryPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsContext.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsContext.php new file mode 100755 index 0000000..f2e1912 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsContext.php @@ -0,0 +1,104 @@ +solution = [ + ]; + + $this->uri = '/Settings'; + } + + /** + * Fetch the SettingsInstance + * + * @return SettingsInstance Fetched SettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SettingsInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Update the SettingsInstance + * + * @param array|Options $options Optional Arguments + * @return SettingsInstance Updated SettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SettingsInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'DialingPermissionsInheritance' => + Serialize::booleanToString($options['dialingPermissionsInheritance']), + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SettingsInstance( + $this->version, + $payload + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.SettingsContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsInstance.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsInstance.php new file mode 100755 index 0000000..2240db6 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsInstance.php @@ -0,0 +1,129 @@ +properties = [ + 'dialingPermissionsInheritance' => Values::array_get($payload, 'dialing_permissions_inheritance'), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = []; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SettingsContext Context for this SettingsInstance + */ + protected function proxy(): SettingsContext + { + if (!$this->context) { + $this->context = new SettingsContext( + $this->version + ); + } + + return $this->context; + } + + /** + * Fetch the SettingsInstance + * + * @return SettingsInstance Fetched SettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SettingsInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SettingsInstance + * + * @param array|Options $options Optional Arguments + * @return SettingsInstance Updated SettingsInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SettingsInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.SettingsInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsList.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsList.php new file mode 100755 index 0000000..8923667 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsList.php @@ -0,0 +1,61 @@ +solution = [ + ]; + } + + /** + * Constructs a SettingsContext + */ + public function getContext( + + ): SettingsContext + { + return new SettingsContext( + $this->version + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.SettingsList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsOptions.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsOptions.php new file mode 100755 index 0000000..8abeede --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsOptions.php @@ -0,0 +1,78 @@ +options['dialingPermissionsInheritance'] = $dialingPermissionsInheritance; + } + + /** + * `true` for the sub-account to inherit voice dialing permissions from the Master Project; otherwise `false`. + * + * @param bool $dialingPermissionsInheritance `true` for the sub-account to inherit voice dialing permissions from the Master Project; otherwise `false`. + * @return $this Fluent Builder + */ + public function setDialingPermissionsInheritance(bool $dialingPermissionsInheritance): self + { + $this->options['dialingPermissionsInheritance'] = $dialingPermissionsInheritance; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.UpdateSettingsOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsPage.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsPage.php new file mode 100755 index 0000000..313ea95 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissions/SettingsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SettingsInstance \Twilio\Rest\Voice\V1\DialingPermissions\SettingsInstance + */ + public function buildInstance(array $payload): SettingsInstance + { + return new SettingsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.SettingsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissionsInstance.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsInstance.php new file mode 100755 index 0000000..f00794f --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsInstance.php @@ -0,0 +1,71 @@ +solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.DialingPermissionsInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissionsList.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsList.php new file mode 100755 index 0000000..63659cd --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsList.php @@ -0,0 +1,139 @@ +solution = [ + ]; + } + + /** + * Access the bulkCountryUpdates + */ + protected function getBulkCountryUpdates(): BulkCountryUpdateList + { + if (!$this->_bulkCountryUpdates) { + $this->_bulkCountryUpdates = new BulkCountryUpdateList( + $this->version + ); + } + return $this->_bulkCountryUpdates; + } + + /** + * Access the countries + */ + protected function getCountries(): CountryList + { + if (!$this->_countries) { + $this->_countries = new CountryList( + $this->version + ); + } + return $this->_countries; + } + + /** + * Access the settings + */ + protected function getSettings(): SettingsList + { + if (!$this->_settings) { + $this->_settings = new SettingsList( + $this->version + ); + } + return $this->_settings; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return \Twilio\ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name) + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.DialingPermissionsList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/DialingPermissionsPage.php b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsPage.php new file mode 100755 index 0000000..30dcc79 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/DialingPermissionsPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DialingPermissionsInstance \Twilio\Rest\Voice\V1\DialingPermissionsInstance + */ + public function buildInstance(array $payload): DialingPermissionsInstance + { + return new DialingPermissionsInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.DialingPermissionsPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/IpRecordContext.php b/app/api/Twilio/Rest/Voice/V1/IpRecordContext.php new file mode 100755 index 0000000..45b392c --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/IpRecordContext.php @@ -0,0 +1,123 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/IpRecords/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the IpRecordInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the IpRecordInstance + * + * @return IpRecordInstance Fetched IpRecordInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpRecordInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new IpRecordInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the IpRecordInstance + * + * @param array|Options $options Optional Arguments + * @return IpRecordInstance Updated IpRecordInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IpRecordInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new IpRecordInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.IpRecordContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/IpRecordInstance.php b/app/api/Twilio/Rest/Voice/V1/IpRecordInstance.php new file mode 100755 index 0000000..7a7dac1 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/IpRecordInstance.php @@ -0,0 +1,156 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'sid' => Values::array_get($payload, 'sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'ipAddress' => Values::array_get($payload, 'ip_address'), + 'cidrPrefixLength' => Values::array_get($payload, 'cidr_prefix_length'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return IpRecordContext Context for this IpRecordInstance + */ + protected function proxy(): IpRecordContext + { + if (!$this->context) { + $this->context = new IpRecordContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the IpRecordInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the IpRecordInstance + * + * @return IpRecordInstance Fetched IpRecordInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): IpRecordInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the IpRecordInstance + * + * @param array|Options $options Optional Arguments + * @return IpRecordInstance Updated IpRecordInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): IpRecordInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.IpRecordInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/IpRecordList.php b/app/api/Twilio/Rest/Voice/V1/IpRecordList.php new file mode 100755 index 0000000..47d1a4c --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/IpRecordList.php @@ -0,0 +1,194 @@ +solution = [ + ]; + + $this->uri = '/IpRecords'; + } + + /** + * Create the IpRecordInstance + * + * @param string $ipAddress An IP address in dotted decimal notation, IPv4 only. + * @param array|Options $options Optional Arguments + * @return IpRecordInstance Created IpRecordInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $ipAddress, array $options = []): IpRecordInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'IpAddress' => + $ipAddress, + 'FriendlyName' => + $options['friendlyName'], + 'CidrPrefixLength' => + $options['cidrPrefixLength'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new IpRecordInstance( + $this->version, + $payload + ); + } + + + /** + * Reads IpRecordInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return IpRecordInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams IpRecordInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of IpRecordInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return IpRecordPage Page of IpRecordInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): IpRecordPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new IpRecordPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of IpRecordInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return IpRecordPage Page of IpRecordInstance + */ + public function getPage(string $targetUrl): IpRecordPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new IpRecordPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a IpRecordContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the IP Record resource to delete. + */ + public function getContext( + string $sid + + ): IpRecordContext + { + return new IpRecordContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.IpRecordList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/IpRecordOptions.php b/app/api/Twilio/Rest/Voice/V1/IpRecordOptions.php new file mode 100755 index 0000000..496ba1a --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/IpRecordOptions.php @@ -0,0 +1,152 @@ +options['friendlyName'] = $friendlyName; + $this->options['cidrPrefixLength'] = $cidrPrefixLength; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * An integer representing the length of the [CIDR](https://tools.ietf.org/html/rfc4632) prefix to use with this IP address. By default the entire IP address is used, which for IPv4 is value 32. + * + * @param int $cidrPrefixLength An integer representing the length of the [CIDR](https://tools.ietf.org/html/rfc4632) prefix to use with this IP address. By default the entire IP address is used, which for IPv4 is value 32. + * @return $this Fluent Builder + */ + public function setCidrPrefixLength(int $cidrPrefixLength): self + { + $this->options['cidrPrefixLength'] = $cidrPrefixLength; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.CreateIpRecordOptions ' . $options . ']'; + } +} + + + + +class UpdateIpRecordOptions extends Options + { + /** + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + */ + public function __construct( + + string $friendlyName = Values::NONE + + ) { + $this->options['friendlyName'] = $friendlyName; + } + + /** + * A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It is not unique and can be up to 255 characters long. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Voice.V1.UpdateIpRecordOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/IpRecordPage.php b/app/api/Twilio/Rest/Voice/V1/IpRecordPage.php new file mode 100755 index 0000000..8148000 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/IpRecordPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return IpRecordInstance \Twilio\Rest\Voice\V1\IpRecordInstance + */ + public function buildInstance(array $payload): IpRecordInstance + { + return new IpRecordInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.IpRecordPage]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/SourceIpMappingContext.php b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingContext.php new file mode 100755 index 0000000..f76d741 --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingContext.php @@ -0,0 +1,120 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/SourceIpMappings/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SourceIpMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SourceIpMappingInstance + * + * @return SourceIpMappingInstance Fetched SourceIpMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SourceIpMappingInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SourceIpMappingInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SourceIpMappingInstance + * + * @param string $sipDomainSid The SID of the SIP Domain that the IP Record should be mapped to. + * @return SourceIpMappingInstance Updated SourceIpMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $sipDomainSid): SourceIpMappingInstance + { + + $data = Values::of([ + 'SipDomainSid' => + $sipDomainSid, + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SourceIpMappingInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.SourceIpMappingContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/SourceIpMappingInstance.php b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingInstance.php new file mode 100755 index 0000000..7f31b0d --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingInstance.php @@ -0,0 +1,151 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'ipRecordSid' => Values::array_get($payload, 'ip_record_sid'), + 'sipDomainSid' => Values::array_get($payload, 'sip_domain_sid'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SourceIpMappingContext Context for this SourceIpMappingInstance + */ + protected function proxy(): SourceIpMappingContext + { + if (!$this->context) { + $this->context = new SourceIpMappingContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SourceIpMappingInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SourceIpMappingInstance + * + * @return SourceIpMappingInstance Fetched SourceIpMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SourceIpMappingInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SourceIpMappingInstance + * + * @param string $sipDomainSid The SID of the SIP Domain that the IP Record should be mapped to. + * @return SourceIpMappingInstance Updated SourceIpMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(string $sipDomainSid): SourceIpMappingInstance + { + + return $this->proxy()->update($sipDomainSid); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Voice.V1.SourceIpMappingInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Voice/V1/SourceIpMappingList.php b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingList.php new file mode 100755 index 0000000..432f90d --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingList.php @@ -0,0 +1,189 @@ +solution = [ + ]; + + $this->uri = '/SourceIpMappings'; + } + + /** + * Create the SourceIpMappingInstance + * + * @param string $ipRecordSid The Twilio-provided string that uniquely identifies the IP Record resource to map from. + * @param string $sipDomainSid The SID of the SIP Domain that the IP Record should be mapped to. + * @return SourceIpMappingInstance Created SourceIpMappingInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $ipRecordSid, string $sipDomainSid): SourceIpMappingInstance + { + + $data = Values::of([ + 'IpRecordSid' => + $ipRecordSid, + 'SipDomainSid' => + $sipDomainSid, + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new SourceIpMappingInstance( + $this->version, + $payload + ); + } + + + /** + * Reads SourceIpMappingInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SourceIpMappingInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams SourceIpMappingInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SourceIpMappingInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SourceIpMappingPage Page of SourceIpMappingInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SourceIpMappingPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SourceIpMappingPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SourceIpMappingInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SourceIpMappingPage Page of SourceIpMappingInstance + */ + public function getPage(string $targetUrl): SourceIpMappingPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SourceIpMappingPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SourceIpMappingContext + * + * @param string $sid The Twilio-provided string that uniquely identifies the IP Record resource to delete. + */ + public function getContext( + string $sid + + ): SourceIpMappingContext + { + return new SourceIpMappingContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.SourceIpMappingList]'; + } +} diff --git a/app/api/Twilio/Rest/Voice/V1/SourceIpMappingPage.php b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingPage.php new file mode 100755 index 0000000..3a04d1e --- /dev/null +++ b/app/api/Twilio/Rest/Voice/V1/SourceIpMappingPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SourceIpMappingInstance \Twilio\Rest\Voice\V1\SourceIpMappingInstance + */ + public function buildInstance(array $payload): SourceIpMappingInstance + { + return new SourceIpMappingInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Voice.V1.SourceIpMappingPage]'; + } +} diff --git a/app/api/Twilio/Rest/VoiceBase.php b/app/api/Twilio/Rest/VoiceBase.php new file mode 100755 index 0000000..3c5206d --- /dev/null +++ b/app/api/Twilio/Rest/VoiceBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://voice.twilio.com'; + } + + + /** + * @return V1 Version v1 of voice + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Voice]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless.php b/app/api/Twilio/Rest/Wireless.php new file mode 100755 index 0000000..b96bcd1 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless.php @@ -0,0 +1,67 @@ +usageRecords instead. + */ + protected function getUsageRecords(): \Twilio\Rest\Wireless\V1\UsageRecordList { + echo "usageRecords is deprecated. Use v1->usageRecords instead."; + return $this->v1->usageRecords; + } + + /** + * @deprecated Use v1->commands instead. + */ + protected function getCommands(): \Twilio\Rest\Wireless\V1\CommandList { + echo "commands is deprecated. Use v1->commands instead."; + return $this->v1->commands; + } + + /** + * @deprecated Use v1->commands(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextCommands(string $sid): \Twilio\Rest\Wireless\V1\CommandContext { + echo "commands(\$sid) is deprecated. Use v1->commands(\$sid) instead."; + return $this->v1->commands($sid); + } + + /** + * @deprecated Use v1->ratePlans instead. + */ + protected function getRatePlans(): \Twilio\Rest\Wireless\V1\RatePlanList { + echo "ratePlans is deprecated. Use v1->ratePlans instead."; + return $this->v1->ratePlans; + } + + /** + * @deprecated Use v1->ratePlans(\$sid) instead. + * @param string $sid The SID that identifies the resource to fetch + */ + protected function contextRatePlans(string $sid): \Twilio\Rest\Wireless\V1\RatePlanContext { + echo "ratePlans(\$sid) is deprecated. Use v1->ratePlans(\$sid) instead."; + return $this->v1->ratePlans($sid); + } + + /** + * @deprecated Use v1->sims instead. + */ + protected function getSims(): \Twilio\Rest\Wireless\V1\SimList { + echo "sims is deprecated. Use v1->sims instead."; + return $this->v1->sims; + } + + /** + * @deprecated Use v1->sims(\$sid) instead. + * @param string $sid The SID of the Sim resource to fetch + */ + protected function contextSims(string $sid): \Twilio\Rest\Wireless\V1\SimContext { + echo "sims(\$sid) is deprecated. Use v1->sims(\$sid) instead."; + return $this->v1->sims($sid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Rest/Wireless/V1.php b/app/api/Twilio/Rest/Wireless/V1.php new file mode 100755 index 0000000..5769e89 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1.php @@ -0,0 +1,130 @@ +version = 'v1'; + } + + protected function getCommands(): CommandList + { + if (!$this->_commands) { + $this->_commands = new CommandList($this); + } + return $this->_commands; + } + + protected function getRatePlans(): RatePlanList + { + if (!$this->_ratePlans) { + $this->_ratePlans = new RatePlanList($this); + } + return $this->_ratePlans; + } + + protected function getSims(): SimList + { + if (!$this->_sims) { + $this->_sims = new SimList($this); + } + return $this->_sims; + } + + protected function getUsageRecords(): UsageRecordList + { + if (!$this->_usageRecords) { + $this->_usageRecords = new UsageRecordList($this); + } + return $this->_usageRecords; + } + + /** + * Magic getter to lazy load root resources + * + * @param string $name Resource to return + * @return \Twilio\ListResource The requested resource + * @throws TwilioException For unknown resource + */ + public function __get(string $name) + { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown resource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/CommandContext.php b/app/api/Twilio/Rest/Wireless/V1/CommandContext.php new file mode 100755 index 0000000..38f6c4a --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/CommandContext.php @@ -0,0 +1,94 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Commands/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the CommandInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the CommandInstance + * + * @return CommandInstance Fetched CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CommandInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new CommandInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.CommandContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/CommandInstance.php b/app/api/Twilio/Rest/Wireless/V1/CommandInstance.php new file mode 100755 index 0000000..f45c3d8 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/CommandInstance.php @@ -0,0 +1,150 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'command' => Values::array_get($payload, 'command'), + 'commandMode' => Values::array_get($payload, 'command_mode'), + 'transport' => Values::array_get($payload, 'transport'), + 'deliveryReceiptRequested' => Values::array_get($payload, 'delivery_receipt_requested'), + 'status' => Values::array_get($payload, 'status'), + 'direction' => Values::array_get($payload, 'direction'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return CommandContext Context for this CommandInstance + */ + protected function proxy(): CommandContext + { + if (!$this->context) { + $this->context = new CommandContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the CommandInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the CommandInstance + * + * @return CommandInstance Fetched CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): CommandInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.CommandInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/CommandList.php b/app/api/Twilio/Rest/Wireless/V1/CommandList.php new file mode 100755 index 0000000..437d952 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/CommandList.php @@ -0,0 +1,215 @@ +solution = [ + ]; + + $this->uri = '/Commands'; + } + + /** + * Create the CommandInstance + * + * @param string $command The message body of the Command. Can be plain text in text mode or a Base64 encoded byte string in binary mode. + * @param array|Options $options Optional Arguments + * @return CommandInstance Created CommandInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(string $command, array $options = []): CommandInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'Command' => + $command, + 'Sim' => + $options['sim'], + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + 'CommandMode' => + $options['commandMode'], + 'IncludeSid' => + $options['includeSid'], + 'DeliveryReceiptRequested' => + Serialize::booleanToString($options['deliveryReceiptRequested']), + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new CommandInstance( + $this->version, + $payload + ); + } + + + /** + * Reads CommandInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return CommandInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams CommandInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of CommandInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return CommandPage Page of CommandInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): CommandPage + { + $options = new Values($options); + + $params = Values::of([ + 'Sim' => + $options['sim'], + 'Status' => + $options['status'], + 'Direction' => + $options['direction'], + 'Transport' => + $options['transport'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new CommandPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of CommandInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return CommandPage Page of CommandInstance + */ + public function getPage(string $targetUrl): CommandPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new CommandPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a CommandContext + * + * @param string $sid The SID of the Command resource to delete. + */ + public function getContext( + string $sid + + ): CommandContext + { + return new CommandContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.CommandList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/CommandOptions.php b/app/api/Twilio/Rest/Wireless/V1/CommandOptions.php new file mode 100755 index 0000000..16258e9 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/CommandOptions.php @@ -0,0 +1,274 @@ +options['sim'] = $sim; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['commandMode'] = $commandMode; + $this->options['includeSid'] = $includeSid; + $this->options['deliveryReceiptRequested'] = $deliveryReceiptRequested; + } + + /** + * The `sid` or `unique_name` of the [SIM](https://www.twilio.com/docs/wireless/api/sim-resource) to send the Command to. + * + * @param string $sim The `sid` or `unique_name` of the [SIM](https://www.twilio.com/docs/wireless/api/sim-resource) to send the Command to. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * The HTTP method we use to call `callback_url`. Can be: `POST` or `GET`, and the default is `POST`. + * + * @param string $callbackMethod The HTTP method we use to call `callback_url`. Can be: `POST` or `GET`, and the default is `POST`. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * The URL we call using the `callback_url` when the Command has finished sending, whether the command was delivered or it failed. + * + * @param string $callbackUrl The URL we call using the `callback_url` when the Command has finished sending, whether the command was delivered or it failed. + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * @param string $commandMode + * @return $this Fluent Builder + */ + public function setCommandMode(string $commandMode): self + { + $this->options['commandMode'] = $commandMode; + return $this; + } + + /** + * Whether to include the SID of the command in the message body. Can be: `none`, `start`, or `end`, and the default behavior is `none`. When sending a Command to a SIM in text mode, we can automatically include the SID of the Command in the message body, which could be used to ensure that the device does not process the same Command more than once. A value of `start` will prepend the message with the Command SID, and `end` will append it to the end, separating the Command SID from the message body with a space. The length of the Command SID is included in the 160 character limit so the SMS body must be 128 characters or less before the Command SID is included. + * + * @param string $includeSid Whether to include the SID of the command in the message body. Can be: `none`, `start`, or `end`, and the default behavior is `none`. When sending a Command to a SIM in text mode, we can automatically include the SID of the Command in the message body, which could be used to ensure that the device does not process the same Command more than once. A value of `start` will prepend the message with the Command SID, and `end` will append it to the end, separating the Command SID from the message body with a space. The length of the Command SID is included in the 160 character limit so the SMS body must be 128 characters or less before the Command SID is included. + * @return $this Fluent Builder + */ + public function setIncludeSid(string $includeSid): self + { + $this->options['includeSid'] = $includeSid; + return $this; + } + + /** + * Whether to request delivery receipt from the recipient. For Commands that request delivery receipt, the Command state transitions to 'delivered' once the server has received a delivery receipt from the device. The default value is `true`. + * + * @param bool $deliveryReceiptRequested Whether to request delivery receipt from the recipient. For Commands that request delivery receipt, the Command state transitions to 'delivered' once the server has received a delivery receipt from the device. The default value is `true`. + * @return $this Fluent Builder + */ + public function setDeliveryReceiptRequested(bool $deliveryReceiptRequested): self + { + $this->options['deliveryReceiptRequested'] = $deliveryReceiptRequested; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.CreateCommandOptions ' . $options . ']'; + } +} + + + +class ReadCommandOptions extends Options + { + /** + * @param string $sim The `sid` or `unique_name` of the [Sim resources](https://www.twilio.com/docs/wireless/api/sim-resource) to read. + * @param string $status The status of the resources to read. Can be: `queued`, `sent`, `delivered`, `received`, or `failed`. + * @param string $direction Only return Commands with this direction value. + * @param string $transport Only return Commands with this transport value. Can be: `sms` or `ip`. + */ + public function __construct( + + string $sim = Values::NONE, + string $status = Values::NONE, + string $direction = Values::NONE, + string $transport = Values::NONE + + ) { + $this->options['sim'] = $sim; + $this->options['status'] = $status; + $this->options['direction'] = $direction; + $this->options['transport'] = $transport; + } + + /** + * The `sid` or `unique_name` of the [Sim resources](https://www.twilio.com/docs/wireless/api/sim-resource) to read. + * + * @param string $sim The `sid` or `unique_name` of the [Sim resources](https://www.twilio.com/docs/wireless/api/sim-resource) to read. + * @return $this Fluent Builder + */ + public function setSim(string $sim): self + { + $this->options['sim'] = $sim; + return $this; + } + + /** + * The status of the resources to read. Can be: `queued`, `sent`, `delivered`, `received`, or `failed`. + * + * @param string $status The status of the resources to read. Can be: `queued`, `sent`, `delivered`, `received`, or `failed`. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Only return Commands with this direction value. + * + * @param string $direction Only return Commands with this direction value. + * @return $this Fluent Builder + */ + public function setDirection(string $direction): self + { + $this->options['direction'] = $direction; + return $this; + } + + /** + * Only return Commands with this transport value. Can be: `sms` or `ip`. + * + * @param string $transport Only return Commands with this transport value. Can be: `sms` or `ip`. + * @return $this Fluent Builder + */ + public function setTransport(string $transport): self + { + $this->options['transport'] = $transport; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.ReadCommandOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/CommandPage.php b/app/api/Twilio/Rest/Wireless/V1/CommandPage.php new file mode 100755 index 0000000..b85ed90 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/CommandPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return CommandInstance \Twilio\Rest\Wireless\V1\CommandInstance + */ + public function buildInstance(array $payload): CommandInstance + { + return new CommandInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.CommandPage]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/RatePlanContext.php b/app/api/Twilio/Rest/Wireless/V1/RatePlanContext.php new file mode 100755 index 0000000..9063bb7 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/RatePlanContext.php @@ -0,0 +1,125 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/RatePlans/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the RatePlanInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the RatePlanInstance + * + * @return RatePlanInstance Fetched RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RatePlanInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new RatePlanInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Updated RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RatePlanInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'FriendlyName' => + $options['friendlyName'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new RatePlanInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.RatePlanContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/RatePlanInstance.php b/app/api/Twilio/Rest/Wireless/V1/RatePlanInstance.php new file mode 100755 index 0000000..1164f15 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/RatePlanInstance.php @@ -0,0 +1,172 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'dataEnabled' => Values::array_get($payload, 'data_enabled'), + 'dataMetering' => Values::array_get($payload, 'data_metering'), + 'dataLimit' => Values::array_get($payload, 'data_limit'), + 'messagingEnabled' => Values::array_get($payload, 'messaging_enabled'), + 'voiceEnabled' => Values::array_get($payload, 'voice_enabled'), + 'nationalRoamingEnabled' => Values::array_get($payload, 'national_roaming_enabled'), + 'nationalRoamingDataLimit' => Values::array_get($payload, 'national_roaming_data_limit'), + 'internationalRoaming' => Values::array_get($payload, 'international_roaming'), + 'internationalRoamingDataLimit' => Values::array_get($payload, 'international_roaming_data_limit'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return RatePlanContext Context for this RatePlanInstance + */ + protected function proxy(): RatePlanContext + { + if (!$this->context) { + $this->context = new RatePlanContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the RatePlanInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the RatePlanInstance + * + * @return RatePlanInstance Fetched RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): RatePlanInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Updated RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): RatePlanInstance + { + + return $this->proxy()->update($options); + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.RatePlanInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/RatePlanList.php b/app/api/Twilio/Rest/Wireless/V1/RatePlanList.php new file mode 100755 index 0000000..4a7bd6e --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/RatePlanList.php @@ -0,0 +1,210 @@ +solution = [ + ]; + + $this->uri = '/RatePlans'; + } + + /** + * Create the RatePlanInstance + * + * @param array|Options $options Optional Arguments + * @return RatePlanInstance Created RatePlanInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function create(array $options = []): RatePlanInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'FriendlyName' => + $options['friendlyName'], + 'DataEnabled' => + Serialize::booleanToString($options['dataEnabled']), + 'DataLimit' => + $options['dataLimit'], + 'DataMetering' => + $options['dataMetering'], + 'MessagingEnabled' => + Serialize::booleanToString($options['messagingEnabled']), + 'VoiceEnabled' => + Serialize::booleanToString($options['voiceEnabled']), + 'NationalRoamingEnabled' => + Serialize::booleanToString($options['nationalRoamingEnabled']), + 'InternationalRoaming' => + Serialize::map($options['internationalRoaming'], function ($e) { return $e; }), + 'NationalRoamingDataLimit' => + $options['nationalRoamingDataLimit'], + 'InternationalRoamingDataLimit' => + $options['internationalRoamingDataLimit'], + ]); + + $payload = $this->version->create('POST', $this->uri, [], $data); + + return new RatePlanInstance( + $this->version, + $payload + ); + } + + + /** + * Reads RatePlanInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return RatePlanInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams RatePlanInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of RatePlanInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return RatePlanPage Page of RatePlanInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): RatePlanPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new RatePlanPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of RatePlanInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return RatePlanPage Page of RatePlanInstance + */ + public function getPage(string $targetUrl): RatePlanPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new RatePlanPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a RatePlanContext + * + * @param string $sid The SID of the RatePlan resource to delete. + */ + public function getContext( + string $sid + + ): RatePlanContext + { + return new RatePlanContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.RatePlanList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/RatePlanOptions.php b/app/api/Twilio/Rest/Wireless/V1/RatePlanOptions.php new file mode 100755 index 0000000..1e00778 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/RatePlanOptions.php @@ -0,0 +1,332 @@ +options['uniqueName'] = $uniqueName; + $this->options['friendlyName'] = $friendlyName; + $this->options['dataEnabled'] = $dataEnabled; + $this->options['dataLimit'] = $dataLimit; + $this->options['dataMetering'] = $dataMetering; + $this->options['messagingEnabled'] = $messagingEnabled; + $this->options['voiceEnabled'] = $voiceEnabled; + $this->options['nationalRoamingEnabled'] = $nationalRoamingEnabled; + $this->options['internationalRoaming'] = $internationalRoaming; + $this->options['nationalRoamingDataLimit'] = $nationalRoamingDataLimit; + $this->options['internationalRoamingDataLimit'] = $internationalRoamingDataLimit; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It does not have to be unique. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It does not have to be unique. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Whether SIMs can use GPRS/3G/4G/LTE data connectivity. + * + * @param bool $dataEnabled Whether SIMs can use GPRS/3G/4G/LTE data connectivity. + * @return $this Fluent Builder + */ + public function setDataEnabled(bool $dataEnabled): self + { + $this->options['dataEnabled'] = $dataEnabled; + return $this; + } + + /** + * The total data usage (download and upload combined) in Megabytes that the Network allows during one month on the home network (T-Mobile USA). The metering period begins the day of activation and ends on the same day in the following month. Can be up to 2TB and the default value is `1000`. + * + * @param int $dataLimit The total data usage (download and upload combined) in Megabytes that the Network allows during one month on the home network (T-Mobile USA). The metering period begins the day of activation and ends on the same day in the following month. Can be up to 2TB and the default value is `1000`. + * @return $this Fluent Builder + */ + public function setDataLimit(int $dataLimit): self + { + $this->options['dataLimit'] = $dataLimit; + return $this; + } + + /** + * The model used to meter data usage. Can be: `payg` and `quota-1`, `quota-10`, and `quota-50`. Learn more about the available [data metering models](https://www.twilio.com/docs/wireless/api/rateplan-resource#payg-vs-quota-data-plans). + * + * @param string $dataMetering The model used to meter data usage. Can be: `payg` and `quota-1`, `quota-10`, and `quota-50`. Learn more about the available [data metering models](https://www.twilio.com/docs/wireless/api/rateplan-resource#payg-vs-quota-data-plans). + * @return $this Fluent Builder + */ + public function setDataMetering(string $dataMetering): self + { + $this->options['dataMetering'] = $dataMetering; + return $this; + } + + /** + * Whether SIMs can make, send, and receive SMS using [Commands](https://www.twilio.com/docs/wireless/api/command-resource). + * + * @param bool $messagingEnabled Whether SIMs can make, send, and receive SMS using [Commands](https://www.twilio.com/docs/wireless/api/command-resource). + * @return $this Fluent Builder + */ + public function setMessagingEnabled(bool $messagingEnabled): self + { + $this->options['messagingEnabled'] = $messagingEnabled; + return $this; + } + + /** + * Deprecated. + * + * @param bool $voiceEnabled Deprecated. + * @return $this Fluent Builder + */ + public function setVoiceEnabled(bool $voiceEnabled): self + { + $this->options['voiceEnabled'] = $voiceEnabled; + return $this; + } + + /** + * Whether SIMs can roam on networks other than the home network (T-Mobile USA) in the United States. See [national roaming](https://www.twilio.com/docs/wireless/api/rateplan-resource#national-roaming). + * + * @param bool $nationalRoamingEnabled Whether SIMs can roam on networks other than the home network (T-Mobile USA) in the United States. See [national roaming](https://www.twilio.com/docs/wireless/api/rateplan-resource#national-roaming). + * @return $this Fluent Builder + */ + public function setNationalRoamingEnabled(bool $nationalRoamingEnabled): self + { + $this->options['nationalRoamingEnabled'] = $nationalRoamingEnabled; + return $this; + } + + /** + * The list of services that SIMs capable of using GPRS/3G/4G/LTE data connectivity can use outside of the United States. Can contain: `data` and `messaging`. + * + * @param string[] $internationalRoaming The list of services that SIMs capable of using GPRS/3G/4G/LTE data connectivity can use outside of the United States. Can contain: `data` and `messaging`. + * @return $this Fluent Builder + */ + public function setInternationalRoaming(array $internationalRoaming): self + { + $this->options['internationalRoaming'] = $internationalRoaming; + return $this; + } + + /** + * The total data usage (download and upload combined) in Megabytes that the Network allows during one month on non-home networks in the United States. The metering period begins the day of activation and ends on the same day in the following month. Can be up to 2TB. See [national roaming](https://www.twilio.com/docs/wireless/api/rateplan-resource#national-roaming) for more info. + * + * @param int $nationalRoamingDataLimit The total data usage (download and upload combined) in Megabytes that the Network allows during one month on non-home networks in the United States. The metering period begins the day of activation and ends on the same day in the following month. Can be up to 2TB. See [national roaming](https://www.twilio.com/docs/wireless/api/rateplan-resource#national-roaming) for more info. + * @return $this Fluent Builder + */ + public function setNationalRoamingDataLimit(int $nationalRoamingDataLimit): self + { + $this->options['nationalRoamingDataLimit'] = $nationalRoamingDataLimit; + return $this; + } + + /** + * The total data usage (download and upload combined) in Megabytes that the Network allows during one month when roaming outside the United States. Can be up to 2TB. + * + * @param int $internationalRoamingDataLimit The total data usage (download and upload combined) in Megabytes that the Network allows during one month when roaming outside the United States. Can be up to 2TB. + * @return $this Fluent Builder + */ + public function setInternationalRoamingDataLimit(int $internationalRoamingDataLimit): self + { + $this->options['internationalRoamingDataLimit'] = $internationalRoamingDataLimit; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.CreateRatePlanOptions ' . $options . ']'; + } +} + + + + +class UpdateRatePlanOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @param string $friendlyName A descriptive string that you create to describe the resource. It does not have to be unique. + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $friendlyName = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['friendlyName'] = $friendlyName; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the resource's `sid` in the URL to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * A descriptive string that you create to describe the resource. It does not have to be unique. + * + * @param string $friendlyName A descriptive string that you create to describe the resource. It does not have to be unique. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.UpdateRatePlanOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/RatePlanPage.php b/app/api/Twilio/Rest/Wireless/V1/RatePlanPage.php new file mode 100755 index 0000000..b2d39c7 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/RatePlanPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return RatePlanInstance \Twilio\Rest\Wireless\V1\RatePlanInstance + */ + public function buildInstance(array $payload): RatePlanInstance + { + return new RatePlanInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.RatePlanPage]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionInstance.php b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionInstance.php new file mode 100755 index 0000000..d2c4361 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionInstance.php @@ -0,0 +1,112 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'radioLink' => Values::array_get($payload, 'radio_link'), + 'operatorMcc' => Values::array_get($payload, 'operator_mcc'), + 'operatorMnc' => Values::array_get($payload, 'operator_mnc'), + 'operatorCountry' => Values::array_get($payload, 'operator_country'), + 'operatorName' => Values::array_get($payload, 'operator_name'), + 'cellId' => Values::array_get($payload, 'cell_id'), + 'cellLocationEstimate' => Values::array_get($payload, 'cell_location_estimate'), + 'packetsUploaded' => Values::array_get($payload, 'packets_uploaded'), + 'packetsDownloaded' => Values::array_get($payload, 'packets_downloaded'), + 'lastUpdated' => Deserialize::dateTime(Values::array_get($payload, 'last_updated')), + 'start' => Deserialize::dateTime(Values::array_get($payload, 'start')), + 'end' => Deserialize::dateTime(Values::array_get($payload, 'end')), + 'imei' => Values::array_get($payload, 'imei'), + ]; + + $this->solution = ['simSid' => $simSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.DataSessionInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionList.php b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionList.php new file mode 100755 index 0000000..d3dc255 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionList.php @@ -0,0 +1,151 @@ +solution = [ + 'simSid' => + $simSid, + + ]; + + $this->uri = '/Sims/' . \rawurlencode($simSid) + .'/DataSessions'; + } + + /** + * Reads DataSessionInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return DataSessionInstance[] Array of results + */ + public function read(int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($limit, $pageSize), false); + } + + /** + * Streams DataSessionInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of DataSessionInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return DataSessionPage Page of DataSessionInstance + */ + public function page( + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): DataSessionPage + { + + $params = Values::of([ + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new DataSessionPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of DataSessionInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return DataSessionPage Page of DataSessionInstance + */ + public function getPage(string $targetUrl): DataSessionPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new DataSessionPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.DataSessionList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionPage.php b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionPage.php new file mode 100755 index 0000000..a681659 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/DataSessionPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return DataSessionInstance \Twilio\Rest\Wireless\V1\Sim\DataSessionInstance + */ + public function buildInstance(array $payload): DataSessionInstance + { + return new DataSessionInstance($this->version, $payload, $this->solution['simSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.DataSessionPage]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordInstance.php b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordInstance.php new file mode 100755 index 0000000..221ff94 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordInstance.php @@ -0,0 +1,89 @@ +properties = [ + 'simSid' => Values::array_get($payload, 'sim_sid'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'period' => Values::array_get($payload, 'period'), + 'commands' => Values::array_get($payload, 'commands'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = ['simSid' => $simSid, ]; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordList.php b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordList.php new file mode 100755 index 0000000..8049af1 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordList.php @@ -0,0 +1,163 @@ +solution = [ + 'simSid' => + $simSid, + + ]; + + $this->uri = '/Sims/' . \rawurlencode($simSid) + .'/UsageRecords'; + } + + /** + * Reads UsageRecordInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UsageRecordInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams UsageRecordInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UsageRecordPage + { + $options = new Values($options); + + $params = Values::of([ + 'End' => + Serialize::iso8601DateTime($options['end']), + 'Start' => + Serialize::iso8601DateTime($options['start']), + 'Granularity' => + $options['granularity'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function getPage(string $targetUrl): UsageRecordPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordOptions.php b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordOptions.php new file mode 100755 index 0000000..c9156d9 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordOptions.php @@ -0,0 +1,112 @@ +options['end'] = $end; + $this->options['start'] = $start; + $this->options['granularity'] = $granularity; + } + + /** + * Only include usage that occurred on or before this date, specified in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). The default is the current time. + * + * @param \DateTime $end Only include usage that occurred on or before this date, specified in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). The default is the current time. + * @return $this Fluent Builder + */ + public function setEnd(\DateTime $end): self + { + $this->options['end'] = $end; + return $this; + } + + /** + * Only include usage that has occurred on or after this date, specified in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). The default is one month before the `end` parameter value. + * + * @param \DateTime $start Only include usage that has occurred on or after this date, specified in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). The default is one month before the `end` parameter value. + * @return $this Fluent Builder + */ + public function setStart(\DateTime $start): self + { + $this->options['start'] = $start; + return $this; + } + + /** + * How to summarize the usage by time. Can be: `daily`, `hourly`, or `all`. The default is `all`. A value of `all` returns one Usage Record that describes the usage for the entire period. + * + * @param string $granularity How to summarize the usage by time. Can be: `daily`, `hourly`, or `all`. The default is `all`. A value of `all` returns one Usage Record that describes the usage for the entire period. + * @return $this Fluent Builder + */ + public function setGranularity(string $granularity): self + { + $this->options['granularity'] = $granularity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.ReadUsageRecordOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordPage.php b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordPage.php new file mode 100755 index 0000000..186fac6 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/Sim/UsageRecordPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsageRecordInstance \Twilio\Rest\Wireless\V1\Sim\UsageRecordInstance + */ + public function buildInstance(array $payload): UsageRecordInstance + { + return new UsageRecordInstance($this->version, $payload, $this->solution['simSid']); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordPage]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/SimContext.php b/app/api/Twilio/Rest/Wireless/V1/SimContext.php new file mode 100755 index 0000000..51a307c --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/SimContext.php @@ -0,0 +1,232 @@ +solution = [ + 'sid' => + $sid, + ]; + + $this->uri = '/Sims/' . \rawurlencode($sid) + .''; + } + + /** + * Delete the SimInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->version->delete('DELETE', $this->uri); + } + + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + $payload = $this->version->fetch('GET', $this->uri); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + $options = new Values($options); + + $data = Values::of([ + 'UniqueName' => + $options['uniqueName'], + 'CallbackMethod' => + $options['callbackMethod'], + 'CallbackUrl' => + $options['callbackUrl'], + 'FriendlyName' => + $options['friendlyName'], + 'RatePlan' => + $options['ratePlan'], + 'Status' => + $options['status'], + 'CommandsCallbackMethod' => + $options['commandsCallbackMethod'], + 'CommandsCallbackUrl' => + $options['commandsCallbackUrl'], + 'SmsFallbackMethod' => + $options['smsFallbackMethod'], + 'SmsFallbackUrl' => + $options['smsFallbackUrl'], + 'SmsMethod' => + $options['smsMethod'], + 'SmsUrl' => + $options['smsUrl'], + 'VoiceFallbackMethod' => + $options['voiceFallbackMethod'], + 'VoiceFallbackUrl' => + $options['voiceFallbackUrl'], + 'VoiceMethod' => + $options['voiceMethod'], + 'VoiceUrl' => + $options['voiceUrl'], + 'ResetStatus' => + $options['resetStatus'], + 'AccountSid' => + $options['accountSid'], + ]); + + $payload = $this->version->update('POST', $this->uri, [], $data); + + return new SimInstance( + $this->version, + $payload, + $this->solution['sid'] + ); + } + + + /** + * Access the dataSessions + */ + protected function getDataSessions(): DataSessionList + { + if (!$this->_dataSessions) { + $this->_dataSessions = new DataSessionList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_dataSessions; + } + + /** + * Access the usageRecords + */ + protected function getUsageRecords(): UsageRecordList + { + if (!$this->_usageRecords) { + $this->_usageRecords = new UsageRecordList( + $this->version, + $this->solution['sid'] + ); + } + + return $this->_usageRecords; + } + + /** + * Magic getter to lazy load subresources + * + * @param string $name Subresource to return + * @return ListResource The requested subresource + * @throws TwilioException For unknown subresources + */ + public function __get(string $name): ListResource + { + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown subresource ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments): InstanceContext + { + $property = $this->$name; + if (\method_exists($property, 'getContext')) { + return \call_user_func_array(array($property, 'getContext'), $arguments); + } + + throw new TwilioException('Resource does not have a context'); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.SimContext ' . \implode(' ', $context) . ']'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/SimInstance.php b/app/api/Twilio/Rest/Wireless/V1/SimInstance.php new file mode 100755 index 0000000..55d29d0 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/SimInstance.php @@ -0,0 +1,209 @@ +properties = [ + 'sid' => Values::array_get($payload, 'sid'), + 'uniqueName' => Values::array_get($payload, 'unique_name'), + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'ratePlanSid' => Values::array_get($payload, 'rate_plan_sid'), + 'friendlyName' => Values::array_get($payload, 'friendly_name'), + 'iccid' => Values::array_get($payload, 'iccid'), + 'eId' => Values::array_get($payload, 'e_id'), + 'status' => Values::array_get($payload, 'status'), + 'resetStatus' => Values::array_get($payload, 'reset_status'), + 'commandsCallbackUrl' => Values::array_get($payload, 'commands_callback_url'), + 'commandsCallbackMethod' => Values::array_get($payload, 'commands_callback_method'), + 'smsFallbackMethod' => Values::array_get($payload, 'sms_fallback_method'), + 'smsFallbackUrl' => Values::array_get($payload, 'sms_fallback_url'), + 'smsMethod' => Values::array_get($payload, 'sms_method'), + 'smsUrl' => Values::array_get($payload, 'sms_url'), + 'voiceFallbackMethod' => Values::array_get($payload, 'voice_fallback_method'), + 'voiceFallbackUrl' => Values::array_get($payload, 'voice_fallback_url'), + 'voiceMethod' => Values::array_get($payload, 'voice_method'), + 'voiceUrl' => Values::array_get($payload, 'voice_url'), + 'dateCreated' => Deserialize::dateTime(Values::array_get($payload, 'date_created')), + 'dateUpdated' => Deserialize::dateTime(Values::array_get($payload, 'date_updated')), + 'url' => Values::array_get($payload, 'url'), + 'links' => Values::array_get($payload, 'links'), + 'ipAddress' => Values::array_get($payload, 'ip_address'), + ]; + + $this->solution = ['sid' => $sid ?: $this->properties['sid'], ]; + } + + /** + * Generate an instance context for the instance, the context is capable of + * performing various actions. All instance actions are proxied to the context + * + * @return SimContext Context for this SimInstance + */ + protected function proxy(): SimContext + { + if (!$this->context) { + $this->context = new SimContext( + $this->version, + $this->solution['sid'] + ); + } + + return $this->context; + } + + /** + * Delete the SimInstance + * + * @return bool True if delete succeeds, false otherwise + * @throws TwilioException When an HTTP error occurs. + */ + public function delete(): bool + { + + return $this->proxy()->delete(); + } + + /** + * Fetch the SimInstance + * + * @return SimInstance Fetched SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function fetch(): SimInstance + { + + return $this->proxy()->fetch(); + } + + /** + * Update the SimInstance + * + * @param array|Options $options Optional Arguments + * @return SimInstance Updated SimInstance + * @throws TwilioException When an HTTP error occurs. + */ + public function update(array $options = []): SimInstance + { + + return $this->proxy()->update($options); + } + + /** + * Access the dataSessions + */ + protected function getDataSessions(): DataSessionList + { + return $this->proxy()->dataSessions; + } + + /** + * Access the usageRecords + */ + protected function getUsageRecords(): UsageRecordList + { + return $this->proxy()->usageRecords; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $context = []; + foreach ($this->solution as $key => $value) { + $context[] = "$key=$value"; + } + return '[Twilio.Wireless.V1.SimInstance ' . \implode(' ', $context) . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/SimList.php b/app/api/Twilio/Rest/Wireless/V1/SimList.php new file mode 100755 index 0000000..4fc1b8c --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/SimList.php @@ -0,0 +1,176 @@ +solution = [ + ]; + + $this->uri = '/Sims'; + } + + /** + * Reads SimInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return SimInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams SimInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of SimInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return SimPage Page of SimInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): SimPage + { + $options = new Values($options); + + $params = Values::of([ + 'Status' => + $options['status'], + 'Iccid' => + $options['iccid'], + 'RatePlan' => + $options['ratePlan'], + 'EId' => + $options['eId'], + 'SimRegistrationCode' => + $options['simRegistrationCode'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new SimPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of SimInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return SimPage Page of SimInstance + */ + public function getPage(string $targetUrl): SimPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new SimPage($this->version, $response, $this->solution); + } + + + /** + * Constructs a SimContext + * + * @param string $sid The SID or the `unique_name` of the Sim resource to delete. + */ + public function getContext( + string $sid + + ): SimContext + { + return new SimContext( + $this->version, + $sid + ); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.SimList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/SimOptions.php b/app/api/Twilio/Rest/Wireless/V1/SimOptions.php new file mode 100755 index 0000000..0cb5fc2 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/SimOptions.php @@ -0,0 +1,506 @@ +options['status'] = $status; + $this->options['iccid'] = $iccid; + $this->options['ratePlan'] = $ratePlan; + $this->options['eId'] = $eId; + $this->options['simRegistrationCode'] = $simRegistrationCode; + } + + /** + * Only return Sim resources with this status. + * + * @param string $status Only return Sim resources with this status. + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * Only return Sim resources with this ICCID. This will return a list with a maximum size of 1. + * + * @param string $iccid Only return Sim resources with this ICCID. This will return a list with a maximum size of 1. + * @return $this Fluent Builder + */ + public function setIccid(string $iccid): self + { + $this->options['iccid'] = $iccid; + return $this; + } + + /** + * The SID or unique name of a [RatePlan resource](https://www.twilio.com/docs/wireless/api/rateplan-resource). Only return Sim resources assigned to this RatePlan resource. + * + * @param string $ratePlan The SID or unique name of a [RatePlan resource](https://www.twilio.com/docs/wireless/api/rateplan-resource). Only return Sim resources assigned to this RatePlan resource. + * @return $this Fluent Builder + */ + public function setRatePlan(string $ratePlan): self + { + $this->options['ratePlan'] = $ratePlan; + return $this; + } + + /** + * Deprecated. + * + * @param string $eId Deprecated. + * @return $this Fluent Builder + */ + public function setEId(string $eId): self + { + $this->options['eId'] = $eId; + return $this; + } + + /** + * Only return Sim resources with this registration code. This will return a list with a maximum size of 1. + * + * @param string $simRegistrationCode Only return Sim resources with this registration code. This will return a list with a maximum size of 1. + * @return $this Fluent Builder + */ + public function setSimRegistrationCode(string $simRegistrationCode): self + { + $this->options['simRegistrationCode'] = $simRegistrationCode; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.ReadSimOptions ' . $options . ']'; + } +} + +class UpdateSimOptions extends Options + { + /** + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the `sid` in the URL path to address the resource. + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * @param string $callbackUrl The URL we should call using the `callback_url` when the SIM has finished updating. When the SIM transitions from `new` to `ready` or from any status to `deactivated`, we call this URL when the status changes to an intermediate status (`ready` or `deactivated`) and again when the status changes to its final status (`active` or `canceled`). + * @param string $friendlyName A descriptive string that you create to describe the Sim resource. It does not need to be unique. + * @param string $ratePlan The SID or unique name of the [RatePlan resource](https://www.twilio.com/docs/wireless/api/rateplan-resource) to which the Sim resource should be assigned. + * @param string $status + * @param string $commandsCallbackMethod The HTTP method we should use to call `commands_callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * @param string $commandsCallbackUrl The URL we should call using the `commands_callback_method` when the SIM sends a [Command](https://www.twilio.com/docs/wireless/api/command-resource). Your server should respond with an HTTP status code in the 200 range; any response body is ignored. + * @param string $smsFallbackMethod The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. Default is `POST`. + * @param string $smsFallbackUrl The URL we should call using the `sms_fallback_method` when an error occurs while retrieving or executing the TwiML requested from `sms_url`. + * @param string $smsMethod The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. Default is `POST`. + * @param string $smsUrl The URL we should call using the `sms_method` when the SIM-connected device sends an SMS message that is not a [Command](https://www.twilio.com/docs/wireless/api/command-resource). + * @param string $voiceFallbackMethod Deprecated. + * @param string $voiceFallbackUrl Deprecated. + * @param string $voiceMethod Deprecated. + * @param string $voiceUrl Deprecated. + * @param string $resetStatus + * @param string $accountSid The SID of the [Account](https://www.twilio.com/docs/iam/api/account) to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a [Subaccount](https://www.twilio.com/docs/iam/api/subaccounts) of the requesting Account. Only valid when the Sim resource's status is `new`. For more information, see the [Move SIMs between Subaccounts documentation](https://www.twilio.com/docs/wireless/api/sim-resource#move-sims-between-subaccounts). + */ + public function __construct( + + string $uniqueName = Values::NONE, + string $callbackMethod = Values::NONE, + string $callbackUrl = Values::NONE, + string $friendlyName = Values::NONE, + string $ratePlan = Values::NONE, + string $status = Values::NONE, + string $commandsCallbackMethod = Values::NONE, + string $commandsCallbackUrl = Values::NONE, + string $smsFallbackMethod = Values::NONE, + string $smsFallbackUrl = Values::NONE, + string $smsMethod = Values::NONE, + string $smsUrl = Values::NONE, + string $voiceFallbackMethod = Values::NONE, + string $voiceFallbackUrl = Values::NONE, + string $voiceMethod = Values::NONE, + string $voiceUrl = Values::NONE, + string $resetStatus = Values::NONE, + string $accountSid = Values::NONE + + ) { + $this->options['uniqueName'] = $uniqueName; + $this->options['callbackMethod'] = $callbackMethod; + $this->options['callbackUrl'] = $callbackUrl; + $this->options['friendlyName'] = $friendlyName; + $this->options['ratePlan'] = $ratePlan; + $this->options['status'] = $status; + $this->options['commandsCallbackMethod'] = $commandsCallbackMethod; + $this->options['commandsCallbackUrl'] = $commandsCallbackUrl; + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + $this->options['smsMethod'] = $smsMethod; + $this->options['smsUrl'] = $smsUrl; + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + $this->options['voiceMethod'] = $voiceMethod; + $this->options['voiceUrl'] = $voiceUrl; + $this->options['resetStatus'] = $resetStatus; + $this->options['accountSid'] = $accountSid; + } + + /** + * An application-defined string that uniquely identifies the resource. It can be used in place of the `sid` in the URL path to address the resource. + * + * @param string $uniqueName An application-defined string that uniquely identifies the resource. It can be used in place of the `sid` in the URL path to address the resource. + * @return $this Fluent Builder + */ + public function setUniqueName(string $uniqueName): self + { + $this->options['uniqueName'] = $uniqueName; + return $this; + } + + /** + * The HTTP method we should use to call `callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * + * @param string $callbackMethod The HTTP method we should use to call `callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * @return $this Fluent Builder + */ + public function setCallbackMethod(string $callbackMethod): self + { + $this->options['callbackMethod'] = $callbackMethod; + return $this; + } + + /** + * The URL we should call using the `callback_url` when the SIM has finished updating. When the SIM transitions from `new` to `ready` or from any status to `deactivated`, we call this URL when the status changes to an intermediate status (`ready` or `deactivated`) and again when the status changes to its final status (`active` or `canceled`). + * + * @param string $callbackUrl The URL we should call using the `callback_url` when the SIM has finished updating. When the SIM transitions from `new` to `ready` or from any status to `deactivated`, we call this URL when the status changes to an intermediate status (`ready` or `deactivated`) and again when the status changes to its final status (`active` or `canceled`). + * @return $this Fluent Builder + */ + public function setCallbackUrl(string $callbackUrl): self + { + $this->options['callbackUrl'] = $callbackUrl; + return $this; + } + + /** + * A descriptive string that you create to describe the Sim resource. It does not need to be unique. + * + * @param string $friendlyName A descriptive string that you create to describe the Sim resource. It does not need to be unique. + * @return $this Fluent Builder + */ + public function setFriendlyName(string $friendlyName): self + { + $this->options['friendlyName'] = $friendlyName; + return $this; + } + + /** + * The SID or unique name of the [RatePlan resource](https://www.twilio.com/docs/wireless/api/rateplan-resource) to which the Sim resource should be assigned. + * + * @param string $ratePlan The SID or unique name of the [RatePlan resource](https://www.twilio.com/docs/wireless/api/rateplan-resource) to which the Sim resource should be assigned. + * @return $this Fluent Builder + */ + public function setRatePlan(string $ratePlan): self + { + $this->options['ratePlan'] = $ratePlan; + return $this; + } + + /** + * @param string $status + * @return $this Fluent Builder + */ + public function setStatus(string $status): self + { + $this->options['status'] = $status; + return $this; + } + + /** + * The HTTP method we should use to call `commands_callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * + * @param string $commandsCallbackMethod The HTTP method we should use to call `commands_callback_url`. Can be: `POST` or `GET`. The default is `POST`. + * @return $this Fluent Builder + */ + public function setCommandsCallbackMethod(string $commandsCallbackMethod): self + { + $this->options['commandsCallbackMethod'] = $commandsCallbackMethod; + return $this; + } + + /** + * The URL we should call using the `commands_callback_method` when the SIM sends a [Command](https://www.twilio.com/docs/wireless/api/command-resource). Your server should respond with an HTTP status code in the 200 range; any response body is ignored. + * + * @param string $commandsCallbackUrl The URL we should call using the `commands_callback_method` when the SIM sends a [Command](https://www.twilio.com/docs/wireless/api/command-resource). Your server should respond with an HTTP status code in the 200 range; any response body is ignored. + * @return $this Fluent Builder + */ + public function setCommandsCallbackUrl(string $commandsCallbackUrl): self + { + $this->options['commandsCallbackUrl'] = $commandsCallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. Default is `POST`. + * + * @param string $smsFallbackMethod The HTTP method we should use to call `sms_fallback_url`. Can be: `GET` or `POST`. Default is `POST`. + * @return $this Fluent Builder + */ + public function setSmsFallbackMethod(string $smsFallbackMethod): self + { + $this->options['smsFallbackMethod'] = $smsFallbackMethod; + return $this; + } + + /** + * The URL we should call using the `sms_fallback_method` when an error occurs while retrieving or executing the TwiML requested from `sms_url`. + * + * @param string $smsFallbackUrl The URL we should call using the `sms_fallback_method` when an error occurs while retrieving or executing the TwiML requested from `sms_url`. + * @return $this Fluent Builder + */ + public function setSmsFallbackUrl(string $smsFallbackUrl): self + { + $this->options['smsFallbackUrl'] = $smsFallbackUrl; + return $this; + } + + /** + * The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. Default is `POST`. + * + * @param string $smsMethod The HTTP method we should use to call `sms_url`. Can be: `GET` or `POST`. Default is `POST`. + * @return $this Fluent Builder + */ + public function setSmsMethod(string $smsMethod): self + { + $this->options['smsMethod'] = $smsMethod; + return $this; + } + + /** + * The URL we should call using the `sms_method` when the SIM-connected device sends an SMS message that is not a [Command](https://www.twilio.com/docs/wireless/api/command-resource). + * + * @param string $smsUrl The URL we should call using the `sms_method` when the SIM-connected device sends an SMS message that is not a [Command](https://www.twilio.com/docs/wireless/api/command-resource). + * @return $this Fluent Builder + */ + public function setSmsUrl(string $smsUrl): self + { + $this->options['smsUrl'] = $smsUrl; + return $this; + } + + /** + * Deprecated. + * + * @param string $voiceFallbackMethod Deprecated. + * @return $this Fluent Builder + */ + public function setVoiceFallbackMethod(string $voiceFallbackMethod): self + { + $this->options['voiceFallbackMethod'] = $voiceFallbackMethod; + return $this; + } + + /** + * Deprecated. + * + * @param string $voiceFallbackUrl Deprecated. + * @return $this Fluent Builder + */ + public function setVoiceFallbackUrl(string $voiceFallbackUrl): self + { + $this->options['voiceFallbackUrl'] = $voiceFallbackUrl; + return $this; + } + + /** + * Deprecated. + * + * @param string $voiceMethod Deprecated. + * @return $this Fluent Builder + */ + public function setVoiceMethod(string $voiceMethod): self + { + $this->options['voiceMethod'] = $voiceMethod; + return $this; + } + + /** + * Deprecated. + * + * @param string $voiceUrl Deprecated. + * @return $this Fluent Builder + */ + public function setVoiceUrl(string $voiceUrl): self + { + $this->options['voiceUrl'] = $voiceUrl; + return $this; + } + + /** + * @param string $resetStatus + * @return $this Fluent Builder + */ + public function setResetStatus(string $resetStatus): self + { + $this->options['resetStatus'] = $resetStatus; + return $this; + } + + /** + * The SID of the [Account](https://www.twilio.com/docs/iam/api/account) to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a [Subaccount](https://www.twilio.com/docs/iam/api/subaccounts) of the requesting Account. Only valid when the Sim resource's status is `new`. For more information, see the [Move SIMs between Subaccounts documentation](https://www.twilio.com/docs/wireless/api/sim-resource#move-sims-between-subaccounts). + * + * @param string $accountSid The SID of the [Account](https://www.twilio.com/docs/iam/api/account) to which the Sim resource should belong. The Account SID can only be that of the requesting Account or that of a [Subaccount](https://www.twilio.com/docs/iam/api/subaccounts) of the requesting Account. Only valid when the Sim resource's status is `new`. For more information, see the [Move SIMs between Subaccounts documentation](https://www.twilio.com/docs/wireless/api/sim-resource#move-sims-between-subaccounts). + * @return $this Fluent Builder + */ + public function setAccountSid(string $accountSid): self + { + $this->options['accountSid'] = $accountSid; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.UpdateSimOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/SimPage.php b/app/api/Twilio/Rest/Wireless/V1/SimPage.php new file mode 100755 index 0000000..8fd38a0 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/SimPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return SimInstance \Twilio\Rest\Wireless\V1\SimInstance + */ + public function buildInstance(array $payload): SimInstance + { + return new SimInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.SimPage]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/UsageRecordInstance.php b/app/api/Twilio/Rest/Wireless/V1/UsageRecordInstance.php new file mode 100755 index 0000000..4cb7e93 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/UsageRecordInstance.php @@ -0,0 +1,86 @@ +properties = [ + 'accountSid' => Values::array_get($payload, 'account_sid'), + 'period' => Values::array_get($payload, 'period'), + 'commands' => Values::array_get($payload, 'commands'), + 'data' => Values::array_get($payload, 'data'), + ]; + + $this->solution = []; + } + + /** + * Magic getter to access properties + * + * @param string $name Property to access + * @return mixed The requested property + * @throws TwilioException For unknown properties + */ + public function __get(string $name) + { + if (\array_key_exists($name, $this->properties)) { + return $this->properties[$name]; + } + + if (\property_exists($this, '_' . $name)) { + $method = 'get' . \ucfirst($name); + return $this->$method(); + } + + throw new TwilioException('Unknown property: ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordInstance]'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/UsageRecordList.php b/app/api/Twilio/Rest/Wireless/V1/UsageRecordList.php new file mode 100755 index 0000000..a59c5a9 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/UsageRecordList.php @@ -0,0 +1,157 @@ +solution = [ + ]; + + $this->uri = '/UsageRecords'; + } + + /** + * Reads UsageRecordInstance records from the API as a list. + * Unlike stream(), this operation is eager and will load `limit` records into + * memory before returning. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. read() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, read() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return UsageRecordInstance[] Array of results + */ + public function read(array $options = [], int $limit = null, $pageSize = null): array + { + return \iterator_to_array($this->stream($options, $limit, $pageSize), false); + } + + /** + * Streams UsageRecordInstance records from the API as a generator stream. + * This operation lazily loads records as efficiently as possible until the + * limit + * is reached. + * The results are returned as a generator, so this operation is memory + * efficient. + * + * @param array|Options $options Optional Arguments + * @param int $limit Upper limit for the number of records to return. stream() + * guarantees to never return more than limit. Default is no + * limit + * @param mixed $pageSize Number of records to fetch per request, when not set + * will use the default value of 50 records. If no + * page_size is defined but a limit is defined, stream() + * will attempt to read the limit with the most + * efficient page size, i.e. min(limit, 1000) + * @return Stream stream of results + */ + public function stream(array $options = [], int $limit = null, $pageSize = null): Stream + { + $limits = $this->version->readLimits($limit, $pageSize); + + $page = $this->page($options, $limits['pageSize']); + + return $this->version->stream($page, $limits['limit'], $limits['pageLimit']); + } + + /** + * Retrieve a single page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param mixed $pageSize Number of records to return, defaults to 50 + * @param string $pageToken PageToken provided by the API + * @param mixed $pageNumber Page Number, this value is simply for client state + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function page( + array $options = [], + $pageSize = Values::NONE, + string $pageToken = Values::NONE, + $pageNumber = Values::NONE + ): UsageRecordPage + { + $options = new Values($options); + + $params = Values::of([ + 'End' => + Serialize::iso8601DateTime($options['end']), + 'Start' => + Serialize::iso8601DateTime($options['start']), + 'Granularity' => + $options['granularity'], + 'PageToken' => $pageToken, + 'Page' => $pageNumber, + 'PageSize' => $pageSize, + ]); + + $response = $this->version->page('GET', $this->uri, $params); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + /** + * Retrieve a specific page of UsageRecordInstance records from the API. + * Request is executed immediately + * + * @param string $targetUrl API-generated URL for the requested results page + * @return UsageRecordPage Page of UsageRecordInstance + */ + public function getPage(string $targetUrl): UsageRecordPage + { + $response = $this->version->getDomain()->getClient()->request( + 'GET', + $targetUrl + ); + + return new UsageRecordPage($this->version, $response, $this->solution); + } + + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordList]'; + } +} diff --git a/app/api/Twilio/Rest/Wireless/V1/UsageRecordOptions.php b/app/api/Twilio/Rest/Wireless/V1/UsageRecordOptions.php new file mode 100755 index 0000000..f1068c7 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/UsageRecordOptions.php @@ -0,0 +1,112 @@ +options['end'] = $end; + $this->options['start'] = $start; + $this->options['granularity'] = $granularity; + } + + /** + * Only include usage that has occurred on or before this date. Format is [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). + * + * @param \DateTime $end Only include usage that has occurred on or before this date. Format is [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). + * @return $this Fluent Builder + */ + public function setEnd(\DateTime $end): self + { + $this->options['end'] = $end; + return $this; + } + + /** + * Only include usage that has occurred on or after this date. Format is [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). + * + * @param \DateTime $start Only include usage that has occurred on or after this date. Format is [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html). + * @return $this Fluent Builder + */ + public function setStart(\DateTime $start): self + { + $this->options['start'] = $start; + return $this; + } + + /** + * How to summarize the usage by time. Can be: `daily`, `hourly`, or `all`. A value of `all` returns one Usage Record that describes the usage for the entire period. + * + * @param string $granularity How to summarize the usage by time. Can be: `daily`, `hourly`, or `all`. A value of `all` returns one Usage Record that describes the usage for the entire period. + * @return $this Fluent Builder + */ + public function setGranularity(string $granularity): self + { + $this->options['granularity'] = $granularity; + return $this; + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + $options = \http_build_query(Values::of($this->options), '', ' '); + return '[Twilio.Wireless.V1.ReadUsageRecordOptions ' . $options . ']'; + } +} + diff --git a/app/api/Twilio/Rest/Wireless/V1/UsageRecordPage.php b/app/api/Twilio/Rest/Wireless/V1/UsageRecordPage.php new file mode 100755 index 0000000..cf99de5 --- /dev/null +++ b/app/api/Twilio/Rest/Wireless/V1/UsageRecordPage.php @@ -0,0 +1,55 @@ +solution = $solution; + } + + /** + * @param array $payload Payload response from the API + * @return UsageRecordInstance \Twilio\Rest\Wireless\V1\UsageRecordInstance + */ + public function buildInstance(array $payload): UsageRecordInstance + { + return new UsageRecordInstance($this->version, $payload); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string + { + return '[Twilio.Wireless.V1.UsageRecordPage]'; + } +} diff --git a/app/api/Twilio/Rest/WirelessBase.php b/app/api/Twilio/Rest/WirelessBase.php new file mode 100755 index 0000000..773a7e0 --- /dev/null +++ b/app/api/Twilio/Rest/WirelessBase.php @@ -0,0 +1,88 @@ +baseUrl = 'https://wireless.twilio.com'; + } + + + /** + * @return V1 Version v1 of wireless + */ + protected function getV1(): V1 { + if (!$this->_v1) { + $this->_v1 = new V1($this); + } + return $this->_v1; + } + + /** + * Magic getter to lazy load version + * + * @param string $name Version to return + * @return \Twilio\Version The requested version + * @throws TwilioException For unknown versions + */ + public function __get(string $name) { + $method = 'get' . \ucfirst($name); + if (\method_exists($this, $method)) { + return $this->$method(); + } + + throw new TwilioException('Unknown version ' . $name); + } + + /** + * Magic caller to get resource contexts + * + * @param string $name Resource to return + * @param array $arguments Context parameters + * @return \Twilio\InstanceContext The requested resource context + * @throws TwilioException For unknown resource + */ + public function __call(string $name, array $arguments) { + $method = 'context' . \ucfirst($name); + if (\method_exists($this, $method)) { + return \call_user_func_array([$this, $method], $arguments); + } + + throw new TwilioException('Unknown context ' . $name); + } + + /** + * Provide a friendly representation + * + * @return string Machine friendly representation + */ + public function __toString(): string { + return '[Twilio.Wireless]'; + } +} diff --git a/app/api/Twilio/Security/RequestValidator.php b/app/api/Twilio/Security/RequestValidator.php new file mode 100755 index 0000000..8e02e1c --- /dev/null +++ b/app/api/Twilio/Security/RequestValidator.php @@ -0,0 +1,172 @@ +validate($_SERVER['HTTP_X_TWILIO_SIGNATURE'], 'https://your-example-url.com/api/route/', $_REQUEST); + * $isFromTwilio // <- if this is true, the request did come from Twilio, if not, it didn't + */ +class RequestValidator { + + /** + * @access private + * @var string The auth token to the Twilio Account + */ + private $authToken; + + /** + * constructor + * @access public + * @param string $authToken the auth token of the Twilio user's account + * Sets the account auth token to be used by the rest of the class + */ + public function __construct(string $authToken) { + $this->authToken = $authToken; + } + + /** + * Creates the actual base64 encoded signature of the sha1 hash of the concatenated URL and your auth token + * + * @param string $url the full URL of the request URL you specify for your phone number or app, from the protocol (https...) through the end of the query string (everything after the ?) + * @param array $data the Twilio parameters the request was made with + * @return string + */ + public function computeSignature(string $url, array $data = []): string { + // sort the array by keys + \ksort($data); + + foreach ($data as $key => $value) { + // convert a single value to an array or remove any duplicates + $valueArray = \is_array($value) ? \array_unique($value) : array($value); + // also sort all the values + \sort($valueArray); + + // append them to the data string with no delimiters + foreach ($valueArray as $item) { + $url .= $key . $item; + } + } + + // sha1 then base64 the url to the auth token and return the base64-ed string + return \base64_encode(\hash_hmac('sha1', $url, $this->authToken, true)); + } + + /** + * Converts the raw binary output to a hexadecimal return + * + * @param string $data + * @return string + */ + public static function computeBodyHash(string $data = ''): string { + return \bin2hex(\hash('sha256', $data, true)); + } + + /** + * The only method the client should be running...takes the Twilio signature, their URL, and the Twilio params and validates the signature + * + * @param string $expectedSignature + * @param string $url + * @param array|string $data + * @return bool + */ + public function validate(string $expectedSignature, string $url, $data = []): bool { + $parsedUrl = \parse_url($url); + + $urlWithPort = self::addPort($parsedUrl); + $urlWithoutPort = self::removePort($parsedUrl); + $validBodyHash = true; // May not receive body hash, so default succeed + + if (!\is_array($data)) { + // handling if the data was passed through as a string instead of an array of params + $queryString = \explode('?', $url); + $queryString = $queryString[1]; + \parse_str($queryString, $params); + + $validBodyHash = self::compare(self::computeBodyHash($data), Values::array_get($params, 'bodySHA256')); + $data = []; + } + + /* + * Check signature of the URL with and without port information + * since sig generation on the back end is inconsistent. + */ + $validSignatureWithPort = self::compare( + $expectedSignature, + $this->computeSignature($urlWithPort, $data) + ); + $validSignatureWithoutPort = self::compare( + $expectedSignature, + $this->computeSignature($urlWithoutPort, $data) + ); + + return $validBodyHash && ($validSignatureWithPort || $validSignatureWithoutPort); + } + + /** + * Time insensitive compare, function's runtime is governed by the length + * of the first argument, not the difference between the arguments. + * + * @param string $a First part of the comparison pair + * @param string $b Second part of the comparison pair + * @return bool True if $a === $b, false otherwise. + */ + public static function compare(?string $a, ?string $b): bool { + if ($a && $b) { + return hash_equals($a, $b); + } + + return false; + } + + /** + * Removes the port from the URL + * + * @param array $parsedUrl + * @return string Full URL without the port number + */ + private static function removePort(array $parsedUrl): string { + unset($parsedUrl['port']); + return self::unparse_url($parsedUrl); + } + + /** + * Adds the port to the URL + * + * @param array $parsedUrl + * @return string Full URL with the port number + */ + private static function addPort(array $parsedUrl): string { + if (!isset($parsedUrl['port'])) { + $port = ($parsedUrl['scheme'] === 'https') ? 443 : 80; + $parsedUrl['port'] = $port; + } + return self::unparse_url($parsedUrl); + } + + /** + * Builds the URL from its parsed component pieces + * + * @param array $parsedUrl + * @return string Full URL + */ + static function unparse_url(array $parsedUrl): string { + $parts = []; + + $parts['scheme'] = isset($parsedUrl['scheme']) ? $parsedUrl['scheme'] . '://' : ''; + $parts['user'] = $parsedUrl['user'] ?? ''; + $parts['pass'] = isset($parsedUrl['pass']) ? ':' . $parsedUrl['pass'] : ''; + $parts['pass'] = ($parts['user'] || $parts['pass']) ? $parts['pass'] . '@' : ''; + $parts['host'] = $parsedUrl['host'] ?? ''; + $parts['port'] = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : ''; + $parts['path'] = $parsedUrl['path'] ?? ''; + $parts['query'] = isset($parsedUrl['query']) ? '?' . $parsedUrl['query'] : ''; + $parts['fragment'] = isset($parsedUrl['fragment']) ? '#' . $parsedUrl['fragment'] : ''; + + return \implode('', $parts); + } +} diff --git a/app/api/Twilio/Serialize.php b/app/api/Twilio/Serialize.php new file mode 100755 index 0000000..6d0643a --- /dev/null +++ b/app/api/Twilio/Serialize.php @@ -0,0 +1,83 @@ + $value) { + if (\is_array($value)) { + $result = self::flatten($value, $result, \array_merge($previous, [$key])); + } else { + $result[\implode('.', \array_merge($previous, [$key]))] = $value; + } + } + + return $result; + } + + public static function prefixedCollapsibleMap($map, string $prefix): array { + if ($map === null || $map === Values::NONE) { + return []; + } + + $flattened = self::flatten($map); + $result = []; + foreach ($flattened as $key => $value) { + $result[$prefix . '.' . $key] = $value; + } + + return $result; + } + + public static function iso8601Date($dateTime): string { + if ($dateTime === null || $dateTime === Values::NONE) { + return Values::NONE; + } + + if (\is_string($dateTime)) { + return $dateTime; + } + + $utcDate = clone $dateTime; + $utcDate->setTimezone(new \DateTimeZone('+0000')); + return $utcDate->format('Y-m-d'); + } + + public static function iso8601DateTime($dateTime): string { + if ($dateTime === null || $dateTime === Values::NONE) { + return Values::NONE; + } + + if (\is_string($dateTime)) { + return $dateTime; + } + + $utcDate = clone $dateTime; + $utcDate->setTimezone(new \DateTimeZone('+0000')); + return $utcDate->format('Y-m-d\TH:i:s\Z'); + } + + public static function booleanToString($boolOrStr) { + if ($boolOrStr === null || \is_string($boolOrStr)) { + return $boolOrStr; + } + + return $boolOrStr ? 'True' : 'False'; + } + + public static function jsonObject($object) { + if (\is_array($object)) { + return \json_encode($object); + } + return $object; + } + + public static function map($values, $map_func) { + if (!\is_array($values)) { + return $values; + } + return \array_map($map_func, $values); + } + +} diff --git a/app/api/Twilio/Stream.php b/app/api/Twilio/Stream.php new file mode 100755 index 0000000..4dec2ca --- /dev/null +++ b/app/api/Twilio/Stream.php @@ -0,0 +1,105 @@ +page = $page; + $this->firstPage = $page; + $this->limit = $limit; + $this->currentRecord = 1; + $this->pageLimit = $pageLimit; + $this->currentPage = 1; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + #[\ReturnTypeWillChange] + public function current() { + return $this->page->current(); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + public function next(): void { + $this->page->next(); + $this->currentRecord++; + + if ($this->overLimit()) { + return; + } + + if (!$this->page->valid()) { + if ($this->overPageLimit()) { + return; + } + $this->page = $this->page->nextPage(); + $this->currentPage++; + } + } + + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return mixed scalar on success, or null on failure. + */ + #[\ReturnTypeWillChange] + public function key() { + return $this->currentRecord; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return bool The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ + public function valid(): bool { + return $this->page && $this->page->valid() && !$this->overLimit() && !$this->overPageLimit(); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + public function rewind(): void { + $this->page = $this->firstPage; + $this->page->rewind(); + $this->currentPage = 1; + $this->currentRecord = 1; + } + + protected function overLimit(): bool { + return ($this->limit !== null + && $this->limit !== Values::NONE + && $this->limit < $this->currentRecord); + } + + protected function overPageLimit(): bool { + return ($this->pageLimit !== null + && $this->pageLimit !== Values::NONE + && $this->pageLimit < $this->currentPage); + } + +} diff --git a/app/api/Twilio/TaskRouter/WorkflowConfiguration.php b/app/api/Twilio/TaskRouter/WorkflowConfiguration.php new file mode 100755 index 0000000..3ee2c6b --- /dev/null +++ b/app/api/Twilio/TaskRouter/WorkflowConfiguration.php @@ -0,0 +1,49 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class WorkflowConfiguration implements \JsonSerializable { + public $filters; + public $default_filter; + + public function __construct(array $filters, $default_filter = null) { + $this->filters = $filters; + $this->default_filter = $default_filter; + } + + public function toJSON() { + return \json_encode($this); + } + + public static function parse(string $json) { + return \json_decode($json); + } + + public static function fromJson(string $json): WorkflowConfiguration { + $configJSON = self::parse($json); + $default_filter = $configJSON->task_routing->default_filter; + $filters = []; + foreach ($configJSON->task_routing->filters as $filter) { + // friendly_name and filter_friendly_name should map to same variable + $friendly_name = $filter->filter_friendly_name ?? $filter->friendly_name; + $filter = new WorkflowRule($filter->expression, $filter->targets, $friendly_name); + $filters[] = $filter; + } + return new WorkflowConfiguration($filters, $default_filter); + } + + public function jsonSerialize(): array { + $json = []; + $task_routing = []; + $task_routing['filters'] = $this->filters; + $task_routing['default_filter'] = $this->default_filter; + $json['task_routing'] = $task_routing; + return $json; + } +} diff --git a/app/api/Twilio/TaskRouter/WorkflowRule.php b/app/api/Twilio/TaskRouter/WorkflowRule.php new file mode 100755 index 0000000..2a45efd --- /dev/null +++ b/app/api/Twilio/TaskRouter/WorkflowRule.php @@ -0,0 +1,31 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class WorkflowRule implements \JsonSerializable { + public $expression; + public $friendly_name; + public $targets; + + public function __construct(string $expression, array $targets, string $friendly_name = null) { + $this->expression = $expression; + $this->targets = $targets; + $this->friendly_name = $friendly_name; + } + + public function jsonSerialize(): array { + $json = []; + $json['expression'] = $this->expression; + $json['targets'] = $this->targets; + if ($this->friendly_name !== null) { + $json['friendly_name'] = $this->friendly_name; + } + return $json; + } +} diff --git a/app/api/Twilio/TaskRouter/WorkflowRuleTarget.php b/app/api/Twilio/TaskRouter/WorkflowRuleTarget.php new file mode 100755 index 0000000..68fd134 --- /dev/null +++ b/app/api/Twilio/TaskRouter/WorkflowRuleTarget.php @@ -0,0 +1,38 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class WorkflowRuleTarget implements \JsonSerializable { + public $queue; + public $expression; + public $priority; + public $timeout; + + public function __construct(string $queue, int $priority = null, int $timeout = null, string $expression = null) { + $this->queue = $queue; + $this->priority = $priority; + $this->timeout = $timeout; + $this->expression = $expression; + } + + public function jsonSerialize(): array { + $json = []; + $json['queue'] = $this->queue; + if ($this->priority !== null) { + $json['priority'] = $this->priority; + } + if ($this->timeout !== null) { + $json['timeout'] = $this->timeout; + } + if ($this->expression !== null) { + $json['expression'] = $this->expression; + } + return $json; + } +} diff --git a/app/api/Twilio/TwiML/Fax/Receive.php b/app/api/Twilio/TwiML/Fax/Receive.php new file mode 100755 index 0000000..3b40753 --- /dev/null +++ b/app/api/Twilio/TwiML/Fax/Receive.php @@ -0,0 +1,70 @@ +setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Receive action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add MediaType attribute. + * + * @param string $mediaType The media type used to store media in the fax media + * store + */ + public function setMediaType($mediaType): self { + return $this->setAttribute('mediaType', $mediaType); + } + + /** + * Add PageSize attribute. + * + * @param string $pageSize What size to interpret received pages as + */ + public function setPageSize($pageSize): self { + return $this->setAttribute('pageSize', $pageSize); + } + + /** + * Add StoreMedia attribute. + * + * @param bool $storeMedia Whether or not to store received media in the fax + * media store + */ + public function setStoreMedia($storeMedia): self { + return $this->setAttribute('storeMedia', $storeMedia); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/FaxResponse.php b/app/api/Twilio/TwiML/FaxResponse.php new file mode 100755 index 0000000..b95f0fe --- /dev/null +++ b/app/api/Twilio/TwiML/FaxResponse.php @@ -0,0 +1,29 @@ +nest(new Fax\Receive($attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/GenericNode.php b/app/api/Twilio/TwiML/GenericNode.php new file mode 100755 index 0000000..65f9c8f --- /dev/null +++ b/app/api/Twilio/TwiML/GenericNode.php @@ -0,0 +1,19 @@ +name = $name; + $this->value = $value; + } +} diff --git a/app/api/Twilio/TwiML/Messaging/Body.php b/app/api/Twilio/TwiML/Messaging/Body.php new file mode 100755 index 0000000..578f6f8 --- /dev/null +++ b/app/api/Twilio/TwiML/Messaging/Body.php @@ -0,0 +1,23 @@ +nest(new Body($message)); + } + + /** + * Add Media child. + * + * @param string $url Media URL + * @return Media Child element. + */ + public function media($url): Media { + return $this->nest(new Media($url)); + } + + /** + * Add To attribute. + * + * @param string $to Phone Number to send Message to + */ + public function setTo($to): self { + return $this->setAttribute('to', $to); + } + + /** + * Add From attribute. + * + * @param string $from Phone Number to send Message from + */ + public function setFrom($from): self { + return $this->setAttribute('from', $from); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL Method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL. Deprecated in favor of + * action. + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Messaging/Redirect.php b/app/api/Twilio/TwiML/Messaging/Redirect.php new file mode 100755 index 0000000..efa685c --- /dev/null +++ b/app/api/Twilio/TwiML/Messaging/Redirect.php @@ -0,0 +1,33 @@ +setAttribute('method', $method); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/MessagingResponse.php b/app/api/Twilio/TwiML/MessagingResponse.php new file mode 100755 index 0000000..bfc877d --- /dev/null +++ b/app/api/Twilio/TwiML/MessagingResponse.php @@ -0,0 +1,41 @@ +nest(new Messaging\Message($body, $attributes)); + } + + /** + * Add Redirect child. + * + * @param string $url Redirect URL + * @param array $attributes Optional attributes + * @return Messaging\Redirect Child element. + */ + public function redirect($url, $attributes = []): Messaging\Redirect { + return $this->nest(new Messaging\Redirect($url, $attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/TwiML.php b/app/api/Twilio/TwiML/TwiML.php new file mode 100755 index 0000000..ec19f5e --- /dev/null +++ b/app/api/Twilio/TwiML/TwiML.php @@ -0,0 +1,136 @@ +name = $name; + $this->attributes = $attributes; + $this->children = []; + + if ($value !== null) { + $this->children[] = $value; + } + } + + /** + * Add a TwiML element. + * + * @param TwiML|string $twiml TwiML element to add + * @return TwiML $this + */ + public function append($twiml): TwiML { + $this->children[] = $twiml; + return $this; + } + + /** + * Add a TwiML element. + * + * @param TwiML $twiml TwiML element to add + * @return TwiML added TwiML element + */ + public function nest(TwiML $twiml): TwiML { + $this->children[] = $twiml; + return $twiml; + } + + /** + * Set TwiML attribute. + * + * @param string $key name of attribute + * @param string $value value of attribute + * @return static $this + */ + public function setAttribute(string $key, string $value): TwiML { + $this->attributes[$key] = $value; + return $this; + } + + /** + * @param string $name XML element name + * @param string $value XML value + * @param array $attributes XML attributes + * @return TwiML + */ + public function addChild(string $name, string $value = null, array $attributes = []): TwiML { + return $this->nest(new GenericNode($name, $value, $attributes)); + } + + /** + * Convert TwiML to XML string. + * + * @return string TwiML XML representation + */ + public function asXML(): string { + return (string)$this; + } + + /** + * Convert TwiML to XML string. + * + * @return string TwiML XML representation + */ + public function __toString(): string { + return $this->xml()->saveXML(); + } + + /** + * Build TwiML element. + * + * @param TwiML $twiml TwiML element to convert to XML + * @param DOMDocument $document XML document for the element + * @return DOMElement $element + */ + private function buildElement(TwiML $twiml, DOMDocument $document): DOMElement { + $element = $document->createElement($twiml->name); + + foreach ($twiml->attributes as $name => $value) { + if (\is_bool($value)) { + $value = ($value === true) ? 'true' : 'false'; + } + $element->setAttribute($name, $value); + } + + foreach ($twiml->children as $child) { + if (\is_string($child)) { + $element->appendChild($document->createTextNode($child)); + } else { + $element->appendChild($this->buildElement($child, $document)); + } + } + + return $element; + } + + /** + * Build XML element. + * + * @return DOMDocument Build TwiML element + */ + private function xml(): DOMDocument { + $document = new DOMDocument('1.0', 'UTF-8'); + $document->appendChild($this->buildElement($this, $document)); + return $document; + } +} diff --git a/app/api/Twilio/TwiML/Video/Room.php b/app/api/Twilio/TwiML/Video/Room.php new file mode 100755 index 0000000..d464f40 --- /dev/null +++ b/app/api/Twilio/TwiML/Video/Room.php @@ -0,0 +1,23 @@ +nest(new ApplicationSid($sid)); + } + + /** + * Add Parameter child. + * + * @param array $attributes Optional attributes + * @return Parameter Child element. + */ + public function parameter($attributes = []): Parameter { + return $this->nest(new Parameter($attributes)); + } + + /** + * Add Url attribute. + * + * @param string $url TwiML URL + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method TwiML URL Method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Events to trigger status callback + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status Callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status Callback URL Method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add CustomerId attribute. + * + * @param string $customerId Identity of the customer calling application + */ + public function setCustomerId($customerId): self { + return $this->setAttribute('customerId', $customerId); + } + + /** + * Add CopyParentTo attribute. + * + * @param bool $copyParentTo Copy parent call To field to called application + * side, otherwise use the application sid as To field + */ + public function setCopyParentTo($copyParentTo): self { + return $this->setAttribute('copyParentTo', $copyParentTo); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/ApplicationSid.php b/app/api/Twilio/TwiML/Voice/ApplicationSid.php new file mode 100755 index 0000000..6586873 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/ApplicationSid.php @@ -0,0 +1,23 @@ +nest(new Identity($clientIdentity)); + } + + /** + * Add Parameter child. + * + * @param array $attributes Optional attributes + * @return Parameter Child element. + */ + public function parameter($attributes = []): Parameter { + return $this->nest(new Parameter($attributes)); + } + + /** + * Add Url attribute. + * + * @param string $url Client URL + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method Client URL Method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Events to trigger status callback + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status Callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status Callback URL Method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Conference.php b/app/api/Twilio/TwiML/Voice/Conference.php new file mode 100755 index 0000000..f0bed21 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Conference.php @@ -0,0 +1,206 @@ +setAttribute('muted', $muted); + } + + /** + * Add Beep attribute. + * + * @param string $beep Play beep when joining + */ + public function setBeep($beep): self { + return $this->setAttribute('beep', $beep); + } + + /** + * Add StartConferenceOnEnter attribute. + * + * @param bool $startConferenceOnEnter Start the conference on enter + */ + public function setStartConferenceOnEnter($startConferenceOnEnter): self { + return $this->setAttribute('startConferenceOnEnter', $startConferenceOnEnter); + } + + /** + * Add EndConferenceOnExit attribute. + * + * @param bool $endConferenceOnExit End the conferenceon exit + */ + public function setEndConferenceOnExit($endConferenceOnExit): self { + return $this->setAttribute('endConferenceOnExit', $endConferenceOnExit); + } + + /** + * Add WaitUrl attribute. + * + * @param string $waitUrl Wait URL + */ + public function setWaitUrl($waitUrl): self { + return $this->setAttribute('waitUrl', $waitUrl); + } + + /** + * Add WaitMethod attribute. + * + * @param string $waitMethod Wait URL method + */ + public function setWaitMethod($waitMethod): self { + return $this->setAttribute('waitMethod', $waitMethod); + } + + /** + * Add MaxParticipants attribute. + * + * @param int $maxParticipants Maximum number of participants + */ + public function setMaxParticipants($maxParticipants): self { + return $this->setAttribute('maxParticipants', $maxParticipants); + } + + /** + * Add Record attribute. + * + * @param string $record Record the conference + */ + public function setRecord($record): self { + return $this->setAttribute('record', $record); + } + + /** + * Add Region attribute. + * + * @param string $region Conference region + */ + public function setRegion($region): self { + return $this->setAttribute('region', $region); + } + + /** + * Add Coach attribute. + * + * @param string $coach Call coach + */ + public function setCoach($coach): self { + return $this->setAttribute('coach', $coach); + } + + /** + * Add Trim attribute. + * + * @param string $trim Trim the conference recording + */ + public function setTrim($trim): self { + return $this->setAttribute('trim', $trim); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Events to call status callback URL + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status callback URL method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add RecordingStatusCallback attribute. + * + * @param string $recordingStatusCallback Recording status callback URL + */ + public function setRecordingStatusCallback($recordingStatusCallback): self { + return $this->setAttribute('recordingStatusCallback', $recordingStatusCallback); + } + + /** + * Add RecordingStatusCallbackMethod attribute. + * + * @param string $recordingStatusCallbackMethod Recording status callback URL + * method + */ + public function setRecordingStatusCallbackMethod($recordingStatusCallbackMethod): self { + return $this->setAttribute('recordingStatusCallbackMethod', $recordingStatusCallbackMethod); + } + + /** + * Add RecordingStatusCallbackEvent attribute. + * + * @param string[] $recordingStatusCallbackEvent Recording status callback + * events + */ + public function setRecordingStatusCallbackEvent($recordingStatusCallbackEvent): self { + return $this->setAttribute('recordingStatusCallbackEvent', $recordingStatusCallbackEvent); + } + + /** + * Add EventCallbackUrl attribute. + * + * @param string $eventCallbackUrl Event callback URL + */ + public function setEventCallbackUrl($eventCallbackUrl): self { + return $this->setAttribute('eventCallbackUrl', $eventCallbackUrl); + } + + /** + * Add JitterBufferSize attribute. + * + * @param string $jitterBufferSize Size of jitter buffer for participant + */ + public function setJitterBufferSize($jitterBufferSize): self { + return $this->setAttribute('jitterBufferSize', $jitterBufferSize); + } + + /** + * Add ParticipantLabel attribute. + * + * @param string $participantLabel A label for participant + */ + public function setParticipantLabel($participantLabel): self { + return $this->setAttribute('participantLabel', $participantLabel); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Config.php b/app/api/Twilio/TwiML/Voice/Config.php new file mode 100755 index 0000000..748b10d --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Config.php @@ -0,0 +1,41 @@ +setAttribute('name', $name); + } + + /** + * Add Value attribute. + * + * @param string $value The value of the custom config + */ + public function setValue($value): self { + return $this->setAttribute('value', $value); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Connect.php b/app/api/Twilio/TwiML/Voice/Connect.php new file mode 100755 index 0000000..b4bca51 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Connect.php @@ -0,0 +1,92 @@ +nest(new Room($name, $attributes)); + } + + /** + * Add Autopilot child. + * + * @param string $name Autopilot assistant sid or unique name + * @return Autopilot Child element. + */ + public function autopilot($name): Autopilot { + return $this->nest(new Autopilot($name)); + } + + /** + * Add Stream child. + * + * @param array $attributes Optional attributes + * @return Stream Child element. + */ + public function stream($attributes = []): Stream { + return $this->nest(new Stream($attributes)); + } + + /** + * Add VirtualAgent child. + * + * @param array $attributes Optional attributes + * @return VirtualAgent Child element. + */ + public function virtualAgent($attributes = []): VirtualAgent { + return $this->nest(new VirtualAgent($attributes)); + } + + /** + * Add Conversation child. + * + * @param array $attributes Optional attributes + * @return Conversation Child element. + */ + public function conversation($attributes = []): Conversation { + return $this->nest(new Conversation($attributes)); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Conversation.php b/app/api/Twilio/TwiML/Voice/Conversation.php new file mode 100755 index 0000000..8274ffa --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Conversation.php @@ -0,0 +1,151 @@ +setAttribute('serviceInstanceSid', $serviceInstanceSid); + } + + /** + * Add InboundAutocreation attribute. + * + * @param bool $inboundAutocreation Inbound autocreation + */ + public function setInboundAutocreation($inboundAutocreation): self { + return $this->setAttribute('inboundAutocreation', $inboundAutocreation); + } + + /** + * Add RoutingAssignmentTimeout attribute. + * + * @param int $routingAssignmentTimeout Routing assignment timeout + */ + public function setRoutingAssignmentTimeout($routingAssignmentTimeout): self { + return $this->setAttribute('routingAssignmentTimeout', $routingAssignmentTimeout); + } + + /** + * Add InboundTimeout attribute. + * + * @param int $inboundTimeout Inbound timeout + */ + public function setInboundTimeout($inboundTimeout): self { + return $this->setAttribute('inboundTimeout', $inboundTimeout); + } + + /** + * Add Url attribute. + * + * @param string $url TwiML URL + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method TwiML URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add Record attribute. + * + * @param string $record Record + */ + public function setRecord($record): self { + return $this->setAttribute('record', $record); + } + + /** + * Add Trim attribute. + * + * @param string $trim Trim + */ + public function setTrim($trim): self { + return $this->setAttribute('trim', $trim); + } + + /** + * Add RecordingStatusCallback attribute. + * + * @param string $recordingStatusCallback Recording status callback URL + */ + public function setRecordingStatusCallback($recordingStatusCallback): self { + return $this->setAttribute('recordingStatusCallback', $recordingStatusCallback); + } + + /** + * Add RecordingStatusCallbackMethod attribute. + * + * @param string $recordingStatusCallbackMethod Recording status callback URL + * method + */ + public function setRecordingStatusCallbackMethod($recordingStatusCallbackMethod): self { + return $this->setAttribute('recordingStatusCallbackMethod', $recordingStatusCallbackMethod); + } + + /** + * Add RecordingStatusCallbackEvent attribute. + * + * @param string[] $recordingStatusCallbackEvent Recording status callback + * events + */ + public function setRecordingStatusCallbackEvent($recordingStatusCallbackEvent): self { + return $this->setAttribute('recordingStatusCallbackEvent', $recordingStatusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status callback URL method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Events to call status callback URL + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Dial.php b/app/api/Twilio/TwiML/Voice/Dial.php new file mode 100755 index 0000000..30bcb24 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Dial.php @@ -0,0 +1,262 @@ +nest(new Client($identity, $attributes)); + } + + /** + * Add Conference child. + * + * @param string $name Conference name + * @param array $attributes Optional attributes + * @return Conference Child element. + */ + public function conference($name, $attributes = []): Conference { + return $this->nest(new Conference($name, $attributes)); + } + + /** + * Add Number child. + * + * @param string $phoneNumber Phone Number to dial + * @param array $attributes Optional attributes + * @return Number Child element. + */ + public function number($phoneNumber, $attributes = []): Number { + return $this->nest(new Number($phoneNumber, $attributes)); + } + + /** + * Add Queue child. + * + * @param string $name Queue name + * @param array $attributes Optional attributes + * @return Queue Child element. + */ + public function queue($name, $attributes = []): Queue { + return $this->nest(new Queue($name, $attributes)); + } + + /** + * Add Sim child. + * + * @param string $simSid SIM SID + * @return Sim Child element. + */ + public function sim($simSid): Sim { + return $this->nest(new Sim($simSid)); + } + + /** + * Add Sip child. + * + * @param string $sipUrl SIP URL + * @param array $attributes Optional attributes + * @return Sip Child element. + */ + public function sip($sipUrl, $attributes = []): Sip { + return $this->nest(new Sip($sipUrl, $attributes)); + } + + /** + * Add Application child. + * + * @param string $applicationSid Application sid + * @param array $attributes Optional attributes + * @return Application Child element. + */ + public function application($applicationSid = null, $attributes = []): Application { + return $this->nest(new Application($applicationSid, $attributes)); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add Timeout attribute. + * + * @param int $timeout Time to wait for answer + */ + public function setTimeout($timeout): self { + return $this->setAttribute('timeout', $timeout); + } + + /** + * Add HangupOnStar attribute. + * + * @param bool $hangupOnStar Hangup call on star press + */ + public function setHangupOnStar($hangupOnStar): self { + return $this->setAttribute('hangupOnStar', $hangupOnStar); + } + + /** + * Add TimeLimit attribute. + * + * @param int $timeLimit Max time length + */ + public function setTimeLimit($timeLimit): self { + return $this->setAttribute('timeLimit', $timeLimit); + } + + /** + * Add CallerId attribute. + * + * @param string $callerId Caller ID to display + */ + public function setCallerId($callerId): self { + return $this->setAttribute('callerId', $callerId); + } + + /** + * Add Record attribute. + * + * @param string $record Record the call + */ + public function setRecord($record): self { + return $this->setAttribute('record', $record); + } + + /** + * Add Trim attribute. + * + * @param string $trim Trim the recording + */ + public function setTrim($trim): self { + return $this->setAttribute('trim', $trim); + } + + /** + * Add RecordingStatusCallback attribute. + * + * @param string $recordingStatusCallback Recording status callback URL + */ + public function setRecordingStatusCallback($recordingStatusCallback): self { + return $this->setAttribute('recordingStatusCallback', $recordingStatusCallback); + } + + /** + * Add RecordingStatusCallbackMethod attribute. + * + * @param string $recordingStatusCallbackMethod Recording status callback URL + * method + */ + public function setRecordingStatusCallbackMethod($recordingStatusCallbackMethod): self { + return $this->setAttribute('recordingStatusCallbackMethod', $recordingStatusCallbackMethod); + } + + /** + * Add RecordingStatusCallbackEvent attribute. + * + * @param string[] $recordingStatusCallbackEvent Recording status callback + * events + */ + public function setRecordingStatusCallbackEvent($recordingStatusCallbackEvent): self { + return $this->setAttribute('recordingStatusCallbackEvent', $recordingStatusCallbackEvent); + } + + /** + * Add AnswerOnBridge attribute. + * + * @param bool $answerOnBridge Preserve the ringing behavior of the inbound + * call until the Dialed call picks up + */ + public function setAnswerOnBridge($answerOnBridge): self { + return $this->setAttribute('answerOnBridge', $answerOnBridge); + } + + /** + * Add RingTone attribute. + * + * @param string $ringTone Ringtone allows you to override the ringback tone + * that Twilio will play back to the caller while + * executing the Dial + */ + public function setRingTone($ringTone): self { + return $this->setAttribute('ringTone', $ringTone); + } + + /** + * Add RecordingTrack attribute. + * + * @param string $recordingTrack To indicate which audio track should be + * recorded + */ + public function setRecordingTrack($recordingTrack): self { + return $this->setAttribute('recordingTrack', $recordingTrack); + } + + /** + * Add Sequential attribute. + * + * @param bool $sequential Used to determine if child TwiML nouns should be + * dialed in order, one after the other (sequential) or + * dial all at once (parallel). Default is false, + * parallel + */ + public function setSequential($sequential): self { + return $this->setAttribute('sequential', $sequential); + } + + /** + * Add ReferUrl attribute. + * + * @param string $referUrl Webhook that will receive future SIP REFER requests + */ + public function setReferUrl($referUrl): self { + return $this->setAttribute('referUrl', $referUrl); + } + + /** + * Add ReferMethod attribute. + * + * @param string $referMethod The HTTP method to use for the refer Webhook + */ + public function setReferMethod($referMethod): self { + return $this->setAttribute('referMethod', $referMethod); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Echo_.php b/app/api/Twilio/TwiML/Voice/Echo_.php new file mode 100755 index 0000000..afc2cd8 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Echo_.php @@ -0,0 +1,21 @@ +nest(new Task($body, $attributes)); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add MaxQueueSize attribute. + * + * @param int $maxQueueSize Maximum size of queue + */ + public function setMaxQueueSize($maxQueueSize): self { + return $this->setAttribute('maxQueueSize', $maxQueueSize); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add WaitUrl attribute. + * + * @param string $waitUrl Wait URL + */ + public function setWaitUrl($waitUrl): self { + return $this->setAttribute('waitUrl', $waitUrl); + } + + /** + * Add WaitUrlMethod attribute. + * + * @param string $waitUrlMethod Wait URL method + */ + public function setWaitUrlMethod($waitUrlMethod): self { + return $this->setAttribute('waitUrlMethod', $waitUrlMethod); + } + + /** + * Add WorkflowSid attribute. + * + * @param string $workflowSid TaskRouter Workflow SID + */ + public function setWorkflowSid($workflowSid): self { + return $this->setAttribute('workflowSid', $workflowSid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Gather.php b/app/api/Twilio/TwiML/Voice/Gather.php new file mode 100755 index 0000000..8bd5377 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Gather.php @@ -0,0 +1,220 @@ +nest(new Say($message, $attributes)); + } + + /** + * Add Pause child. + * + * @param array $attributes Optional attributes + * @return Pause Child element. + */ + public function pause($attributes = []): Pause { + return $this->nest(new Pause($attributes)); + } + + /** + * Add Play child. + * + * @param string $url Media URL + * @param array $attributes Optional attributes + * @return Play Child element. + */ + public function play($url = null, $attributes = []): Play { + return $this->nest(new Play($url, $attributes)); + } + + /** + * Add Input attribute. + * + * @param string[] $input Input type Twilio should accept + */ + public function setInput($input): self { + return $this->setAttribute('input', $input); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add Timeout attribute. + * + * @param int $timeout Time to wait to gather input + */ + public function setTimeout($timeout): self { + return $this->setAttribute('timeout', $timeout); + } + + /** + * Add SpeechTimeout attribute. + * + * @param string $speechTimeout Time to wait to gather speech input and it + * should be either auto or a positive integer. + */ + public function setSpeechTimeout($speechTimeout): self { + return $this->setAttribute('speechTimeout', $speechTimeout); + } + + /** + * Add MaxSpeechTime attribute. + * + * @param int $maxSpeechTime Max allowed time for speech input + */ + public function setMaxSpeechTime($maxSpeechTime): self { + return $this->setAttribute('maxSpeechTime', $maxSpeechTime); + } + + /** + * Add ProfanityFilter attribute. + * + * @param bool $profanityFilter Profanity Filter on speech + */ + public function setProfanityFilter($profanityFilter): self { + return $this->setAttribute('profanityFilter', $profanityFilter); + } + + /** + * Add FinishOnKey attribute. + * + * @param string $finishOnKey Finish gather on key + */ + public function setFinishOnKey($finishOnKey): self { + return $this->setAttribute('finishOnKey', $finishOnKey); + } + + /** + * Add NumDigits attribute. + * + * @param int $numDigits Number of digits to collect + */ + public function setNumDigits($numDigits): self { + return $this->setAttribute('numDigits', $numDigits); + } + + /** + * Add PartialResultCallback attribute. + * + * @param string $partialResultCallback Partial result callback URL + */ + public function setPartialResultCallback($partialResultCallback): self { + return $this->setAttribute('partialResultCallback', $partialResultCallback); + } + + /** + * Add PartialResultCallbackMethod attribute. + * + * @param string $partialResultCallbackMethod Partial result callback URL method + */ + public function setPartialResultCallbackMethod($partialResultCallbackMethod): self { + return $this->setAttribute('partialResultCallbackMethod', $partialResultCallbackMethod); + } + + /** + * Add Language attribute. + * + * @param string $language Language to use + */ + public function setLanguage($language): self { + return $this->setAttribute('language', $language); + } + + /** + * Add Hints attribute. + * + * @param string $hints Speech recognition hints + */ + public function setHints($hints): self { + return $this->setAttribute('hints', $hints); + } + + /** + * Add BargeIn attribute. + * + * @param bool $bargeIn Stop playing media upon speech + */ + public function setBargeIn($bargeIn): self { + return $this->setAttribute('bargeIn', $bargeIn); + } + + /** + * Add Debug attribute. + * + * @param bool $debug Allow debug for gather + */ + public function setDebug($debug): self { + return $this->setAttribute('debug', $debug); + } + + /** + * Add ActionOnEmptyResult attribute. + * + * @param bool $actionOnEmptyResult Force webhook to the action URL event if + * there is no input + */ + public function setActionOnEmptyResult($actionOnEmptyResult): self { + return $this->setAttribute('actionOnEmptyResult', $actionOnEmptyResult); + } + + /** + * Add SpeechModel attribute. + * + * @param string $speechModel Specify the model that is best suited for your + * use case + */ + public function setSpeechModel($speechModel): self { + return $this->setAttribute('speechModel', $speechModel); + } + + /** + * Add Enhanced attribute. + * + * @param bool $enhanced Use enhanced speech model + */ + public function setEnhanced($enhanced): self { + return $this->setAttribute('enhanced', $enhanced); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Hangup.php b/app/api/Twilio/TwiML/Voice/Hangup.php new file mode 100755 index 0000000..0e70d43 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Hangup.php @@ -0,0 +1,31 @@ +nest(new Parameter($attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Identity.php b/app/api/Twilio/TwiML/Voice/Identity.php new file mode 100755 index 0000000..abf4894 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Identity.php @@ -0,0 +1,23 @@ +setAttribute('sendDigits', $sendDigits); + } + + /** + * Add Url attribute. + * + * @param string $url TwiML URL + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method TwiML URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Events to call status callback + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status callback URL method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add Byoc attribute. + * + * @param string $byoc BYOC trunk SID (Beta) + */ + public function setByoc($byoc): self { + return $this->setAttribute('byoc', $byoc); + } + + /** + * Add MachineDetection attribute. + * + * @param string $machineDetection Enable machine detection or end of greeting + * detection + */ + public function setMachineDetection($machineDetection): self { + return $this->setAttribute('machineDetection', $machineDetection); + } + + /** + * Add AmdStatusCallbackMethod attribute. + * + * @param string $amdStatusCallbackMethod HTTP Method to use with + * amd_status_callback + */ + public function setAmdStatusCallbackMethod($amdStatusCallbackMethod): self { + return $this->setAttribute('amdStatusCallbackMethod', $amdStatusCallbackMethod); + } + + /** + * Add AmdStatusCallback attribute. + * + * @param string $amdStatusCallback The URL we should call to send amd status + * information to your application + */ + public function setAmdStatusCallback($amdStatusCallback): self { + return $this->setAttribute('amdStatusCallback', $amdStatusCallback); + } + + /** + * Add MachineDetectionTimeout attribute. + * + * @param int $machineDetectionTimeout Number of seconds to wait for machine + * detection + */ + public function setMachineDetectionTimeout($machineDetectionTimeout): self { + return $this->setAttribute('machineDetectionTimeout', $machineDetectionTimeout); + } + + /** + * Add MachineDetectionSpeechThreshold attribute. + * + * @param int $machineDetectionSpeechThreshold Number of milliseconds for + * measuring stick for the length + * of the speech activity + */ + public function setMachineDetectionSpeechThreshold($machineDetectionSpeechThreshold): self { + return $this->setAttribute('machineDetectionSpeechThreshold', $machineDetectionSpeechThreshold); + } + + /** + * Add MachineDetectionSpeechEndThreshold attribute. + * + * @param int $machineDetectionSpeechEndThreshold Number of milliseconds of + * silence after speech activity + */ + public function setMachineDetectionSpeechEndThreshold($machineDetectionSpeechEndThreshold): self { + return $this->setAttribute('machineDetectionSpeechEndThreshold', $machineDetectionSpeechEndThreshold); + } + + /** + * Add MachineDetectionSilenceTimeout attribute. + * + * @param int $machineDetectionSilenceTimeout Number of milliseconds of initial + * silence + */ + public function setMachineDetectionSilenceTimeout($machineDetectionSilenceTimeout): self { + return $this->setAttribute('machineDetectionSilenceTimeout', $machineDetectionSilenceTimeout); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Parameter.php b/app/api/Twilio/TwiML/Voice/Parameter.php new file mode 100755 index 0000000..6798ba9 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Parameter.php @@ -0,0 +1,41 @@ +setAttribute('name', $name); + } + + /** + * Add Value attribute. + * + * @param string $value The value of the custom parameter + */ + public function setValue($value): self { + return $this->setAttribute('value', $value); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Pause.php b/app/api/Twilio/TwiML/Voice/Pause.php new file mode 100755 index 0000000..3716a75 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Pause.php @@ -0,0 +1,32 @@ +setAttribute('length', $length); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Pay.php b/app/api/Twilio/TwiML/Voice/Pay.php new file mode 100755 index 0000000..eb38b17 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Pay.php @@ -0,0 +1,212 @@ +nest(new Prompt($attributes)); + } + + /** + * Add Parameter child. + * + * @param array $attributes Optional attributes + * @return Parameter Child element. + */ + public function parameter($attributes = []): Parameter { + return $this->nest(new Parameter($attributes)); + } + + /** + * Add Input attribute. + * + * @param string $input Input type Twilio should accept + */ + public function setInput($input): self { + return $this->setAttribute('input', $input); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add BankAccountType attribute. + * + * @param string $bankAccountType Bank account type for ach transactions. If + * set, payment method attribute must be + * provided and value should be set to + * ach-debit. defaults to consumer-checking + */ + public function setBankAccountType($bankAccountType): self { + return $this->setAttribute('bankAccountType', $bankAccountType); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status callback method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add Timeout attribute. + * + * @param int $timeout Time to wait to gather input + */ + public function setTimeout($timeout): self { + return $this->setAttribute('timeout', $timeout); + } + + /** + * Add MaxAttempts attribute. + * + * @param int $maxAttempts Maximum number of allowed retries when gathering + * input + */ + public function setMaxAttempts($maxAttempts): self { + return $this->setAttribute('maxAttempts', $maxAttempts); + } + + /** + * Add SecurityCode attribute. + * + * @param bool $securityCode Prompt for security code + */ + public function setSecurityCode($securityCode): self { + return $this->setAttribute('securityCode', $securityCode); + } + + /** + * Add PostalCode attribute. + * + * @param string $postalCode Prompt for postal code and it should be true/false + * or default postal code + */ + public function setPostalCode($postalCode): self { + return $this->setAttribute('postalCode', $postalCode); + } + + /** + * Add MinPostalCodeLength attribute. + * + * @param int $minPostalCodeLength Prompt for minimum postal code length + */ + public function setMinPostalCodeLength($minPostalCodeLength): self { + return $this->setAttribute('minPostalCodeLength', $minPostalCodeLength); + } + + /** + * Add PaymentConnector attribute. + * + * @param string $paymentConnector Unique name for payment connector + */ + public function setPaymentConnector($paymentConnector): self { + return $this->setAttribute('paymentConnector', $paymentConnector); + } + + /** + * Add PaymentMethod attribute. + * + * @param string $paymentMethod Payment method to be used. defaults to + * credit-card + */ + public function setPaymentMethod($paymentMethod): self { + return $this->setAttribute('paymentMethod', $paymentMethod); + } + + /** + * Add TokenType attribute. + * + * @param string $tokenType Type of token + */ + public function setTokenType($tokenType): self { + return $this->setAttribute('tokenType', $tokenType); + } + + /** + * Add ChargeAmount attribute. + * + * @param string $chargeAmount Amount to process. If value is greater than 0 + * then make the payment else create a payment token + */ + public function setChargeAmount($chargeAmount): self { + return $this->setAttribute('chargeAmount', $chargeAmount); + } + + /** + * Add Currency attribute. + * + * @param string $currency Currency of the amount attribute + */ + public function setCurrency($currency): self { + return $this->setAttribute('currency', $currency); + } + + /** + * Add Description attribute. + * + * @param string $description Details regarding the payment + */ + public function setDescription($description): self { + return $this->setAttribute('description', $description); + } + + /** + * Add ValidCardTypes attribute. + * + * @param string[] $validCardTypes Comma separated accepted card types + */ + public function setValidCardTypes($validCardTypes): self { + return $this->setAttribute('validCardTypes', $validCardTypes); + } + + /** + * Add Language attribute. + * + * @param string $language Language to use + */ + public function setLanguage($language): self { + return $this->setAttribute('language', $language); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Play.php b/app/api/Twilio/TwiML/Voice/Play.php new file mode 100755 index 0000000..a3e574e --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Play.php @@ -0,0 +1,42 @@ +setAttribute('loop', $loop); + } + + /** + * Add Digits attribute. + * + * @param string $digits Play DTMF tones for digits + */ + public function setDigits($digits): self { + return $this->setAttribute('digits', $digits); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Prompt.php b/app/api/Twilio/TwiML/Voice/Prompt.php new file mode 100755 index 0000000..64f4700 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Prompt.php @@ -0,0 +1,101 @@ +nest(new Say($message, $attributes)); + } + + /** + * Add Play child. + * + * @param string $url Media URL + * @param array $attributes Optional attributes + * @return Play Child element. + */ + public function play($url = null, $attributes = []): Play { + return $this->nest(new Play($url, $attributes)); + } + + /** + * Add Pause child. + * + * @param array $attributes Optional attributes + * @return Pause Child element. + */ + public function pause($attributes = []): Pause { + return $this->nest(new Pause($attributes)); + } + + /** + * Add For_ attribute. + * + * @param string $for_ Name of the payment source data element + */ + public function setFor_($for_): self { + return $this->setAttribute('for_', $for_); + } + + /** + * Add ErrorType attribute. + * + * @param string[] $errorType Type of error + */ + public function setErrorType($errorType): self { + return $this->setAttribute('errorType', $errorType); + } + + /** + * Add CardType attribute. + * + * @param string[] $cardType Type of the credit card + */ + public function setCardType($cardType): self { + return $this->setAttribute('cardType', $cardType); + } + + /** + * Add Attempt attribute. + * + * @param int[] $attempt Current attempt count + */ + public function setAttempt($attempt): self { + return $this->setAttribute('attempt', $attempt); + } + + /** + * Add RequireMatchingInputs attribute. + * + * @param bool $requireMatchingInputs Require customer to input requested + * information twice and verify matching. + */ + public function setRequireMatchingInputs($requireMatchingInputs): self { + return $this->setAttribute('requireMatchingInputs', $requireMatchingInputs); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Queue.php b/app/api/Twilio/TwiML/Voice/Queue.php new file mode 100755 index 0000000..f8c1487 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Queue.php @@ -0,0 +1,60 @@ +setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add ReservationSid attribute. + * + * @param string $reservationSid TaskRouter Reservation SID + */ + public function setReservationSid($reservationSid): self { + return $this->setAttribute('reservationSid', $reservationSid); + } + + /** + * Add PostWorkActivitySid attribute. + * + * @param string $postWorkActivitySid TaskRouter Activity SID + */ + public function setPostWorkActivitySid($postWorkActivitySid): self { + return $this->setAttribute('postWorkActivitySid', $postWorkActivitySid); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Record.php b/app/api/Twilio/TwiML/Voice/Record.php new file mode 100755 index 0000000..3cf7a15 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Record.php @@ -0,0 +1,132 @@ +setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add Timeout attribute. + * + * @param int $timeout Timeout to begin recording + */ + public function setTimeout($timeout): self { + return $this->setAttribute('timeout', $timeout); + } + + /** + * Add FinishOnKey attribute. + * + * @param string $finishOnKey Finish recording on key + */ + public function setFinishOnKey($finishOnKey): self { + return $this->setAttribute('finishOnKey', $finishOnKey); + } + + /** + * Add MaxLength attribute. + * + * @param int $maxLength Max time to record in seconds + */ + public function setMaxLength($maxLength): self { + return $this->setAttribute('maxLength', $maxLength); + } + + /** + * Add PlayBeep attribute. + * + * @param bool $playBeep Play beep + */ + public function setPlayBeep($playBeep): self { + return $this->setAttribute('playBeep', $playBeep); + } + + /** + * Add Trim attribute. + * + * @param string $trim Trim the recording + */ + public function setTrim($trim): self { + return $this->setAttribute('trim', $trim); + } + + /** + * Add RecordingStatusCallback attribute. + * + * @param string $recordingStatusCallback Status callback URL + */ + public function setRecordingStatusCallback($recordingStatusCallback): self { + return $this->setAttribute('recordingStatusCallback', $recordingStatusCallback); + } + + /** + * Add RecordingStatusCallbackMethod attribute. + * + * @param string $recordingStatusCallbackMethod Status callback URL method + */ + public function setRecordingStatusCallbackMethod($recordingStatusCallbackMethod): self { + return $this->setAttribute('recordingStatusCallbackMethod', $recordingStatusCallbackMethod); + } + + /** + * Add RecordingStatusCallbackEvent attribute. + * + * @param string[] $recordingStatusCallbackEvent Recording status callback + * events + */ + public function setRecordingStatusCallbackEvent($recordingStatusCallbackEvent): self { + return $this->setAttribute('recordingStatusCallbackEvent', $recordingStatusCallbackEvent); + } + + /** + * Add Transcribe attribute. + * + * @param bool $transcribe Transcribe the recording + */ + public function setTranscribe($transcribe): self { + return $this->setAttribute('transcribe', $transcribe); + } + + /** + * Add TranscribeCallback attribute. + * + * @param string $transcribeCallback Transcribe callback URL + */ + public function setTranscribeCallback($transcribeCallback): self { + return $this->setAttribute('transcribeCallback', $transcribeCallback); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Redirect.php b/app/api/Twilio/TwiML/Voice/Redirect.php new file mode 100755 index 0000000..1a51581 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Redirect.php @@ -0,0 +1,33 @@ +setAttribute('method', $method); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Refer.php b/app/api/Twilio/TwiML/Voice/Refer.php new file mode 100755 index 0000000..fe787e7 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Refer.php @@ -0,0 +1,51 @@ +nest(new ReferSip($sipUrl)); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/ReferSip.php b/app/api/Twilio/TwiML/Voice/ReferSip.php new file mode 100755 index 0000000..100c713 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/ReferSip.php @@ -0,0 +1,23 @@ +nest(new Parameter($attributes)); + } + + /** + * Add Reason attribute. + * + * @param string $reason Rejection reason + */ + public function setReason($reason): self { + return $this->setAttribute('reason', $reason); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Room.php b/app/api/Twilio/TwiML/Voice/Room.php new file mode 100755 index 0000000..1cc28c6 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Room.php @@ -0,0 +1,34 @@ +setAttribute('participantIdentity', $participantIdentity); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Say.php b/app/api/Twilio/TwiML/Voice/Say.php new file mode 100755 index 0000000..626ab73 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Say.php @@ -0,0 +1,158 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add P child. + * + * @param string $words Words to speak + * @return SsmlP Child element. + */ + public function p($words): SsmlP { + return $this->nest(new SsmlP($words)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add S child. + * + * @param string $words Words to speak + * @return SsmlS Child element. + */ + public function s($words): SsmlS { + return $this->nest(new SsmlS($words)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } + + /** + * Add Voice attribute. + * + * @param string $voice Voice to use + */ + public function setVoice($voice): self { + return $this->setAttribute('voice', $voice); + } + + /** + * Add Loop attribute. + * + * @param int $loop Times to loop message + */ + public function setLoop($loop): self { + return $this->setAttribute('loop', $loop); + } + + /** + * Add Language attribute. + * + * @param string $language Message language + */ + public function setLanguage($language): self { + return $this->setAttribute('language', $language); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Sim.php b/app/api/Twilio/TwiML/Voice/Sim.php new file mode 100755 index 0000000..3ca305a --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Sim.php @@ -0,0 +1,23 @@ +setAttribute('username', $username); + } + + /** + * Add Password attribute. + * + * @param string $password SIP Password + */ + public function setPassword($password): self { + return $this->setAttribute('password', $password); + } + + /** + * Add Url attribute. + * + * @param string $url Action URL + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallbackEvent attribute. + * + * @param string[] $statusCallbackEvent Status callback events + */ + public function setStatusCallbackEvent($statusCallbackEvent): self { + return $this->setAttribute('statusCallbackEvent', $statusCallbackEvent); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status callback URL method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } + + /** + * Add MachineDetection attribute. + * + * @param string $machineDetection Enable machine detection or end of greeting + * detection + */ + public function setMachineDetection($machineDetection): self { + return $this->setAttribute('machineDetection', $machineDetection); + } + + /** + * Add AmdStatusCallbackMethod attribute. + * + * @param string $amdStatusCallbackMethod HTTP Method to use with + * amd_status_callback + */ + public function setAmdStatusCallbackMethod($amdStatusCallbackMethod): self { + return $this->setAttribute('amdStatusCallbackMethod', $amdStatusCallbackMethod); + } + + /** + * Add AmdStatusCallback attribute. + * + * @param string $amdStatusCallback The URL we should call to send amd status + * information to your application + */ + public function setAmdStatusCallback($amdStatusCallback): self { + return $this->setAttribute('amdStatusCallback', $amdStatusCallback); + } + + /** + * Add MachineDetectionTimeout attribute. + * + * @param int $machineDetectionTimeout Number of seconds to wait for machine + * detection + */ + public function setMachineDetectionTimeout($machineDetectionTimeout): self { + return $this->setAttribute('machineDetectionTimeout', $machineDetectionTimeout); + } + + /** + * Add MachineDetectionSpeechThreshold attribute. + * + * @param int $machineDetectionSpeechThreshold Number of milliseconds for + * measuring stick for the length + * of the speech activity + */ + public function setMachineDetectionSpeechThreshold($machineDetectionSpeechThreshold): self { + return $this->setAttribute('machineDetectionSpeechThreshold', $machineDetectionSpeechThreshold); + } + + /** + * Add MachineDetectionSpeechEndThreshold attribute. + * + * @param int $machineDetectionSpeechEndThreshold Number of milliseconds of + * silence after speech activity + */ + public function setMachineDetectionSpeechEndThreshold($machineDetectionSpeechEndThreshold): self { + return $this->setAttribute('machineDetectionSpeechEndThreshold', $machineDetectionSpeechEndThreshold); + } + + /** + * Add MachineDetectionSilenceTimeout attribute. + * + * @param int $machineDetectionSilenceTimeout Number of milliseconds of initial + * silence + */ + public function setMachineDetectionSilenceTimeout($machineDetectionSilenceTimeout): self { + return $this->setAttribute('machineDetectionSilenceTimeout', $machineDetectionSilenceTimeout); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Siprec.php b/app/api/Twilio/TwiML/Voice/Siprec.php new file mode 100755 index 0000000..6cecb5e --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Siprec.php @@ -0,0 +1,60 @@ +nest(new Parameter($attributes)); + } + + /** + * Add Name attribute. + * + * @param string $name Friendly name given to SIPREC + */ + public function setName($name): self { + return $this->setAttribute('name', $name); + } + + /** + * Add ConnectorName attribute. + * + * @param string $connectorName Unique name for Connector + */ + public function setConnectorName($connectorName): self { + return $this->setAttribute('connectorName', $connectorName); + } + + /** + * Add Track attribute. + * + * @param string $track Track to be streamed to remote service + */ + public function setTrack($track): self { + return $this->setAttribute('track', $track); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Sms.php b/app/api/Twilio/TwiML/Voice/Sms.php new file mode 100755 index 0000000..b08a4ca --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Sms.php @@ -0,0 +1,69 @@ +setAttribute('to', $to); + } + + /** + * Add From attribute. + * + * @param string $from Number to send message from + */ + public function setFrom($from): self { + return $this->setAttribute('from', $from); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlBreak.php b/app/api/Twilio/TwiML/Voice/SsmlBreak.php new file mode 100755 index 0000000..670849d --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlBreak.php @@ -0,0 +1,42 @@ +setAttribute('strength', $strength); + } + + /** + * Add Time attribute. + * + * @param string $time Set a pause to a specific length of time in seconds or + * milliseconds, available values: [number]s, [number]ms + */ + public function setTime($time): self { + return $this->setAttribute('time', $time); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlEmphasis.php b/app/api/Twilio/TwiML/Voice/SsmlEmphasis.php new file mode 100755 index 0000000..3bb90b1 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlEmphasis.php @@ -0,0 +1,120 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } + + /** + * Add Level attribute. + * + * @param string $level Specify the degree of emphasis + */ + public function setLevel($level): self { + return $this->setAttribute('level', $level); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlLang.php b/app/api/Twilio/TwiML/Voice/SsmlLang.php new file mode 100755 index 0000000..9f234e0 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlLang.php @@ -0,0 +1,140 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add P child. + * + * @param string $words Words to speak + * @return SsmlP Child element. + */ + public function p($words): SsmlP { + return $this->nest(new SsmlP($words)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add S child. + * + * @param string $words Words to speak + * @return SsmlS Child element. + */ + public function s($words): SsmlS { + return $this->nest(new SsmlS($words)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } + + /** + * Add Xml:Lang attribute. + * + * @param string $xmlLang Specify the language + */ + public function setXmlLang($xmlLang): self { + return $this->setAttribute('xml:Lang', $xmlLang); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlP.php b/app/api/Twilio/TwiML/Voice/SsmlP.php new file mode 100755 index 0000000..a3bc731 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlP.php @@ -0,0 +1,120 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add S child. + * + * @param string $words Words to speak + * @return SsmlS Child element. + */ + public function s($words): SsmlS { + return $this->nest(new SsmlS($words)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlPhoneme.php b/app/api/Twilio/TwiML/Voice/SsmlPhoneme.php new file mode 100755 index 0000000..54798f4 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlPhoneme.php @@ -0,0 +1,42 @@ +setAttribute('alphabet', $alphabet); + } + + /** + * Add Ph attribute. + * + * @param string $ph Specifiy the phonetic symbols for pronunciation + */ + public function setPh($ph): self { + return $this->setAttribute('ph', $ph); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlProsody.php b/app/api/Twilio/TwiML/Voice/SsmlProsody.php new file mode 100755 index 0000000..b6f2817 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlProsody.php @@ -0,0 +1,161 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add P child. + * + * @param string $words Words to speak + * @return SsmlP Child element. + */ + public function p($words): SsmlP { + return $this->nest(new SsmlP($words)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add S child. + * + * @param string $words Words to speak + * @return SsmlS Child element. + */ + public function s($words): SsmlS { + return $this->nest(new SsmlS($words)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } + + /** + * Add Volume attribute. + * + * @param string $volume Specify the volume, available values: default, silent, + * x-soft, soft, medium, loud, x-loud, +ndB, -ndB + */ + public function setVolume($volume): self { + return $this->setAttribute('volume', $volume); + } + + /** + * Add Rate attribute. + * + * @param string $rate Specify the rate, available values: x-slow, slow, + * medium, fast, x-fast, n% + */ + public function setRate($rate): self { + return $this->setAttribute('rate', $rate); + } + + /** + * Add Pitch attribute. + * + * @param string $pitch Specify the pitch, available values: default, x-low, + * low, medium, high, x-high, +n%, -n% + */ + public function setPitch($pitch): self { + return $this->setAttribute('pitch', $pitch); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlS.php b/app/api/Twilio/TwiML/Voice/SsmlS.php new file mode 100755 index 0000000..9d8f41f --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlS.php @@ -0,0 +1,110 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Lang child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlLang Child element. + */ + public function lang($words, $attributes = []): SsmlLang { + return $this->nest(new SsmlLang($words, $attributes)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add W child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlW Child element. + */ + public function w($words, $attributes = []): SsmlW { + return $this->nest(new SsmlW($words, $attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlSayAs.php b/app/api/Twilio/TwiML/Voice/SsmlSayAs.php new file mode 100755 index 0000000..44be26e --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlSayAs.php @@ -0,0 +1,43 @@ +setAttribute('interpret-as', $interpretAs); + } + + /** + * Add Format attribute. + * + * @param string $format Specify the format of the date when interpret-as is + * set to date + */ + public function setFormat($format): self { + return $this->setAttribute('format', $format); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlSub.php b/app/api/Twilio/TwiML/Voice/SsmlSub.php new file mode 100755 index 0000000..b4fc5aa --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlSub.php @@ -0,0 +1,34 @@ +setAttribute('alias', $alias); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/SsmlW.php b/app/api/Twilio/TwiML/Voice/SsmlW.php new file mode 100755 index 0000000..b4bca69 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/SsmlW.php @@ -0,0 +1,99 @@ +nest(new SsmlBreak($attributes)); + } + + /** + * Add Emphasis child. + * + * @param string $words Words to emphasize + * @param array $attributes Optional attributes + * @return SsmlEmphasis Child element. + */ + public function emphasis($words, $attributes = []): SsmlEmphasis { + return $this->nest(new SsmlEmphasis($words, $attributes)); + } + + /** + * Add Phoneme child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlPhoneme Child element. + */ + public function phoneme($words, $attributes = []): SsmlPhoneme { + return $this->nest(new SsmlPhoneme($words, $attributes)); + } + + /** + * Add Prosody child. + * + * @param string $words Words to speak + * @param array $attributes Optional attributes + * @return SsmlProsody Child element. + */ + public function prosody($words, $attributes = []): SsmlProsody { + return $this->nest(new SsmlProsody($words, $attributes)); + } + + /** + * Add Say-As child. + * + * @param string $words Words to be interpreted + * @param array $attributes Optional attributes + * @return SsmlSayAs Child element. + */ + public function say_As($words, $attributes = []): SsmlSayAs { + return $this->nest(new SsmlSayAs($words, $attributes)); + } + + /** + * Add Sub child. + * + * @param string $words Words to be substituted + * @param array $attributes Optional attributes + * @return SsmlSub Child element. + */ + public function sub($words, $attributes = []): SsmlSub { + return $this->nest(new SsmlSub($words, $attributes)); + } + + /** + * Add Role attribute. + * + * @param string $role Customize the pronunciation of words by specifying the + * word’s part of speech or alternate meaning + */ + public function setRole($role): self { + return $this->setAttribute('role', $role); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Start.php b/app/api/Twilio/TwiML/Voice/Start.php new file mode 100755 index 0000000..8c29206 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Start.php @@ -0,0 +1,61 @@ +nest(new Stream($attributes)); + } + + /** + * Add Siprec child. + * + * @param array $attributes Optional attributes + * @return Siprec Child element. + */ + public function siprec($attributes = []): Siprec { + return $this->nest(new Siprec($attributes)); + } + + /** + * Add Action attribute. + * + * @param string $action Action URL + */ + public function setAction($action): self { + return $this->setAttribute('action', $action); + } + + /** + * Add Method attribute. + * + * @param string $method Action URL method + */ + public function setMethod($method): self { + return $this->setAttribute('method', $method); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Stop.php b/app/api/Twilio/TwiML/Voice/Stop.php new file mode 100755 index 0000000..9266e29 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Stop.php @@ -0,0 +1,41 @@ +nest(new Stream($attributes)); + } + + /** + * Add Siprec child. + * + * @param array $attributes Optional attributes + * @return Siprec Child element. + */ + public function siprec($attributes = []): Siprec { + return $this->nest(new Siprec($attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Stream.php b/app/api/Twilio/TwiML/Voice/Stream.php new file mode 100755 index 0000000..d1f33de --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Stream.php @@ -0,0 +1,87 @@ +nest(new Parameter($attributes)); + } + + /** + * Add Name attribute. + * + * @param string $name Friendly name given to the Stream + */ + public function setName($name): self { + return $this->setAttribute('name', $name); + } + + /** + * Add ConnectorName attribute. + * + * @param string $connectorName Unique name for Stream Connector + */ + public function setConnectorName($connectorName): self { + return $this->setAttribute('connectorName', $connectorName); + } + + /** + * Add Url attribute. + * + * @param string $url URL of the remote service where the Stream is routed + */ + public function setUrl($url): self { + return $this->setAttribute('url', $url); + } + + /** + * Add Track attribute. + * + * @param string $track Track to be streamed to remote service + */ + public function setTrack($track): self { + return $this->setAttribute('track', $track); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback Status Callback URL + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod Status Callback URL method + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/Task.php b/app/api/Twilio/TwiML/Voice/Task.php new file mode 100755 index 0000000..722a9e8 --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/Task.php @@ -0,0 +1,42 @@ +setAttribute('priority', $priority); + } + + /** + * Add Timeout attribute. + * + * @param int $timeout Timeout associated with task + */ + public function setTimeout($timeout): self { + return $this->setAttribute('timeout', $timeout); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/Voice/VirtualAgent.php b/app/api/Twilio/TwiML/Voice/VirtualAgent.php new file mode 100755 index 0000000..9e52c4b --- /dev/null +++ b/app/api/Twilio/TwiML/Voice/VirtualAgent.php @@ -0,0 +1,92 @@ +nest(new Config($attributes)); + } + + /** + * Add Parameter child. + * + * @param array $attributes Optional attributes + * @return Parameter Child element. + */ + public function parameter($attributes = []): Parameter { + return $this->nest(new Parameter($attributes)); + } + + /** + * Add ConnectorName attribute. + * + * @param string $connectorName Defines the conversation profile Dialogflow + * needs to use + */ + public function setConnectorName($connectorName): self { + return $this->setAttribute('connectorName', $connectorName); + } + + /** + * Add Language attribute. + * + * @param string $language Language to be used by Dialogflow to transcribe + * speech + */ + public function setLanguage($language): self { + return $this->setAttribute('language', $language); + } + + /** + * Add SentimentAnalysis attribute. + * + * @param bool $sentimentAnalysis Whether sentiment analysis needs to be + * enabled or not + */ + public function setSentimentAnalysis($sentimentAnalysis): self { + return $this->setAttribute('sentimentAnalysis', $sentimentAnalysis); + } + + /** + * Add StatusCallback attribute. + * + * @param string $statusCallback URL to post status callbacks from Twilio + */ + public function setStatusCallback($statusCallback): self { + return $this->setAttribute('statusCallback', $statusCallback); + } + + /** + * Add StatusCallbackMethod attribute. + * + * @param string $statusCallbackMethod HTTP method to use when requesting the + * status callback URL + */ + public function setStatusCallbackMethod($statusCallbackMethod): self { + return $this->setAttribute('statusCallbackMethod', $statusCallbackMethod); + } +} \ No newline at end of file diff --git a/app/api/Twilio/TwiML/VoiceResponse.php b/app/api/Twilio/TwiML/VoiceResponse.php new file mode 100755 index 0000000..d1ed009 --- /dev/null +++ b/app/api/Twilio/TwiML/VoiceResponse.php @@ -0,0 +1,222 @@ +nest(new Voice\Connect($attributes)); + } + + /** + * Add Dial child. + * + * @param string $number Phone number to dial + * @param array $attributes Optional attributes + * @return Voice\Dial Child element. + */ + public function dial($number = null, $attributes = []): Voice\Dial { + return $this->nest(new Voice\Dial($number, $attributes)); + } + + /** + * Add Echo child. + * + * @return Voice\Echo_ Child element. + */ + public function echo_(): Voice\Echo_ { + return $this->nest(new Voice\Echo_()); + } + + /** + * Add Enqueue child. + * + * @param string $name Friendly name + * @param array $attributes Optional attributes + * @return Voice\Enqueue Child element. + */ + public function enqueue($name = null, $attributes = []): Voice\Enqueue { + return $this->nest(new Voice\Enqueue($name, $attributes)); + } + + /** + * Add Gather child. + * + * @param array $attributes Optional attributes + * @return Voice\Gather Child element. + */ + public function gather($attributes = []): Voice\Gather { + return $this->nest(new Voice\Gather($attributes)); + } + + /** + * Add Hangup child. + * + * @return Voice\Hangup Child element. + */ + public function hangup(): Voice\Hangup { + return $this->nest(new Voice\Hangup()); + } + + /** + * Add Leave child. + * + * @return Voice\Leave Child element. + */ + public function leave(): Voice\Leave { + return $this->nest(new Voice\Leave()); + } + + /** + * Add Pause child. + * + * @param array $attributes Optional attributes + * @return Voice\Pause Child element. + */ + public function pause($attributes = []): Voice\Pause { + return $this->nest(new Voice\Pause($attributes)); + } + + /** + * Add Play child. + * + * @param string $url Media URL + * @param array $attributes Optional attributes + * @return Voice\Play Child element. + */ + public function play($url = null, $attributes = []): Voice\Play { + return $this->nest(new Voice\Play($url, $attributes)); + } + + /** + * Add Queue child. + * + * @param string $name Queue name + * @param array $attributes Optional attributes + * @return Voice\Queue Child element. + */ + public function queue($name, $attributes = []): Voice\Queue { + return $this->nest(new Voice\Queue($name, $attributes)); + } + + /** + * Add Record child. + * + * @param array $attributes Optional attributes + * @return Voice\Record Child element. + */ + public function record($attributes = []): Voice\Record { + return $this->nest(new Voice\Record($attributes)); + } + + /** + * Add Redirect child. + * + * @param string $url Redirect URL + * @param array $attributes Optional attributes + * @return Voice\Redirect Child element. + */ + public function redirect($url, $attributes = []): Voice\Redirect { + return $this->nest(new Voice\Redirect($url, $attributes)); + } + + /** + * Add Reject child. + * + * @param array $attributes Optional attributes + * @return Voice\Reject Child element. + */ + public function reject($attributes = []): Voice\Reject { + return $this->nest(new Voice\Reject($attributes)); + } + + /** + * Add Say child. + * + * @param string $message Message to say + * @param array $attributes Optional attributes + * @return Voice\Say Child element. + */ + public function say($message, $attributes = []): Voice\Say { + return $this->nest(new Voice\Say($message, $attributes)); + } + + /** + * Add Sms child. + * + * @param string $message Message body + * @param array $attributes Optional attributes + * @return Voice\Sms Child element. + */ + public function sms($message, $attributes = []): Voice\Sms { + return $this->nest(new Voice\Sms($message, $attributes)); + } + + /** + * Add Pay child. + * + * @param array $attributes Optional attributes + * @return Voice\Pay Child element. + */ + public function pay($attributes = []): Voice\Pay { + return $this->nest(new Voice\Pay($attributes)); + } + + /** + * Add Prompt child. + * + * @param array $attributes Optional attributes + * @return Voice\Prompt Child element. + */ + public function prompt($attributes = []): Voice\Prompt { + return $this->nest(new Voice\Prompt($attributes)); + } + + /** + * Add Start child. + * + * @param array $attributes Optional attributes + * @return Voice\Start Child element. + */ + public function start($attributes = []): Voice\Start { + return $this->nest(new Voice\Start($attributes)); + } + + /** + * Add Stop child. + * + * @return Voice\Stop Child element. + */ + public function stop(): Voice\Stop { + return $this->nest(new Voice\Stop()); + } + + /** + * Add Refer child. + * + * @param array $attributes Optional attributes + * @return Voice\Refer Child element. + */ + public function refer($attributes = []): Voice\Refer { + return $this->nest(new Voice\Refer($attributes)); + } +} \ No newline at end of file diff --git a/app/api/Twilio/Values.php b/app/api/Twilio/Values.php new file mode 100755 index 0000000..105d338 --- /dev/null +++ b/app/api/Twilio/Values.php @@ -0,0 +1,98 @@ + $value) { + if (!in_array($value, self::$noneConstants, true)) { + $result[$key] = $value; + } + } + return $result; + } + + public function __construct(array $options) { + $this->options = []; + foreach ($options as $key => $value) { + $this->options[\strtolower($key)] = $value; + } + } + + /** + * (PHP 5 >= 5.0.0)
+ * Whether a offset exists + * @link http://php.net/manual/en/arrayaccess.offsetexists.php + * @param mixed $offset

+ * An offset to check for. + *

+ * @return bool true on success or false on failure. + *

+ *

+ * The return value will be casted to boolean if non-boolean was returned. + */ + public function offsetExists($offset): bool { + return true; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to retrieve + * @link http://php.net/manual/en/arrayaccess.offsetget.php + * @param mixed $offset

+ * The offset to retrieve. + *

+ * @return mixed Can return all value types. + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) { + $offset = \strtolower($offset); + return \array_key_exists($offset, $this->options) ? $this->options[$offset] : self::NONE; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to set + * @link http://php.net/manual/en/arrayaccess.offsetset.php + * @param mixed $offset

+ * The offset to assign the value to. + *

+ * @param mixed $value

+ * The value to set. + *

+ * @return void + */ + public function offsetSet($offset, $value): void { + $this->options[\strtolower($offset)] = $value; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Offset to unset + * @link http://php.net/manual/en/arrayaccess.offsetunset.php + * @param mixed $offset

+ * The offset to unset. + *

+ * @return void + */ + public function offsetUnset($offset): void { + unset($this->options[$offset]); + } +} diff --git a/app/api/Twilio/Version.php b/app/api/Twilio/Version.php new file mode 100755 index 0000000..f2165d5 --- /dev/null +++ b/app/api/Twilio/Version.php @@ -0,0 +1,236 @@ +domain = $domain; + $this->version = null; + } + + /** + * Generate an absolute URL from a version relative uri + * @param string $uri Version relative uri + * @return string Absolute URL + */ + public function absoluteUrl(string $uri): string { + return $this->getDomain()->absoluteUrl($this->relativeUri($uri)); + } + + /** + * Generate a domain relative uri from a version relative uri + * @param string $uri Version relative uri + * @return string Domain relative uri + */ + public function relativeUri(string $uri): string { + return \trim($this->version ?? '', '/') . '/' . \trim($uri, '/'); + } + + public function request(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null): Response { + $uri = $this->relativeUri($uri); + return $this->getDomain()->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + } + + /** + * Create the best possible exception for the response. + * + * Attempts to parse the response for Twilio Standard error messages and use + * those to populate the exception, falls back to generic error message and + * HTTP status code. + * + * @param Response $response Error response + * @param string $header Header for exception message + * @return TwilioException + */ + protected function exception(Response $response, string $header): TwilioException { + $message = '[HTTP ' . $response->getStatusCode() . '] ' . $header; + + $content = $response->getContent(); + if (\is_array($content)) { + $message .= isset($content['message']) ? ': ' . $content['message'] : ''; + $code = isset($content['code']) ? $content['code'] : $response->getStatusCode(); + $moreInfo = $content['more_info'] ?? ''; + $details = $content['details'] ?? []; + return new RestException($message, $code, $response->getStatusCode(), $moreInfo, $details); + } + + return new RestException($message, $response->getStatusCode(), $response->getStatusCode()); + } + + /** + * @throws TwilioException + */ + public function fetch(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null) { + $response = $this->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + + // 3XX response codes are allowed here to allow for 307 redirect from Deactivations API. + if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 400) { + throw $this->exception($response, 'Unable to fetch record'); + } + + return $response->getContent(); + } + + /** + * @throws TwilioException + */ + public function update(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null) { + $response = $this->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + + if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) { + throw $this->exception($response, 'Unable to update record'); + } + + return $response->getContent(); + } + + /** + * @throws TwilioException + */ + public function delete(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null): bool { + $response = $this->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + + if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) { + throw $this->exception($response, 'Unable to delete record'); + } + + return $response->getStatusCode() === 204; + } + + public function readLimits(int $limit = null, int $pageSize = null): array { + if ($limit && $pageSize === null) { + $pageSize = $limit; + } + + $pageSize = \min($pageSize, self::MAX_PAGE_SIZE); + + return [ + 'limit' => $limit ?: Values::NONE, + 'pageSize' => $pageSize ?: Values::NONE, + 'pageLimit' => Values::NONE, + ]; + } + + public function page(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null): Response { + return $this->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + } + + public function stream(Page $page, $limit = null, $pageLimit = null): Stream { + return new Stream($page, $limit, $pageLimit); + } + + /** + * @throws TwilioException + */ + public function create(string $method, string $uri, + array $params = [], array $data = [], array $headers = [], + string $username = null, string $password = null, + int $timeout = null) { + $response = $this->request( + $method, + $uri, + $params, + $data, + $headers, + $username, + $password, + $timeout + ); + + if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) { + throw $this->exception($response, 'Unable to create record'); + } + + return $response->getContent(); + } + + public function getDomain(): Domain { + return $this->domain; + } + + public function __toString(): string { + return '[Version]'; + } +} diff --git a/app/api/Twilio/VersionInfo.php b/app/api/Twilio/VersionInfo.php new file mode 100755 index 0000000..91afcf2 --- /dev/null +++ b/app/api/Twilio/VersionInfo.php @@ -0,0 +1,15 @@ +. + */ + +/** + * SplClassLoader implementation that implements the technical interoperability + * standards for PHP 5.3 namespaces and class names. + * + * http://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1 + * + * // Example which loads classes for the Doctrine Common package in the + * // Doctrine\Common namespace. + * $classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine'); + * $classLoader->register(); + * + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @author Jonathan H. Wage + * @author Roman S. Borschel + * @author Matthew Weier O'Phinney + * @author Kris Wallsmith + * @author Fabien Potencier + */ +class SplClassLoader { + private $_fileExtension = '.php'; + private $_namespace; + private $_includePath; + private $_namespaceSeparator = '\\'; + + /** + * Creates a new SplClassLoader that loads classes of the + * specified namespace. + * + * @param string $ns The namespace to use. + * @param string $includePath The include path to search + */ + public function __construct($ns = null, $includePath = null) { + $this->_namespace = $ns; + $this->_includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this class loader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep): void { + $this->_namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this class loader. + * + * @return string The separator to use. + */ + public function getNamespaceSeparator(): string { + return $this->_namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this class loader. + * + * @param string $includePath + */ + public function setIncludePath($includePath): void { + $this->_includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this class loader. + * + * @return string $includePath + */ + public function getIncludePath(): string { + return $this->_includePath; + } + + /** + * Sets the file extension of class files in the namespace of this class loader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension): void { + $this->_fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this class loader. + * + * @return string $fileExtension + */ + public function getFileExtension(): string { + return $this->_fileExtension; + } + + /** + * Installs this class loader on the SPL autoload stack. + */ + public function register(): void { + \spl_autoload_register([$this, 'loadClass']); + } + + /** + * Uninstalls this class loader from the SPL autoloader stack. + */ + public function unregister(): void { + \spl_autoload_unregister([$this, 'loadClass']); + } + + /** + * Loads the given class or interface. + * + * @param string $className The name of the class to load. + * @return void + */ + public function loadClass($className): void { + if (null === $this->_namespace || $this->_namespace . $this->_namespaceSeparator === \substr($className, 0, \strlen($this->_namespace . $this->_namespaceSeparator))) { + $fileName = ''; + $namespace = ''; + if (false !== ($lastNsPos = \strripos($className, $this->_namespaceSeparator))) { + $namespace = \substr($className, 0, $lastNsPos); + $className = \substr($className, $lastNsPos + 1); + $fileName = \str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; + } + $fileName .= \str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->_fileExtension; + require ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName; + } + } +} + +$twilioClassLoader = new SplClassLoader('Twilio', \realpath(__DIR__ . DIRECTORY_SEPARATOR . '..')); +$twilioClassLoader->register(); diff --git a/app/api/XLSX/xlsxwriter.class.php b/app/api/XLSX/xlsxwriter.class.php new file mode 100755 index 0000000..cb391f2 --- /dev/null +++ b/app/api/XLSX/xlsxwriter.class.php @@ -0,0 +1,981 @@ +tempFilename()) or self::log("Warning: tempdir ".sys_get_temp_dir()." not writeable, use ->setTempDir()"); + class_exists('ZipArchive') or self::log("Error: ZipArchive class does not exist"); + $this->addCellStyle($number_format='GENERAL', $style_string=null); + } + + public function setTitle($title='') { $this->title=$title; } + public function setSubject($subject='') { $this->subject=$subject; } + public function setAuthor($author='') { $this->author=$author; } + public function setCompany($company='') { $this->company=$company; } + public function setKeywords($keywords='') { $this->keywords=$keywords; } + public function setDescription($description='') { $this->description=$description; } + public function setTempDir($tempdir='') { $this->tempdir=$tempdir; } + public function setRightToLeft($isRightToLeft=false){ $this->isRightToLeft=$isRightToLeft; } + + public function __destruct() + { + if (!empty($this->temp_files)) { + foreach($this->temp_files as $temp_file) { + @unlink($temp_file); + } + } + } + + protected function tempFilename() + { + $tempdir = !empty($this->tempdir) ? $this->tempdir : sys_get_temp_dir(); + $filename = tempnam($tempdir, "xlsx_writer_"); + if (!$filename) { + // If you are seeing this error, it's possible you may have too many open + // file handles. If you're creating a spreadsheet with many small inserts, + // it is possible to exceed the default 1024 open file handles. Run 'ulimit -a' + // and try increasing the 'open files' number with 'ulimit -n 8192' + throw new \Exception("Unable to create tempfile - check file handle limits?"); + } + $this->temp_files[] = $filename; + return $filename; + } + + public function writeToStdOut() + { + $temp_file = $this->tempFilename(); + self::writeToFile($temp_file); + readfile($temp_file); + } + + public function writeToString() + { + $temp_file = $this->tempFilename(); + self::writeToFile($temp_file); + $string = file_get_contents($temp_file); + return $string; + } + + public function writeToFile($filename) + { + foreach($this->sheets as $sheet_name => $sheet) { + self::finalizeSheet($sheet_name);//making sure all footers have been written + } + + if ( file_exists( $filename ) ) { + if ( is_writable( $filename ) ) { + @unlink( $filename ); //if the zip already exists, remove it + } else { + self::log( "Error in " . __CLASS__ . "::" . __FUNCTION__ . ", file is not writeable." ); + return; + } + } + $zip = new ZipArchive(); + if (empty($this->sheets)) { self::log("Error in ".__CLASS__."::".__FUNCTION__.", no worksheets defined."); return; } + if (!$zip->open($filename, ZipArchive::CREATE)) { self::log("Error in ".__CLASS__."::".__FUNCTION__.", unable to create zip."); return; } + + $zip->addEmptyDir("docProps/"); + $zip->addFromString("docProps/app.xml" , self::buildAppXML() ); + $zip->addFromString("docProps/core.xml", self::buildCoreXML()); + + $zip->addEmptyDir("_rels/"); + $zip->addFromString("_rels/.rels", self::buildRelationshipsXML()); + + $zip->addEmptyDir("xl/worksheets/"); + foreach($this->sheets as $sheet) { + $zip->addFile($sheet->filename, "xl/worksheets/".$sheet->xmlname ); + } + $zip->addFromString("xl/workbook.xml" , self::buildWorkbookXML() ); + $zip->addFile($this->writeStylesXML(), "xl/styles.xml" ); //$zip->addFromString("xl/styles.xml" , self::buildStylesXML() ); + $zip->addFromString("[Content_Types].xml" , self::buildContentTypesXML() ); + + $zip->addEmptyDir("xl/_rels/"); + $zip->addFromString("xl/_rels/workbook.xml.rels", self::buildWorkbookRelsXML() ); + $zip->close(); + } + + protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filter=false, $freeze_rows=false, $freeze_columns=false ) + { + //if already initialized + if ($this->current_sheet==$sheet_name || isset($this->sheets[$sheet_name])) + return; + + $sheet_filename = $this->tempFilename(); + $sheet_xmlname = 'sheet' . (count($this->sheets) + 1).".xml"; + $this->sheets[$sheet_name] = (object)array( + 'filename' => $sheet_filename, + 'sheetname' => $sheet_name, + 'xmlname' => $sheet_xmlname, + 'row_count' => 0, + 'file_writer' => new MEC_XLSXWriter_BuffererWriter($sheet_filename), + 'columns' => array(), + 'merge_cells' => array(), + 'max_cell_tag_start' => 0, + 'max_cell_tag_end' => 0, + 'auto_filter' => $auto_filter, + 'freeze_rows' => $freeze_rows, + 'freeze_columns' => $freeze_columns, + 'finalized' => false, + ); + $rightToLeftValue = $this->isRightToLeft ? 'true' : 'false'; + $sheet = &$this->sheets[$sheet_name]; + $tabselected = count($this->sheets) == 1 ? 'true' : 'false';//only first sheet is selected + $max_cell=MEC_XLSXWriter::xlsCell(self::EXCEL_2007_MAX_ROW, self::EXCEL_2007_MAX_COL);//XFE1048577 + $sheet->file_writer->write('' . "\n"); + $sheet->file_writer->write(''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->max_cell_tag_start = $sheet->file_writer->ftell(); + $sheet->file_writer->write(''); + $sheet->max_cell_tag_end = $sheet->file_writer->ftell(); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + if ($sheet->freeze_rows && $sheet->freeze_columns) { + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + } + elseif ($sheet->freeze_rows) { + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + } + elseif ($sheet->freeze_columns) { + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + } + else { // not frozen + $sheet->file_writer->write( ''); + } + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $i=0; + if (!empty($col_widths)) { + foreach($col_widths as $column_width) { + $sheet->file_writer->write( ''); + $i++; + } + } + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + } + + private function addCellStyle($number_format, $cell_style_string) + { + $number_format_idx = self::add_to_list_get_index($this->number_formats, $number_format); + $lookup_string = $number_format_idx.";".$cell_style_string; + $cell_style_idx = self::add_to_list_get_index($this->cell_styles, $lookup_string); + return $cell_style_idx; + } + + private function initializeColumnTypes($header_types) + { + $column_types = []; + foreach($header_types as $v) + { + $number_format = self::numberFormatStandardized($v); + $number_format_type = self::determineNumberFormatType($number_format); + $cell_style_idx = $this->addCellStyle($number_format, $style_string=null); + $column_types[] = array('number_format' => $number_format,//contains excel format like 'YYYY-MM-DD HH:MM:SS' + 'number_format_type' => $number_format_type, //contains friendly format like 'datetime' + 'default_cell_style' => $cell_style_idx, + ); + } + return $column_types; + } + + public function writeSheetHeader($sheet_name, array $header_types, $col_options = null) + { + if (empty($sheet_name) || empty($header_types)) + return; + + $suppress_row = isset($col_options['suppress_row']) ? intval($col_options['suppress_row']) : false; + if (is_bool($col_options)) + { + self::log( "Warning! passing $suppress_row=false|true to writeSheetHeader() is deprecated, this will be removed in a future version." ); + $suppress_row = intval($col_options); + } + $style = &$col_options; + + $col_widths = isset($col_options['widths']) ? (array)$col_options['widths'] : []; + $auto_filter = isset($col_options['auto_filter']) ? intval($col_options['auto_filter']) : false; + $freeze_rows = isset($col_options['freeze_rows']) ? intval($col_options['freeze_rows']) : false; + $freeze_columns = isset($col_options['freeze_columns']) ? intval($col_options['freeze_columns']) : false; + self::initializeSheet($sheet_name, $col_widths, $auto_filter, $freeze_rows, $freeze_columns); + $sheet = &$this->sheets[$sheet_name]; + $sheet->columns = $this->initializeColumnTypes($header_types); + if (!$suppress_row) + { + $header_row = array_keys($header_types); + + $sheet->file_writer->write(''); + $sheet->row_count++; + } + $this->current_sheet = $sheet_name; + } + + public function writeSheetRow($sheet_name, array $row, $row_options=null) + { + if (empty($sheet_name)) + return; + + $this->initializeSheet($sheet_name); + $sheet = &$this->sheets[$sheet_name]; + if (count($sheet->columns) < count($row)) { + $default_column_types = $this->initializeColumnTypes( array_fill($from=0, $until=count($row), 'GENERAL') );//will map to n_auto + $sheet->columns = array_merge((array)$sheet->columns, $default_column_types); + } + + if (!empty($row_options)) + { + $ht = isset($row_options['height']) ? floatval($row_options['height']) : 12.1; + $customHt = isset($row_options['height']) ? true : false; + $hidden = isset($row_options['hidden']) ? (bool)($row_options['hidden']) : false; + $collapsed = isset($row_options['collapsed']) ? (bool)($row_options['collapsed']) : false; + $sheet->file_writer->write(''); + + if (!empty($sheet->merge_cells)) { + $sheet->file_writer->write( ''); + foreach ($sheet->merge_cells as $range) { + $sheet->file_writer->write( ''); + } + $sheet->file_writer->write( ''); + } + + $max_cell = self::xlsCell($sheet->row_count - 1, count($sheet->columns) - 1); + + if ($sheet->auto_filter) { + $sheet->file_writer->write( ''); + } + + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( ''); + $sheet->file_writer->write( '&C&"Times New Roman,Regular"&12&A'); + $sheet->file_writer->write( '&C&"Times New Roman,Regular"&12Page &P'); + $sheet->file_writer->write( ''); + $sheet->file_writer->write(''); + + $max_cell_tag = ''; + $padding_length = $sheet->max_cell_tag_end - $sheet->max_cell_tag_start - strlen($max_cell_tag); + $sheet->file_writer->fseek($sheet->max_cell_tag_start); + $sheet->file_writer->write($max_cell_tag.str_repeat(" ", $padding_length)); + $sheet->file_writer->close(); + $sheet->finalized=true; + } + + public function markMergedCell($sheet_name, $start_cell_row, $start_cell_column, $end_cell_row, $end_cell_column) + { + if (empty($sheet_name) || $this->sheets[$sheet_name]->finalized) + return; + + self::initializeSheet($sheet_name); + $sheet = &$this->sheets[$sheet_name]; + + $startCell = self::xlsCell($start_cell_row, $start_cell_column); + $endCell = self::xlsCell($end_cell_row, $end_cell_column); + $sheet->merge_cells[] = $startCell . ":" . $endCell; + } + + public function writeSheet(array $data, $sheet_name='', array $header_types=array()) + { + $sheet_name = empty($sheet_name) ? 'Sheet1' : $sheet_name; + $data = empty($data) ? array(array('')) : $data; + if (!empty($header_types)) + { + $this->writeSheetHeader($sheet_name, $header_types); + } + foreach($data as $i=>$row) + { + $this->writeSheetRow($sheet_name, $row); + } + $this->finalizeSheet($sheet_name); + } + + protected function writeCell(MEC_XLSXWriter_BuffererWriter &$file, $row_number, $column_number, $value, $num_format_type, $cell_style_idx) + { + $cell_name = self::xlsCell($row_number, $column_number); + + if (!is_scalar($value) || $value==='') { //objects, array, empty + $file->write(''); + } elseif (is_string($value) && $value[0]=='='){ + $file->write(''.self::xmlspecialchars(ltrim($value, '=')).''); + } elseif ($num_format_type=='n_date') { + $file->write(''.intval(self::convert_date_time($value)).''); + } elseif ($num_format_type=='n_datetime') { + $file->write(''.self::convert_date_time($value).''); + } elseif ($num_format_type=='n_numeric') { + $file->write(''.self::xmlspecialchars($value).'');//int,float,currency + } elseif ($num_format_type=='n_string') { + $file->write(''.self::xmlspecialchars($value).''); + } elseif ($num_format_type=='n_auto' || 1) { //auto-detect unknown column types + if (!is_string($value) || $value=='0' || ($value[0]!='0' && ctype_digit($value)) || preg_match("/^\-?(0|[1-9][0-9]*)(\.[0-9]+)?$/", $value)){ + $file->write(''.self::xmlspecialchars($value).'');//int,float,currency + } else { //implied: ($cell_format=='string') + $file->write(''.self::xmlspecialchars($value).''); + } + } + } + + protected function styleFontIndexes() + { + static $border_allowed = array('left','right','top','bottom'); + static $border_style_allowed = array('thin','medium','thick','dashDot','dashDotDot','dashed','dotted','double','hair','mediumDashDot','mediumDashDotDot','mediumDashed','slantDashDot'); + static $horizontal_allowed = array('general','left','right','justify','center'); + static $vertical_allowed = array('bottom','center','distributed','top'); + $default_font = array('size'=>'10','name'=>'Arial','family'=>'2'); + $fills = array('','');//2 placeholders for static xml later + $fonts = array('','','','');//4 placeholders for static xml later + $borders = array('');//1 placeholder for static xml later + $style_indexes = []; + foreach($this->cell_styles as $i=>$cell_style_string) + { + $semi_colon_pos = strpos($cell_style_string,";"); + $number_format_idx = substr($cell_style_string, 0, $semi_colon_pos); + $style_json_string = substr($cell_style_string, $semi_colon_pos+1); + $style = @json_decode($style_json_string, $as_assoc=true); + + $style_indexes[$i] = array('num_fmt_idx'=>$number_format_idx);//initialize entry + if (isset($style['border']) && is_string($style['border']))//border is a comma delimited str + { + $border_value['side'] = array_intersect(explode(",", $style['border']), $border_allowed); + if (isset($style['border-style']) && in_array($style['border-style'],$border_style_allowed)) + { + $border_value['style'] = $style['border-style']; + } + if (isset($style['border-color']) && is_string($style['border-color']) && $style['border-color'][0]=='#') + { + $v = substr($style['border-color'],1,6); + $v = strlen($v)==3 ? $v[0].$v[0].$v[1].$v[1].$v[2].$v[2] : $v;// expand cf0 => ccff00 + $border_value['color'] = "FF".strtoupper($v); + } + $style_indexes[$i]['border_idx'] = self::add_to_list_get_index($borders, json_encode($border_value)); + } + if (isset($style['fill']) && is_string($style['fill']) && $style['fill'][0]=='#') + { + $v = substr($style['fill'],1,6); + $v = strlen($v)==3 ? $v[0].$v[0].$v[1].$v[1].$v[2].$v[2] : $v;// expand cf0 => ccff00 + $style_indexes[$i]['fill_idx'] = self::add_to_list_get_index($fills, "FF".strtoupper($v) ); + } + if (isset($style['halign']) && in_array($style['halign'],$horizontal_allowed)) + { + $style_indexes[$i]['alignment'] = true; + $style_indexes[$i]['halign'] = $style['halign']; + } + if (isset($style['valign']) && in_array($style['valign'],$vertical_allowed)) + { + $style_indexes[$i]['alignment'] = true; + $style_indexes[$i]['valign'] = $style['valign']; + } + if (isset($style['wrap_text'])) + { + $style_indexes[$i]['alignment'] = true; + $style_indexes[$i]['wrap_text'] = (bool)$style['wrap_text']; + } + + $font = $default_font; + if (isset($style['font-size'])) + { + $font['size'] = floatval($style['font-size']);//floatval to allow "10.5" etc + } + if (isset($style['font']) && is_string($style['font'])) + { + if ($style['font']=='Comic Sans MS') { $font['family']=4; } + if ($style['font']=='Times New Roman') { $font['family']=1; } + if ($style['font']=='Courier New') { $font['family']=3; } + $font['name'] = strval($style['font']); + } + if (isset($style['font-style']) && is_string($style['font-style'])) + { + if (strpos($style['font-style'], 'bold')!==false) { $font['bold'] = true; } + if (strpos($style['font-style'], 'italic')!==false) { $font['italic'] = true; } + if (strpos($style['font-style'], 'strike')!==false) { $font['strike'] = true; } + if (strpos($style['font-style'], 'underline')!==false) { $font['underline'] = true; } + } + if (isset($style['color']) && is_string($style['color']) && $style['color'][0]=='#' ) + { + $v = substr($style['color'],1,6); + $v = strlen($v)==3 ? $v[0].$v[0].$v[1].$v[1].$v[2].$v[2] : $v;// expand cf0 => ccff00 + $font['color'] = "FF".strtoupper($v); + } + if ($font!=$default_font) + { + $style_indexes[$i]['font_idx'] = self::add_to_list_get_index($fonts, json_encode($font) ); + } + } + return array('fills'=>$fills,'fonts'=>$fonts,'borders'=>$borders,'styles'=>$style_indexes ); + } + + protected function writeStylesXML() + { + $r = self::styleFontIndexes(); + $fills = $r['fills']; + $fonts = $r['fonts']; + $borders = $r['borders']; + $style_indexes = $r['styles']; + + $temporary_filename = $this->tempFilename(); + $file = new MEC_XLSXWriter_BuffererWriter($temporary_filename); + $file->write(''."\n"); + $file->write(''); + $file->write(''); + foreach($this->number_formats as $i=>$v) { + $file->write(''); + } + //$file->write( ''); + //$file->write( ''); + //$file->write( ''); + //$file->write( ''); + $file->write(''); + + $file->write(''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + + foreach($fonts as $font) { + if (!empty($font)) { //fonts have 4 empty placeholders in array to offset the 4 static xml entries above + $f = json_decode($font,true); + $file->write(''); + $file->write( ''); + $file->write( ''); + if (!empty($f['color'])) { $file->write(''); } + if (!empty($f['bold'])) { $file->write(''); } + if (!empty($f['italic'])) { $file->write(''); } + if (!empty($f['underline'])) { $file->write(''); } + if (!empty($f['strike'])) { $file->write(''); } + $file->write(''); + } + } + $file->write(''); + + $file->write(''); + $file->write( ''); + $file->write( ''); + foreach($fills as $fill) { + if (!empty($fill)) { //fills have 2 empty placeholders in array to offset the 2 static xml entries above + $file->write(''); + } + } + $file->write(''); + + $file->write(''); + $file->write( ''); + foreach($borders as $border) { + if (!empty($border)) { //fonts have an empty placeholder in the array to offset the static xml entry above + $pieces = json_decode($border,true); + $border_style = !empty($pieces['style']) ? $pieces['style'] : 'hair'; + $border_color = !empty($pieces['color']) ? '' : ''; + $file->write(''); + foreach (array('left', 'right', 'top', 'bottom') as $side) + { + $show_side = in_array($side,$pieces['side']) ? true : false; + $file->write($show_side ? "<$side style=\"$border_style\">$border_color" : "<$side/>"); + } + $file->write( ''); + $file->write(''); + } + } + $file->write(''); + + $file->write(''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write(''); + + $file->write(''); + //$file->write( ''); + //$file->write( ''); + //$file->write( ''); + //$file->write( ''); + foreach($style_indexes as $v) + { + $applyAlignment = isset($v['alignment']) ? 'true' : 'false'; + $wrapText = !empty($v['wrap_text']) ? 'true' : 'false'; + $horizAlignment = isset($v['halign']) ? $v['halign'] : 'general'; + $vertAlignment = isset($v['valign']) ? $v['valign'] : 'bottom'; + $applyBorder = isset($v['border_idx']) ? 'true' : 'false'; + $applyFont = 'true'; + $borderIdx = isset($v['border_idx']) ? intval($v['border_idx']) : 0; + $fillIdx = isset($v['fill_idx']) ? intval($v['fill_idx']) : 0; + $fontIdx = isset($v['font_idx']) ? intval($v['font_idx']) : 0; + //$file->write(''); + $file->write(''); + $file->write(' '); + $file->write(' '); + } + $file->write(''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write( ''); + $file->write(''); + $file->close(); + return $temporary_filename; + } + + protected function buildAppXML() + { + $app_xml=""; + $app_xml.=''."\n"; + $app_xml.=''; + $app_xml.='0'; + $app_xml.=''.self::xmlspecialchars($this->company).''; + $app_xml.=''; + return $app_xml; + } + + protected function buildCoreXML() + { + $core_xml=""; + $core_xml.=''."\n"; + $core_xml.=''; + $core_xml.=''.date("Y-m-d\TH:i:s.00\Z").'';//$date_time = '2014-10-25T15:54:37.00Z'; + $core_xml.=''.self::xmlspecialchars($this->title).''; + $core_xml.=''.self::xmlspecialchars($this->subject).''; + $core_xml.=''.self::xmlspecialchars($this->author).''; + if (!empty($this->keywords)) { + $core_xml.=''.self::xmlspecialchars(implode (", ", (array)$this->keywords)).''; + } + $core_xml.=''.self::xmlspecialchars($this->description).''; + $core_xml.='0'; + $core_xml.=''; + return $core_xml; + } + + protected function buildRelationshipsXML() + { + $rels_xml=""; + $rels_xml.=''."\n"; + $rels_xml.=''; + $rels_xml.=''; + $rels_xml.=''; + $rels_xml.=''; + $rels_xml.="\n"; + $rels_xml.=''; + return $rels_xml; + } + + protected function buildWorkbookXML() + { + $i=0; + $workbook_xml=""; + $workbook_xml.=''."\n"; + $workbook_xml.=''; + $workbook_xml.=''; + $workbook_xml.=''; + $workbook_xml.=''; + foreach($this->sheets as $sheet_name=>$sheet) { + $sheetname = self::sanitize_sheetname($sheet->sheetname); + $workbook_xml.=''; + $i++; + } + $workbook_xml.=''; + $workbook_xml.=''; + $i=0; + foreach($this->sheets as $sheet_name=>$sheet) { + if ($sheet->auto_filter) { + $sheetname = self::sanitize_sheetname($sheet->sheetname); + $workbook_xml.=''; + $i++; + } + } + $workbook_xml.=''; + $workbook_xml.=''; + return $workbook_xml; + } + + protected function buildWorkbookRelsXML() + { + $i=0; + $wkbkrels_xml=""; + $wkbkrels_xml.=''."\n"; + $wkbkrels_xml.=''; + $wkbkrels_xml.=''; + foreach($this->sheets as $sheet_name=>$sheet) { + $wkbkrels_xml.=''; + $i++; + } + $wkbkrels_xml.="\n"; + $wkbkrels_xml.=''; + return $wkbkrels_xml; + } + + protected function buildContentTypesXML() + { + $content_types_xml=""; + $content_types_xml.=''."\n"; + $content_types_xml.=''; + $content_types_xml.=''; + $content_types_xml.=''; + foreach($this->sheets as $sheet_name=>$sheet) { + $content_types_xml.=''; + } + $content_types_xml.=''; + $content_types_xml.=''; + $content_types_xml.=''; + $content_types_xml.=''; + $content_types_xml.="\n"; + $content_types_xml.=''; + return $content_types_xml; + } + + //------------------------------------------------------------------ + /* + * @param $row_number int, zero based + * @param $column_number int, zero based + * @param $absolute bool + * @return Cell label/coordinates, ex: A1, C3, AA42 (or if $absolute==true: $A$1, $C$3, $AA$42) + * */ + public static function xlsCell($row_number, $column_number, $absolute=false) + { + $n = $column_number; + for($r = ""; $n >= 0; $n = intval($n / 26) - 1) { + $r = chr($n%26 + 0x41) . $r; + } + if ($absolute) { + return '$' . $r . '$' . ($row_number+1); + } + return $r . ($row_number+1); + } + //------------------------------------------------------------------ + public static function log($string) + { + //file_put_contents("php://stderr", date("Y-m-d H:i:s:").rtrim(is_array($string) ? json_encode($string) : $string)."\n"); + error_log(date("Y-m-d H:i:s:").rtrim(is_array($string) ? json_encode($string) : $string)."\n"); + } + //------------------------------------------------------------------ + public static function sanitize_filename($filename) //http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx + { + $nonprinting = array_map('chr', range(0,31)); + $invalid_chars = array('<', '>', '?', '"', ':', '|', '\\', '/', '*', '&'); + $all_invalids = array_merge($nonprinting,$invalid_chars); + return str_replace($all_invalids, "", $filename); + } + //------------------------------------------------------------------ + public static function sanitize_sheetname($sheetname) + { + static $badchars = '\\/?*:[]'; + static $goodchars = ' '; + $sheetname = strtr($sheetname, $badchars, $goodchars); + $sheetname = function_exists('mb_substr') ? mb_substr($sheetname, 0, 31) : substr($sheetname, 0, 31); + $sheetname = trim(trim(trim($sheetname),"'"));//trim before and after trimming single quotes + return !empty($sheetname) ? $sheetname : 'Sheet'.((rand()%900)+100); + } + //------------------------------------------------------------------ + public static function xmlspecialchars($val) + { + //note, badchars does not include \t\n\r (\x09\x0a\x0d) + static $badchars = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f"; + static $goodchars = " "; + return strtr(htmlspecialchars((string)$val, ENT_QUOTES | ENT_XML1 | ENT_SUBSTITUTE), $badchars, $goodchars);//strtr appears to be faster than str_replace + } + //------------------------------------------------------------------ + public static function array_first_key(array $arr) + { + reset($arr); + $first_key = key($arr); + return $first_key; + } + //------------------------------------------------------------------ + private static function determineNumberFormatType($num_format) + { + $num_format = preg_replace("/\[(Black|Blue|Cyan|Green|Magenta|Red|White|Yellow)\]/i", "", $num_format); + if ($num_format=='GENERAL') return 'n_auto'; + if ($num_format=='@') return 'n_string'; + if ($num_format=='0') return 'n_numeric'; + if (preg_match('/[H]{1,2}:[M]{1,2}(?![^"]*+")/i', $num_format)) return 'n_datetime'; + if (preg_match('/[M]{1,2}:[S]{1,2}(?![^"]*+")/i', $num_format)) return 'n_datetime'; + if (preg_match('/[Y]{2,4}(?![^"]*+")/i', $num_format)) return 'n_date'; + if (preg_match('/[D]{1,2}(?![^"]*+")/i', $num_format)) return 'n_date'; + if (preg_match('/[M]{1,2}(?![^"]*+")/i', $num_format)) return 'n_date'; + if (preg_match('/$(?![^"]*+")/', $num_format)) return 'n_numeric'; + if (preg_match('/%(?![^"]*+")/', $num_format)) return 'n_numeric'; + if (preg_match('/0(?![^"]*+")/', $num_format)) return 'n_numeric'; + return 'n_auto'; + } + //------------------------------------------------------------------ + private static function numberFormatStandardized($num_format) + { + if ($num_format=='money') { $num_format='dollar'; } + if ($num_format=='number') { $num_format='integer'; } + + if ($num_format=='string') $num_format='@'; + else if ($num_format=='integer') $num_format='0'; + else if ($num_format=='date') $num_format='YYYY-MM-DD'; + else if ($num_format=='datetime') $num_format='YYYY-MM-DD HH:MM:SS'; + else if ($num_format=='time') $num_format='HH:MM:SS'; + else if ($num_format=='price') $num_format='#,##0.00'; + else if ($num_format=='dollar') $num_format='[$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00'; + else if ($num_format=='euro') $num_format='#,##0.00 [$€-407];[RED]-#,##0.00 [$€-407]'; + $ignore_until=''; + $escaped = ''; + for($i=0,$ix=strlen($num_format); $i<$ix; $i++) + { + $c = $num_format[$i]; + if ($ignore_until=='' && $c=='[') + $ignore_until=']'; + else if ($ignore_until=='' && $c=='"') + $ignore_until='"'; + else if ($ignore_until==$c) + $ignore_until=''; + if ($ignore_until=='' && ($c==' ' || $c=='-' || $c=='(' || $c==')') && ($i==0 || $num_format[$i-1]!='_')) + $escaped.= "\\".$c; + else + $escaped.= $c; + } + return $escaped; + } + //------------------------------------------------------------------ + public static function add_to_list_get_index(&$haystack, $needle) + { + $existing_idx = array_search($needle, $haystack, $strict=true); + if ($existing_idx===false) + { + $existing_idx = count($haystack); + $haystack[] = $needle; + } + return $existing_idx; + } + //------------------------------------------------------------------ + public static function convert_date_time($date_input) //thanks to Excel::Writer::XLSX::Worksheet.pm (perl) + { + $days = 0; # Number of days since epoch + $seconds = 0; # Time expressed as fraction of 24h hours in seconds + $year=$month=$day=0; + $hour=$min =$sec=0; + + $date_time = $date_input; + if (preg_match("/(\d{4})\-(\d{2})\-(\d{2})/", $date_time, $matches)) + { + list($junk,$year,$month,$day) = $matches; + } + if (preg_match("/(\d+):(\d{2}):(\d{2})/", $date_time, $matches)) + { + list($junk,$hour,$min,$sec) = $matches; + $seconds = ( $hour * 60 * 60 + $min * 60 + $sec ) / ( 24 * 60 * 60 ); + } + + //using 1900 as epoch, not 1904, ignoring 1904 special case + + # Special cases for Excel. + if ("$year-$month-$day"=='1899-12-31') return $seconds ; # Excel 1900 epoch + if ("$year-$month-$day"=='1900-01-00') return $seconds ; # Excel 1900 epoch + if ("$year-$month-$day"=='1900-02-29') return 60 + $seconds ; # Excel false leapday + + # We calculate the date by calculating the number of days since the epoch + # and adjust for the number of leap days. We calculate the number of leap + # days by normalising the year in relation to the epoch. Thus the year 2000 + # becomes 100 for 4 and 100 year leapdays and 400 for 400 year leapdays. + $epoch = 1900; + $offset = 0; + $norm = 300; + $range = $year - $epoch; + + # Set month days and check for leap year. + $leap = (($year % 400 == 0) || (($year % 4 == 0) && ($year % 100)) ) ? 1 : 0; + $mdays = array( 31, ($leap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); + + # Some boundary checks + if ($year!=0 || $month !=0 || $day!=0) + { + if($year < $epoch || $year > 9999) return 0; + if($month < 1 || $month > 12) return 0; + if($day < 1 || $day > $mdays[ $month - 1 ]) return 0; + } + + # Accumulate the number of days since the epoch. + $days = $day; # Add days for current month + $days += array_sum( array_slice($mdays, 0, $month-1 ) ); # Add days for past months + $days += $range * 365; # Add days for past years + $days += intval( ( $range ) / 4 ); # Add leapdays + $days -= intval( ( $range + $offset ) / 100 ); # Subtract 100 year leapdays + $days += intval( ( $range + $offset + $norm ) / 400 ); # Add 400 year leapdays + $days -= $leap; # Already counted above + + # Adjust for Excel erroneously treating 1900 as a leap year. + if ($days > 59) { $days++;} + + return $days + $seconds; + } + //------------------------------------------------------------------ +} + +class MEC_XLSXWriter_BuffererWriter +{ + protected $fd=null; + protected $buffer=''; + protected $check_utf8=false; + + public function __construct($filename, $fd_fopen_flags='w', $check_utf8=false) + { + $this->check_utf8 = $check_utf8; + $this->fd = fopen($filename, $fd_fopen_flags); + if ($this->fd===false) { + MEC_XLSXWriter::log("Unable to open $filename for writing."); + } + } + + public function write($string) + { + $this->buffer.=$string; + if (isset($this->buffer[8191])) { + $this->purge(); + } + } + + protected function purge() + { + if ($this->fd) { + if ($this->check_utf8 && !self::isValidUTF8($this->buffer)) { + MEC_XLSXWriter::log("Error, invalid UTF8 encoding detected."); + $this->check_utf8 = false; + } + fwrite($this->fd, $this->buffer); + $this->buffer=''; + } + } + + public function close() + { + $this->purge(); + if ($this->fd) { + fclose($this->fd); + $this->fd=null; + } + } + + public function __destruct() + { + $this->close(); + } + + public function ftell() + { + if ($this->fd) { + $this->purge(); + return ftell($this->fd); + } + return -1; + } + + public function fseek($pos) + { + if ($this->fd) { + $this->purge(); + return fseek($this->fd, $pos); + } + return -1; + } + + protected static function isValidUTF8($string) + { + if (function_exists('mb_check_encoding')) + { + return mb_check_encoding($string, 'UTF-8') ? true : false; + } + return preg_match("//u", $string) ? true : false; + } +} + + + +// vim: set filetype=php expandtab tabstop=4 shiftwidth=4 autoindent smartindent: diff --git a/app/api/addons-api/addons-api.json b/app/api/addons-api/addons-api.json new file mode 100755 index 0000000..c8931e3 --- /dev/null +++ b/app/api/addons-api/addons-api.json @@ -0,0 +1,362 @@ +{ + "1": { + "slug": "mec-woocommerce", + "name": "Woocommerce Integration", + "version": "1.3.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430549&edd_options[price_id]=1", + "video": "https://youtu.be/y0PrnUvNXN0", + "desc": "You can use WooCommerce cart to purchase tickets, it means that each ticket is defined as a product. You can purchase ticket and WooCommerce products at the same time.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/woocommerce-integration/", + "img": "mec_addon_icon_27.svg" + }, + "2": { + "slug": "mec-shortcode-builder", + "name": "Elementor Shortcode Builder", + "version": "1.5.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430567&edd_options[price_id]=1", + "video": "https://youtu.be/HyvApwsB70w", + "desc": "It enables you to create shortcodes in Elementor Live Editor. Adding this widget to your pages allows previewing the events and placing the shortcodes in pages with ease.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/elementor-shortcode-builder/", + "img": "mec_addon_icon_40.svg" + }, + "3": { + "slug": "mec-form-builder", + "name": "Elementor Form Builder", + "version": "1.1.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430581&edd_options[price_id]=1", + "video": "https://youtu.be/ejHnD20XuYs", + "desc": "Use this Add-on to build your form in Elementor Editor. It allows you to use many different type of fields and rearrange them by drag and drop and modify their styles.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/elementor-form-builder/", + "img": "mec_addon_icon_37.svg" + }, + "4": { + "slug": "mec-single-builder", + "name": "Elementor Single Builder", + "version": "1.5.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430593&edd_options[price_id]=1", + "video": "https://youtu.be/UTbFwEXTZAA", + "desc": "It provides you with the ability to edit single event page using Elementor. Manage the position of all elements in the Single page and in desktops, mobiles and tablets as well.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/elementor-single-builder/", + "img": "mec_addon_icon_39.svg" + }, + "5": { + "slug": "mec-event-api", + "name": "Event API", + "version": "1.0.8", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430602&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=dX5gUB7E_nk", + "desc": "It allows you to display your website events (shortcodes/single event) on other websites without installing MEC. You can even use JSON output features to make your Apps compatible with MEC.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/event-api/", + "img": "event-api.svg" + }, + "6": { + "slug": "mec-multisite-event-sync", + "name": "Multisite Event Sync", + "version": "1.0.3", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430589&edd_options[price_id]=1", + "video": "https://youtu.be/BTAa7_slVs8", + "desc": "You can now sync events in your subsites with the main website and any changes to the main website is inherited by the subsites. You can select the subsites to be synced in admin panel.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/multisite-event-sync/", + "img": "multi-site-3.svg" + }, + "7": { + "slug": "mec-user-dashboard", + "name": "User Dashboard", + "version": "1.1.6", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430571&edd_options[price_id]=1", + "video": "https://youtu.be/q1fEeGLlfEk", + "desc": "Using this addon, you can create a specific page for each user. It contains information about purchased tickets, registered events and many more. Users can now log in to purchase tickets.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/user-dashboard/", + "img": "user-dashboard.svg" + }, + "8": { + "slug": "mec-shortcode-designer", + "name": "Elementor Shortcode Designer", + "version": "1.1.5", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430537&edd_options[price_id]=1", + "video": "https://youtu.be/X4i-0zxxuFc", + "desc": "It allows you to create unlimited custom shortcodes. You can include any elements you wish with the intended style and positioning by simply drag and dropping them in Elementor.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/elementor-shortcode-designer/", + "img": "mec-shortcode-designer-addon-icon.svg" + }, + "9": { + "slug": "mec-invoice", + "name": "Ticket and Invoice", + "version": "1.2.2", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430615&edd_options[price_id]=1", + "video": "https://youtu.be/JH0jSFzM57s", + "desc": "This addon enables you to manage invoices. it allows custom styling with Elementor Page Builder, check-in using QR code, generating HTML invoices, and much more.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/ticket-invoice/", + "img": "invoice-5.svg" + }, + "10": { + "slug": "mec-advanced-map", + "name": "Advanced Map", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430606&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=-G75aV542FI", + "desc": "Now you can use OpenStreetMap instead of Google Maps and enjoy new features such as Street, Region, etc. for detailed and precise filtering. Display filters and events next to the map in a new view.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-map/", + "img": "advanced-map-2.svg" + }, + "11": { + "slug": "mec-advanced-reports", + "name": "Advanced Reports", + "version": "1.0.8", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430504&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=TGC63V5aznM", + "desc": "Enjoy an advanced report page in the backend, with more features. The attendee table and graphs can be filtered based on date. You can also view a list of attendees for each event based on date.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-reports/", + "img": "advanced-report.svg" + }, + "12": { + "slug": "mec-fluent-layouts", + "name": "Fluent-view Layouts", + "version": "1.2.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430575&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=kCBw5UF1tlk", + "desc": "These skins are designed based the most recent design trends. The add-on can magically turn the view of your calendar.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/fluent-view-layouts/", + "img": "fluent-view.svg" + }, + "13": { + "slug": "mec-zapier", + "name": "Zapier Integration", + "version": "1.0.2", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430557&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=vDwox71ajig", + "desc": "This addon enables you to create your own Zap with Mailchimp, active campaign, meetup, Eventbrite and many other apps when an event is added, edited, canceled, or booked.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/zapier-integration/", + "img": "zapier-integration01.svg" + }, + "14": { + "slug": "mec-virtual-events", + "name": "Virtual Events", + "version": "1.1.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430527&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=7ESpENaGt3M", + "desc": "This addon allows you to turn your events into virtual ones and provide an embeded link or directed link and password of your online event to your attendees.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/virtual-events/", + "img": "virtual-events.svg" + }, + "15": { + "slug": "mec-waiting-list", + "name": "Waiting List", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430541&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=IoUQWTBK6gQ", + "desc": "This addon enables you to create a waiting form after selling out the tickets, so people can reserve one in case one of the attendees cancel their reservation.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/waiting-list/", + "img": "waiting-list-icon.svg" + }, + "16": { + "slug": "mec-divi-single-builder", + "name": "Divi Single Builder", + "version": "1.0.2", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430545&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=tVY-puNJs6s", + "desc": "It provides you with the ability to edit single event page using Divi. Manage the position of all elements in the Single page and in desktops, mobiles and tablets as well.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/divi-single-builder/", + "img": "divi-single-builder-addon.svg" + }, + "17": { + "slug": "mec-zoom-integration", + "name": "Zoom Integration", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430585&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=oFaVyvTLSkQ", + "desc": "With this add-on you can show your users the information regarding your meetings and webinars. Provide the users with an embedded code of your event link plus username and password.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/zoom-integration/", + "img": "zoom-integration-addon.svg" + }, + "18": { + "slug": "mec-advanced-organizer", + "name": "Advanced Organizer", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430506&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=fsxtjDtrfd4", + "desc": "You can now create an exclusive page for every organizer and have a list of organizers wherever you like using a shortcode. You can also display organizers in a slider format.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-organizer/", + "img": "advanced-organizer01.svg" + }, + "19": { + "slug": "mec-advanced-speaker", + "name": "Advanced Speaker", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430523&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=1BpdikYZmm4", + "desc": "You can now create an exclusive page for every speaker and have a list of speakers wherever you like using a shortcode. You can also display speakers in a slider format.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-speaker/", + "img": "advanced-speaker01.svg" + }, + "20": { + "slug": "mec-advanced-location", + "name": "Advanced Location", + "version": "1.0.1", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430508&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=4R1UYKTAkKc", + "desc": "You can now create an exclusive page for every location and have a list of locations wherever you like using a shortcode. You can also display locations in a slider format.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-location/", + "img": "advanced-location01.svg" + }, + "21": { + "slug": "mec-advanced-importer", + "name": "Advanced Importer", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430561&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=VxvVDk_n1_A", + "desc": "With this addon, you can connect to Facebook, Google, Meetup, and Eventbrite and etc… unlimitedly. This makes the import process so easy.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/advanced-importer/", + "img": "advanced-importer-addon-icon.svg" + }, + "22": { + "slug": "mec-rsvp", + "name": "RSVP Events", + "version": "1.1.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430611&edd_options[price_id]=1", + "video": "https://youtu.be/naFOTICC8os", + "desc": "Would you like your attendees to be able to RSVP to event so you know who goes to the event? RSVP event is here to do that for you like a charm.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/rsvp-events/", + "img": "rsvp-event-addon.svg" + }, + "23": { + "slug": "mec-buddyboss", + "name": "BuddyBoss Integration", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34430553&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=4Aun31CnETo", + "desc": "You can assign events to your groups and each group has its own events. Different individuals can submit events and display them in the groups.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/buddyboss-integration/", + "img": "buddyboss-integration-addon.svg" + }, + "24": { + "slug": "mec-social-poster", + "name": "Social Auto Poster", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34435919&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=cpxThz7GgAY", + "desc": "Using this addon, you can share your events on your socials easily and automatically. Everything will be easy for you with this addon. ", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/social-auto-poster/", + "img": "social-poster-addon.svg" + }, + "25": { + "slug": "mec-webex-integration", + "name": "Webex Integration", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34433684&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=Rw5Q-4Zvvew", + "desc": "You can show the meetings' and webinars' information to your users, provide them with an embedded code that links to the event, plus containing username and password.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/webex-integration/", + "img": "webex-integration-addon.svg" + }, + "26": { + "slug": "mec-fes-builder", + "name": "Elementor FES Builder", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34437588&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=yv56td1c9AM", + "desc": "This addon enables you to build your frontend event submission form with Elementor Editor. It also gives you the possibility to use various types of fields and drag and drop them anywhere.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/elementor-frontend-event-submission-builder", + "img": "elementor-fes-builder.svg" + }, + "27": { + "slug": "mec-seat", + "name": "Seat", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34436692&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=hSa9d30AvLA", + "desc": "With this addon you can define a layout for your venue and then set various prices for different rows and have users pick their own spot and purchase the ticket.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/seat/", + "img": "seat-addon-icon.svg" + }, + "28": { + "slug": "mec-gutenberg-single-builder", + "name": "Gutenberg Single Builder", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34437586&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=_yBVzi09whU", + "desc": "This addon gives you the option to edit the Single Event Page using Gutenberg. You can manage the position of all elements of the Event Page whether on desktop, mobile or tablet.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/gutenberg-single-builder/", + "img": "mec-gutenberg-single-builder.svg" + }, + "29": { + "slug": "mec-square-payment", + "name": "Square Payment", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34437587&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=JQsKSo8FGDw", + "desc": "This addon enables your users to pay for their tickets using Square Payment Gateway. It will be added as an option to Booking Payments and you can enable it whenever you need it.", + "comingsoon": "false", + "pro": "true", + "page": "https://webnus.net/modern-events-calendar/addons/square-payment/", + "img": "square-integration-addon.svg" + }, + "30": { + "slug": "", + "name": "Liquid-view Layouts", + "version": "1.0.0", + "purchase": "https://webnus.net/checkout?edd_action=add_to_cart&download_id=34437589&edd_options[price_id]=1", + "video": "https://www.youtube.com/watch?v=PU-N_GT0OqM", + "desc": "Brand new skins coming from the future! The skins have been designed according to the latest trends. With this addon you can magically transform the look of your calendar with its 20+ skins for all shortcodes.", + "comingsoon": "false", + "pro": "false", + "page": "https://webnus.net/modern-events-calendar/addons/liquid-view-layout", + "img": "liquid-view-layouts.svg" + } +} diff --git a/app/api/addons-api/advanced-importer-addon-icon.svg b/app/api/addons-api/advanced-importer-addon-icon.svg new file mode 100755 index 0000000..a0f2200 --- /dev/null +++ b/app/api/addons-api/advanced-importer-addon-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/advanced-location01.svg b/app/api/addons-api/advanced-location01.svg new file mode 100755 index 0000000..ba3fc25 --- /dev/null +++ b/app/api/addons-api/advanced-location01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/advanced-map-2.svg b/app/api/addons-api/advanced-map-2.svg new file mode 100755 index 0000000..2079723 --- /dev/null +++ b/app/api/addons-api/advanced-map-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/advanced-organizer01.svg b/app/api/addons-api/advanced-organizer01.svg new file mode 100755 index 0000000..60b88e7 --- /dev/null +++ b/app/api/addons-api/advanced-organizer01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/advanced-report.svg b/app/api/addons-api/advanced-report.svg new file mode 100755 index 0000000..3f98d28 --- /dev/null +++ b/app/api/addons-api/advanced-report.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/advanced-speaker01.svg b/app/api/addons-api/advanced-speaker01.svg new file mode 100755 index 0000000..7798b8a --- /dev/null +++ b/app/api/addons-api/advanced-speaker01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/blackfriday.json b/app/api/addons-api/blackfriday.json new file mode 100755 index 0000000..b8eeac4 --- /dev/null +++ b/app/api/addons-api/blackfriday.json @@ -0,0 +1,3 @@ +[{ + "html": "
Announcement


Webnus Black Friday 2021 Sales!

Huge Discount for New Packages & Bundles

We are introducing a lot of new packages and bundles with unbelievable discounts. Our Black Friday is already live and you only have a few more days to use the opportunity. These bundles are both for Developers, who need licenses in bulk from 40 licenses in one bundle to 100 licenses for all our products, and users who need a few licenses. For our users, we have prepared packages from 2 licenses to 30 licenses. The discount is for special packages up to 98% off.

Find out more
","display": "1" +}] \ No newline at end of file diff --git a/app/api/addons-api/buddyboss-integration-addon.svg b/app/api/addons-api/buddyboss-integration-addon.svg new file mode 100755 index 0000000..42ea96f --- /dev/null +++ b/app/api/addons-api/buddyboss-integration-addon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/divi-single-builder-addon.svg b/app/api/addons-api/divi-single-builder-addon.svg new file mode 100755 index 0000000..5afcd96 --- /dev/null +++ b/app/api/addons-api/divi-single-builder-addon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/elementor-fes-builder.svg b/app/api/addons-api/elementor-fes-builder.svg new file mode 100755 index 0000000..713463c --- /dev/null +++ b/app/api/addons-api/elementor-fes-builder.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/event-api.svg b/app/api/addons-api/event-api.svg new file mode 100755 index 0000000..5454f2a --- /dev/null +++ b/app/api/addons-api/event-api.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/fluent-view.svg b/app/api/addons-api/fluent-view.svg new file mode 100755 index 0000000..79ee16b --- /dev/null +++ b/app/api/addons-api/fluent-view.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/gutenberg-single -builder-addon.svg b/app/api/addons-api/gutenberg-single -builder-addon.svg new file mode 100755 index 0000000..ab057c9 --- /dev/null +++ b/app/api/addons-api/gutenberg-single -builder-addon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/index.html b/app/api/addons-api/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/api/addons-api/invoice-5.svg b/app/api/addons-api/invoice-5.svg new file mode 100755 index 0000000..4bb6103 --- /dev/null +++ b/app/api/addons-api/invoice-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/liquid-view-layouts.svg b/app/api/addons-api/liquid-view-layouts.svg new file mode 100755 index 0000000..3d89fdd --- /dev/null +++ b/app/api/addons-api/liquid-view-layouts.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/mec-extra-content-2.json b/app/api/addons-api/mec-extra-content-2.json new file mode 100755 index 0000000..2d4cec3 --- /dev/null +++ b/app/api/addons-api/mec-extra-content-2.json @@ -0,0 +1,5 @@ +[ + { + "display": "1" + } +] diff --git a/app/api/addons-api/mec-extra-content.json b/app/api/addons-api/mec-extra-content.json new file mode 100755 index 0000000..2d4cec3 --- /dev/null +++ b/app/api/addons-api/mec-extra-content.json @@ -0,0 +1,5 @@ +[ + { + "display": "1" + } +] diff --git a/app/api/addons-api/mec-extra-content/5addons-announcement.png b/app/api/addons-api/mec-extra-content/5addons-announcement.png new file mode 100755 index 0000000000000000000000000000000000000000..ee671d70ff855562b4957cef91112037fe59ad88 GIT binary patch literal 5492 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 T6P|y5*j12Kl_{4p`T9Qq0(n7o literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/advanced-importer-addon-banner.png b/app/api/addons-api/mec-extra-content/advanced-importer-addon-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..88867bb7e60becc22484e2970db1e98cf48093c1 GIT binary patch literal 19532 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

6I! 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 T74FAbE|Dvs6#riF$K<~NA;!8x literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/advanced-reports-addon-teaser.png b/app/api/addons-api/mec-extra-content/advanced-reports-addon-teaser.png new file mode 100755 index 0000000000000000000000000000000000000000..baaeb2a889175ff677cca2bf26afd532a6f74afc GIT binary patch literal 21016 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[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 Z1^n-b=GH;Iv(JCDf$n9UvWw2-{{dRh^+o^y literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/bf-2021-pop-bg3.png b/app/api/addons-api/mec-extra-content/bf-2021-pop-bg3.png new file mode 100755 index 0000000000000000000000000000000000000000..9779a0396edb32a72aa213a8a7a8d7f78cdc6f53 GIT binary patch literal 43954 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 literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/black-f-banner-1.png b/app/api/addons-api/mec-extra-content/black-f-banner-1.png new file mode 100755 index 0000000000000000000000000000000000000000..9b6f93b85073897b30b58f8e2cc7b6ac2a407ee3 GIT binary patch literal 306664 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 z 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%0DDoch8Q;p`w5gG)g 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 literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/black-friday-2021-ntf1-min.jpg b/app/api/addons-api/mec-extra-content/black-friday-2021-ntf1-min.jpg new file mode 100755 index 0000000000000000000000000000000000000000..65c5139ea3d460c07940929ce2c1b6e1b28fa235 GIT binary patch literal 16583 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 X(~=A@^IeB|h~O&$q#%p?zt;Z`3{h12 literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/black-friday-2021-ntf2-min.jpg b/app/api/addons-api/mec-extra-content/black-friday-2021-ntf2-min.jpg new file mode 100755 index 0000000000000000000000000000000000000000..edbf2c5a417a77674cb4608a6e7e6beaa53af325 GIT binary patch literal 20496 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 literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/buddyboss-addon-banner.png b/app/api/addons-api/mec-extra-content/buddyboss-addon-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..56b9be8b6a9d6878f648d1f5ca52d4b123d83799 GIT binary patch literal 35361 zcmZ^IRa6uX^Y$(*u=LUmOCw#NU07y(=C z>woh2@A>fQrRDq|U}TSIEOqPtaqscp&F$U4fBzmH9+$6g*KhBiUtSk3uSswS&(1Gq zFD`L0a0s#RuC8y`shBA7NpBvXIH_4EAw(BfH*~~QER>8)y$0ryv6( z>5|VIQgU7zI`S?1?yl~?2ZzKn(b#BcqzeHg_@pFr;Q}n2ybN#HsG!$Z7n~H7B!5B{ zmsSWc&~x&>y*}U0&diWuV{NXla?o*DthSDik8f{n332n!-rdgqS;)-#`t@jDLO}TT z{O{u0&hh@%+-TRv!8s=jSIf8j54GVk=t^RuxCiTj2p^S?EYOfMd9&1V>hOf77Dvw=6ZcM@?ZC~`2p+^t(#Sml{Z z@(@APbWLEC_)~oiV{0cKFb)O?rnaUgF*lEZq`WYc=H=QpITWyUmZ0T5kwlPrte)ROt(7xTAqq=MA%Lk#2U`fdMe%0A( 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 z00000000000000000012dvG8C0000W$lrQ`4JrTt0000000000003YGVSR~H3%zt1 P00000NkvXXu0mjfVAhO* literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/c7x7-ans1.png b/app/api/addons-api/mec-extra-content/c7x7-ans1.png new file mode 100755 index 0000000000000000000000000000000000000000..57e61394ee804ef56a7df0bef0a75623a0d67684 GIT binary patch literal 9762 zcmV+-Cf(VIP)00090P)t-s`uFlE zU}@^n!@1kr|H}et)MTK<#$Cr+WY1vxuve|Rxm(0q(bm-N7E%BI{`HS~cafE1&0T^k ze`nHSU&>qcf*$<*`R3^5@9*qDZgt$<+xz+T`n#}GdVsmb#1coFwAk1B|NsB}_LZln zW`>ITv|#Da!1}hT=*ztNhHj?LH<`l4`Sk9@&dhfrdH>b{0;f-o+4%S9!dm6WxA&D6^YrfW=G_}sV5`;E`@_2W)yBwIpNQIn{o>M=-I0{N zzyU!|^OS)5sz&>xIRZCWWi_^h4`OIN_uGMM21 zrpe0wePfKezQo_&$jQX*+RpCQ$kSk^izaCi<92)*4WFz1DjW}(l_q)=F{!Xh}{3N(9-wK zy#X?m{{m8Q(rmEi>dx5eIJCD?vbKe-uvUSI^3EFmzXr$Zz&xF)oji{Da|kn&p~6d; z|KR|;=d~(AmTWSF{j(0pytl64un#w@_o9*8)6OWYs@b-w`j~>o)_nZ}Ir^dys_^!X z$lR^O#%z?FNiT|6z*^&_mGVA2)L|^2*yvlk(y!m6u1J*Xn}_+rgYPFx&D;9S@9lUq zf_4#bDZjtVNWA2Jsr$We=aywy!CK&ZQQgl1%GhiAXx2|NK(5*X$}B+pSra# zsalq()ZCYCU690=jNG_^vv+lSY-gZfPJhHcYr#HuAO&51vb;cTrW0+irC9aaOH#`8 zO2Wh6cZO&TZ{O*%RlHj6LvbmzU{sCJUCog-!*(i$P0P9{^Z)=N;7LS5RCwClm_LZq zP#nio0v$wNwzjdUq^J0J^tx0Zf@m*+qh`9nvrlq(ih&vSjFX zbS#vcJ9luY2!|)!=NyGvyc!X2%1L1t{sj9 zZ4Ke%m~T{?S=VX#`0`~Y z^Vq37(~^HYwj2+VE_uFefi838EnU~2=Yi+ F=hlM;Z}`Hc`}Dd%d2q%vn>QmAY) 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 GMf(@t0s%At literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/elementor-fes-builder.svg b/app/api/addons-api/mec-extra-content/elementor-fes-builder.svg new file mode 100755 index 0000000..1625dea --- /dev/null +++ b/app/api/addons-api/mec-extra-content/elementor-fes-builder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/index.html b/app/api/addons-api/mec-extra-content/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/api/addons-api/mec-extra-content/invoice-addon-share-min.png b/app/api/addons-api/mec-extra-content/invoice-addon-share-min.png new file mode 100755 index 0000000000000000000000000000000000000000..3de23e2e8616a2551fa33183584d8021c443f2db GIT binary patch literal 39843 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 d@c$EGgJ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/mec-extra-content/lite-new-update-announcement.png b/app/api/addons-api/mec-extra-content/lite-new-update-announcement.png new file mode 100755 index 0000000000000000000000000000000000000000..0bad882154663ef01113ab721e8e34b25e431cf0 GIT binary patch literal 10296 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�AOJ4y=w=RomaA>&_N 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 RrfR23hx~tBbAkUX|1XiB6951J literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/mec-covid 19.png b/app/api/addons-api/mec-extra-content/mec-covid 19.png new file mode 100755 index 0000000000000000000000000000000000000000..b718f3feb1932f8e9c58dd6557e8fadf4fbba066 GIT binary patch literal 136012 zcmYIuWmH^Uuq+bX-3E7ecXtg02yP(+x8NGw9fG?A4GzKGhu{tqWN>$V!*}mpkMn~C zEY9@qu3cR%ks509XvoCKP*6~4iV8AXP*AWGP*5-ii13i#0REkCK)!u&l~UA3gnaoT zT1G%YQ9vomNNRf;A9o^U>kOuf`)B4jOcQ?R*N}wcW}?cJ3EEe|?iJ9NNcuV#D3nNZ zs%#h>NsPCh6k*Hd-2amX<_p~wd9S5^GU8V*cwAm;n!pu8`2;zfP=|%n*MO-L5B8fw zopsk=4(q#}x_4I>KWfi9b;{IO@9Z{Ri8pM|jz0u=p?m)K%;6yrLs6Wb1E2hjRKv*a z8~|St0_{oL+|Pt>0p$khJf3jH4&V)pHP@d1ee!Dr>xy7ab&XtmFg9E%$k9FFXvn*s zj71SdAWxOR)(SUe3&CsJ8(O5hyNQGPoxvAuUVrA&$MnNA*i|9u6+eK&`cyZ$r$68v zS;4>KPSodrZF#q7XCNp}Es(F)cW1zF)4tQShneE03+DO${q5OK5@5xx&yP6Wn@|)~ zk4z$XB~L;aa?+`5z?eL2xgj6pY`bJB-ug-$({No0WM2B*j7LzQuEe2r&5OeO3l39Y zBU4GF2tC&QbJUW_zYhVHHjwI8nJI`|*FC_3(}U2pf%mCfg6|JzKXi>#^$kl(h(|y- z^U1i>%64z}J%q;0Im9F;S~r*m)r2U$oxA$^TxqsH$5aZqKQ13Rl`gn|>=LGS2@fOa`=oRDz3}grj zyL7Y@A9fizE(}8q=R;+8{qk^XQq$-M-TZg)4xx_*R~xuw#atSNa^Zk9-eB7~NZXNl}-|Hr;z6h0TR+g7{=t zSeT z0;rI7Gwj_)>~}9A-97)wg>|2R<~pwU>du3VdqvJd5=8bUY~uexNovA(7?PC;0Wd$h`R2V zRkKJ=(*(qYbC<`DzrE0LV_@|Wb>K+q>4#l=kPuWvs7s$%XcA`Dvr%b=OWc^w`mm z#W+IZ(*t0jDlP6gW}>#&rSCy!eE$9U>z$i7`W!I?JzBQhhr`=~rX$d^PO*KWj)4c$ z`ZcN|c%^BsHP%Jvxy1=Up>Y9s@y3jgX*V&auA+>kSN2!FKdnoqIH>i*{2oyC!pITc zTEP-g?@*4KxKZ_afAdWFA5B}4%WX)U;L%$LQndR$6XmY`^9cq_-ml2RJ7YZngUWhb zDe%w}yq?iS5XQ{E5$XTZ$%W3L{}J_p=n zktNMQw#Jd-u3*6e_nm*{v-0O&v47p!-Uk0#qNQC7=q3K>N*LD7w15N?G9W-zoRHdt z!0*O2Fd7tr(v93^N?c_8vc^pgoxb@QG*Pb>i*l!4i}LJxv{d&fRd$dx&sA!QEp{Eh!=GYpL_WG11Ix3(3|YD?)6GjPvQyPkJwa z%KWGC_X|k)?)i5*0SQXD1mZfVieeBAT{DZ4#0Zf%XP_~a=K6G>FP9;wiH==WGRM%f zs;GyS6<;HqddHz-hr6rH0BXOB(pGU(VQiLd(Ta1vLdaJ|5JJ8x%O}EDfRQlR;`+im zk?@qCLm}4Og>F8eOJ!?Dk3`amw71f$-Mq~o(403=Kc~d+9^7<2+N)P<=u;7BRsBzn zp_YEKG5h{UitrF4BcL0ei*jMToO-ks#-1Mtfy(<23R>3E)(^bR16k(CJK&cymx(a2 zJeU7SF6%cx>|Bl#{bMBFQnAYF0jbQz& zVd%-EVzJql8~b_3BXM}3X)SB2W%5dBJRtEQJ%x`%jJ9{H(H+L^9#>DXY_j`Ia4QCa z4d)@H%>-~D5yGzuHTnI~{6q8%PazeHmD#8^{@Y@jK}(G^hoKiXOc*!)Exa_h2mj?~ zq|d)x#85oDQGev;t9Rvn`(9mqm3Q$Z1Vn6l8@L%p z{zBgwumTB|#DB@t9VDnBfxcvpErWr$c*$lEj4~33oMd<&Uf;8F8DC$e3mYIB>mwjB zNq^VXv9WWL`T4bSU;?VFGAKNo56J#$BK6XYfdfdW-CaA{dc*7+k2 zJ|Tk!7IW*XKFuvMDCNY$m=ceP5FmT+Jhg9vHrwuY!40pZ-Yjk}nH%g^fr!4v_mw`i zm;wBQF&rW`|61L0v9YD8@>csE@b(x=YhYGy$yZ--j`72xnJsE_Fn@= z-qXNn_HLK-drS;Xaew{nPNAI*y&Qt118#EBlfmu4shKmWks1V$Akv#JTEf2*1ocEP z#O7z>bAZzTw3a7d({qVl88xAcoVx(mu%0ERg~^ckVg?ey=QOEbu_7N!ZlhoS6l%4? znOFjmj#?-tne(jIJc7LxoZqsh%dTQHa@A77A$xB7wGeXMhYV$PYm-=&guZ|Md1)P?hR2$G}{mlC0zi!PXtW|ph>I-%YOum+Ew!)Nrg?#YStBa zyFkvfD}fyo(xKiTr0u$tSZ)_WhPm#gjj}!Ie(^9Rioo)IZj{mo-NR&9yfNufE|!3f z#$0Ho_)f_QkNwfDA?->La&6R>2IL)d^VV_m1)^oYnO{FBGc}r?m5D4UeV8oOr518y zI-ZJ#^3uv=a|2QlhIDf9W^c$15C(7j8>^;kcJrL_U4Z<^v-O>@rY)i1kZsPtjO_DO z9rIvXpQ=|M6d(u+!q>#Z17XaIyv~6G6O5Tc_#-JC5|yjZ zi#2PCz}#KzS6RdXa8T`qL64(NN;&j=6*j7O0f$etrLcg_DfB?25^EI^*$wU_@Wexx zZ4Ly06*ok;+sYHraa_H>Q-1d+n%7$~ijt=|(V|hb2mu()kOnRU&@LBLGU5VKXvG}W zgU-6O1vgwswXQ0!8e4lxabZ51MV4*Uolwoz6uVUqW9*Kgddx%k#^6irH1Di-1ykeG9p_y0k>BZ@DVs;#= z%=1M&GatS{k`si7bNTjbAd7*#bgV{AUsaf8G8zSv?cSx17clUw8xug0 ziWh1vafij+7buX6J{#|ZHH7z9!Z!zJ_?kOPCC!ZC!(MUhZ^TeZ(lF^RlcR1c|BuhV zGs(aC^UBIK^_7^Brbcz@%FZw@CZ~Romda5z5H6>`zcVtG`StbjKITH*8=deSSYfDF z@dSCW0FZE^?D(836(T*rtSAZ zFriq_+7hL-hpQFakDSn~itdCY;e`AKP|ox&yML9A;~Zte@{L8=5*s!TJHLg$XmZ}O z9gO{Aow`>Qd;N9mW?^=b%;op^bf`y^!z`H_gZm&qSsQ7!=9c3Uo;NS%x*R|0&vRlz z5Nx%gwsysLbygp+nFf| zsoa%POoleW!l15BHgwzwlTU;=L9eYJ2v-hDZ{>rIQZ&H!+15dSo{cPf|B<<^U2M4; zKDPNifgwPRdVAgK+ZSW9hsSrMxPcJE8GC3vvF893R-ChT+DIG} z1sv2CLUtTv*%`a79H^ImOzHusrP7fg232*|c@W3s?ZBYrh<=Zyayv>)j6JHj$LnE} zANo*Grip=yIvW{`GDghBV?v1ytjbU3iIH2iKqK>sN#K}6LO%@%?uasu@yrdwpxWXqEy zJ75zz+lfL@e!cnpa7^d?bZD~9#sVdVNEm(yAi83Y(AA{(E+*I$e(eRKg;4;ZSAFfI zyrcII61;4<#mWfr$GDER{Dp^-`Q3s(Uv%@BkHcCOLqoZzkd?f#UmcIcq=|B8KGnN0 zTJS~rn=nss4W9vu3Rj`prH6VSna8`nIAzfGrtAX(;Mc8R%ROt3-?g|P+!xZ7iFkdC z*MkJuN!v_NjpHU9E6L}v46d(B6!$B<1U*<5!=7KPdfrQt9?MO*c-UgDM5umAGbSm} z6#OifU-rjh_B4OGQfd5+){MX^mN~i?Cs8786|vA!2`lPzyA%=PKSG|ig0W@ZZbw=Q zQtFC#4hK3a9`->srMEGh=p`@1>*{>Dn6o#=H2$lX+`lSi%;YSAzyIA$sX?Lkk3BMR z$UZ}pVui!VXFU=9eu`&`fr?G`MFWC2PY7({Yf&?p=rKb?|tkAsSipS`x z@JHRTnk`6d$FaV<_vNto{?t1+(r2(Y2VUjR-gs`;EB_qIj!rw0IQR;+lv7mJ?-qY2 zWA#D0NrQ;dOv&(KwWX-W&at1MhQ7z`<(nv6ntsit5V_rus#OCD80pSE5f5|qOgHIH z1xS<*G!fl4sPkXXTA>S%Cr01w@@aOZmC^QwM<+#0-}DuX5pa`{K=8Jx`FT;Tfb>(q zi)y0%d)m0!Q!~wf2#%C;?U554b(NTxV;`)f*>?Un${G8!r4F|!As9*rwe}ZPXOa0K zhX{%&Re1!3|A3srl=3~#X}Z! z_s#Z1Jfw2s6qHfd#3As<48n;vXP}qtb`MB6ptk?6OAqF-C7!LhymlHUNnigeFQ0x% z8J4d7)Fr)JWG$V}h5cpumyH!o=*>^s?$%taZ=J4(8QK=jtV!a12r`0VP)le~dNFlh z)BmHrh;7Qm?rxh)#7@-3sSY9JAR((2MyIJku#6F#e&YwSj+@^7yY(yZ=Wxj;2b<8F z+LMd=XS30(^UBa}s6S+Y=reeTHzhKm*-9BTi#^9H(DW{})zD)Z2W9W}}@>2pN{P zT;E*xUxZJ3J-8v(G3y<&L47epPw3bo-@QNjh z&qOQLWGEyoTtF#+_;;%j{I+W?h>Y0fx-|kizp-Tx1QoSQwLV)-K^Q3GYN9(a0XC9V zkk@dS8maWhFINp3VECkfqB2AOzxbs%QaHFY`n69hi+}i`uGvDrSlKMI_jy-_U(ofc zY2=PjT>&lEGA3&>@i61)sV_WqxVYMc;$_qaaKv8)s~)y9^KCw4#S`)tN=16!4C+$L z25I4|d}aB_@(&jiWZdGgzEww!@nfh|j?jM}Q6m2_D_9rq>23ovS)Ux{dE?SM87Zd&Ea+u97dAF^=e9CAO+*+t~BUFbDH59yf6iTV@r!-R&~UIeRtu{V?;n0WYWL7i!>ac4e`P=R%AZqOpk>`Rnh9Edtx`Xl4j zLOQ*#;I~KXasN*XlfmHxee7gj^~a9==m2=@sYm1(;S0hjngEln_iEh5X$X33l0;vI zl>_iQBXa-92xbGhdyp`z&s4%`g8YSY1J5N*4jetC*s$Ah-=Nw#^dtkb08B}tAnN#tRYl-*k*Dnm>76gC?{ zPUh9Ou+V8?)LQb%!Gl(p(IU;0T)Ih0mhxIAglC8mt29^@1!j`p0p0lNBAdKd`0Y;Z z{O#?0xjP&KZHc}wVrz3_^;vi6es8s8X+cy}Roqd?_ca@s_1&li=mVL?l!(Y1^#Ya+w<&gA~H%fj>KbU9Tx~|n?`>o^^aid@ntL>WA*$#cprpg@N zz4DN5^o@A8d;dtjI6lhfTtWj*la%nZNE`#dm{fwldF>GCcV zY#bt7)3qM9+biss^$1_^$+OA9K6L%h_kNH(DH-C8XDlHvAoKC0;(_zaF`?f5xs+%9 zj+I0mf0&>%n`UGWc(K+#tXXRkl7as^^O0|M8e27>5Fi$ zl}fg6h?S&tvh8t>J24xmE9Is=@+^2IT?|--7cEHhTFxd7hr3HmQ)r?+)ChxEgmE9A+e=QE| zp9E1fj)OTxr`~yoj|e2QA7$Agg+mlwCBDKgAj~VSVgGux12mn5I4h|tHzB&KFUjnCDnuh9JIhmaqzVwx@Vw_I}0g}>X+>M=|GknIu*)_-*6 zgP$p?RE@ny!n*Ijm$!L9slLT%`D0>|Osch9Ajy@V^-!ek1jN-KG!rdGp*8?@MQ2 z`axdsSatUVk@RT1z~??kgJ~T58o5|N3NF+2HIdoxg)FO-uDG3^V>$8pl|OR?1GkN;a6{ z_UNol?7N{c^zXdywSh}lQ{6=UK{SL>EQAK0kHyFnc-P-fqsKH7kKCMaU}V}!qy-0* z_Ev4H%1!Zo3W`?|D!j2swCIX$Q><-O5JQP7Zl1WrcaIH_{ONmBb|NXw%w%|Ezu_Gp z*Q<`=9V?$LdegB?d6{8%g`PwrkGvwBV6*`Li1ui$1zf?Np9&l0+ouySVF?6eDF>eS z$BO`lVubq?A{C^7p=Bn7H-5bkIanYAWUaBe%cw|&=RP9z|EhJp+?36RFVHjswY%pUQ-|n~x zuF>vP1o!Xxja{V=XgN02sB*BX^;ZJ2rTL!AZtYo3<(gAOD1JE=e}2r)3Ng^!w9w?m9N%F%r?tIu20dYx3r>u>yLE3i4NgQGAb6SDK_Rnx~(OhE_dSY{)B7% zzt@gNYKOEt^mCBfPj1t(;XfP*Y~{azo~~{!2ih0UXySd9;4AcHLM!>~RCXqk#} z^?EXJFbR3v9e&qHGakdXaovQU?T!80QZSqvil2%x;qWme`j1I#Jqf)E2P+Y2|8H;b z4w7PfuAM0D+RbSnci(z^&8=eQiPJ;%KN5l;+fn{i2#tRlM8*;-ZSg=coF$ZzGx(RX zVCdc_{s9Jxlxk)EG>i(E%KzI1sI>M)S*Z2lZk^PDQF)*edwbX0D8NoANEK5kUi8oP zsNXd|FOdB24G0g@=hO#oAlKtnH3$}9#^@^&EkvZaKN>9Nb@8=9SbrcSd`wG!w=<>0 zf*=Fk!6=F2i%5@eN=T&lY7C>gH6|S)%lujU(+EN#|o;bmW`?S){C)C@xQRx<`R9oJ2SAs?t*09cg}k4UlnCG#MvK_ zl#%Lk#IL=5&kD1~jEAQymtAYavBJO4vlXz_25JCiHt&!jU^(2IoGYS7R1c4Nh+rw! zUQ$E;JqIwOt$1!P7ZrI^$T9$9R?&T-yu0RNxDX|hO#6G_c9;`E8j;c4XHu1z)$rYp3Y38rB z3A3H*q&u`&i`?Eij-EoAxo}~x4RjLJdB}dp0(cXbMbTMFDJ|w7gR;K2dHL_GY2~Jp z4s|~??2VQoHwN<+#sZd(_(8Z;q4qw8Z!iDUFsw;`B9fZy zpkNcFC?udQcKo*!$#JxzPq*_~{Ev+^is?G`hcQ>Fnw_}!=7Be)1{6K}b~+j5D6hiz zOMqVt0SB9dojoR;MTJqUS@F=*(u|QWmQoi<(QEFY4$oZr5f-{H@zRW$xrFwZpvg#E zikJkdU6+xL=Hz8W$G@DTfrb$2P^50%gKcB`l795Q%`FNXe&WAf&7=HoRkSV}3p>yDphU6h*eEtj}qEK?xm!iA^mMf~#jVsMhlhndzxa$9pN2qMi#a2aRjb{>nb=mb z&B&3pQi01Myx+WeK%O3Ze8)^ujg|XPH|+r z_aZZeJI{JCSAn9@NUz&SMnYgUa!j}$_(xXzd}#o3k(OMZT*epCYL$5VCx8=6Y1{#aN7P?Z4 z2p*!E$1ymc-JYl!;i+S9vWiu!QZ^7$6B^;O6U-75j0)MSH}S~Qra5UCtPRaFi$nze zI#j?-wW^=I32dv+b;Kkl`zPlnhLCtOdrK%;D;eHnxr;z7?iGb~Bg6ECZ1O~qCFq7a zmD(E^6fAROM=IxygXPFYg}&ANuD}XIX_DaJJ(ya&tI3o%|Mpf|-HNM<^Xm>dQ%bEnP_N2HuI#a$c0_g!k`0|BO*TP5+3sek1s?8s>*# z#Ce=oi+uYzFW3mB_U$3ol18wxhjm}a4g*CDIi$DcH-&S@w`g5`N(`K3iIKaN&fJ+cZCPy02r4rKfK~PRednzjM0u%b> zQwBN{!^+v)BSP%a1|1l~s=Lo$iws~TKJo{KH8zz7x76wcD$kXn?EvPV7Wk9@!k6!*8s zZ4G79{l#)kCAH_P@I%BQAc6-X{BS2jR(B;Ln8# zXHDPp68HOP))*r(&%8}a7s#x9lTLM~u^f0#ACQb>RezI3oLF&9Hv8d%L~-CgG?*UL z2>9cfWjFJPT+MNx7YT|Z8|MjFVNbLV5m4=1&M;FLs_FE)7T2ZaPsuYF62NRz`r7?7 z?_nG#8^(5gx&VKH{bx!wQ~Z%%Ed6?%bAQfL>R29|wqHg-;|7O~)8Rh!^npo$4?B5D zwC1tUFiBwuGGzu_qx9sqUss`XVmn8{ZWtm@N7kUOtWy++yz^0+4gF0pT7{I z=h}vhlg@)+N+AON?3FPy+IX0{rJb}i1HE(slRn!#u?`(xV(yb-{z7oK<4{l!O0bz; zGfrRXBiFaLoEC$vJ77(qiFnh8W(WHpXKUU>0IE4yio{o>VH`%ml8cpBwL(;v6i(`p zrXcIS58T*DWohoR&EHc9_<0Q;jMTG297|YLR;SfFEeZn%yd=s`vS`Cf!6tnD`Q)N# z>znJ?2~FG6eg(U>WqOQM%xTqu!nK{;U#-`Wwzr}Lbv0OS?*1EtqOri0PFTOFVsQeX z|L_n(2m)pXt<_=3D*BjP$v6CV6wNvyyBY)00+U)I{wuueP4PRW~=_fb&OzJ6QOz?{* zn%cqc5M}e>70(HGsQF`lAx|;eRFMARVu@DryqD=reB=xjNq?bW>XZepJfM79TQVnIl_(ceNJ@{KS*$PIXT+ztQ7zkFA+2TGvtfw2!^j;TDFPDE`LVgy%Nh z+vSjf)BLh7{MiY=xk>Bx1)F0;_g6?$J!DVQEUz4Kyx`E6&{QH=a(ubQPLy1G9X*u8 z2%j6^r`pbB9`26N%DI;^ZR=_hp15Tyq{4~CcdhA;1|jm&jrEz+p=mqjBK+?Sy3l5; zd`&&VB>c%-yP6jA@=r@LvxJoFy>>3mW_TP^sO7yfj+^vTU6Q0-#_na(NjZiPKb#p zpJNaPt1tRv*R$N&?g`CYvuLzAvr~!F+cs*6jCx z1KglzUS!{ggIU*roITz8hZ+fV|+*&|;?o{>U%H2`# zlDaUCm4wGcibF?+@}habV5QV&r^qJCz60a2X7bHlL4eNg@R_5N-TEr}fz;GgDgD%U zP`=q6s*&D!@DcuBh?CcS`zB+OJYS9sG$qNR>DSv=;BMepFn|uPIowPyi|vV}>|vj1 zzz?<4D(IHf0Is;G2zDyl?aQKdO98Zh`*oR|+x%7k`|`uGx}APxMc_tLG*6p)N&gxR z%gBP%Fw&FaHzHoI&5&FX5mG~-{F;Euy_swm*#F7ipQF0jc`pB-%__M45=Nd^^iT~32IzK%!`My94Jj~$Ie@KGAe z8mNbkS}he?l$zgJQQ^3?OXxE}h?$D+T$O?BEld_J#VN7+0)pXAwB}=6bsir=nvtcm z`%2(jwh!q_1SS34QZheidC8@xSlpi%fZMsPJPRbq^`ZQVaTK^Ou}}9bxoc5d_Gw@y z0$E|)Dv$LkCX~IrKAiH@Vu=-Htglt*>6YoElN}!BvBywZ7cxY2Au32Lr$j$6h|b{TwX1w#nS8 zHIGU&YS}RLTcFVM9cp#>N%b5~JheQ*$@aFL)y|7TGF%WKL7-|{koPRIajc`t-BmDC)bFrLede@7CU zlN_J|X9cQnQy(;}6f5NGYn>c6CYmaSE_Auq{h&VC{2i+5tvB@mxx*eskvL4Vz+)Rj zIlbSTaU4gM1Nr3TksmG>rbA&DbK99A!Jg{}8tmfnP$^xykAldBI{0HtnQj?jB{0rDlBSm%`W$|Hw zFNMV#&77;h+q5MFo|mm(8>Y`%0#HZn-<-rf-{vl+w>w#_#)8LS3zO3=*ASSv&kP^+ zzxqC)StF0w>u$iazW|k?CkfV_IDLH0m4zA`^w)s(cK)IoO+~2^L_G9j zqT${PC#SE&6L$OA(K{bQ=?8F&v@BJSnoPDs{BU;r#&DuC{-#PB zB5Wiv3TbZb5Er;nixZo8!*bYtTm6e5DR1GJ&|hzf5ux^=1rpm3KBD>hau33@r@IIg zdF+=5>8ign5pEDQOa;zP3B+>GwFe9_Q|Q!vV6jq2BM>GOBe;^ZYN#*2>U}```FY7u z%mn2cukBRfE7s7l?yJ%ew6;(k!-69LD`h8up$@?~NLpS1Zy`Ch=h^-`Hzd&cs>RFE z^w%eqgsn@%-@lg{(B0xj*ZyTU7c8cj&=C@)GlnOsq4q~fop_G-?KAE*I*IWgTbat3 zPW0H=pnd?BlbW?{gt&*3BA95qN8k0j|r2ZCYNpPTiGF2%p z3(oNT1|80ok|p?Sbz%(onO^keAfU!9fo5PYr&hDJlGu#_ko|&MEV9qf z8d}YZgYT1zBpbE$8TE6@vsbH2rW9IPEIHCrD(x;qb1}CugJJ{56n^H%o!VqMuOgP9 zu?%;`ktoz!sf%F+8(ATxbO5(Q6pj2D0`J zS(=+2q9wLoAQKhY^z2EmCc3ccsrG$r%=Zepu(Q?CzcN(zJbFpa|s7T!L_<5P3F* zZp|)m&{eibz8TkLpP6gu2Qskl!r=rHstax{UX~h3lzg*uzmzK*fr*S8m<2za!lmQ< z)ws=t*N)XHU#bL_Tdf+WUNh2uqSLWib2a<5@_@*&h;1s1CO5G7g#_iUzAO_a2_%%1S(H*)(pJ+NOS-|unSmisNv-DD48 z5f%n{ZMeBeu4fO0PM75kxnytJ&+Mt-3GSM5$a1*gss1Y(dHe2+!B#wTd%cH|?>6oE z-{d%c?`|^kTL=SAwh#LrE6)ECZnP*%;lgv~Bqvr6`J}+0K#CEEDb0vhtc9xv#VeU( zMDAnq)_;uI?lLr=co|gj#qs48uh=DU44#Q7;}rjGo{?BciOlQxleK=ygq%T4*$)*x zmyQS(V(0EYSE`*i4ReK^XNqP*Y%g-+V<3%Ev~S#!CD7%sxR)_fZWc>lot>_mac+VL zF6K{pTzHyi0EXu=|Mb0h0Gp5B_^7;8ZOd)(->h!FpJ~8C!~HZc;M(a`fyMX0*2KKqpcca$j%N5LJtsL52SIP$<*y^GOYORh3NaYIKWw0Ux z)0bfC>(%0+rd@&?GJ+y0Gp+AlQ0;$_t|$J{I=!)Cz@Oz`I-k8P>N3EWn|?qJFR91E z$CWuo3^OqUb$JgbP{4mkwOU+GFZW9udigdSQ!E)UVy(@^N$Z(!x94OPgoPyrw9*`D z2MsY&?8l0FjCu7|M)-Lyao$qyK!R5PR)vr~No+2s(m??fzY=+Ny2beMit+TPf9ua( zz#0!{+If7!Az)+(1Lj)(n=&(OCO2#7o&xc z3I|1o8AI*!6WsdaZ%ev^In&($XI~I*sO7>EOXM`)&V3s$W5~R)98? zQ)Jt0kdb0(DV+|o7jOk0_y4jc28PRlp>mYhMOGke9xPz>-TTq)2W29BV%rOJSpNej zaV_Tel)P9UZb382=Cq!Ur?P!EAwRxc z8d5sh)Jat4e2W~ofCE7ahs`rXPYVrG%v$PrAyhtlZ+3<;c_YZmIK9cbs;(@1U_OZEx#FW+K!T_Pi+h8N9W|rjN zh8`R4=Z|?N7{+baKIwhV$#L9Xou|1s$O^rs*+ntMiY^;3;}*&)7zDFe->Wnim_opW zyRk*u8NLA3m7);j4j|GUS0VcjDeM)c^%Y}#6X#^-mzCS3vh=>b@VpQYKD#JCJn3?c z-kxt;#>*VL^^abt-F+NYEbLr>;X?GtWV_FdiojPalVCY0~@!0MsoNG@?11U56OIqJ?= z4V@IZ`dUb-I7E8S3ribRZ9lXm@I^W>bA5M4^M6)wm-ZcSmkDkL8)8I6*8B{Esox7& z?D6>GM^E@>Oum9bc7KNu?8FjK@xH(wT!oriM`e49JWpyg(v9ra&R2 zB42HF#xL%&wBPrGsuLj#@&-UR-l?6gVmpy1Y<=*F@})dbJFDdHuGm~t=m9H%$R$nH z=eA$}unggSZXAQ-{jV7WwwcT3-M{~0*`qp!#ltMAVNs6c(iAk4D?CFenu@p-`Rf;m z9Vag)?gp~MyB;5;fP1vG`f&o;=RzoPC8Vz75H{gml53qUcwB=}LP;Qte#Zwg2HK$v z&oP<%NB0JSNn%lIW{N-Pgiry(FETxuhON}!;?ASx>#9BZG&!H|8FMx;fajzhVaKs74=STxS8P)i;p&Q9 z9J<^0dGp6&+}pr~)2M2C2A?KBWKD+#T(Jj0w@K1-fB9JUbLONisH^r7GtJTl_m@~@KQ1{1&dp1y;}c@&x(hoQ8_qn575bpKIE#`{w$-?6 zptkfOgF&G`D{Hbu$AA9ADznu1cz%2~t5~aeV^I85?rSP!yo}g0sNmEW(g;$38%l5* zuEl=5I*-Yij$W>ds&e}hgau-tU<=xJ`HBlhMZ}FbDm7T%@P4u4J{B>}=lhm9+xr`vc8U&ko`%v(@ac3K?Ze?TKjv|;n$HF^87anRqNK&?ZgPjuxfA?$buFhBn7VA*306W!cFx;0AA#%fw#T*a3 zYvveQ05F_k@L#q(=hDjm?E+Ba7iY4w(Mf@iA;+V_d`Yn>>(ONw8_u*!L9iSy_xsT- zOzZ=vU&FDQ8UdXstS0226(n+J0_^SN-yrFTf+NO?*{Jkj&no@)NLm|M%+XoHT0|B0 zgF2>xlN?n=9yVzA_@aN;Tq)zhDnqFVenLQeI`SSN4%sdN(5GgX(f{_aAPY_$&#>q#T1y&n(2j~;qzL8csPl@{ppa_iR0LybOk0r3|D)j=xZ`TLb?nBrZ95H`q-kth zjcwa#G_lo~jWMxp+qUn#cdhRy%$alc-Vc+plkN!TLNwZOB$^a=m+6J4ZUP!XE?4K$ zESyfasi0O?%VW~gvpF@Bbw`>D`;)n`?ZC_{lnhapVHCf|U{bD{?neg@Q;4hq8TsO% zcqEP_z8iw3Wh4w$E>p?yr?@yPSZjDz`Kn$XMrwrh1@L!u&qMfj-+)&*O{=!0t?XBE zARR%S%b>Hc5M*Xa`N-glK$v zqQj)xj&So^M)c3=3ym9HX7aEQ0bvXfo_AH{Cje{4Aw(2gN%)hc!jBT+v$^T_Ky(cR z-ET!%&Y*eY`HIPtIhmKj$;wuLqxz&njnPSpqtK1Z-948=?*XL4*gjkG-7w^A`YHo$ z?Fnrm*_PU^=AyhsO6~8GsVaPtsK_<+(@@N4K_!e!AOPFh_$3 z$(=IY3e0Wz0Dx2Pm%l`B&v+Bp4CCajejQ_pg8m^cp9AM`Sl&Xq@t`IhS*?oUr~_jX zXTiMtaEWdQz6%R3v$(bq z$m9|p#85QSyevmwI18Ufo+L7btByC>z$c%0xAEqPo)%Iy zXgp;KP`^7ExJ{;9>yH_v)SUm@LVcd6qk$QP@#1?=A%Rr{`@sUIKhMwBN)i{r|9MOB zlEY87x<_^B1BXZLEu#tGJbgE2=a>JzLkYFK0$wZB*Fb;Px>$EJv9uM$VDkM~lLrn% zW1A|>h-xA%W#M^lFy#GWqq~>NpbN^)=8T^&?sIv@VZl~I6w)q?zZ>-H48aos@$`T1 z&}u~=JET`7G5~=EM%aHtiTMt7iqH2GeWRn(R~C^2pf^?1@~cl|q{fS~9XjkQZIP|~ z8-IRxx_6T0b5%Z6n?kd$cic1A)EOYh#hdr6W)jN62o44s78v-7Gb#xFhOu&44dI@!mxyk^x^oKF%O06LO|b5P z)P(7m-Rd&Le>9?fn@8(Q5O00~ku#MeKoEy30Mo^GA?EQ9s$&u{#*SS?%Si0->(1x-pXV2L zqT695$2NyWmbsYKgwPolYBZhMXr9lnzms=)FZhnYC>tixAN@WKz*L)|%%WlGVMyGqz1ox#}6W1wtDn|Q86g>;A zNk0VMQIrqDKt8Rll4Q1q>6N$J$6oVu38SDZTu=hr;%)lRYH_~pu|VGGM5Mx6GN}V zj<`55_OgBB_PmM&`Q?F9IrCjk7ynq`#Hw}m0_*FXxEOWX$QAipaKijTL*Z_SklOM2 zZ4?)sAGZ&?An9Y8gKcMY$W)N()fij&;ZwF zY@lw57j(X4T~BkyDQ{#+sHQmWp`hX1BwnQ9Z$S{~Uf-{MXAqT{G*La*9f@Vus_IPM z;z$`5Nz%U9tc;ff-+&@|uEKKESn;A{YX^gAQPBZ}kHYoBA~ktm}dz4>$& z{|fvN4T7&f5^^e8p*&3(Z!dG}r_~sIxdF*2{Ok*8a!BP_mfY;xMP??5K704k1xe=H z34zn|-Dv;0ET7j-<`e>>S%ikRDgXLlLLa87S0h`6GV0W4G0I1jdk-*bmzfq3J*HR& zz_1kFI=8!={O-Z1OL5F15s}F`K0uqa!Ojv1|S+TVicM@V{342;D z--{;oCVkJls|pz?QgLICIAtddJ83+V3!#RLzN-?W?)Q;|j2=rHC?Q}t4O&~xBfQuf zBLUvBTd&`?-n(p0Yo&M4_TmDfyV{R*5>4$YcJyijcr%K5r-D0<^<2sY&Ux7`5`k=yMXql&XHyzjdM) zX4K9oks%B20t^LqJIR-z^My5byBd_ZuZaZD)|#7vub^2p7lysu;fPVGy@J(7ZSZy7 zssLf!tHHqUflpv=m!l8s(DMi{IIKQT=7g?WJN99UPC?){MPmOZkEm_9bgM64t{Euu1o7in$~L zdN{frseKNA<&GF(nQj$pd`G{{qM)QYFF1dwd`tSRur6{?N-4XgT`Z6YW?uq_h5@W7Ei{*z@tkrA*hL zo(34=>vuS8+F=T|Mu5KzgFJ~wzoU;>f`%?V1@U_i{^`Q((Oh?S@}UUfTeR4(HaCjh zS=$5K%WP~c13}p_@I_Hi=M67wWhoLNe3)-UP~SG%d-c7a!a2;djW*PqI*+ju0C*H^ zB*>>e5$#+YD#oRtU}Q@DcYa#zh~b3eu5hv`>4yv z#7trnZ0ziQm$F{g0A2T7t_MtMy^a`z!DWEuM-GSWaKqiAz3ulJIhL$63NVL%APwRA z+50v*QgX+<#3%jh?uWw@$`SOA#zwnqaQD}JWFYJwNT-Hm{U9rp+^!PhM$kIO3fX7X zWz!`s=^iUeoBb{eOzd|UK_J_}RQc0Wcmd&@NM+s+-MN0}42taGP+qRnhujXWOVd*= zEkdG4;Tb!MjYoy9)Jw*!nphhBNgXxeFaBIeQ}1i8suKNsU!73SY$om=s!7U*uITgF zBaV!8njb?fK+Wor2Mipfeb*5(03|81d{grEY4$bUlpeMJ0NiOl7*2gOjTl`@+2-!h zI++DY2+5hhL$Vp5#W`V5bocS&(UVDHQ4nQrMD_UKng}uqQqA9!mO0~~g{2&RI@L+- zuA+)pUsL$JQ8*i3Pm2b)iXMtIvVz&#S#Ols6ddJ&*H#>C)E7J4gATeIDvLBv*;(S? zbw2h%Gp=%F<@Qz>e14k zVv?f2K2oc;|04tjP+_i1v;adFg&s5_s?BYOjEUHgK=HwjBaNGBKV)%j!}oG454TF@p{;VldJ_{@Z!wzZqo-FFo1V+y19(g#>3TnmNpd@*WA2qAEDBt zO$I`8R2Xe_82x#M08!0G)P`Rp<-T<39F*9-*9xC&LgmwOoAIsgSMX0B?<1|?mV%2( zq!yVnuR2O0^Mhs@P_odj$SWTBWp^|aZ`5~&Vp4F@JSiB;D^PLxSWgY~Pz)V4V?k88 zd;eX*-%s)rp;HpZ>{|s zc4~c25Hug}XY*QF#sLU(7V;{7lD2OZ2Tvg9I&XWH_+ahG@=(L20yVYcS4oK!Xb(^T z+_K|kUs2NKe>z6J5srtCJy@<{4>^bT0fG8D{G*6>N@40M+P8lCgTC8R&jd^Qs39gh z4|7lMeYvb9;w_)-N8z=uo*Fy!s=}9@U$3ei#Kv_(_m+9}MnR%VH`poPD*FOKLEUD! zPwPJyW2RlK9oB<<-e5JkA|IFl*AqUQbdK|A{%Tpv(Kjs|K%(G~;*MuTZzHse)0Bdg zIgz7Eg_ zRH1g_YHFf&Hp9l@qlL)s@KLkm{zu~(BwGpQLpZ&TyF`s-#O34XfRYfbzbFs;Ku$nh zY)nGsj5%7+^jY`+otIThj`1sjw(=;pwe0D$-18TZgl44|(-pbd%`KE2K-;OCUPv3x z7N))7eFtf_qh6XLj3=MVhIP5QiNQ(%@Tkgk10L^&c0 ziWEnqE61E9K0zHsCEPtCo-ZDE$!tG0BS!$^0c-X2B;sR)^klgBsQMpLgkW!5FP%|0 zl{u?wd8nNv-LL*A1o1d2|4~{<2$%&HeMR(M%UV}Eu-~6bBrV^EEswc8P&x0fVEx|~ z{Ke0rYm#R;_SVZqJv38s=t*$=_DbNM0)2Bi-_Tp!Zg0FFVH1`4QIboGqygyF zf2wyOt>0tr$hevCL`hw{B4y0K+snI301-|W3UnQw$|oU%uA*^Kq0&sGvAFz@qTBXX z1&mzFk(H%k=^=6f?C@dn_=(!X^ASpY`E>?3!hMf_(kezFm5V;?1tu9mCXtAsv9Nlp zVwt#kZMC`UuCmvuZ$ybVws zj4CpzIeY@y)Oo$>cZO>tmxuU9Qi^Z!QWK&-U#yd1B4Ue5;&fD`fB`brYQ!ESk~Kxn%zv7V5kE zcv8IDedkB)L#^Lq)pVU)c0n3BXxyr@EA}2M^Ri}*3O)(a6PE>q;Dm*2ynZk=F09eD z*<7;dv_YgA52jO%jU`vv`Mv?Cox9OJgn?&QuP(uNPbW%nNN{5+qcfHUs6cha9+$$Zs$2;oMrOAs0aCMFda6E|E2S0mU_BBP{{Xwj>X*oiJ ztkFbFpg1fQLV7))wJDX%dn|79;-almHmd9%!6IDbSkQqGSqg{J5`y$P5OmihG1|Q7 zC4J7Kjuym6=ql;n2;^n2%Juuku@3@$LSpt=6VRKf$oTkOoGQ=I5bzuUC?+xC0}#8l zJeSkhqzwDbqKM={GuAgilnWmDZd!c&Fl0kEdZdw4!6R8q{#}P+^xMh4F9h3)Pr@D=4JT_L*9{<?*kUIV!gv&D>ur)zs8c*x~zNh*q{qBP8=b>QT zlH{(R z4)C;GfBPcJfJZ?Z%7YQ4LYBN1{a&l z;K)9is!@%W^CuydG0kS9*yy_Uu~7LHP zoWk$x(6c(FnI;S{)CB$Lr3wa(UU!yLgeI|ry*MfR=&)8VDcJY(kBwEMLLO78I|IX` zlGJ*O>Asst3goaUVnNE+w~wofpxE|{#umkZp3lwK&vjZv9PYT3ahA6I^Z8_yO1>a6 zvmJka^E?ZS;~0+oubaK(cv-7cWR<5?jG!M{hH^kpiNXMxVY!DcT?>iFELPYInnST8 zy!f|irzwoIsTq<_Aw!hbtw&@qS+MApI$ooRtlwj2f)ddCw+%ILZ6eno-11)lrf8Vd z1u2?-*CRN&qiQX$N_9h5l@=&-#QaQv4dNDj+HgxNxIvC=2XBdWfv2ktl+UE}BwR-nhT2(6vh#^FF z7i2HBiTJBciir~TXc{gi;gVS+-R!mI-kS;Qogx!SsUP*gCBN<}B5ZpjZptj*;}?&;sI$UNw5vd^ zYF#WeiDJkb!sr}rHEZ)^Mv}YZ(v(^vxxYi=Yd$th9@ZVUYzh( zKNs%Mg7bHcCB^b}pp2b|3_!ZY`j=x4JPs~e8YnN671tNhZ*+d$392|co-sRRtOGKb zotY5gsK{xhaMx|Q`L9wEIczZ4>vj1&D{>H@j%jea~FYfxOc ziE|W3iZ2p55p^#g?azwn)@?cFoxr_Mh*;n#hO#KhKVMH#R%}!Ye%tncTDj8f>XInm zo4MS4k3hj^H9A;fzhgUqfIv@R2o612_r@ynR|Av2=kjehPH?3vQI&0g+JXWocvvEv zOQ^X6Jd4%KzK%w5OGJppbqfW=$2C_Y05vCkCT-JbuA)T?xKj6PN$dbj%cN#~C&KsIfUyC$CCDXWMk%av*LfT^2Z zLnhgm{5x$!In;Y|Lvtn#4X(+Win`2Zl{5snV$Y#ve z$`0TjWJ-9-+S-nNyFk9DMjCb4j{1jyK;A=W+V+$C2W^CPDvQn4{7KSI3r766<#?@u z+U$ij0SH~V&&#>#1@-PpL4JFA@(x%p0c^oK-fOqxStt`t zwXeOw0WV%!JkEV^W08`J1))Y;fFDZJRML(b8=WDjY}q{O!qWTrGyzxjyTt&cK@k>zH)z3|X|d&Z`C`QY_0FUc*`S|EG^w6H`sImV4mhp{hlGjWPcFRu zkgi1Tbg#c~-CRLdH63r^TIP}W7lppv(p1`^dHZ+G<+Ep#{4Gb55m~)_3|Y+m1Ieco z+;hMX(}3OBN<-fQxEwh4(|KXp9-P1w57ChN)WC`|7?lSBuqvkxp>8_ zQ{Q*)LpKo_JN|j>%+2iS?tzv1-lQ{jVwW^J=EP?jOuju_%j(gQnl2}aZp0fpqOR05 z=Af+1iGE-gN$?%29>6=G?d3w5^q{@cMXP~8d(sBI91^lw`?h%8RD33{ddZL5CcH6C4;BKA_oGY6R;V0;ee0{@9u*AhR~ zsloH^4t?Y?>13f!{m%<<)n^ute9HfbnG?ajqiY${PP_-SZ^1?I^jCbNn|Pc5Y{0XJ z?!=o%i@XyY-aSe>GxQvaMt=K-oSz|J~o>8MRDq(G2QB9+I$p|nq5gV4KvD81P* zLU8`tM@DVKvEz4^75l%Co70_WtlZX%=lz<)!&` zKNC(x;97N8q3rMPj6*!tonUd9tX(mRmu{j7Zy@`2;Ey{Ty1s^5C8QbP*R}R@KRK_> zCZyRWifmJKo^uj|{7sKG5oGs0G`n-kUy;kzwTC^a?WAxLIFeisMkFS)W48Qm>8Vpe zctWypPr*`tU5wYN;{&%mzT8$B6PNvE^RYj#LyxFiSc|YbaCJY>n-6{jZzjCiwV~+0 ze~cb4_K-ma(;pazl?6+FgGIAOJECK_^=Qp3SsWTVfIMn#Q~ZuTTAzZAs52FwkTTG} zD^^_Qy5m^en^iQ!LPJO&>$fNP%hQ#kI!p<|c`G!C3kFEW+~M80*oJItnWKuFn~BH|vCa?oXf#=vSXK z&BMVu*t?A4${1wDhdX{Hm&>%&jGCME+Yd#@_X%%Y6D9$z>|OFK5Fl_NFLkY=>MR&$~bjjsAY#Nwvsu>r;POGEb; z-cKQVVib}4BJ{nwsbmFUz??iALc=UPBPCfethT`iMu+D|j%xmncUg#!&#uSwa)@JO z&%G{xy$^HbbP`o|Ti5O}%GQW-OLd-9{(N1%5gJBALm>lO$Tx%feW^w3kOt!Vk`Xii zCShR${e?z|0vRryX1Kr5cVxMP#VWKD0RNPPoFD!LG~{QWEJDKhzV?lc3M-#?YO&lnbvW7M!S9^@$N@Z9(P^pRn$PS1N52irK;3eASHKXMK z@;=UZUo}B?baWDJg7j|RHm;rs{co(z3Qwf%YFU47CkInW87962?*u!p+pDJ|^ZiA@ zxj&!kBdS0~oNq&fb65pb1^{{Y-uF_Y&nX-=(<->M~*ynW|!z;b80>#TxO8sph{<8_OT+PQO~aWsyCC%06Lp<%Lw5hmCcvv zHZ%vhFGk5(q&*E1>vwnw_ExQ<*_D?%F zHi}@qg1g6Nt%ou1U~ro|usGNo(#tys1Y!ODxp-Ex2boAv?GM+PY?qk~_RN?_rSUEO z9huFN7@i|MO1C2*`Y6E1Z_kyTk_s~7FQzXT0;eu&5RHWu9UQu$n5gZMrOD>aExY4j z(YAeU(%RzwP~8*YDi2r=q3idOWUsu-Z-}u_dkVtHF}2E%@)kb(YICVRwYz6^jj&L7B~{B+-0l{zYIC=-t{SUeOX|$1cqPvAvMD{340+CLxq1{V;`Sy z{Nl?C_Tugt_x1X-cFGf-+Vk;G7`O3e0dXoQSeOsZj{nJOdE?ejs~zrmvn9XcJHTfp zXp9Aa8bk8&^sf*(OAVKRz)p@k+wbxfs>Lt3HD3#HM8SWieD7W}=pMFuX2HuuL};TJ=zFaZu{5c;N3(rBAD<4acv{oNg^($z zoMoiM{RjLNFjQ2rHyPQuC&GGXd(H!$8LHoR0exu9x@>Fru?B^tbA&-N0Dm&|45G zk#9=^-nQjyVUfTzypK?kTOla2tXdY+(cy&E@xDuMsfOv0{3Z_eRvA4Bn!*<&(xCJ{ zHK)Y~W7B2-o7P;|$AR6;Qq~ljfids~!p{+w)aE)4CZO3Z02!ul?=b$xYe7i)Y)|dt zpOvtI4YsBn=upuN2S23HBpkQVAlplt|A1SaegL%+&@oQwMkkchkXs{3f`}VIB6R>l zU&mAW5+503_6*Mq#2y-AhXS2B5n^y*t(7uKh|^iSBC%|UVA3aQd!Va$v)_)hDgRnh zMjPa(#!Qz_7aaSX!q(Qe3OAS5RAG-pt>^6*tm&CmY}3J0q4xl=r9d)u68_&oTrED` z#NQltdUB>IE#b}Bbt1bon%#R8KBKItuf&RBuuw7l$Rj>ea5Q?`nkIU?`B6p^O{Dtt zp7e5;OUMxF_+@{5@0O2Xstby3%@ZU*z8W%;FwGZa?w}*|pS?;)4mJuxb3DPzXC*81 zX)IQx%jUoGXdk;!(IsLU;X6$=ZdjbfHJ~(DG(=9#Q2xG~8fC?S5EfAn_}xHN>c>BM zml#I2jt3+DZJ- zK#ERZSt20Z+tsC~N&Kw`j9M$cyPM!MKpD@G%x%A2+)K1jzC4mmHu^4*IDcueI(%CE zc64;1_o87k8^I!1K(1n)HGb^a*Gf=pod@lY%igafc`;Z96_~2yJvT+GEKvJBqRb$i za$e=*9~y~+=Z5qe&Lf(O=Dk5{uC3n~Hp_lh@lzp0pdrC(rky&#XjmeNANlGC_!4A( zQ&k>IKrbUQu^MjcW)wnkq@Lg$)N62+)YVev+KIZoO-A8iRF*aybn+yotQ&95+jB=s zaO)EhfyhngM2-`=05eHJ5y8p&Zzs)@Qkf8^N=(F%U+VWW6jnx){0=M6AH@}muHlA5s_$7e03sre!Za`xQ28FxM{wWZwr@_)>%BnZFMwLAhSUD|a;RCTm! zSfYqu{D|+#^uY?lb#)1+&>z^)QsbSc=;I!`p4@{hf=)uPWr3p|8R0c?mQz)Gz`uO0uOwZ6X(&uOxZ zQ}b;o-hY-f5KMJ=epXrEbh*;N>oel}I@0wA8!2md?|ve0=bAabOZOZCyR@zMs+w+= z8MFSXf0s7u1%0BtrZQP-p+uoi!2|sl3eVb+7Z#B}6^&4NjpUnC^LeM_@pIzG*|5=J zC?7t*HOQ$=t7y*|djt{&SHERLA5x(2rUNilzc+`2SXRFjV{%_v)S7IReYv!WcGZXn+ zC}LmcAFLhIB=p#^8{nfsBbcyWD=)O}79-u# zwm(_@NAETVo%CQ`B|-b$MmD;SpWG1;!zf6m`h}~GZ^wgC9PRCg^%KvneE)3Fo&vYs zizfC4>-XoM+w#9y2`#-zqmkG3h}OA(yQL%kM9ooVH-2}c^A#Kz&|J*Tw-CoM$8KVI zqG=@Yiy3n&bfW&A{JUsQT+2cn`xZ;g<(dX@EQzo%(>)sn`E6F$U>=`|-1m8AFo7|p zYC_#=uXZs&$kEz_@h-Q+{VR-$B%XDDO z;`Ahs!Q~<+hhBPXBO#!zA_ zOJEqvl;ctvIT7SW%%|{sM!HY^(+%iE8A!kE(vKumh60>f2QQw!!=IdwR@wV7FKgDO zFJr0Th4;aprf)IpqtjAU=$}HUj%k#|WC?nb6FM%#9VAYy0uab>Um@ zS=(Ao2;^Y=w`MMSf@7x05b%MQ)m3;=UldhS)uo%*jco>R_u`|JScZ9CJ2|W2cFqVcYOq|6K13cRbU2H(zj*10jTQWnacwQ@hm3FidjvI3wB(}$2T!-zkshTM@4U<&m4^xxAU%xM|2_S?udZ5nI>GGyOas&-lcr-t2d zr7f54__*=XWofKL?48EXgwgu3un^zEaeu`wqsGnlqgUhRsNl{0_%IJ;LO8;Bcn4AB z;$wr@%b)^qeZ5u$*3R=+*RyP2PZ$&;xUctRLd(;w{-F-=9v&W-;+NQVRMj}O*}@%q zpzuKQSleCtTbGPL@!_w*qGb3Vm?e~uC{PC*JM|6};yX@X=ko>s?!T=0-ZkJk84bN85v%}bnv6#ul&_BalV)EG#2 z4f#^#J?Apm$C|q-KNLw+W;jIQX{evnNS>}g3^7)q7KWrf3C*Nw`qhaJ#p_7x^}FXY z81aRg?=R1f5k}Bi$cx&I`ILN*JW1F{#?q<+wivZ{RcEGSPr~@pdf_pKR1)gy->lu; zfa~sTBbM)>M!H)htI=MSr&rEPxh*#3d)&WD0B}k(PYeU(R+A??@(Gf85h@u$8ZJ4g za^AS|QO|VmY0i#``An3A_JqiqvluqL)ye~S8!S)drGC3RDNi{uk(oXx1Rf0j zY*9{m8tUbBc<#>@k@x4HlFD!yPUYi1q(0y$&ak&S|9R}>zc+*s8(u}EN8*rLN-?Nx z%aOww=ZjR~wVyKt$pU+X&udDGM9d8*%kHcpLgnnYKBV1W_U<&}zw@zBp^COxTQrJ?qHY-#pSbQ$lzHXb zs_Q*+8|3#Ns*0nd!P$5XWOY-TkD5lji7|}pjc0uq4?d;Sl=aV;hg2p;P1Wd09aXZp zVZ<*5E55x5W=R4Doj`7aQm}Uiw8-AU@G^ z(!elg;YrQ57UjQLyk~hbopSj3{K&==)>A7EP;JSl8`D6drZh~QkD6cbsgk}_2r@Jf@)!vcI*tQK zJMC1uON1y>Ux#8^$~^9m)uYNa3}+!e9j17qpK@1M)fNOV+dK@X^6VnqK9vg;gtu({ zlK|*igPb3JD~8gTD^(#=N_f<=R3Q82C`3A6=$&{tT4ZreV{g+vWf`cu9c=^>BPcAH z^+(M@t8`^y{X=gWm5S#qWk;N~EZy$&pK+7KL6bJPzcS#F1iD!?V*33hvdTiaZAaot zM};m?Sg4aPwEj@7 z@03XYW*(n++S?nUzm?u!At$}L*5s);``{WW)_$`R!ZPx6<#c$7p28BvWkbVn*!CtA zV)Rpjfa-HbGo=2NRz?}Rg^|Qh_WU^s6F_wH`kwP?9B`_2Epj1jHG%QRqqAhfA^bw4 z7y`K9(lmvZDwpOe%nJZdTLzPF`E#XEyN+jUSbxZ3@sa$~Rt?l86-hOGuiN8{DS8S3 zaLcZo?c1aj>$NJ4y;&#-vd)h@@+>obFP)kKuZiHwEQ^w6Bv3G z&aiIjmM_D%1Ghm92BbxdkbI_jigrB8smzArP3pWd=Ee?8^+Tdh;66l(b zL2_iS+x3@H%fhgQ+dv95VtLO;jRgQA5TjtXX6^=k#hBcPk7hi)+W)0+w0sY(0*ZRX zy5`y@6`ly{5OE4JrfLxP>^oZit{Z!oL4H8;>(wUMbUSz+&f+x&Lk|rvNnhuB{85li&oGPhO;6TD_zaiHiN`zqCoEg23T z9qRn*ZGz#-OaDOET~!F5@*73Zay9J7TU8BCbo0tzKF<;=WKE}p)>_YXCt8GQ_BhHY zw*<yL4+o@SgjPqiPtpUtW;`PeZxHPQ==u7#nY&P=U~ib9Lvwzh`P~f zBGB~^tUME@tbKP-*=r*tvB>&;KXjte98xR_atcmF7ANA(P4Km#UulG=>S1`fj-vRj zvsq(nYP~g@mCS_7nJdvCb3HRr8!5GZW!3S!G~s6vXVFgy>{o6KV=ZR z`7Zs_?uN8Pem@SK7#zI}2QkN4&?>yr5|i3S8vWt6jW|`o47w}GX~lKj1rnqDxZE+3gwF1S)pq5B$}ndfRvu+DqL&TBOLZ23O=!d-Tk z98DAQ;)`%3{f~Hnk5PplslnAT=C`9*?W{)v>H2Wwk@~TLFiE0)n?q?r>FO0zik#x) zWbt#hh8v?`I4VYvzRn`w*!{9nv;6IMnH_MPz34}SNEEt+5xd!b%bty?^GRoq+Gzx7 zLXrAgpW$c~tRy=w`&qkc+;|6(caM5jytWO>r_yKMdRA)u1DQB~6(eT)5TDQlqW8$> zGRI3ApwBP{{aj&-!D6nF6LZA_MQ8sFqXdZ_{PSVK7s8GK|M=b`1J}myX{n~4zBYW} z-EmvYgKrfes4|nw7$Qf|&PrCztg5XjiU+#odG`|_Ic_9KFQ(p?uC`MNuEHN5-Hy-C zLlhL!p|&!F#ujRgL5Pe(p4O1~AC||REDUx|4Srrlhp=N-+fC8W8pKcP{CI&c?N8P& zl*9$m8{c1`h5P~C6o-pfZ#7fTTn+2!<5_t{X{}PHJDNOdMHoLEFGf$A74KbnI98h# z1@yrTlNeysF&0h+dPZr+aMr?USu90yY?umlaULlgdCtV;){mp*e7opMY_J~4%7}a_ z%^zSYpRG~891}!Lwn%BKX>d^iz<|EX3pPO1wO@;{zLz7``)N5s;$ls5b%A zc?VD%8yv2H9g@#`zhmH2fAQ~!;*^T*ztMJKZs3M@br?gvjVua*prGcA1qBAR`iWNE zwtsqQh*xg(&-}&s!>-8fKVb*+F1bT9zh+Czmh~6AkvY&+b_AJ)(0OKi_FG%dH9ZZ* z5{U16jC&V0h&auA4tz2z^>C)zu0eWo1@ke7ZQ-_S4Ij2%#I!j}*;0-GxH*1GT|bGT!jQz3wkE8_Dm|34yga9RyA7||!XN~olF5*Z zrxYj-<@fPO3(xOWdttz&jeslJ+@!if^!q>LibTu~w)r|Hc_4+_`-qzn`UNx8E+G)Wt!l6=6zR_si+In){tjG(>FXG$iD{ z>@>7R6V{Wql%H-TzI1j@t>`83s7et*I_tDpS)QD1QdCx;{2i{pwRT zeroC*IGh}8d4Eq6;nBhL9&}uSIP<*5_VxJW(9zvDF%2NsbykLE2}KvKA-4^Xz;)CY zKj-_Y;PR~~!@J!Ig60d5-ovh3Ta-1u4}^Pw3k?>~QBfV;GZc60f3N~e_YYDkQYH#` z_LEg;dWUET3DQ4J{bmr0*e@3mRQ{w`NSOGr?g%uY{Kui_?*U`QrmSae{IyKP_8+ob zzuG=$NB@}Bf6n?X9=ytBs>{DI532NEPk{!`UwF1b83%K<8`(v+_sBO2SqsAa4N2Nr zB0F^eij{llU6JC4iHHo07`JLfAzh=KQdd5KZI|h6z(E(7MO4f7a4X8B1B%cIwEfDODCRY;^>{3lX(eDEvQg;-m zM1eU(LxRiv6o7G+33v6oijTl+t^j)NU^+?T>-Qsr|0lVy<~%%F_gVzJsEsr#cWDc6 zPCMh^#a|Q=VvQ`9CHZ{J1Oy}Mzyo$eC2dy`D6tgJ>t9cNKoK*?ebZc-K6Lz}7l#=G zB~}u0e?BAA86Q0J!YE;Kh(q!4I%%sDmCl+|k>||3c{*1udI34Y!QjN$YMU?VBYd1W z#hu9E9`q`H1KRQQ7^Uqv7Ievmzr6Bh{!y*nw*zXTEsL-^t9eZ!ba?zOsD{g!aXiv@ z0#+UYSVrCj#V-=^aA6i7b}NXZEITtpG4S;LxlX73>^o7r{}9B11FFMkWQjBr4j-du z;!gs0J~BHoe>s3kp!#g+2F{(1<4KwePwQ>GMG%p4$HR-vb+77ET7K8v<0>XW)&C>4 zlALy|{!fY8sw`_HvS94b9}g`K3~@IKO*PS+2BFH|`$tCkO9Uq|$XFmUe-s0Kl8YgV zg95%?oe4J=)Rt5-kaLLXS7oTx-1{VNrl7bI#7I4(!G|77fFK{lm;d7?v|YvDQ4)iI z!vkpRQAAA&N}Lq`a*yAi@Ifj`5N=oBZ-LevHrJVolq+X3YJ9 zNz>5kRZeCqT;!Uk>CnG=im6Iu_NBhge*9tYu;JWU%9XTy3R{n3|1Ys@re4IS{bmPK zphbD*u==hrW(pSH@196j^|d{Z{Lg z75J4nrX0!sld2ciZ09S_J>KGk>;nb#7gJ`FMq73p|CZrOPUlm!lm7$0KtaDx z`fci931?lJ32l3?`SdGYZXWyfs>B&FWktSw?F2aal%{FZ zrp$-uJt8hnK#WK$C&v;)lY$$ObOYZLf;03nzs#TBN3Gi}WJ0u9 zNV=b5WB@5}i~zsi1n_QC0#1LHdxwdwDYPl4deI!{d!OVtnMG z<*a(&n zbEX=R#Q2uhggD$AV#~DQOnr#Vi%)yX`AA_|u0aoM9@W#~DC5*~iSBxgE5vwO()!fZ z0kJKhEmII8lIarJ4Z&!X^OM5FQspiJVH>!|yXM2hjf~czjCacD&V^7&t5kOHN2!_* z24hRDFU23G?g!zII^XNTB-U^Vj`i;l^MPr&$g9V4$LMm7reuEgh@$JJp9Mu^;^efR z+&vF5`{K;5MVE7W2E?wa*At?3xh0MpMDE-riM#WnuoL^i@ng z3q`x${1R#$oW5uc>(e3}5TDI9r+kHxRW|Y^h#=Og=EGLA5VAHx0>_HoUP$_q%ty?c z59j%GIL*Zx>2o-8xU{@EL_Q_TmhDfdObC%_NczWiAV1)k{2C(S+15Y#Jx3wu+l7zF zOaqq*bIjZr_dAc%eI#%rM=>f)mqb@kMlji~sV2mtZzby&l3%c#wzQfMy?^hij7YUU z#CM%t);ILKG59xhA6@9}F5_tt4v0SS66SVUDDGWbriJ@f^1SqT97Ct%X;cxo)vNZy z)DMd*FG;UU)GhH}WOy$&KXTox_xN%DT3Ua&`7`w&M}j5eaupZXzP0xEL%+Rm8}&3cGcBO!_0hm35x+`|!~-Prev1g~k~&Ur`AGasr(H6K)a z$-ilvPQvH-Z_m@SNac*>5yO9w^(KJ{`e5`ac~0g+pf9}i2N$Uh{alcl<@ld_Zqf%P zOnT_|x&FnBJQw(<Qt)?b~+dt}fPl!)Vh%SHXCiN7S<>GAC!U*kK(car(%f?f3-PhA}l zeF3OIe`aJkz)PfyYKt^urj^pnjRz}p!nvwd%}2U(xG90!gAz%1%D=>iUhOzltq==9gpV)Va#(4{k#D z;OE?YN+O@!db{#Z$oFkVmdUt?X$-m;eIe(;L`$;1A^YLH9-P6!FmTOkLaO~p+e=T& zQuQG%Sw6V6bzU!yV4a`0rt#Fp0pUC{_Bj!GrHubV}#Pz7OXb1&7l; zeBoaqGAy>5nVQyoU@O^lj|YcQ7G^3aUB}9gLk$NPVUg(CLVqIOm#HzyxlsNjvd!s-5YI*Z5FXKv zgIMg}%m6~lb=k~>FF%*5JyEc%o$3<9>ao4GcJ?H^LA?`#FJn6K(s8x+an!{Du}yAl z47|iRlPRW2y5K$Jo{tdxXQCltiWkfyzfcL96s>?Z}WxQGI^@=^})-ax$Iv}Pr9b1z@oc@uEbXHd~ zB*r{PpMfR$MjrIeF`?_9kJS7YChZ#eQHLp2~V5LjIl_V zb(fkC9j0W`4{U!0nNe@PGGrK~nGCK*!zDvuk{45CHuU?Fj0-nj>GRO*m7~XG+A+VG z{-$s(xMnF-%~WEn806K~KWl#iWmx{GaOj@T-p<5${hRGQrp*+w`uue%m|J8f-FrI8iQ!V;a>&S5M@d}+Vygz5_P3*U2 zE(Xe+5>0`t{ae+BsLKrBYh@XcTJwjKa0^}z&ToP?eP5}I10u9}B>}O@xY1^6JT1f{ zl3CB1j}Vy%Q>H*4SBMObDKfGr%%8Q!#39mVJ#yG`5JO0L;vzqkqG65mP?-?Vdpu(D zw!bvj~wVo&6%u3n$$WEWq1gGpe#`xZ4oMijH_l5{F7dE4V(<33C zmujD@!86_1Zs>Te*S|Hjr}$Xah$u%ypFUrsHN>-UowPa%6(j~Wwe|2-p-1sDoZi0T5rFl}}cy?~xy(7JQTKlygub!Dm^qMsD z;c3mzufZj(FFF zK3+so(-`(;x#uHQ-l1zgurVj1Z^|2@e@`FsmNRAzoidBzQLyOHa2$4n_MxHrL6v2)f^|E3DE zMf%Rf2(I&QSzoF8ql_KXX3uqx<8Rw@7o#PHF+!+k(udG((^|}jZGFnjcj@tR1`5M~ z-kA{L{%&&Ov-Kkmgh}ODIUqZgLsC7)H{?9~(z3}%E#$$s-=^>CmB~>Vj=kFhbZ7!- zj~tI|9%})?a)vbsBD1#5r%a@ig%bsi1lF@gf{Rr6Jg?_?LS%BdNNpzMnpEfJNm}#4 z-18xE-ks%2fbEtjze0_bYh=?@i$z3&t)V8AiLAx?v-}Ytq~;@cT)*0$Hwzrj3`uG& zj7C=A{lI0N3jM~`5qD1r_uTOwkx)*LuU@mZFUX`=Yw#RvLNFr0WnE43Z{yPt^l`hj zYA?;?sao~)C|`BING*Q>)OOb0n9j0vPC|}H+NOF>IUOAo#7h1Dc9rsMt1VLt2gKEw zav3o9E~U)4Z^}Gp+vB*CiF8uRN#Zm~HrX`O!6`GgJsdf~(x6RnZob;?`6$DB$+wct zyL2NK0`+d68(T~7AJ_jvCIEeaGam(YBD{poI8Twj&unJ{ef-=wPn>>bCpg{x89Lw$@oLAOU>Jhd{2nYNjJeLO&eBnpNP6wq^VN4Ue8~xGGnpF7>nPO zPDq@Ns^j4@j;IhUcJp&M9VfM}bWCYsvvr`C!YDAtJz7lxij=uvzI`I1R82-qOn5!U zgOyjQ@d;`^5+2lc$%MZ>PE)ZJ+S}k}X?r;gve4<^j2}wAq_CaLSPdnAnYCG+@9N*) z^6qi^T|H|$eB_-A8nit(-wPzIF_F~p)MTDfrqJk|5%>0x`<-izB=f$wKZ1-br?(2v zOTdwQ^?8t*5Qj{f&6p3te-ip3Gd#BT(wo*(XT-(0mAvZ$N0bDwY6TlKjV;7@4BKy^ zN#$^;nvSHHTr%0jJ5e1FTc2#10uJ&h87q}YNWY6hpD@0hFv`-*ho<~f`l&NTwkMPt ziSeGzJEP>Onhy-}^)yvu@O&wU^I)0lm98y1XnJHa)qKQ? z6r1#o-k!+#lQK}17!GRbL9=u}#Wk5^Q4Ti%++MYxx>Mwu3CZN9YF{ZwB&iqSHl%>h zCGrrkx!|NE{pYr~v{TCINFi3fPKQ3gnm8ar8`umV5#GRDh{SqCKI>V-5F_$g&+){- zs9l?WlHLF&xb_YvGN-r^I?Pa#gGeWq>#!aig0e4RZ-9WOUK#vo^}(s z;j}}Sb#Dpt$zu2eXFjl=kmwf5$zb)3FmqySpUtdr`r5H3BnCgQ>+50v*!mf}Js0{r z)tw^kDln~G>e9nN9tq1A4u}I6{tx|bsBx$|4wd0h|7$BI_w9d891yB=HYMXb7->5# zioP`SVNoV*O@;$EMyWB;b{T7-Ux`$nX-#dJkC1$TBUe>HAb>#JKKEO-ZPA3qi+0O^0ZXrQrhSV2OFW&{Eo` z*2QBu>?g4^F9m1Muiuk&QhbN#wcI`rw)mlrGLBN81H`F~YuZ zGf~Y)4et2}QR9J)$JE%xm~@eRbEo%sME*?tCaDRFk?E7_mA3banTrtmO#&N{oTg(#)D6%a>Sr!r)y~wlqi+z&sKPyyn@@q zj72>7i5(8rOHG7&;adbA9E=Nb%$(?cZvV%I0oJs-9` zqqO{3FwzoTS0;0r%XAQ#ik$Il7^q~OLPYj_;fD3>U#xMPBK0PD^o{KML^4~;e7h9b z#$HE?J{!r_tPc}XfP}#b?*Vc#Zn(&;&vUDh>3dIzC3E3Y(-49mVr4*FGJPS&QLFY; z4au%*ElK8-?5a2@KKy0cwP3J?B!h6gA^Vu=f?D4L5U#xaP|^Vh>G3kcxX1;5uKk^ZBjK74E|McyILY(~$cSHw&Cj?awH{wv z`(jq8_*O(_G$)Q6tVF6GOx7H?3+^e;iTMd(JiDBB<;FSu+mc9p$jk%RBT0X3G`4Ks z23xnhp1jhrVL#~JtDCh+pUe<92AAh$$IG=<>qvWHJem`h^wl(AZvQuYXLE{O4tOB@ z#RQ+Tx#t9=`dmT35(fn;SrgTF1?5uzn)~$LMhx%XXFE&3* z`Vlk(!ooBh3MwnRdG(%!>PRH8Br45Ld44(iHHgI8BI_YA6FbL(Hr=cY^p71@<$o}Bt0>YfgV{Tj>vn$^Ecobe4WY=XueZ^8QKH$h|L zTaY*%o3}}96FBC$-nsYG-`#t5h0cc@2#5FT=4Z2-to&+A**r@#-IhXbtj`mh9_fE$ zdk&d>HnT;@pA$bJ{Tn;8Q_t~m@|f17sLV-fpDITsaY|C>L^&>1K5J6%wFglDn>aL8 z?S^Jv`@}Ir#&4r51jHhW-bNy_@tWyS>t6>cxh;^8oX)yUgK(QeewL7 z{-%Oi+4SQ~7y3JR&4@M>pGY~!{w{kjZh!msMtFA3?_llI>tN05b+B>$%P!=+-&GFD zA)OC`?!CG~kDlG&@E(Uj$4(6iy_n;rBHt~lJ;DA=6~^QJIa4Q&^ss$kbh@;Ol)$c} z`b;;jP4ZesK5hEKo0&_>w@bS|`oo33%ezq=5L+bHmi93kbx69Y&E40dXEFZ{kq9q1 zQ%U;RW3R_}LS#H7;|P%{GGW?{^Hw4fW`&y(woypAadCp!cBPR}B2yuWq=)1mY0ZMI zUordRtEae3fMlNiLdL}##7#A2zVt(U$3-s7&U=XOUB(%rJy$-KMz$MwG{V}|6^CQ> z>UHp`~C8S2wFz*cxN)lootXNbFh= ziL(%bf2I8B%IBu{W49NaKFV}v{7eMXa={cqnF7WCrG=9q5XAwZI?BRB0*%fVnGVr} zGkwptKr5JFkypXINw1kskMYt=p5#E7#|c&+9#Y z(|q8_T0vfkOa~d7mFfpP5m^U3cN59PvQ}6ie4tM|-1zZxkH1AQ1)TW^$^4GAY}4pS zihOS|b+bJQ~(s=>jMW!F*%>ECs&`3QK=M=<#zbj5-l26aGm={E)TbSK5+NJ~5?Q)Dt2 zeGK~|jv7oci6JoCl=AnYFN|zbMs>l-;36HC=PCW<6+_`&wuT&Dh;)z*i*3P>2mVA=NdBDtQ>GfxX zDK>pu^HCfSp$$wrwvx@s=-CP)rIPfW)N_`+*V=0`BoSoEJV+x6^_VXVC(C6%Oy|54 zH}1BYnvW8h$s8<2c+W>j{^0ni*7D8uCqzvOR+Q3AMlI*vbsl`)cgY+`_<)Ms`t&Q* zJiCl9RzJ7D*$8*vu?QC3x0JLSRQBMsFAhkYkHWY)>t^a(U@LBi3T^4I z8WS`epME8sbjy3}dIV^rmi#Pn-UAOQN3JEzrz!IhbKKbYF|LCq-`3107pV*VT*5d4 ztBu?2rOuCOGw0~ri~vzZv1uM$BdOf_X!J}l;@FWQ?%$WEE!+O7t+jms(d-t`?@W5Qo2^`YksPO>7dKWd&` zX-M9W9jVqc6L|fS{@Etj20bx!+~$;c>jAAFIr`W*m&!L@7{b1bz5cP+-D1v3*s|0+ zK^>5S?w6jPLn!m)pA4{wtesHwb>lhWsZ=2`=M<*7HPJUkh9wwxpNL~7WP*D*D0o_? z1caxbWKyXq?Ofz5aQ$v7FJw(qwKGyownVH14^GkL9^bjTKj;;KNT`M31XE zaH*-{Y9eCvpBrCGe$LI8B+|*PU(E4KBBdeww{iU@m~-Fi%gfId%-v-$K;DDCuG?}%gLG%RVy;&oWbz5GY2Nl zR>3G2>VMmQL1sd#gA}*tV5iioMuQ42gs2Jek%uz!S*!UnW{e!=1@G4q`3WMQD0AuK zi3D{(^bSxETi*1@l&SB?Ass?h|mT$ z2cB?b!#DFGh^W@H#vo**(idjs8X2hPe8q@d7sgYAdp=CYcWJp1ssOefX(o{+lrJa@ z$?vvWBvXwN;4l8`6t`;jpQ0mmbR%o3Ea%oeRagIDz;a3FZg(0 z13!+5{gG*fo-M56M4Nd$H-;oD#|SUG;3Mt7$RSfCyn@!tK4_ zs|n2z^0goih^+&*NOhTxV@Eey=7Ug%PW@&gvl5~3F=||lGM0WiU_s==n)z^=IQnIY zkOXL^*+Vb8{!C|TJsycO6mtF~?ZwP2abuCd(tOULE+oIoXnGh3fg5%c^&mUj03a+1id#=_)!L24u9s^yv9F$}C5bfdZ!#17u zZco9p7R*~%a75HSB4aKdZap>2CcYuZWt-2C?PT&u1nH7?Y@vC9zKdN0g5_Foudu;m zgVOZ3WrAa`e`}{tO%RKs_iY2)}(WW%tyux(nu|LPXUG~)FKil?m-Py{?i>rJZ?E5lKZz%`F)-V+q!k&Anj^m^IG-B8>_i2Z6u5$fnG8-JG zP+}~yMJ_t16h$0TBRVy@sm+Blnyrxy(*ha_^StTf1;gi(SCwx_e!@-KGIv4vi{M{V zCLmUOwU|E~NTM>8&AmM6K7Ij z)qhv@9;(n>MflU7s`Z#Y<5K9}tD7-_L*b0G23faDYI}C+x9MHy`QtVa2HBuHS?PeWePMH=xSA28vw$}!NhT8OC#+wj zFeL~3&X(yksRtK6a9(d0;!GkdME`Bw3F3eVvTgZ2Nf6o9m8}sb;em~;M@>V>$Y$)? z4+$Kh%y?qcXEQ}yOBYD2=C2Kvn`7mPfv9-cwLZy*iL$HQ& zG9)&uR3E3b)Dgb7-F$c9)GT$O;pp+hpkMzJv(vJS&W`EyEL;;}7(fXAsa1`JEi(}^ zQy6-GvTPJ#1P zCevt)oJ$yqkVA>_XM%rmnTQbjgwr=MpT{ur#r@?r2G{4NP2Uil%Vd+=UkD+dGU(vym#zge^SJbmn3yGZ#BN1*;MMZtjn(& z4TtyaR?(BvOuAoPSu!r(-$m=Es`E`z4bsQjsOX|X?(>+K4OgrM`&8q_&DvwU~(nSk(Yew z3}FLx`}WTQQ;{0|tv$0*w*O8}lWWaLp!K)anAkAndS=|UMr6@XmLzo_>2LVRA#mOW zLkl{}7Wu?_w~P)neJhE)a_YgQUm+sZs!;v-vR z)qF^t5mpYRkrP3|aprsmh{Sop10%It2EG)7e_bMWw)Q2N$I|cymH{Q9=e&T$fLq00 zr`VBYm;OKe&~mtL`t8|4rp-7gcxgUJZfDf>+8H;j{Ruu^w~^><9u-PtIwBY{WyB2;Dyf6 zy0cVPjk|ddmA8XsK(OOkkIaY91mJIMi$Kz6BA=$nm(96y(uxe%_!@adFOklSp>rf@echJH3E57qs^I*lIa8g*u$GZf)w$N%o+?tme)?Q^ zal8 zYCY(O%tV%UKngG-LBXd9gGOaS#29k|bDoR*8LSnFabOY(No28B^h03IZJCLX^mQYk z6s8|#E(+@rxaLD#W1^{zL|BP)<|Q_5Di2s*^fa&pb|l4+QtcV(bEn$~B110n6N3Lt z88S)c&jbS~Bj05sTvB*ei1Bgb5A~cf@}1ySL9*4n=w@rmk9UHWhPMSAr$@o|#LJO%0p@Mxm{m0oSloNz&G>}=C&Yyy0sRDI; zWbc^q!{Lmx2RUUzQX@XyKSXdSoEf&9_Gp7Om2uKdd`m_4vHlYAp90f_?OBIhLDefVAp6o2H)Nq2qXF1Gyp>+ zO5%LQtobmtUvQR))9rGbe3{elFoSaPy{A2w;BYMKqt+>7KXjxeUVm5p@A5tglQ0+; zYgVsIj@(UuH_n*?$M)%6++H0*nYD_nQ|xRIf6iR6J~wS|+HzZAS2p76q%2h%q8F&E zThuR`JQ^B0H56>+QUj@eTzWjrexK>9v^_%&Xf}TW`+?jbs^97DB{cC-#X3XUHXy@- zVtY=PuY$ar7|@bgC+Q>Oyr4fE7@_ofGi}ADuQ%@n!4lfQX2%qt=7T207y&AAx{e;< zFB@UfzmHwh5SzXvLb_Ycmv7AnKJCgP#HHnfK)dCH)^d-I%~+8{GIP#B^@EV>Z^}f( zl20zO7CZCDweR{o1gt6Mdb*B>f*>gUB{uYtACtV_iBw88yh z(&RDCr`K5&Q>gZ-^)zNCxJ;@Emc<=aOz38bFY2nd^=5RVO+nzUo-{KD$x;RCH{3b} z4o@$AG}W@<%)O!GA=k^6c?{7`>rb!XI~iP(!qyn?n6q!8*cf`2J{LJ+Fz2>S&2@A2bxzoJs8Ez{jGB&?buiLh*4Grc4Z&CJdWUF) zIf^$>6O`{j>i*d6g`|&ZNnoEkOwAZ+Hi7CLtq>n0m6g93){^76Bu4Y@J`NY-i=8jm zNG-viWN<;VC6+B|EdceGaR#cJoaSqtE&4?LU=OF1Db z6LM1j6QgEAsPP100u&lABqD5~b6e`)!^vXhO`z{`@@+UBkIhtCCN>sdS+I%Pmiwsj%0D!{Cz)>4W=OFH9w&j8V0jy{Uy7GM$r%(^LZt7i~O)ij`p2!-*E zO&<%jk8x$%w0)hWj2@G@$OK4Jf*3=a{++_dT>j34p1b$Mv*rUE7ddaD+ITeiz{Zhl zdjk1s%{3n(<$#k9TSn3(pC$}(E&Aym7U4#`qZ zNP1K+wZEnCB)or7^o{$Y!)bxBGZZ%dE5&CfSfsXqW#q|ZZ|U<@7y1JGS_&(($_ICP zW`InHlLKP&qU(X#$DUvrFP}2*LSo3h=?gr03L~l7qYAT=IWk2mOcQFseCkF#BTJ}3iSrdwUUC17?F)?DV3`7o zd|DS=fZ0x+@>E{y{Wmur(epr=Bo`wilSdRxbLDs2`xM4}_P)qVG|#&8h!T{8~%-^Kw9hHnAv6Mj0msn1vw1 z%0(7qVa!WM_L)e-m(Bd&mr>t9Z!VA_lc zaB}|>b8Hz#8uL_2N7@}bMP*(bNmyTxJsx#b@1+JO#Ah7Jp?P-o?~+gNUNpNH^rw{b;D7}WsUM|!v=;A~oB=i7 zU8%fR17dD790K5AG1Gjno4bPuUCCY*86qSH5A zqLL{Wtpga-mokGiQkC!yp)5(vx+#y$L_jGeATiRdk&28!wg33?zv^?FkxtSl*1omZ z5aA(F%cV_c4#Mset#FYKANr-ogF9#<$OI#>F+s_vO&%5WLH#-%&`_y;GPGyPR2JID zH6J(=L#6Iap(M-@_&pQDl&I;@;T|UaV8VFEeqT4z%GRKeH6q;nx<0S+Q*M7iMgr!a zg0au>qu}|%`_F~h=Q>)th!8Lg& z>-43Td)jNqJQ@wEVYiA9FF&B?WzI7fC{($OmW(5};plU#{{F3r$ z(Qo?ux-p+~mN@-M>3hPyO68Xd=CS*QKt4(JPdLYT+NFQT&Q!#t@8y7aq5+zDih(T| zJ!(NDRsx6MJa*gjHu{<~Wx;^f3Ugm*#}zJOsu8JC&4*d#kfRIn}A!or{j?O`VWjCInx?ry1RM-?0#WG=EX@FRBh?=A5Zs z>t3t%m+*HPK8sBs%X4h~5S+fLCL~5?Q0P5*IUrW!NZ7FSHCrTEO2hV^Gkq>JVKV9n z=gCRC`D8#MMqa5vZ(Y{Iu~Fys4nSYxWH>fswVhmPxylC@Fe}r3AyY^g7q(2sW9la2 z>9@m<9dD7{=-6?8n04zE=y621=1`%wKoX-dq};j~!K&RfvZ!Y=3Y)eNzGxf=7g>z- z+?08djL$hTS|*BS(5o)+E!TA~L}Io6Uwq*-SX-?Hn5Er(u6HvF)CP>aa%`Xnpv&ll zTDL>Bm(8C5Rw5m%nx99PEQcRVzdidzIU$!_H5$72>c*0Jo5x` z#yv+rLS$DG*_0SBCShvr^j#v~I8q^+Hv{~Ot;rD9eBek`wh3u9A*s=qD%CPJOl*0; zX=SQCagB*bvW8>SIDpyX(e=M3EG!xne%l>ht}%lg`a}`^Gs_pwDr=og(3` z?fH(&q;GWRs-`s|Tn#I6RJ+Z{!~268m(i)#_OnNq=A96AVd2~bGoVYCgRC_n>W-1i zFS;h@fP|16D)JsuzHQET=>D7Jw@f<{d5KEjvE~EY)5c%~ClA8sF3!4>1EM=)u`%d1 zr*EmzNR2lUhP*mS65~!pk8!4O>wc<;8%M2Ltx#ZRW; zI&@p#I}6Jho4zTt(jw~X!5ObAxSy0Vry6;6?CfqW&eINrPCTC)*CABZBG4*G?{d}p6C2Sex> z^jv00Yu^i#&Iy=DCd9P)Ysw(`{-8uP3*{i?D0_a)sec_Uo$tmun^aTQ1eDPAk=$gCd`(};r4U%+~#DZ`mBt; zuw_P_^sj*-CGsMbN6H`|=?BiFDRIZ@HkABHy`NsL}G1`*Rqit zJ<_MQ6M`;|tnE(pV?=yyFqqtWNbdnLoL)r}Z5@zV_`b8}eU|%u6n7D{Yq7Vf2*|ddb*I6kPp&`NX}Y_*tLlx<{&gBfW;qh0RD}P(Ttfx7uI@`b1{_ z#r2zD!q{mACj{4or0cTyz9n$`?8@N-A!iv6L{IYcag^^udxJBAbXysDIlQVtnI%|LDG9Sp64Y3ZA zVU}qpHhtVTSAJUblO=G^9gB=L3yOaCDlWK3uWqDHEi*sdx31&i=oRKmkk*w%W>xLS z)GKaG$g7Lku9z~0tns*bY%^Z|##^VramN?oD$ep#LR*VqX`xP^bBt`Z^h^ovpK((r zYGPcRi%|UFYiyA1R|RR!>ShN-!3}@@i#xK@-pJrYz{o3><=B~tTDMn^@!*<}lTJPX zzH{BBq*|SO(*pSE{SPP4^i!}*I+z-dtG;$};sV!%1eG6RW6RN(8ta7d?lS)lpR-F9 zn_pwlw`M?C7?i+xFkw2?Y)W8C>G#q|uO6urZSKNIEEVZ%qpx9HtK1oE{#^@crI`+4 zO-Lr~n$bo&Gnk(4q*>0HSM;Z9r`NFB1pvM~V*>Q;e`2%k6szV6M{Yb%p9?7;c=N&X zxbWU3FsB*~95HGLoHvTT8F)NVucZb` z^kp}q8|6V`Kp*)K%Y%b`Ps02J2VRIESd?+p>M`}iJs>$H#AG%&Od#c4rIB2W2~65G zh3a)}hLwZXVX6?6GNO}z6GTEWX4%UZd772G|4VFnpe#nV4pG&?yfp2B>VnKI}3;zBpV%pg{VnHV_A z-|E$QL+qy8rsnSbNagW@;mvg-KfLQ&=-I1V9y5>c`LLzXNUJ5hd|?cz!^VQEd<)p2mY8&|`!2dNM&ws-pQ3;FyoKe{HENj$~S7e>CZe$t(+q(3F~gVE{H z^sg}(g5?M6b4~uReWqiBd~39_;S=(hqhBI3DOuk#@(`20$N`bSSaL$dM1HaHo<$%9 zkyg&rrXqMg5l&M(ZS?K;fYf7tauF42CItI@_(pZh4&^KlNC$6tVG~Te=$Z_6b;el( z;lk=AQi<)L$QuDeuL6JqFSNO{1ULp|63AGOnf66fNGZn@Kd zFkI!KU)&90=9klZl68>6j`YoZ+Xn#eBUw;vwO2cUgOn43?r zVv{x-oN|iOObEU){j$lUL1jbK^EcmYgdqc)4h=H%d7}bgCl%9*3TC?AT}zLjl;I;@Is5DFOAHiNLC@T zTgHkd(xgr`CR*fxD=Nr!)4@oWE^&)nUunmy@A>rq`ss7wk?IY$D)Vt;8nraEtsIuo z=UtgSRX64)M{QazOLQDY_PWn_T-quG8yxTXuw@GGn!gYhR4?XIeHwc9AW(HPYNAwz zWZ6T@v#wq=ei#fndvNnDQ?}fch`{ zInpoC4gEc`Dvgm^3{T_r^=@H9^CDjmH9$F)Pw;B*vOc-(RN2>hP zf(EMr(U@0{1ct<*yI{Vh5jDzbXzM?nVaaq7cQ1#q#sf#5yy^3YOf{oVs`4;eg8|)s z*R>TR8D&0F*hDHX*J)16+X4Q(9h#0f z6n1_5V*m~N7&8PR4c#N&)fH~btH}-UUA#2a~bSwev ztaRj8GqTf6h7Lb8I>Cm_{q{E-Vd6#8;Kl0k;%aW@-gPZ3zJDn^S`A{Qj)j8kKDu-T zJh9>_QuR%|s+vJzGGsRX_F8X;)7{$W3ufk6?nWzQ?ubu;phBBh9kp~=U(Ehg7d|)NYVmyfjuhshM z(`g#6gdg!c6gx=i|C0t4`o$CXlFeiKi+{2NZmZUeD9F}W4YK9a|HMCe>s{#Z%jcl| z%HKmf<$R#u&d(nWJHK=SH0{5SzK7DyG4g?(pX;a0hKK+ANo&_f4F4(&`NkJ3cX>F- z->o+mo~CO603ZNKL_t(7fJN2QVQ>R_fx5)W$XVYOdC5&s$$LCldEzo3fu6tmLG$dH zrvK2r=zB}>e6*y$U5vm~f8v@r(RhTJlAO_HfJvAz==dIx2baxbx?HUe)ipveswZhA!H6L7N z!~$n3&Hq~VSs4spt6m(Yipu}Nzhc&4LyplIq%T zUwDUWJ9vHd+NW7_D#gfB{&IP*UgOi-&Gpwe6Cx=175a`=@wDkSmOk3AR3_w`L%yBd z5h4ljDp;0+YW>sT0dT+p4PN{Zd%a`Rw`EXW_@0wbY8)Zx$DSXf_snHhgf$`D-k!uQ zTIxL@Hlt56Fzy|1`a(~aG7crqhIEsaz(>T!3lV8Z)5p0?NNcP)AcTeE4VULWH4~By z2#&0&)3ENY);A0vH3UYC8tT%`+`H}n@H*^$%>&}^cb@l;u=AuN#qZl*RP%N5$jPww z_ZySf27TlZ7;c=-@apYLQHZ)$%$Al zSSz83Pa@^gaF0juOhSzlA_aC7VO9K)Nl^_I#jqjxDe@sT&vK0wmP z8?xzd!9>+;{t5jn=pOq@$o|`FK!~GibB%MJ5>W%9r@@SvbS|=iYd$bDRG*iL1WMo; zZS;#6U@8)h)1+KP!3O`*jW&$2C7mWN^MMQNH6=;X7uI~>&0Uvjb=&Q;tACgL(|4|& z0R0A33Mc@UIej z%G6wnxap|g>++Ni;kCM#Um<~5t9{@6h}ZI%{WA13_`WW08>fPTE(Reme_!CBY0aF8w~Ul0k`E+9}D^j zFdS%yUyCtlhziN1XXfVM&Q=v9I~{u6Ub=W6MXyY%f8sXuflB9<7-nELC>~TOdpj###{A>+&K`| zbM@=d)!xrdeoYO#M-AcIuD0&JgT<}LjsCChFC#~@IR*kSZhqQP6&2N?H6u2DT%P>q zQ{6oa-JKZ%93aZ$Wk_>#zXYpb7KmyVxM}p7IoyA{*a?3y7#xftepOcJQhAhq+@NEf z;8vZH&X>qlcubad9q3^qx6T*S?G1QlYonY>h88Wm0rJj4C~y0cBAw z^{y*2N6b`|2JCpRk7sBDX<_y9J|aDOF}U7j-RcdE>$&4?23lHZ_9x1cypiwOb5L<* z*Wk6E-Uw3NBBPG}i+l7(-4`*32#@SD&7u1WZt6{+xp%HrcC>H#v!F=alpqKpfmV=F z&f=m3VSKC9RVgZHnn6o6t0h8)cezA5l9;+11DoU>TAQ2+3lBm^Oc$D%qNxy#Lz+B2 zyCe=R*Mtvik7R|L8re{Hbj$m8@#FLzuYOaYvtZH3s6bQYL?GAgLNW8ZxU1}ONN?MF z3d(n(!DUhvomhd|;Gf<)Lz3~5wjVb80&8xTl*i0P5?(yW1-O)Q$i@>verqD&t!bq<{STV~SwfnDG9^lGB{z#>-c%Qdb%)$$GRLa&*cd zM3Cnu2Zi*y4MwChg7~-ORu7SfH3B6A!bfHsMbr1SpRPxGWVNUVa2U8G7;nLscAZ^g zo1#~xZ6Y6;88sCug20>;VabB;Wtvt}jQ<4b&+TsO?UQ^i9#d;DwetZD zPyHuTEX*eUPiwMicdPV|c_ndfZ$H(j=8~<#=s9)$h54df=?FZ$Q~Y;B=WHhvM=sNW z3}sZ>H8=}lzmZvn3MF2h5s$yM`>5CIe(AGo!lHhg(~E- zy%qa5C4ze3VqBc9L}rhfs53C<#!} z7d)k!eP-$Om!eoCnM>#xp>kBP(H@K>5HYwI2~$R|YGovZ-BD&^NB)@97>CrV)NWIh z*Gc(l>j%Wn$nWi<&0KKTPtq1s5dkY9HZxVtuz|7gH?yf|$)Can)aZVPP}z-xW7zQH zBD5|a+3}87Hkok7DjA%Tk3^~vXo|jsH@s{EFu1MyAsl_n$YYDo2;t#+JxPY8{9a%p ztG;KG!3)l*>uSHA^W(vjFVcG61HQ%m1h5CV17qaK0{Z;(nlJH12(I1BmvnPT%xH0g z0_ojki$XHY^7A^s!yXe9k!0Oc9^$;-Y7m6I@#;mey!U>p>7e&fQ_Fg0#!4Xjy#={f z0Xg_YKgsAjsp^1SS!Vn)FH685OtoDdqEumRt}Fp=mfv1W915QYjLVRR@4UyCocqc+ z+3Ib4i@@+i7ovtlBu9P362>Lsg;Mj`Wtj&DY`fPYzd@htO-xP-v zE8U5@tO{92eU`vdcCYYv^|1{fK544F9z4VBMtzy6{{;K(I{EfZVU~K5KhUF*%ag5pjnGIqZIZT7{oICq-#YMr+V{MOHH|;EAA+&qF0?j4G)iWq3Zn z{33?x`o8PBBzD6V+V`_7FYVQC=mrX_yHRZ-cYeB#=ykqWF5*0F(A0A}PGTh0h@{_n zDRwp^sfsQ=phRqJR5(NkgGxiuSoXMSMOP+YGJLc@C$S9AIwhspeFQRfq4ll(Tc0R| zsm-~qkNa(l9$6r2BqTjLlv%f_x0M);2^8C`bg^GtAJV33OtY3(G!W@3T+gP!OkMB6 z&pbM+en-75=gu?IfJ>cJc#hNRy)ODNS&@`^#~NrFLxJG?l$WlnXbmL_rAkQSxVCh5 zT9z*|)606$e2-~!TvpW4$n`q?gqtY5#z83>*KMdqOd!Tf;3Igrlzzqoxg(Bgn~VdK zV~NoP*d6Ga3J#Gs2Ksx z8=;-&53~&i?d8$AHxP~LBMXZSnAF>IIX;RF=qzfhf1b;{1+e}V=IfHF3>}S{S<A9S;d?Rc{a6tpVrK{4U8 z)vUc=Xax1$Dp{=xBbRcaj$zO|==+0|!ne5mrbX@Ty&hYmDEH^@?EyYfUVjKIclJMX zVc7|WB&>@9F)EF+Xj5i?%i%R$P1B-(>1kA0jrg?~BDe^FDX%1$z4l=d`NeOJ9&or7 zVreR?S5v9P`F~}+Qp=^%6D2G*b>u4id53@*FiIDfYA%{C!_}L|Y1|MU!09km=k+!G zK8agvi8A%|*SNOzJ_UC))-_Wb;_tFkX2Kei+|c^~cp z5S;WBuD+@5BhG_(bD_k2INH%FhF@U&5zB&263CMzBr}Ne=mt4_|J3Q@>*B-O&jDH0 z^|M_6Mki{o7(d?bHW+e`9reS-qe8aAlTwsl6aHtWEjNv6N&Xkpw>u6y-Tr{#+`NWl zPzN?f5Mx@XlwKYZbK+llpyw|p)NC|yRYhE}ARnu%m-VD@&kGw2S(uDO*V{mi_#;6x8U{|AGkv^Tbc1}!Q?ZWo=8E)0~b1&p- zYvJ$Rrsb^bb*BbnLGQvao}7x&8+s%?jWJ4U%-%M}$I2p}T zr7y~cKSq$`kz3O8@+%sEgxuMQogp~kXte<(q6L!FD*fC=*EMFY&IIBKN{YYR49gZf zDP<>16_nvu3SOcOVRScF%_^l^%Nu70cjlJg|9&=v2)CHA2(-CK+)akcBb5r1a)g!( z7`_k`(9xhO;!Gs5Q;W)fXhOU-^tkhi^!_XjX)z=Lc;fCq0<&`x`5}J-JEos+@|E}~ z^}MotW2w6>Tn3~u4u-MG3-IW+P6C^z?Txr8|DsowpoMOcW654>y}I>?B!XLqh~8Nu zxj=NEgu5`j*B<38?!$%K5A(_{?w&UGV=e;=pZa=nCjv^SG0-)huyu25bIV=5vvZxp ztXCY~!odGAGm(1_{o7(YN$U{90akd43-w&Im(=Wo^usUy^CTAJe3zKF_&r2Zd!t@Q z_q$|CG$Jsi>%=ryoGzVf`zP7K!#jQ|13_m>J&)mt>~+(F?p+2?TQK!v01{_RvU}o= z|Ae1ofO#Y*<1nN+1X#X+Ytg07!M#_y)~dwk??tN= z<*E)#vpLZSW1-LWD&o=Lr#f62zz!C26SZqUSvkD}bDWu;kY15v*}RhpLisC{;Jo6{ z%acki>Nf=HA0k0CUUNm)3HI3|#Y(arHySECD6f-aPmVknv!tys3aaKMbnz33;@WRP6Y(W)lGr}54IQdVk-pYzu&@0BPJ>Pi^$rAyhws+!&p zlk6Ol@>A&N^3(D4XCHpZKb%M50DL~oR< zPQAQ9X*8T=3^K1@+CgI#vJv}QrsEDrEEzxXR+VRz;q;3fYMmFLgEsmbA}h{sGLDSs zeKlgko)K;1ARd!5=hp+&rsXovnKJ;YiJX;#cnw9m2Hwcr^9$mBE3z*uZU^^SYAZzW z1zsUG%MYLOFwX8Zc45Hp{tEQ_=y_K~?4A04m8e-mMifO^Tjh)`+y zeES}5DyALSSR}xqY++5rSp4p1EZmf8W(lZcvb!wBt1~&6t6FZpcSuW~uLq26%1DC^ z3qI+1T8Eh*5U78F#R2uqFyvz50z=5pp|IW zKAenyeT3OnRTZ~EbqxMZ5?x$aU@&5QFE*Lm7hJTC1v%gJu(L+Ir>5yQc^miJ6ZL`s0gpit4>ptiw+@Ld6HGo2X(KHakSaQ+)~@iv?liQ=W_6|z1j)S*Sb_sw^*Z$(ieNG;p_;3$zPw+{ zkJ1Ou2M0pHy}ZLU7j5D4HjDPkt(u>)5~A7R#s`PT>!w9?%I#B0D!}lrFQvP@TZ*v# zsy?u@kaa#$o*fqUVt5D&-YVY^LWJJy-Q@5^;yOVB`iL@FPBcz335Ep{UfiSMR;Lz$ zN#%X8;u$(TgdDgKD@VPB``ky=Eh+bpvTe&#j{Ys?(>4}|OHMF!$X>}mB`FkmQH(?o!*n^)W6~##f z(o&5a`q&(+Ruc3yu;)qQt4(JD_^Jsxx4)mp#@k1ezU`lvv7+?{CIF33tn&xS9ij1@ zKS{Gxkh43>#*HjrepgCa|FExy*{WD8<|dwxMA3i^Vy{aVszBZnup`M9i~IC6#m-(U zx4TmMZzS`;L{f(pop(_Vwc{DHp=)nJfRn1UDNWMarOsy^fA$nVt^_;MUHx+364QJw z+lN2M+VDo?>8OWY=$=h?X+G#ecQ}2e2vhVv(|2NmeJ~u!coR-$F&5G?XOf)2sw>H8 zqL9Wg`^{z}pH6JsrFBGe%QxG|>CoVED9^Y=(Cw*<@Vb4UH3a^KDZ%RYWPOJ%o!gx8 zUlO7sOENBp=?wZZ^U?9zZ{!S)6(1$>$mkzJx%wsEAM_4M-Zy@?$Ax6F6V@RViEJpx z+oQk7dJ4B|H@i`Nky?{Z10bgtnF^%Qb zhF2L~G^u__d4SBBH_>3Z$cCWJyOQJ{A^o+YVdfzD%Y{O>g?Ey-hvdc%Ig#p*z-!@u$76$eZ1&R|m{uJCg zs1W{LDjv*MeEdK_vVg};H>HzZitv6e=7mhX&k+3iH{m#Tx>*SR`>h1Fqn4Mql4MLG zsQ%yJA(x4JGUHMZP7uX1>e(AJ`7G4Yh9`31-*kIsJDe-;^-_{%G)Q)=o?XQJ-P4=a z2lf#LxCIeQPO9 z#)1UZ#ru$w!So517LP_o*pRLs?d20U<(Qo*_?h$^273{yMO=r*14+sYC%Ogo@ArOD z*_l+8$<UdV~=St*ZBioo99PeVwhjIrVD|0xvzYCLC~FtJ^>BuT&p6%h0_w z?-IRBvl8Y3cFG+${B)iqOvBI4%EtVTSuLSB1OQ{Qn_7e5BL(tPWiua$&z8JCQ5&!# zCwfknx;LmW%r>-H=qbeRiP3dnhIc*$i6g2j;kA{QIRNUjxh1~pbRRTl;!DPvmQ7yr zP>*I%m+?LECGAky8oGK8vt=9828@;m$nMKUwiOq99C&ZXK<4r~oRoBsY#>Oi*;MFZ zetV+yKOa->jM&IR)CwevDdbM$ki)lvrd|8IU@M^{b zrVhsq2ctaHthAQu(7%wd=rJ9_y^2x$fRs4F6qm<;F5eD#PLvv^5ox7gdfCWdT*9)s zkyzS1T5fZ(7;#Qp@pjGe@*1b@a|3lICo|_yHm_?JX~>jgkJqBi(sVEwao>-)u%Uc# z8^=dJkyHA$t+Edp-%sL1rChL$0WGlQ$BNbFmcEjJ!d zsmSr?@TzGGnRIuSYY{Vz3KhfPq{naHa6MvKeTB9}zQsE~Yuoa}b(dZT9tn5(;E&~a z(%U@V7&t*pc6;?dzi9s4`2Pr4ZJp&=C+0`KZ3-s^Ci-1(e;*j04&8FpFWt*|0&NZ# z;SJsY7>y;+ZRN)ht)H1_vg@M9c{AJ;GxGTtmi(?otdU${Vg~`n%MU*h>5MK-mmPvg&rMu* zPlI)?0*)N6`=$Y!BoJ(#4^SQ`<9eT^x}UGOvvp1;jf%+m>reKR!pCTuIvp!P?65C4 z>?lVzd2VH|StW(*;DhH)46Wx`shBlFaDv!og%au3tipl4%ftL5qI>9bbRi0NBOzLZLVU}rMpXEGQh30DqR>4$iPH4TJt{cav+ zkpri9!h07d$ZZCqh`>x3jK_+pDNtrerqc?_^=VQYEnfV1#{Ay!Vs25iKSsn(0rb`~ zBHv(iDozzvCD>c!SR)v#7696vm92qn)3F$5s4sOj0kzWGsDxt$~04D$=A(pemJ+&XG&0tmEM7p=;RAu>mmDedmHRG zXCI*0f7a-ZF67fArmuuK6LN*+#LnUe7Ss=RPA}e2F7;)FFI5<&^%| zIbwvEcjhkObI=yK@FXHSLekhZ<0rTNlh#+pzX-yv)s23gFumB3Ldr2re`9Xwc7P`R zQNCkb8dqDW1O|m}R5ouoL^@qkh0t21ga`7iEmc~S<(h;Fha}3NhQ7L4HO%0$nYk5e zovV$Q_EoL-up*D+VbE1bfPeoEcsI#YUtO6%WP?0Dgmy2x>{O+U`HkE5)&1SCM*7!K z_58>F&L`s4mdAPY%N~-H+13#=OE>*bSZ-ub!*4&0D&yN}mNQF^*&oT+|01o5tZptsn0?Szi(ZClo)X16|)2vP_5vKk5AVBTnm6rIJSQkuSi z$+r^ughuy7dQmZdl==x)MXBLD!EbQL)<)jT0TL!^AgCY3UYBnzA`R)w#LP}Dwwbfw zR+=B6i_S)~_U~qY{Ao}c*B4!t$M}KVmGpc(i`Oh83>?ZS?DZj9xIs$#C3Twk`Wf1@ zaKEAO>i4Yr5@Rbc`=Cj9KT|(^Q-?8KW!%}DoUiv-bQ@unQ;@lV2r6{1YE3uSa0I;;U5 zj!i}W)Rrc-Bt{_M1({>wG^$uuKJ)V(@>qI4wgw^6=%36gQoIqHAU)KhE+BFLda~u< zr9@n=0Qorn5%ogm!_v@SL8MGv^N@1NLjI8FqR-g6G03R~s{5+F;4rifN>BZ@?_D0t zK3~wK(OxGPRO_Kdccdwx82$c&L&R1@#3Lqs;rRPaX(fMSs~;|p4Ae?=2F%#gYq#X_ zL09h{$gv_FWxl;dpTI@lnX1&$-D-jh&cObN`G2_pvFrnu`-OG0YUf{ivV6=y+e2_X z43P&c>CO~PE!^`K$~#P}Q09NioiMI`cJjkpqMc4+l=FtREBl%*orks3t^Re1jl@Ra zm44cIz(soRO3kKNTiair-vK{(yJ z$J8fC!E!wSe@<&ndQGOgIosd~|3_Mvg+$>|Ol_{<$QoOc?8LqQo&lQUJMf?D=6V54 zg!?0}EiEv>TqQwACT5`hq60Bl$eo;voBMOS+u5e7)P2ywf{=lhRSNRaA~a-ow{ikt znU?5|%0+mr#Y&5qe@sH!FY{P^i;XF?+ulO%_{jk&vzg6IT9*sjZHfPi%z>G{{@w4+ zKX#lb#b(@;^L~WZ@@4UY`a_Gk@QrlXQ^#A{b5bvK9j0M)r!_ax*CW#`Sn1$P?AMx$K0aTya9B)SKSJKeJ z5E5r#>Fqoz*0v;A>x85NO1iOF0R5UF95-8236V^f`3Q$Af1ivzLK2@mBqpF__z-__F-UX`) zt=b^HLWaE?lN%9ux1(KfgWvS@<$VkU)nCYzDE0oTYO!)5kXO4$6?E88(Q5sset!7% zG#X6e@J)rV+Dc8&|Ma;XNBqJWoab@MpydL5=SjXejQQnkqlQA@;gHPcgw!|n&5da1 zVcv+TNC+$w9F;?5W&*{;d49Bgq@JUTDvcZqF3u%6R#q!rw$6$5?Iww3x9+$g<#0fR zbEND3Rg4L(g!>2IcYHJ2n2=A21YUkYGu2KuYt|wk9ncmmMV=V~kMb%9K2G=s2=rx*V#a@!1Wqq(|&3iVv5k<{NKDf^zF!aF`x$WIrA|oH`Vyl z%xd~@PkYf_C%SX&mNgaIx!M%Xs!8Ko(*iefEhn=V!tNpp3U#!hvzIXUOo{)2#>0h_ z1|5^&>&(s8PcbFhJy8%<9J4=TApNr6Ao(ImEU1c?2I_tK<)dEo2|fO)>T~i7=>@aJ z-)ST!3U6YKS18^E&S_N^e1YB^M^oTYZ7F6n*o#=b-abmH!rG~iaWh@wkP z-i51IuIEa*O-%o##10PkSC>!MW#^zBa;cyVpL%Syh0R)n>LB_GcZsEa{rT9kOzgdQ z@ZmB(25490@bjF8Lk)Ufqxvl=5Ko9i?}-wTBAE5*9&>N9#mt2qyluf*s08J=1(i+=`}4#^F+P|P z3K5;wBA2v=5mVV2?mgRo#@}Hvdd#NYA1SB{J}oMND}L5i?@Qef6 z;^WdK)=(8AY4sKMu>wSQAuLF)k7xm6a=ppZvLQ1LVbQsO>RAmKK4U`pc|!ws#)pQR zUP><}ef0ismr9$Pgcl@hw}BVP({%MS=cL3j!m%da{^K?C?sgT=s?zTxM}fBOx38U) zUGf#&yT zcbd)NGN7-Mm-KJHNwUz(9JKGZEtTH*pXR z$)dfJlXUie%kC)3w_-&wUpX{#Ir1y5j1KIHsm0*F|M%A@ASaR?km0)Mf-LSocKz{2 zf`??jBw+1nqoOD)MPa;l= zs&wxD^9j%Bri0ra55!;jWmR3|GBKa?Dq4Hf6{h(J*$xwjn8IP2dkwT87`Yu2lgWCr zhF&Ga@oIiE2Xvk)34?!xUqK(AsttMi_1<|Ontu!`Th&@t zLB=-vgXSlDfQ-vg?qU=NL|?}Mzzn(VEEcj}ydRv*I+z(h)-q7qYnj#cVU{YQ5Rnf9t(R|Il&B9xEOqq4d{!<43fv@{&BM@s)G@nc-f9km-KQ* z6XWjm4c*U;{y}mqB={WzCc#eP3*Bg0y!No_{Uvqy)wZ63O%e29b*k1NZ`X@ye2wR0 z-phkUri>+jfS%aha5YC+73SIDDD9S82%+I=*#d)Dk}SQe`r&OIib6qCFRZ3H>2Pmx&eZdI#dspw3Q8RLVoR5$6&kYfDjCn z&Aiub`)}e^0Mg890Ttadb9^ba5>+cQSmRqa&I67b^HCNpO!n^g#DJ{AZGt?-27<|| zjnO=&6VJaTC6O_YUAR4zyp-#EOLumj#+_<4&4FL2VIdZsVlyLx+@KA%*qm;B8p+fe-=J#|HY z9C0VYt8+Z9LhT^4bf35v92Fw)aqU$C-u$SeCE@MJ?#PdQrwQimszG++B8cj<^_gqE z`3yRos~x;o{HkQApF>=y#7e}Ep8E@d)NBF}z^hPXR)G&gyfMLCdYwv~lWFeG3vr{G+=5&<>LWHxd$C?lF2?8m~KN7dnDD8iK zHylQ&hLO<$2QVij81@y`$2P6lMGTo#>cnWd6dDb|OT9_Uusn6RNf2e1i~Hb3rjR$>sQ}a& zw4-24@Gk`E&pXA@Y%F}EF8iy~5j-S9N&H36<%znL%g?CXWCT1NNQ@O1pY;>VFDbKpx5wgQV~ik-oZP#Bi;mHq zHFKQcU^R2>Apr>^5t34GfR-VAz4>-{U{u~Avz!ujyco^uOT5}mtel0fAi)cV578-k zyvzL-+X>y6x1A$$bViC_&zMxDyeKe2^1WEOm%;S%FsQKfTIHgRpwDiYKl=c>6V&p0 z9ok>|c~CB{TaW-}*eZ0()xzu1)#84@%>rUUAK)j|SM@cVn0k;Am&0nQ2rbriy^PA? zwJbk$$RH!4zFsKa?3L7xO=(HJK69qq*Q&Bk;e%m}^!APC6z=>F$`;9t=+NEupm?x- zt0m0G3dzfP(j)jIp#-IQ=;Zwi->C{b=*?x+pg$VfN;76EOu|^4YBxGyo`}*oQ@I=X z7qFR!ki-~wP{)#1z@n=|BWSb%K(g{|c! z_ayT+l&T-+Jr3(uTKu&**o1Gl?So}6E}i<{VcMv#&&IrY3Owbl;>Z0&%FH1Io< zt)ZOLG&pIip%KFWVkBS8DY+J4c~_$JF`2oZ7Kx@_uA6_>9ML}gq7#jqQV4AI7!wp` z>j~9AEX1EkvxElwQ>aEFnWO2u`b}@}_!+dBfX2$~x=_9sU*6@YkbuOf8aWXxUhW7 z!kH%6o!2x7wnrn&6Zqo3^*mUxTrgXmZ6!iVC{ovD>Y-yPPh{P~p>FZ@CX!?P0-xo2kJk;OUur z&+H~UQzu!?!8@`a0KN0$z>h2mdg~~i=|zUp&hjK1KN~n9w6i+AXL_8L`@Q&~L4KdQ zO~`rZ<30yGOKJCG_FeE1XM!QA8UrqSG9ksUm{-8bv9(=0>omB^DD?>Bd-e46zT`YW zk4kfcBX_#;E+4Px{ZPy%x<<5?zMAD)MIJR%F$27T0jQBk2fXvAehYw`Yd=`(^R8s0 z<@v&qSby~WY!)v-2xIyxe^UNnJtTte*XY3GBE;p-D#yHtyNYNEWVX*CekCFa_ZD%Q z&_sGMz^7|M5PvV9J-u!HoRS|!rhPH?odGXh@rQZ7z|XUfH5|J8Aw|}aAC)DgBRnyA zpz`K68SxxD5utl=5}GlMz|8XU>MmiYlQMf*O(Fai;{PC0eWbA*$7%5J>uNQL-xm!a zd01F-H8F-JA`P(lZN1E}NjfqAw!_)w_$tltn$GEiOwsrUw4Sw;fMD-I5zOWuLTzXx#AgRzsy6-S1F8E7CL9 z1J?Zhq{;9(hML#2vsQkw30)|cjYo6s)IbJ>Al?AQO8?I@e1C5;yY)KkrY>mJmG{va zZ6vJIvSzfDrrd4t_RZ}H&@50hra6=!UMET&BoSKVMI-&hlr?+hFqR0Whbw>FP`sGnGqj-zfQ#Et88KC@S)Gnw|4+ic2W>J3eTkYUbN ziGTK#Vn>`-P~$NNnKqPV5N#5H5XO7%LjF;n;In zResMiQD#>NMJES}B|1C`xzvU5zB{wdwyJYZ0=1Q>&tXOo@9{?PU)XJ9*A~O*&cniC zCULrqu`uTAq@~>Su7-i%O~i!t>Dt&ScPNrkcYjNMmq};i*W0yLM(d$QPger3|9S>< zSh~1d!XBar^CJ$*Oe#1n97l2TgV+HuJx>_*At; zy?(~jcCuj!=jyl(aVIfSFuwWoy#lk@g+DXYyZkL!-~65lAbv(>1158`V$2_t?loS8 z17(^_aZtGd52(qGl<0G|E|QEv(3blLWWzxmGF*xlgx^T4Vvw(cL(Untu3lMf^2+lp z87%jzieP_1KH-DxpLC^qj<5n<1qHlaPcL#mpbU8o`mo#4k&7B29_R_qix-#z?5ca-*ApEkivG6()jy_NQQ z-N>oWKAujk8!N}5-d21m?4BFjx+oBjU0&AUw6D*`96LAXT^Mcm0+j&p2`p;kk@t@k zs$+dMeJH97+i(A$$429~3ZQ5*Tm5bnPC(N9W7fujHsRT89k#$qm_-0O^82%DcjW(U zgNE~^b8sPAi-Hngiy@<_L?|lM)GdfKMkqGj9>DBU1SITfg+kBR6UgkWcxBf%y73kY~L_MHs5cr!M-=k{#<(9(_y(|#L`}`WZlF?9MFu;<#0R~ zZXi1S3-xUP49Std1bQn~sLP(j*7UjGA4V=F79&t3F2HQw(m*=P+3pcNkItH#3H^@GW2Lwx6 zGNcGgpEJUDJ} zmnfSMiy)3qjn)>H2*#=?EJ~WqZFo^yd%0@uGMF?uPGf??t~6@0T0DVZpstY)h=YIA zIuL2dCZd4KEv#wXF$agI*w4{ZSwD<|jm-0@_%^=O9Kg3m8{}B7#t-Pc-+RTt!V611 zYis(sbe8t_3(XG>j;I22#0NstA>#PorkBG34uRy6Tft<#Qwhy)ea|RVj9Cv>viOQX z!pV*qf_KICmyi!egR%@+=BR()dxm=`5|OQgBjKBWnM=Rc!b{TlSa{L%3FBb@#(G&h zi8T-n-$-T^UnGN@D0gtwm|;KubK10m{USJlJ%c*ssF18Qp45i?5Vhi%lL$Z(>o_eI zx6Sm|?GvMFH0g3&?L(p#kS3AJt}Y^%o-fc9l#`r864AIeRo4-jac=o;uL7O^qTcA& z>$L7(qS83U%$K1JvNyuMhZ~Hl_RE-8ujPnJE<1nQx^)QBbNt`!Q?Ab+8F07}3+RTH z7i-5S?*4iMZ?K}vV;@XU?v29Jamit`R>!QJ3&hg}1O7L$`>$(>-El%yye{WX%1*7{ zq~g3%r-2lycZ-^JX$8|qyUL&gKxEEjDixj(S-+)!Pj8PEIu9`R|IPais0V6!??PB4s$ z_q^#;b`UcWE%Mp$yOpb1w8cdAHuF=M6v*~>&?Izq(A*gXU}+vE!Zd<{lflQ#uIZ;A z#0Q)D6|csNGE#i=q|5KkDn za7HWo{sOFb2%K-lW^2sFWz9sGRL@~|bz1q`UKNTUH?BLrSZ_kd;)Nbc zg{vaxyF*iIdmliUztZ}qMD4KbURJ6uV=Mxwp22r0q8nHsWm$$aWEoVgQTb1hCh#)} z=5r^t1j1nk z=GcAEp0PpxLfXsFR%r5T>k28Evz~p+)&c{D+E{g)co2JvR9aO4sGh(?Y762fZ7Koe zn5LS@wB(J{MUx95uUq->d#d~L-z+d}S&4jh=TGH0A4=k_1i@#S|b zxBu5w3Qc?rYr_-|7ezZ?3Gp+?bvn<}$8O%W?zVp2t$GzY zF{TJl!u*8Q)Nzkd>2c%gVe^#7$=CG$0bDHXv)%7-IB$TdQCRypZ|e~2CSS@Za^Wi8 zYzSV?tP#l&Cd-ZIbn-naqzwI4qqagmF{Ydm=aPeZhHRw>w3sP|5yV&oN%|a4x?!)U zB=35*5gCc5&js82DuHwr0QxqWn5cez^51MvvX{-xyKeOl_*rU@9fiUtp@xoxAOrn% zCf;Ao}xHua}c;r0@9f@d-#9#@|*?c3Z=jWwTZ^0aV z(s0b~h|%dR$y~WQtDO(%(Hq!Pvl$6kBmcxy<8{5PXa^fEl~D~BC!3hnGD`g?U@&k| zxO?FR=x*$HY8Wi>CQYJ4s&ZB3i9^958?~=#Q``%i7I%msXe>7sQEQX8hY+$UGr*Y&O& z-=#~%o6wN(Q()eifBAHmi{blCK8^VJLOB+byH&IM5k>F0e|YLB0Ks}(^_rRQ4Ba?l z{>DFt3s*x!36rnsf7+Vy=Lr)WRIv8>hc3gNcmL}!H}HnkpjBrnGd-02sZ;5ee+@0h z_+r7|k9M#uSH8e@NH*33GBk%?&y-QFd8NR#+6^?viz_cGe40dWCip&OV47{-L@L_g(U-Q&q4Xaixl3{;Ps$1$K4qh-OT@8ti8eRFy)!Bquod5xBNzn*Zn7udoUG1G- zGKCfFt=`k8yCz)ve$Kw{%pe?Yw(W>C^aePd*IQ!2UX*fQk0rX#$bpT1K}!3SpZ2qQ zKgn6c>j~KT{sla?r-}W8hqrAe#TGZ z?zd#6G~=$mAWjBf8C`M2$-=A;TXzYh7g@W)YS{iQ`oZMug$UATY6IXS0%nH@tZTzy z+<0)Pq`ai2@<}bdVHa(JnyV@V?bpQTGzHV>^QEuIG|`0Ia1$ilT+--6GkL5^$L}US zIa6l)j6{YO0vmVT*6g(_I~i~)-!iU}Y|Yfp)_H%P^C|lnF%q`q#~=(`HhP;&xe1-# zp47Bv8uX~~!|_HJ$Vqw|DIr5#(JzaVL8JQ>D1Lu4H%!Gobx3KZgUr7-Hi?Zt@p5ae z08zY~Kh4nzOhrVitaW2#$Ww{*^BPmVMMTB_)=A53&IZ)fImB`~=c9nXl9zZgjcfN^pM*sLoJ-l0Y*%gfGD`4u8}OJ1=0q z@XDMFtW4D-^fj{*eL0E}xdNS#Tzz0-T?p=CxQuPLi_%-HkPJ}WV41b$q?6$z_5X1& zK#5h_9jZ|U*j}ib%QAx)yYh~qts4&<&o>eWGu&z({bm?Nk2CKW-+5H5E>ifIbd5Hc zUpOWB0lb=2dY9Ah8r%X7Nk-Uw#i2f7SH}6B(Y&A(CJkEcDAYmBV8EPeb0$1*e(FOC z2$oxXuG2-=!e}^63WQaiMds7HoX_B>edi|%S8NZDeN*5Wp6YwKWnM-kp3pM7KX6la zv55#+62MEKH=kyoYz!7$RMIypE?bKrEvaDKNdJ9G5Slzook!4TyR_6nne8X!t?E%D zJ}PBf_GosG8B)#&UgD92Y(1HI8xRnC-5uyN}Q(qk8&*L_LnD@xS4z0jkasVJR3H($7G+F{^788+}4 zX)FDq$vd8rDgIgqOTuNVtLjTR{;a)eS`L6N{Wx=K%Gc^c@}I!Xblj9W{w|&5Z|lE0 zk2RMB=sk6V^Y<>7uGN?KLNcmn=it%|xQP+`ukh*+e$&=B-M*9Yp`VXIo^jM;;#kz zdv}lf{>`w}5}y8FZ-)wxHL~O)GZ}% z7YU!POHKT;AJ%Sju?I6TZQ@J>lzP|{?u45bhr55i%$QomwIRYO<$@b9vp9>Hgrg(z zr_DJi_&9m(2~voYMayWtVKl!JKow&mxUPT97P4J=ZRspav%UL}Ojy<=?O#q{h}559%&A{G+GCY;A*J4eVcehqKROFHW-`@Rb#ZqL0SuHOd_;hE62Xq5}eh zpLj`xGkp%9U&nx>sO@461BD;hVo}@9yT;S##KZ-QIg*VF`x5`0enb-W5UyqZ?Sg^E z4dhxl@atX^+AdE)o3IIhk#AqL(r=GxA^_Ss1Zb#vO5s?C{ur0`{@Y+T_k>Q||5>5JyH{V!&IgrTWe2%`hZv zlR{VAqqifp25DZ|!Ilwm7l;b{^#&;?Y^3GGfw8svMcG)mlVJmz6tm3WcI&!YPlpFzC=$8vbhn4*r<+_cm#tNku5C?0+uM> ziV{dn)R{aB=5QAe*Z?It`e6q4xThJ=Fls4f#f$3|E?Qve=+3Z~4=QPcfX!hz zI~UN}dol+N^+9O;lUrIH9yV6xm(MZ#{}0+gCBLu6mYCR+7!_kI#8@JT9W2Bku~%$h z3t|Ba7SI?Qv0{y}MPrPy{1OudTQrI^1$HUh-v2ZA-Fx@kxu?uI_uTh(aqs8j2jAXv z=d_t~X68F{4ks+iga+#bEk)mu1A^YFJEuPwZ%mZ-+O^%`{>{E;lI_+0ecO+>gtkL= zj+L9+r#}#koA{t1vh!{`z|f)Jf}xvj7;ldAK3@JBLP*~Q0 zD8MyQRV;-pKa!c*b#)hCS|0lzqGm@)^%23axfGbv=tq;F_)LXaKt z9*&n^`g?E>M|4@CI38#)U?TskFTWA|nT3D|i2DU+Tpe64h)>V@9&po)Nx?;eq7JW= zuOdK0Lt|j9sP;#hJYjPBRhLeSyK%wgo(fTij7yd!o~Ia1EL@F-jA1Fd>yWz zJOjR*x6r!F_4PgA;6sPC-}k|>UP&!FWX`%lk`MBxPpjl0Av#a8k3OqtUJs#!fo!Jb3qCbA#^OckitMqd|!GgCJr;!@w}43X|r4xa;<@5u+k@!Rc4UMiZWLg@y(8hmJS) z?R4RI;-_A@hdHwHVyXF*AR*dF3xnRo;rA?Zm7w3r?*Yj)k&2IPb@~DfOKuhoZCJGtyCVKm;X$v8N{&X^Q+&Wt4GLa}*Z%=0Dzr3(ved5o(1BFU0{MDF=%3zlWG}Q;ta9IUltCav>kOm~t!6q;1SM zBXU4h|B1)88z57sUjpCWd&5FFpS{ z+&E=sj25G({=~5(0@O2>UsoiA5mtlu1&s*r3qoc7p{J*_blhJJ9~-y%Krs|b6262; z?KH*RAhL-Xam+7*J3na7S70<20U8?`Vf2w_#urrLXE!tQ-y6!0>m9z9g(hN?$h{G-gp4V5!lhngE06%^0(;QCg&PB4Gd-|7778T5q}N zJ0oWX<`wB8@-hD8ixb8N#!ll&C^C;;_4}Wf63}g)9(83;Shs1OP1&|ldqCSx-){dz z6Ca0Tix+f#F>e9P6_6!7G84lc(73}3y|U(1B|LYEBQkCJXez5iLR{8kQ+*uy!+I6V zr7ihHdDU{}tv;&sX)ap~8s_S`4SPj%?ASRVstuC-J&^-KJ+*{!&;a@OyCno<>aCZ+ zx3|z6AXpBKir7de^wE)mcUj;wWatKP%Zy3#xu*-bP)eMRXpUvY@0|Vs%pf6`5t)(4 z42L7}NMXstrO##B!-XSjZ@S}h*m%IZN*7U(kiCQUi}!(GxY<K4-&yPoMRFq_no670ujS1lR z)VvAWUAM8*tqh9RLv{jKz6uJDmST=O>(e@F4=C>RZ6)#{o>t|9@AKw&@9T~MIf>_8 zqclk6L2=n)y!kNRQzK2}L8Veo@B1(zLz4SJGJD{e2!pI1mWRKB^hY0aF8t@+4}z(f zcH5<}*|#^=A|P1q&#%fo;V5qp+|!Ko33twZO6 zRKGABC9JWL63fE*LP!&$38V1la7_vTI-8;pDlCu3{L%-%r}-LKX3t@}2BB7X8dual zq=gCQcy#UubK7r0$D8l3xbD2<<*Z@Da6H6Qu4Ff!j~R6)d>A@ycHDV8m~h4Tt{f1H z`-k#gcYGsH@w!iuKhtTrx>Mf_wwW;pgbGGEJiq{#6;ucW+4$#*N?&@ zuS3maOk<))9W-5gOfV04L1E#q@A(*_Of>Kk!rnEtRy5jn+zi@|`H}pd0;Uxy4G*H> zj8uM9za_2bG{dUXhQikCo6pM2Oe>40jnh;P(xRoqK%PY-Of*j7gIc1^pTkJH0bz!5 zjXvfac<W)C(h-$AS6I(50e$$P?e}7E=0GeXc8`9G zCv9QqmF}S^Nap!fRECJg1tFq=Xu@5>&EZs?Ktmxqc2|dfU``8$KZ%a1t8O?ShHko{ zbojuD>pZs+Y^3rm1T@HC z%anDkXM%gr2sH+n9wpI3N}1TV=d%*@X-sk!kFc!$Ug?KSCwfAIX%%*j=(j1xT=qU* z(*z?+O5gEb5FNkA@Z@ zsk!|*D7;!ZBjmn?pTU%QAHvY?^>D|~?Tqcm0+I2d@+kY3*GeIO${aK<^2f~KkjVp8 z0#x#+%Hc4Tmnj*#a3oiG*D3Q9aq@vsc=tpqjE6iBmJ^OT2j2Tn$pE?Oj>}-vO*eu! zg?l_i;Y0_?gh}IJ+wHbc=71b};3;w5)h%~k4ny$hUO|!YGX4O7clM~luc9_10`uE* z$Fx^(IDJs1pTuJz$@z=6r*S7uh)>G;;V#?5MUzgG>au7!O$`kvyxb7mCo@W~yksgo z9U2lC%67q|@ui#A8S)(%7Q#taM;tR8Muy>NRNj6nbPtHiFw6~M;pS*4ls%O( zrBW`%7+IO}XtKy0|w4MaPvk)oiQF$>2o-R_cawmMR3#X9So{8cb(QzQZ6>M_S(e>d-{zPq;t= zmQyX)&XtEw583({*T-$3f**BCq!qs@T$?)Oi4NEaN1YAtzxPq_=bLZ895%tDssVzW zDLj5QI*J!_rS=-OTS*BP?mZBlB}5K0%oQgg;=9u>pJ&0i7_}jD}4VVZC!Gi!jH0e_`fkZ6c#az(!_VkrsreamE-Tr^Q$>x z*h92~)@V@C-+#}e<0QgqcU%seMDV)GSe6i~YFrg0q^ppSmM~#krj!)k`UnsW$>TQl z>GMB0Sx zu1~VCraX`X(G%QR>7zUxKdRjTLBt}sY>=@J%j8hJ0UaGGzq|2#Ww>M(4>Pu#lLLYY z;dqLmb>sy@`IFgxS6)07o_^xRSU1P8roHyv4G`(T|HtL~Cj#Pt$KOWxeuxVFjOh=+ z%rLngb3X7el2m;LBm|AYk;6}k_ZQ4HK?8$2ac2Etc5uR$>{)B@0Jw1CX{E5Q3glMl zoU~c_r&99kqutawEkmGK^{9^0mKakB>q0)OqUSsEg=#(@m_cH&;QT~{uq{TAR zH(0hhrN)@6!H8|-8Ub2Fg}P3J-w97`*F7L99@2T1v+yN)nlKqLdj5n*9A+5*!YluQ z>Q~+aJRu7oRQ_-N`ZGB5p{unyI8_UmLE(<);_tHbDf)KySM%Vq|GgjlJb2A@;MeO6 zO_2SfX(b%|{@>!iVJOyh8*Y^_RPc85)=@tK7}z_t`T3BmgmJ<+5<2qK*+O}F@sDbr z%3Yrieo@iLJ9e4YYh9nE5vD~ZI2#pXzfc(us{P^kqt1dk?|mE$#gu6m!j@ZaR#H-< z$DoX?0)Y2dwZVT@7U3VCd;uT7_7<%C@Dtc& z`ZxaWPWa>fPo}=a+>illuLYmXDUCHM_jvl1>_OxSL#Qz1ZRV`&;*+dw+b{cqs~e#Z$H?1yWr+?JcUt-d^n6xg3Vn|lXF4-JjhoqA2!uDr^~*xdtS%7!=Gh;HqPP{nL2n8}BSvz$nX*BpwF3&i$!X!;7JPxQp9V#>4R zfQVYYl)g<4NQQerUV7nmxbUoN0+~c_;ng>^$JmNt4Uy*|D5yXZV_l&N06kv^2w@Ot z*re!5Je-AR-vLZ)_ko7YS+NX``ryr=S-q+YaQ~*?OQ9g5k%Hw0*LH`?H`p9DS+hU1 z9rYt<{q9ETQ@}KySsgOr0}07H2Z}1E#{T$11{I#vh^JKH4Zh#Un;0X;oyxy7%px40 z;2e8lzhHR=4F~`y#+#EE%iXVh$JmSYo-+C(_`kRR6HMoXiQ{1B@bo=X`{%b5;jXV+ zU~ZFIJzcN13byQ44LkI#hCzj@1hQhHuT%EK_6PTXT-$!}C@S_R{d#0R_kc)F`;>Wx zF$d$$TOWw;*@$IDa4@aC;d(Ih_g5xz9I;%~Z%il;lz&%w2h%Jnk2;6`md@h9gRHK4hMFsz15NTi){35$L;&i%g%B-qS(XFUy<|(fL62j|9In zbE;Inj6kJX+!}yU#wYI>W8d`S$qIXxqOXa;lPP-~<&RE|)RROTLT4v@FO5NVJ*`LL zsZ+%`i;GUo6eica;koqD zP2d=YfDk(NCow*>gZL7U>HWiByquCXYR(%lcU9?j;hdKGE!t|5(um zGnTY~#`Z|C0g~Fjdo}Ferv~~J$c8M*d6Ri+Wy=-iwMc2Fe|O<88$MRipYiAm@c5(8 z!=itd3_S7K=_fyg3n!eyswPYOj}Y!Cxq{@9M3sw)=)q-!lA}|#4K*w%9R9b-`JkZ! zN~4F$r_NQcLP!kCdps_x1vnN!64yuNOX1vSF^Hj%EpldCXBPV2b3o|gCHt-P{3wn( z6U!Twj*KzHt22GB$IUjZ%m-aI^2GK0cJO;Z?zpu*&i9~S?hPlNdZZbtpo^JktO|TD z8X#9+e;#b3IkiUSd9PZu45}Y~9SU!MIE*`@;1bZ7p5bUR<&eF8$wo(Ad@* zydT`ZAKY@!mGO<_ww|I&_Fma@u&?RsarN28;^*Yr2G^-AZ-rFJzuxLOUv65vRqO?s^aAIz->>p&hU$!dsf5G`qV%#1VkKjO_VY4 z!ulv(H&n``gYu_Sy5=?);fbX!Fh{V^S{oZ--fh2!rO&?{v{H5dhf-&DL_)?3N$;b_ zj(~#>8J3z~@jj3l4@`l<>jFlaS$XH&45nOI(>LhXvH0YC4~V#U zun`c2?vpTFZ7nBRc^wjxg+80E$|#Skn!iH2^L?4d?PXO1m9y$$f&t*#74-3%g4bkyYJ9`<1|J7bi2RGlckbd*=46xepJ8dKr*1K zy!n+Qf2QGM^M_?YohR2cZI)HBid%c`O!I5#pe&q*yAN>6x#XDKJ>wy`b=tkbcpY@` z-f+seBjt(X0C4@HW_VXns!hXzG>cFSj1%$cQ3Y^N-x~N~kLtwVt>=R^%k72orawnw zcto}D(4!g}?|%p$y#2x8PbLFI)-{**Bhr3Xn9wdB$1Bpulezxy&3^}fy7Gqe+QY9b z$JbOm#s8-D)3i{L_a-AClU|nNJs>XgY8q?ty$<-Xp`$9Bg?>fu0f{=2B_|}HL3XV? zavnsc&Em09S=wFn!x-(5DN>FzVV4ub!(ygqdWIsNv(7PL=7dE2D8@{t!T^Ps$u~(7 z`m>m;p^2&F(tq=fci}XW+|J=!V~#^($ryqEd=Ay0Ei@V=HU0}^v;Y!^7FS7Tr zJm#X@71epna2RoPxULH8#rTuk4Ui~Ii(|}|gFoZ(3CAf5-z$+bNqBFTddi91NY^{d zoDb1?o=C{ZDo={jvcz?Pjez7G6R-0O`dI8_%AM)751aSS^i8fmG0eu-X+4Si8dyyh`gaPsB|qF{JGeN!wOI5) zO6gn1um(93|6K@GE1IC{(}h9)h$t^_{`XTj_4oG&qh>-tu*|ie&xQLJmrn3P1LUY^ zb0*4$Z8&CPGl;EFnuHOCgLsrL8q=)Jxyo?*8CP~}>7sM#>T+W!{JCg7MJm4X}=hPrOE+0@TbQ>W5e>GC9|Ho73zD})0Ed_ zD=ilQj=cGhub4X(mn5N$-I2V;%RXlb>wMFEPjSCqK1Y>_|-vUp&{H%PCs{aaCw-`{8*2_B1ZTh0uo~~ zK=9P8Q$BhJ8p1q~=sp6Qc60dOryP_^9ys!mXAX+(dR)%(d3zemjeKzG^Etjaesliw zG2l_W_-r&}eYkDr6^R^y=Nnq#zNHcko1r+X7Q;Z%icTjB3$0NAIJj>OY~8JzyaL93>2)7S8SRLA(X)~Op#4h@~*u}6IYcJEbyp12-L!gi7V+i$)L<4-Ex{e*dcc=Wo>W840D zUo3!;!^g%|JowbD@tq=Ky}DDda`nWU*3&ZZKUYrT@IJ+9a`AYYA_*iDu0w)t_=A?U zOe@zl_TfVS03ZNKL_t&&WI#rcend}_UhF$xGZYzwFl~vkZ^EB`k2&yL3pnSzCLm62>8We!{V4|ilmtMC@cTq zeI$qPcOo=4H3hB38_$QWF$f0Nbq{_c>M{H4FJbP=(owzm)OYU&x7>XttiwEog=3V9 zNCk}nw&GVsB0L8P$rE`|)=&AHu7h0U(38Bya;2iDX`eLbBjg#{f7Ndjzw6!`J?%`7 zu8QAuIW2ki2it@92<*MbNN8Hs9E|8APfv&5y?esK<|16YpczVk&G#u5i%=D8>ZPX! z!&7?|V4pq(s6oC^T>2&pD--nrF(<@Ezlhoq(bpLsyVn=sN4*Mw=!euO7x?|lFBZTN zp+SHb6F&U(bY%{RQC>9i8|`O*{KIUR8s2h_2G3P^&<9&5{;HDNQH5{V}=#w(va@XbF(H2N+5-c_Cw`d7AKk1){(oS`BXGmidszKI<74u) z3xhjLf``hl?6fLm9AR-)PLRq~V~~d|@@0x?*2*6RDye+4M%1p5$#IwWd%M=!m8R=g zDrT8`4+nGoOVy{zxoc-&4fJntHR_xT9C;ph$|dmT8~+N5UOD+}*#3K4!ZnMUwU-Rq z&49Ud5SA4x@lk0^+{Umhyv#7mMTH`2cPlhjE0}?yIZOjOpK56QVs~i!esK1 zSkEXGS0s=rPbPgvY3xw?I;cSf=`xjfx?kD+PK~$3dFhM)BRaVvTj}jv+5CKRKqT4o zqBf-TJTmS9;lz4p@oeTz-xx0Ch}dx2?ZXpW@%D4?DWEo;g%Xz~yo9q*&>X0@|B*bo z3TX^KWFHuD%<$xW7-aRBH*W!4amh5m@1tkX-~n*+jETm3G#X^o$@$3QIpxy7`Nn(Tp1U3iMDyt5e+io&xX2OdJP4 z++_zN0z#dmG(0J*ymfZ^vUS79I+b}nV%`IiGM-G4Pm0s7s2(MgaW(=%Ehm{Lm7{!_ z%IJ^~)3==WM*1exkm(r~g^;7Po0JBf@sP#yOFgxbXV&-p8poY8d73hvo&M90zW_H( zzB5Kbu&aoM4Bg~gFl3VrVe4(TfL`@If*a1~&iN#WC;s65k7LvW%Omn}`nhA;Q3T0& zH7sj{^Ut~_VYJX<7z%dcuSde(5|5c_ny7Jwzn3j-gulG_cX;{PSD|r9LqKB478}FR z&4<8FyKN7>d)2p-HCTVL&CR=fIfMsFwFo*`8mLd#ZPS={y_b&wCxkrlr3s2PXo*VX zLuiOhxpL)S*RU~KAKrw1;W?9oq1f>!KZKSOPk=_Ee3zHUF#n@1b$`hEwP=VGU@J^i zw`dRtL5L8K=Ol&)-rhc}cMWXay*fZVRAQ}jut(qg<;BG)mm^Ni5JoESqFi*iI{9(hw6b?;?Hlyto`T48eQP9_IjeTq{q z3hNV*#?*Jw0NCn}jH7B@$KHl-TB447?VWO{kuk$4OLXN0Ek@2h6ho)X^w`?Z$!ecx^!9`c7;QN zr)`Z9PTLac%@o3~w*2nqaP^HsjtKJxbh_TT@TU%`>!P2II7lIXbbYWq{f+7i?FvN3 zdv(YG5;EJ2jey7;|4~Ctjw8;ZlskP%La;PPLuJV_kq>b)S@fA&u2ks>E2Ew_Q_Q67 zy-dl7=hrsJL^9zzgu*BP$dH@PM*oiK55O!8TMA=^b@GEDSBQFi*N`)UM@i`n6eFBSko_mP2uNXXp}PAQ$7k{ACo0qIUSEv0vS)=sNSau`~92no{PbJ(u%+jGZAt3vc+#PG54{U1U26*`;3N85hJdM3(` zX!PVMe=%s6@g9)KSf%<~;QWlnC&Ou2EczKvf71a;todc~yRf{O)B`2Od~!f&Oe5iD zS(t{a<(zlSbr*eo%zwqlhkKfjA~shh8BCjygWgI7FGXMBxx-B*2(_B?NifWf%NpZL zqJFr`_VC^9wt%6VY^XfIfEumh#fOPgvIHd_Pp>-R$TMR!WF+27ju&RBJmWd!Eaibr z=)zn&bA6_D(>1(DHs2~wx(c~+$>~rbIi`O4c%M1O+VXUsj#S?nXIu@74m%X;)-s0# z*(lFm%TfqjAdaZW_j^{u_T3AxW=*^2mLeYuTLGSEXo1%d`XGu*zOmyF-g&9 zBKgsG;*IB+^D+LMF|gC_J0wpF75Ed&-yPnNj^SW4AH2>f_ahG^u*2q1INXcUp~pvY zx}40KNJJ)akUqsx)Rgzx2ne;DWS(Xpi%o}%1359MqP0vs8ZRWrmE(*&hxuk z&aY*sIvjs8+mEMhoiM6&;h1YS=%#udvG%iP5|#)1!} z+a}B`9v72mkTZa!3};vz$gUQj=sbON+?+aWnom{ujKnBsc`KM&u9uj1vY}u0=eOar zZ*T52OqKYk2x&wlY6spSvQcdn4Cz)K{ENoPSFI4-T8>BR(r0KL8ZQNiL#>z{(oGkW zgtnLsea!v1>XNC@t9Lz&{`E-deIHR}m^(QB6;+72zlDLdnO~Rr=nV9=21p92FlEC_V&G}chNz4vkq}c1nj;;`t1^<9@}6-c$w7Jq>HGA{W((`AyhNQ%GU~09pe1P4){7k70dkV3RO>i-vj9^&4B2U~^7Rh+w43MpYNS z$KBtgIaJ{gQu=rx$Zt=%7(Sd+I{9kjAsfK7nUmV@2hkYMdF4dqEf1?beX0*oq=tEv zu#W#Jk|_OMj(b2vLyzt;%wCP6$WoPtegQ$uwra zGv$P&_}zy9xCo7>Z&FH{;+_;4y97^+-3brf|71X>XMK<0B(9A& z-B7RYmVu-PE$Vlo{MqP>Qu;Juo938UFi_t7>63mwIUp1X zA%my%NSV&@R$WF$v_q4}%jSK>a~v!^uhbK|+OI_Kx9!)*b5USmK)n9&l&eL z7Yk$ci_aIpufkh+@dOr3E?3FHQ?p+P?iaxa(ULRH8gmrb zr-s`OTVzVt{@7Ej5gc9ObROf(83zvX!J)%#f8L&0+73?tFe2%^FPi}GzX%KvybMsZ z(OL(|5QBM9S|b{l(&FVJ|r# zCIi`KVbUpoHgr^Fb)M|t8x#7>_59kL&SSBvNs$nX@1-%9!lIS%^b${F$}{LNA;$4{ zplLE5GLlSuUWxYmlCPidd31cT7ABV;dCV_TYbKtKf`&>%!}6ft(Meg{F-##J5?Gdn zgfOi@FY;g^KhkhNnv+G90M&0gsEmo`3=6k9?wnS-9A|o>Hfon|)A(8zMvEutitif+d~Zwt%1frfGqc<8 z2HA6;U19urW0Y)TOFt-2?cU32U!2FbKUs5w#= zgl!woyH9zxL0WwDM^zsO3CW}WES^1CPJ$_?Bx`*>zthdvc?wWsd8SG_33(I4m3-uY zV9rNyF(EZRG&z7OB+bN6A`)sNzj@2YH;%q3hgxy^6_p23e;4J2t*_^O4+tlmg}eT! zfCW+a;nI?oOVO7YJ1ozvLD`F6yVB2~?8W`I^yFc`ZDQU{G14-mr0nx6*(AL3PbZ@v z_5Hjvu7X!ydV@6-H{Wr2`>pB*_8xG)k88Au2pF&!DyZ zNaR^1uTgzEB$Kw!v|O;5MN=q6pDJCNoDQml(f+A^n~+|c_o?yH@PpNSD_oR1BZ%%V z@vvLUC-(obWvwuKbw@vlW4>ns?LKa2U&bL3DDSh3{>= ziK(z92PBZor+ClD47}*@zEUEh?1?Tn+-AEiQm3O-BBzLMDn8^wCx3a?$3bGsS-*{^ z(&xCBqh1%}BhPl_9V5=k0g3vzytN2t&u@mNP-{*Z%^4J+j{fP`{S*wVY|*w=f`5D>fx2y!|=g6CAC)Nu_m?jGeVOoO~$q6wW6cLYy32HFCXAC?CX|z?YgykWN z<1*7S#prsvh-o}sJ-IpG^TAQ-jGkVDygb{`3bVce=!cAVcdf66gZtDtv6RV3$xKur zfTt0T2~Q)8{)`vU4%uwO;OCG{z7?PwbKd_LRyMAH&p)3J@BHK4R1@%`!QY-Y2DaX2 zi^MzGI^eVYDkI6b9x@jwnNpusF2wJ(^yx;e`mGtz+{d4J8KCQ&`)EJw9uTEc#8571 z45g@SsA4dUF=oQzDy1L3&*HJ;gl}}wPu~k7Y8l$`akvL0;6p)ah{7`>t%w^lE28hZ za2Y9m#kC01HIsQ7Tr6J}$OrXI1T={Dsgy6%IpLbq=0xP6961_!)n_B$J`q(_c#Tbt zO&;y>;i1d29%iXug>>Wdq7qOt-kcbAI=)gRiq@ylVzox8;`ANrT(F5rU)WNF^A|Mx+)g_k zt#SQpVWT?aX7i&G$CCM0dURnX<{FYE#QMJYVgbDR;_L9#;}}x)Up=Yt!yoLt9qhFG z4uEJ0-i)r>j-x(k+i%*?H1ZSBSDk*vlt*gSiSn7CuXD+()_utYM$SE~Hy$5)FNbAh zj4B62IsO?KN}LYX{8}=oPx>qa#AeTqCQs!#5T!NcNpiRcq$`(#oF=6R2dPBtzR6SQ z@;;Uosti&k$Mjo$!E;I+t@&RQBPo;h6n)b<+p1hCx|n)E0xO-fkT>5}x_>V9cjbtb zJcc&m7Ahq_3-V%vM5vUgJnA>apyRQ-Pd2RPNAF4&T2XQOajya#&>Qbamp_*5r428X z)sUjkxCi9Rc?)3foR8sy_e;4QAH4rDESSFtFjNbl-S_+~AMw0Mj4Rdxz?oR)rJY9k$e?}5ki(Rbp^?9Y zr(fr~)M+&)tx6*RT*n^e7t{36_tGX#iwQV; zUK4!X=5rP79JEBwdA|a{gth9d8m?OwtOz+6Ju3Ql-g-aWecPu%~9exo=KlE@LlciB=>@tJXJbmh2(^I<9}gsjF3m2yv1vA z2G2~n_?3fj=8+RY``6S4&;$UhiU6(nUpVIIL#?R-s0D!T)un%3))&=!^G(bdvB~LB zhG&GkWu=jiJnGMqV=`w|5q`Jmn;m`?Eth8wtc7(^cvb7C%V|G?mKKF$icSSxc%K-) z85=tiBwx&Vy!nRT!~J(Z8uZ}k(TBnzBla)d+Y~-Jqnf);iOPMR{EYQ<(NFImsqvTa zt2FY6sh=zPpZR@CpCEFhGjOaC5NZhO3|FpYB`c@%$eJ8ooO)$pFL}hIi<9F-Utzh+ z77x1Uw68)6(>VSh{a%*?LKo3g79(SV$~C_tzpA>+;TKv)=J?2)KJ~!4v|IH}=J{YE zgYkT5?#U5jaK**ZCP##0+;I}oR{=l+8Xr+GtzpnHth`rM$ry=0QG^5fl-Im-By4j^ z@@`KS`Zh{nFh{O2>`Wvrp>$bX5@sV0krMO!B`xss@(})DtkXW%n2tb8?DF2d3$Sl5 zbr_ardo-rp*z}d-S*FWtME{20-2o5Z|5WgE^w<$_(4oVORf}v%^*Q6mp*-m1Pc(Wm z$&X?JWZ_A&11F@&qpHKg0E@~z-LG8tBUuhe5Jnn4shlp>M92$eo?k=VKIyXz5C(ds zN13@dLTB*Eay+G6i(gkR@0j#1`g#v?YJ9l&elT-FWU`l;|CuMvDC^;RA|xK9&dyIZ zNTd(>7VBGD1c-Ds+x?&i0Q9TT#}2!+mt!=U!V!ETw^?!+be?=}*b*I&EbXzK57Riy zJjXuUXB!*d21Pi1UNfv<8q>Bs-xrw4jGnMJ^^K0mUZkkMe=e*~z0f!E^ zOy2WB+Y$3`)*I3d17+h>XlnylR0L?rsHh@-vv~efJWy#5 zxT$`XYuIsol$*BXNKzZ)!gW2@DG{0Lmnau+t!#svziQzw1>cBr7Y(e1HN`M2O|Ny^ zs*k~Pp+DuS>G0UBk^%CYGmnFPe*Pn6Q(WlV^eaW*Gjf=#ycmwAkH^8F@3|VCHsh=+ zTlV?&kYkeDJs>nDEf_R1d7LnbgeB&9`j3wo@p8qyi}m>QRLVT39h$!4h+#2&g2vc# zV`yE&%cMH4E+<5Dnw3r-lrfcDBt%d?#GDYeyfHjz98Y}S{6&>CTMwM7{K8fMUuqf} zAp;72Jd!dehABscgA8+XE>!dB>wB5f&F!BLkD!Vlxc$pJhFv!PZPCFXq4uGRp}$8A zzw)8+bW$3kUAtfJ0{m16!%8S|rqc+~X(Czw6Sf~QqHV(eRQs8j12W~x+u+eZJ`+@V z>KP>iM4AIa59rX`1ENDFedK85O`pnfr_W)b`?;WqNcCfyBW?IC8dsve5U*!kdX=~b zL=-laW6EWn%00%Ooa>DBCE9PYbeYIUJU)^bLum{z)pDsPOZ21)4GtC^x(TT!gyC6K z#e9p4VsgMVvn=s+s)o-O($bOWn;g9y`OqN~KItpiE#Y{V8BeJ`ILHTGOkHB!Rh}xP zF+`A;B^ko5RP%`8SZjzEFH1awu10ZCCqteyAtxQ2zDlW!mp@JTWi)=O^)4~K)Wt~G zSA`2wYeeO6&j*#y$Qd|sK{Na}ynK+e=B%z|M0WmGZ550kkPO43{qD$~7dC$2-bl=NllwdeAxi6LH>0{m5=pFY4i~NC&;N_>QAzq44R`G&}$Q);WX>)Dr$&)@S1d9^}!u1@;loweThO0-bv&X!zj_vn>KcN0 z(c*|g?_2DU3i*vdjVa@6=F`ao-u4{MBtuFPV#3JzpiT;G@by>S4v)+V4UqAn0m4AAP3weInU^>@Idn|Oq7M1& zqAyoioW@0Qzy*y=N+BOEr@=8736=q(qowoAGTWdn*5T-zOi9vUnQ`S)3E(P$R7vN0 z_H>@v&M?2UjUA4kEC*4i+gXy57U$@Wnd%|(ld4a1I#$AYVe9D!h)8}~0a$20miIJ!qOuL}8M8Bm< zo#FJXl#(Zu7h`alx<_dkB&WfN@<3tUEb^eLPbP1%?xM;uVR+PRazdQupD2?y^>Glm zRc!!^bH1Dnb3uIF6XN6n)10%f8c%KbP>%Gn_Akr#E-~spk&irbPF`$igFh_wmD$8m zM>|iMA$3)7YX92y)1w?czI6Y=5zvJvx$aM*Q(@ZV88GXgDjOO?$<%ECYm# zVkygU?*TDcb{3vkZ=QFB=e3;lIUZcDMb8QU^68Lms4M!;aAZ-MqyZ-_HgC7tDK*k=VRoQsnnEX+_U6-(Dq$A zzZw1)o-6IcLE)-!bfoXZaX6%J4eZ>rnzKDBr$yJd6kD0@rBdC1P6*AM{vgbp{yA6`BE)AyGc&K{wwWoxYU;lA1G%dkJVvSuik)uqC4>mw}Y9H*dyf#!d9*7z3Qm z3F(xp{bIO49_^RWXCXQcN>yYeC2}+zJWav)hfhjL6C_${l$rC4+t*Ht43gEtXHG~Y zZ&8eAAbzSaLBpj?96qth(csWC$&F2YGXDFbOyTisqX81iw<;#u$9R~=>znl6G~OJf z!Do&KonKx1Z0`9`@y(a5MVK(Zlz`51s`=DfIteWl$twocLbqzm)3BIEcC36l>_>Dz z6P*HoyzfbvI{D6ElrjA3_>)Ii=YVi>CbIB<-t=|yq>`U3>z~-4ve1uYNOKP!)vtBG zV{%mhLHj9vlYXswua0t4t^!sDh)6|c7>c?xwajeRqTK0A?g2@73N$f-GUG{_WFUA{ zWeLU77gz^Cb_Q{!mYsjl7x4 z>W~(xQbPxv+kvng$M|wWLa022zvtz2{4VYG+ISxb*E6UR07j03DyKv=npNwAYYs+M zdNL&~(wezBGEyyD08~}VH37diE-l~F)r=;=c+cCy4Vfk zYy9WGVdcl4Lfi7?!P3$5JKu)df&HOwt$|r|rVjb-R^6-N*nTxOY+?*+Qz9R9e_`AM zB2(g@p8X5X`mFKP zNP+OG_!}8G@4l-d|&r5%P4K6-sa`4&CyYB$!Up6ka9eeYPlMbZlN|0G8 z|1;%VCtqy2V#swu*^ZD2SM6G&A9@>q1#@&}`c?*raj&<5OXwW7=|p2k1G#RmZTn;pZA#;lZV)7(*IfNBJEQ zkI!$It~5Mo`I@x`!k|%yL7(q$m#66DN?X*ckM36k+jQ5Qh9wlH>%VM#V}7#SZ$#uo z7ryky-~JEII`y((e74#CJ23IubFC4Oy!o+an5-lcoTY^cn^rlDpkejG31phEw(unl`fwpX51R_HOvDwVzr*xkiSx44jK91 zCg%g2AlCnALn}PF%*@}be#J*wfzHQK|lRLhgi+RZ^eOo0`u`rdo@132Z_bA#8LY_<{HaQkIi_Gh)*u)a_u zRy49A{UD3{D(Op{$3`SXGJ%mYP4^3|H!edMBMe(Ld+P zuPMD{ajQ7&ykTJK#75pgI>AH3E;8K6tn!4eHaQNCr*^3}P2Fn6LME63~R zPug%ZK~#Lo1IPH`ge7s2k%asyI^u&5bVvkUD16q(Sr4N6^9;j^!mmsoFc;<7Cvs_O zUq^b++F%sMMJ4)S(_WwLyLV{|yx3T}WmC1jto-N`_~e3#(AHSW^{DRI1J*wII4QD$ zAzBTu{{z0f?QUpWz9L=;F)V9?i_YxSMo70R0KAm2APK`#Mdiq}CZlh`l!M4LivRn` z7jW!hrLe1Y)*A%3-#ghF0g>fs_~gIUEeAv<$3DhOw>~)0CrC)Ub(QueCiDfzlj3>S zL$Z`N1ccfWd3$<041EjBIIy);H==veV!h;mXgsgla3-1);=+;S8y!;NfxI?EH81+A z;mxZ)A9PhTbZnbPy&U5!kr~RB&nkeXHUKn2@_5!P0CW?bEuQ4vMyYi%ZobL%Z8m-D zanfy=3Rfd1EJDV+w|(6LZ>-Q8AfKFnd5mmy`_}rf!GyDnhD6i+1@PI#Yhl$VpLTj9 zL^RA!ShEJc(+#0YzmLwQaIIRTFx}!VZid3Z*e|4JN;lgv_U{pdpT96P1*F491SrB&07u#jj>iN z_E|iwHZj~T^>ifqG=?)ve`H9M6McegL{lunw=_mK`t36(M06=i*E;Iy5>G$T$WPE8 zRZdgb**tPWMCDy6k7d3m#ECzc$Q(sxmb3z_5EVcVJ9p1&fIeaF2Un>z$j**#P>jif0QZZw);(_#MAu?tBC01 z8ufW|5#}{E!A1LyDs2~4Rq*7?zjwX|L{$2H<{)wSKMTK?i+)~6k!n2@_y2_R!L zkPlf{sHlG{>r){jimNPaq}Iv+(Giw88e^r>5v>B^l2ONu1^Il$dE~C|I&I; zvI_>}g5#`k%?Vl93cx=zNI&}+dbMV?Ch=U@EUXaNB9&~@vAs?ysQD++f+_<;}{^#tq$SEM ze)K8$@{Zrfe;YLF@ZglJ&hm(BRL?4a%Lmm43cZgfi>La7rXnma7U6%*Mfj|#2rG(3 zm`jf9`}go8<7Phg=NVAjt=7g-ufCTkq$)b~g6*7f4-pFqQLHaweSz65IFnNA80B|W zoSa6V6XlB|PbU43>Wkw1E9qM>no2!W0H+p|OGWdhFE+@@0AcFDYQvOy19ZyM&bSAJ z6Z7rj!B<)6GNr*MeO>H)XRIgh@iHoL+#^C2=d^RAIkS8iY&Ii(?rC%#;GPiUe0k1! zGI`ptJ*cW-LV8vs1dWe1ssIYrcBi1|#Jd%}<#uQG;lan{pHlsUP7Eo@d- zm6$eNJ5tDp#XTRNx1eDGFt@1<8e0KAZ)t;1n~SiLiNwx1ejKzcS`;+zj{C2Lb=F-= z8oosNJ8$Gbw@&!rZ__%Y3gdE>bJ=+1-484J%zHpY>r`qSnVm2XIoP{9o zm~f-=#c8CbOlJB_&#lh5@}WF%lo(|_3eSWL$w-VBIkGn6R3sb?GS9jX`jmzaIq*?m zX8y8lMBe@3jGxLeZ`l=A@l;rvBrKGRG-e6M>QN2Q*D~x%=WNJBY0t9GbjJ43@wM69 zjs3Ot#Bx2gim+yuFocEh4iLNxMCRSZV|V|1!NlMl=6-B^%_TOZ6J;?u{ev;5#fj;C zci$P-IpsKKdX@Zem-=crxKE9jCgA#q4vnu`i||=X8(=!loKzvRj_8E z3ZDMWMKJHZxj|d6nRX$3XRFOp2#Al4=!`5Wb6Fy*+MEo|#%Vx2b@CsNk3oO48CWUu zk>T_!I)~+?uUf9M@|6<;qFigao>zeYjX{&epvRrJpig7wD&cwO##nPKa$WmPG1xZr zMIp_j{kb7Jiky&Cj)s6QMlrUwF}fl$FT%wUy+jPJ;zo5&bV$nRB8wv@3@MT?T^L6k zXu!-liN%+3{|8se%aYT;;crtrRP|$GI^GY$y`&IPk6w7(u6W>t$8j{CX#R<1hIwlTRwIcuxo#Bls^So<`wW=p(JJ0zkt9jSl=*C+|k%O_P(rG182l zdJmq&j)t6A88tLPGaL_ANC_v9_Z>7~JQ4Q8~+- zA5C)2QMP>|g{Jo8{oWNR;Ti#Xx4)e9IWhEEJiWGZrE1ULR<^;NUzJQ|s(a>PfQSj{ zcvJc&Q?KGIlO3+ic0CF(s0LtpE5QF++5%L=^|De#ED*WqS3tv}3f8Tyf&qmpSf{os zMlv}3B;)Vj-!TjByygC2{0=$d=Wxu4hp`ZlO5`;7ln2-G;>uNLr%xk?VgWPh1D*LE z5RT5`bEU~U#yvBArsq}^3Xaml^>oUF&6>W(lc5b?@^JbY<(16yVPL+z>6g1d<(5ZI z|2RgKuQei-6Qa6@hYpl!;7sq0R$=mV7w)F$MV@Wr|2k;-Ea4Ekum|h)Q8qp%ezFX! z$RZCPHy7c`h0RhDc^DvgKgb7T#>e$#No>#3Z?|vTH|%1uXnhja(7Gzxa&Hz}0uy zMuP$gNkK;@WL_Aoav=x0<;KUv=S^R1V5nkvA%eTLRm2mh{DR}E`a zBchQ!qBfw!z42Vw&!YVTJFDbtq5R+f`WBpX+N5A?w*B6gFmdwP>@cQ0_*Imb_@0z- z!}KAiF7jwoZ{GA%IVOUBDxD8YX9WlOp!+*32gJjH7*v2W86djVK<4<5l|m1m@!aW4 zE?G&m-y+7>N_jKIs8i3X&bSg9EcKj*?|tTkh>I@A2nfoUk{)P`X*wlET(iAwQaU8W z)Lc#jRO})Y$zq=>be+ks4#-Z&gkgjmekEuhCQHx;}*8DGwO1Fz%%N z6TWA?r{yJrp$m7!angoonQ~q%-eWx}ps_`s*cd$iAb4R`%)B3m$m#7AbOKLdvq}4XJ*R0m?&8#Qx-o zZ&lh| z2{knicbJg!wuxh|?h@|EihS=yy7R#)^>?h4bdGyy?rj zmB|1}q1N0S4Q9-_G7P~XCN5GQbm0P7HgB7l^(^&p+D|=YF7;*3(Jlm2;g5iVWOo`^24Q(_*7uN%xevjMVauLA7X zJ3IrID&>rv4%7Y-Asuu-2y}YIej-Co#C`qn{ZE303l;|}^UPV-!CHd`u#i0;a_oaY zZQ8NAARjVkiPl-c)UTD!42}K}g^_XUSNU38jI2xsh^|6eNG&ytT^g+FeD0oO*VA)M z4JOK>7-r_=iB)(6WSebDX;MuPBc_wagvu7-l&gqapM+6#^X&m>QHF$y^=9E;`mIb} z@{H`79AK64 zYHWXn##@{}RSdXIjtA|3X8sTaE?P&#^e?H>PldO17Wd&yHBmCTD{3QI?qU#ccp@uWW_)SCwwU?onL@>(^GnrroMx zC?3hmK>T84Ru>l`$Qx(;pKNG_$Ci~W5USLOH=^VFjjoyi-8cG{t6l-0Uv~>EdH!W@ z290w=EI#a31#sqoTIgSsHa?6wA6#Ta5=QAG$KZl9u7X!zdL!uV`In7@op#$n8|2U7 z7cQT2j0GR{dC!?p$f1w<;Pf|hJ%&i2nDqtgfw`P;wp9zsQWy1NfaqGHQ+|B(z^GjL zsKgK^qpiZxGb;)|iyJrtp$Lo0Oh0yQgbAH0rQO5nXLPJ{N4^+|TAo;pqsu28OFru5 zu#Jy;R5U7GzmcC9##!X~N=#rxm@EIBf$+I|FzYjgDcQa^8Czw0Pv?h@2V?$Z$j9@` zTj8;#t*}Bsdqf`Fq^=5n(WfT3lrHawvdiMuBAhp0ejf<7MLaqeFA&`5%8Q_;SG`j+ zMMNd5G2_$#hmVfwR|8vj=jVNtJ7!*2-*s0`hsXZ-Y|!hIPCE*IKK!Q+BT)Jz749YM z?>c0|R*%pr=|0v0Eq#W3OV@K@R4Y0E&XcS8u-yH@rg$|#QhOR>^H#;2$tFKm${lh* z5;1Oy%|^AE+Ij*4^fsJL(UX=peV@ny$8(!Uf5b&B6Mg1AA)+fVm^Q8_%OU4Ps_fDn zlq@+R)U!#HUvKgwEZ$BzD3)P69Qi9Zzj8cW93+;5WV+@sWRf344p-Lx+kEe<|2mJO zDTl|@-o`e7YZo=cXUz)BLlFKo3ji0dRcDORmwA?*kQrgWym@g8yuDI>8dl>!{|*1W zU}D_Te*5kTgO5JKTGtWjRQK!wo6VeNO{3f&?9;0N`(WNj8FM~xd5-VN2s^CYf2cf? z{pY^B9)(+P{Cz-W_+k6P@h2aV;xFWXC;l-Yc6lQcoE#IAd~%E(Z}LXQ%h-OppPKeZ zCh~#(3HVF0U)$t-aD6i_GV9d<5gVX#{E3}W8P-l6k$9>z(WlCr9j z(YNtzl0_`#!Lapw2<3zRkl*o7&ECD7m1}2yFZ*{6qYK#eg)FE5c z^DG@oI)K~?!*Z&egt%Q4*0%T^RKZ0?nCnNm>3Ppt=)mK_$?>@9s}^`iQ0x)u*s*6J z2mRN+BVu;XNTbWWgs=$mMHpIS&7u!V^p}*(&*=o;n|L#_hM5 z^I&SfssA=ehfVubRt?+~T0<2k`zJJ8kll(+O zD?HcG8W=m6!(f`Xn~AYR*9=|2H2-9sKKn`oOjN!(D&8KKC3DSAI3|Cw;%V)RVa%2K_dc3yJlc z;AhP}d>muMr*WN&0iv~dG)RSyg+=E%Een0q>=-H1A$WNo|&1f|Fg2g(zpdQ<~s>nSvO62Iy1 zRk>f1&HJ=@O>xf0u-*mOw^w+CtBIL1zQ=H{nM+y{VP9trs10uGR!tvP`Dt?-Owynr zEe(w@|MuU()&M5$g5@qIm)`#1dzgc)3@cXEPYXZ>(u};?xhwvAwh%5 z=~$ew2vtrAjd@GZ4;$_?X4)nuonsW3JR>@!#fN9JBjvO>^@oO=g%S~a%BeJRPrqX3 zjKt(M;b%5Tiga$5)PpYW;Mj zZ-Zo*=G*stMD$RP$K!4B=~n=_M9A&19S@rr{n^V};qmZ9t4Mx^)>Xl&{mlpn%GW(h zTHxg{B&@U-rej9t-F6pz_4qR>-J#d_woRZR%m4MCgyDf7_`1+A52Xib?onTWgZdN_ z_dwy_>3*Qh$*|ZTqHv{XeHX)*l=WFgS|FX1jy?{K_^i)HK5Xjc^v8yt3c+FLm{{gGr;Mxk4RHEIv1q)#stq1k(gKUgeICPl6#&r}Dle+v&BfBigbNk- zf<)h8Liv}s-3_Zg`INnk`M5`fU716{j*fh|=9o;n=mvQ1snXHMzd7p!*n7X-OQXZg z0g;6lbH3-&r}~9c*d>F(Mfs)j$`%lf{Bm+k9N5yR4#|LUmwH_J%cU;UH@O%foG=O< zyp%%o2s5O@AeiT>%a8_+lAZ;jFu{cQJ`4Shl%wIZA39I2&w7mWW8vwFj4mCLVG>Au z?_GWjl^W}_KrU5CNZxYB^-yt;$&Q>O!tJLG65^HNxC^_X9BsdCzspq~kKCQzP}1U~ z@GBGYp+k05?f$H(2oEf6fjLd08d6GVAK9-a_}6w_{IsPAlf>K6gSAI)spCB%OaA;a zAljjNdhM_c3_RpOR;~zV9rRL$KnyrXduu}EWJX%DDq_Ayd+A#@$rbs7#v(SiWD~>!ZVw zxBQxhzue<(YLDr?bpYclvrU_`;WV2$ z%|)2JuynV^R^6)Mgf;m&1t#9X_jq&p>g9yYh*JI^J|Akc_|2O_??OFq%*AClu=w$P{Du7XI)WH9E`v77yk|yoq2UoBy|#&-x>2#)Q%Fi1*^ z`B~PeX1ocGnlt3QoJp|!*vamtCC*awJR(P1?lej8P9pyVwckW*R7`6#rj=fiXwqlCXc`)nQ@bI5OkDF{x&dg%K0d#y4=T5xhC=z5VwUMp2!-Z>^p zqsgSNGVlE`A|IyxTX7nuLjCq4>bV*qx)$c`NzI);@r(&NWl0t@dMZ^h=AyACjS**h zGC9h-Qc2E$d_fO{543c z4(W`i+9WWV_Z<4B?Zk%V#9_!o`OnO6Hk~n)&BXw5K76RgU022zpWpKuU3#&H%8 zo0qUdVFD`I-n_=4i*7nMPvx1##BjV}JbKUoK|@6Jc=hH%5TV&On~|6bJww=8afQb1Wb-3cBv znyM-&7TdxcmJ+=^>kII+K7~Xo2CXR`4v+VIB#`s40xt4pnpfF-kFtT+ThcsBFt%OlNudZUWRyZn)g4< zOIg$$(~a&1G4dt=;I~u1Y6dYa1kn)GVl#jUoT}Z*P^b|AFyG^del_sjZiwKxKY1e` zN@GZJ5DB*zmz_TaUU>G^pm^dWEZGsml6yX)@Zx}gY5?f|t}$v|j2Vs-HD%m8DCg2K z)d*PL{7^3XvgzaUm+x}9ARzH#A2J19{8LB;BL*&@k=MN-g4WUzavFRf2RdYedh%TA zvx%X1pJQG8*}hj8Ehnw4)wf+6pf$Z?(>Lw|91UHL#9h-LgqhPH2*&Ma2ki+bpLTR+1SIdAjJ)Yn{lhylL36G`eNu_!2nw<^ zhl`o>k+Qv+^3B%2iT-XajEoO*H9&Or=j}O_Iohb@#~2@Fkre%odM^maB`is3lOiFi z0d$BFl`ZlydCg^g3D1nh1XhCIRN+>6AOm^xyJ@Ix>MvLSMO85K{F_|Q8qa>D{MqDS zxaN@9ID7KSF;T@#+t!yQXTvmp#v}^I`MiHgD?GoPf2tJD7aAQHD)rr-)v!rzDN))~ zy-Xe{@`1(&UQCELquV@D{hu|r1t(;EE*Mo&yhM=0XOan7LMsvd<>%&bmuh3qu811K0n=NbdpL#`;XBYjEEi zE0Uisl*hbt5d;qZ(}k@oXM~^2z?}yl<#e7=(>#myuK@?(xgDy0%8-v!2h;{3V6t2kuICj^splI@x2}^bNWzO9(OZ;vvU=Eu zHavRS!)^S(8(efMgxX@xO5nR%L_h@9u`S?752mp80{gZ4TGg0MLNnDz8+ zP~WSE(`i^8p+9+?t|jZ2kM)ByKbh*`9xZGzqM6$)M-|CjreX*PHEhK}$=oY}fNrpT z)WexfZ9OJe7kMu;woIF&&3leAXG1R$I4m*66G(`K67D*8I#0MOP2G1Lp*|H7Q?CA& zvwqqqm3Za7F61$`9GXUCmYFl5gz3xleY`)IayB@F(m~1?m0m|s!8h_DYbP2~udHZ= zmm6CZx2G2YiY4P9{3pJ7-g)?u7M>F<$v=MOXY5cHDW};Qv$g2}V|;K-5s3>s+&dniA!$^#{d3>6H0+tS$8`agOqu z9~H0WU0>exU1Ts<1H`!bb3LPiwGw%5@J}k3UAcL3>!ZRI*3VJSxfZT0#@wf8)Fwy6 zM~r&j{qdd?VmN0#UV}B^U;i*)qcHip+ro?_-jtJwlxw6QcB<3~fCKLIj z%4$kZO-QKez2r0$ZjOi!NmI$YDF?ylI>cSCI&wMFcyZtBJfo)h&NMzI{!@59kq_Qp z*#1$I9g8h$#g-Ts$y+z4X7ua2Un=I7$m>6nKUu zs)G0~`LkIa!1KSG4om;~Iuuu|gr{HreSA@vENqFLgOLHr);ZafeBp43DRDZR|>9Pq!<>q*qoJ({+bulcs z-{fk5=o(=(PPjc#l(V7l6q8Po3C(FUG=?xzu54lwImQ-?p2E12hKUHCkYG;;2Z}E0 zu}8z?IU)4o7)J%%%`pOkGNuWno*so#o{{AepXbhhhQ@x=>o?71mhq9wGp$gj4T)uJ z-&=a}Ofk@=9Epzh-k20&8lN2JM-!5tSe|4aNI^HzF5fbKrgwL6b3SYw+p6~A-jxs!uFZvOu^f#2OUq2#QU7+KQ&lgrTIC@OP4=zh-;0F!@i$fU$ml#qW# z$Mc;3OrCB}6Q$~(43m$Tt^Z0 zz)K6G2Xj3}u2EA;I9J_Y5bl4Nqw?UAmf)6kyjA@deGBp%)m5?N1Ubbv;PJxqTH1nq zm(QDuLE`%SmLk}t*nDHoD2)*FA56ZJ?lDHYw!T& z3MEszrDCYc`B2^SWLP-!kOOW`#Nsq_PVukZ~@OnLiwBu2j9Wxs@J&)9~4}&jUM} znp6Jww#bZXf>kXy(Jz0GjWy0`F2anjnqje^P2aF~c(ko!!l$uPMS&GXfNK{u!)MJg zejFs4W5PKiAi4*?!0)FB-{Ut|46aKp)2{8K-(h`?Z2&9Uim<#0u)M7pw4t%B6pq!a zx(a$!1N5#c{focR;Lx$j2_w#c55vp$rp=fHLxyhP)ZB7=hI6k^SdflAbR2y8-!Fo3 znRNYm@ZD{IaI++m^Gk^&RwOD`hp0B*=o2I#a1#uD|FCUfF z05OI=aC0=Gt`mZsFeUEkA3+s@CkdI}XO4yqGU3CsS*aWi8FG|Ye^f||m-<4U(}kY} z>?mvk(eJ!+LRj_L+!JCt9m_Q*gK^JK1baKlr{#JO7dLo{Z9UXB z{l#qnw=7N?FZ=W^z`nf-rS3ELUn)PM@+anu;orS`W{UvhPPz#G@2&p?)n0x5`LNZt zo5xMaBj+OuZ=&mMP$}_3#Qb2&DRH>>gX$wnq^k%Gt0`uAJyIJrgn|I-VcfdpoG>SaKSNu0HFW6A4Ecjo~cJma)D( zJnJ_7Eoc2Ad#mIkKC-PKT3zV-0D%Ow8ITfx0R<8D##!n;P;{2iU z5upuuU&q0HYhbHx)rt8O*LiODY?l|z_n5u3HF0Y?hEDC?vydVs<3Btp3y~8C{<0=mK)+B4 zf9|Q5;ED-12A^*Gy)EJL$!E8#8?L8cDLNz?T|p6vvsM?Ll(14I0u&j?dF6ai0ni!a zR*a@7tlA&A{BLSQ-t*KZu)6if z21(+KzpZD-IA11D827!!5yd{`i*DAO#l^b*tezW!RGJo!JdsRW{xOy3A|)KTHjT^b z^xibCocFUET4DCGQrs1WDoq$%2bk`h$2t-tr$pc|&Ew|9%`iu}gag}hM86u?x?431 zxj^LP+J)`L2Y!E0pBnfDey^KhHS-MEJ?xyTnan zx1*EZ^TEx*nD@m(ICA(Y!MN1c)xyJnx&sP@YAs@yIfubgztSO=9QicKVI}+Hqx}@A zh?!jC{7FO(lsPPvqZ6pgRKx($HCX3a%+gV6Sm#}ju0E@N7(9)(3GP{y45yqB)2<-# ztVqL`ER=BW7;}_mE-jaG<>Eu-0w7teT>9bqO{K@*w%r^gNoBN^1Ie-NPgnW&5uo!U zq94bv*^Ye3mNUBE`xw`ERwa+vMVg6Zb3-NAPDDH=E@+DLSJ3zv+rJhtksco%(%_>H zA`M^2!}ZtP4i7)@bU^yorymPHJK)ExruwR%RhdBv@9|T`$eTPT(wq%~bVb6{ zk#a()fJa7LB8Hjfgy`-OvAidQF8)4qvUISxET+|FeTbDuMT|0MeMq#=bk4h_r%-3~ zi}I_B5qCvWD1DVupmJ^dZl8*t7muSbFL>(JZ|60|B6a=Rnp1=frz@uTEBphMk4S#d zXm|imsS-}P!cQIT&2z*$_{uX=UpX09Ot=A_d+Oz2Y%mYx zS4SNrML_aK3Vij4wQmbrH#;XI<9ciyKg*mCXXL{aNubEdise0g?_x-}ep6NhMAyi? zb2OyNnc}o1AD+sT@};>aBvO`aazZ%DoirzedNwHcDLfxCV}8JzUvTZ#6(}hh?U|$-S7+DH|G#ot^gcQexCKKW_h!SDdj9iDS5O#Eyv{P(VT7- zw9hagK9M=D9Cnm)rWo_Q-*=R8c)zKXH-QftAgA_szxTt$Z}=YTo3$i)!WGtyr(7Mp zMh$cq*_Ls7+j9-AFl%Z1xxtulZp!&k>4Gwu)+zPA)*IDYa?hO)!EHC)8@xXB$OGV* z6AnonF)OWqHM-}6yZ<*eHNio99t|xmB|exr>pB=XXh7;T&%ARnWJrWIyvh-gs1(xT zZTu8Ss?NBQ%AqN;$RWpzv#-09sfYohYba;&a_Ok*o4jN2t?8RwQwG;-E;$+!&qk)) z6NP6*=9!U(Lw!T<2{Ad!e8@$)<$=K2}cJn_vPY~yzAj0A1?fr=QkBKKvJ7A*Rv^s<$^&X_Y}}D zr4L)afR|SO3;x>lZ}_ZbAuKL7z~a_rNp&{D<5FkKMHNt2lsG*?k3>3Q08JHO>}?T( ze-p?;_&c^tW$(l9g6i>o5vr=9a^dfQzUbg3bj13(bb@xu=!Ese?@R3|Ax|{WM09D; z@d|&(<0WQBD#lY*Pom>dJH%z5)+36msh-leym@n-7dme`I&}WS`v}DOSI%3SkNVg4 zg#Lvduzt6`@WbBg!)|@P1siqm$8p>yZAK!0R31A+jtD2GEas{xXC(Xs8)-G<3~)W1 zUF96_;V^kv!}&RHeiM8Zf(V#|zIFG~DMF_CSG^bI0S%AmmbV7Ck&93FDu6xe3$RD8 zLi;@VqlH-F(>t_utg^#Jib~){(`zyzY;~LxIDjlB&MwQ@b`7Q!H{?M~< z?UmDmzYP2NkKi|F9@oC_xt?w%Ak&F>SEALib4)BE2lDjXi(yzpHr)_zxc%~Yqvxyw7v|WJZ^ZN8beDR()##jSy^~Y5ZmV{p<2JxO+)U@F^lU zXAG=^{^_eiOzdj)p5uA->G^-+kw3#V6K@XMxYxeB!D;7=mX4QTE2g4YtU72Y?7jag zf?+$9IT!-NMBDGGRZTEl2*a8&>pEC#&;TBTnd%c5kP~Lb&2f#kBVA5LN6z`6?Bbn2 zNCkP*_bDrsR);V^xSkSaIf>^LnRj{HD!8Tb37FpS6f{F=QBJsmluEM3V{i1dhXuM2 z5Fs;sbw)sZAybt@Kvc+8T~#%V9<)7-9=sjYRo7S{B3YDvpU9|{XGjFXqRTZ+TEFMh z<2p(XL{~ci@D!=@=QYKb_uG$Q{HUoaNG05BhSI_Cf*Vh-+RB^ z;k2_(NaujKA|Z+f=OGWq(~~kH1CdcM;jF9Sl`stJ=rM=EFGu{GTv4A7l31?(af~0I z^OsxB2lr@Ui=0fI{N-s_aA|i414P$Y>l})Z*w<|haLQLV!rz@;KoEL&) z(EDj(dGtx7$w7W>lswLOtq$~}G0f_D$GbRgUK~2FLZaXAQ4L%7sD^cGsuSn}A{<|} z7GX|P8+_VSgwI;q5~o>-^NQ%imffr22lWNx=~kTiK-v`jxNuM%^c0~K&&bO}wK*m#f#yJ&ib*K<{E7AD$`=yfNFMe1pjlA^#JIUS=7hZ8{3(oCd>wqz zwm2LkVHHleL?z)y()S|whyNd!lc@_K-Gpf#<`DSG0ZGuQU=9e$C8<~rNJ7gjXAX!i ze9vZHJR=~ooE1%&n0(&aT{7#`_J*5=41>*k4&?7O6q%$aKq`>SSlYNb77m_b6EYI{ zDrioK>9_3ky;Og~g->~uHuZd(az?t|r-5xT20!CH9e-WX26ug(G(ucA-z~e9jF+vt zS3Bo;(3tV)x0w5ZiRb(FE@*RBQaM^0`Q#WuQsY)~&qqR+WQH5X^n+-RH#AB$_qisC9bYSGp3 zcFTtXo~2#%-VPa@_tVls%yluHP#+GlS>ZwLWh9eUC4the_iz zzHW(=yKU;jMDQQfSHqUw3ISqb(0LP%Vs8JJ7Xi)?E>4^@SdMsUxaPdp9l zm=h0&gOAv+y_=*w`<{=uL7H$x%D|EZByt96@8KZMDC2}{7(!YfNyw(oArnvN-ph~= zpYl;|Bqz&Q&~H1W0g@$5;JRfG!HtcNNy4uDDr4;~H>#{j!jVE7*6S%)T?mN$FkU4x zC7J)&w;;M?gyUl3FtXCO@>8(B83;(Ushu)-2RL<|@0-wc_ItXAaTd2q-XlT*(!{+O zrp=bQuyH+`UFGaz*L9vu7Q+Gn8X~W*z$EfESkzjKPszfm$FQn(YpYTZ`lmZx%jdY3dptAeelU?(*@+1WHg&w`L*+c;?74ZB>5vA9uCqE% z=I5=8VDAOzKy$H0h-Z<7FSC*2UA$EIqLn}P7taM_R>fVnzO+}cpsC2pF z_j*Q+KdNuaRiCUL zpZ&;_R);b`jLL!`C*u7l@Rz7-yLE)H89MVI{)tca}A(_RS#L~;*=Wez}TvEd&T zn`HX-dnvkdK*W1qR-YUY(W>}K-;H6~&|&;s5XPw;ku{UcJshr{XNw#(Rr|f*?l_k%FxlWmL$;XFaVG`|C#IXZ1F>=fso4NO3v{m65{7pI z>bFH6jX4A&0G}fg@xh#r;nkPkfW7wH9R?2U?+pRzDE$+ol@rKx#?!L?7#c zYJE%PXj$w>Q z4BepQNt)a8CEVBWSGaEJ)6&ZV53S!3j_$o1Y*HtFGasI6d9NZ>XYaMwp4RkR>&dW~;k@DBg5JAz4W6C3@-}$ttyeX7e+RgC(77+qdcry!VwO?pevnu@$JQ^+- z@Bw&X>oPc@`De7UR8hKSjrt-C?bIhm>zli_z{FQ?VzN`U7K?mo?3ZAV-Fv{rD}E36 ztbH*yFR^ee=m3i+TmqYRZHNC}_B(iHb930wZ$_R0lY0(_yVlHx%a{KtyewypI~Rs_ z>TTue3tLvee=fX7i!%XOe$d76=G$+<#FuYv`|e$US>rzgLp%3|GZ#Jt&um(%r9jRg z^)#V$KQ-Yj7}lkYcGh^HjnWKJPJ4(+zUN}ZU7l4Uq`L01X-RlgzLSgt-1?9R1Kj%L zDAN@XTL>27KYq5Z6-+;>a|b{L1b;sChr*H(GtbfI^PHpS+OPg!czVWjL6cv-?jrcW z;qRrQR(!g2zH6fg|2+{um;w6K`S6;+$T_ZEA2uaWTey-`w^`Qth+#0e4dRRWFpU`* zu4l=9PqR2PUyo^sN%?I}Dj>p8>4*jPp0}QYZ*KgR19)EHRLswZ|1QG-C}I4<-p9a~ z`+PKL@ae6uz`~s?VbJdVU`qE1(7Qu7xO4Mg;j%UNM1<&RJ>L)C8gP2>&GXw9!Askh z!Jv+PVM@30(0jLT@X(h32N$lsvvL`<71MiOQ$Swcu^c|U{DwdnzJ8BW;p|?Ah0{On z^;_YYt@9({FZT^PFHk@pe`^jb+_5U??;|}9gf1OA!k|T8jwwmM7<3LC(_{aj&6!&l z!s*L@Qn65VfDd&W10U$VZ>7Hua6!Kh0V*^1Zv02w!{6?6 zHoUj{PxUc*XZ1fAW^QhVGnV`&N2{KXC|gPaIq=^sd}Hqq!6ybz$UTNU$@vyLKe(7#U&~U`_lfLQm4(HIL!@D}DLmNz z_O<}A^+tL+xa?y^c{)4+{kVoO1@PD3*b#1*&kyJXV>-8a{)*pqZ~isxzWeTQ_oFvM|9*YiFdzixBO;_*I?fWCAQ9H{ z=ugsbmYxA~{}+YHNR7o1dPH&`k8z$@wOQ`|5_&L`+@*PcQYRmuHEq4HX*&sSop=B=fS3Tw!(oeUx`@SUl{t$$~QCMnstwa zYx{_<uYerYgpB`0|ZJ&|H;t$Z$FFp@7oj*xd-ITrN4q_-dbGo zEa{cf`AX>1`W*x}4*n>#?A!o{zWSrk12S*_i=p>!U10mWyI|zY-w8cVGsk=m_U+Oi zu3Pyu{Al&xBg&o41JV}u25|4br&W}c7vZv&Ru5Y1FPa6bRy-g_^%)7bjXI7!pCrZv zwvilPka%u5VJS!Q%BE|W1KhgE+Y)NB<_Bwb!onS`c6kKEBgp*F?z;zBuO8a?cBp*d zGprGU|J8z%ojPtcroqL(C5x6p-~PR!U%$AgJ1bg?ofST6ph@t76%< zF6{kbczH()JiT>pXlW0=X}X~Go0hM}EYrVe`YasN?SQ}wa>435BhQrwWaifSFuB_p zxOu}9aP8XP!;%ppu^+fRAgF*`y83~jU8R8Bx$!x;eDy=2l5|1eBjCyb z$HB|nSHRYHcLYkx&Fh|qYu@}r#L}+9#FPSZz~XBn!nSTnmv}&w0&;lwQE}BZR@)O{6HB78lJRpNR z_k@`Td@>&6Z31bDIsn#~chizn$8|)~Vjv>Ar#i8Tx+yNq425yf!z8#c2VYDD_r6IF z*FO~lZH9SBF&i8|)6Q3x--pvJNIj~LA5-xn#$);0dT>x&Z1{MejxeeFZt?6~lqJ=* ze<_TI(VZ=vD3qBKR4k7Gv5D^!VLs}(&PRK}V7RhtW$D?8@zXqiP0UV8&uF-12y2)Z z#>8@eYUD?b&pZ?g-!^Mn0dWn+w5(2C`8n7L7~iUj0P3qEqH{$o_P!X9tNNY@7xX$B zUf8i1j$ip*t$czBIBo-GU)lErxS;ok;f3vs;e?gnGYkP8;L5(o!v%e&zzf@#zzMH^ zpY(uS{N``q#y!pe48!{8_N77i)kB;A0f%)?t3Qv+q>=w&}>V_ta6X6FGh=QvPEmi{yo49H#U{sEib z*%tD1(e}0QoAt9r7!Xv}emL|5IH}KsAPj5z(g)!7;TV=R8tz*AueNZj=6m3WLyw1( z`i_UkH!gtbOCQw2=vqB3S$jY>?%EE&TJut5UQQb@9`@+iy)X>OfR5c@*2L-7Eh_OW zn1(ys-@b=h7Vk?#j$Ixe>G-OFiOGUTjnW2(IY<(7&8?rjc!x^JPuI42LdbzFIX+m-vBeTnb6)GUx z7s2sw+(^_LsVo=GBz9H5{|pt7<5%7k^MG8{9~G2V1?2eGzejpNrmg%jTs`1q7}aS{ zSh({I7}l{roU`g@@SQzQXFVYLf@*nt9XzsmHe9pje*(-a`@-GBr-flyGe@5b z13UGEb6D*yA zc;!8?-UkWwegB zB{ddK#Cb}ko)IDDgWL~7EPxd2lsjg?LT{t@Th#a@o}^URoq{nRrV&JPHx~U)O)DT0 zW+*04Rv}n9dq9rpx%!74v|6zV|T!HsUv1o(nDQAL=qL48c0Ibpn}$eF8dg;RRG7f$MVNWd0ULMFF-3tkxZRn`NdV?f%%Alhzs486h- ztN>KL>Hh`7_c1-k!>CRJ;jRsc6?r(O+~t7*!A@4}cQv%^Tn~pXzNxAh5GB0-Y1C(6 zLf0m^Zq-w8Mbi-h`26UFKZi#uU~~+_x}xcDK<~=r`L}7=vf4agS$jZgAqy7g0kQ2} zi4tO3k|gIqQSV4RJDhN58y{y#EozL7+KiZGc{_alr+#5fKr?<}w zh3GaA`k&$2b(NI69RNPmbsXHb=Q+>?I>8ld?t{BGD*$t=pg6!EswzUgYn-Fj{f_y--RiX z+W_W`i2)hgZ2wgZ9Yr1U^csurkk90pcs0o5;crRazsaV^xEq%Vv(Qt9!vV4(-(ski1;l!rDYA`1`5l6}4fScBu-m3P6@TNi|3 zWf+Eqbw&m+ysUNoY2j^Ic|aEKcoQDqJU3|mn4aTcROdb5@y+w#oaJ|u9+2SuO>KM# zQq`{ctLCNc0ICj%i2*_KuUqw`7z3gX?Zx|F4qZCz9%R14l)O)GUL4HB;_;WZ{d@BR z;lH z&9%w2W##;;Hae1O_^kvE4B>j6B-r2$`Mc4TdV?HFVC{CLt zCQykDCI&<|eP@XQaTzbNSVu|LPnv#Z6%eE#5De}$_y-cg7L1erXo z`(ZG>_Yq+s!tL-jEPHzmJpR^;aLsyEbWf!*X|+L~+4C?sr`HFgg$Q@9g6Fm`giGJN zHzGtUTI4ztRFr7zfx?`(q?w=IVsul*}Ly?G(&0WlYN;4PVdL)$-VbwH@iaOToq!_!+9 zM@{vyIxtaXONC*zX1TiANWD7%7HwYxljr{=svK&SpH>rC;z_F#=EF-_mTc}E->C})#5I1!>=nD-gej}hQlD=Y ztTti90Qh#WXTj3Lam-5RG*DOv_O@XOR0>=wjH)%8R~x>%t&RkR%tVfww&iHOi8h{x z0UQqHu5t@ROb?ZLV1#>jKf3O(`(bgMCcpJM9~vJNUqYe5;3qY2DooAbXY{U<1H8?7 z3EK&kl<2&v`EBKmIWL4yK=Vwo{8YDkY+n54f93&a!=TQ+GC!JZo&+}hDsxJTX^>TJ zgu`2A! zP>73|mK;JIDMahLrSku+LLVWFR}z!ADj${bsfY$$5oW6{BojitRY<0lB)twuTbV0A z;g$l*w}pS{r*ukToT&rS>gv!%dV$gznO~uj6s!w}(#a~f70V3S4z1j@_SdG2(eq|x zm8-D(s6P9IMF?Ga{)5-GOO(7@d@ZFuS+^XXiHL4zJFN|ZxfuRN!i+?Y!FKMM2~U5c zE{AkI=*uf2Q<@l=jIwD(?n%M^iqy@}h&A_bAQM;G3$IgYwki*dhw1r9Qr9C!Uy3>( zHVg#P`Htd;y7n!9*AoV#=nChx!e7e6lPM;HsOw|HcqKZ2%~ZoB2BbJW3=hkBJD0)9 zYrYBZ#8!#!UAZrtgx zU$+6dZf?#HMp?ikHU^D4&Jv&NKrD?*$LDJ(H2GqFPpIr>MqaDoRmxwf;nr-AvM9Rf z*K7k6e%q^TKsDBYv`?w0$i)w7Us=2-oqwI)Ec&&z;iAX3zanjM2M9AkHH-PkX#=Y3 zq)^NUQ-m+g`f^RLTEkg-Qd6(jG=nYp+q&|AaF-D-g3ALi`g25mj>^}huoYEGwA{La zcI?Vc*iPvI(Sj#Uewp*4nYh_7As-Kj-7^&lM~g^7r3WNZSEmEO83V?{HN%gH3$2D_ z)aM*a8%~qu_ckHhYdof<+)@O~O1CejBx}pLZ~q+Tq}ueQ?B8eZlL*0Cu3uMJh)p?_ zj4vicb9Fqp=e8Jn%~L{R4vY<&#s7{ID5?vuyEH35oW=+5_;PqE(pibvS5iZ3tTu(=>ZAm zRm{&^Js@pa&LZJ;jAtr5bm|NPGO9~|xO=}7p?}A2RXfL$U_{JAzG}o5(6Q9B;^Qgt z5o(hP)0}ZhWT`HIzj=1y<2m5wFHbr-B}?MTDuO=Ay3Ldhi>D-d-fNf-vvcVJka#XQ z3`Ww8>iEuyF|lo6?!Yp6M7SDU>n+Rqb*-l?`;km<9{p9L&AL)RSmC3x>E7724o-dZ z8d&|#h6+#d%gV3xfRM%VtU&pO!GM$=5SNm~VL*m;>J9hocM>#p>KQ^~RE#*4ttQ-V zmYDJAer)~Aj5#OoIxeQ&2P5KP8CL{ybuwIWKfaiO5>ukEO-2+UgGmWxowS$@;=da$^vPN-MChZDnRf+xLcX-_Hkh^ZRU(Y4O&BdbAWAv& z1d4}~!-cPz&kbO6q#Z&@v;f6R4+y1H>pLbprTc@u_l6rsd>Hz6>=w(NhCOm2(mwk* z>AS3PLTi`_*{+H4B;|wcJI>HpYtOSDe=W5qU4J@8f}5Wr$0s$^yXeo7-puKdPEf?C zso6LkK>gq?X|^j%`y5D1lI=>ex=<(U4+2T$b@_V<4*Ce;!yH))P_d7!#or9_iOfr71#t6EJbz!$p>WOKN5Jr| zeIwgTB3xDbP}BRD(8~#5wKSfRmipm98l@!icg#o%%YQ_t*JzFir9>SFQ`<8!2a&oo zDKQR7F)86WR%88B*=B5*4Bz=7g^?8NLo8!*m?v#PQJ$c%PKB~X)KDD{bN?cV)|9m= z>UeM-kfJdNCFVm5L$fF~N(sus^TK*sEZM7)V(|3yG1z~aH6c~qj~r7CS4&x`YXyY! zd{8l{x<%B~Jkv}9b@*r5zDXOUd`0@>;u1WcQ^JZZ22@?{Bp}!3H#Gh|QUlOp*|7<+ zT#T&bIoZDoeU5{J!?_+-R~@3vj;P^b3xL1AJ^R-aqJwB73YL8b!PoDgi^lu`|m1UBoONs&E>Ht`tXQ5POaSn(r z)EQ$>gfd6&7el>uV3Q%ud6dXxwYq-N2tP3)IpO{c`6;O5VZ(eVp*&LNDTfN;+_@?V zOY*(neBQ6+{(Z*5@mT_R&!fN0`(@<2@XREXpU64Hc}|5Gk$O9$DS8`90g+6I%aSbl zo_j}fd2wy{Ja_d+w!>KlGElxGLciqjO{%Q0{c}=?Lkf(9BQZj>&pb-sEqZ-P=`w{Q z?{(?hQBLnm_{%9LIgwU2TV)RTSl$JO5q6yq@Iz4*>kd_H!_}#Js3VhTuj+qN*nTeecK`q&07*naRDU>UHq3;%Ut*q% z9QUiMu199{dSu0NVLWWvrLx2zl$ej|U_K}hNGc45MZSwEUz#;8Reuds@!Y2LG?W73 z((EYZ#AcYtLPIP%Wj)TGN=16brIw&qvYyrC?3&pEjfdB9v)G z-pODFq+v-pVL)t_`Yb#IY`Bt#r6~zLNyDt9o)7N5TI@g1`A)(QCp|e@Qk~&$m41_) zkV%w>EbjI!&!v(cJ!@c_(os)*Nh92|N`xSLR%CxA^i1lW714!CgzqG|H@I^QpC|Er zNZL(GFPn`?fDuhYU(x*+-CyRI4`x2XyN9??l;5|gJn&hsl^=}$d0dX;1A_QbP zX|>c}qH#%;FUMw;C^m=IH#sZ|Vy&wePvbCYOKXdg*EC6aO5 zgy+&zLeG-ake!E8l6Kux<9i=IRD(WqoxA8Qf<7N5&&&1ZGZEUsQ7y~|)o*y;7^%29 zW3A7;6+Qp8(4P-~8sXiBRzO1G)TViQU^XaENMV?e%1V=jAtkktl$ek>7@%l=XNpNN zJrkaJ^h04F0Y)Ti%c`V38@*=uf*zkkVq8q+LX$#BCBoOzoF(Rj!!)$_=P50YB*rO0 z_9zo`6fqVsT2yA3i4>kn4g=O!=pY{dW(6*%JfHM?&gSW`VgQ6fy~MaBxo@lG2`Jhl zV7o8#&UWVVbdeYg(^$$>G&eE6F6Apz%!gTL$%v9G6_7gSK;D=TNtlPtvY7>2W6F`% zs2S5qDOao|!x&(0m=KF;pTuMsLUv3jHBB5+(=s6>IJvSZ#~k_k4gD8z;^o$vDnsBOw(HAV+%XX`e39-pqk~J6ebR=Bg)^%XRczAe5Nl%BR zLy2b~>w84vX~;9Xl{p>>J$dq}=>8@B<-vbRzal;h>wK8T){0Krwmmq{v!`cPa(>k7 zJMBUNaZL^-OyoJ4MaSlQkB_q~B*lc76;yMQ;v|pektsm~MX^3#`t zZNFB7{?rUG8j$jXJ8#;{^Q`$_WP1!m!Rf%2&TpRM@u5Evz0wXW2ZB^73R2m!t5Vx96k8e8^9ihW3EOw5=R0eiC6lsbz)wjtw75 zVOgq${!EKY(c`VP{%f6{B=kirm7bm#A4_h;vy#x$kfjlV6Sjo9bso_dl5N&-{o3Y3 zetp{CWW$XFo|s%bgWCN-dOAGAg(Md8tnNRb1y}@K^+Zn|{KyP@k+A+r?)@8>kZ`vX z%2mYEl98O5#W_^#ZL})|L^2sJ&xGWA-*@W1KgKjGxqR}JehTSdYI^6wDKhZ1WwHKh z2@}GNCyCI`wOKwdIZzD_2xWh#;kz1i+xnDPnjMgU+=t={7YjO1>S+;9q!V-D2cD6y&xaWUsAtEb!jQ6vNep7x zE4xYWp9(w5%JNax32D_1^qAs2`OVE+?idkY&jgnOnNZS_VkmO43`?_b8JHJoI7fK) zbC?nBk|6n$!SjgHX42#9De|@C6YWPV@q*_O&jmq$(&v=W={vu+_Y-^WIHQH&xfIjl z9KU|w;5nG`e8@`pt|rE##C&KNIAeWeneECO^O3U7M|eI8!p^+pIg5N5Ij?F^Nyw9= zcBO#080ixupT&gu^p{5rdrUdf231#>5OeohOyVL;hOUEN%A4hKayd85uYDlLnv^L?Snw|shc+tlpqMzGfzR!*K zT}q)k&u!;%7U#W9Nea&&Gc1ny+Zt}f-G65GNypzh8aS3}HtB&Y?XQmOd}Og7+UxPy zE)|d@VH=UlAz_^mQ?rhR2W3ftzjSnPX_7vbJX!5g;rvJ znVwz!Z*D(l`P>I^on^n$`$~d2$kOs}(#3iL%*cp@*a{mzYGwScY-i4O!O2%8<|B`z z)!AmdR6r!25SNmY=PcDcCWMm?l43&YsZIzN<7>I(shDDCIFW$~F@>Z&*CA(EtJeNV zJLc5JhqMHg-#07=Y@QD8xS%|BwaBC_#+U23OwWfviHy)A9UynUTP9o*cIE?Yml&IL z42Ozrpy&wsAhk{;upYSfK_2U((fiATXGOQ!t`!g#6C$nCp-F4i#)RmHQl1zE9}I%j z!sPQ_(U=tT(DoU>X}R(lr_|DyhMpqmGd&Gv_<`+jU1^hIMrr{g!o~bc$DbC1kQhj7 z3R#+GNnr|tS2Ur`oFDUf7JsMZhxB`H{;K&r6HG^CeiLI>Qh0W4mi%gADttT*rqEwa z3`$X+tD-$GY=4Bj6;ZBCPlxBzWa8#1aBL8930hW z1iO^etWPe4o9#S<7kmwS5>E*sql;wh42DxSks}ABmjP z;`!hLIef@*InIdb@oBo@-z^o8oGS|lE67;wp~Z!ZNlXyK>2k~FX?ZWYU(@nbt^RGE zky@nZ@VR$E%Z^Rqq4uBs$G~@oO@TZ;Wl|4L8qARywh&q8Sz$tw#^~G5m$ccVgy$9~ zB-?H{PDV_7GkVIHUeP8J?#C>@ zuQsN@=J}9>L1oE@G?5$A%UH4yNKGGiJslP835Qc@4%PjRQI2tG#6S88*X1Jo| zN%;Gw7UTg(NTu$yzy^|x&t-wb_H4_cz+u&8R~NrF1OB*f zap1u_tk+QZ_OK&iNavo3$07~+=jPML(~+21%ZKRI{OpoHgirCz{?+Ic;GphJ-d*{O zQ#GEYCE1r?A0;wqTdMW?FoHNBBtp4F$??8t47#0|6WauG_qE3)NjwoA&9SdGdVeef z>hOhjsequ6{rHB3@Xsx;L-Y3auwwhBNLUKam+dkL-=axJMf8MYpvM*7I zerDWRt^2Z8JY7;x2Z5>KFiw;Zjq`C{bCfrzoZYqW@vX1huo^km@$kV^*f11%W|PW- zKHvMvsSFs#Hx>h-DLq-xQEf~PJ6=s$BFF2A@zBG}vAys|C|_Qf53Y`!f%&MW@?I;t zO1n}(UVLj6{9xrQcyaT}n8LwL$oqN?g)i(iDNso8m$xM|P0T$v7TfcO*3N?~2;m#w ze|6&d;b*~R&sj>C=li`FS3vYWtey}e#xj=Q zF{aid~QecgBdGhiO_YpDQ^QENAU*|(Of6RFzHQY+uGlyDj{&W4~^L+_} z1&#x~AgD;Y&SNS6B*%v)3n_?NJ!8* zK%+gW(i_T>ni5E!Z&HQ`H)}ge1U>xGdYICFrtcGvE;| zOh@O@b;FK?lLZ!fiQ5?a9h0#KBr8lvRvwUVw9JHGz4`A%%M1ngJNG%>%j4p*giV@r zJFI1`ERq&eQp4Zlp1jOr7{Rr56Q0Mu^e6CCke(I?W`ne}o1PD1{Y8Xk%SB`Ek8=$V z(TDqtgj+{W&Bde2VHSLZ?WFrWi|-_1P+9aNJ?|PGb78@>W;PF;e3TXD!y(@l9R`;4 zPOg>j8eRdxaI4QP`5i10TA?KqGo*7b_~pJQ(qUPW22#9}CnkjRfY>%yWH_8(vGUyN z0Wk(xG$!PGt7gHESNo(;RlkS{J%4q8+{z4&)x&y8ekIG$gRIkd7YC(nN{BoDD5FHihzgj^r~RAro&1s2lnP%@pK4#@&@ zxh925Af>EGglqOdWG0Rb6EcMTa6Wxqx8_11Hi%?h<*}Y5`#H;gZH}|h^A^uHlx6n~ z*;YdO8OMkRU9| z#;=y`o8c3S9*$(oN;3xi+dv7~_e2=l#eofx#;hBjhES+3F(Y-4iJ&|UwTuCg*5xoU z9+c4R6KkRcA!0EYpw zr7q5*|1kvqgxh2a17aSY`sISWn`*>jt9H>MdGa3P-~&B}!BM?O1PcbOmIzS4_suzx z5GkFOZ()pk|FKq2h!SEbj0m!S(#z5Ct7rBBk0cu-<5Dz(|gn2?O?gt&xj&eAS@t{9cK z2gF7X_Mb!nk$6BZwO}SDcHa}eKm1tI@~`+|3)@m5Q&Rrw@1b(@IW0w}3hT1PBqIR- za>t&zbkJdK%8)~vd~xe4_(JoatX`DM2Ori3w9nA8D2=t&-%Gr4wej05!HF;fSz$=B z!Z@@ydIWVi5(}4_c9n;v9rv9ch83jRR$0O_*k?ZBM0t$QcYi0LH_16GrK_IksWu-n z=|3yXhnd|<_%|n8md^niRss2d0lZa{t>ZU*7J$v0g38Qa$4_^jEk6DDzMCf|grY@a zQI(8=#ei5WK@#PR6DlbHJV&#_fS41lUp}U{0o#mVIT#c0*+#gOqUnB>(T1@khGAuu z4{v&X7W{Zs8=fTqgX;+tjBuqx4R49+U*R`=YcANlDY$2zpD>+dxnzAcvS)-_hrZ7_ zOSkm7@4T4X*Zf{!=p_xYzTjE?5vkwnehT37QqZQer;Dtg4$A8&UzeWA$vffr!IL z!RNlwrv>0~$@BO{)CFxIP}N=#LM6-|wtOcY!gbzWhrmTmldKiXZTz~#@W^1uiY+GmrxxrA z?wNFu$!46b%8apAbV|cR!u6vGNoLG{R)3S8 zmG`Nb|Lh9Mz-jigv$`a#IPnZ)0pjXxga=oO)fVh+~62PCdKeNt<83xA*8SU_SLny#ZeY07IRg($Jk3vSXod@#+p5lDL+DXCbB_baFf7#(Vgqhp{V#a=tyR#nV`C)V z9|gRjoqNNC?oBX#;KA0)zVCVICoym|_WM6WCPyrVx)Ky#dX>uz={Rccow4y>S_vb= z2OoX)o>=xHOu=i0tA&@7QeFVydn;$bvzwO1#;A(z9oc(iAOPdf7Xu=}gqVkkGR2rN zs~Boz`_0+58h)k4QLFb%4~Tg=Q}sh|Zf8xHZWr3k2?7Ah3-X`+#=s53r?inQummD~ z$Igq+C3;d0?%vc!Po+iV+bIj8f{W@*g-ba>PL7yxtc9Y7fnmGoQTfCk2f%0ctn5YN zdrTnllhyx%e{Wd@%ZNQQtaEQTphpw@S7pz*Jb~E!gG4G<6(f)P;-{G$QWz%c$+V%~R&^F}d z-d*~@34O-|imvpB{QB2htAhG4wlVbY*bT;a9|*_w85P0%U>}O#rofBOknV@aoZ_^E zn#LVUQC0JUZDJMl-x?{xZS#ZcUY|$&{xAEV9h|Mm=SSAhhgY}08S@nQ_G9weherL| z8&}Q(#7>#(2n%~+k+3Qvk-p>--U%k9vDn zB}zLVN#mS(eoH1Ofh$nmUzD({NHFi?s$)JfL|m7i59z61fA2M<0&)l;tfQjvXH09F z@`uU|UK9uS7z8Kx8wZE?8DTYWpb+(~6*J)pkCd!O^%)6Y88W%m;#~RR;c~%}$71c^ zm}clPzDyqMAFP@Mw;CyC5gh$5OxIZ1ua z2fZK8)36EZ`Ky&wx2`a!ye(=dsM;!_yF4>g{SX}MANHH(m4)UKqi7)V1_iAfhD~Xc z`ix7=HZMoay(=QDE_76yKj6isD3Fa>Es0u1WLpqJqE!k{l>wRz9X#l2`~%S zH7jPus$RRcEefhv4W8`Gu66&KIKBnPcX;m+@Zg%cWacxfehFqvyE*}V|1)?p4C$hI zUX5FoQb14u{mj6F;XAKC8xfXmygb$F1 zmVaWTc~))wW!%~Hd=Qp>#4enqrI1x^{8Xz~a}lvGPQ;MHVN;@>L1^Q6O%V!Rx6c2!gdat z>)h49%~CE2C(8RAmb5RSGf&S#7M>5uIJthf=Mp~UNr%J(BU?CVd!>|CYyb0x zQ$TFsbMzKmRq+<2nHE$kTp?U)@jbnv8Ln!1QgpeP^q}SZnxRKVGIOE#<$S~Yg5UjS z^vPj$cKq9A2|kVR3}Gg(UsN)A;rCJxh@$!XD`&y28qOdMZ-Ywc-0rmnqif0<=f-u# z;Myvo+b|%C-k-0Ir{6^d2 zaPeM~M5LS9oA4v#myQ$i@h(sb2uBEFCGh9dkJ%>ot-gKGqovp9;poHXxW+N0DpUfA zk8mC7i6j*6OVWPocZ~BPX1NyB@lfG~0WCJuw<0v@bIW%wA=nn?B@ym3!F-s2YN;p1 zoK)_9)!vt2K2on4M+2qjBTw$uM%xXifLybDCfrR_puTy;aS?$&3Hxn$uJA0V#QdT1 zaq-eWkyce{zj)c-IO1qH0#mkDe*ZxL>rt`#>X6B;XPg6b(z0VSOd-OruB}u!PvQYV z&&PK%s(FD!L=TAR4%ZLwJTWS&AH2Y?ATmMe7!b-6LU}+?VE8*GDDcQuMuuQ%9uOb? zjMmZ(yRvD0W5rA|>`bqi&RM8p7z#_wwe2!~Vtq4wF@rtx{ozNG9u~?2!tF)f12SVn zGkmc*{hn6zg)&q{D9cI#!FE;Xl8#|O<>SQp_lZ0yoD%Y@(I>z`-J4ps!MgxwEq*kn z)P!MJ0!++@3{M^QuU9y?c_x$x#0<|l_SLutgq!P70kL=>RVZG#4+sp38U7TELwP{7 z_gC!P498f~b#rto1=HpUK@Z}Gv~xZzJgRwKT*7oMU^;v-4CZ-KO^inx%nWzF`aDlE zzdr4A_Zi#2TI5_EjfBs`Jwym>B<3V5%twx?hq-g1UY|Fd0&@9lGvLv6^JDYz3R>3- z`q{whco`hpb13ZJZD4q3&e^&ep5NR;R-IO$d1XDmj2K%OhGhbv3dpS=NUq}t&WHSvWL78#yIO95ao>t+R!YK_$L+ih5wGV zPn3{}{56GUUwT~cA5I9N_&(B&Ub+d|T6%fg>Hx2?P%FBo+E$=>RdHSYyUPQD%Kj;P zj0^i%w`*H~x4=3<=mA1@AO1=-oK3Zhp-DFS%rGGQ1}*ymsNYD0!6_hz^%@Ev?6o)a z+r4YhHPZOt+PT&+DusE_k37U0+(Lw49^7*;IH*Sx4DZw@d|mOF8UxaD*S@XwkML)s zoua`!g3Suv;e4sgZVaSa~RZy$JHkD)=c>vwH~$JQ?-Yw9S^9Ii|1H%jw-h6;%OqVW8X?r&S7 zhR}j-oHyqAL;YO{=A$w|U8xNINvN!eKsf?Wg)$zR_fxeoAI|=B6t*Rv4-ZFEl;0Z9IaZe)|)DVD8*bTI;9?v z^P3-wVJ?Ci0z$euit82|tv07*naRADtuvSOEToqoM#CfsFsta0r4!{H748fc0!x<{>1$Js^h> z!uEmP_k{aKw`T1zEeE=i_7Nh}7QP?xfY?kAj3>mzkVq~Q{jx~v0l|LJlRznD$d@0C zI5tQuV57&Td?5JrPQ>WgurH2(k9k0F59p@YiqJWgNIVdDOca2gNqL%fV^IKjY3w=` z_JVun-QNxvQz^7H4jqsPYsV(M(1 z2SmMp46)yysbuM*=)yJrmyNH%8GDR})BBHS@l>n_B<+T+d>;!(%c_otqECu>lYkXG zh3X{dEvMvpDJ34lwNIpgYw9JQhm4jE*-X*>`z)_K$K9UWE)|dzvv116RQ(YYHhwqu z%mBC^lNE_Dq5mL?!KrHN*ud2-af}O>4T}oD!f&2X7H;jZlXyU|!uI(@7OVRNo*2Be zFi`-7v!E~_`2JYUq9>g$RAwZ~hiQ@FJRmL%26}j=T4KAE)Rke|FguIp!iGmZwtTDL$?$?R^eXDf~D3SMX$oeSTP)x z`4)RXh-_YIJRq(tS6ClNH(uCc?A7>P9*|o0bl5O{`o&od`Z<2r3VoE)R0O|R&x>YE zBt0NWF&Ji@4F~3f!^n!Bmvug*;+OcnhEqVQ5rU<-P2o>4%;|?1=0qg*pbR}15+P(N zR0`imoB#zTw`Ie^Z%!w&UwvGwA);FXBpwhd^HreGXlagPm<(h5ln2Fz0ZCLiumWfg z&pzX@3WTsq5VanI>+J#24p(fC%7!K0jmC?C_d^S3i&@whOQ8z`qI*KlTk;spFj7UU z(6OKkM+~=)5iw)FZ9;E24gjD$7$_|Mc;wVJZkVPjgHK5RpAGsWZM+Ncz}k2kUTg+a z6XVb3ShLZ0>&U6B!Bde*c?a|w7dSi{Mn$h=ZCgjS6uzi{NPpOd?f1h~FGSKg<9kX0 z(Z8X*8Ln(tRQ4;I*Tly&!FhyS5C~U4l!aE`{t^!ezK`RkY7L=c`+?rW;HcgsqcvTa z^{?+IY(M4!v3Neixii|gVLHtH9AZ!e7>_(L9abQEgWw)J$8``p4%`U z6z0QrUs(?*vwy+gBt52lQeY9iTJn6@*e5+l%lG^^&~OS!H9_c9_?Plt2))FBnWfAs z?r4pE6vJUEb4w`{k)ni}yBV{h*c287o|=cV%>!~`|FMBb0T0c~md$`ijG|yC^cw@; zvE;j_EaIPB^k@tVqI*Dex@y4#qC6_B)cGy|Vk%65-fvq1pfK{-xHH+j|K|MZ^qC$I zObJZUPo@4A) z3bR0YVw6Hbts^S&fWoer?~6SX?*dRB5G;K8jiHlSES66{=KM=NAkr*Y=*61Ub7+te z3`6FmVL`eF1dSM&Fd*-JoTPo}c=Y|Bq#x-%wY?{yvk1Cuo*0+sBTu?m&xdE&o0&~C zHXj~gX~DQ{nVikY6Gz5pU2ZFt6Y1?Bf3M*b5DYiEjR0k4k%pIJE2V&3V^k66LirzF zI}ffjV!=_E&@n9NfiTBtzN2Whz5Dz9rjfEVj=>DaF)N`XR>j0RpaOz87w)IVPqi@* z!={J^l6XKuZ;D~swq8b+LkPpe$U=mcB8j$B?wgj>wj6)d^UE|L+@)l=E`do}IG@6F zP?pG>UY`X&Cicv&BaREg#cY;R-7`XZLM$=iIu9rX1ch6ls@@d7!_598d54-Cjy{{` zMBnF>a)H7nDun7i$^#NA5f;ptqSwa*LV07PYf^uY@_^Vvs#JGL>%sF@R}!IZLhWTg-xG{xD?CC#^HCg-Zs#-&#jTUklbc zAdDv^=J{}7I>_Ws(x7@ptc{`EbIW%=!Zy1QxQp8NIa5S06mFI0fn+e@sx=puc_3-e zrPC97wvrqS9^Y{L$)hRJtFG~v%7uu9nZML<3P=%!2yqsuVuZ&N!aFJ;n1)ppW7wfJ z6yqwJ0#Z4guo&XUh!nU_?0D*M&BO^3i25O_;qP&f<-9`ctn9uU(~Lkay< z7A>0xBn+2gEaA2oVjl~b4Fh6gN+cKz#L9g4_2xRnd@27KAt~Rs9Mq+CFTLC$VOI=(VhpjE~Cmg zzSc4mer068!t}nFaDm#dECxiwWcXy6O5H##JWk6J28?H&|?(VKZq!~bZ2*?i;?V+>lhdTR~voM=h;fAL+4;rCHN zo{Yw)WItw|xl2(0_sY5^-aECbdp5Az^7(rp$J(&f$*CaxoTA8W5h>Vvg}*O|nY1s& z&FjGl#0{@p?QWIP zjDR2wL}%(Jib! z?~7v+#>kZZF$M&rXln&PpL4lw{9-CVl$VmQLFq#;!z3!RF}}gJa{t>KKUwv$A`O3S zND0{JAt1!v~s?OKl=A!E+%R_lA>grbK>Yr|i^++=tXwP)HE{AT3YIu;#`d5x4t)yV* z{7T*aA*!2&Y-Rq#!M1Cb-%o#axVwZp_^-1SaqPFr1{=Cg$v59mrDZ41832{X87u@X z$0Tm_S-yI8zhE$eMewx-mngtnn6)piV}>1FTBv_C6{oE{`NF7w1k<20n{w-RJ|^FA7_4rT=Ap+nm6gWlw2T!dZ+kF66Fb0jpBQ zaLMDxcT66Kx*DT9kOV6Irb2)iiQ}13o@*^nU2G+R=2NfaCyWT}vASQ^IoL{ya+W%{ zF=szL4h;Vw-wrT;AHp^GJJj@zgw8i2NDAAY%`K0V#Q9^^b9!QNKDTgvVuADmE<-^4 zMVLx|$WNBrfg!e&`NT058}vU;^pwHa`&@m5l60Y0uhO?Q8baDGvtLL;14PbCqG_US zL*hy_dy5ORvjJ%^xUZ1Zyh45dk#jq$c$qvZGH{1U zzs+<5OOUTfFU~Sgpox1OGZugND?0vDHUbk9qzTeJ2B~R2BLadzS zM5wnDJbG-NUzZPg3B|e3ks|8u-Bu44Y%`9>~R8kAje0^&*z})Vu z8=|@t($ntuI1jXv)g$MXGAn49MedFJ_ZG5k9meJ>%NpJ4_NxJkcA+Nsfe3PdTtB$Q zEs^EEj>{p?np}PFc`&lMF|x)&{9B;@R84a*K5OQlCrdZZ(x}$@aCzB!8L5-3d+B<> zXwW68z`>Ne9fPWC2u@`sHxBdtXBIm76}72VlkG%Hbwht0KyB!|q!P<{1hxD#HY!(u znwTBX?Mu$dF&LJ!su9HK$JRlOxuIGa%BZ^|25mIA!829H9%G}S3UjI0{e8O`(R~KT z3KNz8khOO)>kSwJ zwkK1Lt75nuZm)wU^N+uuOyx(fJWc*-Bk26yQ*!gukZe5KL_5MaY`_c#$D5L1fW8NE zJeQIOYPV7-8DTC3+Aa#8{Qp{Le`^PGOxdyeYY0i*3=9oxd5)v+a&?0A_z34EdO9`q z<&;gH<0{2slM9x9;_iw*Go2|!LbaJp_7dAZ|4FQ;vfv~bY0eb0?qqRf^Klv{okUxg zCx{8T;hd@Ei^_b3mm6KWyG}VNM+V8WtmG-?aTmG!z|V)(`>G0Xm#QDEE_-CYIf3L#@Ms&T*mQLsn|$ zop=_^Hz>QoC^yTpB)baLI?8eJYPU$iQ>$?jv+cEaiKe9maRL@_PN{yfX-j(;yw1cJ zXz3jPdsQU?Ho5d=GR_|sP=_6@Ouh+~W z^1#PT*w*VroXp7?3`NUd*S>seu(tZ{ zqe6m6opfoTbi*tl8{>_0E~q*v+WEDO-0P_gBhmBw4~p@PlB*yy<;Y}M(NEUn>8Jc{ zQJbp;ny|$My|ma4=|S7oX(U0qu)dsKd&ATl_P&{n=+seSQJY|)JZH+B4+-xS9zW@l zE6A_YSNN3xBs{>3&{vO4`>yBAOwJ({hCTC{y+|{FfZcz}Atb$tA-)5&1F5EEtKLLl z3;FIx9U4e-T5aHc4P$(kmb&IQ>ax+@srHHVTD((mp05v9?tfZ+5p~hg;43WESf5iu zbPp3es)nh5C5WoZOHv&xm={PwqO3pePIQmQXb}Xi(O-NxZ+|>+5}ABBw6+Awa#5#C zV!JNpc*$Sg8y~bEfy%rEjF20gxJE_d?R*|qfosmc&1W6U{HC47vMrue2gRfH$XLbt zMU!%%J zU!`~GVJAVHfg9E-xWeRaMOi$>_?P zMViwAB+dbMe+P$gp{NfpqnO)5{^05&Z5$#CN|a@wEt|FX{J8-@1ig0*1*XK8CYyl) zWIn-k;G3NlN<#2}isKOPtE~LuL+{L9ey<7x=8CS zMr_)`%Ybqs_uX^gmxq`&3awzqTTgh)#_JYGT-0{|t=YNRnoLVhb>~C11}mbN+gB?wKr`P)!T9da^pIe>^(NM%|V(}GF|Q>B@tXXkY$t?;($whvO?2a z#)fJTAm6!7zMCqPy*SY3Xql^I%3uS&yx=k-a3`=o8DHn&(>dd1*uoCM^`fzYh=AoC zAUD{H*;Ub`v^o#-ICsYp(9Qh$`#R>-Sl%iqXsB>)TZ(Z+84_C5_qMXXc z{OwlpOTT)oR{*o;TTD)?oeE(kqo5D;gl+h_(91Y7WH|J1C09`}6a8(wWUC)v2Kl8u zH3GpBB^_<_MaW3H+x*>^7r|>6e%2CZXE3c1{xqt!AG-_#(E(yvrjT<=)Mj1@2|W{y^+C`n!n*s27Sx z1v3@q-Q)8;Q+5eS_QHEpa)n-~$Dqt($+Wp44_2$KTVB5R3o?Hd@w3?>Y5yBRQ2l8oQF6Ykr%rFTy>#$Cp;yKa&-#oUeq({Hit^z`}6lU}kBp;;;i!s83J!w)EIM&4e!^vM`I*UvjjDL)JxRiP8sxF7oH{i~VK0XZG11ic z`YZeX;S(GaXGgxcT2YD)>mXpE_>byiVF2x0L+qFuN~ta=(}VZe!OxCha5ZCps#rK&hQVwe~+1tZhY)`OgPRDX0;pFF{PA0hSEwW|Q$J zG29q`BQIErS~gJo!W2N^ZZc9I-_=Ru79{o5QianeH%$~LQ75MU?tb9t1zQMQ}X zB3t!@drnzNJ?{f%eL}vKQSmnuXO+D5F@oRUPvlvF`B<*T>n1x9VMiJ#Ibeb$KLfoh zxK;jJ!Q%>}PfTyPak7L5R!6!@YrlkbHG6Nk)6iX9zWwk_UGZzz2&NL^UG;t>($s)voRTrm^GM2$3d)#`XCT3BY_cS}Lzvv|Giq!Nz z?}2gO9Lq=>eWXnk%r9@~vIq3)81s{nY|Hb?8AQK_p`FpaRDKwM{eA3Br0QB5bs4J) z6nr#32S&WaJHV)HdzPxFY4QF+{)SasHBN#e9UBp6S5(ga08GX1u_82An{hCa%JTbT z$OelaNW_t@e)o(*JZ4CV-=v0KVqg$?$lEZa4tThUvTWmHafhlq86F(B7Rx|PvDUn? zQX8pHd}Wxq%jV3iYW%|7%c=g5zuAtd7qE+E>ngU3MG!MPIT~N-x?qFg?OE#iD>j4x zMLK*qV8m%<`dusRwgaBqSL_@TM~Kq)9DmZ=|_Fyk8A$ z$4$yV>&ZF=M{!@&kH(4M&zxiq5`J0j7LS6RDbPy$TPes%@IqZ$`ZINoh<^>+8G5$H zSgbT)Pl|-i*8GVsg6jFBB)|?Ayl2u(2D>vkSQ*1do@@eZ0^hi7;t1@I;&g?Y^35oo zj;*M#gljub2@P?2oFo2o$jHZk9S+bt$nJX!<7(7!F%+8+KOd`VqP$04kH_p^3b=+q zXtaxk5jhtFu&LN?MHqH`{p33amA*JmT;|{Oj{Bnff)NKs&s-5<|9MCo%^}$WT@JZN zr2PUi6RD`BC}}L-=^}hsLSEl(==>W{KT(Q;C=6JeJ5<&_^W*(^?{B=q3Vp*CY~q)$ ztsId{ffXt~7ASl>l~}t3=+A0ry*CcHevGAS*TQ3+s!`-VA{SDzH@c0@4z$Q=1^FYAf9rC{q*r3jtkh2>Q$_`fvu(w@!6{e*{e zGGu-~P0ly!xCR`wg}Oc7VV>)#D+}MU(bc+D?oP%_4X2}b{w_@ZehiTS^mpq1y;t8d z;njBnf($u7iv5N4xEcLDMRwmgyA^3r_7uD@!wnIJa}1`yvfSu&<)BD$J$W7vyYSqHWPc~znXkv* zHP6Lx?{g9pIEj_m_@x3=qR(54`hp*91zt`+%O$o5jyP9<<4^e6N!GTVn}e0_f+My& zj-pv9GkA~GO=%z?2A~pJ63Xwvq;@yj(y%F88D={?wql~nDX%IgV|t9#CsfSPVm+n2 zM5%+2jc>AA=5?(ZYgD;&5j>O54iw(s<_(A3Oz}N91=O^jW=%DpbACK8f#3Z2YFe;+ z336l5Ou}o_*%EWke~z3P_Tye^YH#&@39vG*fwXzW_J@gcEAZEJRnnPeNk!DOZlE{E-lfGNr@>$8if*{cwhkVcBUTA;uD~CSLC^9RyykzXtOg&c9ls z1=CLic5@pWtR!p|z-Wbw_1p@IGdY2&?0(iBwk+BHM!wUYH9U4mvF|;~ z$vEiYL7DG#Hs$c(m{Hs@S2nx1sTxF~UxPUS7ln1yG(rY{Tt$JZAwL8TC(8A5 zF!}5Atr9p0c z)2@*j>i~Az(Aw=#4N&oWIDGkjS$VaY~Wht5@ zy+#P1Tw3_H9aehNGUkOR!kAc^HGjRMJAFLa=ONGT8~iroT58tjey#7@@N4tY z;s2KN+sM*onAmR6-e}^(G!PUgzDB7749Ru*Svs03+xNVJ%x%_6to;0TkZXPNOht1$ z2V!d_b#*KXAxmk|8RN`Qj+e2CAbhg`9x9PsAVvrW}%Jh#rwaD2BEBqU7AZIdWO?^l6D^1|k=Z9z(?~UA{x(LPfu2Sox8!6ZD&Chc zv!^9oKcCeHb*k&pfpa0(T5{^o_#dVAzt`Og?$w)e{O3*k;KmxQO&rkG?L|Hw;!MW7 z+=ZNVyg(`<2pC5I&No3&-TWFL0eU8Zl$A=ktINra1x@%xHSB1@b<(%Oguwno>yV80 zfF2*%5MF`j_Xz0A`>a`^P0vsFyfn%7LV?Xoi(kjXRrY?koY=|x_J->qpTf!lbY-of zl4c^<$uO-_FbszKcrt&l9R9dOCWLCY5fNguao1U{z+D$O7(1`Va%v)SuNHw(Rx8;kT2BmUvsEtP^@?VSu72PKP zXPxM&sCnEVuqiLS3RAHu}$>ikS@=q}G{kwW=PIYy~$#X>Ue560_zNYbTKQ+73>}8!laAEcw zNPiRmkoeU0!2d7OvP;XGmXnMynX6J1;K(&G3sM;hBy*z=U(=8T$cpu6xXCtAxt*?O zA1~lqnk;b#-9N3(J99o*7i_W=Xphna=+&5AvGT68@CRN0j@_M!LS(@4W@dUHA2*hO z(U$WCk)$1{Jqu^}V-pr9^?=|49s06vdr&exZ zJ8dyf)D@er={Qs*pIQ$_t|xsukNf=eSe6a4YH*|K7c- z|JEACDM1pv)Sl4u2k6VsqzqBb`IKUx(gS_`XaeJ{c82v$q#K|*@bxeu_%v%lXcg63 zNK8rk&%;R9lq8Z=t3AD0{l6bD6kg38p| z0^PrGWI;Z<*98hK)ni#h>ByYu3TbyDY3BWM>ltnD6~lI%9%4?#e0%)FTzmW|rz<&l z*W0L$OocFxEQL65^{4%Rf0b9h8LS|&vQB27CXwS}1gMy4n9Xsalp%`12W#0NJ`cyC z&3HkT&+0cxUkui=&qOO73fGovGyS+dUU_f1`pZgSLNU^4YWc|+_1@!|$8537Dw7^*ct?Sj>G<~B12`WI*;;|wA`e8Wx z>Jw>z^msTYf>9G_6IFa&k#0F5Amy&c9$9d-SnRAqKt|*$s$Q%rnrMxkE@pOJNf9{q zHM+o)Om@nr{G6e*`sLZDd94}X@?93DvXALPf6Wq{IM2>?#MIe=waN44{=?{}qyFvy zs4Xfn21JNw2(LgyArb2qqW@IH>Yo=>9*P!s(rG?HA8TAabe`*(huWkVX*>C)<0Rhu zYZOTc~Erwu+*kKDx_|;c+QJvwAB!D(om603C$G=Unl^- za5I2Yt$XWz$Ug~7xOsQ{*cESaJoNHLR!)=eRNy0%s1J#lA)O>rVK(Zs;XtjPEV0LJ z0y@FKbSM2nu;$Igo^FT9Jt*8{eVbs#ZY{k}*UY)s^LKGj;28JY#V%x%Cg#|YbtdzG-WdL11Q`6H`Ijc< z^Zi5;>L2mDzS$14D6^{HLfY%riCHw<=NkG4~iU~-qZ@9?TBzC*v@k@q%KqZ`o5BQ zh^t;PX@130F+pbPwEn{Mh=NXts#lNLw`Sy@j@)?Jp>!!Iw-Ur)mS4|Z#=UbiboD@6 zPn(aeC*fm}jji$_^ZoGOMUVbC2OG;t%J(9;>>vz13W2U>>@uQ-$XsPw4CMLp%t?6Ce*EBcy}XEXkK1m1Q<|=%7bO5(DxqD|H_= zM2LbCf6{R35+fZFe`yA$9$GVVYRlMIRmVSYY34e0=gqa6sbR07Mf{vr{jYeR5dWX| zh>^7=>AJR*rm_4c-tu6#eZ!KKiZ0>tm{=|>i+Zwd)~@-;ZzuJn>DE!_`qXvU^}<&x zq|9xn(JiePB3C6w6-!uP)3+9Yw?f#wPUR zxTiztr(OQLS^CW~QH|&AZ;ReYVA|2;Ud4Lb^+3~jAec;Pk0ummB7A=m*~uPj(h*gW z9FDRJSoV^GodOHqxI*hGanfykpa!;`%m54PWmr() zF*g5z*o0isSlZ~RPajL9EwhXOy$@xclvQ;rbE_Md0{y-sM(Kkfn9)f5QS*R2aH{C< z@k%FtxPXX8oSs=N2O#Taa1ihtaDJ%R2&rjS%&N%l`W3Y|n%i^M4_&W6~z1l$dd7X0*P!W!o9Zz$1`^Iel4{Orx9=;q5Ab7jKK zh~)si`{Rd@ECBIxKVWwv&GRtPB5B>W@+k)6WD}=lqI~%9=kW8JFrZnD{vOr(W!y>F z-b~b5i8uKYy4hC$@LgiK?p<F&xF^$;G%QF4l6q zhooCdpoH1JYce@4Uwvzuj|pZyR6pZx2Xno9UZzB{dAvOl3in2SbfOX>jhceYgU)< z%Sqtx{X*Mp$H$ckb={3ZqLI`085Z|<>$~`w{&9igGPluH_#wczX-UeOd(u6?J)$Xu zuDy?_Q#k^mEy9LUFBV`#$hM*?$SC%7{^_&+QfkHZH8u9|H62M!I)?~bG;j(x>2&FA&R+mKxsvyQOOQ7)YCk1uIPQmbc@5!bqJGYR zxkt=)As!gXs1w%yRNK)nV^Ln;^w`P z{?bjb)#PFQhj(fJdwafKgwnq^SU}x|zK%b6AI(75A5)R6#r3^qTR@P>%+O`FT?Bn# zTiCe%GoSC*No>-jXOR#I{{<~{rr=ZhX>s}L@n#Eh@oIIC`bi#0UddO0z6fdSwF5-#Hh zZ}2Wg%yfyo%(DhO(N1WPck}8#UK9Y>DMR-SL>%t=e10C8|{y3P9MKM;Mn z=k@xTyakGZGO31lA+}gha^7v^`b3=l>;Tz{YkpmXEgAzzZSFT;C{~VM z)SYG$<_b^ejnu8I<2R;&3>$~c8}RB$FsyXFIq#qsq*=Mki0U;4V|?(gAMyPs)ZO+I zXrwb~uH8xJdOJ8S@vLsjGz zPN!H!L}7IAmD*oqB8^X{#N2N6ufApC>f5W=jG)R9LeJk=kyoEMXg^i28}xmfz0N2{ z>+g4?4)NJQFOHz*C5|{1$%t^L`y#cv z>?ahK#XRXgwt^^o??2I)Kl1fPRCHZjb$|0Bm#XhQBzw)a1-PgOBiBdmH2h_E45Va; z0{F@pXU?iX?6YRls#XqllP?TXL?f>Nsrwd7G&0t$=E{-njX^1Xj2l)nRMumh(jwBR ztTI@+cjFD%`_kvegtM_PqZP!_m33p{Ul5r0Y6p9Jww%&x{IH zOd56w?$WJfv6Eb{oE;GS9LG`CpEWUh;iCmlHWQ@Jaxq2(n-12Agj3Gf)iO?^_J7s; z@F{@$EpSk1XDE_Z$*d(WiJdGW-GJ@$m*Y08t4OA7+9Ew?9E6*_hvc1|7 z94yGPef^cTE~kzrQ6{1(>s{yfxY?W`%H?%4m@|Azar2rq#HPM zFHLn@t`)QDgc@Z`aHYxsd51WwNfLeF0!;3K@<-bH=>aO_q3QnODm7 zxl@EOq(8^05+6PKhswRwgp}UQXDH44--6um$|M^&b+ibfHn%!b*YKms0o2-YyIJX$ zzLVaZ+6n|jIK8Y(RdEGECxt2pIxfnc+>GBb6!2Dn1A^`ym3nMN?3Y;UlpCg~_F&(U zEm#6<02TNZ7EkiYrsDPx7Sq5Smv#|?k>l%JrBTAarrLCb=@oI6Z{m=(3qE7)eJ2z8 zq1WExX%jOia0QmuLAEG1OY2J>-nJYYeNA0dM{7tX$YUSrsattvR4{v&V)vKKy#3di;a`^0?!Kh+BqMpbjXKB(F;>4fWVj`=n|e3D z**+4W>T3UxM{Wb$oT;Ff5Xwx~J;3ABy_`o+2(|F!{>Q#2e@~CTGAzm)As>K?t-InS z*m(1>K@m!fTJgD%!FK=Uo;Oss0)*N05bATZ%8O)CH}Ju*3Yd4m*DXR2(^sL@$A3nG zymS3E7j??b>;+Csjh+AbDR7|I;^p(!*jmPC8Pa~66=EL5CH)N-Pd1|?Ti)V{%!yRP)Lfyf9k}$S-HZmh80|yB zuV}7QL1c}GXEny^u@~+tFFC&rVpjj4Tr}9>!n6{!H7BQWR!H+D5(*`M`n5-Wr}` zF#bPoJXteYrxVp?vJ@4%lnDPHT#9&^(d&u%Gtm@>$qIu zT>PSCrw_S+GoAbUrpaTL>ZzHsQ3@~LoTJTcV^1~dc4Y-c*KgE(M-YL?lp$a8GKZ9Q z+$}`dVyaG}{$&nH*+YIpINDJHuU6DyKB<^h~I#0)ZE=*#O#8vDWykN@3zlDL43}*@p_f2tPwB! z%9qgexPQYAe)|mW+={+`8z6PvOS?epNWZ%MR5j)2#SyhvIJf`hh34Nj%@vYWYThkw z_T;8-s(Z%3R1GR8@;zNZZ5%^xe|LLuv%mFJXE&D?1uc3R;o6E#L0%NL@#3s6%p;4A zC5oH}zTWbZTb4yW_1F;akumR;mCF}4nU2F{;!GRNc@7G&IydN>-pNZxLB5^+`af5hQu@qyOoe+eM@L%*D{=L7~b7Q`*xXb!JJvC`@NLPS}RMR^*)&V^K zK)rP$19h~35PKIR;zbHoWWh#(#iz*`n-moQfG=9D{B_H@L#N%RGaH8Aj*~y24ukP( zYDQAZLn9J_4Igby<6KotAQRs;p;kHOSVpz8;4v!2V6!)qnOAk4+@cw)T(Up zcre;Kf=Pe2Qi;ScqN5YUAgIkzLn+i2e8^Q4ERkXq>z=`&R|t3(9Gk0Me|T^EmizFf z!ChGh=ZfX(8AX~10|92s<3MX;zvu9cDRKmZomKV;7?-5oGBTDbo1A;b!I<=03`PlR zkErS1sSVi$OD1tKm*sy@HeK=+ivAA|egmFc_x?af6Z$%i3oBX~Nh{c93xGnm<&b*! zo@##h0gBZ04oQE?Z*~wEyHa?V!>6P}(pU)j5E^&L&=`}yzdwEg7s);ARaars6i=gZ zUfRB`JL~49HrgWfzibY~2&=KMoIM^pe1i;;)aNG{r2}vicuJ%Cq&qDgjU>SMNs9fu z|5CKYPn@5Ae*DjxP{J68Fw(vIhuSZ3jU^Loci?oxg1n^&eFjo%N?o})9a&B|C)4!> zG6_nKRey~usMvcQDdTWcX=rStxA}a7n>m4dU+S~msiWE>7WWnoS)8VbMg%nf4(u>a#^G`|F-J z^{otLq(|+62c9h<^DPE;kj9Y$37I7GzW3Thxl8V^5{@N6CC@(+)c~zcwy}_54kg(* z%Dd5rR=IGzVy~NCi@@ln&K4Wghmh3=BO{9G)0K#Q3#gdRnCCuM__R=o51}DnvanG~vs;;f84B4&8_|GUbAEyWN48Ah7d23gI^s^FG zcK6*-EYM@h^LT??gtTQ(@iw!|X~b50sv=_LR;ht|X^*STb!)ha`a|T$CjZwyFBrda z0}K?vP5C(q{W;{~?mQM9FublqxdO^@IFvi(P}eW(8SN1RPd2Dy+;g3EPz^I2B)(_o z^)+&TbTIBbK`wD`6DJfWe666tZ~Q`OM?*>m&5H-|w{J)6NUljNG26xXJA7#YmqPfS zhsh|0kgV^O?<*g*x>=#V!P)t^!H$y8B4DwVyHx3N-Y1<6DMJo+-6>gBf;0jdg-y}S z#ShO(T#cWubb#M+uCDhbF3%6)>@iUzvpO4ozWH~bf&PoQOdiSy%8xjoo;O@F0i~bJ zkOwcW(98Z-mwc<3sl~uI5dva=p``oBuO-CYlZ-_NX>%u1DtLG>dAqB&A^&AU^~@hW zJe6MuX%c>7y>06`_#4=nCh9+Tl5WKJ+vIg=z;4i z6sosM6lauIp8g`?<3xK)Kg+?6GFgc#Ij^a<(zw{wN*Q?;#*G|o+OWOjd?3h{N{AuF zg?FI@Mw|=M)eEHEVLCi_N}gilojVWk{^~$fCU4rEV3p@ z&5XVW2eS&1hKM!+IHKxn(2d+o$xm-<@^83cM*Mgdls5O!b4!r3u38C!83U@syN^84 z>QS-aPs}iE;gEr9AfuKZU!r|9C_kPJ*@V8$hWF^peKR(403b)nH3bYmznPi#S1jP} zPvfv((o%CWV7zlyCCvro-vJ-vX+5dzuD&j*rS`8NArZ?%6kh9HNRb{AjgmC}ilM~! z4haI$=~t@t`Mn|LsWod+Mu2w%HQ9+JMw7j^WjT;!(Mvj?0Hl~>Ey>c_5TAGinPx@Y zU&V7^?oIt~GOkZ^tdDF|1+E=A;}jIQhxbyh>Y<6jQ@@KwmS+0=qt31r^gDySbv+LR zey~>urK1U1NovYN+mrg}at&o+t3b!T{u{|g zZP80Cb6~=~qa$FjeShOZ(QI!ofWPv=;2GwPei+3iBa7_r*VJiCXNguo>1pp>>C zfPxDH&<9>68j9Q_O6llIee-gwDu8B!4ML47(EQ3f%V~Yrarf7}ZtpLL&4M2VB|%rW zlUezdaIjj}`C)(Uryd{7Da$$7>lK33;w-r-#ihWBvTD{gn=$t@glu4?2miK3WtfV% zewSf3t;z>T#g1(HPtz$FQTn{20Ccr(z%HF>H>dGm%eURUeX&FDWt2MCKBe96%@fGS z{kLd{SMjHY=PsIZp~Cxo_mf$uem+IJsF^8e^P@mhmCI0W)r*n+UQCLj5=5pj?sjlg zKL9dy3#@lwbxiQkQI8d{kLZo@5WMKh`fU;?s&GIo zo@|FsUmq-ASB~kWRL#5<`EO|_3aa^&HZ8>BeLN}&d1#I?m zxx)J>zL@V5`!tEzV84O4{hw*8UY)-xx#r27FL3lm*3!PaPe(e{||aQGG6 zZC-?_6h+5dt(ldR55wyvu%zh4*Z((+(icO*#%xGwZFZzGim(j&o>QdB!iBokXMc=14?a39!(ur1ORE6=Wfet zay9uu%&ek0(d&1x7(0u04aiuN|8f>(+T0xmmy|)7!+?wCUvbD^25A8`vg&vg&-gS|i;|Vphy=@ye->G1pNkRnn!WSzNvT%m1>+v=%u$xi zCqN>gQfRds2#r^> zmTv1_$1mb%OG?D^Wsl4ciH*tRrd{3J;9!r!z}S024ZX^+m<7GA*%;awaq3nV4)L8z z!zDb5^lH;17hgqnwLr#eMC{*+xh>gbPgb15CrKBp;Kb zY8KtU5^4;k_mU8Bh2x(~Wz0H`Hn~NgJk@cTmYz*h>L}%S8A>MukFl$NYcIKjL_(&h zB+lBbN6~A)?>9cC^C29;yRVoaa4hXI`bEF>B;l5#-2RG?oCQXP5yeWR#2kHfMu;zz z%Ygdvr%E5ouJITusJ3;0oCAIEOm_c7MKS>SrG5&q0v7r zxUZt23uEaQ*^*oIQYotJ@H@$X=kRRo7@4V20abh>@szFUD!X?}Qf$(jP5!_*;FV^% z+*w__$>=d}eGR5@ht<}-rhu2!3qq;apDyYjywBg}7IX}6%!GV8y}QuuT9y{mBB#A5 z*agDIUE^CtNkkYcnKP?;#8_DxRNV)Jp5UMmM}!p_iMt;^i++Mh!p!$m;awi@-xMPr zMjV@?bZaeDO|@Wule50JMtt{Z>?{rIBvQ4*5_H5<7|}UnuM!08si;)Tg@Fj?7zJ7^)_Ne-o3ep#Sm154bzQ|?jZi`>i`)c9J27JmhapMZ_2%rvy zIQxoe1<0hGck0Qeo!2}xBFojAP*DiS29BYf30(b${MkaqqfXM+3qJPPtwOATs& z_`qHB_eAZVvey;R+4fq?w9KMa8Ao>CRy>G}cYLF+m&Bkt>}Y-|)rh4d*<6=GpryPC_Q$gd|4Wm+tzcrV~9%8+l7K9568S#H~isANZ&!8-J0x zF>A#QUw7x~6c93b4z~`w5mIDETfv;A6kwYQGcD&QEfLqK{;ksPAtr^5LV!X(6?rMC zwY1Mb6*?9ueb%}kSb!E%k`aPE1bQ%yigb z0t9>Tk#tAo zbxA7t^Zb-nnSV+Dwe4q~O6&W(Uw@1Kk<-!qKL-JJ0wkZ?nU(Iq0P$mqBnWgvpvIWl zJFkt&?q;wK9ntbC?ZkSV)>X^jI$vD>f0UqT)Mtxa>-=l4cTnNmMAYh2OU}z}gXO`? z6WHp0Z1q3*wG+SqX=jK82wY0QW3ekGV7s;}a!Ouikb32mNS+09M$)Z0647-pyybi6 zbO`!c@@z;sR~Apl>3c8bjGcsWx_&>D@-O`e^RQ(J{2}?=ZSFBZ+)yG20^<>|?f{=% zKi;UX>#^3e;xP|*Ec#~ccgb^co#yoaByu|XpCfwcOMvhzU!E8szC4izfy)Spi`xn6 zj96pRBXUaeo#*cBlt`W)+CLBT%6ImI{w{egtT|5>PsYbH595*kzJ!N&osRr8ugku? zJZMz{)c)|Dc?=L=o=AhhkOV|yMiBX>-vEO_V4bl$(*labGF-u_TKqkf%PN3L}?8s4wSFu#(q(&a~$PAx}Z zOFZ8a(E0fhzyR@Mi6jV2PrxJQe}^RPyiN~uzyV600jYh!Ay3m~i|4}no?|>rqb3Zb zK!DS){8a-3#Gfe=APxqw%C@JtLCmByVS8Az&e3)h~;uqi7r$ z-yh3(xE2B{5g`8~ZniN%;@Bb?0!tFG#)@}$eM8R3=}xy{=lOK!{BZxN=jEh5uY;1; zk??MRQuLDyW$))dc_v=)smi&Co_|GA&&YZkweQ=KA2SBMJOT1Q;#2?wB#teTApikq z0$R^W?IKHaUuj5qN}MOVGjY=VT09pTJv$m9B~M3Zi0BRkrX%q4Ev3Jv8&w|z!T{-G z9_R%GrYE2^9`eOjF-Jr4EOeAJa(52EspsUtXSDXad3N!9N&k&uSkn7B{RfHxLg0h| z3FvWZfdLZ77ReBRz(oY4#Zzs&Wv6-{s#navm%NLn;IhZ`!nY<&s^rPA>gQ#!c@P8^ zC-D0%rT4`dL=7JUB#JC@Apijv0v02nW>JXz^pO$*hq*YEj2)Mk5+M*+gutKe!^kg$ z00u}1R)j(T0y7ZM?o8jgc=z&@^x|2N#*-UM`Sm>*Q!M^xc>5W{>I66eD^>$AKw|kK z9Rd&tA|TcwxVlb>GA6&K?noCo2eaqYw9a4U{Uu|iR=+WRf<8EiU5>zyl+rIeAYt>4 z0TPB5!4QDJtOT^4k>cXAGC?@^wB+(Fo*2ntgiy&g21!{ zw$rb+Q?U5O5WoP5;fhoUK%i3sTI0d8nAa?pkvCV4g>^n_jipXsBf15F=?QQIZ|oFf zfW-1eIs_m90XG7*#*=mNYxT5TEx!a5&x4z)AqWD?6WGG9wlFMyF$6F`Vz?p|0uUIC zfOc`8FSgZxM_1UMJxAjre(L$G45J(DwV=BYSe5_=NbJ;OfW-1eIs_m9f!hg$8&{2s zaXc5ds|X!{00c4u7$C7KfdLZB7wHgyz~TgI7ys5A1FpB_n3Oyni>oWchX4e=2vCGD zRuwQnV)-H+0uX=z1Rwwb2tZ&k0)M}K7HH)cLjVILhAUDb009WRBp`(yiJp@}os-AT z{_5>nSXe$85`WYe0uWf609DXq=N|(kmM_vF009U<00Izz00agjfB_OaVHhB>e31?T v2tWV=5P$##ATSt#f8JC2cPsM5FNDB<0VEqat_Joh00000NkvXXu0mjfiTBMD literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/mec-fluent-view.jpg b/app/api/addons-api/mec-extra-content/mec-fluent-view.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d720588db049c5e64679da4cd0fc76bb11c6a9e7 GIT binary patch literal 62442 zcmeFY1yEaE`!5=_K%vEpwrC;29Rif%BzO`mSdjn$f_qDaB1MZNI1~*8cZasPyA*8; z#S3lGQa$v2KRN$1-#v5YoI7{!+_`JAcUJa#Wa;y)_3U4Mzxn+hz@iz1b^-t(5DyKm;JYe5?lm{C-dJ$i>gk3oIt);VWwA=xL7>mpoi(M`a!}8GUhmFLjg)S|`K@1rISmIE1)4C^+({ z+~HCR0taEdFepDet{{xNhc7rtnddLz;LH4<$6`EOf06jPDf6iQ(aL46Z^WhU>4V~u z5tS8jkdT()l2Z_skd=~FP!Q&l6qk?}6PFj0kP?xQ1xt&AB_+B3k$5h(`8Ya(VH#Th z&~^Dsndcvk3JeSs4U`h~^l=uGP*6}16PFZ|loYw75b+K6@UsgN@$lvSrvwd@uY(WT z%Mb18!SzR?oxP{OpEA#7P5*8J#!FxSUxNQ*Z(%Th+VvN;uOAHc?`r%WFp(E1(qY zq+}$;MHCcd9YpNxr6olaF-u+pnT8)C`TKDwNdf3p8t3YS0rwU|&Imn+EUa;f}21YG-T0RS9d zT`ozY-^+k-015G*ba^KsCAqxFNJ%blc9aH))foRXB7&EU&+Q<9OV5I8ca_vn%)56ulZ6WrfTl zjvr1eif{oN3l8-OHkn(N=bwoYq~C`4Zs8R|RwF-Aw`P|xWhg1X&vl*fgUa{^Kb)}i zb;7Ncaas#e`EhH4?;7jH6_hvH9VA=4crp8EO+UAckR56Po=<*Sig;O4K|cP`Gk+p) zY5UP9n(++N0f%-tN)e@=cCT~at@Hu;=h705C?83ziwWrj{%4weqwmIy#%iX)Ji5zN*P^XJ%QUF(c z^|3>tvcQj1$}00R(;S~f!8~zON5wvOJ5A7=hCOVVy`$fH-c-KImHJ@Uw3m2YxePD) z!uuQb$Mfg&^2cTVx!wnSi7%bk__&TX-CBMF;6B2>5~4y)|3rU@reQ%~dB6rp1sxDBLuKUVs{V}O)>U4TT)x|+vGCCSY`Z0zz z`W_t#10}BxxR-iHqVx$~glh5G;O>VfPn~2a(Qzl~tt_(|jyP&|2@rBUxj5=t3oD~! zToMcre`zW-?Cpnl#JSOlF>xut7$9`?E)%(+Xf`1IG0G1rDD;eic<$c09)(E+8tdjP zT`wzgGrc#`Z|@nb=F+y%WBd;0%o=)LrH&3imdt)48RxVUchFxIrMYA2JbMinPOjlFO)J{L={)c3{$^>lib+zR?d4AZajOoj62-;sXsU@#K7wKkQM1Sh2T558I;fy_x6i1d?>>z zShNKUOZnUnmx%5CdHvVH0)MivPcRv(<75UT-ch5iS@Ps`ePy9Zn$_r4$!!!Pa}I+* z0WqGey+m7sj9SQiUMGS~XMDl9F@Ip$U=ks~y7PeAYMSR;$ilP2M_dYCW!hO9sHrqw zTcpy6+5ILO&xD8|UKv-bIO{jZJk{cs-tYShUI!m7tJevQi7zcWdqu;M$WPh}rH@d{SDS3e=o5U*5JO7jC2==5<1S7pL4@K1 z%wB}r)o4&HoPhN4zK@q4oIaLy@8?R+F{U!T^zyfjNSEny7L!(NGaasGu)CipG%1YF zyeAsIJyD!5ui#RgkT)wPjakC=c!~ql&oj<2K;d^(NEj5~7+<11FMCA0H^D zRW_VHhi#6`jLq;AHNr0Pi%a|w-S4~z1}2`C{pHqBRZBHZlADaBAV8n~0jg(dbV56& z^nf+``_ItUtau*Fd<-H1U$B*>i;=Us`Oyvb!l=8b0|}!*T5&xiambcG*G!d~^U${5$Z#^VQWB9c+w#{zUf^tvhAKrr++_If3Et)^L!T3w6Y~+;xZ98C6J1r>@IPH zSWvwLpFe71iZejA7VG-U!fsby&T_FIVXN)n|7fl|_k~?Ms(W9g4Q6DTSddboXP_nT zSh}RF10~!+eTh!|?>!3lnvknVQ(1ewh!Ad$v7+*WapO0$W;AHEId2S#O;#|7XM1-| z?w6}+qrq|GqM|q~Kz8!LZ5+-wQ(W_nEm&XVDm=ksvhp2!jp>t8+Pp+X%{$F3sE=1s z27H1Itz<=s*O=`1^n3>Uy|l_J3!fFN%j_=lyvKyKn@}Z%4snxwa8J&@==tpf z|5Ug5#&clLjs4$K+ABDV2pC%ksEwyX^ zS;4q3w&mmZAMxqtRPLgc11xvZI8RsvprLe>)ZT`l)P*t|UqL(g$;EZXR-?~{c0;EW zbFH`;{-ihJaUOF@>F%@w*EOp4m~%ykeb;t@wOAU3n1a@rK&xWc43LgxEG$cHcsjY* zPK_~{VPkX{a6--@CcZq3(FdZTvAU_!^a2s)5C)Dqak7R_ZJ!l~1JNJoAIV!v@u6>J zAscbHB%VZL% zmjSvDON(UYkn06f$CfeIn4BJrCjBsI*OuB(NFANIJ?Jo;|M~g33SO#PdPb3C|=C>|b(s=oK zpALl?;+0Vrm~Cv0B%EMnE{bv-S##5endxPq$H8pltFWii9kru{?6?NE`HS?0z{*)$ zi(lSRT1rtctHHw+S8ICjIl7wCKGS60tSt>|)n(RQ2?DFKB4C(H$#fe z@GBrp2OPI?gV_lm8)1K~m?G1{zo0Xp4--LNq*E+klwUe7tt(}sUnube0-U2QzDISJ z8EC{U`Kon|m9y^xFVULRG!XRBA^lKd7G7)GgKgB$-!n_Zuc3M)xLu5rlZ!IKC?vUF z-H=_z$fjoMsOu03s%eDXodl2=(UML6nOwvXK(jca?FgNz_$60oEUsgkxgjV9rV8B3 zMzIb#j-p&8{n21n2L_4%@n9zcqkqX_U<}WXE67E)M|R|1#8#%1(6zV?eM)z8D53uh z0MMvONa2g`{HI-A2HXFY2fJ|HNp7j^%`R5C)(3Uf5F~!(&a}u* zzX9aACn!Stu4c@~N2a+aCb!wN_(h+gSMef_4u|PDxK0jt(FsL^W7!AGWx|u6^dY3u z5+;K!rtlmLZ=UA#2*F4605R}`4NMBvG4T;vBAiA}P4Y}d@tK!JGKw<_P|oud4K6Nr?K&TqtSsI%6hN+e59GF7gOpryARxJ=kWNhAtRuNFc~d=1xEjF(m#x;+P%M) z&D~?eyYWU!p>QRi=W6>Ww?{Ns#lD=H_z-=+hS4gfm~jB9 z(fNjoSJ9I@KZ2fep^P^=IazbHVj`u0O{?y`X>GwhUkVqtgvd7qZ2?$+?6}hR&Mn9I z5s8Yyzc(}uuUK-p41m;*}pCkz#w{C)!t=YH-* z^q-i(x4+jApPjAn8n(0OEW($6zR=O8_u(00xbgjA@?AEIAU8>3xkZ~VW#|4c@ViCr zw75o{#(Xt9ND?V$IIFg4%dyfa<&nZeQAZk~m3_9{jIClxQp>axQ!~*e3rdtaL|SSg zfM;7@>p^@rZC^@Vql*-Hsme=6Za@+W>Gv6fsqftB_vcs!kzhyQ3!H@)IC09s<>lv`UclQ2^qu&27IR^)iUw$K}8_4H}w zEnazDUA>DD;m?Lr_Z6K>TC()hm)bt>z-Kvnw2qkP(08E`AT}LQ{?(Q_`# zH#Os*ho2YxoW*$B1m~W2SMgcM*Qc(Grh;8#LIOZ(TKoP$9mQGM<)XZzY)JRJnL@o2 z?UIJo{u6&*tAkxUrETf97(p`gXwfo?h94qSa)>hnRKmDc*`OgC=+p8I*%Z*B5^YBLFj`x zjteDvW0a<{?u+WYxknPc2(Ze`^jS~8#@7)Z0j#O2fkp$8sN}X+;r3&xGYw{@V zcWz;#+nr=sli_9D&{xdm2qM;vDj;=6&~JdXv|{YB9>ftvJwBv$Hz!OcYcU-z{Mh?> z)|Y;^u^iE!u7DVJr7oJ{5?-I=qbk9JV6J7N;XYxhY5X>t2rAPe1_htJ4`C?RxVvHh z^4));zjSVge#}iz=RWbL&N^m{rik3WtCyj*FDu|Z4Z^oK7m`_kX%8%_MQv|MH^s&> z`BOqHFva?+T#q5_()|YmX=@GT@(uB_flXClHAuZ~V2vrlsd$wmPbPH}&QD2FUw!;I z-X#?BAvcNhJ7&e9*$6fR`VFw$)%nobl+sD)FUxsRG=ar5re?We=LT0h%A%MVX0K3U zqbWc-bETYg<)fbcA7*093NGw1Z!EA}v#r_XF{6epu|l((2KiqMqOLl#+;bs+C`zl~ z@CG_;u>L^k#jT2Cexd3Ww|L2SAvzLAvv+Mlwrzw?FZtdV?3fME3%<;<}FctgEXz@ zz_-8mM8c!aNkcO^bQ$>!iB3FBtoDrm45k0qJ&~2Sg6)qDDWV@XFTbg6gvj!Cf1iAj2PT-tT}_M*~{p9Spt*yp6AQR6(jH5^(`!D5f2KIP4K$b#pGQ z)xhDSDUQb~3?GZmz+Ha3=k~pQ48HGk4I7C4Vm3$41N1B$W9sj;ooTO=W$~guj(dQ} zi_dn}N*scgU6E*lHF9)bBU#$sc&`X;%qB3=_O`nhp6pQ_R%*JELwDlgy55;EmbzO{ z#!yzC-zr%=Wzs0}hQGt5*96F*tZmTcvaog2*<+MpVC}VZS;~QUqX#VLmdZ*e{)LTq zRD2L;Z?SQ=v40V8#&XU6`*h@C1DF@iL;DG+%R@ z9;NK%9+$9@>31tY*i~!Pd?+qXx?r)~owBH5XQ50)XBY?IhEt_uYwm%J1YZ#{NWyhA z38{sWoP0mL@}!Da**2SaCAAPQSJNL8B0t8WPz80lU(~X2mF{8<%k!@Y*YhY-&!MEE zK9d>f_(0h7URiwfqAgYTJYMG?5_Sz6ZX4V(*nGolM-MkM-{d+17C zBi$I6mMwl};@7K$kg(!%<^m@<^TvSDQ%hv|(`t$?D;nC48DuSF_PcHPieIPGR-JWO z>g3wNh;HKzx6oD{%SwJhBfJ}p+A(`@;l-kGuz@|2TF$!c#XFL8aC+*0vQpBKB_+mSY0{5T&oxSqIAQl<>K7%TR- zy!a~ot1x%%EyA+OR>8?_V_v;@1Si89a-mh;XhLS$6nH}>->_j9?}15Zs|8;p0*X-r zdIGnZ^Eqyc$hO`?IXDCLHQ!H6Vth<;%#imD?vI@fpnZ>}DGI#LIiQFp*mVn?5^w!d zVS+A^y$gtobiip^)I07&=N?GLaxr+WmNvOXD z(42VA^)b)O5yps%z%Na~*~fbPNtmsG*e^_@4oJC(kP^kiK_i}bj?JyP%I*P;1HA*eqg`jp=wf-fv7%+YnSbX2mmdJVCOz@tXM@%aVKpx$Du2{% z2d$(rmcDx^foPqgKOW%U@!fe5ps9l=Ejhvf8oEHwTdDHd_AG63Jm6)Y&GYHI!x?N7 z*qha*&BRt!!Makj%f9>~0xcN>+Udc?W8E=nd)01RE{nnb?bi&HY=_v-Y+Un;?sQLY z2odQZb$~|TXFN*1dx2VzvWhr=yCUh5Y?u-4ZPNlknqT@5G&}`jl9ae^dOL!QCU0Ce zy#&tbA1YE8S+HsK&M5|0+-bDe$lWxJD86}*_iBn!Y|3k4eaoC);bq)Vn-*}W3t~Tk ztL~Z&EL$F~3K-#Ru7?YLlNrw2n`iG6x1m6)B|L`nWP_G($y@S&1EeKqn!%X?yP~t6sY1XdzCs-; z^=ExWWF$a_3YKqgZyy^np@+&KV5yUrPwt5RcvrpXteiOyuA!a<8Rth8uz1N9sL`y&6*j~DPb$N zc7uH?WBta90nXG4V&~O3i=>Zh6IF*n#XYC-^rNOPzr@gG8^>zzYn}ABF_-Z6EtvcU zfP9k{eyaLT{RUutNC{sFY4bNUk>oi2ThuxkMlW)yk8oun-+f*dit`F2F*{FX1BNXg z$u3pT24^m1MU>^HCY_R1NIj)=R}g4mBw%oSXsF)kpk#vbY8FOeLa=1`;3CD^?(+frfa?ReCwLF=eeWn>=t$ z;DxUz-{-+IrRFRVg}UWkUD$B?RZBOu2H;iI=@j6>mDT4C4jmC+-6FM>-?X$z*;_5t zDYD6!M)C`(&J>W-qz_MUPtj(MK_@`I+i#*@9^qH zW@CWtie;6|yM%IfjFC^3cFy*=fUR)0l}xa~u9KHP#Li7cmLbinmg_j3PT+exsi5xs7&n>Q#oJ%BH5@i zl5wRule?}EQu?s2>V%YN5}oIE%rAk5hpV#r148iuS5O&Y8?pPgss}N=IiJ%n?s>H0#|~En-!6nRb7^# z?BWzOylgLDH&`_FvB>&l2Uk(i@ZJ4|n;$V&#+%1KYIw{+xw{|ddaYjcScaZU*?eR& zIlt45Ig#<3d(J(tsP!c(cXdohM~z9?nNqK&1j6Usv|`x^gc?`WS$!Fulh?0cAKerb zJZdDnZ!jw|lIqgRFILd%?;$_OIq*;}r#tyvZr_WEyVkHW_c&j;ElpY|h@j)bmngutlw6P?;t*3kDxfW} zoN@lkX1&U6v^BVVPqb+cE<7U>lUvI~?^8sx#7t})p_`tJQohgo$^8@W3@k-g%uT6$ zIgr)ZY*Br=ZZQWRcYwZg;%ob=j$Q2C#ElP@!&V0q-ML0Q@5ferhV1)6s22I%mOuv zs1z#o4spbe0dK20@*tlOOD`gVezfEU;vfr%w}sn}w8!2An3e50F0Y}`*DKFbSskB7 z^f6`wd+GCT2RoDtTan?Pt_{_G$>oZ zxb1>ISEUeDm;-qYF(~(pG>KssSFIazMv%An4}rj$`I-lx#j}MiJeaq(nZAw5FU&=c zdP_yKaxJ;mRi5q5DVmug-sqx(2N>7F2!tZW0tapL=%)qX^IO+~Blkw<+D)Dpo6WX- zOE8r9(e`W2)N>q>9MVwov4@wuM@bc+sk%7R{KMj{*R2K)t@;5=VrVr_40y^zX2WeStlSL2~r@J}X#^{;*j7Tu$lS zvjz2|-O>9yO{f&MdX_O~IldzqSMuQSpp$E)lq2qhWvJmnUuNfvoXUFnEE%%09=(+K z>-MY75#a7zucqsxR~$Du$wQLw_^q3Cnzqx3G+x3``wndp|+E4|M^MTav9l6B& z1hH03+#3qaTCL}@-K`kA!A{VpEY;}^Pn=ZMl7rzG0R>Ej6$Qi^TdH4_e(jlZSQex{ ze4aM#QF}e4Yxm8z!0Am4sw=UhE%b}IJAXs?I#rTQwnoB-jqM*f z&`(`+%(h~^c5pU;Xw6esh}lq3ZWcxnpc zAm-laN#3rpMn(VdEb|BbT>|q;(i@ls;SW%^9L}oEpeDr->52JHgAsjT-kU7HV$sqF zz3bCuj-~HOqi+SewWlt-=YYziw^!<`Ft_xOpQIP=V`PRJfcQP6Isx-K0^KVRq3-g$ zq*=rmW+63}doA*4%)ZU`t-9=<37A=DjfRq*f$uVKvG$Th*yi@KDM~Jtbgv>R#KEWj z2~CyVCOB_xrvSo#Z#PMb$117VlUGl_ZV~+M-e|ys<}@`Ell#-_&@7B_6b0B3$Jkn> z=G!BfdTwA_205Vr>2P<<2}!A`iP=jMVckHLWLkFH4pP0)*l?`wqH~g17M0YR5Z^Xn zly6FM!?&BZL@udMh%cge)XXDKYnYw$cE6r1w)#73c(!_6=Uc2Ov5Re#^kCk2Q#lNx zw0?a?i-1)KTq9%MO&Ii0*w|56Tm7cYr&%3vlnI@F2aWN@qd;kb*$vvr-fcGqNt;CM z`=Z{#n~L`Gsrb7`TFK7zafD2(&Ap6T#EMh|lQOCxnrwkg7x;ir53OSab`~)n>TLB` zC0MnT6_n%j&#bbOV+)-JvhRJbQT#dua7!tM|Mo^VKlIo4RSHfT&fm*6^mLMWnSF z{_V~yXrm#7rOmD(Cd+H%I0I;6U!(lwka|_P_4bZcwV%_$*wqHp&UGtlOAz8GbfpwJ zLU1pxNh3}UDH^#M#yfYPRZz|z( z*!(>HXinH;tRM}5j9w|HJ7Cqy=Jwg_{fZ3l(SVK#b+z))oYcw;pPVco8$2wNP;CKA zmkzm=lmu+wJGpTR}{5#$$r~QhMmcoyYP#WiuEF`SajH^L$#C3%?{;Q6*NUvgk63{rL$Nl~{Pq)W(`eN&>7;L~;Sxw>OL}-5E%V9?`7bCK;b@XigCp zf~gv%Ch-JlfiuFJ=9kN32=Nvny+!N8+%s$Ml<2T*vA0>0cEQc-%)m z(YG3hoEsFTWMsUw*;pC6JLY3H$wOJ3>32vKyUa&2!qRHqVz6m!!m6RU1gz2;-<~N` z*lhuJ_fMkBA^8F~-t2IuD@{?AM73V4-7q#w!+74wBk~^BLKM&w-{r%H0I;4>Ssn$Y zRYPLBGRn9YHJy$sIQ_Gvh8me41g?AJ{Veww_zYrE5mHSU7hs86x1YGwKU&G&IOjxCR# z2E0pq3RF~w=tbTdT3C%O9gh1lF5|rK6H=;bN&{}2 zDv1CdXC0`TR;;_p6GE)#L=@6NX-@eov&LmlJh`g!fym;B6EaF53M8LWr~~@q5H`Ma z|9*)3l$jF!>5no$eFC_Ce5XtZbB^5aygFXf*ksfQ*i^43z)UYR9dKw;90&~}wZ|6X zf2OZO^y!%_IGLKcw-N-liY@CVO}4t~iVfy(XNQZ&85Ap?*A{mG*7d?Z`=8Rl7n|NR z%-Yx3s)knyRtJ4g?oC*PU4a$E+nw~BhjXBN@DF0Eq+5#?hYHa;{z zT7)h~ESU7v9P_sz8#T`2^6d-N4i-HUGhNA(Bh@~b!j{N!v`IyS4671*5Fyjg=6vXI z|B;&lrM66-rTD_U`VuBiUZ@VlzgNCkMwlCu`g+B3z)q*Ag~O* zliev+Xx|Vx`9@`*v6MyVdLvsZ99tJE`RrCkWh-Oby20cUtVYFx-LB44*0r_sL;M}v zPVd{F?#r=nd{oebM^H0=hz$P?c>UN()-7RhG0yY~V>Q%}VJfrKl-3G+;dn>B*G;P6 zGDJWtX@GY$DMXAG7#WS;GHA%v=?~AJ*e*9&mNK^*IU8U@mCf-p`Rn>)2>4_*e0Wos zDTE%_8-EKo#9?FC6j-U~MkdS-mOYN+Cww0Ky1jJcwoP5-CZwaqBrQd6M!Fvtbyc$& zQ8{8F%6KnTybda!YrWWu`rQ5-0K{d*av~15!@ga&XD^mNQUGzJxK%e#ZN`R*u)TO0 z6Ug+iaK%JfH{z-nTt=oye>B7!+u}7y1}MCl8HYgldTze8@f$Z9~s$;r`5@?wl}PIPir*z`O96HsX|#NR}ZY=*!*sq&h? z$r@yuBZ^J}_6&6yxWRs!9G`L0Mu>02FW*Dcvp3f}!uL97S8jTrgmY)W6T=0V#T&_P zc#{PU^@y5(0kS8}@IU`ay_kH|O%!|s zumq3XE%%KuVMS?IMrywI2tLjt zYoSrgxp@*QyU{fPUenplh$rvBQe@e*RA!eWG2aAFs! zmwr=zbgQDWgV3+*ZX`l*o*`?O>h`wo@(LmMozC0$uC zV|!F9tH4nga|kpnyoRXkUMa{wK-YvnY|hZR06tP&3{iIrg?e{W3RKnIE-bN_z6AWk z0wh*<#Pdo;`P^QpepY*GJmxGMk#;quW1wWS z3v=J~twDOj>V3wv-vEK*n*!Ov*WNxzZnt89=2S_3_|<)iShI9_(`ZS+U^iV$3hkQM zV7;@jX*D8a0OcThisQziVhVN*(|n+;-l$}Ov?C_^`u zm6y}MF7=Z={uCkK#Olmeix7gA6sRXNGAU9!v`^Zp{zLe^suHL7n#Om(7`YY~*S)7C z4R1+K;VLS1RmyvIIeYr{0WAEPss?zV0wW{wHsIyhufgGAE4B|9HS)bxJD5H#Yj(Z@^a(!y&_5 zu6n*Y1vZz_$@r%a1)m|Do*DlWKlU%+ccr&6>qT&H>O|E=_KWqo-+<{G>?yLmTjK)s zAcj@*ul7o#8%Z_qA6j=fEk9{o3=A#Cn;5>IHa&K*4mc6PQMEEU75 z~O8jmK&F=_+;3#tS{xCacN!KppIQLI{uoSJ46GsOIHv+NhMk>7muXg zSS?uxRKdzJ0?J+le#rH79+my_(y0w)^*IR4zCTevz*KRTx!*WEm`ZR#$2;^iO%mp2 zZfC?acJ)9Ww0y@j!j`h(5Ts=vKQ{61JGgem`UGGUbGV9tl+5V z^Zp=6Pm#`DFXA0{p8BD5hIYw7l#rck|E`(!)Ah zB+gIyBr2yJ>YP#e@$iUG=9T-lPLd*f_;tRfY8frD_=d0PoyBXKd+%*9_%9VQTQ>Ta z7z)+6)V;S$TGu^&Kh|v>6(7Z(oDDajs@bmzyw!=z8SD~#y_`HI1wy;Ryiyk=24NZ| zYDFk0r$GZya-l%Nr7crZfJkL{D_TniCz4VT?Q_kXSBB^F6gJG6c=ow>&9p6$hHNak zO$G>p2MwzNjf}qBFA#4f_0I413W32p?W?zjl#I+`ATOq* zT|D0q*5iLI=K@JDILRK$Z#T;Uwdz)DE1`f$;Kv39SfB_j4&u9}zjdEn;|$@cGKv4S zxgJw5`WC%gW`bzKy6uWL0r0v&q6Pvnq_4vqrX6#eI)wR0W*{;-bH*_B*0is#UqL2b zpmO!+3!tUPXkWp1uRKkBt!Ep%WvRaIRjrS8>Y_4F%)u>_s!3q!fx_k^iluM|R#<$~ zQDyMi3|02|dFGnXlha6Dl=Ow`e7D3s4_t!)9Y_*-cN)U?y>==Xrq`{&sVh-B`Zvz7 z5t&C(ebmPtVDkf$>#Wp6>1Y|8qdapa@N4KHIZslE4oow}&Kw zNl)o{Q&*b>o~#D!g_TP-tlOZk^8}eD<}3T~c!%RSsW(7H7iqncwB-C9sVtTwq{VzG zKto%v(#YFghJ#aP2lw1QqOab49;2#)Hx z@kBm}ASygBoL^K*OSy0NBbjK{;LW1XNP<(AWrUoDZoJkPfYH98%4^2BS26Qx=51U| zooe1pEm zw7)iJ%0fc2x8+hq=oj$ZkUvm#T2V7o5k?GRmfKA|L3$V#_PD|z5xav-Q5G=DIMfVI zay0y7=P6EcI{8I}N^gFb5{w6d5=a`(O9!YZ=F0F%lufUARyX5gf9zV&0V{UFSCzOH zV_UL?D1wR5R~aNF!5V7G??{QLHa28_dZkw<&gZ!*q0yVGt92v(-LCfd3tU9Zb)^C{R%eoTHK z^wvSten4Relv+ewJt@4h@-?RMsozGb5*m*!Ry0$vyC7empXin@Dl5o5+>WB!t18>8 zf*d8NC{34bYY!|l&5wA>Sypy!yH}MoUx5v{n6PD)uBMq%S(5TXpCxOh{}|bb_ziet zbt1N?efVg2`!`@_>15VP_8X^nr*sa zkURN>rVXDQMGv#?hP}TlaRi11zsTS7d~%ff@ZC9s@Y!D0=0jvlqbr`sMC_0;Z0vb(UE4+E%PmbYZ zqZ!+tS!z#^=55AKM1?c)Eu^tHHm8U$QNimM!p>)1-((9B8ud{vX8ERT%j#NrKtTqc zuqSeG4=3~?_tm9FAz zKSGlHWeDu4z6U%C0E2m`G8h7zUVQ$hNH7Zn z>J_|q_j;H^8u(CxnCTia`v;zBB2pAD7$f@Di9qj@jGKIbpR9h|XU5l3f5SuRS=FXe zxsi&3b3WfMqY{^!i5dO6-YN~F*3W!2oP&as_oPKymDzTkqfxf*My!Jw;cOyq%Kv;%Y5@FcCAe zCNl_O?&29n`3-$L_4|{9AkK#!&(u2N!)Fh6-_@Po^V^LX$Z~QY>iL-asea3IoS7|< zV?veJqt@x{u@LD$&ZWrge zB{rJS2)@XzSg~u~(ms$unB1^zR5rnAGO1I`zH5QcbbVVb$D@nrQxQwBR!%O;@b}LJ zf@`z4zF^jWGJW_BP>nAx;r(<7_&mNJ`rbNC;TtRl-*l|DT#p&JFN6_bW=_Nw$!3#c zOYl*Dp zZdnAvC~1IFkV(G*^<(xlrh9XWG)+zOyqTDsEsLfV_p=ZolegE4fk<5wbEbI3-e?e1 zGCkWp76aPyTE#c(B}Av=NwI(a@Jd!T2he_Zez%Laq#ljE zTQ4(Z0xttBt`DIPzOXYpwL1DpPi5q@lm9TLEgk#6!e?Js0cxu_X^dzW@Bao|zAL

1FSaw4=7y)SHgkL31Z7@Y&Mcn6hu|ipYn;&Np<(h9Av7rw*n6y8USUPS1wz zQS?(@ndOxvLN=3te2B7njGHO56!eZHq9Iugfgc3rJ)ZHHF*AWvlD9cuMuu$OC)ZA41$2NqK~7B85x+WhQ)3o1d{(mc*6sce_zSIRs?FECF} z)YtP08=~LcU{p35Wmc4uZZuq2kX}b0>|vT}n@Z%M*E={Skw_gtQ=M0|9erHDp|u&m zc8`jM=z8hHr<>n!6#|T5gA61_hlU!VG>uR4IV;-vKhA0;so(i6%1nqWCW*=NreR>S78zLRX&HV z&p_tTs7*T2k4P%)e`D{vqni4*bpwJx1Vow&f>a@NLKUR<&_igUqm+c+1w;_(NDm+& zNJ}7r(0f&yNRy6Im0kpus-XCyzw^8I+;h*l_nh(WeSf_%$RKO&z1LdVWv;pB{Jw83 z$|!UR+3@x_msX!;Z<={m6k>HIz>(5Bah?%q5FH;^t|EDt-qRfRtG7~zpK}E3IGyuu zSoT6*ku9|?xE(Vv>GV2cR7ONr%J_VNaZX&bRGxyMgcCL9^_{Tm_!VZAe;NSHxTm*h-KX$n6m`83q+wXc_6%EHh?QVR

z;3TaL)ASr=k44jmEqQ$c7h8GmjmTTO)S8#tP}R0mkxp;SG0%e+j6Rx-7vi^_n3Q8L zvtgCBq@TUw?>*?eBz8P7h->JJgu&M{Je2Hh0Wjk7S@z&yFSu?#XoJA*SQNu&Iv()g;-3njU z?wzr-o~wqLSI$v>M$|BQ-AD^^?@EHSFNHdDytmiHRn@Qi65F?voJQ!s1V>%REM@x0 zfBBe*2G&i_8AnFmIZ)C<7OLsJuAxthu@(E0CK|sXDQ_4wy!J_3+3&ES>C4eQk8Rw& z;Nk8s$jSzr&YLbbk~lU3Q?EaY{hJ(E`(Ne2f=fQ?|498laozlru$C0dt4+s!X?>kv zU_y9;_14LdiK^8v8^f4%6jv9{5NCHGL((6n1dB96%yw~l@^#rS*fY0#fsn74I_hwa?-$)R5 zbpD5sIyV@BlxFL6^b>IKeNbVU@PFKtg?yMZuN+;}1kQ#}cb9_@+*~P`2N5*3@N~>; zMr3lDzK1lhikQVWHL$wROC9?lQ$IcTkWYEJ?PY70I(vMqYahRLo3FGtB~_C1+S zJdHwgbA*hTy;EVzi3`dn(AktDZ%LVB40(+?Wsp&CuZ!^@FBp!^$E(m{aeG~1l`a{% z;7EW(IDCi~c>DpRufxl0hFtemjuez&HGHJa0OKxNih;RQ>{?VzQqQ?3aA3moN!q#} z)0*6(jM=z?+pU-0O2s+O1vpS35KLG4G zuguU&PI|+*DsDS&2R>(&zG}Y`$$zQ5+^XS3OUqD8*D`8!`?3B9bLD`rJxm=JR`)eh zXH-jzL$uigDk>kk?9g1^ngL!5nQp;-%4D&R=W&F)Bwo#QDX+KAs)U-TQ6x9&%3Wq&;HHCNl=-doWySzw?Onsc_a%SIN@ZyR_{t|<8_@p_`! zFHvOm6tEY8cqT-CJh-fOd;=FM^m*)KnT2sIm9flGOKi{$L=`gw2&xlz@AP#FUFx{b z7q!{mEx&a;$)=l%R>Euzik3-iS4PJo_4a2xIUZ%w_(sH_Kt-hip`Ib{w3*|;8=_-3 zlH^0ybsR~!N?-(?6hV_xV*c;dnpT;e%uZQvM7qow7oGHdf5iR-)DYAP_~q8NZml%^ zpj_0T*dq8dY?lnn7UaME>6nbIBVRfFDtIKmkCk2BK zf_XAb{#I%^CQ{w`m(lo*YX-6yT)gV1#*Qyr6E(by0_#_&tRRNWH)d`sXNs{bW>yCY z*K2#h3gQE2vuEVY?mB!soHc(R;?WaI_0YQoNnn7|VrVlH=gikNYSe+JlPFEav&@Sf?q+BJpDIq!khHq|n z`&olMG2f!mqlkw3Wu=PqPeFt2_Ip=5II>TZpV05N-b*9D0GrkIB%xLfr>ncxyXW$v z%x%`?`T6c?OJk(24ISeyw538}Q;S#X$d!P{dtEn}OmSkj988&;IFZ>D>PIJ$$%i|A z$m8#iBPKRK3S|Vuo|_h{ZpbBnVTt(s19PeIME4Z>PT&0}AUhb}tNs%ZxV;BDM^M>i z7DuPt9=YuE_KpI=V(CPC+>z9v(Q7$qN<))CB{Z@J@n4pVdQCPi2NlsbOcY#i&7DD? z@*gp~S&VC7&bKapTmuc>F*@{7m ze~jjB$M~*#n4j-7Zt-qndB5Vms$IFJGR-A3JC5pSkeUkzVzheH6PU!+%dE9AD|zT7 zr^B_kj%%k7-OE6q&xeO<<~@>6!^q{fS+W(*rL7O^ zk-4}ZBfP_kpAEOMX^w;&{REhaj#khqwL67Vi*s+i&TUV%`QhxRxtp5v{vhEeU`OmH zVBjYpH-73Pi4;Hg$nG{T)HipMdS9?WGNSzf1Xj9rSmq+3#nbTYUd0 zk#LdpbKu%ednoQFAn)u zk;Xe&8T)c4ajsLdHG_CLore9rwO5nfSU~~@sT`F`({F_6qFW)&LiKq0YJvrHQ~Z|)RZv~#!R<~cxQ$BZ%i-8EvRm$~{?=wOxZ zLB{hI{ht6l!_X_OiP3wFyjUY0my@Te)$R@or;gNjwT7ld-&IJ^ubDNvW2Moc{#QDL zBxdfq_P=V8o_n`g2yB*Ey`HSe#$_Nt>#1HHr&W?+wA8hGR8Fd1u*1^W`$kp1%7rm@ zdN0R-aqN+@WU73;F;n%Ek}W*^dzZ9f2{%WimB2l1oQfnn9Q^mRuFo0?OGamdEcCcQ zmuT6FW5aJR!|K%D{&h1PqY)mLVaOY~6TmnQ3CxCT$K1P?*=g4N&?|^}pgLPReHwQ} zuI;{RX(9J}jZ_(SLsb#Z*DN%pg@SOpSSGTB+9rF9dP-#WtW4ZM+(ir$tAY&Vt}h1c z34oztkdlb)Tb5N==h$oiq0@MXL#fM++_%`2VwKW1IKsUyLnb;k9v{Two%#%|+7ty4 z;-%r9>fsR^;DFVs&V%0m?zqHuGg6JFEBA3B1HCGL!uUIf0)`o>3*xm9$Y)T91Cmzp z7XSSeZe@4+k1SXC;D0$qQG^m4@(&m8| z5q@p9AE0_@Dh`4}ok^HS8JC&0p#2n@SzP@94m4CsMRU)2fI*-l54YhS7&#=^c+)}4 z;Mrk#A*EkCA@JCpS^ezNuzzR#<+hHR;{!(+qONXgdNC@Q*dSsOOiWOcAc6y8-wU7L zXn)d~y&KASGcd$qvB@EH`B0&){;=SWEe~Dlzng`u9VJf|?BoLZf+O7~8z z&_xuzPphn`8+?>~Ac)C6DmW=Rieu$m^}jYhI%8lo(HN_gzkU6}6+RRCtA7pPqRPi-mk@F~3{YR@bQ}h+74xn3@DTQhM$K(|_GaUlAKj zwr*k58@-q`ZTX6}2CYonu;&Z4iA#qyL^^}N7;`Sh3iHehd=S2SdFYsMg4%DECr{rW z^pHW})>OkN#3Te=ISC-+{kg3G?vIYN2fCHZ-JgWZN1jZfvW?>1w>*>=Or&7hQA+S| zWl`Qpgfx`o4O@aW@lU{qK?3@s^;g$6=AjkWZN9c&{v;T}d;b!FV=jF6=3h?p-5JWt z@79k`GCELqNPl0cq(3i|pWs0FYTx;i!Ibv3u7D?ap)BWS5hmTjwDjOw>65?nYH2#0spTDqWtby6reG|>bt~y{h95uHC{c{#!ni~PwTOJ0z1+&j zJep>Ag<3O~ii@Q9q4SL&FkbFllNaZgxL;XAV2V531yOge8vv+`%S6spq4be=+?|39TinbnfKM%BH4*^Y?wyI}&%9&iHrvUk-tjsv*NJ|c zC1c!&EstimsY<3x7Kbr=BT{;cOUcb$#J&_sR6qN8(hAvM7@twmd(vs4uNmRrvIee~ zSrM9&HPXYJV96;!qiNtG5nIYki_SVu-6;dOYn{Gi?t%CW11{%bx$xec?_*fT(A)3p zpBtW!_{qu`O#?i9z)fhS99c&b{bKKxkK+X}3F0*G?xx%&5E+B)dwO(pIeuO`k>ee6Mwyv6^v9i9kNA!EMLr(R(Xs4hbOlEd&z(G=olr=Uqjc zEf$M!n8)uDK*<_985N`$3$KB0UB#6GzFmHmeEdLi;dM8P7pUUW5kR+JK;luBgU4KU zLD8_QNmbNVjy6XgE@7LIaX;2?W>DJ^?at1Z{RkrJK286W7}w$T;gvJUylO5-S2viq ztm#fvm61UjEYs2}!V*>ZzN;%0C3qK@jtQbA!@MBGA=v(o4X+9-A(v6SuoS1q!=u}y zZLH_w!IR_ATNa;gj4C*i9KcSzeW!BP+ca0!l?m+}4kvyM%vPrZ#&Kc|h#WY3x1CRP zVD<;M%XgpSuV3}r;$xca7#)05R9%36Eg;hk0WM0W$`szIbBCikjg;aOq6Hh@6Hj!~jx7pxFg3`|I9jcXQ^$z=@X-nxJDm9@?4S?+93Eft)>0b)8?X1Zy75AC@mk52Cp zxJueEJL_h44L%~3V}#X&C~-v;uOx4?TwM{meNCdydv1j>Zm_8B&2Uh2;IA$aJd zrj{01BE%AZvldm_-|#&rYtPS^9(G90flJMu#YJrc5pm`Y3*B+wzo~w1o@7JxkfUBE zG`0=&a1^hW&O-8z1(D{aQSy(~mtLPpIq>#TNtf{8Qo4k-KN*37>qeS9#cI3TzMoFc z1$yr!usbNhJTPW7mYn4&CFD<;-f+1P5Ery%t(V)HC$buDUiMhsEVn$Xd0#e|lA09N zrc_y~CMa*!9BnFcsji|fv6O4rof|}u1HLwYfG=jSdV6N{E#sE|L*|1^sfH#zrXzyF zE`{u{dmk6HAiI86iL1kO*BYm&p?9Lj9+?@(suJ8$K7s!-EUvEiW({g^8{>aAiNLLO_XQ5t~iBQmq6ueBIU%a_&t9=Fqc^=Z9*vr1b<=H{8*ZA51w!V$(4b3NWN@u_Q42wk_rw&zxcZKtQ>(6rdfcp}gm?AeoITENHTb%FtuX{%FRmiQNG}>p|7g zw7`}ycf6#$==i#J@QKb#4f70xNWK+4=(v^Flp*&u3#u{B((HV6@e1&T@0;E*ao=xF zvvTyVOwZoAc(+T4FQX~kPz^ZI4vVi>H}_RmGm<0eGrE*f7JQ?MtgK%gd>I|BhDc2z zE^aM(m^Q021H=w!+tR-xUp&sY-eQ&+YWQuHjgzD+s7LX-^}vG=yA}mi#};~!i#9>8 zMj2U!%ICu5zEppgnm!F1m++JF5xIE0k$T`aGUlkA6^^}~n3#pAtaQW=+><^Fqs<={ zbE~R~)Zt`?qeXmQ+*n(Fxl86&Yt8R!I$)7-a?KbQiL?`Jla+lkJS7LAovq$`mI^c! zX=l2pxYcB*)XM~ST3Xh9*;3!B^})8Ls*} zGgjkw_HUd^qFOyG_}fB-bJ>{zYTW4T3x=l9$ZDM~q)NIAe8HN_s6a_?n7j8bH*`X5 zTBHQtIsV|ygFbCevaAuu`C7jr1~+%z=0PMAg#|+$zM~NT-t)B{yDf3CB;FcKw0b2r zYjgrrKwtN|+`!5Va$!fWuqv;bi7r3yecTiCiXq9!rTvxZjNaSE$`-UZhnA>&>1Zc9 zcQnG}QK9YD1cf7Kio0>mq}k>+cH2-rQo&?bQQVCkRTe}GDH$lZ zBhT&SHV4$N+F2rb&g7+%((F)vd#2Kp(3gCOEP}0lOhC1PB>18j0Wm0w3bcm>! zOwYe31ITg~6qw4-0`9D^c=aDt1Z1T@#c=)W$yWm9UYc5zR@y5&`h3vq{K;z2qSD!q zq$Bn-&Cl}uKLNdao#V}ClwX0vS;FR_*Xm$sr6Pw%#f3=hDH0jkDGbJ=(jB7{D zZ#^y=rzkEFZpw5J=f#qcJmJJ8qlQRnU_=QtU++56PiLYh7Rs^FmGU#D-2&9D&zZkH zdFFt3NeI~$o!oi(A=6&V%kO@&~YfgLM; zXzB%C?6^70A0lzt?|AT;jm!r5nXLJsaQvN@3#L{Bue~N%fi8mL1FJKY)kdT-A?5b?mUNx9z3c)%@e?wHxmVwGBWs`%A;WL$fn=e(>X!q2-BHe>+4^)XjLnT%x4?wstFQ zOYb8>=y_c8atei-goBtF4T@c}aTKiuxuC?(N2#MJ@^&W-wlQ_~x|?9b9N`Z^0bzD4 zMw4q^fGWzjeE-L@jsV8Yz|D8@U;q8&Js7GHU?tr8J zH{d`}uioc7F+a!eJRP~|&FhsL53aP#&}E-HPc8ifkYc}q4tiY8v)5AkC)6DyT$#V9 zDi?|Wf;9YQBa>2>Ubxg!m^?kTeW#C)Q~Z43=3D-g?-mcwGfG>}_YXObJk~Wn1&4kp z{|RVFvTC-x(Rgg1?S!-l9G^p@ut+y{bQ7bp(zD6rTrizU6JdIjzz%x|?hgn^c_)Xr zZ#fj__v@+9<-f6xbzvD35e$%aM{a|t@-~;B(r*Ki&#%Few3M&R?nl{KaPKM78a|Cr zgcZa0lyJUxwFhjuh5f?sjYF#6=&VA;6|Zd7T71G%Sfy^xW)yR3(-I-|IKhRkL9hvVWK6H9d*Nu%x$M{y+mdm zX(NTNEAtWuVN2 zNyH=ZNbyZpHZFELpK`Rfw)!|5h4{CGSIOb6y01%&+xgsFG0xfuK2ivIpImMV_94aD=(bFUJ>usEgdwA+#1+B!sxl~Tq=qpfBOQJX6Xah}<3 zZ#G~h)eIDDE=U6rp|Y5uR>lnWyvP`@yOtR?6XtLA1r)SwiAr2Q>Te-K=`-*LRKUgLx_>%Ha>#YBy#xY_R}SX=UBLn@S~D@TlD4FnG7aiS5^rmorU(`($};7 z<5~s2{r0+s>6}Jj(<>JK)Q|EG1;>@f7yZ>9OMi~b&Kvjv%@&>u=R+dQo~0gOtz>B1 zWyXQz6P1SVGxL_>%21oF=7-R)7A{>hWrGW`hxN;y5#K_xc|K9W5#~*GHU;o43-z zYUD;#0s>+CS`>Lttd&2v{mo%Pe9{JM<9P#b@^f2_Q$br6YT$W83OJhUF(_(U_2>hv z{@VSspMY3lmz(Ksp}?DdA?iC*ckthtmd?r))LH)+_Nz4uo37{u8-pW#{?Ln!=i6__ zqLVtmrXE-S`FrGy29{ppe*#)+5A9YyopZI9KQylY&KojybQ!ka_}L|Nul&c~cBJwT z`!QrVbL)6#FlRFB=satQDi)b#)-qwcrL0JYLN-72@k?_%Zpqno!_UDYV5at(3*fZJ zeR7{j5HgoOKj%GZqq#t_pA`HOAo9CF%1lP=o2zoqq(8+sabhtnKV>#}l%7^rKZrOI zdl5PAcOpp+=CUH(r}=OSmXdZNrC(opm76F)c(K34)kDQygnt6UC%>bKy+ zs~r7@@Taz^lrrW!x>323^!T2OBb4ptyn>v=UR^@PlczR zGGbzo_rlGe02wQ>;pGO7dVXi|W3qUpDrT$uNpc{a*a&6aBX7gp@i*pk7D={>7yM7v z?~q;RyCimPO_2DmUV;H>MSWgXfsTTUcI4D2=!yr3sH1}B3HPla%5}dyD+5xcHyqW| zZwhBrX;KH@+9;!H>g`FT(?M+1R-QzC2mLConfN#_i~Lb2E0Gw2eM*N8`x*-pdpZhZ z0~&G4kuhdx3OW>_FA=TrYE_AR*rwtq83`ie;UZ$!T~Fu6oS-z*RPStirGvV99%*tY zk~#XmDO)0@0^ffETHMvHW$IOs1kxF`YJ-VYuhUjoh0@TT1omK11SL5GuWmSWV%B1j zt04o^PDaudJMF;6MhQ{Bzv~VXvIu6Cz!vB33CLEV&~OR+Ebv5`J{M6+u@f}&*UPY@^&DlUvW4)11dO{a4d3-tyeL>1^hmQI#Nh$ls0R? z$CMzmHUgOa9n>TFO`-n3wcg_BOxg{X-P^WI)zCPN$=&Zb z*p$~+oE*TcbgABO)VdT@!LQ9+(mhl#*^i|L0eA^YMijC#`TOKY$De~3OJY~{+=Gwe zUaW7`HS#bpU-_&*!uVJ52ydOn<~+NaSfwF0^bv zH#gga{s5+r$I!0e$;L55b4&E$sc0I-9q(J77cVPWn&-PO_8Hg4IW8FMt%*-=-GebU zTJ%V@C!5e3#rd#(m=xuu$j}z+sA}4EG;0{0+iJuWSE|5%6zCPKq0uG&XjJ&XNH-X7 zh6eb3{sVvE^RDAe!Pa~Hzj2m~=Jh&J2PML?0r#Ey=|iT;C| z(VWe>t+hD+1^X$nmt*h0u`szGuie459L@)#e)x3g=nu|5V~`x?mPI_y}pJ_vP_lCpL~;e{e=*{X_*OZLYL zIOvsVCx(HfjVZN-{^3h%`bv65O&A1aqiD$`1O;941%pVk=#-ps`VK<^ZSnIyYchI2 zN$FQz_?COokiSJ_UTImCC3dm+L7|cbL6fYEnoV_82Sa%s+gqaU&;Z{Oq{pNtNShnI zxuY7kBfp$$8V5j4vCqdSTmG-7T97AB?%$N1S+H2NE1u5?RpFkY9Lkk-y?8%C!*J{d z&jzOa-UeKm3DaT4?9edlM!t06RE{L~g4TspxZfKXQC=pWlx8$-4t{D%wj+C?96q4( zIupinfoMFI8oQ^d2y`u-5_IE63I(WTtDhk3X6sufvSD7*nWFZv^r)bS?je>jIdzSr!5O)wQd2FgyOxX z%x&?_FdkzE%=Qb&-c^!1Cbz;_BsBwxGoJz5P`M^wus8(y^hyefQ7UI};hl?7L0<;) zBG*G#sR&Bxd%n4rRiyQS+}X21NTP$DkNsO3it7f|+@`SHO4y?q zRJBlu1H?&{sIk~~d_qE}#PUI1a_&L#RR%#iLjZAbO_u8%#jr4Y2(OUF;nsUt48C{gWMATEP3H&kB>3h?%ar$1iPJW)is2FAM4 zw}--?L*^`mZsk%%pxCtxpa%Jj^qR25e&QMLqaU-5S;j}h2YM|Z9)JzdXe1;xl0-UX zD&>ND5y*M`;`p$Jg-88_p(XOn?=CO7cO{XMH#`;yA6f&Y7V0$-yZ(=ud$GV9JQy|t z7>talk3U@S#_eHKQzqd?HHRh`2vzBC!i4d1U{~Yoz76pPzrE}5bQ_<2Ee&3l0FOX zzG}&}1f@3?wjG|;AB}F*`~)!H7t5*@%QE8MxYOt}JnIGDtnf`Tt|aF(VVv{C-*=c! zmJYnDV+Z^I$?(oLD^Y3O1-|8Ud~9RjAL&XnD)YFG-!|&eBujw>i8ysWVH?s{&p?(o;Xh8=ywE9RkGrBZrmqkh1O_ENcX>fANUSJjX)>6xE^ zI@crasYJdq2K81}eNL>$39gb=pY-j1iT!&A``4)Q%1dZbhmzF!(Pc}o&>XNULBNlg zq^{pNzUgZwf*hIN3o)hi#PeaZD|`oIBZv3)4uibQj8`*m=M4Byz{YJHeB6vu*tKLR z6T^w7Im^0Tur-}tYU<0zu3|UwLD>uWT#UecToE*u@ zeOax2t)%mPRKc>rzgN*U>a#KO@H<}!3o2a73YrL8_!g#eynX8i*%40|pK^ zTHXCNwo1pXOU*3?1Ks6eXxR>~Pq50*xpviXTOegYW|$fM0MU^2i@>cLV%^^!q=7eN zb%;`DG6XV^nJ$8dYYZM&wUY#AtPF((q}Ma)vGxX8nF2)he~O&45#TZpf5Bw}`(##9 zHY`7h@r&yGu|movV;msvCqMvt)!|d$yLF!-kqouQtce8$`_PY>>jWjvz#y%rJp~o1 zl&&Cq0D+4h`21$*dHx%P&kJ*>bk&`1=l4SRx8$F{fBt>s&5vN4J=OL5N#?E|;aT2e z0fBA?iy-_V(yg8zd*pAsZAMGR2u=Wjfq=(_UK8ZguHQbz+?(D%QlPb|dlSj`F~c(Y zRSV=yH)R^^*RrPTj%@)TQf3XLT)apzFRxk2OVW=RzV`7$F05&8ytjqameewCVRbC7 zWi!b+Lk7xsfLa<-Ta>~lXUFHZjDYaTM={>%w7HaY7Ll!=uvh>$KM4ucc7spN0HH7*osU-PdJ ze#mF;m^LWvC@!fIz}s?b;!+iS-i=BqD|MXvk!)R9)(u690IfvxZx^Qx4gFWtQpc-` zDkp4Q)`!bN{baWNLePDK?z~jl{+?V~paqN~txj0R#Pv?@IYYrKh37cYFPZ#S`m;{D z9JE|%?BIJOb!p&`2^Oze?iB2T>%eH5CNr(v<_?-l?U&EWSORZ8Ct^ss`b(Xcgg@!Y z%)xK`*>I>h^3$L1$&v!Y-uK=L**l==qz?z`xxa6_$kdU4N0U-GRD zBM;j)9~`{_b!>n%ytqx__M7!mdi(DW_Y2KTX}2Gs{TyHe)(+*KV6!EzOs?bA{AXsl zTz4thp$e$G*S|$J+I%ib2(*JAdsYrvJT&r?p8lQ-viyQp!1p~pHJ`eLTtr=`4Z@)g zKQP^Wy&Am3G@9g!sl>QVTJi-O;e2SVGp?5qYs852Xvz@D1`^=YUAhRE%{XGtqM80^ z(5T`ey8Dr&crM3Zt4u4BUtm6G`{sPm<3Kqi8Pffuq-4cy z>M^HQqtg625VK!92nx%frHmOTzf&k#HkR4Wn0>!wm{saoyT#zJ{j;?*odc(k^cuX? zXLT5G`j-#)tmnNw5dG)43#Y>3B*i^mUB?mrE=DhS&aa*UWM;biw z%J8VII)2#ygjd<3E2@v4n?sQTqDZaz(Wqc;V9H0GOdz8%qlBfgs*$k}jn&CdEhpukm&o2R_Q70WFiIC{{)Uw{hAmr}@bDB9=Mux43;AHLr%?s1FFLsnuhpx|nEn1@ zOeJ7zlNv;ETzOHB0wuxL*o^|kmx>LG4jUq8>Y&9>AyEzyZYy~jum#^{Q4oRr%-tv&uKmKey`V; z18e@Pa@p2W^;cV-FYLK~-62sIXj!`MXJ?W1P2MgdFbm|qkCp$)EExVT(QJBDS2PuI zIxkP`3&k`(7X5hK8QMGZX)7+i^OLZ$g30;4hbN8aOmEJdk4p(@i@&|a|HzMsb}nDe zNV=nLFx0hfU4NLx`JY$qy0f?Wd?&m1C&04v;U9A+_&CCdPUb)8+5feW(SOF84h4?K z-!`?_8cP+TKR(OmBVMwC5YKsqMGiArc!rxsYci1>ZQtR+_|p7J*QC8s2qTb6KPUYJ z#KRt(^e%nPT{@Lgu-7P9Q)q{u&p$+YJqTGzvn2X(;r8pYP_&0oL7a<2TRA(>voXQF z1^f6>9XA9#?n_1YbZ;MPgm7xO@*_={de7!L*PQQ~(JJ%J#(+B6q}rU_X^c;Xg->0k zYeox9u;GNC0z!YFN!?ISu_I&$=D8Zr%<&0i+;-dGNXXTHgg)+7?!!E?1(Q6XwM+Ok zKAQm?*10wkP+5;&zuKl@SVBLnY#7t9tWpCz#exj@n0V%M^>d!xu+R@HSh;$+Yyx85 zbSKRunsItR4iD-Ymi5zP5U39$5#NUCtd;8_VA$BWq=aX;D|GqGEm`U7@z?>=`68UF z0JjnuuA%FdSqhrdFbvH3#GI+%^fU;Vxt)o$GnV4Wc7p55YAMe{Q6=MV4IyxIkP-$`S8r)b#3YB++`>RH9lSt52q|Cv~^|ZZHrkj zw&JfJk<8`_KNu(py(oBAw^nx~%0McvhXrwgxV5qX9yP~zYu3vw0&+<8kqs@HDsLI* z`)8)SKn5qOM76(MttrBFb8}ivlHudzwB8bvfWogotfseRSLzig>f>hT0lxLOrARB* zGxN3Yd1@5$YaXv`sr7sKh`hD~v?JP}9S6D)Am6kj`EjV;nJLhoKr?2%C3HBQ?Jqn< zUe?OS3xi1#Lu+ID!)U`~YF4iRT?s8j6$ta?9!}hlAmyXtvjdy!JqD*gDnS|#+1GID zrf(gj%j~GTV$r3p8FY$>*jt(oAU{2-2`IlOgQh*PH*JhjC_#YYUr#I&kkR505cwOa zm@6byHkA0HC`tI4ps2*~j8$1h4rQ=tlEfv^HoTj;) zCqR!+Rr;M)PdLh8qQP;Wh5j6@s0{Dm|N0>Q>0cbFe!q0BQ2*CyQ@x+r-+p`QD0F_} z_o>=t<=z+n)P%(4;y_&`CMM9^x9%d%n7FpL9TZXI_lSS3ru$Ed!u(rofF~~$&`f}G z6LJuYrQbfqcYcxWJam89lcX{b8dU$I=?CwAk_#))aYWn`9-bDxkP>*@XHii%Zc4Jp zPrC-jE@Ge=$_B9XWi3KGkSKp=IsUv z{+V=>gGGH?+d_%V{3ahSb~6iaW@TBH{;ko=E}3^x;4%#@Nf4E-g9m|%dK33d_I2Xt z12%{9C%rz6oOTTp2A$py0J|1X>S$V`FJ@h31P(QvRoBeM!R`zmJVV2?wl@!I76WQ# zpatP)ad#Dgl+UDTuyxg0ni#S;zHnw#?`1-#2R1hW!;ob+nwbTyP+aJ%>ba)qD}8tE6Y7i_ zx(hI2%7CtWboo>~&CDO)MK|VQt{tX5G|}Vo*+9H&~yfcxbmP*YnkW3MlUo;;KRD@i`^r zZ+5eMG9H1#;*p+ zF9I;vh@aYCB&V@m54(0d|01& zFnf8ePxlF`fnuw9CsFhaB6p@gBYxKy!CMW?dB{NT8o-V~bY7(X)Y;;-$ethu1=COW zZADrCsGwAK?FWi!u)SN@dl{J(PISDYzR5Oj70SKWP)m$Ev}vh#%b! z&bjPQaiyjsMk9sLtMX(JJF7SzAn8~^jp5N>tkc5cY<<5q^kTc%g` z^@F=YtLBUzyik)dMhCeP6vr^y^8gg=Y0{0b4t~U>yK&n-mwWR^vA8Z zd%xYk=~Zmh0)rKEKyA#)XG&mwUH0^|{fZRi#9@?9PalZhr;9DEw%QBOU|~4!RvxFJ zpNq4IzAh{?A8v^#l)*=CO>ie%0lIUskwg%w5s4pszsSdV`}9e#zmtT~+mw4Db1DP8 z-k-zU=lJF`)x|Ty*h)!;`9N7SB2ad{C}n`ABE5B`Z}1nx>jlGEi94Ct?&((9ndnPM z>$QYU*f=yKP$!-;P|iM}7WRzLt(Vku^5ioX&8?7fg~ zjh4!g>0}s+3dt^(Db)0uug;D~^idLCwxhc4a`f<(A?DOWIM^KlsvRpRVe9#zVbZ9qqx4U3_;c~_&2*JrLzwaw& zQLw+Tr9T#JoJ1X6<|}W}4muUtuKxdB{OyTy=F8ER&=-kCN!D}GRVWVXxa(iYh9pKw zV+cW}UyF18Goc~pG5=u|e)zWQ$K$idlLB~$wMSAA3o*h1kzmlPVx8qo|J%H{K>mQ1 z&kbt`m$bOyFDE`_mi#;USBJj68#CIBz-~#KD%&7{qbrXn7Nbp)JxOlTk2v*C0ohj? zPhl-)D|=Hy;F5N1dEMu}N`WV3?M}u7c1j&Oy>ybhZ^~dUQrb{5Lla7Z!jn+sxp@|f zWt;?!BNxPe-1{0_DUow{S}Q8{)Ms>CA@hr7N;^Y&V+<8!VfemNEfczKhmVsyFzPJf zxpi@eD`InUYiQ6SWcX0&NYr^3U!aEtswrRRuEUxs>df;QYLY?y29)72^})H_Reo)F zY9)PD-*aR|-jjXN8!w*|I2~`HQBie#^=N^CpqOO3F(9YuI`i>Q!0W>EajA^iom^cy z{dqHS<9L!*?RM(-Vr-O%WEt_zn6d5M$^{f%_JoizUhZD**&@8f-e3uTz-@@v2J&%b zC3rfiWxTt^-b4_knsU)scwt`%{w?NGAJjhfsrR1|dvKSR{Zs7W{30QR_J>OCf5E4q zA(c>M#KPIAr=ySgLTfa#IWx@jBD^(nycA;IopIV|lx11hO2Dr;W6O1M?>w;H6&QRJ z(wfSD4d0?p9IsmdGVtmZv?U2sin-^b6Rh}!aYHF?p_}j2V#0rbKhm$Fd0_kpT{^GB z1_Bq%(tiA-%b!EGAw}YzGd9zRuoOc5_NA`{eDsZWAND8Ku*ZfPItp8Gi0}sd1BD6gvD77 zIz`M(Slb28zc}1CzDS$9JRQ}~MDJx3xAibRyOr(=uq|PeY-EPX6JTW}pV_m-3unIdUu=D{SJ6I_4oPEu~j#r;IYWp&gcm)w)oI zrjs*10xYZzX4qEl?mAwwZEV#t*%6SAzK}2}5rb{CSnFPN|S&A=>md?bO`S-|)QuEyv^!qN@9y4!A$T%)+2XEiTkwPm=kId@omsok6uB z$678tyjG-rG?s1P5e+9)mn(j4h_B!Bl~*|LDn?c#k2iUh4f9+r8sRv5O$&O zM**H2?lcworAyE!8twpQ{k?_@i`1=eUYwj^IYmYS4H9(Qp01!3G!2DYla^&SZW6Rm zT{Zq(BUMwzSlPF+M&*#+#=vjC9@q5OnTH#=+C2u@xd}<~|Gnjgo3byIAC`Lc!lzZ9{eYx6o&Jz238%K5?IPF)Q zb2ErscX~8HQ=0$h7kc*8JYMy}m$h~4(NGgV^JmEvu{Q_DP+X>Jb5_R$N)kmO72OD} z|LH?qPxwaS+uY3F<8h@}xT+I{Iyq2bvz7?$yWcqaZA7|c==J8(ig^JpRsNFE&;8ub zeQtY;>1KY#y-oyNkE{o*$_0~lVY$q7m{zpVo~l(Dj=!J5vtq zBe~h7!nU(4S+qto?>A+~tDPMQ^eF{)!^`he>E$V=Nf&Wo>FW$feZ9%pO{d4Bq!P$K zLxBVus1$-|dm1U|^TZ(`OURdumQ>#@}wSCoq^m}Jk^ zFxg2Mr7n;p56UV!bBbC$YJDLiUCMrg}>#Gw*F6n2 zb>D-m<%`Hck?*y!@8Rj<(6wA~P&0`4(U5JN5nk+!8X+x2Eyr2gLuAJ=lR8sS9w9MM3;5gjhL}CB* z)QKIA8Vm+^@0e(aV9MMSLTS;Q>)UmXXq4F_kteIp)(sZ2h!*~;+?tQ667yvE#PA|ll}0x&Nj0|%*sqn7bA0#77@1pW;Y}0Nm$Ut z(8lGfxi*|-)w`mghf7UZXSd{st^Aideq~FIy^=z1ewh(n68VnW{K+DL&c?hx9ZQ|) z{BrX>)O~Db+I+B?EXro@g7&tQ=?Ya}X6FRb&^^wKTr;&al^0!Z*YPa5>7mz56!R9W z$nN;IZp-!S`xD|Asj1B-XbFMQ*T8G*M*2!jm`b-tDhEj4J4Ia5rr_avqh9 zKaWaab}tcLY}RpoZMz>?b6OXyd{}wGJuNZ+2a!%-&L-=#c+qXkB~fnXrD3G2!76<~MY=a9p4_^kUbf z`8{=409PGNF{wp;|*NOMSR>g@>B927T^Li5>EIE_GKYWkA5?WDXBOO~fD& zd~#Nzpc6*V^6D#g>&VC_kyKDxd`Ew5IeUkLAZ6l!PtPM9r9{w7?Z@7|7wC<7%B5D8 z2(kJ*5s={eHp&p(zwCw%IWA1#9@;t#p|U z&ta#@F9*)^kuc-A>0AG4S^T5gytUj0s_mb4^lqoKw@XU9Bm-Z|_j;AJKf&JFK}{*= zeYa;>EuC)kL2=(DE?`q!p}`&;Cl!5IRX$Inb0v9~&F* zr4IN9sDuz}B`iv}Bz{&HtNX6$`?zZ)W{f~dA(CcO+nagho8LbBn!U2gL26K;xa{e> zbn;uQlui!8UP~?NqOn$}L;T_v^MC_e%up4^y#QL(OmoaaEhvPO_2!`;Mbb^y$~6G9 zY(JD}f594*f!QC6kcu>fg7clp6r#l;l7>>QBf+%gUdSetoq8-3$r+YJK3i)qqrLjn zQ>whitMDm`q)364I_LYB{-9s?hX)5*)cP_EZ@I`?EW$;P7`J->oi;W&VTz+2uub;j|*&FFsWwh^`LUM|VMNw`VAvqo2;Vk1TB_1Ix+V!$K3oDVy zl~fmgXP+?tpKR3b{PB7tw~S~Gy8gskEw2AKK8_s$yB}eO6fBQrY*xH~eT`&xlfSRhLVLLYp@{m3f#; zVXA;F;igf=Xa1$V8n3~;l8t>EnDWiJ5NxaU#C-$$!r}!_LuzKe8T__hcKGK~rh_KE zI~s1@%zfn>5k@{)$dCttM{^lw5%Y)zQQli%ivs@O#{{Yo&M}lt%@|egv0{r`Y9~?* znhr5%?mUnjVnfcKR#B`ws8rvMjP>&@8(nOkP6bp-`-5QJmr~TYj4uXrzHR|TrS;1a z;S4nV3i!kR$^K6r8v}h5$sR17Hlx0q<|5N0vUACwnygnS>T=!uj-D2_;7>orTwpQz z9?(MPRhFCjHZ@ms;qb)Fle-&fKbO(iCp94MhAi>Q$9PSF*@lR_sLco zT3@D?iAWeWX5v#uTLP&)Jbtu(_i%9aM^s@>BFkJo)2RRuBnO~j`0PjgN%@czJU~nT zu?WGb;B&nBqEMx6#6I;L5_5R|II9-t>h_$z?9%D-%T^BEFlty;&!{v)=y$B#kmf2s zCu!e%V)0rcgU6w_SpREZ42WL+m-i(!*+WdIUwH7ZPLe>5Al8NhQ2ClSm&PBu7*u{; zu_ySd_iq)wkca@l7@@>+Ek4I&-Fq@tdc`h+-f@XGmW>u4MCq%ct;KVtlnjt>PHUBK z=B`1YVY=NYXNU2&jWV@SS#G?Q#U1$nttA z3Fw7{9*b@oipyN8N(*SwEF8J>u3%Qfjq_;?XSTEIZn_tP185ywvyR6W#`-Fi*dfZe zNI%_x#!iPblg4E1Zbn$*TNo<6YbVQ2%ZBzSRF^n?qrqW%Eb_$Jz`oS?*q}&M@?az! zsZol~P~8JMQqf&E?=UH6vEUJUD^lA;Hx5Ig@x7Dt2MH(Z0m%6o^rfV%37aEdVS0pGNQZ?-k!3bGz!Kr_W)x=)HeF#=*Lf_~hfKLwsxV zlXt>jw%#m=7WCLG6wo_CM`g@i-^hUr&aamPa-W{y#t0W}cak7$Wo#7tpw&O@EHUQS zV~l~pLms0_dp^QDVl(TC^`L7h%jebNBEKQ+`Xe9ioR-=_V@nb==6E~LOaKZrqi?>=Z;h$;BZ4Q1iEu z$|ii$^xFcu$T~F2*vz$MBThRG0RkII6_u2b?ww3d*|%74r@B-?e2_9b563fPk{*S} zAlYhi;%Y5;;zpQO!u&R(uDR9rHppBmD^kd%hga&L+~lx_My8XU9aU?OL`P@h;A|Uz z^SQI_@c^73ITQU=-L6W{Z*nyjnokMxAtQNbLP~6emw9t@{QqG3z5m}6{Q=KoVmmzN zbr;qL|MiLH>dsSDX1do8C__hy{v-R8{(jWt&$tj5cRI8dSBZ~QmWE|0ED(^VH1B;I zf5TA!lh5c-_`Cw=b!(UHP<8|XWg1H<{UGy^TJqIv_O|Z_R|1%959_Q|@vn+CfRciA zuRciY7|xkBdcmMjxxJ{>>HCknLT>Qb)JfJ6{WThZi5j$tVo#bM5$QA*7XO$Wo12`^ zED7*A5+S7&Z4%a%Jf)muC}+6ohM_;l_u zi@H0D=_kow3o37-qsr$}4)xF9Uzp59fi$M~2hR9@tOpCaX<)f_PaQ8&zr0k?(gpaW zZ$T2l1JC8}fLO+NbOSpwRMxw)6R}h-J{V=Y;XJSVqdNG=dIc~?wX<={UBbCEVC(>D zi#mb-;}gjTi6>rW{(ahH`0GvHy`q1#zV7uyeWWpg!6`O=tA_*h+e>YtA z)YQ~vIDV@36BmWPG`A!39p(bI;}b>liJ=`u#5v<32uHnnF_LBD^l5J|xUpKK%x7{1 zx$us%VbldVzGRKUJ!P|K^cNX2NM**f1sQy{?>E2=AI=khGfcmpo zfrY5K7utGb^#mo}Pvu?jHOe_03RJY`nHcqOHc{exz%dukg4OQrt|U1mTzu z_)EtixhXEAx||*JdCIf`W2>TH-Rv$W?BvJF{zA@K{2nzE&NeLsu|oFV{GSZg57k6v zDnZ1mw8NT@jf#s)J(9|L3GwU-LgI&n;LrZMe72|7ci(#-nl__ndsg0Lxf4pW?|!7M zI=kY&!f$}oQG5T0;uoK(IcELhMzB*o#gopd!gSEg{hOcoHdA;%xk8Q;I*lEMDj#F- zeAy5jVypcLdlGQD{BEm#nLrh+{`?OjDK5cJ%VXafLh8-wqZ+o}RVT7t(EjO3{xbme z=XH&5UScn%3FN%@OSH5g(@2TaFX=1#kIR5SD?>RUI!^NUFO44fN>8-lE_;$`3qJg^rT@zK8PAmf-Sdu?mpwPh>iqr4rLX|`_&!^7B9tR!D;2teO3`7g2 zQwu)hX%p-C$oaVR2@+OX{K00#nN4zA&($WDUA#_rv8%t1XO3NMLk!W_TO##Ia{{z` zQ~(lN2SNI6uZ{UHUI)7E)|YhizVD3ckHi#4f6goj1cuYJi$u_tsG};GFr2a`gty6r z>vHyA&kK}@beZ*UeNXwlW`ZYE;MS8Lu=0cSBLat+!M{2|f@LZ$yd5e%?XJs2VsT}7 z-{M{4A4E@1Qdp`tpLM;-8Cm%v`y9@JWHE02_jmI<39U+-2Q49bmi2Reuz$boRdVAe z_^<3K*N!FUpRH#T-?!wOZArX#8&#OrJ_fS6TAn=5Mx?@dcWBX8d>o`vkr%I}?rDEW zK9ladL6)J<97uUa7|A7ElJ3b1yX)Ibmj;E2H?g#4iM9e+pQSijk3~T&nr zm)6>bPJb9z%Q-zNshg|Zm*+*-byz9zGR*L+_<^VS$7*V*#B_vmc^Qal&E$4p6lS`U%+Pa#_2EO^ZLLMszl^W*QclXs1 zGEM2f7Ld+Ri{!WHkU{JSVyfIi#!$}Bd86l;p~+UcPbw@E?y{!IGBKBCEt|s z@;lLRoS?HB`9CbsBT*;n`qnwN*X^1od3#{1Pi7ef%j#G+w*1ir!4C3B0h4%0SqCQh zuJq^C`EuDx=D;#JzL-sVUvKU8QG{id9m@h7xL;s=e09&-+t)qhKw zV=%Uz)x;~1#ZolUu%wgW-9BdH1mk&Ffyy!Yr}sf1T%Z))jn%LBb_Um_y zs+0fMHO)n)MtoIazL1~IyXmxc$qgPyrwQ-W+dOw@Sv?UO_s8`LTOqTRdX9n*Z}EPb z<_sWLYVRU-YimMF%33XHulaD>dX02`F`LJkA2V8-5iGGV^`x@z^W?m@#7it`v6A_7 zukn^njdXhYa5B<8E^e43QS^;1VpBPam^V-(lENnpw?a#^uWEh-3jEtj8V1rNRhD6s z_YAi$`FM7Vam^ET;FzoRYX=4Pfj*cdO|=;96RLgwLiZPIKtDM34ngUG!6E_Us@MTS0J#;CjiA4U7>beE7QL&9BhA#rGLNG z()Nr0=zs^$qjtv2>U%u!lusrrLc|q?=P)S_XwrrEHqW!kk?)ovL^yZ(C|K|h$b&Xt z7KGIw4T9czGsUVULmLL2i8}v^Cf+cAf+=+)dR2=2=so*v1u^ustg6dmV!*IiDheL+VElS&|Prh+Djr@wRl1hii&gKd?wa#B6(sn$m zo9DABmjLklh%Go9pB`DMhAR-ES)dLg`eyWg^eoM$iD~c&8d?(v$MVhDoLJGVyaLD+ zPP!>P`I>cCZ))FIr=M+!EbAFG3bX4cP_!1M&eN;gQU3B!0WCxslbjU)$cgt6RZo`g z0N9bzE2m^2Z&|(i527LFc(2Soo33DYsg=X5)1|K=Y7%`6e45Ys*nSktu_fAScB7+! zQ~Q4q$$a2{Hj&~36$90lO?;}=6)*5|Oui0sanW3{P$vjHF$*lTFDw&c>n9Sz7Q?DY)nDtm5; zh|Miq?Nli?O*94*F7z?FPMF>F?d&4Z9qu%kKC`>9+ZZ93lw`0jfRiZ5bS^GyV)0qi z(^JrNjvh1l6f=mPX}D*(V6@B-T_8%UQkomxXD0SFhxIlPbde9$EjAsG?0F%OqG>+IajZ=Xm9c4q2F%!dNUi(tN^E$|Hru=bUZ=nZXs&sd znXbB3FjswYFmcXNl`4{K6w-3}nRIGeE}c7e&QhjBm(x(7c~WV*(U+B`_8v0J^*70VcX#hnKLUoxz?pOSi zb?&#B@K?B(<|;$^62}jywyB*&z%Me+vBA9~Qi*SMu|JGEmMi%8a_gvRs$~_GgO#ma zolzOL1(xBhQCU5)zO59Ps3)rcG7D?UXF5IBdo``C-i7+h&`UG3$%~2ZRNED+Z=G89 zGf`F29`t*I87frf^*=pKH>| zrm_6sqZDAnB+VAcrPW>GO?OSzYbUWDq%?Nj!@*5X#GlOx`2_dLpu^G3R&pp@VLB}b z!>8Nxt^oi}BdFoo-KKFQ2g5+ld4s&$(?0zf9f(Gu>%Q$@OrNb8+;MLF^0C9`cEx86 zeRCT)Z-&x%H3GbApJ@@HAkO@>Jqo4G;y^HlYx{rr&mF2fD<5JTiL|L4X84+T@72M` z{BF~(K7DDh^qmZH0%u0gd%7Y?0J-aA#Q>((SMEpm=<*`IPFC8$R_gM@C!=BcS(V<# z_?y395Hb7F9Q!#CnS8_py^N0}bZ{8&p8vdqGqo*!gZXvs`JtAMm{K%;+g z<*Y5W6nSP+Dk+y6Eayt&r&I7pJI!IKbfuOoL16U@3q^=+VdwniVf*UNF0d>NAKszh z6^^crAbmam60Q!@*HvX7xp!O6+Oob$BdempF?CI9`s)!ke}Q_c%maWel?h#v#P!so zzcCa)A&r#Fc-K1eF@Ja_bJjZFYugf2;f!5VA4>#BW`Jjk-%iAE#%#|Lxq6kbKb6m^ zjgSc*3h17Ir0j|NxfL}C7Q>&id!}4!?n6o(Z@DK8r(BAxfE#%65cqxHm80JQ#^18blx{gJ2!hk%(nS)j9?>1OlI>7%8Nn zfhizp75t8TXN_XgBxxRY@}`u}(@AQpvGreL8c$m#+BeiR^!-ZxT2~D9eM8y-Gj8|& zDyO+Cxae`F!6KF6hLQ--mzsxTBkkQImwr>XI~cUT_Q?tM0af!dKka#-Q-7`jSO zBK1t5N|9F_?5Mc-)1zUlm*Od9BR`b+2rLw~F;nuj`JwRtZq1{cmInsHMOq2H*{_u6fV$DCO&%t|fh$F$r$ zi@bjJ`97X@=Q-xU_T-Crp=e|gXU2d;1;JC^6Xy;-wN!qXojLRV6&pmr1(no0yfc~a znUKxJS@la^zt(WL86GD6 zYBW_mwouV##Up>!9Lx}FavP*Q_{s(=Po>!hh=m9z=42xbT8q;Qba^>E3uRcT=T;mD zqxI$?p)#wLcB@LU^2~H&`ABjZu=Wu1>c3<@k}mjfFP=XqLi#te`khO_+94w>6CHmF z5&kRi{r9L-*br2-5*s}z)JKryCS^Wn=s9wtMp)mgFZNos(-<(et!N17I|!#orloo(n>fBcB{arLlG>4Q?-FH24BlHw?y>}AtdSXtWWA(4o>b@&<()^+MhWX%JtIby($lAKZ{wBXc=9?*uv7n;j;iQV? zm0%*Bpi`X?P?2NM`)QRmuDaE}9kwrWS$_w=B&=ARGIC!1l}h}};nyabvTzjx+R7nSvs+3(cv{11f}4Mkk_-C$|m?q+QzCRhhU zg||<0MMCwU{U@r67dB|^G63ix-oksa&XK2N811#@fG$b}4u=_cPS zraFyg#3`8K>bo)paf0rRvv(*kBGW3kbo2`3Sy&0&Phe$YAUv;soXv=JU%6}%UBh6X&}KB-U@c`1HxP$^95=kzbKQ$JQa;WH&{I$NbD5GJ;kmL&D!wRe9a0D2*4 zT`04tU0uK7%+vse_{AY56xA0DMj2?s8N9Es?spqZ2AU*@*lT>+v+}-Y<=&!w!jIgD zsL%G!GUJfcXB)h-m=I0S^pP5MtJ#BjDp`ws-mIF;SS)GP)5mz~k@4!HGj!TZARiCs zLFF;~GVN`asUu|jLtc8IdOgbqgB~yWi{SWlTgS1+sR|elwVNVZ6oc|%-i|3dkp$gw z%2W2tla7Du<&M1cayhJz1p^sh7C3r+N<)fwvJC??Mxs3<_+a1;horvldjFLZ*EQob zmYN9}t1=CzhMB8+uGif^^c(Su1l^>)0V#(Jnu-ddjD^>@vo0vlpEa7axg&;s4lxC~ z=K0iuXb^2tE^rxz<*1S52N=&CITYM=KD?9ovw$OTt#!qh!|Cuuc{NvtMK5NWh=9xe z)1W5Sz!7yHmSUu*VXK9b&4oV{^7gGyG~HG`K02xIWfg-cJN=c=J-*Il*R;ltKl=y{;k z-OATKKTI(@J-&@M^J1^i&U{b^5v0_yez5aBUz{EBvSc;%zhjeHuZV`_#^H$??Nm{A z=&d-Esi~D?&V1EZ8%md+-*Yi~d!qx3Kqd-t0l)GN%BxH%ZDz}nB=LGnxFZc>ZQjFa z|ANpWI)B%;@i(S1iVe2g4+Q@{(CJRPqnDjtcu-Hvk|X~!%a#8us3q1``i3R;K>Mn| zXUWTZfqxJ^x47Iv`k$!W|7f&%^gXMqK2aBWeKGoPkLDlF4YBJtRT^9a)0K_;M>o~H z=hDSEpY}EW>z{|=7xz8xDjy0e?E1}uJ#QnWA@82k!-Y3*oiGQ!?-2uxlQWWsy&VeN z2M4<-mO?*O30Y!9{G+H* z8Xtvdh93XeFbi^vp7w>S1v4aKq{@b`4M&nlo#+%GDg{zPBrG_XUm+~&(mm97SEq21 zQ&{etniq0O&&=qYrS@qjKiZTfTu-^H9MOuu3x2b97c?4>wtFy`o9q*>XJ$OD;1B3F zad?2mx!<@g4T1`rCTluRnmputiT9&85yr;W?S@332}0xdMqZwsi~_9ecRlk=6`X zUT7uA?J4oNI%LM?GE8=-Pze!w{ZXGaczBz*nlFKZ0&FP)IS~Ne>%Ir1FE?JA_Rdw=Js~- zv~g62%Bq84U&FpwHokC^AnA@HDDWiuFN;}8w2uuQxs3{Zsm)Vx-k*FMBCshVEF(1S zi#vOOX;q?P{W@(Vfvq1TTWX{iBYkmB05{2RDH(p&k=-BayQyq;zp`Z^uHAU}S4p5+ zCWWG};oQg8*d`nOhae}%Ba?ZwxQveFt@mVcX6b|6-3UF!m- zq#JLNG0fXUDTPXRB)=CS>a&p3yoIaTWtNxUN^1C*8P+ov8jpw4!Jfs^-OV4B-Rb~> z)}nH|^cV0!6#fke&8Q|9`f8V*+wivS-bk1*@hcWhMi7qd@q69=muplJ*v ze!<$k?-o{M~H#7)GUBtG`KEKz_MkJY2QSr}0>d_AVcB33_2{4Su2&Bmoe zaO6?fq}>-5=lhTOE!g;~}QxMqFPp{?f^7JR3fVF@o0Xm~yqhJC_?x+>CCge43r$w2DXvF0<9y zApB)*5LFZN@K+kcY2c(1o2#Ps#7Syi@T;7dL4CE~8dhgH~890p?~n~BkP^^r+}HiS3V8*p)!fhD`i)1p%)3i;;Up=YsIEgE=%SGK+!9$kLtUulH|O zHpu?S+;vHBEr+4SOZu+zSa^AUTV0g^jPF26bkuAt zxLFzo8**nmPODUITUw#Q)OJ59g_(YCJCa&#Y2Gc|zh`!w71;q1V^!x_^p3@Eo;@8BNcGfsCKTn2!endf*j3{mu_NRCnaNu zl8aK>SU#3Zjig(fXMPMINE2>zm~!Q(-wN*&9ck1o>FO;)u ziT)s(H~sA<`kN9Io$8k0|08bV)=A1N%vFIUPEoYWe96sKM1mNoeeh5XGDQtQrX7bQ z;*l1N;$MG7y2Gp!_@dag52kq;itHHZhZDWTtt4eLzI*nnWml@qJTow?O6W{BV_py| zm7mK65H!h*o5{xM)F-g~f$=@wpe3vEDpMBz^qlHvj)TJ%U>l+P<_`+MEc8c$e8w{} zg+%0>DJq6yI~`^$d$-Qicl0uCn$tzh;u{bUPWNo`zI63sXi6*eEfJM~#}njc3Tu5p z&q9WV^w;jyC>mSS#}C0IQ|71&Qf3T>oJ)dpN9@|;HvL!dES%ZTK{JIDoF@jHfD^wZ z1~r*8kI_w5#_Yv&xrh;PS5zWo*98T@GX7z$yb45$* z>#>0DITAfNaE@d)u?j)WGW%!pp;KS)vUb@SGi@HDtnOA!&*D8s+;7Yr>iwkf@ctV* z$e(cYKl4Xo*9zNAU+Ddy{57`xALKyzUrK*4de{J&1j)89!_RE2pyb_6WJ`@@M6UJrKvN1W8m>Q0_eRB7sS3UOy*-3Qh1XVlWmZYACi8) zHB6g+<)(l@$bgx@^<>kvSM|7zZ!#rFEmqOa&7IdYj1BdL>WoQ{VtB@6DW$<^ZBg$% zu8^-zx5zV}eR3=xW^And8eRCrV|?v>wG#s+8pG_%7!jt9(XNE8-I8=bV7y|(YquXO zK-Uu7!@#H}dh-S%G!F<3N{AWW5g>rT4S(x^-mt(CMVOVoxdV9q6h*&P$NrO?v~(8s z=E@&LOp7jy{>*bV_g9NfjDgk^rNH~13N$2Yhr?v&IXyqu6Km(K-`26u-sJ_$+M$0r z&BoFNIQw+p_AF>LX8;EJlU9LhZAKa^EnS3&y34jTT8kZ0Jn5H=HQ)kle5!v+z5#(EDP$FZk{;@SWU7yiWe_P$U@^N!4n(mg8E-CNJL5Dogjrld4 zXvM;#Q3ZdgQBk4sK)RS_k?Y4{7Ad^>KxVaF)SBG)QP z&#>QIAki~UdP_w~(w$!3E~jLhzQSK2Ffun_BAhd7YF_n<=9}zb*G`mPYhJdogZxNy zug;98Unc{2;Y032Pw3gAW%sQppCLUwRv|!2M|q^D!IYw4_noV4#So_=(}BX18y210VI=bB6|oAlc79b*$>SpDTNA!w!oEJC+}{ zP4>Oh6Ib{bnEKzV2nZ-G$Ujh8l%-g|stm*0i?SJZioT5D&Dx9n$tNNgsMl3%YLBXLSQs8kcS1i1qbF#`2~=bZ+O$b&%`y)P8Hy`cNB(Fb ztgxlHUwkBW~M1BsW!mp?b?GX0^xI%M`07**TVO zom(BCRe?JhODx~wX4~?41w)wiWv5@`9=}1MZVkwk9&mCrP9e{>%iQz{F?18fxJ9wa z&2kLhg#+g@-KvbzknFac>f|t-6;(Xs3WZTpM1!qo`l;>n?Z<7w z7U|0zWPMS$qoNPK+1-Cis6hF&s`%Ghlc!G;R?IfeqQdAoICz?-1A;$&B(TB%ckRfx zKQkqFOoKJ#Q>Eo1nCC6_K;hiaCfyi)nkh=%Y|1)z^B(^-pk}JW?}bmgu{8+HlS8+o&(RSo4^v?O1W4KZJOIX;R`FJFQa6H8s;| z7G!UhP_d@WfD3~^)Px+1=Xoa0eR1$fc$#haH!6`?7%4G4I!w%`P)J|#S5Tpd$W^F; zi9YYm*#6JGpFi&(6-%!SpFe-0nANrF{tK_nEp^As`fnYd2YXYZ)%#CQPDK|d%544yY9;@sw!dX}irqlLP z9u?T9rUDb9PQHmEd06V1PqgYh9Y(U;Klm7j$z<@w`YJ$IRpGis93}! z^V;8Zo_!jXnT@${-7K3SpJ{xX*~)`IuAd$=UHhRXI5<=y+3Use@bxrA_Q7zhK7)w8 zVe7}1kGhsgh;Fi^>$>7A?F&O4cdRzg@4d3tFY%rlGpd7qFLHj}@_gvb8mUF0-gk(? zx?|j@AYw^aa#!&&_QndAM3~)!0<+55NI5p!v3s7{``GanS2sdghr~^(IWKE*K+Dh) za(4v#mW|rC#TS-ka9H~NrEm2hgWsuOj%->l@B{p_MJLP_)q^2s(%ng*v}OTCBry38)$$2!uWS2a|h8{?EJ66@Dp)+fIDGQxq8AoX!=k|V5(bh}0= z15phxKeIYnVSb9tJUUP75?ypjwReiT!T@EtGDP-81E+h1vOc_|e5k}GFzq47v5Iv- zOPfHkCFDi7xwQ+jy-e8xEZwhVEE!X%59Eeq!!k^U-?=%#pXk2dp?O>{fakTCbua5l zDzj(hxgBbmwOf(-Qv_JfRH{Y<*ZlgbSGVV<>#6Ehl~F5FLEShI|GnJiZzBGt8+QM1 zEJm5f4>Kz&1B%PkZA$`IpbM21hCon;34n8tR3~n$Y0J$aPvsd zG{V{|twlQFj=aM+|FrR_WVkx&O4f`O9~m- zt-RUO@^&XDC=x1K5{8Vw!M7uH%x(IeN-pZZsuz`uI@C`7gavY$PN$2{!GBdM)0FNG zz52UNsPBK!VorDxrZFjBGn)MaG-16Zz5LH?&V#W`$$Ry7UQL_B1L=r{M(5?aMfQ@C zl8~HXeRvZzgW%h(2Os);3^3K0&e}FXT4kw`$W`kskT3ia$6|%7j&8iAS3cgK zjk<7o;2+JboP?kDQgb?^pQPrxDbmFFLYhVBLw3uDC{0DO`_plEv_zEgG4mxi=_O(#(GBb`xFF(Eb-3T$$$Vr>FH=5Z zSuTN(?Kz@D#qM45bn%&H|CInD1V+yP8xlYhOPO`2^bKC+5QBSQnuS*CEw-z~%8sRo zNs&MYr@oadhOaO=?4I(weG)lNR{-UmHYTzD=pku<^+=g=zJXL>J&l?^FPsjq9S=r2 zPfAqIL818BnxHCpzZK&7_7Oc65y`4<{#_$jt*yIAiCcqqJcs0!qKui-P4oC(f2VMF zl+pP*SH0ByB2_VBn?heRd8qt2l$+JhtD$rCg?~Yt4Jz}L$-?E~=Q&?;oz0mtPP!+_ zn4K4T4gh>%yA5+irIT&`RGP^))opS~K0bc$>*R;3OqJ)r$OZ3`R&gs!o01!>gp#TG zFPM_5D-X7N3pM>85&4My6%~ecn2-W1wTaHF7g8@^9*-`EzC{{v*De>;CqrY1$JjU= zvug4C%J&4|?hHX8FHhP4QAZY%L1o&E5Z-!unjAHyFUPYyTG%`O4$HpE*P~Mno%S1- zavJO_s=IB|ldHQ}MEaK%j|>G(){fVPG(KfQ(}7|i$ygrA4Z2La6R37@Wj+~xk)ths zTjjSQ;5=RqoZ1=B^6~f8mD2NjaxJ>0Un-5Mo_w+bOv`&#>w%j+@wwlj{wLII;O=jEBXbAFQMmBGr1`(ww)F zikCB@d`NFR`2ATU9Zc|Fw!iGZ!&0lIDwPlN?;#Q>Qh-|D(!(X7L@F<@v3}R47 zsf2log!DU8L8lsv!X;=^_RO^xOL2TqO&{5zuv9H$uc9X(y)`Pw(!^r9F4p$rD?&!k z$-U4Af)c+1i|_=PWO`8Nm{$q17-jFP%J2^coPRIS670HJa>@8(g5`VGce>JCr^vLD zv^2a0CsbYY^C&E!h&37UF@AqUOQF?Xk9rcyr;F&3pO!4RsPK z>*&W7#DHUVFY&b_*)zdUOieL+2Qp8NKza|J`ktu>0X!#xmbKIBLV$8fsuo<-S)5O8 z#4IOm^fs!m{8H2 z+JFTCH&HjISLFie8LYpQ-Zq`M4UxXbH@D-t-JOt->F`dJ4Y;!-Vdb@uMpk8F1@+*f#X0NE{wd&_ zGz5{hm&(tw+)IXMek3}5m-)3HtQ7B3RQK5l2jBU{Y#7a zPtDhO;?kuwV_qr?tu{WAl3VMp>19NKWR{7~_q_#~mlGn2}xbD5ii$*6U%t&RV=XNaVRE&D4)VNw1{U( z@d5b(K~c9L%_ME^Hy`b9CjBHLDk5Sc0x9d?2^Gd_C^1F3X{d_*={LuF`$qu?J3w{g ztzqCog7PJ{I8X -`8f|6NFQsjNbZ-q$JV8|7y+P9&2>{$=g-9l%BZw)t$U_84;v zbD~&!8NG!T2+!)0Ym&@qUphW5-?;7jjC07tY>};fDn?v4Lau0OR&eTz^MdZ@yKsuY z@(?e`O>$ZD7vM2ZigntrDptG)7u3loA3(A-tBH32<7$bzpA)Ki9sR4Psb*$*i$A2g zuvI0$S4{40TiS+N<@Toqc$n^{`|qffeBwKuhWloj5}?h=5eXG3%BCl?oZrk=gO{=f zG(b?r#p!nhNmo}xr^1FDiCv5KN?{o9^ZL4HJUx(>KQ2Il49AqTylT zf_u5l8U8%u$CqHUl+~vpK`rsw59)NHO}d)>gE(L3Y7B71sf2_tOb1JQ8;Yc<+gzzC zAk|hY$%+QwTI0|avx0a8G@fmc@+k~EF*6M?&HL`A@}~mj1PYWt3`SnxU#SH{6CY(q zrf!?mH&Ty5{pSyhh6v${|JB}ghBcL~>wr>3CLm1#L1_b_DpEs}PC!BnQbdv7n?UGA zMIrPS5Ck!hP(o4ZEutvB*AVJ}fDoD>MWlG*%$b=p^*Hz5pZ7tx@Y6gKslmoRX+q9WJk)hVoLRfRajOpt-WA5VE!Pc|!2v+@bfMX;<|J2YE?3 z+egxnAah=-1;%#3;+crDPP4~W)|Wb1KNQ?viu08kpaqSAxeU}Uk$yf z9tB=_3&ZH)s=|C*Bm-mtY$FIy#(<8pWXK=^m~M$fa97WaK$dDHGIvG~=j2w*07F{! zD>I&vm{l$sEx>r_B?k2m3Q8BWD=axNvk%R4Zc9YREpO2UvZ-rq?^EHvHiZ?i)dT&;RDE8Hy`LjQie1sUzW$b*3sxOp4YcS%e zxB;;!p;a%Y|^isItWmyz!~OeZRYaqGNo#WgAKcev&HN|?wueo{bHA|<4Xny9ZN zq8!BSFGPxL+4(n{3TaX6sR!YmvhCo4cpOu_CwsK8d z>)?U46i4Um1CE{-qtLC?oOv__^^Sa|e+MU33(L`%&agivtjl9jF3~|N*IB2~+ZqmB zPO$V2Qw!3|+B!L%*yYIl%^nf)L`AL z_#1)(D{gc*CSBPg8Brl)qr^u&=N+uds_?q4#t6#WI;Qb)kUV2Lf~9TdeUsIXiA1JL z$niui0v;B~(ondyL5ebF+I&8E4O&S4{NM2oKM@?%xyrD3<}=wXXJ>~=(&|4F)5FN! z8n)eoo5D33CciR7MQ(u>;~b|u-;%QU{JZhb^MVXuVE&T;r8U!kdd;a%Fq^FQ9;R$) z==ZR#@0pS1uz-308`Z+VT;i*}YUa=FRUGCC5{{aa6;E)cWoOOD1MB5ljO+5vrphu> zpV5p&2{E9b@^guhD&aWF)>-D>2|4RF65egV&x-bn#}SnIv<2Tyo66K1jPm~iNQq2mhJ#50#W_b| z>T=HZt2$Ur(GZC)F_?2~-XNeGN2UME1Nh0$&;{^Usw%}5r&F$1dLU4p(R!X6Lp(#A zVVPjF&}Zn~;Cqr&>Vc$v$?6c?l@yxi!?1#o*x`46ETg< z8bbuQgOgJOL!pHWJnxUcN5U>9h<2D+J(k2o!vHr;Zeeaa8TRqlF&yD#hi57#grrja zH^FsM<60+Fe5sosLhY+ddx+PmVtq86*s8MWPRrce1B$lHqeL%lvd;@Z?;yS(!d|J- zDD1PGYdR-d6O3~!%*zdd;YkT!?TZ*-*OfrpJo~aWLqsNGMc+scM`c*RF)C(WlP0`Xb3?b~{RUX``J(Wx z)__vtZc*8uxp|<;c^Q^|QBtB!!!}V!m)bkKzRPC3-h{1Fl4jrw%9fw}UO`ztd;yFU zBdas3pijB6Rd;5r^*5V$?w8Ayxtsf2_t|(Xyl{>)RDx`_G2Ow$h}feb$PxW@%Ob0q zrO6^F!_&HMUZOs`&EUi|o-IduQI5}kF>9b#VoH}b+g!`lg~!69R8OHb(!^1!{<9=Z z5F=Pju3W&FZ@?y5O$@~b2~|G)bUImo^kK^j8O@I)oK^8e`Iw{KAa!|n3C3@WgK5v) zbsH`Y`H)NS;V&fPcFNjLDi>d>>x@ZCh>EMN-cJUJrtT~_l1O0J7CniH;Jf_k=|9Bz zNo_q4bgQV3>qP6kmBUd=^e-2FJu)$$i}ZU+QWK|N-zJHeTXRg`r=f{eZRjUSt4H|- z(h3M(25u;mbj!J>NNHWau?bB?oo~EqHAygi>36!0|CH(|BLM}B8t2}A#qf!f&k7fp zeh``U6+1~TY?@ax84R+d zBe}q^U%{)?toln_|EaKthTSirIf07CJR9rwTE%+KwUs|G_@+b!CEoS0g>P56!v?B< zpnz6isz<&%xTxXeK%5L zMR>lFl|a6@?Cz(Xp?pE!yyluwB=EtxS=36WhGzIH%y&FyaS!hs9+^&uN8F=UxSVXt zh7s1%GZ+yO+24UI- zC^r#i_f+Zp@ja%|D=pD=X(F&9FG1mCi?9k2k!L6C=+DP4R3q8#3q98A1X?yRAqAK* zjtbLK1#D^H4M$!P4cn6lvV6&jTw@30HQj*=qF#k^Z{#pf3mn*QW0K;70c8QX@Z)Y_J9m488|WL}UEeeSQksh=0lpLg`X50*RA--w6*eQ`bC~v}j5im`Bc2IF)`^PIHba-)3`)44D;+S!tN?%|(@kznaMd1<|z6AO~jrO71 zagBMOYG2pG*6Z#d^kdEBuunLot`=5W?%}2YNN>sZvJ1~gulL8A9*_4E><-OB>X#Gx zb{?_s!aCav*AySsAy?%PVKK2Li4&G3$2Oqgn*qn@(6Ex_t@kH|&D=4@uqt0M5TqFm zW(V=qlk=40)0*j|0vZzJ8@vqAI5bq~1F)y1UM}S2rcW6PRl^L*cRFzuq^9lM`oNi7 z#USmS6?&oMhGH`-rETo%0LCwXH(|-KO@fh9R$l3X3fs0GdE2|p2{qXT&jn`uy#T(XoGqc}_PsoK+dFoc2pGlrr>{I;$ zaKY``d^~ahx$K^sb>rJ1O*XsUHB)VA~a5H&5|m=-0d^+wsp+V8%_>7 z@xX+W@?f#JbY2g)Z3xDWmfKE%;pEEY`pdbfE?J_lly1I3(%sZk-(nLyCn|yeTx>m% zMx4m2qq09Az@-J6N_ub=6^!O!7%7t;%YM{%Xj;SONm>+S{iOC7Dn}3kosD<8`n#P_ zeW&wq5<9I(Y-SpV?h_O>5N?vnLXWvv9gaq)W-vH_^imhs*I=bpEQ2oQU53q#H-!>- zC~SgfePvr@`Gy4>snICHE6ES2M!!>&&`J{Xk zskM3)NSITY=hB1H@o4Bg`|%r+fJ9S;ea;-q7r-PZY3yTt#}32~x(*(ODBvd|C&RXY zJ(*!qH%I~iK}Th5t05U73rDYqrb22%NYm`%Dxu)hgQh*Irt#UbHbVNeiQ{yBQt2?e!RQojDKHlpw$J_BTPxmyJWaH#!uz?Pv$eHhdFV zH*In?C7|EWeyTE=5Sxij)5!Qw`66ylN=ed(`8h3F)X<3zfVq=KJ57A2)KwVVpqxCf zJT8%$Bh@v$a5c}CLeq}@qM)1rfy{vLhf3sMD@ok9k0K*bwv&;{$#JRFG^zis*&oks zn45YP)}9$~l{ImUo)Q*CzVu6&{$KN##ZjN5Ns6b}I)WoLq}pN)jXKu5l0~CBVeXI4 zSftvRV&@$4;PbPVZgwL4bk_~>T)9@x3pp1*@tjV&w_bmUqwKm;zfx+nuxwl6;1DX& zzf{-?_nTEVh+W+v!C6+q3<6Os5Eh)F5qqX=K5qTuih(6*K(;I-%Nx*BsrK_~` zC;svaIiQT}@9U9ST%xeO_^Yxb`PX#NR(>!;He#ul0qfsU#C!AD;#SMWFaOaXa1k(i zkv0kO=znvMzu29AdG^0CF8uYsf5WHItqG0mOaDNP54v09k;0d)A<0g#wYC0}uE$}p%sDIo literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/mec-ft-req-banner.png b/app/api/addons-api/mec-extra-content/mec-ft-req-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..36e1c1ca214de4f2ad6764e4bc8e506d2827c197 GIT binary patch literal 33002 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 literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/mec-gutenberg-single-builder.svg b/app/api/addons-api/mec-extra-content/mec-gutenberg-single-builder.svg new file mode 100755 index 0000000..ff996c6 --- /dev/null +++ b/app/api/addons-api/mec-extra-content/mec-gutenberg-single-builder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/mec-notif-banner-1.png b/app/api/addons-api/mec-extra-content/mec-notif-banner-1.png new file mode 100755 index 0000000000000000000000000000000000000000..3d8ac5ec43386031905a15eeae5dcd32c7102f82 GIT binary patch literal 27344 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 PNaAUzJXZdUvc~)$D;^w* literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/mec-notif-banner-11.png b/app/api/addons-api/mec-extra-content/mec-notif-banner-11.png new file mode 100755 index 0000000000000000000000000000000000000000..3d8ac5ec43386031905a15eeae5dcd32c7102f82 GIT binary patch literal 27344 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 PNaAUzJXZdUvc~)$D;^w* literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/photo_2022-01-10_16-33-18.jpg b/app/api/addons-api/mec-extra-content/photo_2022-01-10_16-33-18.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5fb9cc1a150a72a26af61b07cea1869ac3b9f2c9 GIT binary patch literal 20258 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 Jw{`6+``<*;Uj+aF literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/rsvp-events-addon-banner.png b/app/api/addons-api/mec-extra-content/rsvp-events-addon-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..9b4e7b25fa1b1181ed57f132ad8b190574103d23 GIT binary patch literal 17319 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

Sw`nTKg1}G8Vz# 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 Dm&tqI literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/seat-addon-icon.svg b/app/api/addons-api/mec-extra-content/seat-addon-icon.svg new file mode 100755 index 0000000..ac7066d --- /dev/null +++ b/app/api/addons-api/mec-extra-content/seat-addon-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/social-poster-addon.svg b/app/api/addons-api/mec-extra-content/social-poster-addon.svg new file mode 100755 index 0000000..b299eab --- /dev/null +++ b/app/api/addons-api/mec-extra-content/social-poster-addon.svg @@ -0,0 +1 @@ +19 \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/square-integration-addon.svg b/app/api/addons-api/mec-extra-content/square-integration-addon.svg new file mode 100755 index 0000000..b28ad90 --- /dev/null +++ b/app/api/addons-api/mec-extra-content/square-integration-addon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/style2.css b/app/api/addons-api/mec-extra-content/style2.css new file mode 100755 index 0000000..b8b99c3 --- /dev/null +++ b/app/api/addons-api/mec-extra-content/style2.css @@ -0,0 +1,138 @@ +#webnus-dashboard .mec-cmsg-2-notification-box-wrap,#webnus-dashboard .mec-cmsg-notification-box-wrap { + margin-top:30px !important; +} + +body[class^="page_MEC-settings"] .w-clearfix.w-box.mec-cmsg-notification-box-wrap { + margin-top: 0; +} +body[class*="page_MEC-settings"] .mec-custom-msg-notification-set-box.extra, body[class*="page_MEC-settings"] .mec-custom-msg-2-notification-set-box.extra{ + font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Oxygen,Roboto,sans-serif; + max-width:1018px; + border-radius: 11px; + overflow:hidden; + margin-right: auto; + margin-left: auto; + margin-top:25px; + margin-bottom:27px +} +.mec-addons-key-features ul { + margin: 5px 0 15px; +} +.mec-addons-key-features ul li { + margin-bottom: 1px; + font-size: 13px; + color: #717479; + padding-left: 18px; + position: relative; +} +.mec-addons-notification-box-content.mec-new-addons p{ + font-size:14px; +} +.mec-new-addons .mec-addons-notification-title { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; +} +.mec-addons-key-features ul li:before { + position: absolute; + left: -1px; + top: 6px; + color: #36da74; + background: none; + font-size: 13px; + font-weight: bold; + vertical-align: middle; + font-family: "simple-line-icons"; + border-radius: 50%; + padding: 0; + width: 13px; + height: 13px; + line-height: 13px; + z-index: 3; + background: rgba(64, 241, 147, 0.12); + content: "\e080"; +} + +.mec-addons-notification-box-content.mec-new-addons a { + background: #1fcae4; + color: #fff!important; + padding: 6px 20px; + margin-top: 3px; + margin-bottom: 12px; + display: inline-block; + border-radius: 60px; + text-transform: none; + font-size: 13px; + letter-spacing: .4px; + transition: all .1s ease; + font-weight: 600; + text-decoration: none; + box-shadow: 0 0 0 3px rgb(56 213 237 / 8%) !important; +} + +.mec-addons-notification-box-content.mec-new-addons a:hover { + background: #1fcae4; + box-shadow: 0 0 0 4px rgb(56 213 237 / 15%) !important; +} + +.mec-new-addons-wrap .mec-addons-notification-box-image { + width: 590px; + display: inline-block; + vertical-align: top; +} +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-image { + width: 450px; +} + +.mec-new-addons-wrap .mec-addons-notification-box-content { + width: calc(100% - 590px); + display: inline-block; + padding-left: 20px; +} + +.mec-new-addons-wrap .mec-addons-notification-box-image img { + max-width: 590px; +} +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-image img { + max-width: 450px; +} + +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content { + width: calc(100% - 470px); +} +.mec-new-addons-wrap .w-box-content code { + display: block; + margin-bottom: 6px; +} + +@media(max-width:480px) { + + .mec-new-addons-wrap .mec-addons-notification-box-content { + width: 100%; + padding: 0; + } + + .mec-addons-notification-box-content .w-box-content { + padding-top: 30px; + padding-bottom: 30px; + padding-left: 0; + } + + .mec-new-addons-wrap .mec-addons-notification-box-image { + width: 100% !important; + } + + body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content { + width: 100% !important; + padding: 0 !important; + } + + body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content .w-box-content { + padding: 0; + } + +} + +#webnus-dashboard .mec-new-addons-wrap { + margin-top: 30px !important; +} \ No newline at end of file diff --git a/app/api/addons-api/mec-extra-content/virtual-events-addon-banner.png b/app/api/addons-api/mec-extra-content/virtual-events-addon-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..612d7c61bb38b65dc63ec1e6d86971ea0c2dd4c7 GIT binary patch literal 26048 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 YPJ0Lihw=UAW)^_9`h9e{nlHq)$ literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-extra-content/waiting-list-addon-banner.png b/app/api/addons-api/mec-extra-content/waiting-list-addon-banner.png new file mode 100755 index 0000000000000000000000000000000000000000..50093aba1e1a437767bd018b3d02794e936f457b GIT binary patch literal 23655 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

', htmlentities(print_r($update, true)), '
'; + } else { + echo 'No updates found.'; + } + + $errors = $this->updateChecker->getLastRequestApiErrors(); + if ( !empty($errors) ) { + printf('

The update checker encountered %d API error%s.

', count($errors), (count($errors) > 1) ? 's' : ''); + + foreach (array_values($errors) as $num => $item) { + $wpError = $item['error']; + /** @var WP_Error $wpError */ + printf('

%d) %s

', $num + 1, esc_html($wpError->get_error_message())); + + echo '
'; + printf('
Error code:
%s
', esc_html($wpError->get_error_code())); + + if ( isset($item['url']) ) { + printf('
Requested URL:
%s
', esc_html($item['url'])); + } + + if ( isset($item['httpResponse']) ) { + if ( is_wp_error($item['httpResponse']) ) { + $httpError = $item['httpResponse']; + /** @var WP_Error $httpError */ + printf( + '
WordPress HTTP API error:
%s (%s)
', + esc_html($httpError->get_error_message()), + esc_html($httpError->get_error_code()) + ); + } else { + //Status code. + printf( + '
HTTP status:
%d %s
', + wp_remote_retrieve_response_code($item['httpResponse']), + wp_remote_retrieve_response_message($item['httpResponse']) + ); + + //Headers. + echo '
Response headers:
';
+							foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) {
+								printf("%s: %s\n", esc_html($name), esc_html($value));
+							}
+							echo '
'; + + //Body. + $body = wp_remote_retrieve_body($item['httpResponse']); + if ( $body === '' ) { + $body = '(Empty response.)'; + } else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) { + $length = strlen($body); + $body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT) + . sprintf("\n(Long string truncated. Total length: %d bytes.)", $length); + } + + printf('
Response body:
%s
', esc_html($body)); + } + } + echo '
'; + } + } + + exit; + } + + /** + * Check access permissions and enable error display (for debugging). + */ + protected function preAjaxRequest() { + if ( !$this->updateChecker->userCanInstallUpdates() ) { + die('Access denied'); + } + check_ajax_referer('puc-ajax'); + + error_reporting(E_ALL); + @ini_set('display_errors', 'On'); + } + + /** + * Remove hooks that were added by this extension. + */ + public function removeHooks() { + remove_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); + remove_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); + remove_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow')); + } + + /** + * @param string $filePath + * @return string + */ + private function getLibraryUrl($filePath) { + $absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/')); + + //Where is the library located inside the WordPress directory structure? + $absolutePath = Puc_v4p11_Factory::normalizePath($absolutePath); + + $pluginDir = Puc_v4p11_Factory::normalizePath(WP_PLUGIN_DIR); + $muPluginDir = Puc_v4p11_Factory::normalizePath(WPMU_PLUGIN_DIR); + $themeDir = Puc_v4p11_Factory::normalizePath(get_theme_root()); + + if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { + //It's part of a plugin. + return plugins_url(basename($absolutePath), $absolutePath); + } else if ( strpos($absolutePath, $themeDir) === 0 ) { + //It's part of a theme. + $relativePath = substr($absolutePath, strlen($themeDir) + 1); + $template = substr($relativePath, 0, strpos($relativePath, '/')); + $baseUrl = get_theme_root_uri($template); + + if ( !empty($baseUrl) && $relativePath ) { + return $baseUrl . '/' . $relativePath; + } + } + + return ''; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/DebugBar/Panel.php b/app/core/puc/Puc/v4p11/DebugBar/Panel.php new file mode 100755 index 0000000..4859d49 --- /dev/null +++ b/app/core/puc/Puc/v4p11/DebugBar/Panel.php @@ -0,0 +1,165 @@ +'; + + public function __construct($updateChecker) { + $this->updateChecker = $updateChecker; + $title = sprintf( + 'PUC (%s)', + esc_attr($this->updateChecker->getUniqueName('uid')), + $this->updateChecker->slug + ); + parent::__construct($title); + } + + public function render() { + printf( + '
', + esc_attr($this->updateChecker->getUniqueName('debug-bar-panel')), + esc_attr($this->updateChecker->slug), + esc_attr($this->updateChecker->getUniqueName('uid')), + esc_attr(wp_create_nonce('puc-ajax')) + ); + + $this->displayConfiguration(); + $this->displayStatus(); + $this->displayCurrentUpdate(); + + echo '
'; + } + + private function displayConfiguration() { + echo '

Configuration

'; + echo ''; + $this->displayConfigHeader(); + $this->row('Slug', htmlentities($this->updateChecker->slug)); + $this->row('DB option', htmlentities($this->updateChecker->optionName)); + + $requestInfoButton = $this->getMetadataButton(); + $this->row('Metadata URL', htmlentities($this->updateChecker->metadataUrl) . ' ' . $requestInfoButton . $this->responseBox); + + $scheduler = $this->updateChecker->scheduler; + if ( $scheduler->checkPeriod > 0 ) { + $this->row('Automatic checks', 'Every ' . $scheduler->checkPeriod . ' hours'); + } else { + $this->row('Automatic checks', 'Disabled'); + } + + if ( isset($scheduler->throttleRedundantChecks) ) { + if ( $scheduler->throttleRedundantChecks && ($scheduler->checkPeriod > 0) ) { + $this->row( + 'Throttling', + sprintf( + 'Enabled. If an update is already available, check for updates every %1$d hours instead of every %2$d hours.', + $scheduler->throttledCheckPeriod, + $scheduler->checkPeriod + ) + ); + } else { + $this->row('Throttling', 'Disabled'); + } + } + + $this->updateChecker->onDisplayConfiguration($this); + + echo '
'; + } + + protected function displayConfigHeader() { + //Do nothing. This should be implemented in subclasses. + } + + protected function getMetadataButton() { + return ''; + } + + private function displayStatus() { + echo '

Status

'; + echo ''; + $state = $this->updateChecker->getUpdateState(); + $checkNowButton = ''; + if ( function_exists('get_submit_button') ) { + $checkNowButton = get_submit_button( + 'Check Now', + 'secondary', + 'puc-check-now-button', + false, + array('id' => $this->updateChecker->getUniqueName('check-now-button')) + ); + } + + if ( $state->getLastCheck() > 0 ) { + $this->row('Last check', $this->formatTimeWithDelta($state->getLastCheck()) . ' ' . $checkNowButton . $this->responseBox); + } else { + $this->row('Last check', 'Never'); + } + + $nextCheck = wp_next_scheduled($this->updateChecker->scheduler->getCronHookName()); + $this->row('Next automatic check', $this->formatTimeWithDelta($nextCheck)); + + if ( $state->getCheckedVersion() !== '' ) { + $this->row('Checked version', htmlentities($state->getCheckedVersion())); + $this->row('Cached update', $state->getUpdate()); + } + $this->row('Update checker class', htmlentities(get_class($this->updateChecker))); + echo '
'; + } + + private function displayCurrentUpdate() { + $update = $this->updateChecker->getUpdate(); + if ( $update !== null ) { + echo '

An Update Is Available

'; + echo ''; + $fields = $this->getUpdateFields(); + foreach($fields as $field) { + if ( property_exists($update, $field) ) { + $this->row(ucwords(str_replace('_', ' ', $field)), htmlentities($update->$field)); + } + } + echo '
'; + } else { + echo '

No updates currently available

'; + } + } + + protected function getUpdateFields() { + return array('version', 'download_url', 'slug',); + } + + private function formatTimeWithDelta($unixTime) { + if ( empty($unixTime) ) { + return 'Never'; + } + + $delta = time() - $unixTime; + $result = human_time_diff(time(), $unixTime); + if ( $delta < 0 ) { + $result = 'after ' . $result; + } else { + $result = $result . ' ago'; + } + $result .= ' (' . $this->formatTimestamp($unixTime) . ')'; + return $result; + } + + private function formatTimestamp($unixTime) { + return gmdate('Y-m-d H:i:s', $unixTime + (get_option('gmt_offset') * 3600)); + } + + public function row($name, $value) { + if ( is_object($value) || is_array($value) ) { + $value = '
' . htmlentities(print_r($value, true)) . '
'; + } else if ($value === null) { + $value = 'null'; + } + printf('%1$s %2$s', $name, $value); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/DebugBar/PluginExtension.php b/app/core/puc/Puc/v4p11/DebugBar/PluginExtension.php new file mode 100755 index 0000000..5936108 --- /dev/null +++ b/app/core/puc/Puc/v4p11/DebugBar/PluginExtension.php @@ -0,0 +1,33 @@ +updateChecker->getUniqueName('uid') ) { + return; + } + $this->preAjaxRequest(); + $info = $this->updateChecker->requestInfo(); + if ( $info !== null ) { + echo 'Successfully retrieved plugin info from the metadata URL:'; + echo '
', htmlentities(print_r($info, true)), '
'; + } else { + echo 'Failed to retrieve plugin info from the metadata URL.'; + } + exit; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/DebugBar/PluginPanel.php b/app/core/puc/Puc/v4p11/DebugBar/PluginPanel.php new file mode 100755 index 0000000..06a5ad7 --- /dev/null +++ b/app/core/puc/Puc/v4p11/DebugBar/PluginPanel.php @@ -0,0 +1,38 @@ +row('Plugin file', htmlentities($this->updateChecker->pluginFile)); + parent::displayConfigHeader(); + } + + protected function getMetadataButton() { + $requestInfoButton = ''; + if ( function_exists('get_submit_button') ) { + $requestInfoButton = get_submit_button( + 'Request Info', + 'secondary', + 'puc-request-info-button', + false, + array('id' => $this->updateChecker->getUniqueName('request-info-button')) + ); + } + return $requestInfoButton; + } + + protected function getUpdateFields() { + return array_merge( + parent::getUpdateFields(), + array('homepage', 'upgrade_notice', 'tested',) + ); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/DebugBar/ThemePanel.php b/app/core/puc/Puc/v4p11/DebugBar/ThemePanel.php new file mode 100755 index 0000000..ade36b9 --- /dev/null +++ b/app/core/puc/Puc/v4p11/DebugBar/ThemePanel.php @@ -0,0 +1,21 @@ +row('Theme directory', htmlentities($this->updateChecker->directoryName)); + parent::displayConfigHeader(); + } + + protected function getUpdateFields() { + return array_merge(parent::getUpdateFields(), array('details_url')); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Factory.php b/app/core/puc/Puc/v4p11/Factory.php new file mode 100755 index 0000000..35eccc5 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Factory.php @@ -0,0 +1,365 @@ + '', + 'slug' => '', + 'checkPeriod' => 12, + 'optionName' => '', + 'muPluginFile' => '', + ); + $args = array_merge($defaults, array_intersect_key($args, $defaults)); + extract($args, EXTR_SKIP); + + //Check for the service URI + if ( empty($metadataUrl) ) { + $metadataUrl = self::getServiceURI($fullPath); + } + + /** @noinspection PhpUndefinedVariableInspection These variables are created by extract(), above. */ + return self::buildUpdateChecker($metadataUrl, $fullPath, $slug, $checkPeriod, $optionName, $muPluginFile); + } + + /** + * Create a new instance of the update checker. + * + * This method automatically detects if you're using it for a plugin or a theme and chooses + * the appropriate implementation for your update source (JSON file, GitHub, BitBucket, etc). + * + * @see Puc_v4p11_UpdateChecker::__construct + * + * @param string $metadataUrl The URL of the metadata file, a GitHub repository, or another supported update source. + * @param string $fullPath Full path to the main plugin file or to the theme directory. + * @param string $slug Custom slug. Defaults to the name of the main plugin file or the theme directory. + * @param int $checkPeriod How often to check for updates (in hours). + * @param string $optionName Where to store book-keeping info about update checks. + * @param string $muPluginFile The plugin filename relative to the mu-plugins directory. + * @return Puc_v4p11_Plugin_UpdateChecker|Puc_v4p11_Theme_UpdateChecker|Puc_v4p11_Vcs_BaseChecker + */ + public static function buildUpdateChecker($metadataUrl, $fullPath, $slug = '', $checkPeriod = 12, $optionName = '', $muPluginFile = '') { + $fullPath = self::normalizePath($fullPath); + $id = null; + + //Plugin or theme? + $themeDirectory = self::getThemeDirectoryName($fullPath); + if ( self::isPluginFile($fullPath) ) { + $type = 'Plugin'; + $id = $fullPath; + } else if ( $themeDirectory !== null ) { + $type = 'Theme'; + $id = $themeDirectory; + } else { + throw new RuntimeException(sprintf( + 'The update checker cannot determine if "%s" is a plugin or a theme. ' . + 'This is a bug. Please contact the PUC developer.', + htmlentities($fullPath) + )); + } + + //Which hosting service does the URL point to? + $service = self::getVcsService($metadataUrl); + + $apiClass = null; + if ( empty($service) ) { + //The default is to get update information from a remote JSON file. + $checkerClass = $type . '_UpdateChecker'; + } else { + //You can also use a VCS repository like GitHub. + $checkerClass = 'Vcs_' . $type . 'UpdateChecker'; + $apiClass = $service . 'Api'; + } + + $checkerClass = self::getCompatibleClassVersion($checkerClass); + if ( $checkerClass === null ) { + trigger_error( + sprintf( + 'PUC %s does not support updates for %ss %s', + htmlentities(self::$latestCompatibleVersion), + strtolower($type), + $service ? ('hosted on ' . htmlentities($service)) : 'using JSON metadata' + ), + E_USER_ERROR + ); + return null; + } + + //Add the current namespace to the class name(s). + if ( version_compare(PHP_VERSION, '5.3', '>=') ) { + $checkerClass = __NAMESPACE__ . '\\' . $checkerClass; + } + + if ( !isset($apiClass) ) { + //Plain old update checker. + return new $checkerClass($metadataUrl, $id, $slug, $checkPeriod, $optionName, $muPluginFile); + } else { + //VCS checker + an API client. + $apiClass = self::getCompatibleClassVersion($apiClass); + if ( $apiClass === null ) { + trigger_error(sprintf( + 'PUC %s does not support %s', + htmlentities(self::$latestCompatibleVersion), + htmlentities($service) + ), E_USER_ERROR); + return null; + } + + if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($apiClass, '\\') === false) ) { + $apiClass = __NAMESPACE__ . '\\' . $apiClass; + } + + return new $checkerClass( + new $apiClass($metadataUrl), + $id, + $slug, + $checkPeriod, + $optionName, + $muPluginFile + ); + } + } + + /** + * + * Normalize a filesystem path. Introduced in WP 3.9. + * Copying here allows use of the class on earlier versions. + * This version adapted from WP 4.8.2 (unchanged since 4.5.0) + * + * @param string $path Path to normalize. + * @return string Normalized path. + */ + public static function normalizePath($path) { + if ( function_exists('wp_normalize_path') ) { + return wp_normalize_path($path); + } + $path = str_replace('\\', '/', $path); + $path = preg_replace('|(?<=.)/+|', '/', $path); + if ( substr($path, 1, 1) === ':' ) { + $path = ucfirst($path); + } + return $path; + } + + /** + * Check if the path points to a plugin file. + * + * @param string $absolutePath Normalized path. + * @return bool + */ + protected static function isPluginFile($absolutePath) { + //Is the file inside the "plugins" or "mu-plugins" directory? + $pluginDir = self::normalizePath(WP_PLUGIN_DIR); + $muPluginDir = self::normalizePath(WPMU_PLUGIN_DIR); + if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { + return true; + } + + //Is it a file at all? Caution: is_file() can fail if the parent dir. doesn't have the +x permission set. + if ( !is_file($absolutePath) ) { + return false; + } + + //Does it have a valid plugin header? + //This is a last-ditch check for plugins symlinked from outside the WP root. + if ( function_exists('get_file_data') ) { + $headers = get_file_data($absolutePath, array('Name' => 'Plugin Name'), 'plugin'); + return !empty($headers['Name']); + } + + return false; + } + + /** + * Get the name of the theme's directory from a full path to a file inside that directory. + * E.g. "/abc/public_html/wp-content/themes/foo/whatever.php" => "foo". + * + * Note that subdirectories are currently not supported. For example, + * "/xyz/wp-content/themes/my-theme/includes/whatever.php" => NULL. + * + * @param string $absolutePath Normalized path. + * @return string|null Directory name, or NULL if the path doesn't point to a theme. + */ + protected static function getThemeDirectoryName($absolutePath) { + if ( is_file($absolutePath) ) { + $absolutePath = dirname($absolutePath); + } + + if ( file_exists($absolutePath . '/style.css') ) { + return basename($absolutePath); + } + return null; + } + + /** + * Get the service URI from the file header. + * + * @param string $fullPath + * @return string + */ + private static function getServiceURI($fullPath) { + //Look for the URI + if ( is_readable($fullPath) ) { + $seek = array( + 'github' => 'GitHub URI', + 'gitlab' => 'GitLab URI', + 'bucket' => 'BitBucket URI', + ); + $seek = apply_filters('puc_get_source_uri', $seek); + $data = get_file_data($fullPath, $seek); + foreach ($data as $key => $uri) { + if ( $uri ) { + return $uri; + } + } + } + + //URI was not found so throw an error. + throw new RuntimeException( + sprintf('Unable to locate URI in header of "%s"', htmlentities($fullPath)) + ); + } + + /** + * Get the name of the hosting service that the URL points to. + * + * @param string $metadataUrl + * @return string|null + */ + private static function getVcsService($metadataUrl) { + $service = null; + + //Which hosting service does the URL point to? + $host = parse_url($metadataUrl, PHP_URL_HOST); + $path = parse_url($metadataUrl, PHP_URL_PATH); + + //Check if the path looks like "/user-name/repository". + //For GitLab.com it can also be "/user/group1/group2/.../repository". + $repoRegex = '@^/?([^/]+?)/([^/#?&]+?)/?$@'; + if ( $host === 'gitlab.com' ) { + $repoRegex = '@^/?(?:[^/#?&]++/){1,20}(?:[^/#?&]++)/?$@'; + } + if ( preg_match($repoRegex, $path) ) { + $knownServices = array( + 'github.com' => 'GitHub', + 'bitbucket.org' => 'BitBucket', + 'gitlab.com' => 'GitLab', + ); + if ( isset($knownServices[$host]) ) { + $service = $knownServices[$host]; + } + } + + return apply_filters('puc_get_vcs_service', $service, $host, $path, $metadataUrl); + } + + /** + * Get the latest version of the specified class that has the same major version number + * as this factory class. + * + * @param string $class Partial class name. + * @return string|null Full class name. + */ + protected static function getCompatibleClassVersion($class) { + if ( isset(self::$classVersions[$class][self::$latestCompatibleVersion]) ) { + return self::$classVersions[$class][self::$latestCompatibleVersion]; + } + return null; + } + + /** + * Get the specific class name for the latest available version of a class. + * + * @param string $class + * @return null|string + */ + public static function getLatestClassVersion($class) { + if ( !self::$sorted ) { + self::sortVersions(); + } + + if ( isset(self::$classVersions[$class]) ) { + return reset(self::$classVersions[$class]); + } else { + return null; + } + } + + /** + * Sort available class versions in descending order (i.e. newest first). + */ + protected static function sortVersions() { + foreach ( self::$classVersions as $class => $versions ) { + uksort($versions, array(__CLASS__, 'compareVersions')); + self::$classVersions[$class] = $versions; + } + self::$sorted = true; + } + + protected static function compareVersions($a, $b) { + return -version_compare($a, $b); + } + + /** + * Register a version of a class. + * + * @access private This method is only for internal use by the library. + * + * @param string $generalClass Class name without version numbers, e.g. 'PluginUpdateChecker'. + * @param string $versionedClass Actual class name, e.g. 'PluginUpdateChecker_1_2'. + * @param string $version Version number, e.g. '1.2'. + */ + public static function addVersion($generalClass, $versionedClass, $version) { + if ( empty(self::$myMajorVersion) ) { + $nameParts = explode('_', __CLASS__, 3); + self::$myMajorVersion = substr(ltrim($nameParts[1], 'v'), 0, 1); + } + + //Store the greatest version number that matches our major version. + $components = explode('.', $version); + if ( $components[0] === self::$myMajorVersion ) { + + if ( + empty(self::$latestCompatibleVersion) + || version_compare($version, self::$latestCompatibleVersion, '>') + ) { + self::$latestCompatibleVersion = $version; + } + + } + + if ( !isset(self::$classVersions[$generalClass]) ) { + self::$classVersions[$generalClass] = []; + } + self::$classVersions[$generalClass][$version] = $versionedClass; + self::$sorted = false; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/InstalledPackage.php b/app/core/puc/Puc/v4p11/InstalledPackage.php new file mode 100755 index 0000000..05dba7e --- /dev/null +++ b/app/core/puc/Puc/v4p11/InstalledPackage.php @@ -0,0 +1,103 @@ +updateChecker = $updateChecker; + } + + /** + * Get the currently installed version of the plugin or theme. + * + * @return string|null Version number. + */ + abstract public function getInstalledVersion(); + + /** + * Get the full path of the plugin or theme directory (without a trailing slash). + * + * @return string + */ + abstract public function getAbsoluteDirectoryPath(); + + /** + * Check whether a regular file exists in the package's directory. + * + * @param string $relativeFileName File name relative to the package directory. + * @return bool + */ + public function fileExists($relativeFileName) { + return is_file( + $this->getAbsoluteDirectoryPath() + . DIRECTORY_SEPARATOR + . ltrim($relativeFileName, '/\\') + ); + } + + /* ------------------------------------------------------------------- + * File header parsing + * ------------------------------------------------------------------- + */ + + /** + * Parse plugin or theme metadata from the header comment. + * + * This is basically a simplified version of the get_file_data() function from /wp-includes/functions.php. + * It's intended as a utility for subclasses that detect updates by parsing files in a VCS. + * + * @param string|null $content File contents. + * @return string[] + */ + public function getFileHeader($content) { + $content = (string)$content; + + //WordPress only looks at the first 8 KiB of the file, so we do the same. + $content = substr($content, 0, 8192); + //Normalize line endings. + $content = str_replace("\r", "\n", $content); + + $headers = $this->getHeaderNames(); + $results = []; + foreach ($headers as $field => $name) { + $success = preg_match('/^[ \t\/*#@]*' . preg_quote($name, '/') . ':(.*)$/mi', $content, $matches); + + if ( ($success === 1) && $matches[1] ) { + $value = $matches[1]; + if ( function_exists('_cleanup_header_comment') ) { + $value = _cleanup_header_comment($value); + } + $results[$field] = $value; + } else { + $results[$field] = ''; + } + } + + return $results; + } + + /** + * @return array Format: ['HeaderKey' => 'Header Name'] + */ + abstract protected function getHeaderNames(); + + /** + * Get the value of a specific plugin or theme header. + * + * @param string $headerName + * @return string Either the value of the header, or an empty string if the header doesn't exist. + */ + abstract public function getHeaderValue($headerName); + + } +endif; diff --git a/app/core/puc/Puc/v4p11/Metadata.php b/app/core/puc/Puc/v4p11/Metadata.php new file mode 100755 index 0000000..3241256 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Metadata.php @@ -0,0 +1,132 @@ +validateMetadata($apiResponse); + if ( is_wp_error($valid) ){ + do_action('puc_api_error', $valid); + trigger_error($valid->get_error_message(), E_USER_NOTICE); + return false; + } + + foreach(get_object_vars($apiResponse) as $key => $value){ + $target->$key = $value; + } + + return true; + } + + /** + * No validation by default! Subclasses should check that the required fields are present. + * + * @param StdClass $apiResponse + * @return bool|WP_Error + */ + protected function validateMetadata(/** @noinspection PhpUnusedParameterInspection */ $apiResponse) { + return true; + } + + /** + * Create a new instance by copying the necessary fields from another object. + * + * @abstract + * @param StdClass|self $object The source object. + * @return self The new copy. + */ + public static function fromObject(/** @noinspection PhpUnusedParameterInspection */ $object) { + throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses'); + } + + /** + * Create an instance of StdClass that can later be converted back to an + * update or info container. Useful for serialization and caching, as it + * avoids the "incomplete object" problem if the cached value is loaded + * before this class. + * + * @return StdClass + */ + public function toStdClass() { + $object = new stdClass(); + $this->copyFields($this, $object); + return $object; + } + + /** + * Transform the metadata into the format used by WordPress core. + * + * @return object + */ + abstract public function toWpFormat(); + + /** + * Copy known fields from one object to another. + * + * @param StdClass|self $from + * @param StdClass|self $to + */ + protected function copyFields($from, $to) { + $fields = $this->getFieldNames(); + + if ( property_exists($from, 'slug') && !empty($from->slug) ) { + //Let plugins add extra fields without having to create subclasses. + $fields = apply_filters($this->getPrefixedFilter('retain_fields') . '-' . $from->slug, $fields); + } + + foreach ($fields as $field) { + if ( property_exists($from, $field) ) { + $to->$field = $from->$field; + } + } + } + + /** + * @return string[] + */ + protected function getFieldNames() { + return []; + } + + /** + * @param string $tag + * @return string + */ + protected function getPrefixedFilter($tag) { + return 'puc_' . $tag; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/OAuthSignature.php b/app/core/puc/Puc/v4p11/OAuthSignature.php new file mode 100755 index 0000000..c870d33 --- /dev/null +++ b/app/core/puc/Puc/v4p11/OAuthSignature.php @@ -0,0 +1,100 @@ +consumerKey = $consumerKey; + $this->consumerSecret = $consumerSecret; + } + + /** + * Sign a URL using OAuth 1.0. + * + * @param string $url The URL to be signed. It may contain query parameters. + * @param string $method HTTP method such as "GET", "POST" and so on. + * @return string The signed URL. + */ + public function sign($url, $method = 'GET') { + $parameters = []; + + //Parse query parameters. + $query = parse_url($url, PHP_URL_QUERY); + if ( !empty($query) ) { + parse_str($query, $parsedParams); + if ( is_array($parameters) ) { + $parameters = $parsedParams; + } + //Remove the query string from the URL. We'll replace it later. + $url = substr($url, 0, strpos($url, '?')); + } + + $parameters = array_merge( + $parameters, + array( + 'oauth_consumer_key' => $this->consumerKey, + 'oauth_nonce' => $this->nonce(), + 'oauth_signature_method' => 'HMAC-SHA1', + 'oauth_timestamp' => time(), + 'oauth_version' => '1.0', + ) + ); + unset($parameters['oauth_signature']); + + //Parameters must be sorted alphabetically before signing. + ksort($parameters); + + //The most complicated part of the request - generating the signature. + //The string to sign contains the HTTP method, the URL path, and all of + //our query parameters. Everything is URL encoded. Then we concatenate + //them with ampersands into a single string to hash. + $encodedVerb = urlencode($method); + $encodedUrl = urlencode($url); + $encodedParams = urlencode(http_build_query($parameters, '', '&')); + + $stringToSign = $encodedVerb . '&' . $encodedUrl . '&' . $encodedParams; + + //Since we only have one OAuth token (the consumer secret) we only have + //to use it as our HMAC key. However, we still have to append an & to it + //as if we were using it with additional tokens. + $secret = urlencode($this->consumerSecret) . '&'; + + //The signature is a hash of the consumer key and the base string. Note + //that we have to get the raw output from hash_hmac and base64 encode + //the binary data result. + $parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $stringToSign, $secret, true)); + + return ($url . '?' . http_build_query($parameters)); + } + + /** + * Generate a random nonce. + * + * @return string + */ + private function nonce() { + $mt = microtime(); + + $rand = null; + if ( is_callable('random_bytes') ) { + try { + $rand = random_bytes(16); + } catch (Exception $ex) { + //Fall back to mt_rand (below). + } + } + if ( $rand === null ) { + $rand = mt_rand(); + } + + return md5($mt . '_' . $rand); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Plugin/Info.php b/app/core/puc/Puc/v4p11/Plugin/Info.php new file mode 100755 index 0000000..fc4eb1e --- /dev/null +++ b/app/core/puc/Puc/v4p11/Plugin/Info.php @@ -0,0 +1,132 @@ +sections = (array)$instance->sections; + $instance->icons = (array)$instance->icons; + + return $instance; + } + + /** + * Very, very basic validation. + * + * @param StdClass $apiResponse + * @return bool|WP_Error + */ + protected function validateMetadata($apiResponse) { + if ( + !isset($apiResponse->name, $apiResponse->version) + || empty($apiResponse->name) + || empty($apiResponse->version) + ) { + return new WP_Error( + 'puc-invalid-metadata', + "The plugin metadata file does not contain the required 'name' and/or 'version' keys." + ); + } + return true; + } + + + /** + * Transform plugin info into the format used by the native WordPress.org API + * + * @return object + */ + public function toWpFormat(){ + $info = new stdClass; + + //The custom update API is built so that many fields have the same name and format + //as those returned by the native WordPress.org API. These can be assigned directly. + $sameFormat = array( + 'name', 'slug', 'version', 'requires', 'tested', 'rating', 'upgrade_notice', + 'num_ratings', 'downloaded', 'active_installs', 'homepage', 'last_updated', + 'requires_php', + ); + foreach($sameFormat as $field){ + if ( isset($this->$field) ) { + $info->$field = $this->$field; + } else { + $info->$field = null; + } + } + + //Other fields need to be renamed and/or transformed. + $info->download_link = $this->download_url; + $info->author = $this->getFormattedAuthor(); + $info->sections = array_merge(array('description' => ''), $this->sections); + + if ( !empty($this->banners) ) { + //WP expects an array with two keys: "high" and "low". Both are optional. + //Docs: https://wordpress.org/plugins/about/faq/#banners + $info->banners = is_object($this->banners) ? get_object_vars($this->banners) : $this->banners; + $info->banners = array_intersect_key($info->banners, array('high' => true, 'low' => true)); + } + + return $info; + } + + protected function getFormattedAuthor() { + if ( !empty($this->author_homepage) ){ + /** @noinspection HtmlUnknownTarget */ + return sprintf('
%s', $this->author_homepage, $this->author); + } + return $this->author; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Plugin/Package.php b/app/core/puc/Puc/v4p11/Plugin/Package.php new file mode 100755 index 0000000..f4c6813 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Plugin/Package.php @@ -0,0 +1,184 @@ +pluginAbsolutePath = $pluginAbsolutePath; + $this->pluginFile = plugin_basename($this->pluginAbsolutePath); + + parent::__construct($updateChecker); + + //Clear the version number cache when something - anything - is upgraded or WP clears the update cache. + add_filter('upgrader_post_install', array($this, 'clearCachedVersion')); + add_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); + } + + public function getInstalledVersion() { + if ( isset($this->cachedInstalledVersion) ) { + return $this->cachedInstalledVersion; + } + + $pluginHeader = $this->getPluginHeader(); + if ( isset($pluginHeader['Version']) ) { + $this->cachedInstalledVersion = $pluginHeader['Version']; + return $pluginHeader['Version']; + } else { + //This can happen if the filename points to something that is not a plugin. + $this->updateChecker->triggerError( + sprintf( + "Can't to read the Version header for '%s'. The filename is incorrect or is not a plugin.", + $this->updateChecker->pluginFile + ), + E_USER_WARNING + ); + return null; + } + } + + /** + * Clear the cached plugin version. This method can be set up as a filter (hook) and will + * return the filter argument unmodified. + * + * @param mixed $filterArgument + * @return mixed + */ + public function clearCachedVersion($filterArgument = null) { + $this->cachedInstalledVersion = null; + return $filterArgument; + } + + public function getAbsoluteDirectoryPath() { + return dirname($this->pluginAbsolutePath); + } + + /** + * Get the value of a specific plugin or theme header. + * + * @param string $headerName + * @param string $defaultValue + * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. + */ + public function getHeaderValue($headerName, $defaultValue = '') { + $headers = $this->getPluginHeader(); + if ( isset($headers[$headerName]) && ($headers[$headerName] !== '') ) { + return $headers[$headerName]; + } + return $defaultValue; + } + + protected function getHeaderNames() { + return array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + + //The newest WordPress version that this plugin requires or has been tested with. + //We support several different formats for compatibility with other libraries. + 'Tested WP' => 'Tested WP', + 'Requires WP' => 'Requires WP', + 'Tested up to' => 'Tested up to', + 'Requires at least' => 'Requires at least', + ); + } + + /** + * Get the translated plugin title. + * + * @return string + */ + public function getPluginTitle() { + $title = ''; + $header = $this->getPluginHeader(); + if ( $header && !empty($header['Name']) && isset($header['TextDomain']) ) { + $title = translate($header['Name'], $header['TextDomain']); + } + return $title; + } + + /** + * Get plugin's metadata from its file header. + * + * @return array + */ + public function getPluginHeader() { + if ( !is_file($this->pluginAbsolutePath) ) { + //This can happen if the plugin filename is wrong. + $this->updateChecker->triggerError( + sprintf( + "Can't to read the plugin header for '%s'. The file does not exist.", + $this->updateChecker->pluginFile + ), + E_USER_WARNING + ); + return []; + } + + if ( !function_exists('get_plugin_data') ) { + /** @noinspection PhpIncludeInspection */ + require_once(ABSPATH . '/wp-admin/includes/plugin.php'); + } + return get_plugin_data($this->pluginAbsolutePath, false, false); + } + + public function removeHooks() { + remove_filter('upgrader_post_install', array($this, 'clearCachedVersion')); + remove_action('delete_site_transient_update_plugins', array($this, 'clearCachedVersion')); + } + + /** + * Check if the plugin file is inside the mu-plugins directory. + * + * @return bool + */ + public function isMuPlugin() { + static $cachedResult = null; + + if ( $cachedResult === null ) { + if ( !defined('WPMU_PLUGIN_DIR') || !is_string(WPMU_PLUGIN_DIR) ) { + $cachedResult = false; + return $cachedResult; + } + + //Convert both paths to the canonical form before comparison. + $muPluginDir = realpath(WPMU_PLUGIN_DIR); + $pluginPath = realpath($this->pluginAbsolutePath); + //If realpath() fails, just normalize the syntax instead. + if (($muPluginDir === false) || ($pluginPath === false)) { + $muPluginDir = Puc_v4p11_Factory::normalizePath(WPMU_PLUGIN_DIR); + $pluginPath = Puc_v4p11_Factory::normalizePath($this->pluginAbsolutePath); + } + + $cachedResult = (strpos($pluginPath, $muPluginDir) === 0); + } + + return $cachedResult; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Plugin/Ui.php b/app/core/puc/Puc/v4p11/Plugin/Ui.php new file mode 100755 index 0000000..7b9ee46 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Plugin/Ui.php @@ -0,0 +1,278 @@ +updateChecker = $updateChecker; + $this->manualCheckErrorTransient = $this->updateChecker->getUniqueName('manual_check_errors'); + + add_action('admin_init', array($this, 'onAdminInit')); + } + + public function onAdminInit() { + if ( $this->updateChecker->userCanInstallUpdates() ) { + $this->handleManualCheck(); + + add_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10, 3); + add_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10, 2); + add_action('all_admin_notices', array($this, 'displayManualCheckResult')); + } + } + + /** + * Add a "View Details" link to the plugin row in the "Plugins" page. By default, + * the new link will appear before the "Visit plugin site" link (if present). + * + * You can change the link text by using the "puc_view_details_link-$slug" filter. + * Returning an empty string from the filter will disable the link. + * + * You can change the position of the link using the + * "puc_view_details_link_position-$slug" filter. + * Returning 'before' or 'after' will place the link immediately before/after + * the "Visit plugin site" link. + * Returning 'append' places the link after any existing links at the time of the hook. + * Returning 'replace' replaces the "Visit plugin site" link. + * Returning anything else disables the link when there is a "Visit plugin site" link. + * + * If there is no "Visit plugin site" link 'append' is always used! + * + * @param array $pluginMeta Array of meta links. + * @param string $pluginFile + * @param array $pluginData Array of plugin header data. + * @return array + */ + public function addViewDetailsLink($pluginMeta, $pluginFile, $pluginData = array()) { + if ( $this->isMyPluginFile($pluginFile) && !isset($pluginData['slug']) ) { + $linkText = apply_filters($this->updateChecker->getUniqueName('view_details_link'), esc_html__('View details')); + if ( !empty($linkText) ) { + $viewDetailsLinkPosition = 'append'; + + //Find the "Visit plugin site" link (if present). + $visitPluginSiteLinkIndex = count($pluginMeta) - 1; + if ( $pluginData['PluginURI'] ) { + $escapedPluginUri = esc_url($pluginData['PluginURI']); + foreach ($pluginMeta as $linkIndex => $existingLink) { + if ( strpos($existingLink, $escapedPluginUri) !== false ) { + $visitPluginSiteLinkIndex = $linkIndex; + $viewDetailsLinkPosition = apply_filters( + $this->updateChecker->getUniqueName('view_details_link_position'), + 'before' + ); + break; + } + } + } + + $viewDetailsLink = sprintf('%s', + esc_url(network_admin_url('plugin-install.php?tab=plugin-information&plugin=' . urlencode($this->updateChecker->slug) . + '&TB_iframe=true&width=600&height=550')), + esc_attr(sprintf(esc_html__('More information about %s'), $pluginData['Name'])), + esc_attr($pluginData['Name']), + $linkText + ); + switch ($viewDetailsLinkPosition) { + case 'before': + array_splice($pluginMeta, $visitPluginSiteLinkIndex, 0, $viewDetailsLink); + break; + case 'after': + array_splice($pluginMeta, $visitPluginSiteLinkIndex + 1, 0, $viewDetailsLink); + break; + case 'replace': + $pluginMeta[$visitPluginSiteLinkIndex] = $viewDetailsLink; + break; + case 'append': + default: + $pluginMeta[] = $viewDetailsLink; + break; + } + } + } + return $pluginMeta; + } + + /** + * Add a "Check for updates" link to the plugin row in the "Plugins" page. By default, + * the new link will appear after the "Visit plugin site" link if present, otherwise + * after the "View plugin details" link. + * + * You can change the link text by using the "puc_manual_check_link-$slug" filter. + * Returning an empty string from the filter will disable the link. + * + * @param array $pluginMeta Array of meta links. + * @param string $pluginFile + * @return array + */ + public function addCheckForUpdatesLink($pluginMeta, $pluginFile) { + if ( $this->isMyPluginFile($pluginFile) ) { + $linkUrl = wp_nonce_url( + add_query_arg( + array( + 'puc_check_for_updates' => 1, + 'puc_slug' => $this->updateChecker->slug, + ), + self_admin_url('plugins.php') + ), + 'puc_check_for_updates' + ); + + $linkText = apply_filters( + $this->updateChecker->getUniqueName('manual_check_link'), + __('Check for updates', 'plugin-update-checker') + ); + if ( !empty($linkText) ) { + /** @noinspection HtmlUnknownTarget */ + $pluginMeta[] = sprintf('%s', esc_attr($linkUrl), $linkText); + } + } + return $pluginMeta; + } + + protected function isMyPluginFile($pluginFile) { + return ($pluginFile == $this->updateChecker->pluginFile) + || (!empty($this->updateChecker->muPluginFile) && ($pluginFile == $this->updateChecker->muPluginFile)); + } + + /** + * Check for updates when the user clicks the "Check for updates" link. + * + * @see self::addCheckForUpdatesLink() + * + * @return void + */ + public function handleManualCheck() { + $shouldCheck = + isset($_GET['puc_check_for_updates'], $_GET['puc_slug']) + && $_GET['puc_slug'] == $this->updateChecker->slug + && check_admin_referer('puc_check_for_updates'); + + if ( $shouldCheck ) { + $update = $this->updateChecker->checkForUpdates(); + $status = ($update === null) ? 'no_update' : 'update_available'; + $lastRequestApiErrors = $this->updateChecker->getLastRequestApiErrors(); + + if ( ($update === null) && !empty($lastRequestApiErrors) ) { + //Some errors are not critical. For example, if PUC tries to retrieve the readme.txt + //file from GitHub and gets a 404, that's an API error, but it doesn't prevent updates + //from working. Maybe the plugin simply doesn't have a readme. + //Let's only show important errors. + $foundCriticalErrors = false; + $questionableErrorCodes = array( + 'puc-github-http-error', + 'puc-gitlab-http-error', + 'puc-bitbucket-http-error', + ); + + foreach ($lastRequestApiErrors as $item) { + $wpError = $item['error']; + /** @var WP_Error $wpError */ + if ( !in_array($wpError->get_error_code(), $questionableErrorCodes) ) { + $foundCriticalErrors = true; + break; + } + } + + if ( $foundCriticalErrors ) { + $status = 'error'; + set_site_transient($this->manualCheckErrorTransient, $lastRequestApiErrors, 60); + } + } + + wp_redirect(add_query_arg( + array( + 'puc_update_check_result' => $status, + 'puc_slug' => $this->updateChecker->slug, + ), + self_admin_url('plugins.php') + )); + exit; + } + } + + /** + * Display the results of a manual update check. + * + * @see self::handleManualCheck() + * + * You can change the result message by using the "puc_manual_check_message-$slug" filter. + */ + public function displayManualCheckResult() { + if ( isset($_GET['puc_update_check_result'], $_GET['puc_slug']) && ($_GET['puc_slug'] == $this->updateChecker->slug) ) { + $status = strval($_GET['puc_update_check_result']); + $title = $this->updateChecker->getInstalledPackage()->getPluginTitle(); + $noticeClass = 'updated notice-success'; + $details = ''; + + if ( $status == 'no_update' ) { + $message = sprintf(_x('The %s plugin is up to date.', 'the plugin title', 'plugin-update-checker'), $title); + } else if ( $status == 'update_available' ) { + $message = sprintf(_x('A new version of the %s plugin is available.', 'the plugin title', 'plugin-update-checker'), $title); + } else if ( $status === 'error' ) { + $message = sprintf(_x('Could not determine if updates are available for %s.', 'the plugin title', 'plugin-update-checker'), $title); + $noticeClass = 'error notice-error'; + + $details = $this->formatManualCheckErrors(get_site_transient($this->manualCheckErrorTransient)); + delete_site_transient($this->manualCheckErrorTransient); + } else { + $message = sprintf(esc_html__('Unknown update checker status "%s"', 'plugin-update-checker'), htmlentities($status)); + $noticeClass = 'error notice-error'; + } + printf( + '

%s

%s
', + $noticeClass, + apply_filters($this->updateChecker->getUniqueName('manual_check_message'), $message, $status), + $details + ); + } + } + + /** + * Format the list of errors that were thrown during an update check. + * + * @param array $errors + * @return string + */ + protected function formatManualCheckErrors($errors) { + if ( empty($errors) ) { + return ''; + } + $output = ''; + + $showAsList = count($errors) > 1; + if ( $showAsList ) { + $output .= '
    '; + $formatString = '
  1. %1$s %2$s
  2. '; + } else { + $formatString = '

    %1$s %2$s

    '; + } + foreach ($errors as $item) { + $wpError = $item['error']; + /** @var WP_Error $wpError */ + $output .= sprintf( + $formatString, + $wpError->get_error_message(), + $wpError->get_error_code() + ); + } + if ( $showAsList ) { + $output .= '
'; + } + + return $output; + } + + public function removeHooks() { + remove_action('admin_init', array($this, 'onAdminInit')); + remove_filter('plugin_row_meta', array($this, 'addViewDetailsLink'), 10); + remove_filter('plugin_row_meta', array($this, 'addCheckForUpdatesLink'), 10); + remove_action('all_admin_notices', array($this, 'displayManualCheckResult')); + } + } +endif; diff --git a/app/core/puc/Puc/v4p11/Plugin/Update.php b/app/core/puc/Puc/v4p11/Plugin/Update.php new file mode 100755 index 0000000..e805f37 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Plugin/Update.php @@ -0,0 +1,112 @@ +copyFields($object, $update); + return $update; + } + + /** + * @return string[] + */ + protected function getFieldNames() { + return array_merge(parent::getFieldNames(), self::$extraFields); + } + + /** + * Transform the update into the format used by WordPress native plugin API. + * + * @return object + */ + public function toWpFormat() { + $update = parent::toWpFormat(); + + $update->id = $this->id; + $update->url = $this->homepage; + $update->tested = $this->tested; + $update->requires_php = $this->requires_php; + $update->plugin = $this->filename; + + if ( !empty($this->upgrade_notice) ) { + $update->upgrade_notice = $this->upgrade_notice; + } + + if ( !empty($this->icons) && is_array($this->icons) ) { + //This should be an array with up to 4 keys: 'svg', '1x', '2x' and 'default'. + //Docs: https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-icons + $icons = array_intersect_key( + $this->icons, + array('svg' => true, '1x' => true, '2x' => true, 'default' => true) + ); + if ( !empty($icons) ) { + $update->icons = $icons; + + //It appears that the 'default' icon isn't used anywhere in WordPress 4.9, + //but lets set it just in case a future release needs it. + if ( !isset($update->icons['default']) ) { + $update->icons['default'] = current($update->icons); + } + } + } + + return $update; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Plugin/UpdateChecker.php b/app/core/puc/Puc/v4p11/Plugin/UpdateChecker.php new file mode 100755 index 0000000..12f0d0d --- /dev/null +++ b/app/core/puc/Puc/v4p11/Plugin/UpdateChecker.php @@ -0,0 +1,414 @@ +pluginAbsolutePath = $pluginFile; + $this->pluginFile = plugin_basename($this->pluginAbsolutePath); + $this->muPluginFile = $muPluginFile; + + //If no slug is specified, use the name of the main plugin file as the slug. + //For example, 'my-cool-plugin/cool-plugin.php' becomes 'cool-plugin'. + if ( empty($slug) ){ + $slug = basename($this->pluginFile, '.php'); + } + + //Plugin slugs must be unique. + $slugCheckFilter = 'puc_is_slug_in_use-' . $slug; + $slugUsedBy = apply_filters($slugCheckFilter, false); + if ( $slugUsedBy ) { + $this->triggerError(sprintf( + 'Plugin slug "%s" is already in use by %s. Slugs must be unique.', + htmlentities($slug), + htmlentities($slugUsedBy) + ), E_USER_ERROR); + } + add_filter($slugCheckFilter, array($this, 'getAbsolutePath')); + + parent::__construct($metadataUrl, dirname($this->pluginFile), $slug, $checkPeriod, $optionName); + + //Backwards compatibility: If the plugin is a mu-plugin but no $muPluginFile is specified, assume + //it's the same as $pluginFile given that it's not in a subdirectory (WP only looks in the base dir). + if ( (strpbrk($this->pluginFile, '/\\') === false) && $this->isUnknownMuPlugin() ) { + $this->muPluginFile = $this->pluginFile; + } + + //To prevent a crash during plugin uninstallation, remove updater hooks when the user removes the plugin. + //Details: https://github.com/YahnisElsts/plugin-update-checker/issues/138#issuecomment-335590964 + add_action('uninstall_' . $this->pluginFile, array($this, 'removeHooks')); + + $this->extraUi = new Puc_v4p11_Plugin_Ui($this); + } + + /** + * Create an instance of the scheduler. + * + * @param int $checkPeriod + * @return Puc_v4p11_Scheduler + */ + protected function createScheduler($checkPeriod) { + $scheduler = new Puc_v4p11_Scheduler($this, $checkPeriod, array('load-plugins.php')); + register_deactivation_hook($this->pluginFile, array($scheduler, 'removeUpdaterCron')); + return $scheduler; + } + + /** + * Install the hooks required to run periodic update checks and inject update info + * into WP data structures. + * + * @return void + */ + protected function installHooks(){ + //Override requests for plugin information + add_filter('plugins_api', array($this, 'injectInfo'), 20, 3); + + parent::installHooks(); + } + + /** + * Remove update checker hooks. + * + * The intent is to prevent a fatal error that can happen if the plugin has an uninstall + * hook. During uninstallation, WP includes the main plugin file (which creates a PUC instance), + * the uninstall hook runs, WP deletes the plugin files and then updates some transients. + * If PUC hooks are still around at this time, they could throw an error while trying to + * autoload classes from files that no longer exist. + * + * The "site_transient_{$transient}" filter is the main problem here, but let's also remove + * most other PUC hooks to be safe. + * + * @internal + */ + public function removeHooks() { + parent::removeHooks(); + $this->extraUi->removeHooks(); + $this->package->removeHooks(); + + remove_filter('plugins_api', array($this, 'injectInfo'), 20); + } + + /** + * Retrieve plugin info from the configured API endpoint. + * + * @uses wp_remote_get() + * + * @param array $queryArgs Additional query arguments to append to the request. Optional. + * @return Puc_v4p11_Plugin_Info + */ + public function requestInfo($queryArgs = array()) { + list($pluginInfo, $result) = $this->requestMetadata('Puc_v4p11_Plugin_Info', 'request_info', $queryArgs); + + if ( $pluginInfo !== null ) { + /** @var Puc_v4p11_Plugin_Info $pluginInfo */ + $pluginInfo->filename = $this->pluginFile; + $pluginInfo->slug = $this->slug; + } + + $pluginInfo = apply_filters($this->getUniqueName('request_info_result'), $pluginInfo, $result); + return $pluginInfo; + } + + /** + * Retrieve the latest update (if any) from the configured API endpoint. + * + * @uses PluginUpdateChecker::requestInfo() + * + * @return Puc_v4p11_Update|null An instance of Plugin_Update, or NULL when no updates are available. + */ + public function requestUpdate() { + //For the sake of simplicity, this function just calls requestInfo() + //and transforms the result accordingly. + $pluginInfo = $this->requestInfo(array('checking_for_updates' => '1')); + if ( $pluginInfo === null ){ + return null; + } + $update = Puc_v4p11_Plugin_Update::fromPluginInfo($pluginInfo); + + $update = $this->filterUpdateResult($update); + + return $update; + } + + /** + * Intercept plugins_api() calls that request information about our plugin and + * use the configured API endpoint to satisfy them. + * + * @see plugins_api() + * + * @param mixed $result + * @param string $action + * @param array|object $args + * @return mixed + */ + public function injectInfo($result, $action = null, $args = null){ + $relevant = ($action == 'plugin_information') && isset($args->slug) && ( + ($args->slug == $this->slug) || ($args->slug == dirname($this->pluginFile)) + ); + if ( !$relevant ) { + return $result; + } + + $pluginInfo = $this->requestInfo(); + $this->fixSupportedWordpressVersion($pluginInfo); + + $pluginInfo = apply_filters($this->getUniqueName('pre_inject_info'), $pluginInfo); + if ( $pluginInfo ) { + return $pluginInfo->toWpFormat(); + } + + return $result; + } + + protected function shouldShowUpdates() { + //No update notifications for mu-plugins unless explicitly enabled. The MU plugin file + //is usually different from the main plugin file so the update wouldn't show up properly anyway. + return !$this->isUnknownMuPlugin(); + } + + /** + * @param stdClass|null $updates + * @param stdClass $updateToAdd + * @return stdClass + */ + protected function addUpdateToList($updates, $updateToAdd) { + if ( $this->package->isMuPlugin() ) { + //WP does not support automatic update installation for mu-plugins, but we can + //still display a notice. + $updateToAdd->package = null; + } + return parent::addUpdateToList($updates, $updateToAdd); + } + + /** + * @param stdClass|null $updates + * @return stdClass|null + */ + protected function removeUpdateFromList($updates) { + $updates = parent::removeUpdateFromList($updates); + if ( !empty($this->muPluginFile) && isset($updates, $updates->response) ) { + unset($updates->response[$this->muPluginFile]); + } + return $updates; + } + + /** + * For plugins, the update array is indexed by the plugin filename relative to the "plugins" + * directory. Example: "plugin-name/plugin.php". + * + * @return string + */ + protected function getUpdateListKey() { + if ( $this->package->isMuPlugin() ) { + return $this->muPluginFile; + } + return $this->pluginFile; + } + + protected function getNoUpdateItemFields() { + return array_merge( + parent::getNoUpdateItemFields(), + array( + 'id' => $this->pluginFile, + 'slug' => $this->slug, + 'plugin' => $this->pluginFile, + 'icons' => array(), + 'banners' => array(), + 'banners_rtl' => array(), + 'tested' => '', + 'compatibility' => new stdClass(), + ) + ); + } + + /** + * Alias for isBeingUpgraded(). + * + * @deprecated + * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. + * @return bool + */ + public function isPluginBeingUpgraded($upgrader = null) { + return $this->isBeingUpgraded($upgrader); + } + + /** + * Is there an update being installed for this plugin, right now? + * + * @param WP_Upgrader|null $upgrader + * @return bool + */ + public function isBeingUpgraded($upgrader = null) { + return $this->upgraderStatus->isPluginBeingUpgraded($this->pluginFile, $upgrader); + } + + /** + * Get the details of the currently available update, if any. + * + * If no updates are available, or if the last known update version is below or equal + * to the currently installed version, this method will return NULL. + * + * Uses cached update data. To retrieve update information straight from + * the metadata URL, call requestUpdate() instead. + * + * @return Puc_v4p11_Plugin_Update|null + */ + public function getUpdate() { + $update = parent::getUpdate(); + if ( isset($update) ) { + /** @var Puc_v4p11_Plugin_Update $update */ + $update->filename = $this->pluginFile; + } + return $update; + } + + /** + * Get the translated plugin title. + * + * @deprecated + * @return string + */ + public function getPluginTitle() { + return $this->package->getPluginTitle(); + } + + /** + * Check if the current user has the required permissions to install updates. + * + * @return bool + */ + public function userCanInstallUpdates() { + return current_user_can('update_plugins'); + } + + /** + * Check if the plugin file is inside the mu-plugins directory. + * + * @deprecated + * @return bool + */ + protected function isMuPlugin() { + return $this->package->isMuPlugin(); + } + + /** + * MU plugins are partially supported, but only when we know which file in mu-plugins + * corresponds to this plugin. + * + * @return bool + */ + protected function isUnknownMuPlugin() { + return empty($this->muPluginFile) && $this->package->isMuPlugin(); + } + + /** + * Get absolute path to the main plugin file. + * + * @return string + */ + public function getAbsolutePath() { + return $this->pluginAbsolutePath; + } + + /** + * Register a callback for filtering query arguments. + * + * The callback function should take one argument - an associative array of query arguments. + * It should return a modified array of query arguments. + * + * @uses add_filter() This method is a convenience wrapper for add_filter(). + * + * @param callable $callback + * @return void + */ + public function addQueryArgFilter($callback){ + $this->addFilter('request_info_query_args', $callback); + } + + /** + * Register a callback for filtering arguments passed to wp_remote_get(). + * + * The callback function should take one argument - an associative array of arguments - + * and return a modified array or arguments. See the WP documentation on wp_remote_get() + * for details on what arguments are available and how they work. + * + * @uses add_filter() This method is a convenience wrapper for add_filter(). + * + * @param callable $callback + * @return void + */ + public function addHttpRequestArgFilter($callback) { + $this->addFilter('request_info_options', $callback); + } + + /** + * Register a callback for filtering the plugin info retrieved from the external API. + * + * The callback function should take two arguments. If the plugin info was retrieved + * successfully, the first argument passed will be an instance of PluginInfo. Otherwise, + * it will be NULL. The second argument will be the corresponding return value of + * wp_remote_get (see WP docs for details). + * + * The callback function should return a new or modified instance of PluginInfo or NULL. + * + * @uses add_filter() This method is a convenience wrapper for add_filter(). + * + * @param callable $callback + * @return void + */ + public function addResultFilter($callback) { + $this->addFilter('request_info_result', $callback, 10, 2); + } + + protected function createDebugBarExtension() { + return new Puc_v4p11_DebugBar_PluginExtension($this); + } + + /** + * Create a package instance that represents this plugin or theme. + * + * @return Puc_v4p11_InstalledPackage + */ + protected function createInstalledPackage() { + return new Puc_v4p11_Plugin_Package($this->pluginAbsolutePath, $this); + } + + /** + * @return Puc_v4p11_Plugin_Package + */ + public function getInstalledPackage() { + return $this->package; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Scheduler.php b/app/core/puc/Puc/v4p11/Scheduler.php new file mode 100755 index 0000000..cd861cf --- /dev/null +++ b/app/core/puc/Puc/v4p11/Scheduler.php @@ -0,0 +1,266 @@ +updateChecker = $updateChecker; + $this->checkPeriod = $checkPeriod; + + //Set up the periodic update checks + $this->cronHook = $this->updateChecker->getUniqueName('cron_check_updates'); + if ( $this->checkPeriod > 0 ){ + + //Trigger the check via Cron. + //Try to use one of the default schedules if possible as it's less likely to conflict + //with other plugins and their custom schedules. + $defaultSchedules = array( + 1 => 'hourly', + 12 => 'twicedaily', + 24 => 'daily', + ); + if ( array_key_exists($this->checkPeriod, $defaultSchedules) ) { + $scheduleName = $defaultSchedules[$this->checkPeriod]; + } else { + //Use a custom cron schedule. + $scheduleName = 'every' . $this->checkPeriod . 'hours'; + add_filter('cron_schedules', array($this, '_addCustomSchedule')); + } + + if ( !wp_next_scheduled($this->cronHook) && !defined('WP_INSTALLING') ) { + //Randomly offset the schedule to help prevent update server traffic spikes. Without this + //most checks may happen during times of day when people are most likely to install new plugins. + $firstCheckTime = time() - rand(0, max($this->checkPeriod * 3600 - 15 * 60, 1)); + $firstCheckTime = apply_filters( + $this->updateChecker->getUniqueName('first_check_time'), + $firstCheckTime + ); + wp_schedule_event($firstCheckTime, $scheduleName, $this->cronHook); + } + add_action($this->cronHook, array($this, 'maybeCheckForUpdates')); + + //In case Cron is disabled or unreliable, we also manually trigger + //the periodic checks while the user is browsing the Dashboard. + add_action( 'admin_init', array($this, 'maybeCheckForUpdates') ); + + //Like WordPress itself, we check more often on certain pages. + /** @see wp_update_plugins */ + add_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); + //"load-update.php" and "load-plugins.php" or "load-themes.php". + $this->hourlyCheckHooks = array_merge($this->hourlyCheckHooks, $hourlyHooks); + foreach($this->hourlyCheckHooks as $hook) { + add_action($hook, array($this, 'maybeCheckForUpdates')); + } + //This hook fires after a bulk update is complete. + add_action('upgrader_process_complete', array($this, 'upgraderProcessComplete'), 11, 2); + + } else { + //Periodic checks are disabled. + wp_clear_scheduled_hook($this->cronHook); + } + } + + /** + * Runs upon the WP action upgrader_process_complete. + * + * We look at the parameters to decide whether to call maybeCheckForUpdates() or not. + * We also check if the update checker has been removed by the update. + * + * @param WP_Upgrader $upgrader WP_Upgrader instance + * @param array $upgradeInfo extra information about the upgrade + */ + public function upgraderProcessComplete( + /** @noinspection PhpUnusedParameterInspection */ + $upgrader, $upgradeInfo + ) { + //Cancel all further actions if the current version of PUC has been deleted or overwritten + //by a different version during the upgrade. If we try to do anything more in that situation, + //we could trigger a fatal error by trying to autoload a deleted class. + clearstatcache(); + if ( !file_exists(__FILE__) ) { + $this->removeHooks(); + $this->updateChecker->removeHooks(); + return; + } + + //Sanity check and limitation to relevant types. + if ( + !is_array($upgradeInfo) || !isset($upgradeInfo['type'], $upgradeInfo['action']) + || 'update' !== $upgradeInfo['action'] || !in_array($upgradeInfo['type'], array('plugin', 'theme')) + ) { + return; + } + + //Filter out notifications of upgrades that should have no bearing upon whether or not our + //current info is up-to-date. + if ( is_a($this->updateChecker, 'Puc_v4p11_Theme_UpdateChecker') ) { + if ( 'theme' !== $upgradeInfo['type'] || !isset($upgradeInfo['themes']) ) { + return; + } + + //Letting too many things going through for checks is not a real problem, so we compare widely. + if ( !in_array( + strtolower($this->updateChecker->directoryName), + array_map('strtolower', $upgradeInfo['themes']) + ) ) { + return; + } + } + + if ( is_a($this->updateChecker, 'Puc_v4p11_Plugin_UpdateChecker') ) { + if ( 'plugin' !== $upgradeInfo['type'] || !isset($upgradeInfo['plugins']) ) { + return; + } + + //Themes pass in directory names in the information array, but plugins use the relative plugin path. + if ( !in_array( + strtolower($this->updateChecker->directoryName), + array_map('dirname', array_map('strtolower', $upgradeInfo['plugins'])) + ) ) { + return; + } + } + + $this->maybeCheckForUpdates(); + } + + /** + * Check for updates if the configured check interval has already elapsed. + * Will use a shorter check interval on certain admin pages like "Dashboard -> Updates" or when doing cron. + * + * You can override the default behaviour by using the "puc_check_now-$slug" filter. + * The filter callback will be passed three parameters: + * - Current decision. TRUE = check updates now, FALSE = don't check now. + * - Last check time as a Unix timestamp. + * - Configured check period in hours. + * Return TRUE to check for updates immediately, or FALSE to cancel. + * + * This method is declared public because it's a hook callback. Calling it directly is not recommended. + */ + public function maybeCheckForUpdates() { + if ( empty($this->checkPeriod) ){ + return; + } + + $state = $this->updateChecker->getUpdateState(); + $shouldCheck = ($state->timeSinceLastCheck() >= $this->getEffectiveCheckPeriod()); + + //Let plugin authors substitute their own algorithm. + $shouldCheck = apply_filters( + $this->updateChecker->getUniqueName('check_now'), + $shouldCheck, + $state->getLastCheck(), + $this->checkPeriod + ); + + if ( $shouldCheck ) { + $this->updateChecker->checkForUpdates(); + } + } + + /** + * Calculate the actual check period based on the current status and environment. + * + * @return int Check period in seconds. + */ + protected function getEffectiveCheckPeriod() { + $currentFilter = current_filter(); + if ( in_array($currentFilter, array('load-update-core.php', 'upgrader_process_complete')) ) { + //Check more often when the user visits "Dashboard -> Updates" or does a bulk update. + $period = 60; + } else if ( in_array($currentFilter, $this->hourlyCheckHooks) ) { + //Also check more often on /wp-admin/update.php and the "Plugins" or "Themes" page. + $period = 3600; + } else if ( $this->throttleRedundantChecks && ($this->updateChecker->getUpdate() !== null) ) { + //Check less frequently if it's already known that an update is available. + $period = $this->throttledCheckPeriod * 3600; + } else if ( defined('DOING_CRON') && constant('DOING_CRON') ) { + //WordPress cron schedules are not exact, so lets do an update check even + //if slightly less than $checkPeriod hours have elapsed since the last check. + $cronFuzziness = 20 * 60; + $period = $this->checkPeriod * 3600 - $cronFuzziness; + } else { + $period = $this->checkPeriod * 3600; + } + + return $period; + } + + /** + * Add our custom schedule to the array of Cron schedules used by WP. + * + * @param array $schedules + * @return array + */ + public function _addCustomSchedule($schedules) { + if ( $this->checkPeriod && ($this->checkPeriod > 0) ){ + $scheduleName = 'every' . $this->checkPeriod . 'hours'; + $schedules[$scheduleName] = array( + 'interval' => $this->checkPeriod * 3600, + 'display' => sprintf('Every %d hours', $this->checkPeriod), + ); + } + return $schedules; + } + + /** + * Remove the scheduled cron event that the library uses to check for updates. + * + * @return void + */ + public function removeUpdaterCron() { + wp_clear_scheduled_hook($this->cronHook); + } + + /** + * Get the name of the update checker's WP-cron hook. Mostly useful for debugging. + * + * @return string + */ + public function getCronHookName() { + return $this->cronHook; + } + + /** + * Remove most hooks added by the scheduler. + */ + public function removeHooks() { + remove_filter('cron_schedules', array($this, '_addCustomSchedule')); + remove_action('admin_init', array($this, 'maybeCheckForUpdates')); + remove_action('load-update-core.php', array($this, 'maybeCheckForUpdates')); + + if ( $this->cronHook !== null ) { + remove_action($this->cronHook, array($this, 'maybeCheckForUpdates')); + } + if ( !empty($this->hourlyCheckHooks) ) { + foreach ($this->hourlyCheckHooks as $hook) { + remove_action($hook, array($this, 'maybeCheckForUpdates')); + } + } + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/StateStore.php b/app/core/puc/Puc/v4p11/StateStore.php new file mode 100755 index 0000000..738a820 --- /dev/null +++ b/app/core/puc/Puc/v4p11/StateStore.php @@ -0,0 +1,207 @@ +optionName = $optionName; + } + + /** + * Get time elapsed since the last update check. + * + * If there are no recorded update checks, this method returns a large arbitrary number + * (i.e. time since the Unix epoch). + * + * @return int Elapsed time in seconds. + */ + public function timeSinceLastCheck() { + $this->lazyLoad(); + return time() - $this->lastCheck; + } + + /** + * @return int + */ + public function getLastCheck() { + $this->lazyLoad(); + return $this->lastCheck; + } + + /** + * Set the time of the last update check to the current timestamp. + * + * @return $this + */ + public function setLastCheckToNow() { + $this->lazyLoad(); + $this->lastCheck = time(); + return $this; + } + + /** + * @return null|Puc_v4p11_Update + */ + public function getUpdate() { + $this->lazyLoad(); + return $this->update; + } + + /** + * @param Puc_v4p11_Update|null $update + * @return $this + */ + public function setUpdate(Puc_v4p11_Update $update = null) { + $this->lazyLoad(); + $this->update = $update; + return $this; + } + + /** + * @return string + */ + public function getCheckedVersion() { + $this->lazyLoad(); + return $this->checkedVersion; + } + + /** + * @param string $version + * @return $this + */ + public function setCheckedVersion($version) { + $this->lazyLoad(); + $this->checkedVersion = strval($version); + return $this; + } + + /** + * Get translation updates. + * + * @return array + */ + public function getTranslations() { + $this->lazyLoad(); + if ( isset($this->update, $this->update->translations) ) { + return $this->update->translations; + } + return []; + } + + /** + * Set translation updates. + * + * @param array $translationUpdates + */ + public function setTranslations($translationUpdates) { + $this->lazyLoad(); + if ( isset($this->update) ) { + $this->update->translations = $translationUpdates; + $this->save(); + } + } + + public function save() { + $state = new stdClass(); + + $state->lastCheck = $this->lastCheck; + $state->checkedVersion = $this->checkedVersion; + + if ( isset($this->update)) { + $state->update = $this->update->toStdClass(); + + $updateClass = get_class($this->update); + $state->updateClass = $updateClass; + $prefix = $this->getLibPrefix(); + if ( Puc_v4p11_Utils::startsWith($updateClass, $prefix) ) { + $state->updateBaseClass = substr($updateClass, strlen($prefix)); + } + } + + update_site_option($this->optionName, $state); + $this->isLoaded = true; + } + + /** + * @return $this + */ + public function lazyLoad() { + if ( !$this->isLoaded ) { + $this->load(); + } + return $this; + } + + protected function load() { + $this->isLoaded = true; + + $state = get_site_option($this->optionName, null); + + if ( !is_object($state) ) { + $this->lastCheck = 0; + $this->checkedVersion = ''; + $this->update = null; + return; + } + + $this->lastCheck = intval(Puc_v4p11_Utils::get($state, 'lastCheck', 0)); + $this->checkedVersion = Puc_v4p11_Utils::get($state, 'checkedVersion', ''); + $this->update = null; + + if ( isset($state->update) ) { + //This mess is due to the fact that the want the update class from this version + //of the library, not the version that saved the update. + + $updateClass = null; + if ( isset($state->updateBaseClass) ) { + $updateClass = $this->getLibPrefix() . $state->updateBaseClass; + } else if ( isset($state->updateClass) && class_exists($state->updateClass) ) { + $updateClass = $state->updateClass; + } + + if ( $updateClass !== null ) { + $this->update = call_user_func(array($updateClass, 'fromObject'), $state->update); + } + } + } + + public function delete() { + delete_site_option($this->optionName); + + $this->lastCheck = 0; + $this->checkedVersion = ''; + $this->update = null; + } + + private function getLibPrefix() { + $parts = explode('_', __CLASS__, 3); + return $parts[0] . '_' . $parts[1] . '_'; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Theme/Package.php b/app/core/puc/Puc/v4p11/Theme/Package.php new file mode 100755 index 0000000..d9c9b50 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Theme/Package.php @@ -0,0 +1,65 @@ +stylesheet = $stylesheet; + $this->theme = wp_get_theme($this->stylesheet); + + parent::__construct($updateChecker); + } + + public function getInstalledVersion() { + return $this->theme->get('Version'); + } + + public function getAbsoluteDirectoryPath() { + if ( method_exists($this->theme, 'get_stylesheet_directory') ) { + return $this->theme->get_stylesheet_directory(); //Available since WP 3.4. + } + return get_theme_root($this->stylesheet) . '/' . $this->stylesheet; + } + + /** + * Get the value of a specific plugin or theme header. + * + * @param string $headerName + * @param string $defaultValue + * @return string Either the value of the header, or $defaultValue if the header doesn't exist or is empty. + */ + public function getHeaderValue($headerName, $defaultValue = '') { + $value = $this->theme->get($headerName); + if ( ($headerName === false) || ($headerName === '') ) { + return $defaultValue; + } + return $value; + } + + protected function getHeaderNames() { + return array( + 'Name' => 'Theme Name', + 'ThemeURI' => 'Theme URI', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'Version' => 'Version', + 'Template' => 'Template', + 'Status' => 'Status', + 'Tags' => 'Tags', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + ); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Theme/Update.php b/app/core/puc/Puc/v4p11/Theme/Update.php new file mode 100755 index 0000000..a0325c9 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Theme/Update.php @@ -0,0 +1,84 @@ + $this->slug, + 'new_version' => $this->version, + 'url' => $this->details_url, + ); + + if ( !empty($this->download_url) ) { + $update['package'] = $this->download_url; + } + + return $update; + } + + /** + * Create a new instance of Theme_Update from its JSON-encoded representation. + * + * @param string $json Valid JSON string representing a theme information object. + * @return self New instance of ThemeUpdate, or NULL on error. + */ + public static function fromJson($json) { + $instance = new self(); + if ( !parent::createFromJson($json, $instance) ) { + return null; + } + return $instance; + } + + /** + * Create a new instance by copying the necessary fields from another object. + * + * @param StdClass|Puc_v4p11_Theme_Update $object The source object. + * @return Puc_v4p11_Theme_Update The new copy. + */ + public static function fromObject($object) { + $update = new self(); + $update->copyFields($object, $update); + return $update; + } + + /** + * Basic validation. + * + * @param StdClass $apiResponse + * @return bool|WP_Error + */ + protected function validateMetadata($apiResponse) { + $required = array('version', 'details_url'); + foreach($required as $key) { + if ( !isset($apiResponse->$key) || empty($apiResponse->$key) ) { + return new WP_Error( + 'tuc-invalid-metadata', + sprintf('The theme metadata is missing the required "%s" key.', $key) + ); + } + } + return true; + } + + protected function getFieldNames() { + return array_merge(parent::getFieldNames(), self::$extraFields); + } + + protected function getPrefixedFilter($tag) { + return parent::getPrefixedFilter($tag) . '_theme'; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Theme/UpdateChecker.php b/app/core/puc/Puc/v4p11/Theme/UpdateChecker.php new file mode 100755 index 0000000..865a228 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Theme/UpdateChecker.php @@ -0,0 +1,152 @@ +stylesheet = $stylesheet; + + parent::__construct( + $metadataUrl, + $stylesheet, + $customSlug ? $customSlug : $stylesheet, + $checkPeriod, + $optionName + ); + } + + /** + * For themes, the update array is indexed by theme directory name. + * + * @return string + */ + protected function getUpdateListKey() { + return $this->directoryName; + } + + /** + * Retrieve the latest update (if any) from the configured API endpoint. + * + * @return Puc_v4p11_Update|null An instance of Update, or NULL when no updates are available. + */ + public function requestUpdate() { + list($themeUpdate, $result) = $this->requestMetadata('Puc_v4p11_Theme_Update', 'request_update'); + + if ( $themeUpdate !== null ) { + /** @var Puc_v4p11_Theme_Update $themeUpdate */ + $themeUpdate->slug = $this->slug; + } + + $themeUpdate = $this->filterUpdateResult($themeUpdate, $result); + return $themeUpdate; + } + + protected function getNoUpdateItemFields() { + return array_merge( + parent::getNoUpdateItemFields(), + array( + 'theme' => $this->directoryName, + 'requires' => '', + ) + ); + } + + public function userCanInstallUpdates() { + return current_user_can('update_themes'); + } + + /** + * Create an instance of the scheduler. + * + * @param int $checkPeriod + * @return Puc_v4p11_Scheduler + */ + protected function createScheduler($checkPeriod) { + return new Puc_v4p11_Scheduler($this, $checkPeriod, array('load-themes.php')); + } + + /** + * Is there an update being installed right now for this theme? + * + * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. + * @return bool + */ + public function isBeingUpgraded($upgrader = null) { + return $this->upgraderStatus->isThemeBeingUpgraded($this->stylesheet, $upgrader); + } + + protected function createDebugBarExtension() { + return new Puc_v4p11_DebugBar_Extension($this, 'Puc_v4p11_DebugBar_ThemePanel'); + } + + /** + * Register a callback for filtering query arguments. + * + * The callback function should take one argument - an associative array of query arguments. + * It should return a modified array of query arguments. + * + * @param callable $callback + * @return void + */ + public function addQueryArgFilter($callback){ + $this->addFilter('request_update_query_args', $callback); + } + + /** + * Register a callback for filtering arguments passed to wp_remote_get(). + * + * The callback function should take one argument - an associative array of arguments - + * and return a modified array or arguments. See the WP documentation on wp_remote_get() + * for details on what arguments are available and how they work. + * + * @uses add_filter() This method is a convenience wrapper for add_filter(). + * + * @param callable $callback + * @return void + */ + public function addHttpRequestArgFilter($callback) { + $this->addFilter('request_update_options', $callback); + } + + /** + * Register a callback for filtering theme updates retrieved from the external API. + * + * The callback function should take two arguments. If the theme update was retrieved + * successfully, the first argument passed will be an instance of Theme_Update. Otherwise, + * it will be NULL. The second argument will be the corresponding return value of + * wp_remote_get (see WP docs for details). + * + * The callback function should return a new or modified instance of Theme_Update or NULL. + * + * @uses add_filter() This method is a convenience wrapper for add_filter(). + * + * @param callable $callback + * @return void + */ + public function addResultFilter($callback) { + $this->addFilter('request_update_result', $callback, 10, 2); + } + + /** + * Create a package instance that represents this plugin or theme. + * + * @return Puc_v4p11_InstalledPackage + */ + protected function createInstalledPackage() { + return new Puc_v4p11_Theme_Package($this->stylesheet, $this); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Update.php b/app/core/puc/Puc/v4p11/Update.php new file mode 100755 index 0000000..f12172d --- /dev/null +++ b/app/core/puc/Puc/v4p11/Update.php @@ -0,0 +1,34 @@ +slug = $this->slug; + $update->new_version = $this->version; + $update->package = $this->download_url; + + return $update; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/UpdateChecker.php b/app/core/puc/Puc/v4p11/UpdateChecker.php new file mode 100755 index 0000000..a10f6f7 --- /dev/null +++ b/app/core/puc/Puc/v4p11/UpdateChecker.php @@ -0,0 +1,999 @@ +debugMode = (bool)(constant('WP_DEBUG')); + $this->metadataUrl = $metadataUrl; + $this->directoryName = $directoryName; + $this->slug = !empty($slug) ? $slug : $this->directoryName; + + $this->optionName = $optionName; + if ( empty($this->optionName) ) { + //BC: Initially the library only supported plugin updates and didn't use type prefixes + //in the option name. Lets use the same prefix-less name when possible. + if ( $this->filterSuffix === '' ) { + $this->optionName = 'external_updates-' . $this->slug; + } else { + $this->optionName = $this->getUniqueName('external_updates'); + } + } + + $this->package = $this->createInstalledPackage(); + $this->scheduler = $this->createScheduler($checkPeriod); + $this->upgraderStatus = new Puc_v4p11_UpgraderStatus(); + $this->updateState = new Puc_v4p11_StateStore($this->optionName); + + if ( did_action('init') ) { + $this->loadTextDomain(); + } else { + add_action('init', array($this, 'loadTextDomain')); + } + + $this->installHooks(); + } + + /** + * @internal + */ + public function loadTextDomain() { + //We're not using load_plugin_textdomain() or its siblings because figuring out where + //the library is located (plugin, mu-plugin, theme, custom wp-content paths) is messy. + $domain = 'plugin-update-checker'; + $locale = apply_filters( + 'plugin_locale', + (is_admin() && function_exists('get_user_locale')) ? get_user_locale() : get_locale(), + $domain + ); + + $moFile = $domain . '-' . $locale . '.mo'; + $path = realpath(dirname(__FILE__) . '/../../languages'); + + if ($path && file_exists($path)) { + load_textdomain($domain, $path . '/' . $moFile); + } + } + + protected function installHooks() { + //Insert our update info into the update array maintained by WP. + add_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); + + //Insert translation updates into the update list. + add_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); + + //Clear translation updates when WP clears the update cache. + //This needs to be done directly because the library doesn't actually remove obsolete plugin updates, + //it just hides them (see getUpdate()). We can't do that with translations - too much disk I/O. + add_action( + 'delete_site_transient_' . $this->updateTransient, + array($this, 'clearCachedTranslationUpdates') + ); + + //Rename the update directory to be the same as the existing directory. + if ( $this->directoryName !== '.' ) { + add_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10, 3); + } + + //Allow HTTP requests to the metadata URL even if it's on a local host. + add_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10, 2); + + //DebugBar integration. + if ( did_action('plugins_loaded') ) { + $this->maybeInitDebugBar(); + } else { + add_action('plugins_loaded', array($this, 'maybeInitDebugBar')); + } + } + + /** + * Remove hooks that were added by this update checker instance. + */ + public function removeHooks() { + remove_filter('site_transient_' . $this->updateTransient, array($this,'injectUpdate')); + remove_filter('site_transient_' . $this->updateTransient, array($this, 'injectTranslationUpdates')); + remove_action( + 'delete_site_transient_' . $this->updateTransient, + array($this, 'clearCachedTranslationUpdates') + ); + + remove_filter('upgrader_source_selection', array($this, 'fixDirectoryName'), 10); + remove_filter('http_request_host_is_external', array($this, 'allowMetadataHost'), 10); + remove_action('plugins_loaded', array($this, 'maybeInitDebugBar')); + + remove_action('init', array($this, 'loadTextDomain')); + + if ( $this->scheduler ) { + $this->scheduler->removeHooks(); + } + + if ( $this->debugBarExtension ) { + $this->debugBarExtension->removeHooks(); + } + } + + /** + * Check if the current user has the required permissions to install updates. + * + * @return bool + */ + abstract public function userCanInstallUpdates(); + + /** + * Explicitly allow HTTP requests to the metadata URL. + * + * WordPress has a security feature where the HTTP API will reject all requests that are sent to + * another site hosted on the same server as the current site (IP match), a local host, or a local + * IP, unless the host exactly matches the current site. + * + * This feature is opt-in (at least in WP 4.4). Apparently some people enable it. + * + * That can be a problem when you're developing your plugin and you decide to host the update information + * on the same server as your test site. Update requests will mysteriously fail. + * + * We fix that by adding an exception for the metadata host. + * + * @param bool $allow + * @param string $host + * @return bool + */ + public function allowMetadataHost($allow, $host) { + if ( $this->cachedMetadataHost === 0 ) { + $this->cachedMetadataHost = parse_url($this->metadataUrl, PHP_URL_HOST); + } + + if ( is_string($this->cachedMetadataHost) && (strtolower($host) === strtolower($this->cachedMetadataHost)) ) { + return true; + } + return $allow; + } + + /** + * Create a package instance that represents this plugin or theme. + * + * @return Puc_v4p11_InstalledPackage + */ + abstract protected function createInstalledPackage(); + + /** + * @return Puc_v4p11_InstalledPackage + */ + public function getInstalledPackage() { + return $this->package; + } + + /** + * Create an instance of the scheduler. + * + * This is implemented as a method to make it possible for plugins to subclass the update checker + * and substitute their own scheduler. + * + * @param int $checkPeriod + * @return Puc_v4p11_Scheduler + */ + abstract protected function createScheduler($checkPeriod); + + /** + * Check for updates. The results are stored in the DB option specified in $optionName. + * + * @return Puc_v4p11_Update|null + */ + public function checkForUpdates() { + $installedVersion = $this->getInstalledVersion(); + //Fail silently if we can't find the plugin/theme or read its header. + if ( $installedVersion === null ) { + $this->triggerError( + sprintf('Skipping update check for %s - installed version unknown.', $this->slug), + E_USER_WARNING + ); + return null; + } + + //Start collecting API errors. + $this->lastRequestApiErrors = []; + add_action('puc_api_error', array($this, 'collectApiErrors'), 10, 4); + + $state = $this->updateState; + $state->setLastCheckToNow() + ->setCheckedVersion($installedVersion) + ->save(); //Save before checking in case something goes wrong + + $state->setUpdate($this->requestUpdate()); + $state->save(); + + //Stop collecting API errors. + remove_action('puc_api_error', array($this, 'collectApiErrors'), 10); + + return $this->getUpdate(); + } + + /** + * Load the update checker state from the DB. + * + * @return Puc_v4p11_StateStore + */ + public function getUpdateState() { + return $this->updateState->lazyLoad(); + } + + /** + * Reset update checker state - i.e. last check time, cached update data and so on. + * + * Call this when your plugin is being uninstalled, or if you want to + * clear the update cache. + */ + public function resetUpdateState() { + $this->updateState->delete(); + } + + /** + * Get the details of the currently available update, if any. + * + * If no updates are available, or if the last known update version is below or equal + * to the currently installed version, this method will return NULL. + * + * Uses cached update data. To retrieve update information straight from + * the metadata URL, call requestUpdate() instead. + * + * @return Puc_v4p11_Update|null + */ + public function getUpdate() { + $update = $this->updateState->getUpdate(); + + //Is there an update available? + if ( isset($update) ) { + //Check if the update is actually newer than the currently installed version. + $installedVersion = $this->getInstalledVersion(); + if ( ($installedVersion !== null) && version_compare($update->version, $installedVersion, '>') ){ + return $update; + } + } + return null; + } + + /** + * Retrieve the latest update (if any) from the configured API endpoint. + * + * Subclasses should run the update through filterUpdateResult before returning it. + * + * @return Puc_v4p11_Update An instance of Update, or NULL when no updates are available. + */ + abstract public function requestUpdate(); + + /** + * Filter the result of a requestUpdate() call. + * + * @param Puc_v4p11_Update|null $update + * @param array|WP_Error|null $httpResult The value returned by wp_remote_get(), if any. + * @return Puc_v4p11_Update + */ + protected function filterUpdateResult($update, $httpResult = null) { + //Let plugins/themes modify the update. + $update = apply_filters($this->getUniqueName('request_update_result'), $update, $httpResult); + + $this->fixSupportedWordpressVersion($update); + + if ( isset($update, $update->translations) ) { + //Keep only those translation updates that apply to this site. + $update->translations = $this->filterApplicableTranslations($update->translations); + } + + return $update; + } + + /** + * The "Tested up to" field in the plugin metadata is supposed to be in the form of "major.minor", + * while WordPress core's list_plugin_updates() expects the $update->tested field to be an exact + * version, e.g. "major.minor.patch", to say it's compatible. In other case it shows + * "Compatibility: Unknown". + * The function mimics how wordpress.org API crafts the "tested" field out of "Tested up to". + * + * @param Puc_v4p11_Metadata|null $update + */ + protected function fixSupportedWordpressVersion(Puc_v4p11_Metadata $update = null) { + if ( !isset($update->tested) || !preg_match('/^\d++\.\d++$/', $update->tested) ) { + return; + } + + $actualWpVersions = []; + + $wpVersion = $GLOBALS['wp_version']; + + if ( function_exists('get_core_updates') ) { + $coreUpdates = get_core_updates(); + if ( is_array($coreUpdates) ) { + foreach ($coreUpdates as $coreUpdate) { + if ( isset($coreUpdate->current) ) { + $actualWpVersions[] = $coreUpdate->current; + } + } + } + } + + $actualWpVersions[] = $wpVersion; + + $actualWpPatchNumber = null; + foreach ($actualWpVersions as $version) { + if ( preg_match('/^(?P\d++\.\d++)(?:\.(?P\d++))?/', $version, $versionParts) ) { + if ( $versionParts['majorMinor'] === $update->tested ) { + $patch = isset($versionParts['patch']) ? intval($versionParts['patch']) : 0; + if ( $actualWpPatchNumber === null ) { + $actualWpPatchNumber = $patch; + } else { + $actualWpPatchNumber = max($actualWpPatchNumber, $patch); + } + } + } + } + if ( $actualWpPatchNumber === null ) { + $actualWpPatchNumber = 999; + } + + if ( $actualWpPatchNumber > 0 ) { + $update->tested .= '.' . $actualWpPatchNumber; + } + } + + /** + * Get the currently installed version of the plugin or theme. + * + * @return string|null Version number. + */ + public function getInstalledVersion() { + return $this->package->getInstalledVersion(); + } + + /** + * Get the full path of the plugin or theme directory. + * + * @return string + */ + public function getAbsoluteDirectoryPath() { + return $this->package->getAbsoluteDirectoryPath(); + } + + /** + * Trigger a PHP error, but only when $debugMode is enabled. + * + * @param string $message + * @param int $errorType + */ + public function triggerError($message, $errorType) { + if ( $this->isDebugModeEnabled() ) { + trigger_error($message, $errorType); + } + } + + /** + * @return bool + */ + protected function isDebugModeEnabled() { + if ( $this->debugMode === null ) { + $this->debugMode = (bool)(constant('WP_DEBUG')); + } + return $this->debugMode; + } + + /** + * Get the full name of an update checker filter, action or DB entry. + * + * This method adds the "puc_" prefix and the "-$slug" suffix to the filter name. + * For example, "pre_inject_update" becomes "puc_pre_inject_update-plugin-slug". + * + * @param string $baseTag + * @return string + */ + public function getUniqueName($baseTag) { + $name = 'puc_' . $baseTag; + if ( $this->filterSuffix !== '' ) { + $name .= '_' . $this->filterSuffix; + } + return $name . '-' . $this->slug; + } + + /** + * Store API errors that are generated when checking for updates. + * + * @internal + * @param WP_Error $error + * @param array|null $httpResponse + * @param string|null $url + * @param string|null $slug + */ + public function collectApiErrors($error, $httpResponse = null, $url = null, $slug = null) { + if ( isset($slug) && ($slug !== $this->slug) ) { + return; + } + + $this->lastRequestApiErrors[] = array( + 'error' => $error, + 'httpResponse' => $httpResponse, + 'url' => $url, + ); + } + + /** + * @return array + */ + public function getLastRequestApiErrors() { + return $this->lastRequestApiErrors; + } + + /* ------------------------------------------------------------------- + * PUC filters and filter utilities + * ------------------------------------------------------------------- + */ + + /** + * Register a callback for one of the update checker filters. + * + * Identical to add_filter(), except it automatically adds the "puc_" prefix + * and the "-$slug" suffix to the filter name. For example, "request_info_result" + * becomes "puc_request_info_result-your_plugin_slug". + * + * @param string $tag + * @param callable $callback + * @param int $priority + * @param int $acceptedArgs + */ + public function addFilter($tag, $callback, $priority = 10, $acceptedArgs = 1) { + add_filter($this->getUniqueName($tag), $callback, $priority, $acceptedArgs); + } + + /* ------------------------------------------------------------------- + * Inject updates + * ------------------------------------------------------------------- + */ + + /** + * Insert the latest update (if any) into the update list maintained by WP. + * + * @param stdClass $updates Update list. + * @return stdClass Modified update list. + */ + public function injectUpdate($updates) { + //Is there an update to insert? + $update = $this->getUpdate(); + + if ( !$this->shouldShowUpdates() ) { + $update = null; + } + + if ( !empty($update) ) { + //Let plugins filter the update info before it's passed on to WordPress. + $update = apply_filters($this->getUniqueName('pre_inject_update'), $update); + $updates = $this->addUpdateToList($updates, $update->toWpFormat()); + } else { + //Clean up any stale update info. + $updates = $this->removeUpdateFromList($updates); + //Add a placeholder item to the "no_update" list to enable auto-update support. + //If we don't do this, the option to enable automatic updates will only show up + //when an update is available. + $updates = $this->addNoUpdateItem($updates); + } + + return $updates; + } + + /** + * @param stdClass|null $updates + * @param stdClass|array $updateToAdd + * @return stdClass + */ + protected function addUpdateToList($updates, $updateToAdd) { + if ( !is_object($updates) ) { + $updates = new stdClass(); + $updates->response = []; + } + + $updates->response[$this->getUpdateListKey()] = $updateToAdd; + return $updates; + } + + /** + * @param stdClass|null $updates + * @return stdClass|null + */ + protected function removeUpdateFromList($updates) { + if ( isset($updates, $updates->response) ) { + unset($updates->response[$this->getUpdateListKey()]); + } + return $updates; + } + + /** + * See this post for more information: + * @link https://make.wordpress.org/core/2020/07/30/recommended-usage-of-the-updates-api-to-support-the-auto-updates-ui-for-plugins-and-themes-in-wordpress-5-5/ + * + * @param stdClass|null $updates + * @return stdClass + */ + protected function addNoUpdateItem($updates) { + if ( !is_object($updates) ) { + $updates = new stdClass(); + $updates->response = []; + $updates->no_update = []; + } else if ( !isset($updates->no_update) ) { + $updates->no_update = []; + } + + $updates->no_update[$this->getUpdateListKey()] = (object) $this->getNoUpdateItemFields(); + + return $updates; + } + + /** + * Subclasses should override this method to add fields that are specific to plugins or themes. + * @return array + */ + protected function getNoUpdateItemFields() { + return array( + 'new_version' => $this->getInstalledVersion(), + 'url' => '', + 'package' => '', + 'requires_php' => '', + ); + } + + /** + * Get the key that will be used when adding updates to the update list that's maintained + * by the WordPress core. The list is always an associative array, but the key is different + * for plugins and themes. + * + * @return string + */ + abstract protected function getUpdateListKey(); + + /** + * Should we show available updates? + * + * Usually the answer is "yes", but there are exceptions. For example, WordPress doesn't + * support automatic updates installation for mu-plugins, so PUC usually won't show update + * notifications in that case. See the plugin-specific subclass for details. + * + * Note: This method only applies to updates that are displayed (or not) in the WordPress + * admin. It doesn't affect APIs like requestUpdate and getUpdate. + * + * @return bool + */ + protected function shouldShowUpdates() { + return true; + } + + /* ------------------------------------------------------------------- + * JSON-based update API + * ------------------------------------------------------------------- + */ + + /** + * Retrieve plugin or theme metadata from the JSON document at $this->metadataUrl. + * + * @param string $metaClass Parse the JSON as an instance of this class. It must have a static fromJson method. + * @param string $filterRoot + * @param array $queryArgs Additional query arguments. + * @return array [Puc_v4p11_Metadata|null, array|WP_Error] A metadata instance and the value returned by wp_remote_get(). + */ + protected function requestMetadata($metaClass, $filterRoot, $queryArgs = array()) { + //Query args to append to the URL. Plugins can add their own by using a filter callback (see addQueryArgFilter()). + $queryArgs = array_merge( + array( + 'installed_version' => strval($this->getInstalledVersion()), + 'php' => phpversion(), + 'locale' => get_locale(), + ), + $queryArgs + ); + $queryArgs = apply_filters($this->getUniqueName($filterRoot . '_query_args'), $queryArgs); + + //Various options for the wp_remote_get() call. Plugins can filter these, too. + $options = array( + 'timeout' => 10, //seconds + 'headers' => array( + 'Accept' => 'application/json', + ), + 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', + + ); + $options = apply_filters($this->getUniqueName($filterRoot . '_options'), $options); + + //The metadata file should be at 'http://your-api.com/url/here/$slug/info.json' + $url = $this->metadataUrl; + if ( !empty($queryArgs) ){ + $url = add_query_arg($queryArgs, $url); + } + + $result = wp_remote_get($url, $options); + + $result = apply_filters($this->getUniqueName('request_metadata_http_result'), $result, $url, $options); + + //Try to parse the response + $status = $this->validateApiResponse($result); + $metadata = null; + if ( !is_wp_error($status) ){ + if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($metaClass, '\\') === false) ) { + $metaClass = __NAMESPACE__ . '\\' . $metaClass; + } + $metadata = call_user_func(array($metaClass, 'fromJson'), $result['body']); + } else { + do_action('puc_api_error', $status, $result, $url, $this->slug); + $this->triggerError( + sprintf('The URL %s does not point to a valid metadata file. ', $url) + . $status->get_error_message(), + E_USER_WARNING + ); + } + + return array($metadata, $result); + } + + /** + * Check if $result is a successful update API response. + * + * @param array|WP_Error $result + * @return true|WP_Error + */ + protected function validateApiResponse($result) { + if ( is_wp_error($result) ) { /** @var WP_Error $result */ + return new WP_Error($result->get_error_code(), 'WP HTTP Error: ' . $result->get_error_message()); + } + + if ( !isset($result['response']['code']) ) { + return new WP_Error( + 'puc_no_response_code', + 'wp_remote_get() returned an unexpected result.' + ); + } + + if ( $result['response']['code'] !== 200 ) { + return new WP_Error( + 'puc_unexpected_response_code', + 'HTTP response code is ' . $result['response']['code'] . ' (expected: 200)' + ); + } + + if ( empty($result['body']) ) { + return new WP_Error('puc_empty_response', 'The metadata file appears to be empty.'); + } + + return true; + } + + /* ------------------------------------------------------------------- + * Language packs / Translation updates + * ------------------------------------------------------------------- + */ + + /** + * Filter a list of translation updates and return a new list that contains only updates + * that apply to the current site. + * + * @param array $translations + * @return array + */ + protected function filterApplicableTranslations($translations) { + $languages = array_flip(array_values(get_available_languages())); + $installedTranslations = $this->getInstalledTranslations(); + + $applicableTranslations = []; + foreach ($translations as $translation) { + //Does it match one of the available core languages? + $isApplicable = array_key_exists($translation->language, $languages); + //Is it more recent than an already-installed translation? + if ( isset($installedTranslations[$translation->language]) ) { + $updateTimestamp = strtotime($translation->updated); + $installedTimestamp = strtotime($installedTranslations[$translation->language]['PO-Revision-Date']); + $isApplicable = $updateTimestamp > $installedTimestamp; + } + + if ( $isApplicable ) { + $applicableTranslations[] = $translation; + } + } + + return $applicableTranslations; + } + + /** + * Get a list of installed translations for this plugin or theme. + * + * @return array + */ + protected function getInstalledTranslations() { + if ( !function_exists('wp_get_installed_translations') ) { + return []; + } + $installedTranslations = wp_get_installed_translations($this->translationType . 's'); + if ( isset($installedTranslations[$this->directoryName]) ) { + $installedTranslations = $installedTranslations[$this->directoryName]; + } else { + $installedTranslations = []; + } + return $installedTranslations; + } + + /** + * Insert translation updates into the list maintained by WordPress. + * + * @param stdClass $updates + * @return stdClass + */ + public function injectTranslationUpdates($updates) { + $translationUpdates = $this->getTranslationUpdates(); + if ( empty($translationUpdates) ) { + return $updates; + } + + //Being defensive. + if ( !is_object($updates) ) { + $updates = new stdClass(); + } + if ( !isset($updates->translations) ) { + $updates->translations = []; + } + + //In case there's a name collision with a plugin or theme hosted on wordpress.org, + //remove any preexisting updates that match our thing. + $updates->translations = array_values(array_filter( + $updates->translations, + array($this, 'isNotMyTranslation') + )); + + //Add our updates to the list. + foreach($translationUpdates as $update) { + $convertedUpdate = array_merge( + array( + 'type' => $this->translationType, + 'slug' => $this->directoryName, + 'autoupdate' => 0, + //AFAICT, WordPress doesn't actually use the "version" field for anything. + //But lets make sure it's there, just in case. + 'version' => isset($update->version) ? $update->version : ('1.' . strtotime($update->updated)), + ), + (array)$update + ); + + $updates->translations[] = $convertedUpdate; + } + + return $updates; + } + + /** + * Get a list of available translation updates. + * + * This method will return an empty array if there are no updates. + * Uses cached update data. + * + * @return array + */ + public function getTranslationUpdates() { + return $this->updateState->getTranslations(); + } + + /** + * Remove all cached translation updates. + * + * @see wp_clean_update_cache + */ + public function clearCachedTranslationUpdates() { + $this->updateState->setTranslations(array()); + } + + /** + * Filter callback. Keeps only translations that *don't* match this plugin or theme. + * + * @param array $translation + * @return bool + */ + protected function isNotMyTranslation($translation) { + $isMatch = isset($translation['type'], $translation['slug']) + && ($translation['type'] === $this->translationType) + && ($translation['slug'] === $this->directoryName); + + return !$isMatch; + } + + /* ------------------------------------------------------------------- + * Fix directory name when installing updates + * ------------------------------------------------------------------- + */ + + /** + * Rename the update directory to match the existing plugin/theme directory. + * + * When WordPress installs a plugin or theme update, it assumes that the ZIP file will contain + * exactly one directory, and that the directory name will be the same as the directory where + * the plugin or theme is currently installed. + * + * GitHub and other repositories provide ZIP downloads, but they often use directory names like + * "project-branch" or "project-tag-hash". We need to change the name to the actual plugin folder. + * + * This is a hook callback. Don't call it from a plugin. + * + * @access protected + * + * @param string $source The directory to copy to /wp-content/plugins or /wp-content/themes. Usually a subdirectory of $remoteSource. + * @param string $remoteSource WordPress has extracted the update to this directory. + * @param WP_Upgrader $upgrader + * @return string|WP_Error + */ + public function fixDirectoryName($source, $remoteSource, $upgrader) { + global $wp_filesystem; + /** @var WP_Filesystem_Base $wp_filesystem */ + + //Basic sanity checks. + if ( !isset($source, $remoteSource, $upgrader, $upgrader->skin, $wp_filesystem) ) { + return $source; + } + + //If WordPress is upgrading anything other than our plugin/theme, leave the directory name unchanged. + if ( !$this->isBeingUpgraded($upgrader) ) { + return $source; + } + + //Rename the source to match the existing directory. + $correctedSource = trailingslashit($remoteSource) . $this->directoryName . '/'; + if ( $source !== $correctedSource ) { + //The update archive should contain a single directory that contains the rest of plugin/theme files. + //Otherwise, WordPress will try to copy the entire working directory ($source == $remoteSource). + //We can't rename $remoteSource because that would break WordPress code that cleans up temporary files + //after update. + if ( $this->isBadDirectoryStructure($remoteSource) ) { + return new WP_Error( + 'puc-incorrect-directory-structure', + sprintf( + 'The directory structure of the update is incorrect. All files should be inside ' . + 'a directory named %s, not at the root of the ZIP archive.', + htmlentities($this->slug) + ) + ); + } + + /** @var WP_Upgrader_Skin $upgrader ->skin */ + $upgrader->skin->feedback(sprintf( + 'Renaming %s to %s…', + '' . basename($source) . '', + '' . $this->directoryName . '' + )); + + if ( $wp_filesystem->move($source, $correctedSource, true) ) { + $upgrader->skin->feedback('Directory successfully renamed.'); + return $correctedSource; + } else { + return new WP_Error( + 'puc-rename-failed', + 'Unable to rename the update to match the existing directory.' + ); + } + } + + return $source; + } + + /** + * Is there an update being installed right now, for this plugin or theme? + * + * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. + * @return bool + */ + abstract public function isBeingUpgraded($upgrader = null); + + /** + * Check for incorrect update directory structure. An update must contain a single directory, + * all other files should be inside that directory. + * + * @param string $remoteSource Directory path. + * @return bool + */ + protected function isBadDirectoryStructure($remoteSource) { + global $wp_filesystem; + /** @var WP_Filesystem_Base $wp_filesystem */ + + $sourceFiles = $wp_filesystem->dirlist($remoteSource); + if ( is_array($sourceFiles) ) { + $sourceFiles = array_keys($sourceFiles); + $firstFilePath = trailingslashit($remoteSource) . $sourceFiles[0]; + return (count($sourceFiles) > 1) || (!$wp_filesystem->is_dir($firstFilePath)); + } + + //Assume it's fine. + return false; + } + + /* ------------------------------------------------------------------- + * DebugBar integration + * ------------------------------------------------------------------- + */ + + /** + * Initialize the update checker Debug Bar plugin/add-on thingy. + */ + public function maybeInitDebugBar() { + if ( class_exists('Debug_Bar', false) && file_exists(dirname(__FILE__) . '/DebugBar') ) { + $this->debugBarExtension = $this->createDebugBarExtension(); + } + } + + protected function createDebugBarExtension() { + return new Puc_v4p11_DebugBar_Extension($this); + } + + /** + * Display additional configuration details in the Debug Bar panel. + * + * @param Puc_v4p11_DebugBar_Panel $panel + */ + public function onDisplayConfiguration($panel) { + //Do nothing. Subclasses can use this to add additional info to the panel. + } + + } + +endif; diff --git a/app/core/puc/Puc/v4p11/UpgraderStatus.php b/app/core/puc/Puc/v4p11/UpgraderStatus.php new file mode 100755 index 0000000..38575db --- /dev/null +++ b/app/core/puc/Puc/v4p11/UpgraderStatus.php @@ -0,0 +1,199 @@ +isBeingUpgraded('plugin', $pluginFile, $upgrader); + } + + /** + * Is there an update being installed for a specific theme? + * + * @param string $stylesheet Theme directory name. + * @param WP_Upgrader|null $upgrader The upgrader that's performing the current update. + * @return bool + */ + public function isThemeBeingUpgraded($stylesheet, $upgrader = null) { + return $this->isBeingUpgraded('theme', $stylesheet, $upgrader); + } + + /** + * Check if a specific theme or plugin is being upgraded. + * + * @param string $type + * @param string $id + * @param Plugin_Upgrader|WP_Upgrader|null $upgrader + * @return bool + */ + protected function isBeingUpgraded($type, $id, $upgrader = null) { + if ( isset($upgrader) ) { + list($currentType, $currentId) = $this->getThingBeingUpgradedBy($upgrader); + if ( $currentType !== null ) { + $this->currentType = $currentType; + $this->currentId = $currentId; + } + } + return ($this->currentType === $type) && ($this->currentId === $id); + } + + /** + * Figure out which theme or plugin is being upgraded by a WP_Upgrader instance. + * + * Returns an array with two items. The first item is the type of the thing that's being + * upgraded: "plugin" or "theme". The second item is either the plugin basename or + * the theme directory name. If we can't determine what the upgrader is doing, both items + * will be NULL. + * + * Examples: + * ['plugin', 'plugin-dir-name/plugin.php'] + * ['theme', 'theme-dir-name'] + * + * @param Plugin_Upgrader|WP_Upgrader $upgrader + * @return array + */ + private function getThingBeingUpgradedBy($upgrader) { + if ( !isset($upgrader, $upgrader->skin) ) { + return array(null, null); + } + + //Figure out which plugin or theme is being upgraded. + $pluginFile = null; + $themeDirectoryName = null; + + $skin = $upgrader->skin; + if ( isset($skin->theme_info) && ($skin->theme_info instanceof WP_Theme) ) { + $themeDirectoryName = $skin->theme_info->get_stylesheet(); + } elseif ( $skin instanceof Plugin_Upgrader_Skin ) { + if ( isset($skin->plugin) && is_string($skin->plugin) && ($skin->plugin !== '') ) { + $pluginFile = $skin->plugin; + } + } elseif ( $skin instanceof Theme_Upgrader_Skin ) { + if ( isset($skin->theme) && is_string($skin->theme) && ($skin->theme !== '') ) { + $themeDirectoryName = $skin->theme; + } + } elseif ( isset($skin->plugin_info) && is_array($skin->plugin_info) ) { + //This case is tricky because Bulk_Plugin_Upgrader_Skin (etc) doesn't actually store the plugin + //filename anywhere. Instead, it has the plugin headers in $plugin_info. So the best we can + //do is compare those headers to the headers of installed plugins. + $pluginFile = $this->identifyPluginByHeaders($skin->plugin_info); + } + + if ( $pluginFile !== null ) { + return array('plugin', $pluginFile); + } elseif ( $themeDirectoryName !== null ) { + return array('theme', $themeDirectoryName); + } + return array(null, null); + } + + /** + * Identify an installed plugin based on its headers. + * + * @param array $searchHeaders The plugin file header to look for. + * @return string|null Plugin basename ("foo/bar.php"), or NULL if we can't identify the plugin. + */ + private function identifyPluginByHeaders($searchHeaders) { + if ( !function_exists('get_plugins') ){ + /** @noinspection PhpIncludeInspection */ + require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); + } + + $installedPlugins = get_plugins(); + $matches = []; + foreach($installedPlugins as $pluginBasename => $headers) { + $diff1 = array_diff_assoc($headers, $searchHeaders); + $diff2 = array_diff_assoc($searchHeaders, $headers); + if ( empty($diff1) && empty($diff2) ) { + $matches[] = $pluginBasename; + } + } + + //It's possible (though very unlikely) that there could be two plugins with identical + //headers. In that case, we can't unambiguously identify the plugin that's being upgraded. + if ( count($matches) !== 1 ) { + return null; + } + + return reset($matches); + } + + /** + * @access private + * + * @param mixed $input + * @param array $hookExtra + * @return mixed Returns $input unaltered. + */ + public function setUpgradedThing($input, $hookExtra) { + if ( !empty($hookExtra['plugin']) && is_string($hookExtra['plugin']) ) { + $this->currentId = $hookExtra['plugin']; + $this->currentType = 'plugin'; + } elseif ( !empty($hookExtra['theme']) && is_string($hookExtra['theme']) ) { + $this->currentId = $hookExtra['theme']; + $this->currentType = 'theme'; + } else { + $this->currentType = null; + $this->currentId = null; + } + return $input; + } + + /** + * @access private + * + * @param array $options + * @return array + */ + public function setUpgradedPluginFromOptions($options) { + if ( isset($options['hook_extra']['plugin']) && is_string($options['hook_extra']['plugin']) ) { + $this->currentType = 'plugin'; + $this->currentId = $options['hook_extra']['plugin']; + } else { + $this->currentType = null; + $this->currentId = null; + } + return $options; + } + + /** + * @access private + * + * @param mixed $input + * @return mixed Returns $input unaltered. + */ + public function clearUpgradedThing($input = null) { + $this->currentId = null; + $this->currentType = null; + return $input; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Utils.php b/app/core/puc/Puc/v4p11/Utils.php new file mode 100755 index 0000000..62ce66d --- /dev/null +++ b/app/core/puc/Puc/v4p11/Utils.php @@ -0,0 +1,69 @@ +$node) ) { + $currentValue = $currentValue->$node; + } else { + return $default; + } + } + + return $currentValue; + } + + /** + * Get the first array element that is not empty. + * + * @param array $values + * @param mixed|null $default Returns this value if there are no non-empty elements. + * @return mixed|null + */ + public static function findNotEmpty($values, $default = null) { + if ( empty($values) ) { + return $default; + } + + foreach ($values as $value) { + if ( !empty($value) ) { + return $value; + } + } + + return $default; + } + + /** + * Check if the input string starts with the specified prefix. + * + * @param string $input + * @param string $prefix + * @return bool + */ + public static function startsWith($input, $prefix) { + $length = strlen($prefix); + return (substr($input, 0, $length) === $prefix); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/Api.php b/app/core/puc/Puc/v4p11/Vcs/Api.php new file mode 100755 index 0000000..251c675 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/Api.php @@ -0,0 +1,302 @@ +repositoryUrl = $repositoryUrl; + $this->setAuthentication($credentials); + } + + /** + * @return string + */ + public function getRepositoryUrl() { + return $this->repositoryUrl; + } + + /** + * Figure out which reference (i.e tag or branch) contains the latest version. + * + * @param string $configBranch Start looking in this branch. + * @return null|Puc_v4p11_Vcs_Reference + */ + abstract public function chooseReference($configBranch); + + /** + * Get the readme.txt file from the remote repository and parse it + * according to the plugin readme standard. + * + * @param string $ref Tag or branch name. + * @return array Parsed readme. + */ + public function getRemoteReadme($ref = 'master') { + $fileContents = $this->getRemoteFile($this->getLocalReadmeName(), $ref); + if ( empty($fileContents) ) { + return []; + } + + $parser = new PucReadmeParser(); + return $parser->parse_readme_contents($fileContents); + } + + /** + * Get the case-sensitive name of the local readme.txt file. + * + * In most cases it should just be called "readme.txt", but some plugins call it "README.txt", + * "README.TXT", or even "Readme.txt". Most VCS are case-sensitive so we need to know the correct + * capitalization. + * + * Defaults to "readme.txt" (all lowercase). + * + * @return string + */ + public function getLocalReadmeName() { + static $fileName = null; + if ( $fileName !== null ) { + return $fileName; + } + + $fileName = 'readme.txt'; + if ( isset($this->localDirectory) ) { + $files = scandir($this->localDirectory); + if ( !empty($files) ) { + foreach ($files as $possibleFileName) { + if ( strcasecmp($possibleFileName, 'readme.txt') === 0 ) { + $fileName = $possibleFileName; + break; + } + } + } + } + return $fileName; + } + + /** + * Get a branch. + * + * @param string $branchName + * @return Puc_v4p11_Vcs_Reference|null + */ + abstract public function getBranch($branchName); + + /** + * Get a specific tag. + * + * @param string $tagName + * @return Puc_v4p11_Vcs_Reference|null + */ + abstract public function getTag($tagName); + + /** + * Get the tag that looks like the highest version number. + * (Implementations should skip pre-release versions if possible.) + * + * @return Puc_v4p11_Vcs_Reference|null + */ + abstract public function getLatestTag(); + + /** + * Check if a tag name string looks like a version number. + * + * @param string $name + * @return bool + */ + protected function looksLikeVersion($name) { + //Tag names may be prefixed with "v", e.g. "v1.2.3". + $name = ltrim($name, 'v'); + + //The version string must start with a number. + if ( !is_numeric(substr($name, 0, 1)) ) { + return false; + } + + //The goal is to accept any SemVer-compatible or "PHP-standardized" version number. + return (preg_match('@^(\d{1,5}?)(\.\d{1,10}?){0,4}?($|[abrdp+_\-]|\s)@i', $name) === 1); + } + + /** + * Check if a tag appears to be named like a version number. + * + * @param stdClass $tag + * @return bool + */ + protected function isVersionTag($tag) { + $property = $this->tagNameProperty; + return isset($tag->$property) && $this->looksLikeVersion($tag->$property); + } + + /** + * Sort a list of tags as if they were version numbers. + * Tags that don't look like version number will be removed. + * + * @param stdClass[] $tags Array of tag objects. + * @return stdClass[] Filtered array of tags sorted in descending order. + */ + protected function sortTagsByVersion($tags) { + //Keep only those tags that look like version numbers. + $versionTags = array_filter($tags, array($this, 'isVersionTag')); + //Sort them in descending order. + usort($versionTags, array($this, 'compareTagNames')); + + return $versionTags; + } + + /** + * Compare two tags as if they were version number. + * + * @param stdClass $tag1 Tag object. + * @param stdClass $tag2 Another tag object. + * @return int + */ + protected function compareTagNames($tag1, $tag2) { + $property = $this->tagNameProperty; + if ( !isset($tag1->$property) ) { + return 1; + } + if ( !isset($tag2->$property) ) { + return -1; + } + return -version_compare(ltrim($tag1->$property, 'v'), ltrim($tag2->$property, 'v')); + } + + /** + * Get the contents of a file from a specific branch or tag. + * + * @param string $path File name. + * @param string $ref + * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. + */ + abstract public function getRemoteFile($path, $ref = 'master'); + + /** + * Get the timestamp of the latest commit that changed the specified branch or tag. + * + * @param string $ref Reference name (e.g. branch or tag). + * @return string|null + */ + abstract public function getLatestCommitTime($ref); + + /** + * Get the contents of the changelog file from the repository. + * + * @param string $ref + * @param string $localDirectory Full path to the local plugin or theme directory. + * @return null|string The HTML contents of the changelog. + */ + public function getRemoteChangelog($ref, $localDirectory) { + $filename = $this->findChangelogName($localDirectory); + if ( empty($filename) ) { + return null; + } + + $changelog = $this->getRemoteFile($filename, $ref); + if ( $changelog === null ) { + return null; + } + + /** @noinspection PhpUndefinedClassInspection */ + return Parsedown::instance()->text($changelog); + } + + /** + * Guess the name of the changelog file. + * + * @param string $directory + * @return string|null + */ + protected function findChangelogName($directory = null) { + if ( !isset($directory) ) { + $directory = $this->localDirectory; + } + if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { + return null; + } + + $possibleNames = array('CHANGES.md', 'CHANGELOG.md', 'changes.md', 'changelog.md'); + $files = scandir($directory); + $foundNames = array_intersect($possibleNames, $files); + + if ( !empty($foundNames) ) { + return reset($foundNames); + } + return null; + } + + /** + * Set authentication credentials. + * + * @param $credentials + */ + public function setAuthentication($credentials) { + $this->credentials = $credentials; + } + + public function isAuthenticationEnabled() { + return !empty($this->credentials); + } + + /** + * @param string $url + * @return string + */ + public function signDownloadUrl($url) { + return $url; + } + + /** + * @param string $filterName + */ + public function setHttpFilterName($filterName) { + $this->httpFilterName = $filterName; + } + + /** + * @param string $directory + */ + public function setLocalDirectory($directory) { + if ( empty($directory) || !is_dir($directory) || ($directory === '.') ) { + $this->localDirectory = null; + } else { + $this->localDirectory = $directory; + } + } + + /** + * @param string $slug + */ + public function setSlug($slug) { + $this->slug = $slug; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/BaseChecker.php b/app/core/puc/Puc/v4p11/Vcs/BaseChecker.php new file mode 100755 index 0000000..6cf5211 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/BaseChecker.php @@ -0,0 +1,27 @@ +[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { + $this->username = $matches['username']; + $this->repository = $matches['repository']; + } else { + throw new InvalidArgumentException('Invalid BitBucket repository URL: "' . $repositoryUrl . '"'); + } + + parent::__construct($repositoryUrl, $credentials); + } + + /** + * Figure out which reference (i.e tag or branch) contains the latest version. + * + * @param string $configBranch Start looking in this branch. + * @return null|Puc_v4p11_Vcs_Reference + */ + public function chooseReference($configBranch) { + $updateSource = null; + + //Check if there's a "Stable tag: 1.2.3" header that points to a valid tag. + $updateSource = $this->getStableTag($configBranch); + + //Look for version-like tags. + if ( !$updateSource && ($configBranch === 'master' || $configBranch === 'main') ) { + $updateSource = $this->getLatestTag(); + } + //If all else fails, use the specified branch itself. + if ( !$updateSource ) { + $updateSource = $this->getBranch($configBranch); + } + + return $updateSource; + } + + public function getBranch($branchName) { + $branch = $this->api('/refs/branches/' . $branchName); + if ( is_wp_error($branch) || empty($branch) ) { + return null; + } + + //The "/src/{stuff}/{path}" endpoint doesn't seem to handle branch names that contain slashes. + //If we don't encode the slash, we get a 404. If we encode it as "%2F", we get a 401. + //To avoid issues, if the branch name is not URL-safe, let's use the commit hash instead. + $ref = $branch->name; + if ((urlencode($ref) !== $ref) && isset($branch->target->hash)) { + $ref = $branch->target->hash; + } + + return new Puc_v4p11_Vcs_Reference(array( + 'name' => $ref, + 'updated' => $branch->target->date, + 'downloadUrl' => $this->getDownloadUrl($branch->name), + )); + } + + /** + * Get a specific tag. + * + * @param string $tagName + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getTag($tagName) { + $tag = $this->api('/refs/tags/' . $tagName); + if ( is_wp_error($tag) || empty($tag) ) { + return null; + } + + return new Puc_v4p11_Vcs_Reference(array( + 'name' => $tag->name, + 'version' => ltrim($tag->name, 'v'), + 'updated' => $tag->target->date, + 'downloadUrl' => $this->getDownloadUrl($tag->name), + )); + } + + /** + * Get the tag that looks like the highest version number. + * + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getLatestTag() { + $tags = $this->api('/refs/tags?sort=-target.date'); + if ( !isset($tags, $tags->values) || !is_array($tags->values) ) { + return null; + } + + //Filter and sort the list of tags. + $versionTags = $this->sortTagsByVersion($tags->values); + + //Return the first result. + if ( !empty($versionTags) ) { + $tag = $versionTags[0]; + return new Puc_v4p11_Vcs_Reference(array( + 'name' => $tag->name, + 'version' => ltrim($tag->name, 'v'), + 'updated' => $tag->target->date, + 'downloadUrl' => $this->getDownloadUrl($tag->name), + )); + } + return null; + } + + /** + * Get the tag/ref specified by the "Stable tag" header in the readme.txt of a given branch. + * + * @param string $branch + * @return null|Puc_v4p11_Vcs_Reference + */ + protected function getStableTag($branch) { + $remoteReadme = $this->getRemoteReadme($branch); + if ( !empty($remoteReadme['stable_tag']) ) { + $tag = $remoteReadme['stable_tag']; + + //You can explicitly opt out of using tags by setting "Stable tag" to + //"trunk" or the name of the current branch. + if ( ($tag === $branch) || ($tag === 'trunk') ) { + return $this->getBranch($branch); + } + + return $this->getTag($tag); + } + + return null; + } + + /** + * @param string $ref + * @return string + */ + protected function getDownloadUrl($ref) { + return sprintf( + 'https://bitbucket.org/%s/%s/get/%s.zip', + $this->username, + $this->repository, + $ref + ); + } + + /** + * Get the contents of a file from a specific branch or tag. + * + * @param string $path File name. + * @param string $ref + * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. + */ + public function getRemoteFile($path, $ref = 'master') { + $response = $this->api('src/' . $ref . '/' . ltrim($path)); + if ( is_wp_error($response) || !is_string($response) ) { + return null; + } + return $response; + } + + /** + * Get the timestamp of the latest commit that changed the specified branch or tag. + * + * @param string $ref Reference name (e.g. branch or tag). + * @return string|null + */ + public function getLatestCommitTime($ref) { + $response = $this->api('commits/' . $ref); + if ( isset($response->values, $response->values[0], $response->values[0]->date) ) { + return $response->values[0]->date; + } + return null; + } + + /** + * Perform a BitBucket API 2.0 request. + * + * @param string $url + * @param string $version + * @return mixed|WP_Error + */ + public function api($url, $version = '2.0') { + $url = ltrim($url, '/'); + $isSrcResource = Puc_v4p11_Utils::startsWith($url, 'src/'); + + $url = implode('/', array( + 'https://api.bitbucket.org', + $version, + 'repositories', + $this->username, + $this->repository, + $url + )); + $baseUrl = $url; + + if ( $this->oauth ) { + $url = $this->oauth->sign($url,'GET'); + } + + $options = array('timeout' => 10); + if ( !empty($this->httpFilterName) ) { + $options = apply_filters($this->httpFilterName, $options); + } + $response = wp_remote_get($url, $options); + if ( is_wp_error($response) ) { + do_action('puc_api_error', $response, null, $url, $this->slug); + return $response; + } + + $code = wp_remote_retrieve_response_code($response); + $body = wp_remote_retrieve_body($response); + if ( $code === 200 ) { + if ( $isSrcResource ) { + //Most responses are JSON-encoded, but src resources just + //return raw file contents. + $document = $body; + } else { + $document = json_decode($body); + } + return $document; + } + + $error = new WP_Error( + 'puc-bitbucket-http-error', + sprintf('BitBucket API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) + ); + do_action('puc_api_error', $error, $response, $url, $this->slug); + + return $error; + } + + /** + * @param array $credentials + */ + public function setAuthentication($credentials) { + parent::setAuthentication($credentials); + + if ( !empty($credentials) && !empty($credentials['consumer_key']) ) { + $this->oauth = new Puc_v4p11_OAuthSignature( + $credentials['consumer_key'], + $credentials['consumer_secret'] + ); + } else { + $this->oauth = null; + } + } + + public function signDownloadUrl($url) { + //Add authentication data to download URLs. Since OAuth signatures incorporate + //timestamps, we have to do this immediately before inserting the update. Otherwise + //authentication could fail due to a stale timestamp. + if ( $this->oauth ) { + $url = $this->oauth->sign($url); + } + return $url; + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/GitHubApi.php b/app/core/puc/Puc/v4p11/Vcs/GitHubApi.php new file mode 100755 index 0000000..310a746 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/GitHubApi.php @@ -0,0 +1,441 @@ +[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { + $this->userName = $matches['username']; + $this->repositoryName = $matches['repository']; + } else { + throw new InvalidArgumentException('Invalid GitHub repository URL: "' . $repositoryUrl . '"'); + } + + parent::__construct($repositoryUrl, $accessToken); + } + + /** + * Get the latest release from GitHub. + * + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getLatestRelease() { + $release = $this->api('/repos/:user/:repo/releases/latest'); + if ( is_wp_error($release) || !is_object($release) || !isset($release->tag_name) ) { + return null; + } + + $reference = new Puc_v4p11_Vcs_Reference(array( + 'name' => $release->tag_name, + 'version' => ltrim($release->tag_name, 'v'), //Remove the "v" prefix from "v1.2.3". + 'downloadUrl' => $release->zipball_url, + 'updated' => $release->created_at, + 'apiResponse' => $release, + )); + + if ( isset($release->assets[0]) ) { + $reference->downloadCount = $release->assets[0]->download_count; + } + + if ( $this->releaseAssetsEnabled && isset($release->assets, $release->assets[0]) ) { + //Use the first release asset that matches the specified regular expression. + $matchingAssets = array_filter($release->assets, array($this, 'matchesAssetFilter')); + if ( !empty($matchingAssets) ) { + if ( $this->isAuthenticationEnabled() ) { + /** + * Keep in mind that we'll need to add an "Accept" header to download this asset. + * + * @see setUpdateDownloadHeaders() + */ + $reference->downloadUrl = $matchingAssets[0]->url; + } else { + //It seems that browser_download_url only works for public repositories. + //Using an access_token doesn't help. Maybe OAuth would work? + $reference->downloadUrl = $matchingAssets[0]->browser_download_url; + } + + $reference->downloadCount = $matchingAssets[0]->download_count; + } + } + + if ( !empty($release->body) ) { + /** @noinspection PhpUndefinedClassInspection */ + $reference->changelog = Parsedown::instance()->text($release->body); + } + + return $reference; + } + + /** + * Get the tag that looks like the highest version number. + * + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getLatestTag() { + $tags = $this->api('/repos/:user/:repo/tags'); + + if ( is_wp_error($tags) || !is_array($tags) ) { + return null; + } + + $versionTags = $this->sortTagsByVersion($tags); + if ( empty($versionTags) ) { + return null; + } + + $tag = $versionTags[0]; + return new Puc_v4p11_Vcs_Reference(array( + 'name' => $tag->name, + 'version' => ltrim($tag->name, 'v'), + 'downloadUrl' => $tag->zipball_url, + 'apiResponse' => $tag, + )); + } + + /** + * Get a branch by name. + * + * @param string $branchName + * @return null|Puc_v4p11_Vcs_Reference + */ + public function getBranch($branchName) { + $branch = $this->api('/repos/:user/:repo/branches/' . $branchName); + if ( is_wp_error($branch) || empty($branch) ) { + return null; + } + + $reference = new Puc_v4p11_Vcs_Reference(array( + 'name' => $branch->name, + 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), + 'apiResponse' => $branch, + )); + + if ( isset($branch->commit, $branch->commit->commit, $branch->commit->commit->author->date) ) { + $reference->updated = $branch->commit->commit->author->date; + } + + return $reference; + } + + /** + * Get the latest commit that changed the specified file. + * + * @param string $filename + * @param string $ref Reference name (e.g. branch or tag). + * @return StdClass|null + */ + public function getLatestCommit($filename, $ref = 'master') { + $commits = $this->api( + '/repos/:user/:repo/commits', + array( + 'path' => $filename, + 'sha' => $ref, + ) + ); + if ( !is_wp_error($commits) && isset($commits[0]) ) { + return $commits[0]; + } + return null; + } + + /** + * Get the timestamp of the latest commit that changed the specified branch or tag. + * + * @param string $ref Reference name (e.g. branch or tag). + * @return string|null + */ + public function getLatestCommitTime($ref) { + $commits = $this->api('/repos/:user/:repo/commits', array('sha' => $ref)); + if ( !is_wp_error($commits) && isset($commits[0]) ) { + return $commits[0]->commit->author->date; + } + return null; + } + + /** + * Perform a GitHub API request. + * + * @param string $url + * @param array $queryParams + * @return mixed|WP_Error + */ + protected function api($url, $queryParams = array()) { + $baseUrl = $url; + $url = $this->buildApiUrl($url, $queryParams); + + $options = array('timeout' => 10); + if ( $this->isAuthenticationEnabled() ) { + $options['headers'] = array('Authorization' => $this->getAuthorizationHeader()); + } + + if ( !empty($this->httpFilterName) ) { + $options = apply_filters($this->httpFilterName, $options); + } + $response = wp_remote_get($url, $options); + if ( is_wp_error($response) ) { + do_action('puc_api_error', $response, null, $url, $this->slug); + return $response; + } + + $code = wp_remote_retrieve_response_code($response); + $body = wp_remote_retrieve_body($response); + if ( $code === 200 ) { + $document = json_decode($body); + return $document; + } + + $error = new WP_Error( + 'puc-github-http-error', + sprintf('GitHub API error. Base URL: "%s", HTTP status code: %d.', $baseUrl, $code) + ); + do_action('puc_api_error', $error, $response, $url, $this->slug); + + return $error; + } + + /** + * Build a fully qualified URL for an API request. + * + * @param string $url + * @param array $queryParams + * @return string + */ + protected function buildApiUrl($url, $queryParams) { + $variables = array( + 'user' => $this->userName, + 'repo' => $this->repositoryName, + ); + foreach ($variables as $name => $value) { + $url = str_replace('/:' . $name, '/' . urlencode($value), $url); + } + $url = 'https://api.github.com' . $url; + + if ( !empty($queryParams) ) { + $url = add_query_arg($queryParams, $url); + } + + return $url; + } + + /** + * Get the contents of a file from a specific branch or tag. + * + * @param string $path File name. + * @param string $ref + * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. + */ + public function getRemoteFile($path, $ref = 'master') { + $apiUrl = '/repos/:user/:repo/contents/' . $path; + $response = $this->api($apiUrl, array('ref' => $ref)); + + if ( is_wp_error($response) || !isset($response->content) || ($response->encoding !== 'base64') ) { + return null; + } + return base64_decode($response->content); + } + + /** + * Generate a URL to download a ZIP archive of the specified branch/tag/etc. + * + * @param string $ref + * @return string + */ + public function buildArchiveDownloadUrl($ref = 'master') { + $url = sprintf( + 'https://api.github.com/repos/%1$s/%2$s/zipball/%3$s', + urlencode($this->userName), + urlencode($this->repositoryName), + urlencode($ref) + ); + return $url; + } + + /** + * Get a specific tag. + * + * @param string $tagName + * @return void + */ + public function getTag($tagName) { + //The current GitHub update checker doesn't use getTag, so I didn't bother to implement it. + throw new LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); + } + + public function setAuthentication($credentials) { + parent::setAuthentication($credentials); + $this->accessToken = is_string($credentials) ? $credentials : null; + + //Optimization: Instead of filtering all HTTP requests, let's do it only when + //WordPress is about to download an update. + add_filter('upgrader_pre_download', array($this, 'addHttpRequestFilter'), 10, 1); //WP 3.7+ + } + + /** + * Figure out which reference (i.e tag or branch) contains the latest version. + * + * @param string $configBranch Start looking in this branch. + * @return null|Puc_v4p11_Vcs_Reference + */ + public function chooseReference($configBranch) { + $updateSource = null; + + if ( $configBranch === 'master' ) { + //Use the latest release. + $updateSource = $this->getLatestRelease(); + if ( $updateSource === null ) { + //Failing that, use the tag with the highest version number. + $updateSource = $this->getLatestTag(); + } + } + //Alternatively, just use the branch itself. + if ( empty($updateSource) ) { + $updateSource = $this->getBranch($configBranch); + } + + return $updateSource; + } + + /** + * Enable updating via release assets. + * + * If the latest release contains no usable assets, the update checker + * will fall back to using the automatically generated ZIP archive. + * + * Private repositories will only work with WordPress 3.7 or later. + * + * @param string|null $fileNameRegex Optional. Use only those assets where the file name matches this regex. + */ + public function enableReleaseAssets($fileNameRegex = null) { + $this->releaseAssetsEnabled = true; + $this->assetFilterRegex = $fileNameRegex; + $this->assetApiBaseUrl = sprintf( + '//api.github.com/repos/%1$s/%2$s/releases/assets/', + $this->userName, + $this->repositoryName + ); + } + + /** + * Does this asset match the file name regex? + * + * @param stdClass $releaseAsset + * @return bool + */ + protected function matchesAssetFilter($releaseAsset) { + if ( $this->assetFilterRegex === null ) { + //The default is to accept all assets. + return true; + } + return isset($releaseAsset->name) && preg_match($this->assetFilterRegex, $releaseAsset->name); + } + + /** + * @internal + * @param bool $result + * @return bool + */ + public function addHttpRequestFilter($result) { + if ( !$this->downloadFilterAdded && $this->isAuthenticationEnabled() ) { + add_filter('http_request_args', array($this, 'setUpdateDownloadHeaders'), 10, 2); + add_action('requests-requests.before_redirect', array($this, 'removeAuthHeaderFromRedirects'), 10, 4); + $this->downloadFilterAdded = true; + } + return $result; + } + + /** + * Set the HTTP headers that are necessary to download updates from private repositories. + * + * See GitHub docs: + * @link https://developer.github.com/v3/repos/releases/#get-a-single-release-asset + * @link https://developer.github.com/v3/auth/#basic-authentication + * + * @internal + * @param array $requestArgs + * @param string $url + * @return array + */ + public function setUpdateDownloadHeaders($requestArgs, $url = '') { + //Is WordPress trying to download one of our release assets? + if ( $this->releaseAssetsEnabled && (strpos($url, $this->assetApiBaseUrl) !== false) ) { + $requestArgs['headers']['Accept'] = 'application/octet-stream'; + } + //Use Basic authentication, but only if the download is from our repository. + $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); + if ( $this->isAuthenticationEnabled() && (strpos($url, $repoApiBaseUrl)) === 0 ) { + $requestArgs['headers']['Authorization'] = $this->getAuthorizationHeader(); + } + return $requestArgs; + } + + /** + * When following a redirect, the Requests library will automatically forward + * the authorization header to other hosts. We don't want that because it breaks + * AWS downloads and can leak authorization information. + * + * @internal + * @param string $location + * @param array $headers + */ + public function removeAuthHeaderFromRedirects(&$location, &$headers) { + $repoApiBaseUrl = $this->buildApiUrl('/repos/:user/:repo/', array()); + if ( strpos($location, $repoApiBaseUrl) === 0 ) { + return; //This request is going to GitHub, so it's fine. + } + //Remove the header. + if ( isset($headers['Authorization']) ) { + unset($headers['Authorization']); + } + } + + /** + * Generate the value of the "Authorization" header. + * + * @return string + */ + protected function getAuthorizationHeader() { + return 'Basic ' . base64_encode($this->userName . ':' . $this->accessToken); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/GitLabApi.php b/app/core/puc/Puc/v4p11/Vcs/GitLabApi.php new file mode 100755 index 0000000..9835ae1 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/GitLabApi.php @@ -0,0 +1,399 @@ +repositoryHost = parse_url($repositoryUrl, PHP_URL_HOST) . $port; + + if ( $this->repositoryHost !== 'gitlab.com' ) { + $this->repositoryProtocol = parse_url($repositoryUrl, PHP_URL_SCHEME); + } + + //Find the repository information + $path = parse_url($repositoryUrl, PHP_URL_PATH); + if ( preg_match('@^/?(?P[^/]+?)/(?P[^/#?&]+?)/?$@', $path, $matches) ) { + $this->userName = $matches['username']; + $this->repositoryName = $matches['repository']; + } elseif ( ($this->repositoryHost === 'gitlab.com') ) { + //This is probably a repository in a subgroup, e.g. "/organization/category/repo". + $parts = explode('/', trim($path, '/')); + if ( count($parts) < 3 ) { + throw new InvalidArgumentException('Invalid GitLab.com repository URL: "' . $repositoryUrl . '"'); + } + $lastPart = array_pop($parts); + $this->userName = implode('/', $parts); + $this->repositoryName = $lastPart; + } else { + //There could be subgroups in the URL: gitlab.domain.com/group/subgroup/subgroup2/repository + if ( $subgroup !== null ) { + $path = str_replace(trailingslashit($subgroup), '', $path); + } + + //This is not a traditional url, it could be gitlab is in a deeper subdirectory. + //Get the path segments. + $segments = explode('/', untrailingslashit(ltrim($path, '/'))); + + //We need at least /user-name/repository-name/ + if ( count($segments) < 2 ) { + throw new InvalidArgumentException('Invalid GitLab repository URL: "' . $repositoryUrl . '"'); + } + + //Get the username and repository name. + $usernameRepo = array_splice($segments, -2, 2); + $this->userName = $usernameRepo[0]; + $this->repositoryName = $usernameRepo[1]; + + //Append the remaining segments to the host if there are segments left. + if ( count($segments) > 0 ) { + $this->repositoryHost = trailingslashit($this->repositoryHost) . implode('/', $segments); + } + + //Add subgroups to username. + if ( $subgroup !== null ) { + $this->userName = $usernameRepo[0] . '/' . untrailingslashit($subgroup); + } + } + + parent::__construct($repositoryUrl, $accessToken); + } + + /** + * Get the latest release from GitLab. + * + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getLatestRelease() { + $releases = $this->api('/:id/releases'); + if ( is_wp_error($releases) || empty($releases) || !is_array($releases) ) { + return null; + } + + foreach ($releases as $release) { + if ( true !== $release->upcoming_release ) { + break 1; //Break the loop on the first release we find that isn't an upcoming release + } + } + if ( is_wp_error($release) || !is_object($release) || !isset($release->tag_name) ) { + return null; + } + + $reference = new Puc_v4p11_Vcs_Reference(array( + 'name' => $release->tag_name, + 'version' => ltrim($release->tag_name, 'v'), //Remove the "v" prefix from "v1.2.3". + 'downloadUrl' => '', + 'updated' => $release->released_at, + 'apiResponse' => $release, + )); + $download_url = false; + + if ( $this->releasePackageEnabled && isset($release->assets, $release->assets->links) ) { + /** + * Use the first asset LINK that is a zip format file generated by a Gitlab Release Pipeline + * + * @link https://gist.github.com/timwiel/9dfd3526c768efad4973254085e065ce + */ + foreach ($release->assets->links as $link) { + if ( 'zip' === substr($link->url, -3) ) { + $download_url = $link->url; + break 1; + } + } + if ( empty( $download_url ) ) { + return null; + } + if ( ! empty( $this->accessToken ) ) { + $download_url = add_query_arg('private_token', $this->accessToken, $download_url); + } + $reference->downloadUrl = $download_url; + return $reference; + + } elseif ( isset($release->assets) ) { + /** + * Use the first asset SOURCE file that is a zip format from a Gitlab Release which should be a zip file + */ + foreach ($release->assets->sources as $source) { + if ( 'zip' === $source->format ) { + $download_url = $source->url; + break 1; + } + } + if ( empty( $download_url ) ) { + return null; + } + if ( ! empty( $this->accessToken ) ) { + $download_url = add_query_arg('private_token', $this->accessToken, $download_url); + } + $reference->downloadUrl = $download_url; + return $reference; + + } + + //If we get this far without a return then obviosuly noi release download urls were found + return null; + } + + /** + * Get the tag that looks like the highest version number. + * + * @return Puc_v4p11_Vcs_Reference|null + */ + public function getLatestTag() { + $tags = $this->api('/:id/repository/tags'); + if ( is_wp_error($tags) || empty($tags) || !is_array($tags) ) { + return null; + } + + $versionTags = $this->sortTagsByVersion($tags); + if ( empty($versionTags) ) { + return null; + } + + $tag = $versionTags[0]; + return new Puc_v4p11_Vcs_Reference(array( + 'name' => $tag->name, + 'version' => ltrim($tag->name, 'v'), + 'downloadUrl' => $this->buildArchiveDownloadUrl($tag->name), + 'apiResponse' => $tag, + )); + } + + /** + * Get a branch by name. + * + * @param string $branchName + * @return null|Puc_v4p11_Vcs_Reference + */ + public function getBranch($branchName) { + $branch = $this->api('/:id/repository/branches/' . $branchName); + if ( is_wp_error($branch) || empty($branch) ) { + return null; + } + + $reference = new Puc_v4p11_Vcs_Reference(array( + 'name' => $branch->name, + 'downloadUrl' => $this->buildArchiveDownloadUrl($branch->name), + 'apiResponse' => $branch, + )); + + if ( isset($branch->commit, $branch->commit->committed_date) ) { + $reference->updated = $branch->commit->committed_date; + } + + return $reference; + } + + /** + * Get the timestamp of the latest commit that changed the specified branch or tag. + * + * @param string $ref Reference name (e.g. branch or tag). + * @return string|null + */ + public function getLatestCommitTime($ref) { + $commits = $this->api('/:id/repository/commits/', array('ref_name' => $ref)); + if ( is_wp_error($commits) || !is_array($commits) || !isset($commits[0]) ) { + return null; + } + + return $commits[0]->committed_date; + } + + /** + * Perform a GitLab API request. + * + * @param string $url + * @param array $queryParams + * @return mixed|WP_Error + */ + protected function api($url, $queryParams = array()) { + $baseUrl = $url; + $url = $this->buildApiUrl($url, $queryParams); + + $options = array('timeout' => 10); + if ( !empty($this->httpFilterName) ) { + $options = apply_filters($this->httpFilterName, $options); + } + + $response = wp_remote_get($url, $options); + if ( is_wp_error($response) ) { + do_action('puc_api_error', $response, null, $url, $this->slug); + return $response; + } + + $code = wp_remote_retrieve_response_code($response); + $body = wp_remote_retrieve_body($response); + if ( $code === 200 ) { + return json_decode($body); + } + + $error = new WP_Error( + 'puc-gitlab-http-error', + sprintf('GitLab API error. URL: "%s", HTTP status code: %d.', $baseUrl, $code) + ); + do_action('puc_api_error', $error, $response, $url, $this->slug); + + return $error; + } + + /** + * Build a fully qualified URL for an API request. + * + * @param string $url + * @param array $queryParams + * @return string + */ + protected function buildApiUrl($url, $queryParams) { + $variables = array( + 'user' => $this->userName, + 'repo' => $this->repositoryName, + 'id' => $this->userName . '/' . $this->repositoryName, + ); + + foreach ($variables as $name => $value) { + $url = str_replace("/:{$name}", '/' . urlencode($value), $url); + } + + $url = substr($url, 1); + $url = sprintf('%1$s://%2$s/api/v4/projects/%3$s', $this->repositoryProtocol, $this->repositoryHost, $url); + + if ( !empty($this->accessToken) ) { + $queryParams['private_token'] = $this->accessToken; + } + + if ( !empty($queryParams) ) { + $url = add_query_arg($queryParams, $url); + } + + return $url; + } + + /** + * Get the contents of a file from a specific branch or tag. + * + * @param string $path File name. + * @param string $ref + * @return null|string Either the contents of the file, or null if the file doesn't exist or there's an error. + */ + public function getRemoteFile($path, $ref = 'master') { + $response = $this->api('/:id/repository/files/' . $path, array('ref' => $ref)); + if ( is_wp_error($response) || !isset($response->content) || $response->encoding !== 'base64' ) { + return null; + } + + return base64_decode($response->content); + } + + /** + * Generate a URL to download a ZIP archive of the specified branch/tag/etc. + * + * @param string $ref + * @return string + */ + public function buildArchiveDownloadUrl($ref = 'master') { + $url = sprintf( + '%1$s://%2$s/api/v4/projects/%3$s/repository/archive.zip', + $this->repositoryProtocol, + $this->repositoryHost, + urlencode($this->userName . '/' . $this->repositoryName) + ); + $url = add_query_arg('sha', urlencode($ref), $url); + + if ( !empty($this->accessToken) ) { + $url = add_query_arg('private_token', $this->accessToken, $url); + } + + return $url; + } + + /** + * Get a specific tag. + * + * @param string $tagName + * @return void + */ + public function getTag($tagName) { + throw new LogicException('The ' . __METHOD__ . ' method is not implemented and should not be used.'); + } + + /** + * Figure out which reference (i.e tag or branch) contains the latest version. + * + * @param string $configBranch Start looking in this branch. + * @return null|Puc_v4p11_Vcs_Reference + */ + public function chooseReference($configBranch) { + + if ( $configBranch === 'main' || $configBranch === 'master' ) { + //Use the latest release. + $updateSource = $this->getLatestRelease(); + if ( $updateSource === null ) { + //Failing that, use the tag with the highest version number. + $updateSource = $this->getLatestTag(); + } + } + //Alternatively, just use the branch itself. + if ( empty($updateSource) ) { + $updateSource = $this->getBranch($configBranch); + } + + return $updateSource; + } + + public function setAuthentication($credentials) { + parent::setAuthentication($credentials); + $this->accessToken = is_string($credentials) ? $credentials : null; + } + + public function enableReleaseAssets() { + $this->releaseAssetsEnabled = true; + $this->releasePackageEnabled = false; + } + + public function enableReleasePackages() { + $this->releaseAssetsEnabled = false; + $this->releasePackageEnabled = true; + } + + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/PluginUpdateChecker.php b/app/core/puc/Puc/v4p11/Vcs/PluginUpdateChecker.php new file mode 100755 index 0000000..a5a0c97 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/PluginUpdateChecker.php @@ -0,0 +1,293 @@ +api = $api; + $this->api->setHttpFilterName($this->getUniqueName('request_info_options')); + + parent::__construct($api->getRepositoryUrl(), $pluginFile, $slug, $checkPeriod, $optionName, $muPluginFile); + + $this->api->setSlug($this->slug); + } + + public function requestInfo($unusedParameter = null) { + //We have to make several remote API requests to gather all the necessary info + //which can take a while on slow networks. + if ( function_exists('set_time_limit') ) { + @set_time_limit(60); + } + + $api = $this->api; + $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); + + $info = new Puc_v4p11_Plugin_Info(); + $info->filename = $this->pluginFile; + $info->slug = $this->slug; + + $this->setInfoFromHeader($this->package->getPluginHeader(), $info); + $this->setIconsFromLocalAssets($info); + $this->setBannersFromLocalAssets($info); + + //Pick a branch or tag. + $updateSource = $api->chooseReference($this->branch); + if ( $updateSource ) { + $ref = $updateSource->name; + $info->version = $updateSource->version; + $info->last_updated = $updateSource->updated; + $info->download_url = $updateSource->downloadUrl; + + if ( !empty($updateSource->changelog) ) { + $info->sections['changelog'] = $updateSource->changelog; + } + if ( isset($updateSource->downloadCount) ) { + $info->downloaded = $updateSource->downloadCount; + } + } else { + //There's probably a network problem or an authentication error. + do_action( + 'puc_api_error', + new WP_Error( + 'puc-no-update-source', + 'Could not retrieve version information from the repository. ' + . 'This usually means that the update checker either can\'t connect ' + . 'to the repository or it\'s configured incorrectly.' + ), + null, null, $this->slug + ); + return null; + } + + //Get headers from the main plugin file in this branch/tag. Its "Version" header and other metadata + //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. + $mainPluginFile = basename($this->pluginFile); + $remotePlugin = $api->getRemoteFile($mainPluginFile, $ref); + if ( !empty($remotePlugin) ) { + $remoteHeader = $this->package->getFileHeader($remotePlugin); + $this->setInfoFromHeader($remoteHeader, $info); + } + + //Try parsing readme.txt. If it's formatted according to WordPress.org standards, it will contain + //a lot of useful information like the required/tested WP version, changelog, and so on. + if ( $this->readmeTxtExistsLocally() ) { + $this->setInfoFromRemoteReadme($ref, $info); + } + + //The changelog might be in a separate file. + if ( empty($info->sections['changelog']) ) { + $info->sections['changelog'] = $api->getRemoteChangelog($ref, $this->package->getAbsoluteDirectoryPath()); + if ( empty($info->sections['changelog']) ) { + $info->sections['changelog'] = esc_html__('There is no changelog available.', 'plugin-update-checker'); + } + } + + if ( empty($info->last_updated) ) { + //Fetch the latest commit that changed the tag or branch and use it as the "last_updated" date. + $latestCommitTime = $api->getLatestCommitTime($ref); + if ( $latestCommitTime !== null ) { + $info->last_updated = $latestCommitTime; + } + } + + $info = apply_filters($this->getUniqueName('request_info_result'), $info, null); + return $info; + } + + /** + * Check if the currently installed version has a readme.txt file. + * + * @return bool + */ + protected function readmeTxtExistsLocally() { + return $this->package->fileExists($this->api->getLocalReadmeName()); + } + + /** + * Copy plugin metadata from a file header to a Plugin Info object. + * + * @param array $fileHeader + * @param Puc_v4p11_Plugin_Info $pluginInfo + */ + protected function setInfoFromHeader($fileHeader, $pluginInfo) { + $headerToPropertyMap = array( + 'Version' => 'version', + 'Name' => 'name', + 'PluginURI' => 'homepage', + 'Author' => 'author', + 'AuthorName' => 'author', + 'AuthorURI' => 'author_homepage', + + 'Requires WP' => 'requires', + 'Tested WP' => 'tested', + 'Requires at least' => 'requires', + 'Tested up to' => 'tested', + + 'Requires PHP' => 'requires_php', + ); + foreach ($headerToPropertyMap as $headerName => $property) { + if ( isset($fileHeader[$headerName]) && !empty($fileHeader[$headerName]) ) { + $pluginInfo->$property = $fileHeader[$headerName]; + } + } + + if ( !empty($fileHeader['Description']) ) { + $pluginInfo->sections['description'] = $fileHeader['Description']; + } + } + + /** + * Copy plugin metadata from the remote readme.txt file. + * + * @param string $ref GitHub tag or branch where to look for the readme. + * @param Puc_v4p11_Plugin_Info $pluginInfo + */ + protected function setInfoFromRemoteReadme($ref, $pluginInfo) { + $readme = $this->api->getRemoteReadme($ref); + if ( empty($readme) ) { + return; + } + + if ( isset($readme['sections']) ) { + $pluginInfo->sections = array_merge($pluginInfo->sections, $readme['sections']); + } + if ( !empty($readme['tested_up_to']) ) { + $pluginInfo->tested = $readme['tested_up_to']; + } + if ( !empty($readme['requires_at_least']) ) { + $pluginInfo->requires = $readme['requires_at_least']; + } + if ( !empty($readme['requires_php']) ) { + $pluginInfo->requires_php = $readme['requires_php']; + } + + if ( isset($readme['upgrade_notice'], $readme['upgrade_notice'][$pluginInfo->version]) ) { + $pluginInfo->upgrade_notice = $readme['upgrade_notice'][$pluginInfo->version]; + } + } + + /** + * Add icons from the currently installed version to a Plugin Info object. + * + * The icons should be in a subdirectory named "assets". Supported image formats + * and file names are described here: + * @link https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-icons + * + * @param Puc_v4p11_Plugin_Info $pluginInfo + */ + protected function setIconsFromLocalAssets($pluginInfo) { + $icons = $this->getLocalAssetUrls(array( + 'icon.svg' => 'svg', + 'icon-256x256.png' => '2x', + 'icon-256x256.jpg' => '2x', + 'icon-128x128.png' => '1x', + 'icon-128x128.jpg' => '1x', + )); + + if ( !empty($icons) ) { + //The "default" key seems to be used only as last-resort fallback in WP core (5.8/5.9), + //but we'll set it anyway in case some code somewhere needs it. + reset($icons); + $firstKey = key($icons); + $icons['default'] = $icons[$firstKey]; + + $pluginInfo->icons = $icons; + } + } + + /** + * Add banners from the currently installed version to a Plugin Info object. + * + * The banners should be in a subdirectory named "assets". Supported image formats + * and file names are described here: + * @link https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/#plugin-headers + * + * @param Puc_v4p11_Plugin_Info $pluginInfo + */ + protected function setBannersFromLocalAssets($pluginInfo) { + $banners = $this->getLocalAssetUrls(array( + 'banner-772x250.png' => 'high', + 'banner-772x250.jpg' => 'high', + 'banner-1544x500.png' => 'low', + 'banner-1544x500.jpg' => 'low', + )); + + if ( !empty($banners) ) { + $pluginInfo->banners = $banners; + } + } + + /** + * @param array $filesToKeys + * @return array + */ + protected function getLocalAssetUrls($filesToKeys) { + $assetDirectory = $this->package->getAbsoluteDirectoryPath() . DIRECTORY_SEPARATOR . 'assets'; + if ( !is_dir($assetDirectory) ) { + return []; + } + $assetBaseUrl = trailingslashit(plugins_url('', $assetDirectory . '/imaginary.file')); + + $foundAssets = []; + foreach ($filesToKeys as $fileName => $key) { + $fullBannerPath = $assetDirectory . DIRECTORY_SEPARATOR . $fileName; + if ( !isset($icons[$key]) && is_file($fullBannerPath) ) { + $foundAssets[$key] = $assetBaseUrl . $fileName; + } + } + + return $foundAssets; + } + + public function setBranch($branch) { + $this->branch = $branch; + return $this; + } + + public function setAuthentication($credentials) { + $this->api->setAuthentication($credentials); + return $this; + } + + public function getVcsApi() { + return $this->api; + } + + public function getUpdate() { + $update = parent::getUpdate(); + + if ( isset($update) && !empty($update->download_url) ) { + $update->download_url = $this->api->signDownloadUrl($update->download_url); + } + + return $update; + } + + public function onDisplayConfiguration($panel) { + parent::onDisplayConfiguration($panel); + $panel->row('Branch', $this->branch); + $panel->row('Authentication enabled', $this->api->isAuthenticationEnabled() ? 'Yes' : 'No'); + $panel->row('API client', get_class($this->api)); + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/Reference.php b/app/core/puc/Puc/v4p11/Vcs/Reference.php new file mode 100755 index 0000000..2270994 --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/Reference.php @@ -0,0 +1,49 @@ +properties = $properties; + } + + /** + * @param string $name + * @return mixed|null + */ + public function __get($name) { + return array_key_exists($name, $this->properties) ? $this->properties[$name] : null; + } + + /** + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) { + $this->properties[$name] = $value; + } + + /** + * @param string $name + * @return bool + */ + public function __isset($name) { + return isset($this->properties[$name]); + } + + } + +endif; diff --git a/app/core/puc/Puc/v4p11/Vcs/ThemeUpdateChecker.php b/app/core/puc/Puc/v4p11/Vcs/ThemeUpdateChecker.php new file mode 100755 index 0000000..9c2fa4f --- /dev/null +++ b/app/core/puc/Puc/v4p11/Vcs/ThemeUpdateChecker.php @@ -0,0 +1,118 @@ +api = $api; + $this->api->setHttpFilterName($this->getUniqueName('request_update_options')); + + parent::__construct($api->getRepositoryUrl(), $stylesheet, $customSlug, $checkPeriod, $optionName); + + $this->api->setSlug($this->slug); + } + + public function requestUpdate() { + $api = $this->api; + $api->setLocalDirectory($this->package->getAbsoluteDirectoryPath()); + + $update = new Puc_v4p11_Theme_Update(); + $update->slug = $this->slug; + + //Figure out which reference (tag or branch) we'll use to get the latest version of the theme. + $updateSource = $api->chooseReference($this->branch); + if ( $updateSource ) { + $ref = $updateSource->name; + $update->download_url = $updateSource->downloadUrl; + } else { + do_action( + 'puc_api_error', + new WP_Error( + 'puc-no-update-source', + 'Could not retrieve version information from the repository. ' + . 'This usually means that the update checker either can\'t connect ' + . 'to the repository or it\'s configured incorrectly.' + ), + null, null, $this->slug + ); + $ref = $this->branch; + } + + //Get headers from the main stylesheet in this branch/tag. Its "Version" header and other metadata + //are what the WordPress install will actually see after upgrading, so they take precedence over releases/tags. + $remoteHeader = $this->package->getFileHeader($api->getRemoteFile('style.css', $ref)); + $update->version = Puc_v4p11_Utils::findNotEmpty(array( + $remoteHeader['Version'], + Puc_v4p11_Utils::get($updateSource, 'version'), + )); + + //The details URL defaults to the Theme URI header or the repository URL. + $update->details_url = Puc_v4p11_Utils::findNotEmpty(array( + $remoteHeader['ThemeURI'], + $this->package->getHeaderValue('ThemeURI'), + $this->metadataUrl, + )); + + if ( empty($update->version) ) { + //It looks like we didn't find a valid update after all. + $update = null; + } + + $update = $this->filterUpdateResult($update); + return $update; + } + + //FIXME: This is duplicated code. Both theme and plugin subclasses that use VCS share these methods. + + public function setBranch($branch) { + $this->branch = $branch; + return $this; + } + + public function setAuthentication($credentials) { + $this->api->setAuthentication($credentials); + return $this; + } + + public function getVcsApi() { + return $this->api; + } + + public function getUpdate() { + $update = parent::getUpdate(); + + if ( isset($update) && !empty($update->download_url) ) { + $update->download_url = $this->api->signDownloadUrl($update->download_url); + } + + return $update; + } + + public function onDisplayConfiguration($panel) { + parent::onDisplayConfiguration($panel); + $panel->row('Branch', $this->branch); + $panel->row('Authentication enabled', $this->api->isAuthenticationEnabled() ? 'Yes' : 'No'); + $panel->row('API client', get_class($this->api)); + } + } + +endif; diff --git a/app/core/puc/README.md b/app/core/puc/README.md new file mode 100755 index 0000000..c63f147 --- /dev/null +++ b/app/core/puc/README.md @@ -0,0 +1,326 @@ +Plugin Update Checker +===================== + +This is a custom update checker library for WordPress plugins and themes. It lets you add automatic update notifications and one-click upgrades to your commercial plugins, private themes, and so on. All you need to do is put your plugin/theme details in a JSON file, place the file on your server, and pass the URL to the library. The library periodically checks the URL to see if there's a new version available and displays an update notification to the user if necessary. + +From the users' perspective, it works just like with plugins and themes hosted on WordPress.org. The update checker uses the default upgrade UI that is familiar to most WordPress users. + + + +**Table of Contents** + +- [Getting Started](#getting-started) + - [Self-hosted Plugins and Themes](#self-hosted-plugins-and-themes) + - [How to Release an Update](#how-to-release-an-update) + - [Notes](#notes) + - [GitHub Integration](#github-integration) + - [How to Release an Update](#how-to-release-an-update-1) + - [Notes](#notes-1) + - [BitBucket Integration](#bitbucket-integration) + - [How to Release an Update](#how-to-release-an-update-2) + - [GitLab Integration](#gitlab-integration) + - [How to Release a GitLab Update](#how-to-release-a-gitlab-update) +- [License Management](#license-management) +- [Resources](#resources) + + + +Getting Started +--------------- + +*Note:* In each of the below examples, part of the instructions are to create an instance of the update checker class. It's recommended to do this either during the `plugins_loaded` action or outside of any hooks. If you do it only during an `admin_*` action, then updates will not be visible to a wide variety of WordPress maanagement tools; they will only be visible to logged-in users on dashboard pages. + +### Self-hosted Plugins and Themes + +1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. +2. Go to the `examples` subdirectory and open the .json file that fits your project type. Replace the placeholder data with your plugin/theme details. + - Plugin example: + + ```json + { + "name" : "Plugin Name", + "version" : "2.0", + "download_url" : "http://example.com/plugin-name-2.0.zip", + "sections" : { + "description" : "Plugin description here. You can use HTML." + } + } + ``` + + This is a minimal example that leaves out optional fields. See [this table](https://docs.google.com/spreadsheets/d/1eOBbW7Go2qEQXReOOCdidMTf_tDYRq4JfegcO1CBPIs/edit?usp=sharing) for a full list of supported fields and their descriptions. + - Theme example: + + ```json + { + "version": "2.0", + "details_url": "http://example.com/version-2.0-details.html", + "download_url": "http://example.com/example-theme-2.0.zip" + } + ``` + + This is actually a complete example that shows all theme-related fields. `version` and `download_url` should be self-explanatory. The `details_url` key specifies the page that the user will see if they click the "View version 1.2.3 details" link in an update notification. +3. Upload the JSON file to a publicly accessible location. +4. Add the following code to the main plugin file or to the `functions.php` file: + + ```php + require 'path/to/plugin-update-checker/plugin-update-checker.php'; + $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + 'http://example.com/path/to/details.json', + __FILE__, //Full path to the main plugin file or functions.php. + 'unique-plugin-or-theme-slug' + ); + ``` + Note: If you're using the Composer autoloader, you don't need to explicitly `require` the library. + +#### How to Release an Update + +Change the `version` number in the JSON file and make sure that `download_url` points to the latest version. Update the other fields if necessary. Tip: You can use [wp-update-server](https://github.com/YahnisElsts/wp-update-server) to automate this process. + +By default, the library will check the specified URL for changes every 12 hours. You can force it to check immediately by clicking the "Check for updates" link on the "Plugins" page (it's next to the "Visit plugin site" link). Themes don't have that link, but you can also trigger an update check like this: + + 1. Install [Debug Bar](https://srd.wordpress.org/plugins/debug-bar/). + 2. Click the "Debug" menu in the Admin Bar (a.k.a Toolbar). + 3. Open the "PUC (your-slug)" panel. + 4. Click the "Check Now" button. + +#### Notes +- The second argument passed to `buildUpdateChecker` must be the absolute path to the main plugin file or any file in the theme directory. If you followed the "getting started" instructions, you can just use the `__FILE__` constant. +- The third argument - i.e. the slug - is optional but recommended. In most cases, the slug should be the same as the name of your plugin directory. For example, if your plugin lives in `/wp-content/plugins/my-plugin`, set the slug to `my-plugin`. If the slug is omitted, the update checker will use the name of the main plugin file as the slug (e.g. `my-cool-plugin.php` → `my-cool-plugin`). This can lead to conflicts if your plugin has a generic file name like `plugin.php`. + + This doesn't affect themes because PUC uses the theme directory name as the default slug. Still, if you're planning to use the slug in your own code - e.g. to filter updates or override update checker behaviour - it can be a good idea to set it explicitly. + +### GitHub Integration + +1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. +2. Add the following code to the main plugin file or `functions.php`: + + ```php + require 'plugin-update-checker/plugin-update-checker.php'; + $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + 'https://github.com/user-name/repo-name/', + __FILE__, + 'unique-plugin-or-theme-slug' + ); + + //Set the branch that contains the stable release. + $myUpdateChecker->setBranch('stable-branch-name'); + + //Optional: If you're using a private repository, specify the access token like this: + $myUpdateChecker->setAuthentication('your-token-here'); + ``` +3. Plugins only: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. The contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. + +#### How to Release an Update + +This library supports a couple of different ways to release updates on GitHub. Pick the one that best fits your workflow. + +- **GitHub releases** + + Create a new release using the "Releases" feature on GitHub. The tag name and release title don't matter. The description is optional, but if you do provide one, it will be displayed when the user clicks the "View version x.y.z details" link on the "Plugins" page. Note that PUC ignores releases marked as "This is a pre-release". + + If you want to use release assets, call the `enableReleaseAssets()` method after creating the update checker instance: + ```php + $myUpdateChecker->getVcsApi()->enableReleaseAssets(); + ``` + +- **Tags** + + To release version 1.2.3, create a new Git tag named `v1.2.3` or `1.2.3`. That's it. + + PUC doesn't require strict adherence to [SemVer](http://semver.org/). These are all valid tag names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5`. However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitHub releases or branches instead. + +- **Stable branch** + + Point the update checker at a stable, production-ready branch: + ```php + $updateChecker->setBranch('branch-name'); + ``` + PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. + + Caveat: If you set the branch to `master` (the default), the update checker will look for recent releases and tags first. It'll only use the `master` branch if it doesn't find anything else suitable. + +#### Notes + +The library will pull update details from the following parts of a release/tag/branch: + +- Version number + - The "Version" plugin header. + - The latest GitHub release or tag name. +- Changelog + - The "Changelog" section of `readme.txt`. + - One of the following files: + CHANGES.md, CHANGELOG.md, changes.md, changelog.md + - GitHub release notes. +- Required and tested WordPress versions + - The "Requires at least" and "Tested up to" fields in `readme.txt`. + - The following plugin headers: + `Required WP`, `Tested WP`, `Requires at least`, `Tested up to` +- "Last updated" timestamp + - The creation timestamp of the latest GitHub release. + - The latest commit in the selected tag or branch. +- Number of downloads + - The `download_count` statistic of the latest release. + - If you're not using GitHub releases, there will be no download stats. +- Other plugin details - author, homepage URL, description + - The "Description" section of `readme.txt`. + - Remote plugin headers (i.e. the latest version on GitHub). + - Local plugin headers (i.e. the currently installed version). +- Ratings, banners, screenshots + - Not supported. + +### BitBucket Integration + +1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. +2. Add the following code to the main plugin file or `functions.php`: + + ```php + require 'plugin-update-checker/plugin-update-checker.php'; + $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + 'https://bitbucket.org/user-name/repo-name', + __FILE__, + 'unique-plugin-or-theme-slug' + ); + + //Optional: If you're using a private repository, create an OAuth consumer + //and set the authentication credentials like this: + //Note: For now you need to check "This is a private consumer" when + //creating the consumer to work around #134: + // https://github.com/YahnisElsts/plugin-update-checker/issues/134 + $myUpdateChecker->setAuthentication(array( + 'consumer_key' => '...', + 'consumer_secret' => '...', + )); + + //Optional: Set the branch that contains the stable release. + $myUpdateChecker->setBranch('stable-branch-name'); + ``` +3. Optional: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. For plugins, the contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. + +#### How to Release an Update + +BitBucket doesn't have an equivalent to GitHub's releases, so the process is slightly different. You can use any of the following approaches: + +- **`Stable tag` header** + + This is the recommended approach if you're using tags to mark each version. Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. Set the "stable tag" header to the tag that represents the latest release. Example: + ```text + Stable tag: v1.2.3 + ``` + The tag doesn't have to start with a "v" or follow any particular format. You can use any name you like as long as it's a valid Git tag. + + Tip: If you explicitly set a stable branch, the update checker will look for a `readme.txt` in that branch. Otherwise it will only look at the `master` branch. + +- **Tags** + + You can skip the "stable tag" bit and just create a new Git tag named `v1.2.3` or `1.2.3`. The update checker will look at the most recent tags and pick the one that looks like the highest version number. + + PUC doesn't require strict adherence to [SemVer](http://semver.org/). These are all valid tag names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5`. However, be warned that it's not smart enough to filter out alpha/beta/RC versions. + +- **Stable branch** + + Point the update checker at a stable, production-ready branch: + ```php + $updateChecker->setBranch('branch-name'); + ``` + PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. Caveat: If you set the branch to `master`, the update checker will still look for tags first. + +### GitLab Integration + +1. Download [the latest release](https://github.com/YahnisElsts/plugin-update-checker/releases/latest) and copy the `plugin-update-checker` directory to your plugin or theme. +2. Add the following code to the main plugin file or `functions.php` and define how you want to check for updates from Gitlab (refer to: [Gitlab: How to Release an Update](#how-to-release-a-gitlab-update)): + + ```php + require 'plugin-update-checker/plugin-update-checker.php'; + $myUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + 'https://gitlab.com/user-name/repo-name/', + __FILE__, + 'unique-plugin-or-theme-slug' + ); + + //Optional: If you're using a private repository, specify the access token like this: + $myUpdateChecker->setAuthentication('your-token-here'); + ``` + + Alternatively, if you're using a self-hosted GitLab instance, initialize the update checker like this: + ```php + $myUpdateChecker = new Puc_v4p11_Vcs_PluginUpdateChecker( + new Puc_v4p11_Vcs_GitLabApi('https://myserver.com/user-name/repo-name/'), + __FILE__, + 'unique-plugin-or-theme-slug' + ); + //Optional: Add setAuthentication(...) and setBranch(...) as shown above. + ``` + If you're using a self-hosted GitLab instance and [subgroups or nested groups](https://docs.gitlab.com/ce/user/group/subgroups/index.html), you have to tell the update checker which parts of the URL are subgroups: + ```php + $myUpdateChecker = new Puc_v4p11_Vcs_PluginUpdateChecker( + new Puc_v4p11_Vcs_GitLabApi('https://myserver.com/group-name/subgroup-level1/subgroup-level2/subgroup-level3/repo-name/', null, 'subgroup-level1/subgroup-level2/subgroup-level3'), + __FILE__, + 'unique-plugin-or-theme-slug' + ); + + ``` + +3. Plugins only: Add a `readme.txt` file formatted according to the [WordPress.org plugin readme standard](https://wordpress.org/plugins/readme.txt) to your repository. The contents of this file will be shown when the user clicks the "View version 1.2.3 details" link. + +#### How to Release a GitLab Update +A Gitlab repository can be checked for updates in 4 different ways. + +1. **Stable branch** (other than `master` or `main`): + - Point the update checker at any stable, production-ready branch and PUC will periodically check the `Version` header in the main plugin file or `style.css` and display a notification if it's greater than the installed version. + - Add the following code: + ```php + //Add the following code to your main plugin file or `functions.php` file to check for updates from a custom branch + $myUpdateChecker->setBranch('stable-branch-name'); + ``` + - Caveats: + - If you set the branch to `main` (the default) or `master` (the historical default), the update checker will look for recent releases and tags first. It'll only use the `main` or `master` branch if it doesn't find anything else suitable. + +2. **GitLab Releases using Generic Packages**: + - Use a Gitlab CI/CD Pipeline to automatically generate your update on release using a Generic Package. The benefit of using Generic Package assets over the Source Code assets is that the code can already be built and production ready. + - Add the following code: + ```php + //Add the following code to your main plugin file or `functions.php` file to check for a new update from releases using generic packages + $myUpdateChecker->getVcsApi()->enableReleasePackages(); + ``` + - PUC will periodically check the release version (i.e. the tag name of the release) and will display a notification if the release is a greater version than the installed version. + - The release tag name should loosely follow [SemVer](http://semver.org/) but these are all valid release names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5` However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitLab branches instead. + - For more information about *Gitlab Release Generic Packages* refer to the following links: + - [Gitlab CI/CD Release Documentation](https://docs.gitlab.com/ee/user/project/releases/#create-release-from-gitlab-ci) + - [Gitlab Release Assets as Generic Package Documentation](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs/examples/release-assets-as-generic-package/) + - [Example .gitlab-ci.yml file using Release Generic Packages for generating a update package from the Sensei-LMS wordpress plugin](https://gist.github.com/timwiel/9dfd3526c768efad4973254085e065ce) + + +3. **GitLab Releases using Source Code Assets**: + - Create a new release using the "Releases" feature on Gitlab. + - Add the following code: + ```php + //Add the following code to your main plugin file or `functions.php` file to check for a new update from releases using release assets + $myUpdateChecker->getVcsApi()->enableReleaseAssets(); + ``` + - PUC will periodically check the release version (based on release tag name) and display a notification if the release version is greater than the installed version. + - The release name should loosely follow [SemVer](http://semver.org/) but these are all valid release names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5` However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitLab branches instead. + + +4. **Tags** (this is the default option): + - To release version 1.2.3, create a new Git tag named `v1.2.3` or `1.2.3`. + - Optionally, add the following code: + ```php + //Add the following code to your main plugin file or `functions.php` file to check for updates from the default branch + $myUpdateChecker->setBranch('master'); //or 'main' + ``` + - PUC doesn't require strict adherence to [SemVer](http://semver.org/). These are all valid tag names: `v1.2.3`, `v1.2-foo`, `1.2.3_rc1-ABC`, `1.2.3.4.5`. However, be warned that it's not smart enough to filter out alpha/beta/RC versions. If that's a problem, you might want to use GitLab branches instead. + +License Management +------------------ + +Currently, the update checker doesn't have any built-in license management features. It only provides some hooks that you can use to, for example, append license keys to update requests (`$updateChecker->addQueryArgFilter()`). If you're looking for ways to manage and verify licenses, please post your feedback in [this issue](https://github.com/YahnisElsts/plugin-update-checker/issues/222). + +Resources +--------- + +- [This blog post](http://w-shadow.com/blog/2010/09/02/automatic-updates-for-any-plugin/) has more information about the update checker API. *Slightly out of date.* +- [Debug Bar](https://wordpress.org/plugins/debug-bar/) - useful for testing and debugging the update checker. +- [Update format reference](https://docs.google.com/spreadsheets/d/1eOBbW7Go2qEQXReOOCdidMTf_tDYRq4JfegcO1CBPIs/edit?usp=sharing) - describes all fields supported by the JSON-based update information format used by the update checker. Only covers plugins. Themes use a similar but more limited format. +- [Securing download links](http://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/) - a general overview. +- [A GUI for entering download credentials](http://open-tools.net/documentation/tutorial-automatic-updates.html#wordpress) +- [Theme Update Checker](http://w-shadow.com/blog/2011/06/02/automatic-updates-for-commercial-themes/) - an older, theme-only variant of this update checker. diff --git a/app/core/puc/composer.json b/app/core/puc/composer.json new file mode 100755 index 0000000..f2218b6 --- /dev/null +++ b/app/core/puc/composer.json @@ -0,0 +1,23 @@ +{ + "name": "yahnis-elsts/plugin-update-checker", + "type": "library", + "description": "A custom update checker for WordPress plugins and themes. Useful if you can't host your plugin in the official WP repository but still want it to support automatic updates.", + "keywords": ["wordpress", "plugin updates", "automatic updates", "theme updates"], + "homepage": "https://github.com/YahnisElsts/plugin-update-checker/", + "license": "MIT", + "authors": [ + { + "name": "Yahnis Elsts", + "email": "whiteshadow@w-shadow.com", + "homepage": "http://w-shadow.com/", + "role": "Developer" + } + ], + "require": { + "php": ">=5.2.0", + "ext-json": "*" + }, + "autoload": { + "files": ["load-v4p11.php"] + } +} diff --git a/app/core/puc/css/puc-debug-bar.css b/app/core/puc/css/puc-debug-bar.css new file mode 100755 index 0000000..e011078 --- /dev/null +++ b/app/core/puc/css/puc-debug-bar.css @@ -0,0 +1,70 @@ +.puc-debug-bar-panel-v4 pre { + margin-top: 0; +} + +/* Style the debug data table to match "widefat" table style used by WordPress. */ +table.puc-debug-data { + width: 100%; + clear: both; + margin: 0; + + border-spacing: 0; + background-color: #f9f9f9; + + border-radius: 3px; + border: 1px solid #dfdfdf; + border-collapse: separate; +} + +table.puc-debug-data * { + word-wrap: break-word; +} + +table.puc-debug-data th { + width: 11em; + padding: 7px 7px 8px; + text-align: left; + + font-family: "Georgia", "Times New Roman", "Bitstream Charter", "Times", serif; + font-weight: 400; + font-size: 14px; + line-height: 1.3em; + text-shadow: rgba(255, 255, 255, 0.804) 0 1px 0; +} + +table.puc-debug-data td, table.puc-debug-data th { + border-width: 1px 0; + border-style: solid; + + border-top-color: #fff; + border-bottom-color: #dfdfdf; + + text-transform: none; +} + +table.puc-debug-data td { + color: #555; + font-size: 12px; + padding: 4px 7px 2px; + vertical-align: top; +} + +.puc-ajax-response { + border: 1px solid #dfdfdf; + border-radius: 3px; + padding: 0.5em; + margin: 5px 0; + background-color: white; +} + +.puc-ajax-nonce { + display: none; +} + +.puc-ajax-response dt { + margin: 0; +} + +.puc-ajax-response dd { + margin: 0 0 1em; +} diff --git a/app/core/puc/examples/plugin.json b/app/core/puc/examples/plugin.json new file mode 100755 index 0000000..fea211a --- /dev/null +++ b/app/core/puc/examples/plugin.json @@ -0,0 +1,52 @@ +{ + "name": "My Example Plugin", + "version": "2.0", + "download_url": "http://example.com/updates/example-plugin.zip", + + "homepage": "http://example.com/", + "requires": "4.5", + "tested": "4.8", + "last_updated": "2017-01-01 16:17:00", + "upgrade_notice": "Here's why you should upgrade...", + + "author": "Janis Elsts", + "author_homepage": "http://example.com/", + + "sections": { + "description": "(Required) Plugin description. Basic HTML can be used in all sections.", + "installation": "(Recommended) Installation instructions.", + "changelog": "(Recommended) Changelog.

This section will be displayed by default when the user clicks 'View version x.y.z details'.

", + "custom_section": "This is a custom section labeled 'Custom Section'." + }, + + "icons" : { + "1x" : "http://w-shadow.com/files/external-update-example/assets/icon-128x128.png", + "2x" : "http://w-shadow.com/files/external-update-example/assets/icon-256x256.png" + }, + + "banners": { + "low": "http://w-shadow.com/files/external-update-example/assets/banner-772x250.png", + "high": "http://w-shadow.com/files/external-update-example/assets/banner-1544x500.png" + }, + + "translations": [ + { + "language": "fr_FR", + "version": "4.0", + "updated": "2016-04-22 23:22:42", + "package": "http://example.com/updates/translations/french-language-pack.zip" + }, + { + "language": "de_DE", + "version": "5.0", + "updated": "2016-04-22 23:22:42", + "package": "http://example.com/updates/translations/german-language-pack.zip" + } + ], + + "rating": 90, + "num_ratings": 123, + + "downloaded": 1234, + "active_installs": 12345 +} \ No newline at end of file diff --git a/app/core/puc/examples/theme.json b/app/core/puc/examples/theme.json new file mode 100755 index 0000000..df6c8c7 --- /dev/null +++ b/app/core/puc/examples/theme.json @@ -0,0 +1,5 @@ +{ + "version": "2.0", + "details_url": "http://example.com/version-2.0-details.html", + "download_url": "http://example.com/example-theme-2.0.zip" +} \ No newline at end of file diff --git a/app/core/puc/js/debug-bar.js b/app/core/puc/js/debug-bar.js new file mode 100755 index 0000000..e73d890 --- /dev/null +++ b/app/core/puc/js/debug-bar.js @@ -0,0 +1,52 @@ +jQuery(function($) { + + function runAjaxAction(button, action) { + button = $(button); + var panel = button.closest('.puc-debug-bar-panel-v4'); + var responseBox = button.closest('td').find('.puc-ajax-response'); + + responseBox.text('Processing...').show(); + $.post( + ajaxurl, + { + action : action, + uid : panel.data('uid'), + _wpnonce: panel.data('nonce') + }, + function(data) { + responseBox.html(data); + }, + 'html' + ); + } + + $('.puc-debug-bar-panel-v4 input[name="puc-check-now-button"]').on('click', function() { + runAjaxAction(this, 'puc_v4_debug_check_now'); + return false; + }); + + $('.puc-debug-bar-panel-v4 input[name="puc-request-info-button"]').on('click', function() { + runAjaxAction(this, 'puc_v4_debug_request_info'); + return false; + }); + + + // Debug Bar uses the panel class name as part of its link and container IDs. This means we can + // end up with multiple identical IDs if more than one plugin uses the update checker library. + // Fix it by replacing the class name with the plugin slug. + var panels = $('#debug-menu-targets').find('.puc-debug-bar-panel-v4'); + panels.each(function() { + var panel = $(this); + var uid = panel.data('uid'); + var target = panel.closest('.debug-menu-target'); + + //Change the panel wrapper ID. + target.attr('id', 'debug-menu-target-puc-' + uid); + + //Change the menu link ID as well and point it at the new target ID. + $('#debug-bar-menu').find('.puc-debug-menu-link-' + uid) + .closest('.debug-menu-link') + .attr('id', 'debug-menu-link-puc-' + uid) + .attr('href', '#' + target.attr('id')); + }); +}); \ No newline at end of file diff --git a/app/core/puc/languages/plugin-update-checker-ca.mo b/app/core/puc/languages/plugin-update-checker-ca.mo new file mode 100755 index 0000000000000000000000000000000000000000..59645faba22e5f3b1358ef076a01d5a7fa3aa534 GIT binary patch literal 1186 zcmZ`&%We}f6g5yD3JU~l7MF@jAn=eGUhPB?f>02mg$Po_u5xE?6T{RV*`7X-koW+0 zhy^>uFR+0P5@LzOC$M16M{p*S5}sDhoY=mPbM5P|$7Ws%jDx^&U;rEjo&)uG2OI_7 z0|a~qW`XZO7dWy8}I`73-}WF&`jfh1$+|or(n2@ z$6kD4Ca@&-k5_~^FyUI~c=Se`J*IW*s48<6*o(o49h3HCEM+5QhFsVosZFH|wN`K> zR?K5#x6H%=Hi*EEd{CkCG&|>KMHn%aMK#ohf(`}GTqVO>w8_qEYsjusZ87I}jgak^ z1b=z=Y*pmY6Da4vZbKUgT;Ekp3VMIKk87Fp(ccPYmReZ*Oiw{rQQ zQJGG}$>w0>q|R3V?m+e&tAI-6bvUP#wByS%j%9Lz;>&3}Inz$sZ5YaXys7Jor*;dn zy&#i|6wjye#l~(4XI!Zv%K@v6lv>NTmKUcY;;7x~Srga|VW$KqCtXwwgL#J#*X-o9%M(OOP zBClzLpCXloN)jJ<-gN!%O{ zB>(p8)gMt|<1=e`ScRtXSByfRLdUq(KfSFJ6!629vGE!UXnOYH)9c?7LY#*cWS6#% cwcF+j&+0z~QHeLF5H1o+|4uN~nyX0s0EpISt^fc4 literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-ca.po b/app/core/puc/languages/plugin-update-checker-ca.po new file mode 100755 index 0000000..facf365 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-ca.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-11-24 17:02+0200\n" +"PO-Revision-Date: 2019-09-25 18:15+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.3\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: \n" +"Language: ca\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Comprova si hi ha actualitzacions" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "L’extensió %s està actualitzada." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Una nova versió de l’extensió %s està disponible." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "No s’ha pogut determinar si hi ha actualitzacions per a %s." + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Estat del comprovador d’actualitzacions desconegut \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "No hi ha cap registre de canvis disponible." diff --git a/app/core/puc/languages/plugin-update-checker-cs_CZ.mo b/app/core/puc/languages/plugin-update-checker-cs_CZ.mo new file mode 100755 index 0000000000000000000000000000000000000000..ac6d20ea77cb6c6ad2aa9204312c53c86078e08c GIT binary patch literal 1077 zcmZWoO>fgc5H(P7$gP|Z>S3s;)T*rGq^c+m;iI8N6={juv{b!B8+#f%adxfUb=pSo z8#o~jobm&Z`UiRnH;&x-8(f*KlYWSm#&5^_=Iz_H=g)(guMUm-6mt}Ho6z`_!zIqr z{4)hme4&`9IH#ym{H9o{DPi$ zOoWgoStk}?Vw2#^8xVK`15`Se0^~7R#)6)bXtx_1{8vquZj-YVj0Ee~bs9=`F)(Z^ zWCyvvKapkmk=VpxVHZ=W4BOV7IArTtN3*8%q0soyWHp7{kTv#}G<_(0rDx1rWn~Xa zp1-=X?5%hn5!o&dVta&JJWGYrs=xAl*`raYb8T2taiJ4#r1IfFcFoW4K?Hle8z%5# zKsg4{Yi(0Eko}ibBRU!HAZsG;`%oLwIxOZuzO!}`2TNBh9|Fy4M}1DW(aJMa6z~rO{OP zo11Lynr9DmjEZfDK!&mC_^{TFP2rH$Wgyv}%v6AO&J)rLbc_5QvUey@<+osIz#uXv z)qb&#;UIv|5!G zR$8Zi>1jD2yrF_z1yO_4nMeAxaB00^k4vA49LZK{lU6F7qaIz5l8GE}1H5N4ay#S! zQp-%6LZBG`fKY0arDA;HIy*QN<57QnG3|zl#@P)4s<`Zt9XS|}Y)cHMy^`6Vyo*\n" +"Language-Team: Czech (Czech Republic)\n" +"Language: cs-CZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Loco-Source-Locale: cs_CZ\n" +"X-Generator: Loco - https://localise.biz/\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"X-Poedit-SearchPath-0: .\n" +"X-Loco-Parser: loco_parse_po" + +#: Puc/v4p1/Plugin/UpdateChecker.php:358 +msgid "Check for updates" +msgstr "Zkontrolovat aktualizace" + +#: Puc/v4p1/Plugin/UpdateChecker.php:405 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Plugin %s je aktuální." + +#: Puc/v4p1/Plugin/UpdateChecker.php:407 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Nová verze pluginu %s je dostupná." + +#: Puc/v4p1/Plugin/UpdateChecker.php:409 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Neznámý status kontroly aktualizací \"%s\"" + +#: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 +msgid "There is no changelog available." +msgstr "Changelog není dostupný." diff --git a/app/core/puc/languages/plugin-update-checker-da_DK.mo b/app/core/puc/languages/plugin-update-checker-da_DK.mo new file mode 100755 index 0000000000000000000000000000000000000000..9c59670712307a7dec1419ce48ba2613300f91aa GIT binary patch literal 1010 zcmZWo&u`N(7!5EuloK2gLLWoZK*J&FHf>7P19Tgjwux$VXt&C1zNV&`UD?ilNF4Yl zICDerA0Tnu9f>>QUxAmVTRUOp<@vKee}1uF{@kDY6rkM!9s;|-UEl*ywy(fF;2S`| z4`3en4K#tjfGGPng5Vc01Rj*}tsqzgAA%o&KY~N>XYdp7PcTx)?Izv`gE`>#c%;%Z z=~mPlaBoO`W2qRW(z6RX1GY@ckv7yDNS$$RGLk1!pfh*m{CqBu%cmzSdDC_fzu32xChlg(SsiwzG zik~&61>Ty%_PAB)N~jWcRep!hPmN98u5v!1Znx3pM)xd?r#a!z{8deTEILSHoGs%F|hy=lDlbzO2ta4E_O#F(`Ea literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-da_DK.po b/app/core/puc/languages/plugin-update-checker-da_DK.po new file mode 100755 index 0000000..ed13312 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-da_DK.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-05-20 10:53+0300\n" +"PO-Revision-Date: 2017-10-17 11:07+0200\n" +"Last-Translator: Mikk3lRo\n" +"Language-Team: Mikk3lRo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Language: da_DK\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p1/Plugin/UpdateChecker.php:358 +msgid "Check for updates" +msgstr "Undersøg for opdateringer" + +#: Puc/v4p1/Plugin/UpdateChecker.php:405 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Plugin'et %s er allerede opdateret." + +#: Puc/v4p1/Plugin/UpdateChecker.php:407 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "En ny version af plugin'et %s er tilgængelig." + +#: Puc/v4p1/Plugin/UpdateChecker.php:409 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Ukendt opdateringsstatus: \"%s\"" + +#: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 +msgid "There is no changelog available." +msgstr "Der er ingen ændringslog tilgængelig." diff --git a/app/core/puc/languages/plugin-update-checker-de_DE.mo b/app/core/puc/languages/plugin-update-checker-de_DE.mo new file mode 100755 index 0000000000000000000000000000000000000000..0734cae2dc9b76d41f5f6f99b1380ec2f685e1be GIT binary patch literal 980 zcmZuv&2AGh7+j!$6i)Plgi!Sn35g$h$wp9>4M9MfqKXtEnj&tIll`(;vauuEn^K9_ z;K+>wJOH=e`U)I4apXA|chjbourxcLcR$aL?fJ91@+H8y0^9;Rz%}4A;Kz61KJWv$ z4*UWL_zTrP?cpW?f-vECFuYrGp(Rw^k1}lK~;K#+1 zPM?>3^@0@d)0~aXv?4tsH_j~0@*>R?p^|f%<#Ld77_`PboX|)cDrSjvY=hpI4f`&o zX*iZDVih)w9nRIf$rqP8yTPf*77=s_*2)zB#3@jUaJ{ZC&MKYCpD zb)1n1$`gw*|dEss6VZzTU9UMR*Qx-jz)0iqd+dJ*0 z@hGfST3R_)5I&f}q2o{P;VhS#YWUMLmR)nNw\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.1\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e\n" +"Language: de_DE\n" +"X-Poedit-SearchPath-0: .\n" + +#: github-checker.php:137 +msgid "There is no changelog available." +msgstr "Es ist keine Liste von Programmänderungen verfügbar." + +#: plugin-update-checker.php:852 +msgid "Check for updates" +msgstr "Nach Update suchen" + +#: plugin-update-checker.php:896 +msgid "This plugin is up to date." +msgstr "Das Plugin ist aktuell." + +#: plugin-update-checker.php:898 +msgid "A new version of this plugin is available." +msgstr "Es ist eine neue Version für das Plugin verfügbar." + +#: plugin-update-checker.php:900 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Unbekannter Update Status \"%s\"" diff --git a/app/core/puc/languages/plugin-update-checker-es_AR.mo b/app/core/puc/languages/plugin-update-checker-es_AR.mo new file mode 100755 index 0000000000000000000000000000000000000000..85afecd344184a07c3ff0117b87066af6850078c GIT binary patch literal 1140 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 C2(8ip literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-fa_IR.po b/app/core/puc/languages/plugin-update-checker-fa_IR.po new file mode 100755 index 0000000..1181d51 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-fa_IR.po @@ -0,0 +1,38 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2016-02-17 14:21+0100\n" +"PO-Revision-Date: 2016-10-28 14:30+0330\n" +"Last-Translator: studio RVOLA \n" +"Language-Team: Pro Style \n" +"Language: fa_IR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.8\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" + +#: github-checker.php:120 +msgid "There is no changelog available." +msgstr "شرحی برای تغییرات یافت نشد" + +#: plugin-update-checker.php:637 +msgid "Check for updates" +msgstr "بررسی برای بروزرسانی " + +#: plugin-update-checker.php:681 +msgid "This plugin is up to date." +msgstr "شما از آخرین نسخه استفاده میکنید . به‌روز باشید" + +#: plugin-update-checker.php:683 +msgid "A new version of this plugin is available." +msgstr "نسخه جدیدی برای افزونه ارائه شده است ." + +#: plugin-update-checker.php:685 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "وضعیت ناشناخته برای بروزرسانی \"%s\"" diff --git a/app/core/puc/languages/plugin-update-checker-fr_CA.mo b/app/core/puc/languages/plugin-update-checker-fr_CA.mo new file mode 100755 index 0000000000000000000000000000000000000000..24639b694e7ba21e2b5f9997b9f12d2d831ac69a GIT binary patch literal 1208 zcmZuwO>Y}F5M>&-1=K^)9{T|d3>Zk!aJ##85MxybNff&LJ!fDKMyPa&$<1lrsRn<7q_YSWChrKqFfjXPxdlxFOM zc9z_TT8pi4VT5Rx0=(tjbB(E>CsM_c{Zv~B99<|T1-&cxc`jQad0PV#doyHHQ*_j3 zoru1754nu;ppp+3DvPB!xhRZW=Gp0gKaf4oDk2kk56%VUX?9a)nasB-yIG|9mua4+ zFqA*=Ot%@Y?RI3E%PglXExyiWdINTcsBxplEC;Nn1$B-Nj`r3fvLx;FoQ-Uw9GumN z7Wr}fsy0g7ZhJvKaNIo}?8}|ComV!D*vmazx=Pz|K|3cpc7BxKvSqKL^9A)CS2|Lj zq{%k^ESB=F3S6r=DJV%gebabl{uqVi|VxZd)2mcduExMcEhKwf}wB_>y}I zSp_Y0txo@r&rY4M!l4eapy9APLq+?eP?k zF)7{j)~a{~jr_28=aLXszMS-ticFDAM?5%x>GeqCr5X-2)dAo0U+EzPivvUU?U zks{TUjh*jWW$@nSmKTOp=}|W|+S-OVL<)_cG3N7DIL2GGu9>kh zylMa(YY-0?$#&imXoc4E^6>}L+J(@DYE@L{FPASLou;Y5sci}?VQ+d 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Eric Gagnon \n" +"Language: fr_CA\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Vérifier les mises à jour" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "L’extension %s est à jour." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Une nouvelle version de l’extension %s est disponible." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Impossible de déterminer si une mise à jour est disponible pour \"%s\"" + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Un problème inconnu est survenu \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "Il n’y a aucun journal de mise à jour disponible." diff --git a/app/core/puc/languages/plugin-update-checker-fr_FR.mo b/app/core/puc/languages/plugin-update-checker-fr_FR.mo new file mode 100755 index 0000000000000000000000000000000000000000..a492d96f6eb4b2d988877b0f15c6adc60613195e GIT binary patch literal 1066 zcmZuw&2AGh5H?Ua1TJs|q*0|xAn1R4EshMJY0DWU2&l2I$v2KbMK|0U|;#BAXDl-5v5>kmhg#p{q2ilDF zG=Mae0WCN$eC}X&&doBPB4jEbNDW?kg)=LlaSS80P8toS4~1gRor&nQO9%WHO_u%@ z=NWhdh2Ma6tl7ud^H#!l%ly$aEiYe*PaRe|TV39?C_H)KuP8WzT3B7=Vey0NLiGIE zldu+sB;?yTl7-i+bql4gP1VW80C^Y1Fro_Ni8QdiyVYKS7peDIG(SHcj{`e0N(8YP zE?3S%BIw)R+ID55wXu5PyBdU*rqLd?=iQ@>40=5D^O+J-*NfY*4t-;%yT+F;bXI8B zN6S}rY!ayl5iIRVUwOyZQKJ>!*a$iX6X~HAgh7q|DVO}EaF_|7Mi2y*j>@f2e9hRQ zi$K%$(b6?)^`e?IZ9LMj4AsZ=i}<%Dw=p(LTM?AL&a=P4qp`7xYfI-N==JJ7toIJ1 z>eE_GOqFo-l7)Fydfb#TmC3>S>g(3#r9)8IIPH*49+J@t+dVz8vM;IS6gn76N6*tQ zuuo=KOM(9N@$(S~5P6*I$*vX(5}YW{gpf#=87-#`4Vg82>hyR>jZan7ItO$fTy955 o^GQ$dXrxafAE8os-pQ0!(Rp-9s3)yWJzYdzPT#&tFf|;ozeSTj4gdfE literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-fr_FR.po b/app/core/puc/languages/plugin-update-checker-fr_FR.po new file mode 100755 index 0000000..0c32ebb --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-fr_FR.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-07-07 14:53+0200\n" +"PO-Revision-Date: 2017-07-07 14:54+0200\n" +"Language-Team: studio RVOLA \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Nicolas GEHIN\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p1/Plugin/UpdateChecker.php:358 +msgid "Check for updates" +msgstr "Vérifier les mises à jour" + +#: Puc/v4p1/Plugin/UpdateChecker.php:405 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "L’extension %s est à jour." + +#: Puc/v4p1/Plugin/UpdateChecker.php:407 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Une nouvelle version de l’extension %s est disponible." + +#: Puc/v4p1/Plugin/UpdateChecker.php:409 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Un problème inconnu est survenu \"%s\"" + +#: Puc/v4p1/Vcs/PluginUpdateChecker.php:85 +msgid "There is no changelog available." +msgstr "Il n’y a aucun journal de mise à jour disponible." diff --git a/app/core/puc/languages/plugin-update-checker-hu_HU.mo b/app/core/puc/languages/plugin-update-checker-hu_HU.mo new file mode 100755 index 0000000000000000000000000000000000000000..4789ef1da358b7fdef2879615c49eac1fb2dad98 GIT binary patch literal 982 zcmZuvO>fgc5M7{v6i#qKAPz$$#7DIzPDNE5f+!)S6)8m2MckroGO^v*yVmYHB@w@X zTMt~gl@mR1LgEit{Rfqs~~X?#;8rCB&Z?SFfx$FSrAE}nHY;G7CSLItQBH^1Vg1EO9#TD zVSb1ji!7<29|{>@tb&sz{=Z^b3RXc;>#%J(l4?)Rw5XiKQG>CCjDN zB0%n=NIaOw9)wwMeY>)`vDrR8k?YhdEhQ~V+HsPSb&K!p{WKPlY!uh34cg|mzs6UN z^9pA})VwYGY7oi5gO#1gR^IaGC{dS|y9x)91=m?|mT9F7`BPyq6*lz1aVp(7(<0_; zN+-qxNzYE9Y1SLXJ=3&#N5ah}xOW@J0$VE6eQcG!JSdILot0K zq7;Shhh5s8*J%F=%RlWFy*G{WZ;&7A5be=EUVSD1gFvNatULm~a8 zlo;jFzMfKm>?J1uRnMEzVeKiY&H7o2REtp|>#z-zQ1e>Sq4nWu+GNF8dgRPZMcI&l E0BAre\n" +"Language-Team: \n" +"Language: hu_HU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.6\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" + +#: github-checker.php:137 +msgid "There is no changelog available." +msgstr "Nem érhető el a changelog." + +#: plugin-update-checker.php:852 +msgid "Check for updates" +msgstr "Frissítés ellenőrzése" + +#: plugin-update-checker.php:896 +msgid "This plugin is up to date." +msgstr "Ez a plugin naprakész." + +#: plugin-update-checker.php:898 +msgid "A new version of this plugin is available." +msgstr "Új verzió érhető el a kiegészítőhöz" + +#: plugin-update-checker.php:900 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Ismeretlen a frissítés ellenőrző státusza \"%s\"" + +#~ msgid "Every %d hours" +#~ msgstr "Minden %d órában" diff --git a/app/core/puc/languages/plugin-update-checker-it_IT.mo b/app/core/puc/languages/plugin-update-checker-it_IT.mo new file mode 100755 index 0000000000000000000000000000000000000000..6a2c57d98f667286c49857745f52a20c6a54107c GIT binary patch literal 989 zcmY*Y-EPw`7!5E$Dpzm;5<=*s65`h(skSjvih!;|)jFtHhq$ZU#7)goJF=aQAzlOV z3ge0w;BK$L1y@}19GooM+F3d|pOf!9KDNL7y|(nt!?*<80(!s|;44s$1K=U>1GozO z1_<~E+ypM4^SnB^4*mmlfXA5MzTkP+!JFV^@CbYZ{2k1|Kfy>n8VJ25p!86V^A(*w zFP70OQeuy0!dR&l=`p#9w3KH>DitB(GcGee%7pK=CnDaZu{KoX33tMJgNZPr%u<@- z30JAebh=nFI4f4<v8MYz;ITY%B#zQ}-wY73WL3lrhLnl7FCwa!DYL=&GtZ=QJ!3JBK=amM=!my5tbs|+7(b`D5 z+DG@~L{=WY^_@7MZSVR*(iw3*t76mAz&+iEn+<3!lH zujo#T!UxT{z_u<-EZUW?h$>^J@|$9RPn*Q{q;(Muhs~il-G4-h7_N5~qy#tdqz^YN zfS(%fo|7u{jGr`~KuLDeb%zI(NSkXVM=}#0u3nC1%!#L|)JE|sj!=4U(XR15w8NkrO?qy=_TQ!e4N-5_+^ylpBq\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.5\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e\n" +"Language: de_DE\n" +"X-Poedit-SearchPath-0: .\n" + +#: github-checker.php:137 +msgid "There is no changelog available." +msgstr "Non c'è alcuna sezione di aggiornamento disponibile" + +#: plugin-update-checker.php:852 +msgid "Check for updates" +msgstr "Verifica aggiornamenti" + +#: plugin-update-checker.php:896 +msgid "This plugin is up to date." +msgstr "Il plugin è aggiornato" + +#: plugin-update-checker.php:898 +msgid "A new version of this plugin is available." +msgstr "Una nuova versione del plugin è disponibile" + +#: plugin-update-checker.php:900 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Si è verificato un problema sconosciuto \"%s\"" diff --git a/app/core/puc/languages/plugin-update-checker-ja.mo b/app/core/puc/languages/plugin-update-checker-ja.mo new file mode 100755 index 0000000000000000000000000000000000000000..941b6ba2f4d759727a71a177592dc432753d6a85 GIT binary patch literal 1454 zcmZ{i&2QX97{&((Ukeo<7li0xh_olLy}PJv>NJQDQdCHU3)`wEqKS8Q*NxYm8hL6ENf=|LPzzz6q_)`xP z@+|Zc=6i<-c>z8Ge;Mw;IXs3x1OFX<0KN@B49`DG$m{Sn9I40?&?Ar@2qAb)9)})- z^w52v)L=|BxI0H{VN6?5l}RqhbQp8$1$fnD(hCF1X2X`Gc|j@-u0IJHgw$=Ypw9iU zPT4&3d^YQIlN<@=g0LOzq(TgG^Oy?BWJ}QDyci}&J>I5OF0n=s+2AztTXip>(vv

?Y+5Q5_Zx+>QQSw1WxG&* zrLezHK%nsfpZ9cg4~#38`f*cCNTU+7K=@3Cu}vkLqX%#+mrMKJtT(ZFrW-cj$W7rV zv{;=R70#L<*`3?;IGcIb$xR=co*aM{%|dP>3?vVbeK7*2U0m0JT0h z!V+FH^0^^o>_yzDWB1!^(Q;aD&hc9@^NoWz$ik)p7GNsIilh2C;c=`mI)HtTFX}R4 z$`jJ2Gc%(z3wH6)_zu}XeWNoRX?eQRTlbkA>em)ACb{=R#4LnYT#lB)ESN^Ys-yh^`RODR#= z7dlz`tI95^Y<*B9>GX4}*TvxWhZ*s ze#7(MH_zQ(`X(=MBYhn3Zh!aV*2)d=(q1F0DqU0QiY}aVx)+uJdoNJ(`CZgsYh=AR y=?qBkY{yP0=y0v7\n" +"Language-Team: \n" +"Language: ja_JP\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.3\n" +"X-Poedit-Basepath: ../../../../../../Applications/XAMPP/xamppfiles/htdocs/" +"kisagai/wordpress/wp-content/plugins/simple-stripe-gateway/Puc\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-KeywordsList: __;_x:1,2c\n" +"X-Poedit-SearchPath-0: .\n" + +#: v4p7/Plugin/Ui.php:54 +msgid "View details" +msgstr "詳細を表示" + +#: v4p7/Plugin/Ui.php:77 +#, php-format +msgid "More information about %s" +msgstr "%sについての詳細" + +#: v4p7/Plugin/Ui.php:128 +msgid "Check for updates" +msgstr "アップデートを確認" + +#: v4p7/Plugin/Ui.php:213 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "%s プラグインは、最新バージョンです。" + +#: v4p7/Plugin/Ui.php:215 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "%s プラグインの最新バージョンがあります。" + +#: v4p7/Plugin/Ui.php:217 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "%s のアップデートがあるかどうかを判断できませんでした。" + +#: v4p7/Plugin/Ui.php:223 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "バージョンアップの確認で想定外の状態になりました。ステータス:”%s”" + +#: v4p7/Vcs/PluginUpdateChecker.php:98 +msgid "There is no changelog available." +msgstr "更新履歴はありません。" diff --git a/app/core/puc/languages/plugin-update-checker-nl_BE.mo b/app/core/puc/languages/plugin-update-checker-nl_BE.mo new file mode 100755 index 0000000000000000000000000000000000000000..1cea26dda30ca887087e965d5b494716e48d8416 GIT binary patch literal 1211 zcmah|&59F25N>rQ;T9t9u4ClK@z{3ericUi%PFW*e3e!i-y`f+yUy}&sMoC5~HDc}uIo=?CT;4?tL zH((9;33PzdM}+8sx4;to4*U!F0+jJS9ur~}{2hE1{2P1`yuKnt8~g}d`n?6iWpR$; z7iI!i;`ri5h!aaLbuLbK%E^qz)=`nCDzF!WDLW?Z$yiFJ%1k)36H?nsXKIvjB%Yd? zu{&nz02@SLM?R=fcv@TcYa&dU@~oI>LqUg(S8kKx9olB+wKZhNR9dY2T_a@Mm*9|h z*A`g{J%LgV?B?1);CNRtDd_#{zNls0M~5|_u!AX!oPwpY>PYmReZfhP_fz?-QW-DB z$*M7OS!b>Pa3H&mRX`>3E}Ua()*CHZzapF0sL_fW*DltZ^*RjYW8T(f#s9Rs(yZ(@ z(c?l*SPodtW2$Z4-|Fp&Xhii|*P6g4$ib@|*#f@|m-9?%(=I=d^Bg))2OF}rXXljh zV|KD<5}Rr>iK#Wxq4r$fW5Z4b>tgC#PIaJ0)QYZ04g6PK$UDk&uEI2?D5~|d!l_Jd zSU2}E8GKW``cAW5HV2QL^M+PC)VR>z3-H7iF5zyaET&4@-|!Fk)sA(k-_$MZqVmCOx1&*+}D-m~#^V_d%9vU$*R{TijsRlrF2D6#XK@UB`3 zsoC&OZ=WVsE}8aGmaL<&nkZZ9Y{nQ|o0HL8>~J-oSb?4^=YPU%_HDq3eKOUvky0)a z53v?AHYx9p{Ybx{WEt~N#JJjuDr_0`Kt9@5rX0)z2_9fgU=?tis|+sK8EE~VBXmdN gF4LUZ2XdTXY!*|$SiQwsPx$KxgJsRi;?qd{0TG{S#Q*>R literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-nl_BE.po b/app/core/puc/languages/plugin-update-checker-nl_BE.po new file mode 100755 index 0000000..c31db98 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-nl_BE.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2018-03-25 18:15+0200\n" +"PO-Revision-Date: 2018-03-25 18:32+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Frank Goossens \n" +"Language: nl_BE\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Controleer op nieuwe versies" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "De meest recente %s versie is geïnstalleerd." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Er is een nieuwe versie van %s beschikbaar." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Kon niet bepalen of er nieuwe versie van %s beschikbaar is." + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Ongekende status bij controle op nieuwe versie: \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "Er is geen changelog beschikbaar." diff --git a/app/core/puc/languages/plugin-update-checker-nl_NL.mo b/app/core/puc/languages/plugin-update-checker-nl_NL.mo new file mode 100755 index 0000000000000000000000000000000000000000..16dde622ba6040399cc911e0d5ef1c970a541b88 GIT binary patch literal 1211 zcmah|&59F25N>rYShMgp(iFTo-2 zt}U_@dIF^!*v+(oz|pQ^QqcR?eO}9oj}B`FtAI-6JvhhItT$S+epNQFQ==6(u3xG*>vb5)r@X1livMYMwOQG% zqsN6Bv+T2)#Z=pPu(7%)q7l_=U26iHAp1KxvIX7_SMp40(=I=d^Bg+Q`)jhbXXljh zBX)AtBsSG%98+tkL+z!!&xV}}*2UDboa#W0s1@Ca8u+iekav~mT!l$YQB>6P~&2IFTgWfxP-fvvY0Aqf5SiIoh|E9zpj0VX)tIH zxINg88<(32xVEl5>MZqVmCQ9fPwBq3-m~#^b5y?Hwt3Jq{TijsRKQ61D6z9!@UB`3 zsoCJs`aVspTr%mQELlfkHBq+I*^Du`HYcOG*y3tFu>z~Eoc}Si*|z~h_Q^y~hf29f zJjPl~*`&NX_Cx)Ol10oz5#wqrs<36$1NmrEnQ|}>BzTB5fmOh5t}?h_XQ1_ej?f*6 gdrUKCAINcnv6)Z(eD&sQJ?5_;43;%3i%%o*2Pb`M*Z=?k literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-nl_NL.po b/app/core/puc/languages/plugin-update-checker-nl_NL.po new file mode 100755 index 0000000..114cce9 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-nl_NL.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2018-03-25 18:15+0200\n" +"PO-Revision-Date: 2018-03-25 18:32+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Frank Goossens \n" +"Language: nl_NL\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Controleer op nieuwe versies" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "De meest recente %s versie is geïnstalleerd." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Er is een nieuwe versie van %s beschikbaar." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Kon niet bepalen of er nieuwe versie van %s beschikbaar is." + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Ongekende status bij controle op nieuwe versie: \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "Er is geen changelog beschikbaar." diff --git a/app/core/puc/languages/plugin-update-checker-pt_BR.mo b/app/core/puc/languages/plugin-update-checker-pt_BR.mo new file mode 100755 index 0000000000000000000000000000000000000000..d1c0f283287da07c7060255756947399fde75ca6 GIT binary patch literal 1014 zcmZuv!EVz)6f{scgcF=V;_y_d5=dPW2P%rAAllGEMM|SKMcksreu>>WyVmYHZ4oE_ zfe%0&fCEQPT#)h`h+lzm97qtXGJgB)+1bhN{J6UG*2B02+yFYjW#BbXj*q|<;1fW= zS6~_V4zz%ufGFqZJntKD3|vFMdZFTNpgW5oypn^Ib=kY}AEddv&Zz?~t zX;s<@N5?eKhKf9vj;+^A*f6D*l%^<=YRH)$k{ru4lP@#&y+d`Z^og1+00#ed~o)yDXkxO01OB=CIb?>xs5u>EJ;;!s3t`_28bUuZiG31#98mK-BNl>mZ7K z9;c<(|MMCZuOqD!JtLLPq|+v(S_kJ<$RUd!%h5s)ORm4UU)$Z;-J07B{Ccgem16~& zvmAaLpSs(5CR5cc58qgJt;627SfBIC?FMYbmWp(os$od$FH={0As(}0Q~Bs>j#Ed0 zzwWQ&OVx@^X*riJ3CZ_s-K;P&6WiL1Y)A^Xh1Rwj&GPUtZQWG#fP!1i`T7H0n26hz zt&l2Tf7GAy*@-r>?WER))bBU@-0Yv?7Y3`1XhDUgiIOgSh&r6qJltA3NF!-z!xb`1 zU&+ab$rmK?+2p;ZWb%%R(LxgA)aF`EK94!`y@Pq^C}taJg*2wI_Pr<5brLBa%W3dR uv0NHSC{;9(zXh@CV~k{HTE@P&w?I3B7+Z&@l4Ogy;7B66h9le{qWB9G2Q7U7 literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-pt_BR.po b/app/core/puc/languages/plugin-update-checker-pt_BR.po new file mode 100755 index 0000000..ff0f132 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-pt_BR.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-05-19 15:41-0300\n" +"PO-Revision-Date: 2017-05-19 15:42-0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.8\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x;_x:1,2c\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p1/Plugin/UpdateChecker.php:358 +msgid "Check for updates" +msgstr "Verificar Atualizações" + +#: Puc/v4p1/Plugin/UpdateChecker.php:401 Puc/v4p1/Plugin/UpdateChecker.php:406 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "O plugin %s já está na sua versão mais recente." + +#: Puc/v4p1/Plugin/UpdateChecker.php:408 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Há uma nova versão para o plugin %s disponível para download." + +#: Puc/v4p1/Plugin/UpdateChecker.php:410 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Status \"%s\" desconhecido." + +#: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 +msgid "There is no changelog available." +msgstr "Não há um changelog disponível." + +#~ msgid "The %s plugin is up to date." +#~ msgstr "O plugin %s já está na sua versão mais recente." + +#~ msgid "A new version of the %s plugin is available." +#~ msgstr "Há uma nova versão para o plugin %s disponível para download." diff --git a/app/core/puc/languages/plugin-update-checker-ru_RU.mo b/app/core/puc/languages/plugin-update-checker-ru_RU.mo new file mode 100755 index 0000000000000000000000000000000000000000..50b330e9332d5024e9bf5f931e5b1e76dca7cd7a GIT binary patch literal 1337 zcmZuw&u<$=6dq`R${Y|}xNvxlltO7{+1&&h*4}=9X zJv7OUR;mz!8|uGcN~*d9Q*njM>_5O?z=^+rZ+7zw+L52Xc{|@X?|X0Uzuubpo?*R) zcn8rzypFh!aBG5i6Y&&5h(8gth`$jr;*FOWTL!KGIq*B+$(I@X9r!NtKTa@q4)_nS z3w(cuv3cM(K$kxOo&vu83S*E|3vvcJ!x6*dYQ4IT&S$k+L)p7YYni5E)E7qPtTU8a zQj(L(s5ca9Ak%C>VnZaUxRFYat*VQ+{yefTldmqzOKM8V+NfnyTzdnm7ZnajQB zJ)p7wmMlhOGICvetgW-JWzX;{eSW=m8SR_n^bm`takk(D{w4m~kNnl6Rz7kEpS7Wo7xu zMBw?2R;G+phIej{P|e6&=7Uix64i7sNaxbTtDVby>4>L=%Gadk%c__46E%ov=|*B2 zU-8eRl3JKdN7T+_KQR<~A)eO>|3u_+B+M`(&ug^PLW`7N&h&a7k;3~#n#T)GHyCW= z_taeA$8kWXPm|mFr{W->i{umN$S=gQVxl>Q<%W>fy&lduB3*Q^ ztsbi*h3*a8=$ZTIy20$j@~-{OKC+L2lXAPfPe^~V)9T@#eT?0te8B7vDv)KQ13o-9)+N{JLMh-GwQXgq3H`cx{G|?z%3j!>U_X4doGg p^$6zwr!DW1J9>c)S9aI#RRwYXL(s|fZP{fYnp literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-ru_RU.po b/app/core/puc/languages/plugin-update-checker-ru_RU.po new file mode 100755 index 0000000..28917db --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-ru_RU.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2020-08-08 14:36+0300\n" +"PO-Revision-Date: 2021-12-20 17:59+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: \n" +"Language: ru_RU\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p11/Plugin/Ui.php:128 +msgid "Check for updates" +msgstr "Проверить обновления" + +#: Puc/v4p11/Plugin/Ui.php:213 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Плагин %s обновлён." + +#: Puc/v4p11/Plugin/Ui.php:215 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Новая версия %s доступна." + +#: Puc/v4p11/Plugin/Ui.php:217 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Не удалось определить, доступны ли обновления для %s." + +#: Puc/v4p11/Plugin/Ui.php:223 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Неизвестный статус средства проверки обновлений \"%s\"" + +#: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 +msgid "There is no changelog available." +msgstr "Журнал изменений отсутствует." diff --git a/app/core/puc/languages/plugin-update-checker-sl_SI.mo b/app/core/puc/languages/plugin-update-checker-sl_SI.mo new file mode 100755 index 0000000000000000000000000000000000000000..df47ca7c0a01cff815ffe3965ee4918e72a600fd GIT binary patch literal 1203 zcmZWoO>YxN7@k5(CHH_@u9bL+6a=EP>~5kaT4SnW5)?I|RxzkIYhu5#$63#;W@a}b zzoDEE|E0YkRe}?@{($}hjvRaFvtApg%1F;X`|iA7&pWgKe7p8WV0{IA2lRojf!~38 z{Q-Of{0R{70ayn<0v+J`7eefU55W@r8vHNt7jOgi+p9v{0{;!J_dhLoeNBi*uzTQ} z;MZV;%-0n>;U@4&d^!Ij#I*(2ea=^R!ow3fwvNhTqyl@A$>eqDqKQ<0ZrZ7ArF^V&~j_>?MkURy)u~>Ychy7^#jUP2flZM8mj$W?J`4AYTxrv; z56F2Ao#*{MxwGnW=3 && n%100<=4 ? 2 : 3);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Igor Funa\n" +"Language: sl_SI\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Preveri posodobitve" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Vtičnik %s je že posodobljen." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Nova različica vtičnika %s je na razpolago." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Ne morem ugotoviti če se za vtičnik %s na razpolago posodobitve." + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Neznan status preverjanja posodobitev za \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "Dnevnik sprememb ni na razpolago." diff --git a/app/core/puc/languages/plugin-update-checker-sv_SE.mo b/app/core/puc/languages/plugin-update-checker-sv_SE.mo new file mode 100755 index 0000000000000000000000000000000000000000..4d06fc14f5bb99ac14bc019543e9edacfb457e36 GIT binary patch literal 1006 zcmZWn!EO^V5H(OZgcF=NfHYK!L{+@(rWC4;a)7i&6|EZ46mg5(WU^VZwIkb`wi1W_ z1UI-<2!5a!PAEUX2Otjp5qR58+aN5xeIEOH{5(6q@6LS`7`K4?z$S1T_y82+D{u$+ z1`zNam1R4EsX5^8kov|_KI$pYPP7MXnNmmEPaDa zh?X_)x$EUdPrfbl$J4a3e3G0xthBbFNsTPF6 zQ|y$Xe5o9dlpn+t1eI2nTb0RmWA|N58vg>JYt-sRX)tX(()6%F(L((y!H&somz$-p zm`Y=p>0k5Ffw4WenK~a+r&I56y>l2xk852pO5yOz!hKenyev*kZrs^fo4JRT?G9S7 zDnpp9h@Hvlkht&BMEU5v3oTx*tXO4F{Zwm5h*{I*ME8m!Zv5guX~VIY|;YsJcM3XG8e7a;khF F{sQ>&EFS;> literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-sv_SE.po b/app/core/puc/languages/plugin-update-checker-sv_SE.po new file mode 100755 index 0000000..0c9a4fd --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-sv_SE.po @@ -0,0 +1,42 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-05-20 10:53+0300\n" +"PO-Revision-Date: 2017-10-16 15:02+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: \n" +"Language: sv_SE\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p1/Plugin/UpdateChecker.php:358 +msgid "Check for updates" +msgstr "Sök efter uppdateringar" + +#: Puc/v4p1/Plugin/UpdateChecker.php:405 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Tillägget %s är uppdaterat." + +#: Puc/v4p1/Plugin/UpdateChecker.php:407 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Det finns en ny version av tillägget %s." + +#: Puc/v4p1/Plugin/UpdateChecker.php:409 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Okänd status för kontroll av uppdatering “%s”" + +#: Puc/v4p1/Vcs/PluginUpdateChecker.php:83 +msgid "There is no changelog available." +msgstr "Det finns ingen ändringslogg tillgänglig." diff --git a/app/core/puc/languages/plugin-update-checker-tr_TR.mo b/app/core/puc/languages/plugin-update-checker-tr_TR.mo new file mode 100755 index 0000000000000000000000000000000000000000..58be2f9306dd0e01aa725c03d583ca53bdd536a0 GIT binary patch literal 1118 zcmZWn&uA(EYi8EL z|3fcT#W_dLkt#u@Tq?V#{trF(&_ANz+WCbT?YG~~&U@c{@6G)4+0q+RH zH>2~*AyOlH>8_q_yQT8Vzs6>7pAB>FBwq5t#2acVW{Y|-k9_N(} z`|M@cW-ixukka~|j*T6;#g@H_&ZpFKoa;zy(BF}ZiF~XAk5n9{lq8Lwsk}0B)A=%_ zWN}QGhR$lct{0!3FD!lDq1N5@xxfoo`HVLfu2NdqI+K6KlLP1T@LY$O((Z11m)pCq z)7F=(85oTSsIm5L78biD4y@}7W$9s|y!x(w8C3#4u^bN+aE;g<#7Y2uh1&iB_Og+~Q(_=q9E~m#-@;IwvA`q&lZxM4* h*%@3qXG)dNj%J6mBiduQgCI)C^*rfJ|1>cX{{#HHSPlRH literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-tr_TR.po b/app/core/puc/languages/plugin-update-checker-tr_TR.po new file mode 100755 index 0000000..03c4c73 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-tr_TR.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-11-24 17:02+0200\n" +"PO-Revision-Date: 2021-11-15 19:07+0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.0\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Emre Erkan \n" +"Language: tr\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "Güncellemeleri kontrol et" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "%s eklentisi güncel." + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "%s eklentisinin yeni bir sürümü mevcut." + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "%s için güncelleme olup olmadığı belirlenemedi." + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Bilinmeyen güncelleme denetleyicisi durumu \"%s\"" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "Kullanılabilir bir değişiklik yok." diff --git a/app/core/puc/languages/plugin-update-checker-uk_UA.mo b/app/core/puc/languages/plugin-update-checker-uk_UA.mo new file mode 100755 index 0000000000000000000000000000000000000000..79494e524ebd28dcba540d54c7f4949d5a436508 GIT binary patch literal 1309 zcmZuwO>YxN7#`a6L*`J?a}O_(LZM-{yPHs=HA@94(heN%>IG?f}VQqrO)i<3(}EaKQpuM^S;mXuKm}?6TdL5 z4-lUqT8QI_M+mz{h!cpH2txdcm_+=I2oWD0V{9I{0OY`*fFHiY*zdqkasK07#^!+k z0KW!KPcZfwPy>GiZUIjM{{@0lF3=g$8LrrS7n+;~Zn09Ae7m55^u^L;)2YDX%eD1sCoe$2Pn+DIVUB`^`s3&+!L@NQ+7OpMK zABgZAx7J9d7E<%podLROaa(^rNTOKQ?F&+w(BWe13ZFa3Q<2P;gyQqElXhd-3ux|U ztZP5;t3nDD=~M;OOhq@=YbLph5`HCBD_KAi?-R!?oT=Nv zU>ly6Q=S`!9-TTxcI%!DJ&(R5mynM0#n9h-bRnFz+mhj4@O-*^x1wD1X3v1)f#RR3 zA1L`Q%~eMhzoN%w4#yF|%c!7x&C_^Q71Wj*16nL}tf~5l_rE9*oVn*kI-{wy(^v z_?gTzvs2tJ9u({5b(#0n?2!4jSOhGx51C-cI*DmKm7sfZ|UStu|vFUgWo2?dJ# zgc^qh{C1>$@u>QfL4lPtBz%E^BAdmA{e{1!XIS;LY0s>hQtXC3j-Uzxi-(oXvt)N~ e(TmOhac^_B%Vwy(g_1+_)VeFXzd5TNhy4cu&FZoM literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-uk_UA.po b/app/core/puc/languages/plugin-update-checker-uk_UA.po new file mode 100755 index 0000000..f2821f8 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-uk_UA.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2020-08-08 14:36+0300\n" +"PO-Revision-Date: 2021-12-20 17:55+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: \n" +"Language: uk_UA\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p11/Plugin/Ui.php:128 +msgid "Check for updates" +msgstr "Перевірити оновлення" + +#: Puc/v4p11/Plugin/Ui.php:213 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "Плагін %s оновлено." + +#: Puc/v4p11/Plugin/Ui.php:215 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "Нова версія %s доступна." + +#: Puc/v4p11/Plugin/Ui.php:217 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "Не вдалося визначити, чи доступні оновлення для %s." + +#: Puc/v4p11/Plugin/Ui.php:223 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "Невідомий статус перевірки оновлень \"%s\"" + +#: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 +msgid "There is no changelog available." +msgstr "Немає доступного журналу змін." diff --git a/app/core/puc/languages/plugin-update-checker-zh_CN.mo b/app/core/puc/languages/plugin-update-checker-zh_CN.mo new file mode 100755 index 0000000000000000000000000000000000000000..c0fc4055778c6587af79724223e28c087346aa9c GIT binary patch literal 1060 zcmZ`%&ubGw6dtwyAPS;aMIMD*)QOwWL)aKmV=L8GgH6R-*ls4t+RaRynN3>{62*fR zMWNP~Hd2dJM5GZFQSb+z{TuWm*<1ww1>YuVQz;I7`|W%C-ka}x$($rpPnMb;LKs9*nPTBjgbB4P-!m(uuzy zAIA6x@&V*sJ%nIO>ukj*rU|CV_Ev_F9UTsIwoa~Y8o30^s8X{Jb~$Rq9iS%i%8aV{o!rvYnl0+XP$r9B0`Vbx1?kwMw@3JwSDXqWYz0?sC& z!lZHp2a$)MBCOVm@U{&XZ0b%4&&{D84LPQnEIAwn=GPR1g?iW9TVBE{vRMNf`}az( z3|c_oIzrM?TxGVVgE@M+tqwU4ej?Yl~BE7^aPGE$d!Cn($M$Di_oEm*##LcL2 z#E2V4Xb4y5Sp`Nj%qp1>8Xg?(@6L`!j8IB&&A6tSsWMK{Y*HU9yOzTf!QQ1}Iyssd zpz&^2_bW8$WhvaY&MZ) ziR`2qJsPu-aRUm?1)|-ywh@NR;hcl3f#a$bovdgn92K!e>BRcZOt@amrY>yI!7OPP z)98U3=psb?XH|b`#b12qKYmU8H_Lu)y78dieDtEZaJ!xL=T;hD=YCah5x@4bxwO*# z&}wboeeYLq{`s^JRs{cujn6ZU>HC|f1pWBgpL^=Rooz0!HdYt>`Fi8w^Z%AM7gvKx S^L4*gMRCpPJAUm|Fy=2vaBdI) literal 0 HcmV?d00001 diff --git a/app/core/puc/languages/plugin-update-checker-zh_CN.po b/app/core/puc/languages/plugin-update-checker-zh_CN.po new file mode 100755 index 0000000..b82d831 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker-zh_CN.po @@ -0,0 +1,48 @@ +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2017-11-24 17:02+0200\n" +"PO-Revision-Date: 2020-08-04 08:10+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"Last-Translator: Seaton Jiang \n" +"Language: zh_CN\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p3/Plugin/UpdateChecker.php:395 +msgid "Check for updates" +msgstr "检查更新" + +#: Puc/v4p3/Plugin/UpdateChecker.php:548 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "%s 目前是最新版本。" + +#: Puc/v4p3/Plugin/UpdateChecker.php:550 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "%s 当前有可用的更新。" + +#: Puc/v4p3/Plugin/UpdateChecker.php:552 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "%s 无法确定是否有可用的更新。" + +#: Puc/v4p3/Plugin/UpdateChecker.php:558 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "未知的更新检查状态:%s" + +#: Puc/v4p3/Vcs/PluginUpdateChecker.php:95 +msgid "There is no changelog available." +msgstr "没有可用的更新日志。" diff --git a/app/core/puc/languages/plugin-update-checker.pot b/app/core/puc/languages/plugin-update-checker.pot new file mode 100755 index 0000000..a594c79 --- /dev/null +++ b/app/core/puc/languages/plugin-update-checker.pot @@ -0,0 +1,49 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: plugin-update-checker\n" +"POT-Creation-Date: 2020-08-08 14:36+0300\n" +"PO-Revision-Date: 2016-01-10 20:59+0100\n" +"Last-Translator: Tamás András Horváth \n" +"Language-Team: \n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_x:1,2c;_x\n" +"X-Poedit-SearchPath-0: .\n" + +#: Puc/v4p11/Plugin/Ui.php:128 +msgid "Check for updates" +msgstr "" + +#: Puc/v4p11/Plugin/Ui.php:213 +#, php-format +msgctxt "the plugin title" +msgid "The %s plugin is up to date." +msgstr "" + +#: Puc/v4p11/Plugin/Ui.php:215 +#, php-format +msgctxt "the plugin title" +msgid "A new version of the %s plugin is available." +msgstr "" + +#: Puc/v4p11/Plugin/Ui.php:217 +#, php-format +msgctxt "the plugin title" +msgid "Could not determine if updates are available for %s." +msgstr "" + +#: Puc/v4p11/Plugin/Ui.php:223 +#, php-format +msgid "Unknown update checker status \"%s\"" +msgstr "" + +#: Puc/v4p11/Vcs/PluginUpdateChecker.php:98 +msgid "There is no changelog available." +msgstr "" diff --git a/app/core/puc/license.txt b/app/core/puc/license.txt new file mode 100755 index 0000000..b194df8 --- /dev/null +++ b/app/core/puc/license.txt @@ -0,0 +1,7 @@ +Copyright (c) 2017 Jānis Elsts + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app/core/puc/load-v4p11.php b/app/core/puc/load-v4p11.php new file mode 100755 index 0000000..6478b13 --- /dev/null +++ b/app/core/puc/load-v4p11.php @@ -0,0 +1,28 @@ + 'Puc_v4p11_Plugin_UpdateChecker', + 'Theme_UpdateChecker' => 'Puc_v4p11_Theme_UpdateChecker', + + 'Vcs_PluginUpdateChecker' => 'Puc_v4p11_Vcs_PluginUpdateChecker', + 'Vcs_ThemeUpdateChecker' => 'Puc_v4p11_Vcs_ThemeUpdateChecker', + + 'GitHubApi' => 'Puc_v4p11_Vcs_GitHubApi', + 'BitBucketApi' => 'Puc_v4p11_Vcs_BitBucketApi', + 'GitLabApi' => 'Puc_v4p11_Vcs_GitLabApi', + ) + as $pucGeneralClass => $pucVersionedClass +) { + Puc_v4_Factory::addVersion($pucGeneralClass, $pucVersionedClass, '4.11'); + //Also add it to the minor-version factory in case the major-version factory + //was already defined by another, older version of the update checker. + Puc_v4p11_Factory::addVersion($pucGeneralClass, $pucVersionedClass, '4.11'); +} + diff --git a/app/core/puc/plugin-update-checker.php b/app/core/puc/plugin-update-checker.php new file mode 100755 index 0000000..ad60818 --- /dev/null +++ b/app/core/puc/plugin-update-checker.php @@ -0,0 +1,10 @@ +=') ) { + require __DIR__ . '/ParsedownModern.php'; + } else { + require __DIR__ . '/ParsedownLegacy.php'; + } +} diff --git a/app/core/puc/vendor/ParsedownLegacy.php b/app/core/puc/vendor/ParsedownLegacy.php new file mode 100755 index 0000000..3ecd1f5 --- /dev/null +++ b/app/core/puc/vendor/ParsedownLegacy.php @@ -0,0 +1,1535 @@ +DefinitionData = []; + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + $markup = $this->lines($lines); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + # + # Setters + # + + function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + protected $breaksEnabled; + + function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + protected $markupEscaped; + + function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + # + # Lines + # + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + # ~ + + protected $DefinitionTypes = array( + '[' => array('Reference'), + ); + + # ~ + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + # + # Blocks + # + + private function lines(array $lines) + { + $CurrentBlock = null; + + foreach ($lines as $line) + { + if (chop($line) === '') + { + if (isset($CurrentBlock)) + { + $CurrentBlock['interrupted'] = true; + } + + continue; + } + + if (strpos($line, "\t") !== false) + { + $parts = explode("\t", $line); + + $line = $parts[0]; + + unset($parts[0]); + + foreach ($parts as $part) + { + $shortage = 4 - mb_strlen($line, 'utf-8') % 4; + + $line .= str_repeat(' ', $shortage); + $line .= $part; + } + } + + $indent = 0; + + while (isset($line[$indent]) and $line[$indent] === ' ') + { + $indent ++; + } + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['incomplete'])) + { + $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); + + if (isset($Block)) + { + $CurrentBlock = $Block; + + continue; + } + else + { + if (method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + + unset($CurrentBlock['incomplete']); + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) + { + foreach ($this->BlockTypes[$marker] as $blockType) + { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) + { + $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); + + if (isset($Block)) + { + $Block['type'] = $blockType; + + if ( ! isset($Block['identified'])) + { + $Blocks []= $CurrentBlock; + + $Block['identified'] = true; + } + + if (method_exists($this, 'block'.$blockType.'Continue')) + { + $Block['incomplete'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) + { + $CurrentBlock['element']['text'] .= "\n".$text; + } + else + { + $Blocks []= $CurrentBlock; + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['incomplete']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete')) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + + # ~ + + $Blocks []= $CurrentBlock; + + unset($Blocks[0]); + + # ~ + + $markup = ''; + + foreach ($Blocks as $Block) + { + if (isset($Block['hidden'])) + { + continue; + } + + $markup .= "\n"; + $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); + } + + $markup .= "\n"; + + # ~ + + return $markup; + } + + # + # Code + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) + { + return; + } + + if ($Line['indent'] >= 4) + { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['element']['text']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['text']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Comment + + protected function blockComment($Line) + { + if ($this->markupEscaped) + { + return; + } + + if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') + { + $Block = array( + 'markup' => $Line['body'], + ); + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + $Block['markup'] .= "\n" . $Line['body']; + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + + # + # Fenced Code + + protected function blockFencedCode($Line) + { + if (preg_match('/^(['.$Line['text'][0].']{3,})[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) + { + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if (isset($matches[2])) + { + $class = 'language-'.$matches[2]; + + $Element['attributes'] = array( + 'class' => $class, + ); + } + + $Block = array( + 'char' => $Line['text'][0], + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => $Element, + ), + ); + + return $Block; + } + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) + { + return; + } + + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) + { + $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['text']['text'] .= "\n".$Line['body'];; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Header + + protected function blockHeader($Line) + { + if (isset($Line['text'][1])) + { + $level = 1; + + while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') + { + $level ++; + } + + if ($level > 6) + { + return; + } + + $text = trim($Line['text'], '# '); + + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'text' => $text, + 'handler' => 'line', + ), + ); + + return $Block; + } + } + + # + # List + + protected function blockList($Line) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); + + if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'element' => array( + 'name' => $name, + 'handler' => 'elements', + ), + ); + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $matches[2], + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['li']['text'] []= ''; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $text, + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) + { + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + return $Block; + } + + if ($Line['indent'] > 0) + { + $Block['li']['text'] []= ''; + + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + unset($Block['interrupted']); + + return $Block; + } + } + + # + # Quote + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => 'lines', + 'text' => (array) $matches[1], + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text'] []= ''; + + unset($Block['interrupted']); + } + + $Block['element']['text'] []= $matches[1]; + + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $Block['element']['text'] []= $Line['text']; + + return $Block; + } + } + + # + # Rule + + protected function blockRule($Line) + { + if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) + { + $Block = array( + 'element' => array( + 'name' => 'hr' + ), + ); + + return $Block; + } + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (chop($Line['text'], $Line['text'][0]) === '') + { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped) + { + return; + } + + if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) + { + if (in_array($matches[1], $this->textLevelElements)) + { + return; + } + + $Block = array( + 'name' => $matches[1], + 'depth' => 0, + 'markup' => $Line['text'], + ); + + $length = strlen($matches[0]); + + $remainder = substr($Line['text'], $length); + + if (trim($remainder) === '') + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + $Block['closed'] = true; + + $Block['void'] = true; + } + } + else + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + return; + } + + if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) + { + $Block['closed'] = true; + } + } + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open + { + $Block['depth'] ++; + } + + if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close + { + if ($Block['depth'] > 0) + { + $Block['depth'] --; + } + else + { + $Block['closed'] = true; + } + + $Block['markup'] .= $matches[1]; + } + + if (isset($Block['interrupted'])) + { + $Block['markup'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['markup'] .= "\n".$Line['body']; + + return $Block; + } + + # + # Reference + + protected function blockReference($Line) + { + if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) + { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => null, + ); + + if (isset($matches[3])) + { + $Data['title'] = $matches[3]; + } + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + # + # Table + + protected function blockTable($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') + { + $alignments = []; + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) + { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') + { + continue; + } + + $alignment = null; + + if ($dividerCell[0] === ':') + { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') + { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = []; + + $header = $Block['element']['text']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + foreach ($headerCells as $index => $headerCell) + { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'text' => $headerCell, + 'handler' => 'line', + ); + + if (isset($alignments[$index])) + { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => 'text-align: '.$alignment.';', + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'handler' => 'elements', + ), + ); + + $Block['element']['text'] []= array( + 'name' => 'thead', + 'handler' => 'elements', + ); + + $Block['element']['text'] []= array( + 'name' => 'tbody', + 'handler' => 'elements', + 'text' => array(), + ); + + $Block['element']['text'][0]['text'] []= array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $HeaderElements, + ); + + return $Block; + } + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) + { + $Elements = []; + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); + + foreach ($matches[0] as $index => $cell) + { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => 'line', + 'text' => $cell, + ); + + if (isset($Block['alignments'][$index])) + { + $Element['attributes'] = array( + 'style' => 'text-align: '.$Block['alignments'][$index].';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $Elements, + ); + + $Block['element']['text'][1]['text'] []= $Element; + + return $Block; + } + } + + # + # ~ + # + + protected function paragraph($Line) + { + $Block = array( + 'element' => array( + 'name' => 'p', + 'text' => $Line['text'], + 'handler' => 'line', + ), + ); + + return $Block; + } + + # + # Inline Elements + # + + protected $InlineTypes = array( + '"' => array('SpecialCharacter'), + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), + '>' => array('SpecialCharacter'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + # ~ + + protected $inlineMarkerList = '!"*_&[:<>`~\\'; + + # + # ~ + # + + public function line($text) + { + $markup = ''; + + $unexaminedText = $text; + + $markerPosition = 0; + + while ($excerpt = strpbrk($unexaminedText, $this->inlineMarkerList)) + { + $marker = $excerpt[0]; + + $markerPosition += strpos($unexaminedText, $marker); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) + { + $Inline = $this->{'inline'.$inlineType}($Excerpt); + + if ( ! isset($Inline)) + { + continue; + } + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) # position is ahead of marker + { + continue; + } + + if ( ! isset($Inline['position'])) + { + $Inline['position'] = $markerPosition; + } + + $unmarkedText = substr($text, 0, $Inline['position']); + + $markup .= $this->unmarkedText($unmarkedText); + + $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + + $text = substr($text, $Inline['position'] + $Inline['extent']); + + $unexaminedText = $text; + + $markerPosition = 0; + + continue 2; + } + + $unexaminedText = substr($excerpt, 1); + + $markerPosition ++; + } + + $markup .= $this->unmarkedText($text); + + return $markup; + } + + # + # ~ + # + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) + { + $url = $matches[1]; + + if ( ! isset($matches[2])) + { + $url = 'mailto:' . $url; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'strong'; + } + elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'em'; + } + else + { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => 'line', + 'text' => $matches[1], + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) + { + return array( + 'markup' => $Excerpt['text'][1], + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') + { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) + { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['text'], + ), + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => 'line', + 'text' => null, + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) + { + $Element['text'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } + else + { + return; + } + + if (preg_match('/^[(]((?:[^ (]|[(][^ )]+[)])+)(?:[ ]+("[^"]+"|\'[^\']+\'))?[)]/', $remainder, $matches)) + { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) + { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } + else + { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) + { + $definition = $matches[1] ? $matches[1] : $Element['text']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } + else + { + $definition = strtolower($Element['text']); + } + + if ( ! isset($this->DefinitionData['Reference'][$definition])) + { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) + { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) + { + return array( + 'markup' => '&', + 'extent' => 1, + ); + } + + $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); + + if (isset($SpecialCharacter[$Excerpt['text'][0]])) + { + return array( + 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', + 'extent' => 1, + ); + } + } + + protected function inlineStrikethrough($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) + { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'text' => $matches[1], + 'handler' => 'line', + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') + { + return; + } + + if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) + { + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $matches[0][0], + 'attributes' => array( + 'href' => $matches[0][0], + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) + { + $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + # + # ~ + + protected $unmarkedInlineTypes = array("\n" => 'Break', '://' => 'Url'); + + # ~ + + protected function unmarkedText($text) + { + if ($this->breaksEnabled) + { + $text = preg_replace('/[ ]*\n/', "
\n", $text); + } + else + { + $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
\n", $text); + $text = str_replace(" \n", "\n", $text); + } + + return $text; + } + + # + # Handlers + # + + protected function element(array $Element) + { + $markup = '<'.$Element['name']; + + if (isset($Element['attributes'])) + { + foreach ($Element['attributes'] as $name => $value) + { + if ($value === null) + { + continue; + } + + $markup .= ' '.$name.'="'.$value.'"'; + } + } + + if (isset($Element['text'])) + { + $markup .= '>'; + + if (isset($Element['handler'])) + { + $markup .= $this->{$Element['handler']}($Element['text']); + } + else + { + $markup .= $Element['text']; + } + + $markup .= ''; + } + else + { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + foreach ($Elements as $Element) + { + $markup .= "\n" . $this->element($Element); + } + + $markup .= "\n"; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $markup = $this->lines($lines); + + $trimmedMarkup = trim($markup); + + if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

') + { + $markup = $trimmedMarkup; + $markup = substr($markup, 3); + + $position = strpos($markup, "

"); + + $markup = substr_replace($markup, '', $position, 4); + } + + return $markup; + } + + # + # Deprecated Methods + # + + function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + # + # Static Methods + # + + static function instance($name = 'default') + { + if (isset(self::$instances[$name])) + { + return self::$instances[$name]; + } + + $instance = new self(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = []; + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'sub', 'mark', + 'u', 'xm', 'sup', 'nobr', + 'var', 'ruby', + 'wbr', 'span', + 'time', + ); +} diff --git a/app/core/puc/vendor/ParsedownModern.php b/app/core/puc/vendor/ParsedownModern.php new file mode 100755 index 0000000..0970796 --- /dev/null +++ b/app/core/puc/vendor/ParsedownModern.php @@ -0,0 +1,1538 @@ +DefinitionData = []; + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + $markup = $this->lines($lines); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + # + # Setters + # + + function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + protected $breaksEnabled; + + function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + protected $markupEscaped; + + function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + # + # Lines + # + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + # ~ + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + # + # Blocks + # + + protected function lines(array $lines) + { + $CurrentBlock = null; + + foreach ($lines as $line) + { + if (chop($line) === '') + { + if (isset($CurrentBlock)) + { + $CurrentBlock['interrupted'] = true; + } + + continue; + } + + if (strpos($line, "\t") !== false) + { + $parts = explode("\t", $line); + + $line = $parts[0]; + + unset($parts[0]); + + foreach ($parts as $part) + { + $shortage = 4 - mb_strlen($line, 'utf-8') % 4; + + $line .= str_repeat(' ', $shortage); + $line .= $part; + } + } + + $indent = 0; + + while (isset($line[$indent]) and $line[$indent] === ' ') + { + $indent ++; + } + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['continuable'])) + { + $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); + + if (isset($Block)) + { + $CurrentBlock = $Block; + + continue; + } + else + { + if ($this->isBlockCompletable($CurrentBlock['type'])) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) + { + foreach ($this->BlockTypes[$marker] as $blockType) + { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) + { + $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); + + if (isset($Block)) + { + $Block['type'] = $blockType; + + if ( ! isset($Block['identified'])) + { + $Blocks []= $CurrentBlock; + + $Block['identified'] = true; + } + + if ($this->isBlockContinuable($blockType)) + { + $Block['continuable'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) + { + $CurrentBlock['element']['text'] .= "\n".$text; + } + else + { + $Blocks []= $CurrentBlock; + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) + { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + + # ~ + + $Blocks []= $CurrentBlock; + + unset($Blocks[0]); + + # ~ + + $markup = ''; + + foreach ($Blocks as $Block) + { + if (isset($Block['hidden'])) + { + continue; + } + + $markup .= "\n"; + $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); + } + + $markup .= "\n"; + + # ~ + + return $markup; + } + + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block'.$Type.'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block'.$Type.'Complete'); + } + + # + # Code + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) + { + return; + } + + if ($Line['indent'] >= 4) + { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['element']['text']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['text']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Comment + + protected function blockComment($Line) + { + if ($this->markupEscaped) + { + return; + } + + if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') + { + $Block = array( + 'markup' => $Line['body'], + ); + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + $Block['markup'] .= "\n" . $Line['body']; + + if (preg_match('/-->$/', $Line['text'])) + { + $Block['closed'] = true; + } + + return $Block; + } + + # + # Fenced Code + + protected function blockFencedCode($Line) + { + if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) + { + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if (isset($matches[1])) + { + $class = 'language-'.$matches[1]; + + $Element['attributes'] = array( + 'class' => $class, + ); + } + + $Block = array( + 'char' => $Line['text'][0], + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => $Element, + ), + ); + + return $Block; + } + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) + { + return; + } + + if (isset($Block['interrupted'])) + { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) + { + $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['text']['text'] .= "\n".$Line['body'];; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + # + # Header + + protected function blockHeader($Line) + { + if (isset($Line['text'][1])) + { + $level = 1; + + while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') + { + $level ++; + } + + if ($level > 6) + { + return; + } + + $text = trim($Line['text'], '# '); + + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'text' => $text, + 'handler' => 'line', + ), + ); + + return $Block; + } + } + + # + # List + + protected function blockList($Line) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); + + if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'element' => array( + 'name' => $name, + 'handler' => 'elements', + ), + ); + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $matches[2], + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['li']['text'] []= ''; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $text, + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) + { + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + return $Block; + } + + if ($Line['indent'] > 0) + { + $Block['li']['text'] []= ''; + + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + unset($Block['interrupted']); + + return $Block; + } + } + + # + # Quote + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => 'lines', + 'text' => (array) $matches[1], + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) + { + if (isset($Block['interrupted'])) + { + $Block['element']['text'] []= ''; + + unset($Block['interrupted']); + } + + $Block['element']['text'] []= $matches[1]; + + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $Block['element']['text'] []= $Line['text']; + + return $Block; + } + } + + # + # Rule + + protected function blockRule($Line) + { + if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) + { + $Block = array( + 'element' => array( + 'name' => 'hr' + ), + ); + + return $Block; + } + } + + # + # Setext + + protected function blockSetextHeader($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (chop($Line['text'], $Line['text'][0]) === '') + { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped) + { + return; + } + + if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) + { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) + { + return; + } + + $Block = array( + 'name' => $matches[1], + 'depth' => 0, + 'markup' => $Line['text'], + ); + + $length = strlen($matches[0]); + + $remainder = substr($Line['text'], $length); + + if (trim($remainder) === '') + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + $Block['closed'] = true; + + $Block['void'] = true; + } + } + else + { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) + { + return; + } + + if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) + { + $Block['closed'] = true; + } + } + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open + { + $Block['depth'] ++; + } + + if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close + { + if ($Block['depth'] > 0) + { + $Block['depth'] --; + } + else + { + $Block['closed'] = true; + } + } + + if (isset($Block['interrupted'])) + { + $Block['markup'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['markup'] .= "\n".$Line['body']; + + return $Block; + } + + # + # Reference + + protected function blockReference($Line) + { + if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) + { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => null, + ); + + if (isset($matches[3])) + { + $Data['title'] = $matches[3]; + } + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + # + # Table + + protected function blockTable($Line, array $Block = null) + { + if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) + { + return; + } + + if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') + { + $alignments = []; + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) + { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') + { + continue; + } + + $alignment = null; + + if ($dividerCell[0] === ':') + { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') + { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = []; + + $header = $Block['element']['text']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + foreach ($headerCells as $index => $headerCell) + { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'text' => $headerCell, + 'handler' => 'line', + ); + + if (isset($alignments[$index])) + { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => 'text-align: '.$alignment.';', + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'handler' => 'elements', + ), + ); + + $Block['element']['text'] []= array( + 'name' => 'thead', + 'handler' => 'elements', + ); + + $Block['element']['text'] []= array( + 'name' => 'tbody', + 'handler' => 'elements', + 'text' => array(), + ); + + $Block['element']['text'][0]['text'] []= array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $HeaderElements, + ); + + return $Block; + } + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) + { + $Elements = []; + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); + + foreach ($matches[0] as $index => $cell) + { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => 'line', + 'text' => $cell, + ); + + if (isset($Block['alignments'][$index])) + { + $Element['attributes'] = array( + 'style' => 'text-align: '.$Block['alignments'][$index].';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $Elements, + ); + + $Block['element']['text'][1]['text'] []= $Element; + + return $Block; + } + } + + # + # ~ + # + + protected function paragraph($Line) + { + $Block = array( + 'element' => array( + 'name' => 'p', + 'text' => $Line['text'], + 'handler' => 'line', + ), + ); + + return $Block; + } + + # + # Inline Elements + # + + protected $InlineTypes = array( + '"' => array('SpecialCharacter'), + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), + '>' => array('SpecialCharacter'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + # ~ + + protected $inlineMarkerList = '!"*_&[:<>`~\\'; + + # + # ~ + # + + public function line($text) + { + $markup = ''; + + # $excerpt is based on the first occurrence of a marker + + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) + { + $marker = $excerpt[0]; + + $markerPosition = strpos($text, $marker); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) + { + $Inline = $this->{'inline'.$inlineType}($Excerpt); + + if ( ! isset($Inline)) + { + continue; + } + + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) + { + continue; + } + + # sets a default inline position + + if ( ! isset($Inline['position'])) + { + $Inline['position'] = $markerPosition; + } + + # the text that comes before the inline + $unmarkedText = substr($text, 0, $Inline['position']); + + # compile the unmarked text + $markup .= $this->unmarkedText($unmarkedText); + + # compile the inline + $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + + # remove the examined text + $text = substr($text, $Inline['position'] + $Inline['extent']); + + continue 2; + } + + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $markup .= $this->unmarkedText($unmarkedText); + + $text = substr($text, $markerPosition + 1); + } + + $markup .= $this->unmarkedText($text); + + return $markup; + } + + # + # ~ + # + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) + { + $url = $matches[1]; + + if ( ! isset($matches[2])) + { + $url = 'mailto:' . $url; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'strong'; + } + elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'em'; + } + else + { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => 'line', + 'text' => $matches[1], + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) + { + return array( + 'markup' => $Excerpt['text'][1], + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') + { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) + { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['text'], + ), + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => 'line', + 'text' => null, + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) + { + $Element['text'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } + else + { + return; + } + + if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) + { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) + { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } + else + { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) + { + $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } + else + { + $definition = strtolower($Element['text']); + } + + if ( ! isset($this->DefinitionData['Reference'][$definition])) + { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) + { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) + { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) + { + return array( + 'markup' => '&', + 'extent' => 1, + ); + } + + $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); + + if (isset($SpecialCharacter[$Excerpt['text'][0]])) + { + return array( + 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', + 'extent' => 1, + ); + } + } + + protected function inlineStrikethrough($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) + { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'text' => $matches[1], + 'handler' => 'line', + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') + { + return; + } + + if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) + { + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $matches[0][0], + 'attributes' => array( + 'href' => $matches[0][0], + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) + { + $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + # ~ + + protected function unmarkedText($text) + { + if ($this->breaksEnabled) + { + $text = preg_replace('/[ ]*\n/', "
\n", $text); + } + else + { + $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
\n", $text); + $text = str_replace(" \n", "\n", $text); + } + + return $text; + } + + # + # Handlers + # + + protected function element(array $Element) + { + $markup = '<'.$Element['name']; + + if (isset($Element['attributes'])) + { + foreach ($Element['attributes'] as $name => $value) + { + if ($value === null) + { + continue; + } + + $markup .= ' '.$name.'="'.$value.'"'; + } + } + + if (isset($Element['text'])) + { + $markup .= '>'; + + if (isset($Element['handler'])) + { + $markup .= $this->{$Element['handler']}($Element['text']); + } + else + { + $markup .= $Element['text']; + } + + $markup .= ''; + } + else + { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + foreach ($Elements as $Element) + { + $markup .= "\n" . $this->element($Element); + } + + $markup .= "\n"; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $markup = $this->lines($lines); + + $trimmedMarkup = trim($markup); + + if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

') + { + $markup = $trimmedMarkup; + $markup = substr($markup, 3); + + $position = strpos($markup, "

"); + + $markup = substr_replace($markup, '', $position, 4); + } + + return $markup; + } + + # + # Deprecated Methods + # + + function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + # + # Static Methods + # + + static function instance($name = 'default') + { + if (isset(self::$instances[$name])) + { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = []; + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'sub', 'mark', + 'u', 'xm', 'sup', 'nobr', + 'var', 'ruby', + 'wbr', 'span', + 'time', + ); +} \ No newline at end of file diff --git a/app/core/puc/vendor/PucReadmeParser.php b/app/core/puc/vendor/PucReadmeParser.php new file mode 100755 index 0000000..40d1bb3 --- /dev/null +++ b/app/core/puc/vendor/PucReadmeParser.php @@ -0,0 +1,348 @@ +parse_readme_contents( $file_contents ); + } + + function parse_readme_contents( $file_contents ) { + $file_contents = str_replace(array("\r\n", "\r"), "\n", $file_contents); + $file_contents = trim($file_contents); + if ( 0 === strpos( $file_contents, "\xEF\xBB\xBF" ) ) + $file_contents = substr( $file_contents, 3 ); + + // Markdown transformations + $file_contents = preg_replace( "|^###([^#]+)#*?\s*?\n|im", '=$1='."\n", $file_contents ); + $file_contents = preg_replace( "|^##([^#]+)#*?\s*?\n|im", '==$1=='."\n", $file_contents ); + $file_contents = preg_replace( "|^#([^#]+)#*?\s*?\n|im", '===$1==='."\n", $file_contents ); + + // === Plugin Name === + // Must be the very first thing. + if ( !preg_match('|^===(.*)===|', $file_contents, $_name) ) + return []; // require a name + $name = trim($_name[1], '='); + $name = $this->sanitize_text( $name ); + + $file_contents = $this->chop_string( $file_contents, $_name[0] ); + + + // Requires at least: 1.5 + if ( preg_match('|Requires at least:(.*)|i', $file_contents, $_requires_at_least) ) + $requires_at_least = $this->sanitize_text($_requires_at_least[1]); + else + $requires_at_least = NULL; + + + // Tested up to: 2.1 + if ( preg_match('|Tested up to:(.*)|i', $file_contents, $_tested_up_to) ) + $tested_up_to = $this->sanitize_text( $_tested_up_to[1] ); + else + $tested_up_to = NULL; + + // Requires PHP: 5.2.4 + if ( preg_match('|Requires PHP:(.*)|i', $file_contents, $_requires_php) ) { + $requires_php = $this->sanitize_text( $_requires_php[1] ); + } else { + $requires_php = null; + } + + // Stable tag: 10.4-ride-the-fire-eagle-danger-day + if ( preg_match('|Stable tag:(.*)|i', $file_contents, $_stable_tag) ) + $stable_tag = $this->sanitize_text( $_stable_tag[1] ); + else + $stable_tag = NULL; // we assume trunk, but don't set it here to tell the difference between specified trunk and default trunk + + + // Tags: some tag, another tag, we like tags + if ( preg_match('|Tags:(.*)|i', $file_contents, $_tags) ) { + $tags = preg_split('|,[\s]*?|', trim($_tags[1])); + foreach ( array_keys($tags) as $t ) + $tags[$t] = $this->sanitize_text( $tags[$t] ); + } else { + $tags = []; + } + + + // Contributors: markjaquith, mdawaffe, zefrank + $contributors = []; + if ( preg_match('|Contributors:(.*)|i', $file_contents, $_contributors) ) { + $temp_contributors = preg_split('|,[\s]*|', trim($_contributors[1])); + foreach ( array_keys($temp_contributors) as $c ) { + $tmp_sanitized = $this->user_sanitize( $temp_contributors[$c] ); + if ( strlen(trim($tmp_sanitized)) > 0 ) + $contributors[$c] = $tmp_sanitized; + unset($tmp_sanitized); + } + } + + + // Donate Link: URL + if ( preg_match('|Donate link:(.*)|i', $file_contents, $_donate_link) ) + $donate_link = esc_url( $_donate_link[1] ); + else + $donate_link = NULL; + + + // togs, conts, etc are optional and order shouldn't matter. So we chop them only after we've grabbed their values. + foreach ( array('tags', 'contributors', 'requires_at_least', 'tested_up_to', 'stable_tag', 'donate_link') as $chop ) { + if ( $$chop ) { + $_chop = '_' . $chop; + $file_contents = $this->chop_string( $file_contents, ${$_chop}[0] ); + } + } + + $file_contents = trim($file_contents); + + + // short-description fu + if ( !preg_match('/(^(.*?))^[\s]*=+?[\s]*.+?[\s]*=+?/ms', $file_contents, $_short_description) ) + $_short_description = array( 1 => &$file_contents, 2 => &$file_contents ); + $short_desc_filtered = $this->sanitize_text( $_short_description[2] ); + $short_desc_length = strlen($short_desc_filtered); + $short_description = substr($short_desc_filtered, 0, 150); + if ( $short_desc_length > strlen($short_description) ) + $truncated = true; + else + $truncated = false; + if ( $_short_description[1] ) + $file_contents = $this->chop_string( $file_contents, $_short_description[1] ); // yes, the [1] is intentional + + // == Section == + // Break into sections + // $_sections[0] will be the title of the first section, $_sections[1] will be the content of the first section + // the array alternates from there: title2, content2, title3, content3... and so forth + $_sections = preg_split('/^[\s]*==[\s]*(.+?)[\s]*==/m', $file_contents, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + + $sections = []; + for ( $i=0; $i < count($_sections); $i +=2 ) { + $title = $this->sanitize_text( $_sections[$i] ); + if ( isset($_sections[$i+1]) ) { + $content = preg_replace('/(^[\s]*)=[\s]+(.+?)[\s]+=/m', '$1

$2

', $_sections[$i+1]); + $content = $this->filter_text( $content, true ); + } else { + $content = ''; + } + $sections[str_replace(' ', '_', strtolower($title))] = array('title' => $title, 'content' => $content); + } + + + // Special sections + // This is where we nab our special sections, so we can enforce their order and treat them differently, if needed + // upgrade_notice is not a section, but parse it like it is for now + $final_sections = []; + foreach ( array('description', 'installation', 'frequently_asked_questions', 'screenshots', 'changelog', 'change_log', 'upgrade_notice') as $special_section ) { + if ( isset($sections[$special_section]) ) { + $final_sections[$special_section] = $sections[$special_section]['content']; + unset($sections[$special_section]); + } + } + if ( isset($final_sections['change_log']) && empty($final_sections['changelog']) ) + $final_sections['changelog'] = $final_sections['change_log']; + + + $final_screenshots = []; + if ( isset($final_sections['screenshots']) ) { + preg_match_all('|
  • (.*?)
  • |s', $final_sections['screenshots'], $screenshots, PREG_SET_ORDER); + if ( $screenshots ) { + foreach ( (array) $screenshots as $ss ) + $final_screenshots[] = $ss[1]; + } + } + + // Parse the upgrade_notice section specially: + // 1.0 => blah, 1.1 => fnord + $upgrade_notice = []; + if ( isset($final_sections['upgrade_notice']) ) { + $split = preg_split( '#

    (.*?)

    #', $final_sections['upgrade_notice'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + if ( count($split) >= 2 ) { + for ( $i = 0; $i < count( $split ); $i += 2 ) { + $upgrade_notice[$this->sanitize_text( $split[$i] )] = substr( $this->sanitize_text( $split[$i + 1] ), 0, 300 ); + } + } + unset( $final_sections['upgrade_notice'] ); + } + + // No description? + // No problem... we'll just fall back to the old style of description + // We'll even let you use markup this time! + $excerpt = false; + if ( !isset($final_sections['description']) ) { + $final_sections = array_merge(array('description' => $this->filter_text( $_short_description[2], true )), $final_sections); + $excerpt = true; + } + + + // dump the non-special sections into $remaining_content + // their order will be determined by their original order in the readme.txt + $remaining_content = ''; + foreach ( $sections as $s_name => $s_data ) { + $remaining_content .= "\n

    {$s_data['title']}

    \n{$s_data['content']}"; + } + $remaining_content = trim($remaining_content); + + + // All done! + // $r['tags'] and $r['contributors'] are simple arrays + // $r['sections'] is an array with named elements + $r = array( + 'name' => $name, + 'tags' => $tags, + 'requires_at_least' => $requires_at_least, + 'tested_up_to' => $tested_up_to, + 'requires_php' => $requires_php, + 'stable_tag' => $stable_tag, + 'contributors' => $contributors, + 'donate_link' => $donate_link, + 'short_description' => $short_description, + 'screenshots' => $final_screenshots, + 'is_excerpt' => $excerpt, + 'is_truncated' => $truncated, + 'sections' => $final_sections, + 'remaining_content' => $remaining_content, + 'upgrade_notice' => $upgrade_notice + ); + + return $r; + } + + function chop_string( $string, $chop ) { // chop a "prefix" from a string: Agressive! uses strstr not 0 === strpos + if ( $_string = strstr($string, $chop) ) { + $_string = substr($_string, strlen($chop)); + return trim($_string); + } else { + return trim($string); + } + } + + function user_sanitize( $text, $strict = false ) { // whitelisted chars + if ( function_exists('user_sanitize') ) // bbPress native + return user_sanitize( $text, $strict ); + + if ( $strict ) { + $text = preg_replace('/[^a-z0-9-]/i', '', $text); + $text = preg_replace('|-+|', '-', $text); + } else { + $text = preg_replace('/[^a-z0-9_-]/i', '', $text); + } + return $text; + } + + function sanitize_text( $text ) { // not fancy + $text = strip_tags($text); + $text = esc_html($text); + $text = trim($text); + return $text; + } + + function filter_text( $text, $markdown = false ) { // fancy, Markdown + $text = trim($text); + + $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE + + if ( $markdown ) { // Parse markdown. + if ( !class_exists('Parsedown', false) ) { + /** @noinspection PhpIncludeInspection */ + require_once(dirname(__FILE__) . '/Parsedown' . (version_compare(PHP_VERSION, '5.3.0', '>=') ? '' : 'Legacy') . '.php'); + } + $instance = Parsedown::instance(); + $text = $instance->text($text); + } + + $allowed = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'rel' => array()), + 'blockquote' => array('cite' => array()), + 'br' => array(), + 'p' => array(), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'h3' => array(), + 'h4' => array() + ); + + $text = balanceTags($text); + + $text = wp_kses( $text, $allowed ); + $text = trim($text); + return $text; + } + + function code_trick( $text, $markdown ) { // Don't use bbPress native function - it's incompatible with Markdown + // If doing markdown, first take any user formatted code blocks and turn them into backticks so that + // markdown will preserve things like underscores in code blocks + if ( $markdown ) + $text = preg_replace_callback("!(
    |)(.*?)(
    |)!s", array( __CLASS__,'decodeit'), $text); + + $text = str_replace(array("\r\n", "\r"), "\n", $text); + if ( !$markdown ) { + // This gets the "inline" code blocks, but can't be used with Markdown. + $text = preg_replace_callback("|(`)(.*?)`|", array( __CLASS__, 'encodeit'), $text); + // This gets the "block level" code blocks and converts them to PRE CODE + $text = preg_replace_callback("!(^|\n)`(.*?)`!s", array( __CLASS__, 'encodeit'), $text); + } else { + // Markdown can do inline code, we convert bbPress style block level code to Markdown style + $text = preg_replace_callback("!(^|\n)([ \t]*?)`(.*?)`!s", array( __CLASS__, 'indent'), $text); + } + return $text; + } + + function indent( $matches ) { + $text = $matches[3]; + $text = preg_replace('|^|m', $matches[2] . ' ', $text); + return $matches[1] . $text; + } + + function encodeit( $matches ) { + if ( function_exists('encodeit') ) // bbPress native + return encodeit( $matches ); + + $text = trim($matches[2]); + $text = htmlspecialchars($text, ENT_QUOTES); + $text = str_replace(array("\r\n", "\r"), "\n", $text); + $text = preg_replace("|\n\n\n+|", "\n\n", $text); + $text = str_replace('&lt;', '<', $text); + $text = str_replace('&gt;', '>', $text); + $text = "$text"; + if ( "`" != $matches[1] ) + $text = "
    $text
    "; + return $text; + } + + function decodeit( $matches ) { + if ( function_exists('decodeit') ) // bbPress native + return decodeit( $matches ); + + $text = $matches[2]; + $trans_table = array_flip(get_html_translation_table(HTML_ENTITIES)); + $text = strtr($text, $trans_table); + $text = str_replace('
    ', '', $text); + $text = str_replace('&', '&', $text); + $text = str_replace(''', "'", $text); + if ( '
    ' == $matches[1] )
    +			$text = "\n$text\n";
    +		return "`$text`";
    +	}
    +
    +} // end class
    +
    +endif;
    diff --git a/app/core/src/Attendees/Attendee.php b/app/core/src/Attendees/Attendee.php
    new file mode 100755
    index 0000000..e17daae
    --- /dev/null
    +++ b/app/core/src/Attendees/Attendee.php
    @@ -0,0 +1,120 @@
    +set_data( $data );
    +    }
    +
    +    /**
    +     * @param array $data
    +     */
    +    public function set_data( $data ){
    +
    +        $this->data = [
    +            'attendee_id' => isset($data['attendee_id']) ? $data['attendee_id'] : '',
    +            'post_id' => isset($data['post_id']) ? $data['post_id'] : '',
    +            'event_id' => isset($data['event_id']) ? $data['event_id'] : '',
    +            'occurrence' => isset($data['occurrence']) ? $data['occurrence'] : '',
    +            'first_name' => isset($data['first_name']) ? $data['first_name'] : '',
    +            'last_name' => isset($data['last_name']) ? $data['last_name'] : '',
    +            'email' => isset($data['email']) ? $data['email'] : '',
    +            'count' => isset($data['count']) && $data['count'] ? $data['count'] : 1,
    +            'reg' => isset($data['reg']) && is_array($data['reg']) ? $data['reg'] : [],
    +        ];
    +    }
    +
    +    /**
    +     * @param string $key
    +     * @return mixed
    +     */
    +    public function get_data( $key = null ){
    +
    +        return !is_null( $key ) ? $this->data[$key] : $key;
    +    }
    +
    +    /**
    +     * @return int
    +     */
    +    public function get_id(){
    +
    +        return $this->get_data( 'attendee_id' );
    +    }
    +
    +    /**
    +     * @return int
    +     */
    +    public function get_event_id(){
    +
    +        return $this->get_data( 'event_id' );
    +    }
    +
    +    /**
    +     * @return int
    +     */
    +    public function get_occurrence_id(){
    +
    +        return $this->get_data( 'occurrence' );
    +    }
    +
    +    /**
    +     * @return string
    +     */
    +    public function get_email(){
    +
    +        return $this->get_data( 'email' );
    +    }
    +
    +    /**
    +     * @return string
    +     */
    +    public function get_first_name(){
    +
    +        return $this->get_data( 'first_name' );
    +    }
    +
    +    /**
    +     * @return string
    +     */
    +    public function get_last_name(){
    +
    +        return $this->get_data( 'last_name' );
    +    }
    +
    +    /**
    +     * @return string
    +     */
    +    public function get_name(){
    +
    +        return $this->get_first_name().' '.$this->get_last_name();
    +    }
    +
    +    /**
    +     * @return int
    +     */
    +    public function get_count(){
    +
    +        return $this->get_data( 'count' );
    +    }
    +
    +    /**
    +     * @return int
    +     */
    +    public function get_reg_data(){
    +
    +        return $this->get_data( 'reg' );
    +    }
    +}
    \ No newline at end of file
    diff --git a/app/core/src/Attendees/Attendees.php b/app/core/src/Attendees/Attendees.php
    new file mode 100755
    index 0000000..55fd83a
    --- /dev/null
    +++ b/app/core/src/Attendees/Attendees.php
    @@ -0,0 +1,593 @@
    +tbl = $wpdb->prefix.'mec_attendees';
    +    }
    +
    +    private function get_where( $conditions = array()){
    +
    +        $where = "1";
    +
    +        if( !is_array($conditions) || empty($conditions) ){
    +
    +            return $where;
    +        }
    +
    +        global $wpdb;
    +        foreach($conditions as $k => $v){
    +
    +            switch($k){
    +
    +                case 'post_id':
    +                case 'event_id':
    +                case 'occurrence':
    +                case 'email':
    +                case 'first_name':
    +                case 'last_name':
    +                case 'count':
    +                case 'verification':
    +                case 'confirmation':
    +                    if($v){
    +
    +                        if( is_array( $v ) && !isset( $v['compare'] ) ){
    +
    +                            $v = is_array($v) ? "'" . implode("','",$v) . "'" : $v;
    +                            $where .= " AND `{$k}` IN (".$v.")";
    +                        }elseif( is_array( $v ) && isset( $v['compare'] ) ){
    +
    +                            $compare = isset( $v['compare'] ) ? $v['compare'] : 'IN';
    +                            $v = isset( $v['value'] ) ? $v['value'] : false;
    +                            if( !$v ){
    +
    +                                break;
    +                            }
    +
    +                            $v = is_array($v) ? "'" . implode("','",$v) . "'" : $v;
    +                            $where .= " AND `{$k}` {$compare} (".$v.")";
    +                        } else {
    +
    +                            $where .= $wpdb->prepare(
    +                                " AND `{$k}` = '%s'",
    +                                $v
    +                            );
    +                        }
    +                    }
    +                break;
    +
    +
    +            }
    +        }
    +
    +        return $where;
    +    }
    +
    +    public function get_rows( $conditions, $fields = '*' ){
    +
    +        global $wpdb;
    +        $where = $this->get_where( $conditions );
    +
    +        $fields = is_array($fields) && !empty($fields) ? "`" . implode( '`,`', $fields ) . "`" : $fields;
    +        $fields = !empty($fields) ? $fields : '*';
    +
    +        $sql = "SELECT {$fields} FROM {$this->tbl} WHERE {$where}";
    +
    +        return $wpdb->get_results($sql,ARRAY_A);
    +    }
    +
    +    public function _get_attendees( $conditions = array(), $return_by_post_and_occurrence_data = false ){
    +
    +        $rows = $this->get_rows( $conditions);
    +
    +        $attendees = [];
    +        if(!empty($rows) && is_array($rows)){
    +
    +            foreach( $rows as $row ){
    +
    +                $attendee_id = $row['attendee_id'];
    +                $data = maybe_unserialize($row['data']);
    +
    +                $attendee = [
    +                    'post_id' => $row['post_id'],
    +                    'attendee_id' => $attendee_id,
    +                    'first_name' => $row['first_name'],
    +                    'last_name' => $row['last_name'],
    +                    'name' => $row['first_name'] .' '.$row['last_name'],
    +                    'email' => $row['email'],
    +                    'count' => $row['count'],
    +                    'verification' => $row['verification'],
    +                    'confirmation' => $row['confirmation'],
    +                    'reg' => is_array($data) ? $data : [],
    +                ];
    +
    +                if($return_by_post_and_occurrence_data){
    +
    +                    $attendee['post_id'] = $row['post_id'];
    +                    $attendee['event_id'] = $row['event_id'];
    +                    $attendee['occurrence'] = $row['occurrence'];
    +                }
    +
    +                $attendees[$attendee_id] = $attendee;
    +            }
    +        }
    +
    +        return $attendees;
    +    }
    +
    +    private function _insert( $attendee_data ){
    +
    +        global $wpdb;
    +        $attendee = [
    +            'post_id' => (int)$attendee_data['post_id'],
    +            'event_id' => (int)$attendee_data['event_id'],
    +            'occurrence' => (int)$attendee_data['occurrence'],
    +            'email' => $attendee_data['email'],
    +            'first_name' => $attendee_data['first_name'],
    +            'last_name' => $attendee_data['last_name'],
    +            'data' => $attendee_data['data'],
    +            'count' => isset($attendee_data['count']) && $attendee_data['count'] > 0 ? (int)$attendee_data['count'] : 1,
    +            'verification' => isset($attendee_data['verification']) ? $attendee_data['verification'] : 0,
    +            'confirmation' => isset($attendee_data['confirmation']) ? $attendee_data['confirmation'] : 0,
    +        ];
    +
    +        $v_type = ['%d','%d','%d','%s','%s','%s','%s','%d','%d','%d'];
    +
    +        return $wpdb->insert($this->tbl, $attendee, $v_type );
    +    }
    +
    +    private function _update( $attendee_data, $where ){
    +
    +        if(empty($where)){
    +
    +            return false;
    +        }
    +
    +        global $wpdb;
    +
    +        $attendee = [
    +            'post_id' => '',
    +            'event_id' => '',
    +            'occurrence' => '',
    +            'email' => '',
    +            'first_name' => '',
    +            'last_name' => '',
    +            'data' => '',
    +            'count' => '',
    +            'verification' => '',
    +            'confirmation' => '',
    +
    +        ];
    +
    +        $v_type = ['%d','%d','%d','%s','%s','%s','%s','%d','%d','%d'];
    +
    +        foreach($attendee as $k => $v){
    +
    +            switch($k){
    +
    +                case 'post_id':
    +                case 'event_id':
    +                case 'occurrence':
    +                case 'email':
    +                case 'first_name':
    +                case 'last_name':
    +                case 'count':
    +                case 'verification':
    +                case 'confirmation':
    +                case 'data':
    +                    if(isset($attendee_data[$k])){
    +
    +                        $attendee[$k] = $attendee_data[$k];
    +                    }else{
    +
    +                        unset($attendee[$k]);
    +                    }
    +                break;
    +            }
    +        }
    +
    +        return $wpdb->update($this->tbl, $attendee, $where, $v_type );
    +    }
    +
    +    private function _delete( $conditions ){
    +
    +        global $wpdb;
    +        return $wpdb->delete($this->tbl,$conditions);
    +    }
    +
    +    private function _add_or_update( $attendee ){
    +
    +        $post_id = isset($attendee['post_id']) ? (int)$attendee['post_id'] : 0;
    +        $event_id = isset($attendee['event_id']) ? (int)$attendee['event_id'] : 0;
    +        $occurrence = isset($attendee['occurrence']) ? (int)$attendee['occurrence'] : 0;
    +        $attendee['email'] =  isset($attendee['email']) ? sanitize_email($attendee['email']) : 0;
    +        $email = $attendee['email'];
    +        $first_name = isset($attendee['first_name']) ? sanitize_text_field( $attendee['first_name']) : '';
    +        $last_name = isset($attendee['last_name']) ? sanitize_text_field( $attendee['last_name']) : '';
    +
    +        if( !$post_id || !$event_id || !$occurrence || !$email ){
    +
    +            return false;
    +        }
    +
    +        $attendee['data'] = isset($attendee['data']) ? serialize($attendee['data']) : '';
    +        $existed = $this->is_existed( $post_id, $event_id, $occurrence, $email, $first_name, $last_name );
    +
    +        if( !$existed ){
    +
    +            $r = $this->_insert($attendee);
    +        }elseif( $existed ){
    +
    +            $where['attendee_id'] = $existed;
    +            $r = $this->_update($attendee, $where);
    +        }
    +
    +        return $r;
    +    }
    +
    +    public function get_attendees( $post_id, $event_id, $occurrence, $return_cached = true ){
    +
    +        $cached = $return_cached ? $this->get_cache( $post_id, $event_id, $occurrence ) : false;
    +        if( $cached ){
    +
    +            return $cached;
    +        }
    +
    +        $conditions = [
    +            'post_id' => $post_id,
    +            'event_id' => $event_id,
    +            'occurrence' => $occurrence,
    +        ];
    +
    +        $attendees = $this->_get_attendees( $conditions );
    +        $this->update_cache( $post_id, $event_id, $occurrence, $attendees );
    +
    +        return $attendees;
    +    }
    +
    +    public function is_existed( $post_id, $event_id, $occurrence, $email, $first_name, $last_name ){
    +
    +        $conditions = [
    +            'post_id' => $post_id,
    +            'event_id' => $event_id,
    +            'occurrence' => $occurrence,
    +            'email' => $email,
    +            'first_name' => $first_name,
    +            'last_name' => $last_name,
    +        ];
    +
    +        $r = $this->_get_attendees($conditions);
    +
    +        if(count($r)){
    +
    +            return key($r);
    +        }
    +
    +        return false;
    +    }
    +
    +    public function add_or_update( $post_id, $event_id, $occurrence, $attendees ){
    +
    +        $success = null;
    +        if( !$post_id || !$event_id || !$occurrence || !is_array($attendees) ){
    +
    +            return false;
    +        }
    +
    +        $new_attendees = [];
    +        foreach( $attendees as $attendee ){
    +
    +            $email = isset($attendee['email']) ? sanitize_email($attendee['email']) : 0;
    +            $first_name = isset($attendee['first_name']) ? sanitize_text_field( $attendee['first_name'] ) : '';
    +            $last_name = isset($attendee['last_name']) ? sanitize_text_field( $attendee['last_name'] ) : '';
    +            if(!$email){
    +
    +                continue;
    +            }
    +
    +            $data = isset($attendee['data']) ? (array)$attendee['data'] : [];
    +            $data = empty($data) && isset($attendee['reg']) ? (array)$attendee['reg'] : $data;
    +            unset($data['reg']);
    +
    +            $attendee['post_id'] = $post_id;
    +            $attendee['event_id'] = $event_id;
    +            $attendee['occurrence'] = $occurrence;
    +            $attendee['data'] = $data;
    +            $attendee['count'] = 1;
    +
    +
    +            $na_key = "{$email}-{$first_name}-{$last_name}";
    +            if(isset($new_attendees[ $na_key ])){
    +
    +                $new_attendees[ $na_key ]['count']++;
    +
    +                continue;
    +            }
    +
    +            $new_attendees[ $na_key ] = $attendee;
    +        }
    +
    +        foreach( $new_attendees as $attendee ){
    +
    +            $s = $this->_add_or_update( $attendee );
    +            $success = !is_null($success) ? $success : true;
    +            $success = $success && $s;
    +        }
    +
    +        $this->clear_cache( $post_id, $event_id, $occurrence );
    +
    +        return $success;
    +    }
    +
    +    public function remove_other_attendees( $post_id, $event_id, $occurrence ) {
    +
    +        global $wpdb;
    +        $sql = $wpdb->prepare(
    +            "DELETE FROM `%1s` where `post_id` = %2s && ( `event_id` != %3s || `occurrence` != %4s )",
    +            $this->tbl,
    +            $post_id,
    +            $event_id,
    +            $occurrence
    +        );
    +
    +        $wpdb->query( $sql );
    +    }
    +
    +    public function update_attendees( $post_id, $event_id, $occurrence, $attendees ){
    +
    +        if( !$post_id || !$event_id || !$occurrence || !is_array($attendees) ){
    +
    +            return false;
    +        }
    +
    +        $this->remove_other_attendees( $post_id, $event_id, $occurrence );
    +
    +        $saved_attendees = $this->get_attendees( $post_id, $event_id, $occurrence, false );
    +        $saved_attendees_keys = [];
    +        foreach( $saved_attendees as $saved_attendee ) {
    +
    +            $email = isset($saved_attendee['email']) ? sanitize_email($saved_attendee['email']) : 0;
    +            $first_name = isset($saved_attendee['first_name']) ? sanitize_text_field( $saved_attendee['first_name'] ) : '';
    +            $last_name = isset($saved_attendee['last_name']) ? sanitize_text_field( $saved_attendee['last_name'] ) : '';
    +            $attendee_id = $saved_attendee['attendee_id'] ?? 0;
    +
    +            $sa_key = "{$email}-{$first_name}-{$last_name}";
    +
    +            $saved_attendees_keys[ $attendee_id ] = $sa_key;
    +        }
    +
    +        foreach( $attendees as $_a_key => $attendee ) {
    +
    +            $email = isset($attendee['email']) ? sanitize_email($attendee['email']) : 0;
    +            $first_name = isset($attendee['first_name']) ? sanitize_text_field( $attendee['first_name'] ) : '';
    +            $last_name = isset($attendee['last_name']) ? sanitize_text_field( $attendee['last_name'] ) : '';
    +
    +            $a_key = "{$email}-{$first_name}-{$last_name}";
    +
    +            $attendees_keys[ $_a_key ] = $a_key;
    +        }
    +
    +        foreach( $saved_attendees_keys as $attendee_id => $attendee_key ){
    +
    +            $saved_attendee_id = array_search( $attendee_key, $attendees_keys );
    +            if( false === $saved_attendee_id ){
    +
    +                $conditions = [
    +                    'attendee_id' => $attendee_id,
    +                ];
    +                $this->_delete($conditions);
    +            }
    +        }
    +
    +        return $this->add_or_update( $post_id, $event_id, $occurrence , $attendees );
    +    }
    +
    +    public function update_attendee_status( $status_key, $status, $post_id, $email = null, $event_id = null, $occurrence = null ){
    +
    +        if( !in_array( $status_key, [ 'confirmation', 'verification' ] ) ){
    +
    +            return;
    +        }
    +
    +        $conditions = [
    +            'post_id' => $post_id,
    +            'event_id' => $event_id,
    +            'occurrence' => $occurrence,
    +            'email' => $email,
    +        ];
    +
    +        $attendees = $this->_get_attendees( $conditions, true );
    +
    +        foreach( $attendees as $k => $attendee ){
    +
    +            $attendee_id = $attendee['attendee_id'];
    +
    +            if(!$attendee_id){
    +
    +                continue;
    +            }
    +
    +            $saved_status = $attendee[$status_key];
    +            if( $status === $saved_status ){
    +
    +                unset($attendees[$k]);
    +                continue;
    +            }
    +
    +            $attendee[$status_key] = (int)$status;
    +            $where = array(
    +                'attendee_id' => $attendee_id
    +            );
    +
    +            $this->_update( $attendee , $where );
    +        }
    +    }
    +
    +    public function update_confirmation_status( $status, $post_id, $email = null, $event_id = null, $occurrence = null ){
    +
    +        return $this->update_attendee_status( 'confirmation', $status, $post_id, $email, $event_id, $occurrence );
    +    }
    +
    +    public function update_verification_status( $status, $post_id, $email = null, $event_id = null, $occurrence = null ){
    +
    +        return $this->update_attendee_status( 'verification', $status, $post_id, $email, $event_id, $occurrence );
    +    }
    +
    +    public function delete( $post_id, $email = null, $event_id = null, $occurrence = null ){
    +
    +        $conditions['post_id'] = $post_id;
    +
    +        if( !is_null($email) ){
    +
    +            $conditions['email'] = $email;
    +        }
    +
    +        if( !is_null($event_id) ){
    +
    +            $conditions['event_id'] = $event_id;
    +        }
    +
    +        if( !is_null($occurrence) ){
    +
    +            $conditions['occurrence'] = $occurrence;
    +        }
    +
    +        $this->_delete( $conditions );
    +    }
    +
    +    public function get_attendees_emails( $post_id = null, $event_id = null, $occurrence = null, $confirmation = null, $verification = null ){
    +
    +        $conditions = [];
    +
    +        if( !is_null($post_id) ){
    +
    +            $conditions['post_id'] = $post_id;
    +        }
    +
    +        if( !is_null($event_id) ){
    +
    +            $conditions['event_id'] = $event_id;
    +        }
    +
    +        if( !is_null($occurrence) ){
    +
    +            $conditions['occurrence'] = $occurrence;
    +        }
    +
    +        if( !is_null($confirmation) ){
    +
    +            $conditions['confirmation'] = $confirmation;
    +        }
    +
    +        if( !is_null($verification) ){
    +
    +            $conditions['verification'] = $verification;
    +        }
    +
    +        $emails = $this->get_rows($conditions,'email');
    +        $emails = array_column( $emails, 'email' );
    +
    +        $emails = array_unique($emails);
    +
    +        return $emails;
    +    }
    +
    +    /**
    +     * @param string $email
    +     * @param int $post_id
    +     * @param int $event_id
    +     * @param int $occurrence
    +     * @return array|int
    +     */
    +    public function get_total_attendees_group_by_email( $email = null, $post_id = null, $event_id = null, $occurrence = null, $exclude_post_ids = [], $confirmation = 1, $verification = 1 ){
    +
    +        $conditions = [];
    +
    +        if( !is_null($email) ){
    +
    +            $conditions['email'] = $email;
    +        }
    +
    +        if( !is_null($post_id) ){
    +
    +            $conditions['post_id'] = $post_id;
    +        }
    +
    +        if( !is_null($event_id) ){
    +
    +            $conditions['event_id'] = $event_id;
    +        }
    +
    +        if( !is_null($occurrence) ){
    +
    +            $conditions['occurrence'] = $occurrence;
    +        }
    +
    +        if($exclude_post_ids){
    +
    +            $exclude_post_ids = is_array($exclude_post_ids) ? $exclude_post_ids : explode(',',$exclude_post_ids);
    +            $conditions['post_id'] = [
    +                'compare' => 'NOT IN',
    +                'value' => $exclude_post_ids,
    +            ];
    +        }
    +
    +        if( !is_null($confirmation) ){
    +
    +            $conditions['confirmation'] = $confirmation;
    +        }
    +
    +        if( !is_null($verification) ){
    +
    +            $conditions['verification'] = $verification;
    +        }
    +
    +        $total_used_emails = [];
    +        $rows = $this->get_rows($conditions,'`email`,`count`');
    +
    +        foreach($rows as $row){
    +
    +            $r_email = $row['email'];
    +            $r_count = $row['count'];
    +
    +            if( !isset( $total_used_emails[ $r_email ] ) ){
    +                $total_used_emails[ $r_email ] = 0;
    +            }
    +
    +            $total_used_emails[ $r_email ] += $r_count;
    +        }
    +
    +        if(empty($email)){
    +
    +            return $total_used_emails;
    +        }
    +
    +        return isset($total_used_emails[$email]) ? (int)$total_used_emails[$email] : 0;
    +    }
    +
    +    public function get_cache( $post_id, $event_id, $occurrence ){
    +
    +        $cache_key = 'mec-attendees-'.$post_id.'-'.$event_id.'-'.$occurrence;
    +        return get_transient( $cache_key );
    +    }
    +
    +    public function update_cache( $post_id, $event_id, $occurrence, $attendees ){
    +
    +        $cache_key = 'mec-attendees-'.$post_id.'-'.$event_id.'-'.$occurrence;
    +        set_transient( $cache_key, $attendees, 3600 );
    +    }
    +
    +    public function clear_cache( $post_id, $event_id, $occurrence ){
    +
    +        $cache_key = 'mec-attendees-'.$post_id.'-'.$event_id.'-'.$occurrence;
    +        delete_transient( $cache_key );
    +    }
    +}
    \ No newline at end of file
    diff --git a/app/core/src/Attendees/AttendeesTable.php b/app/core/src/Attendees/AttendeesTable.php
    new file mode 100755
    index 0000000..b782d1c
    --- /dev/null
    +++ b/app/core/src/Attendees/AttendeesTable.php
    @@ -0,0 +1,70 @@
    +prefix . self::$tbl;
    +        $db_option_key = 'mec_table_version_'.$attendees_table_name;
    +
    +        $tables = $wpdb->get_results("SHOW TABLES");
    +        $tables_group = "Tables_in_".DB_NAME;
    +        $tables = array_column($tables,$tables_group);
    +        $table_exists = array_search($attendees_table_name,$tables);
    +
    +        if(false === $table_exists){
    +
    +            $charset = $wpdb->get_charset_collate();
    +            $sql = "CREATE TABLE IF NOT EXISTS `{$attendees_table_name}` (
    +                `attendee_id` bigint(20) NOT NULL AUTO_INCREMENT,
    +                `post_id` bigint(20) NOT NULL,
    +                `event_id` bigint(20) NOT NULL,
    +                `occurrence` int(11) NOT NULL,
    +                `email` varchar(50) NOT NULL,
    +                `first_name` varchar(50) NOT NULL,
    +                `last_name` varchar(50) NOT NULL,
    +                `data` text NULL,
    +                `count` int(11) DEFAULT 1,
    +                `verification` int(1) DEFAULT 0,
    +                `confirmation` int(1) DEFAULT 0,
    +                PRIMARY KEY (`attendee_id`)
    +            ){$charset}";
    +
    +            dbDelta( $sql );
    +
    +            update_option( $db_option_key, static::$version );
    +        }else{
    +
    +            $db_version = get_option( $db_option_key, '1.0.0' );
    +
    +            if( version_compare($db_version, '1.1.0', '<') ){
    +
    +                $wpdb->query( "ALTER TABLE `{$attendees_table_name}` CHANGE  IF EXISTS `name` `first_name` varchar(50) NOT NULL;" );
    +                $wpdb->query( "ALTER TABLE `{$attendees_table_name}` ADD IF NOT EXISTS `last_name` varchar(50) NOT NULL AFTER `first_name`;" );
    +                $wpdb->query( "ALTER TABLE `{$attendees_table_name}` ADD IF NOT EXISTS `verification` int(1) NOT NULL DEFAULT 0 AFTER `count`;" );
    +                $wpdb->query( "ALTER TABLE `{$attendees_table_name}` ADD  IF NOT EXISTS `confirmation` int(1) NOT NULL DEFAULT 0 AFTER `verification`;" );
    +
    +                update_option( $db_option_key, '1.1.0' );
    +            }
    +
    +
    +            update_option( $db_option_key, static::$version );
    +        }
    +
    +
    +
    +
    +
    +    }
    +}
    \ No newline at end of file
    diff --git a/app/core/src/Attendees/index.php b/app/core/src/Attendees/index.php
    new file mode 100755
    index 0000000..9d7a83d
    --- /dev/null
    +++ b/app/core/src/Attendees/index.php
    @@ -0,0 +1,5 @@
    +define();
    +		$this->includes();
    +		$this->init_hooks();
    +		$this->admin();
    +		$this->enqueue_scripts();
    +	}
    +
    +	/**
    +	 * MEC Instance
    +	 *
    +	 * @return self()
    +	 */
    +	public static function instance() {
    +
    +		if ( is_null( self::$instance ) ) {
    +			self::$instance = new self();
    +		}
    +
    +		return self::$instance;
    +	}
    +
    +	/**
    +	 * Set Constants
    +	 *
    +	 * @return void
    +	 */
    +	public function define() {
    +
    +		define( 'MEC_CORE_PD', plugin_dir_path( MEC_CORE_FILE ) );
    +		define( 'MEC_CORE_PDI', plugin_dir_path( MEC_CORE_FILE ) . 'src/' );
    +		define( 'MEC_CORE_PU_JS', plugins_url( 'assets/js/', MEC_CORE_FILE ) );
    +		define( 'MEC_CORE_PU_CSS', plugins_url( 'assets/css/', MEC_CORE_FILE ) );
    +		define( 'MEC_CORE_PU_IMG', plugins_url( 'assets/img/', MEC_CORE_FILE ) );
    +		define( 'MEC_CORE_PU_FONTS', plugins_url( 'assets/fonts/', MEC_CORE_FILE ) );
    +		define( 'MEC_CORE_TEMPLATES', plugin_dir_path( MEC_CORE_FILE ) . 'templates/' );
    +	}
    +
    +	/**
    +	 * Include Files
    +	 *
    +	 * @return void
    +	 */
    +	public function includes() {
    +
    +	}
    +
    +
    +	/**
    +	 * Include Files If is Admin
    +	 *
    +	 * @return void
    +	 */
    +	public function admin() {
    +
    +		if ( !is_admin() ) {
    +			return;
    +		}
    +
    +		FlushNotices::getInstance()->init();
    +	}
    +
    +
    +	/**
    +	 * Register actions enqueue scripts
    +	 *
    +	 * @return void
    +	 */
    +	public function enqueue_scripts() {
    +
    +
    +	}
    +
    +	/**
    +	 * Add Hooks - Actions and Filters
    +	 *
    +	 * @return void
    +	 */
    +	public function init_hooks() {
    +
    +		add_action( 'admin_notices', array( $this, 'upgrade_notice') );
    +		add_action('wp_ajax_mec-upgrade-transactions-in-db', array( __CLASS__, 'upgrade_transactions_db_by_ajax' ) );
    +
    +		add_action( 'init', [ $this, 'init' ] );
    +
    +		register_activation_hook( MEC_CORE_FILE, __CLASS__ . '::register_activation' );
    +		$db_version = get_option('mec_core_db','1.0.0');
    +		if(version_compare($db_version, '6.10.0', '<')){
    +
    +			static::register_activation();
    +		}
    +	}
    +
    +	/**
    +	 * Active Plugin
    +	 *
    +	 * @return void
    +	 */
    +	public static function register_activation() {
    +
    +		AttendeesTable::create_table();
    +
    +		update_option('mec_core_db',MEC_VERSION);
    +	}
    +
    +
    +	/**
    +	 * Init MEC after WordPress
    +	 *
    +	 * @return void
    +	 */
    +	public function init() {
    +
    +	}
    +
    +	public static function should_include_assets(){
    +
    +        $factory = \MEC::getInstance('app.libraries.factory');
    +
    +        return $factory->should_include_assets('frontend');
    +    }
    +
    +	public static function is_include_assets_in_footer(){
    +
    +        return '1' == \MEC\Settings\Settings::getInstance()->get_settings('assets_in_footer_status') ? true : false;
    +    }
    +
    +	public static function get_main(){
    +
    +		global $MEC_Main;
    +		if(is_null($MEC_Main)){
    +
    +			$MEC_Main = new \MEC_main();
    +		}
    +
    +		return $MEC_Main;
    +	}
    +
    +	/**
    +	 * Upgrade transactions in db
    +	 *
    +	 * @return void
    +	 */
    +	public static function upgrade_transactions() {
    +
    +		$db_version = get_option( 'mec_transaction_version', '1.0.0' );
    +		if( version_compare( $db_version, MEC_VERSION, '<' ) ) {
    +
    +			if( current_user_can('activate_plugins') ) {
    +
    +				\MEC\Transactions\Transaction::upgrade_db();
    +			}
    +		}
    +	}
    +
    +	/**
    +	 * Upgrade transactions in db by ajax
    +	 *
    +	 * @return void
    +	 */
    +	public static function upgrade_transactions_db_by_ajax() {
    +
    +		if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'mec-upgrade-transactions-in-db' ) ) {
    +
    +			return;
    +		}
    +
    +		$db_version = get_option( 'mec_transaction_version', '1.0.0' );
    +		if( version_compare( $db_version, '6.10.0', '<' ) ) {
    +
    +			static::upgrade_transactions();
    +			wp_send_json(array(
    +				'done' => false,
    +			));
    +		}else{
    +
    +			wp_send_json(array(
    +				'done' => true,
    +			));
    +		}
    +	}
    +
    +	public function upgrade_notice($type = false) {
    +
    +		$booking_module_status = (bool)\MEC\Settings\Settings::getInstance()->get_settings('booking_status');
    +		$db_version = get_option( 'mec_transaction_version', '1.0.0' );
    +		if( version_compare( $db_version, '6.10.0', '<' ) && $booking_module_status ) {
    +
    +			if (!current_user_can('activate_plugins')) {
    +				return;
    +			}
    +
    +			$upgrade_url = admin_url( '?mec_upgrade_db=true' );
    +			$message        = '

    ' + . __('Your booking database needs updating. To do that, click the button below and wait until the operation is over. Do not refresh the page until the end.', 'modern-events-calendar-lite') + . '
    ' . __('Note: if you have many bookings, the operation might take longer, please be patient.', 'modern-events-calendar-lite') . '' + . '

    '; + $message .= '

    ' . sprintf('%s', $upgrade_url, __('Upgrade Database Now', 'modern-events-calendar-lite')) . '

    '; + + ?> + +
    +

    +
    + + + get_event_mec( $event ); + $event = $events[0]; + } + + $form_title = $args['form_title'] ?? esc_html__("Attendee's Form", 'modern-events-calendar-lite'); + $date_ex = explode(':', $date); + $occurrence = $date_ex[0]; + + $mec_settings = \MEC\Settings\Settings::getInstance()->get_settings(); + $bookClass = \MEC\Base::get_main()->getBook(); + + $event_id = $event->ID; + $translated_event_id = (isset($_REQUEST['translated_event_id']) ? sanitize_text_field($_REQUEST['translated_event_id']) : 0); + $requested_event_id = $event->requested_id ?? $event_id; + + $mec_email = false; + $mec_name = false; + foreach($reg_fields as $field) { + + if(isset($field['type'])) { + + if($field['type'] == 'mec_email') $mec_email = true; + if($field['type'] == 'name') $mec_name = true; + } + else break; + } + + if(!$mec_name) { + + $reg_fields[] = array( + 'mandatory' => '0', + 'type' => 'name', + 'label' => esc_html__('Name', 'modern-events-calendar-lite'), + ); + } + + if(!$mec_email) { + $reg_fields[] = array( + 'mandatory' => '0', + 'type' => 'mec_email', + 'label' => esc_html__('Email', 'modern-events-calendar-lite'), + ); + } + + $fees = $bookClass->get_fees($event_id); + + $step_skipped = (isset($_REQUEST['do_skip']) ? sanitize_text_field($_REQUEST['do_skip']) : 0); + + // WC System + $WC_status = (isset($mec_settings['wc_status']) and $mec_settings['wc_status'] and class_exists('WooCommerce')); + if($WC_status) $fees = []; + + // MEC Card + $cart_status = (isset($mec_settings['mec_cart_status']) and $mec_settings['mec_cart_status']); + if($cart_status) $WC_status = false; + + $total_ticket_prices = 0; + $check_free_tickets_booking = apply_filters('check_free_tickets_booking', 1); + $has_fees = (bool) count($fees); + + $current_user = wp_get_current_user(); + $first_for_all = (!isset($mec_settings['booking_first_for_all']) || $mec_settings['booking_first_for_all'] == 1); + + // Username & Password Method + $booking_register = !((isset($mec_settings['booking_registration']) and !$mec_settings['booking_registration'])); + $booking_userpass = (isset($mec_settings['booking_userpass']) and trim($mec_settings['booking_userpass'])) ? $mec_settings['booking_userpass'] : 'auto'; + + // Lock Pre-filled Fields + $lock_prefilled = isset($mec_settings['booking_lock_prefilled']) && trim($mec_settings['booking_lock_prefilled']) != '' ? $mec_settings['booking_lock_prefilled'] : 0; + + // Attendee Counter + $attendee_counter = (isset($mec_settings['attendee_counter']) and $mec_settings['attendee_counter']) ? $mec_settings['attendee_counter'] : ''; + + $display_progress_bar = \MEC\Base::get_main()->can_display_booking_progress_bar($mec_settings); + + $event_tickets = $event->data->tickets ?? []; + + foreach ($tickets as $ticket_id => $count) { + + if (!$count) continue; + $ticket = $event_tickets[$ticket_id]; + + for($p = 1; $p <= $count; $p++) { + + $ticket_price = $bookClass->get_ticket_price($ticket, current_time('Y-m-d'), $event_id, $occurrence); + if(is_numeric($ticket_price)) $total_ticket_prices += $ticket_price; + } + } + + if(isset($all_dates) and count($all_dates)) { + + $total_ticket_prices = $total_ticket_prices * count($all_dates); + } + + static::enqueue(); + + ?> +
    + + +
      +
    • +
    • + +
    • + +
    • +
    • + +
    + +

    + + +
    +
    svg('form/subtotal-icon'); ?>
    +
    +
    + + render_price($total_ticket_prices, $requested_event_id)); ?> +
    +
    +
    + +
      + +
    + +
      + + $count) : if (!$count) continue; + $ticket = $event_tickets[$ticket_id]; + for ($i = 1; $i <= $count; $i++) : + ?> +
    • + + + get_ticket_price_label($ticket, current_time('Y-m-d'), $event_id, $occurrence))): ?> +
      +
      svg('form/ticket-icon'); ?>
      +
      +

      + + +

      + get_ticket_price_label($ticket, current_time('Y-m-d'), $event_id, $occurrence); + $ticket_price = apply_filters('mec_filter_ticket_price_label', $ticket_price, $ticket, $event_id, $bookClass); + ?> +
      + + +
      +
      +
      + + + +
        + $lock_prefilled + ] ); ?> +
      + + + ticket_variations($event_id, $ticket_id, $translated_event_id); + + if($WC_status) $ticket_variations = []; + if(\MEC\Base::get_main()->has_variations_per_ticket($event_id, $ticket_id)) $first_for_all = false; + + $has_variations = (bool) count($ticket_variations); + ?> + $ticket_variation): if(!is_numeric($ticket_variation_id) || !isset($ticket_variation['title']) || !trim($ticket_variation['title'])) continue; ?> +
      +
      +
      render_price($ticket_variation['price'], $requested_event_id)); ?>
      + +
      +
      + + + + +
    • + + +
    + + 1 and $first_for_all) : ?> +
    + +
    + + + +
    +

    +
      +
    • + + +
    • +
    • + + +
    • +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + + $field ) : + + if(in_array($f_id, [':i:',':fi:','_i_','_fi_',], true)){ + + continue; + } + + $type = $field['type'] ?? false; + if ( false === $type ) { + continue; + } + + $j = !is_null($j) ? $j : $f_id; + $field_id = !empty($field['key']) ? $field['key'] : $f_id; + $html_id = 'mec_field_' . $group_id . '_' . $type . '_' . $j; + $required = ( ( isset( $field['required'] ) && $field['required'] ) || ( isset( $field['mandatory'] ) && $field['mandatory'] ) ) ? 'required="required"' : ''; + $field_label = $field['label'] ?? null; + + $field_name = strtolower( str_replace( [ + ' ', + ',', + ':', + '"', + "'", + ], '_', $field_label ) ); + + $field_id = strtolower( str_replace( [ + ' ', + ',', + ':', + '"', + "'", + ], '_', $field_id ) ); + + if( !isset( $field['inline'] ) && in_array( $type, array( 'name', 'mec_email' )) ){ + + $field['inline'] = 'enable'; + } + + $classes = []; + + $single_row = isset($field['single_row']) && $field['single_row'] == 'enable'; + $full_width = isset($field['full_width']) && $field['full_width'] == 'enable'; + + if ( isset( $field['inline'] ) && 'enable' === $field['inline'] ) { + $classes[] = 'col-md-6'; + } elseif ( isset( $field['inline_third'] ) && 'enable' === $field['inline_third'] ) { + $classes[] = 'col-md-4'; + } else { + $classes[] = 'col-md-12'; // 'col-md-6' + } + + if( $is_dashboard ){ + + $classes[] = 'mec-form-row'; + } + + if( isset( $field['mandatory'] ) && $field['mandatory'] ){ + + $classes[] = 'mec-reg-mandatory'; + } + + if( $single_row ){ + + $classes[] = 'clearfix'; + } + ?> +
  • + first_name . ' ' . $current_user->last_name); + $has_icon = $field['has_icon'] ?? true; + $icon_content = \MEC\Base::get_main()->svg('form/user-icon'); + break; + case 'first_name': + $field_type = 'text'; + $field_id = 'first_name'; + $field['label'] = $field['label'] ?? esc_html__('First Name', 'modern-events-calendar-lite'); + $value = $current_user->first_name; + break; + case 'last_name': + $field_type = 'text'; + $field_id = 'last_name'; + $field['label'] = $field['label'] ?? esc_html__('Last Name', 'modern-events-calendar-lite'); + $value = $current_user->last_name; + break; + case 'mec_email': + $field_type = 'email'; + $field_id = $type; + $field['label'] = $field['label'] ?? esc_html__('Email', 'modern-events-calendar-lite'); + $value = isset( $current_user->user_email ) ? $current_user->user_email : ''; + $has_icon = $field['has_icon'] ?? true; + $icon_content = \MEC\Base::get_main()->svg('form/email-icon'); + case 'email': + $field_type = 'email'; + $field['label'] = $field['label'] ?? 'Email'; + $value = $main->get_from_mapped_field($field, ($current_user->user_email ?: '')); + break; + case 'text': + $field_type = 'text'; + $field['label'] = $field['label'] ?? ''; + $value = $main->get_from_mapped_field($field); + break; + case 'date': + $field_type = 'date'; + $field['label'] = $field['label'] ?? 'Date'; + $value = $main->get_from_mapped_field($field); + $class = 'mec-date-picker'; + $attributes = ' min="' . esc_attr( date( 'Y-m-d', strtotime( '-100 years' ) ) ) . '" max="' . esc_attr( date( 'Y-m-d', strtotime( '+100 years' ) ) ) . '" onload="mec_add_datepicker()"'; + break; + case 'file': + $field_type = 'file'; + $field['label'] = $field['label'] ?? 'File'; + $value = ''; + break; + case 'tel': + $field_type = 'tel'; + $field['label'] = $field['label'] ?? 'Tel'; + $value = $main->get_from_mapped_field($field); + break; + case 'textarea': + $field_type = 'textarea'; + $field['label'] = $field['label'] ?? ''; + $value = $main->get_from_mapped_field($field); + break; + case 'select': + $field_type = 'select'; + $field['label'] = $field['label'] ?? ''; + $value = $main->get_from_mapped_field($field); + $selected = ''; + break; + case 'radio': + case 'checkbox': + $field_type = $type; + $value = $main->get_from_mapped_field($field); + break; + case 'agreement': + + $value = ''; + break; + + } + + $primary_field_ids = [ + 'mec_email', + 'name', + 'first_name', + 'last_name' + ]; + $primary_field_id = $field_id; + if( 'fixed' === $form_type || ( 'reg' === $form_type && in_array($field_id, $primary_field_ids ,true) ) ){ + + $field_id = 'mec_email' === $field_id ? 'email' : $field_id; + $value = $data[$field_id] ?? $value; + } else { + + $value = $data[$form_type][$field_id] ?? $value; + } + + $lock_field = !empty( $value ); + $lock_field = ( $lock_field && ( $lock_prefilled == 1 || ( $lock_prefilled == 2 && $j == 0 ) ) ) ? 'readonly' : ''; + + if( 'reg' === $form_type && !in_array($primary_field_id,$primary_field_ids,true) ) { + + $field_name = $field_base_name . '[reg][' . esc_attr($field_id) . ']'; + }else{ + + $field_name = $field_base_name . '[' . esc_attr($field_id) . ']'; + } + + // Display Label + if ( isset( $field['label'] ) && !empty( $field['label'] ) && 'agreement' !== $type ) { + + $label_field = ''; + + echo $is_dashboard ? '
    '.\MEC_kses::form($label_field).'
    ' : \MEC_kses::form($label_field); + } + + $input_html = ''; + $field_class = $class; + // Display Input + switch ( $type ) { + case 'name': + case 'first_name': + case 'last_name': + case 'mec_email': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'text': + case 'date': + case 'file': + case 'email': + case 'tel': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'textarea': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'select': + + $placeholder = ''; + $input_html = ''; + + break; + case 'radio': + $options = isset($field['options']) ? $field['options'] : []; + foreach ( $options as $field_option ) { + $current_value = esc_html__( $field_option['label'], 'modern-events-calendar-lite'); + $checked = in_array($current_value,(array)$value); + $input_html .= ''; + } + + break; + + case 'checkbox': + $options = isset($field['options']) ? $field['options'] : []; + foreach ( $options as $field_option ) { + $current_value = esc_html__( $field_option['label'], 'modern-events-calendar-lite'); + $checked = in_array($current_value,(array)$value); + $input_html .= ''; + } + + break; + case 'agreement': + + $checked = isset( $field['status'] ) ? $field['status'] : 'checked'; + $input_html = ''; + + break; + + case 'p': + + $input_html = '

    ' . do_shortcode( stripslashes( $field['content'] ?? '' ) ) . '

    '; + + break; + } + + if( !empty( $has_icon ) ) { + + $wrapper_class = "mec-{$group_id}-{$type}-field-wrapper"; + $icon_class = "mec-{$group_id}-{$type}-field-icon"; + $input_html = '' + . '' . $icon_content .' ' + . $input_html + .''; + } + echo $is_dashboard ? '
    '.\MEC_kses::form($input_html).'
    ' : \MEC_kses::form($input_html); + ?> +
  • + + '; + } + ?> + type = 'book'; + parent::__construct( $data, $load_post ); + } + + /** + * @return int + */ + public function get_event_id() { + + return (int) $this->get_meta( 'mec_event_id' ); + } + + /** + * @return string + */ + public function get_title() { + + return get_the_title( $this->ID ); + } + + /** + * @return array //TODO: Convert to Attendee[] + */ + public function get_attendees() { + + return $this->get_meta( 'mec_attendees' ); + } + + /** + * @return array + */ + public function get_primary_attendees(){ + + $attendees = $this->get_attendees(); + return (array)current($attendees); + } + + /** + * @return bool + */ + public function is_first_attendee_data_for_all() { + + return (bool)$this->get_meta( 'mec_first_for_all' ); + } + + /** + * @return array + */ + public function get_fixed_fields() { + + return (array)$this->get_meta( 'mec_fixed_fields' ); + } + + /** + * @return string $start_timestamp:$end_timestamp + */ + public function get_attention_time( $type = null ) { + + $data = $this->get_meta( 'mec_attention_time' ); + if ( !is_null( $type ) ) { + + $data = explode( ':', $data ); + } + + if ( 'start' === $type ) { + + $data = isset( $data[0] ) ? $data[0] : ''; + } elseif ( 'end' === $type ) { + + $data = isset( $data[1] ) ? $data[1] : ''; + } + + return $data; + } + + /** + * @return int -1 , 0 , 1 + */ + public function get_confirm_status() { + + return $this->get_meta( 'mec_confirmed' ); + } + + public function get_confirm_status_text() { + + $status = $this->get_confirm_status(); + + switch ( $status ) { + case '-1': + + $text = esc_html__('Rejected', 'modern-events-calendar-lite'); + + break; + case '1': + + $text = esc_html__('Confirmed', 'modern-events-calendar-lite'); + + break; + case '0': + default: + + $text = esc_html__('Pending', 'modern-events-calendar-lite'); + + break; + } + + return $text; + } + + /** + * @param $status + * @param string $mode manually|automatic + * + * @return void + */ + public function set_confirm_status( $status, $mode = 'manually' ) { + + $text_status = ''; + $status = strtolower( trim( $status ) ); + switch ( $status ) { + case 'reject': + case '-1': + $status = -1; + $text_status = 'rejected'; + break; + case 'pending': + case '0': + $status = 0; + $text_status = 'pending'; + break; + case 'confirm': + case '1': + $status = 1; + $text_status = 'confirm'; + break; + } + + if ( in_array( $status, array( -1, 0, 1 ), false ) ) { + + $old_status = $this->get_meta( 'mec_confirmed' ); + $status = apply_filters( 'mec_' . $this->type . '_confirmed_status_value', $status, $mode, $this->ID, $this ); + if ( $old_status != $status ) { + + $this->set_meta( 'mec_confirmed', $status ); + $this->set_meta( 'mec_status_' . $text_status . '_changed', time() ); + /** + * Do Action for send email or ... + */ + do_action( 'mec_' . $this->type . '_confirmed', $this->ID, $old_status, $status, $mode ); + + return true; + } + } + } + + /** + * @return int -1 , 0 , 1 + */ + public function get_verification_status() { + + return $this->get_meta( 'mec_verified' ); + } + + public function get_verification_status_text() { + + $status = $this->get_verification_status(); + + switch ( $status ) { + case '-1': + + $text = esc_html__('Canceled', 'modern-events-calendar-lite'); + + break; + case '1': + + $text = esc_html__('Verified', 'modern-events-calendar-lite'); + + break; + case '0': + default: + + $text = esc_html__('Waiting', 'modern-events-calendar-lite'); + + break; + } + + return $text; + } + + /** + * @param $status + * @param string $mode manually|automatic + * + * @return void + */ + public function set_verification_status( $status, $mode = 'manually' ) { + + $text_status = ''; + $status = strtolower( trim( $status ) ); + switch ( $status ) { + case 'canceled': + case '-1': + $status = -1; + $text_status = 'canceled'; + break; + case 'waiting': + case '0': + $status = 0; + $text_status = 'waiting'; + break; + case 'verified': + case '1': + $status = 1; + $text_status = 'verified'; + break; + } + + if ( in_array( $status, array( -1, 0, 1 ), false ) ) { + + $old_status = $this->get_meta( 'mec_verified' ); + $status = apply_filters( 'mec_' . $this->type . '_verified_status_value', $status, $mode, $this->ID, $this ); + + if ( $old_status != $status ) { + + $this->set_meta( 'mec_verified', $status ); + $this->set_meta( 'mec_status_' . $text_status . '_changed', time() ); + /** + * Do Action for send email or ... + */ + do_action( 'mec_' . $this->type . '_verified', $this->ID, $old_status, $status, $mode ); + + return true; + } + } + + } + + /** + * @return int|float|string + */ + public function get_price() { + + return $this->get_meta( 'mec_price' ); + } + + /** + * @return mixed + */ + public function get_location_id() { + + return $this->get_meta( 'mec_booking_location' ); + } + + /** + * @return array|\WP_Error|\WP_Term|null + */ + public function get_location_term() { + + $location_id = $this->get_location_id(); + $location = get_term( $location_id, 'mec_location', ARRAY_A ); + + return $location; + } + + /** + * @return string 1,2,3 + */ + public function get_tickets() { + + return $this->get_meta( 'mec_ticket_id' ); + } + + /** + * @return array + */ + public function get_tickets_ids() { + + $ids = []; + $tickets = $this->get_tickets(); + $tickets = explode( ',', trim( $tickets, ', ' ) ); + + foreach ( $tickets as $ticket_id ) { + + if ( empty( $ticket_id ) || isset( $ids[ $ticket_id ] ) ) { + + continue; + } + + $ids[ $ticket_id ] = $ticket_id; + } + + return $ids; + } + + public function timestamp($start, $end){ + // Timestamp is already available + if(isset($start['timestamp']) and isset($end['timestamp'])) + { + return $start['timestamp'].':'.$end['timestamp']; + } + + $s_hour = $start['hour']; + if(strtoupper($start['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $e_hour = $end['hour']; + if(strtoupper($end['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $start_time = $start['date'].' '.sprintf("%02d", $s_hour).':'.sprintf("%02d", $start['minutes']).' '.$start['ampm']; + $end_time = $end['date'].' '.sprintf("%02d", $e_hour).':'.sprintf("%02d", $end['minutes']).' '.$end['ampm']; + + return strtotime($start_time).':'.strtotime($end_time); + } + +} diff --git a/app/core/src/Books/BookingForm.php b/app/core/src/Books/BookingForm.php new file mode 100755 index 0000000..dde58e1 --- /dev/null +++ b/app/core/src/Books/BookingForm.php @@ -0,0 +1,68 @@ +enqueue(); + $mainClass = new \MEC_main(); + $single = new \MEC_skin_single(); + $settings = Settings::getInstance()->get_settings(); + + global $MEC_Events; + $MEC_Events = $single->get_event_mec($event_id); + $single_event = isset( $MEC_Events[0] ) ? $MEC_Events[0] : false; + if( !$single_event ){ + + return; + } + + $is_modal = isset($settings['single_booking_style']) && $settings['single_booking_style'] == 'modal' ? true : false; + + $data_lity_class = ''; + if ( $is_modal ) { + + $data_lity_class = 'lity-hide'; + } + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + $occurrence = (isset($single_event->date['start']['timestamp']) ? $single_event->date['start']['timestamp'] : (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : '')); + $occurrence_end_date = trim($occurrence) ? $mainClass->get_end_date_by_occurrence($single_event->data->ID, (isset($single_event->date['start']['date']) ? $single_event->date['start']['date'] : $occurrence)) : ''; + + if ($mainClass->is_sold($single_event, (trim($occurrence) ? $occurrence : $single_event->date['start']['date'])) && count($single_event->dates) <= 1) : ?> +
    class=" mec-sold-tickets warning-msg"> + + date)); ?> +
    + can_show_booking_module($single_event)) : + ?> +
    + module('booking.default', array('event' => $MEC_Events))); + } + ?> +
    + 'mec-books', + 'fields' => '', + 'posts_per_page' => -1, + 'post_status' => array('publish','pending','draft','future','private'), + 'meta_query' => array( + 'relation' => 'AND', + ) + ); + + $q_args = wp_parse_args($q_args,$default); + + //event_ids start + if(array_key_exists('event_id',$q_args) && !empty($q_args['event_id'])){ + + $q_args['meta_query']['event_id'] = array( + 'key' => 'mec_event_id', + 'value' => $q_args['event_id'], + 'compare' => '=', + ); + } + + if(array_key_exists('event_ids__in',$q_args)){ + + $q_args['meta_query']['event_ids__in'] = array( + 'key' => 'mec_event_id', + 'value' => (array) $q_args['event_ids__in'], + 'compare' => 'IN', + ); + } + + if(array_key_exists('event_ids__not_in',$q_args)){ + + $q_args['meta_query']['event_ids__not_in'] = array( + 'key' => 'mec_event_id', + 'value' => (array) $q_args['event_ids__not_in'], + 'compare' => 'NOT IN', + ); + } + //event_ids end + + //other meta start + if(array_key_exists('attendee_email',$q_args) && !empty($q_args['event_id'])){ + + $q_args['meta_query']['attendee_email'] = array( + 'key' => 'mec_attendees', + 'value' => '"'.$q_args['attendee_email'].'"', + 'compare' => 'LIKE', + ); + } + + if(array_key_exists('confirmed',$q_args) && !empty($q_args['confirmed'])){ + + $q_args['meta_query']['confirmed'] = array( + 'key' => 'mec_confirmed', + 'value' => $q_args['confirmed'], + 'compare' => '=', + ); + } + + if(array_key_exists('verified',$q_args) && !empty($q_args['confirmed'])){ + + $q_args['meta_query']['verified'] = array( + 'key' => 'mec_verified', + 'value' => $q_args['verified'], + 'compare' => '=', + ); + } + //other meta end + + return get_posts($q_args); + } + + public function get_books_ids($q_args){ + + $default = array( + 'posts_per_page' => -1, + 'fields' => 'ids', + ); + + $q_args = wp_parse_args($q_args,$default); + + return $this->get_books($q_args); + } +} \ No newline at end of file diff --git a/app/core/src/Books/EventBook.php b/app/core/src/Books/EventBook.php new file mode 100755 index 0000000..99e15df --- /dev/null +++ b/app/core/src/Books/EventBook.php @@ -0,0 +1,148 @@ +get_tickets_availability( $event_id, $timestamp ); + } + + public function get_attendees( $event_id, $timestamp ){ + + $bookings = \MEC\Base::get_main()->get_bookings($event_id, $timestamp); + $book = \MEC\Base::get_main()->getBook(); + + if(count($bookings)){ + + $unique_attendees = []; + foreach($bookings as $booking){ + + $attendees = $book->get_attendees($booking->ID); + foreach($attendees as $attendee){ + + if(!isset($unique_attendees[$attendee['email']])) { + $unique_attendees[$attendee['email']] = $attendee; + + } else { + $unique_attendees[$attendee['email']]['count'] += 1; + } + } + } + } + + return $unique_attendees; + } + + public function get_total_attendees( $event_id, $timestamp ){ + + $attendees = $this->get_attendees( $event_id, $timestamp ); + $total = array_sum( array_column( $attendees, 'count' ) ); + + return $total; + } + + /** + * Booking Options + * + * @param int $event_id + * @return array + */ + public function get_booking_options( $event_id ){ + + return (array)get_post_meta( $event_id, 'mec_booking', true); + } + + /** + * Total Booking Limit return int | "-1" unlimited + * + * @param int $event_id + * @return int + */ + public function get_total_booking_limit($event_id){ + + $booking_options = $this->get_booking_options($event_id); + $bookings_limit = isset($booking_options['bookings_limit']) && (int)$booking_options['bookings_limit'] ? (int)$booking_options['bookings_limit'] : -1; + if(isset($booking_options['bookings_limit_unlimited']) && $booking_options['bookings_limit_unlimited']){ + + $bookings_limit = -1; + } + + return $bookings_limit; + } + + /** + * Total User Booking Limit return int | "-1" unlimited + * + * @param int $event_id + * @return int + */ + public function get_user_total_booking_limit($event_id){ + + $booking_options = $this->get_booking_options($event_id); + $bookings_limit = isset($booking_options['bookings_user_limit']) && (int)$booking_options['bookings_user_limit'] ? (int)$booking_options['bookings_user_limit'] : -1; + if(isset($booking_options['bookings_user_limit_unlimited']) && $booking_options['bookings_user_limit_unlimited']){ + + $bookings_limit = -1; + } + + return $bookings_limit; + } + + public function get_user_books( $event_id ){ + + if ( ! is_user_logged_in() ) { + + return false; + } + + $user_data = wp_get_current_user(); + + $email = $user_data->user_email; + if ( empty( $email ) ) { + + return false; + } + + $books = BooksQuery::getInstance()->get_books_ids( + array( + 'attendee_email' => $email, + 'event_id' => $event_id, + ) + ); + + return $books; + } + + /** + * @param int $event_id + * @return array + */ + public function get_user_books_times_for_event( $event_id ) { + + $books = $this->get_user_books( $event_id ); + + if( empty( $books ) || !$books ){ + + return $books; + } + + $books_times = []; + if ( is_array( $books ) ) { + + foreach ( $books as $book_id ) { + + $books_times[ $book_id ] = get_post_meta( $book_id, 'mec_attention_time_start', true ); + } + } + + return $books_times; + } +} diff --git a/app/core/src/Books/index.php b/app/core/src/Books/index.php new file mode 100755 index 0000000..9d7a83d --- /dev/null +++ b/app/core/src/Books/index.php @@ -0,0 +1,5 @@ +type = 'event'; + parent::__construct( $data, $load_post ); + } + + public function get_tickets() { + + return $this->get_meta( 'mec_tickets' ); + } + + public function get_content( $content = null ) { + + return is_null( $content ) ? $this->main->get_post_content( $this->ID ) : $content; + } + + public function get_datetime() { + + $date = $this->get_data( 'date' ); + $is_allday = (bool)$this->get_meta( 'mec_allday' ); + + if ( ! is_null( $date ) ) { + + if( $is_allday ) { + + $start_date = $date['start']['date']; + $end_date = $date['end']['date']; + $date['start']['timestamp'] = strtotime( "{$start_date} 00:01" ); + $date['end']['timestamp'] = strtotime( "{$end_date} 23:59" ); + } + + return $date; + } + + $types = array( + 'start', + 'end', + ); + + $datetime = array( + 'hour' => '', + 'minutes' => '', + 'ampm' => '', + ); + + $datetimes = array( + 'start' => $datetime, + 'end' => $datetime, + ); + + foreach ( $types as $type ) { + + $date = $this->get_meta( 'mec_' . $type . '_date' ); + $hours = $this->get_meta( 'mec_' . $type . '_time_hour' ); + $minutes = $this->get_meta( 'mec_' . $type . '_time_minutes' ); + $ampm = $this->get_meta( 'mec_' . $type . '_time_ampm' ); + + $datetime = array( + 'date' => $date, + 'hours' => sprintf('%02d',$hours), + 'minutes' => sprintf('%02d',$minutes), + 'ampm' => $ampm ? $ampm : '', + ); + + if( !$is_allday ) { + + $datetime['datetime'] = "{$date} {$datetime['hours']}:{$datetime['minutes']} {$datetime['ampm']}"; + }else{ + + $time = 'start' === $type ? '00:01' : '23:59'; + $datetime['datetime'] = "{$date} $time"; + } + $datetime['timestamp'] = strtotime($datetime['datetime']); + $datetimes[ $type ] = $datetime; + } + + $this->data['datetimes'] = $datetimes; + + return $datetimes; + } + + public function get_repeating_status(){ + + return $this->get_meta('mec_repeat_status'); + } + + public function get_repeating_type(){ + + return $this->get_meta('mec_repeat_type'); + } + + public function get_occurrences_times( $start, $limit = 100 ) { + + $k = 'mec-occurrences-'.$this->ID.'-' . $start . $limit; + $occurrences = wp_cache_get( $k ); + if ( empty( $occurrences ) ) { + + $feature = \MEC::getInstance('app.libraries.feature_occurrences'); + $occurrences = $feature->get_dates( $this->ID, $start, $limit ); + wp_cache_set( $k, $occurrences, 'mec-occurrences', 120 ); + } + + return $occurrences; + } + + public function get_occurrence_data( $occurrence_id ){ + + return \MEC::getInstance('app.features.feature_occurrences')->get($occurrence_id); + } + + + public function get_occurrence_time( $start ){ + + $occurrence = $this->get_occurrences_times( $start, 1 ); + $occurrence = is_array($occurrence) ? current($occurrence) : []; + + return (object)$occurrence; + } + + public function get_end_timestamp_occurrence($timestamp){ + + if(empty($timestamp) || !is_numeric($timestamp)){ + + return null; + } + + $end_occurrence = $this->get_occurrence_time( $timestamp ); + $event_end_datetime = isset($end_occurrence->tend) ? $end_occurrence->tend : false; + + if(false === $event_end_datetime){ + + $start_date = date('Y-m-d',$timestamp); + $end_date = \MEC\Base::get_main()->get_end_date_by_occurrence( $this->ID, $start_date ); + $datetimes = $this->get_datetime($this->ID); + $event_end_datetime = strtotime("{$end_date} {$datetimes['hours']}:{$datetimes['minutes']} {$datetimes['ampm']}"); + } + + return $event_end_datetime; + } + + public function get_detail( $skin_type = 'single', $start_timestamp = '' ){ + + $start_timestamp = !empty( $start_timestamp ) ? $start_timestamp : strtotime('Yesterday'); + + $event_id = $this->ID; + $main = new \MEC_Main(); + $render = $main->getRender(); + + $rendered = $render->data($event_id); + + $dates = $render->dates($event_id, NULL, 6, date('Y-m-d H:i', $start_timestamp)); + + $data = new \stdClass(); + $data->ID = $event_id; + $data->data = $rendered; + $data->dates = $dates; + $data->date = isset($dates[0]) ? $dates[0] : $this->get_datetime($event_id); + + $skin = new \stdClass(); + $skin->skin = $skin_type; + $skin->multiple_days_method = Settings::getInstance()->get_settings('multiple_day_show_method'); + + return $render->after_render( $data, $skin ); + } + + public function get_notifications_settings($group_id = null){ + + $notifications = $this->get_meta('mec_notifications'); + + if( !is_null( $group_id ) ){ + + return isset($notifications[$group_id]) ? $notifications[$group_id] : null; + } + + return $notifications; + + } + + /** + * Return event link + * + * @param int $start_timestamp + * @param bool $replace_read_more_link + * + * @return string + */ + public function get_permalink( $start_timestamp = '', $replace_read_more_link = true, $single_date_method = null ){ + + if( $replace_read_more_link ){ + + $custom_link = $this->get_meta('mec_read_more'); + if( !empty( $custom_link ) ){ + + return $custom_link; + } + } + + if( is_null( $single_date_method ) ){ + + $single_date_method = \MEC\Settings\Settings::getInstance()->get_settings( 'single_date_method' ); + } + + $url = isset( $this->data['data']->permalink ) ? $this->data['data']->permalink : get_the_permalink( $this->get_id() ); + + if( !empty( $single_date_method ) && 'referred' === $single_date_method ) { + + if( empty( $start_timestamp ) ){ + + $start_timestamp = current_time('timestamp', 0); + $occurrence = $this->get_occurrence_time( $start_timestamp ); + $start_timestamp = $occurrence->tstart; + $start_datetime = date( 'Y-m-d H:i', $start_timestamp ); + } + + $start_date = date( 'Y-m-d', $start_timestamp ); + $start_time = date( 'H:i', $start_timestamp ); + + $url = \MEC\Base::get_main()->add_qs_var('occurrence', $start_date, $url); + + $repeat_type = $this->get_meta( 'mec_repeat_type' ); + if( 'custom_days' === $repeat_type ){ + + $url = \MEC\Base::get_main()->add_qs_var('time', $start_timestamp, $url); + } + } + + return apply_filters( 'mec_get_event_permalink', $url, $this ); + } + + /** + * Return terms + * + * @param string $taxonomy + * + * @return array + */ + public function get_terms( $taxonomy ){ + + return wp_get_post_terms( $this->get_id(), $taxonomy ); + } + + /** + * Return terms ids + * + * @param string $taxonomy + * + * @return array + */ + public function get_terms_ids( $taxonomy ){ + + $terms = $this->get_terms( $taxonomy ); + + $ids = []; + foreach( $terms as $term ){ + + $ids[ $term->term_id ] = $term->term_id; + } + + return $ids; + } + + /** + * Return event custom data + * + * @return array + */ + public function get_custom_data(){ + + $data = []; + $event_fields_data = $this->get_meta( 'mec_fields' ); + if(!is_array($event_fields_data)) $event_fields_data = []; + + $event_fields = \MEC\Base::get_main()->get_event_fields(); + foreach($event_fields as $f => $event_field){ + + if(!is_numeric($f)) { + + continue; + } + + $label = isset($event_field['label']) ? $event_field['label'] : ''; + $value = isset($event_fields_data[$f]) ? $event_fields_data[$f] : NULL; + + if(is_array($value)) { + + $value = implode(', ', $value); + } + + $data[ $f ] = array( + 'label' => $label, + 'value' => $value, + ); + } + + return $data; + } +} diff --git a/app/core/src/Events/Events.php b/app/core/src/Events/Events.php new file mode 100755 index 0000000..668d6b2 --- /dev/null +++ b/app/core/src/Events/Events.php @@ -0,0 +1,100 @@ + '', + 'content' => '', + 'status' => 'publish', + ); + + $event = wp_parse_args( $event, $d_args ); + + $event_arg = array( + + 'post_title' => $event['title'], + 'post_content' => $event['content'], + 'post_status' => $event['status'], + ); + + $event_id = wp_insert_post( $event_arg ); + + do_action( 'mec_saved_event', $event_id, $event ); + + $event_mata = array( + 'mec_location_id', + 'mec_dont_show_map', + 'mec_organizer_id', + 'mec_read_more', + 'mec_more_info', + 'mec_more_info_title', + 'mec_more_info_target', + 'mec_cost', + + 'mec_additional_organizer_ids', + 'mec_additional_location_ids', + + 'mec_date', + 'mec_repeat', + 'mec_certain_weekdays', + 'mec_allday', + 'one_occurrence', + 'mec_hide_time', + 'mec_hide_end_time', + 'mec_comment', + 'mec_timezone', + 'mec_countdown_method', + 'mec_public', + + 'mec_start_date', + 'mec_start_time_hour', + 'mec_start_time_minutes', + 'mec_start_time_ampm', + 'mec_start_day_seconds', + + 'mec_end_date', + 'mec_end_time_hour', + 'mec_end_time_minutes', + 'mec_end_time_ampm', + 'mec_end_day_seconds', + + 'mec_repeat_status', + 'mec_repeat_type', + 'mec_repeat_interval', + 'mec_repeat_end', + 'mec_repeat_end_at_occurrences', + 'mec_repeat_end_at_date', + 'mec_advanced_days', + + 'mec_event_date_submit', + + 'mec_in_days', + 'mec_not_in_days', + 'mec_hourly_schedules', + 'mec_booking', + + 'mec_tickets', + 'mec_fees_global_inheritance', + 'mec_fees', + + 'mec_ticket_variations_global_inheritance', + 'mec_ticket_variations', + 'mec_reg_fields_global_inheritance', + + 'mec_reg_fields', + 'mec_bfixed_fields', + 'mec_op', + + 'mec_fields', + 'mec_notifications', + ); + + } +} diff --git a/app/core/src/Events/EventsQuery.php b/app/core/src/Events/EventsQuery.php new file mode 100755 index 0000000..19d2216 --- /dev/null +++ b/app/core/src/Events/EventsQuery.php @@ -0,0 +1,153 @@ + 'mec-events', + 'fields' => '', + 'posts_per_page' => get_option('posts_per_page',12), + 'post_status' => array('publish','pending','draft','future','private'), + 'meta_query' => array( + 'relation' => 'AND', + ), + 'post__in' => array(), + 'meta_query' => array(), + ); + + if(is_numeric($q_args) && $q_args > 0){ + + $q_args = array( + 'event_id' => $q_args + ); + } + + $q_args = wp_parse_args( $q_args, $default ); + + return $q_args; + } + + public function get_tax_query($q_args){ + + $taxonomies = array( + 'label', + 'category', + 'location', + 'organizer', + 'speaker', + 'event_type', + 'event_type_2', + ); + + $tax_query = array( + 'relation'=>'AND' + ); + + foreach($q_args as $tax => $v){ + + if(!empty($v) && in_array($tax,$taxonomies)){ + + $taxonomy = 'mec_'.$tax; + $tax_query[$taxonomy.'_term_ids'] = array( + 'taxonomy'=> $taxonomy, + 'field'=>'term_id', + 'terms'=> !is_array($v) ? explode(',', trim($v, ', ')) : (array)$v, + ); + } + } + + $tax_query = apply_filters('mec_map_tax_query', $tax_query,$q_args); + + return $tax_query; + } + + public function get_events($q_args){ + + $tax_query = array_merge_recursive( + isset($q_args['tax_query']) ? $q_args['tax_query'] : array(), + $this->get_tax_query($q_args) + ); + $q_args['tax_query'] = $tax_query; + + $q_args = $this->parse_args($q_args); + + //event_ids start + if(array_key_exists('event_id',$q_args) && !empty($q_args['event_id'])){ + + $q_args['ID'] = $q_args['event_id']; + } + + if(array_key_exists('event_ids__in',$q_args) && is_array( $q_args['event_ids__in'] )){ + + $post_in = isset( $q_args['post_in'] ) && is_array( $q_args['post_in'] ) ? $q_args['post_in'] : []; + + $q_args['post__in'] = array_merge( + $post_in, + $q_args['event_ids__in'] + ); + } + + if(array_key_exists('event_ids__not_in',$q_args) && is_array( $q_args['event_ids__not_in'] )){ + + $post_not_in = isset( $q_args['post__not_in'] ) && is_array( $q_args['post__not_in'] ) ? $q_args['post__not_in'] : []; + + $q_args['post__not_in'] = array_merge( + $post_not_in, + $q_args['event_ids__not_in'] + ); + } + + //event_ids end + + return get_posts($q_args); + } + + public function get_events_ids($q_args){ + + $default = array( + 'posts_per_page' => -1, + 'fields' => 'ids', + ); + + $q_args = wp_parse_args($q_args,$default); + + return $this->get_events($q_args); + } + + public function get_last_event($return = 'post'){ + + $query_args = $this->parse_args( + array( + 'posts_per_page' => 1, + 'order' => 'DESC', + 'orderby' => 'ID' + ) + ); + $events = get_posts($query_args); + + if(isset($events[0]) && !empty($events[0])){ + switch($return){ + case 'event': + $event = new Event($events[0]); + return $event->get_detail(); + + break; + case 'post': + default: + + return (array)$events[0]; + + break; + } + } + + return false; + } +} \ No newline at end of file diff --git a/app/core/src/Events/index.php b/app/core/src/Events/index.php new file mode 100755 index 0000000..40d16fd --- /dev/null +++ b/app/core/src/Events/index.php @@ -0,0 +1,5 @@ +get_settings(); + + if ( $is_edit_mode && ( !isset($settings['booking_status']) || !$settings['booking_status'] ) ) { + + echo '
    +

    ' + .'' + . esc_html__('This widget is displayed if booking module is active. In order for the widget in this page to be displayed correctly, please activate Booking module.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set booking module', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + + return false; + } + + return true; + } + + /** + * Return title html field + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function title( $post, $atts = array() ){ + ?> +
    + + +
    + +
    + post_content) ? $post->post_content : ''), + 'mec_fes_content', + array( + 'textarea_name'=>'mec[content]', + 'textarea_rows' => $atts['textarea_rows'] ?? get_option('default_post_edit_rows', 10), + ) + ); ?> +
    + post_excerpt) ? esc_textarea($post->post_excerpt) : ''; + + $placeholder = $required ? __('Event Excerpt', 'modern-events-calendar-lite') : __('Optional Event Excerpt', 'modern-events-calendar-lite'); + ?> +
    +

    *' : ''); ?>

    +
    +
    + +
    +
    +
    + ID; + + // This date format used for datepicker + $datepicker_format = $atts['datepicker_format'] ?? 'Y-m-d'; + $time_format = $atts['time_format'] ?? 12; + $required = (isset($atts['required']) and $atts['required']); + + $allday = get_post_meta($post_id, 'mec_allday', true); + $one_occurrence = get_post_meta($post_id, 'one_occurrence', true); + $comment = get_post_meta($post_id, 'mec_comment', true); + $hide_time = get_post_meta($post_id, 'mec_hide_time', true); + + // MEC Main + $main = \MEC\Base::get_main(); + + // Settings + $settings = $main->get_settings(); + + $hide_end_time_global = isset($settings['hide_event_end_time']) && $settings['hide_event_end_time']; + $hide_end_time = get_post_meta($post_id, 'mec_hide_end_time', true); + + if($hide_end_time_global) $hide_end_time = 1; + + $start_date = get_post_meta($post_id, 'mec_start_date', true); + + // Advanced Repeating Day + $advanced_days = get_post_meta( $post->ID, 'mec_advanced_days', true ); + $advanced_days = (is_array($advanced_days)) ? $advanced_days : []; + $advanced_str = (count($advanced_days)) ? implode('-', $advanced_days) : ''; + + $start_time_hour = get_post_meta($post_id, 'mec_start_time_hour', true); + if(trim($start_time_hour) == '') $start_time_hour = 8; + + $start_time_minutes = get_post_meta($post_id, 'mec_start_time_minutes', true); + if(trim($start_time_minutes) == '') $start_time_minutes = 0; + + $start_time_ampm = get_post_meta($post_id, 'mec_start_time_ampm', true); + if(trim($start_time_ampm) == '') $start_time_ampm = 'AM'; + + $end_date = get_post_meta($post_id, 'mec_end_date', true); + + $end_time_hour = get_post_meta($post_id, 'mec_end_time_hour', true); + if(trim($end_time_hour) == '') $end_time_hour = 6; + + $end_time_minutes = get_post_meta($post_id, 'mec_end_time_minutes', true); + if(trim($end_time_minutes) == '') $end_time_minutes = 0; + + $end_time_ampm = get_post_meta($post_id, 'mec_end_time_ampm', true); + if(trim($end_time_ampm) == '') $end_time_ampm = 'PM'; + + $repeat_status = get_post_meta($post_id, 'mec_repeat_status', true); + $repeat_type = get_post_meta($post_id, 'mec_repeat_type', true); + if(trim($repeat_type) == '') $repeat_type = 'daily'; + + $repeat_interval = get_post_meta($post_id, 'mec_repeat_interval', true); + if(trim($repeat_interval) == '' and in_array($repeat_type, array('daily', 'weekly'))) $repeat_interval = 1; + + $certain_weekdays = get_post_meta($post_id, 'mec_certain_weekdays', true); + if($repeat_type != 'certain_weekdays') $certain_weekdays = []; + + $in_days_str = get_post_meta($post_id, 'mec_in_days', true); + $in_days = trim($in_days_str) ? explode(',', $in_days_str) : []; + + $mec_repeat_end = get_post_meta($post_id, 'mec_repeat_end', true); + if(trim($mec_repeat_end) == '') $mec_repeat_end = 'never'; + + $repeat_end_at_occurrences = get_post_meta($post_id, 'mec_repeat_end_at_occurrences', true); + if(trim($repeat_end_at_occurrences) == '') $repeat_end_at_occurrences = 9; + + $repeat_end_at_date = get_post_meta($post_id, 'mec_repeat_end_at_date', true); + ?> +
    +

    +
    +
    + + +
    +
    +
    + +
    +
    + timepicker(array( + 'method' => $time_format, + 'time_hour' => $start_time_hour, + 'time_minutes' => $start_time_minutes, + 'time_ampm' => $start_time_ampm, + 'name' => 'mec[date][start]', + 'id_key' => 'start_', + 'include_h0' => true, + )); ?> +
    +
    +
    + + +
    +
    +
    + +
    +
    + timepicker(array( + 'method' => $time_format, + 'time_hour' => $end_time_hour, + 'time_minutes' => $end_time_minutes, + 'time_ampm' => $end_time_ampm, + 'name' => 'mec[date][end]', + 'id_key' => 'end_', + )); ?> +
    +
    +
    + type="checkbox" name="mec[date][allday]" id="mec_allday" value="1" onchange="jQuery('.mec-time-picker').toggle();" /> +
    +
    + type="checkbox" name="mec[date][hide_time]" id="mec_hide_time" value="1" /> +
    +
    + type="checkbox" name="mec[date][hide_end_time]" id="mec_hide_end_time" value="1" /> +
    +
    +
    + +

    +
    +
    +
    +
    +

    +
    + type="checkbox" name="mec[date][repeat][status]" id="mec_repeat" value="1" /> +
    +
    +
    + + +
    +
    + + +
    +
    + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    + timepicker(array( + 'method' => $time_format, + 'time_hour' => $start_time_hour, + 'time_minutes' => $start_time_minutes, + 'time_ampm' => $start_time_ampm, + 'name' => 'mec[exceptionsdays][start]', + 'id_key' => 'exceptions_in_days_start_', + 'include_h0' => true, + )); ?> +
    +
    +
    +
    + +
    +
    + timepicker(array( + 'method' => $time_format, + 'time_hour' => $end_time_hour, + 'time_minutes' => $end_time_minutes, + 'time_ampm' => $end_time_ampm, + 'name' => 'mec[exceptionsdays][end]', + 'id_key' => 'exceptions_in_days_end_', + )); ?> +
    +
    +
    +
    + + +
    +
    +
    +

    + + +

    +
    +
    + +
    +
    +
    +
    +
    +
    + + standardize_format($in_day[0], $datepicker_format); + $second_date = \MEC\Base::get_main()->standardize_format($in_day[1], $datepicker_format); + + $in_day_start_time = ''; + $in_day_start_time_label = ''; + $in_day_end_time = ''; + $in_day_end_time_label = ''; + + if(isset($in_day[2]) and isset($in_day[3])) + { + $in_day_start_time = $in_day[2]; + $in_day_end_time = $in_day[3]; + + // If 24 hours format is enabled then convert it back to 12 hours + if( $time_format == 24 ) + { + $in_day_ex_start = explode('-', $in_day_start_time); + $in_day_ex_end = explode('-', $in_day_end_time); + + $in_day_start_time_label = \MEC\Base::get_main()->to_24hours($in_day_ex_start[0], $in_day_ex_start[2]).':'.$in_day_ex_start[1]; + $in_day_end_time_label = \MEC\Base::get_main()->to_24hours($in_day_ex_end[0], $in_day_ex_end[2]).':'.$in_day_ex_end[1]; + } + else + { + $pos = strpos($in_day_start_time, '-'); + if($pos !== false) $in_day_start_time_label = substr_replace($in_day_start_time, ':', $pos, 1); + + $pos = strpos($in_day_end_time, '-'); + if($pos !== false) $in_day_end_time_label = substr_replace($in_day_end_time, ':', $pos, 1); + + $in_day_start_time_label = str_replace('-', ' ', $in_day_start_time_label); + $in_day_end_time_label = str_replace('-', ' ', $in_day_end_time_label); + } + } + + $in_day = $first_date . ':' . $second_date.(trim($in_day_start_time) ? ':'.$in_day_start_time : '').(trim($in_day_end_time) ? ':'.$in_day_end_time : ''); + $in_day_label = $first_date. (trim($in_day_start_time_label) ? ' '.$in_day_start_time_label : '') . ' - ' . $second_date. (trim($in_day_end_time_label) ? ' '.$in_day_end_time_label : ''); + ?> +
    + + + x +
    + +
    + +
    +
    + + :label: + x +
    +
    +
    +
    +
    +
      +
    • + +
    • +
        + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 1); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 2); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 3); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 4); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 5); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 6); ?> +
      • "> + + .1- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 7); ?> +
      • "> + + .1- +
      • +
      +
    +
      +
    • + +
    • +
        + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 1); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 2); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 3); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 4); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 5); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 6); ?> +
      • "> + + .2- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 7); ?> +
      • "> + + .2- +
      • +
      +
    +
      +
    • + +
    • +
        + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 1); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 2); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 3); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 4); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 5); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 6); ?> +
      • "> + + .3- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 7); ?> +
      • "> + + .3- +
      • +
      +
    +
      +
    • + +
    • +
        + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 1); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 2); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 3); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 4); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 5); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 6); ?> +
      • "> + + .4- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 7); ?> +
      • "> + + .4- +
      • +
      +
    +
      +
    • + +
    • +
        + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 1); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 2); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 3); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 4); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 5); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 6); ?> +
      • "> + + .l- +
      • + advanced_repeating_sort_day(\MEC\Base::get_main()->get_first_day_of_week(), 7); ?> +
      • "> + + .l- +
      • +
      +
    + +
    +
    +
    +
    + +
    +
    + type="radio" value="never" name="mec[date][repeat][end]" id="mec_repeat_ends_never" /> + +
    +
    +
    + type="radio" value="date" name="mec[date][repeat][end]" id="mec_repeat_ends_date" /> + +
    + +
    +
    +
    + type="radio" value="occurrences" name="mec[date][repeat][end]" id="mec_repeat_ends_occurrences" /> + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + type="checkbox" name="mec[date][one_occurrence]" id="mec-one-occurrence" value="1"/> +
    +
    +
    +
    +
    + + ID, 'mec_countdown_method', true); + if(trim($countdown_method) == '') { + + $countdown_method = 'global'; + } + + ?> +
    +

    +
    +
    + +
    +
    +
    + ID, 'mec_style_per_event', true); + if(trim($style_per_event) == '') { + + $style_per_event = 'global'; + } + + ?> +
    +

    +
    +
    + +
    +
    +
    + ID, 'mec_trailer_url', true); + $trailer_title = get_post_meta($post->ID, 'mec_trailer_title', true); + ?> +
    +

    +
    +
    + +
    +
    + +
    +
    +
    + ID, 'mec_public', true); + if(trim($public) === '') { + + $public = 1; + } + ?> +
    +

    +
    +
    + +
    +
    +
    + ID, 'mec_timezone', true); + if(trim($event_timezone) == '') { + + $event_timezone = 'global'; + } + ?> +
    +

    +
    +
    + +
    + +
    +
    + is_note_visible(get_post_status($post->ID)) ){ + + if( $is_edit_mode ){ + + echo '
    +

    ' + .'' + . esc_html__('The output cannot be displayed.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } + + return; + } + + $note = get_post_meta($post->ID, 'mec_note', true); + ?> +
    +

    +
    + +
    +
    + + ID, 'fes_guest_email', true); + $guest_name = get_post_meta($post->ID, 'fes_guest_name', true); + ?> + + + ID, 'mec_read_more', true); + $more_info = get_post_meta($post->ID, 'mec_more_info', true); + $more_info_title = get_post_meta($post->ID, 'mec_more_info_title', true); + ?> + + + + get_settings(); + + $cost = get_post_meta($post->ID, 'mec_cost', true); + $cost_type = ((isset($settings['single_cost_type']) and trim($settings['single_cost_type'])) ? $settings['single_cost_type'] : 'numeric'); + + $cost_auto_calculate = get_post_meta($post->ID, 'mec_cost_auto_calculate', true); + + $currency = get_post_meta($post->ID, 'mec_currency', true); + if(!is_array($currency)) $currency = []; + + $currency_per_event = ((isset($settings['currency_per_event']) and trim($settings['currency_per_event'])) ? $settings['currency_per_event'] : 0); + + $currencies = \MEC\Base::get_main()->get_currencies(); + $current_currency = (isset($currency['currency']) ? $currency['currency'] : (isset($settings['currency']) ? $settings['currency'] : NULL)); + ?> + +
    +

    m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite'))); ?> *' : ''; ?>

    +
    +
    + class="mec-col-3" name="mec[cost]" id="mec_cost" value="" placeholder="" /> +
    +
    + +
    +
    + +
    +
    + + +

    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    + ID); + + ?> +
    +

    +
    + + + + + + + + +
    +
    + + ID); + $featured_image = wp_get_attachment_image_src($attachment_id, 'large'); + if(isset($featured_image[0])) { + + $featured_image = $featured_image[0]; + } + + $featured_image_caption = $atts['featured_image_caption'] ?? false; + $media_access = current_user_can('upload_files'); + ?> + + + + +
    +

    m('taxonomy_categories', esc_html__('Categories', 'modern-events-calendar-lite'))); ?> *' : ''); ?>

    +
    + 'mec_category', + 'hide_empty' => false, + 'title_li' => '', + 'walker' => new \FES_Custom_Walker($post->ID), + )); + ?> +
    +
    + + ID, 'mec_label'); + + $labels = []; + if($post_labels) { + + foreach($post_labels as $post_label){ + + $labels[] = $post_label->term_id; + } + } + + $label_terms = get_terms( + array( + 'taxonomy'=>'mec_label', + 'hide_empty'=>false, + ) + ); + + if( $is_edit_mode && empty( $label_terms ) ){ + + echo '

    ' + .''. esc_html__('This widget is displayed if label is set. In order for the widget in this page to be displayed correctly, please set label for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set label', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + ?> + + +
    +

    m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite'))); ?> *' : ''); ?>

    +
    + + + +
    +
    + + + ID, 'mec_color', true); + $available_colors = \MEC\Base::get_main()->get_available_colors(); + + if(!trim($color)) { + + $color = $available_colors[0]; + } + ?> + + + +
    +

    +
    +
    + + + + +
    +
    +
    + + + ID, apply_filters('mec_taxonomy_tag', '')); + + $tags = ''; + foreach($post_tags as $post_tag) { + + $tags .= $post_tag->name.','; + } + ?> + +
    +

    +
    + +
    +
    + + 'mec_speaker', + 'hide_empty'=>false + )); + + if( is_wp_error( $speaker_terms ) ){ + + if( $is_edit_mode ){ + + echo '

    ' + .''. esc_html__('This widget is displayed if speaker is set. In order for the widget in this page to be displayed correctly, please set speaker for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set speaker', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + error_log( print_r($speaker_terms, true) ); + return; + } + + $post_speakers = get_the_terms($post->ID, 'mec_speaker'); + $speakers = []; + if($post_speakers) { + foreach($post_speakers as $post_speaker){ + + if(!isset($post_speaker->term_id)) continue; + $speakers[] = $post_speaker->term_id; + } + } + + ?> + +
    +

    m('taxonomy_speakers', esc_html__('Speakers', 'modern-events-calendar-lite'))); ?>

    +
    + +

    m('taxonomy_speaker', esc_html__('speaker', 'modern-events-calendar-lite')))); ?>

    + +
    +
    + + + + + +
    +
    + + ID, 'mec_sponsor'); + if( is_wp_error( $post_sponsors ) ){ + + if( $is_edit_mode ){ + + echo '
    +

    ' + .'' + . esc_html__('The output cannot be displayed.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } + + error_log( print_r($post_sponsors, true) ); + return; + } + + $sponsors = []; + if( is_array( $post_sponsors ) ) { + foreach($post_sponsors as $post_sponsor){ + + if(!isset($post_sponsor->term_id)) continue; + + $sponsors[] = $post_sponsor->term_id; + } + } + + $sponsor_terms = get_terms(array( + 'taxonomy'=>'mec_sponsor', + 'hide_empty'=>false + )); + + ?> + +
    +

    m('taxonomy_sponsors', esc_html__('Sponsors', 'modern-events-calendar-lite'))); ?>

    + +
    + +

    m('taxonomy_sponsor', esc_html__('sponsor', 'modern-events-calendar-lite')))); ?>

    + +
    + +
    + + + + + +
    +
    + + +
    +
    + + +
    +
    + getEventFields(); + $fields->form(array( + 'id' => 'mec-event-data', + 'class' => 'mec-meta-box-fields mec-event-tab-content mec-fes-event-fields', + 'post' => $post, + 'data' => get_post_meta($post->ID, 'mec_fields', true), + 'name_prefix' => 'mec', + 'id_prefix' => 'mec_event_fields_', + 'mandatory_status' => true, + )); + } + + /** + * Return hourly schedules html field + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function hourly_schedule( $post, $atts = array() ){ + + $settings = \MEC\Settings\Settings::getInstance()->get_settings(); + + $meta_hourly_schedules = get_post_meta($post->ID, 'mec_hourly_schedules', true); + if(is_array($meta_hourly_schedules) and count($meta_hourly_schedules)) + { + $first_key = key($meta_hourly_schedules); + + $hourly_schedules = []; + if(!isset($meta_hourly_schedules[$first_key]['schedules'])) + { + $hourly_schedules[] = array( + 'title' => esc_html__('Day 1', 'modern-events-calendar-lite'), + 'schedules' => $meta_hourly_schedules, + ); + } + else $hourly_schedules = $meta_hourly_schedules; + } + else $hourly_schedules = []; + + // Status of Speakers Feature + $speakers_status = isset($settings['speakers_status']) && $settings['speakers_status']; + $speakers = get_terms('mec_speaker', array( + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => '0', + )); + + $builder = \MEC\Base::get_main()->getFormBuilder(); + $builder->hourlySchedule([ + 'hourly_schedules' => $hourly_schedules, + 'speakers_status' => $speakers_status, + 'speakers' => $speakers, + ]); + } + + /** + * Return Event Gallery html form + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function event_gallery($post, $atts = array()) + { + // Disable For Guest + if(!get_current_user_id()) return; + + $required = isset($atts['required']) && $atts['required']; + $gallery = get_post_meta($post->ID, 'mec_event_gallery', true); + if(!is_array($gallery)) $gallery = []; + ?> + + + ID, 'mec_related_events', true); + if(!is_array($related_events)) $related_events = []; + + // Main + $main = \MEC\Base::get_main(); + + // All Upcoming Events + $all_events = $main->get_upcoming_event_ids(); + if(!is_array($all_events)) $all_events = []; + + // Unshift Current Events + if(count($related_events)) + { + foreach(array_reverse($related_events) as $related_event) + { + array_unshift($all_events, $related_event); + } + } + + $all_events = array_unique($all_events); + ?> + + ID, 'mec_banner', true); + if(!is_array($banner_options)) $banner_options = []; + + $mec_banner_status = isset($banner_options['status']) && $banner_options['status']; + $mec_banner_color = $banner_options['color'] ?? ''; + $mec_banner_image = $banner_options['image'] ?? ''; + $mec_banner_featured_image = $banner_options['use_featured_image'] ?? 0; + ?> +
    +

    +
    + +
    +
    +
    + + +
    +
    + + +
    + +
    +
    + load_map_assets(); + + $settings = \MEC\Settings\Settings::getInstance()->get_settings(); + + $locations = get_terms('mec_location', array('orderby'=>'name', 'hide_empty'=>'0')); + $dont_show_map = get_post_meta($post->ID, 'mec_dont_show_map', true); + + $location_id = get_post_meta($post->ID, 'mec_location_id', true); + $location_id = apply_filters('wpml_object_id', $location_id, 'mec_location', true); + + $location_ids = get_post_meta($post->ID, 'mec_additional_location_ids', true); + if(!is_array($location_ids)) $location_ids = []; + + $additional_locations_status = (!isset($settings['additional_locations']) or (isset($settings['additional_locations']) and $settings['additional_locations'])) ? true : false; + if($is_fes_form and isset($settings['fes_section_other_locations']) and !$settings['fes_section_other_locations']) $additional_locations_status = false; + + // Map Options + $status = isset($settings['google_maps_status']) ? $settings['google_maps_status'] : 1; + $api_key = isset($settings['google_maps_api_key']) ? $settings['google_maps_api_key'] : ''; + + // FES Options + $add_new_location = ($is_fes_form and isset($settings['fes_add_location'])) ? $settings['fes_add_location'] : 1; + $required = ($is_fes_form and isset($settings['fes_required_location']) and $settings['fes_required_location']); + $optional = !$required; + ?> + +
    +

    m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite'))); ?> *' : ''); ?>

    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +

    +
    +
    + +

    + + + + +
    +
    + +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    + + +
    +
    + + + +
    + +
    + + + + +
    + +
    + getPRO()): ?> +
    + + +
    + + +

    m('other_locations', esc_html__('Other Locations', 'modern-events-calendar-lite'))); ?>

    +
    +

    +
    + +
    +
    + +
    + get_settings(); + + $organizers = get_terms('mec_organizer', array('orderby'=>'name', 'hide_empty'=>'0')); + + $organizer_id = get_post_meta($post->ID, 'mec_organizer_id', true); + $organizer_id = apply_filters('wpml_object_id', $organizer_id, 'mec_organizer', true); + + // Detect it by current user + if($is_fes_form && trim($organizer_id) === '' && is_user_logged_in()) + { + // MEC Main + $main = \MEC\Base::get_main(); + + $current_user = wp_get_current_user(); + $organizer_id = apply_filters( + 'mec_get_organizer_id_by_email', + $main->get_organizer_id_by_email($current_user->user_email), + $current_user, + $current_user->user_email + ); + } + + $organizer_ids = get_post_meta($post->ID, 'mec_additional_organizer_ids', true); + if(!is_array($organizer_ids)) $organizer_ids = []; + $organizer_ids = array_unique($organizer_ids); + + $additional_organizers_status = !isset($settings['additional_organizers']) || $settings['additional_organizers']; + + // FES Options + $use_all_organizers = (($is_fes_form and isset($settings['fes_use_all_organizers']) and !$settings['fes_use_all_organizers']) ? false : true); + if(!$use_all_organizers) + { + $additional_organizers_status = false; + $organizers = []; + + // Display Saved Organizer for Current Event in FES + if($post->ID and $organizer_id and $organizer_id != 1) $organizers[] = get_term($organizer_id); + } + + $add_new_organizer = ($is_fes_form and isset($settings['fes_add_organizer'])) ? $settings['fes_add_organizer'] : 1; + ?> +
    +

    m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))); ?>

    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    + +
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +

    m('other_organizers', esc_html__('Other Organizers', 'modern-events-calendar-lite'))); ?>

    +
    +

    +
    + + +
    +
    +
    +
      + +
    • + + + + name); ?> +
    • + +
    +
    +
    + +
    + ID ); + + $bookings_limit = isset($booking_options['bookings_limit']) ? $booking_options['bookings_limit'] : ''; + $bookings_limit_unlimited = isset($booking_options['bookings_limit_unlimited']) && $booking_options['bookings_limit_unlimited'] == 1 ? true : false; + ?> +
    +

    +
    + + +
    +
    + ID ); + $bookings_date_selection = isset($booking_options['bookings_date_selection']) ? $booking_options['bookings_date_selection'] : 'global'; + ?> +
    +

    +
    + +
    + +
    +
    +
    + ID ); + + $bookings_minimum_per_booking = (isset($booking_options['bookings_minimum_per_booking']) and trim($booking_options['bookings_minimum_per_booking'])) ? (int) $booking_options['bookings_minimum_per_booking'] : 1; + ?> +
    +

    +
    + +
    +
    + ID ); + + global $wp_roles; + $roles = $wp_roles->get_names(); + + $loggedin_discount = isset($booking_options['loggedin_discount']) ? $booking_options['loggedin_discount'] : ''; + + ?> +
    +

    + $role_name): + $role_discount = isset($booking_options['roles_discount_'.$role_key]) ? $booking_options['roles_discount_'.$role_key] : $loggedin_discount; + ?> +
    +
    + +
    + +
    + +
    + ID ); + + $bookings_all_occurrences = isset($booking_options['bookings_all_occurrences']) ? $booking_options['bookings_all_occurrences'] : 0; + $bookings_all_occurrences_multiple = isset($booking_options['bookings_all_occurrences_multiple']) ? $booking_options['bookings_all_occurrences_multiple'] : 0; + + ?> +
    +

    +
    + +
    +
    + +
    +
    + ID ); + + $bookings_stop_selling_after_first_occurrence = isset($booking_options['stop_selling_after_first_occurrence']) ? $booking_options['stop_selling_after_first_occurrence'] : 0; + ?> +
    +

    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    + ID ); + + ?> +
    +

    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + get_settings(); + + $booking_options = static::get_booking_options( $post->ID ); + + $bookings_last_few_tickets_percentage_inherite = $booking_options['last_few_tickets_percentage_inherit'] ?? 1; + $bookings_last_few_tickets_percentage = ((isset($booking_options['last_few_tickets_percentage']) and trim($booking_options['last_few_tickets_percentage']) != '') ? max(1, $booking_options['last_few_tickets_percentage']) : (isset($settings['booking_last_few_tickets_percentage']) ? max(1, $settings['booking_last_few_tickets_percentage']) : 15)); + + ?> +
    +
    +

    +
    + + type="number" min="1" max="100" step="1" name="mec[booking][last_few_tickets_percentage]" value="" placeholder=""/> +
    +
    +
    + ID ); + + $bookings_thankyou_page_inherit = isset($booking_options['thankyou_page_inherit']) ? $booking_options['thankyou_page_inherit'] : 1; + + $pages = get_pages(); + ?> + +
    +

    +
    + +
    +
    > +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + + ID ); + + $bookings_booking_button_label = ((isset($booking_options['bookings_booking_button_label']) and trim($booking_options['bookings_booking_button_label']) != '') ? $booking_options['bookings_booking_button_label'] : ''); + + ?> +
    +

    +
    + +
    +
    + getPartialPayment(); + + // Partial Payment per event is not enabled + if(!$partial_payment->is_payable_per_event_enabled()) return; + + $booking_options = static::get_booking_options( $post->ID ); + + $payable_inherit = !isset($booking_options['bookings_payable_inherit']) || $booking_options['bookings_payable_inherit']; + $payable = $booking_options['bookings_payable'] ?? 100; + $payable_type = $booking_options['bookings_payable_type'] ?? 'percent'; + + // Validate + list($payable, $payable_type) = $partial_payment->validate_payable_options($payable, $payable_type); + ?> +
    +

    +
    + +
    +
    > +
    +
    + +
    + + +
    +
    +
    +
    + ID ); + + $bookings_user_limit = $booking_options['bookings_user_limit'] ?? ''; + $bookings_user_limit_unlimited = $booking_options['bookings_user_limit_unlimited'] ?? true; + + ?> +
    +

    +
    + + type="text" name="mec[booking][bookings_user_limit]" id="mec_bookings_user_limit" + value="" placeholder=""/> +
    +
    + get_gateways_options(); + + if( !( isset($gateway_settings['gateways_per_event']) and $gateway_settings['gateways_per_event'] ) ){ + + if( $is_edit_mode ){ + + echo '
    +

    ' + .'' + . esc_html__('Payment gateways per event is disabled.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } + + return; + } + + $gateways = \MEC\Base::get_main()->get_gateways(); + $enableds_gateways = []; + foreach($gateways as $gateway){ + + if(!$gateway->enabled()) continue; + $enableds_gateways[] = $gateway; + } + + if( $is_edit_mode && empty( $enableds_gateways ) ){ + + echo '
    +

    ' + .'' + . esc_html__('There is no payment gateway to show.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + + return; + } + + $booking_options = static::get_booking_options( $post->ID ); + + ?> +
    +

    +

    + + +
    + +
    + +
    + get_settings(); + + $booking_options = static::get_booking_options( $post->ID ); + + $global_inheritance = get_post_meta($post->ID, 'mec_fees_global_inheritance', true); + if (trim($global_inheritance) == '') { + $global_inheritance = 1; + } + + $fees = get_post_meta($post->ID, 'mec_fees', true); + + $global_fees = isset($settings['fees']) ? $settings['fees'] : []; + if (!is_array($fees) and trim($fees) == '') { + $fees = $global_fees; + } + + if (!is_array($fees)) { + $fees = []; + } + ?> +
    +

    +
    +
    + +
    +
    +
    + +
    +
    + $fee) : + if (!is_numeric($key)) { + continue; + } + $i = max($i, $key); + ?> +
    +
    + +
    +
    + + + +
    +
    +

    +

    +
    + +
    +
    + + + + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + + + +
    +
    +

    +

    +
    + +
    +
    + + + + +
    +
    +
    +
    + ID, 'mec_reg_fields_global_inheritance', true); + if(trim($global_inheritance) == '') $global_inheritance = 1; + + $reg_fields = get_post_meta($post->ID, 'mec_reg_fields', true); + $global_reg_fields = \MEC\Base::get_main()->get_reg_fields(); + + if((is_array($reg_fields) and !count($reg_fields)) or (!is_array($reg_fields) and trim($reg_fields) == '')) $reg_fields = $global_reg_fields; + if(!is_array($reg_fields)) $reg_fields = []; + + $bfixed_fields = get_post_meta($post->ID, 'mec_bfixed_fields', true); + $global_bfixed_fields = \MEC\Base::get_main()->get_bfixed_fields(); + + if((is_array($bfixed_fields) and !count($bfixed_fields)) or (!is_array($bfixed_fields) and trim($bfixed_fields) == '')) $bfixed_fields = $global_bfixed_fields; + if(!is_array($bfixed_fields)) $bfixed_fields = []; + + $mec_name = false; + $mec_email = false; + + foreach($reg_fields as $field) + { + if(isset($field['type'])) + { + if($field['type'] == 'mec_email') $mec_email = true; + if($field['type'] == 'name') $mec_name = true; + } + else break; + } + + if(!$mec_name) + { + array_unshift($reg_fields, array( + 'mandatory' => '0', + 'type' => 'name', + 'label' => esc_html__('Name', 'modern-events-calendar-lite'), + )); + } + + if(!$mec_email) + { + array_unshift($reg_fields, array( + 'mandatory' => '0', + 'type' => 'mec_email', + 'label' => esc_html__('Email', 'modern-events-calendar-lite'), + )); + } + ?> +
    +

    + + ID != \MEC\Base::get_main()->get_original_event($post->ID)) : ?> +

    + + +
    +
    + +
    + ID); ?> +
    + +
    +
    + + + +
      + $reg_field) + { + if(!is_numeric($key)) continue; + + $i = max($i, $key); + + if($reg_field['type'] == 'text') echo \MEC_kses::form(\MEC\Base::get_main()->field_text($key, $reg_field)); + elseif($reg_field['type'] == 'mec_email') echo \MEC_kses::form(\MEC\Base::get_main()->field_mec_email($key, $reg_field)); + elseif($reg_field['type'] == 'name') echo \MEC_kses::form(\MEC\Base::get_main()->field_name($key, $reg_field)); + elseif($reg_field['type'] == 'email') echo \MEC_kses::form(\MEC\Base::get_main()->field_email($key, $reg_field)); + elseif($reg_field['type'] == 'date') echo \MEC_kses::form(\MEC\Base::get_main()->field_date($key, $reg_field)); + elseif($reg_field['type'] == 'file') echo \MEC_kses::form(\MEC\Base::get_main()->field_file($key, $reg_field)); + elseif($reg_field['type'] == 'tel') echo \MEC_kses::form(\MEC\Base::get_main()->field_tel($key, $reg_field)); + elseif($reg_field['type'] == 'textarea') echo \MEC_kses::form(\MEC\Base::get_main()->field_textarea($key, $reg_field)); + elseif($reg_field['type'] == 'p') echo \MEC_kses::form(\MEC\Base::get_main()->field_p($key, $reg_field)); + elseif($reg_field['type'] == 'checkbox') echo \MEC_kses::form(\MEC\Base::get_main()->field_checkbox($key, $reg_field)); + elseif($reg_field['type'] == 'radio') echo \MEC_kses::form(\MEC\Base::get_main()->field_radio($key, $reg_field)); + elseif($reg_field['type'] == 'select') echo \MEC_kses::form(\MEC\Base::get_main()->field_select($key, $reg_field)); + elseif($reg_field['type'] == 'agreement') echo \MEC_kses::form(\MEC\Base::get_main()->field_agreement($key, $reg_field)); + } + ?> +
    +
    + + + + + + + + + + + + + +
    + +
    +
    + field_text(':i:')); ?> +
    +
    + field_email(':i:')); ?> +
    +
    + field_mec_email(':i:')); ?> +
    +
    + field_name(':i:')); ?> +
    +
    + field_tel(':i:')); ?> +
    +
    + field_date(':i:')); ?> +
    +
    + field_file(':i:')); ?> +
    +
    + field_textarea(':i:')); ?> +
    +
    + field_checkbox(':i:')); ?> +
    +
    + field_radio(':i:')); ?> +
    +
    + field_select(':i:')); ?> +
    +
    + field_agreement(':i:')); ?> +
    +
    + field_p(':i:')); ?> +
    +
    + field_option(':fi:', ':i:')); ?> +
    +
    +
    +
    +
    +
    + + + +
      + $bfixed_field) + { + if(!is_numeric($key)) continue; + if(!is_array($bfixed_field)) continue; + $b = max($b, $key); + + if($bfixed_field['type'] == 'text') echo \MEC_kses::form(\MEC\Base::get_main()->field_text($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'name') echo \MEC_kses::form(\MEC\Base::get_main()->field_name($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'mec_email') echo \MEC_kses::form(\MEC\Base::get_main()->field_mec_email($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'email') echo \MEC_kses::form(\MEC\Base::get_main()->field_email($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'date') echo \MEC_kses::form(\MEC\Base::get_main()->field_date($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'file') echo \MEC_kses::form(\MEC\Base::get_main()->field_file($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'tel') echo \MEC_kses::form(\MEC\Base::get_main()->field_tel($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'textarea') echo \MEC_kses::form(\MEC\Base::get_main()->field_textarea($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'p') echo \MEC_kses::form(\MEC\Base::get_main()->field_p($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'checkbox') echo \MEC_kses::form(\MEC\Base::get_main()->field_checkbox($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'radio') echo \MEC_kses::form(\MEC\Base::get_main()->field_radio($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'select') echo \MEC_kses::form(\MEC\Base::get_main()->field_select($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'agreement') echo \MEC_kses::form(\MEC\Base::get_main()->field_agreement($key, $bfixed_field, 'bfixed')); + } + ?> +
    +
    + + + + + + + + + + +
    +
    + +
    +
    + field_text(':i:', array(), 'bfixed')); ?> +
    +
    + field_email(':i:', array(), 'bfixed')); ?> +
    +
    + field_tel(':i:', array(), 'bfixed')); ?> +
    +
    + field_date(':i:', array(), 'bfixed')); ?> +
    +
    + field_textarea(':i:', array(), 'bfixed')); ?> +
    +
    + field_checkbox(':i:', array(), 'bfixed')); ?> +
    +
    + field_radio(':i:', array(), 'bfixed')); ?> +
    +
    + field_select(':i:', array(), 'bfixed')); ?> +
    +
    + field_agreement(':i:', array(), 'bfixed')); ?> +
    +
    + field_p(':i:', array(), 'bfixed')); ?> +
    +
    + field_option(':fi:', ':i:', array(), 'bfixed')); ?> +
    +
    +
    + +
    +
    +
    + ID); + } + + /** + * Return ticket variations html field + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function ticket_variations( $post, $atts = array() ){ + + if( !static::booking_demo_check( $post, $atts ) ){ + + return; + } + + $settings = \MEC\Settings\Settings::getInstance()->get_settings(); + + $global_inheritance = get_post_meta($post->ID, 'mec_ticket_variations_global_inheritance', true); + if(trim($global_inheritance) == '') $global_inheritance = 1; + + $ticket_variations = get_post_meta($post->ID, 'mec_ticket_variations', true); + $global_variations = $settings['ticket_variations'] ?? []; + + if(!is_array($ticket_variations) and trim($ticket_variations) == '') $ticket_variations = $global_variations; + if(!is_array($ticket_variations)) $ticket_variations = []; + + // Ticket Variations Object + $TicketVariations = \MEC\Base::get_main()->getTicketVariations(); + ?> +
    +

    +
    +
    + +
    +
    +
    + +
    +
    + $ticket_variation) + { + if(!is_numeric($key)) continue; + + $i = max($i, $key); + $TicketVariations->item([ + 'i' => $i, + 'value' => $ticket_variation, + ]); + } + ?> +
    +
    +
    + +
    + item([ + 'i' => ':i:', + 'value' => [], + ]); + ?> +
    +
    + post_status) and $post->post_status != 'auto-draft'); + if($draft) return; + + $limit = 100; + $now = current_time('timestamp'); + $_6months_ago = strtotime('-6 Months', $now); + + $occ = new \MEC_feature_occurrences(); + $occurrences = $occ->get_dates($post->ID, $now, $limit); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + $db = \MEC\Base::get_main()->getDB(); + $booking_dates = $db->select("SELECT `date` FROM `#__mec_bookings` WHERE `event_id`='".esc_sql($post->ID)."' GROUP BY `date` ORDER BY `date`", 'loadColumn'); + $booking_dates_for_manage = $db->select("SELECT `date` FROM `#__mec_bookings` WHERE `event_id`='".esc_sql($post->ID)."' AND `verified`=1 GROUP BY `date` ORDER BY `date`", 'loadColumn'); + + do_action('mec_events_meta_box_attendees_start', $post); + ?> +
    +

    +
    +
    + +
    +
    +
    +
    + + + '.esc_html(date_i18n($datetime_format, strtotime($booking_date))).''; + + $from = ''; + + $to_options = ''; + foreach($occurrences as $occurrence) $to_options .= ''; + + $to = ''; + ?> +

    +
    +
    + + +
    +
    +
    + + + '.esc_html(date_i18n($datetime_format, strtotime($booking_date_for_manage))).''; + + $dates_manage = ''; + ?> +

    +
    +
    + + + +
    +
    +
    + +
    + + get_settings(); + + $tickets = get_post_meta($post->ID, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + // Global Tickets + $global_tickets = isset($settings['default_tickets_status']) && $settings['default_tickets_status']; + $global_tickets_applied = (int) get_post_meta($post->ID, 'mec_global_tickets_applied', true); + + // Global Tickets + if($global_tickets && !count($tickets) && ($post->ID == -1 || get_post_status($post->ID) === 'auto-draft' || $global_tickets_applied == 0)) + { + $tickets = is_array($settings['tickets']) ? $settings['tickets'] : []; + } + + // Tickets + $ticketBuilder = $main->getTickets(); + ?> +
    + + +
    +
    +
    +
    +
    +
    + + +

    m('tickets', esc_html__('Tickets', 'modern-events-calendar-lite'))); ?>

    + + ID != $main->get_original_event($post->ID)): ?> +

    + + + builder([ + 'tickets' => $tickets, + 'object_id' => $post->ID, + ]); ?> +
    + ID, 'mec_public_dl_file', true); + if(trim($file_id) == '') $file_id = ''; + + $file_url = $file_id ? wp_get_attachment_url($file_id) : ''; + + $title = get_post_meta($post->ID, 'mec_public_dl_title', true); + $description = get_post_meta($post->ID, 'mec_public_dl_description', true); + ?> + +
    +

    +
    + + +

    + + +
    +
    +
    + + +
    +
    + + +
    +
    + ID, 'mec_dl_file', true); + if(trim($file_id) == '') $file_id = ''; + + $file_url = $file_id ? wp_get_attachment_url($file_id) : ''; + ?> + +
    +

    +
    + + +

    + + +
    +
    +
    + post_status) and $post->post_status != 'auto-draft') ? false : true; + $repeat_status = get_post_meta($post->ID, 'mec_repeat_status', true); + + if($draft or !$repeat_status) return; + + $limit = 100; + $now = current_time('timestamp'); + $_6months_ago = strtotime('-6 Months', $now); + + $occurrences = $occurencesClass->get_dates($post->ID, $now, $limit); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + $all_occurrences = $occurencesClass->get_all_occurrences($post->ID, strtotime('-1 Month')); + ?> +
    +

    +
    +
    + + +
    +
      + get_occurrence_form($all_occurrence['id'])); ?> +
    +
    +
    + + ID, 'mec_imported_from_google', true ); + if( $imported_from_google ): ?> +

    + +
    + + + + get_event_label_status(get_post_status($post->ID)); ?> + + + +
    + getCaptcha()->status('fes'); + + if( $is_edit_mode && !$status ) + { + echo '
    +

    ' + .'' + . esc_html__('Captcha is not enabled.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } + + if($status) echo \MEC\Base::get_main()->getCaptcha()->field(); + } + + /** + * Return submit button html field + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function submit_button( $post, $atts = array() ){ + + ?> + +
    + + + + +
    + + + + ID != -1 && $post == "") { + + $post = get_post_meta($post->ID, 'meta_box_virtual', true); + } + + do_action('mec_virtual_event_form', $post); + } + + /** + * Return zoom html field + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function zoom( $post, $atts = array() ){ + + ?> + + ID != -1 && $post == "") { + + $post = get_post_meta($post->ID, 'meta_box_virtual', true); + } + + do_action('mec_zoom_event_form', $post); + } + + /** + * Return other html fields + * + * @param WP_Post $post + * @param array $atts + * + * @since 1.0.0 + * + * @return void + */ + public static function other_fields( $post, $atts = array() ){ + + do_action('mec_fes_metabox_details', $post); + } + + /** + * Register style and scripts + * + * @since 1.0.0 + * + * @return void + */ + public static function register_style_and_scripts(){ + + wp_register_script( 'mec-fes-form-builder', plugin_dir_url( __FILE__ ) . 'scripts.js', array( 'jquery' ), MEC_VERSION ); + } + + /** + * Enqueue style and scripts + * + * @since 1.0.0 + * + * @return void + */ + public static function enqueue(){ + + static::register_style_and_scripts(); + + wp_enqueue_script( 'mec-fes-form-builder' ); + + do_action( 'mec_fes_form_enqueue_scripts' ); + } + + /** + * Return html + * + * @return string + */ + public function output( $event ){ + + $html = ''; + + return $html; + } +} diff --git a/app/core/src/FES/index.php b/app/core/src/FES/index.php new file mode 100755 index 0000000..40d16fd --- /dev/null +++ b/app/core/src/FES/index.php @@ -0,0 +1,5 @@ +"); + jQuery("#mec_fes_remove_image_button").removeClass("mec-util-hidden"); + } else { + jQuery("#mec_fes_thumbnail_error").html(data.message).removeClass("mec-util-hidden"); + } + }); + + return false; +} + +function mec_fes_upload_location_thumbnail() { + var fd = new FormData(); + + fd.append("action", "mec_fes_upload_featured_image"); + fd.append("_wpnonce", mecdata.fes_upload_nonce); + fd.append("file", jQuery("#mec_fes_location_thumbnail_file").prop("files")[0]); + + // Submit Button + const $button = jQuery('.mec-fes-sub-button'); + + // Disable Button + $button.prop('disabled', true); + + jQuery.ajax({ + url: mecdata.ajax_url, + type: "POST", + data: fd, + dataType: "json", + processData: false, + contentType: false + }) + .done(function (data) { + // Enable Button + $button.prop('disabled', false); + + jQuery("#mec_fes_location_thumbnail").val(data.data.url); + jQuery("#mec_fes_location_thumbnail_file").val(""); + jQuery("#mec_fes_location_thumbnail_img").html(""); + jQuery("#mec_fes_location_remove_image_button").removeClass("mec-util-hidden"); + }); + + return false; +} + +function mec_fes_upload_organizer_thumbnail() { + var fd = new FormData(); + + fd.append("action", "mec_fes_upload_featured_image"); + fd.append("_wpnonce", mecdata.fes_upload_nonce); + fd.append("file", jQuery("#mec_fes_organizer_thumbnail_file").prop("files")[0]); + + // Submit Button + const $button = jQuery('.mec-fes-sub-button'); + + // Disable Button + $button.prop('disabled', true); + + jQuery.ajax({ + url: mecdata.ajax_url, + type: "POST", + data: fd, + dataType: "json", + processData: false, + contentType: false + }) + .done(function (data) { + // Enable Button + $button.prop('disabled', false); + + jQuery("#mec_fes_organizer_thumbnail").val(data.data.url); + jQuery("#mec_fes_organizer_thumbnail_file").val(""); + jQuery("#mec_fes_organizer_thumbnail_img").html(""); + jQuery("#mec_fes_organizer_remove_image_button").removeClass("mec-util-hidden"); + }); + + return false; +} + +jQuery(document).ready(function ($) { + var mec_fes_form_ajax = false; + $("#mec_fes_form").on("submit", function (event) { + event.preventDefault(); + + var $form = $("#mec_fes_form"); + + // Hide the message + $("#mec_fes_form_message").removeClass("mec-error").removeClass("mec-success").html("").hide(); + + // Add loading Class to the form + $form.addClass("mec-fes-loading"); + $(".mec-fes-form-cntt").hide(); + $(".mec-fes-form-sdbr").hide(); + $(".mec-fes-submit-wide").hide(); + + // Fix WordPress editor issue + $("#mec_fes_content-html").click(); + $("#mec_fes_content-tmce").click(); + + // Abort previous request + if (mec_fes_form_ajax) mec_fes_form_ajax.abort(); + + var data = $form.serialize(); + mec_fes_form_ajax = $.ajax({ + type: "POST", + url: mecdata.ajax_url, + data: data, + dataType: "JSON", + success: function (response) { + // Remove the loading Class from the form + $("#mec_fes_form").removeClass("mec-fes-loading"); + $(".mec-fes-form-cntt").show(); + $(".mec-fes-form-sdbr").show(); + $(".mec-fes-submit-wide").show(); + + if (response.success == "1") { + // Show the message + $("#mec_fes_form_message").removeClass("mec-error").removeClass("mec-success").addClass("mec-success").html(response.message).css("display", "inline-block"); + + // Set the event id + $(".mec-fes-post-id").val(response.data.post_id); + + // Redirect Currnet Page + if (response.data.redirect_to !== "") { + setTimeout(function () { + window.location.href = response.data.redirect_to; + }, mecdata.fes_thankyou_page_time ); + } + } else { + // Refresh reCaptcha + if (response.code === "CAPTCHA_IS_INVALID" && typeof grecaptcha !== "undefined") { + grecaptcha.reset(); + } + + // Show the message + $("#mec_fes_form_message").removeClass("mec-error").addClass("mec-error").html(response.message).css("display", "inline-block"); + } + $("#mec_fes_form_message").get(0).scrollIntoView({behavior: 'smooth', block: 'end'}); + }, + error: function (jqXHR, textStatus, errorThrown) { + // Remove the loading Class from the form + $("#mec_fes_form").removeClass("loading"); + } + }); + }); + + // Location select2 + jQuery(".mec-additional-locations select").select2(); + jQuery("#mec_location_id").select2(); + + // Organizer Select2 + jQuery(".mec-additional-organizers select").select2(); + jQuery("#mec_organizer_id").select2(); +}); \ No newline at end of file diff --git a/app/core/src/Forms/CustomForm.php b/app/core/src/Forms/CustomForm.php new file mode 100755 index 0000000..1cdb25a --- /dev/null +++ b/app/core/src/Forms/CustomForm.php @@ -0,0 +1,162 @@ +get_settings( $status_key ); + switch ( $status ) { + case 'enable': + + break; + case 'default': + default: + $group_keys = explode( '_', $form_id ); + $group_id = str_replace( end( $group_keys ), 'general', $group_id ); + break; + } + } + + $options = Settings::getInstance()->get_options(); + $fields = isset( $options[ $group_id ] ) ? $options[ $group_id ] : []; + + + return apply_filters( 'mec_get_custom_form_fields', $fields, $event_id, $form_id, $group_id, $primary_group_id,$translated_event_id ); + } + + + public function get_reg_fields( $group_id, $event_id = null, $translated_event_id = null ) { + + $group_id .= '_reg'; + $mec_email = false; + $mec_first_name = false; + $mec_last_name = false; + + $fields = $this->get_fields( $group_id, $event_id, $translated_event_id ); + + if ( !is_array( $fields ) ) { + $fields = []; + } + + foreach ( $fields as $k => $field ) { + if ( isset( $field['type'] ) ) { + if ( 'first_name' === $field['type'] ) { + $mec_first_name = true; + $fields[$k]['mapping'] = 'first_name'; + } + + if ( 'last_name' === $field['type'] ) { + $mec_last_name = true; + $fields[$k]['mapping'] = 'last_name'; + } + + if ( 'mec_email' === $field['type'] ) { + $mec_email = true; + } + } else { + break; + } + } + + if ( !$mec_last_name ) { + array_unshift( + $fields, + array( + 'mandatory' => '0', + 'type' => 'last_name', + 'mapping' => 'last_name', + 'label' => esc_html__( 'Last Name', 'modern-events-calendar-lite'), + ) + ); + } + + if ( !$mec_first_name ) { + array_unshift( + $fields, + array( + 'mandatory' => '0', + 'type' => 'first_name', + 'mapping' => 'first_name', + 'label' => esc_html__( 'First Name', 'modern-events-calendar-lite'), + ) + ); + } + + if ( !$mec_email ) { + array_unshift( + $fields, + array( + 'mandatory' => '0', + 'type' => 'mec_email', + 'label' => esc_html__( 'Email', 'modern-events-calendar-lite'), + ) + ); + } + + return $fields; + } + + public function get_fixed_fields( $group_id, $event_id = null, $translated_event_id = null ) { + + $group_id .= '_bfixed'; + + return $this->get_fields( $group_id, $event_id, $translated_event_id ); + } + + public function display_reg_fields( $group_id, $event_id = null, $attendee_id = 0, $translated_event_id = null, $data = array() ) { + + if ( is_null( $event_id ) ) { + + $event_id = get_the_ID(); + } + + $fields = $this->get_reg_fields( $group_id, $event_id ); + ob_start(); + DisplayFields::display_fields( $group_id, 'reg', $fields, $attendee_id,[], $data ); + + return ob_get_clean(); + } + + public function display_fixed_fields( $group_id, $event_id = null, $translated_event_id = null, $data = array() ) { + + if ( is_null( $event_id ) ) { + + $event_id = get_the_ID(); + } + + $fields = $this->get_fixed_fields( $group_id, $event_id ); + ob_start(); + DisplayFields::display_fields( $group_id, 'fixed', $fields, 0, [], $data ); + + return ob_get_clean(); + } + + public function display_fields( $group_id, $event_id = null, $attendee_id = 0,$data = [] ) { + + $fixed_data = isset($data['fixed']) && is_array($data['fixed']) ? $data['fixed'] : []; + $html = $this->display_fixed_fields( $group_id, $event_id, null, $fixed_data ); + + $reg_data = isset($data['reg']) && is_array($data['reg']) ? $data['reg'] : []; + $html .= $this->display_reg_fields( $group_id, $event_id, $attendee_id, null, $reg_data ); + + return $html; + } + +} \ No newline at end of file diff --git a/app/core/src/Forms/DisplayFields.php b/app/core/src/Forms/DisplayFields.php new file mode 100755 index 0000000..5f21478 --- /dev/null +++ b/app/core/src/Forms/DisplayFields.php @@ -0,0 +1,257 @@ + + + $field ) : + + if(in_array($field_id, [':i:',':fi:','_i_','_fi_',], true)){ + + continue; + } + + $type = isset( $field['type'] ) ? $field['type'] : false; + if ( false === $type ) { + continue; + } + + $j = !is_null($j) ? $j : $field_id; + $field_id = isset($field['key']) && !empty($field['key']) ? $field['key'] : $field_id; + $html_id = 'mec_field_' . $group_id . '_' . $type . '_' . $j; + $required = ( ( isset( $field['required'] ) && $field['required'] ) || ( isset( $field['mandatory'] ) && $field['mandatory'] ) ) ? 'required="required"' : ''; + $field_label = isset($field['label']) ? $field['label'] : null; + + $field_name = strtolower( str_replace( [ + ' ', + ',', + ':', + '"', + "'", + ], '_', $field_label ) ); + + $field_id = strtolower( str_replace( [ + ' ', + ',', + ':', + '"', + "'", + ], '_', $field_id ) ); + + if ( isset( $field['single_row'] ) && 'enable' === $field['single_row'] ) : ?> +
    + + + +
    + first_name; + break; + case 'last_name': + $field_type = 'text'; + $field_id = 'last_name'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : esc_html__('Last Name', 'modern-events-calendar-lite'); + $value = $current_user->last_name; + break; + case 'mec_email': + $field_type = 'email'; + $field_id = $type; + $field['label'] = isset( $field['label'] ) ? $field['label'] : esc_html__('Email', 'modern-events-calendar-lite'); + $value = isset( $current_user->user_email ) ? $current_user->user_email : ''; + case 'email': + $field_type = 'email'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : 'Email'; + $value = isset( $current_user->user_email ) ? $current_user->user_email : ''; + break; + case 'text': + $field_type = 'text'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : ''; + $value = ''; + break; + case 'date': + $field_type = 'date'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : 'Date'; + $value = ''; + $class = 'mec-date-picker'; + $attributes = ' min="' . esc_attr( date( 'Y-m-d', strtotime( '-100 years' ) ) ) . '" max="' . esc_attr( date( 'Y-m-d', strtotime( '+100 years' ) ) ) . '" onload="mec_add_datepicker()"'; + break; + case 'file': + $field_type = 'file'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : 'File'; + $value = ''; + break; + case 'tel': + $field_type = 'tel'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : 'Tel'; + $value = ''; + break; + case 'textarea': + $field_type = 'textarea'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : ''; + $value = ''; + break; + case 'select': + $field_type = 'select'; + $field['label'] = isset( $field['label'] ) ? $field['label'] : ''; + $value = ''; + $selected = ''; + break; + case 'radio': + case 'checkbox': + $field_type = $type; + $value = ''; + break; + case 'agreement': + + break; + + } + + if( 'fixed' === $form_type || ( 'reg' === $form_type && in_array($field_id,['mec_email','first_name','last_name'],true) ) ){ + + $field_id = 'mec_email' === $field_id ? 'email' : $field_id; + $value = isset($data[$field_id]) ? $data[$field_id] : $value; + } else { + + $value = isset($data[$form_type][$field_id]) ? $data[$form_type][$field_id] : $value; + } + + $lock_field = !empty( $value ); + $lock_field = ( $lock_field && ( $lock_prefilled == 1 or ( $lock_prefilled == 2 and $j == 1 ) ) ) ? 'readonly' : ''; + + if('reg' === $form_type){ + + $field_name = 'rsvp[attendees][' . esc_attr($j) . '][' . esc_attr($form_type) . '][' . esc_attr($field_id) . ']'; + }else{ + + $field_name = 'rsvp[' . esc_attr($form_type) . '][' . esc_attr($field_id) . ']'; + } + // Display Label + if ( isset( $field['label'] ) && !empty( $field['label'] ) && 'agreement' !== $type ) { + + $label_field = ''; + + echo is_admin() ? '
    '.\MEC_kses::form($label_field).'
    ' : \MEC_kses::form($label_field); + } + + $input_html = ''; + // Display Input + switch ( $type ) { + case 'first_name': + case 'last_name': + case 'mec_email': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'text': + case 'date': + case 'file': + case 'email': + case 'tel': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'textarea': + + $placeholder = ( isset( $field['placeholder'] ) && $field['placeholder'] ) ? esc_html__( $field['placeholder'], 'modern-events-calendar-lite') : esc_html__( $field['label'], 'modern-events-calendar-lite'); + $input_html = ''; + + break; + case 'select': + + $placeholder = ''; + $input_html = ''; + + break; + case 'radio': + case 'checkbox': + $options = isset($field['options']) ? $field['options'] : []; + foreach ( $options as $field_option ) { + $current_value = esc_html__( $field_option['label'], 'modern-events-calendar-lite'); + $checked = in_array($current_value,(array)$value); + $input_html .= ''; + } + + break; + case 'agreement': + + $checked = isset( $field['status'] ) ? $field['status'] : 'checked'; + $input_html = ''; + + break; + + case 'p': + + $input_html = '

    ' . do_shortcode( stripslashes( $field['content'] ) ) . '

    '; + + break; + } + + echo is_admin() ? '
    '.\MEC_kses::form($input_html).'
    ' : \MEC_kses::form($input_html); + ?> +
    + get_wp_user_fields_dropdown( + 'mec[' . esc_attr( $prefix ) . '_fields][' . esc_attr( $key ) . '][mapping]', + $v + ); + } + + $html .= '
    + +
    '; + + + return $html; + } + + /** + * Show text field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_text( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Text', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'text', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show text field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_name( $key, $values = array(), $prefix = 'reg' ) { + + $type = $values['type']; + switch($type){ + case 'first_name': + + $label = esc_html__( 'MEC First Name', 'modern-events-calendar-lite'); + break; + case 'last_name': + + $label = esc_html__( 'MEC Last Name', 'modern-events-calendar-lite'); + break; + default: + + $label = esc_html__( 'MEC Name', 'modern-events-calendar-lite'); + break; + + } + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html( $label ) . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + +
    +
  • '; + } + + /** + * Show text field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_first_name( $key, $values = array(), $prefix = 'reg' ) { + + return $this->field_name( $key, $values, $prefix ); + } + + /** + * Show text field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_last_name( $key, $values = array(), $prefix = 'reg' ) { + + return $this->field_name( $key, $values, $prefix ); + } + + /** + * Show text field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_mec_email( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'MEC Email', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + +
    +
  • '; + } + + /** + * Show email field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_email( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Email', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'email', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show URL field options in forms + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_url( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'URL', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'url', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show file field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_file( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'File', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + +
    +
  • '; + } + + /** + * Show date field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_date( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Date', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'date', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show tel field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_tel( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Tel', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'tel', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show textarea field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_textarea( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Textarea', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'textarea', $values, $prefix ) . ' +
    +
  • '; + } + + /** + * Show paragraph field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_p( $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Paragraph', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + +

    ' . esc_html__( 'HTML and shortcode are allowed.' ) . '

    +
    +
  • '; + } + + /** + * Show checkbox field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_checkbox( $key, $values = array(), $prefix = 'reg' ) { + + $i = 0; + $field = '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Checkboxes', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'checkbox', $values, $prefix ) . ' +
      '; + + if ( isset( $values['options'] ) and is_array( $values['options'] ) and count( $values['options'] ) ) { + foreach ( $values['options'] as $option_key => $option ) { + $i = max( $i, $option_key ); + $field .= $this->field_option( $key, $option_key, $values, $prefix ); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show radio field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_radio( $key, $values = array(), $prefix = 'reg' ) { + + $i = 0; + $field = '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Radio Buttons', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'radio', $values, $prefix ) . ' +
      '; + + if ( isset( $values['options'] ) and is_array( $values['options'] ) and count( $values['options'] ) ) { + foreach ( $values['options'] as $option_key => $option ) { + $i = max( $i, $option_key ); + $field .= $this->field_option( $key, $option_key, $values, $prefix ); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show select field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_select( $key, $values = array(), $prefix = 'reg' ) { + + $i = 0; + $field = '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Dropdown', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . $this->input_key( $key, 'select', $values, $prefix ) . ' +
      '; + + if ( isset( $values['options'] ) and is_array( $values['options'] ) and count( $values['options'] ) ) { + foreach ( $values['options'] as $option_key => $option ) { + $i = max( $i, $option_key ); + $field .= $this->field_option( $key, $option_key, $values, $prefix ); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show agreement field options in booking form + * + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_agreement( $key, $values = array(), $prefix = 'reg' ) { + + // WordPress Pages + $pages = get_pages(); + + $i = 0; + $field = '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Agreement', 'modern-events-calendar-lite') . ' + ' . ( $prefix === 'event' ? '%%event_field_' . esc_attr( $key ) . '%%' : ( $prefix === 'bfixed' ? '%%booking_field_' . esc_attr( $key ) . '%%' : '' ) ) . ' + ' . ( str_contains($prefix, 'rsvp',) && str_contains($prefix, 'bfixed') ? '%%rsvp_field_' . esc_attr( $key ) . '%%' : '' ) . ' +

    + +

    + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' +
    + +

    ' . esc_html__( 'Instead of %s, the page title with a link will be show.', 'modern-events-calendar-lite') . '

    +
    + + +
    +
    + + +
    + +
    +
  • '; + + return $field; + } + + /** + * Show option tag parameters in booking form for select, checkbox and radio tags + * + * @param string $field_key + * @param string $key + * @param array $values + * @param string $prefix + * + * @return string + */ + public function field_option( $field_key, $key, $values = array(), $prefix = 'reg' ) { + + return '
  • + ' . esc_html__( 'Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__( 'Remove', 'modern-events-calendar-lite') . ' + +
  • '; + } + + public function get_wp_user_fields_dropdown( $name, $value ) { + + $fields = $this->get_wp_user_fields(); + + $dropdown = ''; + + return $dropdown; + } + + public function get_wp_user_fields() { + + $user_id = get_current_user_id(); + if( !$user_id ){ + + return array(); + } + $raw_fields = get_user_meta( $user_id ); + + $forbidden = array( + 'nickname', + 'syntax_highlighting', + 'comment_shortcuts', + 'admin_color', + 'use_ssl', + 'show_admin_bar_front', + 'wp_user_level', + 'user_last_view_date', + 'user_last_view_date_events', + 'wc_last_active', + 'last_update', + 'last_activity', + 'locale', + 'show_welcome_panel', + 'rich_editing', + 'nav_menu_recently_edited', + ); + + $fields = array(); + foreach ( $raw_fields as $key => $values ) { + if ( substr( $key, 0, 1 ) === '_' ) { + continue; + } + if ( substr( $key, 0, 4 ) === 'icl_' ) { + continue; + } + if ( substr( $key, 0, 4 ) === 'mec_' ) { + continue; + } + if ( substr( $key, 0, 3 ) === 'wp_' ) { + continue; + } + if ( substr( $key, 0, 10 ) === 'dismissed_' ) { + continue; + } + if ( in_array( $key, $forbidden ) ) { + continue; + } + + $value = ( isset( $values[0] ) ? $values[0] : null ); + if ( is_array( $value ) ) { + continue; + } + if ( is_serialized( $value ) ) { + continue; + } + + $fields[ $key ] = trim( ucwords( str_replace( '_', ' ', $key ) ) ); + } + + return $fields; + } + +} diff --git a/app/core/src/Forms/SettingsForm.php b/app/core/src/Forms/SettingsForm.php new file mode 100755 index 0000000..b45de7d --- /dev/null +++ b/app/core/src/Forms/SettingsForm.php @@ -0,0 +1,322 @@ +main = new \MEC_Main(); + } + + public function enqueue() { + + if ( true !== $this->enqueue ) { + + wp_enqueue_style( 'mec-backend', plugin_dir_url( __FILE__ ) . 'backend.css' ); + wp_enqueue_script( 'mec-backend', plugin_dir_url( __FILE__ ) . 'backend.js', array( 'jquery' ) ); + $this->enqueue = true; + } + } + + /** + * Get Form Fields + * + * @param $group_id + * + * @return array + */ + public function get_fields( $group_id ) { + + return CustomForm::getInstance()->get_reg_fields( $group_id ); + } + + /** + * @param $group_id + * + * @return array + */ + public function get_fixed_fields( $group_id ) { + + $fixed_fields = CustomForm::getInstance()->get_fixed_fields( $group_id ); + if ( !is_array( $fixed_fields ) ) { + $fixed_fields = []; + } + + return $fixed_fields; + } + + /** + * @param string $type + * + * @return mixed|void + */ + public function get_element_fields( $type = 'reg' ) { + + $elements = array( + 'first_name' => array( + 'required' => true, + 'text' => esc_html__( 'MEC First Name', 'modern-events-calendar-lite'), + 'class' => 'red', + ), + 'last_name' => array( + 'required' => true, + 'text' => esc_html__( 'MEC Last Name', 'modern-events-calendar-lite'), + 'class' => 'red', + ), + 'mec_email' => array( + 'required' => true, + 'text' => esc_html__( 'MEC Email', 'modern-events-calendar-lite'), + 'class' => 'red', + ), + 'text' => array( + 'required' => false, + 'text' => esc_html__( 'Text', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'email' => array( + 'required' => false, + 'text' => esc_html__( 'Email', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'date' => array( + 'required' => false, + 'text' => esc_html__( 'Date', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'tel' => array( + 'required' => false, + 'text' => esc_html__( 'Tel', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'file' => array( + 'required' => false, + 'text' => esc_html__( 'File', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'textarea' => array( + 'required' => false, + 'text' => esc_html__( 'Textarea', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'checkbox' => array( + 'required' => false, + 'text' => esc_html__( 'Checkboxes', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'radio' => array( + 'required' => false, + 'text' => esc_html__( 'Radio Buttons', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'select' => array( + 'required' => false, + 'text' => esc_html__( 'Dropdown', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'agreement' => array( + 'required' => false, + 'text' => esc_html__( 'Agreement', 'modern-events-calendar-lite'), + 'class' => '', + ), + 'p' => array( + 'required' => false, + 'text' => esc_html__( 'Paragraph', 'modern-events-calendar-lite'), + 'class' => '', + ), + ); + + if ( 'reg' !== $type ) { + + unset( $elements['first_name'] ); + unset( $elements['last_name'] ); + unset( $elements['mec_email'] ); + } + + return apply_filters( 'mec_get_element_fields', $elements ); + } + + /** + * @param array $fields + * @param string $group_id + * @param string $type reg|bfixed|$custom + */ + public function display_fields( $fields, $group_id, $type = 'reg' ) { + + $type_fields = $type; + $type = $group_id . '_' . $type; + add_action( 'admin_footer', array( $this, 'enqueue' ) ); + ?> +
    + +
    + + + + +
      + $field_args ) { + if(in_array($key, [':i:',':fi:','_i_','_fi_',], true)){ + + continue; + } + $i = max( $i, (int)$key ); + + + echo \MEC_kses::form($this->display_field( $key, $field_args, $type )); + } + + ?> +
    +
    + get_element_fields( $type_fields ); + foreach ( $elements as $element_id => $element ) { + + $text = isset( $element['text'] ) ? $element['text'] : ''; + $class = isset( $element['class'] ) ? $element['class'] : ''; + echo ''; + } + + ?> +
    + +
    + + + +
    + $element ) { + $method = 'field_' . $element_id; + if ( method_exists( FormFields::class, $method ) ) { + + echo '
    ' . + $this->display_field( ':i:', [ 'type' => $element_id ], $type ) + . '
    '; + } + } + + ?> +
    + field_option( ':fi:', ':i:', array(), $type ); ?> +
    +
    +
    + + fieldFactory ) ) { + + $this->fieldFactory = FormFields::getInstance(); + } + + $html = ''; + switch ( $type ) { + case 'text': + $html .= $this->fieldFactory->field_text( $key, $field_args, $prefix ); + break; + case 'name': + $html .= $this->fieldFactory->field_first_name( $key, $field_args, $prefix ); + break; + case 'first_name': + $html .= $this->fieldFactory->field_first_name( $key, $field_args, $prefix ); + break; + case 'last_name': + $html .= $this->fieldFactory->field_last_name( $key, $field_args, $prefix ); + break; + case 'mec_email': + $html .= $this->fieldFactory->field_mec_email( $key, $field_args, $prefix ); + break; + case 'email': + $html .= $this->fieldFactory->field_email( $key, $field_args, $prefix ); + break; + case 'date': + $html .= $this->fieldFactory->field_date( $key, $field_args, $prefix ); + break; + case 'file': + $html .= $this->fieldFactory->field_file( $key, $field_args, $prefix ); + break; + case 'tel': + $html .= $this->fieldFactory->field_tel( $key, $field_args, $prefix ); + break; + case 'textarea': + $html .= $this->fieldFactory->field_textarea( $key, $field_args, $prefix ); + break; + case 'p': + $html .= $this->fieldFactory->field_p( $key, $field_args, $prefix ); + break; + case 'checkbox': + $html .= $this->fieldFactory->field_checkbox( $key, $field_args, $prefix ); + break; + case 'radio': + $html .= $this->fieldFactory->field_radio( $key, $field_args, $prefix ); + break; + case 'select': + $html .= $this->fieldFactory->field_select( $key, $field_args, $prefix ); + break; + case 'agreement': + $html .= $this->fieldFactory->field_agreement( $key, $field_args, $prefix ); + break; + } + + return $html; + } + + public function display_settings_form_fields( $group_id, $fields = null) { + + $type = 'reg'; + if( is_null( $fields ) ){ + + $fields = $this->get_fields( $group_id ); + } + + $this->display_fields( $fields, $group_id, $type ); + } + + public function display_settings_form_fixed_fields( $group_id, $fields = null ) { + + $type = 'bfixed'; + if( is_null( $fields ) ){ + + $fields = $this->get_fixed_fields( $group_id ); + } + + $this->display_fields( $fields, $group_id, $type ); + } + +} \ No newline at end of file diff --git a/app/core/src/Forms/backend.css b/app/core/src/Forms/backend.css new file mode 100755 index 0000000..2de38eb --- /dev/null +++ b/app/core/src/Forms/backend.css @@ -0,0 +1,408 @@ +.mec_form_field_types .button { + position: relative; + outline: 0; + border-radius: 50px; + padding: 2px 21px 2px 31px !important; + line-height: 1; + font-size: 11px; + font-weight: 600; + color: #40d9f1; + letter-spacing: 2px; + height: auto; + cursor: pointer; + margin-top: 5px; + text-transform: uppercase; + box-shadow: 0 2px 6px -3px #40d9f1; + border: 2px solid #cfeff5; +} + +.mec_form_field_types .button.red { + color: #ea6485; + box-shadow: 0 2px 6px -3px #ea6485; + background: #fff; + border-color: #ffd2dd; +} + +.mec_form_field_types .button.red:hover { + background: #ea6485; + color: #fff; +} + +.mec_form_field_types .button:before { + position: absolute; + left: 12px; + color: #40d9f1; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block; +} + +.mec_form_field_types .button.red:before { + color: #ea6485; +} + +.mec_form_field_types .button.red:hover:before{ + color: #fff; +} +.mec_form_field_types .button:hover:before { + color: #0a4b78; +} + +.mec_form_field_types .button.red:hover { + color: #fff; + border: 2px solid #ea6485; +} + +.mec-fes-form .mec_form_fields span.mec_field_sort, +.mec-fes-form .mec_form_fields span.mec_bfixed_field_sort { + font-size: 0; + color: #fff; + padding-left: 20px; +} + +.mec-fes-form .mec_form_fields .mec_waiting_field_options, +.mec-fes-form .mec_form_fields .mec_bfixed_field_option_sort, +.mec-fes-form .mec_form_fields span.mec_field_option_sort { + font-size: 0; +} + +.mec-fes-form .mec_form_fields span.mec_field_option_sort:before, +.mec-fes-form .mec_form_fields span.mec_waiting_field_options:before, +.mec-fes-form .mec_form_fields span.mec_field_sort:before, +.mec-fes-form .mec_form_fields span.mec_bfixed_field_option_sort:before, +.mec-fes-form .mec_form_fields span.mec_bfixed_field_sort:before { + position: absolute; + left: px; + top: 12px; + width: 80px; + height: 20px; + display: block; + cursor: move; + font-family: simple-line-icons; + content: "\e023"; + font-size: 18px; + color: #888 +} + +.mec-fes-form .mec_form_fields span.mec_field_option_sort:before, +.mec-fes-form .mec_form_fields span.mec_waiting_field_options:before, +.mec-fes-form .mec_form_fields span.mec_bfixed_field_option_sort:before { + font-size: 13px; + left: 2px; + top: 26px; + width: 14px; + height: 14px +} + + +.mec_form_fields, +#mec_event_form_fields, +.mec_form_fields { + padding: 20px; + background: #f7f8f9; + margin: 0 0 20px 0; + border-radius: 3px; + min-height: 150px; + border: 2px dashed #dcdee0 +} + +.mec_form_fields li, #mec_event_form_fields li { + margin: 4px 10px; + border-radius: 2px; + padding: 20px 34px 24px; + background: #fff; + position: relative; + transition: all .3s ease; + + /*border-radius: 3px 11px 3px 3px;*/ + /*padding: 10px 20px 15px;*/ + position: relative; + border: 1px solid #f1f3f5; + box-shadow: 0 1px 5px rgba(0,0,0,2%) +} + +.mec_form_fields li, #mec_event_form_fields li { + +} + + +.mec_form_fields li, +#mec_event_form_fields li, +.mec_form_fields li { + margin: 4px; + border-radius: 2px; + padding: 20px 34px 24px; + background: #fff; + position: relative; + transition: all .3s ease +} + + +.mec_form_fields li ul, +#mec_event_form_fields li ul, +.mec_form_fields li ul { + padding-top: 15px; + padding-bottom: 15px; + margin: 1px +} + +.mec_form_fields li ul li, +#mec_event_form_fields li ul li, +.mec_form_fields li ul li { + padding: 7px 30px 7px 46px +} + +.mec_form_fields span.mec_event_field_type, +#mec_event_form_fields span.mec_event_field_type, +.mec_form_fields span.mec_field_type { + font-size: 11px; + font-weight: 600; + color: #8a8a8a; + text-transform: uppercase; + letter-spacing: 2px +} + +.mec_form_fields span.mec_bfixed_field_option_sort, +.mec_form_fields span.mec_bfixed_field_remove, +.mec_form_fields span.mec_bfixed_field_sort, +#mec_event_form_fields span.mec_event_field_option_sort, +#mec_event_form_fields span.mec_event_field_remove, +#mec_event_form_fields span.mec_event_field_sort, +.mec_form_fields span.mec_field_option_sort, +.mec_form_fields span.mec_field_remove, +.mec_form_fields span.mec_field_sort { + font-size: 0; + color: #fff +} + +.mec_form_fields span.mec_bfixed_field_remove, +#mec_event_form_fields span.mec_event_field_remove, +.mec_form_fields span.mec_field_remove { + position: absolute; + right: 0; + top: 0 +} + +.mec_form_fields span.mec_bfixed_field_option_sort:before, +.mec_form_fields span.mec_bfixed_field_remove:before, +.mec_form_fields span.mec_bfixed_field_sort:before, +#mec_event_form_fields span.mec_event_field_option_sort:before, +#mec_event_form_fields span.mec_event_field_remove:before, +#mec_event_form_fields span.mec_event_field_sort:before, +.mec_form_fields span.mec_field_option_sort:before, +.mec_form_fields span.mec_field_remove:before, +.mec_form_fields span.mec_field_sort:before { + position: absolute; + left: 10px; + top: 20px; + width: 80px; + height: 20px; + display: block; + cursor: move; + font-family: simple-line-icons; + content: "\e023"; + font-size: 18px; + color: #888 +} + +.mec_form_fields span.mec_bfixed_field_remove:before, +#mec_event_form_fields span.mec_event_field_remove:before, +.mec_form_fields span.mec_field_remove:before { + content: "\e082"; + width: 20px; + height: 20px; + left: auto; + right: 15px; + color: #f96666; + cursor: pointer +} + +#mec_event_form_fields span.mec_event_field_option_sort:before, +.mec_form_fields span.mec_field_option_sort:before { + font-size: 13px; + left: 2px; + top: 23px; + width: 14px; + height: 14px +} + +#mec_event_form_fields li ul li span.mec_event_field_remove, +.mec_form_fields li ul li span.mec_field_remove { + right: auto; + left: 60px; + top: 2px +} + +#mec_event_form_fields p.mec_event_field_options, +.mec_form_fields p.mec_waiting_field_options { + margin: 6px 0 8px +} + +.mec_form_fields input[type=number], .mec_form_fields input[type=text], .mec_form_fields select, .mec_form_fields textarea, +#mec_event_form_fields input[type=number], #mec_event_form_fields input[type=text], #mec_event_form_fields select, #mec_event_form_fields textarea, +.mec_form_fields input[type=number], .mec_form_fields input[type=text], .mec_form_fields select, .mec_form_fields textarea { + min-width: 260px; + min-height: 34px; + margin-bottom: 7px; + margin-top: 7px +} + +.mec_form_fields textarea, +#mec_event_form_fields textarea, +.mec_form_fields textarea { + min-height: 66px +} + +#mec_event_form_field_types button, #mec_event_form_fields button, +.mec_form_field_types button, .mec_form_fields button { + position: relative; + outline: 0; + background: #fff; + border: 1px solid #e2e2e2; + border-radius: 50px; + padding: 11px 21px 11px 31px; + line-height: 1; + font-size: 11px; + font-weight: 600; + color: #444; + letter-spacing: 2px; + height: auto; + cursor: pointer; + margin-top: 5px; + text-transform: uppercase; + box-shadow: 0 0 3px rgba(0, 0, 0, .03) +} + +#mec_event_form_field_types button:hover, #mec_event_form_fields button:hover, +.mec_form_field_types button:hover, .mec_form_fields button:hover { + border-color: #008aff; + box-shadow: 0 0 7px rgba(0, 0, 0, .1) +} + +#mec_bfixed_form_field_types button:before, .mec_form_fields button:before, +#mec_event_form_field_types button:before, #mec_event_form_fields button:before, +.mec_form_field_types button:before, .mec_form_fields button:before { + position: absolute; + left: 12px; + color: #008aff; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block +} + +.mec_form_fields button.red:hover, +#mec_event_form_field_types button.red:hover, #mec_event_form_fields button.red:hover, +.mec_form_field_types button.red:hover, .mec_form_fields button.red:hover { + border-color: red; + box-shadow: 0 0 7px rgba(0, 0, 0, .1) +} + +.mec_form_fields button.red:before, +#mec_event_form_field_types button.red:before, #mec_event_form_fields button.red:before, +.mec_form_field_types button.red:before, .mec_form_fields button.red:before { + position: absolute; + left: 12px; + color: red; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block +} + +.mec_form_fields .mec_bfixed_notification_placeholder, +#mec_event_form_fields .mec_event_notification_placeholder { + padding: 2px; + display: block; + margin: 10px 0 20px; +} + +@media (max-width: 768px) { + .mec_form_fields input[type=number], .mec_form_fields input[type=text], .mec_form_fields select, .mec_form_fields textarea, + #mec_event_form_fields input[type=number], #mec_event_form_fields input[type=text], #mec_event_form_fields select, #mec_event_form_fields textarea, + .mec_form_fields input[type=number], .mec_form_fields input[type=text], .mec_form_fields select, .mec_form_fields textarea { + min-width: 80px; + width: 100% + } +} + + +.mec-admin-dark-mode.post-type-mec-events .mec_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec_form_fields li { + background: #1F1F1F; + color: #fff; +} + +.mec-admin-dark-mode.post-type-mec-events .mec_form_fields { + background: #282828; + border-color: #353535; +} + +.mec-admin-dark-mode.post-type-mec-events .mec_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec_form_fields { + background: #000; +} + +/* MEC Backend Responsive Mobile & Tablet */ +@media (max-width: 480px) { + #mec_event_form_fields, + .mec_form_fields { + padding: 10px; + } +} + + +.mec_form_fields span.mec_field_remove, +.mec_form_fields span.mec_field_sort { + font-size: 0; + color: #fff; + padding: 5px; +} + +.mec_form_fields span.mec_field_remove { + position: absolute; + right: 0; + top: 0 +} + +.mec_form_fields span.mec_field_sort:before { + position: absolute; + left: 10px; + top: 20px; + width: 80px; + height: 20px; + display: block; + cursor: move; + font-family: simple-line-icons; + content: "\e023"; + font-size: 18px; + color: #888 +} + +.mec_form_fields span.mec_field_remove:before { + content: "\e082"; + width: 20px; + height: 20px; + left: auto; + right: 15px; + color: #f96666; + cursor: pointer +} + +.mec_form_fields li ul li span.mec_field_remove { + right: auto; + left: 60px; + top: 2px +} + +.mec_form_fields li ul, #mec_event_form_fields li ul { + padding-top: 15px; + padding-bottom: 15px; + margin: 1px +} + +.mec_form_fields li ul li, #mec_event_form_fields li ul li { + padding: 7px 30px 7px 46px +} diff --git a/app/core/src/Forms/backend.js b/app/core/src/Forms/backend.js new file mode 100755 index 0000000..d77149a --- /dev/null +++ b/app/core/src/Forms/backend.js @@ -0,0 +1,139 @@ +function mec_fields_option_listeners() { + + jQuery('.mec_field_remove').on('click', function (e) { + jQuery(this).parent('li').remove(); + }); + + jQuery('button.mec-field-add-option').off('click').on('click', function (e) { + + var container = jQuery(e.currentTarget).parents('.mec-container'); + if(container.length > 1){ + container = container[0]; + } + var form = jQuery(e.currentTarget).parents('.mec-form-row'); + if(form.length > 1){ + form = form[0]; + } + var item_box = jQuery(e.currentTarget).parents('li'); + var form_type = jQuery(form).data('form-type'); + var field_id = jQuery(this).data('field-id'); + var key = jQuery('#mec_new_' + form_type + '_field_option_key_' + field_id, container).val(); + var html = jQuery('.mec_field_option', container).html().replace(/:i:/g, key).replace(/:fi:/g, field_id); + + jQuery('.mec_fields_options_container', item_box).append(html); + jQuery('#mec_new_' + form_type + '_field_option_key_' + field_id, container).val(parseInt(key) + 1); + + mec_fields_option_listeners(); + }); + + if (typeof jQuery.fn.sortable !== 'undefined') { + jQuery(".mec_form_fields").sortable( + { + handle: '.mec_field_sort' + }); + + jQuery(".mec_fields_options_container").sortable( + { + handle: '.mec_field_option_sort' + }); + } +} + +jQuery(document).ready(function($) +{ + let $event_selectbox = $('.mec-reports-selectbox-event'); + + /* Load event dates in Report page */ + if ($event_selectbox.length > 0) { + $event_selectbox.select2(); + $event_selectbox.on('change', function (e) { + e.preventDefault(); + var id = $event_selectbox.val(); + $.ajax({ + url: mec_admin_localize.ajax_url, + type: 'POST', + data: { + action: 'report_event_dates', + nonce: mec_admin_localize.ajax_nonce, + event_id: id, + }, + success: function (response) { + $('.mec-report-selected-event-attendees-wrap').hide(); + $('.mec-reports-selectbox-dates').remove(); + $('.mec-report-selected-event-attendees-wrap .w-row .w-col-sm-12').html(''); + $('.mec-report-select-event-wrap .w-row .w-col-sm-12').append(response); + $('.mec-report-sendmail-wrap').hide(); + $('.mec-report-backtoselect-wrap').hide(); + }, + }); + }); + } + + $event_selectbox.trigger('change'); + + jQuery('[name="mec[waiting_form][waiting_form_id]"]').on("change", function () { + if (jQuery(this).data("name") == "waiting_form_id") { + jQuery("div#mec_form_container").removeClass("mec-util-hidden"); + jQuery("#waiting_form_id").addClass("mec-util-hidden"); + } else { + jQuery("div#mec_form_container").addClass("mec-util-hidden"); + jQuery("#waiting_form_id").removeClass("mec-util-hidden"); + jQuery(this).val(jQuery("#waiting_form_id").val()); + } + }); + jQuery("#waiting_form_id").on("change", function () { + jQuery("input[data-name=formBuilder_waiting_form_id]").val(jQuery(this).val()); + }) + + if (typeof (mec_default_waiting_form_id) != "undefined") { + jQuery("input[data-name=formBuilder_waiting_form_id]").prop("checked", true); + jQuery("#waiting_form_id").removeClass("mec-util-hidden"); + jQuery("div#mec_form_container").addClass("mec-util-hidden"); + jQuery("input[data-name=formBuilder_waiting_form_id]").val(mec_default_waiting_form_id); + } else { + jQuery("input[data-name=waiting_form_id]").prop("checked", true); + } + + $('.mec_form_field_types button').on('click', function (e) { + var container = $(e.currentTarget).parents('.mec-container'); + if(container.length > 1){ + container = container[0]; + } + var form = $(e.currentTarget).parents('.mec-form-row'); + if(form.length > 1){ + form = form[0]; + } + var form_type = $(form).data('form-type'); + var type = $(this).data('type'); + + if (type === 'mec_email') { + if ($('.mec_form_fields', form).find('input[value="mec_email"][type="hidden"]').length) { + return false; + } + } + + if (type === 'last_name') { + if ($('.mec_form_fields', form).find('input[value="last_name"][type="hidden"]').length) { + return false; + } + } + + if (type === 'first_name') { + if ($('.mec_form_fields', form).find('input[value="first_name"][type="hidden"]').length) { + return false; + } + } + + var key = $('#mec_new_' + form_type + '_field_key', container).val(); + var html = $('.mec_field_' + type, container).html().replace(/:i:/g, key); + + $('.mec_form_fields', form).append(html); + $('#mec_new_' + form_type + '_field_key', container).val(parseInt(key) + 1); + + // Set onclick listener for add option fields + mec_fields_option_listeners(); + }); + + // Set onclick listener for add option fields + mec_fields_option_listeners(); +}); diff --git a/app/core/src/Forms/custom-form.css b/app/core/src/Forms/custom-form.css new file mode 100755 index 0000000..c47be26 --- /dev/null +++ b/app/core/src/Forms/custom-form.css @@ -0,0 +1,110 @@ +.mec-custom-form-box .hidden { + display: none; +} + +.mec-custom-form-box input[type=date], +.mec-custom-form-box input[type=email], +.mec-custom-form-box input[type=number], +.mec-custom-form-box input[type=password], +.mec-custom-form-box input[type=tel], +.mec-custom-form-box input[type=text], +.mec-custom-form-box select, +.mec-custom-form-box textarea { + display: block; + background: #fcfcfc; + min-height: 42px; + min-width: 180px; + font-size: 13px; + border: 1px solid #e0e0e0; + padding: 13px 10px; + width: 330px; + margin-bottom: 20px; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 5%); + clear: both; +} + +.mec-custom-form-box form > h4 { + text-transform: uppercase; + font-size: 15px; + font-weight: 700; + color: #313131; + border-bottom: 4px solid #ebebeb; + width: 100%; + display: block; + padding-bottom: 10px; + position: relative; + text-align: center; + margin-bottom: 20px; +} + +.mec-custom-form-box form > h4:before { + padding: 1px 35px; + border-bottom: 4px solid #40d9f1; + font-size: 6px; + content: ""; + text-align: center; + position: absolute; + bottom: -4px; + margin-left: -35px; + left: 50%; +} + +.mec-custom-form-box select { + display: block; + background: #fcfcfc; + min-height: 42px; + min-width: 180px; + font-size: 13px; + border: 1px solid #e0e0e0; + padding: 13px 10px; + width: 330px; + margin-bottom: 20px; + box-shadow: inset 0 2px 4px rgba(0, 0, 0 , 5%); + clear: both; +} + +.mec-custom-form-box button { + min-width: 155px; + margin-top: 5px; + margin-left: 10px; + border-radius: 2px; + box-shadow: 0 2px 1px rgba(0 ,0 ,0 , 8%); +} +/* +.mec-custom-form-box .button, +.mec-custom-form-box a.button:not(.owl-dot), +.mec-custom-form-box button:not(.owl-dot):not(.gm-control-active), +.mec-custom-form-box input[type=button], +.mec-custom-form-box input[type=reset], +.mec-custom-form-box input[type=submit] { + position: relative; + border: none; + border-radius: 2px; + color: #fff; + display: inline-block; + font-size: 12px; + letter-spacing: 1px; + line-height: 1.5; + text-transform: uppercase; + font-weight: 600; + text-decoration: none; + cursor: pointer; + margin-bottom: 21px; + margin-right: 10px; + line-height: 1; + padding: 18px 20px 16px; + background: #24ca4f; + -webkit-transition: all .21s ease; + -moz-transition: all .21s ease; + transition: all .21s ease; +} */ + +.mec-custom-form-box input[type=checkbox], +.mec-custom-form-box .mec-form-row input[type=checkbox], +.mec-custom-form-box .mec_rsvp_form .mec-form-row input[type=checkbox], +.mec-custom-form-box input[type=radio], +.mec-custom-form-box .mec-form-row input[type=radio], +.mec-custom-form-box .mec_rsvp_form .mec-form-row input[type=radio] { + position: relative; + margin:0 3px; +} diff --git a/app/core/src/Forms/index.php b/app/core/src/Forms/index.php new file mode 100755 index 0000000..092481f --- /dev/null +++ b/app/core/src/Forms/index.php @@ -0,0 +1,5 @@ +init( $taxonomy ); + } + + public function init( $taxonomy ) { + + $this->taxonomy = $taxonomy; + + add_filter( "bulk_actions-edit-{$taxonomy}", array( $this, 'add_export_bulk_action' ) ); + add_filter( "handle_bulk_actions-edit-{$taxonomy}", array( $this, 'handle_export_data_bulk_action' ),10,3); + add_action( 'admin_init', array( $this, 'admin_init' ) ); + add_action( 'mec_import_export_page', array( $this, 'import_page' ) ); + } + + public function admin_init() { + + $ix_action = isset($_REQUEST['mec-ix-action']) ? sanitize_text_field( $_REQUEST['mec-ix-action'] ) : ''; + + if( $ix_action && in_array( $ix_action, array( 'import-start-organizers', 'import-start-speakers', 'import-start-locations' ) ) ){ + + global $MEC_Import_Result; + $MEC_Import_Result = $this->import_from_csv(); + } + } + + public function get_columns( $taxonomy ) { + + $columns = array( + 'term_id' => __('ID', 'modern-events-calendar-lite'), + 'name' => esc_html__('Name', 'modern-events-calendar-lite'), + 'description' => esc_html__('Description', 'modern-events-calendar-lite'), + 'thumbnail' => esc_html__('Thumbnail', 'modern-events-calendar-lite'), + ); + + + if(!function_exists('is_plugin_active')) { + + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + } + + $is_active_dashboard = is_plugin_active( 'mec-user-dashboard/mec-user-dashboard.php' ); + + if( in_array( $taxonomy, array( 'mec_organizer', 'mec_speaker' ) ) ) { + + $columns['tel'] = esc_html__('Tel', 'modern-events-calendar-lite'); + $columns['email'] = esc_html__('Email', 'modern-events-calendar-lite'); + $columns['url'] = esc_html__('Page URL', 'modern-events-calendar-lite'); + $columns['page_label'] = esc_html__('Page Label', 'modern-events-calendar-lite'); + $columns['email'] = esc_html__('Email', 'modern-events-calendar-lite'); + $columns['facebook'] = esc_html__('Facebook', 'modern-events-calendar-lite'); + $columns['instagram'] = esc_html__('Instagram', 'modern-events-calendar-lite'); + $columns['linkedin'] = esc_html__('Linkedin', 'modern-events-calendar-lite'); + $columns['twitter'] = esc_html__('Twitter', 'modern-events-calendar-lite'); + $columns['featured'] = esc_html__('Featured', 'modern-events-calendar-lite'); + + if( $is_active_dashboard && 'mec_organizer' == $taxonomy ) { + + $columns['mec_organizer_user'] = __( 'Organizer User ID', 'modern-events-calendar-lite'); + }elseif( $is_active_dashboard && 'mec_organizer' == $taxonomy ) { + + $columns['mec_speaker_user'] = __( 'Speaker User ID', 'modern-events-calendar-lite'); + } + + } elseif ( 'mec_location' === $taxonomy ) { + + $columns['address'] = esc_html__('Address', 'modern-events-calendar-lite'); + $columns['opening_hour'] = esc_html__('Opening Hour', 'modern-events-calendar-lite'); + $columns['latitude'] = esc_html__('Latitude', 'modern-events-calendar-lite'); + $columns['longitude'] = esc_html__('Longitude', 'modern-events-calendar-lite'); + $columns['url'] = esc_html__('Location Website', 'modern-events-calendar-lite'); + } + + + return apply_filters('mec_csv_export_terms_columns', $columns, $taxonomy); + } + + public function add_export_bulk_action( $bulk_actions ) { + + $bulk_actions['export-csv'] = __( 'Export as CSV', 'mec-advanced-organizer' ); + + return $bulk_actions; + } + + public function handle_export_data_bulk_action($redirect_url, $action, $term_ids){ + + if( 'export-csv' === $action ) { + + $taxonomy = $_REQUEST['taxonomy'] ?? ''; + + $columns = $this->get_columns( $taxonomy ); + + $terms = get_terms(array( + 'taxonomy' => $taxonomy, + 'hide_empty' => false, + 'term_ids' => $term_ids, + )); + + $terms_data = []; + foreach( $terms as $term ) { + + $term_id = $term->term_id; + + $term_data = []; + foreach( $columns as $column_id => $column_title ) { + + switch( $column_id ) { + case 'term_id': + case 'name': + case 'description': + + $term_data[ $column_id ] = $term->{$column_id}; + break; + default: + + $term_data[ $column_id ] = get_term_meta( $term_id, $column_id, true ); + + break; + } + } + + $terms_data[ $term_id ] = $term_data; + } + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=' . $taxonomy . '-' .md5(time().mt_rand(100, 999)).'.csv'); + + $output = fopen('php://output', 'w'); + fprintf( $output, chr(0xEF).chr(0xBB).chr(0xBF) ); + fputcsv( $output, $columns ); + + foreach( $terms_data as $term_data ) { + + fputcsv( $output, $term_data ); + } + + die(); + } + + return $redirect_url; + } + + public function upload_featured_image( $image_url ) { + + $attach_id = \MEC\Base::get_main()->get_attach_id($image_url); + if(!$attach_id) { + + $upload_dir = wp_upload_dir(); + $filename = basename($image_url); + + if(wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'].'/'.$filename; + else $file = $upload_dir['basedir'].'/'.$filename; + + if(!file_exists($file)) { + + $image_data = \MEC\Base::get_main()->get_web_page($image_url); + file_put_contents($file, $image_data); + } + + $wp_filetype = wp_check_filetype($filename, null); + $attachment = array( + 'post_mime_type' => $wp_filetype['type'], + 'post_title' => sanitize_file_name($filename), + 'post_content' => '', + 'post_status'=>'inherit' + ); + + $attach_id = wp_insert_attachment( $attachment, $file ); + require_once ABSPATH.'wp-admin/includes/image.php'; + + $attach_data = wp_generate_attachment_metadata( $attach_id, $file ); + wp_update_attachment_metadata( $attach_id, $attach_data ); + } + + return $attach_id; + } + + public function import_from_csv() { + + $nonce = (isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : ''); + if (!$nonce || !wp_verify_nonce($nonce, 'mec_import_start_upload')) { + + return; + } + + $import_action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + if ('import-start-' . str_replace( 'mec_', '', $this->taxonomy ) . 's' !== $import_action) { + + return; + } + + $taxonomy = $this->taxonomy; + $columns = $this->get_columns( $taxonomy ); + + $feed_file = $_FILES['feed']; + + // File is not uploaded + if (!isset($feed_file['name']) or (isset($feed_file['name']) and trim($feed_file['name']) == '')) return array('success' => 0, 'message' => __('Please upload a CSV file.', 'mec-organizer')); + + // File name validation + $name_ex = explode('.', $feed_file['name']); + $name_end = end($name_ex); + if ($name_end != 'csv') return array('success' => 0, 'message' => __('Please upload a CSV file.', 'mec-organizer')); + + // Upload the File + $upload_dir = wp_upload_dir(); + + $target_path = $upload_dir['basedir'] . '/' . basename($feed_file['name']); + $uploaded = move_uploaded_file($feed_file['tmp_name'], $target_path); + + // Error on Upload + if (!$uploaded) return array('success' => 0, 'message' => __("An error occurred during the file upload! Please check permissions!", 'mec-organizer')); + + if ($type = mime_content_type($target_path) and $type == 'text/x-php') { + unlink($target_path); + return array('success' => 0, 'message' => __("Please upload a CSV file.", 'mec-organizer')); + } + + $field_keys = []; + $terms = []; + if (($h = fopen($target_path, 'r')) !== false) { + + $r = 0; + while (($data = fgetcsv($h, 1000, ",")) !== false) { + $r++; + + $cell_1 = $data[0]; + if ($r === 1 && !is_numeric($cell_1)){ + + $field_keys['ID'] = 0; + foreach( $columns as $k => $title ){ + + $id = array_search( $title, $data ); + if(false !== $id){ + + $field_keys[$title] = $id; + } + } + + continue; + } + + $term = []; + foreach( $columns as $column_id => $title ) { + + $term[ $column_id ] = $data[ $field_keys[$title] ] ?? ''; + } + + $term_id = $term['term_id'] ?? false; + if( $term_id ){ + + $term['ID'] = $term_id; + $terms[$term_id] = $term; + }else{ + + $terms[] = $term; + } + + } + + fclose($h); + + foreach ( $terms as $term_data ) { + + $term_id = (int)($term_data['term_id'] ?? 0); + $term_name = $term_data['term_name'] ?? ''; + $args = []; + foreach( $term_data as $t_id => $t_data ) { + + switch( $t_id ) { + case 'term_id': + break; + case 'name': + case 'description': + + $args[ $t_id ] = $t_data; + break; + default: + $meta_inputs[ $t_id ] = $t_data; + + } + } + + if( $term_id ) { + + $r = wp_update_term( $term_id, $taxonomy, $args ); + }else{ + + $r = wp_insert_term( $term_name, $taxonomy, $args ); + $term_id = $r['term_id'] ?? 0; + } + + $featured_image = $term_data['thumbnail'] ?? ''; + if( trim($featured_image) ) { + + $file = \MEC\Base::get_main()->getFile(); + $file_name = basename($featured_image); + + $path = rtrim($upload_dir['path'], DS.' ').DS.$file_name; + $url = rtrim($upload_dir['url'], '/ ').'/'.$file_name; + + // Download Image + $buffer = \MEC\Base::get_main()->get_web_page($featured_image); + + $file->write( $path, $buffer ); + if( $this->upload_featured_image( $url ) ) { + + $meta_inputs['thumbnail'] = $url; + } + } + + if( $term_id ) { + + foreach( $meta_inputs as $meta_key => $meta_value ) { + + update_term_meta( $term_id, $meta_key, $meta_value ); + } + } + } + } + + // Delete File + unlink($target_path); + + return array('success' => (count($terms) ? 1 : 0), 'message' => (count($terms) ? __('The Organizers are imported successfully!', 'mec-organizer') : __('No Organizers found to import!', 'mec-organizer'))); + } + + public function import_page( $tab ) { + + if ( 'MEC-import' !== $tab ) { + return; + } + + $tax = str_replace( 'mec_', '', $this->taxonomy ); + $taxonomy = "{$tax}s"; + + $ix_action = isset($_REQUEST['mec-ix-action']) ? sanitize_text_field( $_REQUEST['mec-ix-action'] ) : ''; + ?> +
    +

    +
    +
    +

    + ' . __('Modern Events Calendar', 'mec-organizer') . '' + ); + ?> +

    +

    + +

    +
    +
    + + + + +
    +
    +
    + + +
    + +
    + +
    + +
    + $notice, + "type" => $type, + "dismissible" => $dismissible_text + )); + + update_option("mec_flash_notices", $notices ); + } + + /** + * Display flush notices + * + * @since 1.0.0 + * + * @return void + */ + function display_flash_notices() { + $notices = get_option( "mec_flash_notices", array() ); + + foreach ( $notices as $notice ) { + + printf('

    %3$s

    ', + $notice['type'], + $notice['dismissible'], + $notice['notice'] + ); + } + + if( ! empty( $notices ) ) { + + delete_option( "mec_flash_notices", array() ); + } + } +} \ No newline at end of file diff --git a/app/core/src/Libraries/index.php b/app/core/src/Libraries/index.php new file mode 100755 index 0000000..40d16fd --- /dev/null +++ b/app/core/src/Libraries/index.php @@ -0,0 +1,5 @@ +ID; + if(!$term_id){ + return []; + } + + return array( + 'id'=>$term_id, + 'name'=>$term->name, + 'address'=> get_term_meta( $term_id, 'address', true), + 'latitude'=>get_term_meta($term_id, 'latitude', true), + 'longitude'=>get_term_meta($term_id, 'longitude', true), + 'url'=>get_term_meta($term_id, 'url', true), + 'thumbnail'=>get_term_meta($term_id, 'thumbnail', true) + ); + } +} \ No newline at end of file diff --git a/app/core/src/Locations/index.php b/app/core/src/Locations/index.php new file mode 100755 index 0000000..112d0ee --- /dev/null +++ b/app/core/src/Locations/index.php @@ -0,0 +1,5 @@ + '', + 'group_id' => '', + 'base_field_name' => '', + 'section_title' => '', + 'enable_options_text' => '', + 'enable_options_description' => '', + 'placeholders' => [], + 'options' => '', + ); + + $atts = wp_parse_args( $atts, $default ); + + $atts = apply_filters( 'mec_display_notification_settings_atts', $atts ); + + include __DIR__ .'/template-notification-settings.php'; + } +} \ No newline at end of file diff --git a/app/core/src/Notifications/SendEmail.php b/app/core/src/Notifications/SendEmail.php new file mode 100755 index 0000000..a6eca0a --- /dev/null +++ b/app/core/src/Notifications/SendEmail.php @@ -0,0 +1,489 @@ +get_options('notifications'); + + return isset($options[$this->group_id]) && is_array($options[$this->group_id]) ? $options[$this->group_id] : $this->get_default_notification_settings(); + } + + public function get_default_notification_settings(){ + + return []; + } + + public function get_notification_settings( $key = null ){ + + if( empty($this->notifications_options) ){ + $global_options = $this->_get_notifications_settings(); + $this->notifications_options = $global_options; + + $event_options = []; + if($this->event_id){ + + $event = new Event( $this->event_id, false ); + $event_options = $event->get_notifications_settings(); + if( isset($event_options['status']) && (bool)$event_options['status'] ){ + + $this->notifications_options['subject'] = $event_options['subject']; + $this->notifications_options['content'] = $event_options['content']; + } + if ( str_contains($this->group_id,'rsvp')){ + if( isset($event_options[$this->group_id]['status']) && (bool)$event_options[$this->group_id]['status'] ){ + + $this->notifications_options['subject'] = $event_options[$this->group_id]['subject']; + $this->notifications_options['content'] = $event_options[$this->group_id]['content']; + } + } + } + + $this->notifications_options = apply_filters('mec_get_notifications_options', $this->notifications_options, $this->group_id, $global_options, $event_options ); + } + + if(!is_null( $key )){ + + return isset( $this->notifications_options[$key] ) ? $this->notifications_options[$key] : null; + } + + return $this->notifications_options; + } + + public function get_subject( $default = '' ){ + + $subject = $this->get_notification_settings( 'subject' ); + + return !is_null($subject) ? esc_html__($subject, 'modern-events-calendar-lite') : $default; + } + + public function get_content( $default = '' ){ + + $content = $this->get_notification_settings( 'content' ); + + return !empty($content) ? $content : $default; + } + + public function get_enabled_status(){ + + $status = $this->get_notification_settings( 'status' ); + + return (bool)$status ; + } + + public function get_send_to_admin_status(){ + + $status = $this->get_notification_settings( 'send_to_admin' ); + + return (bool)$status ; + } + + public function get_send_to_organizer_status(){ + + $status = $this->get_notification_settings( 'send_to_organizer' ); + + return (bool)$status ; + } + + public function get_send_to_event_author_status(){ + + $status = $this->get_notification_settings( 'send_to_author' ); + + return (bool)$status ; + } + + public function get_send_to_user_status(){ + + $status = $this->get_notification_settings( 'send_to_user' ); + + return (bool)$status ; + } + + public function get_recipients_emails(){ + + $recipients = $this->get_notification_settings( 'recipients' ); + $recipients = explode(',', trim($recipients)); + + return !empty($recipients) && is_array($recipients) ? $recipients : []; + } + + public function get_receiver_users_ids(){ + + $users_ids = $this->get_notification_settings( 'receiver_users' ); + + return !empty($users_ids) && is_array($users_ids) ? $users_ids : []; + } + + public function get_receiver_users_emails(){ + + $users_ids = $this->get_receiver_users_ids(); + + return (array)\MEC\base::get_main()->get_emails_by_users($users_ids); + } + + public function get_receiver_roles(){ + + $users_ids = $this->get_notification_settings( 'receiver_roles' ); + + return !empty($users_ids) && is_array($users_ids) ? $users_ids : []; + } + + public function get_receiver_roles_emails(){ + + $users_roles = $this->get_receiver_roles(); + + return (array)\MEC\base::get_main()->get_emails_by_roles( $users_roles ); + } + + public function get_organizer_email(){ + + $organizer_id = get_post_meta($this->event_id, 'mec_organizer_id', true); + $email = get_term_meta($organizer_id, 'email', true); + + return trim($email) ? $email : false; + } + + public function get_event_author_email(){ + + $email = ''; + $event = get_post( $this->event_id ); + $author_id = isset( $event->post_author ) ? $event->post_author : 0; + $user = $author_id ? get_user_by( 'id', $author_id ) : false; + if( is_a( $user, '\WP_User' ) ) { + + $email = isset( $user->user_email ) ? $user->user_email : ''; + } + + return trim($email) ? $email : false; + } + + public function get_all_recipients_emails(){ + + $emails = array_merge( + $this->get_recipients_emails(), + $this->get_receiver_users_emails(), + ); + + $emails = array_merge( + $emails, + $this->get_receiver_roles_emails() + ); + + $emails = array_map('trim', $emails); + foreach($emails as $k => $email){ + + if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)){ + + unset($emails[$k]); + } + } + + return array_unique($emails); + } + + public function get_target_users_or_emails(){ + + $users_or_emails = []; + + + $allowed_check_settings_for_attendees = $this->allowed_check_settings_for_attendees(); + + + $is_in_allowed = in_array($this->group_id, $allowed_check_settings_for_attendees); + + if( + !$is_in_allowed + || + ($is_in_allowed && $this->get_send_to_user_status()) + ){ + + $attendees = $this->get_attendees(); + + if( is_array($attendees) && !empty($attendees) ){ + + $users_or_emails = $attendees; + } + } + + if($this->get_send_to_admin_status()){ + + $users_or_emails[] = get_bloginfo('admin_email'); + } + + if($this->get_send_to_organizer_status()){ + + $organizer_email = $this->get_organizer_email(); + if(!empty($organizer_email)){ + + $users_or_emails[] = $organizer_email; + } + } + + if($this->get_send_to_event_author_status()){ + + $author_email = $this->get_event_author_email(); + if(!empty($author_email)){ + + $users_or_emails[] = $author_email; + } + } + + return $users_or_emails; + } + + public function get_author($object_id){ + return (object)[]; + } + + public function render_author(&$content,$object_id,$attendee){ + + $author = $this->get_author($object_id); + + + $first_name = (isset($author->first_name) ? $author->first_name : ''); + $last_name = (isset($author->last_name) ? $author->last_name : ''); + $name = (isset($author->first_name) ? trim($author->first_name.' '.(isset($author->last_name) ? $author->last_name : '')) : ''); + $email = (isset($author->user_email) ? $author->user_email : ''); + + /** + * Get the data from Attendee instead of main author user + */ + if(isset($attendee['name']) and trim($attendee['name'])){ + $name = $attendee['name']; + $attendee_ex_name = explode(' ', $name); + + $first_name = isset($attendee_ex_name[0]) ? $attendee_ex_name[0] : ''; + $last_name = isset($attendee_ex_name[1]) ? $attendee_ex_name[1] : ''; + $email = isset($attendee['email']) ? $attendee['email'] : $email; + } + + // author Data + $content = str_replace('%%first_name%%', $first_name, $content); + $content = str_replace('%%last_name%%', $last_name, $content); + $content = str_replace('%%name%%', $name, $content); + $content = str_replace('%%user_email%%', $email, $content); + $content = str_replace('%%user_id%%', (isset($author->ID) ? $author->ID : ''), $content); + + return $content; + } + + public function render_site_data(&$content,$object_id){ + + $content = str_replace('%%blog_name%%', get_bloginfo('name'), $content); + $content = str_replace('%%blog_url%%', get_bloginfo('url'), $content); + $content = str_replace('%%blog_description%%', get_bloginfo('description'), $content); + + return $content; + } + + public function render_event_data(&$content,$object_id,$timestamps){ + + // Date & Time Format + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + if(!trim($timestamps)) { + + $timestamps = $this->get_event_times(); + } + list($start_timestamp, $end_timestamp) = explode(':', $timestamps); + + // Event Data + $organizer_id = get_post_meta($this->event_id, 'mec_organizer_id', true); + $location_id = get_post_meta($this->event_id, 'mec_location_id', true); + $speaker_id = wp_get_post_terms( $this->event_id, 'mec_speaker', ''); + + $organizer = get_term($organizer_id, 'mec_organizer'); + $location = get_term($location_id, 'mec_location'); + + // Data Fields + $event_fields = \MEC\Base::get_main()->get_event_fields(); + $event_fields_data = get_post_meta($this->event_id, 'mec_fields', true); + if(!is_array($event_fields_data)) $event_fields_data = []; + + foreach($event_fields as $f => $event_field){ + if(!is_numeric($f)) { + + continue; + } + + $event_field_name = isset($event_field['label']) ? $event_field['label'] : ''; + $field_value = isset($event_fields_data[$f]) ? $event_fields_data[$f] : NULL; + if((!is_array($field_value) and trim($field_value) === '') or (is_array($field_value) and !count($field_value))){ + $content = str_replace('%%event_field_'.$f.'%%', '', $content); + $content = str_replace('%%event_field_'.$f.'_with_name%%', '', $content); + + continue; + } + + if(is_array($field_value)) $field_value = implode(', ', $field_value); + + $content = str_replace('%%event_field_'.$f.'%%', trim(stripslashes($field_value), ', '), $content); + $content = str_replace('%%event_field_'.$f.'_with_name%%', trim((trim($event_field_name) ? stripslashes($event_field_name).': ' : '').trim(stripslashes($field_value), ', ')), $content); + } + + $content = str_replace('%%event_title%%', get_the_title($this->event_id), $content); + $content = str_replace('%%event_description%%', strip_tags(strip_shortcodes(get_post_field('post_content', $this->event_id))), $content); + + $event_tags = get_the_terms($this->event_id, apply_filters('mec_taxonomy_tag', '')); + $content = str_replace('%%event_tags%%', (is_array($event_tags) ? join(', ', wp_list_pluck($event_tags, 'name')) : ''), $content); + + $event_labels = get_the_terms($this->event_id, 'mec_label'); + $content = str_replace('%%event_labels%%', (is_array($event_labels) ? join(', ', wp_list_pluck($event_labels, 'name')) : ''), $content); + + $event_categories = get_the_terms($this->event_id, 'mec_category'); + $content = str_replace('%%event_categories%%', (is_array($event_categories) ? join(', ', wp_list_pluck($event_categories, 'name')) : ''), $content); + + $mec_cost = get_post_meta($this->event_id, 'mec_cost', true); + $mec_cost = (isset($params['cost']) and trim($params['cost']) != '') ? preg_replace("/[^0-9.]/", '', $params['cost']) : $mec_cost; + + $read_more = get_post_meta($this->event_id, 'mec_read_more', true); + $read_more = (isset($params['read_more']) and trim($params['read_more']) != '') ? $params['read_more'] : $read_more; + + $more_info = get_post_meta($this->event_id, 'mec_more_info', true); + $more_info = (isset($params['more_info']) and trim($params['more_info']) != '') ? $params['more_info'] : $more_info; + + $content = str_replace('%%event_cost%%', (is_numeric($mec_cost) ? \MEC\Base::get_main()->render_price($mec_cost, $this->event_id) : $mec_cost), $content); + $content = str_replace('%%event_link%%', \MEC\Base::get_main()->get_event_date_permalink(get_permalink($this->event_id), date('Y-m-d', $start_timestamp)), $content); + $content = str_replace('%%event_more_info%%', esc_url($read_more), $content); + $content = str_replace('%%event_other_info%%', esc_url($more_info), $content); + $content = str_replace('%%event_start_date%%', \MEC\Base::get_main()->date_i18n($date_format, $start_timestamp), $content); + $content = str_replace('%%event_end_date%%', \MEC\Base::get_main()->date_i18n($date_format, $end_timestamp), $content); + $content = str_replace('%%event_start_time%%', date_i18n($time_format, $start_timestamp), $content); + $content = str_replace('%%event_end_time%%', date_i18n($time_format, $end_timestamp), $content); + $content = str_replace('%%event_timezone%%', \MEC\Base::get_main()->get_timezone($this->event_id), $content); + + $online_link = \MEC_feature_occurrences::param($this->event_id, $start_timestamp, 'moved_online_link', get_post_meta($this->event_id, 'mec_moved_online_link', true)); + $content = str_replace('%%online_link%%', esc_url($online_link), $content); + + $featured_image = ''; + $thumbnail_url = \MEC\Base::get_main()->get_post_thumbnail_url($this->event_id, 'medium'); + if(trim($thumbnail_url)) $featured_image = ''; + + $content = str_replace('%%event_featured_image%%', $featured_image, $content); + + $content = str_replace('%%event_organizer_name%%', (isset($organizer->name) ? $organizer->name : ''), $content); + $content = str_replace('%%event_organizer_tel%%', get_term_meta($organizer_id, 'tel', true), $content); + $content = str_replace('%%event_organizer_email%%', get_term_meta($organizer_id, 'email', true), $content); + $content = str_replace('%%event_organizer_url%%', get_term_meta($organizer_id, 'url', true), $content); + + $additional_organizers_name = ''; + $additional_organizers_tel = ''; + $additional_organizers_email = ''; + $additional_organizers_url = ''; + + $additional_organizers_ids = get_post_meta($this->event_id, 'mec_additional_organizer_ids', true); + if(!is_array($additional_organizers_ids)) $additional_organizers_ids = []; + + foreach($additional_organizers_ids as $additional_organizers_id) + { + $additional_organizer = get_term($additional_organizers_id, 'mec_organizer'); + if(isset($additional_organizer->name)) + { + $additional_organizers_name .= $additional_organizer->name.', '; + $additional_organizers_tel .= get_term_meta($additional_organizers_id, 'tel', true).'
    '; + $additional_organizers_email .= get_term_meta($additional_organizers_id, 'email', true).'
    '; + $additional_organizers_url .= get_term_meta($additional_organizers_id, 'url', true).'
    '; + } + } + + $content = str_replace('%%event_other_organizers_name%%', trim($additional_organizers_name, ', '), $content); + $content = str_replace('%%event_other_organizers_tel%%', trim($additional_organizers_tel, ', '), $content); + $content = str_replace('%%event_other_organizers_email%%', trim($additional_organizers_email, ', '), $content); + $content = str_replace('%%event_other_organizers_url%%', trim($additional_organizers_url, ', '), $content); + + $speaker_name = []; + foreach($speaker_id as $speaker) $speaker_name[] = isset($speaker->name) ? $speaker->name : null; + + $content = str_replace('%%event_speaker_name%%', (isset($speaker_name) ? implode(', ', $speaker_name): ''), $content); + $content = str_replace('%%event_location_name%%', (isset($location->name) ? $location->name : get_term_meta($location_id, 'address', true)), $content); + $content = str_replace('%%event_location_address%%', get_term_meta($location_id, 'address', true), $content); + + $additional_locations_name = ''; + $additional_locations_address = ''; + + $additional_locations_ids = get_post_meta($this->event_id, 'mec_additional_location_ids', true); + if(!is_array($additional_locations_ids)) $additional_locations_ids = []; + + foreach($additional_locations_ids as $additional_locations_id){ + $additional_location = get_term($additional_locations_id, 'mec_location'); + if(isset($additional_location->name)) + { + $additional_locations_name .= $additional_location->name.', '; + $additional_locations_address .= get_term_meta($additional_locations_id, 'address', true).'
    '; + } + } + + $content = str_replace('%%event_other_locations_name%%', trim($additional_locations_name, ', '), $content); + $content = str_replace('%%event_other_locations_address%%', trim($additional_locations_address, ', '), $content); + + $gmt_offset_seconds = \MEC\Base::get_main()->get_gmt_offset_seconds($start_timestamp, $this->event_id); + $event_title = get_the_title($this->event_id); + $event_info = get_post($this->event_id); + $event_content = trim($event_info->post_content) ? strip_shortcodes(strip_tags($event_info->post_content)) : $event_title; + $event_content = apply_filters('mec_add_content_to_export_google_calendar_details', $event_content,$this->event_id ); + + // Virtual Event + $content = str_replace('%%virtual_link%%', get_post_meta($this->event_id, 'mec_virtual_link_url', true), $content); + $content = str_replace('%%virtual_password%%', get_post_meta($this->event_id, 'mec_virtual_password', true), $content); + $content = str_replace('%%virtual_embed%%', get_post_meta($this->event_id, 'mec_virtual_embed', true), $content); + + $content = str_replace('%%zoom_join%%', get_post_meta($this->event_id, 'mec_zoom_join_url', true), $content); + $content = str_replace('%%zoom_link%%', get_post_meta($this->event_id, 'mec_zoom_link_url', true), $content); + $content = str_replace('%%zoom_password%%', get_post_meta($this->event_id, 'mec_zoom_password', true), $content); + $content = str_replace('%%zoom_embed%%', get_post_meta($this->event_id, 'mec_zoom_embed', true), $content); + + return $content; + } + + public function add_template($content){ + + $style = \MEC\Base::get_main()->get_styling(); + $bgnotifications = isset($style['notification_bg']) ? $style['notification_bg'] : '#f6f6f6'; + + return ' + + + +
    +
    + '.\MEC_kses::page($content).' +
    +
    '; + } + + public function send_mail($args){ + + return wp_mail( + $args['to'], + html_entity_decode(stripslashes($args['subject']), ENT_HTML5), + wpautop(stripslashes($args['message'])), + $args['headers'], + $args['attachments'] + ); + } +} diff --git a/app/core/src/Notifications/index.php b/app/core/src/Notifications/index.php new file mode 100755 index 0000000..112d0ee --- /dev/null +++ b/app/core/src/Notifications/index.php @@ -0,0 +1,5 @@ + + +
    + +

    +
    +
    + +
    +

    +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + get_users_dropdown($users, $group_id . '_notification'); + ?> + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + get_roles_dropdown($roles, $group_id . '_notification'); + ?> + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    + + esc_attr($base_field_name.'['. $group_id.'_notification][content]') + ) + ); + ?> +
    + + + +
    +
    +

    +
      + $p_text): ?> +
    • :
    • + + +
    +
    +
    + + + +
    +
    diff --git a/app/core/src/PostBase.php b/app/core/src/PostBase.php new file mode 100755 index 0000000..56871ed --- /dev/null +++ b/app/core/src/PostBase.php @@ -0,0 +1,138 @@ + $data, + ); + } + + if ( is_a( $data, '\WP_Post' ) ) { + + $data = (array) $data; + } elseif ( is_object( $data ) ) { + + $data = (array) $data; + } + + $this->data = $data; + $this->ID = isset($this->data['ID']) ? $this->data['ID'] : 0; + } + + /** + * @return int + */ + public function get_id() { + + return $this->ID; + } + + /** + * @return int + */ + public function get_title() { + + return isset($this->data['title']) ? $this->data['title'] : get_the_title($this->ID); + } + + /** + * @param string $key + * @param mixed $default + * + * @return mixed + */ + public function get_data( $key, $default = null ) { + + $v = isset( $this->data[ $key ] ) ? $this->data[ $key ] : $default; + + return apply_filters( 'mec_' . $this->type . '_get_data', $v, $key, $this->data, $default ); + } + + /** + * @param string $key + * @param mixed $value + */ + public function set_data( $key, $value ) { + + $value = apply_filters( 'mec_' . $this->type . '_get_data', $value, $key, $this->data ); + $this->data[ $key ] = $value; + } + + public function get_cached_all_data() { + + return $this->data; + } + + /** + * @return array|int|\WP_Post|null + */ + public function to_array() { + + return $this->get_cached_all_data(); + } + + /** + * @param string $key + * @param bool $return_cached + * + * @return mixed + */ + public function get_meta( $key, $return_cached = true ) { + + if(empty($key)){ + + return null; + } + + $data = $this->get_data( $key ); + if ( is_null( $data ) || !$return_cached ) { + + $data = get_post_meta( $this->ID, $key, true ); + $this->data[ $key ] = $data; + } + + return $data; + } + + /** + * @param string $key + * @param $value + * + * @return void + */ + public function set_meta( $key, $value ) { + + update_post_meta( $this->ID, $key, $value ); + $this->set_data( $key, $value ); + } + +} diff --git a/app/core/src/Settings/Settings.php b/app/core/src/Settings/Settings.php new file mode 100755 index 0000000..d6e9277 --- /dev/null +++ b/app/core/src/Settings/Settings.php @@ -0,0 +1,67 @@ +options = (array) get_option( 'mec_options' ); + } + + /** + * @param string|null $key + * + * @return false|mixed|void + */ + public function get_options( $key = null ) { + + if ( !is_null( $key ) ) { + + return isset( $this->options[ $key ] ) ? $this->options[ $key ] : null; + } + + return $this->options; + } + + /** + * @param string|null $key + * + * @return false|mixed|void + */ + public function get_settings( $key = null ) { + + + if ( !is_null( $key ) ) { + + return isset( $this->options['settings'][ $key ] ) ? $this->options['settings'][ $key ] : null; + } + + return isset( $this->options['settings'] ) ? $this->options['settings'] : []; + } + + /** + * @param string|null $key + * + * @return false|mixed|void + */ + public function get_styling( $key = null ) { + + + if ( !is_null( $key ) ) { + + return isset( $this->options['styling'][ $key ] ) ? $this->options['styling'][ $key ] : null; + } + + return isset( $this->options['styling'] ) ? $this->options['styling'] : []; + } + + + +} \ No newline at end of file diff --git a/app/core/src/Settings/index.php b/app/core/src/Settings/index.php new file mode 100755 index 0000000..9d7a83d --- /dev/null +++ b/app/core/src/Settings/index.php @@ -0,0 +1,5 @@ +get_event_id(); + } + + /** + * Get html of widget + * + * @param string $widget + * @return string + */ + public function output( $widget, $event_id = 0, $atts = array() ){ + + $html = ''; + switch( $widget ){ + + case 'title': + case 'simple-header': + + $html = Widgets\SimpleHeader\SimpleHeader::getInstance()->output( $event_id, $atts ); + + break; + + case 'content': + + $html = Widgets\Content\Content::getInstance()->output( $event_id, $atts ); + + break; + + case 'featured-image': + case 'thumbnail': + + $html = Widgets\FeaturedImage\FeaturedImage::getInstance()->output( $event_id, $atts ); + + break; + case 'event-gallery': + + $html = Widgets\EventGallery\EventGallery::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-breadcrumbs': + + $html = Widgets\EventBreadcrumbs\EventBreadcrumbs::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-cancellation-reason': + + $html = Widgets\EventCancellationReason\EventCancellationReason::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-attendees': + + $html = Widgets\EventAttendees\EventAttendees::getInstance()->output( $event_id, $atts ); + + break; + case 'booking-form': + + $html = Widgets\BookingForm\BookingForm::getInstance()->output( $event_id, $atts ); + + break; + case 'rsvp-form': + + $html = Widgets\RSVPForm\RSVPForm::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-category': + + $html = Widgets\EventCategories\EventCategories::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-cost': + + $html = Widgets\EventCost\EventCost::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-countdown': + + $html = Widgets\EventCountdown\EventCountdown::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-data': + + $html = Widgets\EventData\EventData::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-date': + + $html = Widgets\EventDate\EventDate::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-export': + + $html = Widgets\EventExport\EventExport::getInstance()->output( $event_id, $atts ); + + break; + case 'event-googlemap': + + $html = Widgets\EventGoogleMap\EventGoogleMap::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-hourly-schedule': + + $html = Widgets\EventHourlySchedule\EventHourlySchedule::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-labels': + + $html = Widgets\EventLabels\EventLabels::getInstance()->output( $event_id, $atts ); + + break; + case 'event-local-time': + + $html = Widgets\EventLocalTime\EventLocalTime::getInstance()->output( $event_id, $atts ); + + break; + case 'event-locations': + + $html = Widgets\EventLocations\EventLocations::getInstance()->output( $event_id, $atts ); + + break; + case 'event-more-info': + + $html = Widgets\EventMoreInfo\EventMoreInfo::getInstance()->output( $event_id, $atts ); + + break; + case 'event-next-occurrences': + + $html = Widgets\EventNextOccurrences\EventNextOccurrences::getInstance()->output( $event_id, $atts ); + + break; + case 'event-next-previous': + + $html = Widgets\EventNextPrevious\EventNextPrevious::getInstance()->output( $event_id, $atts ); + + break; + + case 'event-organizers': + + $html = Widgets\EventOrganizers\EventOrganizers::getInstance()->output( $event_id, $atts ); + + break; + case 'event-qr-code': + + $html = Widgets\EventQrCode\EventQrCode::getInstance()->output( $event_id, $atts ); + + break; + case 'event-register-button': + + $html = Widgets\EventRegisterButton\EventRegisterButton::getInstance()->output( $event_id, $atts ); + + break; + case 'event-related': + + $html = Widgets\EventRelated\EventRelated::getInstance()->output( $event_id, $atts ); + + break; + case 'event-social-share': + + $html = Widgets\EventSocialShare\EventSocialShare::getInstance()->output( $event_id, $atts ); + + break; + case 'event-speakers': + + $html = Widgets\EventSpeakers\EventSpeakers::getInstance()->output( $event_id, $atts ); + + break; + case 'event-sponsors': + + $html = Widgets\EventSponsors\EventSponsors::getInstance()->output( $event_id, $atts ); + + break; + case 'event-tags': + + $html = Widgets\EventTags\EventTags::getInstance()->output( $event_id, $atts ); + + break; + case 'event-time': + + $html = Widgets\EventTime\EventTime::getInstance()->output( $event_id, $atts ); + + break; + case 'event-weather': + + $html = Widgets\EventWeather\EventWeather::getInstance()->output( $event_id, $atts ); + + break; + case 'event-public-download': + + $html = Widgets\EventPublicDownload\EventPublicDownload::getInstance()->output( $event_id, $atts ); + + break; + case 'event-zoom': + + $html = Widgets\EventZoom\EventZoom::getInstance()->output( $event_id, $atts ); + + break; + case 'event-virtual': + + $html = Widgets\EventVirtual\EventVirtual::getInstance()->output( $event_id, $atts ); + + break; + case 'event-faq': + + $html = Widgets\FAQ\FAQ::getInstance()->output( $event_id, $atts ); + + break; + case 'event-trailer-url': + + $html = Widgets\EventTrailerUrl\EventTrailerUrl::getInstance()->output( $event_id, $atts ); + + break; + case 'event-banner': + + $html = Widgets\EventBanner\EventBanner::getInstance()->output( $event_id, $atts ); + + break; + + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/BookingForm/BookingForm.php b/app/core/src/SingleBuilder/Widgets/BookingForm/BookingForm.php new file mode 100755 index 0000000..98d1b0c --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/BookingForm/BookingForm.php @@ -0,0 +1,92 @@ +display_form($event_id); + return ob_get_clean(); + } + + /** + * Get HTML Output + * + * @param int $event_id + * @param array $atts + * + * @return string + */ + public function output( $event_id = 0, $atts = array() ){ + + if( !$event_id ){ + + $event_id = $this->get_event_id(); + } + + if(!$event_id){ + return ''; + } + + if( isset( $atts['display_price_label'] ) && $atts['display_price_label'] ){ + update_option('mec_filter_price_label','yes'); + update_option('mec_filter_ticket_price_label','yes'); + + }else{ + + update_option('mec_filter_price_label','no'); + update_option('mec_filter_ticket_price_label','no'); + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $html = ''; + + if ( true === $this->is_editor_mode && ( !isset($settings['booking_status']) || !$settings['booking_status'] ) ) { + $html = '
    +

    ' + .'' + . esc_html__('This widget is displayed if label is set. In order for the widget in this page to be displayed correctly, please set Booking module for your last event.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set booking module', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } else { + + $html = $this->get_display_booking_form($event_id); + + if ( true === $this->is_editor_mode && \MEC\Base::get_main()->can_show_booking_module($event_detail) && isset($settings['single_booking_style']) && $settings['single_booking_style'] == 'modal'){ + + $html .= ''; + + $html .= '

    ' + .__('It seems that you have set "Booking" to modal from Single Event MEC Settings. You need to know that for this mode to work you must add Register Button Widget to this page, then in the front-end by clicking the Register button in your events you can then see the modal mode of the Booking.', 'modern-events-calendar-lite') + .'

    '; + }elseif( true === $this->is_editor_mode && empty($html) ){ + + $html .= '

    ' + .'' + . esc_html__('This widget is displayed if Booking is set. In order for the widget in this page to be displayed correctly, please set Booking module for your last event.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set Booking module', 'modern-events-calendar-lite') . ' ' + .'

    '; + }elseif ( true === $this->is_editor_mode ){ + + $html .= ''; + } + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/Content/Content.php b/app/core/src/SingleBuilder/Widgets/Content/Content.php new file mode 100755 index 0000000..f78d4b5 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/Content/Content.php @@ -0,0 +1,64 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $content = get_the_content( '', false, $event_id ); + $content = wpautop( $content ); + $content = do_shortcode( $content ); + + if( !$this->is_editor_mode() ){ + + $content = apply_filters( 'the_content', $content ); + $content = str_replace( ']]>', ']]>', $content ); + }else{ + + if( 'yes' === get_post_meta( $event_id, '_elementor_edit_mode', true ) ){ + + $content = \Elementor\Plugin::instance()->frontend->get_builder_content_for_display( $event_id ); + } + } + + if ( empty( $content ) && $this->is_editor_mode() ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if event content is set. In order for the widget in this page to be displayed correctly, please set content for your last event.', 'modern-events-calendar-lite').'' + .'

    '; + } else { + + $class_loadmore = ''; + if ( isset($atts['mec_content_loadmore']) && $atts['mec_content_loadmore'] ) { + $class_loadmore = 'read-more-text'; + } + + $html = '
    ' + . $content . + '
    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventAttendees/EventAttendees.php b/app/core/src/SingleBuilder/Widgets/EventAttendees/EventAttendees.php new file mode 100755 index 0000000..ed61b92 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventAttendees/EventAttendees.php @@ -0,0 +1,51 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + $html = ''; + if( isset($settings['bp_status']) && $settings['bp_status'] ){ + + ob_start(); + echo Base::get_main()->module('attendees-list.details', array('event'=>$events_detail)); + $html = ob_get_clean(); + } + + if ( true === $this->is_editor_mode && empty( $html ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if buddypress is set. In order for the widget in this page to be displayed correctly, please set buddypress for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set buddypress', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + return $html; + } +} + diff --git a/app/core/src/SingleBuilder/Widgets/EventBanner/EventBanner.php b/app/core/src/SingleBuilder/Widgets/EventBanner/EventBanner.php new file mode 100755 index 0000000..4dd9ba0 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventBanner/EventBanner.php @@ -0,0 +1,116 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event = $this->get_event_detail($event_id); + $single = new \MEC_skin_single(); + + $html = ''; + + if ( true === $this->is_editor_mode && !$single->can_display_banner_module($event)) { + $html = '

    ' + .''. esc_html__('This widget is displayed if Enabled Banner is set. please set Enable Event Banner Feature for Single Event Page.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Enable Event Banner Feature', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $occurrence = (isset($event->date['start']['date']) ? $event->date['start']['date'] : (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : '')); + $occurrence_end_date = (isset($event->date['end']['date']) ? $event->date['end']['date'] : (trim($occurrence) ? $single->main->get_end_date_by_occurrence($event->data->ID, (isset($event->date['start']['date']) ? $event->date['start']['date'] : $occurrence)) : '')); + + $occurrence_full = (isset($event->date['start']) and is_array($event->date['start'])) ? $event->date['start'] : []; + if(!count($occurrence_full) and isset($_GET['occurrence'])) $occurrence_full = array('date' => sanitize_text_field($_GET['occurrence'])); + + $occurrence_end_full = (isset($event->date['end']) and is_array($event->date['end'])) ? $event->date['end'] : []; + if(!count($occurrence_end_full) and trim($occurrence)) $occurrence_end_full = array('date' => $single->main->get_end_date_by_occurrence($event->data->ID, $occurrence)); + + ob_start(); + + // Banner Options + $banner = isset($event->data, $event->data->meta, $event->data->meta['mec_banner']) ? $event->data->meta['mec_banner'] : []; + if(!is_array($banner)) $banner = []; + + $color = $banner['color'] ?? ''; + $image = $banner['image'] ?? ''; + + $featured_image = $banner['use_featured_image'] ?? 0; + + // Force Featured Image + if(isset($this->settings['banner_force_featured_image']) && $this->settings['banner_force_featured_image']) + { + $featured_image = 1; + if(trim($color) === '') $color = '#333333'; + } + + if($featured_image) $image = (string) get_the_post_thumbnail_url($event->ID, 'full'); + + $mode = 'color'; + $bg = 'background: '.$color; + + if(trim($image)) + { + $bg = 'background: url(\''.$image.'\') no-repeat center; background-size: cover'; + $mode = trim($color) ? 'color-image' : 'image'; + } + + $location_id = $single->main->get_master_location_id($event); + $location = $location_id ? $single->main->get_location_data($location_id) : []; + + $content = ''; + + // Title + $content .= '
    '; + $content .= MEC_kses::element($single->main->display_cancellation_reason($event, $single->display_cancellation_reason)); + $content .= '

    '.get_the_title().'

    '; + $content .= '
    '; + + // Date & Time + ob_start(); + $single->display_datetime_widget($event, $occurrence_full, $occurrence_end_full); + $content .= '
    '.ob_get_clean().'
    '; + + // Location + if($location_id and count($location)) + { + ob_start(); + $single->display_location_widget($event); + $content .= '
    '.ob_get_clean().'
    '; + } + + echo '
    ' + .$content. + '
    '. + ($mode === 'color-image' ? '
    ' : ''). + '
    '; + + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventBreadcrumbs/EventBreadcrumbs.php b/app/core/src/SingleBuilder/Widgets/EventBreadcrumbs/EventBreadcrumbs.php new file mode 100755 index 0000000..1c1f911 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventBreadcrumbs/EventBreadcrumbs.php @@ -0,0 +1,65 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $single = new \MEC_skin_single(); + + ob_start(); + echo '
    '; + $single->display_breadcrumb_widget( $event_id ); + echo '
    '; + return ob_get_clean(); + } + + /** + * Get HTML Output + * + * @param int $event_id + * @param array $atts + * + * @return string + */ + public function output( $event_id = 0, $atts = array() ){ + + if( !$event_id ){ + + $event_id = $this->get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + if ( true === $this->is_editor_mode && ( !isset($settings['breadcrumbs']) || !$settings['breadcrumbs'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if breadcrumbs is set. In order for the widget in this page to be displayed correctly, please set breadcrumbs for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set breadcrumbs', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $html = $this->get_breadcrumb_html($event_id); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventCancellationReason/EventCancellationReason.php b/app/core/src/SingleBuilder/Widgets/EventCancellationReason/EventCancellationReason.php new file mode 100755 index 0000000..7f07876 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventCancellationReason/EventCancellationReason.php @@ -0,0 +1,64 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $events_detail = $this->get_event_detail($event_id); + + $display_reason = get_post_meta( $event_id , 'mec_display_cancellation_reason_in_single_page', true); + ob_start(); + if ($display_reason) { + echo Base::get_main()->display_cancellation_reason($events_detail, $display_reason); + } + return ob_get_clean(); + } + + /** + * Get HTML Output + * + * @param int $event_id + * @param array $atts + * + * @return string + */ + public function output( $event_id = 0, $atts = array() ){ + + if( !$event_id ){ + + $event_id = $this->get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $display_reason = get_post_meta( $event_id , 'mec_display_cancellation_reason_in_single_page', true); + if ( !$display_reason && $this->is_editor_mode() ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if cancellation reason is set. In order for the widget in this page to be displayed correctly, please set cancellation reason for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('Cancellation Reason', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $html = $this->get_html($event_id); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventCategories/EventCategories.php b/app/core/src/SingleBuilder/Widgets/EventCategories/EventCategories.php new file mode 100755 index 0000000..21c62e4 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventCategories/EventCategories.php @@ -0,0 +1,66 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + $categories = isset($events_detail->data->categories) ? $events_detail->data->categories : []; + + $html = ''; + if ( true === $this->is_editor_mode && empty( $categories ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if category is set. In order for the widget in this page to be displayed correctly, please set category for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set category', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( !empty($categories) ) { + + ob_start(); + echo '
    '; + if( isset( $atts['mec_category_show_icon'] ) && $atts['mec_category_show_icon'] ){ + echo $this->icons->display('folder'); + } + if( isset( $atts['mec_category_show_title'] ) && $atts['mec_category_show_title'] ){ + echo '
    ' . Base::get_main()->m('taxonomy_categories', esc_html__('Category', 'modern-events-calendar-lite')) . '
    '; + } + echo '
    '; + foreach ($categories as $category) { + $icon = get_metadata('term', $category['id'], 'mec_cat_icon', true); + if( isset( $atts['mec_category_show_link_icon'] ) && $atts['mec_category_show_link_icon'] ){ + $icon = isset($icon) && $icon != '' ? '' : ''; + } + echo '
    +
    '; + } + echo '
    '; + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventCost/EventCost.php b/app/core/src/SingleBuilder/Widgets/EventCost/EventCost.php new file mode 100755 index 0000000..c28c3ef --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventCost/EventCost.php @@ -0,0 +1,113 @@ +get_event_id(); + } + + if (!$event_id) { + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + $html = ''; + if (true === $this->is_editor_mode && (isset($events_detail->data->meta['mec_cost_auto_calculate']) ? $events_detail->data->meta['mec_cost_auto_calculate'] == '0' : true )) { + if (!(isset($events_detail->data->meta['mec_cost']) && $events_detail->data->meta['mec_cost'] != '')) { + $html = '

    ' + . '' . esc_html__('This widget is displayed if cost is set. In order for the widget in this page to be displayed correctly, please set cost for your last event.', 'modern-events-calendar-lite') . '' + . '' . esc_html__('How to set cost', 'modern-events-calendar-lite') . ' ' + . '

    '; + }else{ + ob_start(); + + $cost = \MEC\Base::get_main()->get_event_cost($events_detail); + if ($cost) { + echo '
    '; + ?> +
    + icons->display('wallet'); + } ?> + +

    m('cost', esc_html__('Cost', 'modern-events-calendar-lite'))); ?>

    + +
    +
    + render_price($cost, $events_detail->ID); + } else { + + $rendered_cost = $cost; + } + + echo apply_filters('mec_display_event_cost', $rendered_cost, $cost); + ?> +
    +
    +
    + '; + } + } + } else { + ob_start(); + + $cost = \MEC\Base::get_main()->get_event_cost($events_detail); + if ($cost) { + echo '
    '; + ?> +
    + icons->display('wallet'); + } ?> + +

    m('cost', esc_html__('Cost', 'modern-events-calendar-lite'))); ?>

    + +
    +
    + render_price($cost, $events_detail->ID); + } else { + + $rendered_cost = $cost; + } + + echo apply_filters('mec_display_event_cost', $rendered_cost, $cost); + ?> +
    +
    +
    + '; + } + + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventCountdown/EventCountdown.php b/app/core/src/SingleBuilder/Widgets/EventCountdown/EventCountdown.php new file mode 100755 index 0000000..f5b5f4b --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventCountdown/EventCountdown.php @@ -0,0 +1,50 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['countdown_status']) || !$settings['countdown_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if cost is set. In order for the widget in this page to be displayed correctly, please set cost for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set cost', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $wrap_class = (true === $this->is_editor_mode) ? 'mec-wrap' : ''; + + $html = '
    ' + . Base::get_main()->module('countdown.details', array('event'=>array($events_detail))) . + '
    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventData/EventData.php b/app/core/src/SingleBuilder/Widgets/EventData/EventData.php new file mode 100755 index 0000000..e32d1df --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventData/EventData.php @@ -0,0 +1,53 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $data = (isset($event_detail->data->meta['mec_fields']) and is_array($event_detail->data->meta['mec_fields'])) ? $event_detail->data->meta['mec_fields'] : get_post_meta($event_detail->ID, 'mec_fields', true); + + + $html = ''; + if( !empty($data) && ( isset($settings['display_event_fields']) && $settings['display_event_fields'] ) ){ + + $single = new \MEC_skin_single(); + ob_start(); + $single->display_data_fields( $event_detail ); + $html = ob_get_clean(); + } + + if ( true === $this->is_editor_mode && empty( $html ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if event data is set. In order for the widget in this page to be displayed correctly, please set event data for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Custom Fields', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventDate/EventDate.php b/app/core/src/SingleBuilder/Widgets/EventDate/EventDate.php new file mode 100755 index 0000000..4cbe5bb --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventDate/EventDate.php @@ -0,0 +1,68 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $occurrence = isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''; + $start_datetime = !trim($occurrence) && isset($event_detail->date['start']) ? $event_detail->date['start'] : array( 'date' => $occurrence ); + $occurrence_end_date = trim($occurrence) ? Base::get_main()->get_end_date_by_occurrence($event_detail->data->ID, $start_datetime['date']) : ''; + $end_datetime = isset($event_detail->date['end']) ? $event_detail->date['end'] : array( 'date' => $occurrence_end_date ); + + $date_format = isset($settings['single_date_format1']) ? $settings['single_date_format1'] : get_option( 'date_format' ); + $date_label = Base::get_main()->date_label( $start_datetime, $end_datetime, $date_format ); + + $html = ''; + $midnight_event = Base::get_main()->is_midnight_event($event_detail); + ob_start(); + ?> +
    +
    + icons->display('calendar'); + } ?> + +

    + +
    + +
    dateify( $event_detail, $date_format ); ?>
    + +
    array( 'class' => array(), 'itemprop' => array() ) ) ); ?>
    + +
    + holding_status( $event_detail ); ?> +
    +
    + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['export_module_status']) || !$settings['export_module_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if export module is set. In order for the widget in this page to be displayed correctly, please set export module for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set export module', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + echo Base::get_main()->module('export.details', array('event'=>$event_detail)); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventGallery/EventGallery.php b/app/core/src/SingleBuilder/Widgets/EventGallery/EventGallery.php new file mode 100755 index 0000000..cc848fe --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventGallery/EventGallery.php @@ -0,0 +1,95 @@ +settings['event_gallery_status']) and $this->settings['event_gallery_status'] ) ) { + + return ''; + } + + $gallery = get_post_meta( $event_id, 'mec_event_gallery', true ); + if( !is_array( $gallery ) ) { + + $gallery = []; + } + + // Gallery + if( count( $gallery ) ) { + // Featured Image + $featured_image_id = get_post_thumbnail_id( $event_id ); + + // Add Featured Image to Gallery + if($featured_image_id and !in_array( $featured_image_id, $gallery ) ) { + + array_unshift( $gallery, $featured_image_id ); + } + + // First Image + $first_image_id = $gallery[0]; + + $gallery_list = ''; + + $first_attachment_title = get_the_title( $first_image_id ); + + return ''; + } + + return ''; + } + + /** + * Get HTML Output + * + * @param int $event_id + * @param array $atts + * @return string + */ + public function output( $event_id = 0, $atts = array() ){ + + if( !$event_id ){ + + $event_id = $this->get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $html = ''; + $settings = $this->settings; + + $event_gallery_module = isset($this->settings['event_gallery_status']) and $this->settings['event_gallery_status'] ? true : false; + if( $event_gallery_module ) { + + $html = $this->display_gallery( $event_id ); + } + + if ( ( true === $this->is_editor_mode || ( $atts['edit_mode'] ?? false ) ) && empty( $html ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if event gallery is set. In order for the widget in this page to be displayed correctly, please set Event Gallery module for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Event Gallery module', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventGoogleMap/EventGoogleMap.php b/app/core/src/SingleBuilder/Widgets/EventGoogleMap/EventGoogleMap.php new file mode 100755 index 0000000..6ab6e3f --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventGoogleMap/EventGoogleMap.php @@ -0,0 +1,62 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $primary_location_id = isset($event_detail->data->meta['mec_location_id']) ? $event_detail->data->meta['mec_location_id'] : ''; + $have_location = $primary_location_id && $primary_location_id > 1 ? true : false; + + $html = ''; + if( isset($settings['google_maps_status']) && $settings['google_maps_status'] && $have_location ){ + + $html = Base::get_main()->module('googlemap.details', array('event' => [$event_detail])); + if( $html ){ + + $html = '
    ' + . $html . + '
    '; + } + } + + if ( true === $this->is_editor_mode && ( !isset($settings['google_maps_status']) || !$settings['google_maps_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This option is disabled. In order for the widget in this page to be displayed correctly, please turn on Google Maps Options and set the API for it there.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Google Map', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( true === $this->is_editor_mode && empty( $html ) ){ + + $html = '

    ' + .''. esc_html__('This widget is displayed if Google Map is set. In order for the widget in this page to be displayed correctly, please set Google Map for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Google Map', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventHourlySchedule/EventHourlySchedule.php b/app/core/src/SingleBuilder/Widgets/EventHourlySchedule/EventHourlySchedule.php new file mode 100755 index 0000000..2863494 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventHourlySchedule/EventHourlySchedule.php @@ -0,0 +1,50 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $hourly_schedules = isset($event_detail->data->hourly_schedules) && is_array($event_detail->data->hourly_schedules) ? $event_detail->data->hourly_schedules : []; + + $html = ''; + if ( true === $this->is_editor_mode && 0 == count($hourly_schedules) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if Hourly Schedule is set. In order for the widget in this page to be displayed correctly, please set Hourly Schedule for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Hourly Schedule', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $single = new \MEC_skin_single(); + ob_start(); + $single->display_hourly_schedules_widget( $event_detail ); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventLabels/EventLabels.php b/app/core/src/SingleBuilder/Widgets/EventLabels/EventLabels.php new file mode 100755 index 0000000..2dcb0a8 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventLabels/EventLabels.php @@ -0,0 +1,65 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $labels = isset($event_detail->data->labels) ? $event_detail->data->labels : []; + + $html = ''; + ob_start(); + if ( empty($labels) && true === $this->is_editor_mode ) { + + echo '

    ' + .''. esc_html__('This widget is displayed if label is set. In order for the widget in this page to be displayed correctly, please set label for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set label', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( !empty($labels) ) { + + echo '
    '; + $mec_items = count($labels); + $mec_i = 0; ?> +
    + + + + +

    m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite')); ?>

    + + $label) : + $seperator = (++$mec_i === $mec_items) ? '' : ','; + echo '
    ' . esc_html($label["name"] . $seperator) . '
    '; + endforeach; ?> +
    + '; + } + $html = ob_get_clean(); + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventLocalTime/EventLocalTime.php b/app/core/src/SingleBuilder/Widgets/EventLocalTime/EventLocalTime.php new file mode 100755 index 0000000..60ee147 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventLocalTime/EventLocalTime.php @@ -0,0 +1,48 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['local_time_module_status']) || !$settings['local_time_module_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if label is set. In order for the widget in this page to be displayed correctly, please set LocalTime module for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set LocalTime module', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $html = '
    ' + .Base::get_main()->module('local-time.details', array('event'=>$event_detail)) . + '
    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventLocations/EventLocations.php b/app/core/src/SingleBuilder/Widgets/EventLocations/EventLocations.php new file mode 100755 index 0000000..976068e --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventLocations/EventLocations.php @@ -0,0 +1,108 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $locations = isset($event_detail->data->locations) ? $event_detail->data->locations : []; + $primary_location_id = \MEC\Base::get_main()->get_master_location_id( $event_detail ); + $location_term = get_term_by( 'id', $primary_location_id, 'mec_location' ); + + $html = ''; + if ( true === $this->is_editor_mode && ( empty($locations) || !isset($locations[$primary_location_id]) ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if location is set. In order for the widget in this page to be displayed correctly, please set location for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set location', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( !empty($locations) && isset($locations[$primary_location_id]) and !empty($locations[$primary_location_id])) { + + $single = new \MEC_skin_single(); + ob_start(); + $location = $locations[$primary_location_id]; + + echo '
    '; + ?> +
    + icons->display('location-pin'); ?> +

    m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); ?>

    + + + <?php echo (isset($location['name']) ? esc_attr($location['name']) : ''); ?> + +
    get_location_html($location)); ?>
    + +
    +
    +
    + + +
    + +
    + +
    + +
    +

    description ); ?>

    +
    + +
    + show_other_locations($event_detail); // Show Additional Locations + echo '
    '; + + $html = ob_get_clean(); + } + + return $html; + } + + public function get_location_html($location) + { + $location_id = (isset($location['id']) ? $location['id'] : ''); + $location_name = (isset($location['name']) ? $location['name'] : ''); + + + if(is_plugin_active('mec-advanced-location/mec-advanced-location.php') && ( $this->settings['advanced_location']['location_enable_link_section_title'] ?? false )){ + $location_link = apply_filters('mec_location_single_page_link', '', $location_id, $location_name, $location); + }else{ +// $location_link = (isset($location['url']) ? $location['url'] : ''); + return $location_name; + } + + if(!empty($location_link)) $location_html =''.esc_html($location_name).''; + else $location_html = $location_name; + + return $location_html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventMoreInfo/EventMoreInfo.php b/app/core/src/SingleBuilder/Widgets/EventMoreInfo/EventMoreInfo.php new file mode 100755 index 0000000..9f7d339 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventMoreInfo/EventMoreInfo.php @@ -0,0 +1,74 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $start_timestamp = $event_detail->date['start']['timestamp'] ?? ''; + $data = (isset($event_detail->data->meta['mec_fields']) and is_array($event_detail->data->meta['mec_fields'])) ? $event_detail->data->meta['mec_fields'] : get_post_meta($event_detail->ID, 'mec_fields', true); + + $more_info = $event_detail->data->meta['mec_more_info'] ?? ''; + $more_info_title = $event_detail->data->meta['mec_more_info_title'] ?? esc_html__('Read More', 'modern-events-calendar-lite'); + $more_info_target = $event_detail->data->meta['mec_more_info_target'] ?? '_self'; + + $html = ''; + if ( true === $this->is_editor_mode && ( !( $more_info != '' ) ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if read more is set. In order for the widget in this page to be displayed correctly, please set read more for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set read more', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $more_info = MEC_feature_occurrences::param($event_id, $start_timestamp, 'more_info', $more_info); + $more_info_title = MEC_feature_occurrences::param($event_id, $start_timestamp, 'more_info_title', $more_info_title); + $more_info_target = MEC_feature_occurrences::param($event_id, $start_timestamp, 'more_info_target', $more_info_target); + + ob_start(); + if ( trim($more_info) && $more_info != 'http://') { + ?> + +
    +
    + icons->display('info'); + } ?> + +

    m('more_info_link', esc_html__('More Info', 'modern-events-calendar-lite')); ?>

    + +
    +
    +
    + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['next_event_module_status']) || !$settings['next_event_module_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if next events module is set. In order for the widget in this page to be displayed correctly, please set next events module for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set next events module', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + echo Base::get_main()->module('next-event.details', array('event'=>$event_detail)); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventNextPrevious/EventNextPrevious.php b/app/core/src/SingleBuilder/Widgets/EventNextPrevious/EventNextPrevious.php new file mode 100755 index 0000000..f466334 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventNextPrevious/EventNextPrevious.php @@ -0,0 +1,49 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['next_previous_events']) || !$settings['next_previous_events'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if related events is set. In order for the widget in this page to be displayed correctly, please set Related Event for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Next/Previous Events', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $single = new \MEC_skin_single(); + ob_start(); + $single->display_next_previous_events($event_detail); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventOrganizers/EventOrganizers.php b/app/core/src/SingleBuilder/Widgets/EventOrganizers/EventOrganizers.php new file mode 100755 index 0000000..9d715b5 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventOrganizers/EventOrganizers.php @@ -0,0 +1,151 @@ +get_settings('addintional_organizers_social_links'); + if( !$status ){ + + return; + } + + if( is_numeric( $organizer ) ){ + + $organizer = get_term_by( 'id', $organizer, 'mec_organizer' ); + } + + $organizer_id = $organizer->term_id; + ?> +
    + + + + + + + + + + + + + + + + +
    + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $single = new \MEC_skin_single(); + $organizers = isset($event_detail->data->organizers) ? $event_detail->data->organizers : []; + $primary_organizer_id = \MEC\Base::get_main()->get_master_organizer_id( $event_detail ); + + $html = ''; + if ( true === $this->is_editor_mode && ( empty($organizers) || !isset($organizers[$primary_organizer_id]) ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if organizer is set. In order for the widget in this page to be displayed correctly, please set organizer for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set organizer', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( !empty($organizers) && isset($organizers[$primary_organizer_id]) && !empty($organizers[$primary_organizer_id])) { + + ob_start(); + $organizer = $organizers[$primary_organizer_id]; + + echo '
    '; + ?> +
    + +

    m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); ?>

    + + + <?php echo (isset($organizer['name']) ? esc_attr($organizer['name']) : ''); ?> + + +
    + + + +
    +
    + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + data, 'mec_organizer'); if($organizer_description_setting == '1'): foreach($organizer_terms as $organizer_term) { if ($organizer_term->term_id == $organizer['id'] ) { if(isset($organizer_term->description) && !empty($organizer_term->description)): ?> +
    +

    description );?>

    +
    + + + +
    + show_other_organizers($event_detail); // Show Additional Organizers + echo '
    '; + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventPublicDownload/EventPublicDownload.php b/app/core/src/SingleBuilder/Widgets/EventPublicDownload/EventPublicDownload.php new file mode 100755 index 0000000..3f42315 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventPublicDownload/EventPublicDownload.php @@ -0,0 +1,46 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + $single = new \MEC_skin_single(); + $html = $single->display_public_download_module( $events_detail ); + + if ( empty( $html ) && $this->is_editor_mode() ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if event Public Download is set. In order for the widget in this page to be displayed correctly, please set Public Download for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set Public Download', 'modern-events-calendar-lite') . ' ' + .'

    '; + + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventQrCode/EventQrCode.php b/app/core/src/SingleBuilder/Widgets/EventQrCode/EventQrCode.php new file mode 100755 index 0000000..b26347a --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventQrCode/EventQrCode.php @@ -0,0 +1,48 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['qrcode_module_status']) || !$settings['qrcode_module_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if QR Code is set. In order for the widget in this page to be displayed correctly, please set QR code module for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set QR code module', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + echo Base::get_main()->module('qrcode.details', array('event' => $event_detail)); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventRegisterButton/EventRegisterButton.php b/app/core/src/SingleBuilder/Widgets/EventRegisterButton/EventRegisterButton.php new file mode 100755 index 0000000..5d77279 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventRegisterButton/EventRegisterButton.php @@ -0,0 +1,98 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['single_booking_style']) || !$settings['single_booking_style'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if register button is set. In order for the widget in this page to be displayed correctly, please set register button for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set register button', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $single = new \MEC_skin_single(); + + $mec_more_info = isset($event_detail->data->meta['mec_more_info']) && trim($event_detail->data->meta['mec_more_info']) && $event_detail->data->meta['mec_more_info'] != 'http://'; + $mec_more_info_target = isset($event_detail->data->meta['mec_more_info_target']) ? $event_detail->data->meta['mec_more_info_target'] : '_self'; + if (isset($event_detail->data->meta['mec_more_info_title']) && trim($event_detail->data->meta['mec_more_info_title'])){ + $button_text = trim($event_detail->data->meta['mec_more_info_title']); + }else{ + $button_text = Base::get_main()->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite')); + } + + $classes = ''; + if (isset($settings['single_booking_style']) && $settings['single_booking_style'] != 'modal'){ + $classes = 'simple-booking'; + } + ob_start(); + ?> + + can_show_booking_module($event_detail)) : ?> +
    + + > + +
    + +
    + + + +
    + + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['related_events']) || !$settings['related_events'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if related events is set. In order for the widget in this page to be displayed correctly, please set Related Event for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set related events', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $single = new \MEC_skin_single(); + ob_start(); + $single->display_related_posts_widget( $event_id, 'thumbrelated' ); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventSocialShare/EventSocialShare.php b/app/core/src/SingleBuilder/Widgets/EventSocialShare/EventSocialShare.php new file mode 100755 index 0000000..ccdcfd1 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventSocialShare/EventSocialShare.php @@ -0,0 +1,79 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $data = (isset($event_detail->data->meta['mec_fields']) and is_array($event_detail->data->meta['mec_fields'])) ? $event_detail->data->meta['mec_fields'] : get_post_meta($event_detail->ID, 'mec_fields', true); + + $html = ''; + if ( true === $this->is_editor_mode && ( !isset($settings['social_network_status']) || !$settings['social_network_status'] ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if social networks is set. In order for the widget in this page to be displayed correctly, please set label for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set social networks', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + $single = new \MEC_skin_single(); + ob_start(); + $url = isset($event_detail->data->permalink) ? $event_detail->data->permalink : ''; + if (trim($url) == '') { + return; + } + $socials = Base::get_main()->get_social_networks(); + ?> +
    + +
    + +
    +
    + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $speakers = (isset($event_detail->data->speakers) and is_array($event_detail->data->speakers)) ? $event_detail->data->speakers : []; + + $html = ''; + if ( true === $this->is_editor_mode && ( empty($speakers) || (!isset($settings['speakers_status']) || !$settings['speakers_status']) ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if speaker is set. In order for the widget in this page to be displayed correctly, please set speaker for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set speaker', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( true === $this->is_editor_mode && isset($settings['speakers_status']) && $settings['speakers_status'] ) { + + $html = Base::get_main()->module('speakers.details', array('event'=>$event_detail)); + } else { + + ob_start(); + // Event Speaker + echo Base::get_main()->module('speakers.details', array('event'=>$event_detail)); + ?> + + get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $sponsors = (isset($event_detail->data->sponsors) and is_array($event_detail->data->sponsors)) ? $event_detail->data->sponsors : []; + + $html = ''; + if ( true === $this->is_editor_mode && ( empty($sponsors) || (!isset($settings['sponsors_status']) || !$settings['sponsors_status']) ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if sponsor is set. In order for the widget in this page to be displayed correctly, please set sponsor for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set sponsor', 'modern-events-calendar-lite') . ' ' + .'

    '; + } elseif ( true === $this->is_editor_mode && isset($settings['sponsors_status']) && $settings['sponsors_status'] ) { + + $html = Base::get_main()->module('sponsors.details', array('event'=>$event_detail)); + } else { + + ob_start(); + // Event Sponsor + echo Base::get_main()->module('sponsors.details', array('event'=>$event_detail)); + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventTags/EventTags.php b/app/core/src/SingleBuilder/Widgets/EventTags/EventTags.php new file mode 100755 index 0000000..fe60395 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventTags/EventTags.php @@ -0,0 +1,65 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + $data = (isset($event_detail->data->meta['mec_fields']) and is_array($event_detail->data->meta['mec_fields'])) ? $event_detail->data->meta['mec_fields'] : get_post_meta($event_detail->ID, 'mec_fields', true); + + $tags = get_the_tags( $event_id ); + + $html = ''; + if ( true === $this->is_editor_mode && empty( $tags ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if tags is set. In order for the widget in this page to be displayed correctly, please set tags for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set tags', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + echo '
    '; + if( isset( $atts['mec_tags_show_title'] ) && $atts['mec_tags_show_title'] ){ + echo '' . esc_html__( 'Tags: ', 'modern-events-calendar-lite') . ''; + } + if ( $tags ) { + echo implode( + ', ', + array_map( + function($tag) { + return '' . esc_html($tag->name) . ' '; + }, $tags + ) + ); + } + echo '
    '; + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventTime/EventTime.php b/app/core/src/SingleBuilder/Widgets/EventTime/EventTime.php new file mode 100755 index 0000000..b797095 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventTime/EventTime.php @@ -0,0 +1,67 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + ob_start(); + echo '
    '; + echo ''; + // Event Time + if (isset($event_detail->data->meta['mec_date']['start']) and !empty($event_detail->data->meta['mec_date']['start'])) { + if (isset($event_detail->data->meta['mec_hide_time']) and $event_detail->data->meta['mec_hide_time'] == '0') { + $time_comment = isset($event_detail->data->meta['mec_comment']) ? $event_detail->data->meta['mec_comment'] : ''; + $allday = isset($event_detail->data->meta['mec_allday']) ? $event_detail->data->meta['mec_allday'] : 0; + ?> +
    + + icons->display('clock'); ?> + + +

    + + +
    + data->time) and trim($event_detail->data->time['start'])) : ?> + +
    data->time['start'] ); ?>data->time['end']) ? esc_html( ' - ' . $event_detail->data->time['end'] ) : ''); ?>
    + +
    m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) ); ?>
    + +
    +
    + '; + $html = ob_get_clean(); + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventTrailerUrl/EventTrailerUrl.php b/app/core/src/SingleBuilder/Widgets/EventTrailerUrl/EventTrailerUrl.php new file mode 100755 index 0000000..a0a90c3 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventTrailerUrl/EventTrailerUrl.php @@ -0,0 +1,37 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $single = new \MEC_skin_single(); + $event_detail = $this->get_event_detail($event_id); + + $html = '
    ' + . $single->display_trailer_url( $event_detail ) . + '
    '; + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventVirtual/EventVirtual.php b/app/core/src/SingleBuilder/Widgets/EventVirtual/EventVirtual.php new file mode 100755 index 0000000..01eec0b --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventVirtual/EventVirtual.php @@ -0,0 +1,54 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && isset( $events_detail->data->meta['mec_virtual_event'] ) && 'none' === $events_detail->data->meta['mec_virtual_event'] ) { + + $html = '

    ' + .''. esc_html__('Please make sure the last event has appropriate content for this widget.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set up Zoom event', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + if ( isset( $atts['virtual_event_type'] ) && $atts['virtual_event_type'] == 'badge' ) { + + do_action('mec_single_virtual_badge', $events_detail->data ); + } else { + + do_action('mec_single_after_content', $events_detail ); + } + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventWeather/EventWeather.php b/app/core/src/SingleBuilder/Widgets/EventWeather/EventWeather.php new file mode 100755 index 0000000..e542416 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventWeather/EventWeather.php @@ -0,0 +1,50 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $event_detail = $this->get_event_detail($event_id); + + $html = ''; + if( isset($settings['weather_module_status']) && $settings['weather_module_status'] ){ + + ob_start(); + echo Base::get_main()->module('weather.details', array('event' => $event_detail)); + $html = ob_get_clean(); + } + + if ( true === $this->is_editor_mode && empty( $html ) ) { + + $html = '

    ' + .''. esc_html__('This widget is displayed if weather is set. In order for the widget in this page to be displayed correctly, please set location for your last event.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set weather', 'modern-events-calendar-lite') . ' ' + .'

    '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/EventZoom/EventZoom.php b/app/core/src/SingleBuilder/Widgets/EventZoom/EventZoom.php new file mode 100755 index 0000000..f5b6815 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/EventZoom/EventZoom.php @@ -0,0 +1,54 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $events_detail = $this->get_event_detail($event_id); + + $html = ''; + if ( true === $this->is_editor_mode && isset( $events_detail->data->meta['mec_zoom_event'] ) && 'none' === $events_detail->data->meta['mec_zoom_event'] ) { + + $html = '

    ' + .''. esc_html__('Please make sure the last event has appropriate content for this widget.', 'modern-events-calendar-lite').'' + . '' . esc_html__('How to set up Zoom event', 'modern-events-calendar-lite') . ' ' + .'

    '; + } else { + + ob_start(); + if ( isset( $atts['zoom_event_type'] ) && $atts['zoom_event_type'] == 'badge' ) { + + do_action('mec_single_zoom_badge', $events_detail->data ); + } else { + + do_action('mec_single_after_content', $events_detail ); + } + $html = ob_get_clean(); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/FAQ/FAQ.php b/app/core/src/SingleBuilder/Widgets/FAQ/FAQ.php new file mode 100755 index 0000000..ff0a05f --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/FAQ/FAQ.php @@ -0,0 +1,42 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $single = new \MEC_skin_single(); + $event_detail = $this->get_event_detail($event_id); + + ob_start(); + $single->display_faq( $event_detail ); + $faq_html = ob_get_clean(); + + + $html = '
    ' + . $faq_html . + '
    '; + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/FeaturedImage/FeaturedImage.php b/app/core/src/SingleBuilder/Widgets/FeaturedImage/FeaturedImage.php new file mode 100755 index 0000000..fe6b4a5 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/FeaturedImage/FeaturedImage.php @@ -0,0 +1,58 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $settings = $this->settings; + $atts = shortcode_atts( [ + 'image_width' => 500, + 'image_height' => 500, + ], + $atts + ); + + $html = $this->get_thumbnail($event_id,$atts['image_width'],$atts['image_height']); + + if ( true === $this->is_editor_mode && empty($html) ) { + + $width = $atts['image_width'] ? $atts['image_width'] : ''; + $height = $atts['image_height'] ? $atts['image_height'] : ''; + $html = ' '; + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/FeaturedImage/empty-pic.jpg b/app/core/src/SingleBuilder/Widgets/FeaturedImage/empty-pic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..bec115dc4d12962a26f6fcd9e609b776479ec515 GIT binary patch literal 4985 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 literal 0 HcmV?d00001 diff --git a/app/core/src/SingleBuilder/Widgets/RSVPForm/RSVPForm.php b/app/core/src/SingleBuilder/Widgets/RSVPForm/RSVPForm.php new file mode 100755 index 0000000..8e927bf --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/RSVPForm/RSVPForm.php @@ -0,0 +1,69 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $is_rsvp_enabled = false; + + if(!function_exists('is_plugin_active')) { + + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + } + + if( is_plugin_active('mec-rsvp/mec-rsvp.php') ) { + + $is_rsvp_enabled = \MEC_RSVP\RSVP\EventRSVP::getInstance()->can_display_rsvp_form( $event_id ); + } + + $settings = $this->settings; + $html = ''; + + if ( true === $this->is_editor_mode && !$is_rsvp_enabled ) { + + $html = '
    +

    ' + .'' + . esc_html__('This widget is displayed if label is set. In order for the widget in this page to be displayed correctly, please set RSVP module for your last event.', 'modern-events-calendar-lite') + .'' + .'' . esc_html__('How to set RSVP module', 'modern-events-calendar-lite') . ' ' + .'

    ' + .'
    '; + } elseif( $is_rsvp_enabled ) { + + $html = $this->get_display_rsvp_form( $event_id ); + } + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/SimpleHeader/SimpleHeader.php b/app/core/src/SingleBuilder/Widgets/SimpleHeader/SimpleHeader.php new file mode 100755 index 0000000..aaa7716 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/SimpleHeader/SimpleHeader.php @@ -0,0 +1,36 @@ +get_event_id(); + } + + if(!$event_id){ + return ''; + } + + $html = '<' . $html_tag . ' class="mec-single-title">' + .get_the_title($event_id). + ''; + + return $html; + } +} diff --git a/app/core/src/SingleBuilder/Widgets/WidgetBase.php b/app/core/src/SingleBuilder/Widgets/WidgetBase.php new file mode 100755 index 0000000..0d831f9 --- /dev/null +++ b/app/core/src/SingleBuilder/Widgets/WidgetBase.php @@ -0,0 +1,96 @@ +settings = $this->get_mec_settings(); + $this->is_editor_mode = $this->is_editor_mode(); + $main = MEC::getInstance('app.libraries.main'); + $settings_mec = $main->get_settings(); + $this->icons = $main->icons($settings_mec['icons'] ?? []); + } + + /** + * Is editor mode + * + * @return boolean + */ + public function is_editor_mode(){ + + return apply_filters( 'mec_single_builder_editor_mode', false ); + } + + /** + * @return WP_Post + */ + public function get_last_event(){ + + global $MEC_Last_Event; + if(!$MEC_Last_Event){ + + $EventQuery = new \MEC\Events\EventsQuery([]); + $MEC_Last_Event = $EventQuery->get_last_event('post'); + } + + return $MEC_Last_Event; + } + + /** + * Get Event ID + * + * @return int|false + */ + public function get_event_id(){ + + $editor_mode = $this->is_editor_mode(); + + $event_id = false; + if(is_single() && 'mec-events' === get_post_type()){ + + $event_id = get_the_ID(); + }elseif( $editor_mode ){ + + $last_event = $this->get_last_event(); + $event_id = isset($last_event['ID']) ? $last_event['ID'] : 0; + } + + return apply_filters( 'mec_get_event_id_for_widget', $event_id, $editor_mode ); + } + + /** + * @param int|WP_Post $event + * + * @return Object + */ + public function get_event_detail($event){ + + $event_id = is_a( $event, '\WP_Post' ) ? $event->ID : $event; + $single = new \MEC_skin_single(); + $events = $single->get_event_mec( $event_id ); + + if( !isset( $events[0] ) ){ + + $event = new \MEC\Events\Event($event); + return $event->get_detail(); + }else{ + + return $events[0]; + } + } + + public function get_mec_settings(){ + + return \MEC\Settings\Settings::getInstance()->get_settings(); + } +} diff --git a/app/core/src/SingleBuilder/index.php b/app/core/src/SingleBuilder/index.php new file mode 100755 index 0000000..40d16fd --- /dev/null +++ b/app/core/src/SingleBuilder/index.php @@ -0,0 +1,5 @@ +data = $data; + } + + /** + * @param string $key + * @param mixed $default + * @return mixed + */ + public function get_data($key,$default = null){ + + $v = isset($this->data[$key]) ? $this->data[$key] : $default; + + return apply_filters('mec_ticket_get_data',$v,$key,$this->data,$default); + } + + /** + * @param string $type start|end + * @return array + */ + private function _get_time($type){ + + return array( + 'h' => isset($this->data['ticket_'.$type.'_time_hour']) ? sprintf('%02d',$this->data['ticket_'.$type.'_time_hour']) : '', + 'm' => isset($this->data['ticket_'.$type.'_time_minute']) ? sprintf('%02d',$this->data['ticket_'.$type.'_time_minute']) : '', + 'ampm' => isset($this->data['ticket_'.$type.'_time_ampm']) ? $this->data['ticket_'.$type.'_time_ampm'] : '', + ); + } + + /** + * @param string $type all|start|end + * @param string $format + * @return string + */ + public function get_time($type = 'all',$format = 'H:i A'){ + + $start = $this->_get_time('start'); + $end = $this->_get_time('end'); + + $start_time = "{$start['h']}:{$start['m']} {$start['ampm']}"; + $end_time = "{$end['h']}:{$end['m']} {$end['ampm']}"; + + $start = date($format,strtotime($start_time)); + $end = date($format,strtotime($end_time)); + + switch($type){ + case 'start': + return $start_time; + break; + case 'end': + return $end_time; + break; + default: + return "$start_time $end_time"; + break; + } + } +} \ No newline at end of file diff --git a/app/core/src/Tickets/Tickets.php b/app/core/src/Tickets/Tickets.php new file mode 100755 index 0000000..47efe27 --- /dev/null +++ b/app/core/src/Tickets/Tickets.php @@ -0,0 +1,51 @@ + $ticket){ + + $tickets[$k] = new Ticket($ticket); + } + + return $tickets; + } + + /** + * @param int $event_id + * @param array $tickets //TODO: Ticket[] + * @return void + */ + public function update_event_tickets($event_id,$tickets){ + + update_post_meta($event_id, 'mec_tickets', $tickets); + } + + /** + * @param int $event_id + * @param int $ticket_id + * @return array|null //TODO: Ticket + */ + public function get_ticket($event_id,$ticket_id){ + + if(!$event_id){ + + return null; + } + + $tickets = $this->get_event_tickets($event_id); + + return isset($tickets[$ticket_id]) ? $tickets[$ticket_id] : null; + } +} \ No newline at end of file diff --git a/app/core/src/Tickets/index.php b/app/core/src/Tickets/index.php new file mode 100755 index 0000000..40d16fd --- /dev/null +++ b/app/core/src/Tickets/index.php @@ -0,0 +1,5 @@ +bookClass = new \MEC_book(); + $this->gateways = $this->get_gateways(); + $this->gateways_options = \MEC\Base::get_main()->get_gateways_options(); + + $this->transaction_id = $transaction_id ?: static::generate_transaction_id(); + + $this->ticket_variations_status = (bool)\MEC\Settings\Settings::getInstance()->get_settings('ticket_variations_status'); + $this->taxes_fees_status = (bool)\MEC\Settings\Settings::getInstance()->get_settings('taxes_fees_status'); + + if( !is_null( $data ) && is_array( $data ) ) { + + $this->set_data( $data ); + }else{ + + $this->set_data( + $this->get_saved_data() + ); + } + } + + public static function generate_transaction_id() { + + $method = \MEC\Settings\Settings::getInstance()->get_settings('booking_tid_gen_method'); + $method = !empty( $method ) ? $method : 'random'; + + $string = str_shuffle('ABCDEFGHJKLMNOPQRSTUVWXYZ'); + $prefix = substr($string, 0, 3); + + if($method === 'ordered') { + + $start = \MEC\Settings\Settings::getInstance()->get_settings('booking_tid_start_from'); + $start = ( !empty( $start ) && is_numeric( $start ) && $start >= 1 ) ? $start : 10000; + $existing = get_option('mec_tid_current', 1); + + $number = max($start, $existing)+1; + + $key = $prefix.$number; + update_option('mec_tid_current', $number); + } else { + + $key = $prefix.mt_rand(10000, 99999); + } + + // If the key exist then generate another key + if(get_option($key, false) !== false) $key = static::generate_transaction_id(); + + return $key; + } + + public function prepare_data( $data ) { + + $event_id = $data['event_id'] ?? $this->get_event_id(); + $book_id = $this->bookClass->get_book_id_transaction_id( $this->transaction_id ); + $gateway = $book_id ? get_post_meta( $book_id, 'mec_gateway', true ) : false; + $is_partial_payment = $book_id ? false : $this->bookClass->partial_payment->is_enabled(); + + return wp_parse_args( + $data, + array( + 'tickets' => array(), + 'first_for_all' => false, + 'event_id' => 0, + 'translated_event_id' => 0, + 'date' => '', + 'all_dates' => array(), + 'timestamps' => array(), + 'booking_id' => $book_id, + // 'price_details' => array(), + 'total' => 0, + 'discount' => 0, + 'price' => 0, + 'payable' => 0, + 'coupon' => '', + 'fields' => array(), + 'gateway' => $gateway ?: 'MEC_gateway_pay_locally', + + 'order_id' => '', + 'WCTax' => '', + 'wc_coupons' => array(), + 'wc_discounts' => array(), + + 'is_partial_payment' => $is_partial_payment ? 1 : 0, + 'partial_payment_settings' => $is_partial_payment ? $this->bookClass->partial_payment->get_validated_payable_options( $event_id ) : array(), + ) + ); + } + + /** + * Return saved data + * + * @return array + */ + private function get_saved_data() { + + $data = get_option( $this->transaction_id, array() ); + + return is_array( $data ) ? $data : []; + } + + /** + * Update saved data + * + * @param bool $reset_cache + * + * @return string + */ + public function update_data( $reset_cache = true ) { + + update_option( $this->transaction_id, $this->data, false ); + + if( $reset_cache ) { + + $this->update_cache_tickets_details(); + } + + return $this->transaction_id; + } + + /** + * Return data + * + * @return array + */ + public function get_data() { + + return $this->data; + } + + public function set_data( $data ) { + + $this->data = $this->prepare_data( $data ); + } + + public function get_ticket_variations_status() { + + if( 'MEC_gateway_woocommerce' == $this->get_gateway() ) { + + return false; + } + + return $this->ticket_variations_status; + } + + public function get_taxes_fees_status() { + + return $this->taxes_fees_status; + } + + public function get_event_tickets() { + + if( is_null( $this->event_tickets ) ) { + + $event_tickets = get_post_meta( $this->get_event_id(), 'mec_tickets', true ); + $this->event_tickets = is_array( $event_tickets ) ? $event_tickets : []; + } + + return $this->event_tickets; + } + + public function get_all_tickets_details( $return_cached = true ) { + + if( is_null( $this->tickets_details ) || !$return_cached ) { + + $this->tickets_details = $this->get_all_occurrences_tickets_details( $return_cached ); + } + + return $this->tickets_details; + } + + public function get_cached_tickets_details() { + + return get_option( $this->transaction_id . '_cached', false ); + } + + public function update_cache_tickets_details( $data = null ) { + + if( is_null( $data ) ) { + + $data = $this->get_all_tickets_details( false ); + } + + update_option( $this->transaction_id . '_cached', $data, false ); + } + + public function reset_cache_tickets_details() { + + $this->tickets_details = null; + + delete_option( $this->transaction_id . '_cached' ); + } + + public function _get_total() { + + return $this->data['total'] ?? ''; + } + + public function _get_payable() { + + return $this->data['payable'] ?? ''; + } + + public function get_event_id() { + + return $this->data['event_id'] ?? 0; + } + + public function is_first_for_all() { + + return (bool)( $this->data['first_for_all'] ?? 0 ); + } + + public function get_translated_event_id() { + + return $this->data['translated_event_id'] ?? 0; + } + + public function get_dates() { + + $all_dates = isset( $this->data['all_dates'] ) && is_array( $this->data['all_dates'] ) && !empty( $this->data['all_dates'] ) ? $this->data['all_dates'] : array( $this->data['date'] ?? '' ); + + foreach( $all_dates as $k => $timestamps ){ + + if( empty( $timestamps ) || is_array( $timestamps ) ) { + + unset( $all_dates[ $k ] ); + } + } + + return array_values( $all_dates ); + } + + public function get_date() { + + $all_dates = $this->get_dates(); + + return current( $all_dates ); + } + + public function get_invoice_key() { + + return $this->data['invoice_key'] ?? ''; + } + + public function get_book_id() { + + return $this->data['booking_id'] ?? $this->bookClass->get_book_id_transaction_id( $this->transaction_id ); + } + + public function get_author_id() { + + $book_id = $this->get_book_id(); + if( !$book_id ) { + + return get_current_user_id(); + } + + $book = get_post( $book_id ); + + return is_a( $book, '\WP_Post' ) ? $book->post_author : 0; + } + + public function get_gateway() { + + return $this->data['gateway'] ?? ''; + } + + public function get_gateways() { + + return array ( + 'MEC_gateway_pay_locally' => (object) array( + 'key' => 'MEC_gateway_pay_locally', + 'label' => __('Pay Locally', 'modern-events-calendar-lite'), + 'id' => 1, + ), + 'MEC_gateway_paypal_express' => (object) array( + 'key' => 'MEC_gateway_paypal_express', + 'label' => __('PayPal Express', 'modern-events-calendar-lite'), + 'id' => 2, + ), + 'MEC_gateway_woocommerce' => + (object) array( + 'key' => 'MEC_gateway_woocommerce', + 'label' => __('Pay by WooCommerce', 'modern-events-calendar-lite'), + 'id' => 6, + ), + 'MEC_gateway_paypal_credit_card' => (object) array( + 'key' => 'MEC_gateway_paypal_credit_card', + 'label' => __('PayPal Credit Card', 'modern-events-calendar-lite'), + 'id' => 3, + ), + 'MEC_gateway_stripe' => (object) array( + 'key' => 'MEC_gateway_stripe', + 'label' => __('Stripe', 'modern-events-calendar-lite'), + 'id' => 5, + ), + 'MEC_gateway_stripe_connect' => (object) array( + 'key' => 'MEC_gateway_stripe_connect', + 'label' => __('Stripe Connect', 'modern-events-calendar-lite'), + 'id' => 7, + ), + 'MEC_gateway_bank_transfer' => (object) array( + 'key' => 'MEC_gateway_bank_transfer', + 'label' => __('Bank Transfer', 'modern-events-calendar-lite'), + 'id' => 8, + ), + 'MEC_gateway_paypal_standard' => (object) array( + 'key' => 'MEC_gateway_paypal_standard', + 'label' => __('PayPal Standard', 'modern-events-calendar-lite'), + 'id' => 9, + ), + 'MEC_gateway_add_to_woocommerce_cart' => (object) array( + 'key' => 'MEC_gateway_add_to_woocommerce_cart', + 'label' => __('Add to cart', 'modern-events-calendar-lite'), + 'id' => 1995, + ), + ); + } + + public function get_gateway_number() { + + $gateway_number = ''; + $gateway = $this->get_gateway(); + $current_gateway = $this->gateways[ $gateway ] ?? false; + if( $current_gateway && isset( $current_gateway->id ) ) { + + $gateway_number = $current_gateway->id; + } + + return $gateway_number; + } + + public function get_gateway_label( $gateway = null ) { + + $gateway_label = ''; + if( is_null( $gateway ) ){ + + $gateway = $this->get_gateway(); + } + + $current_gateway = $this->gateways[ $gateway ] ?? false; + if( $current_gateway && isset( $current_gateway->id ) ) { + + $gateway_label = $current_gateway->label; + } + + return $gateway_label; + } + + public function get_tickets() { + + return $this->data['tickets'] ?? []; + } + + public function get_coupon() { + + return $this->data['coupon'] ?? ''; + } + + public function get_wc_coupons() { + + $coupons = $this->data['wc_coupon'] ?? []; + + return is_array( $coupons ) ? $coupons : explode( ',', $coupons ); + } + + public function get_wc_discounts() { + + $discounts = $this->data['wc_discounts'] ?? []; + + return is_array( $discounts ) ? $discounts : []; + } + + public function get_order_id() { + + return $this->data['order_id'] ?? 0; + } + + public function is_wc(){ + + return $this->get_order_id() ? true : false; + } + + public function get_discount() { + + return $this->data['discount'] ?? ''; + } + + public function get_fixed_fields() { + + return $this->data['fields'] ?? []; + } + + public function is_partial_payment() { + + $is_partial_payment = $this->data['is_partial_payment'] ?? false; + + return (bool) $is_partial_payment; + } + + public function get_partial_payment_settings() { + + $settings = $this->data['partial_payment_settings'] ?? []; + + return is_array( $settings ) ? $settings : []; + } + + + public function get_ticket_price( $ticket, $start_timestamp ) { + + return $this->bookClass->get_ticket_regular_price_key( + $ticket, + current_time('Y-m-d'), + $this->get_event_id(), + 'price', + $start_timestamp + ); + } + + public function get_ticket_variations_details( $ticket ) { + + $variation_details = []; + if( ! $this->get_ticket_variations_status() ) { + + return $variation_details; + } + + $event_id = $this->get_event_id(); + $ticket_id = $ticket['id'] ?? 0; + $variations = $ticket['variations'] ?? []; + + if( is_array( $variations ) && count( $variations ) ) { + + $ticket_variations = \MEC\Base::get_main()->ticket_variations( $event_id, $ticket_id ); + + foreach( $ticket_variations as $key => $ticket_variation ) { + + if(!is_numeric($key)) continue; + if(!isset($ticket_variation['title']) or (isset($ticket_variation['title']) and !trim($ticket_variation['title']))) continue; + + $variation_count = isset($variations[$key]) ? $variations[$key] : 0; + if(!$variation_count or ($variation_count and $variation_count < 0)) continue; + $v_price = (isset($ticket_variation['price']) and trim($ticket_variation['price']) != '') ? $ticket_variation['price'] : 0; + + $variation_amount = $v_price * $variation_count; + $variation_title = $ticket_variation['title'].' ('.esc_html($variation_count).')'; + + // Price Details + if(!isset($variation_details[$key])) { + + $variation_details[ $key ] = array( + 'variation_key' => $key, + 'price' => $v_price, + 'amount'=> $variation_amount, + 'description'=> __( $variation_title, 'modern-events-calendar-lite'), + 'type'=> 'variation', + 'count' => $variation_count + ); + } else { + + $variation_details[$key]['amount'] += $variation_amount; + + $new_count = ((int) $variation_details[$key]['count'] + $variation_count); + $variation_details[$key]['count'] = $new_count; + $variation_details[$key]['description'] = esc_html__($ticket_variation['title'].' ('.$new_count.')', 'modern-events-calendar-lite'); + } + } + } + + return $variation_details; + } + + public function get_gateway_options() { + + $gateway_number = $this->get_gateway_number(); + + return $this->gateways_options[ $gateway_number ] ?? []; + } + + public function is_disabled_fees_for_gateway() { + + $fees_disabled_gateways = \MEC\Settings\Settings::getInstance()->get_settings( 'fees_disabled_gateways' ); + $fees_disabled_gateways = is_array( $fees_disabled_gateways ) ? $fees_disabled_gateways : []; + $gateway_number = $this->get_gateway_number(); + + if( 'MEC_gateway_woocommerce' == $this->get_gateway() ) { + + return true; + } + + if( in_array( $gateway_number, $fees_disabled_gateways ) ) { + + return true; + } + + return false; + } + + public function get_order( $order_id ) { + + if( !$order_id ) { + + return false; + } + + if( function_exists( 'wc_get_order' ) ) { + + $order = wc_get_order( $order_id ); + return is_a( $order, '\WC_Order' ) ? $order : false; + } + + return false; + } + + public function get_order_fees() { + + $wc_fees = []; + $prices_include_tax = 'yes' === get_option( 'woocommerce_prices_include_tax', 'no' ); + if( $prices_include_tax ) { + + return $wc_fees; + } + + $order_id = $this->get_order_id(); + $order = $this->get_order( $order_id ); + if( $order ) { + + foreach ($order->get_tax_totals() as $key => $tax) { + + $tax_value = \WC_Tax::get_rate_percent_value($tax->rate_id); + $wc_fees[ 'wc_'. $key ] = [ + 'title' => 'WooCommerce ' . $tax->label, + 'amount' => $tax_value, + 'type' => 'amount', + 'type2' => 'wc', + ]; + } + } + + return $wc_fees; + } + + public function get_event_fees() { + + $fees = []; + $event_id = $this->get_event_id(); + $mec_fees = $this->bookClass->get_fees( $event_id ); + + if( $this->has_100percent_coupon() && $this->apply_100percent_coupon_to_all_fees() ){ + + return []; + } + + $disabled_fees_for_gateway = $this->is_disabled_fees_for_gateway(); + + $gateway = $this->get_gateway(); + $gateway_options = $this->get_gateway_options(); + + $can_use_mec_fees = !$disabled_fees_for_gateway; + $can_use_woo_fees = false; + + switch( $gateway ) { + + case 'MEC_gateway_add_to_woocommerce_cart': + + $use_wc_taxes = isset( $gateway_options['use_woo_taxes'] ) && 'on' == $gateway_options['use_woo_taxes'] ? true : false; + $use_mec_taxes = isset( $gateway_options['use_mec_taxes'] ) && 'on' == $gateway_options['use_mec_taxes'] ? true : false; + + $can_use_woo_fees = $use_wc_taxes; + $can_use_mec_fees = ( !$disabled_fees_for_gateway && $use_mec_taxes ); + break; + } + + if( $can_use_mec_fees ) { + + $fees = array_merge_recursive( $fees, $mec_fees ); + } + + if( $can_use_woo_fees ) { + + $order_fees = $this->get_order_fees(); + $fees = array_merge_recursive( $fees, $order_fees ); + } + + return apply_filters( 'mec_transaction_get_event_fees', $fees, $event_id, $this, $mec_fees ); + } + + public function get_ticket_fees_details( $ticket, $total_tickets_count, $total_tickets_dates ) { + + $fee_details = []; + if( ! $this->get_taxes_fees_status() ) { + + return $fee_details; + } + + $tickets_count = $ticket['count'] ?? 1; + $tickets_and_variations_amount_with_discount = $ticket['tickets_and_variations_amount_with_discount'] ?? 0; + + $fees = $this->get_event_fees(); + + foreach( $fees as $key => $fee ) { + + if(!is_numeric($key)) continue; + + $fee_amount_config = isset($fee['amount']) ? (float) $fee['amount'] : 0; + $fee_amount = 0; + + $type = $fee['type'] ?? ''; + switch( $type ) { + case 'amount_per_date': + + $fee_amount = (float) ($fee_amount_config * $total_tickets_dates); + $fee_amount = (float) ($fee_amount / $total_tickets_count); + break; + case 'percent': // per ticket + + $fee_amount = (float) (( $tickets_and_variations_amount_with_discount * $fee_amount_config ) / 100); + break; + case 'amount': // per ticket + + $fee_amount = (float) ($tickets_count * $fee_amount_config); + break; + case 'amount_per_booking': + + $fee_amount = (float) $fee_amount_config; + $fee_amount = (float) ($fee_amount / $total_tickets_count); + break; + } + + // Price Details + if( ! isset($fee_details[ $key ] ) ) { + + $fee_details[ $key ] = array( + 'fee_key' => $key, + 'amount'=> (float) $fee_amount, + 'description'=>__($fee['title'], 'modern-events-calendar-lite'), + 'type'=>'fee', + 'fee_type'=> $fee['type'], + 'fee_amount'=> (float) $fee_amount_config + ); + } else { + + $fee_details[ $key ]['amount'] += (float) $fee_amount; + } + } + + return $fee_details; + } + + public function get_ticket_order_discounts_details( $ticket, $total_tickets_amount_with_variations ) { + + $discounts_details = []; + $ticket_price = $ticket['ticket_price'] ?? 0; + $ticket_variations_amount = $ticket['variations_amount'] ?? 0; + $ticket_count = $ticket['count'] ?? 0; + + $order_id = $this->get_order_id(); + $order = $this->get_order( $order_id ); + if ( $order ) { + + $coupons = $order->get_coupon_codes(); + + foreach( $coupons as $coupon_code ) { + + $coupon = new \WC_Coupon( $coupon_code ); + $coupon_discount_type = $coupon->get_discount_type(); + $coupon_discount = $coupon->get_amount(); + + $discount_ticket_amount = 0; + $discount_ticket_variation_amount = 0; + $total_ticket_discount = 0; + if ( 'percent' === $coupon_discount_type ) { + + $discount_ticket_amount = ($ticket_price * $coupon_discount) / 100; + $discount_ticket_variation_amount = ($ticket_variations_amount * $coupon_discount) / 100; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + } else { + + $percent = ($ticket_price * 100) / $total_tickets_amount_with_variations; + $discount_ticket_amount = ($coupon_discount * $percent) / 100; + $discount_ticket_variation_amount = $ticket_variations_amount * $percent / 100; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + } + + if( ! isset( $discounts_details[ "wc_coupon_{$coupon_code}" ] ) ) { + + $discounts_details[ "wc_coupon_{$coupon_code}" ] = array( + 'discount_key' => "wc_coupon_{$coupon_code}", + 'ticket_amount' => $discount_ticket_amount, + 'tickets_amount' => $discount_ticket_amount * $ticket_count, + 'variation_amount' => $discount_ticket_variation_amount, + 'variations_amount' => $discount_ticket_variation_amount * $ticket_count, + 'amount'=> $total_ticket_discount, + 'fee' => $total_ticket_discount * $ticket_count, + 'description'=> esc_html__( 'Discount by WC Coupon', 'modern-events-calendar-lite'), + 'coupon_code' => $coupon_code, + 'type'=> 'wc_coupon', + 'discount_type'=> $coupon_discount_type, + 'discount_amount'=> $coupon_discount, + ); + } else { + + $discounts_details[ "wc_coupon_{$coupon_code}" ]['amount'] += $total_ticket_discount; + } + } + } + + return $discounts_details; + } + + public function get_ticket_discounts_details( $ticket, $total_tickets_amount_with_variations ) { + + if( 'MEC_gateway_woocommerce' == $this->get_gateway() ) { + + return $this->get_ticket_order_discounts_details( $ticket, $total_tickets_amount_with_variations ); + } + + $discounts_details = []; + $ticket_price = $ticket['ticket_price'] ?? 0; + $ticket_variations_amount = $ticket['variations_amount'] ?? 0; + $ticket_count = $ticket['count'] ?? 0; + + $event_id = $this->get_event_id(); + $booking_options = get_post_meta( $event_id, 'mec_booking', true ); + if( !is_array( $booking_options ) ) { + + $booking_options = []; + } + + // User Discount + $user_id = $this->get_author_id(); + if( $user_id ) { + // User + $user = get_user_by( 'id', $user_id ); + + $roles = is_a( $user, '\WP_User' ) && isset( $user->roles ) ? (array)$user->roles : []; + + $loggedin_discount = (isset($booking_options['loggedin_discount']) ? $booking_options['loggedin_discount'] : 0); + $role_discount = $loggedin_discount; + + foreach( $roles as $key => $role ) { + + // If role discount is higher than the preset role OR a previous roles discount, set it to the new higher discount + if( + isset($booking_options['roles_discount_'.$role]) + && is_numeric($booking_options['roles_discount_'.$role]) + && $booking_options['roles_discount_'.$role] > $role_discount + ){ + + $role_discount = $booking_options['roles_discount_'.$role]; + } + } + + $discount_ticket_amount = 0; + $discount_ticket_variation_amount = 0; + if( trim( $role_discount ) and is_numeric( $role_discount ) ){ + + $discount_ticket_amount = $ticket_price * $role_discount / 100; + // $discount_ticket_variation_amount = $ticket_variations_amount * $role_discount / 100; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + if( ! isset( $discounts_details[ 'roles_discount' ] ) ) { + + $discounts_details[ 'roles_discount' ] = array( + 'discount_key' => 'roles_discount', + 'ticket_amount' => $discount_ticket_amount, + 'tickets_amount' => $discount_ticket_amount * $ticket_count, + 'variation_amount' => $discount_ticket_variation_amount, + 'variations_amount' => $discount_ticket_variation_amount * $ticket_count, + 'amount'=> $total_ticket_discount * $ticket_count, + 'fee' => $total_ticket_discount, + 'description'=>__( 'User Discount', 'modern-events-calendar-lite'), + 'type'=> 'roles_discount', + 'discount_type'=> 'roles_discount', + 'discount_amount'=> $role_discount, + ); + } else { + + // $discounts_details[ 'roles_discount' ]['amount'] += $fee_amount; + } + } + } + + // MEC Coupon Discount + $coupon = $this->get_coupon(); + if ( $coupon ) { + + $coupon_details = $this->get_mec_coupon_detail( $coupon ); + + $coupon_id = $coupon_details['coupon_id'] ?? false; + + if ( $coupon_id ) { + + $coupon_discount_type = $coupon_details['discount_type'] ?? false; + $coupon_discount = $coupon_details['discount'] ?? false; + $maximum_discount = $coupon_details['maximum_discount'] ?? 0; + + $discount_ticket_amount = 0; + $discount_ticket_variation_amount = 0; + $total_ticket_discount = 0; + if ( 'percent' === $coupon_discount_type ) { + + $discount_ticket_amount = ($ticket_price * $coupon_discount) / 100; + $discount_ticket_variation_amount = ($ticket_variations_amount * $coupon_discount) / 100; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + } else { + + $percent = ($ticket_price * 100) / $total_tickets_amount_with_variations; + $discount_ticket_amount = ($coupon_discount * $percent) / 100; + $discount_ticket_variation_amount = $ticket_variations_amount * $percent / 100; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + } + + if($total_ticket_discount > $maximum_discount && $maximum_discount!=0){ + $discount_ticket_amount = $maximum_discount; + $discount_ticket_variation_amount = $ticket_variations_amount - $maximum_discount < 0 ? 0 : $ticket_variations_amount - $maximum_discount; + $total_ticket_discount = $discount_ticket_amount + $discount_ticket_variation_amount; + } + + if( ! isset( $discounts_details[ 'coupon_discount' ] ) ) { + + $discounts_details[ 'coupon_discount' ] = array( + 'discount_key' => 'coupon_discount', + 'ticket_amount' => $discount_ticket_amount, + 'tickets_amount' => $discount_ticket_amount * $ticket_count, + 'variation_amount' => $discount_ticket_variation_amount, + 'variations_amount' => $discount_ticket_variation_amount * $ticket_count, + 'amount'=> $total_ticket_discount, + 'fee' => $total_ticket_discount * $ticket_count, + 'description'=>__( 'Discount', 'modern-events-calendar-lite'), + 'type'=> 'coupon_discount', + 'discount_type'=> $coupon_discount_type, + 'discount_amount'=> $coupon_discount, + ); + } else { + + $discounts_details[ 'coupon_discount' ]['amount'] += $total_ticket_discount; + } + } + } + + // WC Coupon Discount + $wc_discounts = $this->get_ticket_order_discounts_details( $ticket, $total_tickets_amount_with_variations ); + $discounts_details = array_merge_recursive( $discounts_details, $wc_discounts ); + + return $discounts_details; + } + + public function get_all_occurrences_tickets_details( $return_cached = true ) { + + if( $return_cached ) { + + $cached_data = $this->get_cached_tickets_details(); + if( $cached_data ) { + return $cached_data; + } + } + + $timestamps = $this->get_dates(); + $event_tickets = $this->get_event_tickets(); + $saved_tickets = $this->get_tickets(); + $removed_tickets = $this->data['removed_tickets'] ?? []; + + $tickets = []; + $row_id = 0; + foreach( $timestamps as $timestamp ) { + + $timestamp_ex = explode(':', $timestamp); + $start_timestamp = $timestamp_ex[0]; + $end_timestamp = $timestamp_ex[1]; + + if( !is_numeric( $start_timestamp ) || !$start_timestamp ){ + + continue; + } + + foreach( $saved_tickets as $key => $ticket ) { + + $is_removed_ticket = $removed_tickets[ $key ][ $timestamp ] ?? false; + if( $is_removed_ticket ) { + + continue; + } + + $ticket_id = $ticket['id'] ?? null; + $ticket_count = $ticket['count'] ?? 1; + $attendee_key = $key; + + if( is_null( $ticket_id ) ) { + + continue; + } + + $t_price = 0; + if( isset( $event_tickets[ $ticket_id ]['price'] ) ){ + + $t_price = $this->get_ticket_price( + $event_tickets[ $ticket_id ], + $start_timestamp + ); + } + + if( !is_numeric( $t_price ) ) { + + $t_price = 0; + } + + $tickets_amount = $t_price * $ticket_count; + + $variations = $this->get_ticket_variations_details( $ticket ); + $variations_amount = array_sum( + array_column( $variations, 'amount' ) + ); + + + $ticket_info = $event_tickets[ $ticket_id ] ?? []; + + $ticket_start_hour = isset($ticket_info['ticket_start_time_hour']) ? $ticket_info['ticket_start_time_hour'] : 8; + $ticket_start_minute = isset($ticket_info['ticket_start_time_minute']) ? $ticket_info['ticket_start_time_minute'] : 0; + $ticket_start_ampm = isset($ticket_info['ticket_start_time_ampm']) ? $ticket_info['ticket_start_time_ampm'] : 'AM'; + $ticket_end_hour = isset($ticket_info['ticket_end_time_hour']) ? $ticket_info['ticket_end_time_hour'] : 6; + $ticket_end_minute = isset($ticket_info['ticket_end_time_minute']) ? $ticket_info['ticket_end_time_minute'] : 0; + $ticket_end_ampm = isset($ticket_info['ticket_end_time_ampm']) ? $ticket_info['ticket_end_time_ampm'] : 'PM'; + + $ticket_start_minute_s = $ticket_start_minute; + $ticket_end_minute_s = $ticket_end_minute; + + if($ticket_start_minute == '0') $ticket_start_minute_s = '00'; + if($ticket_start_minute == '5') $ticket_start_minute_s = '05'; + if($ticket_end_minute == '0') $ticket_end_minute_s = '00'; + if($ticket_end_minute == '5') $ticket_end_minute_s = '05'; + + $ticket_start_seconds = \MEC\Base::get_Main()->time_to_seconds( + \MEC\Base::get_Main()->to_24hours($ticket_start_hour, $ticket_start_ampm), + $ticket_start_minute_s + ); + + $ticket_end_seconds = \MEC\Base::get_Main()->time_to_seconds( + \MEC\Base::get_Main()->to_24hours($ticket_end_hour, $ticket_end_ampm), + $ticket_end_minute_s + ); + + $ticket_limit = $ticket_info['limit'] ?? ''; + $tickets_amount_with_variations = $tickets_amount + $variations_amount; + + $ticket['row_id'] = ++$row_id; + $ticket['attendee_key'] = $attendee_key; + $ticket['ticket_id'] = $event_tickets[ $ticket_id ]['id'] ?? ''; + $ticket['ticket_name'] = $event_tickets[ $ticket_id ]['name'] ?? ''; + $ticket['ticket_price'] = $t_price; + $ticket['tickets_amount'] = $tickets_amount; + $ticket['tickets_amount_with_variations'] = $tickets_amount_with_variations; + $ticket['partial_payment_tickets_amount_with_variations'] = $this->get_partial_payment_amount( $tickets_amount_with_variations ); + $ticket['ticket_limit'] = $ticket_limit; + $ticket['variations_amount'] = $variations_amount; + $ticket['variations_details'] = $variations; + $ticket['date'] = $timestamp; + $ticket['product_id'] = $ticket[ 'product_ids' ][ $timestamp ] ?? 0; + + $ticket_date_timestamp_day_start = strtotime( date( 'Y-m-d', $start_timestamp ) ); + $ticket_date_timestamp_day_end = strtotime( date( 'Y-m-d', $end_timestamp ) ); + $ticket['ticket_timestamp_start'] = $ticket_date_timestamp_day_start + $ticket_start_seconds; + $ticket['ticket_timestamp_end'] = $ticket_date_timestamp_day_end + $ticket_end_seconds; + + $ticket = apply_filters( 'mec_transaction_get_ticket_details', $ticket, $key, $ticket_id, $saved_tickets, $event_tickets ); + + $tickets[] = $ticket; + } + } + + + $total_tickets_count = $this->calculate_total_tickets_count( $tickets ); + $total_tickets_dates = $this->get_total_tickets_dates( $tickets ); + $total_tickets_amount_with_variations =$this->calculate_total_tickets_amount_with_variations( $tickets ); + + foreach( $tickets as $k => $ticket ) { + + $discounts = $this->get_ticket_discounts_details( $ticket, $total_tickets_amount_with_variations ); + $discounts_amount = array_sum( + array_column( $discounts, 'amount' ) + ); + + if( $ticket['tickets_amount_with_variations'] < $discounts_amount ) { + + $discounts_amount = $ticket['tickets_amount_with_variations']; + } + $ticket['discounts_amount'] = $discounts_amount; + $ticket['discounts_details'] = $discounts; + $ticket['tickets_and_variations_amount_with_discount'] = $ticket['tickets_amount_with_variations'] - $discounts_amount; + + $fees = $this->get_ticket_fees_details( $ticket, $total_tickets_count, $total_tickets_dates ); + + $fees_amount = 0; + $fees_per_ticket_amount = 0; + $per_ticket_fee_types = array( + 'percent', + 'amount', + ); + foreach( $fees as $fee ){ + + $fee_type = $fee['fee_type'] ?? ''; + $fee_amount = $fee['amount'] ?? 0; + $fees_amount += $fee_amount; + + if( in_array( $fee_type, $per_ticket_fee_types ) ) { + + $fees_per_ticket_amount += $fee_amount; + } + } + $ticket['fees_per_ticket_amount'] = $fees_per_ticket_amount; + $ticket['fees_amount'] = $fees_amount; + $ticket['fees_details'] = $fees; + + $tickets[ $k ] = $ticket; + } + + + $this->update_cache_tickets_details( $tickets ); + + return $tickets; + } + + public function get_all_tickets_variations_detail( $tickets = null ) { + + if( is_null( $tickets ) ){ + + $tickets = $this->get_all_tickets_details(); + } + + $_variations_details = []; + foreach( $tickets as $ticket ) { + + $_variations_details = array_merge( + $_variations_details, + $ticket['variations_details'] ?? array() + ); + } + + $variations_details = []; + foreach( $_variations_details as $k => $variation_details ) { + + $variation_key = $variation_details['variation_key'] ?? 0; + $amount = $variation_details['amount'] ?? 0; + $count = $variation_details['count'] ?? 0; + + if( !isset( $variations_details[ $variation_key ] ) ) { + + $variations_details[ $variation_key ] = $variation_details; + } else { + + $variations_details[ $variation_key ]['amount'] += $amount; + $variations_details[ $variation_key ]['count'] += $count; + } + } + + return $variations_details; + } + + public function get_all_tickets_fees_detail( $tickets = null ) { + + if( is_null( $tickets ) ){ + + $tickets = $this->get_all_tickets_details(); + } + + $_fees_details = []; + foreach( $tickets as $ticket ) { + + $_fees_details = array_merge( + $_fees_details, + $ticket['fees_details'] ?? array() + ); + } + + $fees_details = []; + foreach( $_fees_details as $k => $fee_details ) { + + $fee_key = $fee_details['fee_key'] ?? 0; + $amount = $fee_details['amount'] ?? 0; + $count = $fee_details['count'] ?? 1; + + if( !isset( $fees_details[ $fee_key ] ) ) { + + $fees_details[ $fee_key ] = $fee_details; + } else { + + if( !isset( $fees_details[ $fee_key ]['amount'] ) ){ + + $fees_details[ $fee_key ]['amount'] = 0; + } + $fees_details[ $fee_key ]['amount'] += $amount; + + if( !isset( $fees_details[ $fee_key ]['count'] ) ){ + + $fees_details[ $fee_key ]['count'] = 0; + } + $fees_details[ $fee_key ]['count'] += $count; + } + } + + return $fees_details; + } + + public function get_all_tickets_discounts_detail( $tickets = null ) { + + if( is_null( $tickets ) ){ + + $tickets = $this->get_all_tickets_details(); + } + + $_discounts_details = []; + foreach( $tickets as $ticket ) { + + $_discounts_details = array_merge( + $_discounts_details, + $ticket['discounts_details'] ?? array() + ); + } + + $discounts_details = []; + foreach( $_discounts_details as $k => $discount_details ) { + + $discount_key = $discount_details['discount_key'] ?? 0; + $amount = $discount_details['amount'] ?? 0; + $count = $discount_details['count'] ?? 1; + + if( !isset( $discounts_details[ $discount_key ] ) ) { + + $discounts_details[ $discount_key ] = $discount_details; + } else { + + if( !isset( $discounts_details[ $discount_key ]['amount'] ) ){ + + $discounts_details[ $discount_key ]['amount'] = 0; + } + $discounts_details[ $discount_key ]['amount'] += $amount; + + if( !isset( $discounts_details[ $discount_key ]['count'] ) ){ + + $discounts_details[ $discount_key ]['count'] = 0; + } + $discounts_details[ $discount_key ]['count'] += $count; + } + } + + return $discounts_details; + } + + public function calculate_total_tickets_detail( $tickets, $key ) { + + $total = 0; + switch( $key ) { + + case 'discount': + + $discounts_details = $this->get_all_tickets_discounts_detail( $tickets ); + + $total = array_sum( + array_column( $discounts_details, 'amount' ) + ); + break; + + case 'fees_amount': + + $fees_details = $this->get_all_tickets_fees_detail( $tickets ); + + $total = array_sum( + array_column( $fees_details, 'amount' ) + ); + break; + + case 'variations_amount': + + $variations_details = $this->get_all_tickets_variations_detail( $tickets ); + + $total = array_sum( + array_column( $variations_details, 'amount' ) + ); + break; + + default: + $total = array_sum( + array_column( $tickets, $key ) + ); + } + + return $total; + } + + public function calculate_total_tickets_amount( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'tickets_amount' ); + } + + public function calculate_total_tickets_amount_with_variations( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'tickets_amount_with_variations' ); + } + + + + public function calculate_total_tickets_count( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'count' ); + } + + public function calculate_total_tickets_variations_amount( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'variations_amount' ); + } + + public function calculate_total_tickets_fees_amount( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'fees_amount' ); + } + + public function calculate_total_tickets_discounts_amount( $tickets ) { + + return $this->calculate_total_tickets_detail( $tickets, 'discounts_amount' ); + } + + public function remove_ticket( $ticket_key, $date, $update = true ) { + + $tickets = $this->get_tickets(); + + $ticket_product_ids = $tickets[ $ticket_key ]['product_ids'] ?? []; + unset( $ticket_product_ids[ $date ] ); + $tickets[ $ticket_key ]['product_ids'] = $ticket_product_ids; + + $this->data['tickets'] = $tickets; + + if( empty( $ticket_product_ids ) ) { + + unset( $this->data['tickets'][ $ticket_key ] ); + unset( $this->data['removed_tickets'][ $ticket_key ] ); + } else { + + $this->data['removed_tickets'][ $ticket_key ][ $date ] = true; + } + + $this->reset_cache_tickets_details(); + + $saved_dates = $this->get_dates(); + $ticket_dates = $this->get_tickets_dates(); + + if( count( $saved_dates ) !== count( $ticket_dates ) ) { + + $this->data['timestamps'] = $ticket_dates; + $this->data['all_dates'] = $ticket_dates; + $this->data['date'] = current( $ticket_dates ); + } + + if( $update ) { + + $this->update_data(); + } + } + + public function remove_ticket_by_product_id( $product_id ) { + + $attendee_key = get_post_meta( $product_id, 'attendee_key', true ); + $date = get_post_meta( $product_id, 'mec_date', true ); + + $ticket_key = (int)$attendee_key; + + $this->remove_ticket( $ticket_key, $date, true ); + + $tickets = $this->get_tickets(); + if( !empty( $tickets ) ) { + + $this->create_products_from_items( false, true ); + } + + //TODO: update fees + } + + public function _get_tickets_dates( $tickets ) { + + $dates = array_column( $tickets, 'date' ); + $dates = array_unique( $dates ); + + return $dates; + } + + public function get_tickets_emails( $tickets ) { + + $emails = array_column( $tickets, 'email' ); + $emails = array_unique( $emails ); + + return $emails; + } + + public function get_total_tickets_dates( $tickets ) { + + return count( $this->_get_tickets_dates( $tickets ) ); + } + + public function get_details( $filters = array() ) { + + $tickets_details = $this->get_all_tickets_details(); + + if( !empty( $filters ) ){ + + foreach( $tickets_details as $td_key => $ticket_details ) { + + foreach( $filters as $f_key => $f_value ) { + + $t_value = $ticket_details[ $f_key ] ?? ''; + if( $t_value != $f_value ) { + + unset( $tickets_details[ $td_key ] ); + } + } + } + } + + $total_tickets_amount = $this->calculate_total_tickets_amount( $tickets_details ); + $total_tickets_amount_with_variations = $this->calculate_total_tickets_amount_with_variations( $tickets_details ); + $total_tickets_count = $this->calculate_total_tickets_count( $tickets_details ); + $total_variations_amount = $this->calculate_total_tickets_variations_amount( $tickets_details ); + $total_fees_amount = $this->calculate_total_tickets_fees_amount( $tickets_details ); + $fees_details = $this->get_all_tickets_fees_detail( $tickets_details ); + $total_discounts_amount = $this->calculate_total_tickets_discounts_amount( $tickets_details ); + $discounts_details = $this->get_all_tickets_discounts_detail( $tickets_details ); + $variations_details = $this->get_all_tickets_variations_detail( $tickets_details ); + $dates = $this->_get_tickets_dates( $tickets_details ); + $total_dates = $this->get_total_tickets_dates( $tickets_details ); + $emails = $this->get_tickets_emails( $tickets_details ); + + + //TODO: add discount + return array( + 'tickets_dates' => $dates, + 'tickets_emails' => $emails, + 'tickets_details' => $tickets_details, + 'fees_details' => $fees_details, + 'discounts_details' => $discounts_details, + 'variations_details' => $variations_details, + 'summary' => array( + 'total_tickets_amount' => $total_tickets_amount, + 'total_tickets_amount_with_variations' => $total_tickets_amount_with_variations, + 'total_tickets_count' => $total_tickets_count, + 'total_variations_amount' => $total_variations_amount, + 'total_fee_amount' => $total_fees_amount, + 'total_discounts_amount' => $total_discounts_amount, + 'subtotal_amount_with_fee' => $total_tickets_amount + $total_variations_amount + $total_fees_amount, + 'subtotal_amount_without_fee' => $total_tickets_amount + $total_variations_amount, + 'total_amount_with_fee' => $total_tickets_amount + $total_variations_amount + $total_fees_amount - $total_discounts_amount, + 'total_amount_without_fee' => $total_tickets_amount + $total_variations_amount - $total_discounts_amount, + 'total_dates' => $total_dates, + ) + ); + } + + private function get_all_occurrences_details() { + + $this->price_details = $this->get_details(array( + // 'attendee_key' => 0, + )); + + return $this->price_details; + } + + public function get_price_details() { + + if( is_null( $this->price_details ) ){ + + $this->get_all_occurrences_details(); + } + + return $this->price_details; + } + + public function get_tickets_details( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'tickets_details'; + + return $details[ $column_key ]; + } + + public function get_variations_details( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'variations_details'; + + return $details[ $column_key ]; + } + + public function get_variations( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'total_variations_amount'; + + return $details['summary'][ $column_key ]; + } + + public function get_partial_payment_amount( $total ) { + + if( !$this->is_partial_payment() ) { + + return $total; + } + + $payable = $total; + + [$payable_amount, $payable_type] = $this->get_partial_payment_settings(); + + if($payable_type === 'percent') { + + $payable = $total * ($payable_amount / 100); + } elseif($payable_type === 'amount') { + + $payable = min($total, $payable_amount); + } + + return $payable; + } + + public function calculate_partial_payment( $filters = array(), $apply_fees = true ) { + + $total = $this->get_total( $filters, $apply_fees ); + + $payable = $this->get_partial_payment_amount( $total ); + + return $payable; + } + + public function get_fees_details( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'fees_details'; + + return $details[ $column_key ]; + } + + public function get_emails( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'tickets_emails'; + + return $details[ $column_key ]; + } + + public function get_tickets_dates( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'tickets_dates'; + + return $details[ $column_key ]; + } + + public function get_fees( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'total_fee_amount'; + + return $details['summary'][ $column_key ]; + } + + public function get_discounts( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'total_discounts_amount'; + + return $details['summary'][ $column_key ]; + } + + public function get_subtotal( $filters = array(), $apply_fees = true ) { + + $details = $this->get_details( $filters ); + + $column_key = 'subtotal_amount_with_fee';//total_amount_with_fee | total_amount_without_fee + + if( !$apply_fees ) { + + $column_key = 'subtotal_amount_without_fee'; + } + + return $details['summary'][ $column_key ]; + } + + public function get_total( $filters = array(), $apply_fees = true ) { + + $details = $this->get_details( $filters ); + + $column_key = 'total_amount_with_fee';//total_amount_with_fee | total_amount_without_fee + + if( !$apply_fees ) { + + $column_key = 'total_amount_without_fee'; + } + + return $details['summary'][ $column_key ]; + } + + public function get_payable( $filters = array(), $apply_fees = true ) { + + $total = $this->get_total( $filters, $apply_fees ); + $payable = $total; + + // Calculate Payable + if( $this->is_partial_payment() ) { + + $payable = $this->calculate_partial_payment( $filters, $apply_fees ); + } + + return $payable; + } + + public function get_total_dates( $filters = array() ) { + + $details = $this->get_details( $filters ); + + $column_key = 'total_dates'; + + return $details['summary'][ $column_key ]; + } + + public function get_attendees_info( $filters = array() ) { + + $info = []; + $tickets_details = $this->get_tickets_details( $filters ); + foreach( $tickets_details as $ticket_details ) { + + $email = $ticket_details['email']; + $date = $ticket_details['date']; + $name = $ticket_details['name']; + $detail_key = "$email-$date-$name"; + $count = $ticket_details['count']; + if( !isset( $info[ $detail_key ] ) ) { + + $info[ $detail_key ] = array( + 'name' => $name, + 'email' => $email, + 'date' => $date, + 'count' => $ticket_details['count'], + 'reg' => $ticket_details['reg'] ?? array(), + ); + } else { + + $info[ $detail_key ]['count'] += $count; + } + } + + return $info; + } + + public function validate_for_add_book() { + + $errors = []; + $date_format = 'Y-m-d'; + $event_id = $this->get_event_id(); + $tickets_details = $this->get_tickets_details(); + $dates = $this->get_tickets_dates(); + + foreach( $dates as $date ) { + + $t_occurrences = explode( ':', $date ); + $occurrence_time = $t_occurrences[0]; + $availability[ $occurrence_time ] = $this->bookClass->get_tickets_availability( + $event_id, + $occurrence_time + ); + } + + foreach( $tickets_details as $ticket ) { + + $t_occurrences = explode( ':', $ticket['date'] ); + $occurrence = $t_occurrences[0]; + $occurrence_availability = $availability[ $occurrence ] ?? []; + $ticket_id = $ticket['id']; + $ticket_name = $ticket['ticket_name']; + $ticket_count = $ticket['count']; + + $ticket_availability = $occurrence_availability[ $ticket_id ] ?? false; + $str_replace = !empty( $ticket_name ) ? ''. $ticket_name .'' : ''; + $ticket_message_sold_out = sprintf( + __('The %s ticket is sold out in %s. You can try another ticket or another date.', 'modern-events-calendar-lite'), + $str_replace, + date_i18n( $date_format, $occurrence ) + ); + + if( -1 != $ticket_availability && ( !$ticket_availability || $ticket_count > $ticket_availability ) ) { + + $errors[ "$ticket_id-$occurrence" ] = array( + 'success' => 0, + 'message'=>sprintf( + \MEC\Base::get_main()->m( + 'booking_restriction_message3', + $ticket_message_sold_out + ), + $ticket_availability + ), + 'code'=>'LIMIT_REACHED' + ); + } + } + + if( !empty( $errors ) ) { + + return $errors; + } + + return true; + } + + public function get_closest_occurrence() { + + $all_dates = $this->get_dates(); + + if( count( $all_dates ) > 1 ){ + + foreach( $all_dates as $timestamps ){ + + $ex = explode( ':', $timestamps ); + $start_timestamp = $ex[0]; + $end_timestamp = $ex[1]; + $current_timestamp = current_time('timestamp'); + if( $current_timestamp >= $end_timestamp ){ + + continue; + } + + return $timestamps; + } + } + + $timestamps = current( $all_dates ); + + return $timestamps; + } + + public function get_closest_occurrence_start_timestamp() { + + $timestamps = $this->get_closest_occurrence(); + $ex = explode( ':', $timestamps ); + + return $ex[0]; + } + + public function get_closest_occurrence_end_timestamp() { + + $timestamps = $this->get_closest_occurrence(); + $ex = explode( ':', $timestamps ); + + return $ex[1]; + } + + public function register_user( $attendee, $args = array() ) { + + $user = \MEC::getInstance('app.libraries.user'); + return $user->register($attendee, $args); + } + + public function create_book_from_transaction( $args = array(), $rebuild = false ) { + + $book_id = $this->get_book_id(); + if( $book_id && !$rebuild ){ + + return $book_id; + } + + $attendees = $this->get_tickets(); + $attention_date = $this->get_date(); + $attention_times = explode(':', $attention_date); + $date = date('Y-m-d H:i:s', trim($attention_times[0])); + + // Is there any attendee? + if (!count( $attendees )) { + + return new \WP_Error( + 'NO_TICKET', + __( 'There is no attendee for booking!', 'modern-events-calendar-lite') + ); + } + + $main_attendee = isset($attendees[0]) ? $attendees[0] : []; + $name = $main_attendee['name'] ?? ''; + $ticket_ids = ''; + $attendees_info = []; + + foreach ($attendees as $attendee) { + + $ticket_ids .= $attendee['id'] . ','; + if (!array_key_exists($attendee['email'], $attendees_info)) { + + $attendees_info[$attendee['email']] = array( + 'count' => $attendee['count'] + ); + } else { + + $attendees_info[ $attendee['email'] ]['count'] = ($attendees_info[$attendee['email']]['count'] + $attendee['count']); + } + } + + $user_id = $this->register_user( $main_attendee ); + $user = \MEC::getInstance('app.libraries.user'); + + $gateway = $args['mec_gateway'] ?? $this->get_gateway(); + $gateway_label = $args['mec_gateway_label'] ?? $this->get_gateway_label( $gateway ); + $book_id = $this->bookClass->add( + array( + 'post_author' => $user_id, + 'post_type' => 'mec-books', + 'post_title' => $name.' - '.$user->get($user_id)->user_email, + 'post_date' => $date, + 'attendees_info' => $attendees_info, + 'mec_attendees' => $attendees, + 'mec_gateway' => $gateway, + 'mec_gateway_label' => $gateway_label, + ), + $this->transaction_id, + ',' . $ticket_ids + ); + + //TODO: update book meta + + // Fires after completely creating a new booking + do_action('mec_booking_completed', $book_id); + + return $book_id; + } + + public function create_products_from_items( $rebuild = false, $update = false ) { + + $product_ids = []; + + $saved_data = $this->get_saved_data(); + $tickets_details = $this->get_tickets_details(); + foreach( $tickets_details as $ticket_detail ) { + //TODO: is first for all + $attendee_key = $ticket_detail['attendee_key']; + $date = $ticket_detail['date']; + $ex_date = explode( ':', $date ); + $start_timestamp = $ex_date[0]; + $product_id = $ticket_detail['product_id'] ?? 0; + + if( !$product_id || $rebuild || $update ) { + + $product_id = $this->create_ticket_product( $ticket_detail, $update ); + + $saved_data['tickets'][ $attendee_key ][ 'product_ids' ][ $date ] = $product_id; + } + + $product_ids[] = $product_id; + } + + + $saved_fees_product_ids = $saved_data['fees_product_ids'] ?? []; + $related_products = $product_ids; + $per_ticket_fee_types = array( + 'percent', + 'amount', + ); + // $dates = $this->get_tickets_dates(); + // foreach( $dates as $timestamp ) { + + $filters = array( + // 'date' => $timestamp, + ); + $fees_details = $this->get_fees_details( $filters ); + $fees_product_ids = []; + foreach( $fees_details as $fee_key => $fee_detail ) { + + $fee_type = $fee_detail['fee_type']; + if( in_array( $fee_type, $per_ticket_fee_types ) ) { + + continue; + } + + $product_id = $saved_fees_product_ids[ $fee_key ] ?? 0; + $fee_detail['product_id'] = $product_id; + + if( !$product_id || $rebuild || $update ) { + + $product_id = $this->create_fee_product( $fee_detail, $related_products, $update ); + + $fees_product_ids[ $fee_key ] = $product_id; + } + + $product_ids[] = $product_id; + } + // } + + $saved_data['fees_product_ids'] = $fees_product_ids; + + $this->set_data( $saved_data ); // new data + $this->update_data(); + + return $product_ids; + } + + public function create_product( $args ) { + + $transaction_id = $this->transaction_id; + + $product_type = \MEC\Settings\Settings::getInstance()->get_settings( 'ticket_product_type' ); + $product_type = $product_type ? $product_type : 'virtual'; + $is_virtual = ( 'virtual' === $product_type ) ? 'yes' : 'no'; + $event_id = $this->get_event_id(); + + $meta_input = wp_parse_args( + $args['meta_input'] ?? array(), + array( + '_visibility' => false, + '_stock_status' => 'instock', + 'total_sales' => '0', + '_downloadable' => 'no', + '_purchase_note' => '', + '_featured' => 'no', + '_weight' => '', + '_length' => '', + '_width' => '', + '_height' => '', + '_sku' => '', + '_product_attributes' => array(), + '_sale_price_dates_from' => '', + '_sale_price_dates_to' => '', + '_sold_individually' => '', + '_manage_stock' => 'no', + '_backorders' => 'no', + '_stock' => '', + '_product_image_gallery' => '', + + 'transaction_id' => $transaction_id, + '_mec_event_id' => $event_id, + 'event_id' => $event_id, //TODO: remove + 'event_name' => get_the_title( $event_id ), + + 'first_for_all' => $this->is_first_for_all() ? 'yes' : 'no', + '_virtual' => $is_virtual, + '_regular_price' => '', + '_sale_price' => '', + '_price' => '', + + 'cantChangeQuantity' => true, + // 'm_product_type' => '', + // 'related_products' => '', + ) + ); + + unset( $args['meta_input'] ); + + $defaults = array( + 'post_content' => '', + 'post_status' => 'MEC_Tickets', + 'post_title' => $args['product_title'], + 'post_parent' => '', + 'post_type' => 'product', + 'meta_input' => $meta_input + ); + + $args = wp_parse_args( $args, $defaults ); + + // Create post + $post_id = wp_insert_post( $args ); + wp_set_object_terms($post_id, 'MEC-Woo-Cat', 'product_cat', true); + wp_set_object_terms($post_id, 'simple', 'product_type'); + + $terms = array('exclude-from-search', 'exclude-from-catalog'); + wp_set_post_terms($post_id, $terms, 'product_visibility', false); + + + + if (has_post_thumbnail( $event_id )) { + $image = wp_get_attachment_image_src(get_post_thumbnail_id( $event_id ), 'full'); + $event_featured_image = str_replace(get_site_url(), $_SERVER['DOCUMENT_ROOT'], $image[0]); + + if ($event_featured_image) { + set_post_thumbnail($post_id, attachment_url_to_postid($image[0])); + } + } + + if (isset($args['m_product_type'])) { + + update_post_meta($post_id, 'm_product_type', $args['m_product_type']); + update_post_meta($post_id, 'related_products', $args['related_products']); + } + + if (isset($args['cantChangeQuantity'])) { + + update_post_meta($post_id, 'cantChangeQuantity', true); + } + + return $post_id; + } + + public function create_ticket_product( $ticket_detail, $update = false ) { + + $ticket_id = $ticket_detail['id'] ?? ''; + $ticket_product_id = $ticket_detail['product_id'] ?? 0; + $attendee_key = $ticket_detail['attendee_key'] ?? ''; + + $ticket_price = $ticket_detail['ticket_price'] ?? 0; + $ticket_sale_price = $ticket_detail['ticket_sale_price'] ?? $ticket_price; + $variations_amount = $ticket_detail['variations_amount'] ?? 0; + $discounts_amount = $ticket_detail['discounts_amount'] ?? 0; + $fees_per_ticket_amount = $ticket_detail['fees_per_ticket_amount'] ?? 0; + + $ticket_price += $fees_per_ticket_amount; + $ticket_sale_price += $fees_per_ticket_amount; + + $ticket_price += $variations_amount; + $ticket_sale_price += $variations_amount - $discounts_amount; + + $ticket_sale_price = $this->get_partial_payment_amount( $ticket_sale_price ); + + $variations = $ticket_detail['variations_details'] ?? []; + + $args = array( + 'product_title' => __( 'Ticket', 'modern-events-calendar-lite') . ' (' . $ticket_detail['ticket_name'] . ') - ' . $this->transaction_id, + 'meta_input' => array( + '_regular_price' => $ticket_price, + '_sale_price' => $ticket_sale_price, + '_price' => $ticket_sale_price, + + 'ticket_id' => $ticket_id, + 'ticket_name' => $ticket['ticket_name'] ?? '', + 'attendee_key' => $attendee_key, + 'mec_ticket' => $ticket_detail, + 'mec_date' => $ticket_detail['date'], + 'ticket_used_count' => $ticket_detail['count'], + ) + ); + + if( $update && $ticket_product_id ) { + + $args['ID'] = $ticket_product_id; + } + + $post_id = $this->create_product( $args ); + + $ticket_sales_with_wooCommerce_product = false; + + $event_tickets = $this->get_event_tickets(); + $event_ticket = isset( $event_tickets[$ticket_id] ) && is_array( $event_tickets[$ticket_id] ) ? $event_tickets[$ticket_id] : []; + $ticket_custom_categories = isset( $event_ticket['category_ids'] ) && !empty( $event_ticket['category_ids'] ) ? (array)$event_ticket['category_ids'] : []; + if( false == $ticket_sales_with_wooCommerce_product && !empty( $ticket_custom_categories ) ){ + + foreach($ticket_custom_categories as $k => $category_id){ + + $ticket_custom_categories[$k] = intval($category_id); + } + + wp_set_object_terms($post_id, $ticket_custom_categories, 'product_cat', true); + } + + foreach( $variations as $variation ) { + + $variation_data[] = [ + 'MEC_WOO_V_max' => @$variation['max'], + 'MEC_WOO_V_title' => $variation['description'], + 'MEC_WOO_V_price' => $variation['price'], + 'MEC_WOO_V_count' => $variation['count'], + ]; + + add_post_meta($post_id, 'MEC_Variation_Data', json_encode($variation_data , JSON_UNESCAPED_UNICODE )); + } + + return $post_id; + } + + public function create_fee_product( $fee_detail, $related_products = array(), $update = false ) { + + $fee_amount = $fee_detail['amount']; + $fee_description = $fee_detail['description']; + $fee_type = $fee_detail['fee_type']; + $fee_product_id = $fee_detail['product_id'] ?? 0; + + $fee_sale_amount = $this->get_partial_payment_amount( $fee_amount ); + + $args = array( + 'product_title' => "$fee_description - {$this->transaction_id}", + 'meta_input' => array( + '_regular_price' => $fee_amount, + '_sale_price' => $fee_sale_amount, + '_price' => $fee_sale_amount, + + 'ticket_used_count' => 1, + 'm_product_type' => $fee_type, + 'related_products' => $related_products + ), + ); + + if( $update && $fee_product_id ) { + + $args['ID'] = $fee_product_id; + } + + $post_id = $this->create_product( $args ); + + return $post_id; + } + + public static function upgrade_db() { + + $books = get_posts(array( + 'post_type' => 'mec-books', + 'posts_per_page' => 100, + 'fields' => 'ids', + 'meta_query' => array( + array( + 'key' => 'mec_transaction_upgraded', + 'compare' => 'NOT EXISTS', + ) + ) + )); + + if( 0 === count( $books ) ) { + + update_option( 'mec_transaction_version', MEC_VERSION ); + return; + } + + add_filter( 'mec_transaction_get_event_fees', array( __CLASS__, 'filter_transaction_get_event_fees' ), 10, 3 ); + + $transaction_ids = []; + foreach( $books as $book_id ) { + + $transaction_ids[ $book_id ] = get_post_meta( $book_id, 'mec_transaction_id', true ); + } + + foreach( $transaction_ids as $book_id => $transaction_id ) { + + update_post_meta( $book_id, 'mec_transaction_upgraded', 'yes' ); + + $transaction = get_option( $transaction_id, false ); + if( !$transaction ) { + continue; + } + + if( isset( $transaction['old_tickets'] ) ){ + + $transaction['tickets'] = $transaction['old_tickets']; + }else{ + + $transaction['old_tickets'] = $transaction['tickets']; + } + + if( !isset( $transaction['booking_id'] ) ){ + + $transaction['booking_id'] = $book_id; + } + + if( !isset( $transaction['event_id'] ) ){ + + $transaction['booking_id'] = $book_id; + } + + if( !isset( $transaction['gateway'] ) ){ + + $gateway = get_post_meta( $book_id, 'mec_gateway', true ); + $transaction['gateway'] = !empty( $gateway ) ? $gateway : 'MEC_gateway_pay_locally'; + } + + if( !isset( $transaction['applied_fee'] ) ){ + + $has_fee = in_array( + 'fee', + array_column( $transaction['price_details']['details'] ?? array(), 'type' ) + ); + + $transaction['applied_fee'] = $has_fee; + } + + if( !isset( $transaction['applied_discount'] ) && $transaction['discount'] ){ + + $has_discount = in_array( + 'discount', + array_column( $transaction['price_details']['details'] ?? array(), 'type' ) + ); + + $transaction['applied_discount'] = $has_discount; + } + + if( isset( $transaction['tickets'][0]['_name'] ) ){ + + $book = new \MEC_book(); + $attendees = $book->get_attendees( $book_id ); + if( count( $attendees ) !== count( $transaction['tickets'] ) ) { + + $transaction['tickets'] = $attendees; + } + + if( isset( $transaction['tickets'][0]['date'] ) ){ + + $ticket_date = false; + $new_tickets = []; + foreach( $transaction['old_tickets'] as $old_ticket ) { + + if( $ticket_date && $ticket_date !== $old_ticket['date'] ) { + + continue; + } + + if( !$ticket_date ) { + + $ticket_date = $old_ticket['date']; + } + + $ticket = $old_ticket; + + unset( $ticket['date'] ); + unset( $ticket['product_id'] ); + + $ticket['count'] = 1; + + $new_tickets[] = $ticket; + } + + $transaction['tickets'] = $new_tickets; + } + + foreach( $transaction['tickets'] as $k => $ticket ) { + + $ticket; + $attendee_name = $ticket['_name']; + unset( $ticket['_name'] ); + unset( $ticket['date'] ); + if( !empty( $attendee_name ) ) { + + $ticket['name'] = $attendee_name; + } + + $transaction['tickets'][ $k ] = $ticket; + } + } + + $woo_order_id = get_post_meta( $book_id, 'mec_order_id', true ); + $transaction['order_id'] = $woo_order_id; //TODO: add in + + if( $woo_order_id ) { + + $transaction['wc'] = true; + } + + $total = $transaction['total'] ?? 0; + $payable = $transaction['payable'] ?? 0; + if( $total < $payable ) { + + $transaction['total'] = $payable; + $transaction['payable'] = $total; + }else{ + + // $transaction['total'] = $total; + // $transaction['payable'] = $payable; + } + + + update_option( $transaction_id, $transaction, false ); + + $total = $transaction['total'] ?? 0; + $payable = $transaction['payable'] ?? $total; + + $transactionObject = new \MEC\Transactions\Transaction( $transaction_id ); + if( + $transactionObject->get_subtotal() != $total + || + $transactionObject->get_total() != $payable + ) { + + /* + error_log( "Transaction error {$book_id}-{$transaction_id}"); + echo '
    ';
    +					var_dump( $book_id );
    +					var_dump($transactionObject->get_subtotal() . '!=' . $transaction['total']);
    +					var_dump($transactionObject->get_total() . '!=' . $transaction['payable']);
    +					echo ''. $book_id .'
    ' ; + echo ' delete '. $book_id .'
    ' ; + echo '


    '; + print_r($transactionObject->get_all_occurrences_details()); + wp_die(print_r($transaction)); + */ + } else { + + $transactionObject->update_cache_tickets_details(); + } + } + } + + public static function filter_transaction_get_event_fees( $fees, $event_id, $class ) { + + $transaction = $class->get_saved_data(); + $saved_fees = array_filter( $transaction['price_details']['details'], function( $a ){ + + return $a['type'] === 'fee'; + }); + $saved_fees = array_values( $saved_fees ); + $saved_fees_titles = array_column( $saved_fees, 'description' ); + + foreach( $fees as $k => $fee ) { + + $index = array_search( $fee['title'], $saved_fees_titles ); + if( false !== $index ){ + + $fees[ $k ]['type'] = $saved_fees[ $index ]['fee_type']; + $fees[ $k ]['amount'] = $saved_fees[ $index ]['fee_amount']; + } else { + + unset( $fees[ $k ] ); + } + } + + return $fees; + } + + public function get_mec_coupon_detail( $coupon ) { + + $coupon_details = []; + $term = get_term_by( 'name', $coupon, 'mec_coupon' ); + $coupon_id = isset($term->term_id) ? $term->term_id : 0; + $maximum_discount = get_metadata('term', $coupon_id, 'maximum_discount', true); + if ( $coupon_id ) { + + $coupon_details['coupon_id'] = $coupon_id; + $coupon_details['discount_type'] = get_term_meta($coupon_id, 'discount_type', true); + $coupon_details['discount'] = get_term_meta($coupon_id, 'discount', true); + $coupon_details['maximum_discount'] = $maximum_discount; + } + + return $coupon_details; + } + + public function has_100percent_coupon(){ + + $coupon = $this->get_coupon(); + $coupon_details = $this->get_mec_coupon_detail( $coupon ); + + $discount_type = $coupon_details['discount_type'] ?? false; + $discount = $coupon_details['discount'] ?? false; + + if( 'percent' === $discount_type && 100 == $discount ) { + + return true; + } + + return false; + } + + public function apply_100percent_coupon_to_all_fees() { + + return \MEC\Settings\Settings::getInstance()->get_settings('coupons_apply_100percent_to_all'); + } +} diff --git a/app/core/src/Transactions/index.php b/app/core/src/Transactions/index.php new file mode 100755 index 0000000..9d7a83d --- /dev/null +++ b/app/core/src/Transactions/index.php @@ -0,0 +1,5 @@ + + */ +class MEC_feature_admincalendar extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $status; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Admin Calendar Status + $this->status = (isset($_GET['adminview']) and $_GET['adminview'] === 'calendar'); + } + + /** + * Initialize admin calendar feature + * @author Webnus + */ + public function init() + { + // Disabled? + if(!isset($this->settings['admin_calendar']) or (isset($this->settings['admin_calendar']) and !$this->settings['admin_calendar'])) return; + + // Admin Calendar + $this->factory->action('admin_head-edit.php', [$this, 'output']); + + // Assets + if($this->status) $this->factory->action('admin_enqueue_scripts', [$this, 'assets'], 0); + } + + public function output() + { + global $current_screen; + + // Add it only on Event Page + if('mec-events' != $current_screen->post_type) return; + + if($this->status) + { + $HTML = $this->getRender()->vmonth(['sk-options' => ['monthly_view' => ['style' => 'admin']]]); + $this->factory->params('footer', function() use($HTML) + { + ?> + + + factory->params('footer', function() + { + ?> + + main->asset('js/admin-calendar.js'), ['jquery'], $this->main->get_version()); + + // Style + wp_enqueue_style('mec-admin-calendar-style', $this->main->asset('css/admin-calendar.min.css'), ['mec-backend-style'], $this->main->get_version()); + } +} \ No newline at end of file diff --git a/app/features/adminupcoming.php b/app/features/adminupcoming.php new file mode 100755 index 0000000..ee842f5 --- /dev/null +++ b/app/features/adminupcoming.php @@ -0,0 +1,145 @@ + + */ +class MEC_feature_adminupcoming extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $status; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Admin Calendar Status + $this->status = (isset($_GET['adminview']) and $_GET['adminview'] === 'upcoming'); + } + + /** + * Initialize admin upcoming feature + * @author Webnus + */ + public function init() + { + // Temporary + return; + + // Disabled? + if(!isset($this->settings['admin_upcoming_events']) || !$this->settings['admin_upcoming_events']) return; + + // Admin Upcoming List + $this->factory->action('admin_head-edit.php', array($this, 'output')); + + // Assets + if($this->status) $this->factory->action('admin_enqueue_scripts', array($this, 'assets'), 0); + + // Download Bookings + if(isset($_GET['mec-dl-bookings']) && $_GET['mec-dl-bookings']) $this->factory->action('init', [$this, 'download_bookings']); + } + + public function output() + { + global $current_screen; + + // Add it only on Event Page + if('mec-events' != $current_screen->post_type) return; + + if($this->status) + { + $HTML = $this->getRender()->vlist([ + 'sk-options' => ['list' => [ + 'style' => 'admin', + 'month_divider' => 0, + 'include_events_times' => 1, + 'pagination' => 'loadmore', + ]] + ]); + + $this->factory->params('footer', function() use($HTML) + { + ?> + + factory->params('footer', function() + { + ?> + + main->asset('js/admin-upcoming.js'), array('jquery'), $this->main->get_version()); + + // Style + wp_enqueue_style('mec-admin-upcoming', $this->main->asset('css/admin-upcoming.min.css'), array('mec-backend-style'), $this->main->get_version()); + } + + public function download_bookings() + { + // Not logged in? + if(!get_current_user_id()) return; + + // Check Capability + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_bookings'); + if(!current_user_can($capability)) return; + + $event_id = $_GET['event_id'] ?? 0; + $occurrence = $_GET['occurrence'] ?? 0; + + // Invalid Data + if(!$event_id or !$occurrence) return; + + // Bookings + $bookings = $this->main->get_bookings_by_event_occurrence($event_id, $occurrence); + + // No booking + if(!count($bookings)) return; + + $booking_ids = []; + foreach($bookings as $booking) $booking_ids[] = $booking->ID; + + $filename = 'bookings-' . md5(time() . mt_rand(100, 999)) . '.csv'; + + $book = new MEC_feature_books(); + $rows = $book->csvexcel($booking_ids); + + $this->main->generate_download_csv($rows, $filename); + + exit; + } +} \ No newline at end of file diff --git a/app/features/archive.php b/app/features/archive.php new file mode 100755 index 0000000..6ad000b --- /dev/null +++ b/app/features/archive.php @@ -0,0 +1,49 @@ + + */ +class MEC_feature_archive extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } + + /** + * Initialize search feature + * @author Webnus + */ + public function init() + { + // Main + $main = $this->getMain(); + + // Settings + $settings = $main->get_settings(); + + // Sidebar Status + $sidebar_status = (boolean) ($settings['archive_sidebar'] ?? 0); + + if($sidebar_status) + { + add_action( 'widgets_init', function() + { + register_sidebar([ + 'name' => __( 'MEC Archive', 'modern-events-calendar-lite'), + 'id' => 'mec-archive', + 'description' => __('Widgets in this area will be shown on archive pages.', 'modern-events-calendar-lite'), + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + ]); + }); + } + } +} \ No newline at end of file diff --git a/app/features/autoemails.php b/app/features/autoemails.php new file mode 100755 index 0000000..aa906ea --- /dev/null +++ b/app/features/autoemails.php @@ -0,0 +1,162 @@ + + */ +class MEC_feature_autoemails extends MEC_base +{ + public $factory; + public $main; + public $PT; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Email Post Type Name + $this->PT = $this->main->get_email_post_type(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize Auto Email feature + * @author Webnus + */ + public function init() + { + // PRO Version is required + if(!$this->getPRO()) return false; + + // Show Auto Email feature only if module is enabled + if(!isset($this->settings['auto_emails_module_status']) or (isset($this->settings['auto_emails_module_status']) and !$this->settings['auto_emails_module_status'])) return false; + + $this->factory->action('init', array($this, 'register_post_type')); + $this->factory->action('save_post', array($this, 'save_email'), 10); + $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes'), 1); + + return true; + } + + /** + * Registers email post type + * @author Webnus + */ + public function register_post_type() + { + $singular_label = esc_html__('Email', 'modern-events-calendar-lite'); + $plural_label = esc_html__('Emails', 'modern-events-calendar-lite'); + + $capability = 'manage_options'; + register_post_type($this->PT, + array( + 'labels'=>array + ( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'add_new'=>sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'not_found'=>sprintf(esc_html__('No %s found!', 'modern-events-calendar-lite'), strtolower($plural_label)), + 'all_items'=>$plural_label, + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found_in_trash'=>sprintf(esc_html__('No %s found in Trash!', 'modern-events-calendar-lite'), strtolower($singular_label)) + ), + 'public'=>false, + 'show_ui'=>(current_user_can($capability) ? true : false), + 'show_in_menu'=>false, + 'show_in_admin_bar'=>false, + 'show_in_nav_menus'=>false, + 'has_archive'=>false, + 'exclude_from_search'=>true, + 'publicly_queryable'=>false, + 'supports'=>array('title', 'editor'), + 'capabilities'=>array + ( + 'read'=>$capability, + 'read_post'=>$capability, + 'read_private_posts'=>$capability, + 'create_post'=>$capability, + 'create_posts'=>$capability, + 'edit_post'=>$capability, + 'edit_posts'=>$capability, + 'edit_private_posts'=>$capability, + 'edit_published_posts'=>$capability, + 'edit_others_posts'=>$capability, + 'publish_posts'=>$capability, + 'delete_post'=>$capability, + 'delete_posts'=>$capability, + 'delete_private_posts'=>$capability, + 'delete_published_posts'=>$capability, + 'delete_others_posts'=>$capability, + ), + ) + ); + } + + /** + * Registers meta boxes + * @author Webnus + */ + public function register_meta_boxes() + { + add_meta_box('mec_email_metabox_details', esc_html__('Details', 'modern-events-calendar-lite'), array($this, 'meta_box_details'), $this->PT, 'normal', 'high'); + } + + public function meta_box_details($post) + { + $path = MEC::import('app.features.emails.details', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Save email data from backend + * @author Webnus + * @param int $post_id + * @return void + */ + public function save_email($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_email_nonce'])) return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_email_nonce']), 'mec_email_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + // MEC Data + $mec = (isset($_POST['mec']) and is_array($_POST['mec'])) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + // All Options + update_post_meta($post_id, 'mec', $mec); + + update_post_meta($post_id, 'mec_time', (isset($mec['time']) ? sanitize_text_field($mec['time']) : 1)); + update_post_meta($post_id, 'mec_type', (isset($mec['type']) ? sanitize_text_field($mec['type']) : 'day')); + update_post_meta($post_id, 'mec_afterbefore', (isset($mec['afterbefore']) ? sanitize_text_field($mec['afterbefore']) : 'before')); + + $events = (isset($mec['events']) and is_array($mec['events']) and count($mec['events'])) ? array_map('sanitize_text_field', wp_unslash($mec['events'])) : []; + + $all = (isset($mec['all']) ? sanitize_text_field($mec['all']) : 1); + if($all) $events = []; + + update_post_meta($post_id, 'mec_all', $all); + update_post_meta($post_id, 'mec_events', $events); + } +} \ No newline at end of file diff --git a/app/features/booking/calendar_novel.php b/app/features/booking/calendar_novel.php new file mode 100755 index 0000000..33114cb --- /dev/null +++ b/app/features/booking/calendar_novel.php @@ -0,0 +1,198 @@ +dates ?? array($event->date); + +// Multiple Day Event +$multiple_date = (isset($dates) && $dates[0]['start']['date'] != $dates[0]['end']['date']) ? 'mec-multiple-event' : ''; + +$first_date = ($start ?? (isset($dates[0]) ? $dates[0]['start']['date'] : NULL)); +if(!$first_date) return; + +$selected_datetime = ($selected_datetime ?? $this->book->timestamp($dates[0]['start'], $dates[0]['end'])); + +// Settings +$settings = $this->main->get_settings(); +$ml_settings = $this->main->get_ml_settings(); + +// Is Booking Enabled for Ongoing Events +$booking_ongoing = (isset($settings['booking_ongoing']) and $settings['booking_ongoing']); + +// Options +$event_color = $this->main->get_event_color_dot($event); +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$date_format = (isset($ml_settings['booking_date_format1']) and trim($ml_settings['booking_date_format1'])) ? $ml_settings['booking_date_format1'] : 'Y-m-d'; +$date_format = trim(str_replace(['H', 'h', 'i', 's', 'A', 'a', 'G', 'g', 'B', 'u', 'v', ':'], '', $date_format), ': '); +$time_format = get_option('time_format'); + +// before/after Month +$_1month_before = strtotime('first day of -1 month', strtotime($first_date)); +$_1month_after = strtotime('first day of +1 month', strtotime($first_date)); +$current_month_time = strtotime($first_date); + +$year = date('Y', strtotime($first_date)); +$month = date('m', strtotime($first_date)); +$active_day = date('d', strtotime($first_date)); + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} + +$navigator_html = ''; + +// Show previous navigation +if(strtotime(date('Y-m-t', $_1month_before)) >= time()) +{ + $navigator_html .= ''; +} + +$navigator_html .= '

    '.esc_html($this->main->date_i18n('F Y', $current_month_time)).'

    '; + +// Show next navigation +if(strtotime(date('Y-m-01', $_1month_after)) >= time()) +{ + $navigator_html .= ''; +} + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +echo MEC_kses::full($javascript); +?> +
    +
    +
    + main->get_weekday_abbr_labels(); + echo '
    '.implode('
    ', $headings).'
    '; + ?> +
    + '.($days_in_previous_month - ($running_day-1-$x)).''; + $days_in_this_week++; + } + + // keep going with days .... + for($list_day = 1; $list_day <= $days_in_month; $list_day++) + { + $time = strtotime($year.'-'.$month.'-'.$list_day); + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + + $render = ''; + $first_day = ''; + $default_day = ''; + $middle_day = ''; + $last_day = ''; + $repeat = 0; + $is_soldout = true; + + foreach($dates as $date) + { + if(!isset($date['fake']) and strtotime($date['start']['date']) <= $time and $time <= strtotime($date['end']['date']) and ($booking_ongoing or (isset($date['start']['timestamp']) and $date['start']['timestamp'] >= current_time('timestamp', 0)))) + { + $repeat++; + $date_timestamp = $this->book->timestamp($date['start'], $date['end']); + $start_datetime = $date['start']['date'].' '.sprintf("%02d", $date['start']['hour']).':'.sprintf("%02d", $date['start']['minutes']).' '.$date['start']['ampm']; + $date_timestamp_ex = explode(':', $date_timestamp); + + $soldout = $this->main->is_soldout($event->ID, $start_datetime); + if($is_soldout and !$soldout) $is_soldout = false; + + $render .='
    ' .(($date['start']['date'] !== $date['end']['date']) ? '
    '.strip_tags($this->main->date_label($date['start'], $date['end'], $date_format, ' - ', false, (isset($date['allday']) ? $date['allday'] : 0), $event)).'
    ' : ($allday != 0 ? esc_html__('All Day' , 'modern-events-calendar-lite') : '')).strip_tags($this->main->date_label($date['start'], $date['end'], $time_format, ' - ', false, (isset($date['allday']) ? $date['allday'] : 0))).(($date['start']['date'] !== $date['end']['date']) ? '
    ' : '') .'
    '; + $first_day = strtotime($date['start']['date']) == $time ? ' first-day' : null; + $middle_day = (strtotime($date['end']['date']) != $time && strtotime($date['start']['date']) != $time) ? ' middle-day' : null; + $last_day = strtotime($date['end']['date']) == $time ? ' last-day' : null; + $default_day = strtotime($first_date) == $time ? ' mec-active' : null; + } + } + + if($repeat == 1) $date_timestamp_ex = explode(':', $date_timestamp); + + $repeat_class = $repeat > 1 ? ' mec-has-time-repeat' : ''; + $date_for_wrap = $repeat == 1 ? 'data-timestamp="'.esc_attr($date_timestamp).'" data-formatted-date="'.esc_attr($this->main->date_i18n($date_format, $date_timestamp_ex[0])).'"' : ''; + $custom_class1 = $repeat == 1 ? ' mec-has-one-repeat-in-day' : ''; + $custom_class2 = $repeat >= 1 ? ' mec-has-event-for-booking' : ''; + $soldout_class = ($is_soldout ? ' mec-booking-calendar-date-soldout' : ''); + + echo '
    '.$list_day.'
    '; + echo '
    '.MEC_kses::full($render).'
    '; + echo '
    '; + + if($running_day == 6) + { + echo '
    '; + + if((($day_counter+1) != $days_in_month) or (($day_counter+1) == $days_in_month and $days_in_this_week == 7)) + { + echo '
    '; + } + + $running_day = -1; + $days_in_this_week = 0; + } + + $days_in_this_week++; $running_day++; $day_counter++; + } + + // finish the rest of the days in the week + if($days_in_this_week < 8) + { + for($x = 1; $x <= (8 - $days_in_this_week); $x++) + { + echo '
    '.esc_html($x).'
    '; + } + } + ?> +
    +
    +
    +
    \ No newline at end of file diff --git a/app/features/booking/variations.php b/app/features/booking/variations.php new file mode 100755 index 0000000..ca534b6 --- /dev/null +++ b/app/features/booking/variations.php @@ -0,0 +1,23 @@ +main->ticket_variations($event_id); + +// No Variations +if(!is_array($variations) || !count($variations)) return ''; +?> +
    +
      + +
    • +
      +

      main->render_price($variation['price'], $event_id); ?>

      +
    • + +
    +
    \ No newline at end of file diff --git a/app/features/bookingcalendar.php b/app/features/bookingcalendar.php new file mode 100755 index 0000000..f0cd8da --- /dev/null +++ b/app/features/bookingcalendar.php @@ -0,0 +1,138 @@ + + */ +class MEC_feature_bookingcalendar extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_book + */ + public $book; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Factory + $this->factory = $this->getFactory(); + + // MEC Main + $this->main = $this->getMain(); + + // MEC Book + $this->book = $this->getBook(); + } + + /** + * Initialize User Events Feature + * @author Webnus + */ + public function init() + { + $this->factory->action('wp_ajax_mec_booking_calendar_load_month', array($this, 'load_month')); + $this->factory->action('wp_ajax_nopriv_mec_booking_calendar_load_month', array($this, 'load_month')); + } + + public function display_calendar($event, $uniqueid, $start = NULL, $selected_datetime = NULL) + { + $path = MEC::import('app.features.booking.calendar_novel', true, true); + + // Generate Month + ob_start(); + include $path; + return ob_get_clean(); + } + + /** + * Load month for AJAX request + * @author Webnus + * @return void + */ + public function load_month() + { + // Render + $render = $this->getRender(); + + $event_id = isset($_REQUEST['event_id']) ? sanitize_text_field($_REQUEST['event_id']) : NULL; + $uniqueid = isset($_REQUEST['uniqueid']) ? sanitize_text_field($_REQUEST['uniqueid']) : NULL; + $year = isset($_REQUEST['year']) ? sanitize_text_field($_REQUEST['year']) : NULL; + $month = isset($_REQUEST['month']) ? sanitize_text_field($_REQUEST['month']) : NULL; + + // Start Date + $start = $year.'-'.$month.'-01'; + if(strtotime($start) < current_time('timestamp')) $start = current_time('Y-m-d'); + + // End Date + $end = date('Y-m-t', strtotime($start)); + + $rendered = $render->data($event_id, ''); + + $data = new stdClass(); + $data->ID = $event_id; + $data->data = $rendered; + + // Get Event Dates + $records = $this->getDB()->select("SELECT * FROM `#__mec_dates` WHERE `post_id`='".$event_id."' AND ((`dstart` <= '".$start."' AND `dend` >= '".$end."') OR (`dstart` <= '".$start."' AND `dend` >= '".$start."' AND `dend` <= '".$end."') OR (`dstart` >= '".$start."' AND `dend` <= '".$end."') OR (`dstart` >= '".$start."' AND `dstart` <= '".$end."' AND `dend` >= '".$end."'))", 'loadAssocList'); + + $dates = []; + foreach($records as $record) + { + $dates[] = array( + 'start' => array( + 'date' => $record['dstart'], + 'hour' => date('g', $record['tstart']), + 'minutes' => date('i', $record['tstart']), + 'ampm' => date('A', $record['tstart']), + 'timestamp' => $record['tstart'], + ), + 'end' => array( + 'date' => $record['dend'], + 'hour' => date('g', $record['tend']), + 'minutes' => date('i', $record['tend']), + 'ampm' => date('A', $record['tend']), + 'timestamp' => $record['tend'], + ), + 'allday' => ((isset($data->data->meta) and isset($data->data->meta->mec_allday)) ? $data->data->meta->mec_allday : 0), + 'hide_time' => ((isset($data->data->meta) and isset($data->data->meta->mec_hide_time)) ? $data->data->meta->mec_hide_time : 0), + 'past' => $this->main->is_past($record['dstart'], $start), + ); + } + + if(!count($dates)) + { + $dates = array( + array( + 'fake' => true, + 'start' => array( + 'date' => $start + ), + 'end' => array( + 'date' => $start + ), + ) + ); + } + + $data->dates = $dates; + $data->date = isset($data->dates[0]) ? $data->dates[0] : []; + + echo json_encode(array('html' => $this->display_calendar($data, $uniqueid, $start))); + exit; + } +} \ No newline at end of file diff --git a/app/features/cart.php b/app/features/cart.php new file mode 100755 index 0000000..b3732b1 --- /dev/null +++ b/app/features/cart.php @@ -0,0 +1,192 @@ + + */ +class MEC_feature_cart extends MEC_base +{ + public $factory; + public $main; + public $cart; + public $book; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Import MEC Cart + $this->cart = $this->getCart(); + + // Import MEC Booking + $this->book = $this->getBook(); + } + + /** + * Initialize Cart Feature + * @author Webnus + */ + public function init() + { + // Cart Status + $cart_status = (isset($this->settings['mec_cart_status']) and $this->settings['mec_cart_status']) ? true : false; + + // Feature is not enabled + if(!$cart_status) return; + + // Shortcodes + $this->factory->shortcode('mec-cart', array($this, 'cart')); + $this->factory->shortcode('mec-checkout', array($this, 'checkout')); + + // Remove Transaction from Cart + $this->factory->action('wp_ajax_mec_cart_remove_transaction', array($this, 'remove')); + $this->factory->action('wp_ajax_nopriv_mec_cart_remove_transaction', array($this, 'remove')); + + // Apply Coupon + $this->factory->action('wp_ajax_mec_cart_coupon', array($this, 'coupon')); + $this->factory->action('wp_ajax_nopriv_mec_cart_coupon', array($this, 'coupon')); + + // Free Checkout + $this->factory->action('wp_ajax_mec_do_cart_free', array($this, 'free')); + $this->factory->action('wp_ajax_nopriv_mec_do_cart_free', array($this, 'free')); + } + + public function cart($atts) + { + $path = MEC::import('app.features.cart.cart', true, true); + + ob_start(); + include $path; + return $output = ob_get_clean(); + } + + public function checkout($atts) + { + $path = MEC::import('app.features.cart.checkout', true, true); + + ob_start(); + include $path; + return $output = ob_get_clean(); + } + + public function remove() + { + $transaction_id = isset($_REQUEST['transaction_id']) ? sanitize_text_field($_REQUEST['transaction_id']) : NULL; + + $cart_id = $this->cart->get_cart_id(); + $cart = $this->cart->get_cart($cart_id); + + // Validation + if(!in_array($transaction_id, $cart)) wp_send_json(array('success' => 0, 'message' => esc_html__('Transaction does not exists in cart.', 'modern-events-calendar-lite'))); + + // Remove + $this->cart->remove($transaction_id); + + // Updated Cart + $updated_cart = $this->cart->get_cart($cart_id); + + // Total + $total = 0; + foreach($updated_cart as $t_id) + { + $TO = $this->book->get_TO($t_id); + $total += $TO->get_payable(); + } + + // Response + wp_send_json(array( + 'success' => 1, + 'total' => $this->main->render_price($total), + 'message' => esc_html__('Successfully removed and updated the cart.', 'modern-events-calendar-lite'), + )); + } + + public function coupon() + { + $coupon = isset($_REQUEST['coupon']) ? sanitize_text_field($_REQUEST['coupon']) : NULL; + + $cart_id = $this->cart->get_cart_id(); + $cart = $this->cart->get_cart($cart_id); + + $applied = false; + foreach($cart as $transaction_id) + { + $TO = $this->book->get_TO($transaction_id); + + // Free Transaction + if($TO->is_free()) continue; + + $validity = $this->book->coupon_check_validity($coupon, $TO->get_event_id(), $TO->get_array()); + if($validity == 1) + { + $applied = true; + $this->book->coupon_apply($coupon, $transaction_id); + } + } + + // Response + if($applied) + { + wp_send_json(array( + 'success' => 1, + 'message' => esc_html__('Coupon applied successfully. Please wait ...', 'modern-events-calendar-lite'), + )); + } + else + { + wp_send_json(array( + 'success' => 0, + 'message' => esc_html__('Coupon was not valid or applicable.', 'modern-events-calendar-lite'), + )); + } + } + + public function free() + { + $cart_id = isset($_POST['cart_id']) ? sanitize_text_field($_POST['cart_id']) : ''; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_cart_form_' . $cart_id)) + { + wp_send_json(array( + 'success' => 0, + 'code' => 'NONCE_IS_INVALID', + 'message' => esc_html__('Request is invalid!', 'modern-events-calendar-lite'), + )); + } + + $cart = $this->cart->get_cart($cart_id); + if(!$this->cart->is_free($cart)) + { + wp_send_json(array( + 'success' => 0, + 'code' => 'NOT_FREE', + 'message' => esc_html__('Your cart is not free!', 'modern-events-calendar-lite'), + )); + } + + $free_gateway = new MEC_gateway_free(); + $results = $free_gateway->cart_do_transaction($cart_id); + + $results['output'] = '

    ' . esc_html__('Thanks for your booking.', 'modern-events-calendar-lite') . '

    +
    +
    ' . MEC_kses::element($results['message']) . '
    +
    '; + + wp_send_json($results); + } +} \ No newline at end of file diff --git a/app/features/cart/cart.php b/app/features/cart/cart.php new file mode 100755 index 0000000..d41d1c4 --- /dev/null +++ b/app/features/cart/cart.php @@ -0,0 +1,95 @@ +cart->get_cart_id(); +$cart = $this->cart->get_cart($cart_id); + +// Javascript Code +$javascript = ''; + +// Include javascript code into the footer +$this->factory->params('footer', $javascript); + +// Events Archive +$archive_url = $this->main->get_archive_url(); +?> +
    + +
    +

    + +
    + +
    + +
    + + + + + + + + + + + + + + + book->get_TO($transaction_id); ?> + + + + + + + + + + + + + + + + +
    + + get_coupon() ? '
    '.esc_html($TO->get_coupon()).'' : ''); ?> +
    get_event_featured_image()); ?>get_event_link()); ?>get_tickets_html()); ?>get_dates_html()); ?> + get_price_html()); ?> +
    get_price_details_html()); ?>
    +
    main->render_price($this->cart->get_payable($cart))); ?>
    +
    + + settings['coupons_status']) and $this->settings['coupons_status']): ?> +
    +
    + + +
    +
    +
    + + + settings['checkout_page']) and $this->settings['checkout_page']): ?> +
    + +
    + +
    + + +
    \ No newline at end of file diff --git a/app/features/cart/checkout.php b/app/features/cart/checkout.php new file mode 100755 index 0000000..6751d57 --- /dev/null +++ b/app/features/cart/checkout.php @@ -0,0 +1,164 @@ +cart->get_cart_id(); +$cart = $this->cart->get_cart($cart_id); + +$empty = (count($cart) ? false : true); +$free = $this->cart->is_free($cart); + +$gateways = $this->main->get_gateways(); +$gateway_settings = $this->main->get_gateways_options(); + +$fees_disabled_gateways = isset( $this->settings['fees_disabled_gateways'] ) && is_array( $this->settings['fees_disabled_gateways'] ) ? $this->settings['fees_disabled_gateways'] : []; +$total_fees_prices_for_disabled_gateways = []; + +$active_gateways = []; +foreach($gateways as $gateway) +{ + if(!$gateway->enabled()) continue; + if(in_array($gateway->id, array(6, 7))) continue; // Stripe Connect & Pay By WooCommerce + + $active_gateways[] = $gateway; +} + +// Javascript Code +$javascript = ''; + +// Redirect Cart ID +$redirect_cart_id = isset($_REQUEST['mec_stripe_redirect_cart_id']) ? $_REQUEST['mec_stripe_redirect_cart_id'] : ''; + +$redirect_message = ''; +if(trim($redirect_cart_id)) +{ + $redirect_message = get_option('mec_cart_'.$redirect_cart_id.'_message', ''); + delete_option('mec_cart_'.$redirect_cart_id.'_message'); +} + +// Include javascript code into the footer +$this->factory->params('footer', $javascript); +?> +
    +
    +
    + + +
    +
    +
    + + + +

    + + id ] = 0; + ?> +
    +
      + book->get_TO($transaction_id); $price_details = $TO->get_price_details(); ?> + id; ?> +
    • + $detail){ + + if( 'fee' === $detail['type'] ){ + + $ticket_price -= $detail['amount']; + $total_fees_prices_for_disabled_gateways[ $gateway->id ] += $detail['amount']; + unset( $price_details['details'][ $k ] ); + } + } + } + ?> +

      get_event_link()); ?> (main->render_price( $ticket_price > 0 ? $ticket_price : 0 , $TO->get_event_id())); ?>)

      +
      get_tickets_html()); ?>
      +
        + +
      • + + main->render_price($detail['amount'], $TO->get_event_id())); ?> +
      • + +
      + +
    • + +
    +
    + + + + +
    +
    \ No newline at end of file diff --git a/app/features/cart/index.html b/app/features/cart/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/certificates.php b/app/features/certificates.php new file mode 100755 index 0000000..463d5e1 --- /dev/null +++ b/app/features/certificates.php @@ -0,0 +1,310 @@ + + */ +class MEC_feature_certificates extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize Auto Email feature + * @author Webnus + */ + public function init() + { + // PRO Version is required + if(!$this->getPRO()) return false; + + // Show certificate feature only if module is enabled + if(!isset($this->settings['certificate_status']) || !$this->settings['certificate_status']) return false; + + $this->factory->action('init', [$this, 'register_post_type']); + $this->factory->filter('template_include', [$this, 'include_cert_template']); + + $this->factory->shortcode('mec_cert_event_title', [$this, 'shortcode_event_title']); + $this->factory->shortcode('mec_cert_event_date', [$this, 'shortcode_event_date']); + $this->factory->shortcode('mec_cert_attendee_name', [$this, 'shortcode_attendee_name']); + $this->factory->shortcode('mec_cert_attendee_id', [$this, 'shortcode_attendee_id']); + $this->factory->shortcode('mec_cert_transaction_id', [$this, 'shortcode_transaction_id']); + $this->factory->shortcode('mec_cert_ticket_id', [$this, 'shortcode_ticket_id']); + $this->factory->shortcode('mec_cert_ticket_name', [$this, 'shortcode_ticket_name']); + + $this->factory->action('wp_ajax_mec_send_certificates', [$this, 'send_certificates']); + + return true; + } + + /** + * Registers certificate post type + * @author Webnus + */ + public function register_post_type() + { + $singular_label = esc_html__('Certificate', 'modern-events-calendar-lite'); + $plural_label = esc_html__('Certificates', 'modern-events-calendar-lite'); + + $capability = 'manage_options'; + register_post_type($this->main->get_certificate_post_type(), array( + 'labels' => array( + 'name' => $plural_label, + 'singular_name' => $singular_label, + 'add_new' => sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item' => sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'not_found' => sprintf(esc_html__('No %s found!', 'modern-events-calendar-lite'), strtolower($plural_label)), + 'all_items' => $plural_label, + 'edit_item' => sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found_in_trash' => sprintf(esc_html__('No %s found in Trash!', 'modern-events-calendar-lite'), strtolower($singular_label)) + ), + 'public' => true, + 'show_ui'=> current_user_can($capability), + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'show_in_nav_menus' => false, + 'has_archive' => false, + 'exclude_from_search' => true, + 'publicly_queryable' => true, + 'supports' => array('title', 'editor'), + 'capabilities' => array( + 'read' => $capability, + 'read_post' => $capability, + 'read_private_posts' => $capability, + 'create_post' => $capability, + 'create_posts' => $capability, + 'edit_post' => $capability, + 'edit_posts' => $capability, + 'edit_private_posts' => $capability, + 'edit_published_posts' => $capability, + 'edit_others_posts' => $capability, + 'publish_posts' => $capability, + 'delete_post' => $capability, + 'delete_posts' => $capability, + 'delete_private_posts' => $capability, + 'delete_published_posts' => $capability, + 'delete_others_posts' => $capability, + ), + )); + } + + /** + * @param $template + * @return mixed|string + */ + public function include_cert_template($template) + { + // Get global post + global $post; + + // Certificate Post + if($post && isset($post->post_type) && $post->post_type === $this->main->get_certificate_post_type()) + { + $template = $this->main->get_plugin_path().'app'.DS.'features'.DS.'certificates'.DS.'template.php'; + } + + return $template; + } + + /** + * @return array + */ + private function get_request() + { + $ex = explode('-', $_GET['key'] ?? ''); // [attendee_id]-[mec-booking-id]-[transaction-id]-[ticket-id] + + return [ + $ex[0] ?? null, + $ex[1] ?? null, + $ex[2] ?? null, + $ex[3] ?? null + ]; + } + + /** + * @return array|WP_Post|null + */ + private function get_requested_event() + { + $booking = $this->get_requested_booking(); + + return get_post($booking->event_id); + } + + /** + * @return mixed + */ + private function get_requested_booking() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + return $this->getDB()->select("SELECT * FROM `#__mec_bookings` WHERE `id`='".esc_sql($mec_booking_id)."'", 'loadObject'); + } + + /** + * @return mixed + */ + private function get_requested_attendee() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + return $this->getDB()->select("SELECT * FROM `#__mec_booking_attendees` WHERE `id`='".esc_sql($attendee_id)."'", 'loadObject'); + } + + /** + * @return string + */ + public function shortcode_event_title() + { + $event = $this->get_requested_event(); + + return $event ? $event->post_title : 'N/A'; + } + + /** + * @return string + */ + public function shortcode_event_date() + { + $booking = $this->get_requested_booking(); + $date_format = get_option('date_format'); + + return $booking ? (string) wp_date($date_format, strtotime($booking->date)) : 'N/A'; + } + + /** + * @return mixed + */ + public function shortcode_attendee_id() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + return $attendee_id; + } + + /** + * @return string + */ + public function shortcode_attendee_name() + { + $attendee = $this->get_requested_attendee(); + if($attendee) + { + $user = $this->getUser()->get($attendee->user_id); + return $user->first_name . ' ' . $user->last_name; + } + + return 'N/A'; + } + + /** + * @return mixed + */ + public function shortcode_transaction_id() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + return $transaction_id; + } + + /** + * @return mixed + */ + public function shortcode_ticket_id() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + return $ticket_id; + } + + /** + * @return mixed + */ + public function shortcode_ticket_name() + { + list( + $attendee_id, + $mec_booking_id, + $transaction_id, + $ticket_id + ) = $this->get_request(); + + $event = $this->get_requested_event(); + + $event_tickets = get_post_meta($event->ID, 'mec_tickets', true); + if(!is_array($event_tickets)) $event_tickets = []; + + return isset($event_tickets[$ticket_id]) ? $event_tickets[$ticket_id]['name'] : 'N/A'; + } + + public function send_certificates() + { + // Current User is not Permitted + if(!current_user_can('manage_options')) $this->main->response(['success' => 0, 'code' => 'NO_ACCESS']); + + $template = isset($_POST['template']) ? sanitize_text_field($_POST['template']) : 0; + $attendee_ids = isset($_POST['attendee_ids']) ? sanitize_text_field($_POST['attendee_ids']) : NULL; + $attendee_ids = trim($attendee_ids, ', '); + + $attendees = explode(',', $attendee_ids); + + // Invalid Request + if(!count($attendees) || !trim($template)) $this->main->response(['success' => 0, 'code' => 'INVALID_REQUEST']); + + // Notifications + $notifications = $this->getNotifications(); + + // Send Certificates + foreach($attendees as $attendee) + { + $notifications->certificate_send($attendee, $template); + } + + echo json_encode(['success' => 1, 'message' => esc_html__('Certificates sent successfully.', 'modern-events-calendar-lite')]); + exit; + } +} \ No newline at end of file diff --git a/app/features/certificates/template.php b/app/features/certificates/template.php new file mode 100755 index 0000000..a79592d --- /dev/null +++ b/app/features/certificates/template.php @@ -0,0 +1,60 @@ + + + + + + + + <?php echo esc_html($post->post_title); ?> + + + + +
    +
    + +
    + + + diff --git a/app/features/colors.php b/app/features/colors.php new file mode 100755 index 0000000..f83376c --- /dev/null +++ b/app/features/colors.php @@ -0,0 +1,125 @@ + + */ +class MEC_feature_colors extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + } + + /** + * Initialize colors feature + * @author Webnus + */ + public function init() + { + $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes')); + $this->factory->action('save_post', array($this, 'save_event'), 3); + } + + /** + * Registers color meta box + * @author Webnus + */ + public function register_meta_boxes() + { + add_meta_box('mec_metabox_color', esc_html__('Event Color', 'modern-events-calendar-lite'), array($this, 'meta_box_colors'), $this->main->get_main_post_type(), 'side'); + } + + public function mec_hex2rgb($hex) + { + $hex = str_replace("#", "", $hex); + if(strlen($hex) == 3) + { + $r = hexdec(substr($hex,0,1).substr($hex,0,1)); + $g = hexdec(substr($hex,1,1).substr($hex,1,1)); + $b = hexdec(substr($hex,2,1).substr($hex,2,1)); + } + else + { + $r = hexdec(substr($hex,0,2)); + $g = hexdec(substr($hex,2,2)); + $b = hexdec(substr($hex,4,2)); + } + + return array($r, $g, $b); + } + + /** + * Show color meta box content + * @author Webnus + * @param object $post + */ + public function meta_box_colors($post) + { + $color = get_post_meta($post->ID, 'mec_color', true); + $available_colors = $this->main->get_available_colors(); + ?> +
    +
    + +
    +
    + + mec_hex2rgb('#'.$available_color); ?> + + '; ?> + + + +
    +
    + + * @param int $post_id + * @return void + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + $color = isset($_mec['color']) ? trim(sanitize_text_field($_mec['color']), '# ') : ''; + update_post_meta($post_id, 'mec_color', $color); + + // Add the new color to available colors + if(trim($color)) $this->main->add_to_available_colors($color); + } +} \ No newline at end of file diff --git a/app/features/compatibility.php b/app/features/compatibility.php new file mode 100755 index 0000000..642ad19 --- /dev/null +++ b/app/features/compatibility.php @@ -0,0 +1,103 @@ + + */ +class MEC_feature_compatibility extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * To Override default HTML ID of MEC template files + * @var string + */ + public $html_id = ''; + + /** + * To add HTML Classes to MEC template files + * @var array + */ + public $html_class = []; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + } + + /** + * Initialize compatibility + * @author Webnus + */ + public function init() + { + // MEC Filters for changing HTML ID of MEC Pages + $this->factory->filter('mec_archive_page_html_id', array($this, 'html_id')); + $this->factory->filter('mec_category_page_html_id', array($this, 'html_id')); + $this->factory->filter('mec_single_page_html_id', array($this, 'html_id')); + + // MEC Filters for changing HTML class of MEC Pages + $this->factory->filter('mec_archive_page_html_class', array($this, 'html_class')); + $this->factory->filter('mec_category_page_html_class', array($this, 'html_class')); + $this->factory->filter('mec_single_page_html_class', array($this, 'html_class')); + + // Make MEC compatible with themes and child themes + $this->factory->action('init', array($this, 'make_it_compatible')); + } + + /** + * Make MEC compatible by adding/changing HTML Classes/IDs + * @author Webnus + */ + public function make_it_compatible() + { + $template = get_template(); + + if($template == 'logitrans') + { + $this->html_class = ['wrapper']; + } + } + + /** + * Return HTML ID of MEC Pages + * @author Webnus + * @param string $id + * @return string + */ + public function html_id($id) + { + if(trim($this->html_id)) return $this->html_id; + else return $id; + } + + /** + * Return HTML Class of MEC Pages + * @author Webnus + * @param string $class + * @return string + */ + public function html_class($class) + { + if(is_array($this->html_class) and count($this->html_class)) return $class.' '.implode(' ', $this->html_class); + else return $class; + } +} \ No newline at end of file diff --git a/app/features/contextual.php b/app/features/contextual.php new file mode 100755 index 0000000..944b89e --- /dev/null +++ b/app/features/contextual.php @@ -0,0 +1,345 @@ + + */ +class MEC_feature_contextual extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + public $settings; + + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC Factory + $this->factory = $this->getFactory(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize the auto update class + * @author Webnus + */ + public function init() + { + // updating checking + //$this->factory->filter('contextual_help', array($this, 'contextual'), 10, 2); + } + + public function contextual( $contextual_help, $screen_id) + { + $screen = get_current_screen(); + switch($screen_id) + { + case 'm-e-calendar_page_MEC-settings': + + // To add a whole tab group + $screen->add_help_tab(array + ( + 'id' => 'mec-settings', + 'title' => esc_html__('Settings', 'modern-events-calendar-lite'), + 'callback' => array($this, 'settings') + )); + + $screen->add_help_tab(array + ( + 'id' => 'mec-form', + 'title' => esc_html__('Booking Form', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Booking Form

    + Build your booking registration form (This form will be used for every attendee). ', 'modern-events-calendar-lite') + )); + + $screen->add_help_tab(array + ( + 'id' => 'mec-gateways', + 'title' => esc_html__('Payment Gateways', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Payment Gateways

    ', 'modern-events-calendar-lite') + )); + + $screen->add_help_tab(array + ( + 'id' => 'mec-notifications', + 'title' => esc_html__('Notifications', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Notifications

    You can edit your messages in there.MEC Notificatoin Module', 'modern-events-calendar-lite') + )); + + break; + + case 'm-e-calendar_page_MEC-ix': + + $screen->add_help_tab(array + ( + 'id' => 'mec-importexport', + 'title' => esc_html__('Google Cal. Import', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Import/Export

    Google Cal. Import:
    ', 'modern-events-calendar-lite') + )); + + $screen->add_help_tab(array + ( + 'id' => 'mec-importexportg', + 'title' => esc_html__('Google Cal. Export', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Import/Export

    Google Cal. Export:
    ', 'modern-events-calendar-lite') + )); + + $screen->add_help_tab(array + ( + 'id' => 'mec-importexportf', + 'title' => esc_html__('Facebook Cal. Import', 'modern-events-calendar-lite'), + 'content' => esc_html__('

    Import/Export

    Facebook Cal. Import:
    ', 'modern-events-calendar-lite') + )); + + break; + } + + return $contextual_help; + } + + public function settings() + { + ?> +
    +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    + +
      +
    • + +
    +
    + + */ +class MEC_feature_dc extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize admin calendar feature + * @author Webnus + */ + public function init() + { + // Dynamic Content Shortcode + $this->factory->shortcode('MEC_dc', array($this, 'output')); + } + + public function output($atts = array()) + { + $event_id = $atts['event'] ?? NULL; + + if(!$event_id) $event_id = $atts['id'] ?? NULL; + if(!$event_id) + { + global $post; + if($post->post_type === $this->main->get_main_post_type()) $event_id = $post->ID; + } + + // Key + $key = $atts['key'] ?? NULL; + + // Invalid Data + if(!$event_id || !$key) return ''; + + $post = get_post($event_id); + + // Invalid Post + if($post->post_type !== $this->main->get_main_post_type()) return ''; + + // Event + if(isset($GLOBALS['mec-event'])) $event = $GLOBALS['mec-event']; + else + { + $events = (new MEC_skin_single())->get_event_mec($event_id); + $event = current($events); + } + + return $this->render($event, $key); + } + + public function render($event, $key) + { + $meta = $event->data->meta; + $date = $event->date; + + if($key === 'start_date') + { + $date_format = get_option('date_format'); + return $this->main->date_i18n($date_format, strtotime($meta['mec_start_datetime']), $event); + } + elseif($key === 'start_time') + { + $time_format = get_option('time_format'); + return $this->main->date_i18n($time_format, strtotime($meta['mec_start_datetime']), $event); + } + elseif($key === 'start_datetime') + { + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + return $this->main->date_i18n($datetime_format, strtotime($meta['mec_start_datetime']), $event); + } + elseif($key === 'end_date') + { + $date_format = get_option('date_format'); + return $this->main->date_i18n($date_format, strtotime($meta['mec_end_datetime']), $event); + } + elseif($key === 'end_time') + { + $time_format = get_option('time_format'); + return $this->main->date_i18n($time_format, strtotime($meta['mec_end_datetime']), $event); + } + elseif($key === 'end_datetime') + { + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + return $this->main->date_i18n($datetime_format, strtotime($meta['mec_end_datetime']), $event); + } + elseif($key === 'occurrence') + { + $date_format = get_option('date_format'); + $midnight_event = $this->main->is_midnight_event($event); + + if($midnight_event) return $this->main->dateify($event, $date_format); + else return $this->main->date_label($date['start'], $date['end'], $date_format, ' - ', true, 0, $event); + } + elseif($key === 'occurrence_start_date') + { + $date_format = get_option('date_format'); + return $this->main->date_i18n($date_format, $date['start']['timestamp'], $event); + } + elseif($key === 'occurrence_start_time') + { + $time_format = get_option('time_format'); + return $this->main->date_i18n($time_format, $date['start']['timestamp'], $event); + } + elseif($key === 'occurrence_start_datetime') + { + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + return $this->main->date_i18n($datetime_format, $date['start']['timestamp'], $event); + } + elseif($key === 'occurrence_end_date') + { + $date_format = get_option('date_format'); + return $this->main->date_i18n($date_format, $date['end']['timestamp'], $event); + } + elseif($key === 'occurrence_end_time') + { + $time_format = get_option('time_format'); + return $this->main->date_i18n($time_format, $date['end']['timestamp'], $event); + } + elseif($key === 'occurrence_end_datetime') + { + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + return $this->main->date_i18n($datetime_format, $date['end']['timestamp'], $event); + } + elseif($key === 'location_name') + { + $location_id = $this->main->get_master_location_id($event); + $location = get_term($location_id); + + return ($location and isset($location->name)) ? $location->name : ''; + } + elseif($key === 'location_address') + { + $location_id = $this->main->get_master_location_id($event); + return get_term_meta($location_id, 'address', true); + } + elseif($key === 'location_url') + { + $location_id = $this->main->get_master_location_id($event); + return get_term_meta($location_id, 'url', true); + } + elseif($key === 'organizer_name') + { + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = get_term($organizer_id); + + return ($organizer and isset($organizer->name)) ? $organizer->name : ''; + } + elseif($key === 'organizer_tel') + { + $organizer_id = $this->main->get_master_organizer_id($event); + return get_term_meta($organizer_id, 'tel', true); + } + elseif($key === 'organizer_email') + { + $organizer_id = $this->main->get_master_organizer_id($event); + return get_term_meta($organizer_id, 'email', true); + } + elseif($key === 'organizer_url') + { + $organizer_id = $this->main->get_master_organizer_id($event); + return get_term_meta($organizer_id, 'url', true); + } + elseif($key === 'cost') + { + return $this->main->get_event_cost($event); + } + elseif($key === 'more_info_url') + { + $more_info_url = (isset($event->data->meta['mec_more_info']) and trim($event->data->meta['mec_more_info']) and $event->data->meta['mec_more_info'] != 'http://') ? $event->data->meta['mec_more_info'] : ''; + if(isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $more_info_url = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'more_info', $more_info_url); + + return $more_info_url; + } + elseif($key === 'more_info_tag') + { + $more_info_url = (isset($event->data->meta['mec_more_info']) and trim($event->data->meta['mec_more_info']) and $event->data->meta['mec_more_info'] != 'http://') ? $event->data->meta['mec_more_info'] : ''; + if(isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $more_info_url = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'more_info', $more_info_url); + + $more_info_target = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'more_info_target', ($event->data->meta['mec_more_info_target'] ?? '_self')); + $more_info_title = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'more_info_title', ((isset($event->data->meta['mec_more_info_title']) and trim($event->data->meta['mec_more_info_title'])) ? $event->data->meta['mec_more_info_title'] : esc_html__('Read More', 'modern-events-calendar-lite'))); + + return ''.esc_html($more_info_title).''; + } + else return ''; + } +} \ No newline at end of file diff --git a/app/features/dlfile.php b/app/features/dlfile.php new file mode 100755 index 0000000..5d07bef --- /dev/null +++ b/app/features/dlfile.php @@ -0,0 +1,233 @@ + + */ +class MEC_feature_dlfile extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize locations feature + * @author Webnus + */ + public function init() + { + // Booking Status + $booking_status = isset($this->settings['booking_status']) && $this->settings['booking_status']; + + // Booking Download Status + $booking_download = (isset($this->settings['downloadable_file_status']) and $this->settings['downloadable_file_status']); + + // Public Download Module + $public_download_module = (isset($this->settings['public_download_module']) and $this->settings['public_download_module']); + + // Booking download is enabled + if($booking_status and $booking_download) + { + // Metabox + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_downloadable_file'), 17); + + // Downloadable File for FES + if(!isset($this->settings['fes_section_downloadable_file']) or (isset($this->settings['fes_section_downloadable_file']) and $this->settings['fes_section_downloadable_file'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_downloadable_file'), 47); + + // AJAX + $this->factory->action('wp_ajax_mec_downloadable_file_upload', array($this, 'upload')); + } + + // Public Download Module is enabled + if($public_download_module) + { + // Metabox + $this->factory->action('mec_metabox_details', array($this, 'meta_box_public_module'), 18); + + // Downloadable File for FES + if(!isset($this->settings['fes_section_public_download_module']) or (isset($this->settings['fes_section_public_download_module']) and $this->settings['fes_section_public_download_module'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_public_module'), 32); + + // AJAX + $this->factory->action('wp_ajax_mec_public_download_module_file_upload', array($this, 'public_download_module_upload')); + } + } + + /** + * Show downloadable file of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_downloadable_file($post){ + + FormBuilder::downloadable_file( $post ); + } + + public function upload() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_downloadable_file_upload')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $uploaded_file = $_FILES['file'] ?? NULL; + + // No file + if(!$uploaded_file) $this->main->response(array('success'=>0, 'code'=>'NO_FILE', 'message'=>esc_html__('Please upload a file.', 'modern-events-calendar-lite'))); + + $allowed = array('gif', 'jpeg', 'jpg', 'png', 'pdf', 'zip'); + + $ex = explode('.', $uploaded_file['name']); + $extension = end($ex); + + // Invalid Extension + if(!in_array($extension, $allowed)) $this->main->response(array('success'=>0, 'code'=>'INVALID_EXTENSION', 'message'=>sprintf(esc_html__('File extension is invalid. You can upload %s files.', 'modern-events-calendar-lite'), implode(', ', $allowed)))); + + // Maximum File Size + $max_file_size = isset($this->settings['fes_max_file_size']) ? (int) ($this->settings['fes_max_file_size'] * 1000) : (5000 * 1000); + + // Invalid Size + if($uploaded_file['size'] > $max_file_size) $this->main->response(array('success'=>0, 'code'=>'IMAGE_IS_TOO_BIG', 'message'=>sprintf(esc_html__('File is too big. Maximum size is %s KB.', 'modern-events-calendar-lite'), ($max_file_size / 1000)))); + + // Include the functions + if(!function_exists('wp_handle_upload')) + { + require_once ABSPATH.'wp-admin/includes/file.php'; + require_once(ABSPATH.'wp-admin/includes/image.php'); + } + + $upload = wp_upload_bits($uploaded_file['name'], NULL, file_get_contents($uploaded_file['tmp_name'])); + $wp_filetype = wp_check_filetype(basename($upload['file'])); + + $wp_upload_dir = wp_upload_dir(); + $attachment = array( + 'guid' => $wp_upload_dir['baseurl'] . _wp_relative_upload_path($upload['file']), + 'post_mime_type' => $wp_filetype['type'], + 'post_title' => preg_replace('/\.[^.]+$/', '', basename($upload['file'])), + 'post_content' => '', + 'post_status' => 'inherit' + ); + + $attach_id = wp_insert_attachment($attachment, $upload['file']); + wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $upload['file'])); + + $success = 0; + $data = []; + + if($attach_id && (!isset($upload['error']) || !$upload['error'])) + { + $success = 1; + $message = esc_html__('File uploaded!', 'modern-events-calendar-lite'); + + $data['url'] = $upload['url']; + $data['id'] = $attach_id; + } + else + { + $message = $upload['error']; + } + + $this->main->response(array('success'=>$success, 'message'=>$message, 'data'=>$data)); + } + + /** + * Show public download module of event into the Add/Edit event page + * + * @author Webnus + * @param object $post + */ + public function meta_box_public_module($post){ + + FormBuilder::public_download( $post ); + } + + public function public_download_module_upload() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_public_download_module_file_upload')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $uploaded_file = $_FILES['file'] ?? NULL; + + // No file + if(!$uploaded_file) $this->main->response(array('success'=>0, 'code'=>'NO_FILE', 'message'=>esc_html__('Please upload a file.', 'modern-events-calendar-lite'))); + + $allowed = array('docx', 'jpeg', 'jpg', 'png', 'pdf', 'zip'); + + $ex = explode('.', $uploaded_file['name']); + $extension = end($ex); + + // Invalid Extension + if(!in_array($extension, $allowed)) $this->main->response(array('success'=>0, 'code'=>'INVALID_EXTENSION', 'message'=>sprintf(esc_html__('File extension is invalid. You can upload %s files.', 'modern-events-calendar-lite'), implode(', ', $allowed)))); + + // Maximum File Size + $max_file_size = isset($this->settings['fes_max_file_size']) ? (int) ($this->settings['fes_max_file_size'] * 1000) : (5000 * 1000); + + // Invalid Size + if($uploaded_file['size'] > $max_file_size) $this->main->response(array('success'=>0, 'code'=>'IMAGE_IS_TOO_BIG', 'message'=>sprintf(esc_html__('File is too big. Maximum size is %s KB.', 'modern-events-calendar-lite'), ($max_file_size / 1000)))); + + // Include the functions + if(!function_exists('wp_handle_upload')) + { + require_once ABSPATH.'wp-admin/includes/file.php'; + require_once(ABSPATH.'wp-admin/includes/image.php'); + } + + $upload = wp_upload_bits($uploaded_file['name'], NULL, file_get_contents($uploaded_file['tmp_name'])); + $wp_filetype = wp_check_filetype(basename($upload['file'])); + + $wp_upload_dir = wp_upload_dir(); + $attachment = array( + 'guid' => $wp_upload_dir['baseurl'] . _wp_relative_upload_path($upload['file']), + 'post_mime_type' => $wp_filetype['type'], + 'post_title' => preg_replace('/\.[^.]+$/', '', basename($upload['file'])), + 'post_content' => '', + 'post_status' => 'inherit' + ); + + $attach_id = wp_insert_attachment($attachment, $upload['file']); + wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $upload['file'])); + + $success = 0; + $data = []; + + if($attach_id && (!isset($upload['error']) || !$upload['error'])) + { + $success = 1; + $message = esc_html__('File uploaded!', 'modern-events-calendar-lite'); + + $data['url'] = $upload['url']; + $data['id'] = $attach_id; + } + else + { + $message = $upload['error']; + } + + $this->main->response(array('success'=>$success, 'message'=>$message, 'data'=>$data)); + } +} \ No newline at end of file diff --git a/app/features/emails/details.php b/app/features/emails/details.php new file mode 100755 index 0000000..34e8419 --- /dev/null +++ b/app/features/emails/details.php @@ -0,0 +1,68 @@ +ID, 'mec_time', true); +if($time == '') $time = 1; + +$type = get_post_meta($post->ID, 'mec_type', true); +if($type == '') $type = 'day'; + +$afterbefore = get_post_meta($post->ID, 'mec_afterbefore', true); +if($afterbefore == '') $afterbefore = 'before'; + +$all = get_post_meta($post->ID, 'mec_all', true); +if($all == '') $all = 1; + +$events = get_post_meta($post->ID, 'mec_events', true); +if(!is_array($events)) $events = []; + +// Upcoming Events +$upcoming_event_ids = $this->main->get_upcoming_event_ids(NULL, 'publish'); +?> + \ No newline at end of file diff --git a/app/features/events.php b/app/features/events.php new file mode 100755 index 0000000..6936ae9 --- /dev/null +++ b/app/features/events.php @@ -0,0 +1,4062 @@ + + */ +class MEC_feature_events extends MEC_base +{ + public $factory; + public $main; + public $db; + public $PT; + public $settings; + public $render; + + /** + * Constructor method + * + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC DB + $this->db = $this->getDB(); + + // MEC Post Type Name + $this->PT = $this->main->get_main_post_type(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize events feature + * + * @author Webnus + */ + public function init() + { + $this->factory->action('init', array($this, 'register_post_type')); + $this->factory->action('mec_category_add_form_fields', array($this, 'add_category_fields'), 10, 2); + $this->factory->action('mec_category_edit_form_fields', array($this, 'edit_category_fields'), 10, 2); + $this->factory->action('edited_mec_category', array($this, 'save_metadata')); + $this->factory->action('created_mec_category', array($this, 'save_metadata')); + + $this->factory->action('init', array($this, 'register_endpoints')); + $this->factory->action('add_meta_boxes_' . $this->PT, array($this, 'remove_taxonomies_metaboxes')); + $this->factory->action('save_post', array($this, 'save_event'), 10); + $this->factory->action('edit_post', array($this, 'quick_edit'), 10); + $this->factory->action('delete_post', array($this, 'delete_event'), 10); + $this->factory->action('transition_post_status', array($this, 'event_published'), 10 , 3); + + $this->factory->filter('post_row_actions', array($this, 'action_links'), 10, 2); + $this->factory->action('admin_init', array($this, 'duplicate_event')); + + $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes'), 1); + $this->factory->action('restrict_manage_posts', array($this, 'add_filters')); + $this->factory->action('manage_posts_extra_tablenav', array($this, 'add_buttons')); + if(is_admin()) $this->factory->action('pre_get_posts', array($this, 'filter')); + + $this->factory->action('mec_metabox_details', array($this, 'meta_box_nonce'), 10); + $this->factory->action('mec_metabox_details', array($this, 'meta_box_dates'), 20); + $this->factory->action('mec_metabox_details', array($this, 'meta_box_hourly_schedule'), 30); + $this->factory->action('mec_metabox_details', array($this, 'meta_box_links'), 40); + $this->factory->action('mec_metabox_details', array($this, 'meta_box_cost'), 50); + $this->factory->action('mec_metabox_details', array($this, 'meta_box_fields'), 60); + + // Hourly Schedule for FES + if(!isset($this->settings['fes_section_hourly_schedule']) or (isset($this->settings['fes_section_hourly_schedule']) and $this->settings['fes_section_hourly_schedule'])) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_hourly_schedule'), 30); + } + + // Data Fields for FES + if(!isset($this->settings['fes_section_data_fields']) or (isset($this->settings['fes_section_data_fields']) and $this->settings['fes_section_data_fields'])) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_fields'), 20); + } + + // Show exceptional days if enabled + if(isset($this->settings['exceptional_days']) and $this->settings['exceptional_days']) + { + $this->factory->action('mec_metabox_details', array($this, 'meta_box_exceptional_days'), 25); + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_exceptional_days'), 25); + } + + // Show Booking meta box only if booking module is enabled + $booking_status = (isset($this->settings['booking_status']) and $this->settings['booking_status']); + if($booking_status) + { + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_booking_options'), 5); + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_tickets')); + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_regform'), 20); + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_attendees'), 22); + $this->factory->action('wp_ajax_mec_event_bookings', array($this, 'mec_event_bookings'), 23); + $this->factory->action('wp_ajax_mec_move_bookings', array($this, 'mec_move_bookings'), 24); + $this->factory->action('wp_ajax_mec_manage_bookings', array($this, 'mec_manage_bookings'), 25); + + if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) + { + // Booking Options for FES + if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_booking_options'), 35); + + // Ticket Options for FES + if(!isset($this->settings['fes_section_tickets']) or (isset($this->settings['fes_section_tickets']) and $this->settings['fes_section_tickets'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_tickets'), 40); + + // Registration Form for FES + if(!isset($this->settings['fes_section_reg_form']) or (isset($this->settings['fes_section_reg_form']) and $this->settings['fes_section_reg_form'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_regform'), 45); + + // Attendees for FES + if(!isset($this->settings['fes_section_booking_att']) or (isset($this->settings['fes_section_booking_att']) and $this->settings['fes_section_booking_att'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_attendees'), 48); + } + } + + // Show fees meta box only if fees module is enabled + if(isset($this->settings['taxes_fees_status']) and $this->settings['taxes_fees_status']) + { + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_fees'), 15); + + // Fees for FES + if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) + { + if($booking_status and (!isset($this->settings['fes_section_fees']) or (isset($this->settings['fes_section_fees']) and $this->settings['fes_section_fees']))) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_fees'), 45); + } + } + } + + // Show ticket variations meta box only if the module is enabled + if($booking_status and isset($this->settings['ticket_variations_status']) and $this->settings['ticket_variations_status']) + { + $this->factory->action('mec_metabox_booking', array($this, 'meta_box_ticket_variations'), 16); + + // Ticket Variations for FES + if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) + { + if(!isset($this->settings['fes_section_ticket_variations']) or (isset($this->settings['fes_section_ticket_variations']) and $this->settings['fes_section_ticket_variations'])) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_ticket_variations'), 46); + } + } + } + + $this->factory->filter('manage_' . $this->PT . '_posts_columns', array($this, 'filter_columns')); + $this->factory->filter('manage_edit-' . $this->PT . '_sortable_columns', array($this, 'filter_sortable_columns')); + $this->factory->action('manage_' . $this->PT . '_posts_custom_column', array($this, 'filter_columns_content'), 10, 2); + + $this->factory->action('admin_footer-edit.php', array($this, 'add_bulk_actions')); + $this->factory->action('load-edit.php', array($this, 'do_bulk_actions')); + $this->factory->action('pre_post_update', array($this, 'bulk_edit'), 10); + + // WPML Duplicate + $this->factory->action('icl_make_duplicate', array($this, 'icl_duplicate'), 10, 4); + $this->factory->action('icl_pro_translation_saved', array($this, 'wpml_pro_translation_saved'), 10, 3); + + // Image Fallback + if(isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']) + { + $this->factory->filter('get_post_metadata', array($this, 'set_fallback_image_id'), 10, 4); + $this->factory->filter('post_thumbnail_html', array($this, 'show_fallback_image'), 20, 5); + } + + // Event Gallery + if(isset($this->settings['event_gallery_status']) and $this->settings['event_gallery_status']) + { + // AJAX + $this->factory->action('wp_ajax_mec_event_gallery_image_upload', array($this, 'gallery_image_upload')); + } + + // Related Events Per Event + if(isset($this->settings['related_events_per_event']) and $this->settings['related_events_per_event']) + { + $this->factory->action('mec_metabox_details', array($this, 'meta_box_related_events'), 17); + + // Related Events Per Event for FES + if(!isset($this->settings['fes_section_related_events']) or (isset($this->settings['fes_section_related_events']) and $this->settings['fes_section_related_events'])) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_related_events'), 33); + } + } + + // Event Banner + if(isset($this->settings['banner_status']) && $this->settings['banner_status'] && (!isset($this->settings['banner_force_featured_image']) || !$this->settings['banner_force_featured_image'])) + { + $this->factory->action('mec_metabox_details', array($this, 'meta_box_banner'), 18); + + // Event Banner for FES + if(!isset($this->settings['fes_section_banner']) or (isset($this->settings['fes_section_banner']) and $this->settings['fes_section_banner'])) + { + $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_banner'), 34); + } + } + + // Timezone Notice + $timezone_string = get_option('timezone_string'); + if(trim($timezone_string) === '') + { + add_action('admin_notices', function() + { + echo '
    +

    '.esc_html__('It is advisable to utilize a geographic timezone, such as "America/Los_Angeles" instead of a UTC timezone offset, like "UTC+0," while using The Modern Events Calendar. The latter may cause issues when importing events or with Daylight Saving Time.', 'modern-events-calendar-lite').'

    +
    '; + }); + } + } + + /** + * Registers events post type and assign it to some taxonomies + * + * @author Webnus + */ + public function register_post_type() + { + // Get supported features for event post type + $supports = apply_filters('mec_event_supports', array('editor', 'title', 'excerpt', 'author', 'thumbnail', 'comments')); + + $args = apply_filters( + 'mec_event_register_post_type_args', + array( + 'labels' => array( + 'name' => esc_html__('Events', 'modern-events-calendar-lite'), + 'singular_name' => esc_html__('Event', 'modern-events-calendar-lite'), + 'add_new' => esc_html__('Add Event', 'modern-events-calendar-lite'), + 'add_new_item' => esc_html__('Add New Event', 'modern-events-calendar-lite'), + 'not_found' => esc_html__('No events found!', 'modern-events-calendar-lite'), + 'all_items' => esc_html__('All Events', 'modern-events-calendar-lite'), + 'edit_item' => esc_html__('Edit Event', 'modern-events-calendar-lite'), + 'view_item' => esc_html__('View Event', 'modern-events-calendar-lite'), + 'not_found_in_trash' => esc_html__('No events found in Trash!', 'modern-events-calendar-lite'), + ), + 'public' => true, + 'has_archive' => ($this->main->get_archive_status() ? true : false), + 'menu_icon' => plugin_dir_url(__FILE__ ) . '../../assets/img/mec.svg', + 'menu_position' => 26, + 'show_in_menu' => 'mec-intro', + 'rewrite' => array( + 'slug' => $this->main->get_main_slug(), + 'ep_mask' => EP_MEC_EVENTS, + 'with_front' => false, + ), + 'supports' => $supports, + 'show_in_rest' => true, + + ) + ); + register_post_type( $this->PT, $args ); + + $singular_label = $this->main->m('taxonomy_category', esc_html__('Category', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_categories', esc_html__('Categories', 'modern-events-calendar-lite')); + + $category_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label' => $plural_label, + 'labels' => array( + 'name' => $plural_label, + 'singular_name' => $singular_label, + 'all_items' => sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item' => sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item' => sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item' => sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item' => sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name' => sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items' => sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items' => sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + ), + 'public' => true, + 'show_ui' => true, + 'show_in_rest' => true, + 'hierarchical' => true, + 'has_archive' => true, + 'rewrite' => array('slug' => $this->main->get_category_slug()), + ), + 'mec_category' + ); + + register_taxonomy( + 'mec_category', + $this->PT, + $category_args + ); + + register_taxonomy_for_object_type('mec_category', $this->PT); + } + + /** + * Register meta field to taxonomies + * + * @author Webnus + */ + public function add_category_fields() + { + add_thickbox(); + + // Fallback Status + $fallback = (isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']); + ?> +
    + + + +
    +
    + + +

    +
    + +
    + +
    + + + +
    + + + */ + public function edit_category_fields($term) + { + add_thickbox(); + + // Fallback Status + $fallback = (isset($this->settings['fallback_featured_image_status']) and $this->settings['fallback_featured_image_status']); + + // Fallback Image + $fallback_image = get_metadata('term', $term->term_id, 'mec_cat_fallback_image', true); + + // Icon + $icon = get_metadata('term', $term->term_id, 'mec_cat_icon', true); + + // Color + $color = get_metadata('term', $term->term_id, 'mec_cat_color', true); + ?> + + + + + + + + +
    + + + + + + + + + +

    + + + + + + + + +
    '; ?>
    + + + + + + + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['mec_cat_icon'])) return; + + $icon = sanitize_text_field($_POST['mec_cat_icon']); + update_term_meta($term_id, 'mec_cat_icon', $icon); + + $color = isset($_POST['mec_cat_color']) ? sanitize_text_field($_POST['mec_cat_color']) : ''; + update_term_meta($term_id, 'mec_cat_color', $color); + + $fallback = isset($_POST['fallback']) ? sanitize_text_field($_POST['fallback']) : ''; + update_term_meta($term_id, 'mec_cat_fallback_image', $fallback); + } + + public function register_endpoints() + { + add_rewrite_endpoint('verify', EP_MEC_EVENTS); + add_rewrite_endpoint('cancel', EP_MEC_EVENTS); + add_rewrite_endpoint('gateway-cancel', EP_MEC_EVENTS); + add_rewrite_endpoint('gateway-return', EP_MEC_EVENTS); + } + + /** + * Remove normal meta boxes for some taxonomies + * + * @author Webnus + */ + public function remove_taxonomies_metaboxes() + { + remove_meta_box('tagsdiv-mec_location', $this->PT, 'side'); + remove_meta_box('tagsdiv-mec_organizer', $this->PT, 'side'); + remove_meta_box('tagsdiv-mec_label', $this->PT, 'side'); + } + + /** + * Registers 2 meta boxes for event data + * + * @author Webnus + */ + public function register_meta_boxes() + { + // Event Details + add_meta_box('mec_metabox_details', esc_html__('Event Details', 'modern-events-calendar-lite'), array($this, 'meta_box_details'), $this->main->get_main_post_type(), 'normal', 'high'); + + // Visibility + $visibility_status = !isset($this->settings['event_visibility_status']) || $this->settings['event_visibility_status']; + $style_per_event = isset($this->settings['style_per_event']) && $this->settings['style_per_event']; + + if($visibility_status || $style_per_event) + { + add_meta_box('mec_metabox_visibility', esc_html__('Visibility', 'modern-events-calendar-lite'), array($this, 'meta_box_visibility'), $this->main->get_main_post_type(), 'side'); + } + + // Gallery + if(isset($this->settings['event_gallery_status']) && $this->settings['event_gallery_status']) + { + add_meta_box('mec_metabox_gallery', esc_html__('Gallery', 'modern-events-calendar-lite'), array($this, 'meta_box_event_gallery'), $this->main->get_main_post_type(), 'side', 'low'); + } + + // Show Booking meta box only if booking module is enabled + if($this->getPRO() and isset($this->settings['booking_status']) and $this->settings['booking_status']) + { + add_meta_box('mec_metabox_booking', esc_html__('Booking', 'modern-events-calendar-lite'), array($this, 'meta_box_booking'), $this->main->get_main_post_type(), 'normal', 'high'); + } + } + + /** + * Show content of details meta box + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_details($post) + { + global $post; + $note = get_post_meta($post->ID, 'mec_note', true); + $note_visibility = $this->main->is_note_visible($post->post_status); + + $fes_guest_email = get_post_meta($post->ID, 'fes_guest_email', true); + $fes_guest_name = get_post_meta($post->ID, 'fes_guest_name', true); + + $event_fields = $this->main->get_event_fields(); + ?> +
    +
    + 'mec_meta_box_fes_form', + esc_html__('Date And Time', 'modern-events-calendar-lite') => 'mec_meta_box_date_form', + esc_html__('Event Repeating', 'modern-events-calendar-lite') => 'mec_meta_box_repeat_form', + esc_html__('Event Data', 'modern-events-calendar-lite') => 'mec-event-data', + esc_html__('Exceptional Days', 'modern-events-calendar-lite') => 'mec-exceptional-days', + esc_html__('Hourly Schedule', 'modern-events-calendar-lite') => 'mec-hourly-schedule', + esc_html__('Location/Venue', 'modern-events-calendar-lite') => 'mec-location', + esc_html__('Links', 'modern-events-calendar-lite') => 'mec-read-more', + esc_html__('Organizer', 'modern-events-calendar-lite') => 'mec-organizer', + esc_html__('Cost', 'modern-events-calendar-lite') => 'mec-cost', + esc_html__('SEO Schema / Event Status', 'modern-events-calendar-lite') => 'mec-schema', + esc_html__('Notifications', 'modern-events-calendar-lite') => 'mec-notifications', + esc_html__('Public Download', 'modern-events-calendar-lite') => 'mec-public-download-module-file', + esc_html__('Related Events', 'modern-events-calendar-lite') => 'mec-event-related-events', + esc_html__('Event Banner', 'modern-events-calendar-lite') => 'mec-event-banner', + ); + + $single_event_meta_title = apply_filters('mec-single-event-meta-title', $tabs, $activated, $post); + foreach($single_event_meta_title as $link_name => $link_address) + { + if($link_address == 'mec_meta_box_fes_form') + { + if(($note_visibility and trim($note)) || (trim($fes_guest_email) and trim($fes_guest_name))) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-exceptional-days') + { + if(isset($this->settings['exceptional_days']) and $this->settings['exceptional_days']) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-event-data') + { + if(count($event_fields) and isset($this->settings['display_event_fields_backend']) and $this->settings['display_event_fields_backend'] == 1) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-notifications') + { + if(isset($this->settings['notif_per_event']) and $this->settings['notif_per_event']) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-public-download-module-file') + { + if(isset($this->settings['public_download_module']) and $this->settings['public_download_module']) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-event-related-events') + { + if(isset($this->settings['related_events_per_event']) and $this->settings['related_events_per_event']) echo ''.esc_html($link_name).''; + } + elseif($link_address == 'mec-event-banner') + { + if(isset($this->settings['banner_status']) && $this->settings['banner_status'] && (!isset($this->settings['banner_force_featured_image']) || !$this->settings['banner_force_featured_image'])) echo ''.esc_html($link_name).''; + } + elseif($link_address === 'mec-organizer') + { + if((!isset($this->settings['organizers_status']) || $this->settings['organizers_status'])) echo ''.esc_html($link_name).''; + } + else + { + echo ''.esc_html($link_name).''; + } + } + ?> +
    +
    + +
    +
    + + + settings['display_event_fields_backend']) and $this->settings['display_event_fields_backend'] == 1): ?> + + + */ + public function meta_box_visibility($post) + { + // Public Event + $public = get_post_meta($post->ID, 'mec_public', true); + if(trim($public) === '') $public = 1; + + $style_per_event = get_post_meta($post->ID, 'mec_style_per_event', true); + if(trim($style_per_event) == '') $style_per_event = 'global'; + ?> +
    + settings['event_visibility_status']) or (isset($this->settings['event_visibility_status']) and $this->settings['event_visibility_status'])): ?> + +
    +
    + +
    +
    + + settings['style_per_event']) and $this->settings['style_per_event']): ?> + +
    +
    + +
    +
    + +
    + + */ + public function meta_box_gallery($post) + { + } + + /** + * Add a security nonce to the Add/Edit events page + * + * @author Webnus + */ + public function meta_box_nonce() + { + // Add a nonce field, so we can check for it later. + wp_nonce_field('mec_event_data', 'mec_event_nonce'); + } + + /** + * Show date options of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_dates($post) + { + global $post; + + $allday = get_post_meta($post->ID, 'mec_allday', true); + $one_occurrence = get_post_meta($post->ID, 'one_occurrence', true); + $comment = get_post_meta($post->ID, 'mec_comment', true); + $hide_time = get_post_meta($post->ID, 'mec_hide_time', true); + $start_date = get_post_meta($post->ID, 'mec_start_date', true); + + $hide_end_time_global = isset($this->settings['hide_event_end_time']) && $this->settings['hide_event_end_time']; + $hide_end_time = get_post_meta($post->ID, 'mec_hide_end_time', true); + + if($hide_end_time_global) $hide_end_time = 1; + + // This date format used for datepicker + $datepicker_format = (isset($this->settings['datepicker_format']) and trim($this->settings['datepicker_format'])) ? $this->settings['datepicker_format'] : 'Y-m-d'; + + // Advanced Repeating Day + $advanced_days = get_post_meta($post->ID, 'mec_advanced_days', true); + $advanced_days = is_array($advanced_days) ? $advanced_days : []; + $advanced_str = count($advanced_days) ? implode('-', $advanced_days) : ''; + + $start_time_hour = get_post_meta($post->ID, 'mec_start_time_hour', true); + if(trim($start_time_hour) == '') $start_time_hour = 8; + + $start_time_minutes = get_post_meta($post->ID, 'mec_start_time_minutes', true); + if(trim($start_time_minutes) == '') $start_time_minutes = 0; + + $start_time_ampm = get_post_meta($post->ID, 'mec_start_time_ampm', true); + if(trim($start_time_ampm) == '') $start_time_ampm = 'AM'; + + $end_date = get_post_meta($post->ID, 'mec_end_date', true); + + $end_time_hour = get_post_meta($post->ID, 'mec_end_time_hour', true); + if(trim($end_time_hour) == '') $end_time_hour = 6; + + $end_time_minutes = get_post_meta($post->ID, 'mec_end_time_minutes', true); + if(trim($end_time_minutes) == '') $end_time_minutes = 0; + + $end_time_ampm = get_post_meta($post->ID, 'mec_end_time_ampm', true); + if(trim($end_time_ampm) == '') $end_time_ampm = 'PM'; + + $repeat_status = get_post_meta($post->ID, 'mec_repeat_status', true); + $repeat_type = get_post_meta($post->ID, 'mec_repeat_type', true); + if(trim($repeat_type) == '') $repeat_type = 'daily'; + + $repeat_interval = get_post_meta($post->ID, 'mec_repeat_interval', true); + if(trim($repeat_interval) == '' and in_array($repeat_type, array('daily', 'weekly'))) $repeat_interval = 1; + + $certain_weekdays = get_post_meta($post->ID, 'mec_certain_weekdays', true); + if($repeat_type != 'certain_weekdays') $certain_weekdays = []; + + $in_days_str = get_post_meta($post->ID, 'mec_in_days', true); + $in_days = trim($in_days_str) ? explode(',', $in_days_str) : []; + + $mec_repeat_end = get_post_meta($post->ID, 'mec_repeat_end', true); + if(trim($mec_repeat_end) == '') $mec_repeat_end = 'never'; + + $repeat_end_at_occurrences = get_post_meta($post->ID, 'mec_repeat_end_at_occurrences', true); + if(trim($repeat_end_at_occurrences) == '') $repeat_end_at_occurrences = 9; + + $repeat_end_at_date = get_post_meta($post->ID, 'mec_repeat_end_at_date', true); + + $note = get_post_meta($post->ID, 'mec_note', true); + $note_visibility = $this->main->is_note_visible($post->post_status); + + $fes_guest_email = get_post_meta($post->ID, 'fes_guest_email', true); + $fes_guest_name = get_post_meta($post->ID, 'fes_guest_name', true); + $imported_from_google = get_post_meta($post->ID, 'mec_imported_from_google', true); + + $event_timezone = get_post_meta($post->ID, 'mec_timezone', true); + if(trim($event_timezone) == '') $event_timezone = 'global'; + + $countdown_method = get_post_meta($post->ID, 'mec_countdown_method', true); + if(trim($countdown_method) == '') $countdown_method = 'global'; + ?> +
    + +
    + + +
    +

    +

    +
    + + +
    +

    +

    :

    +

    :

    +
    + + +
    + + + + +

    + + +
    +
    +
    +
    +
    +
    +
    +

    +
    +
    + + +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => $this->settings['time_format'] ?? 12, + 'time_hour' => $start_time_hour, + 'time_minutes' => $start_time_minutes, + 'time_ampm' => $start_time_ampm, + 'name' => 'mec[date][start]', + 'id_key' => 'start_', + 'include_h0' => true, + )); ?> +
    +
    +
    + + +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => $this->settings['time_format'] ?? 12, + 'time_hour' => $end_time_hour, + 'time_minutes' => $end_time_minutes, + 'time_ampm' => $end_time_ampm, + 'name' => 'mec[date][end]', + 'id_key' => 'end_', + )); ?> +
    +
    + ID); ?> +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    +

    + +

    +
    +
    + +
    +
    +
    + + settings['countdown_status']) and $this->settings['countdown_status'] and isset($this->settings['countdown_method_per_event']) and $this->settings['countdown_method_per_event']): ?> +

    +
    +
    + +
    +
    + + + settings['tz_per_event']) and $this->settings['tz_per_event']): ?> +
    +

    +
    +
    + +
    +
    +
    + + +
    + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + main->get_weekday_i18n_labels(); + foreach($weekdays as $weekday): + ?> + + +
    +
    +
    +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => (isset($this->settings['time_format']) ? $this->settings['time_format'] : 12), + 'time_hour' => $start_time_hour, + 'time_minutes' => $start_time_minutes, + 'time_ampm' => $start_time_ampm, + 'name' => 'mec[exceptionsdays][start]', + 'id_key' => 'exceptions_in_days_start_', + 'include_h0' => true, + )); ?> +
    +
    + + + + +
    +
    +
    +

    + + +

    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => ($this->settings['time_format'] ?? 12), + 'time_hour' => $end_time_hour, + 'time_minutes' => $end_time_minutes, + 'time_ampm' => $end_time_ampm, + 'name' => 'mec[exceptionsdays][end]', + 'id_key' => 'exceptions_in_days_end_', + )); ?> +
    +
    +
    +
    +
    + + main->standardize_format($in_day[0], $datepicker_format); + $second_date = $this->main->standardize_format($in_day[1], $datepicker_format); + + $in_day_start_time = ''; + $in_day_start_time_label = ''; + $in_day_end_time = ''; + $in_day_end_time_label = ''; + + if(isset($in_day[2]) and isset($in_day[3])) + { + $in_day_start_time = $in_day[2]; + $in_day_end_time = $in_day[3]; + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $in_day_ex_start = explode('-', $in_day_start_time); + $in_day_ex_end = explode('-', $in_day_end_time); + + $in_day_start_time_label = $this->main->to_24hours($in_day_ex_start[0], $in_day_ex_start[2]).':'.$in_day_ex_start[1]; + $in_day_end_time_label = $this->main->to_24hours($in_day_ex_end[0], $in_day_ex_end[2]).':'.$in_day_ex_end[1]; + } + else + { + $pos = strpos($in_day_start_time, '-'); + if($pos !== false) $in_day_start_time_label = substr_replace($in_day_start_time, ':', $pos, 1); + + $pos = strpos($in_day_end_time, '-'); + if($pos !== false) $in_day_end_time_label = substr_replace($in_day_end_time, ':', $pos, 1); + + $in_day_start_time_label = str_replace('-', ' ', $in_day_start_time_label); + $in_day_end_time_label = str_replace('-', ' ', $in_day_end_time_label); + } + } + + $in_day = $first_date . ':' . $second_date.(trim($in_day_start_time) ? ':'.$in_day_start_time : '').(trim($in_day_end_time) ? ':'.$in_day_end_time : ''); + $in_day_label = $first_date. (trim($in_day_start_time_label) ? ' '.esc_html($in_day_start_time_label).'' : '') . ' - ' . $second_date. (trim($in_day_end_time_label) ? ' '.esc_html($in_day_end_time_label).'' : ''); + ?> +
    + + + x +
    + +
    + +
    +
    + + :label: + x +
    +
    +
    +
    +
    +
      +
    • + +
    • +
        + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?> +
      • "> + + .1- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?> +
      • "> + + .1- +
      • +
      +
    +
      +
    • + +
    • +
        + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?> +
      • "> + + .2- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?> +
      • "> + + .2- +
      • +
      +
    +
      +
    • + +
    • +
        + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?> +
      • "> + + .3- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?> +
      • "> + + .3- +
      • +
      +
    +
      +
    • + +
    • +
        + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?> +
      • "> + + .4- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?> +
      • "> + + .4- +
      • +
      +
    +
      +
    • + +
    • +
        + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 1); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 2); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 3); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 4); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 5); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 6); ?> +
      • "> + + .l- +
      • + main->advanced_repeating_sort_day($this->main->get_first_day_of_week(), 7); ?> +
      • "> + + .l- +
      • +
      +
    + +
    +
    +
    +
    +

    +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    +

    + +

    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + * @param WP_Post $post + */ + public function meta_box_cost($post) + { + $cost = get_post_meta($post->ID, 'mec_cost', true); + $cost_auto_calculate = get_post_meta($post->ID, 'mec_cost_auto_calculate', true); + + $currency = get_post_meta($post->ID, 'mec_currency', true); + if(!is_array($currency)) $currency = []; + + $type = ((isset($this->settings['single_cost_type']) and trim($this->settings['single_cost_type'])) ? $this->settings['single_cost_type'] : 'numeric'); + $currency_per_event = ((isset($this->settings['currency_per_event']) and trim($this->settings['currency_per_event'])) ? $this->settings['currency_per_event'] : 0); + + $currencies = $this->main->get_currencies(); + $current_currency = ($currency['currency'] ?? ($this->settings['currency'] ?? 'USD')); + ?> +
    + +
    +
    +
    +
    +
    +
    + +
    +

    main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite'))); ?>

    +
    +
    + + + + class="mec-col-3" name="mec[cost]" id="mec_cost" value="" title="" placeholder=""/> + +
    +
    + getPRO()): ?> +
    +
    + +
    +
    + +
    + +
    + +

    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    +

    + +

    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + + * @param WP_Post $post + */ + public function meta_box_exceptional_days($post) + { + $not_in_days_str = get_post_meta($post->ID, 'mec_not_in_days', true); + $not_in_days = trim($not_in_days_str) ? explode(',', $not_in_days_str) : []; + ?> +
    +

    +
    +
    +
    + + +
    + getFormBuilder(); + $builder->exceptionalDays([ + 'values' => $not_in_days + ]); + ?> +
    +
    +
    + + * @param WP_Post $post + */ + public function meta_box_hourly_schedule($post) + { + FormBuilder::hourly_schedule( $post ); + } + + + + /** + * Display Related Events in the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_related_events($post) + { + FormBuilder::related_events($post); + } + + /** + * Display Event Banner in the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_banner($post) + { + FormBuilder::banner($post); + } + + /** + * Display Event Gallery form in the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_event_gallery($post) + { + $gallery = get_post_meta($post->ID, 'mec_event_gallery', true); + if(!is_array($gallery)) $gallery = []; + ?> + + + + * @param WP_Post $post + */ + public function meta_box_links($post) + { + $read_more = get_post_meta($post->ID, 'mec_read_more', true); + $more_info = get_post_meta($post->ID, 'mec_more_info', true); + $more_info_title = get_post_meta($post->ID, 'mec_more_info_title', true); + $more_info_target = get_post_meta($post->ID, 'mec_more_info_target', true); + + $trailer_url_status = isset($this->settings['trailer_url_status']) && $this->settings['trailer_url_status']; + + $trailer_url = get_post_meta($post->ID, 'mec_trailer_url', true); + $trailer_title = get_post_meta($post->ID, 'mec_trailer_title', true); + ?> + + + * @param WP_Post $post + */ + public function meta_box_booking($post) + { + $gateway_settings = $this->main->get_gateways_options(); + ?> +
    +
    + + + settings['taxes_fees_status']) and $this->settings['taxes_fees_status']): ?> + + + settings['ticket_variations_status']) and $this->settings['ticket_variations_status']): ?> + + + + + + + settings['downloadable_file_status']) and $this->settings['downloadable_file_status']): ?> + + + + + + + +
    +
    + +
    +
    + + + * @param WP_Post $post + */ + public function meta_box_booking_options($post) + { + $FES = !is_admin(); + + $booking_options = get_post_meta($post->ID, 'mec_booking', true); + if(!is_array($booking_options)) $booking_options = []; + + $fes_booking_tbl = (!isset($this->settings['fes_section_booking_tbl']) or (isset($this->settings['fes_section_booking_tbl']) and $this->settings['fes_section_booking_tbl'])); + $fes_booking_dspe = (!isset($this->settings['fes_section_booking_dspe']) or (isset($this->settings['fes_section_booking_dspe']) and $this->settings['fes_section_booking_dspe'])); + $fes_booking_mtpb = (!isset($this->settings['fes_section_booking_mtpb']) or (isset($this->settings['fes_section_booking_mtpb']) and $this->settings['fes_section_booking_mtpb'])); + $fes_booking_dpur = (!isset($this->settings['fes_section_booking_dpur']) or (isset($this->settings['fes_section_booking_dpur']) and $this->settings['fes_section_booking_dpur'])); + $fes_booking_bao = (!isset($this->settings['fes_section_booking_bao']) or (isset($this->settings['fes_section_booking_bao']) and $this->settings['fes_section_booking_bao'])); + $fes_booking_io = (!isset($this->settings['fes_section_booking_io']) or (isset($this->settings['fes_section_booking_io']) and $this->settings['fes_section_booking_io'])); + $fes_booking_aa = (!isset($this->settings['fes_section_booking_aa']) or (isset($this->settings['fes_section_booking_aa']) and $this->settings['fes_section_booking_aa'])); + $fes_booking_lftp = (!isset($this->settings['fes_section_booking_lftp']) or (isset($this->settings['fes_section_booking_lftp']) and $this->settings['fes_section_booking_lftp'])); + $fes_booking_typ = (!isset($this->settings['fes_section_booking_typ']) or (isset($this->settings['fes_section_booking_typ']) and $this->settings['fes_section_booking_typ'])); + $fes_booking_bbl = (!isset($this->settings['fes_section_booking_bbl']) or (isset($this->settings['fes_section_booking_bbl']) and $this->settings['fes_section_booking_bbl'])); + $fes_booking_tubl = (!isset($this->settings['fes_section_booking_tubl']) or (isset($this->settings['fes_section_booking_tubl']) and $this->settings['fes_section_booking_tubl'])); + + $dpur_status = (!isset($this->settings['discount_per_user_role_status']) or (isset($this->settings['discount_per_user_role_status']) and $this->settings['discount_per_user_role_status'])); + + $partial_payment = $this->getPartialPayment(); + $fes_booking_pp = $partial_payment->is_fes_pp_section_enabled(); + ?> +
    + +
    + + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + settings['booking_date_selection_per_event']) and $this->settings['booking_date_selection_per_event'] and (!$FES or ($FES and $fes_booking_dspe))){ + + FormBuilder::booking_date_selection( $post ); + } + + if($dpur_status and (!$FES or ($FES and $fes_booking_dpur))){ + + FormBuilder::discount_per_user_roles( $post ); + } + + if(!$FES or ($FES and $fes_booking_bao)){ + + FormBuilder::book_all_occurrences( $post ); + } + + if(!$FES or ($FES and $fes_booking_io)){ + + FormBuilder::interval_options( $post ); + } + + if(!$FES or ($FES and $fes_booking_aa)){ + + FormBuilder::automatic_approval( $post ); + } + + if((isset($this->settings['last_few_tickets_percentage_per_event']) && $this->settings['last_few_tickets_percentage_per_event']) or ($FES and $fes_booking_lftp)){ + + FormBuilder::last_few_tickets_percentage( $post ); + } + + if((isset($this->settings['thankyou_page_per_event']) && $this->settings['thankyou_page_per_event']) && (!$FES || $fes_booking_typ)){ + + FormBuilder::thankyou_page( $post ); + } + + if(!$FES or ($FES and $fes_booking_bbl)){ + + FormBuilder::booking_button_label( $post ); + } + + if(!$FES or ($FES and $fes_booking_pp)){ + + FormBuilder::booking_partial_payment( $post ); + } + + if(!$FES or ($FES and $fes_booking_tubl)){ + FormBuilder::total_user_booking_limits( $post ); + } + ?> +
    +
    + + + +
    + + * @param WP_Post $post + */ + public function meta_box_tickets($post){ + + FormBuilder::tickets( $post ); + } + + /** + * Show fees of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_fees($post){ + + FormBuilder::fees( $post ); + } + + /** + * Show ticket variations into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_ticket_variations($post){ + + FormBuilder::ticket_variations( $post ); + } + + /** + * Show registration form of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_regform($post){ + + FormBuilder::booking_form( $post ); + } + + /** + * Show attendees of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_attendees($post){ + + FormBuilder::attendees( $post ); + } + + /** + * Save event data + * + * @author Webnus + * @param int $post_id + * @return void + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return; + + // It's from FES + if(isset($_POST['action']) and sanitize_text_field($_POST['action']) === 'mec_fes_form') return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + $start_date = (isset($_mec['date']['start']['date']) and trim($_mec['date']['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($_mec['date']['start']['date'])) : date('Y-m-d'); + $end_date = (isset($_mec['date']['end']['date']) and trim($_mec['date']['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($_mec['date']['end']['date'])) : date('Y-m-d'); + + // Remove Cached Data + wp_cache_delete($post_id, 'mec-events-data'); + + $location_id = isset($_mec['location_id']) ? sanitize_text_field($_mec['location_id']) : 0; + $dont_show_map = isset($_mec['dont_show_map']) ? sanitize_text_field($_mec['dont_show_map']) : 0; + $organizer_id = isset($_mec['organizer_id']) ? sanitize_text_field($_mec['organizer_id']) : 0; + $read_more = isset($_mec['read_more']) ? sanitize_url($_mec['read_more']) : ''; + $more_info = (isset($_mec['more_info']) and trim($_mec['more_info'])) ? sanitize_url($_mec['more_info']) : ''; + $more_info_title = isset($_mec['more_info_title']) ? sanitize_text_field($_mec['more_info_title']) : ''; + $more_info_target = isset($_mec['more_info_target']) ? sanitize_text_field($_mec['more_info_target']) : ''; + + $cost = isset($_mec['cost']) ? sanitize_text_field($_mec['cost']) : ''; + $cost = apply_filters( + 'mec_event_cost_sanitize', + sanitize_text_field($cost), + $cost + ); + + $cost_auto_calculate = (isset($_mec['cost_auto_calculate']) ? sanitize_text_field($_mec['cost_auto_calculate']) : 0); + $currency_options = ((isset($_mec['currency']) and is_array($_mec['currency'])) ? $_mec['currency'] : array()); + + update_post_meta($post_id, 'mec_location_id', $location_id); + update_post_meta($post_id, 'mec_dont_show_map', $dont_show_map); + update_post_meta($post_id, 'mec_organizer_id', $organizer_id); + update_post_meta($post_id, 'mec_read_more', $read_more); + update_post_meta($post_id, 'mec_more_info', $more_info); + update_post_meta($post_id, 'mec_more_info_title', $more_info_title); + update_post_meta($post_id, 'mec_more_info_target', $more_info_target); + update_post_meta($post_id, 'mec_cost', $cost); + update_post_meta($post_id, 'mec_cost_auto_calculate', $cost_auto_calculate); + update_post_meta($post_id, 'mec_currency', $currency_options); + + do_action('update_custom_dev_post_meta', $_mec, $post_id); + + // Additional Organizers + $additional_organizer_ids = $_mec['additional_organizer_ids'] ?? []; + + foreach($additional_organizer_ids as $additional_organizer_id) wp_set_object_terms($post_id, (int) $additional_organizer_id, 'mec_organizer', true); + update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); + + // Additional locations + $additional_location_ids = $_mec['additional_location_ids'] ?? []; + + foreach($additional_location_ids as $additional_location_id) wp_set_object_terms($post_id, (int) $additional_location_id, 'mec_location', true); + update_post_meta($post_id, 'mec_additional_location_ids', $additional_location_ids); + + // Date Options + $date = $_mec['date'] ?? []; + + $start_date = date('Y-m-d', strtotime($start_date)); + + // Fix Date End & Event Finish + if(isset($date['repeat']['status']) && $date['repeat']['status']) + { + $days_diff = $this->main->get_days_diff($start_date, $end_date); + + // Daily + if(isset($date['repeat']['type']) && $date['repeat']['type'] === 'daily' && $days_diff >= 5) + { + $date['repeat']['end'] = 'date'; + $date['repeat']['end_at_date'] = $end_date; + + $end_date = $start_date; + } + // Weekly + else if(isset($date['repeat']['type']) && $date['repeat']['type'] === 'weekly' && $days_diff >= 15) + { + $date['repeat']['end'] = 'date'; + $date['repeat']['end_at_date'] = $end_date; + + $end_date = $start_date; + } + } + + // Set the start date + $date['start']['date'] = $start_date; + + $start_time_hour = isset($date['start']) ? sanitize_text_field($date['start']['hour']) : '8'; + $start_time_minutes = isset($date['start']) ? sanitize_text_field($date['start']['minutes']) : '00'; + $start_time_ampm = (isset($date['start']) and isset($date['start']['ampm'])) ? sanitize_text_field($date['start']['ampm']) : 'AM'; + + $end_date = date('Y-m-d', strtotime($end_date)); + + // Fix end_date if it's smaller than start_date + if(strtotime($end_date) < strtotime($start_date)) $end_date = $start_date; + + // Set the end date + $date['end']['date'] = $end_date; + + $end_time_hour = isset($date['end']) ? sanitize_text_field($date['end']['hour']) : '6'; + $end_time_minutes = isset($date['end']) ? sanitize_text_field($date['end']['minutes']) : '00'; + $end_time_ampm = (isset($date['end']) and isset($date['end']['ampm'])) ? sanitize_text_field($date['end']['ampm']) : 'PM'; + + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, NULL, 'start'), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, NULL, 'end'), $end_time_minutes); + } + else + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, $start_time_ampm, 'start'), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, $end_time_ampm, 'end'), $end_time_minutes); + } + + if($end_date === $start_date and $day_end_seconds < $day_start_seconds) + { + $day_end_seconds = $day_start_seconds; + + $end_time_hour = $start_time_hour; + $end_time_minutes = $start_time_minutes; + $end_time_ampm = $start_time_ampm; + + $date['end']['hour'] = $start_time_hour; + $date['end']['minutes'] = $start_time_minutes; + $date['end']['ampm'] = $start_time_ampm; + } + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + if($start_time_hour < 12) $start_time_ampm = 'AM'; + elseif($start_time_hour == 12) $start_time_ampm = 'PM'; + elseif($start_time_hour > 12) + { + $start_time_hour -= 12; + $start_time_ampm = 'PM'; + } + + if($start_time_hour == 0) + { + $start_time_hour = 12; + $start_time_ampm = 'AM'; + } + + if($end_time_hour < 12) $end_time_ampm = 'AM'; + elseif($end_time_hour == 12) $end_time_ampm = 'PM'; + elseif($end_time_hour > 12) + { + $end_time_hour -= 12; + $end_time_ampm = 'PM'; + } + + if($end_time_hour == 0) + { + $end_time_hour = 12; + $end_time_ampm = 'AM'; + } + + // Set converted values to date array + $date['start']['hour'] = $start_time_hour; + $date['start']['ampm'] = $start_time_ampm; + + $date['end']['hour'] = $end_time_hour; + $date['end']['ampm'] = $end_time_ampm; + } + + $allday = isset($date['allday']) ? 1 : 0; + $one_occurrence = isset($date['one_occurrence']) ? 1 : 0; + $hide_time = isset($date['hide_time']) ? 1 : 0; + $hide_end_time = isset($date['hide_end_time']) ? 1 : 0; + $comment = isset($date['comment']) ? sanitize_text_field($date['comment']) : ''; + $timezone = (isset($_mec['timezone']) and trim($_mec['timezone']) != '') ? sanitize_text_field($_mec['timezone']) : 'global'; + $countdown_method = (isset($_mec['countdown_method']) and trim($_mec['countdown_method']) != '') ? sanitize_text_field($_mec['countdown_method']) : 'global'; + $style_per_event = (isset($_mec['style_per_event']) and trim($_mec['style_per_event']) != '') ? sanitize_text_field($_mec['style_per_event']) : 'global'; + $trailer_url = (isset($_mec['trailer_url']) and trim($_mec['trailer_url']) != '') ? sanitize_url($_mec['trailer_url']) : ''; + $trailer_title = isset($_mec['trailer_title']) ? sanitize_text_field($_mec['trailer_title']) : ''; + $public = (isset($_mec['public']) and trim($_mec['public']) != '') ? sanitize_text_field($_mec['public']) : 1; + + // Set start time and end time if event is all day + if($allday == 1) + { + $start_time_hour = '8'; + $start_time_minutes = '00'; + $start_time_ampm = 'AM'; + + $end_time_hour = '6'; + $end_time_minutes = '00'; + $end_time_ampm = 'PM'; + } + + // Repeat Options + $repeat = $date['repeat'] ?? []; + $certain_weekdays = $repeat['certain_weekdays'] ?? []; + + $repeat_status = isset($repeat['status']) ? 1 : 0; + $repeat_type = ($repeat_status and isset($repeat['type'])) ? $repeat['type'] : ''; + + // Unset Repeat if no days are selected + if($repeat_type == 'certain_weekdays' && (!is_array($certain_weekdays) || !count($certain_weekdays))) + { + $repeat_status = 0; + $repeat['status'] = 0; + $repeat['type'] = ''; + } + + $repeat_interval = ($repeat_status and isset($repeat['interval']) and trim($repeat['interval'])) ? $repeat['interval'] : 1; + + // Advanced Repeat + $advanced = isset($repeat['advanced']) ? sanitize_text_field($repeat['advanced']) : ''; + + if(!is_numeric($repeat_interval)) $repeat_interval = null; + + if($repeat_type == 'weekly') $interval_multiply = 7; + else $interval_multiply = 1; + + // Reset certain weekdays if repeat type is not set to certain weekdays + if($repeat_type != 'certain_weekdays') $certain_weekdays = []; + + if(!is_null($repeat_interval)) $repeat_interval = $repeat_interval * $interval_multiply; + + // String To Array + if($repeat_type == 'advanced' and trim($advanced)) $advanced = explode('-', $advanced); + else $advanced = []; + + $repeat_end = ($repeat_status and isset($repeat['end'])) ? $repeat['end'] : ''; + $repeat_end_at_occurrences = ($repeat_status && isset($repeat['end_at_occurrences']) && is_numeric($repeat['end_at_occurrences'])) ? $repeat['end_at_occurrences'] - 1 : 9; + $repeat_end_at_date = ($repeat_status and isset($repeat['end_at_date'])) ? $this->main->standardize_format( $repeat['end_at_date'] ) : ''; + + // Previous Date Times + $prev_start_datetime = get_post_meta($post_id, 'mec_start_datetime', true); + $prev_end_datetime = get_post_meta($post_id, 'mec_end_datetime', true); + + $start_datetime = $start_date.' '.sprintf('%02d', $start_time_hour).':'.sprintf('%02d', $start_time_minutes).' '.$start_time_ampm; + $end_datetime = $end_date.' '.sprintf('%02d', $end_time_hour).':'.sprintf('%02d', $end_time_minutes).' '.$end_time_ampm; + + update_post_meta($post_id, 'mec_date', $date); + update_post_meta($post_id, 'mec_repeat', $repeat); + update_post_meta($post_id, 'mec_certain_weekdays', $certain_weekdays); + update_post_meta($post_id, 'mec_allday', $allday); + update_post_meta($post_id, 'one_occurrence', $one_occurrence); + update_post_meta($post_id, 'mec_hide_time', $hide_time); + update_post_meta($post_id, 'mec_hide_end_time', $hide_end_time); + update_post_meta($post_id, 'mec_comment', $comment); + update_post_meta($post_id, 'mec_timezone', $timezone); + update_post_meta($post_id, 'mec_countdown_method', $countdown_method); + update_post_meta($post_id, 'mec_style_per_event', $style_per_event); + update_post_meta($post_id, 'mec_trailer_url', $trailer_url); + update_post_meta($post_id, 'mec_trailer_title', $trailer_title); + update_post_meta($post_id, 'mec_public', $public); + + do_action('update_custom_post_meta', $date, $post_id); + + update_post_meta($post_id, 'mec_start_date', $start_date); + update_post_meta($post_id, 'mec_start_time_hour', $start_time_hour); + update_post_meta($post_id, 'mec_start_time_minutes', $start_time_minutes); + update_post_meta($post_id, 'mec_start_time_ampm', $start_time_ampm); + update_post_meta($post_id, 'mec_start_day_seconds', $day_start_seconds); + update_post_meta($post_id, 'mec_start_datetime', $start_datetime); + + update_post_meta($post_id, 'mec_end_date', $end_date); + update_post_meta($post_id, 'mec_end_time_hour', $end_time_hour); + update_post_meta($post_id, 'mec_end_time_minutes', $end_time_minutes); + update_post_meta($post_id, 'mec_end_time_ampm', $end_time_ampm); + update_post_meta($post_id, 'mec_end_day_seconds', $day_end_seconds); + update_post_meta($post_id, 'mec_end_datetime', $end_datetime); + + update_post_meta($post_id, 'mec_repeat_status', $repeat_status); + update_post_meta($post_id, 'mec_repeat_type', $repeat_type); + update_post_meta($post_id, 'mec_repeat_interval', $repeat_interval); + update_post_meta($post_id, 'mec_repeat_end', $repeat_end); + update_post_meta($post_id, 'mec_repeat_end_at_occurrences', $repeat_end_at_occurrences); + update_post_meta($post_id, 'mec_repeat_end_at_date', $repeat_end_at_date); + update_post_meta($post_id, 'mec_advanced_days', $advanced); + + // Event Sequence (Used in iCal feed) + $sequence = (int) get_post_meta($post_id, 'mec_sequence', true); + update_post_meta($post_id, 'mec_sequence', ($sequence + 1)); + + // For Event Notification Badge. + if(!current_user_can('administrator')) update_post_meta($post_id, 'mec_event_date_submit', date('YmdHis', current_time('timestamp', 0))); + + // Creating $event array for inserting in mec_events table + $event = array( + 'post_id' => $post_id, + 'start' => $start_date, + 'repeat' => $repeat_status, + 'rinterval' => (!in_array($repeat_type, array('daily', 'weekly', 'monthly')) ? null : $repeat_interval), + 'time_start' => $day_start_seconds, + 'time_end' => $day_end_seconds, + ); + + $year = null; + $month = null; + $day = null; + $week = null; + $weekday = null; + $weekdays = null; + + // MEC weekdays + $mec_weekdays = $this->main->get_weekdays(); + + // MEC weekends + $mec_weekends = $this->main->get_weekends(); + + $plus_date = ''; + if($repeat_type == 'daily') + { + $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Days'; + } + elseif($repeat_type == 'weekly') + { + $plus_date = '+' . $repeat_end_at_occurrences * ($repeat_interval) . ' Days'; + } + elseif($repeat_type == 'weekday') + { + $repeat_interval = 1; + $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Weekdays'; + + $weekdays = ',' . implode(',', $mec_weekdays) . ','; + } + elseif($repeat_type == 'weekend') + { + $repeat_interval = 1; + $plus_date = '+' . round($repeat_end_at_occurrences / 2) * ($repeat_interval * 7) . ' Days'; + + $weekdays = ',' . implode(',', $mec_weekends) . ','; + } + elseif($repeat_type == 'certain_weekdays') + { + $repeat_interval = 1; + $plus_date = '+' . ceil(($repeat_end_at_occurrences * $repeat_interval) * (7 / count($certain_weekdays))) . ' days'; + + $weekdays = ',' . implode(',', $certain_weekdays) . ','; + } + elseif($repeat_type == 'monthly') + { + $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Months'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ',' . implode(',', array_unique($_days)) . ','; + + $week = '*'; + $weekday = '*'; + } + elseif($repeat_type == 'yearly') + { + $plus_date = '+' . $repeat_end_at_occurrences * $repeat_interval . ' Years'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $_months = array_unique($_months); + + $month = ',' . implode(',', array($_months[0])) . ','; + $day = ',' . implode(',', array_unique($_days)) . ','; + + $week = '*'; + $weekday = '*'; + } + elseif($repeat_type == "advanced") + { + // Render class object + $this->render = $this->getRender(); + + // Get finish date + $event_info = array('start' => $date['start'], 'end' => $date['end']); + $dates = $this->render->generate_advanced_days($advanced, $event_info, $repeat_end_at_occurrences, $start_date, 'events'); + + $period_date = $this->main->date_diff($start_date, end($dates)['end']['date']); + $plus_date = '+' . $period_date->days . ' Days'; + } + + $in_days_arr = (isset($_mec['in_days']) and is_array($_mec['in_days']) and count($_mec['in_days'])) ? array_unique($_mec['in_days']) : []; + $not_in_days_arr = (isset($_mec['not_in_days']) and is_array($_mec['not_in_days']) and count($_mec['not_in_days'])) ? array_unique($_mec['not_in_days']) : []; + + $in_days = ''; + if(count($in_days_arr)) + { + if(isset($in_days_arr[':i:'])) unset($in_days_arr[':i:']); + + $in_days_arr = array_map(function($value) + { + $ex = explode(':', $value); + + $in_days_times = ''; + if(isset($ex[2]) and isset($ex[3])) + { + $in_days_start_time = $ex[2]; + $in_days_end_time = $ex[3]; + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $ex_start_time = explode('-', $in_days_start_time); + $ex_end_time = explode('-', $in_days_end_time); + + $in_days_start_hour = $ex_start_time[0]; + $in_days_start_minutes = $ex_start_time[1]; + $in_days_start_ampm = $ex_start_time[2]; + + $in_days_end_hour = $ex_end_time[0]; + $in_days_end_minutes = $ex_end_time[1]; + $in_days_end_ampm = $ex_end_time[2]; + + if(trim($in_days_start_ampm) == '') + { + if($in_days_start_hour < 12) $in_days_start_ampm = 'AM'; + elseif($in_days_start_hour == 12) $in_days_start_ampm = 'PM'; + elseif($in_days_start_hour > 12) + { + $in_days_start_hour -= 12; + $in_days_start_ampm = 'PM'; + } + elseif($in_days_start_hour == 0) + { + $in_days_start_hour = 12; + $in_days_start_ampm = 'AM'; + } + } + + if(trim($in_days_end_ampm) == '') + { + if($in_days_end_hour < 12) $in_days_end_ampm = 'AM'; + elseif($in_days_end_hour == 12) $in_days_end_ampm = 'PM'; + elseif($in_days_end_hour > 12) + { + $in_days_end_hour -= 12; + $in_days_end_ampm = 'PM'; + } + elseif($in_days_end_hour == 0) + { + $in_days_end_hour = 12; + $in_days_end_ampm = 'AM'; + } + } + + if(strlen($in_days_start_hour) == 1) $in_days_start_hour = '0'.$in_days_start_hour; + if(strlen($in_days_start_minutes) == 1) $in_days_start_minutes = '0'.$in_days_start_minutes; + + if(strlen($in_days_end_hour) == 1) $in_days_end_hour = '0'.$in_days_end_hour; + if(strlen($in_days_end_minutes) == 1) $in_days_end_minutes = '0'.$in_days_end_minutes; + + $in_days_start_time = $in_days_start_hour.'-'.$in_days_start_minutes.'-'.$in_days_start_ampm; + $in_days_end_time = $in_days_end_hour.'-'.$in_days_end_minutes.'-'.$in_days_end_ampm; + } + + $in_days_times = ':'.$in_days_start_time.':'.$in_days_end_time; + } + + return $this->main->standardize_format($ex[0]) . ':' . $this->main->standardize_format($ex[1]).$in_days_times; + }, $in_days_arr); + + usort($in_days_arr, function($a, $b) + { + $ex_a = explode(':', $a); + $ex_b = explode(':', $b); + + $date_a = $ex_a[0]; + $date_b = $ex_b[0]; + + $in_day_a_time_label = ''; + if(isset($ex_a[2])) + { + $in_day_a_time = $ex_a[2]; + $pos = strpos($in_day_a_time, '-'); + if($pos !== false) $in_day_a_time_label = substr_replace($in_day_a_time, ':', $pos, 1); + + $in_day_a_time_label = str_replace('-', ' ', $in_day_a_time_label); + } + + $in_day_b_time_label = ''; + if(isset($ex_b[2])) + { + $in_day_b_time = $ex_b[2]; + $pos = strpos($in_day_b_time, '-'); + if($pos !== false) $in_day_b_time_label = substr_replace($in_day_b_time, ':', $pos, 1); + + $in_day_b_time_label = str_replace('-', ' ', $in_day_b_time_label); + } + + return strtotime(trim($date_a.' '.$in_day_a_time_label)) - strtotime(trim($date_b.' '.$in_day_b_time_label)); + }); + + if(!isset($in_days_arr[':i:'])) $in_days_arr[':i:'] = ':val:'; + foreach($in_days_arr as $key => $in_day_arr) + { + if(is_numeric($key)) $in_days .= $in_day_arr . ','; + } + } + + $not_in_days = ''; + if(count($not_in_days_arr)) + { + foreach($not_in_days_arr as $key => $not_in_day_arr) + { + if(is_numeric($key)) $not_in_days .= $this->main->standardize_format( $not_in_day_arr ) . ','; + } + } + + $in_days = trim($in_days, ', '); + $not_in_days = trim($not_in_days, ', '); + + update_post_meta($post_id, 'mec_in_days', $in_days); + update_post_meta($post_id, 'mec_not_in_days', $not_in_days); + + // Repeat End Date + if($repeat_end == 'date') $repeat_end_date = $repeat_end_at_date; + elseif($repeat_end == 'occurrences') + { + if($plus_date) $repeat_end_date = date('Y-m-d', strtotime($plus_date, strtotime($end_date))); + else $repeat_end_date = '0000-00-00'; + } + else $repeat_end_date = '0000-00-00'; + + // If event is not repeating then set the end date of event correctly + if(!$repeat_status or $repeat_type == 'custom_days') $repeat_end_date = $end_date; + + // Add parameters to the $event + $event['end'] = $repeat_end_date; + $event['year'] = $year; + $event['month'] = $month; + $event['day'] = $day; + $event['week'] = $week; + $event['weekday'] = $weekday; + $event['weekdays'] = $weekdays; + $event['days'] = $in_days; + $event['not_in_days'] = $not_in_days; + + // Update MEC Events Table + $mec_event_id = $this->db->select("SELECT `id` FROM `#__mec_events` WHERE `post_id`='$post_id'", 'loadResult'); + + if(!$mec_event_id) + { + $q1 = ''; + $q2 = ''; + + foreach($event as $key => $value) + { + $q1 .= "`$key`,"; + + if(is_null($value)) $q2 .= 'NULL,'; + else $q2 .= "'$value',"; + } + + $this->db->q('INSERT INTO `#__mec_events` (' . trim($q1, ', ') . ') VALUES (' . trim($q2, ', ') . ')', 'INSERT'); + } + else + { + $q = ''; + + foreach($event as $key => $value) + { + if(is_null($value)) $q .= "`$key`=NULL,"; + else $q .= "`$key`='$value',"; + } + + $this->db->q('UPDATE `#__mec_events` SET ' . trim($q, ', ') . " WHERE `id`='$mec_event_id'"); + } + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($post_id, $schedule->get_reschedule_maximum($repeat_type)); + + // Hourly Schedule Options + $raw_hourly_schedules = $_mec['hourly_schedules'] ?? []; + unset($raw_hourly_schedules[':d:']); + + $hourly_schedules = []; + foreach($raw_hourly_schedules as $raw_hourly_schedule) + { + if(isset($raw_hourly_schedule['schedules'][':i:'])) unset($raw_hourly_schedule['schedules'][':i:']); + $hourly_schedules[] = $raw_hourly_schedule; + } + + update_post_meta($post_id, 'mec_hourly_schedules', $hourly_schedules); + + // Booking and Ticket Options + $booking = $_mec['booking'] ?? []; + update_post_meta($post_id, 'mec_booking', $booking); + + $tickets = $_mec['tickets'] ?? []; + if(isset($tickets[':i:'])) unset($tickets[':i:']); + + // Unset Ticket Dats + if(count($tickets)) + { + $new_tickets = []; + foreach($tickets as $key => $ticket) + { + unset($ticket['dates'][':j:']); + $ticket_start_time_ampm = ((isset($ticket['ticket_start_time_hour']) and (intval($ticket['ticket_start_time_hour']) > 0 and intval($ticket['ticket_start_time_hour']) < 13) and isset($ticket['ticket_start_time_ampm'])) ? $ticket['ticket_start_time_ampm'] : ''); + $ticket_render_start_time = ((isset($ticket['ticket_start_time_hour']) and $ticket['ticket_start_time_hour']) ? date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_start_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_start_time_minute']) . $ticket_start_time_ampm)) : ''); + $ticket_end_time_ampm = ((isset($ticket['ticket_end_time_hour']) and (intval($ticket['ticket_end_time_hour']) > 0 and intval($ticket['ticket_end_time_hour']) < 13) and isset($ticket['ticket_end_time_ampm'])) ? $ticket['ticket_end_time_ampm'] : ''); + $ticket_render_end_time = ((isset($ticket['ticket_end_time_hour']) and $ticket['ticket_end_time_hour']) ? date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_end_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_end_time_minute']) . $ticket_end_time_ampm)) : ''); + + $ticket['ticket_start_time_hour'] = substr($ticket_render_start_time, 0, 2); + $ticket['ticket_start_time_ampm'] = strtoupper(substr($ticket_render_start_time, 5, 6)); + $ticket['ticket_end_time_hour'] = substr($ticket_render_end_time, 0, 2); + $ticket['ticket_end_time_ampm'] = strtoupper(substr($ticket_render_end_time, 5, 6)); + $ticket['price'] = trim($ticket['price']); + $ticket['limit'] = trim($ticket['limit']); + $ticket['minimum_ticket'] = trim($ticket['minimum_ticket']); + $ticket['stop_selling_value'] = trim($ticket['stop_selling_value']); + $ticket['category_ids'] = !empty( $ticket['category_ids'] ) ? (array) $ticket['category_ids'] : []; + + // Bellow conditional block code is used to change ticket dates format to compatible ticket past dates structure for store in db. + foreach($ticket['dates'] as $dates_ticket_key => $dates_ticket_values) + { + if(isset($dates_ticket_values['start']) and trim($dates_ticket_values['start'])) + { + $ticket['dates'][$dates_ticket_key]['start'] = $this->main->standardize_format($dates_ticket_values['start']); + } + + if(isset($dates_ticket_values['end']) and trim($dates_ticket_values['end'])) + { + $ticket['dates'][$dates_ticket_key]['end'] = $this->main->standardize_format($dates_ticket_values['end']); + } + } + + $ticket['id'] = $key; + $new_tickets[$key] = $ticket; + } + + $tickets = $new_tickets; + } + + update_post_meta($post_id, 'mec_tickets', $tickets); + update_post_meta($post_id, 'mec_global_tickets_applied', 1); + + // Fee options + $fees_global_inheritance = isset($_mec['fees_global_inheritance']) ? sanitize_text_field($_mec['fees_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_fees_global_inheritance', $fees_global_inheritance); + + $fees = $_mec['fees'] ?? []; + if(isset($fees[':i:'])) unset($fees[':i:']); + + update_post_meta($post_id, 'mec_fees', $fees); + + // Ticket Variations options + $ticket_variations_global_inheritance = isset($_mec['ticket_variations_global_inheritance']) ? sanitize_text_field($_mec['ticket_variations_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_ticket_variations_global_inheritance', $ticket_variations_global_inheritance); + + $ticket_variations = $_mec['ticket_variations'] ?? []; + if(isset($ticket_variations[':i:'])) unset($ticket_variations[':i:']); + + update_post_meta($post_id, 'mec_ticket_variations', $ticket_variations); + + // Registration Fields options + $reg_fields_global_inheritance = isset($_mec['reg_fields_global_inheritance']) ? sanitize_text_field($_mec['reg_fields_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_reg_fields_global_inheritance', $reg_fields_global_inheritance); + + $reg_fields = $_mec['reg_fields'] ?? []; + if($reg_fields_global_inheritance) $reg_fields = []; + + do_action('mec_save_reg_fields', $post_id, $reg_fields); + update_post_meta($post_id, 'mec_reg_fields', $reg_fields); + + $bfixed_fields = $_mec['bfixed_fields'] ?? []; + if($reg_fields_global_inheritance) $bfixed_fields = []; + + do_action('mec_save_bfixed_fields', $post_id, $bfixed_fields); + update_post_meta($post_id, 'mec_bfixed_fields', $bfixed_fields); + + // Organizer Payment Options + $op = $_mec['op'] ?? []; + update_post_meta($post_id, 'mec_op', $op); + update_user_meta(get_post_field('post_author', $post_id), 'mec_op', $op); + + // MEC Fields + $fields = (isset($_mec['fields']) and is_array($_mec['fields'])) ? $_mec['fields'] : []; + update_post_meta($post_id, 'mec_fields', $fields); + + // Save fields one by one + foreach($fields as $field_id=>$values) + { + if(is_array($values)) + { + $values = array_unique($values); + $values = implode(',', $values); + } + + update_post_meta($post_id, 'mec_fields_'.$field_id, sanitize_text_field($values)); + } + + // Downloadable File + if(isset($_mec['downloadable_file'])) + { + $dl_file = sanitize_text_field($_mec['downloadable_file']); + update_post_meta($post_id, 'mec_dl_file', $dl_file); + } + + // Public Download Module File + if(isset($_mec['public_download_module_file'])) + { + $public_dl_file = isset($_mec['public_download_module_file']) ? sanitize_text_field($_mec['public_download_module_file']) : ''; + update_post_meta($post_id, 'mec_public_dl_file', $public_dl_file); + + $public_dl_title = isset($_mec['public_download_module_title']) ? sanitize_text_field($_mec['public_download_module_title']) : ''; + update_post_meta($post_id, 'mec_public_dl_title', $public_dl_title); + + $public_dl_description = isset($_mec['public_download_module_description']) ? sanitize_text_field($_mec['public_download_module_description']) : ''; + update_post_meta($post_id, 'mec_public_dl_description', $public_dl_description); + } + + // Event Gallery + $gallery = (isset($_mec['event_gallery']) and is_array($_mec['event_gallery'])) ? $_mec['event_gallery'] : []; + update_post_meta($post_id, 'mec_event_gallery', $gallery); + + // Related Events + $related_events = (isset($_mec['related_events']) and is_array($_mec['related_events'])) ? $_mec['related_events'] : []; + update_post_meta($post_id, 'mec_related_events', $related_events); + + // Event Banner + $event_banner = (isset($_mec['banner']) and is_array($_mec['banner'])) ? $_mec['banner'] : []; + update_post_meta($post_id, 'mec_banner', $event_banner); + + // Notifications + if(isset($_mec['notifications'])) + { + $notifications = (isset($_mec['notifications']) and is_array($_mec['notifications'])) ? $_mec['notifications'] : []; + update_post_meta($post_id, 'mec_notifications', $notifications); + } + + // Event Dates Changed? + if($prev_start_datetime and $prev_end_datetime and !$repeat_status and $prev_start_datetime != $start_datetime and $prev_end_datetime != $end_datetime) + { + $this->main->event_date_updated($post_id, $prev_start_datetime, $prev_end_datetime); + } + + $mec_update = (isset($_REQUEST['original_publish']) and strtolower(trim(sanitize_text_field($_REQUEST['original_publish']))) == 'publish') ? false : true; + do_action('mec_after_publish_admin_event', $post_id, $mec_update); + + // Save Event Data + do_action('mec_save_event_data', $post_id, $_mec); + } + + public function quick_edit($post_id) + { + // Validating And Verifying + if((!isset($_POST['screen']) || trim($_POST['screen']) != 'edit-mec-events') and !check_ajax_referer('inlineeditnonce', '_inline_edit', false)) return; + + $mec_locations = (isset($_POST['tax_input']['mec_location']) and trim($_POST['tax_input']['mec_location'])) ? array_filter(explode(',', sanitize_text_field($_POST['tax_input']['mec_location']))) : NULL; + $mec_organizers = (isset($_POST['tax_input']['mec_organizer']) and trim($_POST['tax_input']['mec_organizer'])) ? array_filter(explode(',', sanitize_text_field($_POST['tax_input']['mec_organizer']))) : NULL; + + // MEC Locations Quick Edit + $this->mec_locations_edit($post_id, $mec_locations, 'quick_edit'); + + // MEC Organizers Quick Edit + $this->mec_organizers_edit($post_id, $mec_organizers, 'quick_edit'); + } + + /** + * Publish an event + * @author Webnus + * @param string $new + * @param string $old + * @param WP_Post $post + * @return void + */ + public function event_published($new, $old, $post) + { + if($post->post_type !== $this->PT) return; + + // Fires after publish an event to send notifications etc. + do_action('mec_event_published', $new, $old, $post); + + // Update Status + $this->db->q("UPDATE `#__mec_dates` SET `status`='".esc_sql($new)."' WHERE `post_id`='".esc_sql($post->ID)."'"); + } + + /** + * Remove MEC event data after deleting a post permanently + * + * @author Webnus + * @param int $post_id + * @return boolean + */ + public function delete_event($post_id) + { + $post = get_post($post_id); + if($post->post_type !== $this->PT) return false; + + $this->db->q("DELETE FROM `#__mec_events` WHERE `post_id`='$post_id'"); + $this->db->q("DELETE FROM `#__mec_dates` WHERE `post_id`='$post_id'"); + $this->db->q("DELETE FROM `#__mec_occurrences` WHERE `post_id`='$post_id'"); + + return true; + } + + public function add_buttons($which) + { + $screen = get_current_screen(); + if($which === 'top' and $screen->post_type === $this->PT) + { + echo ''.esc_html__('Expired Events', 'modern-events-calendar-lite').''; + echo ' '.esc_html__('Upcoming Events', 'modern-events-calendar-lite').''; + } + } + + /** + * Add filter options in manage events page + * + * @author Webnus + * @param string $post_type + * @return void + */ + public function add_filters($post_type) + { + if($post_type != $this->PT) return; + + $datepicker_format = 'Y-m-d'; + $start_date = isset( $_GET['mec_start_date'] ) ? $_GET['mec_start_date'] : ''; + echo ''; + + $taxonomy = 'mec_label'; + if(wp_count_terms($taxonomy)) + { + wp_dropdown_categories( + array( + 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_labels', esc_html__('labels', 'modern-events-calendar-lite'))), + 'taxonomy' => $taxonomy, + 'name' => $taxonomy, + 'value_field' => 'slug', + 'orderby' => 'name', + 'order' => 'ASC', + 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), + 'show_count' => false, + 'hide_empty' => false, + ) + ); + } + + $taxonomy = 'mec_location'; + if(wp_count_terms($taxonomy)) + { + wp_dropdown_categories( + array( + 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_locations', esc_html__('locations', 'modern-events-calendar-lite'))), + 'taxonomy' => $taxonomy, + 'name' => $taxonomy, + 'value_field' => 'slug', + 'orderby' => 'name', + 'order' => 'ASC', + 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), + 'show_count' => false, + 'hide_empty' => false, + ) + ); + } + + $taxonomy = 'mec_organizer'; + if(wp_count_terms($taxonomy)) + { + wp_dropdown_categories( + array( + 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizers', esc_html__('organizers', 'modern-events-calendar-lite'))), + 'taxonomy' => $taxonomy, + 'name' => $taxonomy, + 'value_field' => 'slug', + 'orderby' => 'name', + 'order' => 'ASC', + 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), + 'show_count' => false, + 'hide_empty' => false, + ) + ); + } + + $taxonomy = 'mec_category'; + if(wp_count_terms($taxonomy)) + { + wp_dropdown_categories( + array( + 'show_option_all' => sprintf(esc_html__('Show all %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_categorys', esc_html__('Categories', 'modern-events-calendar-lite'))), + 'taxonomy' => $taxonomy, + 'name' => $taxonomy, + 'value_field' => 'slug', + 'orderby' => 'name', + 'order' => 'ASC', + 'selected' => (isset($_GET[$taxonomy]) ? sanitize_text_field($_GET[$taxonomy]) : ''), + 'show_count' => false, + 'hide_empty' => false, + ) + ); + } + + // Lightbox + echo ' +
    +
    '. esc_html__('Attendees List', 'modern-events-calendar-lite') .'
    +
    +
    + +
    +
    + +
    +
    +
    '; + } + + /** + * Filters columns of events feature + * + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_columns($columns) + { + unset($columns['comments']); + unset($columns['date']); + unset($columns['tags']); + + $columns['title'] = esc_html__('Title', 'modern-events-calendar-lite'); + $columns['category'] = esc_html__('Category', 'modern-events-calendar-lite'); + $columns['location'] = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); + $columns['organizer'] = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + $columns['start_date'] = esc_html__('Start Date', 'modern-events-calendar-lite'); + $columns['end_date'] = esc_html__('End Date', 'modern-events-calendar-lite'); + + // Sold Tickets + if($this->getPRO() && isset($this->settings['booking_status']) && $this->settings['booking_status']) $columns['tickets'] = esc_html__('Tickets', 'modern-events-calendar-lite'); + + $columns['repeat'] = esc_html__('Repeat', 'modern-events-calendar-lite'); + return $columns; + } + + /** + * Filters sortable columns of events feature + * + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_sortable_columns($columns) + { + $columns['start_date'] = 'start_date'; + $columns['end_date'] = 'end_date'; + + return $columns; + } + + /** + * Filters columns content of events feature + * + * @author Webnus + * @param string $column_name + * @param int $post_id + * @return string + */ + public function filter_columns_content($column_name, $post_id) + { + if($column_name == 'location') + { + $location = get_term(get_post_meta($post_id, 'mec_location_id', true)); + echo (isset($location->name) && 'uncategorized' !== $location->slug ? esc_html($location->name) : '----'); + } + elseif($column_name == 'organizer') + { + $organizer = get_term(get_post_meta($post_id, 'mec_organizer_id', true)); + echo (isset($organizer->name) && 'uncategorized' !== $organizer->slug ? esc_html($organizer->name) : '----'); + } + elseif($column_name == 'start_date') + { + $datetime_format = get_option('date_format', 'Y-n-d').' '.get_option('time_format', 'H:i'); + $date = get_post_meta($post_id, 'mec_start_date', true); + + echo esc_html($this->main->date_i18n($datetime_format, (strtotime($date) + ((int) get_post_meta($post_id, 'mec_start_day_seconds', true))), $post_id)); + } + elseif($column_name == 'end_date') + { + $datetime_format = get_option('date_format', 'Y-n-d').' '.get_option('time_format', 'H:i'); + $date = get_post_meta($post_id, 'mec_end_date', true); + + echo esc_html($this->main->date_i18n($datetime_format, (strtotime($date) + ((int) get_post_meta($post_id, 'mec_end_day_seconds', true))), $post_id)); + } + elseif($column_name == 'tickets') + { + $book = $this->getBook(); + + echo esc_html($book->get_all_sold_tickets($post_id)).' / '.$book->get_total_tickets($post_id); + } + elseif($column_name == 'repeat') + { + $repeat_type = get_post_meta($post_id, 'mec_repeat_type', true); + echo esc_html(ucwords(str_replace('_', ' ', $repeat_type))); + } + elseif($column_name == 'category') + { + $post_categories = get_the_terms($post_id, 'mec_category'); + if($post_categories) foreach($post_categories as $post_category) $categories[] = $post_category->name; + if(!empty($categories)) + { + $category_name = implode(",", $categories); + echo esc_html($category_name); + } + } + } + + /** + * Sort events if sorted by custom columns + * + * @author Webnus + * @param object $query + * @return void + */ + public function filter($query) + { + if(!is_admin() or $query->get('post_type') != $this->PT) return; + + $meta_query = []; + $order_query = []; + + $orderby = $query->get('orderby'); + $order = $query->get('order'); + + $expired = (isset($_REQUEST['mec-expired']) ? sanitize_text_field($_REQUEST['mec-expired']) : 0); + if($expired) + { + $today = current_time('Y-m-d'); + $today_seconds = $this->main->time_to_seconds(current_time('H'), current_time('i'), current_time('s')); + + $expired_ids = $this->db->select("SELECT post_id FROM `#__mec_events` WHERE `end` != '0000-00-00' AND `end` < '".$today."' OR (`end` = '".$today."' AND `time_end` <= '".$today_seconds."')", 'loadColumn'); + + $filtered_ids = []; + foreach($expired_ids as $expired_id) + { + $custom_days = $this->db->select("SELECT days FROM `#__mec_events` WHERE `post_id` = '".esc_sql($expired_id)."'", 'loadResult'); + if(!$custom_days) $filtered_ids[] = $expired_id; + else + { + $ex = explode(',', $custom_days); + $last = end($ex); + + $parts = explode(':', $last); + + $last_date = $parts[1] ?? ''; + $last_time = $parts[3] ?? ''; + $last_time = str_replace('-AM', ' AM', $last_time); + $last_time = str_replace('-PM', ' PM', $last_time); + $last_time = str_replace('-', ':', $last_time); + + $last_datetime = $last_date.' '.$last_time; + if(trim($last_datetime) === '' || strtotime($last_datetime) < current_time('timestamp')) $filtered_ids[] = $expired_id; + } + } + + if(!count($filtered_ids)) $filtered_ids = [0]; + + $query->set('post__in', $filtered_ids); + + if(!trim($orderby)) $orderby = 'end_date'; + if(!trim($order)) $order = 'asc'; + } + + $upcoming = (isset($_REQUEST['mec-upcoming']) ? sanitize_text_field($_REQUEST['mec-upcoming']) : 0); + if($upcoming) + { + $now = current_time('Y-m-d H:i:s'); + + $post_id_rows = $this->db->select("SELECT `post_id` FROM `#__mec_dates` WHERE `tstart` >= '".strtotime($now)."' GROUP BY `post_id`", 'loadObjectList'); + + $post_ids = []; + foreach($post_id_rows as $post_id_row) $post_ids[] = $post_id_row->post_id; + + $post_ids = array_unique($post_ids); + $query->set('post__in', $post_ids); + + if(!trim($orderby)) $orderby = 'start_date'; + } + + if($orderby == 'start_date') + { + $meta_query['mec_start_date'] = array( + 'key' => 'mec_start_date', + ); + + $meta_query['mec_start_day_seconds'] = array( + 'key' => 'mec_start_day_seconds', + ); + + $order_query = array( + 'mec_start_date' => $query->get('order'), + 'mec_start_day_seconds' => $query->get('order'), + ); + } + elseif($orderby == 'end_date') + { + $meta_query['mec_end_date'] = array( + 'key' => 'mec_end_date', + ); + + $meta_query['mec_end_day_seconds'] = array( + 'key' => 'mec_end_day_seconds', + ); + + $order_query = array( + 'mec_end_date' => $order, + 'mec_end_day_seconds' => $order, + ); + } + + $start_date = isset( $_GET['mec_start_date'] ) ? $_GET['mec_start_date'] : ''; + if( !empty( $start_date ) ){ + + $meta_query['mec_start_date'] = array( + 'key' => 'mec_start_date', + 'value' => date( 'Y-m-d', strtotime( $start_date ) ), + 'compare' => '=', + 'type' => 'DATE' + ); + } + + if(count($meta_query)) $query->set('meta_query', $meta_query); + if(count($order_query)) $query->set('orderby', $order_query); + } + + public function add_bulk_actions() + { + global $post_type; + + if ($post_type == $this->PT) { + ?> + + current_action(); + if(!$action) return false; + + $post_type = isset($_GET['post_type']) ? sanitize_text_field($_GET['post_type']) : 'post'; + if($post_type != $this->PT) return false; + + check_admin_referer('bulk-posts'); + + switch($action) + { + case 'ical-export': + + $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + $events = ''; + + foreach($post_ids as $post_id) $events .= $this->main->ical_single((int) $post_id); + $ical_calendar = $this->main->ical_calendar($events); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.ics"'); + + echo MEC_kses::full($ical_calendar); + + exit; + + case 'ms-excel-export': + + $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.xlsx'; + + $rows = $this->csvexcel(); + $this->main->generate_download_excel($rows, $filename); + + exit; + + case 'csv-export': + + $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'; + + $rows = $this->csvexcel(); + $this->main->generate_download_csv($rows, $filename); + + exit; + + case 'g-cal-csv-export': + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'); + + $this->gcalcsv(); + + exit; + + case 'xml-export': + + $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + + $events = []; + foreach($post_ids as $post_id) $events[] = $this->main->export_single((int) $post_id); + + $xml_feed = $this->main->xml_convert(array('events' => $events)); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.xml"'); + + echo $xml_feed; + + exit; + + case 'json-export': + + $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + + $events = []; + foreach($post_ids as $post_id) $events[] = $this->main->export_single((int) $post_id); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-' . date('YmdTHi') . '.json"'); + + echo json_encode($events); + + exit; + + case 'duplicate': + + $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + foreach($post_ids as $post_id) $this->main->duplicate((int) $post_id); + + break; + + default: + return false; + } + + wp_redirect('edit.php?post_type=' . $this->main->get_main_post_type()); + exit; + } + + public function csvexcel($export_all = false) + { + // MEC Render Library + $render = $this->getRender(); + + if($export_all) $post_ids = get_posts('post_type=mec-events&fields=ids&posts_per_page=-1'); + else $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + + $columns = array( + esc_html__('ID', 'modern-events-calendar-lite'), + esc_html__('Title', 'modern-events-calendar-lite'), + esc_html__('Description', 'modern-events-calendar-lite'), + esc_html__('Start Date', 'modern-events-calendar-lite'), + esc_html__('Start Time', 'modern-events-calendar-lite'), + esc_html__('End Date', 'modern-events-calendar-lite'), + esc_html__('End Time', 'modern-events-calendar-lite'), + esc_html__('Link', 'modern-events-calendar-lite'), + $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')), + esc_html__('Address', 'modern-events-calendar-lite'), + $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')), + sprintf(esc_html__('%s Tel', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))), + sprintf(esc_html__('%s Email', 'modern-events-calendar-lite'), $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))), + $this->main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite')), + esc_html__('Featured Image', 'modern-events-calendar-lite'), + esc_html__('Labels', 'modern-events-calendar-lite'), + esc_html__('Categories', 'modern-events-calendar-lite'), + esc_html__('Tags', 'modern-events-calendar-lite'), + ); + + // Speakers + if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $columns[] = esc_html__('Speakers', 'modern-events-calendar-lite'); + + // Event Fields + $fields = $this->main->get_event_fields(); + if(!is_array($fields)) $fields = []; + + foreach($fields as $f => $field) + { + if(!is_numeric($f)) continue; + if(!isset($field['label']) or trim($field['label']) == '') continue; + + $columns[] = stripslashes($field['label']); + } + + $rows = []; + $rows[] = $columns; + + foreach($post_ids as $post_id) + { + $post_id = (int) $post_id; + + $data = $render->data($post_id); + $dates = $render->dates($post_id, $data); + $date = $dates[0] ?? []; + + // No Date + if(!count($date)) continue; + + $location = $data->locations[$data->meta['mec_location_id']] ?? []; + $organizer = $data->organizers[$data->meta['mec_organizer_id']] ?? []; + $cost = $data->meta['mec_cost'] ?? null; + + $taxonomies = array('mec_label', 'mec_category', apply_filters('mec_taxonomy_tag', '')); + if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $taxonomies[] = 'mec_speaker'; + + $labels = []; + $categories = []; + $tags = []; + $speakers = []; + + $terms = wp_get_post_terms($post_id, $taxonomies, array('fields'=>'all')); + foreach($terms as $term) + { + // First Validation + if(!isset($term->taxonomy)) continue; + + if($term->taxonomy == 'mec_label') $labels[] = $term->name; + elseif($term->taxonomy == 'mec_category') $categories[] = $term->name; + elseif($term->taxonomy == apply_filters('mec_taxonomy_tag', '')) $tags[] = $term->name; + elseif($term->taxonomy == 'mec_speaker') $speakers[] = $term->name; + } + + $event = array( + $post_id, + html_entity_decode($data->title, ENT_QUOTES | ENT_HTML5), + html_entity_decode(strip_tags($data->content), ENT_QUOTES | ENT_HTML5), + $date['start']['date'], + $data->time['start'], + $date['end']['date'], + $data->time['end'], + $data->permalink, + ($location['name'] ?? ''), + ($location['address'] ?? ''), + ($organizer['name'] ?? ''), + ($organizer['tel'] ?? ''), + ($organizer['email'] ?? ''), + (is_numeric($cost) ? $this->main->render_price($cost, $post_id) : $cost), + $this->main->get_post_thumbnail_url($post_id), + implode(', ', $labels), + implode(', ', $categories), + implode(', ', $tags), + ); + + // Speakers + if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) $event[] = implode(', ', $speakers); + + // Event Fields + if(isset($data->fields) and is_array($data->fields) and count($data->fields)) + { + foreach($data->fields as $field) $event[] = $field['value']; + } + + $rows[] = $event; + } + + return $rows; + } + + public function gcalcsv($export_all = false) + { + // MEC Render Library + $render = $this->getRender(); + + if($export_all) $post_ids = get_posts('post_type=mec-events&fields=ids&posts_per_page=-1'); + else $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + + // Do not translate these column names + $columns = array( + 'Subject', + 'Start Date', + 'Start Time', + 'End Date', + 'End Time', + 'All Day Event', + 'Description', + 'Location', + 'Private', + ); + + $delimiter = ','; + + $output = fopen('php://output', 'w'); + fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); + fputcsv($output, $columns, $delimiter); + + foreach($post_ids as $post_id) + { + $post_id = (int) $post_id; + + $data = $render->data($post_id); + $dates = $render->dates($post_id, $data); + $date = $dates[0]; + + $start_date = $date['start']['date']; + $start_time = $data->time['start']; + $end_date = $date['end']['date']; + $end_time = $data->time['end']; + + $start_timestamp = isset($date['start'], $date['start']['timestamp']) ? $date['start']['timestamp'] : NULL; + $end_timestamp = isset($date['end'], $date['end']['timestamp']) ? $date['end']['timestamp'] : NULL; + + if($start_timestamp) + { + $start_date = date('m/d/Y', $start_timestamp); + $start_time = date('h:i A', $start_timestamp); + } + + if($end_timestamp) + { + $end_date = date('m/d/Y', $end_timestamp); + $end_time = date('h:i A', $end_timestamp); + } + + $location = $data->locations[$data->meta['mec_location_id']] ?? []; + $allday = (boolean) get_post_meta($post_id, 'mec_allday', true); + + $public = get_post_meta($post_id, 'mec_public', true); + if(trim($public) === '') $public = 1; + + $event = array( + html_entity_decode($data->title, ENT_QUOTES | ENT_HTML5), + $start_date, + $start_time, + $end_date, + $end_time, + ($allday ? 'True' : 'False'), + html_entity_decode(strip_tags($data->content), ENT_QUOTES | ENT_HTML5), + $location['address'] ?? '', + ($public ? 'True' : 'False') + ); + + fputcsv($output, $event, $delimiter); + } + } + + public function action_links($actions, $post) + { + if($post->post_type != $this->PT) return $actions; + + // Editor and Higher + if(current_user_can('edit_post', $post->ID)) + { + // Duplicate Button + $actions['mec-duplicate'] = ''.esc_html__('Duplicate', 'modern-events-calendar-lite').''; + } + + // Booking Button + if($this->getPRO() && current_user_can('edit_others_posts') && isset($this->settings['booking_status']) && $this->settings['booking_status']) $actions['mec-bookings'] = ''.esc_html__('Bookings', 'modern-events-calendar-lite').''; + + // Certificate Button + if($this->getPRO() && isset($this->settings['certificate_status']) && $this->settings['certificate_status']) $actions['mec-send-certificate'] = ''.esc_html__('Send Certificates', 'modern-events-calendar-lite').''; + + return $actions; + } + + public function duplicate_event() + { + // It's not a duplicate request + if(!isset($_GET['mec-action']) or sanitize_text_field($_GET['mec-action']) != 'duplicate-event') return false; + + // Event ID to duplicate + $id = isset($_GET['id']) ? (int) sanitize_text_field($_GET['id']) : 0; + if(!$id) return false; + + // Only editor and higher + if(!current_user_can('edit_post', $id)) return false; + + // Duplicate + $new_post_id = $this->main->duplicate($id); + + wp_redirect('post.php?post=' . $new_post_id . '&action=edit'); + exit; + } + + /** + * Do bulk edit Action + * + * @author Webnus + * @return void + */ + public function bulk_edit() + { + $post_ids = (isset($_GET['post']) and is_array($_GET['post']) and count($_GET['post'])) ? array_map('sanitize_text_field', wp_unslash($_GET['post'])) : []; + if(!count($post_ids)) return; + + $mec_locations = (isset($_GET['tax_input']['mec_location']) and trim($_GET['tax_input']['mec_location'])) ? array_filter(explode(',', sanitize_text_field($_GET['tax_input']['mec_location']))) : NULL; + $mec_organizers = (isset($_GET['tax_input']['mec_organizer']) and trim($_GET['tax_input']['mec_organizer'])) ? array_filter(explode(',', sanitize_text_field($_GET['tax_input']['mec_organizer']))) : NULL; + + if(!$mec_locations and !$mec_organizers) return; + + $taxonomies = []; + if(is_array($mec_locations)) $taxonomies[] = 'mec_location'; + if(is_array($mec_organizers)) $taxonomies[] = 'mec_organizer'; + + $terms = get_terms(array( + 'taxonomy' => $taxonomies, + )); + + foreach($post_ids as $post_id) + { + foreach($terms as $term) + { + $term_objects = get_objects_in_term($term->term_id, $term->taxonomy); + if(in_array($post_id, $term_objects)) wp_remove_object_terms($post_id, $term->term_id, $term->taxonomy); + } + + // MEC Locations Bulk Edit + $this->mec_locations_edit($post_id, $mec_locations); + + // MEC Organizers Bulk Edit + $this->mec_organizers_edit($post_id, $mec_organizers); + } + } + + // MEC Locations Edit. + public function mec_locations_edit($post_id, $mec_locations, $action = 'bulk_edit') + { + if(!is_null($mec_locations)) + { + $term_location = current($mec_locations); + if(!term_exists($term_location, 'mec_location')) wp_insert_term($term_location, 'mec_location', array()); + + $location_id = get_term_by('name', $term_location, 'mec_location')->term_id; + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + update_post_meta($post_id, 'mec_location_id', $location_id); + + if(count($mec_locations) > 1) + { + // Additional locations + $additional_location_ids = []; + + for($i = 1; $i < count($mec_locations); $i++) + { + if(!term_exists($mec_locations[$i], 'mec_location')) wp_insert_term($mec_locations[$i], 'mec_location', array()); + + $additional_location_id = get_term_by('name', $mec_locations[$i], 'mec_location')->term_id; + wp_set_object_terms($post_id, (int)$additional_location_id, 'mec_location', true); + $additional_location_ids[] = (int)$additional_location_id; + } + + update_post_meta($post_id, 'mec_additional_location_ids', $additional_location_ids); + } + } + elseif($action == 'quick_edit') + { + update_post_meta($post_id, 'mec_location_id', 0); + update_post_meta($post_id, 'mec_additional_location_ids', array()); + } + } + + // MEC Organizers Edit. + public function mec_organizers_edit($post_id, $mec_organizers, $action = 'bulk_edit') + { + if(!is_null($mec_organizers)) + { + $term_organizer = current($mec_organizers); + if(!term_exists($term_organizer, 'mec_organizer')) wp_insert_term($term_organizer, 'mec_organizer', array()); + + $organizer_id = get_term_by('name', current($mec_organizers), 'mec_organizer')->term_id; + wp_set_object_terms($post_id, (int)$organizer_id, 'mec_organizer'); + update_post_meta($post_id, 'mec_organizer_id', $organizer_id); + + if(count($mec_organizers) > 1) + { + // Additional organizers + $additional_organizer_ids = []; + + for($i = 1; $i < count($mec_organizers); $i++) + { + if(!term_exists($mec_organizers[$i], 'mec_organizer')) wp_insert_term($mec_organizers[$i], 'mec_organizer', array()); + + $additional_organizer_id = get_term_by('name', $mec_organizers[$i], 'mec_organizer')->term_id; + wp_set_object_terms($post_id, (int)$additional_organizer_id, 'mec_organizer', true); + $additional_organizer_ids[] = (int)$additional_organizer_id; + } + + update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); + } + } + elseif($action == 'quick_edit') + { + update_post_meta($post_id, 'mec_organizer_id', 0); + update_post_meta($post_id, 'mec_additional_organizer_ids', array()); + } + } + + public function icl_duplicate($master_post_id, $lang, $post, $id) + { + $master = get_post($master_post_id); + $target = get_post($id); + + if($master->post_type != $this->PT) return; + if($target->post_type != $this->PT) return; + + $already_duplicated = get_post_meta($id, 'mec_icl_duplicated', true); + if($already_duplicated) return; + + $master_location_id = get_post_meta($master_post_id, 'mec_location_id', true); + $target_location_id = apply_filters('wpml_object_id', $master_location_id, 'mec_location', true, $lang); + + update_post_meta($id, 'mec_location_id', $target_location_id); + + $master_additional_location_ids = get_post_meta($master_post_id, 'mec_additional_location_ids', true); + if(!is_array($master_additional_location_ids)) $master_additional_location_ids = []; + + $target_additional_location_ids = []; + foreach($master_additional_location_ids as $master_additional_location_id) + { + $target_additional_location_ids[] = apply_filters('wpml_object_id', $master_additional_location_id, 'mec_location', true, $lang); + } + + update_post_meta($id, 'mec_additional_location_ids', $target_additional_location_ids); + + $master_organizer_id = get_post_meta($master_post_id, 'mec_organizer_id', true); + $target_organizer_id = apply_filters('wpml_object_id', $master_organizer_id, 'mec_organizer', true, $lang); + + update_post_meta($id, 'mec_organizer_id', $target_organizer_id); + + $master_additional_organizer_ids = get_post_meta($master_post_id, 'mec_additional_organizer_ids', true); + if(!is_array($master_additional_organizer_ids)) $master_additional_organizer_ids = []; + + $target_additional_organizer_ids = []; + foreach($master_additional_organizer_ids as $master_additional_organizer_id) + { + $target_additional_organizer_ids[] = apply_filters('wpml_object_id', $master_additional_organizer_id, 'mec_location', true, $lang); + } + + update_post_meta($id, 'mec_additional_organizer_ids', $target_additional_organizer_ids); + + // MEC Tables + $this->db->q("INSERT INTO `#__mec_events` (`post_id`, `start`, `end`, `repeat`, `rinterval`, `year`, `month`, `day`, `week`, `weekday`, `weekdays`, `days`, `not_in_days`, `time_start`, `time_end`) SELECT '".$id."', `start`, `end`, `repeat`, `rinterval`, `year`, `month`, `day`, `week`, `weekday`, `weekdays`, `days`, `not_in_days`, `time_start`, `time_end` FROM `#__mec_events` WHERE `post_id`='".$master_post_id."'"); + + update_post_meta($id, 'mec_icl_duplicated', 1); + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($id); + } + + public function wpml_pro_translation_saved($new_post_id, $fields, $job) + { + global $iclTranslationManagement; + + $master_post_id = NULL; + if(is_object($job) and $iclTranslationManagement) + { + $element_type_prefix = $iclTranslationManagement->get_element_type_prefix_from_job($job); + $original_post = $iclTranslationManagement->get_post($job->original_doc_id, $element_type_prefix); + + if($original_post) $master_post_id = $original_post->ID; + } + + // Target Language + $lang_options = apply_filters('wpml_post_language_details', NULL, $new_post_id); + $lang = (is_array($lang_options) and isset($lang_options['language_code'])) ? $lang_options['language_code'] : ''; + + // Duplicate Content + if($master_post_id) $this->icl_duplicate($master_post_id, $lang, (new stdClass()), $new_post_id); + } + + public function set_fallback_image_id($value, $post_id, $meta_key, $single) + { + // Only on frontend + if(is_admin() and (!defined('DOING_AJAX') or (defined('DOING_AJAX') and !DOING_AJAX))) return $value; + + // Only for empty _thumbnail_id keys + if(!empty($meta_key) && '_thumbnail_id' !== $meta_key) return $value; + + // Only For Events + if(get_post_type($post_id) != $this->PT) return $value; + + // Get current Cache + $meta_cache = wp_cache_get($post_id, 'post_meta'); + if(!$meta_cache) + { + $meta_cache = update_meta_cache('post', array($post_id)); + $meta_cache = $meta_cache[$post_id] ?? []; + } + + // Is the _thumbnail_id present in cache? + if(!empty($meta_cache['_thumbnail_id'][0])) return $value; + + $fallback_image_id = $this->get_fallback_image_id($post_id); + if(!$fallback_image_id) return $value; + + // Set the Fallback Image in cache + $meta_cache['_thumbnail_id'][0] = $fallback_image_id; + wp_cache_set($post_id, $meta_cache, 'post_meta'); + + return $value; + } + + public function show_fallback_image($html, $post_id, $post_thumbnail_id, $size, $attr) + { + // Only on frontend + if((is_admin() && (!defined('DOING_AJAX') || !DOING_AJAX))) return $html; + + // Only For Events + if(get_post_type($post_id) != $this->PT) return $html; + + $fallback_image_id = $this->get_fallback_image_id($post_id); + + // if an image is set return that image. + if((int) $fallback_image_id !== (int) $post_thumbnail_id) return $html; + + if(isset($attr['class'])) $attr['class'] .= ' mec-fallback-img'; + else + { + $size_class = $size; + if(is_array($size_class)) $size_class = 'size-'.implode('x', $size_class); + + $attr = array('class' => 'attachment-'.$size_class.' default-featured-img'); + } + + return wp_get_attachment_image($fallback_image_id, $size, false, $attr); + } + + public function get_fallback_image_id($event_id) + { + // Categories + $categories = get_the_terms($event_id, 'mec_category'); + if(!is_array($categories) or !count($categories)) return NULL; + + // Fallback Image ID + $fallback_image_id = NULL; + foreach($categories as $category) + { + $fallback_image = get_term_meta($category->term_id, 'mec_cat_fallback_image', true); + if(trim($fallback_image)) + { + $fallback_image_id = attachment_url_to_postid($fallback_image); + if($fallback_image_id) break; + } + } + + return $fallback_image_id; + } + + public function mec_event_bookings() + { + $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : 0; + $backend = isset($_POST['backend']) ? sanitize_text_field($_POST['backend']) : 0; + + $p_occurrence = isset($_POST['occurrence']) ? sanitize_text_field($_POST['occurrence']) : NULL; + $occurrence = explode(':', $p_occurrence)[0]; + if($occurrence == 'all') $occurrence = strtotime('+100 years'); + + $bookings = $this->main->get_bookings($id, $occurrence); + $book = $this->getBook(); + + $html = ''; + $total_attendees = 0; + + if(count($bookings)) + { + $html .= '
    +
    + '.esc_html__('Title', 'modern-events-calendar-lite').' +
    + +
    + '.esc_html__('Transaction ID', 'modern-events-calendar-lite').' +
    +
    + '.esc_html__('Price', 'modern-events-calendar-lite').' +
    +
    '; + + /** @var WP_Post $booking */ + foreach($bookings as $booking) + { + $attendees = $book->get_attendees($booking->ID); + + $attendees = apply_filters('mec_filter_event_bookings', $attendees, $booking->ID, $p_occurrence); + $total_attendees += count($attendees); + + $unique_attendees = []; + foreach($attendees as $attendee) + { + if(!isset($unique_attendees[$attendee['email']])) $unique_attendees[$attendee['email']] = $attendee; + else $unique_attendees[$attendee['email']]['count'] += 1; + } + + $attendees_html = ''.count($attendees).''; + $attendees_html .= '
    '; + $attendees_html .= '
      '; + + foreach($unique_attendees as $unique_attendee) + { + $attendees_html .= '
    • '; + $attendees_html .= '
      '.esc_html($unique_attendee['name']).((isset($unique_attendee['count']) and $unique_attendee['count'] > 1) ? ' ('.esc_html($unique_attendee['count']).')' : '').'
      '; + $attendees_html .= ''; + $attendees_html .= '
    • '; + } + + $attendees_html .= '
    '; + $attendees_html .= '
    '; + + $transaction_id = get_post_meta($booking->ID, 'mec_transaction_id', true); + + $price = get_post_meta($booking->ID, 'mec_price', true); + $event_id = get_post_meta($booking->ID, 'mec_event_id', true); + + $price_html = $this->main->render_price(($price ?: 0), $event_id); + $price_html .= ' ('.get_post_meta($booking->ID, 'mec_gateway_label', true).')'; + + $all_dates = get_post_meta($booking->ID, 'mec_all_dates', true); + if(is_array($all_dates) and count($all_dates) > 1) $price_html .= ' '.sprintf(esc_html__('for %s dates', 'modern-events-calendar-lite'), count($all_dates)); + + $html .= '
    '; + $html .= '
    '.($backend ? ''.esc_html($booking->post_title).'' : esc_html($booking->post_title)).'
    '; + $html .= '
    '.MEC_kses::form($attendees_html).'
    '; + $html .= '
    '.esc_html($transaction_id).'
    '; + $html .= '
    '.MEC_kses::element($price_html).'
    '; + $html .= '
    '; + } + } + else + { + $html .= '

    '.esc_html__("No Bookings Found!", 'modern-events-calendar-lite').'

    '; + } + + $html = apply_filters('mec_event_bookings_report', $html, $bookings, $id, $backend, $occurrence, $total_attendees); + + echo json_encode(array('html' => $html, 'found' => (bool) count($bookings))); + exit; + } + + public function gallery_image_upload() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_event_gallery_image_upload')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $images = (isset($_FILES['images']) and is_array($_FILES['images'])) ? $_FILES['images'] : []; + + // No file + if(!count($images)) $this->main->response(array('success'=>0, 'code'=>'NO_FILE', 'message'=>esc_html__('Please upload an image.', 'modern-events-calendar-lite'))); + + // Include the functions + if(!function_exists('wp_handle_upload')) + { + require_once ABSPATH.'wp-admin/includes/file.php'; + require_once(ABSPATH.'wp-admin/includes/image.php'); + } + + // Upload Restrictions + $max_file_size = isset($this->settings['fes_max_file_size']) ? (int) ($this->settings['fes_max_file_size'] * 1000) : (5000 * 1000); + $allowed = array('jpeg', 'jpg', 'png', 'gif', 'webp'); + + $success = 0; + $data = []; + + $count = count($images['name']); + for($i = 0; $i < $count; $i++) + { + $image = array( + 'name' => $images['name'][$i], + 'type' => $images['type'][$i], + 'tmp_name' => $images['tmp_name'][$i], + 'error' => $images['error'][$i], + 'size' => $images['size'][$i], + ); + + $ex = explode('.', $image['name']); + $extension = end($ex); + + // Invalid Extension + if(!in_array(strtolower($extension), $allowed)) continue; + + // Invalid Size + if($image['size'] > $max_file_size) continue; + + $uploaded = wp_handle_upload($image, array('test_form' => false)); + + if($uploaded and !isset($uploaded['error'])) + { + $success = 1; + $attachment = array( + 'post_mime_type' => $uploaded['type'], + 'post_title' => '', + 'post_content' => '', + 'post_status' => 'inherit' + ); + + // Add as Attachment + $attachment_id = wp_insert_attachment($attachment, $uploaded['file']); + + // Update Metadata + wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $uploaded['file'])); + + $data[] = array( + 'id' => $attachment_id, + 'url' => $uploaded['url'] + ); + } + } + + $message = $success ? esc_html__('The images are uploaded!', 'modern-events-calendar-lite') : esc_html__('An error occurred!', 'modern-events-calendar-lite'); + + $this->main->response(array('success'=>$success, 'message'=>$message, 'data'=>$data)); + } + + public function mec_move_bookings() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(['success'=>0, 'code'=>'NONCE_MISSING']); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_move_bookings')) $this->main->response(['success'=>0, 'code'=>'NONCE_IS_INVALID']); + + $event_id = isset($_POST['id']) ? (int) sanitize_text_field($_POST['id']) : 0; + $from = isset($_POST['from']) ? (int) sanitize_text_field($_POST['from']) : 0; + $to_start = isset($_POST['to']) ? (int) sanitize_text_field($_POST['to']) : 0; + + if(!$event_id || !$from || !$to_start) $this->main->response(['success' => 0, 'code' => 'MISS_INFORMATION']); + + // Booking Library + $book = $this->getBook(); + + $bookings = $this->main->get_bookings($event_id, $from); + foreach($bookings as $booking) + { + $book->move($booking->ID, $from, $to_start); + $book->move_notify($booking->ID, $to_start); + } + + $message = '

    '.sprintf(esc_html__('%s bookings moved to new date', 'modern-events-calendar-lite'), count($bookings)).'

    '; + $this->main->response(['success' => 1, 'message' => $message]); + } + + public function mec_manage_bookings() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(['success'=>0, 'code'=>'NONCE_MISSING']); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_manage_bookings')) $this->main->response(['success'=>0, 'code'=>'NONCE_IS_INVALID']); + + $event_id = isset($_POST['id']) ? (int) sanitize_text_field($_POST['id']) : 0; + $mode = isset($_POST['mode']) ? sanitize_text_field($_POST['mode']) : 'cancel'; + $date = isset($_POST['date']) ? (int) sanitize_text_field($_POST['date']) : 0; + + if(!$event_id or !$mode or !$date or !in_array($mode, ['cancel', 'refund'])) $this->main->response(['success' => 0, 'code' => 'MISS_INFORMATION']); + + // Booking Library + $book = $this->getBook(); + + $bookings = $this->main->get_bookings($event_id, $date); + foreach($bookings as $booking) + { + if($mode === 'refund') $book->cancel($booking->ID, true); + else $book->cancel($booking->ID, false); + } + + if($mode === 'refund') $message = '

    '.sprintf(esc_html__('%s bookings canceled (and refunded).', 'modern-events-calendar-lite'), count($bookings)).'

    '; + else $message = '

    '.sprintf(esc_html__('%s bookings canceled.', 'modern-events-calendar-lite'), count($bookings)).'

    '; + + $this->main->response(['success' => 1, 'message' => $message]); + } +} diff --git a/app/features/faq.php b/app/features/faq.php new file mode 100755 index 0000000..0540a32 --- /dev/null +++ b/app/features/faq.php @@ -0,0 +1,162 @@ + + */ +class MEC_feature_faq extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize feature + * @author Webnus + */ + public function init() + { + // FAQ Status + $faq_status = isset($this->settings['faq_status']) && $this->settings['faq_status']; + + // Feature is not enabled + if(!$faq_status) return; + + // Tab + $this->factory->filter('mec-single-event-meta-title', array($this, 'tab')); + + // Metabox + $this->factory->action('mec_metabox_details', array($this, 'meta_box_faq'), 18); + + // FAQ for FES + if(!isset($this->settings['fes_section_faq']) or (isset($this->settings['fes_section_faq']) and $this->settings['fes_section_faq'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_faq'), 18); + + // Save Data + $this->factory->action('mec_save_event_data', array($this, 'save'), 10, 2); + } + + public function tab($tabs) + { + $tabs[__('FAQ', 'modern-events-calendar-lite')] = 'mec-faq'; + return $tabs; + } + + /** + * Show FAQs of event into the Add/Edit event page + * + * @author Webnus + * @param object $post + */ + public function meta_box_faq($post) + { + $faqs = get_post_meta($post->ID, 'mec_faq', true); + if(!is_array($faqs)) $faqs = []; + ?> +
    +

    +
    +
    + +
    +
      + +
    • +
      +
        +
      • +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
    • + +
    +
    + +
    +
  • +
    +
      +
    • +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
  • +
    +
    + $f) + { + if(!is_numeric($k)) continue; + + $faq[$k] = $f; + } + + update_post_meta($post_id, 'mec_faq', $faq); + } +} \ No newline at end of file diff --git a/app/features/feed.php b/app/features/feed.php new file mode 100755 index 0000000..2556720 --- /dev/null +++ b/app/features/feed.php @@ -0,0 +1,227 @@ + + */ +class MEC_feature_feed extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_feed + */ + public $feed; + public $PT; + public $events; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC Feed + $this->feed = $this->getFeed(); + + // MEC Post Type Name + $this->PT = $this->main->get_main_post_type(); + + // General Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize feed feature + * @author Webnus + */ + public function init() + { + remove_all_actions('do_feed_rss2'); + $this->factory->action('do_feed_rss2', array($this, 'rss2')); + + // Include Featured Image + if(!isset($this->settings['include_image_in_feed']) or (isset($this->settings['include_image_in_feed']) and $this->settings['include_image_in_feed'])) + { + add_filter('get_the_excerpt', array($this, 'include_featured_image'), 10, 2); + } + + if(!is_admin()) $this->factory->action('init', array($this, 'ical'), 999); + } + + /** + * Do the feed + * @author Webnus + * @param string $for_comments + */ + public function rss2($for_comments) + { + $rss2 = MEC::import('app.features.feed.rss2', true, true); + + if(get_query_var('post_type') == $this->PT) + { + // Fetch Events + $this->events = $this->fetch(); + + // Include Feed template + include_once $rss2; + } + elseif(get_query_var('taxonomy') == 'mec_category') + { + $q = get_queried_object(); + $term_id = $q->term_id; + + // Fetch Events + $this->events = $this->fetch($term_id); + + // Include Feed template + include_once $rss2; + } + else do_feed_rss2($for_comments); // Call default function + } + + /** + * Returns the events + * @author Webnus + * @param $category + * @return array + */ + public function fetch($category = NULL) + { + $args = [ + 'sk-options' => [ + 'list' => [ + 'limit' => get_option('posts_per_rss', 12), + ] + ], + 'category' => $category + ]; + + $EO = new MEC_skin_list(); // Events Object + $EO->initialize($args); + $EO->search(); + + return $EO->fetch(); + } + + /** + * @param string $excerpt + * @param WP_Post $post + * @return string + */ + public function include_featured_image($excerpt, $post = NULL) + { + // Only RSS + if(!is_feed()) return $excerpt; + + // Get Current Post + if(!$post) $post = get_post(); + if(!$post) return $excerpt; + + // It's not event + if($post->post_type != $this->main->get_main_post_type()) return $excerpt; + + $image = get_the_post_thumbnail($post); + if(trim($image)) $excerpt = $image.' '.$excerpt; + + return $excerpt; + } + + /** + * @throws Exception + */ + public function ical() + { + $ical_feed = (isset($_GET['mec-ical-feed']) and sanitize_text_field($_GET['mec-ical-feed'])); + if(!$ical_feed) return false; + + // Feed is not enabled + if(!isset($this->settings['ical_feed']) or (isset($this->settings['ical_feed']) and !$this->settings['ical_feed'])) return false; + + $only_upcoming_events = (isset($this->settings['ical_feed_upcoming']) and $this->settings['ical_feed_upcoming']); + if($only_upcoming_events) + { + $event_ids = $this->main->get_upcoming_event_ids(current_time('timestamp'), 'publish'); + } + else + { + $events = $this->main->get_events('-1'); + + $event_ids = []; + foreach($events as $event) $event_ids[] = $event->ID; + } + + // Filtered Events + $filtered_ids = null; + + // Filter Criteria + $locations_str = isset($_REQUEST['mec_locations']) ? trim($_REQUEST['mec_locations'], ', ') : ''; + $categories_str = isset($_REQUEST['mec_categories']) ? trim($_REQUEST['mec_categories'], ', ') : ''; + $organizers_str = isset($_REQUEST['mec_organizers']) ? trim($_REQUEST['mec_organizers'], ', ') : ''; + + // Filter Events + if(trim($locations_str, ', ') || trim($categories_str, ', ') || trim($organizers_str, ', ')) + { + $locations = []; + if(trim($locations_str, ', ')) $locations = array_map('trim', explode(',', $locations_str)); + + $categories = []; + if(trim($categories_str, ', ')) $categories = array_map('trim', explode(',', $categories_str)); + + $organizers = []; + if(trim($organizers_str, ', ')) $organizers = array_map('trim', explode(',', $organizers_str)); + + $filtered = $this->main->get_filtered_events($locations, $categories, $organizers); + + $filtered_ids = []; + foreach($filtered as $filtered_post) $filtered_ids[] = $filtered_post->ID; + } + + if(is_array($filtered_ids)) + { + // No Events Found + if(!count($filtered_ids)) $event_ids = []; + else + { + $new_event_ids = []; + foreach($filtered_ids as $filtered_id) + { + if(in_array($filtered_id, $event_ids)) $new_event_ids[] = $filtered_id; + } + + $event_ids = $new_event_ids; + } + } + + $output = ''; + foreach($event_ids as $event_id) $output .= $this->main->ical_single($event_id, '', '', !$only_upcoming_events); + + // Include in iCal + $ical_calendar = $this->main->ical_calendar($output); + + // Content Type + header('Content-Type: text/calendar; charset=utf-8'); + header('Content-Disposition: inline; filename="mec-events-'.date('YmdTHi').'.ics"'); + + // Print the Calendar + echo MEC_kses::full($ical_calendar); + exit; + } +} diff --git a/app/features/feed/index.html b/app/features/feed/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/feed/rss2.php b/app/features/feed/rss2.php new file mode 100755 index 0000000..ba3e52c --- /dev/null +++ b/app/features/feed/rss2.php @@ -0,0 +1,102 @@ +'; +do_action('rss_tag_pre', 'rss2'); +?> + + > + + <?php wp_title_rss(); ?> + + + + main->mysql2date('D, d M Y H:i:s O', get_lastpostmodified('GMT'), wp_timezone())); ?> + + + + + + events as $date=>$events): foreach($events as $event): $GLOBALS['post'] = get_post($event->ID) ?> + main->get_timezone($event); + $tz = ($timezone ? new DateTimeZone($timezone) : NULL); + + $cost = (isset($event->data->meta) and isset($event->data->meta['mec_cost']) and trim($event->data->meta['mec_cost'])) ? $event->data->meta['mec_cost'] : ''; + if(isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $cost = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'cost', $cost); + + $location_id = $this->main->get_master_location_id($event); + ?> + + <?php echo esc_html($this->feed->title($event->ID)); ?> + main->get_event_date_permalink($event, $event->date['start']['date'])); ?> + + ID) or comments_open($event->ID)): ?> + feed->comments_link_feed($event->ID); ?> + + + main->mysql2date('D, d M Y H:i:s O', $event->date['start']['date'].' '.$event->data->time['start'], $tz)); ?> + feed->author($event->data->post->post_author)); ?>]]> + + ID); ?> + + feed->excerpt($event->ID)); ?>]]> + + feed->content($event->ID, 'rss2'); ?> + ]]> + + + ID) or comments_open($event->ID)): ?> + ID, 'rss2')); ?> + ID); ?> + + + ID) and (!isset($this->settings['include_image_in_feed']) or (isset($this->settings['include_image_in_feed']) and !$this->settings['include_image_in_feed']))): $thumbnail_ID = get_post_thumbnail_id($event->ID); $thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'large'); ?> + + + + + data) and isset($event->data->time) and isset($event->data->time['start'])): ?> + data->time['start']); ?> + + + main->get_end_date_by_occurrence($event->ID, $date)); ?> + data) and isset($event->data->time) and isset($event->data->time['end'])): ?> + data->time['end']); ?> + + + main->get_location_data($location_id) and count($location)): ?> + + + + + main->render_price($cost, $event->ID) : $cost); ?> + + + data->categories) and is_array($event->data->categories) and count($event->data->categories)): ?> + data->categories as $category) $categories .= $category['name'].', '; echo trim($categories, ', ') ?> + + + feed->enclosure_rss($event->ID); ?> + + + + + + + \ No newline at end of file diff --git a/app/features/fes.php b/app/features/fes.php new file mode 100755 index 0000000..d6530f2 --- /dev/null +++ b/app/features/fes.php @@ -0,0 +1,1763 @@ + + */ +class MEC_feature_fes extends MEC_base +{ + public $factory; + public $main; + public $db; + public $settings; + public $PT; + public $render; + public $relative_link = false; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC DB + $this->db = $this->getDB(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Event Post Type + $this->PT = $this->main->get_main_post_type(); + } + + /** + * Initialize colors feature + * @author Webnus + */ + public function init() + { + // Frontend Event Submission Form + $this->factory->shortcode('MEC_fes_form', array($this, 'vform')); + + // Event Single Page + $this->factory->shortcode('MEC_fes_list', array($this, 'vlist')); + + // Process the event form + $this->factory->action('wp_ajax_mec_fes_form', array($this, 'fes_form')); + $this->factory->action('wp_ajax_nopriv_mec_fes_form', array($this, 'fes_form')); + + // Upload featured image + $this->factory->action('wp_ajax_mec_fes_upload_featured_image', array($this, 'fes_upload')); + $this->factory->action('wp_ajax_nopriv_mec_fes_upload_featured_image', array($this, 'fes_upload')); + + // Export the event + $this->factory->action('wp_ajax_mec_fes_csv_export', array($this, 'mec_fes_csv_export')); + + // Remove the event + $this->factory->action('wp_ajax_mec_fes_remove', array($this, 'fes_remove')); + + // Event Published + $this->factory->action('transition_post_status', array($this, 'status_changed'), 10, 3); + + $this->factory->filter('ajax_query_attachments_args', [$this, 'current_user_attachments']); + } + + /** + * @return bool + */ + public function current_user_can_submit_event() + { + $capability = true; + $user = wp_get_current_user(); + + if($user->ID and isset($this->settings['fes_access_roles']) and is_array($this->settings['fes_access_roles'])) + { + $capability = false; + if(isset($user->roles) and is_array($user->roles)) + { + foreach($user->roles as $user_role) + { + if(in_array($user_role, $this->settings['fes_access_roles'])) $capability = true; + if($capability) break; + } + } + } + + if (is_plugin_active('buddyboss-platform/bp-loader.php') && + is_plugin_active('mec-buddyboss/mec-buddyboss.php')) { + + return true; + } + + return apply_filters('mec_fes_form_current_user_can_submit_event', $capability, $this->settings); + } + + /** + * @param int $post_id + * @return bool + */ + public function current_user_can_upsert_event($post_id) + { + if($post_id == -1) return true; + + $original_post_id = $this->main->get_original_event($post_id); + if(current_user_can('edit_post', $original_post_id)) return true; + + $post = get_post($post_id); + if(isset($post->post_author) && (int) $post->post_author === get_current_user_id()) return true; + + return false; + } + + /** + * Generate frontend event submission form view + * @author Webnus + * @param array $atts + * @return string + */ + public function vform($atts = array()) + { + // Force to array + if(!is_array($atts)) $atts = []; + + if(isset($_GET['vlist']) and sanitize_text_field($_GET['vlist']) == 1) + { + return $this->vlist($atts); + } + + // Force to Relative Link + $this->relative_link = (isset($atts['relative-link']) and $atts['relative-link']); + + // Show login/register message if user is not logged in and guest submission is not enabled. + if(!is_user_logged_in() and (!isset($this->settings['fes_guest_status']) or (isset($this->settings['fes_guest_status']) and $this->settings['fes_guest_status'] == '0'))) + { + // Show message + $message = sprintf(esc_html__('Please %s/%s in order to submit new events.', 'modern-events-calendar-lite'), ''.esc_html__('Login', 'modern-events-calendar-lite').'', ''.esc_html__('Register', 'modern-events-calendar-lite').''); + + ob_start(); + include MEC::import('app.features.fes.message', true, true); + return ob_get_clean(); + } + + $can_user_submit_event = $this->current_user_can_submit_event(); + if(true !== $can_user_submit_event) + { + return '
    '. esc_html__( 'You do not have access to create an event', 'modern-events-calendar-lite').'
    '; + } + + $post_id = isset($_GET['post_id']) ? sanitize_text_field($_GET['post_id']) : -1; + + // Selected post is not an event + if($post_id > 0 and get_post_type($post_id) != $this->PT) + { + // Show message + $message = esc_html__("Sorry! Selected post is not an event.", 'modern-events-calendar-lite'); + + ob_start(); + include MEC::import('app.features.fes.message', true, true); + return ob_get_clean(); + } + + // Show a warning to current user if modification of post is not possible for him/her + if(!$this->current_user_can_upsert_event($post_id)) + { + // Show message + $message = esc_html__("Sorry! You don't have access to modify this event.", 'modern-events-calendar-lite'); + + ob_start(); + include MEC::import('app.features.fes.message', true, true); + return ob_get_clean(); + } + + $post = get_post($post_id); + + if($post_id == -1) + { + $post = new stdClass(); + $post->ID = -1; + } + + $path = MEC::import('app.features.fes.form', true, true); + $path = apply_filters('mec_fes_form_template_path', $path); + + ob_start(); + include $path; + return ob_get_clean(); + } + + /** + * Generate frontend event submission list view + * @author Webnus + * @param array $atts + * @return string + */ + public function vlist($atts = array()) + { + // Force to array + if(!is_array($atts)) $atts = []; + + $post_id = isset($_GET['post_id']) ? sanitize_text_field($_GET['post_id']) : NULL; + + // Force to Relative Link + $this->relative_link = (isset($atts['relative-link']) and $atts['relative-link']); + + // Show a warning to current user if modification of post is not possible for him/her + if($post_id > 0 and !$this->current_user_can_upsert_event($post_id)) + { + // Show message + $message = esc_html__("Sorry! You don't have access to modify this event.", 'modern-events-calendar-lite'); + + ob_start(); + include MEC::import('app.features.fes.message', true, true); + return ob_get_clean(); + } + elseif($post_id == -1 or ($post_id > 0 and $this->current_user_can_upsert_event($post_id))) + { + return $this->vform($atts); + } + + // Show login/register message if user is not logged in + if(!is_user_logged_in()) + { + // Show message + $message = sprintf(esc_html__('Please %s/%s in order to manage events.', 'modern-events-calendar-lite'), ''.esc_html__('Login', 'modern-events-calendar-lite').'', ''.esc_html__('Register', 'modern-events-calendar-lite').''); + + ob_start(); + include MEC::import('app.features.fes.message', true, true); + return ob_get_clean(); + } + + $can_user_submit_event = $this->current_user_can_submit_event(); + if(true !== $can_user_submit_event) + { + return '
    '. esc_html__( 'You do not have access to view the list of events', 'modern-events-calendar-lite').'
    '; + } + + $path = MEC::import('app.features.fes.list', true, true); + + ob_start(); + include $path; + return ob_get_clean(); + } + + public function fes_remove() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_fes_remove')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : 0; + + // Verify current user can remove the event + if(!current_user_can('delete_post', $post_id)) $this->main->response(array('success'=>0, 'code'=>'USER_CANNOT_REMOVE_EVENT')); + + // Trash the event + wp_delete_post($post_id); + + $this->main->response(array('success'=>1, 'message'=>__('Event removed!', 'modern-events-calendar-lite'))); + } + + public function mec_fes_csv_export() + { + if((!isset($_REQUEST['mec_event_id'])) or (!isset($_REQUEST['fes_nonce'])) or (!wp_verify_nonce(sanitize_text_field($_REQUEST['fes_nonce']), 'mec_fes_nonce'))) die(json_encode(array('ex' => "error"))); + + $event_id = intval(sanitize_text_field($_REQUEST['mec_event_id'])); + $timestamp = isset($_REQUEST['timestamp']) ? sanitize_text_field($_REQUEST['timestamp']) : 0; + $booking_ids = ''; + $type = isset($_REQUEST['type']) ? sanitize_text_field($_REQUEST['type']) : 'csv'; + + switch($type) + { + case 'ms-excel': + + header('Content-Type: application/vnd.ms-excel; charset=utf-8'); + header('Content-Disposition: attachment; filename=attendees-'.md5(time().mt_rand(100, 999)).'.xls'); + + break; + + default: + case 'csv': + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=attendees-'.md5(time().mt_rand(100, 999)).'.csv'); + + break; + } + + if($timestamp) + { + $bookings = $this->main->get_bookings($event_id, $timestamp); + foreach($bookings as $booking) + { + $booking_ids .= $booking->ID.','; + } + } + + $post_ids = trim($booking_ids) ? explode(',', trim($booking_ids, ', ')) : []; + + if(!count($post_ids) and !$timestamp) + { + $books = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_event_id' AND `meta_value`={$event_id}", 'loadAssocList'); + foreach($books as $book) if(isset($book['post_id'])) $post_ids[] = $book['post_id']; + } + + $event_ids = []; + foreach($post_ids as $post_id) $event_ids[] = get_post_meta($post_id, 'mec_event_id', true); + $event_ids = array_unique($event_ids); + + $main_event_id = NULL; + if(count($event_ids) == 1) $main_event_id = $event_ids[0]; + + $columns = array(__('ID', 'modern-events-calendar-lite'), esc_html__('Event', 'modern-events-calendar-lite'), esc_html__('Date', 'modern-events-calendar-lite'), esc_html__('Order Time', 'modern-events-calendar-lite'), $this->main->m('ticket', esc_html__('Ticket', 'modern-events-calendar-lite')), esc_html__('Transaction ID', 'modern-events-calendar-lite'), esc_html__('Total Price', 'modern-events-calendar-lite'), esc_html__('Gateway', 'modern-events-calendar-lite'), esc_html__('Name', 'modern-events-calendar-lite'), esc_html__('Email', 'modern-events-calendar-lite'), esc_html__('Ticket Variation', 'modern-events-calendar-lite'), esc_html__('Confirmation', 'modern-events-calendar-lite'), esc_html__('Verification', 'modern-events-calendar-lite')); + $columns = apply_filters('mec_csv_export_columns', $columns); + + $bfixed_fields = $this->main->get_bfixed_fields($main_event_id); + foreach($bfixed_fields as $bfixed_field_key=>$bfixed_field) + { + // Placeholder Keys + if(!is_numeric($bfixed_field_key)) continue; + + $type = $bfixed_field['type'] ?? ''; + $label = isset($bfixed_field['label']) ? esc_html__($bfixed_field['label'], 'modern-events-calendar-lite') : ''; + + if($type == 'agreement') $label = sprintf($label, get_the_title($bfixed_field['page'])); + if(trim($label) == '') continue; + + $columns[] = stripslashes($label); + } + + $reg_fields = $this->main->get_reg_fields($main_event_id); + foreach($reg_fields as $reg_field_key=>$reg_field) + { + // Placeholder Keys + if(!is_numeric($reg_field_key)) continue; + + $type = $reg_field['type'] ?? ''; + $label = isset($reg_field['label']) ? esc_html__($reg_field['label'], 'modern-events-calendar-lite') : ''; + + if(trim($label) == '' or $type == 'name' or $type == 'mec_email') continue; + if($type == 'agreement') $label = sprintf($label, get_the_title($reg_field['page'])); + + $columns[] = $label; + } + + $columns[] = esc_html__('Attachments', 'modern-events-calendar-lite'); + + $columns = apply_filters( 'mec_fes_export_columns', $columns, $main_event_id ); + + $output = fopen('php://output', 'w'); + fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); + fputcsv($output, $columns); + + // MEC User + $u = $this->getUser(); + + // Book Library + $book = $this->getBook(); + + foreach($post_ids as $post_id) + { + $post_id = (int) $post_id; + + $event_id = get_post_meta($post_id, 'mec_event_id', true); + $transaction_id = get_post_meta($post_id, 'mec_transaction_id', true); + $order_time = get_post_meta($post_id, 'mec_booking_time', true); + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $attendees = get_post_meta($post_id, 'mec_attendees', true); + if(!is_array($attendees) || !count($attendees)) $attendees = array(get_post_meta($post_id, 'mec_attendee', true)); + + $price = get_post_meta($post_id, 'mec_price', true); + $gateway_label = get_post_meta($post_id, 'mec_gateway_label', true); + $booker = $u->booking($post_id); + + $confirmed = $this->main->get_confirmation_label(get_post_meta($post_id, 'mec_confirmed', true)); + $verified = $this->main->get_verification_label(get_post_meta($post_id, 'mec_verified', true)); + $transaction = $book->get_transaction($transaction_id); + + $attachments = ''; + if(isset($attendees['attachments'])) + { + foreach($attendees['attachments'] as $attachment) + { + $attachments .= @$attachment['url'] . "\n"; + } + } + + foreach($attendees as $key => $attendee) + { + if($key === 'attachments') continue; + if(isset($attendee[0]['MEC_TYPE_OF_DATA'])) continue; + + $ticket_variations_output = ''; + if(isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + $ticket_variations = $this->main->ticket_variations($post_id, $attendee['id']); + foreach($attendee['variations'] as $a_variation_id => $a_variation_count) + { + if((int) $a_variation_count > 0) $ticket_variations_output .= $ticket_variations[$a_variation_id]['title'].": (".$a_variation_count.')'.", "; + } + } + + $ticket_id = $attendee['id'] ?? get_post_meta($post_id, 'mec_ticket_id', true); + $booking = array( + $post_id, + html_entity_decode(get_the_title($event_id), ENT_QUOTES | ENT_HTML5), + get_the_date('', $post_id), + $order_time, + ($tickets[$ticket_id]['name'] ?? esc_html__('Unknown', 'modern-events-calendar-lite')), + $transaction_id, + $this->main->render_price(($price ? $price : 0), $post_id), + html_entity_decode($gateway_label, ENT_QUOTES | ENT_HTML5), + ($attendee['name'] ?? (isset($booker->first_name) ? trim($booker->first_name . ' ' . $booker->last_name) : '')), + ($attendee['email'] ?? @$booker->user_email), + html_entity_decode(trim($ticket_variations_output, ', '), ENT_QUOTES | ENT_HTML5), + $confirmed, + $verified + ); + + $booking = apply_filters('mec_csv_export_booking', $booking, $post_id, $event_id, $attendee ); + + $bfixed_values = (isset($transaction['fields']) and is_array($transaction['fields'])) ? $transaction['fields'] : []; + foreach($bfixed_fields as $bfixed_field_id => $bfixed_field) + { + if(!is_numeric($bfixed_field_id)) continue; + + $bfixed_label = $bfixed_field['label'] ?? ''; + if(trim($bfixed_label) == '') continue; + + $booking[] = isset($bfixed_values[$bfixed_field_id]) ? ((is_string($bfixed_values[$bfixed_field_id]) and trim($bfixed_values[$bfixed_field_id])) ? stripslashes($bfixed_values[$bfixed_field_id]) : (is_array($bfixed_values[$bfixed_field_id]) ? implode(' | ', $bfixed_values[$bfixed_field_id]) : '---')) : ''; + } + + $reg_form = $attendee['reg'] ?? []; + foreach($reg_fields as $field_id=>$reg_field) + { + // Placeholder Keys + if(!is_numeric($field_id)) continue; + + $type = $reg_field['type'] ?? ''; + $label = isset($reg_field['label']) ? esc_html__($reg_field['label'], 'modern-events-calendar-lite') : ''; + if(trim($label) == '' or $type == 'name' or $type == 'mec_email') continue; + + $booking[] = isset($reg_form[$field_id]) ? ((is_string($reg_form[$field_id]) and trim($reg_form[$field_id])) ? $reg_form[$field_id] : (is_array($reg_form[$field_id]) ? implode(' | ', $reg_form[$field_id]) : '---')) : ''; + } + + if($attachments) + { + $booking[] = $attachments; + $attachments = ''; + } + + $booking = apply_filters( 'mec_fes_export_booking', $booking, $main_event_id ); + + fputcsv($output, $booking); + } + } + + die(); + } + + public function fes_upload() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_fes_upload_featured_image')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + // Include the function + if(!function_exists('wp_handle_upload')) require_once ABSPATH.'wp-admin/includes/file.php'; + + $uploaded_file = $_FILES['file'] ?? NULL; + + // No file + if(!$uploaded_file) $this->main->response(array('success'=>0, 'code'=>'NO_FILE', 'message'=>esc_html__('Please upload an image.', 'modern-events-calendar-lite'))); + + $allowed = array('gif', 'jpeg', 'jpg', 'png', 'webp'); + + $ex = explode('.', $uploaded_file['name']); + $extension = end($ex); + + // Invalid Extension + if(!in_array($extension, $allowed)) $this->main->response(array('success'=>0, 'code'=>'INVALID_EXTENSION', 'message'=>sprintf(esc_html__('image extension is invalid. You can upload %s images.', 'modern-events-calendar-lite'), implode(', ', $allowed)))); + + // Maximum File Size + $max_file_size = isset($this->settings['fes_max_file_size']) ? (int) ($this->settings['fes_max_file_size'] * 1000) : (5000 * 1000); + + // Invalid Size + if($uploaded_file['size'] > $max_file_size) $this->main->response(array('success'=>0, 'code'=>'IMAGE_IS_TOO_BIG', 'message'=>sprintf(esc_html__('Image is too big. Maximum size is %s KB.', 'modern-events-calendar-lite'), ($max_file_size / 1000)))); + + $movefile = wp_handle_upload($uploaded_file, array('test_form'=>false)); + + $success = 0; + $data = []; + + if($movefile and !isset($movefile['error'])) + { + $success = 1; + $message = esc_html__('Image uploaded!', 'modern-events-calendar-lite'); + + $data['url'] = $movefile['url']; + } + else + { + $message = $movefile['error']; + } + + $this->main->response(array('success'=>$success, 'message'=>$message, 'data'=>$data)); + } + + public function fes_form() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_fes_form')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + // Post ID + $post_id = isset($mec['post_id']) ? (int) sanitize_text_field($mec['post_id']) : -1; + + // Show a warning to current user if modification of post is not possible for him/her + if(!$this->current_user_can_upsert_event($post_id)) $this->main->response(array('success'=>0, 'message'=>esc_html__("Sorry! You don't have access to modify this event.", 'modern-events-calendar-lite'), 'code'=>'NO_ACCESS')); + + // Validate Captcha + if($this->getCaptcha()->status('fes') and !$this->getCaptcha()->is_valid()) + { + $this->main->response(array('success'=>0, 'message'=>__('Invalid Captcha! Please try again.', 'modern-events-calendar-lite'), 'code'=>'CAPTCHA_IS_INVALID')); + } + + // Agreement Status + $agreement_status = (isset($this->settings['fes_agreement']) and $this->settings['fes_agreement']); + if($agreement_status) + { + $checked = (isset($mec['agreement']) and $mec['agreement']); + if(!$checked) $this->main->response(array('success'=>0, 'message'=>__('You should accept the terms and conditions.', 'modern-events-calendar-lite'), 'code'=>'TERMS_CONDITIONS')); + } + + $start_date = (isset($mec['date']['start']['date']) and trim($mec['date']['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($mec['date']['start']['date'])) : date('Y-m-d'); + $end_date = (isset($mec['date']['end']['date']) and trim($mec['date']['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($mec['date']['end']['date'])) : date('Y-m-d'); + + $post_title = isset($mec['title']) ? sanitize_text_field($mec['title']) : ''; + $post_content = isset($mec['content']) ? MEC_kses::page($mec['content']) : ''; + $post_excerpt = isset($mec['excerpt']) ? MEC_kses::page($mec['excerpt']) : ''; + $post_tags = isset($mec['tags']) ? sanitize_text_field($mec['tags']) : ''; + $post_categories = isset($mec['categories']) ? array_map('sanitize_text_field', $mec['categories']) : []; + $post_speakers = isset($mec['speakers']) ? array_map('sanitize_text_field', $mec['speakers']) : []; + $post_sponsors = isset($mec['sponsors']) ? array_map('sanitize_text_field', $mec['sponsors']) : []; + $post_labels = isset($mec['labels']) ? array_map('sanitize_text_field', $mec['labels']) : []; + $featured_image = isset($mec['featured_image']) ? sanitize_text_field($mec['featured_image']) : ''; + + $read_more = isset($mec['read_more']) ? sanitize_url($mec['read_more']) : ''; + $more_info = (isset($mec['more_info']) and trim($mec['more_info'])) ? sanitize_url($mec['more_info']) : ''; + $more_info_title = isset($mec['more_info_title']) ? sanitize_text_field($mec['more_info_title']) : ''; + $more_info_target = isset($this->settings['fes_event_link_target']) && $this->settings['fes_event_link_target'] ? $this->settings['fes_event_link_target'] : ''; + + $cost = isset($mec['cost']) ? sanitize_text_field($mec['cost']) : ''; + + // Title is Required + if(!trim($post_title)) $this->main->response(array('success'=>0, 'message'=>__('Please fill event title field!', 'modern-events-calendar-lite'), 'code'=>'TITLE_IS_EMPTY')); + + // Body is Required + $is_required_content = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_required_body']) && $this->settings['fes_required_body'], + 'content' + ); + if($is_required_content && !trim($post_content)) $this->main->response(array('success'=>0, 'message'=>__('Please fill event body field!', 'modern-events-calendar-lite'), 'code'=>'BODY_IS_EMPTY')); + + // excerpt is Required + $is_required_excerpt = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_required_excerpt']) && $this->settings['fes_required_excerpt'], + 'excerpt' + ); + if($is_required_excerpt && !trim($post_excerpt)) $this->main->response(array('success'=>0, 'message'=>__('Please fill event excerpt field!', 'modern-events-calendar-lite'), 'code'=>'EXCERPT_IS_EMPTY')); + + // Dates are Required + $is_required_dates = apply_filters( + 'mec_fes_form_is_required_fields', + (isset($this->settings['fes_required_dates']) and $this->settings['fes_required_dates']), + 'dates' + ); + if($is_required_dates) + { + $start_date_is_filled = (isset($mec['date']['start']['date']) and trim($mec['date']['start']['date'])); + $end_date_is_filled = (isset($mec['date']['end']['date']) and trim($mec['date']['end']['date'])); + + if(!$start_date_is_filled) $this->main->response(array('success'=>0, 'message'=>__('Please fill event start date!', 'modern-events-calendar-lite'), 'code'=>'START_DATE_IS_EMPTY')); + if(!$end_date_is_filled) $this->main->response(array('success'=>0, 'message'=>__('Please fill event end date!', 'modern-events-calendar-lite'), 'code'=>'END_DATE_IS_EMPTY')); + } + + // Category is Required + $is_required_category = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_section_categories']) && $this->settings['fes_section_categories'] && isset($this->settings['fes_required_category']) && $this->settings['fes_required_category'], + 'category' + ); + if($is_required_category and !count($post_categories)) $this->main->response(array('success'=>0, 'message'=>__('Please select at-least one category!', 'modern-events-calendar-lite'), 'code'=>'CATEGORY_IS_EMPTY')); + + // Location is Required + $is_required_location = apply_filters( + 'mec_fes_form_is_required_fields', + (isset($this->settings['fes_section_location']) and $this->settings['fes_section_location'] and isset($this->settings['fes_required_location']) and $this->settings['fes_required_location']), + 'location' + ); + if($is_required_location) + { + $location_id_is_filled = (isset($mec['location_id']) and trim($mec['location_id']) and $mec['location_id'] != 1); + $location_add_request = (isset($mec['location'], $mec['location']['address']) and trim($mec['location']['address'])); + + if(!$location_id_is_filled and !$location_add_request) $this->main->response(array('success'=>0, 'message'=>__('Please select the event location!', 'modern-events-calendar-lite'), 'code'=>'LOCATION_IS_EMPTY')); + } + + // Label is Required + $is_required_label = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_section_labels']) && $this->settings['fes_section_labels'] && isset($this->settings['fes_required_label']) && $this->settings['fes_required_label'], + 'label' + ); + if($is_required_label and !count($post_labels)) $this->main->response(array('success'=>0, 'message'=>__('Please select at-least one label!', 'modern-events-calendar-lite'), 'code'=>'LABEL_IS_EMPTY')); + + // Featured Image is Required + $is_required_featured_image = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_section_featured_image']) && $this->settings['fes_section_featured_image'] && isset($this->settings['fes_required_featured_image']) && $this->settings['fes_required_featured_image'], + 'featured_image' + ); + if($is_required_featured_image and !trim($featured_image)) $this->main->response(array('success'=>0, 'message'=>__('Please upload a featured image!', 'modern-events-calendar-lite'), 'code'=>'FEATURED_IMAGE_IS_EMPTY')); + + // Event link is required + $is_required_event_link = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_required_event_link']) && $this->settings['fes_required_event_link'], + 'event_link' + ); + if($is_required_event_link and !trim($read_more)) $this->main->response(array('success'=>0, 'message'=>__('Please fill event link!', 'modern-events-calendar-lite'), 'code'=>'EVENT_LINK_IS_EMPTY')); + + // More Info is required + $is_required_more_info = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_required_more_info']) && $this->settings['fes_required_more_info'], + 'more_info' + ); + if($is_required_more_info and !trim($more_info)) $this->main->response(array('success'=>0, 'message'=>__('Please fill more info!', 'modern-events-calendar-lite'), 'code'=>'MORE_INFO_IS_EMPTY')); + + // Cost is required + $is_required_cost = apply_filters( + 'mec_fes_form_is_required_fields', + isset($this->settings['fes_required_cost']) && $this->settings['fes_required_cost'], + 'cost' + ); + if($is_required_cost and trim($cost) === '') $this->main->response(array('success'=>0, 'message'=>__('Please fill cost!', 'modern-events-calendar-lite'), 'code'=>'COST_IS_EMPTY')); + + // Post Status + $status = 'pending'; + if(current_user_can('publish_posts')) $status = 'publish'; + + $method = 'updated'; + + // Create new event + if($post_id == -1) + { + // Force Status + if(isset($this->settings['fes_new_event_status']) and trim($this->settings['fes_new_event_status'])) $status = $this->settings['fes_new_event_status']; + + $post = ['post_title'=>$post_title, 'post_content'=>$post_content, 'post_excerpt'=>$post_excerpt, 'post_type'=>$this->PT, 'post_status'=>$status]; + $post_id = wp_insert_post($post); + + $method = 'added'; + + // FES Flag + update_post_meta($post_id, 'mec_created_by_fes', 1); + + // Default Category + if(isset($this->settings['fes_default_category']) and $this->settings['fes_default_category'] and !count($post_categories)) + { + $post_categories[$this->settings['fes_default_category']] = 1; + } + } + + wp_update_post(['ID'=>$post_id, 'post_title'=>$post_title, 'post_content'=>$post_content, 'post_excerpt'=>$post_excerpt, 'post_status'=>$status]); + + // Categories Section + if(!isset($this->settings['fes_section_categories']) or (isset($this->settings['fes_section_categories']) and $this->settings['fes_section_categories'])) + { + // Categories + $categories = []; + foreach($post_categories as $post_category=>$value) $categories[] = (int) $post_category; + + wp_set_post_terms($post_id, $categories, 'mec_category'); + } + + // Speakers Section + if(!isset($this->settings['fes_section_speaker']) or (isset($this->settings['fes_section_speaker']) and $this->settings['fes_section_speaker'])) + { + // Speakers + if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) + { + $speakers = []; + foreach($post_speakers as $post_speaker=>$value) $speakers[] = (int) $post_speaker; + + wp_set_post_terms($post_id, $speakers, 'mec_speaker'); + } + } + + // Sponsors Section + if($this->getPRO() and isset($this->settings['fes_section_sponsor']) and $this->settings['fes_section_sponsor']) + { + // Sponsors + if(isset($this->settings['sponsors_status']) and $this->settings['sponsors_status']) + { + $sponsors = []; + foreach($post_sponsors as $post_sponsor=>$value) $sponsors[] = (int) $post_sponsor; + + wp_set_post_terms($post_id, $sponsors, 'mec_sponsor'); + } + } + + // Labels Section + if(!isset($this->settings['fes_section_labels']) or (isset($this->settings['fes_section_labels']) and $this->settings['fes_section_labels'])) + { + // Labels + $labels = []; + foreach($post_labels as $post_label=>$value) $labels[] = (int) $post_label; + + wp_set_post_terms($post_id, $labels, 'mec_label'); + do_action('mec_label_change_to_radio', $labels, $post_labels, $post_id); + } + + // Color Section + if(!isset($this->settings['fes_section_event_color']) or (isset($this->settings['fes_section_event_color']) and $this->settings['fes_section_event_color'])) + { + // Color + $color = isset($mec['color']) ? sanitize_text_field(trim($mec['color'], '# ')) : ''; + update_post_meta($post_id, 'mec_color', $color); + } + + // Tags Section + if(!isset($this->settings['fes_section_tags']) or (isset($this->settings['fes_section_tags']) and $this->settings['fes_section_tags'])) + { + // Tags + wp_set_post_terms($post_id, $post_tags, apply_filters('mec_taxonomy_tag', '')); + } + + // Featured Image Section + if(!isset($this->settings['fes_section_featured_image']) || $this->settings['fes_section_featured_image']) + { + // Featured Image + if(trim($featured_image)) $this->main->set_featured_image($featured_image, $post_id, ['gif', 'jpeg', 'jpg', 'png', 'webp']); + else delete_post_thumbnail($post_id); + + // Featured Image Caption + if(isset($this->settings['featured_image_caption']) && $this->settings['featured_image_caption']) + { + $attachment_id = get_post_thumbnail_id($post_id); + if($attachment_id) + { + $featured_image_caption = isset($mec['featured_image_caption']) ? sanitize_text_field($mec['featured_image_caption']) : ''; + $this->db->q("UPDATE `#__posts` SET `post_excerpt`='".esc_sql($featured_image_caption)."' WHERE `ID`=".((int) $attachment_id)); + } + } + } + + // Links Section + if(!isset($this->settings['fes_section_event_links']) or (isset($this->settings['fes_section_event_links']) and $this->settings['fes_section_event_links'])) + { + update_post_meta($post_id, 'mec_read_more', $read_more); + update_post_meta($post_id, 'mec_more_info', $more_info); + update_post_meta($post_id, 'mec_more_info_title', $more_info_title); + update_post_meta($post_id, 'mec_more_info_target', $more_info_target); + } + + // Cost Section + if(!isset($this->settings['fes_section_cost']) or (isset($this->settings['fes_section_cost']) and $this->settings['fes_section_cost'])) + { + $cost = apply_filters( + 'mec_event_cost_sanitize', + sanitize_text_field($cost), + $cost + ); + + $cost_auto_calculate = (isset($mec['cost_auto_calculate']) ? sanitize_text_field($mec['cost_auto_calculate']) : 0); + $currency_options = ((isset($mec['currency']) and is_array($mec['currency'])) ? array_map('sanitize_text_field', $mec['currency']) : array()); + + update_post_meta($post_id, 'mec_cost', $cost); + update_post_meta($post_id, 'mec_cost_auto_calculate', $cost_auto_calculate); + update_post_meta($post_id, 'mec_currency', $currency_options); + } + + // Guest Name and Email + $fes_guest_email = isset($mec['fes_guest_email']) ? sanitize_email($mec['fes_guest_email']) : ''; + $fes_guest_name = isset($mec['fes_guest_name']) ? sanitize_text_field($mec['fes_guest_name']) : ''; + $note = isset($mec['note']) ? sanitize_text_field($mec['note']) : ''; + + update_post_meta($post_id, 'fes_guest_email', $fes_guest_email); + update_post_meta($post_id, 'fes_guest_name', $fes_guest_name); + update_post_meta($post_id, 'mec_note', $note); + + // Location Section + if(!isset($this->settings['fes_section_location']) or (isset($this->settings['fes_section_location']) and $this->settings['fes_section_location'])) + { + // Location + $location_id = isset($mec['location_id']) ? sanitize_text_field($mec['location_id']) : 1; + + // Selected a saved location + if($location_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + } + else + { + $address = (isset($mec['location']['address']) and trim($mec['location']['address'])) ? sanitize_text_field($mec['location']['address']) : ''; + $name = (isset($mec['location']['name']) and trim($mec['location']['name'])) ? sanitize_text_field($mec['location']['name']) : (trim($address) ? $address : esc_html__('Location Name', 'modern-events-calendar-lite')); + + $term = get_term_by('name', $name, 'mec_location'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_location'); + } + else + { + $term = wp_insert_term($name, 'mec_location'); + + $location_id = $term['term_id']; + if($location_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + $opening_hour = (isset($mec['location']['opening_hour']) and trim($mec['location']['opening_hour'])) ? sanitize_text_field($mec['location']['opening_hour']) : ''; + $latitude = (isset($mec['location']['latitude']) and trim($mec['location']['latitude'])) ? sanitize_text_field($mec['location']['latitude']) : 0; + $longitude = (isset($mec['location']['longitude']) and trim($mec['location']['longitude'])) ? sanitize_text_field($mec['location']['longitude']) : 0; + $url = (isset($mec['location']['url']) and trim($mec['location']['url'])) ? sanitize_url($mec['location']['url']) : ''; + $tel = (isset($mec['location']['tel']) and trim($mec['location']['tel'])) ? sanitize_text_field($mec['location']['tel']) : ''; + $thumbnail = (isset($mec['location']['thumbnail']) and trim($mec['location']['thumbnail'])) ? sanitize_text_field($mec['location']['thumbnail']) : ''; + + if(!trim($latitude) or !trim($longitude)) + { + $geo_point = $this->main->get_lat_lng($address); + + $latitude = $geo_point[0]; + $longitude = $geo_point[1]; + } + + update_term_meta($location_id, 'address', $address); + update_term_meta($location_id, 'opening_hour', $opening_hour); + update_term_meta($location_id, 'latitude', $latitude); + update_term_meta($location_id, 'longitude', $longitude); + update_term_meta($location_id, 'url', $url); + update_term_meta($location_id, 'tel', $tel); + update_term_meta($location_id, 'thumbnail', $thumbnail); + } + else $location_id = 1; + } + } + + update_post_meta($post_id, 'mec_location_id', $location_id); + + $dont_show_map = isset($mec['dont_show_map']) ? sanitize_text_field($mec['dont_show_map']) : 0; + update_post_meta($post_id, 'mec_dont_show_map', $dont_show_map); + } + + // Organizer Section + if(!isset($this->settings['fes_section_organizer']) or (isset($this->settings['fes_section_organizer']) and $this->settings['fes_section_organizer'])) + { + // Organizer + $organizer_id = isset($mec['organizer_id']) ? sanitize_text_field($mec['organizer_id']) : 1; + + // Selected a saved organizer + if(isset($organizer_id) and $organizer_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + } + else + { + $name = (isset($mec['organizer']['name']) and trim($mec['organizer']['name'])) ? sanitize_text_field($mec['organizer']['name']) : esc_html__('Organizer Name', 'modern-events-calendar-lite'); + + $term = get_term_by('name', $name, 'mec_organizer'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_organizer'); + } + else + { + $term = wp_insert_term($name, 'mec_organizer'); + + $organizer_id = $term['term_id']; + if($organizer_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + $tel = (isset($mec['organizer']['tel']) and trim($mec['organizer']['tel'])) ? sanitize_text_field($mec['organizer']['tel']) : ''; + $email = (isset($mec['organizer']['email']) and trim($mec['organizer']['email'])) ? sanitize_text_field($mec['organizer']['email']) : ''; + $url = (isset($mec['organizer']['url']) and trim($mec['organizer']['url'])) ? sanitize_url($mec['organizer']['url']) : ''; + $page_label = (isset($mec['organizer']['page_label']) and trim($mec['organizer']['page_label'])) ? sanitize_text_field($mec['organizer']['page_label']) : ''; + $thumbnail = (isset($mec['organizer']['thumbnail']) and trim($mec['organizer']['thumbnail'])) ? sanitize_text_field($mec['organizer']['thumbnail']) : ''; + + update_term_meta($organizer_id, 'tel', $tel); + update_term_meta($organizer_id, 'email', $email); + update_term_meta($organizer_id, 'url', $url); + update_term_meta($organizer_id, 'page_label', $page_label); + update_term_meta($organizer_id, 'thumbnail', $thumbnail); + } + else $organizer_id = 1; + } + } + + update_post_meta($post_id, 'mec_organizer_id', $organizer_id); + + // Additional Organizers + $additional_organizer_ids = $mec['additional_organizer_ids'] ?? []; + + foreach($additional_organizer_ids as $additional_organizer_id) wp_set_object_terms($post_id, (int) $additional_organizer_id, 'mec_organizer', true); + update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); + + // Additional locations + $additional_location_ids = $mec['additional_location_ids'] ?? []; + + foreach($additional_location_ids as $additional_location_id) wp_set_object_terms($post_id, (int) $additional_location_id, 'mec_location', true); + update_post_meta($post_id, 'mec_additional_location_ids', $additional_location_ids); + } + + // Date Options + $date = $mec['date'] ?? []; + + $start_date = date('Y-m-d', strtotime($start_date)); + + // Set the start date + $date['start']['date'] = $start_date; + + $start_time_hour = isset($date['start']) ? sanitize_text_field($date['start']['hour']) : '8'; + $start_time_minutes = isset($date['start']) ? sanitize_text_field($date['start']['minutes']) : '00'; + $start_time_ampm = (isset($date['start']) and isset($date['start']['ampm'])) ? sanitize_text_field($date['start']['ampm']) : 'AM'; + + $end_date = date('Y-m-d', strtotime($end_date)); + + // Fix end_date if it's smaller than start_date + if(strtotime($end_date) < strtotime($start_date)) $end_date = $start_date; + + // Set the end date + $date['end']['date'] = $end_date; + + $end_time_hour = isset($date['end']) ? sanitize_text_field($date['end']['hour']) : '6'; + $end_time_minutes = isset($date['end']) ? sanitize_text_field($date['end']['minutes']) : '00'; + $end_time_ampm = (isset($date['end']) and isset($date['end']['ampm'])) ? sanitize_text_field($date['end']['ampm']) : 'PM'; + + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, NULL), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, NULL), $end_time_minutes); + } + else + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, $start_time_ampm), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, $end_time_ampm), $end_time_minutes); + } + + if($end_date === $start_date and $day_end_seconds < $day_start_seconds) + { + $day_end_seconds = $day_start_seconds; + + $end_time_hour = $start_time_hour; + $end_time_minutes = $start_time_minutes; + $end_time_ampm = $start_time_ampm; + + $date['end']['hour'] = $start_time_hour; + $date['end']['minutes'] = $start_time_minutes; + $date['end']['ampm'] = $start_time_ampm; + } + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + if($start_time_hour < 12) $start_time_ampm = 'AM'; + elseif($start_time_hour == 12) $start_time_ampm = 'PM'; + elseif($start_time_hour > 12) + { + $start_time_hour -= 12; + $start_time_ampm = 'PM'; + } + elseif($start_time_hour == 0) + { + $start_time_hour = 12; + $start_time_ampm = 'AM'; + } + + if($end_time_hour < 12) $end_time_ampm = 'AM'; + elseif($end_time_hour == 12) $end_time_ampm = 'PM'; + elseif($end_time_hour > 12) + { + $end_time_hour -= 12; + $end_time_ampm = 'PM'; + } + elseif($end_time_hour == 0) + { + $end_time_hour = 12; + $end_time_ampm = 'AM'; + } + + // Set converted values to date array + $date['start']['hour'] = $start_time_hour; + $date['start']['ampm'] = $start_time_ampm; + + $date['end']['hour'] = $end_time_hour; + $date['end']['ampm'] = $end_time_ampm; + } + + $allday = isset($date['allday']) ? 1 : 0; + $one_occurrence = isset($date['one_occurrence']) ? 1 : 0; + $hide_time = isset($date['hide_time']) ? 1 : 0; + $hide_end_time = isset($date['hide_end_time']) ? 1 : 0; + $comment = isset($date['comment']) ? sanitize_text_field($date['comment']) : ''; + $timezone = (isset($mec['timezone']) and trim($mec['timezone']) != '') ? sanitize_text_field($mec['timezone']) : 'global'; + $countdown_method = (isset($mec['countdown_method']) and trim($mec['countdown_method']) != '') ? sanitize_text_field($mec['countdown_method']) : 'global'; + $style_per_event = (isset($mec['style_per_event']) and trim($mec['style_per_event']) != '') ? sanitize_text_field($mec['style_per_event']) : 'global'; + $trailer_url = (isset($mec['trailer_url']) and trim($mec['trailer_url']) != '') ? sanitize_url($mec['trailer_url']) : ''; + $trailer_title = isset($mec['trailer_title']) ? sanitize_text_field($mec['trailer_title']) : ''; + $public = (isset($mec['public']) and trim($mec['public']) != '') ? sanitize_text_field($mec['public']) : 1; + + // Set start time and end time if event is all day + if($allday == 1) + { + $start_time_hour = '8'; + $start_time_minutes = '00'; + $start_time_ampm = 'AM'; + + $end_time_hour = '6'; + $end_time_minutes = '00'; + $end_time_ampm = 'PM'; + } + + // Previous Date Times + $prev_start_datetime = get_post_meta($post_id, 'mec_start_datetime', true); + $prev_end_datetime = get_post_meta($post_id, 'mec_end_datetime', true); + + $start_datetime = $start_date.' '.sprintf('%02d', $start_time_hour).':'.sprintf('%02d', $start_time_minutes).' '.$start_time_ampm; + $end_datetime = $end_date.' '.sprintf('%02d', $end_time_hour).':'.sprintf('%02d', $end_time_minutes).' '.$end_time_ampm; + + update_post_meta($post_id, 'mec_start_date', $start_date); + update_post_meta($post_id, 'mec_start_time_hour', $start_time_hour); + update_post_meta($post_id, 'mec_start_time_minutes', $start_time_minutes); + update_post_meta($post_id, 'mec_start_time_ampm', $start_time_ampm); + update_post_meta($post_id, 'mec_start_day_seconds', $day_start_seconds); + update_post_meta($post_id, 'mec_start_datetime', $start_datetime); + + update_post_meta($post_id, 'mec_end_date', $end_date); + update_post_meta($post_id, 'mec_end_time_hour', $end_time_hour); + update_post_meta($post_id, 'mec_end_time_minutes', $end_time_minutes); + update_post_meta($post_id, 'mec_end_time_ampm', $end_time_ampm); + update_post_meta($post_id, 'mec_end_day_seconds', $day_end_seconds); + update_post_meta($post_id, 'mec_end_datetime', $end_datetime); + + update_post_meta($post_id, 'mec_date', $date); + + // Repeat Options + $repeat = $date['repeat'] ?? []; + $certain_weekdays = $repeat['certain_weekdays'] ?? []; + + $repeat_status = isset($repeat['status']) ? 1 : 0; + $repeat_type = ($repeat_status and isset($repeat['type'])) ? sanitize_text_field($repeat['type']) : ''; + + $repeat_interval = ($repeat_status and isset($repeat['interval']) and trim($repeat['interval'])) ? sanitize_text_field($repeat['interval']) : 1; + + // Advanced Repeat + $advanced = isset($repeat['advanced']) ? sanitize_text_field($repeat['advanced']) : ''; + + if(!is_numeric($repeat_interval)) $repeat_interval = NULL; + + if($repeat_type == 'weekly') $interval_multiply = 7; + else $interval_multiply = 1; + + // Reset certain weekdays if repeat type is not set to certain weekdays + if($repeat_type != 'certain_weekdays') $certain_weekdays = []; + + if(!is_null($repeat_interval)) $repeat_interval = $repeat_interval*$interval_multiply; + + // String To Array + if($repeat_type == 'advanced' and trim($advanced)) $advanced = explode('-', $advanced); + else $advanced = []; + + $repeat_end = ($repeat_status and isset($repeat['end'])) ? sanitize_text_field($repeat['end']) : ''; + $repeat_end_at_occurrences = ($repeat_status && isset($repeat['end_at_occurrences']) && is_numeric($repeat['end_at_occurrences'])) ? $repeat['end_at_occurrences'] - 1 : 9; + $repeat_end_at_date = ($repeat_status and isset($repeat['end_at_date'])) ? $this->main->standardize_format(sanitize_text_field($repeat['end_at_date'])) : ''; + + update_post_meta($post_id, 'mec_date', $date); + update_post_meta($post_id, 'mec_repeat', $repeat); + update_post_meta($post_id, 'mec_certain_weekdays', $certain_weekdays); + update_post_meta($post_id, 'mec_allday', $allday); + update_post_meta($post_id, 'one_occurrence', $one_occurrence); + update_post_meta($post_id, 'mec_hide_time', $hide_time); + update_post_meta($post_id, 'mec_hide_end_time', $hide_end_time); + update_post_meta($post_id, 'mec_comment', $comment); + update_post_meta($post_id, 'mec_timezone', $timezone); + update_post_meta($post_id, 'mec_countdown_method', $countdown_method); + update_post_meta($post_id, 'mec_style_per_event', $style_per_event); + update_post_meta($post_id, 'mec_trailer_url', $trailer_url); + update_post_meta($post_id, 'mec_trailer_title', $trailer_title); + update_post_meta($post_id, 'mec_public', $public); + update_post_meta($post_id, 'mec_repeat_status', $repeat_status); + update_post_meta($post_id, 'mec_repeat_type', $repeat_type); + update_post_meta($post_id, 'mec_repeat_interval', $repeat_interval); + update_post_meta($post_id, 'mec_repeat_end', $repeat_end); + update_post_meta($post_id, 'mec_repeat_end_at_occurrences', $repeat_end_at_occurrences); + update_post_meta($post_id, 'mec_repeat_end_at_date', $repeat_end_at_date); + update_post_meta($post_id, 'mec_advanced_days', $advanced); + + // Event Sequence (Used in iCal feed) + $sequence = (int) get_post_meta($post_id, 'mec_sequence', true); + update_post_meta($post_id, 'mec_sequence', ($sequence + 1)); + + // Creating $event array for inserting in mec_events table + $event = array('post_id'=>$post_id, 'start'=>$start_date, 'repeat'=>$repeat_status, 'rinterval'=>(!in_array($repeat_type, array('daily', 'weekly', 'monthly')) ? NULL : $repeat_interval), 'time_start'=>$day_start_seconds, 'time_end'=>$day_end_seconds); + + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + + // MEC weekdays + $mec_weekdays = $this->main->get_weekdays(); + + // MEC weekends + $mec_weekends = $this->main->get_weekends(); + + $plus_date = null; + if($repeat_type == 'daily') + { + $plus_date = '+'.$repeat_end_at_occurrences*$repeat_interval.' Days'; + } + elseif($repeat_type == 'weekly') + { + $plus_date = '+'.$repeat_end_at_occurrences*($repeat_interval).' Days'; + } + elseif($repeat_type == 'weekday') + { + $repeat_interval = 1; + $plus_date = '+'.$repeat_end_at_occurrences*$repeat_interval.' Weekdays'; + + $weekdays = ','.implode(',', $mec_weekdays).','; + } + elseif($repeat_type == 'weekend') + { + $repeat_interval = 1; + $plus_date = '+'.round($repeat_end_at_occurrences/2)*($repeat_interval*7).' Days'; + + $weekdays = ','.implode(',', $mec_weekends).','; + } + elseif($repeat_type == 'certain_weekdays') + { + $repeat_interval = 1; + $plus_date = '+' . ceil(($repeat_end_at_occurrences * $repeat_interval) * (7/count($certain_weekdays))) . ' days'; + + $weekdays = ','.implode(',', $certain_weekdays).','; + } + elseif($repeat_type == 'monthly') + { + $plus_date = '+'.$repeat_end_at_occurrences*$repeat_interval.' Months'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif($repeat_type == 'yearly') + { + $plus_date = '+'.$repeat_end_at_occurrences*$repeat_interval.' Years'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif($repeat_type == "advanced") + { + // Render class object + $this->render = $this->getRender(); + + // Get finish date + $event_info = array('start' => $date['start'], 'end' => $date['end']); + $dates = $this->render->generate_advanced_days($advanced, $event_info, $repeat_end_at_occurrences +1, date( 'Y-m-d', current_time( 'timestamp', 0 )), 'events'); + + $period_date = $this->main->date_diff($start_date, end($dates)['end']['date']); + + $plus_date = '+' . $period_date->days . ' Days'; + } + + // "In Days" and "Not In Days" + $in_days_arr = (isset($mec['in_days']) and is_array($mec['in_days']) and count($mec['in_days'])) ? array_unique($mec['in_days']) : []; + $not_in_days_arr = (isset($mec['not_in_days']) and is_array($mec['not_in_days']) and count($mec['not_in_days'])) ? array_unique($mec['not_in_days']) : []; + + $in_days = ''; + if(count($in_days_arr)) + { + if(isset($in_days_arr[':i:'])) unset($in_days_arr[':i:']); + + $in_days_arr = array_map(function($value) + { + $ex = explode(':', $value); + + $in_days_times = ''; + if(isset($ex[2]) and isset($ex[3])) + { + $in_days_start_time = $ex[2]; + $in_days_end_time = $ex[3]; + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $ex_start_time = explode('-', $in_days_start_time); + $ex_end_time = explode('-', $in_days_end_time); + + $in_days_start_hour = $ex_start_time[0]; + $in_days_start_minutes = $ex_start_time[1]; + $in_days_start_ampm = $ex_start_time[2]; + + $in_days_end_hour = $ex_end_time[0]; + $in_days_end_minutes = $ex_end_time[1]; + $in_days_end_ampm = $ex_end_time[2]; + + if(trim($in_days_start_ampm) == '') + { + if($in_days_start_hour < 12) $in_days_start_ampm = 'AM'; + elseif($in_days_start_hour == 12) $in_days_start_ampm = 'PM'; + elseif($in_days_start_hour > 12) + { + $in_days_start_hour -= 12; + $in_days_start_ampm = 'PM'; + } + elseif($in_days_start_hour == 0) + { + $in_days_start_hour = 12; + $in_days_start_ampm = 'AM'; + } + } + + if(trim($in_days_end_ampm) == '') + { + if($in_days_end_hour < 12) $in_days_end_ampm = 'AM'; + elseif($in_days_end_hour == 12) $in_days_end_ampm = 'PM'; + elseif($in_days_end_hour > 12) + { + $in_days_end_hour -= 12; + $in_days_end_ampm = 'PM'; + } + elseif($in_days_end_hour == 0) + { + $in_days_end_hour = 12; + $in_days_end_ampm = 'AM'; + } + } + + if(strlen($in_days_start_hour) == 1) $in_days_start_hour = '0'.$in_days_start_hour; + if(strlen($in_days_start_minutes) == 1) $in_days_start_minutes = '0'.$in_days_start_minutes; + + if(strlen($in_days_end_hour) == 1) $in_days_end_hour = '0'.$in_days_end_hour; + if(strlen($in_days_end_minutes) == 1) $in_days_end_minutes = '0'.$in_days_end_minutes; + + $in_days_start_time = $in_days_start_hour.'-'.$in_days_start_minutes.'-'.$in_days_start_ampm; + $in_days_end_time = $in_days_end_hour.'-'.$in_days_end_minutes.'-'.$in_days_end_ampm; + } + + $in_days_times = ':'.$in_days_start_time.':'.$in_days_end_time; + } + + return $this->main->standardize_format($ex[0]) . ':' . $this->main->standardize_format($ex[1]).$in_days_times; + }, $in_days_arr); + + usort($in_days_arr, function($a, $b) + { + $ex_a = explode(':', $a); + $ex_b = explode(':', $b); + + $date_a = $ex_a[0]; + $date_b = $ex_b[0]; + + $in_day_a_time_label = ''; + if(isset($ex_a[2])) + { + $in_day_a_time = $ex_a[2]; + $pos = strpos($in_day_a_time, '-'); + if($pos !== false) $in_day_a_time_label = substr_replace($in_day_a_time, ':', $pos, 1); + + $in_day_a_time_label = str_replace('-', ' ', $in_day_a_time_label); + } + + $in_day_b_time_label = ''; + if(isset($ex_b[2])) + { + $in_day_b_time = $ex_b[2]; + $pos = strpos($in_day_b_time, '-'); + if($pos !== false) $in_day_b_time_label = substr_replace($in_day_b_time, ':', $pos, 1); + + $in_day_b_time_label = str_replace('-', ' ', $in_day_b_time_label); + } + + return strtotime(trim($date_a.' '.$in_day_a_time_label)) - strtotime(trim($date_b.' '.$in_day_b_time_label)); + }); + + if(!isset($in_days_arr[':i:'])) $in_days_arr[':i:'] = ':val:'; + foreach($in_days_arr as $key => $in_day_arr) + { + if(is_numeric($key)) $in_days .= $in_day_arr . ','; + } + } + + $not_in_days = ''; + if(count($not_in_days_arr)) + { + foreach($not_in_days_arr as $key => $not_in_day_arr) + { + if(is_numeric($key)) $not_in_days .= $this->main->standardize_format($not_in_day_arr) . ','; + } + } + + $in_days = trim($in_days, ', '); + $not_in_days = trim($not_in_days, ', '); + + update_post_meta($post_id, 'mec_in_days', $in_days); + update_post_meta($post_id, 'mec_not_in_days', $not_in_days); + + // Repeat End Date + if($repeat_end == 'never') $repeat_end_date = '0000-00-00'; + elseif($repeat_end == 'date') $repeat_end_date = $repeat_end_at_date; + elseif($repeat_end == 'occurrences') + { + if($plus_date) $repeat_end_date = date('Y-m-d', strtotime($plus_date, strtotime($end_date))); + else $repeat_end_date = '0000-00-00'; + } + else $repeat_end_date = '0000-00-00'; + + // If event is not repeating then set the end date of event correctly + if(!$repeat_status or $repeat_type == 'custom_days') $repeat_end_date = $end_date; + + // Add parameters to the $event + $event['end'] = $repeat_end_date; + $event['year'] = $year; + $event['month'] = $month; + $event['day'] = $day; + $event['week'] = $week; + $event['weekday'] = $weekday; + $event['weekdays'] = $weekdays; + $event['days'] = $in_days; + $event['not_in_days'] = $not_in_days; + + // Update MEC Events Table + $mec_event_id = $this->db->select($this->db->prepare("SELECT `id` FROM `#__mec_events` WHERE `post_id` = %d", $post_id), 'loadResult'); + + if(!$mec_event_id) + { + $q1 = ""; + $q2 = ""; + + foreach($event as $key=>$value) + { + $q1 .= "`$key`,"; + + if(is_null($value)) $q2 .= "NULL,"; + else $q2 .= "'$value',"; + } + + $this->db->q("INSERT INTO `#__mec_events` (".trim($q1, ', ').") VALUES (".trim($q2, ', ').")", 'INSERT'); + } + else + { + $q = ""; + + foreach($event as $key=>$value) + { + if(is_null($value)) $q .= "`$key`=NULL,"; + else $q .= "`$key`='$value',"; + } + + $this->db->q("UPDATE `#__mec_events` SET ".trim($q, ', ')." WHERE `id`='$mec_event_id'"); + } + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($post_id, $schedule->get_reschedule_maximum($repeat_type)); + + // Hourly Schedule + if(!isset($this->settings['fes_section_hourly_schedule']) or (isset($this->settings['fes_section_hourly_schedule']) and $this->settings['fes_section_hourly_schedule'])) + { + // Hourly Schedule Options + $raw_hourly_schedules = $mec['hourly_schedules'] ?? []; + unset($raw_hourly_schedules[':d:']); + + $hourly_schedules = []; + foreach($raw_hourly_schedules as $raw_hourly_schedule) + { + unset($raw_hourly_schedule['schedules'][':i:']); + $hourly_schedules[] = $raw_hourly_schedule; + } + + update_post_meta($post_id, 'mec_hourly_schedules', $hourly_schedules); + } + + // Booking Options + if(!isset($this->settings['fes_section_booking']) or (isset($this->settings['fes_section_booking']) and $this->settings['fes_section_booking'])) + { + // Booking and Ticket Options + $booking = $mec['booking'] ?? []; + update_post_meta($post_id, 'mec_booking', $booking); + + // Tickets + if(!isset($this->settings['fes_section_tickets']) or (isset($this->settings['fes_section_tickets']) and $this->settings['fes_section_tickets'])) + { + $tickets = $mec['tickets'] ?? []; + unset($tickets[':i:']); + + // Unset Ticket Dats + if(count($tickets)) + { + $new_tickets = []; + foreach($tickets as $key => $ticket) + { + unset($ticket['dates'][':j:']); + + $ticket_start_time_ampm = ((intval($ticket['ticket_start_time_hour']) > 0 and intval($ticket['ticket_start_time_hour']) < 13) and isset($ticket['ticket_start_time_ampm'])) ? $ticket['ticket_start_time_ampm'] : ''; + $ticket_render_start_time = date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_start_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_start_time_minute']) . $ticket_start_time_ampm)); + $ticket_end_time_ampm = ((intval($ticket['ticket_end_time_hour']) > 0 and intval($ticket['ticket_end_time_hour']) < 13) and isset($ticket['ticket_end_time_ampm'])) ? $ticket['ticket_end_time_ampm'] : ''; + $ticket_render_end_time = date('h:ia', strtotime(sprintf('%02d', $ticket['ticket_end_time_hour']) . ':' . sprintf('%02d', $ticket['ticket_end_time_minute']) . $ticket_end_time_ampm)); + + $ticket['ticket_start_time_hour'] = substr($ticket_render_start_time, 0, 2); + $ticket['ticket_start_time_ampm'] = strtoupper(substr($ticket_render_start_time, 5, 6)); + $ticket['ticket_end_time_hour'] = substr($ticket_render_end_time, 0, 2); + $ticket['ticket_end_time_ampm'] = strtoupper(substr($ticket_render_end_time, 5, 6)); + $ticket['price'] = trim($ticket['price']); + $ticket['limit'] = trim($ticket['limit']); + $ticket['minimum_ticket'] = trim($ticket['minimum_ticket']); + $ticket['stop_selling_value'] = trim($ticket['stop_selling_value']); + + // Bellow conditional block code is used to change ticket dates format to compatible ticket past dates structure for store in db. + foreach($ticket['dates'] as $dates_ticket_key => $dates_ticket_values) + { + if(isset($dates_ticket_values['start']) and trim($dates_ticket_values['start'])) + { + $ticket['dates'][$dates_ticket_key]['start'] = $this->main->standardize_format($dates_ticket_values['start']); + } + + if(isset($dates_ticket_values['end']) and trim($dates_ticket_values['end'])) + { + $ticket['dates'][$dates_ticket_key]['end'] = $this->main->standardize_format($dates_ticket_values['end']); + } + } + + $new_tickets[$key] = $ticket; + } + + $tickets = $new_tickets; + } + + update_post_meta($post_id, 'mec_tickets', $tickets); + update_post_meta($post_id, 'mec_global_tickets_applied', 1); + } + + // Fees + if(!isset($this->settings['fes_section_fees']) or (isset($this->settings['fes_section_fees']) and $this->settings['fes_section_fees'])) + { + // Fee options + $fees_global_inheritance = isset($mec['fees_global_inheritance']) ? sanitize_text_field($mec['fees_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_fees_global_inheritance', $fees_global_inheritance); + + $fees = $mec['fees'] ?? []; + update_post_meta($post_id, 'mec_fees', $fees); + } + + // Variation + if(!isset($this->settings['fes_section_ticket_variations']) or (isset($this->settings['fes_section_ticket_variations']) and $this->settings['fes_section_ticket_variations'])) + { + // Ticket Variation options + $ticket_variations_global_inheritance = isset($mec['ticket_variations_global_inheritance']) ? sanitize_text_field($mec['ticket_variations_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_ticket_variations_global_inheritance', $ticket_variations_global_inheritance); + + $ticket_variations = $mec['ticket_variations'] ?? []; + update_post_meta($post_id, 'mec_ticket_variations', $ticket_variations); + } + + // Booking Form + if(!isset($this->settings['fes_section_reg_form']) or (isset($this->settings['fes_section_reg_form']) and $this->settings['fes_section_reg_form'])) + { + // Registration Fields options + $reg_fields_global_inheritance = isset($mec['reg_fields_global_inheritance']) ? sanitize_text_field($mec['reg_fields_global_inheritance']) : 1; + update_post_meta($post_id, 'mec_reg_fields_global_inheritance', $reg_fields_global_inheritance); + + $reg_fields = $mec['reg_fields'] ?? []; + if($reg_fields_global_inheritance) $reg_fields = []; + + update_post_meta($post_id, 'mec_reg_fields', $reg_fields); + + $bfixed_fields = $mec['bfixed_fields'] ?? []; + if($reg_fields_global_inheritance) $bfixed_fields = []; + + update_post_meta($post_id, 'mec_bfixed_fields', $bfixed_fields); + } + } + + // Organizer Payment Options + $op = $mec['op'] ?? []; + update_post_meta($post_id, 'mec_op', $op); + update_user_meta(get_post_field('post_author', $post_id), 'mec_op', $op); + + // MEC Fields + $fields = (isset($mec['fields']) and is_array($mec['fields'])) ? $mec['fields'] : []; + update_post_meta($post_id, 'mec_fields', $fields); + + // Save fields one by one + foreach($fields as $field_id=>$values) + { + if(is_array($values)) + { + $values = array_unique($values); + $values = implode(',', $values); + } + + update_post_meta($post_id, 'mec_fields_'.$field_id, sanitize_text_field($values)); + } + + // Downloadable File + if(isset($mec['downloadable_file'])) + { + $dl_file = sanitize_text_field($mec['downloadable_file']); + update_post_meta($post_id, 'mec_dl_file', $dl_file); + } + + // Public Download Module File + if(isset($mec['public_download_module_file'])) + { + $public_dl_file = sanitize_text_field($mec['public_download_module_file']); + update_post_meta($post_id, 'mec_public_dl_file', $public_dl_file); + + $public_dl_title = isset($mec['public_download_module_title']) ? sanitize_text_field($mec['public_download_module_title']) : ''; + update_post_meta($post_id, 'mec_public_dl_title', $public_dl_title); + + $public_dl_description = isset($mec['public_download_module_description']) ? sanitize_text_field($mec['public_download_module_description']) : ''; + update_post_meta($post_id, 'mec_public_dl_description', $public_dl_description); + } + + // Event Gallery + $gallery = isset($mec['event_gallery']) && is_array($mec['event_gallery']) ? $mec['event_gallery'] : []; + update_post_meta($post_id, 'mec_event_gallery', $gallery); + + // Related Events + $related_events = (isset($mec['related_events']) and is_array($mec['related_events'])) ? $mec['related_events'] : []; + update_post_meta($post_id, 'mec_related_events', $related_events); + + // Event Banner + $event_banner = (isset($mec['banner']) and is_array($mec['banner'])) ? $mec['banner'] : []; + update_post_meta($post_id, 'mec_banner', $event_banner); + + // Event Dates Changed? + if($prev_start_datetime and $prev_end_datetime and !$repeat_status and $prev_start_datetime != $start_datetime and $prev_end_datetime != $end_datetime) + { + $this->main->event_date_updated($post_id, $prev_start_datetime, $prev_end_datetime); + } + + do_action('save_fes_meta_action', $post_id, $mec); + + // For Event Notification Badge. + if(isset($_REQUEST['mec']['post_id']) and trim(sanitize_text_field($_REQUEST['mec']['post_id'])) == '-1') update_post_meta($post_id, 'mec_event_date_submit', date('YmdHis', current_time('timestamp', 0))); + + $message = ''; + if($status == 'pending') $message = esc_html__('Event submitted. It will publish as soon as possible.', 'modern-events-calendar-lite'); + elseif($status == 'publish') $message = esc_html__('The event published.', 'modern-events-calendar-lite'); + + // Trigger Event + if($method == 'updated') do_action('mec_fes_updated', $post_id , 'update'); + else do_action('mec_fes_added', $post_id , ''); + + // Save Event Data + do_action('mec_save_event_data', $post_id, $mec); + + $redirect_to = ((isset($this->settings['fes_thankyou_page']) and trim($this->settings['fes_thankyou_page'])) ? get_permalink(intval($this->settings['fes_thankyou_page'])) : ''); + if(isset($this->settings['fes_thankyou_page_url']) and trim($this->settings['fes_thankyou_page_url'])) $redirect_to = esc_url($this->settings['fes_thankyou_page_url']); + + $this->main->response(array( + 'success' => 1, + 'message' => $message, + 'data'=> array( + 'post_id' => $post_id, + 'redirect_to' => $redirect_to, + ), + )); + } + + public function link_add_event() + { + if(!$this->relative_link and isset($this->settings['fes_form_page']) and trim($this->settings['fes_form_page'])) return get_permalink($this->settings['fes_form_page']); + else return $this->main->add_qs_var('post_id', '-1', $this->main->remove_qs_var('vlist')); + } + + public function link_edit_event($post_id) + { + if(!$this->relative_link and isset($this->settings['fes_form_page']) and trim($this->settings['fes_form_page'])) return $this->main->add_qs_var('post_id', $post_id, get_permalink($this->settings['fes_form_page'])); + else return $this->main->add_qs_var('post_id', $post_id, $this->main->remove_qs_var('vlist')); + } + + public function link_list_events() + { + if(!$this->relative_link and isset($this->settings['fes_list_page']) and trim($this->settings['fes_list_page'])) return get_permalink($this->settings['fes_list_page']); + else return $this->main->add_qs_var('vlist', 1, $this->main->remove_qs_var('post_id')); + } + + /** + * @param string $new_status + * @param string $old_status + * @param WP_Post $post + */ + public function status_changed($new_status, $old_status, $post) + { + // User creation is not enabled + if(!isset($this->settings['fes_guest_user_creation']) or (isset($this->settings['fes_guest_user_creation']) and !$this->settings['fes_guest_user_creation'])) return; + + if(('publish' === $new_status && 'publish' !== $old_status) && $this->PT === $post->post_type) + { + $guest_email = get_post_meta($post->ID, 'fes_guest_email', true); + if(!trim($guest_email) || !is_email($guest_email)) return; + + $user_id = 0; + $user_exists = email_exists($guest_email); + + if($user_exists and $user_exists == $post->post_author) return; + elseif($user_exists) $user_id = $user_exists; + else + { + $registered = register_new_user($guest_email, $guest_email); + if(!is_wp_error($registered)) + { + $user_id = $registered; + + $guest_name = get_post_meta($post->ID, 'fes_guest_name', true); + $ex = explode(' ', $guest_name); + + $first_name = $ex[0]; + unset($ex[0]); + + $last_name = implode(' ', $ex); + + wp_update_user(array( + 'ID' => $user_id, + 'first_name' => $first_name, + 'last_name' => $last_name, + )); + + $user = new WP_User($user_id); + $user->set_role('author'); + } + } + + if($user_id) + { + $db = $this->getDB(); + $db->q("UPDATE `#__posts` SET `post_author`='$user_id' WHERE `ID`='".$post->ID."'"); + } + } + } + + public function current_user_attachments($query = []) + { + $fes = $_REQUEST['mec_fes'] ?? 0; + $user_id = get_current_user_id(); + + if ($fes && $user_id && !current_user_can('manage_options')) { + $query['author'] = $user_id; + } + + return $query; + } +} + +// FES Categories Custom Walker +class FES_Custom_Walker extends Walker_Category +{ + /** + * This class is a custom walker for front end event submission hierarchical categories customizing + */ + private $post_id; + + function __construct($post_id) + { + $this->post_id = $post_id; + } + + function start_lvl(&$output, $depth = 0, $args = array()) + { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    "; + } + + function end_lvl(&$output, $depth = 0, $args = array()) + { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    "; + } + + function start_el(&$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0) + { + $post_categories = get_the_terms($this->post_id, 'mec_category'); + + $categories = []; + if($post_categories) foreach($post_categories as $post_category) $categories[] = $post_category->term_id; + + $output .= ''; + } +} diff --git a/app/features/fes/form.php b/app/features/fes/form.php new file mode 100755 index 0000000..fdff13e --- /dev/null +++ b/app/features/fes/form.php @@ -0,0 +1,212 @@ + +
    + + $this->link_list_events(), + ) + ); + ?> + + +
    +
    + +
    + + settings['fes_section_excerpt']) && $this->settings['fes_section_excerpt']){ + + FormBuilder::excerpt( + $post, + array( + 'required' => isset($this->settings['fes_required_excerpt']) && $this->settings['fes_required_excerpt'], + ) + ); + } + + FormBuilder::info( $post ); + + FormBuilder::datetime( + $post, + array( + 'time_format' => $this->settings['time_format'] ?? 12, + 'datepicker_format' => (isset($this->settings['datepicker_format']) and trim($this->settings['datepicker_format'])) ? $this->settings['datepicker_format'] : 'Y-m-d', + 'required' => isset($this->settings['fes_required_dates']) && $this->settings['fes_required_dates'], + ) + ); + + if(isset($this->settings['tz_per_event']) and $this->settings['tz_per_event']){ + + FormBuilder::timezone( $post, array() ); + } + + if(isset($this->settings['countdown_status']) and $this->settings['countdown_status'] and (!isset($this->settings['fes_section_countdown_method']) or (isset($this->settings['fes_section_countdown_method']) and $this->settings['fes_section_countdown_method']))){ + + FormBuilder::countdown_status( $post, array() ); + } + + if(isset($this->settings['style_per_event']) and $this->settings['style_per_event'] and isset($this->settings['fes_section_style_per_event']) and $this->settings['fes_section_style_per_event']){ + + FormBuilder::style_per_event( $post, array() ); + } + + if(isset($this->settings['trailer_url_status']) and $this->settings['trailer_url_status'] and isset($this->settings['fes_section_trailer_url']) and $this->settings['fes_section_trailer_url']){ + + FormBuilder::trailer_url( $post, array() ); + } + + if( + (!isset($this->settings['event_visibility_status']) or (isset($this->settings['event_visibility_status']) and $this->settings['event_visibility_status'])) and + (!isset($this->settings['fes_section_shortcode_visibility']) or (isset($this->settings['fes_section_shortcode_visibility']) and $this->settings['fes_section_shortcode_visibility'])) + ){ + + FormBuilder::visibility( $post, array() ); + } + + FormBuilder::other_fields( $post, array() ); + + FormBuilder::note( $post, array() ); + ?> +
    + +
    + settings['fes_guest_name_email']) and $this->settings['fes_guest_name_email']){ + + FormBuilder::guest( $post, array() ); + } + + if(!isset($this->settings['fes_section_event_links']) or (isset($this->settings['fes_section_event_links']) and $this->settings['fes_section_event_links'])){ + + FormBuilder::event_links( + $post, + array( + 'event_link_required' => (isset($this->settings['fes_required_event_link']) and $this->settings['fes_required_event_link']), + 'more_info_required' => (isset($this->settings['fes_required_more_info_link']) and $this->settings['fes_required_more_info_link']), + ) + ); + } + + if(!isset($this->settings['fes_section_cost']) or (isset($this->settings['fes_section_cost']) and $this->settings['fes_section_cost'])){ + + FormBuilder::cost( + $post, + array( + 'required' => ((isset($this->settings['fes_required_cost']) and $this->settings['fes_required_cost'])), + ) + ); + } + + if(!isset($this->settings['fes_section_featured_image']) or (isset($this->settings['fes_section_featured_image']) and $this->settings['fes_section_featured_image'])){ + + FormBuilder::thumbnail( + $post, + array( + 'required' => (isset($this->settings['fes_required_featured_image']) and $this->settings['fes_required_featured_image']), + 'featured_image_caption' => (isset($this->settings['featured_image_caption']) and $this->settings['featured_image_caption']), + ) + ); + } + + if(!isset($this->settings['fes_section_event_gallery']) or (isset($this->settings['fes_section_event_gallery']) and $this->settings['fes_section_event_gallery'])) + { + FormBuilder::event_gallery( $post ); + } + + if(!isset($this->settings['fes_section_categories']) or (isset($this->settings['fes_section_categories']) and $this->settings['fes_section_categories'])) + { + FormBuilder::categories( + $post, + array( + 'required' => (isset($this->settings['fes_required_category']) and $this->settings['fes_required_category']), + ) + ); + } + + if(!isset($this->settings['fes_section_labels']) or (isset($this->settings['fes_section_labels']) and $this->settings['fes_section_labels'])){ + + FormBuilder::labels( + $post, + array( + 'required' => (isset($this->settings['fes_required_label']) and $this->settings['fes_required_label']), + ) + ); + } + + if(!isset($this->settings['fes_section_event_color']) or (isset($this->settings['fes_section_event_color']) and $this->settings['fes_section_event_color'])){ + + FormBuilder::color( $post, array() ); + } + + if(!isset($this->settings['fes_section_tags']) or (isset($this->settings['fes_section_tags']) and $this->settings['fes_section_tags'])){ + + FormBuilder::tags( $post, array() ); + } + + if((isset($this->settings['speakers_status']) and $this->settings['speakers_status']) and isset($this->settings['fes_section_speaker']) and $this->settings['fes_section_speaker']){ + + FormBuilder::speakers( $post, array() ); + } + + if( $this->getPRO() && isset($this->settings['sponsors_status']) and $this->settings['sponsors_status'] and isset($this->settings['fes_section_sponsor']) and $this->settings['fes_section_sponsor'] ){ + + FormBuilder::sponsors( $post, array( + 'add_sponsors' => !isset($this->settings['fes_add_sponsor']) || $this->settings['fes_add_sponsor'] ? 1: 0, + ) ); + } + + + if( isset($this->settings['fes_section_virtual_events']) && $this->settings['fes_section_virtual_events'] ){ + + FormBuilder::virtual( $post, array() ); + } + + if( isset($this->settings['fes_section_zoom_integration']) && $this->settings['fes_section_zoom_integration'] ){ + + FormBuilder::zoom( $post, array() ); + } + + ?> + +
    +
    + + settings['fes_agreement']) and $this->settings['fes_agreement']){ + + FormBuilder::agreement( + $post, + array( + 'agreement_page' => (isset($this->settings['fes_agreement_page']) and $this->settings['fes_agreement_page']) ? $this->settings['fes_agreement_page'] : false, + 'checked' => isset($this->settings['fes_agreement_checked']) && $this->settings['fes_agreement_checked'], + ) + ); + } + + FormBuilder::recaptcha( $post, array() ); + + FormBuilder::submit_button( $post, array() ); + ?> +
    +
    +
    + + \ No newline at end of file diff --git a/app/features/fes/index.html b/app/features/fes/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/fes/list.php b/app/features/fes/list.php new file mode 100755 index 0000000..7e9f14f --- /dev/null +++ b/app/features/fes/list.php @@ -0,0 +1,178 @@ +$this->PT, + 'posts_per_page'=>$limit, + 'paged'=>$paged, + 'post_status'=>array('pending', 'draft', 'future', 'publish') +); + +// Apply Author Query +if(!current_user_can('edit_others_posts')) $args['author'] = get_current_user_id(); + +// The Query +$query = new WP_Query($args); + +// Date Format +$date_format = get_option('date_format'); + +// Display Date +$display_date = (isset($this->settings['fes_display_date_in_list']) && $this->settings['fes_display_date_in_list']); + +// Generating javascript code of countdown module +$javascript = ''; + +// Include javascript code into the footer +$this->factory->params('footer', $javascript); +?> +
    + have_posts()): ?> +
    + +
    + +
      + have_posts()): $query->the_post(); + // Show Post Status + global $post; + $status = $this->main->get_event_label_status(trim($post->post_status)); + ?> +
    • + + + + (main->date_label(array( + 'date' => get_post_meta(get_the_ID(), 'mec_start_date', true) + ), array( + 'date' => get_post_meta(get_the_ID(), 'mec_end_date', true) + ), $date_format)); ?>) + + + settings['booking_status']) && $this->settings['booking_status']): + ?> +
      + + +
      +
      + +
      + + +
      +
      + +
        + getRender(); + $dates = $render->dates(get_the_ID(), NULL, 15, date('Y-m-d', $past_week)); + + $book = $this->getBook(); + foreach($dates as $date) + { + if(isset($date['start']['date']) and isset($date['end']['date'])) + { + $attendees_count = 0; + + $bookings = $this->main->get_bookings(get_the_ID(), $date['start']['timestamp']); + foreach($bookings as $booking) + { + $attendees_count += $book->get_total_attendees($booking->ID); + } + ?> +
      • main->date_label($date['start'], $date['end'], $date_format)); ?>
      • + +
      + +
      +
      + + +
      +
      +
    • + +
    + + +

    +
    + +
    + +
    \ No newline at end of file diff --git a/app/features/fes/message.php b/app/features/fes/message.php new file mode 100755 index 0000000..7b5df78 --- /dev/null +++ b/app/features/fes/message.php @@ -0,0 +1,7 @@ + +
    +

    +
    \ No newline at end of file diff --git a/app/features/gateways/index.html b/app/features/gateways/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/hourlyschedule.php b/app/features/hourlyschedule.php new file mode 100755 index 0000000..27a524a --- /dev/null +++ b/app/features/hourlyschedule.php @@ -0,0 +1,79 @@ + + */ +class MEC_feature_hourlyschedule extends MEC_base +{ + public $factory; + public $main; + public $cart; + public $book; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize Hourly Schedule Feature + * @author Webnus + */ + public function init() + { + // Hourly Schedule Shortcode + $this->factory->shortcode('mec-hourly-schedule', array($this, 'shortcode')); + } + + /** + * @param $atts + * @return string + * @throws Exception + */ + public function shortcode($atts) + { + $event_id = $atts['event-id'] ?? 0; + if(!$event_id) return '

    '.esc_html__('Please insert event id!', 'modern-events-calendar-lite').'

    '; + + $event = get_post($event_id); + if(!$event || $event->post_type != $this->main->get_main_post_type()) return '

    '.esc_html__('Event is not valid!', 'modern-events-calendar-lite').'

    '; + + // Create Single Skin + $single = new MEC_skin_single(); + + // Initialize the skin + $single->initialize([ + 'id' => $event_id, + 'maximum_dates' => $this->settings['booking_maximum_dates'] ?? 6 + ]); + + // Fetch the events + $events = $single->fetch(); + + if(!isset($events[0])) return '

    '.esc_html__('Event is not valid!', 'modern-events-calendar-lite').'

    '; + + ob_start(); + $single->display_hourly_schedules_widget($events[0], [ + 'title' => $event->post_title + ]); + + $html = ob_get_clean(); + + return '
    ' . MEC_kses::full($html) . '
    '; + } +} \ No newline at end of file diff --git a/app/features/index.html b/app/features/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/ix.php b/app/features/ix.php new file mode 100755 index 0000000..5625b3d --- /dev/null +++ b/app/features/ix.php @@ -0,0 +1,5254 @@ += 5.3 otherwise it doesn't activate + * @author Webnus + */ +class MEC_feature_ix extends MEC_base +{ + public $factory; + public $main; + public $db; + public $action; + public $ix; + public $response; + + /** + * Facebook App Access Token + * @var string + */ + private $fb_access_token = ''; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC DB + $this->db = $this->getDB(); + } + + /** + * Initialize IX feature + * @author Webnus + */ + public function init() + { + // Disable Import / Export Feature if autoload feature is not exists + if(!function_exists('spl_autoload_register')) return; + + $this->factory->action('admin_menu', array($this, 'menus'), 20); + + // Import APIs + $this->factory->action('init', array($this, 'include_google_api')); + $this->factory->action('init', array($this, 'include_meetup_api')); + + // MEC IX Action + $mec_ix_action = isset($_GET['mec-ix-action']) ? sanitize_text_field($_GET['mec-ix-action']) : ''; + + // Export All Events + if($mec_ix_action == 'export-events') $this->factory->action('init', array($this, 'export_all_events_do'), 9999); + elseif($mec_ix_action == 'export-bookings') $this->factory->action('init', array($this, 'export_all_bookings_do'), 9999); + elseif($mec_ix_action == 'google-calendar-export-get-token') $this->factory->action('init', array($this, 'g_calendar_export_get_token'), 9999); + + // AJAX Actions + $this->factory->action('wp_ajax_mec_ix_add_to_g_calendar', array($this, 'g_calendar_export_do')); + $this->factory->action('wp_ajax_mec_ix_g_calendar_authenticate', array($this, 'g_calendar_export_authenticate')); + + // Import XML File + $this->factory->action('mec_import_file', array($this, 'import_do')); + + // Third Party Plugins + $this->factory->action('wp_ajax_mec_ix_thirdparty_import', array($this, 'thirdparty_import_do')); + } + + /** + * Import Google API libraries + * @author Webnus + */ + public function include_google_api() + { + if(class_exists('Google_Service_Calendar')) return; + + MEC::import('app.api.Google.autoload', false); + } + + /** + * Import Meetup API libraries + * @author Webnus + */ + public function include_meetup_api() + { + if(class_exists('Meetup')) return; + + MEC::import('app.api.Meetup.meetup', false); + } + + /** + * Add the IX menu + * @author Webnus + */ + public function menus() + { + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_import_export'); + add_submenu_page('mec-intro', esc_html__('MEC - Import / Export', 'modern-events-calendar-lite'), esc_html__('Import / Export', 'modern-events-calendar-lite'), $capability, 'MEC-ix', array($this, 'ix')); + } + + /** + * Show content of Import / Export Menu + * @author Webnus + * @return void + */ + public function ix() + { + $tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : ''; + + if($tab == 'MEC-export') $this->ix_export(); + elseif($tab == 'MEC-sync') $this->ix_sync(); + elseif($tab == 'MEC-g-calendar-export') $this->ix_g_calendar_export(); + elseif($tab == 'MEC-f-calendar-import') $this->ix_f_calendar_import(); + elseif($tab == 'MEC-meetup-import') $this->ix_meetup_import(); + elseif($tab == 'MEC-import') $this->ix_import(); + elseif($tab == 'MEC-thirdparty') $this->ix_thirdparty(); + elseif($tab == 'MEC-test-data') $this->ix_test_data(); + else $this->ix_g_calendar_import(); + } + + /** + * Show content of export tab + * @author Webnus + * @return void + */ + public function ix_export() + { + $path = MEC::import('app.features.ix.export', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of export tab + * @author Webnus + * @return void + */ + public function ix_sync() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + if($this->action == 'save-sync-options') + { + // Save options + $this->main->save_ix_options(array( + 'sync_g_import'=> $this->ix['sync_g_import'] ?? 0, + 'sync_g_import_auto'=> $this->ix['sync_g_import_auto'] ?? 0, + 'sync_g_export'=> $this->ix['sync_g_export'] ?? 0, + 'sync_g_export_auto'=> $this->ix['sync_g_export_auto'] ?? 0, + 'sync_g_export_attendees'=> $this->ix['sync_g_export_attendees'] ?? 0, + 'sync_f_import'=> $this->ix['sync_f_import'] ?? 0, + 'sync_meetup_import'=> $this->ix['sync_meetup_import'] ?? 0, + 'sync_meetup_import_auto'=> $this->ix['sync_meetup_import_auto'] ?? 0, + )); + } + + $path = MEC::import('app.features.ix.sync', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of import tab + * @author Webnus + * @return void + */ + public function ix_import() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $this->response = []; + + $nonce = (isset($_POST['_wpnonce']) ? sanitize_text_field($_POST['_wpnonce']) : ''); + if(wp_verify_nonce($nonce, 'mec_import_start_upload')) + { + if(in_array($this->action, array('import-start-xml', 'import-start-ics'))) $this->response = $this->import_start(); + elseif($this->action == 'import-start-bookings') $this->response = $this->import_start_bookings(); + elseif(!empty($this->action)) $this->response = apply_filters('mec_import_item_action', array(), $this->action); + } + + $path = MEC::import('app.features.ix.import', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function import_start_bookings() + { + $feed_file = $_FILES['feed']; + + // File is not uploaded + if(!isset($feed_file['name']) or trim($feed_file['name']) == '') return array('success' => 0, 'message' => esc_html__('Please upload a CSV file.', 'modern-events-calendar-lite')); + + // File name validation + $name_ex = explode('.', $feed_file['name']); + $name_end = end($name_ex); + if($name_end != 'csv') return array('success' => 0, 'message' => esc_html__('Please upload a CSV file.', 'modern-events-calendar-lite')); + + // Upload the File + $upload_dir = wp_upload_dir(); + + $target_path = $upload_dir['basedir'].'/'.basename($feed_file['name']); + $uploaded = move_uploaded_file($feed_file['tmp_name'], $target_path); + + // Error on Upload + if(!$uploaded) return array('success' => 0, 'message' => esc_html__("An error occurred during the file upload! Please check permissions!", 'modern-events-calendar-lite')); + + if($type = mime_content_type($target_path) and $type == 'text/x-php') + { + unlink($target_path); + return array('success' => 0, 'message' => esc_html__("Please upload a CSV file.", 'modern-events-calendar-lite')); + } + + $bookings = []; + if(($h = fopen($target_path, 'r')) !== false) + { + // MEC Libraries + $gateway = new MEC_gateway(); + $book = $this->getBook(); + + $delimiters = [";" => 0, "," => 0, "\t" => 0, "|" => 0]; + + $first = fgets($h); + foreach ($delimiters as $delimiter => &$count) { + $count = count(str_getcsv($first, $delimiter)); + } + + $separator = array_search(max($delimiters), $delimiters); + + $r = 0; + while(($data = fgetcsv($h, 1000, $separator)) !== false) + { + $r++; + + $booking_id = $data[0]; + if($r === 1 and !is_numeric($booking_id)) continue; + + $event_title = $data[1]; + $event_id = post_exists($event_title, '', '', $this->main->get_main_post_type()); + + // Event not Found + if(!$event_id) continue; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + $ticket_id = NULL; + $ticket_name = $data[6]; + + foreach($tickets as $tid => $ticket) + { + if(strtolower($ticket['name']) == strtolower($ticket_name)) + { + $ticket_id = $tid; + break; + } + } + + // Ticket ID not found! + if(is_null($ticket_id)) continue; + + $transaction_id = $data[7]; + + // Transaction Exists + $transaction_exists = $book->get_transaction($transaction_id); + if(is_array($transaction_exists) and count($transaction_exists)) continue; + + $start_datetime = $data[2]; + $end_datetime = $data[3]; + $name = $data[10]; + $email = $data[11]; + + $confirmed_label = $data[13]; + if($confirmed_label == esc_html__('Confirmed', 'modern-events-calendar-lite')) $confirmed = 1; + elseif($confirmed_label == esc_html__('Rejected', 'modern-events-calendar-lite')) $confirmed = -1; + else $confirmed = 0; + + $verified_label = $data[14]; + if($verified_label == esc_html__('Verified', 'modern-events-calendar-lite')) $verified = 1; + elseif($verified_label == esc_html__('Canceled', 'modern-events-calendar-lite')) $verified = -1; + else $verified = 0; + + $other_dates_str = $data[15] ?? ''; + $other_dates = []; + + if(trim($other_dates_str)) + { + $other_dates_ex1 = explode("\n", $other_dates_str); + foreach($other_dates_ex1 as $other_date_ex1) + { + $other_date_ex2 = explode(' -> ', trim($other_date_ex1)); + $other_dates[] = strtotime($other_date_ex2[0]).':'.strtotime($other_date_ex2[1]); + } + } + + $main_date = strtotime($start_datetime).':'.strtotime($end_datetime); + + $all_dates = []; + if(count($other_dates)) $all_dates = array_merge(array($main_date), $other_dates); + + $ticket_variations = explode(',', $data[12]); + $variations = $this->main->ticket_variations($event_id, $ticket_id); + + $v = []; + foreach($variations as $vid => $variation) + { + foreach($ticket_variations as $ticket_variation) + { + $variation_ex = explode(':', $ticket_variation); + if(!isset($variation_ex[1])) continue; + + $variation_name = $variation_ex[0]; + $variation_count = trim($variation_ex[1], '() '); + + if(strtolower($variation['title']) == strtolower($variation_name)) + { + $v[$vid] = $variation_count; + } + } + } + + if(!isset($bookings[$transaction_id])) $bookings[$transaction_id] = array('tickets' => array()); + + $bookings[$transaction_id]['tickets'][] = array( + 'email' => $email, + 'name' => $name, + 'variations' => $v, + 'id' => $ticket_id, + 'count' => 1 + ); + + if(!isset($bookings[$transaction_id]['date'])) $bookings[$transaction_id]['date'] = $main_date; + if(!isset($bookings[$transaction_id]['other_dates'])) $bookings[$transaction_id]['other_dates'] = $other_dates; + if(!isset($bookings[$transaction_id]['all_dates'])) $bookings[$transaction_id]['all_dates'] = $all_dates; + if(!isset($bookings[$transaction_id]['event_id'])) $bookings[$transaction_id]['event_id'] = $event_id; + if(!isset($bookings[$transaction_id]['confirmed'])) $bookings[$transaction_id]['confirmed'] = $confirmed; + if(!isset($bookings[$transaction_id]['verified'])) $bookings[$transaction_id]['verified'] = $verified; + } + + fclose($h); + + // MEC User + $u = $this->getUser(); + + foreach($bookings as $transaction_id => $transaction) + { + $event_id = $transaction['event_id']; + $tickets = $transaction['tickets']; + + $event_tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($event_tickets)) $event_tickets = []; + + $raw_tickets = []; + $raw_variations = []; + + foreach($tickets as $ticket) + { + if(!isset($raw_tickets[$ticket['id']])) $raw_tickets[$ticket['id']] = 1; + else $raw_tickets[$ticket['id']] += 1; + + if(isset($ticket['variations']) and is_array($ticket['variations']) and count($ticket['variations'])) + { + // Variations Per Ticket + if(!isset($raw_variations[$ticket['id']])) $raw_variations[$ticket['id']] = []; + + foreach($ticket['variations'] as $variation_id => $variation_count) + { + if(!trim($variation_count)) continue; + + if(!isset($raw_variations[$ticket['id']][$variation_id])) $raw_variations[$ticket['id']][$variation_id] = $variation_count; + else $raw_variations[$ticket['id']][$variation_id] += $variation_count; + } + } + } + + $attention_date = $transaction['date'] ?? ''; + $attention_times = explode(':', $attention_date); + $date = date('Y-m-d H:i:s', trim($attention_times[0])); + + $other_dates = (isset($transaction['other_dates']) and is_array($transaction['other_dates'])) ? $transaction['other_dates'] : []; + $all_dates = (isset($transaction['all_dates']) and is_array($transaction['all_dates'])) ? $transaction['all_dates'] : []; + $timestamps = (isset($transaction['timestamps']) and is_array($transaction['timestamps'])) ? $transaction['timestamps'] : array($attention_date); + + // Calculate price of bookings + $price_details = $book->get_price_details($raw_tickets, $event_id, $event_tickets, $raw_variations, $timestamps); + + $transaction['all_dates'] = $all_dates; + $transaction['other_dates'] = $other_dates; + $transaction['timestamps'] = $timestamps; + $transaction['price_details'] = $price_details; + $transaction['total'] = $price_details['total']; + $transaction['discount'] = 0; + $transaction['price'] = $price_details['total']; + $transaction['payable'] = $price_details['payable']; + $transaction['coupon'] = NULL; + + update_option($transaction_id, $transaction, false); + + $attendees = $transaction['tickets'] ?? []; + + $main_attendee = $attendees[0] ?? []; + $name = $main_attendee['name'] ?? ''; + + $ticket_ids = ''; + $attendees_info = []; + + foreach($attendees as $i => $attendee) + { + if(!is_numeric($i)) continue; + + $ticket_ids .= $attendee['id'] . ','; + if(!array_key_exists($attendee['email'], $attendees_info)) $attendees_info[$attendee['email']] = array('count' => $attendee['count']); + else $attendees_info[$attendee['email']]['count'] = ($attendees_info[$attendee['email']]['count'] + $attendee['count']); + } + + $ticket_ids = ',' . trim($ticket_ids, ', ') . ','; + $user_id = $gateway->register_user($main_attendee); + + $book_subject = $name.' - '.($main_attendee['email'] ?? $u->get($user_id)->user_email); + $book_id = $book->add( + array( + 'post_author' => $user_id, + 'post_type' => $this->main->get_book_post_type(), + 'post_title' => $book_subject, + 'post_date' => $date, + 'attendees_info' => $attendees_info, + 'mec_attendees' => $attendees, + 'mec_gateway' => 'MEC_gateway', + 'mec_gateway_label' => $gateway->title() + ), + $transaction_id, + $ticket_ids + ); + + // Assign User + $u->assign($book_id, $user_id); + + update_post_meta($book_id, 'mec_confirmed', $transaction['confirmed']); + update_post_meta($book_id, 'mec_verified', $transaction['verified']); + } + } + + // Delete File + unlink($target_path); + + return array('success' => (count($bookings) ? 1 : 0), 'message' => (count($bookings) ? esc_html__('The bookings are imported successfully!', 'modern-events-calendar-lite') : esc_html__('No bookings found to import!', 'modern-events-calendar-lite'))); + } + + public function import_start() + { + $feed_file = $_FILES['feed']; + + // File is not uploaded + if(!isset($feed_file['name']) or trim($feed_file['name']) == '') return array('success' => 0, 'message' => esc_html__('Please upload the feed file.', 'modern-events-calendar-lite')); + + // File name validation + $ex = explode('.', $feed_file['name']); + $name_end = end($ex); + if(!in_array($name_end, array('xml', 'ics'))) return array('success' => 0, 'message' => esc_html__('Please upload an XML or an ICS file.', 'modern-events-calendar-lite')); + + // File Type is not valid + if(!isset($feed_file['type']) or !in_array(strtolower($feed_file['type']), array('text/xml', 'text/calendar'))) return array('success' => 0, 'message' => esc_html__('The file type should be XML or ICS.', 'modern-events-calendar-lite')); + + // Upload the File + $upload_dir = wp_upload_dir(); + + $target_path = $upload_dir['basedir'].'/'.basename($feed_file['name']); + $uploaded = move_uploaded_file($feed_file['tmp_name'], $target_path); + + // Error on Upload + if(!$uploaded) return array('success' => 0, 'message' => esc_html__("An error occurred during the file upload! Please check permissions!", 'modern-events-calendar-lite')); + + if($type = mime_content_type($target_path) and $type == 'text/x-php') + { + unlink($target_path); + return array('success' => 0, 'message' => esc_html__("Please upload an XML or an ICS file.", 'modern-events-calendar-lite')); + } + + if($type === 'text/calendar' and is_string($this->main->parse_ics($target_path))) + { + return array('success' => 0, 'message' => sprintf(__("The ICS file is not valid. Reported Error: %s", 'modern-events-calendar-lite'), ''.$this->main->parse_ics($target_path).'')); + } + + // Import + do_action('mec_import_file', $target_path); + + // Delete File + unlink($target_path); + + return array('success' => 1, 'message' => esc_html__('The events are imported successfully!', 'modern-events-calendar-lite')); + } + + public function import_do($feed) + { + // Increase the resources + @ini_set('memory_limit', '1024M'); + @ini_set('max_execution_time', 300); + + do_action('mec_custom_max_execution'); + + $file = $this->getFile(); + $extension = $file->getExt($feed); + + /** + * @var MEC_db $db + */ + $db = $this->getDB(); + + /** + * @var MEC_main $main + */ + $main = $this->getMain(); + + // Settings + $settings = $main->get_settings(); + + // WP Upload Path + $wp_upload_dir = wp_upload_dir(); + + $posts = []; + if(strtolower($extension) == 'xml') + { + $xml_string = str_replace(':i:', 'iii', $file->read($feed)); + $xml_string = str_replace(':fi:', 'fif', $xml_string); + $xml_string = str_replace(':v:', 'vvv', $xml_string); + + $XML = simplexml_load_string($xml_string); + if($XML === false) return false; + + foreach($XML->children() as $event) + { + $feed_event_id = (int) $event->ID; + + // Event Data + $meta = $event->meta; + $mec = $event->mec; + + // Event location + $location = ($event->locations ? $event->locations->item[0] : NULL); + $location_id = ($location and isset($location->name)) ? $main->save_location(array + ( + 'name'=>trim((string) $location->name), + 'address'=>(string) $location->address, + 'latitude'=>(string) $location->latitude, + 'longitude'=>(string) $location->longitude, + 'thumbnail'=>(string) $location->thumbnail + )) : 1; + + // Event Organizer + $organizer = ($event->organizers ? $event->organizers->item[0] : NULL); + $organizer_id = ($organizer and isset($organizer->name)) ? $main->save_organizer(array + ( + 'name'=>trim((string) $organizer->name), + 'email'=>(string) $organizer->email, + 'tel'=>(string) $organizer->tel, + 'url'=>(string) $organizer->url, + 'thumbnail'=>(string) $organizer->thumbnail + )) : 1; + + // Event Categories + $category_ids = []; + if(isset($event->categories)) + { + foreach($event->categories->children() as $category) + { + $category_id = $main->save_category(array + ( + 'name'=>trim((string) $category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Tags + $tag_ids = []; + if(isset($event->tags)) + { + foreach($event->tags->children() as $tag) + { + $tag_id = $main->save_tag(array + ( + 'name'=>trim((string) $tag->name), + )); + + if($tag_id) $tag_ids[] = $tag_id; + } + } + + // Event Labels + $label_ids = []; + if(isset($event->labels)) + { + foreach($event->labels->children() as $label) + { + $label_id = $main->save_label(array + ( + 'name'=>trim((string) $label->name), + 'color'=>(string) $label->color, + )); + + if($label_id) $label_ids[] = $label_id; + } + } + + // Event Speakers + $speaker_ids = []; + if(isset($event->speakers)) + { + foreach($event->speakers->children() as $speaker) + { + $speaker_id = $main->save_speaker(array + ( + 'name'=>trim((string) $speaker->name), + 'job_title'=>(string) (isset($speaker->job_title) ? $speaker->job_title : ''), + 'tel'=>(string) (isset($speaker->tel) ? $speaker->tel : ''), + 'email'=>(string) (isset($speaker->email) ? $speaker->email : ''), + 'facebook'=>(string) (isset($speaker->facebook) ? $speaker->facebook : ''), + 'twitter'=>(string) (isset($speaker->twitter) ? $speaker->twitter : ''), + 'instagram'=>(string) (isset($speaker->instagram) ? $speaker->instagram : ''), + 'linkedin'=>(string) (isset($speaker->linkedin) ? $speaker->linkedin : ''), + 'website'=>(string) (isset($speaker->website) ? $speaker->website : ''), + 'thumbnail'=>(string) (isset($speaker->thumbnail) ? $speaker->thumbnail : ''), + )); + + if($speaker_id) $speaker_ids[] = $speaker_id; + } + } + + // Event Sponsors + $sponsor_ids = []; + if(isset($event->sponsors) and isset($settings['sponsors_status']) and $settings['sponsors_status']) + { + foreach($event->sponsors->children() as $sponsor) + { + $sponsor_id = $main->save_sponsor(array + ( + 'name'=>trim((string) $sponsor->name), + 'link'=>(string) (isset($sponsor->link) ? $sponsor->link : ''), + 'logo'=>(string) (isset($sponsor->logo) ? $sponsor->logo : ''), + )); + + if($sponsor_id) $sponsor_ids[] = $sponsor_id; + } + } + + // Start + $start_date = (string) $meta->mec_date->start->date; + $start_hour = (int) $meta->mec_date->start->hour; + $start_minutes = (int) $meta->mec_date->start->minutes; + $start_ampm = (string) $meta->mec_date->start->ampm; + + // End + $end_date = (string) $meta->mec_date->end->date; + $end_hour = (int) $meta->mec_date->end->hour; + $end_minutes = (int) $meta->mec_date->end->minutes; + $end_ampm = (string) $meta->mec_date->end->ampm; + + // Time Options + $allday = (int) $meta->mec_date->allday; + $time_comment = (string) $meta->mec_date->comment; + $hide_time = (int) $meta->mec_date->hide_time; + $hide_end_time = (int) $meta->mec_date->hide_end_time; + + // Repeat Options + $repeat_status = (int) $meta->mec_repeat_status; + $repeat_type = (string) $meta->mec_repeat_type; + $repeat_interval = (int) $meta->mec_repeat_interval; + $finish = (string) $mec->end; + $year = (string) $mec->year; + $month = (string) $mec->month; + $day = (string) $mec->day; + $week = (string) $mec->week; + $weekday = (string) $mec->weekday; + $weekdays = (string) $mec->weekdays; + $days = (string) $mec->days; + $not_in_days = (string) $mec->not_in_days; + + $additional_organizer_ids = []; + if(isset($meta->mec_additional_organizer_ids)) + { + foreach($meta->mec_additional_organizer_ids->children() as $o) + { + $additional_organizer_ids[] = (int) $o; + } + } + + $hourly_schedules = []; + if(isset($meta->mec_hourly_schedules)) + { + foreach($meta->mec_hourly_schedules->children() as $s) + { + $hourly_schedules[] = array + ( + 'from' => (string) $s->from, + 'to' => (string) $s->to, + 'title' => (string) $s->title, + 'description' => (string) $s->description, + ); + } + } + + $tickets = []; + if(isset($meta->mec_tickets)) + { + foreach($meta->mec_tickets->children() as $t) + { + $tickets[] = array + ( + 'name' => (string) $t->name, + 'description' => (string) $t->description, + 'price' => (string) $t->price, + 'price_label' => (string) $t->price_label, + 'limit' => (string) $t->limit, + 'unlimited' => (int) $t->unlimited, + ); + } + } + + $fees = []; + if(isset($meta->mec_fees)) + { + foreach($meta->mec_fees->children() as $f) + { + if($f->getName() !== 'item') continue; + + $fees[] = array + ( + 'title' => (string) $f->title, + 'amount' => (string) $f->amount, + 'type' => (string) $f->type, + ); + } + } + + $reg_fields = []; + if(isset($meta->mec_reg_fields)) + { + foreach($meta->mec_reg_fields->children() as $r) + { + if($r->getName() !== 'item') continue; + + $options = []; + foreach($r->options->children() as $o) $options[] = (string) $o->label; + + $reg_fields[] = array + ( + 'mandatory' => (int) $r->mandatory, + 'type' => (string) $r->type, + 'label' => (string) $r->label, + 'options' => $options, + ); + } + } + + $advanced_days = []; + if(isset($meta->mec_advanced_days)) + { + foreach($meta->mec_advanced_days->children() as $t) + { + $advanced_days[] = (string) $t; + } + } + + // Event Fields + $event_fields = []; + if(isset($event->fields)) + { + // Global Fields + $global_fields = $this->main->get_event_fields(); + if(!is_array($global_fields)) $global_fields = []; + + foreach($event->fields->children() as $field) + { + $field_id = isset($field->id) ? (int) $field->id : NULL; + if(!$field_id) continue; + + $field_type = isset($field->type) ? (string) $field->type : NULL; + if(!$field_type) continue; + + $field_val = isset($field->value) ? (string) $field->value : NULL; + if(!$field_val) continue; + + $global_field = ($global_fields[$field_id] ?? NULL); + if(!$global_field) continue; + + if(!is_array($global_field) or (is_array($global_field) and !isset($global_field['type'])) or (is_array($global_field) and isset($global_field['type']) and $global_field['type'] !== $field_type)) continue; + + if(in_array($field_type, array('checkbox'))) + { + $raw_field_value = explode(',', trim($field_val, ', ')); + + $field_value = []; + foreach($raw_field_value as $field_k => $field_v) + { + if(trim($field_v) !== '') $field_value[] = trim($field_v); + } + } + else $field_value = $field_val; + + $event_fields[$field_id] = $field_value; + } + } + + $args = array + ( + 'title'=> (string) $event->title, + 'content'=> (string) $event->content, + 'status'=> (string) ($event->post ? $event->post->post_status : 'publish'), + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array(), + 'allday'=>$allday, + 'comment'=>$time_comment, + 'hide_time'=>$hide_time, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$repeat_interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'not_in_days'=>$not_in_days, + 'meta'=>array + ( + 'mec_source'=>'mec-calendar', + 'mec_feed_event_id'=>$feed_event_id, + 'mec_dont_show_map'=> (int) $meta->mec_dont_show_map, + 'mec_color'=> (string) $meta->mec_color, + 'mec_read_more'=> (string) $meta->mec_read_more, + 'mec_more_info'=> (string) $meta->mec_more_info, + 'mec_more_info_title'=> (string) $meta->mec_more_info_title, + 'mec_more_info_target'=> (string) $meta->mec_more_info_target, + 'mec_cost'=> (string) $meta->mec_cost, + 'mec_additional_organizer_ids' =>$additional_organizer_ids, + 'mec_repeat'=>array + ( + 'status' => (int) $meta->mec_repeat->status, + 'type' => (string) $meta->mec_repeat->type, + 'interval' => (int) $meta->mec_repeat->interval, + 'end' => (string) $meta->mec_repeat->end, + 'end_at_date' => (string) $meta->mec_repeat->end_at_date, + 'end_at_occurrences' => (string) $meta->mec_repeat->end_at_occurrences, + ), + 'mec_allday'=>$allday, + 'mec_hide_time'=>$hide_time, + 'mec_hide_end_time'=>$hide_end_time, + 'mec_comment'=>$time_comment, + 'mec_repeat_end'=> (string) $meta->mec_repeat_end, + 'mec_repeat_end_at_occurrences'=> (string) $meta->mec_repeat_end_at_occurrences, + 'mec_repeat_end_at_date'=> (string) $meta->mec_repeat_end_at_date, + 'mec_in_days'=> (string) $meta->mec_in_days, + 'mec_not_in_days'=> (string) $meta->mec_not_in_days, + 'mec_hourly_schedules'=>$hourly_schedules, + 'mec_booking'=>array + ( + 'bookings_limit_unlimited' => (int) $meta->mec_booking->bookings_limit_unlimited, + 'bookings_limit' => (int) $meta->mec_booking->bookings_limit, + ), + 'mec_tickets'=>$tickets, + 'mec_fees_global_inheritance'=> (int) $meta->mec_fees_global_inheritance, + 'mec_fees'=>$fees, + 'mec_reg_fields_global_inheritance'=> (int) $meta->mec_reg_fields_global_inheritance, + 'mec_reg_fields'=>$reg_fields, + 'mec_advanced_days'=>$advanced_days, + 'mec_fields'=>$event_fields, + ) + ); + + $post_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$feed_event_id' AND `meta_key`='mec_feed_event_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $main->save_event($args, $post_id); + + // Add it to the imported posts + $posts[] = $post_id; + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set tags to the post + if(count($tag_ids)) foreach($tag_ids as $tag_id) wp_set_object_terms($post_id, (int) $tag_id, apply_filters('mec_taxonomy_tag', ''), true); + + // Set labels to the post + if(count($label_ids)) foreach($label_ids as $label_id) wp_set_object_terms($post_id, (int) $label_id, 'mec_label', true); + + // Set speakers to the post + if(count($speaker_ids)) foreach($speaker_ids as $speaker_id) wp_set_object_terms($post_id, (int) $speaker_id, 'mec_speaker', true); + + // Set sponsors to the post + if(count($sponsor_ids)) foreach($sponsor_ids as $sponsor_id) wp_set_object_terms($post_id, (int) $sponsor_id, 'mec_sponsor', true); + + // Featured Image + $featured_image = isset($event->featured_image) ? (string) $event->featured_image->full : ''; + if(!has_post_thumbnail($post_id) and trim($featured_image)) + { + $file_name = basename($featured_image); + + $path = rtrim($wp_upload_dir['path'], DS.' ').DS.$file_name; + $url = rtrim($wp_upload_dir['url'], '/ ').'/'.$file_name; + + // Download Image + $buffer = $main->get_web_page($featured_image); + + $file->write($path, $buffer); + $main->set_featured_image($url, $post_id); + } + } + } + elseif(strtolower($extension) == 'ics') + { + $parsed = $main->parse_ics($feed); + + // ics file not valid + if(is_string($parsed)) return $posts; + + $calendar_timezone = $parsed->calendarTimeZone(); + + // Timezone + $timezone = $main->get_timezone(); + + $events = $parsed->events(); + foreach($events as $event) + { + $feed_event_id = $event->uid; + + // Event location + $location = $event->location; + $location_id = $location && trim($location) ? $main->save_location(array + ( + 'name'=>trim((string) $location), + )) : 1; + + // Event Organizer + $organizer = $event->organizer_array ?? []; + $organizer_id = (isset($organizer[0]) and isset($organizer[0]['CN'])) ? $main->save_organizer(array + ( + 'name'=>trim((string) $organizer[0]['CN']), + 'email'=>(string) str_replace('MAILTO:', '', $organizer[1]), + )) : 1; + + // Event Categories + $category_ids = []; + if(isset($event->categories) and trim($event->categories)) + { + $cats = explode(',', $event->categories); + foreach($cats as $category) + { + $category_id = $main->save_category(array + ( + 'name'=>trim((string) $category), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Timezone + $event_timezone = $timezone; + + $ics_timezone = NULL; + if(isset($event->dtstart_array) and isset($event->dtstart_array[0]) and isset($event->dtstart_array[0]['TZID'])) $ics_timezone = $event->dtstart_array[0]['TZID']; + + $allday_event = ((isset($event->dtstart_array, $event->dtstart_array[0], $event->dtstart_array[0]['VALUE']) and $event->dtstart_array[0]['VALUE'] === 'DATE') and (isset($event->dtend_array, $event->dtend_array[0], $event->dtend_array[0]['VALUE']) and $event->dtend_array[0]['VALUE'] === 'DATE')); + $start_datetime = $event->dtstart; + + $not_in_days = NULL; + + // ICS file has Timezone for event + if($ics_timezone) + { + $date_start = new DateTime($start_datetime, new DateTimeZone($ics_timezone)); + $event_timezone = $ics_timezone; + + $date_end = NULL; + + $end_timestamp = isset($event->dtend) ? strtotime($event->dtend) : 0; + if($end_timestamp) + { + $end_datetime = $event->dtend; + + $date_end = new DateTime($end_datetime, new DateTimeZone($ics_timezone)); + } + + // Excluded Dates + if(isset($event->exdate) and trim($event->exdate)) + { + $ex_dates = explode(',', $event->exdate); + + $not_in_days = ''; + foreach($ex_dates as $ex_date) + { + $exd = new DateTime($ex_date, new DateTimeZone('UTC')); + $exd->setTimezone(new DateTimeZone($ics_timezone)); + + $not_in_days .= $exd->format('Y-m-d').','; + } + + $not_in_days = trim($not_in_days, ', '); + } + } + // Consider UTC as default timezone + else + { + $cal_tz = 'UTC'; + if(trim($calendar_timezone)) $cal_tz = $calendar_timezone; + + if(isset($event->dtstart_tz) and !$allday_event) $start_datetime = $event->dtstart_tz; + + $date_start = new DateTime($start_datetime, new DateTimeZone($cal_tz)); + $date_start->setTimezone(new DateTimeZone($event_timezone)); + + $date_end = NULL; + + $end_timestamp = isset($event->dtend) ? strtotime($event->dtend) : 0; + if($end_timestamp) + { + $end_datetime = $event->dtend; + if(isset($event->dtend_tz) and !$allday_event) $end_datetime = $event->dtend_tz; + + $date_end = new DateTime($end_datetime, new DateTimeZone($cal_tz)); + $date_end->setTimezone(new DateTimeZone($event_timezone)); + } + + // Excluded Dates + if(isset($event->exdate) and trim($event->exdate)) + { + $ex_dates = explode(',', $event->exdate); + + $not_in_days = ''; + foreach($ex_dates as $ex_date) + { + $exd = new DateTime($ex_date, new DateTimeZone($cal_tz)); + $exd->setTimezone(new DateTimeZone($event_timezone)); + + $not_in_days .= $exd->format('Y-m-d').','; + } + + $not_in_days = trim($not_in_days, ', '); + } + } + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + $end_date = $end_timestamp ? $date_end->format('Y-m-d') : $start_date; + $end_hour = $end_timestamp ? $date_end->format('g') : 8; + $end_minutes = $end_timestamp ? $date_end->format('i') : '00'; + $end_ampm = $end_timestamp ? $date_end->format('A') : 'PM'; + + // Time Options + $allday = 0; + $time_comment = ''; + $hide_time = 0; + $hide_end_time = 0; + + if($start_hour === '12' and $start_minutes === '00' and $start_ampm === 'AM' and $end_hour === '12' and $end_minutes === '00' and $end_ampm === 'AM') + { + $allday = 1; + + $start_hour = 0; + $start_minutes = 0; + $start_ampm = 'AM'; + + $end_hour = 11; + $end_minutes = 55; + $end_ampm = 'PM'; + + $diff = $this->main->date_diff($start_date, $end_date); + if(($diff ? $diff->days : 0) > 1) + { + $date_end->sub(new DateInterval('P1D')); + $end_date = $date_end->format('Y-m-d'); + } + } + + // Repeat Options + $repeat_status = 0; + $repeat_type = ''; + $repeat_interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $repeat_count = NULL; + $advanced_days = NULL; + + // Recurring Event + $rrule = (isset($event->rrule) and trim($event->rrule)) ? $event->rrule : ''; + if(trim($rrule) != '') + { + $ex1 = explode(';', $rrule); + + $rule = []; + foreach($ex1 as $r) + { + $ex2 = explode('=', $r); + $rrule_key = strtolower($ex2[0]); + $rrule_value = ($rrule_key == 'until' ? $ex2[1] : strtolower($ex2[1])); + $rule[$rrule_key] = $rrule_value; + } + + if(isset($rule['count']) and is_numeric($rule['count'])) $repeat_count = max($rule['count'], 0); + + $repeat_status = 1; + if($rule['freq'] == 'daily') + { + $repeat_type = 'daily'; + $repeat_interval = $rule['interval'] ?? 1; + } + elseif($rule['freq'] == 'weekly') + { + $repeat_type = 'weekly'; + $repeat_interval = isset($rule['interval']) ? $rule['interval']*7 : 7; + } + elseif($rule['freq'] == 'monthly' and isset($rule['byday']) and trim($rule['byday'])) + { + $repeat_type = 'advanced'; + + $adv_week = (isset($rule['bysetpos']) and trim($rule['bysetpos']) != '') ? $rule['bysetpos'] : (int) substr($rule['byday'], 0, -2); + $adv_day = str_replace($adv_week, '', $rule['byday']); + + $mec_adv_day = 'Sat'; + if($adv_day == 'su') $mec_adv_day = 'Sun'; + elseif($adv_day == 'mo') $mec_adv_day = 'Mon'; + elseif($adv_day == 'tu') $mec_adv_day = 'Tue'; + elseif($adv_day == 'we') $mec_adv_day = 'Wed'; + elseif($adv_day == 'th') $mec_adv_day = 'Thu'; + elseif($adv_day == 'fr') $mec_adv_day = 'Fri'; + + if($adv_week < 0) $adv_week = 'l'; + $advanced_days = array($mec_adv_day.'.'.$adv_week); + } + elseif($rule['freq'] == 'monthly') + { + $repeat_type = 'monthly'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + $repeat_interval = $rule['interval'] ?? 1; + } + elseif($rule['freq'] == 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + + // Custom Week Days + if($repeat_type == 'weekly' and isset($rule['byday']) and count(explode(',', $rule['byday'])) > 1) + { + $g_week_days = explode(',', $rule['byday']); + $week_day_mapping = array('mo'=>1, 'tu'=>2, 'we'=>3, 'th'=>4, 'fr'=>5, 'sa'=>6, 'su'=>7); + + $weekdays = ''; + foreach($g_week_days as $g_week_day) $weekdays .= $week_day_mapping[$g_week_day].','; + + $weekdays = ','.trim($weekdays, ', ').','; + $repeat_interval = NULL; + + $repeat_type = 'certain_weekdays'; + } + + $finish = isset($rule['until']) ? date('Y-m-d', strtotime($rule['until'])) : NULL; + } + + $additional_organizer_ids = []; + $hourly_schedules = []; + $tickets = []; + $fees = []; + $reg_fields = []; + + $args = array + ( + 'title' => (string) $event->summary, + 'content' => (string) $event->description, + 'location_id' => $location_id, + 'organizer_id' => $organizer_id, + 'date' => array + ( + 'start' => array( + 'date' => $start_date, + 'hour' => $start_hour, + 'minutes' => $start_minutes, + 'ampm' => $start_ampm, + ), + 'end' => array( + 'date' => $end_date, + 'hour' => $end_hour, + 'minutes' => $end_minutes, + 'ampm' => $end_ampm, + ), + 'repeat' => array(), + 'allday' => $allday, + 'comment' => $time_comment, + 'hide_time' => $hide_time, + 'hide_end_time' => $hide_end_time, + ), + 'start' => $start_date, + 'start_time_hour' => $start_hour, + 'start_time_minutes' => $start_minutes, + 'start_time_ampm' => $start_ampm, + 'end' => $end_date, + 'end_time_hour' => $end_hour, + 'end_time_minutes' => $end_minutes, + 'end_time_ampm' => $end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'repeat_count'=>$repeat_count, + 'interval'=>$repeat_interval, + 'finish'=>$finish, + 'year' => $year, + 'month' => $month, + 'day' => $day, + 'week' => $week, + 'weekday' => $weekday, + 'weekdays' => $weekdays, + 'days' => $days, + 'not_in_days' => $not_in_days, + 'meta' => array + ( + 'mec_source' => 'ics-calendar', + 'mec_feed_event_id' => $feed_event_id, + 'mec_dont_show_map' => 0, + 'mec_additional_organizer_ids' => $additional_organizer_ids, + 'mec_allday' => $allday, + 'mec_hide_time' => $hide_time, + 'mec_hide_end_time' => $hide_end_time, + 'mec_comment' => $time_comment, + 'mec_in_days'=> $days, + 'mec_not_in_days'=> $not_in_days, + 'mec_hourly_schedules' => $hourly_schedules, + 'mec_tickets' => $tickets, + 'mec_fees_global_inheritance' => 1, + 'mec_fees' => $fees, + 'mec_reg_fields_global_inheritance' => 1, + 'mec_reg_fields' => $reg_fields, + 'mec_timezone' => ($event_timezone === $timezone ? 'global' : $event_timezone), + 'mec_advanced_days'=>$advanced_days, + ) + ); + + $post_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$feed_event_id' AND `meta_key`='mec_feed_event_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $main->save_event($args, $post_id); + + // Add it to the imported posts + $posts[] = $post_id; + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Featured Image + $featured_image = isset($event->attach) ? (string) $event->attach : ''; + if(!has_post_thumbnail($post_id) and trim($featured_image)) + { + $file_name = basename($featured_image); + + $path = rtrim($wp_upload_dir['path'], DS.' ').DS.$file_name; + $url = rtrim($wp_upload_dir['url'], '/ ').'/'.$file_name; + + // Download Image + $buffer = $main->get_web_page($featured_image); + + $file->write($path, $buffer); + $main->set_featured_image($url, $post_id); + } + } + } + + return $posts; + } + + /** + * Show content of test data tab + * @author Webnus + * @return void + */ + public function ix_test_data() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = (isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : []; + + $this->response = []; + if($this->action == 'test-data-generation-start') $this->response = $this->generate_test_data(); + + $path = MEC::import('app.features.ix.test_data', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function generate_test_data() + { + $number = isset($_POST['number']) ? sanitize_text_field($_POST['number']) : 10; + $category_method = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : ''; + $tag_method = isset($_POST['tag']) ? sanitize_text_field($_POST['tag']) : ''; + $organizer_method = isset($_POST['organizer']) ? sanitize_text_field($_POST['organizer']) : ''; + $location_method = isset($_POST['location']) ? sanitize_text_field($_POST['location']) : ''; + + $category_id = $tag_id = $organizer_id = $location_id = null; + $tag_taxonomy = apply_filters('mec_taxonomy_tag', ''); + + if($category_method && $category_method === 'random') $category_id = $this->select_random_term('mec_category'); + else if($category_method && $category_method === 'generate') $category_id = $this->generate_random_term('mec_category'); + else if($category_method) $category_id = (int) $category_method; + + if($tag_method && $tag_method === 'random') $tag_id = $this->select_random_term($tag_taxonomy); + else if($tag_method && $tag_method === 'generate') $tag_id = $this->generate_random_term($tag_taxonomy); + else if($tag_method) $tag_id = (int) $tag_method; + + if($organizer_method && $organizer_method === 'random') $organizer_id = $this->select_random_term('mec_organizer'); + else if($organizer_method && $organizer_method === 'generate') $organizer_id = $this->generate_random_term('mec_organizer'); + else if($organizer_method) $organizer_id = (int) $organizer_method; + + if($location_method && $location_method === 'random') $location_id = $this->select_random_term('mec_location'); + else if($location_method && $location_method === 'generate') $location_id = $this->generate_random_term('mec_location'); + else if($location_method) $location_id = (int) $location_method; + + // Generate Events + for($i = 1; $i <= $number; $i++) + { + $chars = str_shuffle('abcdefghijklmnopqrstuvwxyz'); + $name = ucfirst(substr($chars, 0, rand(6, 10))); + + $start_date = date('Y-m-d', strtotime('+'.rand(2, 30).' days')); + $start_hour = 8; + $start_minutes = 0; + $start_ampm = 'AM'; + + $end_date = date('Y-m-d', strtotime('+'.rand(0, 3).' days', strtotime($start_date))); + $end_hour = 6; + $end_minutes = 0; + $end_ampm = 'PM'; + + $event_id = $this->main->save_event([ + 'title' => sprintf(esc_html__('%s - Test Event', 'modern-events-calendar-lite'), $name), + 'location_id' => $location_id, + 'organizer_id' => $organizer_id, + 'date' => [ + 'start' => [ + 'date' => $start_date, + 'hour' => $start_hour, + 'minutes' => $start_minutes, + 'ampm' => $start_ampm, + ], + 'end' => [ + 'date' => $end_date, + 'hour' => $end_hour, + 'minutes' => $end_minutes, + 'ampm' => $end_ampm, + ], + 'repeat' => [], + 'allday' => 0, + 'comment' => '', + 'hide_time' => 0, + 'hide_end_time' => 0, + ], + 'start' => $start_date, + 'start_time_hour' => $start_hour, + 'start_time_minutes' => $start_minutes, + 'start_time_ampm' => $start_ampm, + 'end' => $end_date, + 'end_time_hour' => $end_hour, + 'end_time_minutes' => $end_minutes, + 'end_time_ampm' => $end_ampm, + 'repeat_status' => 0, + 'repeat_type' => '', + 'interval' => null, + 'finish' => $end_date, + 'year' => null, + 'month' => null, + 'day' => null, + 'week' => null, + 'weekday' => null, + 'weekdays' => null, + 'meta' => [ + 'mec_source' => 'mec-random', + 'mec_allday' => 0, + 'mec_advanced_days' => null, + ] + ]); + + // Set terms + if($location_id) wp_set_object_terms($event_id, (int) $location_id, 'mec_location'); + if($organizer_id) wp_set_object_terms($event_id, (int) $organizer_id, 'mec_organizer'); + if($category_id) wp_set_object_terms($event_id, (int) $category_id, 'mec_category'); + if($tag_id) wp_set_object_terms($event_id, (int) $tag_id, $tag_taxonomy); + + if($category_method && $category_method === 'random') $category_id = $this->select_random_term('mec_category'); + if($tag_method && $tag_method === 'random') $tag_id = $this->select_random_term($tag_taxonomy); + if($organizer_method && $organizer_method === 'random') $organizer_id = $this->select_random_term('mec_organizer'); + if($location_method && $location_method === 'random') $location_id = $this->select_random_term('mec_location'); + } + + return ['success' => 1, 'message' => sprintf(esc_html__("%s events successfully created.", 'modern-events-calendar-lite'), ''.$number.'')]; + } + + private function select_random_term($taxonomy) + { + $terms = get_terms([ + 'taxonomy' => $taxonomy, + 'hide_empty' => 0, + ]); + if(count($terms) === 0) return 0; + + shuffle($terms); + return array_slice($terms, 0, 1)[0]->term_id; + } + + private function generate_random_term($taxonomy) + { + $chars = str_shuffle('abcdefghijklmnopqrstuvwxyz'); + $name = ucfirst(substr($chars, 0, rand(5, 8))); + + return wp_insert_term($name, $taxonomy)['term_id']; + } + + /** + * Show content of third party tab + * @author Webnus + * @return void + */ + public function ix_thirdparty() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $this->response = []; + if($this->action == 'thirdparty-import-start') $this->response = $this->thirdparty_import_start(); + + $path = MEC::import('app.features.ix.thirdparty', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function thirdparty_import_start() + { + $third_party = $this->ix['third-party'] ?? NULL; + + if($third_party == 'eventon' and class_exists('EventON')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'ajde_events', + )); + } + elseif($third_party == 'the-events-calendar' and class_exists('Tribe__Events__Main')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'tribe_events', + )); + } + elseif($third_party == 'weekly-class' and class_exists('WeeklyClass')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'class', + )); + } + elseif($third_party == 'calendarize-it' and class_exists('plugin_righthere_calendar')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'events', + )); + } + elseif($third_party == 'event-espresso' and function_exists('bootstrap_espresso')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'espresso_events', + )); + } + elseif($third_party == 'events-manager-recurring' and class_exists('EM_Formats')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'event-recurring', + )); + } + elseif($third_party == 'events-manager-single' and class_exists('EM_Formats')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'event', + 'meta_key' => '_recurrence_id', + 'meta_compare' => 'NOT EXISTS' + )); + } + elseif($third_party == 'wp-event-manager' and class_exists('WP_Event_Manager')) + { + $events = get_posts(array( + 'posts_per_page' => -1, + 'post_type' => 'event_listing', + )); + } + else return array('success'=>0, 'message'=>__("Third Party plugin is not installed and activated!", 'modern-events-calendar-lite')); + + return array( + 'success' => 1, + 'data' => array( + 'count' => count($events), + 'events' => $events + ) + ); + } + + public function thirdparty_import_do() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_ix_thirdparty_import')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $step = (isset($_POST['step']) and is_numeric($_POST['step']) and $_POST['step'] > 0) ? (int) $_POST['step'] : 1; + $count = 20; + $offset = max(($step - 1), 0) * $count; + + $all_events = ((isset($_POST['tp-events']) and is_array($_POST['tp-events'])) ? array_map('sanitize_text_field', $_POST['tp-events']) : array()); + $events = array_slice($all_events, $offset, $count); + + $third_party = $this->ix['third-party'] ?? ''; + + $response = array('success'=>0, 'message'=>__('Third Party plugin is invalid!', 'modern-events-calendar-lite')); + if($third_party == 'eventon') $response = $this->thirdparty_eventon_import_do($events); + elseif($third_party == 'the-events-calendar') $response = $this->thirdparty_tec_import_do($events); + elseif($third_party == 'weekly-class') $response = $this->thirdparty_weekly_class_import_do($events); + elseif($third_party == 'calendarize-it') $response = $this->thirdparty_calendarize_it_import_do($events); + elseif($third_party == 'event-espresso') $response = $this->thirdparty_es_import_do($events); + elseif($third_party == 'events-manager-recurring') $response = $this->thirdparty_emr_import_do($events); + elseif($third_party == 'events-manager-single') $response = $this->thirdparty_ems_import_do($events); + elseif($third_party == 'wp-event-manager') $response = $this->thirdparty_wpem_import_do($events); + + $response['next_step'] = $step + 1; + $response['finished'] = (int) ($step * $count >= count($all_events)); + $response['all'] = (int) count($all_events); + $response['imported'] = (int) min(($step * $count), count($all_events)); + + $this->main->response($response); + } + + public function thirdparty_eventon_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $locations = wp_get_post_terms($ID, 'event_location'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($locations[0])) + { + $l_metas = evo_get_term_meta('event_location', $locations[0]->term_id); + $location_id = $this->main->save_location(array + ( + 'name'=>trim($locations[0]->name), + 'address'=>($l_metas['location_address'] ?? ''), + 'latitude'=>($l_metas['location_lat'] ?? 0), + 'longitude'=>($l_metas['location_lon'] ?? 0), + )); + } + + // Event Organizer + $organizers = wp_get_post_terms($ID, 'event_organizer'); + $organizer_id = 1; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers'] and isset($organizers[0])) + { + $o_metas = evo_get_term_meta('event_organizer', $organizers[0]->term_id); + $organizer_id = $this->main->save_organizer(array + ( + 'name'=>trim($organizers[0]->name), + 'tel'=>($o_metas['evcal_org_contact'] ?? ''), + 'url'=>($o_metas['evcal_org_exlink'] ?? ''), + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'event_type'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', $metas['evcal_srow'])); + if(isset($metas['evo_event_timezone']) and trim($metas['evo_event_timezone'])) $date_start->setTimezone(new DateTimeZone($metas['evo_event_timezone'])); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', $metas['evcal_erow'])); + if(isset($metas['evo_event_timezone']) and trim($metas['evo_event_timezone'])) $date_end->setTimezone(new DateTimeZone($metas['evo_event_timezone'])); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = (isset($metas['evo_hide_endtime']) and $metas['evo_hide_endtime'] == 'yes') ? 1 : 0; + $allday = (isset($metas['evcal_allday']) and trim($metas['evcal_allday']) == 'yes') ? $metas['evcal_allday'] : 0; + + // Recurring Event + if(isset($metas['evcal_repeat']) and $metas['evcal_repeat'] == 'yes') + { + $repeat_status = 1; + $interval = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $finish = NULL; + + $occurrences = (isset($metas['repeat_intervals']) and is_array($metas['repeat_intervals'])) ? $metas['repeat_intervals'] : []; + if(count($occurrences)) + { + $t = $occurrences[(count($occurrences) -1)][1]; + $finish = date('Y-m-d', $t); + } + + $freq = (isset($metas['evcal_rep_freq']) and trim($metas['evcal_rep_freq'])) ? $metas['evcal_rep_freq'] : 'daily'; + + if($freq == 'daily') + { + $repeat_type = 'daily'; + $interval = $metas['evcal_rep_gap'] ?? 1; + } + elseif($freq == 'weekly') + { + $repeat_type = 'weekly'; + $interval = isset($metas['evcal_rep_gap']) ? $metas['evcal_rep_gap']*7 : 7; + } + elseif($freq == 'monthly') + { + $repeat_type = 'monthly'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif($freq == 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif($freq == 'custom') + { + $repeat_type = 'custom_days'; + $occurrences = (isset($metas['repeat_intervals']) and is_array($metas['repeat_intervals'])) ? $metas['repeat_intervals'] : []; + + $days = ''; + $x = 1; + foreach($occurrences as $occurrence) + { + if($x == 1) + { + $finish = date('Y-m-d', $occurrence[0]); + + $x++; + continue; + } + + $days .= date('Y-m-d', $occurrence[0]).','; + $x++; + } + + $days = trim($days, ', '); + } + else $repeat_type = ''; + + // Custom Week Days + if($repeat_type == 'weekly' and isset($metas['evo_rep_WKwk']) and is_array($metas['evo_rep_WKwk']) and count($metas['evo_rep_WKwk']) > 1) + { + $week_day_mapping = array('d1'=>1, 'd2'=>2, 'd3'=>3, 'd4'=>4, 'd5'=>5, 'd6'=>6, 'd0'=>7); + + $weekdays = ''; + foreach($metas['evo_rep_WKwk'] as $week_day) $weekdays .= $week_day_mapping['d'.$week_day].','; + + $weekdays = ','.trim($weekdays, ', ').','; + $interval = NULL; + + $repeat_type = 'certain_weekdays'; + } + } + // Single Event + else + { + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + } + + // Hourly Schedule + $hourly_schedules = []; + if(isset($metas['_sch_blocks']) and is_array($metas['_sch_blocks']) and count($metas['_sch_blocks'])) + { + foreach($metas['_sch_blocks'] as $sch_block) + { + foreach($sch_block as $sch) + { + if(!is_array($sch)) continue; + $hourly_schedules[] = array( + 'from' => $sch['evo_sch_stime'], + 'to' => $sch['evo_sch_etime'], + 'title' => $sch['evo_sch_title'], + 'description' => $sch['evo_sch_desc'], + ); + } + } + } + + // Read More Link + $more_info_link = isset($metas['evcal_lmlink']) && trim($metas['evcal_lmlink']) ? $metas['evcal_lmlink'] : ''; + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>[ + 'mec_source'=>'eventon', + 'mec_eventon_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>'date', + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + 'mec_hourly_schedules'=>$hourly_schedules, + 'mec_more_info'=>$more_info_link, + ] + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_eventon_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + /** + * @throws Exception + */ + public function thirdparty_tec_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event Author + $author = NULL; + if(isset($this->ix['import_author']) and $this->ix['import_author'] and $post->post_author) + { + $author = $post->post_author; + } + + // Event location + $location = get_post($metas['_EventVenueID']); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($location->ID)) + { + $l_metas = $this->main->get_post_meta($location->ID); + $location_id = $this->main->save_location(array + ( + 'name' => trim($location->post_title), + 'address' => $l_metas['_VenueAddress'] ?? '', + 'latitude' => 0, + 'longitude' => 0, + )); + } + + // Event Organizer + $organizer = get_post($metas['_EventOrganizerID']); + $organizer_id = 1; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers'] and isset($organizer->ID)) + { + $o_metas = $this->main->get_post_meta($organizer->ID); + $organizer_id = $this->main->save_organizer(array + ( + 'name' => trim($organizer->post_title), + 'tel' => $o_metas['_OrganizerPhone'] ?? '', + 'email' => $o_metas['_OrganizerEmail'] ?? '', + 'url' => $o_metas['_OrganizerWebsite'] ?? '', + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'tribe_events_cat'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($metas['_EventStartDate']))); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', strtotime($metas['_EventEndDate']))); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = (isset($metas['_EventAllDay']) and trim($metas['_EventAllDay']) == 'yes') ? 1 : 0; + + // Recurring Event + if( + isset($metas['_EventRecurrence']['rules']) && is_array($metas['_EventRecurrence']) && count($metas['_EventRecurrence']) && + is_array($metas['_EventRecurrence']['rules']) && count($metas['_EventRecurrence']['rules']) + ) + { + $repeat_status = 1; + $repeat_type = ''; + $finish = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $advanced_days = NULL; + + $rule = $metas['_EventRecurrence']['rules'][0]; + + $end_type = 'never'; + $finish_type = isset($rule['end-type']) ? strtolower($rule['end-type']) : 'never'; + + if($finish_type === 'on' and isset($rule['end']) and trim($rule['end'])) + { + $end_type = 'date'; + $finish = $rule['end']; + } + elseif($finish_type === 'after' and isset($rule['end-count']) and trim($rule['end-count'])) + { + $end_type = 'occurrences'; + $end_occurrence = (int) $rule['end-count']; + } + + $interval = (int) $rule['custom']['interval']; + + $type = strtolower($rule['custom']['type']); + if($type === 'daily') + { + $repeat_type = 'daily'; + } + else if($type === 'weekly') + { + $repeat_type = 'certain_weekdays'; + + if(count($rule['custom']['week']['day']) === 1) + { + $repeat_type = 'weekly'; + $interval = $interval * 7; + } + else + { + $weekdays = ','.trim(implode(',', $rule['custom']['week']['day']), ', ').','; + $interval = NULL; + } + } + else if($type === 'monthly') + { + if(isset($rule['custom']['month']['same-day']) && $rule['custom']['month']['same-day'] === 'no') + { + $repeat_type = 'advanced'; + + $week_no = $rule['custom']['month']['number']; + if($week_no == 'Last' || $week_no == '5') $week_no = 'l'; + + $week_day = $rule['custom']['month']['day']; + + if($week_day == '0') $week_day = 'Sun'; + elseif($week_day == '1') $week_day = 'Mon'; + elseif($week_day == '2') $week_day = 'Tue'; + elseif($week_day == '3') $week_day = 'Wed'; + elseif($week_day == '4') $week_day = 'Thu'; + elseif($week_day == '5') $week_day = 'Fri'; + else $week_day = 'Sat'; + + $advanced_days = [$week_day.'.'.$week_no]; + } + else + { + $repeat_type = 'monthly'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ',' . implode(',', array_unique($_days)) . ','; + + $week = '*'; + $weekday = '*'; + } + } + else if($type === 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $_months = array_unique($_months); + + $month = ',' . implode(',', array($_months[0])) . ','; + $day = ',' . implode(',', array_unique($_days)) . ','; + + $week = '*'; + $weekday = '*'; + } + } + else + { + // Single Event + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + + $end_type = 'date'; + $end_occurrence = 10; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'author'=>$author, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>$end_type, + 'end_at_date'=>$finish, + 'end_at_occurrences'=>$end_occurrence, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'the-events-calendar', + 'mec_tec_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>$end_type, + 'mec_repeat_end_at_occurrences'=>$end_occurrence - 1, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + 'mec_more_info'=>$metas['_EventURL'], + 'mec_cost'=>trim($metas['_EventCurrencySymbol'].$metas['_EventCost']), + 'mec_advanced_days'=>$advanced_days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_tec_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_weekly_class_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $locations = wp_get_post_terms($ID, 'wcs-room'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($locations[0])) + { + $location_id = $this->main->save_location(array + ( + 'name'=>trim($locations[0]->name), + 'address'=>'', + 'latitude'=>'', + 'longitude'=>'', + )); + } + + // Event Organizer + $organizers = wp_get_post_terms($ID, 'wcs-instructor'); + $organizer_id = 1; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers'] and isset($organizers[0])) + { + $organizer_id = $this->main->save_organizer(array + ( + 'name'=>trim($organizers[0]->name), + 'tel'=>'', + 'url'=>'', + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'wcs-type'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', $metas['_wcs_timestamp'])); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', ($metas['_wcs_timestamp']+($metas['_wcs_duration']*60)))); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = 0; + + // Recurring Event + if(isset($metas['_wcs_interval']) and $metas['_wcs_interval']) + { + $repeat_status = 1; + $interval = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $finish = (isset($metas['_wcs_repeat_until']) and trim($metas['_wcs_repeat_until'])) ? date('Y-m-d', strtotime($metas['_wcs_repeat_until'])) : NULL; + + $freq = trim($metas['_wcs_interval']) ? $metas['_wcs_interval'] : 2; + + if($freq == 2) // Daily + { + $repeat_type = 'daily'; + $interval = 1; + } + elseif($freq == 1 or $freq == 3) // Weekly or Every Two Weeks + { + $repeat_type = 'weekly'; + $interval = $freq == 3 ? 14 : 7; + } + elseif($freq == 4) // Monthly + { + $repeat_type = 'monthly'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif($freq == 5) // Yearly + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + else $repeat_type = ''; + + // Custom Week Days + if($repeat_type == 'daily' and isset($metas['_wcs_repeat_days']) and is_array($metas['_wcs_repeat_days']) and count($metas['_wcs_repeat_days']) > 1 and count($metas['_wcs_repeat_days']) < 7) + { + $week_day_mapping = array('d1'=>1, 'd2'=>2, 'd3'=>3, 'd4'=>4, 'd5'=>5, 'd6'=>6, 'd0'=>7); + + $weekdays = ''; + foreach($metas['_wcs_repeat_days'] as $week_day) $weekdays .= $week_day_mapping['d'.$week_day].','; + + $weekdays = ','.trim($weekdays, ', ').','; + $interval = NULL; + + $repeat_type = 'certain_weekdays'; + } + } + // Single Event + else + { + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'weekly_class', + 'mec_weekly_class_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>($finish ? 'date' : 'never'), + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_weekly_class_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_calendarize_it_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $locations = wp_get_post_terms($ID, 'venue'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($locations[0])) + { + $location_id = $this->main->save_location(array + ( + 'name'=>trim($locations[0]->name), + 'address'=>trim(get_term_meta($locations[0]->term_id, 'address', true)), + 'latitude'=>trim(get_term_meta($locations[0]->term_id, 'glat', true)), + 'longitude'=>trim(get_term_meta($locations[0]->term_id, 'glon', true)), + )); + } + + // Event Organizer + $organizers = wp_get_post_terms($ID, 'organizer'); + $organizer_id = 1; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers'] and isset($organizers[0])) + { + $organizer_id = $this->main->save_organizer(array + ( + 'name'=>trim($organizers[0]->name), + 'tel'=>trim(get_term_meta($organizers[0]->term_id, 'phone', true)), + 'email'=>trim(get_term_meta($organizers[0]->term_id, 'email', true)), + 'url'=>trim(get_term_meta($organizers[0]->term_id, 'website', true)), + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'calendar'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($metas['fc_start_datetime']))); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', strtotime($metas['fc_end_datetime']))); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = $metas['fc_allday'] ?? 0; + + // Recurring Event + if(isset($metas['fc_rrule']) and trim($metas['fc_rrule'])) + { + $rules = explode(';', trim($metas['fc_rrule'], '; ')); + + $rule = []; + foreach($rules as $rule_row) + { + $ex = explode('=', $rule_row); + $key = strtolower($ex[0]); + $value = $key == 'until' ? $ex[1] : strtolower($ex[1]); + + $rule[$key] = $value; + } + + $repeat_status = 1; + $interval = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $finish = isset($rule['until']) ? date('Y-m-d', strtotime($rule['until'])) : NULL; + + if($rule['freq'] == 'daily') + { + $repeat_type = 'daily'; + $interval = $rule['interval'] ?? 1; + + if(isset($rule['count'])) $finish = date('Y-m-d', strtotime('+'.$rule['count'].' days', strtotime($start_date))); + } + elseif($rule['freq'] == 'weekly') + { + $repeat_type = 'weekly'; + $interval = isset($rule['interval']) ? $rule['interval']*7 : 7; + + if(isset($rule['count'])) $finish = date('Y-m-d', strtotime('+'.$rule['count'].' weeks', strtotime($start_date))); + } + elseif($rule['freq'] == 'monthly') + { + $repeat_type = 'monthly'; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + + if(isset($rule['count'])) $finish = date('Y-m-d', strtotime('+'.$rule['count'].' months', strtotime($start_date))); + } + elseif($rule['freq'] == 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + + if(isset($rule['count'])) $finish = date('Y-m-d', strtotime('+'.$rule['count'].' years', strtotime($start_date))); + } + } + // Custom Days + elseif(isset($metas['fc_rdate']) and trim($metas['fc_rdate'])) + { + $fc_rdates = explode(',', $metas['fc_rdate']); + $str_days = ''; + foreach($fc_rdates as $fc_rdate) $str_days .= date('Y-m-d', strtotime($fc_rdate)).','; + + $repeat_status = 1; + $repeat_type = 'custom_days'; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = trim($str_days, ', '); + } + // Single Event + else + { + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'calendarize_it', + 'mec_calendarize_it_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>($finish ? 'date' : 'never'), + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_calendarize_it_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_es_import_do($IDs) + { + // Timezone + $timezone = $this->main->get_timezone(); + + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $venue_id = $this->db->select("SELECT `VNU_ID` FROM `#__esp_event_venue` WHERE `EVT_ID`='".$ID."' ORDER BY `EVV_ID` ASC LIMIT 1", 'loadResult'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and $venue_id) + { + $v_meta = $this->db->select("SELECT * FROM `#__esp_venue_meta` WHERE `VNU_ID`='".$venue_id."'", 'loadAssoc'); + $location_id = $this->main->save_location(array + ( + 'name'=>get_the_title($venue_id), + 'address'=>trim($v_meta['VNU_address'].' '.$v_meta['VNU_address2']), + 'latitude'=>'', + 'longitude'=>'', + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'espresso_event_categories'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + $datetimes = $venue_id = $this->db->select("SELECT * FROM `#__esp_datetime` WHERE `EVT_ID`='".$ID."' ORDER BY `DTT_EVT_start` ASC", 'loadAssocList'); + + $dt_start = NULL; + $dt_end = NULL; + $custom_days = []; + + $i = 1; + foreach($datetimes as $datetime) + { + if(!$dt_start) $dt_start = $datetime['DTT_EVT_start']; + if(!$dt_end) $dt_end = $datetime['DTT_EVT_end']; + + // Add to Custom Days + if($i > 1) $custom_days[] = array(date('Y-m-d', strtotime($datetime['DTT_EVT_start'])), date('Y-m-d', strtotime($datetime['DTT_EVT_end']))); + + $i++; + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($dt_start)), new DateTimeZone('UTC')); + $date_start->setTimezone(new DateTimeZone($timezone)); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', strtotime($dt_end)), new DateTimeZone('UTC')); + $date_end->setTimezone(new DateTimeZone($timezone)); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = 0; + + // Custom Days + if(count($custom_days)) + { + $str_days = ''; + foreach($custom_days as $custom_day) $str_days .= date('Y-m-d', strtotime($custom_day[0])).':'.date('Y-m-d', strtotime($custom_day[1])).','; + + $repeat_status = 1; + $repeat_type = 'custom_days'; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = trim($str_days, ', '); + } + // Single Event + else + { + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>1, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'eventespresso', + 'mec_eventespresso_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>($finish ? 'date' : 'never'), + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_eventespresso_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_emr_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $location = $this->db->select("SELECT * FROM `#__em_locations` WHERE `location_id`='".(isset($metas['_location_id']) ? $metas['_location_id'] : 0)."'", 'loadAssoc'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($location['post_id'])) + { + $address = $location['location_address'].' '.$location['location_region'].' '.$location['location_town'].' '.$location['location_state'].' '.$location['location_country']; + $location_id = $this->main->save_location(array + ( + 'name'=>trim($location['location_name']), + 'address'=>trim($address), + 'latitude'=>trim($location['location_latitude']), + 'longitude'=>trim($location['location_longitude']), + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'event-categories'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($metas['_event_start_local']))); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d', strtotime('+'.(isset($metas['_recurrence_days']) ? $metas['_recurrence_days'] : 0).' days', strtotime($metas['_event_start_local']))).' '.$metas['_event_end_time']); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = $metas['_event_all_day'] ?? 0; + + $repeat_status = 1; + $interval = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + $finish = date('Y-m-d', strtotime($metas['_event_end_local'])); + $repeat_type = ''; + $advanced_days = NULL; + + if($metas['_recurrence_freq'] == 'daily') + { + $repeat_type = 'daily'; + $interval = $metas['_recurrence_interval'] ?? 1; + } + elseif($metas['_recurrence_freq'] == 'weekly') + { + $repeat_type = 'certain_weekdays'; + $interval = 1; + $weekdays = ',' . str_replace('0', '7', $metas['_recurrence_byday']) . ','; + } + elseif($metas['_recurrence_freq'] == 'monthly') + { + $repeat_type = 'advanced'; + + $week_no = $metas['_recurrence_byweekno']; + if($week_no == '-1' || $week_no == '5') $week_no = 'l'; + + $week_day = $metas['_recurrence_byday']; + + if($week_day == '0') $week_day = 'Sun'; + elseif($week_day == '1') $week_day = 'Mon'; + elseif($week_day == '2') $week_day = 'Tue'; + elseif($week_day == '3') $week_day = 'Wed'; + elseif($week_day == '4') $week_day = 'Thu'; + elseif($week_day == '5') $week_day = 'Fri'; + else $week_day = 'Sat'; + + $advanced_days = array($week_day.'.'.$week_no); + } + elseif($metas['_recurrence_freq'] == 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>1, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'event_manager_recurring', + 'mec_emr_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>($finish ? 'date' : 'never'), + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + 'mec_advanced_days'=>$advanced_days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_emr_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_ems_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $location = $this->db->select("SELECT * FROM `#__em_locations` WHERE `location_id`='".(isset($metas['_location_id']) ? $metas['_location_id'] : 0)."'", 'loadAssoc'); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($location['post_id'])) + { + $address = $location['location_address'].' '.$location['location_region'].' '.$location['location_town'].' '.$location['location_state'].' '.$location['location_country']; + $location_id = $this->main->save_location(array + ( + 'name'=>trim($location['location_name']), + 'address'=>trim($address), + 'latitude'=>trim($location['location_latitude']), + 'longitude'=>trim($location['location_longitude']), + )); + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'event-categories'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($metas['_event_start_local']))); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', strtotime($metas['_event_end_local']))); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = $metas['_event_all_day'] ?? 0; + + // Single Event + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>1, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'event_manager_single', + 'mec_ems_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>($finish ? 'date' : 'never'), + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_ems_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + public function thirdparty_wpem_import_do($IDs) + { + $count = 0; + foreach($IDs as $ID) + { + $post = get_post($ID); + $metas = $this->main->get_post_meta($ID); + + // Event Title and Content + $title = $post->post_title; + $description = $post->post_content; + $third_party_id = $ID; + + // Event location + $location = get_post($metas['_event_venue_ids']); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and isset($location->ID)) + { + $l_metas = $this->main->get_post_meta($location->ID); + $thumbnail = has_post_thumbnail($location->ID) ? $this->main->get_post_thumbnail_url($location->ID, 'full') : ''; + + $location_id = $this->main->save_location(array + ( + 'name'=>trim($location->post_title), + 'address'=>(isset($l_metas['_venue_description']) ? $l_metas['_venue_description'] : ''), + 'latitude'=>0, + 'longitude'=>0, + 'thumbnail'=>$thumbnail + )); + } + + // Event Organizer + $organizers = $metas['_event_organizer_ids']; + $organizer = (isset($organizers[0]) ? get_post($organizers[0]) : new stdClass()); + + if(isset($organizers[0])) unset($organizers[0]); + $wpem_additional_organizers_ids = $organizers; + + $organizer_id = 1; + $additional_organizers_ids = []; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers'] and isset($organizer->ID)) + { + $o_metas = $this->main->get_post_meta($organizer->ID); + + $organizer_id = $this->main->save_organizer(array + ( + 'name'=>trim($organizer->post_title), + 'tel'=>'', + 'email'=>($o_metas['_organizer_email'] ?? ''), + 'url'=>($o_metas['_organizer_website'] ?? ''), + )); + + if(is_array($wpem_additional_organizers_ids) and count($wpem_additional_organizers_ids)) + { + foreach($wpem_additional_organizers_ids as $wpem_additional_organizers_id) + { + $o_organizer = get_post($wpem_additional_organizers_id); + $o_metas = $this->main->get_post_meta($wpem_additional_organizers_id); + + $additional_organizers_ids[] = $this->main->save_organizer(array + ( + 'name'=>trim($o_organizer->post_title), + 'tel'=>'', + 'email'=>($o_metas['_organizer_email'] ?? ''), + 'url'=>($o_metas['_organizer_website'] ?? ''), + )); + } + } + } + + // Event Categories + $categories = wp_get_post_terms($ID, 'event_listing_category'); + $category_ids = []; + + // Import Event Categories into MEC categories + if(isset($this->ix['import_categories']) and $this->ix['import_categories'] and count($categories)) + { + foreach($categories as $category) + { + $category_id = $this->main->save_category(array + ( + 'name'=>trim($category->name), + )); + + if($category_id) $category_ids[] = $category_id; + } + } + + // Event Start Date and Time + $date_start = new DateTime(date('Y-m-d G:i', strtotime($metas['_event_start_date']))); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $date_end = new DateTime(date('Y-m-d G:i', strtotime($metas['_event_end_date']))); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Event Time Options + $hide_end_time = 0; + $allday = 0; + + // Single Event + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $days = NULL; + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array( + 'end'=>'date', + 'end_at_date'=>$finish, + 'end_at_occurrences'=>10, + ), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>$hide_end_time, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'the-events-calendar', + 'mec_tec_id'=>$third_party_id, + 'mec_allday'=>$allday, + 'hide_end_time'=>$hide_end_time, + 'mec_repeat_end'=>'date', + 'mec_repeat_end_at_occurrences'=>9, + 'mec_repeat_end_at_date'=>$finish, + 'mec_in_days'=>$days, + 'mec_more_info'=>'', + 'mec_cost'=>'', + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$third_party_id' AND `meta_key`='mec_tec_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // Set additional organizers + if(is_array($additional_organizers_ids) and count($additional_organizers_ids)) + { + foreach($additional_organizers_ids as $additional_organizers_id) wp_set_object_terms($post_id, (int) $additional_organizers_id, 'mec_organizer', true); + update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizers_ids); + } + + // Set categories to the post + if(count($category_ids)) foreach($category_ids as $category_id) wp_set_object_terms($post_id, (int) $category_id, 'mec_category', true); + + // Set Features Image + if(isset($this->ix['import_featured_image']) and $this->ix['import_featured_image'] and $thumbnail_id = get_post_thumbnail_id($ID)) + { + set_post_thumbnail($post_id, $thumbnail_id); + } + + $count++; + } + + return array('success'=>1, 'data'=>$count); + } + + /** + * Show content of export tab + * @author Webnus + * @return void + */ + public function ix_g_calendar_export() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : (isset($_GET['mec-ix-action']) ? sanitize_text_field($_GET['mec-ix-action']) : ''); + + $path = MEC::import('app.features.ix.export_g_calendar', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of import tab + * @author Webnus + * @return void + */ + public function ix_g_calendar_import() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $this->response = []; + if($this->action == 'google-calendar-import-start') $this->response = $this->g_calendar_import_start(); + elseif($this->action == 'google-calendar-import-do') $this->response = $this->g_calendar_import_do(); + + $path = MEC::import('app.features.ix.import_g_calendar', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function g_calendar_import_start() + { + $api_key = $this->ix['google_import_api_key'] ?? NULL; + $calendar_id = $this->ix['google_import_calendar_id'] ?? NULL; + $start_date = $this->ix['google_import_start_date'] ?? 'Today'; + $end_date = (isset($this->ix['google_import_end_date']) and trim($this->ix['google_import_end_date'])) ? $this->ix['google_import_end_date'] : 'Tomorrow'; + + if(!trim($api_key) or !trim($calendar_id)) return array('success'=>0, 'error'=>__('API key and Calendar ID are required!', 'modern-events-calendar-lite')); + + // Save options + $this->main->save_ix_options(array('google_import_api_key'=>$api_key, 'google_import_calendar_id'=>$calendar_id, 'google_import_start_date'=>$start_date, 'google_import_end_date'=>$end_date)); + + // GMT Offset + $gmt_offset = $this->main->get_gmt_offset(); + + $client = new Google_Client(); + $client->setApplicationName('Modern Events Calendar'); + $client->setAccessType('online'); + $client->setScopes(array('https://www.googleapis.com/auth/calendar.readonly')); + $client->setDeveloperKey($api_key); + + $service = new Google_Service_Calendar($client); + $data = []; + + try + { + $args = []; + $args['timeMin'] = date('Y-m-d\TH:i:s', strtotime($start_date)).$gmt_offset; + $args['timeMax'] = date('Y-m-d\TH:i:s', strtotime($end_date)).$gmt_offset; + $args['maxResults'] = 50000; + + $response = $service->events->listEvents($calendar_id, $args); + + $data['id'] = $calendar_id; + $data['title'] = $response->getSummary(); + $data['timezone'] = $response->getTimeZone(); + $data['events'] = []; + + foreach($response->getItems() as $event) + { + $title = $event->getSummary(); + if(trim($title) == '') continue; + + $recurring_event_id = $event->getRecurringEventId(); + + // Update Date & Time + if(isset($data['events'][$recurring_event_id])) + { + $data['events'][$recurring_event_id]['start'] = $event->getStart(); + $data['events'][$recurring_event_id]['end'] = $event->getEnd(); + } + // Import Only Main Events + elseif(!$recurring_event_id) $data['events'][$event->id] = array('id'=>$event->id, 'title'=>$title, 'start'=>$event->getStart(), 'end'=>$event->getEnd()); + } + + $data['count'] = count($data['events']); + } + catch(Exception $e) + { + $error = $e->getMessage(); + return array('success'=>0, 'error'=>$error); + } + + return array('success'=>1, 'data'=>$data); + } + + public function g_calendar_import_do() + { + $g_events = ((isset($_POST['g-events']) and is_array($_POST['g-events'])) ? array_map('sanitize_text_field', $_POST['g-events']) : array()); + if(!count($g_events)) return array('success'=>0, 'error'=>__('Please select events to import!', 'modern-events-calendar-lite')); + + $api_key = $this->ix['google_import_api_key'] ?? NULL; + $calendar_id = $this->ix['google_import_calendar_id'] ?? NULL; + + if(!trim($api_key) or !trim($calendar_id)) return array('success'=>0, 'error'=>__('API key and Calendar ID are required!', 'modern-events-calendar-lite')); + + // Timezone + $timezone = $this->main->get_timezone(); + + $client = new Google_Client(); + $client->setApplicationName('Modern Events Calendar'); + $client->setAccessType('online'); + $client->setScopes(array('https://www.googleapis.com/auth/calendar.readonly')); + $client->setDeveloperKey($api_key); + + $service = new Google_Service_Calendar($client); + $post_ids = []; + + foreach($g_events as $g_event) + { + try + { + $event = $service->events->get($calendar_id, $g_event, array('timeZone' => $timezone)); + } + catch(Exception $e) + { + continue; + } + + // Event Title and Content + $title = $event->getSummary(); + $description = $event->getDescription(); + $gcal_ical_uid = $event->getICalUID(); + $gcal_id = $event->getId(); + + // Event location + $location = $event->getLocation(); + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and trim($location)) + { + $location_ex = explode(',', $location); + $location_id = $this->main->save_location(array + ( + 'name'=>trim($location_ex[0]), + 'address'=>$location + )); + } + + // Event Organizer + $organizer = $event->getOrganizer(); + $organizer_id = 1; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) and $this->ix['import_organizers']) + { + $organizer_id = $this->main->save_organizer(array + ( + 'name'=>$organizer->getDisplayName(), + 'email'=>$organizer->getEmail() + )); + } + + // Event Start Date and Time + $start = $event->getStart(); + + $g_start_date = $start->getDate(); + $g_start_datetime = $start->getDateTime(); + + $date_start = new DateTime((trim($g_start_datetime) ? $g_start_datetime : $g_start_date)); + $start_date = $date_start->format('Y-m-d'); + $start_hour = 8; + $start_minutes = '00'; + $start_ampm = 'AM'; + + if(trim($g_start_datetime)) + { + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + } + + // Event End Date and Time + $end = $event->getEnd(); + + $g_end_date = $end->getDate(); + $g_end_datetime = $end->getDateTime(); + + $date_end = new DateTime((trim($g_end_datetime) ? $g_end_datetime : $g_end_date)); + $end_date = $date_end->format('Y-m-d'); + $end_hour = 6; + $end_minutes = '00'; + $end_ampm = 'PM'; + + if(trim($g_end_datetime)) + { + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + } + + // Event Time Options + $allday = 0; + + // Both Start and Date times are empty, so it's all day event + if(!trim($g_end_datetime) and !trim($g_start_datetime)) + { + $allday = 1; + + $start_hour = 0; + $start_minutes = 0; + $start_ampm = 'AM'; + + $end_hour = 11; + $end_minutes = 55; + $end_ampm = 'PM'; + } + + // Recurring Event + if($event->getRecurrence()) + { + $repeat_status = 1; + $r_rules = $event->getRecurrence(); + + $i = 0; + + do + { + $g_recurrence_rule = $r_rules[$i]; + $main_rule_ex = explode(':', $g_recurrence_rule); + $rules = explode(';', $main_rule_ex[1]); + + $i++; + } + while($main_rule_ex[0] != 'RRULE' and isset($r_rules[$i])); + + $rule = []; + foreach($rules as $rule_row) + { + $ex = explode('=', $rule_row); + $key = strtolower($ex[0]); + $value = isset($ex[1]) ? ($key == 'until' ? $ex[1] : strtolower($ex[1])) : ''; + + $rule[$key] = $value; + } + + $interval = NULL; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $advanced_days = NULL; + + $repeat_count = NULL; + if(isset($rule['count']) and is_numeric($rule['count'])) $repeat_count = max($rule['count'], 0); + + if(isset($rule['freq']) && $rule['freq'] == 'daily') + { + $repeat_type = 'daily'; + $interval = $rule['interval'] ?? 1; + } + elseif(isset($rule['freq']) && $rule['freq'] == 'weekly') + { + $repeat_type = 'weekly'; + $interval = isset($rule['interval']) ? $rule['interval']*7 : 7; + } + elseif(isset($rule['freq']) && $rule['freq'] == 'monthly' and isset($rule['byday']) and trim($rule['byday'])) + { + $repeat_type = 'advanced'; + + $adv_week = (isset($rule['bysetpos']) and trim($rule['bysetpos']) != '') ? $rule['bysetpos'] : (int) substr($rule['byday'], 0, -2); + $adv_day = str_replace($adv_week, '', $rule['byday']); + + $mec_adv_day = 'Sat'; + if($adv_day == 'su') $mec_adv_day = 'Sun'; + elseif($adv_day == 'mo') $mec_adv_day = 'Mon'; + elseif($adv_day == 'tu') $mec_adv_day = 'Tue'; + elseif($adv_day == 'we') $mec_adv_day = 'Wed'; + elseif($adv_day == 'th') $mec_adv_day = 'Thu'; + elseif($adv_day == 'fr') $mec_adv_day = 'Fri'; + + if($adv_week < 0) $adv_week = 'l'; + + $advanced_days = array($mec_adv_day.'.'.$adv_week); + } + elseif(isset($rule['freq']) && $rule['freq'] == 'monthly') + { + $repeat_type = 'monthly'; + $interval = $rule['interval'] ?? 1; + + $year = '*'; + $month = '*'; + + $s = $start_date; + $e = $end_date; + + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_days[] = date('d', strtotime($s)); + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + elseif(isset($rule['freq']) && $rule['freq'] == 'yearly') + { + $repeat_type = 'yearly'; + + $year = '*'; + + $s = $start_date; + $e = $end_date; + + $_months = []; + $_days = []; + while(strtotime($s) <= strtotime($e)) + { + $_months[] = date('m', strtotime($s)); + $_days[] = date('d', strtotime($s)); + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $month = ','.implode(',', array_unique($_months)).','; + $day = ','.implode(',', array_unique($_days)).','; + + $week = '*'; + $weekday = '*'; + } + else $repeat_type = ''; + + // Custom Week Days + if($repeat_type == 'weekly' and isset($rule['byday']) and count(explode(',', $rule['byday'])) > 1) + { + $g_week_days = explode(',', $rule['byday']); + $week_day_mapping = array('mo'=>1, 'tu'=>2, 'we'=>3, 'th'=>4, 'fr'=>5, 'sa'=>6, 'su'=>7); + + $weekdays = ''; + foreach($g_week_days as $g_week_day) $weekdays .= $week_day_mapping[$g_week_day].','; + + $weekdays = ','.trim($weekdays, ', ').','; + $interval = NULL; + + $repeat_type = 'certain_weekdays'; + } + + $finish = isset($rule['until']) ? date('Y-m-d', strtotime($rule['until'])) : NULL; + + // It's all day event, so we should reduce one day from the end date! Google provides 2020-12-12 while the event ends at 2020-12-11 + if($allday) + { + $diff = $this->main->date_diff($start_date, $end_date); + if(($diff ? $diff->days : 0) >= 1) + { + $date_end->sub(new DateInterval('P1D')); + $end_date = $date_end->format('Y-m-d'); + } + } + } + // Single Event + else + { + // It's a one-day single event but google sends 2020-12-12 as end date if start date is 2020-12-11 + if(trim($g_end_datetime) == '' and date('Y-m-d', strtotime('-1 day', strtotime($end_date))) == $start_date) + { + $end_date = $start_date; + } + // It's all day event, so we should reduce one day from the end date! Google provides 2020-12-12 while the event ends at 2020-12-11 + elseif($allday) + { + $diff = $this->main->date_diff($start_date, $end_date); + if(($diff ? $diff->days : 0) > 1) + { + $date_end->sub(new DateInterval('P1D')); + $end_date = $date_end->format('Y-m-d'); + } + } + + $repeat_status = 0; + $g_recurrence_rule = ''; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + $advanced_days = NULL; + $repeat_count = NULL; + } + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array(), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>0, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'repeat_count'=>$repeat_count, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'meta'=>array + ( + 'mec_source'=>'google-calendar', + 'mec_gcal_ical_uid'=>$gcal_ical_uid, + 'mec_gcal_id'=>$gcal_id, + 'mec_gcal_calendar_id'=>$calendar_id, + 'mec_g_recurrence_rule'=>$g_recurrence_rule, + 'mec_allday'=>$allday, + 'mec_advanced_days'=>$advanced_days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$gcal_id' AND `meta_key`='mec_gcal_id'", 'loadResult'); + + // Imported From Google + if(!post_exists($title, $description, '', $this->main->get_main_post_type())) $args['meta']['mec_imported_from_google'] = 1; + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + $post_ids[] = $post_id; + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + // MEC Dates + $dates = $this->db->select("SELECT `dstart` FROM `#__mec_dates` WHERE `post_id`='".$post_id."' ORDER BY `tstart` ASC LIMIT 50", 'loadColumn'); + + // Event Instances + $instances = $service->events->instances($calendar_id, $gcal_id, array('maxResults' => 50)); + + $gdates = []; + foreach($instances as $instance) + { + $start = $instance->getStart(); + $date = $start->getDate(); + + $gdates[] = $date; + } + + $exdates = []; + $previous_not_found = NULL; + $next_found = NULL; + + foreach($dates as $date) + { + if(!in_array($date, $gdates)) $previous_not_found = $date; + elseif($previous_not_found) + { + $exdates[] = $previous_not_found; + $previous_not_found = NULL; + } + } + + // Update MEC EXDATES + $exdates = array_unique($exdates); + if(count($exdates)) + { + $args['not_in_days'] = implode(',', $exdates); + + $this->main->save_event($args, $post_id); + } + } + + return array('success'=>1, 'data'=>$post_ids); + } + + /** + * Show content of meetup import tab + * @return void + * @throws Exception + * @author Webnus + */ + public function ix_meetup_import() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : 'meetup-import-config'; + if(isset($_GET['mec-ix-action']) and trim($_GET['mec-ix-action'])) $this->action = $_GET['mec-ix-action']; + + $this->ix = isset($_POST['ix']) && is_array($_POST['ix']) ? array_map('sanitize_text_field', $_POST['ix']) : []; + + $this->response = []; + + if($this->action == 'meetup-import-login') $this->response = $this->meetup_import_login(); + elseif($this->action == 'meetup-import-start') $this->response = $this->meetup_import_start(); + elseif($this->action == 'meetup-import-do') $this->response = $this->meetup_import_do(); + + $path = MEC::import('app.features.ix.import_meetup', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function meetup_import_login() + { + // Meetup Keys + $public_key = $this->ix['meetup_public_key'] ?? NULL; + $secret_key = $this->ix['meetup_secret_key'] ?? NULL; + $group_name = $this->ix['meetup_group_name'] ?? NULL; + + // Save options + $this->main->save_ix_options([ + 'meetup_public_key' => $public_key, + 'meetup_secret_key' => $secret_key, + 'meetup_group_name' => $group_name, + ]); + + // Meetup API + $meetup = $this->getMeetup(); + + // Redirect URL + $redirect_url = $meetup->get_redirect_url(); + + return [ + 'login' => 'https://secure.meetup.com/oauth2/authorize?client_id='.$public_key.'&response_type=code&redirect_uri='.urlencode($redirect_url) + ]; + } + + public function meetup_import_start() + { + // One Time Key + $code = $_GET['code'] ?? ''; + + // No Access + if(!trim($code)) return ['success'=>0, 'error'=>__('Something happened. Please make sure you allow the website to access your meetup account.', 'modern-events-calendar-lite')]; + + // IX Options + $ix = $this->main->get_ix_options(); + + // Meetup API + $meetup = $this->getMeetup(); + + // Token + $token = $meetup->get_tokens_by_code($code); + + // Group Name + $group_name = $ix['meetup_group_name'] ?? ''; + + // Group Info + $group_info = $meetup->get_group_name($token, $group_name); + + // No Access + if(!isset($group_info['data']['groupByUrlname']) || !is_array($group_info['data']['groupByUrlname'])) return ['success'=>0, 'error'=>__('Meetup group not found!', 'modern-events-calendar-lite')]; + + // Upcoming Events + $events = $meetup->get_group_events($token, $group_name); + $data = []; + + try + { + $m_events = []; + if(isset($events['data']['groupByUrlname']['upcomingEvents']['edges'])) + { + foreach($events['data']['groupByUrlname']['upcomingEvents']['edges'] as $edge) + { + $start = $edge['node']['dateTime']; + $end = $edge['node']['endTime']; + + $m_events[] = [ + 'id' => $edge['node']['id'], + 'title' => $edge['node']['title'], + 'url' => $edge['node']['eventUrl'], + 'start' => date('Y-m-d H:i:s', strtotime($start)), + 'end' => date('Y-m-d H:i:s', strtotime($end)), + ]; + } + } + + $data['title'] = $group_info['data']['groupByUrlname']['name']; + $data['events'] = $m_events; + $data['count'] = count($m_events); + } + catch(Exception $e) + { + $error = $e->getMessage(); + return ['success'=>0, 'error'=>$error]; + } + + return ['success'=>1, 'data'=>$data]; + } + + /** + * @throws Exception + */ + public function meetup_import_do() + { + $m_events = isset($_POST['m-events']) && is_array($_POST['m-events']) ? array_map('sanitize_text_field', $_POST['m-events']) : []; + if(!count($m_events)) return ['success'=>0, 'error'=>__('Please select events to import!', 'modern-events-calendar-lite')]; + + // Meetup API + $meetup = $this->getMeetup(); + + // IX Options + $ix = $this->main->get_ix_options(); + $group_name = $ix['meetup_group_name'] ?? NULL; + + // Token + $token = $meetup->get_token(); + + // Invalid Token + if(!trim($token)) return ['success'=>0, 'error'=>__('Invalid API Token.', 'modern-events-calendar-lite')]; + + // Timezone + $timezone = $this->main->get_timezone(); + + // MEC File + $file = $this->getFile(); + $wp_upload_dir = wp_upload_dir(); + + $post_ids = []; + foreach($m_events as $m_event) + { + try + { + $data = $meetup->get_event($token, $m_event); + $event = isset($data['data']['event']) && is_array($data['data']['event']) ? $data['data']['event'] : []; + + if(!count($event)) continue; + } + catch(Exception $e) + { + continue; + } + + // Event Title and Content + $title = $event['title']; + $description = $event['description']; + $mcal_id = $event['id']; + + // Event location + $location = $event['venue'] ?? []; + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) && $this->ix['import_locations'] && count($location)) + { + $address = $location['address'] ?? ''; + $address .= isset($location['city']) ? ', '.$location['city'] : ''; + $address .= isset($location['state']) ? ', '.$location['state'] : ''; + $address .= isset($location['country']) ? ', '.$location['country'] : ''; + + $location_id = $this->main->save_location([ + 'name' => trim($location['name']), + 'latitude' => trim($location['lat']), + 'longitude' => trim($location['lng']), + 'address' => $address + ]); + } + + // Event Organizer + $organizers = $event['hosts'] ?? []; + $main_organizer_id = 1; + $additional_organizer_ids = []; + + // Import Event Organizer into MEC organizers + if(isset($this->ix['import_organizers']) && $this->ix['import_organizers'] && count($organizers)) + { + $o = 1; + foreach($organizers as $organizer) + { + $organizer_id = $this->main->save_organizer([ + 'name' => $organizer['name'], + 'thumbnail' => '' + ]); + + if($o == 1) $main_organizer_id = $organizer_id; + else $additional_organizer_ids[] = $organizer_id; + + $o++; + } + } + + // Timezone + $TZ = $event['timezone'] ?? 'UTC'; + + // Event Start Date and Time + $start = strtotime($event['dateTime']); + + $date_start = new DateTime(date('Y-m-d H:i:s', $start), new DateTimeZone($TZ)); + $date_start->setTimezone(new DateTimeZone($timezone)); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + // Event End Date and Time + $end = strtotime($event['endTime']); + + $date_end = new DateTime(date('Y-m-d H:i:s', $end), new DateTimeZone($TZ)); + $date_end->setTimezone(new DateTimeZone($timezone)); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + // Meetup Link + $more_info = $event['eventUrl'] ?? ''; + + // Fee Options + $fee = 0; + if(isset($event['feeSettings']) && is_array($event['feeSettings'])) + { + $fee = $event['feeSettings']['amount'].' '.$event['feeSettings']['currency']; + } + + // Event Time Options + $allday = 0; + + // Single Event + $repeat_status = 0; + $repeat_type = ''; + $interval = NULL; + $finish = $end_date; + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + + $args = [ + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$main_organizer_id, + 'date'=>[ + 'start'=>[ + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ], + 'end'=>[ + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ], + 'repeat'=>[], + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>0, + ], + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>$interval, + 'finish'=>$finish, + 'year'=>$year, + 'month'=>$month, + 'day'=>$day, + 'week'=>$week, + 'weekday'=>$weekday, + 'weekdays'=>$weekdays, + 'meta'=>[ + 'mec_source'=>'meetup', + 'mec_meetup_id'=>$mcal_id, + 'mec_meetup_series_id'=>'', + 'mec_more_info'=>$more_info, + 'mec_more_info_title'=>__('Check at Meetup', 'modern-events-calendar-lite'), + 'mec_more_info_target'=>'_self', + 'mec_cost'=>$fee, + 'mec_meetup_url'=>$group_name, + 'mec_allday'=>$allday + ] + ]; + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$mcal_id' AND `meta_key`='mec_meetup_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + $post_ids[] = $post_id; + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + // Set organizer to the post + if($main_organizer_id) wp_set_object_terms($post_id, (int) $main_organizer_id, 'mec_organizer'); + + // Set Additional Organizers + if(count($additional_organizer_ids)) + { + foreach($additional_organizer_ids as $additional_organizer_id) wp_set_object_terms($post_id, (int) $additional_organizer_id, 'mec_organizer', true); + update_post_meta($post_id, 'mec_additional_organizer_ids', $additional_organizer_ids); + } + + // Featured Image + if(!has_post_thumbnail($post_id) && isset($event['imageUrl'])) + { + $photo = $this->main->get_web_page($event['imageUrl']); + $file_name = md5($post_id).'.'.$this->main->get_image_type_by_buffer($photo); + + $path = rtrim($wp_upload_dir['path'], DS.' ').DS.$file_name; + $url = rtrim($wp_upload_dir['url'], '/ ').'/'.$file_name; + + $file->write($path, $photo); + $this->main->set_featured_image($url, $post_id); + } + } + + return ['success'=>1, 'data'=>$post_ids]; + } + + public function export_all_events_do() + { + // Current User Doesn't Have Access + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_import_export'); + if(!current_user_can($capability)) return; + + $format = isset($_GET['format']) ? sanitize_text_field($_GET['format']) : 'csv'; + $events = $this->main->get_events('-1'); + + switch($format) + { + case 'ical': + + $output = ''; + foreach($events as $event) $output .= $this->main->ical_single($event->ID); + + $ical_calendar = $this->main->ical_calendar($output); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-'.date('YmdTHi').'.ics"'); + + echo MEC_kses::full($ical_calendar); + exit; + + case 'csv': + + $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'; + $events_feature = new MEC_feature_events(); + + $rows = $events_feature->csvexcel(true); + $this->main->generate_download_csv($rows, $filename); + + exit; + + case 'g-cal-csv': + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=mec-events-' . md5(time() . mt_rand(100, 999)) . '.csv'); + + $events_feature = new MEC_feature_events(); + $events_feature->gcalcsv(true); + exit; + + case 'ms-excel': + + $filename = 'mec-events-' . md5(time() . mt_rand(100, 999)) . '.xlsx'; + $events_feature = new MEC_feature_events(); + + $rows = $events_feature->csvexcel(true); + $this->main->generate_download_excel($rows, $filename); + + exit; + + case 'xml': + + $output = []; + foreach($events as $event) $output[] = $this->main->export_single($event->ID); + + $xml_feed = $this->main->xml_convert(array('events'=>$output)); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-'.date('YmdTHi').'.xml"'); + + echo $xml_feed; + exit; + + case 'json': + + $output = []; + foreach($events as $event) $output[] = $this->main->export_single($event->ID); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-events-'.date('YmdTHi').'.json"'); + + echo json_encode($output); + exit; + } + } + + public function export_all_bookings_do() + { + // Current User Doesn't Have Access + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_import_export'); + if(!current_user_can($capability)) return false; + + $format = isset($_GET['format']) ? sanitize_text_field($_GET['format']) : 'csv'; + switch($format) + { + case 'ms-excel': + + $booking_ids = $this->bookings_csvexcel(); + + $book = new MEC_feature_books(); + $rows = $book->csvexcel($booking_ids); + + $filename = 'bookings-' . md5(time() . mt_rand(100, 999)) . '.xlsx'; + $this->main->generate_download_excel($rows, $filename); + + exit; + + case 'csv': + + $booking_ids = $this->bookings_csvexcel(); + + $book = new MEC_feature_books(); + $rows = $book->csvexcel($booking_ids); + + $filename = 'bookings-' . md5(time() . mt_rand(100, 999)) . '.csv'; + $this->main->generate_download_csv($rows, $filename); + + exit; + } + } + + public function bookings_csvexcel() + { + $bookings = get_posts(array('post_type'=>$this->main->get_book_post_type(), 'numberposts'=>-1, 'post_status'=>'publish')); + + $booking_ids = []; + foreach($bookings as $booking) $booking_ids[] = $booking->ID; + + return $booking_ids; + } + + public function g_calendar_export_authenticate() + { + $ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $client_id = $ix['google_export_client_id'] ?? NULL; + $client_secret = $ix['google_export_client_secret'] ?? NULL; + $calendar_id = $ix['google_export_calendar_id'] ?? NULL; + $auth_url = ''; + + if(!trim($client_id) or !trim($client_secret) or !trim($calendar_id)) $this->main->response(array('success'=>0, 'message'=>__('All of Client ID, Client Secret, and Calendar ID are required!', 'modern-events-calendar-lite'))); + + // Save options + $this->main->save_ix_options(array('google_export_client_id'=>$client_id, 'google_export_client_secret'=>$client_secret, 'google_export_calendar_id'=>$calendar_id)); + + try + { + $client = new Google_Client(); + $client->setApplicationName(get_bloginfo('name')); + $client->setAccessType('offline'); + $client->setApprovalPrompt('force'); + $client->setScopes(array('https://www.googleapis.com/auth/calendar')); + $client->setClientId($client_id); + $client->setClientSecret($client_secret); + $client->setRedirectUri($this->main->add_qs_vars(array('mec-ix-action'=>'google-calendar-export-get-token'), $this->main->URL('backend').'admin.php?page=MEC-ix&tab=MEC-g-calendar-export')); + + $auth_url = filter_var($client->createAuthUrl(), FILTER_SANITIZE_URL); + } + catch(Exception $ex) + { + $this->main->response(array('success'=>0, 'message'=>$ex->getMessage())); + } + + $this->main->response(array('success'=>1, 'message'=>sprintf(esc_html__('All seems good! Please click %s to authenticate your app.', 'modern-events-calendar-lite'), ''.esc_html__('here', 'modern-events-calendar-lite').''))); + } + + public function g_calendar_export_get_token() + { + $code = isset($_GET['code']) ? sanitize_text_field($_GET['code']) : ''; + + $ix = $this->main->get_ix_options(); + $client_id = $ix['google_export_client_id'] ?? NULL; + $client_secret = $ix['google_export_client_secret'] ?? NULL; + + try + { + $client = new Google_Client(); + $client->setApplicationName(get_bloginfo('name')); + $client->setAccessType('offline'); + $client->setApprovalPrompt('force'); + $client->setScopes(array('https://www.googleapis.com/auth/calendar')); + $client->setClientId($client_id); + $client->setClientSecret($client_secret); + $client->setRedirectUri($this->main->add_qs_vars(array('mec-ix-action'=>'google-calendar-export-get-token'), $this->main->URL('backend').'admin.php?page=MEC-ix&tab=MEC-g-calendar-export')); + + $authentication = $client->authenticate($code); + $token = $client->getAccessToken(); + + $auth = json_decode($authentication, true); + $refresh_token = $auth['refresh_token']; + + // Save options + $this->main->save_ix_options(array('google_export_token'=>$token, 'google_export_refresh_token'=>$refresh_token)); + + $url = $this->main->remove_qs_var('code', $this->main->remove_qs_var('mec-ix-action')); + header('location: '.$url); + exit; + } + catch(Exception $ex) + { + echo esc_html($ex->getMessage()); + exit; + } + } + + public function g_calendar_export_do() + { + $mec_event_ids = ((isset($_POST['mec-events']) and is_array($_POST['mec-events'])) ? array_map('sanitize_text_field', $_POST['mec-events']) : array()); + $export_attendees = (isset($_POST['export_attendees']) ? sanitize_text_field($_POST['export_attendees']) : 0); + + $ix = $this->main->get_ix_options(); + + $client_id = $ix['google_export_client_id'] ?? NULL; + $client_secret = $ix['google_export_client_secret'] ?? NULL; + $token = $ix['google_export_token'] ?? NULL; + $refresh_token = $ix['google_export_refresh_token'] ?? NULL; + $calendar_id = $ix['google_export_calendar_id'] ?? NULL; + + if(!trim($client_id) or !trim($client_secret) or !trim($calendar_id)) $this->main->response(array('success'=>0, 'message'=>__('Client App, Client Secret, and Calendar ID are all required!', 'modern-events-calendar-lite'))); + + $client = new Google_Client(); + $client->setApplicationName('Modern Events Calendar'); + $client->setAccessType('offline'); + $client->setScopes(array('https://www.googleapis.com/auth/calendar')); + $client->setClientId($client_id); + $client->setClientSecret($client_secret); + $client->setRedirectUri($this->main->add_qs_vars(array('mec-ix-action'=>'google-calendar-export-get-token'), $this->main->URL('backend').'admin.php?page=MEC-ix&tab=MEC-g-calendar-export')); + $client->setAccessToken($token); + $client->refreshToken($refresh_token); + + $service = new Google_Service_Calendar($client); + + // MEC Render Library + $render = $this->getRender(); + + $g_events_not_inserted = []; + $g_events_inserted = []; + $g_events_updated = []; + + foreach($mec_event_ids as $mec_event_id) + { + $data = $render->data($mec_event_id); + + $dates = $render->dates($mec_event_id, $data); + $date = $dates[0] ?? []; + + // No Date + if(!count($date)) continue; + + // Timezone Options + $timezone = $this->main->get_timezone($mec_event_id); + + $location = $data->locations[$data->meta['mec_location_id']] ?? []; + $organizer = $data->organizers[$data->meta['mec_organizer_id']] ?? []; + + $recurrence = $this->main->get_ical_rrules($data); + + $start = array( + 'dateTime'=>date('Y-m-d\TH:i:s', $date['start']['timestamp']), + 'timeZone'=>$timezone, + ); + + $end = array( + 'dateTime'=>date('Y-m-d\TH:i:s', $date['end']['timestamp']), + 'timeZone'=>$timezone, + ); + + $allday = $data->meta['mec_allday'] ?? 0; + if($allday) + { + $start['dateTime'] = date('Y-m-d\T00:00:00', $date['start']['timestamp']); + $end['dateTime'] = date('Y-m-d\T00:00:00', strtotime('+1 Day', strtotime($end['dateTime']))); + } + + // Event Data + $event_data = array + ( + 'summary'=>$data->title, + 'location'=>($location['address'] ?? ($location['name'] ?? '')), + 'description'=>strip_tags(strip_shortcodes($data->content)), + 'start'=>$start, + 'end'=>$end, + 'recurrence'=>$recurrence, + 'attendees'=>array(), + 'reminders'=>array(), + ); + + $event = new Google_Service_Calendar_Event($event_data); + $iCalUID = 'mec-ical-'.$data->ID; + + $mec_iCalUID = get_post_meta($data->ID, 'mec_gcal_ical_uid', true); + $mec_calendar_id = get_post_meta($data->ID, 'mec_gcal_calendar_id', true); + + /** + * Event is imported from same google calendar, + * and now it's exporting to its calendar again, + * so we're trying to update existing one by setting event iCal ID + */ + if($mec_calendar_id == $calendar_id and trim($mec_iCalUID)) $iCalUID = $mec_iCalUID; + + $event->setICalUID($iCalUID); + + // Set the organizer if exists + if(isset($organizer['name'])) + { + $g_organizer = new Google_Service_Calendar_EventOrganizer(); + $g_organizer->setDisplayName($organizer['name']); + $g_organizer->setEmail($organizer['email']); + + $event->setOrganizer($g_organizer); + } + + // Set the attendees + if($export_attendees) + { + $attendees = []; + foreach($this->main->get_event_attendees($data->ID) as $att) + { + $attendee = new Google_Service_Calendar_EventAttendee(); + $attendee->setDisplayName($att['name']); + $attendee->setEmail($att['email']); + $attendee->setResponseStatus('accepted'); + + $attendees[] = $attendee; + } + + $event->setAttendees($attendees); + } + + try + { + $g_event = $service->events->insert($calendar_id, $event); + + // Set Google Calendar ID to MEC database for updating it in the future instead of adding it twice + update_post_meta($data->ID, 'mec_gcal_ical_uid', $g_event->getICalUID()); + update_post_meta($data->ID, 'mec_gcal_calendar_id', $calendar_id); + update_post_meta($data->ID, 'mec_gcal_id', $g_event->getId()); + + $g_events_inserted[] = array('title'=>$data->title, 'message'=>$g_event->htmlLink); + } + catch(Exception $ex) + { + // Event already existed + if($ex->getCode() == 409) + { + try + { + $g_event_id = get_post_meta($data->ID, 'mec_gcal_id', true); + $g_event = $service->events->get($calendar_id, $g_event_id); + + // Update Event Data + $g_event->setSummary($event_data['summary']); + $g_event->setLocation($event_data['location']); + $g_event->setDescription($event_data['description']); + $g_event->setRecurrence($event_data['recurrence']); + + $start = new Google_Service_Calendar_EventDateTime(); + $start->setDateTime($event_data['start']['dateTime']); + $start->setTimeZone($event_data['start']['timeZone']); + $g_event->setStart($start); + + $end = new Google_Service_Calendar_EventDateTime(); + $end->setDateTime($event_data['end']['dateTime']); + $end->setTimeZone($event_data['end']['timeZone']); + $g_event->setEnd($end); + + $g_updated_event = $service->events->update($calendar_id, $g_event_id, $g_event); + $g_events_updated[] = array('title'=>$data->title, 'message'=>$g_updated_event->htmlLink); + } + catch(Exception $ex) + { + $g_events_not_inserted[] = array('title'=>$data->title, 'message'=>$ex->getMessage()); + } + } + else $g_events_not_inserted[] = array('title'=>$data->title, 'message'=>$ex->getMessage()); + } + } + + $results = '
      '; + foreach($g_events_not_inserted as $g_event_not_inserted) $results .= '
    • '.MEC_kses::element($g_event_not_inserted['title']).': '.MEC_kses::element($g_event_not_inserted['message']).'
    • '; + $results .= '
        '; + + $message = (count($g_events_inserted) ? sprintf(esc_html__('%s events added to Google Calendar with success.', 'modern-events-calendar-lite'), ''.count($g_events_inserted).'') : ''); + $message .= (count($g_events_updated) ? ' '.sprintf(esc_html__('%s Updated previously added events.', 'modern-events-calendar-lite'), ''.count($g_events_updated).'') : ''); + $message .= (count($g_events_not_inserted) ? ' '.sprintf(esc_html__('%s events failed to add for following reasons: %s', 'modern-events-calendar-lite'), ''.count($g_events_not_inserted).'', $results) : ''); + + $this->main->response(array('success'=>((count($g_events_inserted) or count($g_events_updated)) ? 1 : 0), 'message'=>trim($message))); + } + + /** + * Show content of Facebook Import tab + * @author Webnus + * @return void + */ + public function ix_f_calendar_import() + { + // Current Action + $this->action = isset($_POST['mec-ix-action']) ? sanitize_text_field($_POST['mec-ix-action']) : ''; + $this->ix = ((isset($_POST['ix']) and is_array($_POST['ix'])) ? array_map('sanitize_text_field', $_POST['ix']) : array()); + + $this->response = []; + if($this->action == 'facebook-calendar-import-start') $this->response = $this->f_calendar_import_start(); + elseif($this->action == 'facebook-calendar-import-do') $this->response = $this->f_calendar_import_do(); + + $path = MEC::import('app.features.ix.import_f_calendar', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + public function f_calendar_import_start() + { + $fb_page_link = $this->ix['facebook_import_page_link'] ?? NULL; + $this->fb_access_token = $this->ix['facebook_app_token'] ?? NULL; + + if(!trim($fb_page_link)) return array('success'=>0, 'message'=>__("Please insert your Facebook page's link.", 'modern-events-calendar-lite')); + + // Save options + $this->main->save_ix_options(['facebook_import_page_link'=>$fb_page_link]); + $this->main->save_ix_options(['facebook_app_token'=>$this->fb_access_token]); + + $fb_page = $this->f_calendar_import_get_page($fb_page_link); + + $fb_page_id = $fb_page['id'] ?? 0; + if(!$fb_page_id) + { + $message = esc_html__("We were not able to recognize your Facebook page. Please check again and provide a valid link.", 'modern-events-calendar-lite'); + if(isset($fb_page['error']) and isset($fb_page['error']['message'])) $message = $fb_page['error']['message']; + + return array('success'=>0, 'message'=>$message); + } + + $events = []; + $next_page = 'https://graph.facebook.com/v18.0/'.$fb_page_id.'/events/?access_token='.$this->fb_access_token; + + do + { + $events_result = $this->main->get_web_page($next_page); + $fb_events = json_decode($events_result, true); + + // Exit the loop if no event found + if(!isset($fb_events['data'])) break; + + foreach($fb_events['data'] as $fb_event) + { + $events[] = array('id'=>$fb_event['id'], 'name'=>$fb_event['name']); + } + + $next_page = $fb_events['paging']['next'] ?? NULL; + } + while($next_page); + + if(!count($events)) return array('success'=>0, 'message'=>__("No events found!", 'modern-events-calendar-lite')); + else return array('success'=>1, 'message'=>'', 'data'=>array('events'=>$events, 'count'=>count($events), 'name'=>$fb_page['name'])); + } + + public function f_calendar_import_do() + { + $f_events = ((isset($_POST['f-events']) and is_array($_POST['f-events'])) ? array_map('sanitize_text_field', $_POST['f-events']) : array()); + if(!count($f_events)) return array('success'=>0, 'message'=>__('Please select events to import!', 'modern-events-calendar-lite')); + + $fb_page_link = $this->ix['facebook_import_page_link'] ?? NULL; + $this->fb_access_token = $this->ix['facebook_app_token'] ?? NULL; + if(!trim($fb_page_link)) return array('success'=>0, 'message'=>__("Please insert your facebook page's link.", 'modern-events-calendar-lite')); + + $fb_page = $this->f_calendar_import_get_page($fb_page_link); + + $fb_page_id = $fb_page['id'] ?? 0; + if(!$fb_page_id) return array('success'=>0, 'message'=>__("We were not able to recognize your Facebook page. Please check again and provide a valid link.", 'modern-events-calendar-lite')); + + // Timezone + $timezone = $this->main->get_timezone(); + + // MEC File + $file = $this->getFile(); + $wp_upload_dir = wp_upload_dir(); + + $post_ids = []; + foreach($f_events as $f_event_id) + { + $events_result = $this->main->get_web_page('https://graph.facebook.com/v18.0/'.$f_event_id.'?fields=name,place,description,start_time,end_time,cover,event_times&access_token='.$this->fb_access_token); + $event = json_decode($events_result, true); + + // An error Occurred + if(isset($event['error']) and is_array($event['error']) and count($event['error'])) continue; + + // Event organizer + $organizer_id = 1; + + // Event location + $location = $event['place'] ?? []; + $location_id = 1; + + // Import Event Locations into MEC locations + if(isset($this->ix['import_locations']) and $this->ix['import_locations'] and count($location)) + { + $location_name = $location['name']; + $location_address = trim($location_name.' '.($location['location']['city'] ?? '').' '.($location['location']['state'] ?? '').' '.($location['location']['country'] ?? '').' '.($location['location']['zip'] ?? ''), ''); + $location_id = $this->main->save_location(array + ( + 'name'=>trim($location_name), + 'address'=>$location_address, + 'latitude'=>!empty($location['location']['latitude']) ? $location['location']['latitude'] : '', + 'longitude'=>!empty($location['location']['longitude']) ? $location['location']['longitude'] : '', + )); + } + + // Event Title and Content + $title = $event['name']; + $description = $event['description'] ?? ''; + + // Event Times (Custom Events) + $event_times = ((isset($event['event_times']) and is_array($event['event_times'])) ? $event['event_times'] : array()); + + if(count($event_times)) + { + $days = ''; + $main_datetime = []; + + $i = 1; + foreach($event_times as $event_time) + { + if($i == count($event_times)) $main_datetime = $event_time; + else + { + $ds = new DateTime($event_time['start_time']); + $ds->setTimezone(new DateTimeZone($timezone)); + + $de = new DateTime($event_time['end_time']); + $de->setTimezone(new DateTimeZone($timezone)); + + $days .= $ds->format('Y-m-d').':'.$de->format('Y-m-d').':'.$ds->format('h-i-A').':'.$de->format('h-i-A').','; + } + + $i++; + } + + $date_start = new DateTime($main_datetime['start_time']); + $date_start->setTimezone(new DateTimeZone($timezone)); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + $date_end = new DateTime($main_datetime['end_time']); + $date_end->setTimezone(new DateTimeZone($timezone)); + + $end_date = $date_end->format('Y-m-d'); + $end_hour = $date_end->format('g'); + $end_minutes = $date_end->format('i'); + $end_ampm = $date_end->format('A'); + + $repeat_status = 1; + $repeat_type = 'custom_days'; + $days = trim($days, ', '); + } + else + { + $date_start = new DateTime($event['start_time']); + $date_start->setTimezone(new DateTimeZone($timezone)); + + $start_date = $date_start->format('Y-m-d'); + $start_hour = $date_start->format('g'); + $start_minutes = $date_start->format('i'); + $start_ampm = $date_start->format('A'); + + $end_timestamp = isset($event['end_time']) ? strtotime($event['end_time']) : 0; + if($end_timestamp) + { + $date_end = new DateTime($event['end_time']); + $date_end->setTimezone(new DateTimeZone($timezone)); + } + + $end_date = $end_timestamp ? $date_end->format('Y-m-d') : $start_date; + $end_hour = $end_timestamp ? $date_end->format('g') : 8; + $end_minutes = $end_timestamp ? $date_end->format('i') : '00'; + $end_ampm = $end_timestamp ? $date_end->format('A') : 'PM'; + + $repeat_status = 0; + $repeat_type = ''; + $days = NULL; + } + + // Event Time Options + $allday = 0; + + // Import Facebook Link as Event Link + $read_more = ''; + if(isset($this->ix['import_link_event']) and $this->ix['import_link_event']) $read_more = 'https://www.facebook.com/events/'.$f_event_id.'/'; + + // Import Facebook Link as More Info + $more_info = ''; + if(isset($this->ix['import_link_more_info']) and $this->ix['import_link_more_info']) $more_info = 'https://www.facebook.com/events/'.$f_event_id.'/'; + + $args = array + ( + 'title'=>$title, + 'content'=>$description, + 'location_id'=>$location_id, + 'organizer_id'=>$organizer_id, + 'date'=>array + ( + 'start'=>array( + 'date'=>$start_date, + 'hour'=>$start_hour, + 'minutes'=>$start_minutes, + 'ampm'=>$start_ampm, + ), + 'end'=>array( + 'date'=>$end_date, + 'hour'=>$end_hour, + 'minutes'=>$end_minutes, + 'ampm'=>$end_ampm, + ), + 'repeat'=>array(), + 'allday'=>$allday, + 'comment'=>'', + 'hide_time'=>0, + 'hide_end_time'=>0, + ), + 'start'=>$start_date, + 'start_time_hour'=>$start_hour, + 'start_time_minutes'=>$start_minutes, + 'start_time_ampm'=>$start_ampm, + 'end'=>$end_date, + 'end_time_hour'=>$end_hour, + 'end_time_minutes'=>$end_minutes, + 'end_time_ampm'=>$end_ampm, + 'repeat_status'=>$repeat_status, + 'repeat_type'=>$repeat_type, + 'interval'=>NULL, + 'finish'=>$end_date, + 'year'=>NULL, + 'month'=>NULL, + 'day'=>NULL, + 'week'=>NULL, + 'weekday'=>NULL, + 'weekdays'=>NULL, + 'days'=>$days, + 'meta'=>array + ( + 'mec_source'=>'facebook-calendar', + 'mec_facebook_page_id'=>$fb_page_id, + 'mec_facebook_event_id'=>$f_event_id, + 'mec_allday'=>$allday, + 'mec_read_more'=>$read_more, + 'mec_more_info'=>$more_info, + 'mec_in_days'=>$days, + ) + ); + + $post_id = $this->db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$f_event_id' AND `meta_key`='mec_facebook_event_id'", 'loadResult'); + + // Insert the event into MEC + $post_id = $this->main->save_event($args, $post_id); + $post_ids[] = $post_id; + + // Set location to the post + if($location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + if(!has_post_thumbnail($post_id) and isset($event['cover']) and is_array($event['cover']) and count($event['cover'])) + { + $photo = $this->main->get_web_page($event['cover']['source']); + $file_name = md5($post_id).'.'.$this->main->get_image_type_by_buffer($photo); + + $path = rtrim($wp_upload_dir['path'], DS.' ').DS.$file_name; + $url = rtrim($wp_upload_dir['url'], '/ ').'/'.$file_name; + + $file->write($path, $photo); + $this->main->set_featured_image($url, $post_id); + } + } + + return array('success'=>1, 'data'=>$post_ids); + } + + public function f_calendar_import_get_page($link) + { + $this->fb_access_token = $this->ix['facebook_app_token'] ?? NULL; + $fb_page_result = $this->main->get_web_page('https://graph.facebook.com/v18.0/?access_token='.$this->fb_access_token.'&id='.$link); + + return json_decode($fb_page_result, true); + } +} \ No newline at end of file diff --git a/app/features/ix/export.php b/app/features/ix/export.php new file mode 100755 index 0000000..7150493 --- /dev/null +++ b/app/features/ix/export.php @@ -0,0 +1,71 @@ +main->get_events('-1'); + +// Settings +$settings = $this->main->get_settings(); +?> +
        +

        + +
        +
        +
        +

        +

        +
          +
        • +
        • +
        • +
        • +
        • +
        • +
        +
        +
        +

        +

        main->URL('backend')).'edit.php?post_type=mec-events">'.esc_html__('Events', 'modern-events-calendar-lite').''); ?>

        +
        + + +
        +

        +

        main->URL('site'), '/ ').'/?mec-ical-feed=1" target="_blank">'.trim($this->main->URL('site'), '/ ').'/?mec-ical-feed=1'); ?>

        +
        + + + main->getPRO()): ?> +
        +
        +

        +

        +
          +
        • +
        • +
        +
        +
        +

        +

        main->URL('backend')).'edit.php?post_type=mec-books">'.esc_html__('Bookings', 'modern-events-calendar-lite').''); ?>

        +
        + + + +
        +
        +
        \ No newline at end of file diff --git a/app/features/ix/export_g_calendar.php b/app/features/ix/export_g_calendar.php new file mode 100755 index 0000000..3b29de2 --- /dev/null +++ b/app/features/ix/export_g_calendar.php @@ -0,0 +1,189 @@ +main->get_events('-1', array('publish', 'pending', 'future', 'draft', 'private')); +$ix_options = $this->main->get_ix_options(); + +// Start the export process if token is exists +if(isset($ix_options['google_export_token']) && $ix_options['google_export_token']) $this->action = 'google-calendar-export-start'; +?> +
        +

        + +
        +
        +
        +

        +

        '.esc_url($this->main->add_qs_vars(array('mec-ix-action'=>'google-calendar-export-get-token'), $this->main->URL('backend').'admin.php?page=MEC-ix&tab=MEC-g-calendar-export')).''); ?>

        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        +

        +
        +
        + action == 'google-calendar-export-start'): ?> +
        +
        +
          +
        • +
        • +
        • +
        +
          + +
        • + +
        • + +
        +
        +

        +
        + +
        + +
        +

        +
        +
        + +
        +
        +
        + +factory->params('footer', function() +{ + ?> + + main->get_integrated_plugins_for_import(); +?> +
        +

        + +
        +
        +

        +
        +
        +

        '.esc_html__('Modern Events Calendar', 'modern-events-calendar-lite').''); ?>

        +
        +
        + + + + +
        +
        + + action == 'import-start-xml'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        response['message']); ?>
        + +
        + + +

        + getPRO()): ?> +
        +
        +

        '.esc_html__('Modern Events Calendar', 'modern-events-calendar-lite').''); ?>

        +
        +
        + + + + +
        +
        + +
        main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
        + + + action == 'import-start-ics'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        response['message']); ?>
        + +
        + + + + +

        + getPRO()): ?> +
        +
        +

        '.esc_html__('Modern Events Calendar', 'modern-events-calendar-lite').''); ?>

        +

        main->asset('files/sample.csv')).'">sample.csv'); ?>

        +

        +
        +
        + + + + +
        +
        + +
        main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
        + + + action == 'import-start-bookings'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        response['message']); ?>
        + +
        + +
        + + +
        +
        \ No newline at end of file diff --git a/app/features/ix/import_f_calendar.php b/app/features/ix/import_f_calendar.php new file mode 100755 index 0000000..a5a03b8 --- /dev/null +++ b/app/features/ix/import_f_calendar.php @@ -0,0 +1,112 @@ +main->get_ix_options(); +?> +
        +

        + +
        +
        + +

        + + + action == 'facebook-calendar-import-start'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        +
        +

        +
        '.esc_html($this->response['data']['count']).'', ''.esc_html($this->response['data']['name']).''); ?>
        +
          +
        • +
        • +
        • +
        +
          + response['data']['events'] as $event): if(trim($event['name']) == '') continue; ?> +
        • + +
        • + +
        +
        +
        +

        +
        + +
        +
        + +
        +
        + +
        + + + + +
        +
        + +
        + action == 'facebook-calendar-import-do'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        '.count($this->response['data']).''); ?>
        + +
        + + +
        +
        +
        \ No newline at end of file diff --git a/app/features/ix/import_g_calendar.php b/app/features/ix/import_g_calendar.php new file mode 100755 index 0000000..d401843 --- /dev/null +++ b/app/features/ix/import_g_calendar.php @@ -0,0 +1,129 @@ +main->get_ix_options(); +?> +
        +

        + +
        +
        +
        +
        +

        +

        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + + +
        +
        + action == 'google-calendar-import-start'): ?> +
        + response['success'] == 0): ?> +
        response['error']); ?>
        + +
        +
        +

        +
        '.esc_html($this->response['data']['count']).'', ''.esc_html($this->response['data']['title']).''); ?>
        +
          +
        • +
        • +
        • +
        +
          + main->get_timezone(); foreach($this->response['data']['events'] as $event): if(trim($event['title']) == '') continue; ?> + date) && trim($event['start']->date)) + ? $event['start']->date + : $event['start']->dateTime + )); + if($timezone != $this->response['data']['timezone']) $date_start->setTimezone(new DateTimeZone($timezone)); + + $date_end = new DateTime(( + (isset($event['end']->date) && trim($event['end']->date)) + ? $event['end']->date + : $event['end']->dateTime + )); + if($timezone != $this->response['data']['timezone']) $date_end->setTimezone(new DateTimeZone($timezone)); + ?> +
        • + +
        • + +
        +
        +
        +

        +
        + +
        +
        + +
        + + + + +
        +
        + +
        + action == 'google-calendar-import-do'): ?> +
        + response['success'] == 0): ?> +
        response['error']); ?>
        + +
        '.count($this->response['data']).''); ?>
        + +
        + +
        +
        +
        +
        \ No newline at end of file diff --git a/app/features/ix/import_meetup.php b/app/features/ix/import_meetup.php new file mode 100755 index 0000000..afefbca --- /dev/null +++ b/app/features/ix/import_meetup.php @@ -0,0 +1,121 @@ +main->get_ix_options(); +?> +
        +

        + +
        +
        +
        + action === 'meetup-import-config'): ?> +
        +

        +

        https://www.meetup.com/api/oauth/list/'); ?>

        +

        '.get_home_url().''); ?>

        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +
        + +
        + +
        +
        +

        blahblahblah'); ?>

        +
        + + +
        +
        + action === 'meetup-import-login'): ?> + + action === 'meetup-import-start'): ?> +
        + response['success'] == 0): ?> +
        response['error']); ?>
        + + +
        +
        +

        +
        '.esc_html($this->response['data']['count']).'', ''.esc_html($this->response['data']['title']).''); ?>
        +
          +
        • +
        • +
        • +
        +
          + response['data']['events'] as $event): ?> +
        • + +
        • + +
        +
        +
        +

        +
        + +
        +
        + +
        + + + + +
        +
        + +
        + action == 'meetup-import-do'): ?> +
        + response['success'] == 0): ?> +
        response['error']); ?>
        + +
        '.count($this->response['data']).''); ?>
        +
        :
        + +
        + +
        +
        +
        +
        \ No newline at end of file diff --git a/app/features/ix/index.html b/app/features/ix/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/ix/sync.php b/app/features/ix/sync.php new file mode 100755 index 0000000..d799d72 --- /dev/null +++ b/app/features/ix/sync.php @@ -0,0 +1,118 @@ +main->get_ix_options(); +?> +
        +

        + +
        +
        + main->getPRO()): ?> +
        main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
        + +
        +
        + + +
        +
        + +

        : '.esc_html($cron).''); ?>

        +
        +
        + + +
        +
        + +
        +
        + +
        +
        +
        +
        + : '.esc_html($cron).''); ?> +
        +
        +
        + + +
        + + +
        +
        + +

        : '.esc_html($cron).''); ?>

        +
        + + +
        + + +
        +
        + +

        : '.esc_html($cron).''); ?>

        +
        + +
        +

        +

        -

        +

        -

        + + + + + + + +
        + +
        + + +
        +
        + +
        +
        +
        \ No newline at end of file diff --git a/app/features/ix/test_data.php b/app/features/ix/test_data.php new file mode 100755 index 0000000..ad93281 --- /dev/null +++ b/app/features/ix/test_data.php @@ -0,0 +1,115 @@ + 'mec_category', + 'hide_empty' => 0, +)); +$tags = get_terms(array( + 'taxonomy' => apply_filters('mec_taxonomy_tag', ''), + 'hide_empty' => 0, +)); +$locations = get_terms(array( + 'taxonomy' => 'mec_location', + 'hide_empty' => 0, +)); +$organizers = get_terms(array( + 'taxonomy' => 'mec_organizer', + 'hide_empty' => 0, +)); +?> +
        +

        + +
        +
        +

        +
        +
        +

        +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + + +
        +
        + + action == 'test-data-generation-start'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        response['message']); ?>
        + +
        + +
        + + +
        +
        \ No newline at end of file diff --git a/app/features/ix/thirdparty.php b/app/features/ix/thirdparty.php new file mode 100755 index 0000000..655ea1d --- /dev/null +++ b/app/features/ix/thirdparty.php @@ -0,0 +1,215 @@ +main->get_integrated_plugins_for_import(); +?> +
        +

        + +
        +
        +

        +
        +
        +

        '.esc_html__('Modern Events Calendar', 'modern-events-calendar-lite').''); ?>

        +
        +
        + + + +
        +
        + + action == 'thirdparty-import-start'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + response['data']['count']) && !$this->response['data']['count']): ?> +
        + +
        +
        +
        +

        +
        '.esc_html($this->response['data']['count']).''); ?>
        +
          +
        • +
        • +
        • +
        +
          + response['data']['events'] as $event): if(trim($event->post_title) == '') continue; ?> +
        • + +
        • + +
        +
        +
        +

        + + ix['third-party'], array('event-espresso', 'events-manager-single', 'events-manager-recurring'))): ?> +
        + +
        + + + ix['third-party'], array('the-events-calendar'))): ?> +
        + +
        + + +
        + +
        +
        + +
        +
        + +
        + + + +
        +
        + +
        +
        + +
        + action == 'thirdparty-import-do'): ?> +
        + response['success'] == 0): ?> +
        response['message']); ?>
        + +
        '.esc_html($this->response['data']).''); ?>
        +
        :
        + +
        + +
        +
        +
        +factory->params('footer', function() +{ + ?> + + + */ +class MEC_feature_labels extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + } + + /** + * Initialize label feature + * @author Webnus + */ + public function init() + { + $this->factory->action('init', array($this, 'register_taxonomy'), 15); + $this->factory->action('mec_label_edit_form_fields', array($this, 'edit_form')); + $this->factory->action('mec_label_add_form_fields', array($this, 'add_form')); + $this->factory->action('edited_mec_label', array($this, 'save_metadata')); + $this->factory->action('created_mec_label', array($this, 'save_metadata')); + + $this->factory->action('add_meta_boxes', array($this, 'register_meta_boxes')); + + $this->factory->filter('manage_edit-mec_label_columns', array($this, 'filter_columns')); + $this->factory->filter('manage_mec_label_custom_column', array($this, 'filter_columns_content'), 10, 3); + + $this->factory->action('save_post', array($this, 'save_event'), 3); + } + + /** + * Register label taxonomy + * @author Webnus + */ + public function register_taxonomy() + { + $singular_label = $this->main->m('taxonomy_label', esc_html__('Label', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite')); + + $label_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-label'), + 'public'=>false, + 'show_ui'=>true, + 'hierarchical'=>false, + ), + 'mec_label' + ); + register_taxonomy( + 'mec_label', + $this->main->get_main_post_type(), + $label_args + ); + + register_taxonomy_for_object_type('mec_label', $this->main->get_main_post_type()); + } + + /** + * Show edit form of labels + * @author Webnus + * @param object $term + */ + public function edit_form($term) + { + $color = get_metadata('term', $term->term_id, 'color', true); + $style = get_metadata('term', $term->term_id, 'style', true); + ?> + + + + + + +

        + + + + + + + + +

        + + + + */ + public function add_form() + { + ?> +
        + + +

        +
        +
        + + +

        +
        + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['color'])) return; + + $color = isset($_POST['color']) ? sanitize_text_field($_POST['color']) : $this->main->get_default_label_color(); + update_term_meta($term_id, 'color', $color); + + $style = isset($_POST['style']) ? sanitize_text_field($_POST['style']) : ''; + update_term_meta($term_id, 'style', $style); + } + + /** + * Filter label taxonomy columns + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_columns($columns) + { + unset($columns['name']); + unset($columns['slug']); + unset($columns['description']); + unset($columns['posts']); + + $columns['id'] = esc_html__('ID', 'modern-events-calendar-lite'); + $columns['name'] = esc_html__('Name', 'modern-events-calendar-lite'); + $columns['color'] = esc_html__('Color', 'modern-events-calendar-lite'); + $columns['posts'] = esc_html__('Count', 'modern-events-calendar-lite'); + $columns['slug'] = esc_html__('Slug', 'modern-events-calendar-lite'); + + return $columns; + } + + /** + * Filter content of label taxonomy + * @author Webnus + * @param string $content + * @param string $column_name + * @param int $term_id + * @return string + */ + public function filter_columns_content($content, $column_name, $term_id) + { + switch($column_name) + { + case 'id': + + $content = $term_id; + break; + + case 'color': + + $content = ''; + break; + + default: + break; + } + + return $content; + } + + /** + * Register meta box of labels + * @author Webnus + */ + public function register_meta_boxes() + { + add_meta_box('mec_metabox_label', sprintf(esc_html__('Event %s', 'modern-events-calendar-lite'), $this->main->m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite'))), array($this, 'meta_box_labels'), $this->main->get_main_post_type(), 'side'); + } + + /** + * Show meta box of labels + * @author Webnus + * @param object $post + */ + public function meta_box_labels($post) + { + $labels = get_terms('mec_label', array('orderby'=>'name', 'order'=>'ASC', 'hide_empty'=>'0')); + $terms = wp_get_post_terms($post->ID, 'mec_label', array('fields'=>'ids')); + ?> +
        +
        + +
        + + +
        + +
        +
        + + * @param int $post_id + * @return void + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + $_labels = isset($_mec['labels']) ? (array) $_mec['labels'] : []; + + $_labels = array_map('sanitize_text_field', $_labels); + $_labels = array_map('intval', $_labels); + $_labels = array_unique($_labels); + + wp_set_object_terms($post_id, $_labels, 'mec_label'); + } +} \ No newline at end of file diff --git a/app/features/locations.php b/app/features/locations.php new file mode 100755 index 0000000..8d81ed3 --- /dev/null +++ b/app/features/locations.php @@ -0,0 +1,437 @@ + + */ +class MEC_feature_locations extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize locations feature + * @author Webnus + */ + public function init() + { + $this->factory->action('init', array($this, 'register_taxonomy'), 20); + $this->factory->action('mec_location_edit_form_fields', array($this, 'edit_form')); + $this->factory->action('mec_location_add_form_fields', array($this, 'add_form')); + $this->factory->action('edited_mec_location', array($this, 'save_metadata')); + $this->factory->action('created_mec_location', array($this, 'save_metadata')); + + $this->factory->action('mec_metabox_details', array($this, 'meta_box_location'), 30); + if(!isset($this->settings['fes_section_location']) or (isset($this->settings['fes_section_location']) and $this->settings['fes_section_location'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_location'), 30); + + $this->factory->filter('manage_edit-mec_location_columns', array($this, 'filter_columns')); + $this->factory->filter('manage_mec_location_custom_column', array($this, 'filter_columns_content'), 10, 3); + + $this->factory->action('save_post', array($this, 'save_event'), 1); + } + + /** + * Registers location taxonomy + * @author Webnus + */ + public function register_taxonomy() + { + $singular_label = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_locations', esc_html__('Locations', 'modern-events-calendar-lite')); + + $location_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-location'), + 'public'=>false, + 'show_ui'=>true, + 'hierarchical'=>false, + ), + 'mec_location' + ); + register_taxonomy( + 'mec_location', + $this->main->get_main_post_type(), + $location_args + ); + + register_taxonomy_for_object_type('mec_location', $this->main->get_main_post_type()); + } + + /** + * Show edit form of location taxonomy + * @author Webnus + * @param object $term + */ + public function edit_form($term) + { + $this->main->load_map_assets(true); + + $address = get_metadata('term', $term->term_id, 'address', true); + $opening_hour = get_metadata('term', $term->term_id, 'opening_hour', true); + $latitude = get_metadata('term', $term->term_id, 'latitude', true); + $longitude = get_metadata('term', $term->term_id, 'longitude', true); + $url = get_metadata('term', $term->term_id, 'url', true); + $tel = get_metadata('term', $term->term_id, 'tel', true); + $thumbnail = get_metadata('term', $term->term_id, 'thumbnail', true); + + // Map Options + $status = $this->settings['google_maps_status'] ?? 1; + $api_key = $this->settings['google_maps_api_key'] ?? ''; + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        '; ?>
        + + + + + + + */ + public function add_form() + { + $this->main->load_map_assets(true); + + // Map Options + $status = $this->settings['google_maps_status'] ?? 1; + $api_key = $this->settings['google_maps_api_key'] ?? ''; + ?> +
        + + + + + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        +
        + + +
        + +
        + +
        + + + +
        + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['address'])) return; + + $address = sanitize_text_field($_POST['address']); + $opening_hour = isset($_POST['opening_hour']) ? sanitize_text_field($_POST['opening_hour']) : ''; + $latitude = isset($_POST['latitude']) ? sanitize_text_field($_POST['latitude']) : '0'; + $longitude = isset($_POST['longitude']) ? sanitize_text_field($_POST['longitude']) : '0'; + $url = (isset($_POST['url']) and trim($_POST['url'])) ? sanitize_url($_POST['url']) : ''; + $tel = (isset($_POST['tel']) and trim($_POST['tel'])) ? sanitize_text_field($_POST['tel']) : ''; + $thumbnail = isset($_POST['thumbnail']) ? sanitize_text_field($_POST['thumbnail']) : ''; + + // Geo Point is Empty or Address Changed + if(!floatval($latitude) or !floatval($longitude) or (trim($address) and ($address != get_term_meta($term_id, 'address', true)))) + { + $geo_point = $this->main->get_lat_lng($address); + + if(isset($geo_point[0]) and trim($geo_point[0])) $latitude = $geo_point[0]; + if(isset($geo_point[1]) and trim($geo_point[1])) $longitude = $geo_point[1]; + } + + update_term_meta($term_id, 'address', $address); + update_term_meta($term_id, 'opening_hour', $opening_hour); + update_term_meta($term_id, 'latitude', $latitude); + update_term_meta($term_id, 'longitude', $longitude); + update_term_meta($term_id, 'url', $url); + update_term_meta($term_id, 'tel', $tel); + update_term_meta($term_id, 'thumbnail', $thumbnail); + + do_action('mec_save_location_extra_fields', $term_id); + } + + /** + * Filter columns of location taxonomy + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_columns($columns) + { + unset($columns['name']); + unset($columns['slug']); + unset($columns['description']); + unset($columns['posts']); + + $columns['id'] = esc_html__('ID', 'modern-events-calendar-lite'); + $columns['name'] = esc_html__('Location', 'modern-events-calendar-lite'); + $columns['address'] = esc_html__('Address', 'modern-events-calendar-lite'); + $columns['posts'] = esc_html__('Count', 'modern-events-calendar-lite'); + $columns['slug'] = esc_html__('Slug', 'modern-events-calendar-lite'); + + return $columns; + } + + /** + * Filter content of location taxonomy columns + * @author Webnus + * @param string $content + * @param string $column_name + * @param int $term_id + * @return string + */ + public function filter_columns_content($content, $column_name, $term_id) + { + switch($column_name) + { + case 'id': + + $content = $term_id; + break; + + case 'address': + + $content = get_metadata('term', $term_id, 'address', true); + break; + + default: + break; + } + + return $content; + } + + /** + * Show location meta box + * @author Webnus + * @param WP_Post|object $post + */ + public function meta_box_location($post) + { + FormBuilder::locations( $post ); + } + + /** + * Save event location data + * @author Webnus + * @param int $post_id + * @return boolean + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return false; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return false; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return false; + + $action = (isset($_POST['action']) ? sanitize_text_field($_POST['action']) : ''); + if($action === 'mec_fes_form') return false; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + // Selected a saved location + if(isset($_mec['location_id']) and $_mec['location_id']) + { + // Set term to the post + wp_set_object_terms($post_id, (int) sanitize_text_field($_mec['location_id']), 'mec_location'); + + return true; + } + + $address = (isset($_mec['location']['address']) and trim($_mec['location']['address'])) ? sanitize_text_field($_mec['location']['address']) : ''; + $opening_hour = (isset($_mec['location']['opening_hour']) and trim($_mec['location']['opening_hour'])) ? sanitize_text_field($_mec['location']['opening_hour']) : ''; + $name = (isset($_mec['location']['name']) and trim($_mec['location']['name'])) ? sanitize_text_field($_mec['location']['name']) : (trim($address) ? $address : esc_html__('Location Name', 'modern-events-calendar-lite')); + + $term = get_term_by('name', $name, 'mec_location'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_location'); + + return true; + } + + $term = wp_insert_term($name, 'mec_location'); + + // An error occurred + if(is_wp_error($term)) return false; + + $location_id = $term['term_id']; + if(!$location_id) return false; + + // Set Location ID to the parameters + $_POST['mec']['location_id'] = $location_id; + + // Set term to the post + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + $latitude = isset($_mec['location']['latitude']) && trim($_mec['location']['latitude']) ? sanitize_text_field($_mec['location']['latitude']) : 0; + $longitude = isset($_mec['location']['longitude']) && trim($_mec['location']['longitude']) ? sanitize_text_field($_mec['location']['longitude']) : 0; + $url = isset($_mec['location']['url']) && trim($_mec['location']['url']) ? sanitize_url($_mec['location']['url']) : ''; + $tel = isset($_mec['location']['tel']) && trim($_mec['location']['tel']) ? sanitize_text_field($_mec['location']['tel']) : ''; + $thumbnail = isset($_mec['location']['thumbnail']) && trim($_mec['location']['thumbnail']) ? sanitize_text_field($_mec['location']['thumbnail']) : ''; + + if((!trim($latitude) or !trim($longitude)) and trim($address)) + { + $geo_point = $this->main->get_lat_lng($address); + + if(isset($geo_point[0]) and trim($geo_point[0])) $latitude = $geo_point[0]; + if(isset($geo_point[1]) and trim($geo_point[1])) $longitude = $geo_point[1]; + } + + update_term_meta($location_id, 'address', $address); + update_term_meta($location_id, 'opening_hour', $opening_hour); + update_term_meta($location_id, 'latitude', $latitude); + update_term_meta($location_id, 'longitude', $longitude); + update_term_meta($location_id, 'url', $url); + update_term_meta($location_id, 'tel', $tel); + update_term_meta($location_id, 'thumbnail', $thumbnail); + + return true; + } +} \ No newline at end of file diff --git a/app/features/login.php b/app/features/login.php new file mode 100755 index 0000000..3eac1c1 --- /dev/null +++ b/app/features/login.php @@ -0,0 +1,73 @@ + + */ +class MEC_feature_login extends MEC_base +{ + public $factory; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + } + + /** + * Initialize search feature + * @author Webnus + */ + public function init() + { + // login form shortcode + $this->factory->shortcode('MEC_login', array($this, 'login')); + + $this->factory->action('wp_ajax_mec_ajax_login_data', array($this, 'mec_ajax_login_data')); + $this->factory->action('wp_ajax_nopriv_mec_ajax_login_data', array($this, 'mec_ajax_login_data')); + } + + public function mec_ajax_login_data() + { + // Check if our nonce is set. + if(!isset($_POST['mec_login_nonce'])) return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_login_nonce']), 'mec-ajax-login-nonce')) return; + + $info = []; + $info['user_login'] = sanitize_text_field($_POST['username']); + $info['user_password'] = sanitize_text_field($_POST['password']); + $info['remember'] = true; + + $user_signon = wp_signon($info, true); // secure_cookie set true. + if(is_wp_error($user_signon)) + { + echo json_encode(array('loggedin'=>false, 'message'=>__(''.esc_html__('Wrong username or password, reloading...', 'modern-events-calendar-lite').''))); + } + else + { + echo json_encode(array('loggedin'=>true, 'message'=>__(''.esc_html__('Login successful, redirecting...', 'modern-events-calendar-lite').''))); + } + + die(); + } + + /** + * Show user login form + * @return string + */ + public function login() + { + $path = MEC::import('app.features.login.login', true, true); + + ob_start(); + include $path; + return ob_get_clean(); + } +} \ No newline at end of file diff --git a/app/features/login/index.html b/app/features/login/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/login/login.php b/app/features/login/login.php new file mode 100755 index 0000000..f875674 --- /dev/null +++ b/app/features/login/login.php @@ -0,0 +1,156 @@ + + +factory->params('footer', function() +{ + ?> + + + */ +class MEC_feature_maintenance extends MEC_base +{ + public $factory; + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Main Library + $this->main = $this->getMain(); + } + + /** + * Initialize maintenance feature + * + * @author Webnus + */ + public function init() + { + $this->factory->action('mec_maintenance', [$this, 'maintenance']); + } + + /** + * MEC Maintenance Jobs + * + * @return void + */ + public function maintenance() + { + // Settings + $settings = $this->main->get_settings(); + + // Trash Interval + $trash_interval = isset($settings['events_trash_interval']) ? (int) $settings['events_trash_interval'] : 0; + + // Do Events Trash + if ($trash_interval) $this->events('trash', $trash_interval); + + // Purge Interval + $purge_interval = isset($settings['events_purge_interval']) ? (int) $settings['events_purge_interval'] : 0; + + // Do Events Purge + if ($purge_interval) $this->events('purge', $purge_interval); + } + + public function events($type, $interval) + { + // Date + $date = date('Y-m-d', strtotime('-' . $interval . ' Days')); + + // DB + $db = $this->getDB(); + + // Events + $event_ids = $db->select("SELECT post_id FROM `#__mec_dates` WHERE `dend` < '" . $date . "' GROUP BY post_id ORDER BY dend DESC", 'loadColumn'); + + // Upcoming Events + $upcoming_events = $this->main->get_upcoming_event_ids(); + + // Trash / Purge + foreach ($event_ids as $event_id) + { + // Event is still ongoing + if (in_array($event_id, $upcoming_events)) continue; + + if ($type === 'trash') wp_trash_post($event_id); + else if ($type === 'purge') wp_delete_post($event_id, true); + } + } +} diff --git a/app/features/mec.php b/app/features/mec.php new file mode 100755 index 0000000..e459d65 --- /dev/null +++ b/app/features/mec.php @@ -0,0 +1,2147 @@ + + */ +class MEC_feature_mec extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_db + */ + public $db; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_notifications + */ + public $notifications; + public $settings; + public $ml_settings; + public $page; + public $PT; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC DB + $this->db = $this->getDB(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC Notifications + $this->notifications = $this->getNotifications(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // MEC Multilingual Settings + $this->ml_settings = $this->main->get_ml_settings(); + } + + /** + * Initialize calendars feature + * @author Webnus + */ + public function init() + { + $this->factory->action('admin_menu', [$this, 'menus']); + $this->factory->action('admin_menu', [$this, 'support_menu'], 21); + $this->factory->action('init', [$this, 'register_post_type']); + $this->factory->action('add_meta_boxes', [$this, 'register_meta_boxes'], 1); + $this->factory->filter('post_row_actions', [$this, 'action_links'], 10, 2); + $this->factory->action('admin_init', [$this, 'duplicate_shortcode']); + + $this->factory->action('parent_file', [$this, 'mec_parent_menu_highlight']); + $this->factory->action('submenu_file', [$this, 'mec_sub_menu_highlight']); + + $this->factory->action('current_screen', [$this, 'booking_badge']); + $this->factory->action('current_screen', [$this, 'events_badge']); + + // Google Maps API + $this->factory->filter('mec_gm_include', [$this, 'gm_include']); + + $this->factory->filter('manage_mec_calendars_posts_columns', [$this, 'filter_columns']); + $this->factory->action('manage_mec_calendars_posts_custom_column', [$this, 'filter_columns_content'], 10, 2); + + $this->factory->action('save_post', [$this, 'save_calendar']); + + // BuddyPress Integration + $this->factory->action('mec_booking_confirmed', [$this->main, 'bp_add_activity']); + $this->factory->action('mec_booking_verified', [$this->main, 'bp_add_activity']); + $this->factory->action('bp_register_activity_actions', [$this->main, 'bp_register_activity_actions']); + $this->factory->action('bp_setup_nav', [$this->main, 'bp_add_profile_menu']); + + // Mailchimp Integration + $this->factory->action('mec_booking_verified', [$this->main, 'mailchimp_add_subscriber']); + + // Campaign Monitor Integration + $this->factory->action('mec_booking_verified', [$this->main, 'campaign_monitor_add_subscriber']); + + // MailerLite Integration + $this->factory->action('mec_booking_verified', [$this->main, 'mailerlite_add_subscriber']); + + // Constant Contact Integration + $this->factory->action('mec_booking_verified', [$this->main, 'constantcontact_add_subscriber']); + + // Active Campaign Integration + $this->factory->action('mec_booking_verified', [$this->main, 'active_campaign_add_subscriber']); + + // AWeber Integration + $this->factory->action('mec_booking_verified', [$this->main, 'aweber_add_subscriber']); + + // MailPoet Integration + $this->factory->action('mec_booking_verified', [$this->main, 'mailpoet_add_subscriber']); + + // Sendfox Integration + $this->factory->action('mec_booking_verified', [$this->main, 'sendfox_add_subscriber']); + + $booking_notification_hook = 'mec_booking_completed'; + if (isset($this->settings['notification_gdpr']) && $this->settings['notification_gdpr']) $booking_notification_hook = 'mec_booking_verified'; + + // MEC Notifications + $this->factory->action('mec_booking_completed', [$this->notifications, 'email_verification']); + $this->factory->action($booking_notification_hook, [$this->notifications, 'booking_notification'], 11); + $this->factory->action('mec_booking_completed', [$this->notifications, 'admin_notification'], 12); + $this->factory->action('mec_booking_confirmed', [$this->notifications, 'booking_confirmation'], 10, 2); + $this->factory->action('mec_booking_canceled', [$this->notifications, 'booking_cancellation'], 12); + $this->factory->action('mec_booking_rejected', [$this->notifications, 'booking_rejection'], 12); + $this->factory->action('mec_fes_added', [$this->notifications, 'new_event'], 50, 2); + $this->factory->action('mec_after_publish_admin_event', [$this->notifications, 'new_event'], 10, 2); + $this->factory->action('mec_event_published', [$this->notifications, 'user_event_publishing'], 10, 3); + $this->factory->action('mec_event_soldout', [$this->notifications, 'event_soldout'], 10, 2); + $this->factory->action('mec_booking_moved_notify', [$this->notifications, 'booking_moved'], 11); + + $this->page = isset($_GET['page']) ? sanitize_text_field($_GET['page']) : 'MEC-settings'; + + // MEC Post Type Name + $this->PT = $this->main->get_main_post_type(); + + // Disable Block Editor + $gutenberg_status = (!isset($this->settings['gutenberg']) || (isset($this->settings['gutenberg']) && $this->settings['gutenberg'])); + if ($gutenberg_status) + { + $this->factory->filter('gutenberg_can_edit_post_type', [$this, 'gutenberg'], 10, 2); + $this->factory->filter('use_block_editor_for_post_type', [$this, 'gutenberg'], 10, 2); + } + + // Export Settings + $this->factory->action('wp_ajax_download_settings', [$this, 'download_settings']); + + // Import Settings + $this->factory->action('wp_ajax_import_settings', [$this, 'import_settings']); + + // License Activation + $this->factory->action('wp_ajax_activate_license', [$this, 'activate_license']); + $this->factory->action('wp_ajax_revoke_license', [$this, 'revoke_license']); + + // Close Notification + $this->factory->action('wp_ajax_close_notification', [$this, 'close_notification']); + + // Close Custom Text Notification + $this->factory->action('wp_ajax_close_cmsg_notification', [$this, 'close_cmsg_notification']); + $this->factory->action('wp_ajax_close_cmsg_2_notification', [$this, 'close_cmsg_2_notification']); + + // Occurrences Dropdown + $this->factory->action('wp_ajax_mec_occurrences_dropdown', [$this, 'dropdown']); + + // Scheduler Cronjob + $schedule = $this->getSchedule(); + $this->factory->action('mec_scheduler', [$schedule, 'cron']); + + $syncSchedule = $this->getSyncSchedule(); + $this->factory->action('mec_syncScheduler', [$syncSchedule, 'sync']); + + // Dashboard Metaboxes + $this->factory->action('wp_dashboard_setup', [$this, 'dashboard_widgets']); + + // Dashboard Metabox Total Booking ajax + $this->factory->action('wp_ajax_total-booking-get-reports', [$this, 'dashboard_widget_total_booking_ajax_handler']); + + // Custom Capability Map + if (is_admin()) $this->factory->filter('map_meta_cap', [$this, 'map_meta_cap'], 10, 4); + + // Protected Content Shortcode + if ($this->getPRO()) $this->factory->shortcode('mec-only-booked-users', [$this, 'only_booked_users_content']); + + // Assets Per Page + if (!function_exists('is_plugin_active')) include_once ABSPATH . 'wp-admin/includes/plugin.php'; + + $this->factory->filter('mec_include_frontend_assets', [$this, 'assets_per_page']); + + if (isset($this->settings['assets_per_page_status']) and $this->settings['assets_per_page_status']) + { + $this->factory->action('add_meta_boxes', [$this, 'register_assets_per_page_meta_boxes'], 1); + $this->factory->action('save_post', [$this, 'assets_per_page_save_page'], 10, 2); + } + + // SEO Title + $this->factory->filter('pre_get_document_title', [$this, 'page_title'], 1000); + + // Event Latest Event Date Time + $this->factory->action('mec_save_event_data', function () + { + update_option('mec_latest_event_datetime', current_time('YmdHis'), false); + }); + + // Kses + MEC::import('app.libraries.kses'); + + $this->factory->filter('mec_kses_tags', ['MEC_kses', 'tags'], 10, 2); + $this->factory->filter('safe_style_css', ['MEC_kses', 'styles']); + + // Upload + $this->factory->filter('upload_mimes', [$this, 'upload_mimes']); + + // Download Debug Log File + $this->factory->action('admin_init', [$this, 'download_debug_log_file']); + + // Database Setup + $this->factory->action('wp_ajax_mec_maintenance_reinstall', [$this, 'rerun_sql']); + } + + /* Activate License */ + public function activate_license() + { + if ($this->getPRO()) + { + // Current User is not Permitted + if (!current_user_can('manage_options')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + $options = get_option('mec_options'); + $options['product_name'] = sanitize_text_field($_REQUEST['content']['LicenseTypeJson']); + $options['purchase_code'] = sanitize_text_field($_REQUEST['content']['PurchaseCodeJson']); + $payload = []; + + $verify = $this->plugin_activation_request($options); + + if ($verify && isset($verify->item_link)) + { + $payload['message'] = esc_html__('success'); + $payload['status'] = true; + $payload['button_text'] = esc_html__('revoke', 'modern-events-calendar-lite'); + update_option('mec_license_status', 'active'); + $options['product_id'] = $verify->item_id; + } + else + { + $payload['message'] = esc_html__('Activation failed'); + $payload['status'] = false; + $payload['button_text'] = esc_html__('submit', 'modern-events-calendar-lite'); + update_option('mec_license_status', 'faild'); + } + + update_option('mec_options', $options); + $payload = json_encode($payload); + echo MEC_kses::element($payload); + wp_die(); + } + } + + public function revoke_license() + { + if ($this->getPRO()) + { + $options = get_option('mec_options'); + $options['product_name'] = ''; + $options['purchase_code'] = ''; + $options['product_id'] = ''; + update_option('mec_options', $options); + + $payload = json_encode(['message' => 'revoked', 'status' => true, 'button_text' => esc_html__('submit', 'modern-events-calendar-lite')]); + echo MEC_kses::element($payload); + wp_die(); + } + } + + // MEC activation request + public function plugin_activation_request($options) + { + $code = $options['purchase_code']; + if (empty($code)) return false; + + $product_name = $options['product_name']; + $item_id = $options['product_id']; + $url = get_home_url(); + $verify_url = MEC_API_ACTIVATION . '/activation/verify?category=mec&license=' . $code . '&url=' . $url . '&item_id=' . $item_id; + + $JSON = wp_remote_retrieve_body(wp_remote_get($verify_url, [ + 'body' => null, + 'timeout' => '120', + 'redirection' => '10', + 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', + ])); + + if ($JSON != '') + { + $data = json_decode($JSON); + return $data; + } + else return false; + } + + /* Download MEC settings */ + public function download_settings() + { + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_download')) + { + exit(); + } + + $content = get_option('mec_options'); + $content = json_encode($content, true); + + header('Content-type: application/txt'); + header('Content-Description: MEC Settings'); + header('Content-Disposition: attachment; filename="mec_options_backup_' . date('d-m-Y') . '.json"'); + header('Content-Transfer-Encoding: binary'); + header('Expires: 0'); + header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); + print_r($content); + wp_die(); + } + + /* Close addons notification */ + public function close_notification() + { + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + update_option('mec_addons_notification_option', 'open'); + wp_die(); + } + + /* Close addons notification */ + public function close_cmsg_2_notification() + { + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + update_option('mec_custom_msg_2_close_option', 'open'); + wp_die(); + } + + /* Close addons notification */ + public function close_cmsg_notification() + { + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + update_option('mec_custom_msg_close_option', 'open'); + wp_die(); + } + + /* Import MEC settings */ + public function import_settings() + { + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->main->response(['success' => 0, 'code' => 'ADMIN_ONLY']); + if (!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + $options = $this->main->sanitize_deep_array($_REQUEST['content']); + if ($options == 'No-JSON') + { + echo '
        ' . esc_html__('Your option is not in JSON format. Please insert correct options in this field and try again.', 'modern-events-calendar-lite') . '
        '; + exit(); + } + else + { + if (empty($options)) + { + echo '
        ' . esc_html__('Your options field can not be empty!', 'modern-events-calendar-lite') . '
        '; + exit; + } + else + { + update_option('mec_options', $options); + echo '
        ' . esc_html__('Your options imported successfuly.', 'modern-events-calendar-lite') . '
        '; + } + } + + wp_die(); + } + + /** + * highlighting menu when click on taxonomy + * @param string $parent_file + * @return string + * @author Webnus + */ + public function mec_parent_menu_highlight($parent_file) + { + global $current_screen; + + $taxonomy = $current_screen->taxonomy; + $post_type = $current_screen->post_type; + + // Don't do amything if the post type is not our post type + if (!in_array($post_type, [ + $this->PT, + $this->main->get_email_post_type(), + $this->main->get_certificate_post_type(), + ])) return $parent_file; + + // Other Post Types + if ($post_type === $this->main->get_email_post_type()) return 'mec-intro'; + if ($post_type === $this->main->get_certificate_post_type()) return 'mec-intro'; + + // Tag Taxonomy + $tag_taxonomy = apply_filters('mec_taxonomy_tag', ''); + + switch ($taxonomy) + { + case 'mec_category': + case $tag_taxonomy: + case 'mec_label': + case 'mec_location': + case 'mec_organizer': + case 'mec_speaker': + case 'mec_sponsor': + + $parent_file = 'mec-intro'; + break; + + default: + //nothing + break; + } + + return $parent_file; + } + + public function mec_sub_menu_highlight($submenu_file) + { + global $current_screen; + + $taxonomy = $current_screen->taxonomy; + $post_type = $current_screen->post_type; + + // Don't do amything if the post type is not our post type + if (!in_array($post_type, [ + $this->PT, + $this->main->get_email_post_type(), + $this->main->get_certificate_post_type(), + ])) return $submenu_file; + + // Other Post Types + if ($post_type === $this->main->get_email_post_type()) return 'edit.php?post_type=' . $post_type; + if ($post_type === $this->main->get_certificate_post_type()) return 'edit.php?post_type=' . $post_type; + + // Tag Taxonomy + $tag_taxonomy = apply_filters('mec_taxonomy_tag', ''); + + switch ($taxonomy) + { + case 'mec_category': + + $submenu_file = 'edit-tags.php?taxonomy=mec_category&post_type=' . $this->PT; + break; + case $tag_taxonomy: + + $submenu_file = 'edit-tags.php?taxonomy=' . $tag_taxonomy . '&post_type=' . $this->PT; + break; + case 'mec_label': + + $submenu_file = 'edit-tags.php?taxonomy=mec_label&post_type=' . $this->PT; + break; + case 'mec_location': + + $submenu_file = 'edit-tags.php?taxonomy=mec_location&post_type=' . $this->PT; + break; + case 'mec_organizer': + + $submenu_file = 'edit-tags.php?taxonomy=mec_organizer&post_type=' . $this->PT; + break; + case 'mec_speaker': + + $submenu_file = 'edit-tags.php?taxonomy=mec_speaker&post_type=' . $this->PT; + break; + case 'mec_sponsor': + + $submenu_file = 'edit-tags.php?taxonomy=mec_sponsor&post_type=' . $this->PT; + break; + default: + //nothing + break; + } + + return $submenu_file; + } + + /** + * Add the support menu + * @author Webnus + */ + public function support_menu() + { + add_submenu_page('mec-intro', esc_html__('MEC - Support', 'modern-events-calendar-lite'), esc_html__('Support', 'modern-events-calendar-lite'), 'manage_options', 'MEC-support', [$this, 'support_page']); + } + + /** + * Add the calendars menu + * @author Webnus + */ + public function menus() + { + global $submenu; + unset($submenu['mec-intro'][2]); + + remove_menu_page('edit.php?post_type=mec-events'); + remove_menu_page('edit.php?post_type=mec_calendars'); + do_action('before_mec_submenu_action'); + + add_submenu_page('mec-intro', esc_html__('Add Event', 'modern-events-calendar-lite'), esc_html__('Add Event', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', 'edit_posts', 'add_event'), 'post-new.php?post_type=' . $this->PT); + add_submenu_page('mec-intro', esc_html__('Tags', 'modern-events-calendar-lite'), esc_html__('Tags', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', 'edit_others_posts', 'tags'), 'edit-tags.php?taxonomy=' . apply_filters('mec_taxonomy_tag', '') . '&post_type=' . $this->PT); + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_categories', esc_html__('Categories', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_categories', esc_html__('Categories', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'categories'), 'edit-tags.php?taxonomy=mec_category&post_type=' . $this->PT); + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_labels', esc_html__('Labels', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'labels'), 'edit-tags.php?taxonomy=mec_label&post_type=' . $this->PT); + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_locations', esc_html__('Locations', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_locations', esc_html__('Locations', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'locations'), 'edit-tags.php?taxonomy=mec_location&post_type=' . $this->PT); + + // Organizers Menu + if (!isset($this->settings['organizers_status']) || $this->settings['organizers_status']) + { + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_organizers', esc_html__('Organizers', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_organizers', esc_html__('Organizers', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'organizers'), 'edit-tags.php?taxonomy=mec_organizer&post_type=' . $this->PT); + } + + // Speakers Menu + if (isset($this->settings['speakers_status']) and $this->settings['speakers_status']) + { + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_speakers', esc_html__('Speakers', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_speakers', esc_html__('Speakers', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'speakers'), 'edit-tags.php?taxonomy=mec_speaker&post_type=' . $this->PT); + } + + // Sponsors Menu + if ($this->getPRO() and isset($this->settings['sponsors_status']) and $this->settings['sponsors_status']) + { + add_submenu_page('mec-intro', esc_html($this->main->m('taxonomy_sponsors', esc_html__('Sponsors', 'modern-events-calendar-lite'))), esc_html($this->main->m('taxonomy_sponsors', esc_html__('Sponsors', 'modern-events-calendar-lite'))), apply_filters('mec_menu_cap', 'edit_others_posts', 'sponsors'), 'edit-tags.php?taxonomy=mec_sponsor&post_type=' . $this->PT); + } + + $capability = current_user_can('administrator') ? 'manage_options' : 'mec_shortcodes'; + $capability = apply_filters('mec_menu_cap', $capability, 'shortcodes'); + add_submenu_page('mec-intro', esc_html__('Shortcodes', 'modern-events-calendar-lite'), esc_html__('Shortcodes', 'modern-events-calendar-lite'), $capability, 'edit.php?post_type=mec_calendars'); + + // Auto Email Menu + if ($this->getPRO() and isset($this->settings['auto_emails_module_status']) and $this->settings['auto_emails_module_status']) + { + $capability = apply_filters('mec_menu_cap', 'manage_options', 'emails'); + add_submenu_page('mec-intro', esc_html__('Emails', 'modern-events-calendar-lite'), esc_html__('Emails', 'modern-events-calendar-lite'), $capability, 'edit.php?post_type=mec-emails'); + } + + // Certificates Menu + if ($this->getPRO() and isset($this->settings['certificate_status']) and $this->settings['certificate_status']) + { + $capability = apply_filters('mec_menu_cap', 'manage_options', 'certificate'); + add_submenu_page('mec-intro', esc_html__('Certificates', 'modern-events-calendar-lite'), esc_html__('Certificates', 'modern-events-calendar-lite'), $capability, 'edit.php?post_type=' . $this->main->get_certificate_post_type()); + } + + // Webhooks Menu + if (isset($this->settings['webhooks_status']) and $this->settings['webhooks_status']) + { + $capability = apply_filters('mec_menu_cap', 'manage_options', 'webhooks'); + add_submenu_page('mec-intro', esc_html__('Webhooks', 'modern-events-calendar-lite'), esc_html__('Webhooks', 'modern-events-calendar-lite'), $capability, 'edit.php?post_type=mec-webhooks'); + } + + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_settings'); + add_submenu_page('mec-intro', esc_html__('MEC - Settings', 'modern-events-calendar-lite'), esc_html__('Settings', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', $capability, 'settings'), 'MEC-settings', [$this, 'page']); + + add_submenu_page('mec-intro', esc_html__('MEC - Addons', 'modern-events-calendar-lite'), esc_html__('Addons', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', 'manage_options', 'addons'), 'MEC-addons', [$this, 'addons']); + add_submenu_page('mec-intro', esc_html__('MEC - Wizard', 'modern-events-calendar-lite'), esc_html__('Wizard', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', 'manage_options', 'wizard'), 'MEC-wizard', [$this, 'setup_wizard']); + + if (!$this->getPRO()) add_submenu_page('mec-intro', esc_html__('MEC - Go Pro', 'modern-events-calendar-lite'), esc_html__('Go Pro', 'modern-events-calendar-lite'), apply_filters('mec_menu_cap', 'manage_options', 'go_pro'), 'MEC-go-pro', [$this, 'go_pro']); + do_action('after_mec_submenu_action'); + } + + /** + * Get Wizard page + * @return void + * @author Webnus + */ + public function setup_wizard() + { + $this->display_wizard(); + } + + /** + * Show Wizard page + * @return void + * @author Webnus + */ + public function display_wizard() + { + $path = MEC::import('app.features.mec.wizard', true, true); + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Register post type of calendars/custom shortcodes + * @author Webnus + * + */ + public function register_post_type() + { + $elementor = class_exists('MEC_Shortcode_Builder') && did_action('elementor/loaded') ? true : false; + + register_post_type('mec_calendars', + [ + 'labels' => [ + 'name' => __('Shortcodes', 'modern-events-calendar-lite'), + 'singular_name' => __('Shortcode', 'modern-events-calendar-lite'), + 'add_new' => __('Add Shortcode', 'modern-events-calendar-lite'), + 'add_new_item' => __('Add New Shortcode', 'modern-events-calendar-lite'), + 'not_found' => __('No shortcodes found!', 'modern-events-calendar-lite'), + 'all_items' => __('All Shortcodes', 'modern-events-calendar-lite'), + 'edit_item' => __('Edit shortcodes', 'modern-events-calendar-lite'), + 'not_found_in_trash' => __('No shortcodes found in Trash!', 'modern-events-calendar-lite'), + ], + 'public' => $elementor, + 'show_in_nav_menus' => false, + 'show_in_admin_bar' => $elementor, + 'show_ui' => true, + 'has_archive' => false, + 'exclude_from_search' => true, + 'publicly_queryable' => $elementor, + 'show_in_menu' => 'mec-intro', + 'supports' => ['title'], + ] + ); + + do_action('mec_register_post_type'); + } + + /** + * Filter columns of calendars/custom shortcodes + * @param array $columns + * @return array + * @author Webnus + */ + public function filter_columns($columns) + { + $columns['shortcode'] = esc_html__('Shortcode', 'modern-events-calendar-lite'); + return $columns; + } + + /** + * Filter column content of calendars/custom shortcodes + * @param string $column_name + * @param int $post_id + * @author Webnus + */ + public function filter_columns_content($column_name, $post_id) + { + if ($column_name == 'shortcode') + { + echo '[MEC id="' . $post_id . '"]'; + } + } + + /** + * Register meta boxes of calendars/custom shortcodes + * @author Webnus + */ + public function register_meta_boxes() + { + // Fix conflict between Ultimate GDPR and niceSelect + $screen = get_current_screen(); + if ($screen->id == 'mec_calendars') remove_all_actions('acf/input/admin_head'); + + add_meta_box('mec_calendar_display_options', esc_html__('Display Options', 'modern-events-calendar-lite'), [$this, 'meta_box_display_options'], 'mec_calendars', 'normal', 'high'); + add_meta_box('mec_calendar_filter', esc_html__('Filter Options', 'modern-events-calendar-lite'), [$this, 'meta_box_filter'], 'mec_calendars', 'normal', 'high'); + add_meta_box('mec_calendar_shortcode', esc_html__('Shortcode', 'modern-events-calendar-lite'), [$this, 'meta_box_shortcode'], 'mec_calendars', 'side'); + add_meta_box('mec_calendar_search_form', esc_html__('Search Form', 'modern-events-calendar-lite'), [$this, 'meta_box_search_form'], 'mec_calendars', 'side'); + add_meta_box('mec_calendar_icons', esc_html__('Icon Options', 'modern-events-calendar-lite'), [$this, 'meta_box_icons'], 'mec_calendars', 'normal', 'low'); + } + + public function action_links($actions, $post) + { + if ($post->post_type != 'mec_calendars') return $actions; + + // Editor and Higher + if (current_user_can('edit_post', $post->ID)) + { + // Duplicate Button + $actions['mec-duplicate'] = '' . esc_html__('Duplicate', 'modern-events-calendar-lite') . ''; + } + + return $actions; + } + + public function duplicate_shortcode() + { + // It's not a duplicate request + if (!isset($_GET['mec-action']) or (isset($_GET['mec-action']) and sanitize_text_field($_GET['mec-action']) != 'duplicate-shortcode')) return false; + + // Shortcode ID to duplicate + $id = isset($_GET['id']) ? (int) sanitize_text_field($_GET['id']) : 0; + if (!$id) return false; + + // Only editor and higher + if (!current_user_can('edit_post', $id)) return false; + + // Duplicate Shortcode + $new_post_id = $this->main->duplicate_post($id); + + wp_redirect('post.php?post=' . $new_post_id . '&action=edit'); + exit; + } + + /** + * Save calendars/custom shortcodes + * @param int $post_id + * @return void + * @author Webnus + */ + public function save_calendar($post_id) + { + // Check if our nonce is set. + if (!isset($_POST['mec_calendar_nonce'])) return; + + // Verify that the nonce is valid. + if (!wp_verify_nonce(sanitize_text_field($_POST['mec_calendar_nonce']), 'mec_calendar_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if (defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + $terms = isset($_POST['mec_tax_input']) ? $this->main->sanitize_deep_array($_POST['mec_tax_input']) : []; + + $categories_arr = (isset($terms['mec_category']) and is_array($terms['mec_category'])) ? $terms['mec_category'] : []; + $ex_categories_arr = (isset($terms['mec_ex_category']) and is_array($terms['mec_ex_category'])) ? $terms['mec_ex_category'] : []; + foreach ($ex_categories_arr as $ex_category) + { + $f = array_search($ex_category, $categories_arr); + if (is_numeric($f)) unset($categories_arr[$f]); + } + + $categories = sanitize_text_field(implode(',', $categories_arr)); + $ex_categories = sanitize_text_field(implode(',', $ex_categories_arr)); + + $locations_arr = (isset($terms['mec_location']) and is_array($terms['mec_location'])) ? $terms['mec_location'] : []; + $ex_locations_arr = (isset($terms['mec_ex_location']) and is_array($terms['mec_ex_location'])) ? $terms['mec_ex_location'] : []; + foreach ($ex_locations_arr as $ex_location) + { + $f = array_search($ex_location, $locations_arr); + if (is_numeric($f)) unset($locations_arr[$f]); + } + + $locations = sanitize_text_field(implode(',', $locations_arr)); + $ex_locations = sanitize_text_field(implode(',', $ex_locations_arr)); + + $organizers_arr = (isset($terms['mec_organizer']) and is_array($terms['mec_organizer'])) ? $terms['mec_organizer'] : []; + $ex_organizers_arr = (isset($terms['mec_ex_organizer']) and is_array($terms['mec_ex_organizer'])) ? $terms['mec_ex_organizer'] : []; + foreach ($ex_organizers_arr as $ex_organizer) + { + $f = array_search($ex_organizer, $organizers_arr); + if (is_numeric($f)) unset($organizers_arr[$f]); + } + + $organizers = sanitize_text_field(implode(',', $organizers_arr)); + $ex_organizers = sanitize_text_field(implode(',', $ex_organizers_arr)); + + $sponsors = (isset($terms['mec_sponsor']) and is_array($terms['mec_sponsor'])) ? sanitize_text_field(implode(',', $terms['mec_sponsor'])) : ''; + + $labels_arr = (isset($terms['mec_label']) and is_array($terms['mec_label'])) ? $terms['mec_label'] : []; + $ex_labels_arr = (isset($terms['mec_ex_labels']) and is_array($terms['mec_ex_labels'])) ? $terms['mec_ex_labels'] : []; + foreach ($ex_labels_arr as $ex_label) + { + $f = array_search($ex_label, $labels_arr); + if (is_numeric($f)) unset($labels_arr[$f]); + } + + $labels = sanitize_text_field(implode(',', $labels_arr)); + $ex_labels = sanitize_text_field(implode(',', $ex_labels_arr)); + + $tags = isset($terms['mec_tag']) && is_array($terms['mec_tag']) ? $terms['mec_tag'] : []; + $ex_tags = isset($terms['mec_ex_tags']) && is_array($terms['mec_ex_tags']) ? $terms['mec_ex_tags'] : []; + + $authors_arr = (isset($terms['mec_author']) and is_array($terms['mec_author'])) ? $terms['mec_author'] : []; + $ex_authors_arr = (isset($terms['mec_ex_authors']) and is_array($terms['mec_ex_authors'])) ? $terms['mec_ex_authors'] : []; + + foreach ($ex_authors_arr as $ex_author) + { + $f = array_search($ex_author, $authors_arr); + if (is_numeric($f)) unset($authors_arr[$f]); + } + + $authors = sanitize_text_field(implode(',', $authors_arr)); + $ex_authors = sanitize_text_field(implode(',', $ex_authors_arr)); + + // Fix tags + if (is_array($tags) and count($tags) == 1 and trim($tags[0]) == '') $tags = []; + if (is_array($tags)) + { + $tags = array_map('trim', $tags); + $tags = implode(',', $tags); + } + + // Fix Ex tags + if (is_array($ex_tags) and count($ex_tags) == 1 and trim($ex_tags[0]) == '') $ex_tags = []; + if (is_array($ex_tags)) + { + $ex_tags = array_map('trim', $ex_tags); + $ex_tags = implode(',', $ex_tags); + } + + update_post_meta($post_id, 'label', $labels); + update_post_meta($post_id, 'ex_label', $ex_labels); + update_post_meta($post_id, 'category', $categories); + update_post_meta($post_id, 'ex_category', $ex_categories); + update_post_meta($post_id, 'location', $locations); + update_post_meta($post_id, 'ex_location', $ex_locations); + update_post_meta($post_id, 'organizer', $organizers); + update_post_meta($post_id, 'ex_organizer', $ex_organizers); + update_post_meta($post_id, 'sponsor', $sponsors); + update_post_meta($post_id, 'tag', $tags); + update_post_meta($post_id, 'ex_tag', $ex_tags); + update_post_meta($post_id, 'author', $authors); + update_post_meta($post_id, 'ex_author', $ex_authors); + + do_action('mec_shortcode_filters_save', $post_id, $terms); + + $mec = (isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []); + + // Icons + $icons = isset($mec['icons']) && is_array($mec['icons']) ? $mec['icons'] : []; + update_post_meta($post_id, 'mec_icons', $icons); + + $skin = (isset($mec['skin']) ? sanitize_text_field($mec['skin']) : ''); + $start_date_type = ((isset($mec['sk-options'][$skin]) and isset($mec['sk-options'][$skin]['start_date_type'])) ? sanitize_text_field($mec['sk-options'][$skin]['start_date_type']) : 'today'); + $end_date_type = ((isset($mec['sk-options'][$skin]) and isset($mec['sk-options'][$skin]['end_date_type'])) ? sanitize_text_field($mec['sk-options'][$skin]['end_date_type']) : 'date'); + + $ongoing = ((isset($mec['show_only_ongoing_events']) and $mec['show_only_ongoing_events']) ? 1 : 0); + + // Set start date to Today because of showing ongoing events + if ($ongoing and in_array($skin, ['list', 'grid', 'agenda', 'timeline'])) $mec['sk-options'][$skin]['start_date_type'] = 'today'; + // Enable "Show Past Events" option since the start date is past + else if (in_array($start_date_type, ['yesterday', 'start_last_year', 'start_last_month', 'start_last_week'])) $mec['show_past_events'] = 1; + + // Set date filter type to dropdown because of skin + if (!in_array($skin, ['list', 'grid', 'agenda', 'timeline', 'map', 'custom']) and $mec['sf-options'][$skin]['month_filter']['type'] == 'date-range-picker') $mec['sf-options'][$skin]['month_filter']['type'] = 'dropdown'; + + // Enable Descending Order + if ($start_date_type === 'date' and $end_date_type === 'date' and isset($mec['sk-options'][$skin]) and isset($mec['sk-options'][$skin]['start_date']) and isset($mec['sk-options'][$skin]['maximum_date_range']) and trim($mec['sk-options'][$skin]['start_date']) and trim($mec['sk-options'][$skin]['maximum_date_range']) and strtotime($mec['sk-options'][$skin]['start_date']) > strtotime($mec['sk-options'][$skin]['maximum_date_range'])) $mec['sk-options'][$skin]['order_method'] = 'DESC'; + + foreach ($mec as $key => $value) update_post_meta($post_id, $key, $value); + } + + /** + * Show content of filter meta box + * @param object $post + * @author Webnus + */ + public function meta_box_filter($post) + { + $path = MEC::import('app.features.mec.meta_boxes.filter', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of shortcode meta box + * @param object $post + * @author Webnus + */ + public function meta_box_shortcode($post) + { + $path = MEC::import('app.features.mec.meta_boxes.shortcode', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of search form meta box + * @param object $post + * @author Webnus + */ + public function meta_box_search_form($post) + { + $path = MEC::import('app.features.mec.meta_boxes.search_form', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of display options meta box + * @param object $post + * @author Webnus + */ + public function meta_box_display_options($post) + { + $path = MEC::import('app.features.mec.meta_boxes.display_options', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of skin options meta box + * @param object $post + * @author Webnus + */ + public function meta_box_skin_options($post) + { + $path = MEC::import('app.features.mec.meta_boxes.skin_options', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of icons meta box + * @param object $post + * @author Webnus + */ + public function meta_box_icons($post) + { + $path = MEC::import('app.features.mec.meta_boxes.icons', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Get Addons page + * @return void + * @author Webnus + */ + public function go_pro() + { + $this->display_go_pro(); + } + + /** + * Show go_pro page + * @return void + * @author Webnus + */ + public function display_go_pro() + { + $path = MEC::import('app.features.mec.go-pro', true, true); + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Get Addons page + * @return void + * @author Webnus + */ + public function addons() + { + $this->display_addons(); + } + + /** + * Show Addons page + * @return void + * @author Webnus + */ + public function display_addons() + { + $path = MEC::import('app.features.mec.addons', true, true); + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show support page + * @return void + * @author Webnus + */ + public function display_support() + { + $path = MEC::import('app.features.mec.support-page', true, true); + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * support page + * @return void + * @author Webnus + */ + public function support_page() + { + $this->display_support(); + } + + /** + * Show content settings menu + * @return void + * @author Webnus + */ + public function page() + { + $tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'MEC-settings'; + + if ($tab == 'MEC-customcss') $this->styles(); + else if ($tab == 'MEC-ie') $this->import_export(); + else if ($tab == 'MEC-notifications') $this->notifications(); + else if ($tab == 'MEC-messages') $this->messages(); + else if ($tab == 'MEC-styling') $this->styling(); + else if ($tab == 'MEC-single') $this->single(); + else if ($tab == 'MEC-fes') $this->fes(); + else if ($tab == 'MEC-booking') $this->booking(); + else if ($tab == 'MEC-modules') $this->modules(); + else if ($tab == 'MEC-integrations') $this->integrations(); + else if (apply_filters('mec_is_custom_settings', false, $tab)) + { + do_action('mec_display_settings_page', $tab); + } + else $this->settings(); + } + + /** + * Show content of settings tab + * @return void + * @author Webnus + */ + public function settings() + { + $path = MEC::import('app.features.mec.settings', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of styles tab + * @return void + * @author Webnus + */ + public function styles() + { + $path = MEC::import('app.features.mec.styles', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of styling tab + * @return void + * @author Webnus + */ + public function styling() + { + $path = MEC::import('app.features.mec.styling', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of single tab + * @return void + * @author Webnus + */ + public function single() + { + $path = MEC::import('app.features.mec.single', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of Frontend Event Submission tab + * @return void + * @author Webnus + */ + public function fes() + { + $path = MEC::import('app.features.mec.fes', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of booking tab + * @return void + * @author Webnus + */ + public function booking() + { + $path = MEC::import('app.features.mec.booking', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of modules tab + * @return void + * @author Webnus + */ + public function modules() + { + $path = MEC::import('app.features.mec.modules', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of import/export tab + * @return void + * @author Webnus + */ + public function import_export() + { + $path = MEC::import('app.features.mec.ie', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of notifications tab + * @return void + * @author Webnus + */ + public function notifications() + { + $path = MEC::import('app.features.mec.notifications', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of messages tab + * @return void + * @author Webnus + */ + public function messages() + { + $path = MEC::import('app.features.mec.messages', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Show content of integrations tab + * @return void + * @author Webnus + */ + public function integrations() + { + $path = MEC::import('app.features.mec.integrations', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Whether to include google map library + * @param boolean $gm_include + * @return boolean + * @author Webnus + */ + public function gm_include($gm_include) + { + // Don't include the library if google Maps API is set to don't load + if (isset($this->settings['google_maps_dont_load_api']) and $this->settings['google_maps_dont_load_api']) return false; + + return $gm_include; + } + + /** + * Single Event Display Method + * @param string $skin + * @param int $value + * @param int $image_popup + * @return string + */ + public function sed_method_field($skin, $value = 0, $image_popup = 0) + { + $image_popup_html = '
        +
        + +
        +
        + + +
        +
        '; + + return '' . MEC_kses::form($image_popup_html); + } + + public function order_method_field($skin, $value = 'ASC', $key = 'order_method') + { + return '
        +
        + +
        +
        + + + +
        +
        ' . esc_html__('Descending Order', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to sort events in descending order.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function booking_button_field($skin, $value = 0) + { + $booking_status = (!isset($this->settings['booking_status']) or (isset($this->settings['booking_status']) and !$this->settings['booking_status'])) ? false : true; + if (!$booking_status) return ''; + + return '
        +
        + +
        +
        + + + +
        +
        ' . esc_html__('Booking Button / Icon', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to display booking button / icon in this shortcode.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function display_organizer_field($skin, $value = 0) + { + return '
        +
        + +
        +
        + + + +
        +
        ' . esc_html__('Display Organizers', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to display events organizers in this shortcode.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function display_custom_data_field($skin, $value = 0) + { + return '
        +
        + +
        +
        + + + +
        +
        ' . esc_html__('Display Custom Fields', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to display events custom data in this shortcode.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function display_pagination_field($skin, $options = []) + { + $value = isset($options['pagination']) ? (string) $options['pagination'] : ''; + + // Legacy Option + if (trim($value) === '' and isset($options['load_more_button'])) $value = $options['load_more_button'] ? 'loadmore' : '0'; + + return '
        +
        + +
        +
        + +
        +
        '; + } + + public function display_price_field($skin, $value = 0) + { + return ($skin === 'full_calendar' ? '

        ' . esc_html__("The price shows in List View and Tile View.", 'modern-events-calendar-lite') . '

        ' : '') . ' +
        +
        + +
        +
        + + + + +
        +
        ' . esc_html__('Display Event Price', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to display events price in this shortcode.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function display_status_bar_field($skin, $value = 0) + { + return '
        +
        + +
        +
        + + + +
        +
        ' . esc_html__('Display Organizers', 'modern-events-calendar-lite') . '
        +

        ' . esc_html__('Enable this option to display the status bar in this shortcode.', 'modern-events-calendar-lite') . '

        +
        + +
        +
        +
        '; + } + + public function display_progress_bar_field($skin, $value) + { + // Module is not enabled + if (!isset($this->settings['progress_bar_status']) or (isset($this->settings['progress_bar_status']) and !$this->settings['progress_bar_status'])) return ''; + + return '
        +
        + +
        +
        + + + +
        +
        '; + } + + public function display_detailed_time_field($skin, $value = 0) + { + return '
        +
        + + ' . esc_html__('For Multiple Day Events', 'modern-events-calendar-lite') . ' +
        +
        + + +
        +
        '; + } + + /** + * Disable Gutenberg Editor for MEC Post Types + * @param boolean $status + * @param string $post_type + * @return bool + */ + public function gutenberg($status, $post_type) + { + if (in_array($post_type, [$this->PT, $this->main->get_book_post_type(), $this->main->get_shortcode_post_type()])) return false; + return $status; + } + + /** + * Show Booking Badge. + * @param object $screen + * @return void + */ + public function booking_badge($screen) + { + $user_id = get_current_user_id(); + $user_last_view_date = get_user_meta($user_id, 'user_last_view_date', true); + + if (!trim($user_last_view_date)) + { + update_user_meta($user_id, 'user_last_view_date', date('YmdHis', current_time('timestamp', 0))); + return; + } + + $latest_booking_datetime = get_option('mec_latest_booking_datetime'); + if ($latest_booking_datetime and (int) $latest_booking_datetime <= (int) $user_last_view_date) return; + + $args = [ + 'post_type' => $this->main->get_book_post_type(), + 'post_status' => 'any', + 'meta_query' => [ + [ + 'key' => 'mec_book_date_submit', + 'value' => $user_last_view_date, + 'compare' => '>=', + ], + ], + ]; + + $count = 0; + $query = new WP_Query($args); + if ($query->have_posts()) + { + while ($query->have_posts()) + { + $query->the_post(); + $count += 1; + } + } + + wp_reset_postdata(); + + if ($count != 0) + { + // Append Booking Badge To Booking Menu. + global $menu; + + $badge = ' %%count%%'; + $menu_item = wp_list_filter($menu, [2 => 'edit.php?post_type=' . $this->main->get_book_post_type()]); + if (is_array($menu_item) and count($menu_item)) + { + $menu[key($menu_item)][0] .= str_replace('%%count%%', esc_attr($count), $badge); + } + } + + if (isset($screen->id) and $screen->id == 'edit-mec-books') + { + update_user_meta($user_id, 'user_last_view_date', date('YmdHis', current_time('timestamp', 0))); + return; + } + } + + /** + * Show Events Badge. + * @param object $screen + * @return void + */ + public function events_badge($screen) + { + if (!current_user_can('administrator') and !current_user_can('editor')) return; + + $user_id = get_current_user_id(); + $user_last_view_date_events = get_user_meta($user_id, 'user_last_view_date_events', true); + + if (!trim($user_last_view_date_events)) + { + update_user_meta($user_id, 'user_last_view_date_events', date('YmdHis', current_time('timestamp', 0))); + return; + } + + $latest_event_datetime = get_option('mec_latest_event_datetime'); + if ($latest_event_datetime and (int) $latest_event_datetime <= (int) $user_last_view_date_events) return; + + $args = [ + 'post_type' => $this->main->get_main_post_type(), + 'post_status' => 'any', + 'meta_query' => [ + [ + 'key' => 'mec_event_date_submit', + 'value' => $user_last_view_date_events, + 'compare' => '>=', + ], + ], + ]; + + $count = 0; + $query = new WP_Query($args); + if ($query->have_posts()) + { + while ($query->have_posts()) + { + $query->the_post(); + $count += 1; + } + } + + wp_reset_postdata(); + + if ($count != 0) + { + // Append Events Badge To Event Menu. + global $menu; + + $badge = ' %%count%%'; + $menu_item = wp_list_filter($menu, [2 => 'mec-intro']); + if (is_array($menu_item) and count($menu_item)) + { + $menu[key($menu_item)][0] .= str_replace('%%count%%', esc_attr($count), $badge); + } + } + + if (isset($screen->id) and $screen->id == 'edit-mec-events') + { + update_user_meta($user_id, 'user_last_view_date_events', date('YmdHis', current_time('timestamp', 0))); + return; + } + } + + /** + * Add MEC metaboxes in WordPress dashboard + * @author Webnus + */ + public function dashboard_widgets() + { + wp_add_dashboard_widget( + 'mec_widget_news_features', + esc_html__('Modern Events Calendar', 'modern-events-calendar-lite'), + [$this, 'widget_news'] + ); + + if ($this->getPRO() and current_user_can('mec_settings') and isset($this->settings['booking_status']) and $this->settings['booking_status']) + { + wp_add_dashboard_widget( + 'mec_widget_total_bookings', + esc_html__('Total Bookings', 'modern-events-calendar-lite'), + [$this, 'widget_total_bookings'] + ); + } + } + + /** + * MEC render metabox in WordPress dashboard + * @author Webnus + */ + public function widget_news() + { + // Head Section + echo '
        +
        + +

        ' . ($this->getPRO() ? esc_html__('Modern Events Calendar', 'modern-events-calendar-lite') : esc_html__('Modern Events Calendar (Lite)', 'modern-events-calendar-lite')) . '

        + Create New Event +
        +
        +
        +
        '; + + // Upcoming Events + $upcoming_events = $this->main->get_upcoming_events(3); + echo '

        ' . esc_html__('Upcoming Events', 'modern-events-calendar-lite') . '

          '; + foreach ($upcoming_events as $date => $content) + { + foreach ($content as $array_id => $event) + { + $location_id = $this->main->get_master_location_id($event); + + $event_title = $event->data->title; + $event_link = $event->data->permalink; + $event_date = $this->main->date_i18n(get_option('date_format'), $event->date['start']['date']); + $location = get_term($location_id, 'mec_location'); + + $locationName = ''; + if (isset($location->name)) $locationName = $location->name; + + echo '
        • + +
          + ' . esc_html($event_title) . ' +
          ' . esc_html($locationName) . '
          +
          +
          ' . esc_html($event_date) . '
          +
          +
        • '; + } + } + + echo '
        '; + + $mec_get_webnus_news_time = get_option('mec_get_webnus_news_time'); + if (!isset($mec_get_webnus_news_time) || !$mec_get_webnus_news_time) + { + $data_url = wp_remote_get('https://webnus.net/wp-json/wninfo/v1/posts', ['user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36']); + $obj = ((is_array($data_url) and isset($data_url['body'])) ? json_decode($data_url['body']) : ''); + + update_option('mec_get_webnus_news_time', date("Y-m-d")); + update_option('mec_get_webnus_news_html', $obj); + } + else + { + if (strtotime(date("Y-m-d")) > strtotime($mec_get_webnus_news_time)) + { + $data_url = wp_remote_get('https://webnus.net/wp-json/wninfo/v1/posts', ['user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36']); + $obj = ((is_array($data_url) and isset($data_url['body'])) ? json_decode($data_url['body']) : ''); + + update_option('mec_get_webnus_news_time', date("Y-m-d")); + update_option('mec_get_webnus_news_html', $obj); + } + else + { + $obj = get_option('mec_get_webnus_news_html'); + } + } + + // News + if (!empty($obj)) + { + echo '

        ' . esc_html__('News & Updates', 'modern-events-calendar-lite') . '

        '; + } + + // Links + echo ''; + } + + public function dashboard_widget_total_booking_ajax_handler() + { + $start = isset($_REQUEST['start']) ? sanitize_text_field($_REQUEST['start']) : date('Y-m-d', strtotime('-15 days')); + $end = isset($_REQUEST['end']) ? sanitize_text_field($_REQUEST['end']) : date('Y-m-d'); + $type = isset($_REQUEST['type']) ? sanitize_text_field($_REQUEST['type']) : 'daily'; + $chart = isset($_REQUEST['chart']) ? sanitize_text_field($_REQUEST['chart']) : 'bar'; + + ob_start(); + $this->display_total_booking_chart($start, $end, $type, $chart); + $r = ob_get_clean(); + + wp_send_json($r); + } + + public function display_total_booking_chart($start, $end, $type = 'daily', $chart = 'bar') + { + $start = (!empty($start) ? $start : date('Y-m-d', strtotime('-15 days'))); + $end = (!empty($end) ? $end : date('Y-m-d')); + + $periods = $this->main->get_date_periods($start, $end, $type); + + $stats = ''; + $labels = ''; + foreach ($periods as $period) + { + $post_type = $this->main->get_book_post_type(); + $posts_ids = $this->db->select("SELECT `ID` FROM `#__posts` WHERE `post_type`='" . $post_type . "' AND `post_date`>='" . $period['start'] . "' AND `post_date`<='" . $period['end'] . "'", 'loadColumn'); + + if (count($posts_ids)) $total_sells = $this->db->select("SELECT SUM(`meta_value`) FROM `#__postmeta` WHERE `meta_key`='mec_price' AND `post_id` IN (" . implode(',', $posts_ids) . ")", 'loadResult'); + else $total_sells = 0; + + $labels .= '"' . $period['label'] . '",'; + $stats .= $total_sells . ','; + } + + $currency = $this->main->get_currency_sign(); + + echo ''; + echo ''; + } + + public function widget_total_bookings() + { + $current_page = isset($_GET['page']) ? sanitize_text_field($_GET['page']) : 'dashboard'; + + wp_enqueue_script('mec-chartjs-script'); + wp_enqueue_script('mec-total-booking-reports-script', $this->main->asset('js/total-booking-reports.js')); + wp_localize_script('mec-total-booking-reports-script', 'mec_ajax_data', [ + 'ajaxurl' => admin_url('admin-ajax.php'), + ]); + ?> +
        +
        +
        +
        + +
        +
        +
          +
        • +
        • +
        • +
        • +
        + + +
        + + + + + + +
        +
        + display_total_booking_chart($start, $end, $type, $chart); + ?> +
        +
        +
        +
        +
        + db->select("SELECT MIN(cast(meta_value as unsigned)) AS date FROM `#__postmeta` WHERE `meta_key`='mec_start_date'", 'loadResult'); + $end_year = $max_end_year = $this->db->select("SELECT MAX(cast(meta_value as unsigned)) AS date FROM `#__postmeta` WHERE `meta_key`='mec_end_date'", 'loadResult'); + $current_month = current_time('m'); + ?> +
        +
        + +
        +
        + ID))) return ''; + + // Date + $date = (isset($mec_current_event->date) ? $mec_current_event->date : []); + $start_timestamp = (isset($date['start']) and isset($date['start']['timestamp'])) ? $date['start']['timestamp'] : null; + $end_timestamp = (isset($date['end']) and isset($date['end']['timestamp'])) ? $date['end']['timestamp'] : null; + + // Invalid Date + if (!$start_timestamp or !$end_timestamp) return ''; + + // Not Booked + if (!$this->main->is_user_booked($user_id, $mec_current_event->ID, $start_timestamp)) return ''; + + // Booked + return $content; + } + + public function register_assets_per_page_meta_boxes() + { + $post_types = $this->assets_per_page_post_types(); + add_meta_box('mec_metabox_app', esc_html__('Include MEC Assets', 'modern-events-calendar-lite'), [$this, 'meta_box_assets_per_page'], $post_types, 'side', 'low'); + } + + public function meta_box_assets_per_page($post) + { + $mec_include_assets = get_post_meta($post->ID, 'mec_include_assets', true); + ?> +
        + +
        + assets_per_page_post_types(); + + // Not a Supported Post Type + if (!in_array($post->post_type, $post_types)) return; + + if (isset($_POST['mec_include_assets'])) + { + $mec_include_assets = sanitize_text_field($_POST['mec_include_assets']); + update_post_meta($post_id, 'mec_include_assets', $mec_include_assets); + } + } + + public function assets_per_page($status) + { + global $post; + $status_per_page = 1; + if ($post) + { + $post_types = $this->assets_per_page_post_types(); + + if (isset($post->post_type) and in_array($post->post_type, $post_types)) + { + $status_per_page = get_post_meta($post->ID, 'mec_include_assets', true); + if (trim($status_per_page) == '') $status_per_page = 0; + } + } + + if (is_plugin_active('buddyboss-platform/bp-loader.php') && + is_plugin_active('mec-buddyboss/mec-buddyboss.php') && + (isset($this->settings['assets_per_page_status']) and $this->settings['assets_per_page_status'])) + { + + if (isset($post->is_page) && $status_per_page == 0) $status_per_page = 1; + + return (boolean) $status_per_page; + } + + // Turned Off + if (!isset($this->settings['assets_per_page_status']) or (isset($this->settings['assets_per_page_status']) and !$this->settings['assets_per_page_status'])) return $status; + // Turned On + else + { + $status = (boolean) $status_per_page; + } + + return $status; + } + + public function assets_per_page_post_types() + { + return apply_filters('mec_assets_per_page_post_types', ['page', 'post', 'forum', 'topic', 'reply']); + } + + public function page_title($title) + { + // Occurrences Status + $occurrences_status = (isset($this->settings['per_occurrences_status']) and $this->settings['per_occurrences_status'] and $this->getPRO()); + + if (is_singular($this->main->get_main_post_type()) and $occurrences_status) + { + global $post; + + $timestamp = ((isset($_GET['time']) and $_GET['time']) ? (int) sanitize_text_field($_GET['time']) : null); + + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : null); + if (!$timestamp and $occurrence) $timestamp = strtotime($occurrence) + (int) get_post_meta($post->ID, 'mec_start_day_seconds', true); + + if (!$timestamp) + { + $render = $this->getRender(); + $dates = $render->dates($post->ID, null, 1, date('Y-m-d', strtotime('Yesterday'))); + + if (isset($dates[0]) and isset($dates[0]['start']) and isset($dates[0]['start']['timestamp'])) $timestamp = $dates[0]['start']['timestamp']; + } + + $title = MEC_feature_occurrences::param($post->ID, $timestamp, 'title', $title); + } + + return $title; + } + + public function dropdown() + { + // Check if our nonce is set. + if (!isset($_POST['_wpnonce'])) $this->main->response(['success' => 0, 'code' => 'NONCE_MISSING']); + + // Verify that the nonce is valid. + if (!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_occurrences_dropdown')) $this->main->response(['success' => 0, 'code' => 'NONCE_IS_INVALID']); + + $date = isset($_POST['date']) ? sanitize_text_field($_POST['date']) : ''; + $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : ''; + + // Date is invalid! + if (!trim($date) or !trim($id)) $this->main->response(['success' => 0, 'code' => 'DATE_OR_ID_IS_INVALID']); + + $dates = explode(':', $date); + + $limit = 100; + $now = $dates[0]; + $_6months_ago = strtotime('-6 Months', $now); + + $occ = new MEC_feature_occurrences(); + $occurrences = $occ->get_dates($id, $now, $limit); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format . ' ' . $time_format; + + $success = 0; + $html = ''; + + $i = 1; + foreach ($occurrences as $occurrence) + { + $success = 1; + $html .= ''; + $i++; + } + + if (count($occurrences) >= $limit and isset($occurrence)) $html .= ''; + + $this->main->response(['success' => $success, 'html' => $html]); + } + + public function upload_mimes($mimes) + { + if (!is_array($mimes)) return $mimes; + + if (!isset($mimes['zip'])) $mimes['zip'] = 'application/zip'; + return $mimes; + } + + /** + * @param $skin + * @param array $options + * @return string + */ + public function search_form_event_fields($skin, $options = []) + { + // Feature Disabled + if (!isset($this->settings['display_event_fields_search']) or (isset($this->settings['display_event_fields_search']) and !$this->settings['display_event_fields_search'])) return ''; + + $event_fields = $this->main->get_event_fields(); + $field_options = (isset($options['fields']) and is_array($options['fields']) and count($options['fields'])) ? $options['fields'] : []; + + // No Fields + if (!is_array($event_fields) or (is_array($event_fields) and !count($event_fields))) return ''; + + ob_start(); + foreach ($event_fields as $field_id => $event_field) + { + // Templates + if (!is_numeric($field_id)) continue; + + $label = isset($event_field['label']) ? $event_field['label'] : ''; + $type = isset($event_field['type']) ? $event_field['type'] : ''; + + if (!$label or !$type) continue; + if (in_array($type, ['p', 'email', 'url', 'tel'])) continue; + ?> +
        + + +
        + ' . esc_html__('Event Fields', 'modern-events-calendar-lite') . '

    5bT-wPC#ELCTiW4ALHfCWxyRnV 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 Tio8aO{v)d>Xv&w#nj`-YiZjil literal 0 HcmV?d00001 diff --git a/app/api/addons-api/mec-gutenberg-single-builder.svg b/app/api/addons-api/mec-gutenberg-single-builder.svg new file mode 100755 index 0000000..ff996c6 --- /dev/null +++ b/app/api/addons-api/mec-gutenberg-single-builder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec-shortcode-designer-addon-icon.svg b/app/api/addons-api/mec-shortcode-designer-addon-icon.svg new file mode 100755 index 0000000..37d0e0b --- /dev/null +++ b/app/api/addons-api/mec-shortcode-designer-addon-icon.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/mec_addon_icon_27.svg b/app/api/addons-api/mec_addon_icon_27.svg new file mode 100755 index 0000000..b8d7f63 --- /dev/null +++ b/app/api/addons-api/mec_addon_icon_27.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec_addon_icon_37.svg b/app/api/addons-api/mec_addon_icon_37.svg new file mode 100755 index 0000000..b267900 --- /dev/null +++ b/app/api/addons-api/mec_addon_icon_37.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec_addon_icon_39.svg b/app/api/addons-api/mec_addon_icon_39.svg new file mode 100755 index 0000000..ef5310f --- /dev/null +++ b/app/api/addons-api/mec_addon_icon_39.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/mec_addon_icon_40.svg b/app/api/addons-api/mec_addon_icon_40.svg new file mode 100755 index 0000000..896a260 --- /dev/null +++ b/app/api/addons-api/mec_addon_icon_40.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/multi-site-3.svg b/app/api/addons-api/multi-site-3.svg new file mode 100755 index 0000000..24de626 --- /dev/null +++ b/app/api/addons-api/multi-site-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/rsvp-event-addon.svg b/app/api/addons-api/rsvp-event-addon.svg new file mode 100755 index 0000000..7545906 --- /dev/null +++ b/app/api/addons-api/rsvp-event-addon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/seat-addon-icon.svg b/app/api/addons-api/seat-addon-icon.svg new file mode 100755 index 0000000..0084990 --- /dev/null +++ b/app/api/addons-api/seat-addon-icon.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/social-auto-poster-addon.svg b/app/api/addons-api/social-auto-poster-addon.svg new file mode 100755 index 0000000..25dbb9d --- /dev/null +++ b/app/api/addons-api/social-auto-poster-addon.svg @@ -0,0 +1 @@ +19 \ No newline at end of file diff --git a/app/api/addons-api/social-poster-addon.svg b/app/api/addons-api/social-poster-addon.svg new file mode 100755 index 0000000..6ff2788 --- /dev/null +++ b/app/api/addons-api/social-poster-addon.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + 19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/square-integration-addon.svg b/app/api/addons-api/square-integration-addon.svg new file mode 100755 index 0000000..2110a9e --- /dev/null +++ b/app/api/addons-api/square-integration-addon.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/user-dashboard.svg b/app/api/addons-api/user-dashboard.svg new file mode 100755 index 0000000..4cf76e6 --- /dev/null +++ b/app/api/addons-api/user-dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/virtual-events.svg b/app/api/addons-api/virtual-events.svg new file mode 100755 index 0000000..36ad5cb --- /dev/null +++ b/app/api/addons-api/virtual-events.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/waiting-list-icon.svg b/app/api/addons-api/waiting-list-icon.svg new file mode 100755 index 0000000..658f7e5 --- /dev/null +++ b/app/api/addons-api/waiting-list-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/webex-integration-addon.svg b/app/api/addons-api/webex-integration-addon.svg new file mode 100755 index 0000000..d932398 --- /dev/null +++ b/app/api/addons-api/webex-integration-addon.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/api/addons-api/zapier-integration01 (1).svg b/app/api/addons-api/zapier-integration01 (1).svg new file mode 100755 index 0000000..114b829 --- /dev/null +++ b/app/api/addons-api/zapier-integration01 (1).svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/zapier-integration01.svg b/app/api/addons-api/zapier-integration01.svg new file mode 100755 index 0000000..114b829 --- /dev/null +++ b/app/api/addons-api/zapier-integration01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/addons-api/zoom-integration-addon.svg b/app/api/addons-api/zoom-integration-addon.svg new file mode 100755 index 0000000..779cd3b --- /dev/null +++ b/app/api/addons-api/zoom-integration-addon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/api/index.html b/app/api/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/composer.json b/app/composer.json new file mode 100755 index 0000000..b99d37a --- /dev/null +++ b/app/composer.json @@ -0,0 +1,10 @@ +{ + "require": { + "johngrogg/ics-parser": "^2" + }, + "autoload": { + "psr-4": { + "MEC\\":"core/src/" + } + } +} \ No newline at end of file diff --git a/app/composer.lock b/app/composer.lock new file mode 100755 index 0000000..2eac2c3 --- /dev/null +++ b/app/composer.lock @@ -0,0 +1,84 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "82778bfd99b4c915557aac3d1e3871cf", + "packages": [ + { + "name": "johngrogg/ics-parser", + "version": "v2.2.2", + "source": { + "type": "git", + "url": "https://github.com/u01jmg3/ics-parser.git", + "reference": "69c80471a0a99142ebc72b21c2bc084e81a7c4f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/u01jmg3/ics-parser/zipball/69c80471a0a99142ebc72b21c2bc084e81a7c4f4", + "reference": "69c80471a0a99142ebc72b21c2bc084e81a7c4f4", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4", + "squizlabs/php_codesniffer": "~2.9.1" + }, + "type": "library", + "autoload": { + "psr-0": { + "ICal": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Goode", + "role": "Developer/Owner" + }, + { + "name": "John Grogg", + "email": "john.grogg@gmail.com", + "role": "Developer/Prior Owner" + } + ], + "description": "ICS Parser", + "homepage": "https://github.com/u01jmg3/ics-parser", + "keywords": [ + "iCalendar", + "ical", + "ical-parser", + "ics", + "ics-parser", + "ifb" + ], + "support": { + "issues": "https://github.com/u01jmg3/ics-parser/issues", + "source": "https://github.com/u01jmg3/ics-parser/tree/v2.2.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/u01jmg3", + "type": "github" + } + ], + "time": "2020-11-02T10:28:33+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/app/controller.php b/app/controller.php new file mode 100755 index 0000000..43faaf8 --- /dev/null +++ b/app/controller.php @@ -0,0 +1,18 @@ + + */ +class MEC_controller extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } +} \ No newline at end of file diff --git a/app/core/mec.php b/app/core/mec.php new file mode 100755 index 0000000..d510935 --- /dev/null +++ b/app/core/mec.php @@ -0,0 +1,19 @@ +init(); \ No newline at end of file diff --git a/app/core/puc/.editorconfig b/app/core/puc/.editorconfig new file mode 100755 index 0000000..42b7503 --- /dev/null +++ b/app/core/puc/.editorconfig @@ -0,0 +1,15 @@ +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=false +indent_style=tab +tab_width=4 + +[{phpunit.xml.dist,*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] +indent_style=space +indent_size=4 + +[*.svg] +indent_style=space +indent_size=4 + diff --git a/app/core/puc/.gitignore b/app/core/puc/.gitignore new file mode 100755 index 0000000..64255d9 --- /dev/null +++ b/app/core/puc/.gitignore @@ -0,0 +1,40 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# The entire IDEA/PhpStorm directory +.idea/ + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser diff --git a/app/core/puc/Puc/v4/Factory.php b/app/core/puc/Puc/v4/Factory.php new file mode 100755 index 0000000..d9e875c --- /dev/null +++ b/app/core/puc/Puc/v4/Factory.php @@ -0,0 +1,6 @@ +rootDir = dirname(__FILE__) . '/'; + $nameParts = explode('_', __CLASS__, 3); + $this->prefix = $nameParts[0] . '_' . $nameParts[1] . '_'; + + $this->libraryDir = $this->rootDir . '../..'; + if ( !self::isPhar() ) { + $this->libraryDir = realpath($this->libraryDir); + } + $this->libraryDir = $this->libraryDir . '/'; + + $this->staticMap = array( + 'PucReadmeParser' => 'vendor/PucReadmeParser.php', + 'Parsedown' => 'vendor/Parsedown.php', + 'Puc_v4_Factory' => 'Puc/v4/Factory.php', + ); + + spl_autoload_register(array($this, 'autoload')); + } + + /** + * Determine if this file is running as part of a Phar archive. + * + * @return bool + */ + private static function isPhar() { + //Check if the current file path starts with "phar://". + static $pharProtocol = 'phar://'; + return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol); + } + + public function autoload($className) { + if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) { + /** @noinspection PhpIncludeInspection */ + include ($this->libraryDir . $this->staticMap[$className]); + return; + } + + if (strpos($className, $this->prefix) === 0) { + $path = substr($className, strlen($this->prefix)); + $path = str_replace('_', '/', $path); + $path = $this->rootDir . $path . '.php'; + + if (file_exists($path)) { + /** @noinspection PhpIncludeInspection */ + include $path; + } + } + } + } + +endif; diff --git a/app/core/puc/Puc/v4p11/DebugBar/Extension.php b/app/core/puc/Puc/v4p11/DebugBar/Extension.php new file mode 100755 index 0000000..97823de --- /dev/null +++ b/app/core/puc/Puc/v4p11/DebugBar/Extension.php @@ -0,0 +1,190 @@ +updateChecker = $updateChecker; + if ( isset($panelClass) ) { + $this->panelClass = $panelClass; + } + + if ( version_compare(PHP_VERSION, '5.3', '>=') && (strpos($this->panelClass, '\\') === false) ) { + $this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass; + } + + add_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); + add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); + + add_action('wp_ajax_puc_v4_debug_check_now', array($this, 'ajaxCheckNow')); + } + + /** + * Register the PUC Debug Bar panel. + * + * @param array $panels + * @return array + */ + public function addDebugBarPanel($panels) { + if ( $this->updateChecker->userCanInstallUpdates() ) { + $panels[] = new $this->panelClass($this->updateChecker); + } + return $panels; + } + + /** + * Enqueue our Debug Bar scripts and styles. + */ + public function enqueuePanelDependencies() { + wp_enqueue_style( + 'puc-debug-bar-style-v4', + $this->getLibraryUrl("/css/puc-debug-bar.css"), + array('debug-bar'), + '20171124' + ); + + wp_enqueue_script( + 'puc-debug-bar-js-v4', + $this->getLibraryUrl("/js/debug-bar.js"), + array('jquery'), + '20201209' + ); + } + + /** + * Run an update check and output the result. Useful for making sure that + * the update checking process works as expected. + */ + public function ajaxCheckNow() { + if ( sanitize_text_field($_POST['uid']) !== $this->updateChecker->getUniqueName('uid') ) { + return; + } + $this->preAjaxRequest(); + $update = $this->updateChecker->checkForUpdates(); + if ( $update !== null ) { + echo "An update is available:"; + echo '


    ' . $fields; + return $fields; + } + + /** + * @return void + */ + public function download_debug_log_file() + { + if (!isset($_REQUEST['mec-download-log-file']) || !$_REQUEST['mec-download-log-file']) return; + + // Current User is not Permitted + if (!current_user_can('manage_options')) return; + + $log_file = WP_CONTENT_DIR . '/debug.log'; + if (defined('WP_DEBUG_LOG') && is_string(WP_DEBUG_LOG)) $log_file = WP_DEBUG_LOG; + + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename=' . basename('debug.log')); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($log_file)); + readfile($log_file); + exit; + } + + /** + * @return void + */ + public function rerun_sql() + { + // Current User is not Permitted + if (!current_user_can('manage_options')) return; + + // Create Tables + $this->main->create_mec_tables(); + + // Response + wp_send_json(["success" => 1, 'message' => esc_html__('Database setup is done.')]); + } +} diff --git a/app/features/mec/addons.php b/app/features/mec/addons.php new file mode 100755 index 0000000..e2d31b2 --- /dev/null +++ b/app/features/mec/addons.php @@ -0,0 +1,75 @@ + +
    +
    +
    +
    +

    +
    +
    + main->get_styling(); $darkadmin_mode = ( isset($styling['dark_mode']) ) ? $styling['dark_mode'] : ''; if ($darkadmin_mode == 1): $darklogo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w2.png'; else: $darklogo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w.png'; endif; ?> + + +
    +
    +
    +
    + + +
    + + $value) : ?> +
    +
    +
    +
    +
    name); ?>
    + comingsoon == 'false' ) : ?> + pro == 'true' ) : ?> +
    Requires Pro Version
    + +
    Requires Pro / Lite Version
    + + +
    +
    +
    +

    desc); ?>

    +
    +
    + +
    +
    +
    + + +
    +
    +

    + "file_get_contents" and "Curl" functions are not activated on your server. Please contact your host provider in this regard.', 'modern-events-calendar-lite'); ?> +

    +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/app/features/mec/booking.php b/app/features/mec/booking.php new file mode 100755 index 0000000..9f98b07 --- /dev/null +++ b/app/features/mec/booking.php @@ -0,0 +1,1557 @@ +main->is_multilingual(); +$locale = $this->main->get_backend_active_locale(); + +$settings = $this->main->get_settings(); +$ml_settings = $this->main->get_ml_settings(NULL, $locale); + +$fees = $settings['fees'] ?? []; +$ticket_variations = $settings['ticket_variations'] ?? []; + +// WordPress Pages +$pages = get_pages(); + +// User Roles +$roles = array_reverse(wp_roles()->roles); + +$bfixed_fields = $this->main->get_bfixed_fields(); +if(!is_array($bfixed_fields)) $bfixed_fields = []; + +// Booking form +$mec_email = false; +$mec_name = false; + +$reg_fields = $this->main->get_reg_fields(); +if(!is_array($reg_fields)) $reg_fields = []; + +foreach($reg_fields as $field) +{ + if(isset($field['type'])) + { + if($field['type'] == 'name') $mec_name = true; + if($field['type'] == 'mec_email') $mec_email = true; + } + else break; +} + +if(!$mec_name) +{ + array_unshift( + $reg_fields, + array( + 'mandatory' => '0', + 'type' => 'name', + 'label' => esc_html__('Name', 'modern-events-calendar-lite'), + ) + ); +} + +if(!$mec_email) +{ + array_unshift( + $reg_fields, + array( + 'mandatory' => '0', + 'type' => 'mec_email', + 'label' => esc_html__('Email', 'modern-events-calendar-lite'), + ) + ); +} + +// Payment Gateways +$gateways = $this->main->get_gateways(); +$gateways_options = $this->main->get_gateways_options(); +?> +
    +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('booking'); ?> +
    + +
    +
    +
    +
    +
    + +
    + +
    +

    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    "> +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    + $role): $wcb_value = $settings['booking_wcb_' . $role_key] ?? 1; ?> +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    +
    +

    [mec-booking event-id="1"]'); ?>

    +

    ticket-id="1"'); ?>

    +
    +
    + + +
    +
    + +
    + +
    +


    +
    +
    + +
    + +
    +

    +
    + +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    + +

    Webhooks", 'modern-events-calendar-lite'); ?>

    +
    + +
    +
    + settings ) ?> + +
    + + settings['booking_status']) and $this->settings['booking_status']): ?> + + main, $this->settings); ?> + +
    +

    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + main->getTickets()->builder([ + 'tickets' => $settings['tickets'] ?? [], + 'name_prefix' => 'mec[settings][tickets]', + 'object_id' => null, + ]); ?> +
    +
    + +
    +

    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    + +

    Booking", 'modern-events-calendar-lite'); ?>

    +
    +
    +
    + +
    + +
    +

    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    + +
    +
    +
    + +
    +
    + $fee): if(!is_numeric($key)) continue; $i = max($i, $key); ?> +
    +
    + +
    +
    + + + +
    +
    +

    +
    + +
    +
    + + + + +
    +
    + +
    + +
    +
    +
    + +
    +
    + + + +
    +
    +

    +
    + +
    +
    + + + + +
    +
    +
    + + +
    +
    + +
    + + + +
    + +
    + + +
    +
    +
    + +

    +
    +
    +
    + +
    + +
    +

    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + +
    + +
    +
    +
    + +
    +
    + getTicketVariations(); + $i = 0; + foreach($ticket_variations as $key => $ticket_variation) + { + if(!is_numeric($key)) continue; + $i = max($i, $key); + + $TicketVariations->item([ + 'i' => $i, + 'name_prefix' => 'mec[settings][ticket_variations]', + 'value' => $ticket_variation, + ]); + } + ?> +
    + +
    + item([ + 'i' => ':i:', + 'name_prefix' => 'mec[settings][ticket_variations]', + 'value' => [], + ]); + ?> +
    +
    + +
    +
    +
    +
    +

    [mec-ticket-variations event-id="10"]'); ?>

    +
    +
    +
    + +
    + +
    +

    +
    +
    +
    + + +
    + + + +
      + $reg_field) + { + if(!is_numeric($key)) continue; + $i = max( $i, $key ); + + if($reg_field['type'] == 'text') echo MEC_kses::form($this->main->field_text($key, $reg_field)); + elseif($reg_field['type'] == 'name') echo MEC_kses::form($this->main->field_name($key, $reg_field)); + elseif($reg_field['type'] == 'mec_email') echo MEC_kses::form($this->main->field_mec_email($key, $reg_field)); + elseif($reg_field['type'] == 'email') echo MEC_kses::form($this->main->field_email($key, $reg_field)); + elseif($reg_field['type'] == 'date') echo MEC_kses::form($this->main->field_date($key, $reg_field)); + elseif($reg_field['type'] == 'file') echo MEC_kses::form($this->main->field_file($key, $reg_field)); + elseif($reg_field['type'] == 'tel') echo MEC_kses::form($this->main->field_tel($key, $reg_field)); + elseif($reg_field['type'] == 'textarea') echo MEC_kses::form($this->main->field_textarea($key, $reg_field)); + elseif($reg_field['type'] == 'p') echo MEC_kses::form($this->main->field_p($key, $reg_field)); + elseif($reg_field['type'] == 'checkbox') echo MEC_kses::form($this->main->field_checkbox($key, $reg_field)); + elseif($reg_field['type'] == 'radio') echo MEC_kses::form($this->main->field_radio($key, $reg_field)); + elseif($reg_field['type'] == 'select') echo MEC_kses::form($this->main->field_select($key, $reg_field)); + elseif($reg_field['type'] == 'agreement') echo MEC_kses::form($this->main->field_agreement($key, $reg_field)); + } + ?> +
    +
    + + + + + + + + + + + + + +
    + +
    + +
    + +
    +
    + main->field_text(':i:')); ?> +
    +
    + main->field_email(':i:')); ?> +
    +
    + main->field_mec_email(':i:')); ?> +
    +
    + main->field_name(':i:')); ?> +
    +
    + main->field_tel(':i:')); ?> +
    +
    + main->field_date(':i:')); ?> +
    +
    + main->field_file(':i:')); ?> +
    +
    + main->field_textarea(':i:')); ?> +
    +
    + main->field_checkbox(':i:')); ?> +
    +
    + main->field_radio(':i:')); ?> +
    +
    + main->field_select(':i:')); ?> +
    +
    + main->field_agreement(':i:')); ?> +
    +
    + main->field_p(':i:')); ?> +
    +
    + main->field_option(':fi:', ':i:')); ?> +
    +
    +
    +
    +
    +
    + + +
    + + + +
      + $bfixed_field) + { + if(!is_numeric($key)) continue; + $b = max($b, $key); + + if( !isset($bfixed_field['type']) ) continue; + + if($bfixed_field['type'] == 'text') echo MEC_kses::form($this->main->field_text($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'name') echo MEC_kses::form($this->main->field_name($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'mec_email') echo MEC_kses::form($this->main->field_mec_email($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'email') echo MEC_kses::form($this->main->field_email($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'date') echo MEC_kses::form($this->main->field_date($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'file') echo MEC_kses::form($this->main->field_file($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'tel') echo MEC_kses::form($this->main->field_tel($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'textarea') echo MEC_kses::form($this->main->field_textarea($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'p') echo MEC_kses::form($this->main->field_p($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'checkbox') echo MEC_kses::form($this->main->field_checkbox($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'radio') echo MEC_kses::form($this->main->field_radio($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'select') echo MEC_kses::form($this->main->field_select($key, $bfixed_field, 'bfixed')); + elseif($bfixed_field['type'] == 'agreement') echo MEC_kses::form($this->main->field_agreement($key, $bfixed_field, 'bfixed')); + } + ?> +
    +
    + + + + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + main->field_text(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_email(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_tel(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_date(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_textarea(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_checkbox(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_radio(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_select(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_agreement(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_p(':i:', array(), 'bfixed')); ?> +
    +
    + main->field_option(':fi:', ':i:', array(), 'bfixed')); ?> +
    +
    +
    + + +
    + +
    +

    +
    + + +
    +
    + +

    +
    + + +

    + + +

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    + +
    + +
    + + +
    +
    +

    +

    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +

    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
      + +
    • + options_form(); ?> +
    • + +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + +

    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    +

    +
    +
    + +

    +
    +

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    + +
    + +
    + +

    [mec-cart]'); ?>

    +
    +
    +
    + +
    + +

    [mec-checkout]'); ?>

    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + +
    + + + + + +
    +
    + +
    +
    +
    +
    + + + +
    + +factory->params('footer', ''); \ No newline at end of file diff --git a/app/features/mec/dashboard.php b/app/features/mec/dashboard.php new file mode 100755 index 0000000..ae5af98 --- /dev/null +++ b/app/features/mec/dashboard.php @@ -0,0 +1,384 @@ +get_main_post_type()); +$user_post_count = $count_events->publish ?? '0'; + +// user calendar created +$count_calendars = wp_count_posts('mec_calendars'); +$user_post_count_c = $count_calendars->publish ?? '0'; + +// mec location +$user_location_count_l = wp_count_terms('mec_location', array( + 'hide_empty' => false, + 'parent' => 0 +)); + +// mec organizer +$user_organizer_count_l = wp_count_terms('mec_organizer', array( + 'hide_empty' => false, + 'parent' => 0 +)); + +$version = $verify = NULL; +if ($this->getPRO()) $mec_license_status = get_option('mec_license_status'); + +// MEC Database +$db = $this->getDB(); + +// MEC Settings +$settings = $this->get_settings(); + +// MEC Booking Status +$booking_status = ($this->getPRO() and isset($settings['booking_status']) and $settings['booking_status']); + +// Add ChartJS library +if ($booking_status) wp_enqueue_script('mec-chartjs-script'); + +// Whether to show dashboard boxes or not! +$box_support = apply_filters('mec_dashboard_box_support', true); +$box_stats = apply_filters('mec_dashboard_box_stats', true); +?> + +
    +
    +
    +
    +

    user_firstname); ?>

    +
    + ' . ($this->getPRO() ? esc_html__('Modern Events Calendar', 'modern-events-calendar-lite') : esc_html__('Modern Events Calendar (Lite)', 'modern-events-calendar-lite')) . ''); ?> +
    +
    +
    + get_styling(); + $darkadmin_mode = $styling['dark_mode'] ?? ''; + if ($darkadmin_mode == 1): $darklogo = plugin_dir_url(__FILE__) . '../../../assets/img/mec-logo-w2.png'; + else: $darklogo = plugin_dir_url(__FILE__) . '../../../assets/img/mec-logo-w.png'; + endif; ?> + + +
    +
    +
    + +
    +
    +
    + +
    +
    + getPRO()): ?> +
    +
    +
    +

    + ' . esc_html__('lite', 'modern-events-calendar-lite') . ''); ?> +

    + + + +
    + +
    + +
    +
    +
    + + mec_custom_msg_2('yes', 'yes')); ?> + mec_custom_msg('yes', 'yes')); ?> +
    +
    +
    +
    +

    +

    +
    +
    + +
    + +
    +
    + getPRO() && has_action('addons_activation')) : ?> +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +

    +
    + +
    +
    + + getPRO()) : ?> +
    +
    +
    + +
    + +
    +

    +
    + +
    +
    + + +
    +
    +
    + ' . esc_html__('Troubleshooting', 'modern-events-calendar-lite') . ''; + ?> +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    +

    +
    + +
    +
    + + +
    +
    +
    +

    ' . esc_html($user_post_count) . '

    ' . esc_html__('Events', 'modern-events-calendar-lite'); ?>

    +
    +
    +
    +
    +
    +
    +

    ' . esc_html($user_post_count_c) . '

    ' . esc_html__('Shortcodes', 'modern-events-calendar-lite'); ?>

    +
    +
    +
    +
    +
    +
    +

    ' . esc_html($user_location_count_l) . '

    ' . esc_html__('Locations', 'modern-events-calendar-lite'); ?>

    +
    +
    +
    +
    +
    +
    +

    ' . esc_html($user_organizer_count_l) . '

    ' . esc_html__('Organizers', 'modern-events-calendar-lite'); ?>

    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + getRender(); + echo MEC_kses::full($render->skin('list', array( + 'sk-options' => array('list' => array( + 'style' => 'minimal', + 'start_date_type' => 'today', + 'pagination_method' => '0', + 'limit' => '6', + 'month_divider' => '0', + 'load_more_button' => false, + 'ignore_js' => true + )) + ))); + ?> +
    +
    +
    + +
    +
    +
    + +
    +
    + select("SELECT COUNT(`meta_id`) AS count, `meta_value` AS gateway FROM `#__postmeta` WHERE `meta_key`='mec_gateway' GROUP BY `meta_value`", 'loadAssocList'); + + $labels = ''; + $data = ''; + $bg_colors = ''; + + foreach ($results as $result) { + if (!class_exists($result['gateway'])) { + continue; + } + + $gateway = new $result['gateway']; + $stats[] = array('label' => $gateway->title(), 'count' => $result['count']); + + $labels .= '"' . esc_html($gateway->title()) . '",'; + $data .= ((int) $result['count']) . ','; + $bg_colors .= "'" . $gateway->color() . "',"; + } + echo ''; + + $this->getFactory()->params('footer', ''); + ?> +
    +
    +
    + +
    + widget_total_bookings(); ?> + + + getPRO()) (new MEC_feature_mec())->widget_print(); ?> + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/features/mec/dyncss.php b/app/features/mec/dyncss.php new file mode 100755 index 0000000..bdfe8e9 --- /dev/null +++ b/app/features/mec/dyncss.php @@ -0,0 +1,392 @@ +main->get_styling(); + +// colorskin +$color = ''; + +function mec_dyn_hex2rgb($cc) +{ + if($cc[0] == '#') $cc = substr($cc, 1); + + if(strlen($cc) == 6) list($r, $g, $b) = array($cc[0] . $cc[1], $cc[2] . $cc[3], $cc[4] . $cc[5]); + elseif(strlen($cc) == 3) list($r, $g, $b) = array($cc[0] . $cc[0], $cc[1] . $cc[1], $cc[2] . $cc[2]); + else return false; + + $r = ((!function_exists('ctype_xdigit') or (function_exists('ctype_xdigit') and ctype_xdigit($r))) ? hexdec($r) : NULL); + $g = ((!function_exists('ctype_xdigit') or (function_exists('ctype_xdigit') and ctype_xdigit($g))) ? hexdec($g) : NULL); + $b = ((!function_exists('ctype_xdigit') or (function_exists('ctype_xdigit') and ctype_xdigit($b))) ? hexdec($b) : NULL); + + if(is_null($r) or is_null($g) or is_null($b)) return false; + else return array('red' => $r, 'green' => $g, 'blue' => $b); +} + +if(isset($styling['color']) && $styling['color']) $color = $styling['color']; +elseif(isset($styling['mec_colorskin'])) $color = $styling['mec_colorskin']; + +$rgb_color = '64,217,241'; +if(!empty($color)) $rgb_color = mec_dyn_hex2rgb($color); + +// Typography +$mec_h_fontfamily_arr = $mec_p_fontfamily_arr = $fonts_url = $mec_container_normal_width = $mec_container_large_width = ''; + +if(isset($styling['mec_h_fontfamily']) && $styling['mec_h_fontfamily']) +{ + $mec_h_fontfamily_arr = $styling['mec_h_fontfamily']; + $mec_h_fontfamily_arr = str_replace("[", "", $mec_h_fontfamily_arr); + $mec_h_fontfamily_arr = str_replace("]", "", $mec_h_fontfamily_arr); + $mec_h_fontfamily_arr = explode(",", $mec_h_fontfamily_arr); +} + +if(isset($styling['mec_p_fontfamily']) && $styling['mec_p_fontfamily']) +{ + $mec_p_fontfamily_arr = $styling['mec_p_fontfamily']; + $mec_p_fontfamily_arr = str_replace("[", "", $mec_p_fontfamily_arr); + $mec_p_fontfamily_arr = str_replace("]", "", $mec_p_fontfamily_arr); + $mec_p_fontfamily_arr = explode(",", $mec_p_fontfamily_arr); +} + +if((is_array($mec_h_fontfamily_arr) && $mec_h_fontfamily_arr) || (is_array($mec_p_fontfamily_arr) && $mec_p_fontfamily_arr)) +{ + //Google font + $font_families = []; + $subsets = 'latin,latin-ext'; + $variant_h = ''; + $variant_p = ''; + $mec_h_fontfamily_array = ''; + if ( is_array($mec_h_fontfamily_arr) && $mec_h_fontfamily_arr ) : + foreach($mec_h_fontfamily_arr as $key=>$mec_h_fontfamily_array) { + if($key != '0') $variant_h .= $mec_h_fontfamily_array .', '; + } + endif; + + if ( is_array($mec_p_fontfamily_arr) && $mec_p_fontfamily_arr ) : + foreach($mec_p_fontfamily_arr as $key=>$mec_p_fontfamily_array) { + if($key != '0') $variant_p .= $mec_h_fontfamily_array .', '; + } + endif; + + $font_families[] = !empty($mec_h_fontfamily_arr[0]) ? $mec_h_fontfamily_arr[0] . ':' . $variant_h : ''; + $font_families[] = !empty($mec_p_fontfamily_arr[0]) ? $mec_p_fontfamily_arr[0] . ':' . $variant_p : ''; + + if($font_families) + { + $fonts_url = add_query_arg(array( + 'family'=>urlencode(implode('|', $font_families)), + 'subset'=>urlencode($subsets), + ), 'https://fonts.googleapis.com/css'); + } +} + +if(isset($styling['container_normal_width']) && $styling['container_normal_width']) +{ + $mec_container_normal_width = trim( $styling['container_normal_width'] ); + if($mec_container_normal_width ) { + if (is_numeric($mec_container_normal_width)) { + $mec_container_normal_width .= 'px'; + } + } +} + +if(isset($styling['container_large_width']) && $styling['container_large_width']) +{ + $mec_container_large_width = trim( $styling['container_large_width'] ); + if($mec_container_large_width ) { + if (is_numeric($mec_container_large_width)) { + $mec_container_large_width .= 'px'; + } + } +} +$title_color = $title_color_hover = $content_color = ''; +if(isset($styling['title_color']) && $styling['title_color']) +{ + $title_color = $styling['title_color']; +} + +if(isset($styling['title_color_hover']) && $styling['title_color_hover']) +{ + $title_color_hover = $styling['title_color_hover']; +} + +if(isset($styling['content_color']) && $styling['content_color']) +{ + $content_color = $styling['content_color']; +} + +ob_start(); + +echo ':root,::before,::after{'; + +// render headings font familty +if($mec_h_fontfamily_arr): ?> + /* == Custom Fonts For H Tag + ---------------- */ + --mec-heading-font-family: ''; + + + /* == Custom Fonts For P Tag + ---------------- */ + --mec-paragraph-font-family: ''; + + /* == TextColors + ---------------- */ + --mec-color-skin: ; + --mec-color-skin-rgba-1: rgba(,,,.25); + --mec-color-skin-rgba-2: rgba(,,,.5); + --mec-color-skin-rgba-3: rgba(,,,.75); + --mec-color-skin-rgba-4: rgba(,,,.11); + + --mec-color-skin: #40d9f1; + --mec-color-skin-rgba-1: rgba(64, 217, 241, .25); + --mec-color-skin-rgba-2: rgba(64, 217, 241, .5); + --mec-color-skin-rgba-3: rgba(64, 217, 241, .75); + --mec-color-skin-rgba-4: rgba(64, 217, 241, .11); + + --mec-container-normal-width: ; + + --mec-container-normal-width: 1196px; + + --mec-container-large-width: ; + + --mec-container-large-width: 1690px; + + --mec-title-color: ; + + --mec-title-color-hover: ; + + --mec-content-color: ; + + --mec-fes-main-color: ; + --mec-fes-main-color-rgba-1: rgba; + --mec-fes-main-color-rgba-2: rgba; + --mec-fes-main-color-rgba-3: rgba; + --mec-fes-main-color-rgba-4: rgba; + --mec-fes-main-color-rgba-5: rgb; + --mec-fes-main-color-rgba-6: rgba; + + --mec-fes-main-color: ; + --mec-fes-main-color-rgba-1: rgba; + --mec-fes-main-color-rgba-2: rgba; + --mec-fes-main-color-rgba-3: rgba; + --mec-fes-main-color-rgba-4: rgba; + --mec-fes-main-color-rgba-5: rgb; + --mec-fes-main-color-rgba-6: rgba; + + --mec-fluent-main-color: ; + --mec-fluent-main-color-rgba-1: rgba; + --mec-fluent-main-color-rgba-2: rgba; + --mec-fluent-main-color-rgba-3: rgba; + --mec-fluent-main-color-rgba-4: rgba; + --mec-fluent-main-color-rgba-5: rgba; + --mec-fluent-main-color-rgba-6: rgba; + + --mec-fluent-main-color: ; + --mec-fluent-main-color-rgba-1: rgba; + --mec-fluent-main-color-rgba-2: rgba; + --mec-fluent-main-color-rgba-3: rgba; + --mec-fluent-main-color-rgba-4: rgba; + --mec-fluent-main-color-rgba-5: rgba; + --mec-fluent-main-color-rgba-6: rgba; + + --mec-fluent-bold-color: ; + + --mec-fluent-bold-color: ; + + --mec-fluent-bg-hover-color: ; + + --mec-fluent-bg-hover-color: ; + + --mec-fluent-bg-color: ; + + --mec-fluent-bg-color: ; + + --mec-fluent-second-bg-color: ; + + --mec-fluent-second-bg-color: ; + + .mec-fluent-wrap.mec-skin-list-wrap .mec-calendar, + .mec-fluent-wrap .mec-skin-weekly-view-events-container, + .mec-fluent-wrap .mec-daily-view-events-left-side, + .mec-fluent-wrap .mec-daily-view-events-right-side, + .mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-calendar-sec, + .mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-agenda-sec, + .mec-fluent-wrap.mec-skin-grid-wrap .mec-calendar, + .mec-fluent-wrap.mec-skin-tile-container .mec-calendar, + .mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda-wrap { + max-height: unset !important; + } + + .mec-fes-form #mec_reg_form_field_types .button.red:before, .mec-fes-form #mec_reg_form_field_types .button.red { + border-color: #ffd2dd; + color: #ea6485; + } + + .mec-fes-form #mec_reg_form_field_types .button.red:hover, .mec-fes-form #mec_reg_form_field_types .button.red:before, .mec-fes-form #mec_reg_form_field_types .button:hover, .mec-fes-form #mec_bfixed_form_field_types .button:hover:before, .mec-fes-form #mec_reg_form_field_types .button:hover:before, .mec-fes-form #mec_bfixed_form_field_types .button:hover, .mec-fes-form .mec-form-row .button:not(.wp-color-result):hover { + color: #fff; + } + + .mec-fes-form .mec-meta-box-fields h4 label { + background: transparent; + } + + .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type2 .mec-event-sharing-wrap:hover li a, .mec-single-fluent-wrap .mec-booking-button, .mec-single-fluent-wrap .mec-booking-button, .mec-single-fluent-wrap .mec-booking-button, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type1 .mec-booking-button, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type4 .mec-booking-button, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type3 .mec-booking-button { + color: #fff !important; + } + + .mec-fluent-wrap .mec-yearly-view-wrap .mec-agenda-events-wrap { + background-color: transparent !important; + } + .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type1 .mec-date-wrap i, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type4 .mec-date-wrap i, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type2 .mec-date-wrap i { + background-color: #fff !important; + } + .mec-single-fluent-body .lity-content .mec-events-meta-group-booking button:hover, .mec-fluent-wrap.mec-single-fluent-wrap .mec-events-meta-group-booking button:hover { + background-color: #000 !important; + } + + .mec-fluent-wrap.mec-skin-cover-container .mec-event-sharing-wrap>li:first-of-type i, .mec-single-fluent-wrap .mec-single-event-bar .mec-booking-button, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type2 span.mec-event-day-num, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type2 .mec-event-sharing-wrap:hover li:first-child a { + color: #fff; + } + + .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type1 .mec-booking-button:hover, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type4 .mec-booking-button:hover, .mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type3 .mec-booking-button:hover { + background-color: #fff; + } + main->is_multilingual(); +$locale = $this->main->get_backend_active_locale(); + +$settings = $this->main->get_settings(); +$ml_settings = $this->main->get_ml_settings(NULL, $locale); + +// WordPress Pages +$pages = get_pages(); + +// Event Fields +$event_fields = $this->main->get_event_fields(); + +$mec_categories = get_terms(array( + 'taxonomy' => 'mec_category', + 'hide_empty' => false, +)); +?> +
    +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('fes'); ?> +
    + +
    +
    +
    +
    +
    + +
    + +
    +

    + +
    +
    +
    +
    +
    +
    + +
    + + +
    + +
    + +

    [MEC_fes_list]'); ?>

    +
    +
    +
    + +
    + +

    [MEC_fes_form]'); ?>

    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +

    + roles); ?> +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + + $r): ?> +
      +
    • + +
    • +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +

    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + +
    + +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + + getPRO()): ?> +
    + +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + getPartialPayment()->is_payable_per_event_enabled()): ?> +
    + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +

    + + esc_html__('Event Description', 'modern-events-calendar-lite'), + 'excerpt' => esc_html__('Excerpt', 'modern-events-calendar-lite'), + 'dates' => esc_html__('Dates', 'modern-events-calendar-lite'), + 'cost' => esc_html__('Cost', 'modern-events-calendar-lite'), + 'event_link' => esc_html__('Event Link', 'modern-events-calendar-lite'), + 'more_info_link' => esc_html__('More Info Link', 'modern-events-calendar-lite'), + 'category' => esc_html__('Category', 'modern-events-calendar-lite'), + 'location' => esc_html__('Location', 'modern-events-calendar-lite'), + 'featured_image' => esc_html__('Featured Image', 'modern-events-calendar-lite'), + 'label' => esc_html__('Label', 'modern-events-calendar-lite')) as $req_field => $label): ?> +
    + +
    + +
    + +
    + + + + + +
    +
    + +
    +
    +
    +
    + + + +
    + +factory->params('footer', ''); \ No newline at end of file diff --git a/app/features/mec/gateways.php b/app/features/mec/gateways.php new file mode 100755 index 0000000..9fd1925 --- /dev/null +++ b/app/features/mec/gateways.php @@ -0,0 +1,3 @@ + +
    +
    +
    +
    +

    +
    +
    + main->get_styling(); $darkadmin_mode = ( isset($styling['dark_mode']) ) ? $styling['dark_mode'] : ''; if ($darkadmin_mode == 1): $darklogo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w2.png'; else: $darklogo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w.png'; endif; ?> + + +
    +
    +
    +
    +
    +
    +
    +
    Pro Features
    +
    +
    +
    +
    +
    Modern Events Calendar Pro
    +

    Modern Events Calendar has been created according to trending design methods and latest technology with attractive design. + We gathered all features of event calendar as you desire with advanced booking system and many other useful options which are practical in real world! Below you can see a list of some of the pro features:

    +
    +
      +
    • Booking System
    • +
    • Reporting Dashboard
    • +
    • Timetable View
    • +
    • Map view + Directions
    • +
    • Reminders Notification
    • +
    • Weather module
    • +
    • PDF invoice
    • +
    • Mailchimp Integration
    • +
    • Campaign Monitor Integration
    • +
    +
      +
    • Cancellation Booking
    • +
    • Attendee list
    • +
    • Organizer payment (Commission System)
    • +
    • Advanced Tax/Fee system
    • +
    • Ticket Variations
    • +
    • Coupons/Discount system
    • +
    • Synchronization
    • +
    • MailerLite Integration
    • +
    • Constant Contact Integration
    • +
    +
    +
    Find out more +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    + '.esc_html__('lite', 'modern-events-calendar-lite').''); ?> +

    + + + +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/features/mec/ie.php b/app/features/mec/ie.php new file mode 100755 index 0000000..b66531d --- /dev/null +++ b/app/features/mec/ie.php @@ -0,0 +1,59 @@ + + +
    + +
    + +
    + main->get_sidebar_menu('ie'); ?> +
    + +
    + +
    + +
    +
    +
    +
    +
    +

    +
    +

    +

    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/app/features/mec/index.html b/app/features/mec/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/mec/integrations.php b/app/features/mec/integrations.php new file mode 100755 index 0000000..0261452 --- /dev/null +++ b/app/features/mec/integrations.php @@ -0,0 +1,517 @@ +main->get_settings(); + +// WordPress Pages +$pages = get_pages(); + +// MEC Categories +$categories = get_terms(array( + 'taxonomy' => 'mec_category', + 'hide_empty' => 0, +)); +if(!is_array($categories)) $categories = []; +?> +
    +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('integrations'); ?> +
    + +
    +
    +
    +
    +
    + +
    + + main->getPRO()): ?> + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + null, + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $settings['constantcontact_access_token']), + ))); + } + ?> + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    + +
    +
    +

    AWeber for WordPress'); ?>

    +

    '.esc_html__('here', 'modern-events-calendar-lite').''); ?>

    +
    +
    + +
    +

    +
    + +
    +
    + getLists(); ?> +
    + +
    + +
    +
    + +

    MailPoet'); ?>

    +
    +
    + +
    +

    +
    + +
    +
    + + +
    + +
    + +
    +
    + +

    WP Sendfox'); ?>

    +
    +
    + +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    +
    + +

    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    +
    +

    +
    + +
    +
    + +
    +
    + +
      + id]) and is_array($pmp_booking[$level->id])) ? $pmp_booking[$level->id] : []); ?> +
    • +
      name); ?>
      +
        + +
      • + +
      • + +
      +
    • + +
    + +
    +
    + +
    +

    +
    + + + + + +
    + + +
    +
    + +
    +
    +
    +
    + + + +
    +getFactory()->params('footer', function() +{ + ?> + + main->is_multilingual(); +$locale = $this->main->get_backend_active_locale(); + +$messages = $this->main->get_messages(); +$values = $this->main->get_messages_options(($multilingual ? $locale : NULL)); +?> +
    + +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('messages'); ?> +
    + +
    + +
    + +
    +
    +
    +
    +
    +

    +

    +
    +
      + $category): ?> +
    • +
      +
        + $message): ?> +
      • + + +
      • + +
      +
    • + +
    +
    +
    + + + + + +
    +
    +
    +
    +
    +
    +
    + + + +
    + +getFactory()->params('footer', function() +{ + ?> + + main->get_skins(); +$selected_skin = get_post_meta($post->ID, 'skin', true); +$sk_options = get_post_meta($post->ID, 'sk-options', true); + +// MEC Events +$events = $this->main->get_events(); + +// Upcoming Events +$upcoming_event_ids = $this->main->get_upcoming_event_ids(); +?> +
    + + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + order_method_field('list', (isset($sk_options_list['order_method']) ? $sk_options_list['order_method'] : 'ASC'))); ?> +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + display_pagination_field('list', $sk_options_list)); ?> +
    +
    + +
    +
    + + /> + +
    +
    + display_price_field('list', (isset($sk_options_list['display_price']) ? $sk_options_list['display_price'] : 0))); ?> + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('list', $sk_options_list['display_organizer'] ?? 0)); ?> + +
    +
    + +
    +
    + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + /> + + +
    +
    +

    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    + + booking_button_field('list', (isset($sk_options_list['booking_button']) ? $sk_options_list['booking_button'] : 0))); ?> + display_custom_data_field('list', (isset($sk_options_list['custom_data']) ? $sk_options_list['custom_data'] : 0))); ?> + display_status_bar_field('list', (isset($sk_options_list['status_bar']) ? $sk_options_list['status_bar'] : 0))); ?> +
    +
    + +
    +
    + + /> + +
    +
    +
    + sed_method_field('list', (isset($sk_options_list['sed_method']) ? $sk_options_list['sed_method'] : 0), (isset($sk_options_list['image_popup']) ? $sk_options_list['image_popup'] : 0))); ?> +
    + +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + order_method_field('grid', (isset($sk_options_grid['order_method']) ? $sk_options_grid['order_method'] : 'ASC'))); ?> +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + + + +
    +
    +

    +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + display_pagination_field('grid', $sk_options_grid)); ?> + display_price_field('grid', (isset($sk_options_grid['display_price']) ? $sk_options_grid['display_price'] : 0))); ?> + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('grid', $sk_options_grid['display_organizer'] ?? 0)); ?> + +
    +
    + +
    +
    + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + /> + + +
    +
    +

    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    + + booking_button_field('grid', (isset($sk_options_grid['booking_button']) ? $sk_options_grid['booking_button'] : 0))); ?> + display_custom_data_field('grid', (isset($sk_options_grid['custom_data']) ? $sk_options_grid['custom_data'] : 0))); ?> + sed_method_field('grid', (isset($sk_options_grid['sed_method']) ? $sk_options_grid['sed_method'] : 0), (isset($sk_options_grid['image_popup']) ? $sk_options_grid['image_popup'] : 0))); ?> + +
    + + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + +
    + + +
    +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + order_method_field('agenda', (isset($sk_options_agenda['order_method']) ? $sk_options_agenda['order_method'] : 'ASC'))); ?> +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + display_pagination_field('agenda', $sk_options_agenda)); ?> +
    +
    + +
    +
    + + /> + +
    +
    + booking_button_field('agenda', (isset($sk_options_agenda['booking_button']) ? $sk_options_agenda['booking_button'] : 0))); ?> + display_custom_data_field('agenda', (isset($sk_options_agenda['custom_data']) ? $sk_options_agenda['custom_data'] : 0))); ?> + sed_method_field('agenda', (isset($sk_options_agenda['sed_method']) ? $sk_options_agenda['sed_method'] : 0), (isset($sk_options_agenda['image_popup']) ? $sk_options_agenda['image_popup'] : 0))); ?> + +
    + + +
    + + +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    + +
    +
    + + +
    +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + order_method_field('full_calendar', (isset($sk_options_full_calendar['order_method_list']) ? $sk_options_full_calendar['order_method_list'] : 'ASC'), 'order_method_list')); ?> +
    +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + order_method_field('full_calendar', (isset($sk_options_full_calendar['order_method_grid']) ? $sk_options_full_calendar['order_method_grid'] : 'ASC'), 'order_method_grid')); ?> +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    +
    + +
    +
    + + main->getPRO()) + { + echo ' /> + +
    +
    + +
    + + + +
    +
    +
    + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').'', ''.esc_html__('Yearly View', 'modern-events-calendar-lite').''); ?>
    + +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    > +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    + display_price_field('full_calendar', (isset($sk_options_full_calendar['display_price']) ? $sk_options_full_calendar['display_price'] : 0))); ?> + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + booking_button_field('full_calendar', (isset($sk_options_full_calendar['booking_button']) ? $sk_options_full_calendar['booking_button'] : 0))); ?> + display_custom_data_field('full_calendar', (isset($sk_options_full_calendar['custom_data']) ? $sk_options_full_calendar['custom_data'] : 0))); ?> + sed_method_field('full_calendar', (isset($sk_options_full_calendar['sed_method']) ? $sk_options_full_calendar['sed_method'] : 0), (isset($sk_options_full_calendar['image_popup']) ? $sk_options_full_calendar['image_popup'] : 0))); ?> + +
    + + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + +
    + + +
    +
    + + +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    + main->get_months_labels() as $n => $month): ?> +
    + + /> + +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + /> + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +

    + booking_button_field('yearly_view', (isset($sk_options_yearly_view['booking_button']) ? $sk_options_yearly_view['booking_button'] : 0))); ?> + display_custom_data_field('yearly_view', (isset($sk_options_yearly_view['custom_data']) ? $sk_options_yearly_view['custom_data'] : 0))); ?> + sed_method_field('yearly_view', (isset($sk_options_yearly_view['sed_method']) ? $sk_options_yearly_view['sed_method'] : 0), (isset($sk_options_yearly_view['image_popup']) ? $sk_options_yearly_view['image_popup'] : 0))); ?> + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + /> + +
    +
    +

    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('monthly_view', $sk_options_monthly_view['display_organizer'] ?? 0)); ?> + +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    + booking_button_field('monthly_view', ($sk_options_monthly_view['booking_button'] ?? 0))); ?> + display_custom_data_field('monthly_view', ($sk_options_monthly_view['custom_data'] ?? 0))); ?> + display_detailed_time_field('monthly_view', ($sk_options_monthly_view['detailed_time'] ?? 0))); ?> + sed_method_field('monthly_view', ($sk_options_monthly_view['sed_method'] ?? 0), ($sk_options_monthly_view['image_popup'] ?? 0))); ?> + +
    + + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    + + /> + +
    +
    +

    + + + + +
    + + +
    + + +
    + + +
    + +
    + + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + /> + +
    +
    +

    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('daily_view', $sk_options_daily_view['display_organizer'] ?? 0)); ?> + + booking_button_field('daily_view', $sk_options_daily_view['booking_button'] ?? 0)); ?> + display_custom_data_field('daily_view', $sk_options_daily_view['custom_data'] ?? 0)); ?> + display_detailed_time_field('daily_view', $sk_options_daily_view['detailed_time'] ?? 0)); ?> + sed_method_field('daily_view', $sk_options_daily_view['sed_method'] ?? 0, $sk_options_daily_view['image_popup'] ?? 0)); ?> + +
    + + +
    + + +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('weekly_view', $sk_options_weekly_view['display_organizer'] ?? 0)); ?> + +
    +
    + +
    +
    + + /> + +
    +
    +

    + booking_button_field('weekly_view', ($sk_options_weekly_view['booking_button'] ?? 0))); ?> + display_custom_data_field('weekly_view', ($sk_options_weekly_view['custom_data'] ?? 0))); ?> + display_detailed_time_field('weekly_view', ($sk_options_weekly_view['detailed_time'] ?? 0))); ?> + sed_method_field('weekly_view', ($sk_options_weekly_view['sed_method'] ?? 0), ($sk_options_weekly_view['image_popup'] ?? 0))); ?> + +
    + + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + +
    + + +
    +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + + /> + +
    +
    +

    +
    +
    + booking_button_field('timetable', (isset($sk_options_timetable['booking_button']) ? $sk_options_timetable['booking_button'] : 0))); ?> + display_custom_data_field('timetable', (isset($sk_options_timetable['custom_data']) ? $sk_options_timetable['custom_data'] : 0))); ?> + sed_method_field('timetable', (isset($sk_options_timetable['sed_method']) ? $sk_options_timetable['sed_method'] : 0), (isset($sk_options_timetable['image_popup']) ? $sk_options_timetable['image_popup'] : 0))); ?> +
    + +
    + + +
    + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + + +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + order_method_field('masonry', (isset($sk_options_masonry['order_method']) ? $sk_options_masonry['order_method'] : 'ASC'))); ?> +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('masonry', $sk_options_masonry['display_organizer'] ?? 0)); ?> + +
    +
    + +

    +
    +
    + + /> + +
    +
    +
    +
    + +

    +
    +
    + + /> + +
    +
    + display_pagination_field('masonry', $sk_options_masonry)); ?> + booking_button_field('masonry', (isset($sk_options_masonry['booking_button']) ? $sk_options_masonry['booking_button'] : 0))); ?> + display_custom_data_field('masonry', (isset($sk_options_masonry['custom_data']) ? $sk_options_masonry['custom_data'] : 0))); ?> + sed_method_field('masonry', (isset($sk_options_masonry['sed_method']) ? $sk_options_masonry['sed_method'] : 0), (isset($sk_options_masonry['image_popup']) ? $sk_options_masonry['image_popup'] : 0))); ?> + +
    + + +
    + +
    + + +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + + +
    + +
    + + +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + + +
    + + main->getPRO()): ?> +
    main->get_pro_link()).'" target="_blank">'.esc_html__('Pro version of Modern Events Calendar', 'modern-events-calendar-lite').''); ?>
    + + + +
    + + +
    + +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + + + + + +
    + +
    + + +
    +
    + + +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + display_custom_data_field('slider', (isset($sk_options_slider['custom_data']) ? $sk_options_slider['custom_data'] : 0))); ?> + +
    + + +
    + + +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + order_method_field('timeline', (isset($sk_options_timeline['order_method']) ? $sk_options_timeline['order_method'] : 'ASC'))); ?> +
    + + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('timeline', $sk_options_timeline['display_organizer'] ?? 0)); ?> + + display_pagination_field('timeline', $sk_options_timeline)); ?> +
    +
    + +
    +
    + + /> + +
    +
    + booking_button_field('timeline', (isset($sk_options_timeline['booking_button']) ? $sk_options_timeline['booking_button'] : 0))); ?> + display_custom_data_field('timeline', (isset($sk_options_timeline['custom_data']) ? $sk_options_timeline['custom_data'] : 0))); ?> + sed_method_field('timeline', (isset($sk_options_timeline['sed_method']) ? $sk_options_timeline['sed_method'] : 0), (isset($sk_options_timeline['image_popup']) ? $sk_options_timeline['image_popup'] : 0))); ?> +
    + + +
    + + +
    + + +
    + +
    +
    +
    + + + + +
    +
    +

    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + + settings['organizers_status']) || $this->settings['organizers_status']) echo MEC_kses::form($this->display_organizer_field('tile', $sk_options_tile['display_organizer'] ?? 0)); ?> + +
    +
    + +
    +
    + + onchange="jQuery('#mec_tile_off_month_options').toggle();" /> + +
    +
    +

    +
    > +
    + + + +
    +
    +

    +
    + +
    +
    + display_pagination_field('tile', $sk_options_tile)); ?> +
    + booking_button_field('tile', (isset($sk_options_tile['booking_button']) ? $sk_options_tile['booking_button'] : 0))); ?> + display_custom_data_field('tile', (isset($sk_options_tile['custom_data']) ? $sk_options_tile['custom_data'] : 0))); ?> + sed_method_field('tile', (isset($sk_options_tile['sed_method']) ? $sk_options_tile['sed_method'] : 0), (isset($sk_options_tile['image_popup']) ? $sk_options_tile['image_popup'] : 0))); ?> +
    + + +
    + + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    +
    + + /> + + +
    +
    +

    +
    + +
    +
    +
    +
    + sed_method_field('general_calendar', (isset($sk_options_general_calendar['sed_method']) ? $sk_options_general_calendar['sed_method'] : 0), (isset($sk_options_general_calendar['image_popup']) ? $sk_options_general_calendar['image_popup'] : 0))); ?> +
    + +
    + + + +
    +
    +
    + + diff --git a/app/features/mec/meta_boxes/filter.php b/app/features/mec/meta_boxes/filter.php new file mode 100755 index 0000000..1c66096 --- /dev/null +++ b/app/features/mec/meta_boxes/filter.php @@ -0,0 +1,393 @@ + + */ +class MEC_tax_walker extends Walker_Category_Checklist +{ + public function start_el(&$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0) + { + $args['popular_cats'] = empty($args['popular_cats']) ? array() : $args['popular_cats']; + $class = in_array($data_object->term_id, $args['popular_cats']) ? ' class="popular-category"' : ''; + + $args['selected_cats'] = empty($args['selected_cats']) ? array() : $args['selected_cats']; + + if(!empty($args['list_only'])) + { + $aria_cheched = 'false'; + $inner_class = 'category'; + + if(in_array($data_object->term_id, $args['selected_cats'])) + { + $inner_class .= ' selected'; + $aria_cheched = 'true'; + } + // Show only Terms with Posts + if($data_object->count) + { + $output .= "\n".'
  • '. + ''; + } + } + else + { + // Show only Terms with Posts + if($data_object->count) + { + $output .= "\n
  • + +factory->params('footer', ''); diff --git a/app/features/mec/single.php b/app/features/mec/single.php new file mode 100755 index 0000000..ac7bddf --- /dev/null +++ b/app/features/mec/single.php @@ -0,0 +1,760 @@ +main->is_multilingual(); +$locale = $this->main->get_backend_active_locale(); + +$settings = $this->main->get_settings(); +$ml_settings = $this->main->get_ml_settings(NULL, $locale); + +// WordPress Pages +$pages = get_pages(); + +// Event Fields +$event_fields = $this->main->get_event_fields(); +?> +
    +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('single_event'); ?> +
    + +
    +
    +
    +
    +
    + +
    + +
    + +

    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + main->getPRO() and isset($this->settings['booking_status']) and $this->settings['booking_status']): ?> +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + getPRO()): ?> +
    +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +

    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + getPRO()): ?> +
    +
    +
    +
    +

    [mec-only-booked-users]', '[mec-only-booked-users]Hi[/mec-only-booked-users]'); ?>

    +
    +
    +
    + + +
    +
    +
    +
    +

    [mec-hourly-schedule event-id="1"]'); ?>

    +
    +
    +
    +
    + +
    + +
    +

    +
    +
    + +
    +
    +
    +
    +
    + + + +
      + $event_field) + { + if(!is_numeric($key)) continue; + $i = max($i, $key); + + if($event_field['type'] == 'text') echo MEC_kses::form($this->main->field_text($key, $event_field, 'event')); + elseif($event_field['type'] == 'email') echo MEC_kses::form($this->main->field_email($key, $event_field, 'event')); + elseif($event_field['type'] == 'url') echo MEC_kses::form($this->main->field_url($key, $event_field, 'event')); + elseif($event_field['type'] == 'date') echo MEC_kses::form($this->main->field_date($key, $event_field, 'event')); + elseif($event_field['type'] == 'tel') echo MEC_kses::form($this->main->field_tel($key, $event_field, 'event')); + elseif($event_field['type'] == 'textarea') echo MEC_kses::form($this->main->field_textarea($key, $event_field, 'event')); + elseif($event_field['type'] == 'p') echo MEC_kses::form($this->main->field_p($key, $event_field, 'event')); + elseif($event_field['type'] == 'checkbox') echo MEC_kses::form($this->main->field_checkbox($key, $event_field, 'event')); + elseif($event_field['type'] == 'radio') echo MEC_kses::form($this->main->field_radio($key, $event_field, 'event')); + elseif($event_field['type'] == 'select') echo MEC_kses::form($this->main->field_select($key, $event_field, 'event')); + } + ?> +
    +
    + + + + + + + + + + +
    +
    +
    + +
    +
    + main->field_text(':i:', array(), 'event')); ?> +
    +
    + main->field_email(':i:', array(), 'event')); ?> +
    +
    + main->field_url(':i:', array(), 'event')); ?> +
    +
    + main->field_tel(':i:', array(), 'event')); ?> +
    +
    + main->field_date(':i:', array(), 'event')); ?> +
    +
    + main->field_textarea(':i:', array(), 'event')); ?> +
    +
    + main->field_checkbox(':i:', array(), 'event')); ?> +
    +
    + main->field_radio(':i:', array(), 'event')); ?> +
    +
    + main->field_select(':i:', array(), 'event')); ?> +
    +
    + main->field_p(':i:', array(), 'event')); ?> +
    +
    + main->field_option(':fi:', ':i:', array(), 'event')); ?> +
    +
    +
    + +
    +
    + +

    +
    +
    +
    + +
    +

    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + +
    • + +
    • + +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + + + +
    • + +
    • + +
    +
    +
    +
    + +
    +

    + main->icons()->form( + 'single', + 'mec[settings]', + (isset($settings['icons']) && is_array($settings['icons']) ? $settings['icons'] : []) + ); ?> +
    + +
    + + + + + +
    +
    + +
    +
    +
    +
    + + + +
    + +factory->params('footer', ''); diff --git a/app/features/mec/styles.php b/app/features/mec/styles.php new file mode 100755 index 0000000..9946154 --- /dev/null +++ b/app/features/mec/styles.php @@ -0,0 +1,101 @@ +main->get_styles(); +?> + +
    + +
    + +
    + +
    + main->get_sidebar_menu('customcss'); ?> +
    + +
    + +
    + +
    +
    +
    +
    +
    +

    +
    + +

    + + +
    +
    +
    +
    +
    +
    +
    + + + +
    + +getFactory()->params('footer', function() +{ + ?> + + main->get_styling(); +$fonts = include MEC::import('app.features.mec.webfonts.webfonts', true, true); + +$google_fonts = []; +$google_fonts['none'] = array( + 'label'=>esc_html__('Default Font', 'modern-events-calendar-lite'), + 'variants'=>array('regular'), + 'subsets'=>array(), + 'category'=>'', + 'value'=>'', +); + +if(is_array($fonts)) +{ + foreach($fonts['items'] as $font) + { + $google_fonts[$font['family']] = array( + 'label'=>$font['family'], + 'variants'=>$font['variants'], + 'subsets'=>$font['subsets'], + 'category'=>$font['category'], + ); + } +} +?> +
    + +
    +
    + + +
    + +
    + +
    + main->get_sidebar_menu('styling'); ?> +
    + +
    + +
    + +
    +
    + +
    +
    +
    +

    + +
    +
    +
    + +
    +
    +
      + 'mec-colorskin-1', + '#0093d0'=>'mec-colorskin-2', + '#e53f51'=>'mec-colorskin-3', + '#f1c40f'=>'mec-colorskin-4', + '#e64883'=>'mec-colorskin-5', + '#45ab48'=>'mec-colorskin-6', + '#9661ab'=>'mec-colorskin-7', + '#0aad80'=>'mec-colorskin-8', + '#0ab1f0'=>'mec-colorskin-9', + '#ff5a00'=>'mec-colorskin-10', + '#c3512f'=>'mec-colorskin-11', + '#55606e'=>'mec-colorskin-12', + '#fe8178'=>'mec-colorskin-13', + '#7c6853'=>'mec-colorskin-14', + '#bed431'=>'mec-colorskin-15', + '#2d5c88'=>'mec-colorskin-16', + '#77da55'=>'mec-colorskin-17', + '#2997ab'=>'mec-colorskin-18', + '#734854'=>'mec-colorskin-19', + '#a81010'=>'mec-colorskin-20', + '#4ccfad'=>'mec-colorskin-21', + '#3a609f'=>'mec-colorskin-22', + '#333333'=>'mec-colorskin-23', + '#D2D2D2'=>'mec-colorskin-24', + '#636363'=>'mec-colorskin-25', + ); + + foreach($colorskins as $colorskin=>$values): ?> +
    • + +
    • + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +

    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + +
    + + + +
    +
    + +
    + +
    + + + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + +
    +
    +
    +
    +
    +
    +
    + + + +
    + +getFactory()->params('footer', function() +{ + ?> + + +
    +
    +
    +
    +

    +
    + + + +

    + +

    +
    +
    +
    + + +
    +
    +
    +
    + + getPRO()): ?> +
    +
    +
    +

    '.esc_html__('Dear user', 'modern-events-calendar-lite').''); ?>

    + Get 12 Month Premium Support + Get 6 Month Premium Support +
    +
    +
    + + + getPRO()): ?> +
    +
    +
    +

    '.esc_html__('Dear user', 'modern-events-calendar-lite').''); ?>

    + Get 12 Month Premium Support + Get 6 Month Premium Support +
    +
    +
    + + + + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + 1- Uploading the plugin file using FTP. For more information, please click here.
    + 2- Using the auto-update feature which needs the adding of the purchase code in the corresponding section in the plugin. For more information, please click here.', 'modern-events-calendar-lite') , 'https://webnus.net/dox/modern-events-calendar/how-to-update-manually-plugin/', 'https://webnus.net/dox/modern-events-calendar/how-to-auto-update-plugin/' ); ?> +
    + +
    +
    +
    + +
    +
    + click here.', 'modern-events-calendar-lite') , 'https://webnus.net/dox/modern-events-calendar/mec-theme-integration-guide/' ); ?> +
    + +
    +
    + click here.', 'modern-events-calendar-lite') , 'https://webnus.net/dox/modern-events-calendar/translate-mec/' ); ?> +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    • +
      +
      +
    • +
    +
    +
    +
    + +
    +
    +
    +
    + + + +

    main->URL('admin').'?mec-download-log-file=1">'.esc_html__('Download').''); ?>

    + +

    + + +

    + +
    +
    +
    + +
    + getPRO()) : ?> +
    +
    +
    +
    +
    +


    + +
    +
    +
    +
    + + +
    +
    + +factory->params('footer', function() +{ + ?> + + getPRO()): ?> + + + +
    + +
    + +
    + + +
    + +
    + +
    + +
    +
    +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + getPRO()): ?> +

    + +

    + +
    + getPRO()): ?> + + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/app/features/mec/webfonts/index.html b/app/features/mec/webfonts/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/mec/webfonts/webfonts.php b/app/features/mec/webfonts/webfonts.php new file mode 100755 index 0000000..8da4d97 --- /dev/null +++ b/app/features/mec/webfonts/webfonts.php @@ -0,0 +1,6 @@ + "webfonts#webfontList", "items" => array(array("kind" => "webfonts#webfont", "family" => "ABeeZee", "category" => "sans-serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/abeezee/v9/mE5BOuZKGln_Ex0uYKpIaw.ttf", "italic" => "http://fonts.gstatic.com/s/abeezee/v9/kpplLynmYgP0YtlJA3atRw.ttf")), array("kind" => "webfonts#webfont", "family" => "Abel", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/abel/v6/RpUKfqNxoyNe_ka23bzQ2A.ttf")), array("kind" => "webfonts#webfont", "family" => "Abril Fatface", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/abrilfatface/v8/X1g_KwGeBV3ajZIXQ9VnDojjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Aclonica", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/aclonica/v6/M6pHZMPwK3DiBSlo3jwAKQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Acme", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/acme/v5/-J6XNtAHPZBEbsifCdBt-g.ttf")), array("kind" => "webfonts#webfont", "family" => "Actor", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/actor/v6/ugMf40CrRK6Jf6Yz_xNSmQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Adamina", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/adamina/v8/RUQfOodOMiVVYqFZcSlT9w.ttf")), array("kind" => "webfonts#webfont", "family" => "Advent Pro", "category" => "sans-serif", "variants" => array("100", "200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext", "greek"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/adventpro/v4/87-JOpSUecTG50PBYK4ysi3USBnSvpkopQaUR-2r7iU.ttf", "200" => "http://fonts.gstatic.com/s/adventpro/v4/URTSSjIp0Wr-GrjxFdFWnGeudeTO44zf-ht3k-KNzwg.ttf", "300" => "http://fonts.gstatic.com/s/adventpro/v4/sJaBfJYSFgoB80OL1_66m0eOrDcLawS7-ssYqLr2Xp4.ttf", "500" => "http://fonts.gstatic.com/s/adventpro/v4/7kBth2-rT8tP40RmMMXMLJp-63r6doWhTEbsfBIRJ7A.ttf", "600" => "http://fonts.gstatic.com/s/adventpro/v4/3Jo-2maCzv2QLzQBzaKHV_pTEJqju4Hz1txDWij77d4.ttf", "700" => "http://fonts.gstatic.com/s/adventpro/v4/M4I6QiICt-ey_wZTpR2gKwJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/adventpro/v4/1NxMBeKVcNNH2H46AUR3wfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Aguafina Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/aguafinascript/v5/65g7cgMtMGnNlNyq_Z6CvMxLhO8OSNnfAp53LK1_iRs.ttf")), array("kind" => "webfonts#webfont", "family" => "Akronim", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/akronim/v5/qA0L2CSArk3tuOWE1AR1DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Aladin", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/aladin/v5/PyuJ5cVHkduO0j5fAMKvAA.ttf")), array("kind" => "webfonts#webfont", "family" => "Aldrich", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/aldrich/v6/kMMW1S56gFx7RP_mW1g-Eg.ttf")), array("kind" => "webfonts#webfont", "family" => "Alef", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "hebrew"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/alef/v6/VDgZJhEwudtOzOFQpZ8MEA.ttf", "regular" => "http://fonts.gstatic.com/s/alef/v6/ENvZ_P0HBDQxNZYCQO0lUA.ttf")), array("kind" => "webfonts#webfont", "family" => "Alegreya", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/alegreya/v7/5oZtdI5-wQwgAFrd9erCsaCWcynf_cDxXwCLxiixG1c.ttf", "900" => "http://fonts.gstatic.com/s/alegreya/v7/oQeMxX-vxGImzDgX6nxA7KCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/alegreya/v7/62J3atXd6bvMU4qO_ca-eA.ttf", "italic" => "http://fonts.gstatic.com/s/alegreya/v7/cbshnQGxwmlHBjUil7DaIfesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/alegreya/v7/IWi8e5bpnqhMRsZKTcTUWgJKKGfqHaYFsRG-T3ceEVo.ttf", "900italic" => "http://fonts.gstatic.com/s/alegreya/v7/-L71QLH_XqgYWaI1GbOVhp0EAVxt0G0biEntp43Qt6E.ttf")), array("kind" => "webfonts#webfont", "family" => "Alegreya SC", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUq3e1Pd76Vl7zRpE7NLJQ7XU.ttf", "900" => "http://fonts.gstatic.com/s/alegreyasc/v6/M9OIREoxDkvynwTpBAYUqyenaqEuufTBk9XMKnKmgDA.ttf", "regular" => "http://fonts.gstatic.com/s/alegreyasc/v6/3ozeFnTbygMK6PfHh8B-iqCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/alegreyasc/v6/GOqmv3FLsJ2r6ZALMZVBmkeOrDcLawS7-ssYqLr2Xp4.ttf", "700italic" => "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6c_zJjSACmk0BRPxQqhnNLU.ttf", "900italic" => "http://fonts.gstatic.com/s/alegreyasc/v6/5PCoU7IUfCicpKBJtBmP6U_yTOUGsoC54csJe1b-IRw.ttf")), array("kind" => "webfonts#webfont", "family" => "Alegreya Sans", "category" => "sans-serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v3", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PJFGFO4uyVFMfB6LZsii7kI.ttf", "300" => "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acB1LjARzAvdqa1uQC32v70.ttf", "500" => "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aQqQmZ7VjhwksfpNVG0pqGc.ttf", "700" => "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aVCbmAUID8LN-q3pJpOk3Ys.ttf", "800" => "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9acxnD5BewVtRRHHljCwR2bM.ttf", "900" => "http://fonts.gstatic.com/s/alegreyasans/v3/11EDm-lum6tskJMBbdy9aW42xlVP-j5dagE7-AU2zwg.ttf", "100italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/gRkSP2lBpqoMTVxg7DmVn2cDnjsrnI9_xJ-5gnBaHsE.ttf", "300italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CnfqlVoxTUFFx1C8tBqmbcg.ttf", "regular" => "http://fonts.gstatic.com/s/alegreyasans/v3/KYNzioYhDai7mTMnx_gDgn8f0n03UdmQgF_CLvNR2vg.ttf", "italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/TKyx_-JJ6MdpQruNk-t-PD4G9C9ttb0Oz5Cvf0qOitE.ttf", "500italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9Cs7DCVO6wo6i5LKIyZDzK40.ttf", "700italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CpF66r9C4AnxxlBlGd7xY4g.ttf", "800italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9CicOAJ_9MkLPbDmrtXDPbIU.ttf", "900italic" => "http://fonts.gstatic.com/s/alegreyasans/v3/WfiXipsmjqRqsDBQ1bA9ChRaDUI9aE8-k7PrIG2iiuo.ttf")), array("kind" => "webfonts#webfont", "family" => "Alegreya Sans SC", "category" => "sans-serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v3", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kVnzStfdnFU-MXbO84aBs_M.ttf", "300" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46-1IqtfxJspFjzJp0SaQRcI.ttf", "500" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46_hHTluI57wqxl55RvSYo3s.ttf", "700" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR4600aId5t1FC-xZ8nmpa_XLk.ttf", "800" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR46wQgSHD3Lo1Mif2Wkk5swWA.ttf", "900" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/AjAmkoP1y0Vaad0UPPR461Rf9EWUSEX_PR1d_gLKfpM.ttf", "100italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/qG3gA9iy5RpXMH4crZboqqakMVR0XlJhO7VdJ8yYvA4.ttf", "300italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0CnTKaH808trtzttbEg4yVA.ttf", "regular" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/6kgb6ZvOagoVIRZyl8XV-EklWX-XdLVn1WTiuGuvKIU.ttf", "italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/trwFkDJLOJf6hqM93944kTfqo69HNOlCNZvbwAmUtiA.ttf", "500italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0NqVvxKdFVwqwzilqfVd39U.ttf", "700italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IBYn3VD6xMEnodOh8pnFw4.ttf", "800italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0HStmCm6Rs90XeztCALm0H8.ttf", "900italic" => "http://fonts.gstatic.com/s/alegreyasanssc/v3/0VweK-TO3aQgazdxg8fs0IvtwEfTCJoOJugANj-jWDI.ttf")), array("kind" => "webfonts#webfont", "family" => "Alex Brush", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/alexbrush/v6/ooh3KJFbKJSUoIRWfiu8o_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Alfa Slab One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/alfaslabone/v5/Qx6FPcitRwTC_k88tLPc-Yjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Alice", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/alice/v7/wZTAfivekBqIg-rk63nFvQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Alike", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/alike/v8/Ho8YpRKNk_202fwDiGNIyw.ttf")), array("kind" => "webfonts#webfont", "family" => "Alike Angular", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/alikeangular/v6/OpeCu4xxI3qO1C7CZcJtPT3XH2uEnVI__ynTBvNyki8.ttf")), array("kind" => "webfonts#webfont", "family" => "Allan", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/allan/v7/zSxQiwo7wgnr7KkMXhSiag.ttf", "regular" => "http://fonts.gstatic.com/s/allan/v7/T3lemhgZmLQkQI2Qc2bQHA.ttf")), array("kind" => "webfonts#webfont", "family" => "Allerta", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/allerta/v7/s9FOEuiJFTNbMe06ifzV8g.ttf")), array("kind" => "webfonts#webfont", "family" => "Allerta Stencil", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/allertastencil/v7/CdSZfRtHbQrBohqmzSdDYFf2eT4jUldwg_9fgfY_tHc.ttf")), array("kind" => "webfonts#webfont", "family" => "Allura", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/allura/v4/4hcqgZanyuJ2gMYWffIR6A.ttf")), array("kind" => "webfonts#webfont", "family" => "Almendra", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/almendra/v8/ZpLdQMj7Q2AFio4nNO6A76CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/almendra/v8/PDpbB-ZF7deXAAEYPkQOeg.ttf", "italic" => "http://fonts.gstatic.com/s/almendra/v8/CNWLyiDucqVKVgr4EMidi_esZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/almendra/v8/-tXHKMcnn6FqrhJV3l1e3QJKKGfqHaYFsRG-T3ceEVo.ttf")), array("kind" => "webfonts#webfont", "family" => "Almendra Display", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/almendradisplay/v6/2Zuu97WJ_ez-87yz5Ai8fF6uyC_qD11hrFQ6EGgTJWI.ttf")), array("kind" => "webfonts#webfont", "family" => "Almendra SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/almendrasc/v6/IuiLd8Fm9I6raSalxMoWeaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Amarante", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/amarante/v4/2dQHjIBWSpydit5zkJZnOw.ttf")), array("kind" => "webfonts#webfont", "family" => "Amaranth", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/amaranth/v6/j5OFHqadfxyLnQRxFeox6qCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/amaranth/v6/7VcBog22JBHsHXHdnnycTA.ttf", "italic" => "http://fonts.gstatic.com/s/amaranth/v6/UrJlRY9LcVERJSvggsdBqPesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/amaranth/v6/BHyuYFj9nqLFNvOvGh0xTwJKKGfqHaYFsRG-T3ceEVo.ttf")), array("kind" => "webfonts#webfont", "family" => "Amatic SC", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/amaticsc/v8/IDnkRTPGcrSVo50UyYNK7y3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/amaticsc/v8/MldbRWLFytvqxU1y81xSVg.ttf")), array("kind" => "webfonts#webfont", "family" => "Amatica SC", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("700" => "http://fonts.gstatic.com/s/amaticasc/v1/nFmSxyAMfCP_5xGDJ4j5TgJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/amaticasc/v1/f9SWSy9DLsJV2etvm5rwGPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Amethysta", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/amethysta/v4/1jEo9tOFIJDolAUpBnWbnA.ttf")), array("kind" => "webfonts#webfont", "family" => "Amiko", "category" => "sans-serif", "variants" => array("regular", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("600" => "http://fonts.gstatic.com/s/amiko/v1/BaZst4RZ4sDyD3mH-BfVaA.ttf", "700" => "http://fonts.gstatic.com/s/amiko/v1/6syx43mQ07VvOmpFc0G9Lg.ttf", "regular" => "http://fonts.gstatic.com/s/amiko/v1/A7bjc3cOLJtGgpPGnxyHsw.ttf")), array("kind" => "webfonts#webfont", "family" => "Amiri", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "arabic"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/amiri/v7/WQsR_moz-FNqVwGYgptqiA.ttf", "regular" => "http://fonts.gstatic.com/s/amiri/v7/ATARrPmSew75SlpOw2YABQ.ttf", "italic" => "http://fonts.gstatic.com/s/amiri/v7/3t1yTQlLUXBw8htrqlXBrw.ttf", "700italic" => "http://fonts.gstatic.com/s/amiri/v7/uF8aNEyD0bxMeTBg9bFDSPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Amita", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/amita/v1/cIYA2Lzp7l2pcGsqpUidBg.ttf", "regular" => "http://fonts.gstatic.com/s/amita/v1/RhdhGBXSJqkHo6g7miTEcQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Anaheim", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/anaheim/v4/t-z8aXHMpgI2gjN_rIflKA.ttf")), array("kind" => "webfonts#webfont", "family" => "Andada", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/andada/v7/rSFaDqNNQBRw3y19MB5Y4w.ttf")), array("kind" => "webfonts#webfont", "family" => "Andika", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "vietnamese"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/andika/v7/oe-ag1G0lcqZ3IXfeEgaGg.ttf")), array("kind" => "webfonts#webfont", "family" => "Angkor", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/angkor/v8/DLpLgIS-8F10ecwKqCm95Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Annie Use Your Telescope", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/annieuseyourtelescope/v6/2cuiO5VmaR09C8SLGEQjGqbp7mtG8sPlcZvOaO8HBak.ttf")), array("kind" => "webfonts#webfont", "family" => "Anonymous Pro", "category" => "monospace", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext", "greek"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/anonymouspro/v9/WDf5lZYgdmmKhO8E1AQud--Cz_5MeePnXDAcLNWyBME.ttf", "regular" => "http://fonts.gstatic.com/s/anonymouspro/v9/Zhfjj_gat3waL4JSju74E-V_5zh5b-_HiooIRUBwn1A.ttf", "italic" => "http://fonts.gstatic.com/s/anonymouspro/v9/q0u6LFHwttnT_69euiDbWKwIsuKDCXG0NQm7BvAgx-c.ttf", "700italic" => "http://fonts.gstatic.com/s/anonymouspro/v9/_fVr_XGln-cetWSUc-JpfA1LL9bfs7wyIp6F8OC9RxA.ttf")), array("kind" => "webfonts#webfont", "family" => "Antic", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/antic/v7/hEa8XCNM7tXGzD0Uk0AipA.ttf")), array("kind" => "webfonts#webfont", "family" => "Antic Didone", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/anticdidone/v4/r3nJcTDuOluOL6LGDV1vRy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Antic Slab", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/anticslab/v4/PSbJCTKkAS7skPdkd7AKEvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Anton", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/anton/v7/XIbCenm-W0IRHWYIh7CGUQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Arapey", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/arapey/v5/dqu823lrSYn8T2gApTdslA.ttf", "italic" => "http://fonts.gstatic.com/s/arapey/v5/pY-Xi5JNBpaWxy2tZhEm5A.ttf")), array("kind" => "webfonts#webfont", "family" => "Arbutus", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/arbutus/v5/Go_hurxoUsn5MnqNVQgodQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Arbutus Slab", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/arbutusslab/v4/6k3Yp6iS9l4jRIpynA8qMy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Architects Daughter", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/architectsdaughter/v6/RXTgOOQ9AAtaVOHxx0IUBMCy0EhZjHzu-y0e6uLf4Fg.ttf")), array("kind" => "webfonts#webfont", "family" => "Archivo Black", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/archivoblack/v4/WoAoVT7K3k7hHfxKbvB6B51XQG8isOYYJhPIYAyrESQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Archivo Narrow", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/archivonarrow/v5/M__Wu4PAmHf4YZvQM8tWsMLtdzs3iyjn_YuT226ZsLU.ttf", "regular" => "http://fonts.gstatic.com/s/archivonarrow/v5/DsLzC9scoPnrGiwYYMQXppTvAuddT2xDMbdz0mdLyZY.ttf", "italic" => "http://fonts.gstatic.com/s/archivonarrow/v5/vqsrtPCpTU3tJlKfuXP5zUpmlyBQEFfdE6dERLXdQGQ.ttf", "700italic" => "http://fonts.gstatic.com/s/archivonarrow/v5/wG6O733y5zHl4EKCOh8rSTg5KB8MNJ4uPAETq9naQO8.ttf")), array("kind" => "webfonts#webfont", "family" => "Aref Ruqaa", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("700" => "http://fonts.gstatic.com/s/arefruqaa/v1/RT-Q5DVI9arM6ZKux-UmTAJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/arefruqaa/v1/kbqI055uLQz2hkccTTrYPfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Arima Madurai", "category" => "display", "variants" => array("100", "200", "300", "regular", "500", "700", "800", "900"), "subsets" => array("latin", "tamil", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/arimamadurai/v2/Q0tjl46beRRcUe3RlWWNrdyXLlNBCUjoM1yKFfVCFUI.ttf", "200" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4rArwWuxcSSKq67BdR6k5Rg.ttf", "300" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4joJ52uD-1fmXmi8u0n_zsc.ttf", "500" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4v_2zpxNHQ3utWt_82o9dAo.ttf", "700" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4qiiXuG_rGcOxkuidirlnJE.ttf", "800" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4khKLu0CevfTHM1eXjGnvQo.ttf", "900" => "http://fonts.gstatic.com/s/arimamadurai/v2/EsCGNPwBfkMk17-w_DTJ4kZ0oshA7r_PlGegwiHddT8.ttf", "regular" => "http://fonts.gstatic.com/s/arimamadurai/v2/8fNfThKRw_pr7MwgNdcHiW_MnNA9OgK8I1F23mNWOpE.ttf")), array("kind" => "webfonts#webfont", "family" => "Arimo", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "hebrew", "vietnamese"), "version" => "v9", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/arimo/v9/ZItXugREyvV9LnbY_gxAmw.ttf", "regular" => "http://fonts.gstatic.com/s/arimo/v9/Gpeo80g-5ji2CcyXWnzh7g.ttf", "italic" => "http://fonts.gstatic.com/s/arimo/v9/_OdGbnX2-qQ96C4OjhyuPw.ttf", "700italic" => "http://fonts.gstatic.com/s/arimo/v9/__nOLWqmeXdhfr0g7GaFePesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Arizonia", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/arizonia/v6/yzJqkHZqryZBTM7RKYV9Wg.ttf")), array("kind" => "webfonts#webfont", "family" => "Armata", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/armata/v6/1H8FwGgIRrbYtxSfXhOHlQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Artifika", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/artifika/v6/Ekfp4H4QG7D-WsABDOyj8g.ttf")), array("kind" => "webfonts#webfont", "family" => "Arvo", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/arvo/v9/OB3FDST7U38u3OjPK_vvRQ.ttf", "regular" => "http://fonts.gstatic.com/s/arvo/v9/vvWPwz-PlZEwjOOIKqoZzA.ttf", "italic" => "http://fonts.gstatic.com/s/arvo/v9/id5a4BCjbenl5Gkqonw_Rw.ttf", "700italic" => "http://fonts.gstatic.com/s/arvo/v9/Hvl2MuWoXLaCy2v6MD4Yvw.ttf")), array("kind" => "webfonts#webfont", "family" => "Arya", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/arya/v1/N13tgOvG7VTXawiI-fJiQA.ttf", "regular" => "http://fonts.gstatic.com/s/arya/v1/xEVqtU3v8QLospHKpDaYEw.ttf")), array("kind" => "webfonts#webfont", "family" => "Asap", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/asap/v4/o5RUA7SsJ80M8oDFBnrDbg.ttf", "regular" => "http://fonts.gstatic.com/s/asap/v4/2lf-1MDR8tsTpEtvJmr2hA.ttf", "italic" => "http://fonts.gstatic.com/s/asap/v4/mwxNHf8QS8gNWCAMwkJNIg.ttf", "700italic" => "http://fonts.gstatic.com/s/asap/v4/_rZz9y2oXc09jT5T6BexLQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Asar", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/asar/v2/mSmn3H5CcMA84CZ586X7WQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Asset", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/asset/v6/hfPmqY-JzuR1lULlQf9iTg.ttf")), array("kind" => "webfonts#webfont", "family" => "Assistant", "category" => "sans-serif", "variants" => array("200", "300", "regular", "600", "700", "800"), "subsets" => array("latin", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/assistant/v1/xXstfiHQzjB9j5ZxYTBoZy3USBnSvpkopQaUR-2r7iU.ttf", "300" => "http://fonts.gstatic.com/s/assistant/v1/vPC3tCw3LOzCSeGCtVp5Wi3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/assistant/v1/Y4UC5nQA69lWpfV0itoWLi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/assistant/v1/dZywGH4pMxP6OVyrppOJxy3USBnSvpkopQaUR-2r7iU.ttf", "800" => "http://fonts.gstatic.com/s/assistant/v1/-mTR0sX8a0RsadH4AMDT8C3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/assistant/v1/2iDwv6DBtyixlK5YHngp1w.ttf")), array("kind" => "webfonts#webfont", "family" => "Astloch", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/astloch/v6/aPkhM2tL-tz1jX6aX2rvo_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/astloch/v6/fmbitVmHYLQP7MGPuFgpag.ttf")), array("kind" => "webfonts#webfont", "family" => "Asul", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/asul/v5/uO8uNmxaq87-DdPmkEg5Gg.ttf", "regular" => "http://fonts.gstatic.com/s/asul/v5/9qpsNR_OOwyOYyo2N0IbBw.ttf")), array("kind" => "webfonts#webfont", "family" => "Athiti", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/athiti/v1/Ge5skdKwzxRPajVLdOJuIg.ttf", "300" => "http://fonts.gstatic.com/s/athiti/v1/OoT7lj4AaSp1JpGJLKn3CA.ttf", "500" => "http://fonts.gstatic.com/s/athiti/v1/W3pP-ANXfsMOVOG-cqqMFw.ttf", "600" => "http://fonts.gstatic.com/s/athiti/v1/kYx3dtUYNEuUlzWczYzsmQ.ttf", "700" => "http://fonts.gstatic.com/s/athiti/v1/tyXFOxQyZGXfqHhtqSikdw.ttf", "regular" => "http://fonts.gstatic.com/s/athiti/v1/e7eiIKP18Iz9Kg1xat6AYw.ttf")), array("kind" => "webfonts#webfont", "family" => "Atma", "category" => "display", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("bengali", "latin", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/atma/v1/noxn2r6cT3JgmEDt6Ip5pQ.ttf", "500" => "http://fonts.gstatic.com/s/atma/v1/Htksg3ZXeAEbSvUdTQX-uw.ttf", "600" => "http://fonts.gstatic.com/s/atma/v1/EGUwD65ZZn9IIHp5Y36b4A.ttf", "700" => "http://fonts.gstatic.com/s/atma/v1/-fkXl3wADUHjobbwO9d-Wg.ttf", "regular" => "http://fonts.gstatic.com/s/atma/v1/dkXPrLoE_uqcgUFj4JdfRQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Atomic Age", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/atomicage/v7/WvBMe4FxANIKpo6Oi0mVJ_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Aubrey", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/aubrey/v8/zo9w8klO8bmOQIMajQ2aTA.ttf")), array("kind" => "webfonts#webfont", "family" => "Audiowide", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/audiowide/v4/yGcwRZB6VmoYhPUYT-mEow.ttf")), array("kind" => "webfonts#webfont", "family" => "Autour One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/autourone/v5/2xmQBcg7FN72jaQRFZPIDvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Average", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/average/v4/aHUibBqdDbVYl5FM48pxyQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Average Sans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/averagesans/v4/dnU3R-5A_43y5bIyLztPsS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Averia Gruesa Libre", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/averiagruesalibre/v4/10vbZTOoN6T8D-nvDzwRFyXcKHuZXlCN8VkWHpkUzKM.ttf")), array("kind" => "webfonts#webfont", "family" => "Averia Libre", "category" => "display", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XacQoVhARpoaILP7amxE_8g.ttf", "700" => "http://fonts.gstatic.com/s/averialibre/v4/r6hGL8sSLm4dTzOPXgx5XUD2ttfZwueP-QU272T9-k4.ttf", "300italic" => "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkina0FLWfcB-J_SAYmcAXaI.ttf", "regular" => "http://fonts.gstatic.com/s/averialibre/v4/rYVgHZZQICWnhjguGsBspC3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/averialibre/v4/1etzuoNxVHR8F533EkD1WfMZXuCXbOrAvx5R0IT5Oyo.ttf", "700italic" => "http://fonts.gstatic.com/s/averialibre/v4/I6wAYuAvOgT7el2ePj2nkvAs9-1nE9qOqhChW0m4nDE.ttf")), array("kind" => "webfonts#webfont", "family" => "Averia Sans Libre", "category" => "display", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V4CP_KG_g80s1KXiBtJHoNc.ttf", "700" => "http://fonts.gstatic.com/s/averiasanslibre/v4/_9-jTfQjaBsWAF_yp5z-V8QwVOrz1y5GihpZmtKLhlI.ttf", "300italic" => "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88YuyGu4JqttndUh4gRKxic0.ttf", "regular" => "http://fonts.gstatic.com/s/averiasanslibre/v4/yRJpjT39KxACO9F31mj_LqV8_KRn4epKAjTFK1s1fsg.ttf", "italic" => "http://fonts.gstatic.com/s/averiasanslibre/v4/COEzR_NPBSUOl3pFwPbPoCZU2HnUZT1xVKaIrHDioao.ttf", "700italic" => "http://fonts.gstatic.com/s/averiasanslibre/v4/o7BEIK-fG3Ykc5Rzteh88bXy1DXgmJcVtKjM5UWamMs.ttf")), array("kind" => "webfonts#webfont", "family" => "Averia Serif Libre", "category" => "display", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8SmC4gFJ2PHmfdVKEd_5S9M.ttf", "700" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/yvITAdr5D1nlsdFswJAb8Q50KV5TaOVolur4zV2iZsg.ttf", "300italic" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCG2okl0bU63CauowU4iApig.ttf", "regular" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/fdtF30xa_Erw0zAzOoG4BZqY66i8AUyI16fGqw0iAew.ttf", "italic" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/o9qhvK9iT5iDWfyhQUe-6Ru_b0bTq5iipbJ9hhgHJ6U.ttf", "700italic" => "http://fonts.gstatic.com/s/averiaseriflibre/v5/YOLFXyye4sZt6AZk1QybCNxohRXP4tNDqG3X4Hqn21k.ttf")), array("kind" => "webfonts#webfont", "family" => "Bad Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("cyrillic", "latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/badscript/v5/cRyUs0nJ2eMQFHwBsZNRXfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Baloo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/baloo/v1/uFkbq9GEAWUcT0XNeptJ1Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Baloo Bhai", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/baloobhai/v1/FQvpC-04bh2QINuWAdnNW_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Baloo Da", "category" => "display", "variants" => array("regular"), "subsets" => array("bengali", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/balooda/v1/RAJ0l2eJl_HDURCVxRE1iQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Baloo Thambi", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "tamil", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/baloothambi/v1/qXK3dZIeU-O-HruaN5cK0y3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Balthazar", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/balthazar/v5/WgbaSIs6dJAGXJ0qbz2xlw.ttf")), array("kind" => "webfonts#webfont", "family" => "Bangers", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bangers/v8/WAffdge5w99Xif-DLeqmcA.ttf")), array("kind" => "webfonts#webfont", "family" => "Basic", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/basic/v6/hNII2mS5Dxw5C0u_m3mXgA.ttf")), array("kind" => "webfonts#webfont", "family" => "Battambang", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/battambang/v9/dezbRtMzfzAA99DmrCYRMgJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/battambang/v9/MzrUfQLefYum5vVGM3EZVPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Baumans", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/baumans/v5/o0bFdPW1H5kd5saqqOcoVg.ttf")), array("kind" => "webfonts#webfont", "family" => "Bayon", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bayon/v8/yTubusjTnpNRZwA4_50iVw.ttf")), array("kind" => "webfonts#webfont", "family" => "Belgrano", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/belgrano/v6/iq8DUa2s7g6WRCeMiFrmtQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Belleza", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/belleza/v4/wchA3BWJlVqvIcSeNZyXew.ttf")), array("kind" => "webfonts#webfont", "family" => "BenchNine", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/benchnine/v4/ah9xtUy9wLQ3qnWa2p-piS3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/benchnine/v4/qZpi6ZVZg3L2RL_xoBLxWS3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/benchnine/v4/h3OAlYqU3aOeNkuXgH2Q2w.ttf")), array("kind" => "webfonts#webfont", "family" => "Bentham", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/bentham/v6/5-Mo8Fe7yg5tzV0GlQIuzQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Berkshire Swash", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/berkshireswash/v4/4RZJjVRPjYnC2939hKCAimKfbtsIjCZP_edQljX9gR0.ttf")), array("kind" => "webfonts#webfont", "family" => "Bevan", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/bevan/v7/Rtg3zDsCeQiaJ_Qno22OJA.ttf")), array("kind" => "webfonts#webfont", "family" => "Bigelow Rules", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bigelowrules/v4/FEJCPLwo07FS-6SK6Al50X8f0n03UdmQgF_CLvNR2vg.ttf")), array("kind" => "webfonts#webfont", "family" => "Bigshot One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bigshotone/v6/wSyZjBNTWDQHnvWE2jt6j6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Bilbo", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bilbo/v6/-ty-lPs5H7OIucWbnpFrkA.ttf")), array("kind" => "webfonts#webfont", "family" => "Bilbo Swash Caps", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bilboswashcaps/v7/UB_-crLvhx-PwGKW1oosDmYeFSdnSpRYv5h9gpdlD1g.ttf")), array("kind" => "webfonts#webfont", "family" => "BioRhyme", "category" => "serif", "variants" => array("200", "300", "regular", "700", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/biorhyme/v1/bj-6g_1gJHCc9xQZtLWL36CWcynf_cDxXwCLxiixG1c.ttf", "300" => "http://fonts.gstatic.com/s/biorhyme/v1/jWqHmLFlu30n7xp12uZd8qCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/biorhyme/v1/36KN76U1iKt5TFDm2lBz0KCWcynf_cDxXwCLxiixG1c.ttf", "800" => "http://fonts.gstatic.com/s/biorhyme/v1/k6bYbUnESjLYnworWvSTL6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/biorhyme/v1/n6v5UkVPy_CjbP3fvsu1CA.ttf")), array("kind" => "webfonts#webfont", "family" => "BioRhyme Expanded", "category" => "serif", "variants" => array("200", "300", "regular", "700", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/biorhymeexpanded/v2/FKL4Vyxmq2vsiDrSOzz2sC7oxZzNh3ej55UHm-HviBI.ttf", "300" => "http://fonts.gstatic.com/s/biorhymeexpanded/v2/FKL4Vyxmq2vsiDrSOzz2sFu4cYPPksG4MRjB5UiYPPw.ttf", "700" => "http://fonts.gstatic.com/s/biorhymeexpanded/v2/FKL4Vyxmq2vsiDrSOzz2sMVisRVfPEfQ0jijOMQbr0Q.ttf", "800" => "http://fonts.gstatic.com/s/biorhymeexpanded/v2/FKL4Vyxmq2vsiDrSOzz2sIv1v1eCT6RPbcYZYQ1T1CE.ttf", "regular" => "http://fonts.gstatic.com/s/biorhymeexpanded/v2/hgBNpgjTRZzGmZxqN5OuVjndr_hij4ilAk2n1d1AhsE.ttf")), array("kind" => "webfonts#webfont", "family" => "Biryani", "category" => "sans-serif", "variants" => array("200", "300", "regular", "600", "700", "800", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/biryani/v1/Xx38YzyTFF8n6mRS1Yd88vesZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/biryani/v1/u-bneRbizmFMd0VQp5Ze6vesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/biryani/v1/1EdcPCVxBR2txgjrza6_YPesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/biryani/v1/qN2MTZ0j1sKSCtfXLB2dR_esZW2xOQ-xsNqO47m55DA.ttf", "800" => "http://fonts.gstatic.com/s/biryani/v1/DJyziS7FEy441v22InYdevesZW2xOQ-xsNqO47m55DA.ttf", "900" => "http://fonts.gstatic.com/s/biryani/v1/trcLkrIut0lM_PPSyQfAMPesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/biryani/v1/W7bfR8-IY76Xz0QoB8L2xw.ttf")), array("kind" => "webfonts#webfont", "family" => "Bitter", "category" => "serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/bitter/v8/4dUtr_4BvHuoRU35suyOAg.ttf", "regular" => "http://fonts.gstatic.com/s/bitter/v8/w_BNdJvVZDRmqy5aSfB2kQ.ttf", "italic" => "http://fonts.gstatic.com/s/bitter/v8/TC0FZEVzXQIGgzmRfKPZbA.ttf")), array("kind" => "webfonts#webfont", "family" => "Black Ops One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/blackopsone/v7/2XW-DmDsGbDLE372KrMW1Yjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Bokor", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bokor/v8/uAKdo0A85WW23Gs6mcbw7A.ttf")), array("kind" => "webfonts#webfont", "family" => "Bonbon", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bonbon/v7/IW3u1yzG1knyW5oz0s9_6Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Boogaloo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/boogaloo/v6/4Wu1tvFMoB80fSu8qLgQfQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Bowlby One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bowlbyone/v7/eKpHjHfjoxM2bX36YNucefesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Bowlby One SC", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bowlbyonesc/v8/8ZkeXftTuzKBtmxOYXoRedDkZCMxWJecxjvKm2f8MJw.ttf")), array("kind" => "webfonts#webfont", "family" => "Brawler", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/brawler/v6/3gfSw6imxQnQxweVITqUrg.ttf")), array("kind" => "webfonts#webfont", "family" => "Bree Serif", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/breeserif/v5/5h9crBVIrvZqgf34FHcnEfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Bubblegum Sans", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bubblegumsans/v5/Y9iTUUNz6lbl6TrvV4iwsytnKWgpfO2iSkLzTz-AABg.ttf")), array("kind" => "webfonts#webfont", "family" => "Bubbler One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/bubblerone/v4/e8S0qevkZAFaBybtt_SU4qCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Buda", "category" => "display", "variants" => array("300"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/buda/v6/hLtAmNUmEMJH2yx7NGUjnA.ttf")), array("kind" => "webfonts#webfont", "family" => "Buenard", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/buenard/v7/yUlGE115dGr7O9w9FlP3UvesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/buenard/v7/NSpMPGKAUgrLrlstYVvIXQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Bungee", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/bungee/v2/0jM4G9s968t1_tpwzM9UDg.ttf")), array("kind" => "webfonts#webfont", "family" => "Bungee Hairline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/bungeehairline/v2/8Li3dr3whdkxuk7pmLaZaSom6rTIagUDR1YFcrrRZjQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Bungee Inline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/bungeeinline/v2/Tb-1914q4rFpjT-F66PLCYjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Bungee Outline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/bungeeoutline/v2/PcidvzXIcqS2Qwxm_iG6bLAREgn5xbW23GEXXnhMQ5Y.ttf")), array("kind" => "webfonts#webfont", "family" => "Bungee Shade", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/bungeeshade/v2/HSW7pxPYXBWkq7OSnuXoeC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Butcherman", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/butcherman/v7/bxiJmD567sPBVpJsT0XR0vesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Butterfly Kids", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/butterflykids/v4/J4NTF5M25htqeTffYImtlUZaDk62iwTBnbnvwSjZciA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cabin", "category" => "sans-serif", "variants" => array("regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/cabin/v9/HgsCQ-k3_Z_uQ86aFolNBg.ttf", "600" => "http://fonts.gstatic.com/s/cabin/v9/eUDAvKhBtmTCkeVBsFk34A.ttf", "700" => "http://fonts.gstatic.com/s/cabin/v9/4EKhProuY1hq_WCAomq9Dg.ttf", "regular" => "http://fonts.gstatic.com/s/cabin/v9/XeuAFYo2xAPHxZGBbQtHhA.ttf", "italic" => "http://fonts.gstatic.com/s/cabin/v9/0tJ9k3DI5xC4GBgs1E_Jxw.ttf", "500italic" => "http://fonts.gstatic.com/s/cabin/v9/50sjhrGE0njyO-7mGDhGP_esZW2xOQ-xsNqO47m55DA.ttf", "600italic" => "http://fonts.gstatic.com/s/cabin/v9/sFQpQDBd3G2om0Nl5dD2CvesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/cabin/v9/K83QKi8MOKLEqj6bgZ7LrfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cabin Condensed", "category" => "sans-serif", "variants" => array("regular", "500", "600", "700"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/cabincondensed/v8/Ez4zJbsGr2BgXcNUWBVgEARL_-ABKXdjsJSPT0lc2Bk.ttf", "600" => "http://fonts.gstatic.com/s/cabincondensed/v8/Ez4zJbsGr2BgXcNUWBVgELS5sSASxc8z4EQTQj7DCAI.ttf", "700" => "http://fonts.gstatic.com/s/cabincondensed/v8/Ez4zJbsGr2BgXcNUWBVgEMAWgzcA047xWLixhLCofl8.ttf", "regular" => "http://fonts.gstatic.com/s/cabincondensed/v8/B0txb0blf2N29WdYPJjMSiQPsWWoiv__AzYJ9Zzn9II.ttf")), array("kind" => "webfonts#webfont", "family" => "Cabin Sketch", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cabinsketch/v9/ki3SSN5HMOO0-IOLOj069ED2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/cabinsketch/v9/d9fijO34zQajqQvl3YHRCS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Caesar Dressing", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/caesardressing/v5/2T_WzBgE2Xz3FsyJMq34T9gR43u4FvCuJwIfF5Zxl6Y.ttf")), array("kind" => "webfonts#webfont", "family" => "Cagliostro", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cagliostro/v5/i85oXbtdSatNEzss99bpj_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cairo", "category" => "sans-serif", "variants" => array("200", "300", "regular", "600", "700", "900"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/cairo/v1/9BU6Hrio9syG9zwo_CNPXg.ttf", "300" => "http://fonts.gstatic.com/s/cairo/v1/mpy3SIEJVOIfFnVLujcRDg.ttf", "600" => "http://fonts.gstatic.com/s/cairo/v1/Ct_3a0tcTEyNNSnuZKDd7g.ttf", "700" => "http://fonts.gstatic.com/s/cairo/v1/ONxTSBYfmg-V5CkIwS_5gQ.ttf", "900" => "http://fonts.gstatic.com/s/cairo/v1/Fm-hIVCp5OI5mO4Ec71jcw.ttf", "regular" => "http://fonts.gstatic.com/s/cairo/v1/-tPnHq7mmAjcjJRSjsuZGA.ttf")), array("kind" => "webfonts#webfont", "family" => "Calligraffitti", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/calligraffitti/v7/vLVN2Y-z65rVu1R7lWdvyDXz_orj3gX0_NzfmYulrko.ttf")), array("kind" => "webfonts#webfont", "family" => "Cambay", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cambay/v1/jw9niBxa04eEhnSwTWCEgw.ttf", "regular" => "http://fonts.gstatic.com/s/cambay/v1/etU9Bab4VuhzS-OKsb1VXg.ttf", "italic" => "http://fonts.gstatic.com/s/cambay/v1/ZEz9yNqpEOgejaw1rBhugQ.ttf", "700italic" => "http://fonts.gstatic.com/s/cambay/v1/j-5v_uUr0NXTumWN0siOiaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Cambo", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cambo/v5/PnwpRuTdkYCf8qk4ajmNRA.ttf")), array("kind" => "webfonts#webfont", "family" => "Candal", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/candal/v6/x44dDW28zK7GR1gGDBmj9g.ttf")), array("kind" => "webfonts#webfont", "family" => "Cantarell", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/cantarell/v6/Yir4ZDsCn4g1kWopdg-ehC3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/cantarell/v6/p5ydP_uWQ5lsFzcP_XVMEw.ttf", "italic" => "http://fonts.gstatic.com/s/cantarell/v6/DTCLtOSqP-7dgM-V_xKUjqCWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/cantarell/v6/weehrwMeZBXb0QyrWnRwFXe1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Cantata One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/cantataone/v6/-a5FDvnBqaBMDaGgZYnEfqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Cantora One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cantoraone/v5/oI-DS62RbHI8ZREjp73ehqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Capriola", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/capriola/v4/JxXPlkdzWwF9Cwelbvi9jA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cardo", "category" => "serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "greek-ext", "latin-ext", "greek"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cardo/v8/lQN30weILimrKvp8rZhF1w.ttf", "regular" => "http://fonts.gstatic.com/s/cardo/v8/jbkF2_R0FKUEZTq5dwSknQ.ttf", "italic" => "http://fonts.gstatic.com/s/cardo/v8/pcv4Np9tUkq0YREYUcEEJQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Carme", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/carme/v7/08E0NP1eRBEyFRUadmMfgA.ttf")), array("kind" => "webfonts#webfont", "family" => "Carrois Gothic", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/carroisgothic/v5/GCgb7bssGpwp7V5ynxmWy2x3d0cwUleGuRTmCYfCUaM.ttf")), array("kind" => "webfonts#webfont", "family" => "Carrois Gothic SC", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/carroisgothicsc/v5/bVp4nhwFIXU-r3LqUR8DSJTdPW1ioadGi2uRiKgJVCY.ttf")), array("kind" => "webfonts#webfont", "family" => "Carter One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/carterone/v8/5X_LFvdbcB7OBG7hBgZ7fPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Catamaran", "category" => "sans-serif", "variants" => array("100", "200", "300", "regular", "500", "600", "700", "800", "900"), "subsets" => array("latin", "tamil", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/catamaran/v1/ilWHBiy0krUPdlmYxDuqC6CWcynf_cDxXwCLxiixG1c.ttf", "200" => "http://fonts.gstatic.com/s/catamaran/v1/hFc-HKSsGk6M-psujei1MC3USBnSvpkopQaUR-2r7iU.ttf", "300" => "http://fonts.gstatic.com/s/catamaran/v1/Aaag4ccR7Oh_4eai-jbrYC3USBnSvpkopQaUR-2r7iU.ttf", "500" => "http://fonts.gstatic.com/s/catamaran/v1/83WSX3F86qsvj1Z4EI0tQi3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/catamaran/v1/a9PlHHnuBWiGGk0TwuFKTi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/catamaran/v1/PpgVtUHUdnBZYNpnzGbScy3USBnSvpkopQaUR-2r7iU.ttf", "800" => "http://fonts.gstatic.com/s/catamaran/v1/6VjB_uSfn3DZ93IQv58CmC3USBnSvpkopQaUR-2r7iU.ttf", "900" => "http://fonts.gstatic.com/s/catamaran/v1/5ys9TqpQc9Q6gHqbSox6py3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/catamaran/v1/MdNkM-DU8f6R-25Nxpr_XA.ttf")), array("kind" => "webfonts#webfont", "family" => "Caudex", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "greek-ext", "latin-ext", "greek"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/caudex/v6/PetCI4GyQ5Q3LiOzUu_mMg.ttf", "regular" => "http://fonts.gstatic.com/s/caudex/v6/PWEexiHLDmQbn2b1OPZWfg.ttf", "italic" => "http://fonts.gstatic.com/s/caudex/v6/XjMZF6XCisvV3qapD4oJdw.ttf", "700italic" => "http://fonts.gstatic.com/s/caudex/v6/yT8YeHLjaJvQXlUEYOA8gqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Caveat", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/caveat/v2/LkaFtQENGJry2eUMwGRTeA.ttf", "regular" => "http://fonts.gstatic.com/s/caveat/v2/8I23b6N-6rRVbh-C_Vx3yA.ttf")), array("kind" => "webfonts#webfont", "family" => "Caveat Brush", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/caveatbrush/v2/_d7bgsk3hfC4DXnUEeYKsy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Cedarville Cursive", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/cedarvillecursive/v7/cuCe6HrkcqrWTWTUE7dw-41zwq9-z_Lf44CzRAA0d0Y.ttf")), array("kind" => "webfonts#webfont", "family" => "Ceviche One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cevicheone/v7/WOaXIMBD4VYMy39MsobJhKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Changa", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700", "800"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/changa/v2/QNWVD9FzsnhVmHzE7HryDQ.ttf", "300" => "http://fonts.gstatic.com/s/changa/v2/OKZ0H1bMg3M9EZMVzgQ9fg.ttf", "500" => "http://fonts.gstatic.com/s/changa/v2/KrXcHYf9ILB8aFWCj0Vfxg.ttf", "600" => "http://fonts.gstatic.com/s/changa/v2/6uCpqxwcsYkfV0M8Ls6WPA.ttf", "700" => "http://fonts.gstatic.com/s/changa/v2/vAXzeaPkdpxlejFN7h0ibw.ttf", "800" => "http://fonts.gstatic.com/s/changa/v2/H3IsiH2Fx0Pc4_OU4HSpng.ttf", "regular" => "http://fonts.gstatic.com/s/changa/v2/7_e8qktkj6uKM0DamZJY9Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Changa One", "category" => "display", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/changaone/v9/dr4qjce4W3kxFrZRkVD87fesZW2xOQ-xsNqO47m55DA.ttf", "italic" => "http://fonts.gstatic.com/s/changaone/v9/wJVQlUs1lAZel-WdTo2U9y3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Chango", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/chango/v5/3W3AeMMtRTH08t5qLOjBmg.ttf")), array("kind" => "webfonts#webfont", "family" => "Chathura", "category" => "sans-serif", "variants" => array("100", "300", "regular", "700", "800"), "subsets" => array("latin", "telugu"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/chathura/v1/7tUse0wFXIOSPewsdeNXPvesZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/chathura/v1/Gmhr6ULHnPDt9spOZrHOfKCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/chathura/v1/BO9LvNAseMQ3n1tKWH-uTKCWcynf_cDxXwCLxiixG1c.ttf", "800" => "http://fonts.gstatic.com/s/chathura/v1/prh_X_5NSsBQefIdGi5B6KCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/chathura/v1/7hRNO-_zjRopkcP2n1rr8g.ttf")), array("kind" => "webfonts#webfont", "family" => "Chau Philomene One", "category" => "sans-serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/chauphilomeneone/v5/KKc5egCL-a2fFVoOA2x6tBFi5dxgSTdxqnMJgWkBJcg.ttf", "italic" => "http://fonts.gstatic.com/s/chauphilomeneone/v5/eJj1PY_iN4KiIuyOvtMHJP6uyLkxyiC4WcYA74sfquE.ttf")), array("kind" => "webfonts#webfont", "family" => "Chela One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/chelaone/v5/h5O0dEnpnIq6jQnWxZybrA.ttf")), array("kind" => "webfonts#webfont", "family" => "Chelsea Market", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/chelseamarket/v4/qSdzwh2A4BbNemy78sJLfAAI1i8fIftCBXsBF2v9UMI.ttf")), array("kind" => "webfonts#webfont", "family" => "Chenla", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/chenla/v9/aLNpdAUDq2MZbWz2U1a16g.ttf")), array("kind" => "webfonts#webfont", "family" => "Cherry Cream Soda", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/cherrycreamsoda/v6/OrD-AUnFcZeeKa6F_c0_WxOiHiuAPYA9ry3O1RG2XIU.ttf")), array("kind" => "webfonts#webfont", "family" => "Cherry Swash", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/cherryswash/v4/-CfyMyQqfucZPQNB0nvYyED2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/cherryswash/v4/HqOk7C7J1TZ5i3L-ejF0vi3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Chewy", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/chewy/v7/hcDN5cvQdIu6Bx4mg_TSyw.ttf")), array("kind" => "webfonts#webfont", "family" => "Chicle", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/chicle/v5/xg4q57Ut9ZmyFwLp51JLgg.ttf")), array("kind" => "webfonts#webfont", "family" => "Chivo", "category" => "sans-serif", "variants" => array("regular", "italic", "900", "900italic"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("900" => "http://fonts.gstatic.com/s/chivo/v7/JAdkiWd46QCW4vOsj3dzTA.ttf", "regular" => "http://fonts.gstatic.com/s/chivo/v7/L88PEuzS9eRfHRZhAPhZyw.ttf", "italic" => "http://fonts.gstatic.com/s/chivo/v7/Oe3-Q-a2kBzPnhHck_baMg.ttf", "900italic" => "http://fonts.gstatic.com/s/chivo/v7/LoszYnE86q2wJEOjCigBQ_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Chonburi", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/chonburi/v1/jd9PfbW0x_8Myt_XeUxvSQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Cinzel", "category" => "serif", "variants" => array("regular", "700", "900"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cinzel/v4/nYcFQ6_3pf_6YDrOFjBR8Q.ttf", "900" => "http://fonts.gstatic.com/s/cinzel/v4/FTBj72ozM2cEOSxiVsRb3A.ttf", "regular" => "http://fonts.gstatic.com/s/cinzel/v4/GF7dy_Nc-a6EaHYSyGd-EA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cinzel Decorative", "category" => "display", "variants" => array("regular", "700", "900"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F95-YYVDmZkJErg0zgx9XuZI.ttf", "900" => "http://fonts.gstatic.com/s/cinzeldecorative/v4/pXhIVnhFtL_B9Vb1wq2F97Khqbv0zQZa0g-9HOXAalU.ttf", "regular" => "http://fonts.gstatic.com/s/cinzeldecorative/v4/fmgK7oaJJIXAkhd9798yQgT5USbJx2F82lQbogPy2bY.ttf")), array("kind" => "webfonts#webfont", "family" => "Clicker Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/clickerscript/v4/Zupmk8XwADjufGxWB9KThBnpV0hQCek3EmWnCPrvGRM.ttf")), array("kind" => "webfonts#webfont", "family" => "Coda", "category" => "display", "variants" => array("regular", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v11", "lastModified" => "2016-05-31", "files" => array("800" => "http://fonts.gstatic.com/s/coda/v11/6ZIw0sbALY0KTMWllZB3hQ.ttf", "regular" => "http://fonts.gstatic.com/s/coda/v11/yHDvulhg-P-p2KRgRrnUYw.ttf")), array("kind" => "webfonts#webfont", "family" => "Coda Caption", "category" => "sans-serif", "variants" => array("800"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("800" => "http://fonts.gstatic.com/s/codacaption/v9/YDl6urZh-DUFhiMBTgAnz_qsay_1ZmRGmC8pVRdIfAg.ttf")), array("kind" => "webfonts#webfont", "family" => "Codystar", "category" => "display", "variants" => array("300", "regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/codystar/v4/EVaUzfJkcb8Zqx9kzQLXqqCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/codystar/v4/EN-CPFKYowSI7SuR7-0cZA.ttf")), array("kind" => "webfonts#webfont", "family" => "Coiny", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "tamil", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/coiny/v1/B-pC9lRxssd2RDK37Rdekw.ttf")), array("kind" => "webfonts#webfont", "family" => "Combo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/combo/v5/Nab98KjR3JZSSPGtzLyXNw.ttf")), array("kind" => "webfonts#webfont", "family" => "Comfortaa", "category" => "display", "variants" => array("300", "regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "greek"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/comfortaa/v7/r_tUZNl0G8xCoOmp_JkSCi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/comfortaa/v7/fND5XPYKrF2tQDwwfWZJIy3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/comfortaa/v7/lZx6C1VViPgSOhCBUP7hXA.ttf")), array("kind" => "webfonts#webfont", "family" => "Coming Soon", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/comingsoon/v6/Yz2z3IAe2HSQAOWsSG8COKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Concert One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/concertone/v7/N5IWCIGhUNdPZn_efTxKN6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Condiment", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/condiment/v4/CstmdiPpgFSV0FUNL5LrJA.ttf")), array("kind" => "webfonts#webfont", "family" => "Content", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/content/v8/7PivP8Zvs2qn6F6aNbSQe_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/content/v8/l8qaLjygvOkDEU2G6-cjfQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Contrail One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/contrailone/v6/b41KxjgiyqX-hkggANDU6C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Convergence", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/convergence/v5/eykrGz1NN_YpQmkAZjW-qKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Cookie", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cookie/v7/HxeUC62y_YdDbiFlze357A.ttf")), array("kind" => "webfonts#webfont", "family" => "Copse", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/copse/v6/wikLrtPGjZDvZ5w2i5HLWg.ttf")), array("kind" => "webfonts#webfont", "family" => "Corben", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/corben/v9/lirJaFSQWdGQuV--fksg5g.ttf", "regular" => "http://fonts.gstatic.com/s/corben/v9/tTysMZkt-j8Y5yhkgsoajQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant", "category" => "serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorant/v1/diggKPcUerIA8GQWRVxsVS3USBnSvpkopQaUR-2r7iU.ttf", "500" => "http://fonts.gstatic.com/s/cormorant/v1/lwoiMb1lzDf49h802vpRUy3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/cormorant/v1/LKEtp8XimHLN0gSYqnV9qy3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/cormorant/v1/vOi7JV5F3JmPzXDgUqUwgS3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/cormorant/v1/UydD9tmk-DfLnEFRr_bBZy9-WlPSxbfiI49GsXo3q0g.ttf", "regular" => "http://fonts.gstatic.com/s/cormorant/v1/9vWr5LgrNEgvhv1P3z9uuQ.ttf", "italic" => "http://fonts.gstatic.com/s/cormorant/v1/zzcH3j00ejnIc8jicdcz6KCWcynf_cDxXwCLxiixG1c.ttf", "500italic" => "http://fonts.gstatic.com/s/cormorant/v1/UydD9tmk-DfLnEFRr_bBZ8CNfqCYlB_eIx7H1TVXe60.ttf", "600italic" => "http://fonts.gstatic.com/s/cormorant/v1/UydD9tmk-DfLnEFRr_bBZ5Z7xm-Bj30Bj2KNdXDzSZg.ttf", "700italic" => "http://fonts.gstatic.com/s/cormorant/v1/UydD9tmk-DfLnEFRr_bBZ3e1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant Garamond", "category" => "serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/iEjm9hVxcattz37Y8gZwVXDeRRUpi2fYbqcTC9PsYaU.ttf", "500" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/iEjm9hVxcattz37Y8gZwVSkwnhSVYGQY4MSUB3uw374.ttf", "600" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/iEjm9hVxcattz37Y8gZwVVc2xdGA7R8efE0K6NwSoyI.ttf", "700" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/iEjm9hVxcattz37Y8gZwVdNg01MkafbqNYmDx8wt95c.ttf", "300italic" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/zuqx3k1yUEl3Eavo-ZPEAjZXe39LdglsIzDOvKnCCso.ttf", "regular" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/EI2hhCO6kSfLAy-Dpd8fd7_BES7rBA-D9Lo3vCx9yHc.ttf", "italic" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/eGTlzchVxDKKvK6d7drzlkVlEttMzBRhK_wsRQ4MqEE.ttf", "500italic" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/zuqx3k1yUEl3Eavo-ZPEAq8qrY1CcUgPLrA3ytfr3SY.ttf", "600italic" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/zuqx3k1yUEl3Eavo-ZPEAqms9Rm_p2hhD4xhClOGPEw.ttf", "700italic" => "http://fonts.gstatic.com/s/cormorantgaramond/v1/zuqx3k1yUEl3Eavo-ZPEAvEntfLz8TC-DlAIEJQEwCA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant Infant", "category" => "serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorantinfant/v1/MYRpw6pQIf0XStsiZXQWA_alucuYFvoGqpCMGloCN2Y.ttf", "500" => "http://fonts.gstatic.com/s/cormorantinfant/v1/MYRpw6pQIf0XStsiZXQWA4PJQ8Vh-2Qw35Pq7cVYzdo.ttf", "600" => "http://fonts.gstatic.com/s/cormorantinfant/v1/MYRpw6pQIf0XStsiZXQWA9G0tNuOpbNMRdNl4S5e-n0.ttf", "700" => "http://fonts.gstatic.com/s/cormorantinfant/v1/MYRpw6pQIf0XStsiZXQWAx-3ZynwDtU_450Ho62jf_I.ttf", "300italic" => "http://fonts.gstatic.com/s/cormorantinfant/v1/PK34LKusK6SSQFR2m5-LZgNCjGMFnYSoo4kW2wZNowE.ttf", "regular" => "http://fonts.gstatic.com/s/cormorantinfant/v1/q5F0I_a42y_qtMoOtqdjagGlf-pqPDOheSBqZOVpkRo.ttf", "italic" => "http://fonts.gstatic.com/s/cormorantinfant/v1/U6OamtMgLoVs0zd53Z1pNpbq6_N3pcDBvA-VsecMIAA.ttf", "500italic" => "http://fonts.gstatic.com/s/cormorantinfant/v1/PK34LKusK6SSQFR2m5-LZq9x-au7fLBTFpfuT52_G64.ttf", "600italic" => "http://fonts.gstatic.com/s/cormorantinfant/v1/PK34LKusK6SSQFR2m5-LZkZbdnTqrL_1WMEFjxg0OwY.ttf", "700italic" => "http://fonts.gstatic.com/s/cormorantinfant/v1/PK34LKusK6SSQFR2m5-LZmKEEmz9BBHY1o7RrRAiUXQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant SC", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorantsc/v1/CCo4fI9EYzhUJcvojQ9Em6cQoVhARpoaILP7amxE_8g.ttf", "500" => "http://fonts.gstatic.com/s/cormorantsc/v1/CCo4fI9EYzhUJcvojQ9Em5MQuUSAwdHsY8ov_6tk1oA.ttf", "600" => "http://fonts.gstatic.com/s/cormorantsc/v1/CCo4fI9EYzhUJcvojQ9Em2v8CylhIUtwUiYO7Z2wXbE.ttf", "700" => "http://fonts.gstatic.com/s/cormorantsc/v1/CCo4fI9EYzhUJcvojQ9Em0D2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/cormorantsc/v1/o2HxNCgvhmwJdltu-68tzC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant Unicase", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorantunicase/v1/-0mwRHhjEGfrz-UDHJ_78TyAYAK5JX1-zBpfFXu9t3Y.ttf", "500" => "http://fonts.gstatic.com/s/cormorantunicase/v1/-0mwRHhjEGfrz-UDHJ_78WActzpz5sLElWWJpZBcHK4.ttf", "600" => "http://fonts.gstatic.com/s/cormorantunicase/v1/-0mwRHhjEGfrz-UDHJ_78U0bQT13XmwBbvkXy6Yb64Y.ttf", "700" => "http://fonts.gstatic.com/s/cormorantunicase/v1/-0mwRHhjEGfrz-UDHJ_78Z5CFeQBXku3ADXbkP2V7W8.ttf", "regular" => "http://fonts.gstatic.com/s/cormorantunicase/v1/THO7JMNV6qRoZlg7dU5RUz01TLsHlMvD1uPU3gXOh9s.ttf")), array("kind" => "webfonts#webfont", "family" => "Cormorant Upright", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/cormorantupright/v1/PwJT_lCdbLUyVq-tARIPhjCfCvaSiUMfec2BKBTMAaw.ttf", "500" => "http://fonts.gstatic.com/s/cormorantupright/v1/PwJT_lCdbLUyVq-tARIPhiWhx5Kr-bzfZXhgF-AnSvk.ttf", "600" => "http://fonts.gstatic.com/s/cormorantupright/v1/PwJT_lCdbLUyVq-tARIPhuDigFx2V_wQ4SOTZdg5a2s.ttf", "700" => "http://fonts.gstatic.com/s/cormorantupright/v1/PwJT_lCdbLUyVq-tARIPhuO6SP7lRr11seyd3AkK37Q.ttf", "regular" => "http://fonts.gstatic.com/s/cormorantupright/v1/0n68kajKjTOJn9EPQkf1a-ojtTJJf2MtgkoRSid3NcM.ttf")), array("kind" => "webfonts#webfont", "family" => "Courgette", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/courgette/v4/2YO0EYtyE9HUPLZprahpZA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cousine", "category" => "monospace", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "hebrew", "vietnamese"), "version" => "v10", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/cousine/v10/FXEOnNUcCzhdtoBxiq-lovesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/cousine/v10/GYX4bPXObJNJo63QJEUnLg.ttf", "italic" => "http://fonts.gstatic.com/s/cousine/v10/1WtIuajLoo8vjVwsrZ3eOg.ttf", "700italic" => "http://fonts.gstatic.com/s/cousine/v10/y_AZ5Sz-FwL1lux2xLSTZS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Coustard", "category" => "serif", "variants" => array("regular", "900"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("900" => "http://fonts.gstatic.com/s/coustard/v6/W02OCWO6OfMUHz6aVyegQ6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/coustard/v6/iO2Rs5PmqAEAXoU3SkMVBg.ttf")), array("kind" => "webfonts#webfont", "family" => "Covered By Your Grace", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/coveredbyyourgrace/v6/6ozZp4BPlrbDRWPe3EBGA6CVUMdvnk-GcAiZQrX9Gek.ttf")), array("kind" => "webfonts#webfont", "family" => "Crafty Girls", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/craftygirls/v5/0Sv8UWFFdhQmesHL32H8oy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Creepster", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/creepster/v5/0vdr5kWJ6aJlOg5JvxnXzQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Crete Round", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/creteround/v5/B8EwN421qqOCCT8vOH4wJ6CWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/creteround/v5/5xAt7XK2vkUdjhGtt98unUeOrDcLawS7-ssYqLr2Xp4.ttf")), array("kind" => "webfonts#webfont", "family" => "Crimson Text", "category" => "serif", "variants" => array("regular", "italic", "600", "600italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("600" => "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I2v8CylhIUtwUiYO7Z2wXbE.ttf", "700" => "http://fonts.gstatic.com/s/crimsontext/v6/rEy5tGc5HdXy56Xvd4f3I0D2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/crimsontext/v6/3IFMwfRa07i-auYR-B-zNS3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/crimsontext/v6/a5QZnvmn5amyNI-t2BMkWPMZXuCXbOrAvx5R0IT5Oyo.ttf", "600italic" => "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDIR-5-urNOGAobhAyctHvW8.ttf", "700italic" => "http://fonts.gstatic.com/s/crimsontext/v6/4j4TR-EfnvCt43InYpUNDPAs9-1nE9qOqhChW0m4nDE.ttf")), array("kind" => "webfonts#webfont", "family" => "Croissant One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/croissantone/v4/mPjsOObnC77fp1cvZlOfIYjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Crushed", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/crushed/v6/aHwSejs3Kt0Lg95u7j32jA.ttf")), array("kind" => "webfonts#webfont", "family" => "Cuprum", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/cuprum/v7/6tl3_FkDeXSD72oEHuJh4w.ttf", "regular" => "http://fonts.gstatic.com/s/cuprum/v7/JgXs0F_UiaEdAS74msmFNg.ttf", "italic" => "http://fonts.gstatic.com/s/cuprum/v7/cLEz0KV6OxInnktSzpk58g.ttf", "700italic" => "http://fonts.gstatic.com/s/cuprum/v7/bnkXaBfoYvaJ75axRPSwVKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Cutive", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cutive/v8/G2bW-ImyOCwKxBkLyz39YQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Cutive Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/cutivemono/v4/ncWQtFVKcSs8OW798v30k6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Damion", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/damion/v6/13XtECwKxhD_VrOqXL4SiA.ttf")), array("kind" => "webfonts#webfont", "family" => "Dancing Script", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/dancingscript/v7/KGBfwabt0ZRLA5W1ywjowb_dAmXiKjTPGCuO6G2MbfA.ttf", "regular" => "http://fonts.gstatic.com/s/dancingscript/v7/DK0eTGXiZjN6yA8zAEyM2RnpV0hQCek3EmWnCPrvGRM.ttf")), array("kind" => "webfonts#webfont", "family" => "Dangrek", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dangrek/v8/LOaFhBT-EHNxZjV8DAW_ew.ttf")), array("kind" => "webfonts#webfont", "family" => "David Libre", "category" => "serif", "variants" => array("regular", "500", "700"), "subsets" => array("latin", "latin-ext", "hebrew", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("500" => "http://fonts.gstatic.com/s/davidlibre/v1/ea-623K8OFNeGhfSzdpmysCNfqCYlB_eIx7H1TVXe60.ttf", "700" => "http://fonts.gstatic.com/s/davidlibre/v1/ea-623K8OFNeGhfSzdpmyne1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/davidlibre/v1/Fp_YuX4CP0pzlSUtACdOo6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Dawning of a New Day", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dawningofanewday/v7/JiDsRhiKZt8uz3NJ5xA06gXLnohmOYWQZqo_sW8GLTk.ttf")), array("kind" => "webfonts#webfont", "family" => "Days One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/daysone/v6/kzwZjNhc1iabMsrc_hKBIA.ttf")), array("kind" => "webfonts#webfont", "family" => "Dekko", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dekko/v3/AKtgABKC1rUxgIgS-bpojw.ttf")), array("kind" => "webfonts#webfont", "family" => "Delius", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/delius/v6/TQA163qafki2-gV-B6F_ag.ttf")), array("kind" => "webfonts#webfont", "family" => "Delius Swash Caps", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/deliusswashcaps/v8/uXyrEUnoWApxIOICunRq7yIrxb5zDVgU2N3VzXm7zq4.ttf")), array("kind" => "webfonts#webfont", "family" => "Delius Unicase", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/deliusunicase/v9/7FTMTITcb4dxUp99FAdTqNy5weKXdcrx-wE0cgECMq8.ttf", "regular" => "http://fonts.gstatic.com/s/deliusunicase/v9/b2sKujV3Q48RV2PQ0k1vqu6rPKfVZo7L2bERcf0BDns.ttf")), array("kind" => "webfonts#webfont", "family" => "Della Respira", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/dellarespira/v4/F4E6Lo_IZ6L9AJCcbqtDVeDcg5akpSnIcsPhLOFv7l8.ttf")), array("kind" => "webfonts#webfont", "family" => "Denk One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/denkone/v4/TdXOeA4eA_hEx4W8Sh9wPw.ttf")), array("kind" => "webfonts#webfont", "family" => "Devonshire", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/devonshire/v5/I3ct_2t12SYizP8ZC-KFi_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Dhurjati", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dhurjati/v4/uV6jO5e2iFMbGB0z79Cy5g.ttf")), array("kind" => "webfonts#webfont", "family" => "Didact Gothic", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/didactgothic/v7/v8_72sD3DYMKyM0dn3LtWotBLojGU5Qdl8-5NL4v70w.ttf")), array("kind" => "webfonts#webfont", "family" => "Diplomata", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/diplomata/v8/u-ByBiKgN6rTMA36H3kcKg.ttf")), array("kind" => "webfonts#webfont", "family" => "Diplomata SC", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/diplomatasc/v5/JdVwAwfE1a_pahXjk5qpNi3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Domine", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/domine/v4/phBcG1ZbQFxUIt18hPVxnw.ttf", "regular" => "http://fonts.gstatic.com/s/domine/v4/wfVIgamVFjMNQAEWurCiHA.ttf")), array("kind" => "webfonts#webfont", "family" => "Donegal One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/donegalone/v4/6kN4-fDxz7T9s5U61HwfF6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Doppio One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/doppioone/v4/WHZ3HJQotpk_4aSMNBo_t_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Dorsa", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dorsa/v7/wCc3cUe6XrmG2LQE6GlIrw.ttf")), array("kind" => "webfonts#webfont", "family" => "Dosis", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/dosis/v6/ztftab0r6hcd7AeurUGrSQ.ttf", "300" => "http://fonts.gstatic.com/s/dosis/v6/awIB6L0h5mb0plIKorXmuA.ttf", "500" => "http://fonts.gstatic.com/s/dosis/v6/ruEXDOFMxDPGnjCBKRqdAQ.ttf", "600" => "http://fonts.gstatic.com/s/dosis/v6/KNAswRNwm3tfONddYyidxg.ttf", "700" => "http://fonts.gstatic.com/s/dosis/v6/AEEAj0ONidK8NQQMBBlSig.ttf", "800" => "http://fonts.gstatic.com/s/dosis/v6/nlrKd8E69vvUU39XGsvR7Q.ttf", "regular" => "http://fonts.gstatic.com/s/dosis/v6/rJRlixu-w0JZ1MyhJpao_Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Dr Sugiyama", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/drsugiyama/v5/S5Yx3MIckgoyHhhS4C9Tv6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Droid Sans", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/droidsans/v6/EFpQQyG9GqCrobXxL-KRMQJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/droidsans/v6/rS9BT6-asrfjpkcV3DXf__esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Droid Sans Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/droidsansmono/v7/ns-m2xQYezAtqh7ai59hJcwD6PD0c3_abh9zHKQtbGU.ttf")), array("kind" => "webfonts#webfont", "family" => "Droid Serif", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/droidserif/v6/QQt14e8dY39u-eYBZmppwXe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/droidserif/v6/DgAtPy6rIVa2Zx3Xh9KaNaCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/droidserif/v6/cj2hUnSRBhwmSPr9kS5890eOrDcLawS7-ssYqLr2Xp4.ttf", "700italic" => "http://fonts.gstatic.com/s/droidserif/v6/c92rD_x0V1LslSFt3-QEps_zJjSACmk0BRPxQqhnNLU.ttf")), array("kind" => "webfonts#webfont", "family" => "Duru Sans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/durusans/v9/xn7iYH8xwmSyTvEV_HOxTw.ttf")), array("kind" => "webfonts#webfont", "family" => "Dynalight", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/dynalight/v5/-CWsIe8OUDWTIHjSAh41kA.ttf")), array("kind" => "webfonts#webfont", "family" => "EB Garamond", "category" => "serif", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "vietnamese"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/ebgaramond/v7/CDR0kuiFK7I1OZ2hSdR7G6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Eagle Lake", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/eaglelake/v4/ZKlYin7caemhx9eSg6RvPfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Eater", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/eater/v5/gm6f3OmYEdbs3lPQtUfBkA.ttf")), array("kind" => "webfonts#webfont", "family" => "Economica", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/economica/v4/UK4l2VEpwjv3gdcwbwXE9C3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/economica/v4/G4rJRujzZbq9Nxngu9l3hg.ttf", "italic" => "http://fonts.gstatic.com/s/economica/v4/p5O9AVeUqx_n35xQRinNYaCWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/economica/v4/ac5dlUsedQ03RqGOeay-3Xe1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Eczar", "category" => "serif", "variants" => array("regular", "500", "600", "700", "800"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("500" => "http://fonts.gstatic.com/s/eczar/v4/Ooe4KaPp2594tF8TbMfdlQ.ttf", "600" => "http://fonts.gstatic.com/s/eczar/v4/IjQsWW0bmgkZ6lnN72cnTQ.ttf", "700" => "http://fonts.gstatic.com/s/eczar/v4/ELC8RVXfBMb3VuuHtMwBOA.ttf", "800" => "http://fonts.gstatic.com/s/eczar/v4/9Uyt6nTZLx_Qj5_WRah-iQ.ttf", "regular" => "http://fonts.gstatic.com/s/eczar/v4/uKZcAQ5JBBs1UbeXFRbBRg.ttf")), array("kind" => "webfonts#webfont", "family" => "Ek Mukta", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700", "800"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/ekmukta/v7/crtkNHh5JcM3VJKG0E-B36CWcynf_cDxXwCLxiixG1c.ttf", "300" => "http://fonts.gstatic.com/s/ekmukta/v7/mpaAv7CIyk0VnZlqSneVxKCWcynf_cDxXwCLxiixG1c.ttf", "500" => "http://fonts.gstatic.com/s/ekmukta/v7/PZ1y2MstFczWvBlFSgzMyaCWcynf_cDxXwCLxiixG1c.ttf", "600" => "http://fonts.gstatic.com/s/ekmukta/v7/Z5Mfzeu6M3emakcJO2QeTqCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/ekmukta/v7/4ugcOGR28Jn-oBIn0-qLYaCWcynf_cDxXwCLxiixG1c.ttf", "800" => "http://fonts.gstatic.com/s/ekmukta/v7/O68TH5OjEhVmn9_gIrcfS6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/ekmukta/v7/aFcjXdC5jyJ1p8w54wIIrg.ttf")), array("kind" => "webfonts#webfont", "family" => "El Messiri", "category" => "sans-serif", "variants" => array("regular", "500", "600", "700"), "subsets" => array("cyrillic", "latin", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("500" => "http://fonts.gstatic.com/s/elmessiri/v1/kQW9PA2krAOzditagrX75pp-63r6doWhTEbsfBIRJ7A.ttf", "600" => "http://fonts.gstatic.com/s/elmessiri/v1/HYl7TNqFfA1utGLZRWwzLPpTEJqju4Hz1txDWij77d4.ttf", "700" => "http://fonts.gstatic.com/s/elmessiri/v1/ji73glXFIetaSqMU3cz7rAJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/elmessiri/v1/dik94vfrFvHFnvdvxaX8N_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Electrolize", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/electrolize/v5/yFVu5iokC-nt4B1Cyfxb9aCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Elsie", "category" => "display", "variants" => array("regular", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("900" => "http://fonts.gstatic.com/s/elsie/v5/1t-9f0N2NFYwAgN7oaISqg.ttf", "regular" => "http://fonts.gstatic.com/s/elsie/v5/gwspePauE45BJu6Ok1QrfQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Elsie Swash Caps", "category" => "display", "variants" => array("regular", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("900" => "http://fonts.gstatic.com/s/elsieswashcaps/v4/iZnus9qif0tR5pGaDv5zdKoKBWBozTtxi30NfZDOXXU.ttf", "regular" => "http://fonts.gstatic.com/s/elsieswashcaps/v4/9L3hIJMPCf6sxCltnxd6X2YeFSdnSpRYv5h9gpdlD1g.ttf")), array("kind" => "webfonts#webfont", "family" => "Emblema One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/emblemaone/v5/7IlBUjBWPIiw7cr_O2IfSaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Emilys Candy", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/emilyscandy/v4/PofLVm6v1SwZGOzC8s-I3S3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Engagement", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/engagement/v5/4Uz0Jii7oVPcaFRYmbpU6vesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Englebert", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/englebert/v4/sll38iOvOuarDTYBchlP3Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Enriqueta", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/enriqueta/v5/I27Pb-wEGH2ajLYP0QrtSC3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/enriqueta/v5/_p90TrIwR1SC-vDKtmrv6A.ttf")), array("kind" => "webfonts#webfont", "family" => "Erica One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ericaone/v7/cIBnH2VAqQMIGYAcE4ufvQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Esteban", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/esteban/v4/ESyhLgqDDyK5JcFPp2svDw.ttf")), array("kind" => "webfonts#webfont", "family" => "Euphoria Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/euphoriascript/v4/c4XB4Iijj_NvSsCF4I0O2MxLhO8OSNnfAp53LK1_iRs.ttf")), array("kind" => "webfonts#webfont", "family" => "Ewert", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ewert/v4/Em8hrzuzSbfHcTVqMjbAQg.ttf")), array("kind" => "webfonts#webfont", "family" => "Exo", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/exo/v4/RI7A9uwjRmPbVp0n8e-Jvg.ttf", "200" => "http://fonts.gstatic.com/s/exo/v4/F8OfC_swrRRxpFt-tlXZQg.ttf", "300" => "http://fonts.gstatic.com/s/exo/v4/SBrN7TKUqgGUvfxqHqsnNw.ttf", "500" => "http://fonts.gstatic.com/s/exo/v4/jCg6DmGGXt_OVyp5ofQHPw.ttf", "600" => "http://fonts.gstatic.com/s/exo/v4/q_SG5kXUmOcIvFpgtdZnlw.ttf", "700" => "http://fonts.gstatic.com/s/exo/v4/3_jwsL4v9uHjl5Q37G57mw.ttf", "800" => "http://fonts.gstatic.com/s/exo/v4/yLPuxBuV0lzqibRJyooOJg.ttf", "900" => "http://fonts.gstatic.com/s/exo/v4/97d0nd6Yv4-SA_X92xAuZA.ttf", "100italic" => "http://fonts.gstatic.com/s/exo/v4/qtGyZZlWb2EEvby3ZPosxw.ttf", "200italic" => "http://fonts.gstatic.com/s/exo/v4/fr4HBfXHYiIngW2_bhlgRw.ttf", "300italic" => "http://fonts.gstatic.com/s/exo/v4/3gmiLjBegIfcDLISjTGA1g.ttf", "regular" => "http://fonts.gstatic.com/s/exo/v4/eUEzTFueNXRVhbt4PEB8kQ.ttf", "italic" => "http://fonts.gstatic.com/s/exo/v4/cfgolWisMSURhpQeVHl_NA.ttf", "500italic" => "http://fonts.gstatic.com/s/exo/v4/lo5eTdCNJZQVN08p8RnzAQ.ttf", "600italic" => "http://fonts.gstatic.com/s/exo/v4/0cExa8K_pxS2lTuMr68XUA.ttf", "700italic" => "http://fonts.gstatic.com/s/exo/v4/0me55yJIxd5vyQ9bF7SsiA.ttf", "800italic" => "http://fonts.gstatic.com/s/exo/v4/n3LejeKVj_8gtZq5fIgNYw.ttf", "900italic" => "http://fonts.gstatic.com/s/exo/v4/JHTkQVhzyLtkY13Ye95TJQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Exo 2", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/exo2/v3/oVOtQy53isv97g4UhBUDqg.ttf", "200" => "http://fonts.gstatic.com/s/exo2/v3/qa-Ci2pBwJdCxciE1ErifQ.ttf", "300" => "http://fonts.gstatic.com/s/exo2/v3/nLUBdz_lHHoVIPor05Byhw.ttf", "500" => "http://fonts.gstatic.com/s/exo2/v3/oM0rzUuPqVJpW-VEIpuW5w.ttf", "600" => "http://fonts.gstatic.com/s/exo2/v3/YnSn3HsyvyI1feGSdRMYqA.ttf", "700" => "http://fonts.gstatic.com/s/exo2/v3/2DiK4XkdTckfTk6we73-bQ.ttf", "800" => "http://fonts.gstatic.com/s/exo2/v3/IVYl_7dJruOg8zKRpC8Hrw.ttf", "900" => "http://fonts.gstatic.com/s/exo2/v3/e8csG8Wnu87AF6uCndkFRQ.ttf", "100italic" => "http://fonts.gstatic.com/s/exo2/v3/LNYVgsJcaCxoKFHmd4AZcg.ttf", "200italic" => "http://fonts.gstatic.com/s/exo2/v3/DCrVxDVvS69n50O-5erZVvesZW2xOQ-xsNqO47m55DA.ttf", "300italic" => "http://fonts.gstatic.com/s/exo2/v3/iSy9VTeUTiqiurQg2ywtu_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/exo2/v3/Pf_kZuIH5c5WKVkQUaeSWQ.ttf", "italic" => "http://fonts.gstatic.com/s/exo2/v3/xxA5ZscX9sTU6U0lZJUlYA.ttf", "500italic" => "http://fonts.gstatic.com/s/exo2/v3/amzRVCB-gipwdihZZ2LtT_esZW2xOQ-xsNqO47m55DA.ttf", "600italic" => "http://fonts.gstatic.com/s/exo2/v3/Vmo58BiptGwfVFb0teU5gPesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/exo2/v3/Sdo-zW-4_--pDkTg6bYrY_esZW2xOQ-xsNqO47m55DA.ttf", "800italic" => "http://fonts.gstatic.com/s/exo2/v3/p0TA6KeOz1o4rySEbvUxI_esZW2xOQ-xsNqO47m55DA.ttf", "900italic" => "http://fonts.gstatic.com/s/exo2/v3/KPhsGCoT2-7Uj6pMlRscH_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Expletus Sans", "category" => "display", "variants" => array("regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("500" => "http://fonts.gstatic.com/s/expletussans/v9/cl6rhMY77Ilk8lB_uYRRwAqQmZ7VjhwksfpNVG0pqGc.ttf", "600" => "http://fonts.gstatic.com/s/expletussans/v9/cl6rhMY77Ilk8lB_uYRRwCvj1tU7IJMS3CS9kCx2B3U.ttf", "700" => "http://fonts.gstatic.com/s/expletussans/v9/cl6rhMY77Ilk8lB_uYRRwFCbmAUID8LN-q3pJpOk3Ys.ttf", "regular" => "http://fonts.gstatic.com/s/expletussans/v9/gegTSDBDs5le3g6uxU1ZsX8f0n03UdmQgF_CLvNR2vg.ttf", "italic" => "http://fonts.gstatic.com/s/expletussans/v9/Y-erXmY0b6DU_i2Qu0hTJj4G9C9ttb0Oz5Cvf0qOitE.ttf", "500italic" => "http://fonts.gstatic.com/s/expletussans/v9/sRBNtc46w65uJE451UYmW87DCVO6wo6i5LKIyZDzK40.ttf", "600italic" => "http://fonts.gstatic.com/s/expletussans/v9/sRBNtc46w65uJE451UYmW8yKH23ZS6zCKOFHG0e_4JE.ttf", "700italic" => "http://fonts.gstatic.com/s/expletussans/v9/sRBNtc46w65uJE451UYmW5F66r9C4AnxxlBlGd7xY4g.ttf")), array("kind" => "webfonts#webfont", "family" => "Fanwood Text", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fanwoodtext/v6/hDNDHUlsSb8bgnEmDp4T_i3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/fanwoodtext/v6/0J3SBbkMZqBV-3iGxs5E9_MZXuCXbOrAvx5R0IT5Oyo.ttf")), array("kind" => "webfonts#webfont", "family" => "Farsan", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/farsan/v1/Hdf9Y76SQ6e1X0Nqk3rHtw.ttf")), array("kind" => "webfonts#webfont", "family" => "Fascinate", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fascinate/v5/ZE0637WWkBPKt1AmFaqD3Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Fascinate Inline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fascinateinline/v6/lRguYfMfWArflkm5aOQ5QJmp8DTZ6iHear7UV05iykg.ttf")), array("kind" => "webfonts#webfont", "family" => "Faster One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fasterone/v6/YxTOW2sf56uxD1T7byP5K_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Fasthand", "category" => "serif", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fasthand/v7/6XAagHH_KmpZL67wTvsETQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Fauna One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/faunaone/v4/8kL-wpAPofcAMELI_5NRnQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Federant", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/federant/v8/tddZFSiGvxICNOGra0i5aA.ttf")), array("kind" => "webfonts#webfont", "family" => "Federo", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/federo/v8/JPhe1S2tujeyaR79gXBLeQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Felipa", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/felipa/v4/SeyfyFZY7abAQXGrOIYnYg.ttf")), array("kind" => "webfonts#webfont", "family" => "Fenix", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fenix/v4/Ak8wR3VSlAN7VN_eMeJj7Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Finger Paint", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/fingerpaint/v5/m_ZRbiY-aPb13R3DWPBGXy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Fira Mono", "category" => "monospace", "variants" => array("regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "greek"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/firamono/v4/l24Wph3FsyKAbJ8dfExTZy3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/firamono/v4/WQOm1D4RO-yvA9q9trJc8g.ttf")), array("kind" => "webfonts#webfont", "family" => "Fira Sans", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "greek"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/firasans/v6/VTBnrK42EiOBncVyQXZ7jy3USBnSvpkopQaUR-2r7iU.ttf", "500" => "http://fonts.gstatic.com/s/firasans/v6/zM2u8V3CuPVwAAXFQcDi4C3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/firasans/v6/DugPdSljmOTocZOR2CItOi3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/firasans/v6/6s0YCA9oCTF6hM60YM-qTS9-WlPSxbfiI49GsXo3q0g.ttf", "regular" => "http://fonts.gstatic.com/s/firasans/v6/nsT0isDy56OkSX99sFQbXw.ttf", "italic" => "http://fonts.gstatic.com/s/firasans/v6/cPT_2ddmoxsUuMtQqa8zGqCWcynf_cDxXwCLxiixG1c.ttf", "500italic" => "http://fonts.gstatic.com/s/firasans/v6/6s0YCA9oCTF6hM60YM-qTcCNfqCYlB_eIx7H1TVXe60.ttf", "700italic" => "http://fonts.gstatic.com/s/firasans/v6/6s0YCA9oCTF6hM60YM-qTXe1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Fjalla One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/fjallaone/v4/3b7vWCfOZsU53vMa8LWsf_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Fjord One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/fjordone/v5/R_YHK8au2uFPw5tNu5N7zw.ttf")), array("kind" => "webfonts#webfont", "family" => "Flamenco", "category" => "display", "variants" => array("300", "regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/flamenco/v6/x9iI5CogvuZVCGoRHwXuo6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/flamenco/v6/HC0ugfLLgt26I5_BWD1PZA.ttf")), array("kind" => "webfonts#webfont", "family" => "Flavors", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/flavors/v5/SPJi5QclATvon8ExcKGRvQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Fondamento", "category" => "handwriting", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fondamento/v5/6LWXcjT1B7bnWluAOSNfMPesZW2xOQ-xsNqO47m55DA.ttf", "italic" => "http://fonts.gstatic.com/s/fondamento/v5/y6TmwhSbZ8rYq7OTFyo7OS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Fontdiner Swanky", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/fontdinerswanky/v6/8_GxIO5ixMtn5P6COsF3TlBjMPLzPAFJwRBn-s1U7kA.ttf")), array("kind" => "webfonts#webfont", "family" => "Forum", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/forum/v7/MZUpsq1VfLrqv8eSDcbrrQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Francois One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/francoisone/v9/bYbkq2nU2TSx4SwFbz5sCC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Frank Ruhl Libre", "category" => "sans-serif", "variants" => array("300", "regular", "500", "700", "900"), "subsets" => array("latin", "latin-ext", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/frankruhllibre/v1/y8NWif61iD8Hg8bGAmxFPOo9jvbqtCEVUIntIHarXsc.ttf", "500" => "http://fonts.gstatic.com/s/frankruhllibre/v1/y8NWif61iD8Hg8bGAmxFPC-WNtISbX_UO2d0wZPgXtk.ttf", "700" => "http://fonts.gstatic.com/s/frankruhllibre/v1/y8NWif61iD8Hg8bGAmxFPDPYiZEMiRRbPdIFMoTwDbo.ttf", "900" => "http://fonts.gstatic.com/s/frankruhllibre/v1/y8NWif61iD8Hg8bGAmxFPNRZIVFRjDx-6MOpcoWbVhA.ttf", "regular" => "http://fonts.gstatic.com/s/frankruhllibre/v1/yDLloNqBpFmakCImLv4OJkfFI6QBbouvcOFcz81E3Ek.ttf")), array("kind" => "webfonts#webfont", "family" => "Freckle Face", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/freckleface/v4/7-B8j9BPJgazdHIGqPNv8y3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Fredericka the Great", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/frederickathegreat/v5/7Es8Lxoku-e5eOZWpxw18nrnet6gXN1McwdQxS1dVrI.ttf")), array("kind" => "webfonts#webfont", "family" => "Fredoka One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fredokaone/v4/QKfwXi-z-KtJAlnO2ethYqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Freehand", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/freehand/v8/uEBQxvA0lnn_BrD6krlxMw.ttf")), array("kind" => "webfonts#webfont", "family" => "Fresca", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fresca/v5/2q7Qm9sCo1tWvVgSDVWNIw.ttf")), array("kind" => "webfonts#webfont", "family" => "Frijole", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/frijole/v5/L2MfZse-2gCascuD-nLhWg.ttf")), array("kind" => "webfonts#webfont", "family" => "Fruktur", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fruktur/v8/PnQvfEi1LssAvhJsCwH__w.ttf")), array("kind" => "webfonts#webfont", "family" => "Fugaz One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/fugazone/v6/5tteVDCwxsr8-5RuSiRWOw.ttf")), array("kind" => "webfonts#webfont", "family" => "GFS Didot", "category" => "serif", "variants" => array("regular"), "subsets" => array("greek"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/gfsdidot/v6/jQKxZy2RU-h9tkPZcRVluA.ttf")), array("kind" => "webfonts#webfont", "family" => "GFS Neohellenic", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("greek"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/gfsneohellenic/v7/7HwjPQa7qNiOsnUce2h4448_BwCLZY3eDSV6kppAwI8.ttf", "regular" => "http://fonts.gstatic.com/s/gfsneohellenic/v7/B4xRqbn-tANVqVgamMsSDiayCZa0z7CpFzlkqoCHztc.ttf", "italic" => "http://fonts.gstatic.com/s/gfsneohellenic/v7/KnaWrO4awITAqigQIIYXKkCTdomiyJpIzPbEbIES3rU.ttf", "700italic" => "http://fonts.gstatic.com/s/gfsneohellenic/v7/FwWjoX6XqT-szJFyqsu_GYFF0fM4h-krcpQk7emtCpE.ttf")), array("kind" => "webfonts#webfont", "family" => "Gabriela", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gabriela/v4/B-2ZfbAO3HDrxqV6lR5tdA.ttf")), array("kind" => "webfonts#webfont", "family" => "Gafata", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/gafata/v5/aTFqlki_3Dc3geo-FxHTvQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Galada", "category" => "display", "variants" => array("regular"), "subsets" => array("bengali", "latin"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/galada/v1/xGkllHQb8OOCv9VJ6IObSA.ttf")), array("kind" => "webfonts#webfont", "family" => "Galdeano", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/galdeano/v6/ZKFMQI6HxEG1jOT0UGSZUg.ttf")), array("kind" => "webfonts#webfont", "family" => "Galindo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/galindo/v4/2lafAS_ZEfB33OJryhXDUg.ttf")), array("kind" => "webfonts#webfont", "family" => "Gentium Basic", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/gentiumbasic/v8/2qL6yulgGf0wwgOp-UqGyLNuTeOOLg3nUymsEEGmdO0.ttf", "regular" => "http://fonts.gstatic.com/s/gentiumbasic/v8/KCktj43blvLkhOTolFn-MYtBLojGU5Qdl8-5NL4v70w.ttf", "italic" => "http://fonts.gstatic.com/s/gentiumbasic/v8/qoFz4NSMaYC2UmsMAG3lyTj3mvXnCeAk09uTtmkJGRc.ttf", "700italic" => "http://fonts.gstatic.com/s/gentiumbasic/v8/8N9-c_aQDJ8LbI1NGVMrwtswO1vWwP9exiF8s0wqW10.ttf")), array("kind" => "webfonts#webfont", "family" => "Gentium Book Basic", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/gentiumbookbasic/v7/T2vUYmWzlqUtgLYdlemGnaWESMHIjnSjm9UUxYtEOko.ttf", "regular" => "http://fonts.gstatic.com/s/gentiumbookbasic/v7/IRFxB2matTxrjZt6a3FUnrWDjKAyldGEr6eEi2MBNeY.ttf", "italic" => "http://fonts.gstatic.com/s/gentiumbookbasic/v7/qHqW2lwKO8-uTfIkh8FsUfXfjMwrYnmPVsQth2IcAPY.ttf", "700italic" => "http://fonts.gstatic.com/s/gentiumbookbasic/v7/632u7TMIoFDWQYUaHFUp5PA2A9KyRZEkn4TZVuhsWRM.ttf")), array("kind" => "webfonts#webfont", "family" => "Geo", "category" => "sans-serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/geo/v8/mJuJYk5Pww84B4uHAQ1XaA.ttf", "italic" => "http://fonts.gstatic.com/s/geo/v8/8_r1wToF7nPdDuX1qxel6Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Geostar", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/geostar/v6/A8WQbhQbpYx3GWWaShJ9GA.ttf")), array("kind" => "webfonts#webfont", "family" => "Geostar Fill", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/geostarfill/v6/Y5ovXPPOHYTfQzK2aM-hui3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Germania One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/germaniaone/v4/3_6AyUql_-FbDi1e68jHdC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Gidugu", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gidugu/v3/Ey6Eq3hrT6MM58iFItFcgw.ttf")), array("kind" => "webfonts#webfont", "family" => "Gilda Display", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gildadisplay/v4/8yAVUZLLZ3wb7dSsjix0CADHmap7fRWINAsw8-RaxNg.ttf")), array("kind" => "webfonts#webfont", "family" => "Give You Glory", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/giveyouglory/v6/DFEWZFgGmfseyIdGRJAxuBwwkpSPZdvjnMtysdqprfI.ttf")), array("kind" => "webfonts#webfont", "family" => "Glass Antiqua", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/glassantiqua/v4/0yLrXKplgdUDIMz5TnCHNODcg5akpSnIcsPhLOFv7l8.ttf")), array("kind" => "webfonts#webfont", "family" => "Glegoo", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/glegoo/v5/TlLolbauH0-0Aiz1LUH5og.ttf", "regular" => "http://fonts.gstatic.com/s/glegoo/v5/2tf-h3n2A_SNYXEO0C8bKw.ttf")), array("kind" => "webfonts#webfont", "family" => "Gloria Hallelujah", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gloriahallelujah/v8/CA1k7SlXcY5kvI81M_R28Q3RdPdyebSUyJECJouPsvA.ttf")), array("kind" => "webfonts#webfont", "family" => "Goblin One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/goblinone/v6/331XtzoXgpVEvNTVcBJ_C_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Gochi Hand", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gochihand/v7/KT1-WxgHsittJ34_20IfAPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Gorditas", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/gorditas/v4/6-XCeknmxaon8AUqVkMnHaCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/gorditas/v4/uMgZhXUyH6qNGF3QsjQT5Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Goudy Bookletter 1911", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/goudybookletter1911/v6/l5lwlGTN3pEY5Bf-rQEuIIjNDsyURsIKu4GSfvSE4mA.ttf")), array("kind" => "webfonts#webfont", "family" => "Graduate", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/graduate/v4/JpAmYLHqcIh9_Ff35HHwiA.ttf")), array("kind" => "webfonts#webfont", "family" => "Grand Hotel", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/grandhotel/v4/C_A8HiFZjXPpnMt38XnK7qCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Gravitas One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/gravitasone/v6/nBHdBv6zVNU8MtP6w9FwTS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Great Vibes", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/greatvibes/v4/4Mi5RG_9LjQYrTU55GN_L6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Griffy", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/griffy/v4/vWkyYGBSyE5xjnShNtJtzw.ttf")), array("kind" => "webfonts#webfont", "family" => "Gruppo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gruppo/v7/pS_JM0cK_piBZve-lfUq9w.ttf")), array("kind" => "webfonts#webfont", "family" => "Gudea", "category" => "sans-serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/gudea/v4/lsip4aiWhJ9bx172Y9FN_w.ttf", "regular" => "http://fonts.gstatic.com/s/gudea/v4/S-4QqBlkMPiiA3jNeCR5yw.ttf", "italic" => "http://fonts.gstatic.com/s/gudea/v4/7mNgsGw_vfS-uUgRVXNDSw.ttf")), array("kind" => "webfonts#webfont", "family" => "Gurajada", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/gurajada/v4/6Adfkl4PCRyq6XTENACEyA.ttf")), array("kind" => "webfonts#webfont", "family" => "Habibi", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/habibi/v5/YYyqXF6pWpL7kmKgS_2iUA.ttf")), array("kind" => "webfonts#webfont", "family" => "Halant", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/halant/v2/dM3ItAOWNNod_Cf3MnLlEg.ttf", "500" => "http://fonts.gstatic.com/s/halant/v2/tlsNj3K-hJKtiirTDtUbkQ.ttf", "600" => "http://fonts.gstatic.com/s/halant/v2/zNR2WvI_V8o652vIZp3X4Q.ttf", "700" => "http://fonts.gstatic.com/s/halant/v2/D9FN7OH89AuCmZDLHbPQfA.ttf", "regular" => "http://fonts.gstatic.com/s/halant/v2/rEs7Jk3SVyt3cTx6DoTu1w.ttf")), array("kind" => "webfonts#webfont", "family" => "Hammersmith One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/hammersmithone/v7/FWNn6ITYqL6or7ZTmBxRhjjVlsJB_M_Q_LtZxsoxvlw.ttf")), array("kind" => "webfonts#webfont", "family" => "Hanalei", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/hanalei/v6/Sx8vVMBnXSQyK6Cn0CBJ3A.ttf")), array("kind" => "webfonts#webfont", "family" => "Hanalei Fill", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/hanaleifill/v5/5uPeWLnaDdtm4UBG26Ds6C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Handlee", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/handlee/v5/6OfkXkyC0E5NZN80ED8u3A.ttf")), array("kind" => "webfonts#webfont", "family" => "Hanuman", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/hanuman/v9/lzzXZ2l84x88giDrbfq76vesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/hanuman/v9/hRhwOGGmElJSl6KSPvEnOQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Happy Monkey", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/happymonkey/v5/c2o0ps8nkBmaOYctqBq1rS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Harmattan", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/harmattan/v1/xNM1nDKzsLfoCLQtMRztGA.ttf")), array("kind" => "webfonts#webfont", "family" => "Headland One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/headlandone/v4/iGmBeOvQGfq9DSbjJ8jDVy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Heebo", "category" => "sans-serif", "variants" => array("100", "300", "regular", "500", "700", "800", "900"), "subsets" => array("latin", "hebrew"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/heebo/v2/SoQODIucfpkiveZloUR6ag.ttf", "300" => "http://fonts.gstatic.com/s/heebo/v2/dg5T18yyjkKiU_9mmcbDSQ.ttf", "500" => "http://fonts.gstatic.com/s/heebo/v2/jDb70ZCwdD6JnmQU62ZQZA.ttf", "700" => "http://fonts.gstatic.com/s/heebo/v2/NsBYEn6oWei8pPqytA07yA.ttf", "800" => "http://fonts.gstatic.com/s/heebo/v2/h4CV2Qq56LKIinGGOStvsw.ttf", "900" => "http://fonts.gstatic.com/s/heebo/v2/uDfzHw3R0Bfa6HyIIcj-ow.ttf", "regular" => "http://fonts.gstatic.com/s/heebo/v2/nyHCGMPliplPNqpssbDSIA.ttf")), array("kind" => "webfonts#webfont", "family" => "Henny Penny", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/hennypenny/v4/XRgo3ogXyi3tpsFfjImRF6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Herr Von Muellerhoff", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/herrvonmuellerhoff/v6/mmy24EUmk4tjm4gAEjUd7NLGIYrUsBdh-JWHYgiDiMU.ttf")), array("kind" => "webfonts#webfont", "family" => "Hind", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-02", "files" => array("300" => "http://fonts.gstatic.com/s/hind/v6/qa346Adgv9kPDXoD1my4kA.ttf", "500" => "http://fonts.gstatic.com/s/hind/v6/2cs8RCVcYtiv4iNDH1UsQQ.ttf", "600" => "http://fonts.gstatic.com/s/hind/v6/TUKUmFMXSoxloBP1ni08oA.ttf", "700" => "http://fonts.gstatic.com/s/hind/v6/cXJJavLdUbCfjxlsA6DqTw.ttf", "regular" => "http://fonts.gstatic.com/s/hind/v6/mktFHh5Z5P9YjGKSslSUtA.ttf")), array("kind" => "webfonts#webfont", "family" => "Hind Guntur", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "telugu", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/hindguntur/v1/Szg33M7ab5MTWe-PWAcNAi9-WlPSxbfiI49GsXo3q0g.ttf", "500" => "http://fonts.gstatic.com/s/hindguntur/v1/Szg33M7ab5MTWe-PWAcNAsCNfqCYlB_eIx7H1TVXe60.ttf", "600" => "http://fonts.gstatic.com/s/hindguntur/v1/Szg33M7ab5MTWe-PWAcNApZ7xm-Bj30Bj2KNdXDzSZg.ttf", "700" => "http://fonts.gstatic.com/s/hindguntur/v1/Szg33M7ab5MTWe-PWAcNAne1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/hindguntur/v1/MXz-KyAeVZstlFz6v-5SC6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Hind Madurai", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "tamil", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/hindmadurai/v1/sdSJTZLdRXJhVTP92m2S66cQoVhARpoaILP7amxE_8g.ttf", "500" => "http://fonts.gstatic.com/s/hindmadurai/v1/sdSJTZLdRXJhVTP92m2S65MQuUSAwdHsY8ov_6tk1oA.ttf", "600" => "http://fonts.gstatic.com/s/hindmadurai/v1/sdSJTZLdRXJhVTP92m2S62v8CylhIUtwUiYO7Z2wXbE.ttf", "700" => "http://fonts.gstatic.com/s/hindmadurai/v1/sdSJTZLdRXJhVTP92m2S60D2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/hindmadurai/v1/pJpl47LatORZNWf8rgdiyS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Hind Siliguri", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("bengali", "latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-02", "files" => array("300" => "http://fonts.gstatic.com/s/hindsiliguri/v2/fBpmjMpv5Rh6S25yVfWJnzoJ52uD-1fmXmi8u0n_zsc.ttf", "500" => "http://fonts.gstatic.com/s/hindsiliguri/v2/fBpmjMpv5Rh6S25yVfWJn__2zpxNHQ3utWt_82o9dAo.ttf", "600" => "http://fonts.gstatic.com/s/hindsiliguri/v2/fBpmjMpv5Rh6S25yVfWJn-x91FDzFvnud68bXrNkpDA.ttf", "700" => "http://fonts.gstatic.com/s/hindsiliguri/v2/fBpmjMpv5Rh6S25yVfWJn6iiXuG_rGcOxkuidirlnJE.ttf", "regular" => "http://fonts.gstatic.com/s/hindsiliguri/v2/f2eEi2pbIa8eBfNwpUl0Am_MnNA9OgK8I1F23mNWOpE.ttf")), array("kind" => "webfonts#webfont", "family" => "Hind Vadodara", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v2", "lastModified" => "2016-06-02", "files" => array("300" => "http://fonts.gstatic.com/s/hindvadodara/v2/KrZ6f_YevRawHvh0qDBkTbDwfZ__Dotj_J8NiWv76DQ.ttf", "500" => "http://fonts.gstatic.com/s/hindvadodara/v2/KrZ6f_YevRawHvh0qDBkTZzEKvFIU9WyojfbAkhDb6c.ttf", "600" => "http://fonts.gstatic.com/s/hindvadodara/v2/KrZ6f_YevRawHvh0qDBkTfgXs2VXrZsRiQ1c96pXZKI.ttf", "700" => "http://fonts.gstatic.com/s/hindvadodara/v2/KrZ6f_YevRawHvh0qDBkTYGjoH95IEFGA7BjhXnx_eg.ttf", "regular" => "http://fonts.gstatic.com/s/hindvadodara/v2/9c6KKeibr6NtFqknnNxZB-Dcg5akpSnIcsPhLOFv7l8.ttf")), array("kind" => "webfonts#webfont", "family" => "Holtwood One SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/holtwoodonesc/v7/sToOq3cIxbfnhbEkgYNuBbAgSRh1LpJXlLfl8IbsmHg.ttf")), array("kind" => "webfonts#webfont", "family" => "Homemade Apple", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/homemadeapple/v6/yg3UMEsefgZ8IHz_ryz86BiPOmFWYV1WlrJkRafc4c0.ttf")), array("kind" => "webfonts#webfont", "family" => "Homenaje", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/homenaje/v5/v0YBU0iBRrGdVjDNQILxtA.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell DW Pica", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfelldwpica/v6/W81bfaWiUicLSPbJhW-ATsA5qm663gJGVdtpamafG5A.ttf", "italic" => "http://fonts.gstatic.com/s/imfelldwpica/v6/alQJ8SK5aSOZVaelYoyT4PL2asmh5DlYQYCosKo6yQs.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell DW Pica SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfelldwpicasc/v6/xBKKJV4z2KsrtQnmjGO17JZ9RBdEL0H9o5qzT1Rtof4.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell Double Pica", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfelldoublepica/v6/yN1wY_01BkQnO0LYAhXdUol14jEdVOhEmvtCMCVwYak.ttf", "italic" => "http://fonts.gstatic.com/s/imfelldoublepica/v6/64odUh2hAw8D9dkFKTlWYq0AWwkgdQfsRHec8TYi4mI.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell Double Pica SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfelldoublepicasc/v6/jkrUtrLFpMw4ZazhfkKsGwc4LoC4OJUqLw9omnT3VOU.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell English", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellenglish/v6/xwIisCqGFi8pff-oa9uSVHGNmx1fDm-u2eBJHQkdrmk.ttf", "italic" => "http://fonts.gstatic.com/s/imfellenglish/v6/Z3cnIAI_L3XTRfz4JuZKbuewladMPCWTthtMv9cPS-c.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell English SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellenglishsc/v6/h3Tn6yWfw4b5qaLD1RWvz5ATixNthKRRR1XVH3rJNiw.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell French Canon", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/iKB0WL1BagSpNPz3NLMdsJ3V2FNpBrlLSvqUnERhBP8.ttf", "italic" => "http://fonts.gstatic.com/s/imfellfrenchcanon/v6/owCuNQkLLFW7TBBPJbMnhRa-QL94KdW80H29tcyld2A.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell French Canon SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellfrenchcanonsc/v6/kA3bS19-tQbeT_iG32EZmaiyyzHwYrAbmNulTz423iM.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell Great Primer", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellgreatprimer/v6/AL8ALGNthei20f9Cu3e93rgeX3ROgtTz44CitKAxzKI.ttf", "italic" => "http://fonts.gstatic.com/s/imfellgreatprimer/v6/1a-artkXMVg682r7TTxVY1_YG2SFv8Ma7CxRl1S3o7g.ttf")), array("kind" => "webfonts#webfont", "family" => "IM Fell Great Primer SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imfellgreatprimersc/v6/A313vRj97hMMGFjt6rgSJtRg-ciw1Y27JeXb2Zv4lZQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Iceberg", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/iceberg/v4/p2XVm4M-N0AOEEOymFKC5w.ttf")), array("kind" => "webfonts#webfont", "family" => "Iceland", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/iceland/v5/kq3uTMGgvzWGNi39B_WxGA.ttf")), array("kind" => "webfonts#webfont", "family" => "Imprima", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/imprima/v4/eRjquWLjwLGnTEhLH7u3kA.ttf")), array("kind" => "webfonts#webfont", "family" => "Inconsolata", "category" => "monospace", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v12", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/inconsolata/v12/AIed271kqQlcIRSOnQH0yXe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/inconsolata/v12/7bMKuoy6Nh0ft0SHnIGMuaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Inder", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/inder/v5/C38TwecLTfKxIHDc_Adcrw.ttf")), array("kind" => "webfonts#webfont", "family" => "Indie Flower", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/indieflower/v8/10JVD_humAd5zP2yrFqw6i3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Inika", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/inika/v4/bl3ZoTyrWsFun2zYbsgJrA.ttf", "regular" => "http://fonts.gstatic.com/s/inika/v4/eZCrULQGaIxkrRoGz_DjhQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Inknut Antiqua", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700", "800", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVIg6hmPNSXwHGnJQCeQHKUMo.ttf", "500" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVIiYCDvi1XFzRnTV7qUFsNgk.ttf", "600" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVIjLEgY6PI0GrY6L00mykcEQ.ttf", "700" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVIlRhfXn9P4_QueZ7VkUHUNc.ttf", "800" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVInARjXVu2t2krcNTHiCb1qY.ttf", "900" => "http://fonts.gstatic.com/s/inknutantiqua/v1/CagoW52rBcslcXzHh6tVIrTsNy1JrFNT1qKy8j7W3CU.ttf", "regular" => "http://fonts.gstatic.com/s/inknutantiqua/v1/VlmmTfOrxr3HfcnhMueX9arFJ4O13IHVxZbM6yoslpo.ttf")), array("kind" => "webfonts#webfont", "family" => "Inter", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/inter/v5/C38TwecLTfKxIHDc_Adcrw.ttf")), array("kind" => "webfonts#webfont", "family" => "Irish Grover", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/irishgrover/v6/kUp7uUPooL-KsLGzeVJbBC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Istok Web", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/istokweb/v10/2koEo4AKFSvK4B52O_Mwai3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/istokweb/v10/RYLSjEXQ0nNtLLc4n7--dQ.ttf", "italic" => "http://fonts.gstatic.com/s/istokweb/v10/kvcT2SlTjmGbC3YlZxmrl6CWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/istokweb/v10/ycQ3g52ELrh3o_HYCNNUw3e1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Italiana", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/italiana/v4/dt95fkCSTOF-c6QNjwSycA.ttf")), array("kind" => "webfonts#webfont", "family" => "Italianno", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/italianno/v6/HsyHnLpKf8uP7aMpDQHZmg.ttf")), array("kind" => "webfonts#webfont", "family" => "Itim", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/itim/v1/HHV9WK2x5lUkc5bxMXG8Tw.ttf")), array("kind" => "webfonts#webfont", "family" => "Jacques Francois", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/jacquesfrancois/v4/_-0XWPQIW6tOzTHg4KaJ_M13D_4KM32Q4UmTSjpuNGQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Jacques Francois Shadow", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/jacquesfrancoisshadow/v4/V14y0H3vq56fY9SV4OL_FASt0D_oLVawA8L8b9iKjbs.ttf")), array("kind" => "webfonts#webfont", "family" => "Jaldi", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/jaldi/v2/OIbtgjjEp3aVWtjF6WY8mA.ttf", "regular" => "http://fonts.gstatic.com/s/jaldi/v2/x1vR-bPW9a1EB-BUVqttCw.ttf")), array("kind" => "webfonts#webfont", "family" => "Jim Nightshade", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/jimnightshade/v4/_n43lYHXVWNgXegdYRIK9CF1W_bo0EdycfH0kHciIic.ttf")), array("kind" => "webfonts#webfont", "family" => "Jockey One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/jockeyone/v6/cAucnOZLvFo07w2AbufBCfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Jolly Lodger", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/jollylodger/v4/RX8HnkBgaEKQSHQyP9itiS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Jomhuria", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/jomhuria/v2/hrvsccQpBliIgor15WxE6g.ttf")), array("kind" => "webfonts#webfont", "family" => "Josefin Sans", "category" => "sans-serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d8SVQ0giZ-l_NELu3lgGyYw.ttf", "300" => "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z6cQoVhARpoaILP7amxE_8g.ttf", "600" => "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z2v8CylhIUtwUiYO7Z2wXbE.ttf", "700" => "http://fonts.gstatic.com/s/josefinsans/v9/C6HYlRF50SGJq1XyXj04z0D2ttfZwueP-QU272T9-k4.ttf", "100italic" => "http://fonts.gstatic.com/s/josefinsans/v9/s7-P1gqRNRNn-YWdOYnAOXXcj1rQwlNLIS625o-SrL0.ttf", "300italic" => "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33Gyna0FLWfcB-J_SAYmcAXaI.ttf", "regular" => "http://fonts.gstatic.com/s/josefinsans/v9/xgzbb53t8j-Mo-vYa23n5i3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/josefinsans/v9/q9w3H4aeBxj0hZ8Osfi3d_MZXuCXbOrAvx5R0IT5Oyo.ttf", "600italic" => "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G4R-5-urNOGAobhAyctHvW8.ttf", "700italic" => "http://fonts.gstatic.com/s/josefinsans/v9/ppse0J9fKSaoxCIIJb33G_As9-1nE9qOqhChW0m4nDE.ttf")), array("kind" => "webfonts#webfont", "family" => "Josefin Slab", "category" => "serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUsSVQ0giZ-l_NELu3lgGyYw.ttf", "300" => "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2KcQoVhARpoaILP7amxE_8g.ttf", "600" => "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2Gv8CylhIUtwUiYO7Z2wXbE.ttf", "700" => "http://fonts.gstatic.com/s/josefinslab/v6/NbE6ykYuM2IyEwxQxOIi2ED2ttfZwueP-QU272T9-k4.ttf", "100italic" => "http://fonts.gstatic.com/s/josefinslab/v6/8BjDChqLgBF3RJKfwHIYh3Xcj1rQwlNLIS625o-SrL0.ttf", "300italic" => "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJulyyna0FLWfcB-J_SAYmcAXaI.ttf", "regular" => "http://fonts.gstatic.com/s/josefinslab/v6/46aYWdgz-1oFX11flmyEfS3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/josefinslab/v6/etsUjZYO8lTLU85lDhZwUvMZXuCXbOrAvx5R0IT5Oyo.ttf", "600italic" => "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly4R-5-urNOGAobhAyctHvW8.ttf", "700italic" => "http://fonts.gstatic.com/s/josefinslab/v6/af9sBoKGPbGO0r21xJuly_As9-1nE9qOqhChW0m4nDE.ttf")), array("kind" => "webfonts#webfont", "family" => "Joti One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/jotione/v4/P3r_Th0ESHJdzunsvWgUfQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Judson", "category" => "serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/judson/v9/he4a2LwiPJc7r8x0oKCKiA.ttf", "regular" => "http://fonts.gstatic.com/s/judson/v9/znM1AAs0eytUaJzf1CrYZQ.ttf", "italic" => "http://fonts.gstatic.com/s/judson/v9/GVqQW9P52ygW-ySq-CLwAA.ttf")), array("kind" => "webfonts#webfont", "family" => "Julee", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/julee/v6/CAib-jsUsSO8SvVRnE9fHA.ttf")), array("kind" => "webfonts#webfont", "family" => "Julius Sans One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/juliussansone/v5/iU65JP9acQHPDLkdalCF7jjVlsJB_M_Q_LtZxsoxvlw.ttf")), array("kind" => "webfonts#webfont", "family" => "Junge", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/junge/v4/j4IXCXtxrw9qIBheercp3A.ttf")), array("kind" => "webfonts#webfont", "family" => "Jura", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "greek"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/jura/v7/Rqx_xy1UnN0C7wD3FUSyPQ.ttf", "500" => "http://fonts.gstatic.com/s/jura/v7/16xhfjHCiaLj3tsqqgmtGg.ttf", "600" => "http://fonts.gstatic.com/s/jura/v7/iwseduOwJSdY8wQ1Y6CJdA.ttf", "regular" => "http://fonts.gstatic.com/s/jura/v7/YAWMwF3sN0KCbynMq-Yr_Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Just Another Hand", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/justanotherhand/v7/fKV8XYuRNNagXr38eqbRf99BnJIEGrvoojniP57E51c.ttf")), array("kind" => "webfonts#webfont", "family" => "Just Me Again Down Here", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/justmeagaindownhere/v8/sN06iTc9ITubLTgXoG-kc3M9eVLpVTSK6TqZTIgBrWQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Kadwa", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/kadwa/v1/NFPZaBfekj_Io-7vUMz4Ww.ttf", "regular" => "http://fonts.gstatic.com/s/kadwa/v1/VwEN8oKGqaa0ug9kRpvSSg.ttf")), array("kind" => "webfonts#webfont", "family" => "Kalam", "category" => "handwriting", "variants" => array("300", "regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/kalam/v7/MgQQlk1SgPEHdlkWMNh7Jg.ttf", "700" => "http://fonts.gstatic.com/s/kalam/v7/95nLItUGyWtNLZjSckluLQ.ttf", "regular" => "http://fonts.gstatic.com/s/kalam/v7/hNEJkp2K-aql7e5WQish4Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Kameron", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/kameron/v7/rabVVbzlflqvmXJUFlKnu_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/kameron/v7/9r8HYhqDSwcq9WMjupL82A.ttf")), array("kind" => "webfonts#webfont", "family" => "Kanit", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/kanit/v1/CYl4qOK-NWwZp3iTKW1eIA.ttf", "200" => "http://fonts.gstatic.com/s/kanit/v1/wfLWkj1C4tYl7MoiFWS3bA.ttf", "300" => "http://fonts.gstatic.com/s/kanit/v1/SM5qHynYGdOmMKEwGUFIPA.ttf", "500" => "http://fonts.gstatic.com/s/kanit/v1/GxoU_USIJyIy8WIcYSUO2g.ttf", "600" => "http://fonts.gstatic.com/s/kanit/v1/n_qoIVxojeQY0D1pvoNDhA.ttf", "700" => "http://fonts.gstatic.com/s/kanit/v1/kEGmYvO8My36j5ILmbUPRg.ttf", "800" => "http://fonts.gstatic.com/s/kanit/v1/YTp-zAuKXxwnA1YnJIF1rg.ttf", "900" => "http://fonts.gstatic.com/s/kanit/v1/1NIEkusi3bG3GgO9Hor3fQ.ttf", "100italic" => "http://fonts.gstatic.com/s/kanit/v1/NLNtc56MpXmHl1yOrop8oQ.ttf", "200italic" => "http://fonts.gstatic.com/s/kanit/v1/D8gkrAAM2bvNJ-1i4ot-1_esZW2xOQ-xsNqO47m55DA.ttf", "300italic" => "http://fonts.gstatic.com/s/kanit/v1/IePislKOKy3Bqfpb9V5VM_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/kanit/v1/L6VKvM17ZmevDynOiw7H9w.ttf", "italic" => "http://fonts.gstatic.com/s/kanit/v1/sHLq5U0-T0oSMTnwTKgv-A.ttf", "500italic" => "http://fonts.gstatic.com/s/kanit/v1/hrCiWCaNv9AaF0mDY1F2zPesZW2xOQ-xsNqO47m55DA.ttf", "600italic" => "http://fonts.gstatic.com/s/kanit/v1/9BkP85yRDoVayTWQwdGLqPesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/kanit/v1/WNo3ZZ9xtOZJknNlvHAFWfesZW2xOQ-xsNqO47m55DA.ttf", "800italic" => "http://fonts.gstatic.com/s/kanit/v1/qiTGrW5sCa9UQp841fWjc_esZW2xOQ-xsNqO47m55DA.ttf", "900italic" => "http://fonts.gstatic.com/s/kanit/v1/ogN5dFD1r4BfxNV4Nb-TXfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Kantumruy", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("khmer"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/kantumruy/v3/ERRwQE0WG5uanaZWmOFXNi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/kantumruy/v3/gie_zErpGf_rNzs920C2Ji3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/kantumruy/v3/kQfXNYElQxr5dS8FyjD39Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Karla", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/karla/v5/JS501sZLxZ4zraLQdncOUA.ttf", "regular" => "http://fonts.gstatic.com/s/karla/v5/78UgGRwJFkhqaoFimqoKpQ.ttf", "italic" => "http://fonts.gstatic.com/s/karla/v5/51UBKly9RQOnOkj95ZwEFw.ttf", "700italic" => "http://fonts.gstatic.com/s/karla/v5/3YDyi09gQjCRh-5-SVhTTvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Karma", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/karma/v5/lH6ijJnguWR2Sz7tEl6MQQ.ttf", "500" => "http://fonts.gstatic.com/s/karma/v5/9YGjxi6Hcvz2Kh-rzO_cAw.ttf", "600" => "http://fonts.gstatic.com/s/karma/v5/h_CVzXXtqSxjfS2sIwaejA.ttf", "700" => "http://fonts.gstatic.com/s/karma/v5/smuSM08oApsQPPVYbHd1CA.ttf", "regular" => "http://fonts.gstatic.com/s/karma/v5/wvqTxAGBUrTqU0urTEoPIw.ttf")), array("kind" => "webfonts#webfont", "family" => "Katibeh", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/katibeh/v2/Q-SA43uWR2uu3wBIvedotA.ttf")), array("kind" => "webfonts#webfont", "family" => "Kaushan Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kaushanscript/v5/qx1LSqts-NtiKcLw4N03IBnpV0hQCek3EmWnCPrvGRM.ttf")), array("kind" => "webfonts#webfont", "family" => "Kavivanar", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "tamil", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/kavivanar/v1/VLDrdUtF1irKFc8rFWgDaw.ttf")), array("kind" => "webfonts#webfont", "family" => "Kavoon", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kavoon/v5/382m-6baKXqJFQjEgobt6Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Kdam Thmor", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kdamthmor/v3/otCdP6UU-VBIrBfVDWBQJ_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Keania One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/keaniaone/v4/PACrDKZWngXzgo-ucl6buvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Kelly Slab", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kellyslab/v6/F_2oS1e9XdYx1MAi8XEVefesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Kenia", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kenia/v8/OLM9-XfITK9PsTLKbGBrwg.ttf")), array("kind" => "webfonts#webfont", "family" => "Khand", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/khand/v4/072zRl4OU9Pinjjkg174LA.ttf", "500" => "http://fonts.gstatic.com/s/khand/v4/46_p-SqtuMe56nxQdteWxg.ttf", "600" => "http://fonts.gstatic.com/s/khand/v4/zggGWYIiPJyMTgkfxP_kaA.ttf", "700" => "http://fonts.gstatic.com/s/khand/v4/0I0UWaN-X5QBmfexpXKhqg.ttf", "regular" => "http://fonts.gstatic.com/s/khand/v4/HdLdTNFqNIDGJZl1ZEj84w.ttf")), array("kind" => "webfonts#webfont", "family" => "Khmer", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/khmer/v9/vWaBJIbaQuBNz02ALIKJ3A.ttf")), array("kind" => "webfonts#webfont", "family" => "Khula", "category" => "sans-serif", "variants" => array("300", "regular", "600", "700", "800"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/khula/v1/_1LySU5Upq-sc4OZ1b_GIw.ttf", "600" => "http://fonts.gstatic.com/s/khula/v1/4ZH86Hce-aeFDaedTnbkbg.ttf", "700" => "http://fonts.gstatic.com/s/khula/v1/UGVExGl-Jjs-YPpGv-MZ6w.ttf", "800" => "http://fonts.gstatic.com/s/khula/v1/Sccp_oOo8FWgbx5smie7xQ.ttf", "regular" => "http://fonts.gstatic.com/s/khula/v1/izcPIFyCSd16XI1Ak_Wk7Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Kite One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kiteone/v4/8ojWmgUc97m0f_i6sTqLoQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Knewave", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/knewave/v5/KGHM4XWr4iKnBMqzZLkPBg.ttf")), array("kind" => "webfonts#webfont", "family" => "Kotta One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kottaone/v4/AB2Q7hVw6niJYDgLvFXu5w.ttf")), array("kind" => "webfonts#webfont", "family" => "Koulen", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/koulen/v10/AAYOK8RSRO7FTskTzFuzNw.ttf")), array("kind" => "webfonts#webfont", "family" => "Kranky", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/kranky/v6/C8dxxTS99-fZ84vWk8SDrg.ttf")), array("kind" => "webfonts#webfont", "family" => "Kreon", "category" => "serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/kreon/v9/HKtJRiq5C2zbq5N1IX32sA.ttf", "700" => "http://fonts.gstatic.com/s/kreon/v9/jh0dSmaPodjxISiblIUTkw.ttf", "regular" => "http://fonts.gstatic.com/s/kreon/v9/zA_IZt0u0S3cvHJu-n1oEg.ttf")), array("kind" => "webfonts#webfont", "family" => "Kristi", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/kristi/v7/aRsgBQrkQkMlu4UPSnJyOQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Krona One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/kronaone/v4/zcQj4ljqTo166AdourlF9w.ttf")), array("kind" => "webfonts#webfont", "family" => "Kumar One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/kumarone/v1/YmcJD6Wky1clGYY5OD-BkQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Kumar One Outline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/kumaroneoutline/v1/hnQF47H-55qiLAGgq7C3QyxhoCTLJoiJ-y-zew8F8j0.ttf")), array("kind" => "webfonts#webfont", "family" => "Kurale", "category" => "serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/kurale/v1/rxeyIcvQlT4XAWwNbXFCfw.ttf")), array("kind" => "webfonts#webfont", "family" => "La Belle Aurore", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/labelleaurore/v7/Irdbc4ASuUoWDjd_Wc3md123K2iuuhwZgaKapkyRTY8.ttf")), array("kind" => "webfonts#webfont", "family" => "Laila", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/laila/v2/bLbIVEZF3IWSZ-in72GJvA.ttf", "500" => "http://fonts.gstatic.com/s/laila/v2/tkf8VtFvW9g3VsxQCA6WOQ.ttf", "600" => "http://fonts.gstatic.com/s/laila/v2/3EMP2L6JRQ4GaHIxCldCeA.ttf", "700" => "http://fonts.gstatic.com/s/laila/v2/R7P4z1xjcjecmjZ9GyhqHQ.ttf", "regular" => "http://fonts.gstatic.com/s/laila/v2/6iYor3edprH7360qtBGoag.ttf")), array("kind" => "webfonts#webfont", "family" => "Lakki Reddy", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lakkireddy/v3/Q5EpFa91FjW37t0FCnedaKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Lalezar", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "arabic", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/lalezar/v1/k4_MPf09PGmL7oyGdPKwcg.ttf")), array("kind" => "webfonts#webfont", "family" => "Lancelot", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lancelot/v6/XMT7T_oo_MQUGAnU2v-sdA.ttf")), array("kind" => "webfonts#webfont", "family" => "Lateef", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "arabic"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lateef/v10/PAsKCgi1qc7XPwvzo_I-DQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Lato", "category" => "sans-serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v11", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/lato/v11/Upp-ka9rLQmHYCsFgwL-eg.ttf", "300" => "http://fonts.gstatic.com/s/lato/v11/Ja02qOppOVq9jeRjWekbHg.ttf", "700" => "http://fonts.gstatic.com/s/lato/v11/iX_QxBBZLhNj5JHlTzHQzg.ttf", "900" => "http://fonts.gstatic.com/s/lato/v11/8TPEV6NbYWZlNsXjbYVv7w.ttf", "100italic" => "http://fonts.gstatic.com/s/lato/v11/zLegi10uS_9-fnUDISl0KA.ttf", "300italic" => "http://fonts.gstatic.com/s/lato/v11/dVebFcn7EV7wAKwgYestUg.ttf", "regular" => "http://fonts.gstatic.com/s/lato/v11/h7rISIcQapZBpei-sXwIwg.ttf", "italic" => "http://fonts.gstatic.com/s/lato/v11/P_dJOFJylV3A870UIOtr0w.ttf", "700italic" => "http://fonts.gstatic.com/s/lato/v11/WFcZakHrrCKeUJxHA4T_gw.ttf", "900italic" => "http://fonts.gstatic.com/s/lato/v11/draWperrI7n2xi35Cl08fA.ttf")), array("kind" => "webfonts#webfont", "family" => "League Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/leaguescript/v7/wnRFLvfabWK_DauqppD6vSeUSrabuTpOsMEiRLtKwk0.ttf")), array("kind" => "webfonts#webfont", "family" => "Leckerli One", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/leckerlione/v7/S2Y_iLrItTu8kIJTkS7DrC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Ledger", "category" => "serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ledger/v4/G432jp-tahOfWHbCYkI0jw.ttf")), array("kind" => "webfonts#webfont", "family" => "Lekton", "category" => "sans-serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/lekton/v7/WZw-uL8WTkx3SBVfTlevXQ.ttf", "regular" => "http://fonts.gstatic.com/s/lekton/v7/r483JYmxf5PjIm4jVAm8Yg.ttf", "italic" => "http://fonts.gstatic.com/s/lekton/v7/_UbDIPBA1wDqSbhp-OED7A.ttf")), array("kind" => "webfonts#webfont", "family" => "Lexend", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v19", "lastModified" => "2023-09-14", "files" => array("regular" => "https://fonts.gstatic.com/s/lexend/v19/wlptgwvFAVdoq2_F94zlCfv0bz1WCzsW_LBte6KuGEo.ttf")), array("kind" => "webfonts#webfont", "family" => "Lemon", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lemon/v5/wed1nNu4LNSu-3RoRVUhUw.ttf")), array("kind" => "webfonts#webfont", "family" => "Lemonada", "category" => "display", "variants" => array("300", "regular", "600", "700"), "subsets" => array("latin", "latin-ext", "arabic", "vietnamese"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/lemonada/v2/uM3MufQOcwGHuruj4TsXiqCWcynf_cDxXwCLxiixG1c.ttf", "600" => "http://fonts.gstatic.com/s/lemonada/v2/9Vd4MNKsOxNyLzlfTXdKLqCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/lemonada/v2/9jKcm4hRI511-Dy7FFfQ3aCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/lemonada/v2/pkzws3AUXmaaAzOi7aydSQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Libre Baskerville", "category" => "serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/librebaskerville/v4/kH7K4InNTm7mmOXXjrA5v-xuswJKUVpBRfYFpz0W3Iw.ttf", "regular" => "http://fonts.gstatic.com/s/librebaskerville/v4/pR0sBQVcY0JZc_ciXjFsKyyZRYCSvpCzQKuMWnP5NDY.ttf", "italic" => "http://fonts.gstatic.com/s/librebaskerville/v4/QHIOz1iKF3bIEzRdDFaf5QnhapNS5Oi8FPrBRDLbsW4.ttf")), array("kind" => "webfonts#webfont", "family" => "Libre Franklin", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/librefranklin/v1/zrsyK9EytLQ07oRM9IZIsX6Zf0VB_l-7q6pFtcZSRCs.ttf", "200" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yCwKTB4uIbnDXE2hyxZaFPY.ttf", "300" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yMhKJW3W9-339CFS_Lie1us.ttf", "500" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yMBjwrbmxH6gp8HgxjPD8qo.ttf", "600" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yORt4MKdIUjA60qLK3wI2m8.ttf", "700" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yEnStGWSv3WdwjmyyI8xc7Q.ttf", "800" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yKltwG0cydF-uC1kFVv1hts.ttf", "900" => "http://fonts.gstatic.com/s/librefranklin/v1/1_DGDtljMiPWFs5rl_p0yF7duMYIKwoQ5QsTL00fobw.ttf", "100italic" => "http://fonts.gstatic.com/s/librefranklin/v1/LHzsuUmxr4UY-IoiG8pRK4gsWNE1DYiT_eIOcNe2Au4.ttf", "200italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqho0lu1sSkaQaYEjN61aJ3i1I.ttf", "300italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqho14je5cfhxzx5bEvSaoyQQI.ttf", "regular" => "http://fonts.gstatic.com/s/librefranklin/v1/PFwjf3aDdAQPvNKUrT3U7_fSnedoLXQQjURyDxluu8g.ttf", "italic" => "http://fonts.gstatic.com/s/librefranklin/v1/zrsyK9EytLQ07oRM9IZIsX5kKxjpQfTpnFf2SrDLxlg.ttf", "500italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqho5VcuOW5XbZIr02vW37iuvg.ttf", "600italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqhowNPRgU5g4Xymf9hgRWrbNs.ttf", "700italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqhow7kn3RFjf4gfwsdsBE-Rf4.ttf", "800italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqho80d7u0uHUbaRkK-cNyim1w.ttf", "900italic" => "http://fonts.gstatic.com/s/librefranklin/v1/7_V210XP3LBEtEwiCTqho0THpHUXJVnEwH4tSjkF0wg.ttf")), array("kind" => "webfonts#webfont", "family" => "Life Savers", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/lifesavers/v6/THQKqChyYUm97rNPVFdGGXe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/lifesavers/v6/g49cUDk4Y1P0G5NMkMAm7qCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Lilita One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lilitaone/v4/vTxJQjbNV6BCBHx8sGDCVvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Lily Script One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lilyscriptone/v4/uPWsLVW8uiXqIBnE8ZwGPDjVlsJB_M_Q_LtZxsoxvlw.ttf")), array("kind" => "webfonts#webfont", "family" => "Limelight", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/limelight/v7/5dTfN6igsXjLjOy8QQShcg.ttf")), array("kind" => "webfonts#webfont", "family" => "Linden Hill", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lindenhill/v6/UgsC0txqd-E1yjvjutwm_KCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/lindenhill/v6/OcS3bZcu8vJvIDH8Zic83keOrDcLawS7-ssYqLr2Xp4.ttf")), array("kind" => "webfonts#webfont", "family" => "Lobster", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext", "vietnamese"), "version" => "v18", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lobster/v18/9LpJGtNuM1D8FAZ2BkJH2Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Lobster Two", "category" => "display", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/lobstertwo/v9/bmdxOflBqMqjEC0-kGsIiHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/lobstertwo/v9/xb9aY4w9ceh8JRzobID1naCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/lobstertwo/v9/Ul_16MSbfayQv1I4QhLEoEeOrDcLawS7-ssYqLr2Xp4.ttf", "700italic" => "http://fonts.gstatic.com/s/lobstertwo/v9/LEkN2_no_6kFvRfiBZ8xpM_zJjSACmk0BRPxQqhnNLU.ttf")), array("kind" => "webfonts#webfont", "family" => "Londrina Outline", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/londrinaoutline/v5/lls08GOa1eT74p072l1AWJmp8DTZ6iHear7UV05iykg.ttf")), array("kind" => "webfonts#webfont", "family" => "Londrina Shadow", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/londrinashadow/v4/dNYuzPS_7eYgXFJBzMoKdbw6Z3rVA5KDSi7aQxS92Nk.ttf")), array("kind" => "webfonts#webfont", "family" => "Londrina Sketch", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/londrinasketch/v4/p7Ai06aT1Ycp_D2fyE3z69d6z_uhFGnpCOifUY1fJQo.ttf")), array("kind" => "webfonts#webfont", "family" => "Londrina Solid", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/londrinasolid/v4/yysorIEiYSBb0ylZjg791MR125CwGqh8XBqkBzea0LA.ttf")), array("kind" => "webfonts#webfont", "family" => "Lora", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/lora/v9/enKND5SfzQKkggBA_VnT1A.ttf", "regular" => "http://fonts.gstatic.com/s/lora/v9/aXJ7KVIGcejEy1abawZazg.ttf", "italic" => "http://fonts.gstatic.com/s/lora/v9/AN2EZaj2tFRpyveuNn9BOg.ttf", "700italic" => "http://fonts.gstatic.com/s/lora/v9/ivs9j3kYU65pR9QD9YFdzQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Love Ya Like A Sister", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/loveyalikeasister/v7/LzkxWS-af0Br2Sk_YgSJY-ad1xEP8DQfgfY8MH9aBUg.ttf")), array("kind" => "webfonts#webfont", "family" => "Loved by the King", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lovedbytheking/v6/wg03xD4cWigj4YDufLBSr8io2AFEwwMpu7y5KyiyAJc.ttf")), array("kind" => "webfonts#webfont", "family" => "Lovers Quarrel", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/loversquarrel/v4/gipdZ8b7pKb89MzQLAtJHLHLxci2ElvNEmOB303HLk0.ttf")), array("kind" => "webfonts#webfont", "family" => "Luckiest Guy", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/luckiestguy/v6/5718gH8nDy3hFVihOpkY5C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Lusitana", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/lusitana/v4/GWtZyUsONxgkdl3Mc1P7FKCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/lusitana/v4/l1h9VDomkwbdzbPdmLcUIw.ttf")), array("kind" => "webfonts#webfont", "family" => "Lustria", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/lustria/v4/gXAk0s4ai0X-TAOhYzZd1w.ttf")), array("kind" => "webfonts#webfont", "family" => "Macondo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/macondo/v5/G6yPNUscRPQ8ufBXs_8yRQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Macondo Swash Caps", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/macondoswashcaps/v4/SsSR706z-MlvEH7_LS6JAPkkgYRHs6GSG949m-K6x2k.ttf")), array("kind" => "webfonts#webfont", "family" => "Mada", "category" => "sans-serif", "variants" => array("300", "regular", "500", "900"), "subsets" => array("latin", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/mada/v1/P46fye2TPh4fVwALgHSXCA.ttf", "500" => "http://fonts.gstatic.com/s/mada/v1/PhhDsBi34sP0LptbpS9m6w.ttf", "900" => "http://fonts.gstatic.com/s/mada/v1/aCyc9Kc3rOJLL6fV9VfptA.ttf", "regular" => "http://fonts.gstatic.com/s/mada/v1/io_zUrt5o943T_q45OHLWQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Magra", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/magra/v4/6fOM5sq5cIn8D0RjX8Lztw.ttf", "regular" => "http://fonts.gstatic.com/s/magra/v4/hoZ13bwCXBxuGZqAudgc5A.ttf")), array("kind" => "webfonts#webfont", "family" => "Maiden Orange", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/maidenorange/v6/ZhKIA2SPisEwdhW7g0RUWojjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Maitree", "category" => "serif", "variants" => array("200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/maitree/v1/JTlrRs3bVPV4i05cUIx_z_esZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/maitree/v1/rEGdABAOaqCHggl37mkWjfesZW2xOQ-xsNqO47m55DA.ttf", "500" => "http://fonts.gstatic.com/s/maitree/v1/2VHD7TXjRhN4Xu74SEPGdvesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/maitree/v1/uuazDnPwt30gW3cKsG-e0_esZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/maitree/v1/cnHhc9fphsL3q-pistN3IPesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/maitree/v1/SpKVJkAjDAYOr1VkdSRspA.ttf")), array("kind" => "webfonts#webfont", "family" => "Mako", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mako/v7/z5zSLmfPlv1uTVAdmJBLXg.ttf")), array("kind" => "webfonts#webfont", "family" => "Mallanna", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mallanna/v4/krCTa-CfMbtxqF0689CbuQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Mandali", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mandali/v4/0lF8yJ7fkyjXuqtSi5bWbQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Marcellus", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/marcellus/v4/UjiLZzumxWC9whJ86UtaYw.ttf")), array("kind" => "webfonts#webfont", "family" => "Marcellus SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/marcellussc/v4/_jugwxhkkynrvsfrxVx8gS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Marck Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/marckscript/v7/O_D1NAZVOFOobLbVtW3bci3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Margarine", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/margarine/v5/DJnJwIrcO_cGkjSzY3MERw.ttf")), array("kind" => "webfonts#webfont", "family" => "Marko One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/markoone/v6/hpP7j861sOAco43iDc4n4w.ttf")), array("kind" => "webfonts#webfont", "family" => "Marmelad", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/marmelad/v6/jI0_FBlSOIRLL0ePWOhOwQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Martel", "category" => "serif", "variants" => array("200", "300", "regular", "600", "700", "800", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/martel/v1/_wfGdswZbat7P4tupHLA1w.ttf", "300" => "http://fonts.gstatic.com/s/martel/v1/SghoV2F2VPdVU3P0a4fa9w.ttf", "600" => "http://fonts.gstatic.com/s/martel/v1/Kt9uPhH1PvUwuZ5Y6zuAMQ.ttf", "700" => "http://fonts.gstatic.com/s/martel/v1/4OzIiKB5wE36xXL2U0vzWQ.ttf", "800" => "http://fonts.gstatic.com/s/martel/v1/RVF8drcQoRkRL7l_ZkpTlQ.ttf", "900" => "http://fonts.gstatic.com/s/martel/v1/iS0YUpFJoiLRlnyl40rpEA.ttf", "regular" => "http://fonts.gstatic.com/s/martel/v1/9ALu5czkaaf5zsYk6GJEnQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Martel Sans", "category" => "sans-serif", "variants" => array("200", "300", "regular", "600", "700", "800", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQEnzyIngrzGjGh22wPb6cGM.ttf", "300" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQC9-WlPSxbfiI49GsXo3q0g.ttf", "600" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQJZ7xm-Bj30Bj2KNdXDzSZg.ttf", "700" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "800" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQA89PwPrYLaRFJ-HNCU9NbA.ttf", "900" => "http://fonts.gstatic.com/s/martelsans/v2/7ajme85aKKx_SCWF59ImQCenaqEuufTBk9XMKnKmgDA.ttf", "regular" => "http://fonts.gstatic.com/s/martelsans/v2/91c8DPDZncMc0RFfhmc2RqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Marvel", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/marvel/v6/WrHDBL1RupWGo2UcdgxB3Q.ttf", "regular" => "http://fonts.gstatic.com/s/marvel/v6/Fg1dO8tWVb-MlyqhsbXEkg.ttf", "italic" => "http://fonts.gstatic.com/s/marvel/v6/HzyjFB-oR5usrc7Lxz9g8w.ttf", "700italic" => "http://fonts.gstatic.com/s/marvel/v6/Gzf5NT09Y6xskdQRj2kz1qCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Mate", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mate/v5/ooFviPcJ6hZP5bAE71Cawg.ttf", "italic" => "http://fonts.gstatic.com/s/mate/v5/5XwW6_cbisGvCX5qmNiqfA.ttf")), array("kind" => "webfonts#webfont", "family" => "Mate SC", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/matesc/v5/-YkIT2TZoPZF6pawKzDpWw.ttf")), array("kind" => "webfonts#webfont", "family" => "Maven Pro", "category" => "sans-serif", "variants" => array("regular", "500", "700", "900"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/mavenpro/v7/SQVfzoJBbj9t3aVcmbspRi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/mavenpro/v7/uDssvmXgp7Nj3i336k_dSi3USBnSvpkopQaUR-2r7iU.ttf", "900" => "http://fonts.gstatic.com/s/mavenpro/v7/-91TwiFzqeL1F7Kh91APwS3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/mavenpro/v7/sqPJIFG4gqsjl-0q_46Gbw.ttf")), array("kind" => "webfonts#webfont", "family" => "McLaren", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mclaren/v4/OprvTGxaiINBKW_1_U0eoQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Meddon", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/meddon/v9/f8zJO98uu2EtSj9p7ci9RA.ttf")), array("kind" => "webfonts#webfont", "family" => "MedievalSharp", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/medievalsharp/v8/85X_PjV6tftJ0-rX7KYQkOe45sJkivqprK7VkUlzfg0.ttf")), array("kind" => "webfonts#webfont", "family" => "Medula One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/medulaone/v6/AasPgDQak81dsTGQHc5zUPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Meera Inimai", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "tamil"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/meerainimai/v1/fWbdJc2ZVZnWCi06NRCxDy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Megrim", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/megrim/v7/e-9jVUC9lv1zxaFQARuftw.ttf")), array("kind" => "webfonts#webfont", "family" => "Meie Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/meiescript/v4/oTIWE5MmPye-rCyVp_6KEqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Merienda", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/merienda/v4/GlwcvRLlgiVE2MBFQ4r0sKCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/merienda/v4/MYY6Og1qZlOQtPW2G95Y3A.ttf")), array("kind" => "webfonts#webfont", "family" => "Merienda One", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/meriendaone/v7/bCA-uDdUx6nTO8SjzCLXvS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Merriweather", "category" => "serif", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v13", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/merriweather/v13/ZvcMqxEwPfh2qDWBPxn6nqcQoVhARpoaILP7amxE_8g.ttf", "700" => "http://fonts.gstatic.com/s/merriweather/v13/ZvcMqxEwPfh2qDWBPxn6nkD2ttfZwueP-QU272T9-k4.ttf", "900" => "http://fonts.gstatic.com/s/merriweather/v13/ZvcMqxEwPfh2qDWBPxn6nqObDOjC3UL77puoeHsE3fw.ttf", "300italic" => "http://fonts.gstatic.com/s/merriweather/v13/EYh7Vl4ywhowqULgRdYwICna0FLWfcB-J_SAYmcAXaI.ttf", "regular" => "http://fonts.gstatic.com/s/merriweather/v13/RFda8w1V0eDZheqfcyQ4EC3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/merriweather/v13/So5lHxHT37p2SS4-t60SlPMZXuCXbOrAvx5R0IT5Oyo.ttf", "700italic" => "http://fonts.gstatic.com/s/merriweather/v13/EYh7Vl4ywhowqULgRdYwIPAs9-1nE9qOqhChW0m4nDE.ttf", "900italic" => "http://fonts.gstatic.com/s/merriweather/v13/EYh7Vl4ywhowqULgRdYwIBd0_s6jQr9r5s5OZYvtzBY.ttf")), array("kind" => "webfonts#webfont", "family" => "Merriweather Sans", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic", "800", "800italic"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/merriweathersans/v8/6LmGj5dOJopQKEkt88Gowan5N8K-_DP0e9e_v51obXQ.ttf", "700" => "http://fonts.gstatic.com/s/merriweathersans/v8/6LmGj5dOJopQKEkt88GowbqxG25nQNOioCZSK4sU-CA.ttf", "800" => "http://fonts.gstatic.com/s/merriweathersans/v8/6LmGj5dOJopQKEkt88GowYufzO2zUYSj5LqoJ3UGkco.ttf", "300italic" => "http://fonts.gstatic.com/s/merriweathersans/v8/nAqt4hiqwq3tzCecpgPmVdytE4nGXk2hYD5nJ740tBw.ttf", "regular" => "http://fonts.gstatic.com/s/merriweathersans/v8/AKu1CjQ4qnV8MUltkAX3sOAj_ty82iuwwDTNEYXGiyQ.ttf", "italic" => "http://fonts.gstatic.com/s/merriweathersans/v8/3Mz4hOHzs2npRMG3B1ascZ32VBCoA_HLsn85tSWZmdo.ttf", "700italic" => "http://fonts.gstatic.com/s/merriweathersans/v8/nAqt4hiqwq3tzCecpgPmVbuqAJxizi8Dk_SK5et7kMg.ttf", "800italic" => "http://fonts.gstatic.com/s/merriweathersans/v8/nAqt4hiqwq3tzCecpgPmVdDmPrYMy3aZO4LmnZsxTQw.ttf")), array("kind" => "webfonts#webfont", "family" => "Metal", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/metal/v9/zA3UOP13ooQcxjv04BZX5g.ttf")), array("kind" => "webfonts#webfont", "family" => "Metal Mania", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/metalmania/v6/isriV_rAUgj6bPWPN6l9QKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Metamorphous", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/metamorphous/v6/wGqUKXRinIYggz-BTRU9ei3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Metrophobic", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/metrophobic/v6/SaglWZWCrrv_D17u1i4v_aCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Michroma", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/michroma/v7/0c2XrW81_QsiKV8T9thumA.ttf")), array("kind" => "webfonts#webfont", "family" => "Milonga", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/milonga/v4/dzNdIUSTGFmy2ahovDRcWg.ttf")), array("kind" => "webfonts#webfont", "family" => "Miltonian", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/miltonian/v10/Z4HrYZyqm0BnNNzcCUfzoQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Miltonian Tattoo", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v11", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/miltoniantattoo/v11/1oU_8OGYwW46eh02YHydn2uk0YtI6thZkz1Hmh-odwg.ttf")), array("kind" => "webfonts#webfont", "family" => "Miniver", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/miniver/v5/4yTQohOH_cWKRS5laRFhYg.ttf")), array("kind" => "webfonts#webfont", "family" => "Miriam Libre", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("700" => "http://fonts.gstatic.com/s/miriamlibre/v1/FLc0J-Gdn8ynDWUkeeesAED2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/miriamlibre/v1/Ljtpu8zR5iJWmlN3Faba5S3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Mirza", "category" => "display", "variants" => array("regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("500" => "http://fonts.gstatic.com/s/mirza/v1/dT3HbZoBCx1xbU7PnFEFyQ.ttf", "600" => "http://fonts.gstatic.com/s/mirza/v1/6T4uh2Zti9P6Eq_gbAYvVQ.ttf", "700" => "http://fonts.gstatic.com/s/mirza/v1/b47CZDHoZdhnplmDpZymFw.ttf", "regular" => "http://fonts.gstatic.com/s/mirza/v1/8oe36Xbgj9BMSLJBaZ8VAQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Miss Fajardose", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/missfajardose/v6/WcXjlQPKn6nBfr8LY3ktNu6rPKfVZo7L2bERcf0BDns.ttf")), array("kind" => "webfonts#webfont", "family" => "Mitr", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/mitr/v1/GCzZRAhweqJhxrmM0bPztg.ttf", "300" => "http://fonts.gstatic.com/s/mitr/v1/A61rQ_y9i8Ja__oFN7KxiQ.ttf", "500" => "http://fonts.gstatic.com/s/mitr/v1/r_Z6yrJJ0zmkGAqxqjlLRg.ttf", "600" => "http://fonts.gstatic.com/s/mitr/v1/42l66tb_XMxM97GKatU9Ng.ttf", "700" => "http://fonts.gstatic.com/s/mitr/v1/V-V7Rul5HOZ651R4Tml2Lw.ttf", "regular" => "http://fonts.gstatic.com/s/mitr/v1/vKMd72X2iT4iBo5GvdCa_A.ttf")), array("kind" => "webfonts#webfont", "family" => "Modak", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-11", "files" => array("regular" => "http://fonts.gstatic.com/s/modak/v2/lMsN0QIKid-pCPvL0hH4nw.ttf")), array("kind" => "webfonts#webfont", "family" => "Modern Antiqua", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/modernantiqua/v6/8qX_tr6Xzy4t9fvZDXPkh6rFJ4O13IHVxZbM6yoslpo.ttf")), array("kind" => "webfonts#webfont", "family" => "Mogra", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/mogra/v1/gIxQBn9PseDaI0D4FnOiBQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Molengo", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/molengo/v7/jcjgeGuzv83I55AzOTpXNQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Molle", "category" => "handwriting", "variants" => array("italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("italic" => "http://fonts.gstatic.com/s/molle/v4/9XTdCsjPXifLqo5et-YoGA.ttf")), array("kind" => "webfonts#webfont", "family" => "Monda", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/monda/v4/EVOzZUyc_j1w2GuTgTAW1g.ttf", "regular" => "http://fonts.gstatic.com/s/monda/v4/qFMHZ9zvR6B_gnoIgosPrw.ttf")), array("kind" => "webfonts#webfont", "family" => "Monofett", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/monofett/v6/C6K5L799Rgxzg2brgOaqAw.ttf")), array("kind" => "webfonts#webfont", "family" => "Monoton", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/monoton/v6/aCz8ja_bE4dg-7agSvExdw.ttf")), array("kind" => "webfonts#webfont", "family" => "Monsieur La Doulaise", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/monsieurladoulaise/v5/IMAdMj6Eq9jZ46CPctFtMKP61oAqTJXlx5ZVOBmcPdM.ttf")), array("kind" => "webfonts#webfont", "family" => "Montaga", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/montaga/v4/PwTwUboiD-M4-mFjZfJs2A.ttf")), array("kind" => "webfonts#webfont", "family" => "Montez", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/montez/v6/kx58rLOWQQLGFM4pDHv5Ng.ttf")), array("kind" => "webfonts#webfont", "family" => "Montserrat", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/montserrat/v7/IQHow_FEYlDC4Gzy_m8fcgJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/montserrat/v7/Kqy6-utIpx_30Xzecmeo8_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Montserrat Alternates", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/montserratalternates/v4/YENqOGAVzwIHjYNjmKuAZpeqBKvsAhm-s2I4RVSXFfc.ttf", "regular" => "http://fonts.gstatic.com/s/montserratalternates/v4/z2n1Sjxk9souK3HCtdHuklPuEVRGaG9GCQnmM16YWq0.ttf")), array("kind" => "webfonts#webfont", "family" => "Montserrat Subrayada", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/montserratsubrayada/v4/wf-IKpsHcfm0C9uaz9IeGJvEcF1LWArDbGWgKZSH9go.ttf", "regular" => "http://fonts.gstatic.com/s/montserratsubrayada/v4/nzoCWCz0e9c7Mr2Gl8bbgrJymm6ilkk9f0nDA_sC_qk.ttf")), array("kind" => "webfonts#webfont", "family" => "Moul", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/moul/v8/Kb0ALQnfyXawP1a_P_gpTQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Moulpali", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/moulpali/v9/diD74BprGhmVkJoerKmrKA.ttf")), array("kind" => "webfonts#webfont", "family" => "Mountains of Christmas", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/mountainsofchristmas/v8/PymufKtHszoLrY0uiAYKNM9cPTbSBTrQyTa5TWAe3vE.ttf", "regular" => "http://fonts.gstatic.com/s/mountainsofchristmas/v8/dVGBFPwd6G44IWDbQtPew2Auds3jz1Fxb61CgfaGDr4.ttf")), array("kind" => "webfonts#webfont", "family" => "Mouse Memoirs", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mousememoirs/v4/NBFaaJFux_j0AQbAsW3QeH8f0n03UdmQgF_CLvNR2vg.ttf")), array("kind" => "webfonts#webfont", "family" => "Mr Bedfort", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mrbedfort/v5/81bGgHTRikLs_puEGshl7_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Mr Dafoe", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mrdafoe/v5/s32Q1S6ZkT7EaX53mUirvQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Mr De Haviland", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mrdehaviland/v5/fD8y4L6PJ4vqDk7z8Y8e27v4lrhng1lzu7-weKO6cw8.ttf")), array("kind" => "webfonts#webfont", "family" => "Mrs Saint Delafield", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mrssaintdelafield/v4/vuWagfFT7bj9lFtZOFBwmjHMBelqWf3tJeGyts2SmKU.ttf")), array("kind" => "webfonts#webfont", "family" => "Mrs Sheppards", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mrssheppards/v5/2WFsWMV3VUeCz6UVH7UjCn8f0n03UdmQgF_CLvNR2vg.ttf")), array("kind" => "webfonts#webfont", "family" => "Mukta Vaani", "category" => "sans-serif", "variants" => array("200", "300", "regular", "500", "600", "700", "800"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_0nzyIngrzGjGh22wPb6cGM.ttf", "300" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_y9-WlPSxbfiI49GsXo3q0g.ttf", "500" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_8CNfqCYlB_eIx7H1TVXe60.ttf", "600" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_5Z7xm-Bj30Bj2KNdXDzSZg.ttf", "700" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_3e1Pd76Vl7zRpE7NLJQ7XU.ttf", "800" => "http://fonts.gstatic.com/s/muktavaani/v1/X9qyC4rK_D9w1AvSv0mw_w89PwPrYLaRFJ-HNCU9NbA.ttf", "regular" => "http://fonts.gstatic.com/s/muktavaani/v1/knS0wTOFNOwOD4CZrdHIxKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Muli", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/muli/v7/VJw4F3ZHRAZ7Hmg3nQu5YQ.ttf", "300italic" => "http://fonts.gstatic.com/s/muli/v7/s-NKMCru8HiyjEt0ZDoBoA.ttf", "regular" => "http://fonts.gstatic.com/s/muli/v7/KJiP6KznxbALQgfJcDdPAw.ttf", "italic" => "http://fonts.gstatic.com/s/muli/v7/Cg0K_IWANs9xkNoxV7H1_w.ttf")), array("kind" => "webfonts#webfont", "family" => "Mystery Quest", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/mysteryquest/v4/467jJvg0c7HgucvBB9PLDyeUSrabuTpOsMEiRLtKwk0.ttf")), array("kind" => "webfonts#webfont", "family" => "NTR", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ntr/v4/e7H4ZLtGfVOYyOupo6T12g.ttf")), array("kind" => "webfonts#webfont", "family" => "Neucha", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("cyrillic", "latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/neucha/v8/bijdhB-TzQdtpl0ykhGh4Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Neuton", "category" => "serif", "variants" => array("200", "300", "regular", "italic", "700", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/neuton/v8/DA3Mkew3XqSkPpi1f4tJow.ttf", "300" => "http://fonts.gstatic.com/s/neuton/v8/xrc_aZ2hx-gdeV0mlY8Vww.ttf", "700" => "http://fonts.gstatic.com/s/neuton/v8/gnWpkWY7DirkKiovncYrfg.ttf", "800" => "http://fonts.gstatic.com/s/neuton/v8/XPzBQV4lY6enLxQG9cF1jw.ttf", "regular" => "http://fonts.gstatic.com/s/neuton/v8/9R-MGIOQUdjAVeB6nE6PcQ.ttf", "italic" => "http://fonts.gstatic.com/s/neuton/v8/uVMT3JOB5BNFi3lgPp6kEg.ttf")), array("kind" => "webfonts#webfont", "family" => "New Rocker", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/newrocker/v5/EFUWzHJedEkpW399zYOHofesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "News Cycle", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v13", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/newscycle/v13/G28Ny31cr5orMqEQy6ljtwJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/newscycle/v13/xyMAr8VfiUzIOvS1abHJO_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Niconne", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/niconne/v6/ZA-mFw2QNXodx5y7kfELBg.ttf")), array("kind" => "webfonts#webfont", "family" => "Nixie One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/nixieone/v7/h6kQfmzm0Shdnp3eswRaqQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Nobile", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/nobile/v7/9p6M-Yrg_r_QPmSD1skrOg.ttf", "regular" => "http://fonts.gstatic.com/s/nobile/v7/lC_lPi1ddtN38iXTCRh6ow.ttf", "italic" => "http://fonts.gstatic.com/s/nobile/v7/vGmrpKzWQQSrb-PR6FWBIA.ttf", "700italic" => "http://fonts.gstatic.com/s/nobile/v7/oQ1eYPaXV638N03KvsNvyKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Nokora", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/nokora/v9/QMqqa4QEOhQpiig3cAPmbQ.ttf", "regular" => "http://fonts.gstatic.com/s/nokora/v9/dRyz1JfnyKPNaRcBNX9F9A.ttf")), array("kind" => "webfonts#webfont", "family" => "Norican", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/norican/v4/SHnSqhYAWG5sZTWcPzEHig.ttf")), array("kind" => "webfonts#webfont", "family" => "Nosifer", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/nosifer/v5/7eJGoIuHRrtcG00j6CptSA.ttf")), array("kind" => "webfonts#webfont", "family" => "Nothing You Could Do", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/nothingyoucoulddo/v6/jpk1K3jbJoyoK0XKaSyQAf-TpkXjXYGWiJZAEtBRjPU.ttf")), array("kind" => "webfonts#webfont", "family" => "Noticia Text", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/noticiatext/v6/pEko-RqEtp45bE2P80AAKUD2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/noticiatext/v6/wdyV6x3eKpdeUPQ7BJ5uUC3USBnSvpkopQaUR-2r7iU.ttf", "italic" => "http://fonts.gstatic.com/s/noticiatext/v6/dAuxVpkYE_Q_IwIm6elsKPMZXuCXbOrAvx5R0IT5Oyo.ttf", "700italic" => "http://fonts.gstatic.com/s/noticiatext/v6/-rQ7V8ARjf28_b7kRa0JuvAs9-1nE9qOqhChW0m4nDE.ttf")), array("kind" => "webfonts#webfont", "family" => "Noto Sans", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "devanagari", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/notosans/v6/PIbvSEyHEdL91QLOQRnZ1y3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/notosans/v6/0Ue9FiUJwVhi4NGfHJS5uA.ttf", "italic" => "http://fonts.gstatic.com/s/notosans/v6/dLcNKMgJ1H5RVoZFraDz0qCWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/notosans/v6/9Z3uUWMRR7crzm1TjRicDne1Pd76Vl7zRpE7NLJQ7XU.ttf")), array("kind" => "webfonts#webfont", "family" => "Noto Serif", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v4", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/notoserif/v4/lJAvZoKA5NttpPc9yc6lPQJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/notoserif/v4/zW6mc7bC1CWw8dH0yxY8JfesZW2xOQ-xsNqO47m55DA.ttf", "italic" => "http://fonts.gstatic.com/s/notoserif/v4/HQXBIwLHsOJCNEQeX9kNzy3USBnSvpkopQaUR-2r7iU.ttf", "700italic" => "http://fonts.gstatic.com/s/notoserif/v4/Wreg0Be4tcFGM2t6VWytvED2ttfZwueP-QU272T9-k4.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Cut", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novacut/v8/6q12jWcBvj0KO2cMRP97tA.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Flat", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novaflat/v8/pK7a0CoGzI684qe_XSHBqQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin", "greek"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novamono/v7/6-SChr5ZIaaasJFBkgrLNw.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Oval", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novaoval/v8/VuukVpKP8BwUf8o9W5LYQQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Round", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novaround/v8/7-cK3Ari_8XYYFgVMxVhDvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Script", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novascript/v8/dEvxQDLgx1M1TKY-NmBWYaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Slim", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novaslim/v8/rPYXC81_VL2EW-4CzBX65g.ttf")), array("kind" => "webfonts#webfont", "family" => "Nova Square", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/novasquare/v8/BcBzXoaDzYX78rquGXVuSqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Numans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/numans/v6/g5snI2p6OEjjTNmTHyBdiQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Nunito", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/nunito/v7/zXQvrWBJqUooM7Xv98MrQw.ttf", "700" => "http://fonts.gstatic.com/s/nunito/v7/aEdlqgMuYbpe4U3TnqOQMA.ttf", "regular" => "http://fonts.gstatic.com/s/nunito/v7/ySZTeT3IuzJj0GK6uGpbBg.ttf")), array("kind" => "webfonts#webfont", "family" => "Odor Mean Chey", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/odormeanchey/v8/GK3E7EjPoBkeZhYshGFo0eVKG8sq4NyGgdteJLvqLDs.ttf")), array("kind" => "webfonts#webfont", "family" => "Offside", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/offside/v4/v0C913SB8wqQUvcu1faUqw.ttf")), array("kind" => "webfonts#webfont", "family" => "Old Standard TT", "category" => "serif", "variants" => array("regular", "italic", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/oldstandardtt/v7/5Ywdce7XEbTSbxs__4X1_HJqbZqK7TdZ58X80Q_Lw8Y.ttf", "regular" => "http://fonts.gstatic.com/s/oldstandardtt/v7/n6RTCDcIPWSE8UNBa4k-DLcB5jyhm1VsHs65c3QNDr0.ttf", "italic" => "http://fonts.gstatic.com/s/oldstandardtt/v7/QQT_AUSp4AV4dpJfIN7U5PWrQzeMtsHf8QsWQ2cZg3c.ttf")), array("kind" => "webfonts#webfont", "family" => "Oldenburg", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/oldenburg/v4/dqA_M_uoCVXZbCO-oKBTnQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Oleo Script", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/oleoscript/v5/hudNQFKFl98JdNnlo363fne1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/oleoscript/v5/21stZcmPyzbQVXtmGegyqKCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Oleo Script Swash Caps", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/HMO3ftxA9AU5floml9c755reFYaXZ4zuJXJ8fr8OO1g.ttf", "regular" => "http://fonts.gstatic.com/s/oleoscriptswashcaps/v4/vdWhGqsBUAP-FF3NOYTe4iMF4kXAPemmyaDpMXQ31P0.ttf")), array("kind" => "webfonts#webfont", "family" => "Open Sans", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "800", "800italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v13", "lastModified" => "2016-05-20", "files" => array("300" => "http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTS3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/opensans/v13/MTP_ySUJH_bn48VBG8sNSi3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzC3USBnSvpkopQaUR-2r7iU.ttf", "800" => "http://fonts.gstatic.com/s/opensans/v13/EInbV5DfGHOiMmvb1Xr-hi3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxi9-WlPSxbfiI49GsXo3q0g.ttf", "regular" => "http://fonts.gstatic.com/s/opensans/v13/IgZJs4-7SA1XX_edsoXWog.ttf", "italic" => "http://fonts.gstatic.com/s/opensans/v13/O4NhV7_qs9r9seTo7fnsVKCWcynf_cDxXwCLxiixG1c.ttf", "600italic" => "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxpZ7xm-Bj30Bj2KNdXDzSZg.ttf", "700italic" => "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxne1Pd76Vl7zRpE7NLJQ7XU.ttf", "800italic" => "http://fonts.gstatic.com/s/opensans/v13/PRmiXeptR36kaC0GEAetxg89PwPrYLaRFJ-HNCU9NbA.ttf")), array("kind" => "webfonts#webfont", "family" => "Open Sans Condensed", "category" => "sans-serif", "variants" => array("300", "300italic", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v10", "lastModified" => "2016-05-20", "files" => array("300" => "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xEMwSSh38KQVJx4ABtsZTnA.ttf", "700" => "http://fonts.gstatic.com/s/opensanscondensed/v10/gk5FxslNkTTHtojXrkp-xBEM87DM3yorPOrvA-vB930.ttf", "300italic" => "http://fonts.gstatic.com/s/opensanscondensed/v10/jIXlqT1WKafUSwj6s9AzV4_LkTZ_uhAwfmGJ084hlvM.ttf")), array("kind" => "webfonts#webfont", "family" => "Oranienbaum", "category" => "serif", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/oranienbaum/v5/M98jYwCSn0PaFhXXgviCoaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Orbitron", "category" => "sans-serif", "variants" => array("regular", "500", "700", "900"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/orbitron/v7/p-y_ffzMdo5JN_7ia0vYEqCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/orbitron/v7/PS9_6SLkY1Y6OgPO3APr6qCWcynf_cDxXwCLxiixG1c.ttf", "900" => "http://fonts.gstatic.com/s/orbitron/v7/2I3-8i9hT294TE_pyjy9SaCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/orbitron/v7/DY8swouAZjR3RaUPRf0HDQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Oregano", "category" => "display", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/oregano/v4/UiLhqNixVv2EpjRoBG6axA.ttf", "italic" => "http://fonts.gstatic.com/s/oregano/v4/_iwqGEht6XsAuEaCbYG64Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Orienta", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/orienta/v4/_NKSk93mMs0xsqtfjCsB3Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Original Surfer", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/originalsurfer/v5/gdHw6HpSIN4D6Xt7pi1-qIkEz33TDwAZczo_6fY7eg0.ttf")), array("kind" => "webfonts#webfont", "family" => "Oswald", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v11", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/oswald/v11/y3tZpCdiRD4oNRRYFcAR5Q.ttf", "700" => "http://fonts.gstatic.com/s/oswald/v11/7wj8ldV_5Ti37rHa0m1DDw.ttf", "regular" => "http://fonts.gstatic.com/s/oswald/v11/uLEd2g2vJglLPfsBF91DCg.ttf")), array("kind" => "webfonts#webfont", "family" => "Over the Rainbow", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/overtherainbow/v7/6gp-gkpI2kie2dHQQLM2jQBdxkZd83xOSx-PAQ2QmiI.ttf")), array("kind" => "webfonts#webfont", "family" => "Overlock", "category" => "display", "variants" => array("regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/overlock/v5/Fexr8SqXM8Bm_gEVUA7AKaCWcynf_cDxXwCLxiixG1c.ttf", "900" => "http://fonts.gstatic.com/s/overlock/v5/YPJCVTT8ZbG3899l_-KIGqCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/overlock/v5/Z8oYsGi88-E1cUB8YBFMAg.ttf", "italic" => "http://fonts.gstatic.com/s/overlock/v5/rq6EacukHROOBrFrK_zF6_esZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/overlock/v5/wFWnYgeXKYBks6gEUwYnfAJKKGfqHaYFsRG-T3ceEVo.ttf", "900italic" => "http://fonts.gstatic.com/s/overlock/v5/iOZhxT2zlg7W5ij_lb-oDp0EAVxt0G0biEntp43Qt6E.ttf")), array("kind" => "webfonts#webfont", "family" => "Overlock SC", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/overlocksc/v5/8D7HYDsvS_g1GhBnlHzgzaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Ovo", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/ovo/v7/mFg27dimu3s9t09qjCwB1g.ttf")), array("kind" => "webfonts#webfont", "family" => "Oxygen", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/oxygen/v5/lZ31r0bR1Bzt_DfGZu1S8A.ttf", "700" => "http://fonts.gstatic.com/s/oxygen/v5/yLqkmDwuNtt5pSqsJmhyrg.ttf", "regular" => "http://fonts.gstatic.com/s/oxygen/v5/uhoyAE7XlQL22abzQieHjw.ttf")), array("kind" => "webfonts#webfont", "family" => "Oxygen Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/oxygenmono/v4/DigTu7k4b7OmM8ubt1Qza6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ptmono/v4/QUbM8H9yJK5NhpQ0REO6Wg.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Sans", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ptsans/v8/F51BEgHuR0tYHxF0bD4vwvesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/ptsans/v8/UFoEz2uiuMypUGZL1NKoeg.ttf", "italic" => "http://fonts.gstatic.com/s/ptsans/v8/yls9EYWOd496wiu7qzfgNg.ttf", "700italic" => "http://fonts.gstatic.com/s/ptsans/v8/lILlYDvubYemzYzN7GbLkC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Sans Caption", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ptsanscaption/v9/Q-gJrFokeE7JydPpxASt25tc0eyfI4QDEsobEEpk_hA.ttf", "regular" => "http://fonts.gstatic.com/s/ptsanscaption/v9/OXYTDOzBcXU8MTNBvBHeSW8by34Z3mUMtM-o4y-SHCY.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Sans Narrow", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ptsansnarrow/v7/Q_pTky3Sc3ubRibGToTAYsLtdzs3iyjn_YuT226ZsLU.ttf", "regular" => "http://fonts.gstatic.com/s/ptsansnarrow/v7/UyYrYy3ltEffJV9QueSi4ZTvAuddT2xDMbdz0mdLyZY.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Serif", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ptserif/v8/kyZw18tqQ5if-_wpmxxOeKCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/ptserif/v8/sAo427rn3-QL9sWCbMZXhA.ttf", "italic" => "http://fonts.gstatic.com/s/ptserif/v8/9khWhKzhpkH0OkNnBKS3n_esZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/ptserif/v8/Foydq9xJp--nfYIx2TBz9QJKKGfqHaYFsRG-T3ceEVo.ttf")), array("kind" => "webfonts#webfont", "family" => "PT Serif Caption", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ptserifcaption/v8/7xkFOeTxxO1GMC1suOUYWVsRioCqs5fohhaYel24W3k.ttf", "italic" => "http://fonts.gstatic.com/s/ptserifcaption/v8/0kfPsmrmTSgiec7u_Wa0DB1mqvzPHelJwRcF_s_EUM0.ttf")), array("kind" => "webfonts#webfont", "family" => "Pacifico", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/pacifico/v7/GIrpeRY1r5CzbfL8r182lw.ttf")), array("kind" => "webfonts#webfont", "family" => "Palanquin", "category" => "sans-serif", "variants" => array("100", "200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/palanquin/v1/Hu0eGDVGK_g4saUFu6AK3KCWcynf_cDxXwCLxiixG1c.ttf", "200" => "http://fonts.gstatic.com/s/palanquin/v1/pqXYXD7-VI5ezTjeqQOcyC3USBnSvpkopQaUR-2r7iU.ttf", "300" => "http://fonts.gstatic.com/s/palanquin/v1/c0-J5OCAagpFCKkKraz-Ey3USBnSvpkopQaUR-2r7iU.ttf", "500" => "http://fonts.gstatic.com/s/palanquin/v1/wLvvkEcZMKy95afLWh2EfC3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/palanquin/v1/405UIAv95_yZkCECrH6y-i3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/palanquin/v1/-UtkePo3NFvxEN3rGCtTvi3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/palanquin/v1/xCwBUoAEV0kzCDwerAZ0Aw.ttf")), array("kind" => "webfonts#webfont", "family" => "Palanquin Dark", "category" => "sans-serif", "variants" => array("regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-maMZTo-EwKMRQt3RWHocLi0.ttf", "600" => "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-mVNxaunw8i4Gywrk2SigRnk.ttf", "700" => "http://fonts.gstatic.com/s/palanquindark/v1/iXyBGf5UbFUu6BG8hOY-mWToair6W0TEE44XrlfKbiM.ttf", "regular" => "http://fonts.gstatic.com/s/palanquindark/v1/PamTqrrgbBh_M3702w39rOfChn3JSg5yz_Q_xmrKQN0.ttf")), array("kind" => "webfonts#webfont", "family" => "Paprika", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/paprika/v4/b-VpyoRSieBdB5BPJVF8HQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Parisienne", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/parisienne/v4/TW74B5QISJNx9moxGlmJfvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Passero One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/passeroone/v8/Yc-7nH5deCCv9Ed0MMnAQqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Passion One", "category" => "display", "variants" => array("regular", "700", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ne1Pd76Vl7zRpE7NLJQ7XU.ttf", "900" => "http://fonts.gstatic.com/s/passionone/v6/feOcYDy2R-f3Ysy72PYJ2ienaqEuufTBk9XMKnKmgDA.ttf", "regular" => "http://fonts.gstatic.com/s/passionone/v6/1UIK1tg3bKJ4J3o35M4heqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Pathway Gothic One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/pathwaygothicone/v4/Lqv9ztoTUV8Q0FmQZzPqaA6A6xIYD7vYcYDop1i-K-c.ttf")), array("kind" => "webfonts#webfont", "family" => "Patrick Hand", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/patrickhand/v10/9BG3JJgt_HlF3NpEUehL0C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Patrick Hand SC", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/patrickhandsc/v4/OYFWCgfCR-7uHIovjUZXsbAgSRh1LpJXlLfl8IbsmHg.ttf")), array("kind" => "webfonts#webfont", "family" => "Pattaya", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/pattaya/v1/sJEout1xdD7J8H-1H81pIQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Patua One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/patuaone/v6/njZwotTYjswR4qdhsW-kJw.ttf")), array("kind" => "webfonts#webfont", "family" => "Pavanam", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "tamil", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/pavanam/v1/C7yuEhNK5oftNLSL3I0bGw.ttf")), array("kind" => "webfonts#webfont", "family" => "Paytone One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/paytoneone/v8/3WCxC7JAJjQHQVoIE0ZwvqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Peddana", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/peddana/v4/zaSZuj_GhmC8AOTugOROnA.ttf")), array("kind" => "webfonts#webfont", "family" => "Peralta", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/peralta/v4/cTJX5KEuc0GKRU9NXSm-8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Permanent Marker", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/permanentmarker/v5/9vYsg5VgPHKK8SXYbf3sMol14xj5tdg9OHF8w4E7StQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Petit Formal Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/petitformalscript/v4/OEZwr2-ovBsq2n3ACCKoEvVPl2Gjtxj0D6F7QLy1VQc.ttf")), array("kind" => "webfonts#webfont", "family" => "Petrona", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/petrona/v5/nnQwxlP6dhrGovYEFtemTg.ttf")), array("kind" => "webfonts#webfont", "family" => "Philosopher", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/philosopher/v7/napvkewXG9Gqby5vwGHICHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/philosopher/v7/oZLTrB9jmJsyV0u_T0TKEaCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/philosopher/v7/_9Hnc_gz9k7Qq6uKaeHKmUeOrDcLawS7-ssYqLr2Xp4.ttf", "700italic" => "http://fonts.gstatic.com/s/philosopher/v7/PuKlryTcvTj7-qZWfLCFIM_zJjSACmk0BRPxQqhnNLU.ttf")), array("kind" => "webfonts#webfont", "family" => "Piedra", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/piedra/v5/owf-AvEEyAj9LJ2tVZ_3Mw.ttf")), array("kind" => "webfonts#webfont", "family" => "Pinyon Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/pinyonscript/v6/TzghnhfCn7TuE73f-CBQ0CeUSrabuTpOsMEiRLtKwk0.ttf")), array("kind" => "webfonts#webfont", "family" => "Pirata One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/pirataone/v4/WnbD86B4vB2ckYcL7oxuhvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Plaster", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/plaster/v8/O4QG9Z5116CXyfJdR9zxLw.ttf")), array("kind" => "webfonts#webfont", "family" => "Play", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "latin-ext", "greek"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/play/v7/crPhg6I0alLI-MpB3vW-zw.ttf", "regular" => "http://fonts.gstatic.com/s/play/v7/GWvfObW8LhtsOX333MCpBg.ttf")), array("kind" => "webfonts#webfont", "family" => "Playball", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/playball/v6/3hOFiQm_EUzycTpcN9uz4w.ttf")), array("kind" => "webfonts#webfont", "family" => "Playfair Display", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v10", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgICsv6SrURqJprbhH_C1Mw8w.ttf", "900" => "http://fonts.gstatic.com/s/playfairdisplay/v10/UC3ZEjagJi85gF9qFaBgIKqwMe2wjvZrAR44M0BJZ48.ttf", "regular" => "http://fonts.gstatic.com/s/playfairdisplay/v10/2NBgzUtEeyB-Xtpr9bm1CV6uyC_qD11hrFQ6EGgTJWI.ttf", "italic" => "http://fonts.gstatic.com/s/playfairdisplay/v10/9MkijrV-dEJ0-_NWV7E6NzMsbnvDNEBX25F5HWk9AhI.ttf", "700italic" => "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDECsYW3XoOVcYyYdp9NzzS9E.ttf", "900italic" => "http://fonts.gstatic.com/s/playfairdisplay/v10/n7G4PqJvFP2Kubl0VBLDEC0JfJ4xmm7j1kL6D7mPxrA.ttf")), array("kind" => "webfonts#webfont", "family" => "Playfair Display SC", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic", "900", "900italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/5ggqGkvWJU_TtW2W8cEubA-Amcyomnuy4WsCiPxGHjw.ttf", "900" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/5ggqGkvWJU_TtW2W8cEubKXL3C32k275YmX_AcBPZ7w.ttf", "regular" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/G0-tvBxd4eQRdwFKB8dRkcpjYTDWIvcAwAccqeW9uNM.ttf", "italic" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/myuYiFR-4NTrUT4w6TKls2klJsJYggW8rlNoTOTuau0.ttf", "700italic" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/6X0OQrQhEEnPo56RalREX4krgPi80XvBcbTwmz-rgmU.ttf", "900italic" => "http://fonts.gstatic.com/s/playfairdisplaysc/v5/6X0OQrQhEEnPo56RalREX8Zag2q3ssKz8uH1RU4a9gs.ttf")), array("kind" => "webfonts#webfont", "family" => "Podkova", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/podkova/v8/SqW4aa8m_KVrOgYSydQ33vesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/podkova/v8/eylljyGVfB8ZUQjYY3WZRQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Poiret One", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/poiretone/v4/dWcYed048E5gHGDIt8i1CPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Poller One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/pollerone/v6/dkctmDlTPcZ6boC8662RA_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Poly", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/poly/v7/bcMAuiacS2qkd54BcwW6_Q.ttf", "italic" => "http://fonts.gstatic.com/s/poly/v7/Zkx-eIlZSjKUrPGYhV5PeA.ttf")), array("kind" => "webfonts#webfont", "family" => "Pompiere", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/pompiere/v6/o_va2p9CD5JfmFohAkGZIA.ttf")), array("kind" => "webfonts#webfont", "family" => "Pontano Sans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/pontanosans/v4/gTHiwyxi6S7iiHpqAoiE3C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Poppins", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/poppins/v1/VIeViZ2fPtYBt3B2fQZplvesZW2xOQ-xsNqO47m55DA.ttf", "500" => "http://fonts.gstatic.com/s/poppins/v1/4WGKlFyjcmCFVl8pRsgZ9vesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/poppins/v1/-zOABrCWORC3lyDh-ajNnPesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/poppins/v1/8JitanEsk5aDh7mDYs-fYfesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/poppins/v1/hlvAxH6aIdOjWlLzgm0jqg.ttf")), array("kind" => "webfonts#webfont", "family" => "Port Lligat Sans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/portlligatsans/v5/CUEdhRk7oC7up0p6t0g4P6mASEpx5X0ZpsuJOuvfOGA.ttf")), array("kind" => "webfonts#webfont", "family" => "Port Lligat Slab", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/portlligatslab/v5/CUEdhRk7oC7up0p6t0g4PxLSPACXvawUYCBEnHsOe30.ttf")), array("kind" => "webfonts#webfont", "family" => "Pragati Narrow", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/pragatinarrow/v2/DnSI1zRkc0CY-hI5SC3q3MLtdzs3iyjn_YuT226ZsLU.ttf", "regular" => "http://fonts.gstatic.com/s/pragatinarrow/v2/HzG2TfC862qPNsZsV_djPpTvAuddT2xDMbdz0mdLyZY.ttf")), array("kind" => "webfonts#webfont", "family" => "Prata", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/prata/v6/3gmx8r842loRRm9iQkCDGg.ttf")), array("kind" => "webfonts#webfont", "family" => "Preahvihear", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/preahvihear/v8/82tDI-xTc53CxxOzEG4hDaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Press Start 2P", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext", "greek"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/pressstart2p/v4/8Lg6LX8-ntOHUQnvQ0E7o1jfl3W46Sz5gOkEVhcFWF4.ttf")), array("kind" => "webfonts#webfont", "family" => "Pridi", "category" => "serif", "variants" => array("200", "300", "regular", "500", "600", "700"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("200" => "http://fonts.gstatic.com/s/pridi/v1/WvKJ-kflGuELyK4uQzpYIA.ttf", "300" => "http://fonts.gstatic.com/s/pridi/v1/Ihwk-OGVFS69PINILdqAjQ.ttf", "500" => "http://fonts.gstatic.com/s/pridi/v1/dPNOrMxU-HjLo-fvkFydsQ.ttf", "600" => "http://fonts.gstatic.com/s/pridi/v1/J0i5OZxX07KC4mby5RjNbg.ttf", "700" => "http://fonts.gstatic.com/s/pridi/v1/UhCy4jDDJttTB8k8rtWadg.ttf", "regular" => "http://fonts.gstatic.com/s/pridi/v1/Mau018Ghi7LJX7FkGYCZAQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Princess Sofia", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/princesssofia/v4/8g5l8r9BM0t1QsXLTajDe-wjmA7ie-lFcByzHGRhCIg.ttf")), array("kind" => "webfonts#webfont", "family" => "Prociono", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/prociono/v6/43ZYDHWogdFeNBWTl6ksmw.ttf")), array("kind" => "webfonts#webfont", "family" => "Prompt", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/prompt/v1/ltjX-trOmfS-yKy_awt70g.ttf", "200" => "http://fonts.gstatic.com/s/prompt/v1/MNB_CVkbfYHFMWX_UbDC2Q.ttf", "300" => "http://fonts.gstatic.com/s/prompt/v1/LzifakiWysr3N3OoAdbdpg.ttf", "500" => "http://fonts.gstatic.com/s/prompt/v1/w31OY1otplAgr5iZ21K7Fg.ttf", "600" => "http://fonts.gstatic.com/s/prompt/v1/uUrJjg1BGaIb6CAOlUIp9g.ttf", "700" => "http://fonts.gstatic.com/s/prompt/v1/HdM_epiStzshOr-49ubVyg.ttf", "800" => "http://fonts.gstatic.com/s/prompt/v1/GF9cOamDd7mYPHNW1nZLKg.ttf", "900" => "http://fonts.gstatic.com/s/prompt/v1/KFgmbwHbRBQb28VFhH3c8Q.ttf", "100italic" => "http://fonts.gstatic.com/s/prompt/v1/KvTeArBpVb-tA2mahV6Jk_esZW2xOQ-xsNqO47m55DA.ttf", "200italic" => "http://fonts.gstatic.com/s/prompt/v1/NR0JuXzzCDKpLNVhfyEAiaCWcynf_cDxXwCLxiixG1c.ttf", "300italic" => "http://fonts.gstatic.com/s/prompt/v1/ir8BhbeDHM-qnbo-tnpmt6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/prompt/v1/nDo1rQFnTFNua4cp-OnD2A.ttf", "italic" => "http://fonts.gstatic.com/s/prompt/v1/ZD4khIP924SU2fRYOJkraQ.ttf", "500italic" => "http://fonts.gstatic.com/s/prompt/v1/dfaeaRx00u9arVHsaDjliaCWcynf_cDxXwCLxiixG1c.ttf", "600italic" => "http://fonts.gstatic.com/s/prompt/v1/CJUBMsoNNHMMdFRxm-n7p6CWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/prompt/v1/GtXRH7QWy3aLCHoJuR5WIKCWcynf_cDxXwCLxiixG1c.ttf", "800italic" => "http://fonts.gstatic.com/s/prompt/v1/kBLgnnEB-VXkOLFCc0pzwqCWcynf_cDxXwCLxiixG1c.ttf", "900italic" => "http://fonts.gstatic.com/s/prompt/v1/qjrOe-lEPwDDeUu5g6q_DaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Prosto One", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/prostoone/v5/bsqnAElAqk9kX7eABTRFJPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Proza Libre", "category" => "sans-serif", "variants" => array("regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic"), "subsets" => array("latin", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("500" => "http://fonts.gstatic.com/s/prozalibre/v1/4gjxWDPA6RMWrIls_qgQBsCNfqCYlB_eIx7H1TVXe60.ttf", "600" => "http://fonts.gstatic.com/s/prozalibre/v1/4gjxWDPA6RMWrIls_qgQBpZ7xm-Bj30Bj2KNdXDzSZg.ttf", "700" => "http://fonts.gstatic.com/s/prozalibre/v1/4gjxWDPA6RMWrIls_qgQBne1Pd76Vl7zRpE7NLJQ7XU.ttf", "800" => "http://fonts.gstatic.com/s/prozalibre/v1/4gjxWDPA6RMWrIls_qgQBg89PwPrYLaRFJ-HNCU9NbA.ttf", "regular" => "http://fonts.gstatic.com/s/prozalibre/v1/Hg11OrfE1P_U6mKmrZPknKCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/prozalibre/v1/ClQTew5IUT7yKo8vyspLxEeOrDcLawS7-ssYqLr2Xp4.ttf", "500italic" => "http://fonts.gstatic.com/s/prozalibre/v1/rWq3Qp4ZlPGKduc1qkgLHGnWRcJAYo5PSCx8UfGMHCI.ttf", "600italic" => "http://fonts.gstatic.com/s/prozalibre/v1/rWq3Qp4ZlPGKduc1qkgLHJe6We3S5L6hKLscKpOkmlo.ttf", "700italic" => "http://fonts.gstatic.com/s/prozalibre/v1/rWq3Qp4ZlPGKduc1qkgLHM_zJjSACmk0BRPxQqhnNLU.ttf", "800italic" => "http://fonts.gstatic.com/s/prozalibre/v1/rWq3Qp4ZlPGKduc1qkgLHCad_7rtf4IdDfsLVg-2OV4.ttf")), array("kind" => "webfonts#webfont", "family" => "Puritan", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/puritan/v8/pJS2SdwI0SCiVnO0iQSFT_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/puritan/v8/wv_RtgVBSCn-or2MC0n4Kg.ttf", "italic" => "http://fonts.gstatic.com/s/puritan/v8/BqZX8Tp200LeMv1KlzXgLQ.ttf", "700italic" => "http://fonts.gstatic.com/s/puritan/v8/rFG3XkMJL75nUNZwCEIJqC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Purple Purse", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/purplepurse/v5/Q5heFUrdmei9axbMITxxxS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Quando", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/quando/v5/03nDiEZuO2-h3xvtG6UmHg.ttf")), array("kind" => "webfonts#webfont", "family" => "Quantico", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/quantico/v5/OVZZzjcZ3Hkq2ojVcUtDjaCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/quantico/v5/pwSnP8Xpaix2rIz99HrSlQ.ttf", "italic" => "http://fonts.gstatic.com/s/quantico/v5/KQhDd2OsZi6HiITUeFQ2U_esZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/quantico/v5/HeCYRcZbdRso3ZUu01ELbQJKKGfqHaYFsRG-T3ceEVo.ttf")), array("kind" => "webfonts#webfont", "family" => "Quattrocento", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/quattrocento/v8/Uvi-cRwyvqFpl9j3oT2mqkD2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/quattrocento/v8/WZDISdyil4HsmirlOdBRFC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Quattrocento Sans", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/quattrocentosans/v9/tXSgPxDl7Lk8Zr_5qX8FIbqxG25nQNOioCZSK4sU-CA.ttf", "regular" => "http://fonts.gstatic.com/s/quattrocentosans/v9/efd6FGWWGX5Z3ztwLBrG9eAj_ty82iuwwDTNEYXGiyQ.ttf", "italic" => "http://fonts.gstatic.com/s/quattrocentosans/v9/8PXYbvM__bjl0rBnKiByg532VBCoA_HLsn85tSWZmdo.ttf", "700italic" => "http://fonts.gstatic.com/s/quattrocentosans/v9/8N1PdXpbG6RtFvTjl-5E7buqAJxizi8Dk_SK5et7kMg.ttf")), array("kind" => "webfonts#webfont", "family" => "Questrial", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/questrial/v6/MoHHaw_WwNs_hd9ob1zTVw.ttf")), array("kind" => "webfonts#webfont", "family" => "Quicksand", "category" => "sans-serif", "variants" => array("300", "regular", "700"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/quicksand/v5/qhfoJiLu10kFjChCCTvGlC3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/quicksand/v5/32nyIRHyCu6iqEka_hbKsi3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/quicksand/v5/Ngv3fIJjKB7sD-bTUGIFCA.ttf")), array("kind" => "webfonts#webfont", "family" => "Quintessential", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/quintessential/v4/mmk6ioesnTrEky_Zb92E5s02lXbtMOtZWfuxKeMZO8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Qwigley", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/qwigley/v6/aDqxws-KubFID85TZHFouw.ttf")), array("kind" => "webfonts#webfont", "family" => "Racing Sans One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/racingsansone/v4/1r3DpWaCiT7y3PD4KgkNyDjVlsJB_M_Q_LtZxsoxvlw.ttf")), array("kind" => "webfonts#webfont", "family" => "Radley", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v9", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/radley/v9/FgE9di09a-mXGzAIyI6Q9Q.ttf", "italic" => "http://fonts.gstatic.com/s/radley/v9/Z_JcACuPAOO2f9kzQcGRug.ttf")), array("kind" => "webfonts#webfont", "family" => "Rajdhani", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/rajdhani/v5/9pItuEhQZVGdq8spnHTku6CWcynf_cDxXwCLxiixG1c.ttf", "500" => "http://fonts.gstatic.com/s/rajdhani/v5/nd_5ZpVwm710HcLual0fBqCWcynf_cDxXwCLxiixG1c.ttf", "600" => "http://fonts.gstatic.com/s/rajdhani/v5/5fnmZahByDeTtgxIiqbJSaCWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/rajdhani/v5/UBK6d2Hg7X7wYLlF92aXW6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/rajdhani/v5/Wfy5zp4PGFAFS7-Wetehzw.ttf")), array("kind" => "webfonts#webfont", "family" => "Rakkas", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/rakkas/v1/XWSZpoSbAR4myQgKbSJM9A.ttf")), array("kind" => "webfonts#webfont", "family" => "Raleway", "category" => "sans-serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v11", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/raleway/v11/UDfD6oxBaBnmFJwQ7XAFNw.ttf", "200" => "http://fonts.gstatic.com/s/raleway/v11/LAQwev4hdCtYkOYX4Oc7nPesZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/raleway/v11/2VvSZU2kb4DZwFfRM4fLQPesZW2xOQ-xsNqO47m55DA.ttf", "500" => "http://fonts.gstatic.com/s/raleway/v11/348gn6PEmbLDWlHbbV15d_esZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/raleway/v11/M7no6oPkwKYJkedjB1wqEvesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/raleway/v11/VGEV9-DrblisWOWLbK-1XPesZW2xOQ-xsNqO47m55DA.ttf", "800" => "http://fonts.gstatic.com/s/raleway/v11/mMh0JrsYMXcLO69jgJwpUvesZW2xOQ-xsNqO47m55DA.ttf", "900" => "http://fonts.gstatic.com/s/raleway/v11/ajQQGcDBLcyLpaUfD76UuPesZW2xOQ-xsNqO47m55DA.ttf", "100italic" => "http://fonts.gstatic.com/s/raleway/v11/hUpHtml6IPNuUR-FwVi2UKCWcynf_cDxXwCLxiixG1c.ttf", "200italic" => "http://fonts.gstatic.com/s/raleway/v11/N2DIbZG4399cPGfifZUEQi3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/raleway/v11/TVSB8ogXDKMcnAAJ5CqrUi3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/raleway/v11/_dCzxpXzIS3sL-gdJWAP8A.ttf", "italic" => "http://fonts.gstatic.com/s/raleway/v11/utU2m1gdZSfuQpArSy5Dbw.ttf", "500italic" => "http://fonts.gstatic.com/s/raleway/v11/S7vGLZZ40c85SJgiptJGVy3USBnSvpkopQaUR-2r7iU.ttf", "600italic" => "http://fonts.gstatic.com/s/raleway/v11/OY22yoG8EJ3IN_muVWm29C3USBnSvpkopQaUR-2r7iU.ttf", "700italic" => "http://fonts.gstatic.com/s/raleway/v11/lFxvRPuGFG5ktd7P0WRwKi3USBnSvpkopQaUR-2r7iU.ttf", "800italic" => "http://fonts.gstatic.com/s/raleway/v11/us4LjTCmlYgh3W8CKujEJi3USBnSvpkopQaUR-2r7iU.ttf", "900italic" => "http://fonts.gstatic.com/s/raleway/v11/oY2RadnkHfshu5f0FLsgVS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Raleway Dots", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ralewaydots/v4/lhLgmWCRcyz-QXo8LCzTfC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Ramabhadra", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ramabhadra/v5/JyhxLXRVQChLDGADS_c5MPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Ramaraja", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ramaraja/v1/XIqzxFapVczstBedHdQTiw.ttf")), array("kind" => "webfonts#webfont", "family" => "Rambla", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/rambla/v4/C5VZH8BxQKmnBuoC00UPpw.ttf", "regular" => "http://fonts.gstatic.com/s/rambla/v4/YaTmpvm5gFg_ShJKTQmdzg.ttf", "italic" => "http://fonts.gstatic.com/s/rambla/v4/mhUgsKmp0qw3uATdDDAuwA.ttf", "700italic" => "http://fonts.gstatic.com/s/rambla/v4/ziMzUZya6QahrKONSI1TzqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Rammetto One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rammettoone/v5/mh0uQ1tV8QgSx9v_KyEYPC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Ranchers", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ranchers/v4/9ya8CZYhqT66VERfjQ7eLA.ttf")), array("kind" => "webfonts#webfont", "family" => "Rancho", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/rancho/v6/ekp3-4QykC4--6KaslRgHA.ttf")), array("kind" => "webfonts#webfont", "family" => "Ranga", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ranga/v1/h8G_gEUH7vHKH-NkjAs34A.ttf", "regular" => "http://fonts.gstatic.com/s/ranga/v1/xpW6zFTNzY1JykoBIqE1Zg.ttf")), array("kind" => "webfonts#webfont", "family" => "Rasa", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/rasa/v1/XQ1gDq2EqBtGcdadPyPbww.ttf", "500" => "http://fonts.gstatic.com/s/rasa/v1/HfsDi_Ls3NARO_YEODINGg.ttf", "600" => "http://fonts.gstatic.com/s/rasa/v1/f-fvbq-hWIQCdmT3QHGk3Q.ttf", "700" => "http://fonts.gstatic.com/s/rasa/v1/TSF3CG-8Cn72jvaVdqtMMQ.ttf", "regular" => "http://fonts.gstatic.com/s/rasa/v1/A5PoJUwX_PxTsywxlRB79g.ttf")), array("kind" => "webfonts#webfont", "family" => "Rationale", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rationale/v7/7M2eN-di0NGLQse7HzJRfg.ttf")), array("kind" => "webfonts#webfont", "family" => "Ravi Prakash", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/raviprakash/v3/8EzbM7Rymjk25jWeHxbO6C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Redressed", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/redressed/v6/3aZ5sTBppH3oSm5SabegtA.ttf")), array("kind" => "webfonts#webfont", "family" => "Reem Kufi", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "arabic"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/reemkufi/v1/xLwMbK_T1g-h9p-rp60A1Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Reenie Beanie", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/reeniebeanie/v7/ljpKc6CdXusL1cnGUSamX4jjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Revalia", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/revalia/v4/1TKw66fF5_poiL0Ktgo4_A.ttf")), array("kind" => "webfonts#webfont", "family" => "Rhodium Libre", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rhodiumlibre/v1/Vxr7A4-xE2zsBDDI8BcseIjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Ribeye", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ribeye/v5/e5w3VE8HnWBln4Ll6lUj3Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Ribeye Marrow", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ribeyemarrow/v6/q7cBSA-4ErAXBCDFPrhlY0cTNmV93fYG7UKgsLQNQWs.ttf")), array("kind" => "webfonts#webfont", "family" => "Righteous", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/righteous/v5/0nRRWM_gCGCt2S-BCfN8WQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Risque", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/risque/v4/92RnElGnl8yHP97-KV3Fyg.ttf")), array("kind" => "webfonts#webfont", "family" => "Roboto", "category" => "sans-serif", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "900", "900italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v15", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/roboto/v15/7MygqTe2zs9YkP0adA9QQQ.ttf", "300" => "http://fonts.gstatic.com/s/roboto/v15/dtpHsbgPEm2lVWciJZ0P-A.ttf", "500" => "http://fonts.gstatic.com/s/roboto/v15/Uxzkqj-MIMWle-XP2pDNAA.ttf", "700" => "http://fonts.gstatic.com/s/roboto/v15/bdHGHleUa-ndQCOrdpfxfw.ttf", "900" => "http://fonts.gstatic.com/s/roboto/v15/H1vB34nOKWXqzKotq25pcg.ttf", "100italic" => "http://fonts.gstatic.com/s/roboto/v15/T1xnudodhcgwXCmZQ490TPesZW2xOQ-xsNqO47m55DA.ttf", "300italic" => "http://fonts.gstatic.com/s/roboto/v15/iE8HhaRzdhPxC93dOdA056CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/roboto/v15/W5F8_SL0XFawnjxHGsZjJA.ttf", "italic" => "http://fonts.gstatic.com/s/roboto/v15/hcKoSgxdnKlbH5dlTwKbow.ttf", "500italic" => "http://fonts.gstatic.com/s/roboto/v15/daIfzbEw-lbjMyv4rMUUTqCWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/roboto/v15/owYYXKukxFDFjr0ZO8NXh6CWcynf_cDxXwCLxiixG1c.ttf", "900italic" => "http://fonts.gstatic.com/s/roboto/v15/b9PWBSMHrT2zM5FgUdtu0aCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Roboto Condensed", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v13", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nJRhFVcex_hajThhFkHyhYk.ttf", "700" => "http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nPOYkGiSOYDq_T7HbIOV1hA.ttf", "300italic" => "http://fonts.gstatic.com/s/robotocondensed/v13/mg0cGfGRUERshzBlvqxeAPYa9bgCHecWXGgisnodcS0.ttf", "regular" => "http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsKDbm6fPDOZJsR8PmdG62gY.ttf", "italic" => "http://fonts.gstatic.com/s/robotocondensed/v13/BP5K8ZAJv9qEbmuFp8RpJY_eiqgTfYGaH0bJiUDZ5GA.ttf", "700italic" => "http://fonts.gstatic.com/s/robotocondensed/v13/mg0cGfGRUERshzBlvqxeAE2zk2RGRC3SlyyLLQfjS_8.ttf")), array("kind" => "webfonts#webfont", "family" => "Roboto Mono", "category" => "monospace", "variants" => array("100", "100italic", "300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/robotomono/v4/aOIeRp72J9_Hp_8KwQ9M-YAWxXGWZ3yJw6KhWS7MxOk.ttf", "300" => "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fzy9-WlPSxbfiI49GsXo3q0g.ttf", "500" => "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fz8CNfqCYlB_eIx7H1TVXe60.ttf", "700" => "http://fonts.gstatic.com/s/robotomono/v4/N4duVc9C58uwPiY8_59Fz3e1Pd76Vl7zRpE7NLJQ7XU.ttf", "100italic" => "http://fonts.gstatic.com/s/robotomono/v4/rqQ1zSE-ZGCKVZgew-A9dgyDtfpXZi-8rXUZYR4dumU.ttf", "300italic" => "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA2o9eWDfYYxG3A176Zl7aIg.ttf", "regular" => "http://fonts.gstatic.com/s/robotomono/v4/eJ4cxQe85Lo39t-LVoKa26CWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/robotomono/v4/mE0EPT_93c7f86_WQexR3EeOrDcLawS7-ssYqLr2Xp4.ttf", "500italic" => "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA2nWRcJAYo5PSCx8UfGMHCI.ttf", "700italic" => "http://fonts.gstatic.com/s/robotomono/v4/1OsMuiiO6FCF2x67vzDKA8_zJjSACmk0BRPxQqhnNLU.ttf")), array("kind" => "webfonts#webfont", "family" => "Roboto Slab", "category" => "serif", "variants" => array("100", "300", "regular", "700"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "vietnamese"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("100" => "http://fonts.gstatic.com/s/robotoslab/v6/MEz38VLIFL-t46JUtkIEgIAWxXGWZ3yJw6KhWS7MxOk.ttf", "300" => "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJS9-WlPSxbfiI49GsXo3q0g.ttf", "700" => "http://fonts.gstatic.com/s/robotoslab/v6/dazS1PrQQuCxC3iOAJFEJXe1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/robotoslab/v6/3__ulTNA7unv0UtplybPiqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Rochester", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/rochester/v6/bnj8tmQBiOkdji_G_yvypg.ttf")), array("kind" => "webfonts#webfont", "family" => "Rock Salt", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/rocksalt/v6/Zy7JF9h9WbhD9V3SFMQ1UQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Rokkitt", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/rokkitt/v10/gxlo-sr3rPmvgSixYog_ofesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/rokkitt/v10/GMA7Z_ToF8uSvpZAgnp_VQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Romanesco", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/romanesco/v5/2udIjUrpK_CPzYSxRVzD4Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Ropa Sans", "category" => "sans-serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ropasans/v5/Gba7ZzVBuhg6nX_AoSwlkQ.ttf", "italic" => "http://fonts.gstatic.com/s/ropasans/v5/V1zbhZQscNrh63dy5Jk2nqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Rosario", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v11", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/rosario/v11/nrS6PJvDWN42RP4TFWccd_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/rosario/v11/bL-cEh8dXtDupB2WccA2LA.ttf", "italic" => "http://fonts.gstatic.com/s/rosario/v11/pkflNy18HEuVVx4EOjeb_Q.ttf", "700italic" => "http://fonts.gstatic.com/s/rosario/v11/EOgFX2Va5VGrkhn_eDpIRS3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Rosarivo", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rosarivo/v4/EmPiINK0qyqc7KSsNjJamA.ttf", "italic" => "http://fonts.gstatic.com/s/rosarivo/v4/u3VuWsWQlX1pDqsbz4paNPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Rouge Script", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rougescript/v5/AgXDSqZJmy12qS0ixjs6Vy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Rozha One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v2", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rozhaone/v2/PyrMHQ6lucEIxwKmhqsX8A.ttf")), array("kind" => "webfonts#webfont", "family" => "Rubik", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic", "900", "900italic"), "subsets" => array("cyrillic", "latin", "latin-ext", "hebrew"), "version" => "v2", "lastModified" => "2016-06-02", "files" => array("300" => "http://fonts.gstatic.com/s/rubik/v2/o1vXYO8YwDpErHEAPAxpOg.ttf", "500" => "http://fonts.gstatic.com/s/rubik/v2/D4HihERG27s-BJrQ4dvkbw.ttf", "700" => "http://fonts.gstatic.com/s/rubik/v2/m1GGHcpLe6Mb0_sAyjXE4g.ttf", "900" => "http://fonts.gstatic.com/s/rubik/v2/mOHfPRl5uP4vw7-5-dbnng.ttf", "300italic" => "http://fonts.gstatic.com/s/rubik/v2/NyXDvUhvZLSWiVfGa5KM-vesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/rubik/v2/4sMyW_teKWHB3K8Hm-Il6A.ttf", "italic" => "http://fonts.gstatic.com/s/rubik/v2/elD65ddI0qvNcCh42b1Iqg.ttf", "500italic" => "http://fonts.gstatic.com/s/rubik/v2/0hcxMdoMbXtHiEM1ebdN6PesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/rubik/v2/R4g_rs714cUXVZcdnRdHw_esZW2xOQ-xsNqO47m55DA.ttf", "900italic" => "http://fonts.gstatic.com/s/rubik/v2/HH1b7kBbwInqlw8OQxRE5vesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Rubik Mono One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rubikmonoone/v5/e_cupPtD4BrZzotubJD7UbAREgn5xbW23GEXXnhMQ5Y.ttf")), array("kind" => "webfonts#webfont", "family" => "Rubik One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rubikone/v4/Zs6TtctNRSIR8T5PO018rQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Ruda", "category" => "sans-serif", "variants" => array("regular", "700", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/ruda/v7/JABOu1SYOHcGXVejUq4w6g.ttf", "900" => "http://fonts.gstatic.com/s/ruda/v7/Uzusv-enCjoIrznlJJaBRw.ttf", "regular" => "http://fonts.gstatic.com/s/ruda/v7/jPEIPB7DM2DNK_uBGv2HGw.ttf")), array("kind" => "webfonts#webfont", "family" => "Rufina", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/rufina/v4/D0RUjXFr55y4MVZY2Ww_RA.ttf", "regular" => "http://fonts.gstatic.com/s/rufina/v4/s9IFr_fIemiohfZS-ZRDbQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Ruge Boogie", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rugeboogie/v7/U-TTmltL8aENLVIqYbI5QaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Ruluko", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ruluko/v4/lv4cMwJtrx_dzmlK5SDc1g.ttf")), array("kind" => "webfonts#webfont", "family" => "Rum Raisin", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/rumraisin/v4/kDiL-ntDOEq26B7kYM7cx_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Ruslan Display", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ruslandisplay/v7/SREdhlyLNUfU1VssRBfs3rgH88D3l9N4auRNHrNS708.ttf")), array("kind" => "webfonts#webfont", "family" => "Russo One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/russoone/v5/zfwxZ--UhUc7FVfgT21PRQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Ruthie", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/ruthie/v6/vJ2LorukHSbWYoEs5juivg.ttf")), array("kind" => "webfonts#webfont", "family" => "Rye", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/rye/v4/VUrJlpPpSZxspl3w_yNOrQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Sacramento", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sacramento/v4/_kv-qycSHMNdhjiv0Kj7BvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sahitya", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/sahitya/v1/Zm5hNvMwUyN3tC4GMkH1l_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/sahitya/v1/wQWULcDbZqljdTfjOUtDvw.ttf")), array("kind" => "webfonts#webfont", "family" => "Sail", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sail/v7/iuEoG6kt-bePGvtdpL0GUQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Salsa", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/salsa/v6/BnpUCBmYdvggScEPs5JbpA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sanchez", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sanchez/v4/BEL8ao-E2LJ5eHPLB2UAiw.ttf", "italic" => "http://fonts.gstatic.com/s/sanchez/v4/iSrhkWLexUZzDeNxNEHtzA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sancreek", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sancreek/v7/8ZacBMraWMvHly4IJI3esw.ttf")), array("kind" => "webfonts#webfont", "family" => "Sansita One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sansitaone/v6/xWqf68oB50JXqGIRR0h2hqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Sarala", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/sarala/v1/hpc9cz8KYsazwq2In_oJYw.ttf", "regular" => "http://fonts.gstatic.com/s/sarala/v1/ohip9lixCHoBab7hTtgLnw.ttf")), array("kind" => "webfonts#webfont", "family" => "Sarina", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sarina/v5/XYtRfaSknHIU3NHdfTdXoQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Sarpanch", "category" => "sans-serif", "variants" => array("regular", "500", "600", "700", "800", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/sarpanch/v1/Ov7BxSrFSZYrfuJxL1LzQaCWcynf_cDxXwCLxiixG1c.ttf", "600" => "http://fonts.gstatic.com/s/sarpanch/v1/WTnP2wnc0qSbUaaDG-2OQ6CWcynf_cDxXwCLxiixG1c.ttf", "700" => "http://fonts.gstatic.com/s/sarpanch/v1/57kYsSpovYmFaEt2hsZhv6CWcynf_cDxXwCLxiixG1c.ttf", "800" => "http://fonts.gstatic.com/s/sarpanch/v1/OKyqPLjdnuVghR-1TV6RzaCWcynf_cDxXwCLxiixG1c.ttf", "900" => "http://fonts.gstatic.com/s/sarpanch/v1/JhYc2cr6kqWTo_P0vfvJR6CWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/sarpanch/v1/YMBZdT27b6O5a1DADbAGSg.ttf")), array("kind" => "webfonts#webfont", "family" => "Satisfy", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/satisfy/v6/PRlyepkd-JCGHiN8e9WV2w.ttf")), array("kind" => "webfonts#webfont", "family" => "Scada", "category" => "sans-serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/scada/v4/t6XNWdMdVWUz93EuRVmifQ.ttf", "regular" => "http://fonts.gstatic.com/s/scada/v4/iZNC3ZEYwe3je6H-28d5Ug.ttf", "italic" => "http://fonts.gstatic.com/s/scada/v4/PCGyLT1qNawkOUQ3uHFhBw.ttf", "700italic" => "http://fonts.gstatic.com/s/scada/v4/kLrBIf7V4mDMwcd_Yw7-D_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Scheherazade", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "arabic"), "version" => "v12", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/scheherazade/v12/C1wtT46acJkQxc6mPHwvHED2ttfZwueP-QU272T9-k4.ttf", "regular" => "http://fonts.gstatic.com/s/scheherazade/v12/AuKlqGWzUC-8XqMOmsqXiy3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Schoolbell", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/schoolbell/v6/95-3djEuubb3cJx-6E7j4vesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Scope One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/scopeone/v2/ge7dY8Yht-n7_1cLHtoT3w.ttf")), array("kind" => "webfonts#webfont", "family" => "Seaweed Script", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/seaweedscript/v4/eorWAPpOvvWrPw5IHwE60BnpV0hQCek3EmWnCPrvGRM.ttf")), array("kind" => "webfonts#webfont", "family" => "Secular One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/secularone/v1/yW9qikjpt_X0fh5oQJcdo6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Sevillana", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sevillana/v4/6m1Nh35oP7YEt00U80Smiw.ttf")), array("kind" => "webfonts#webfont", "family" => "Seymour One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/seymourone/v4/HrdG2AEG_870Xb7xBVv6C6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Shadows Into Light", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/shadowsintolight/v6/clhLqOv7MXn459PTh0gXYAW_5bEze-iLRNvGrRpJsfM.ttf")), array("kind" => "webfonts#webfont", "family" => "Shadows Into Light Two", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/shadowsintolighttwo/v4/gDxHeefcXIo-lOuZFCn2xVQrZk-Pga5KeEE_oZjkQjQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Shanti", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/shanti/v8/lc4nG_JG6Q-2FQSOMMhb_w.ttf")), array("kind" => "webfonts#webfont", "family" => "Share", "category" => "display", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/share/v6/XrU8e7a1YKurguyY2azk1Q.ttf", "regular" => "http://fonts.gstatic.com/s/share/v6/1ytD7zSb_-g9I2GG67vmVw.ttf", "italic" => "http://fonts.gstatic.com/s/share/v6/a9YGdQWFRlNJ0zClJVaY3Q.ttf", "700italic" => "http://fonts.gstatic.com/s/share/v6/A992-bLVYwAflKu6iaznufesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Share Tech", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sharetech/v5/Dq3DuZ5_0SW3oEfAWFpen_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Share Tech Mono", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sharetechmono/v6/RQxK-3RA0Lnf3gnnnNrAscwD6PD0c3_abh9zHKQtbGU.ttf")), array("kind" => "webfonts#webfont", "family" => "Shojumaru", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/shojumaru/v4/WP8cxonzQQVAoI3RJQ2wug.ttf")), array("kind" => "webfonts#webfont", "family" => "Short Stack", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/shortstack/v6/v4dXPI0Rm8XN9gk4SDdqlqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Shrikhand", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "gujarati"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/shrikhand/v1/45jwHiwIDTWCy3Ir85vvKA.ttf")), array("kind" => "webfonts#webfont", "family" => "Siemreap", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/siemreap/v9/JSK-mOIsXwxo-zE9XDDl_g.ttf")), array("kind" => "webfonts#webfont", "family" => "Sigmar One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sigmarone/v6/oh_5NxD5JBZksdo2EntKefesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Signika", "category" => "sans-serif", "variants" => array("300", "regular", "600", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/signika/v6/0wDPonOzsYeEo-1KO78w4fesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/signika/v6/lQMOF6NUN2ooR7WvB7tADvesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/signika/v6/lEcnfPBICWJPv5BbVNnFJPesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/signika/v6/WvDswbww0oAtvBg2l1L-9w.ttf")), array("kind" => "webfonts#webfont", "family" => "Signika Negative", "category" => "sans-serif", "variants" => array("300", "regular", "600", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FjYFXpUPtCmIEFDvjUnLLaI.ttf", "600" => "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FrKLaDJM01OezSVA2R_O3qI.ttf", "700" => "http://fonts.gstatic.com/s/signikanegative/v5/q5TOjIw4CenPw6C-TW06FpYzPxtVvobH1w3hEppR8WI.ttf", "regular" => "http://fonts.gstatic.com/s/signikanegative/v5/Z-Q1hzbY8uAo3TpTyPFMXVM1lnCWMnren5_v6047e5A.ttf")), array("kind" => "webfonts#webfont", "family" => "Simonetta", "category" => "display", "variants" => array("regular", "italic", "900", "900italic"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("900" => "http://fonts.gstatic.com/s/simonetta/v5/22EwvvJ2r1VwVCxit5LcVi3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/simonetta/v5/fN8puNuahBo4EYMQgp12Yg.ttf", "italic" => "http://fonts.gstatic.com/s/simonetta/v5/ynxQ3FqfF_Nziwy3T9ZwL6CWcynf_cDxXwCLxiixG1c.ttf", "900italic" => "http://fonts.gstatic.com/s/simonetta/v5/WUXOpCgBZaRPrWtMCpeKoienaqEuufTBk9XMKnKmgDA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sintony", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/sintony/v4/zVXQB1wqJn6PE4dWXoYpvPesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/sintony/v4/IDhCijoIMev2L6Lg5QsduQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Sirin Stencil", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sirinstencil/v5/pRpLdo0SawzO7MoBpvowsImg74kgS1F7KeR8rWhYwkU.ttf")), array("kind" => "webfonts#webfont", "family" => "Six Caps", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/sixcaps/v7/_XeDnO0HOV8Er9u97If1tQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Skranji", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/skranji/v4/Lcrhg-fviVkxiEgoadsI1vesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/skranji/v4/jnOLPS0iZmDL7dfWnW3nIw.ttf")), array("kind" => "webfonts#webfont", "family" => "Slabo 13px", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/slabo13px/v3/jPGWFTjRXfCSzy0qd1nqdvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Slabo 27px", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/slabo27px/v3/gC0o8B9eU21EafNkXlRAfPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Slackey", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/slackey/v6/evRIMNhGVCRJvCPv4kteeA.ttf")), array("kind" => "webfonts#webfont", "family" => "Smokum", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/smokum/v6/8YP4BuAcy97X8WfdKfxVRw.ttf")), array("kind" => "webfonts#webfont", "family" => "Smythe", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/smythe/v7/yACD1gy_MpbB9Ft42fUvYw.ttf")), array("kind" => "webfonts#webfont", "family" => "Sniglet", "category" => "display", "variants" => array("regular", "800"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("800" => "http://fonts.gstatic.com/s/sniglet/v8/NLF91nBmcEfkBgcEWbHFa_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/sniglet/v8/XWhyQLHH4SpCVsHRPRgu9w.ttf")), array("kind" => "webfonts#webfont", "family" => "Snippet", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/snippet/v6/eUcYMLq2GtHZovLlQH_9kA.ttf")), array("kind" => "webfonts#webfont", "family" => "Snowburst One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/snowburstone/v4/zSQzKOPukXRux2oTqfYJjIjjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Sofadi One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/sofadione/v4/nirf4G12IcJ6KI8Eoj119fesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sofia", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sofia/v5/Imnvx0Ag9r6iDBFUY5_RaQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Sonsie One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/sonsieone/v5/KSP7xT1OSy0q2ob6RQOTWPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sorts Mill Goudy", "category" => "serif", "variants" => array("regular", "italic"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sortsmillgoudy/v6/JzRrPKdwEnE8F1TDmDLMUlIL2Qjg-Xlsg_fhGbe2P5U.ttf", "italic" => "http://fonts.gstatic.com/s/sortsmillgoudy/v6/UUu1lKiy4hRmBWk599VL1TYNkCNSzLyoucKmbTguvr0.ttf")), array("kind" => "webfonts#webfont", "family" => "Source Code Pro", "category" => "monospace", "variants" => array("200", "300", "regular", "500", "600", "700", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqaXvKVW_haheDNrHjziJZVk.ttf", "300" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqVP7R5lD_au4SZC6Ks_vyWs.ttf", "500" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqX63uKwMO11Of4rJWV582wg.ttf", "600" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqeiMeWyi5E_-XkTgB5psiDg.ttf", "700" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqfgXsetDviZcdR5OzC1KPcw.ttf", "900" => "http://fonts.gstatic.com/s/sourcecodepro/v6/leqv3v-yTsJNC7nFznSMqRA_awHl7mXRjE_LQVochcU.ttf", "regular" => "http://fonts.gstatic.com/s/sourcecodepro/v6/mrl8jkM18OlOQN8JLgasD9Rl0pGnog23EMYRrBmUzJQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Source Sans Pro", "category" => "sans-serif", "variants" => array("200", "200italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "900", "900italic"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGKXvKVW_haheDNrHjziJZVk.ttf", "300" => "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGFP7R5lD_au4SZC6Ks_vyWs.ttf", "600" => "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGOiMeWyi5E_-XkTgB5psiDg.ttf", "700" => "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGPgXsetDviZcdR5OzC1KPcw.ttf", "900" => "http://fonts.gstatic.com/s/sourcesanspro/v9/toadOcfmlt9b38dHJxOBGBA_awHl7mXRjE_LQVochcU.ttf", "200italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6OptKU7UIBg2hLM7eMTU8bI.ttf", "300italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6DUpNKoQAsDux-Todp8f29w.ttf", "regular" => "http://fonts.gstatic.com/s/sourcesanspro/v9/ODelI1aHBYDBqgeIAH2zlNRl0pGnog23EMYRrBmUzJQ.ttf", "italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/M2Jd71oPJhLKp0zdtTvoMwRX4TIfMQQEXLu74GftruE.ttf", "600italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6Pp6lGoTTgjlW0sC4r900Co.ttf", "700italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6LVT4locI09aamSzFGQlDMY.ttf", "900italic" => "http://fonts.gstatic.com/s/sourcesanspro/v9/fpTVHK8qsXbIeTHTrnQH6A0NcF6HPGWR298uWIdxWv0.ttf")), array("kind" => "webfonts#webfont", "family" => "Source Serif Pro", "category" => "serif", "variants" => array("regular", "600", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("600" => "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarGi4cQnvCGV11m1KlXh97aQ.ttf", "700" => "http://fonts.gstatic.com/s/sourceserifpro/v4/yd5lDMt8Sva2PE17yiLarEkpYHRvxGNSCrR82n_RDNk.ttf", "regular" => "http://fonts.gstatic.com/s/sourceserifpro/v4/CeUM4np2c42DV49nanp55YGL0S0YDpKs5GpLtZIQ0m4.ttf")), array("kind" => "webfonts#webfont", "family" => "Space Mono", "category" => "monospace", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("700" => "http://fonts.gstatic.com/s/spacemono/v1/vdpMRWfyjfCvDYTz00NEPAJKKGfqHaYFsRG-T3ceEVo.ttf", "regular" => "http://fonts.gstatic.com/s/spacemono/v1/B_LOPq3uMVBqC_kmqwURBfesZW2xOQ-xsNqO47m55DA.ttf", "italic" => "http://fonts.gstatic.com/s/spacemono/v1/7xgIgvUEl9Gvhtf7tXsRzC3USBnSvpkopQaUR-2r7iU.ttf", "700italic" => "http://fonts.gstatic.com/s/spacemono/v1/y2NWQDXe2-qPj6a6rWkLc0D2ttfZwueP-QU272T9-k4.ttf")), array("kind" => "webfonts#webfont", "family" => "Special Elite", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/specialelite/v6/9-wW4zu3WNoD5Fjka35Jm4jjx0o0jr6fNXxPgYh_a8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Spicy Rice", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/spicyrice/v5/WGCtz7cLoggXARPi9OGD6_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Spinnaker", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/spinnaker/v8/MQdIXivKITpjROUdiN6Jgg.ttf")), array("kind" => "webfonts#webfont", "family" => "Spirax", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/spirax/v5/IOKqhk-Ccl7y31yDsePPkw.ttf")), array("kind" => "webfonts#webfont", "family" => "Squada One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/squadaone/v5/3tzGuaJdD65cZVgfQzN8uvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Sree Krushnadevaraya", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sreekrushnadevaraya/v4/CdsXmnHyEqVl1ahzOh5qnzjDZVem5Eb4d0dXjXa0F_Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Sriracha", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/sriracha/v1/l-TXHmKwoHm6vtjy4oUz8Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Stalemate", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/stalemate/v4/wQLCnG0qB6mOu2Wit2dt_w.ttf")), array("kind" => "webfonts#webfont", "family" => "Stalinist One", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/stalinistone/v8/MQpS-WezM9W4Dd7D3B7I-UT7eZ8.ttf")), array("kind" => "webfonts#webfont", "family" => "Stardos Stencil", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/stardosstencil/v6/h4ExtgvoXhPtv9Ieqd-XC81wDCbBgmIo8UyjIhmkeSM.ttf", "regular" => "http://fonts.gstatic.com/s/stardosstencil/v6/ygEOyTW9a6u4fi4OXEZeTFf2eT4jUldwg_9fgfY_tHc.ttf")), array("kind" => "webfonts#webfont", "family" => "Stint Ultra Condensed", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/stintultracondensed/v5/8DqLK6-YSClFZt3u3EgOUYelbRYnLTTQA1Z5cVLnsI4.ttf")), array("kind" => "webfonts#webfont", "family" => "Stint Ultra Expanded", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/stintultraexpanded/v4/FeigX-wDDgHMCKuhekhedQ7dxr0N5HY0cZKknTIL6n4.ttf")), array("kind" => "webfonts#webfont", "family" => "Stoke", "category" => "serif", "variants" => array("300", "regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("300" => "http://fonts.gstatic.com/s/stoke/v6/Sell9475FOS8jUqQsfFsUQ.ttf", "regular" => "http://fonts.gstatic.com/s/stoke/v6/A7qJNoqOm2d6o1E6e0yUFg.ttf")), array("kind" => "webfonts#webfont", "family" => "Strait", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/strait/v4/m4W73ViNmProETY2ybc-Bg.ttf")), array("kind" => "webfonts#webfont", "family" => "Sue Ellen Francisco", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/sueellenfrancisco/v7/TwHX4vSxMUnJUdEz1JIgrhzazJzPVbGl8jnf1tisRz4.ttf")), array("kind" => "webfonts#webfont", "family" => "Suez One", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext", "hebrew"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/suezone/v1/xulpHtKbz3V8hoSLE2uKDw.ttf")), array("kind" => "webfonts#webfont", "family" => "Sumana", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/sumana/v1/8AcM-KAproitONSBBHj3sQ.ttf", "regular" => "http://fonts.gstatic.com/s/sumana/v1/wgdl__wAK7pzliiWs0Nlog.ttf")), array("kind" => "webfonts#webfont", "family" => "Sunshiney", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/sunshiney/v6/kaWOb4pGbwNijM7CkxK1sQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Supermercado One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/supermercadoone/v6/kMGPVTNFiFEp1U274uBMb4mm5hmSKNFf3C5YoMa-lrM.ttf")), array("kind" => "webfonts#webfont", "family" => "Sura", "category" => "serif", "variants" => array("regular", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/sura/v1/Z5bXQaFGmoWicN1WlcncxA.ttf", "regular" => "http://fonts.gstatic.com/s/sura/v1/jznKrhTH5NezYxb0-Q5zzA.ttf")), array("kind" => "webfonts#webfont", "family" => "Suranna", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/suranna/v4/PYmfr6TQeTqZ-r8HnPM-kA.ttf")), array("kind" => "webfonts#webfont", "family" => "Suravaram", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/suravaram/v3/G4dPee4pel_w2HqzavW4MA.ttf")), array("kind" => "webfonts#webfont", "family" => "Suwannaphum", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v9", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/suwannaphum/v9/1jIPOyXied3T79GCnSlCN6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Swanky and Moo Moo", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/swankyandmoomoo/v6/orVNZ9kDeE3lWp3U3YELu9DVLKqNC3_XMNHhr8S94FU.ttf")), array("kind" => "webfonts#webfont", "family" => "Syncopate", "category" => "sans-serif", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/syncopate/v7/S5z8ixiOoC4WJ1im6jAlYC3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/syncopate/v7/RQVwO52fAH6MI764EcaYtw.ttf")), array("kind" => "webfonts#webfont", "family" => "Tangerine", "category" => "handwriting", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/tangerine/v7/UkFsr-RwJB_d2l9fIWsx3i3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/tangerine/v7/DTPeM3IROhnkz7aYG2a9sA.ttf")), array("kind" => "webfonts#webfont", "family" => "Taprom", "category" => "display", "variants" => array("regular"), "subsets" => array("khmer"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/taprom/v8/-KByU3BaUsyIvQs79qFObg.ttf")), array("kind" => "webfonts#webfont", "family" => "Tauri", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/tauri/v4/XIWeYJDXNqiVNej0zEqtGg.ttf")), array("kind" => "webfonts#webfont", "family" => "Taviraj", "category" => "serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/taviraj/v1/7iDtujKEc7hwcT6D0zLx-A.ttf", "200" => "http://fonts.gstatic.com/s/taviraj/v1/fn3qCO_sC_zLuf2hqWE37fesZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/taviraj/v1/1EIpbtG_cs5haG6Ba9wX8vesZW2xOQ-xsNqO47m55DA.ttf", "500" => "http://fonts.gstatic.com/s/taviraj/v1/s8BuqYm5ebG2N1R4JkTp_fesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/taviraj/v1/KscmiA6HGz7nCcHhaddQH_esZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/taviraj/v1/TY91892tTFNYCeCXjQ1AEPesZW2xOQ-xsNqO47m55DA.ttf", "800" => "http://fonts.gstatic.com/s/taviraj/v1/oGWJbiDGcxlInLLnrLxTDvesZW2xOQ-xsNqO47m55DA.ttf", "900" => "http://fonts.gstatic.com/s/taviraj/v1/RfIEodnN0NYWUdZHol5fdPesZW2xOQ-xsNqO47m55DA.ttf", "100italic" => "http://fonts.gstatic.com/s/taviraj/v1/ai0UdHXB1gi5etfpU0CZ6aCWcynf_cDxXwCLxiixG1c.ttf", "200italic" => "http://fonts.gstatic.com/s/taviraj/v1/eDMMTK5GhTdvvz3R-ZWvay3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/taviraj/v1/IEBfc1xGgsBbdCeXKNAtfS3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/taviraj/v1/AH1eoWagKJhbVx4Poc3M1A.ttf", "italic" => "http://fonts.gstatic.com/s/taviraj/v1/hAS5RxygdSnG4626KdkXuQ.ttf", "500italic" => "http://fonts.gstatic.com/s/taviraj/v1/319qfe3yzAi9RNFu-dI9zy3USBnSvpkopQaUR-2r7iU.ttf", "600italic" => "http://fonts.gstatic.com/s/taviraj/v1/ofRN6EMiboGiM2Ga3cG_yy3USBnSvpkopQaUR-2r7iU.ttf", "700italic" => "http://fonts.gstatic.com/s/taviraj/v1/4Yzb6i1xtMRZn9oAQ484nS3USBnSvpkopQaUR-2r7iU.ttf", "800italic" => "http://fonts.gstatic.com/s/taviraj/v1/MPtY5Qs3hwV4f0LUH-vVmy3USBnSvpkopQaUR-2r7iU.ttf", "900italic" => "http://fonts.gstatic.com/s/taviraj/v1/aDM2JaXSd_qo0nqKiBAq5C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Teko", "category" => "sans-serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("300" => "http://fonts.gstatic.com/s/teko/v5/OobFGE9eo24rcBpN6zXDaQ.ttf", "500" => "http://fonts.gstatic.com/s/teko/v5/FQ0duU7gWM4cSaImOfAjBA.ttf", "600" => "http://fonts.gstatic.com/s/teko/v5/QDx_i8H-TZ1IK1JEVrqwEQ.ttf", "700" => "http://fonts.gstatic.com/s/teko/v5/xKfTxe_SWpH4xU75vmvylA.ttf", "regular" => "http://fonts.gstatic.com/s/teko/v5/UtekqODEqZXSN2L-njejpA.ttf")), array("kind" => "webfonts#webfont", "family" => "Telex", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/telex/v4/24-3xP9ywYeHOcFU3iGk8A.ttf")), array("kind" => "webfonts#webfont", "family" => "Tenali Ramakrishna", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v3", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/tenaliramakrishna/v3/M0nTmDqv2M7AGoGh-c946BZak5pSBHqWX6uyVMiMFoA.ttf")), array("kind" => "webfonts#webfont", "family" => "Tenor Sans", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/tenorsans/v7/dUBulmjNJJInvK5vL7O9yfesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Text Me One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/textmeone/v4/9em_3ckd_P5PQkP4aDyDLqCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "The Girl Next Door", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/thegirlnextdoor/v7/cWRA4JVGeEcHGcPl5hmX7kzo0nFFoM60ux_D9BUymX4.ttf")), array("kind" => "webfonts#webfont", "family" => "Tienne", "category" => "serif", "variants" => array("regular", "700", "900"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/tienne/v8/JvoCDOlyOSEyYGRwCyfs3g.ttf", "900" => "http://fonts.gstatic.com/s/tienne/v8/FBano5T521OWexj2iRYLMw.ttf", "regular" => "http://fonts.gstatic.com/s/tienne/v8/-IIfDl701C0z7-fy2kmGvA.ttf")), array("kind" => "webfonts#webfont", "family" => "Tillana", "category" => "handwriting", "variants" => array("regular", "500", "600", "700", "800"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/tillana/v1/gqdUngSIcY9tSla5eCZky_esZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/tillana/v1/fqon6-r15hy8M1cyiYfQBvesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/tillana/v1/jGARMTxLrMerzTCpGBpMffesZW2xOQ-xsNqO47m55DA.ttf", "800" => "http://fonts.gstatic.com/s/tillana/v1/pmTtNH_Ibktj5Cyc1XrP6vesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/tillana/v1/zN0D-jDPsr1HzU3VRFLY5g.ttf")), array("kind" => "webfonts#webfont", "family" => "Timmana", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "telugu"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/timmana/v1/T25SicsJUJkc2s2sbBsDnA.ttf")), array("kind" => "webfonts#webfont", "family" => "Tinos", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek", "hebrew", "vietnamese"), "version" => "v9", "lastModified" => "2016-05-20", "files" => array("700" => "http://fonts.gstatic.com/s/tinos/v9/vHXfhX8jZuQruowfon93yQ.ttf", "regular" => "http://fonts.gstatic.com/s/tinos/v9/EqpUbkVmutfwZ0PjpoGwCg.ttf", "italic" => "http://fonts.gstatic.com/s/tinos/v9/slfyzlasCr9vTsaP4lUh9A.ttf", "700italic" => "http://fonts.gstatic.com/s/tinos/v9/M6kfzvDMM0CdxdraoFpG6vesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Titan One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/titanone/v4/FbvpRvzfV_oipS0De3iAZg.ttf")), array("kind" => "webfonts#webfont", "family" => "Titillium Web", "category" => "sans-serif", "variants" => array("200", "200italic", "300", "300italic", "regular", "italic", "600", "600italic", "700", "700italic", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wprzOdCrLccoxq42eaxM802O0.ttf", "300" => "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr9ZAkYT8DuUZELiKLwMGWAo.ttf", "600" => "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr28K9dEd5Ue-HTQrlA7E2xQ.ttf", "700" => "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr2-6tpSbB9YhmWtmd1_gi_U.ttf", "900" => "http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr7L0GmZLri-m-nfoo0Vul4Y.ttf", "200italic" => "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPj4N98U-66ThNJvtgddRfBE.ttf", "300italic" => "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPrfzCkqg7ORZlRf2cc4mXu8.ttf", "regular" => "http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcTyagQBwYgYywpS70xNq8SQ.ttf", "italic" => "http://fonts.gstatic.com/s/titilliumweb/v4/r9OmwyQxrgzUAhaLET_KO-ixohbIP6lHkU-1Mgq95cY.ttf", "600italic" => "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPgOhzTSndyK8UWja2yJjKLc.ttf", "700italic" => "http://fonts.gstatic.com/s/titilliumweb/v4/RZunN20OBmkvrU7sA4GPPio3LEw-4MM8Ao2j9wPOfpw.ttf")), array("kind" => "webfonts#webfont", "family" => "Trade Winds", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/tradewinds/v5/sDOCVgAxw6PEUi2xdMsoDaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Trirong", "category" => "serif", "variants" => array("100", "100italic", "200", "200italic", "300", "300italic", "regular", "italic", "500", "500italic", "600", "600italic", "700", "700italic", "800", "800italic", "900", "900italic"), "subsets" => array("latin", "thai", "latin-ext", "vietnamese"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("100" => "http://fonts.gstatic.com/s/trirong/v1/A4AP1moxqvtadq5CW3L17A.ttf", "200" => "http://fonts.gstatic.com/s/trirong/v1/QD8N5qk-agpAEYCSSWullPesZW2xOQ-xsNqO47m55DA.ttf", "300" => "http://fonts.gstatic.com/s/trirong/v1/mfCfGz4GqprWJZ47PUMDGfesZW2xOQ-xsNqO47m55DA.ttf", "500" => "http://fonts.gstatic.com/s/trirong/v1/6CsQ6UR1e8rURaEPxqnGBvesZW2xOQ-xsNqO47m55DA.ttf", "600" => "http://fonts.gstatic.com/s/trirong/v1/1FjmLIhPhB6Yc7RWqO27mfesZW2xOQ-xsNqO47m55DA.ttf", "700" => "http://fonts.gstatic.com/s/trirong/v1/ab8hG5CTSzMAobTnPgcDP_esZW2xOQ-xsNqO47m55DA.ttf", "800" => "http://fonts.gstatic.com/s/trirong/v1/UBRQXGJvi5EHcyI5wwZew_esZW2xOQ-xsNqO47m55DA.ttf", "900" => "http://fonts.gstatic.com/s/trirong/v1/Lam1ewMdiP3O-bVYT-W6t_esZW2xOQ-xsNqO47m55DA.ttf", "100italic" => "http://fonts.gstatic.com/s/trirong/v1/ke-m75CXBPHlqwRHmCTBi6CWcynf_cDxXwCLxiixG1c.ttf", "200italic" => "http://fonts.gstatic.com/s/trirong/v1/TLnptEEWKdIVHKJYBO592y3USBnSvpkopQaUR-2r7iU.ttf", "300italic" => "http://fonts.gstatic.com/s/trirong/v1/RnkK09k5OfEHFxd_smcYuC3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/trirong/v1/lYu4kez-Enlvh2X-itx6CA.ttf", "italic" => "http://fonts.gstatic.com/s/trirong/v1/kV0MzmWPKkglEtJf--dQhQ.ttf", "500italic" => "http://fonts.gstatic.com/s/trirong/v1/I7H5Vf-5oH45BHkyxaUodS3USBnSvpkopQaUR-2r7iU.ttf", "600italic" => "http://fonts.gstatic.com/s/trirong/v1/BXLhSV51vCWUiACSqyWe6i3USBnSvpkopQaUR-2r7iU.ttf", "700italic" => "http://fonts.gstatic.com/s/trirong/v1/CEBv6IoZawJuRHdATx4LQi3USBnSvpkopQaUR-2r7iU.ttf", "800italic" => "http://fonts.gstatic.com/s/trirong/v1/lGUgSzOvjUqrsrJfnROivC3USBnSvpkopQaUR-2r7iU.ttf", "900italic" => "http://fonts.gstatic.com/s/trirong/v1/EtuLHyx5DS9oX5NoKhYlkC3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Trocchi", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/trocchi/v4/uldNPaKrUGVeGCVsmacLwA.ttf")), array("kind" => "webfonts#webfont", "family" => "Trochut", "category" => "display", "variants" => array("regular", "italic", "700"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/trochut/v4/lWqNOv6ISR8ehNzGLFLnJ_esZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/trochut/v4/6Y65B0x-2JsnYt16OH5omw.ttf", "italic" => "http://fonts.gstatic.com/s/trochut/v4/pczUwr4ZFvC79TgNO5cZng.ttf")), array("kind" => "webfonts#webfont", "family" => "Trykker", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/trykker/v5/YiVrVJpBFN7I1l_CWk6yYQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Tulpen One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/tulpenone/v6/lwcTfVIEVxpZLZlWzR5baPesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Ubuntu", "category" => "sans-serif", "variants" => array("300", "300italic", "regular", "italic", "500", "500italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek"), "version" => "v9", "lastModified" => "2016-06-03", "files" => array("300" => "http://fonts.gstatic.com/s/ubuntu/v9/7-wH0j2QCTHKgp7vLh9-sQ.ttf", "500" => "http://fonts.gstatic.com/s/ubuntu/v9/bMbHEMwSUmkzcK2x_74QbA.ttf", "700" => "http://fonts.gstatic.com/s/ubuntu/v9/B7BtHjNYwAp3HgLNagENOQ.ttf", "300italic" => "http://fonts.gstatic.com/s/ubuntu/v9/j-TYDdXcC_eQzhhp386SjaCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/ubuntu/v9/lhhB5ZCwEkBRbHMSnYuKyA.ttf", "italic" => "http://fonts.gstatic.com/s/ubuntu/v9/b9hP8wd30SygxZjGGk4DCQ.ttf", "500italic" => "http://fonts.gstatic.com/s/ubuntu/v9/NWdMogIO7U6AtEM4dDdf_aCWcynf_cDxXwCLxiixG1c.ttf", "700italic" => "http://fonts.gstatic.com/s/ubuntu/v9/pqisLQoeO9YTDCNnlQ9bf6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Ubuntu Condensed", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek"), "version" => "v7", "lastModified" => "2016-06-03", "files" => array("regular" => "http://fonts.gstatic.com/s/ubuntucondensed/v7/DBCt-NXN57MTAFjitYxdrKDbm6fPDOZJsR8PmdG62gY.ttf")), array("kind" => "webfonts#webfont", "family" => "Ubuntu Mono", "category" => "monospace", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("cyrillic", "cyrillic-ext", "latin", "greek-ext", "latin-ext", "greek"), "version" => "v6", "lastModified" => "2016-06-03", "files" => array("700" => "http://fonts.gstatic.com/s/ubuntumono/v6/ceqTZGKHipo8pJj4molytne1Pd76Vl7zRpE7NLJQ7XU.ttf", "regular" => "http://fonts.gstatic.com/s/ubuntumono/v6/EgeuS9OtEmA0y_JRo03MQaCWcynf_cDxXwCLxiixG1c.ttf", "italic" => "http://fonts.gstatic.com/s/ubuntumono/v6/KAKuHXAHZOeECOWAHsRKA0eOrDcLawS7-ssYqLr2Xp4.ttf", "700italic" => "http://fonts.gstatic.com/s/ubuntumono/v6/n_d8tv_JOIiYyMXR4eaV9c_zJjSACmk0BRPxQqhnNLU.ttf")), array("kind" => "webfonts#webfont", "family" => "Ultra", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/ultra/v8/OW8uXkOstRADuhEmGOFQLA.ttf")), array("kind" => "webfonts#webfont", "family" => "Uncial Antiqua", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/uncialantiqua/v4/F-leefDiFwQXsyd6eaSllqrFJ4O13IHVxZbM6yoslpo.ttf")), array("kind" => "webfonts#webfont", "family" => "Underdog", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-06-07", "files" => array("regular" => "http://fonts.gstatic.com/s/underdog/v5/gBv9yjez_-5PnTprHWq0ig.ttf")), array("kind" => "webfonts#webfont", "family" => "Unica One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/unicaone/v4/KbYKlhWMDpatWViqDkNQgA.ttf")), array("kind" => "webfonts#webfont", "family" => "UnifrakturCook", "category" => "display", "variants" => array("700"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/unifrakturcook/v8/ASwh69ykD8iaoYijVEU6RrWZkcsCTHKV51zmcUsafQ0.ttf")), array("kind" => "webfonts#webfont", "family" => "UnifrakturMaguntia", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/unifrakturmaguntia/v7/7KWy3ymCVR_xfAvvcIXm3-kdNg30GQauG_DE-tMYtWk.ttf")), array("kind" => "webfonts#webfont", "family" => "Unkempt", "category" => "display", "variants" => array("regular", "700"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-06-07", "files" => array("700" => "http://fonts.gstatic.com/s/unkempt/v7/V7H-GCl9bgwGwqFqTTgDHvesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/unkempt/v7/NLLBeNSspr0RGs71R5LHWA.ttf")), array("kind" => "webfonts#webfont", "family" => "Unlock", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/unlock/v6/rXEQzK7uIAlhoyoAEiMy1w.ttf")), array("kind" => "webfonts#webfont", "family" => "Unna", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/unna/v8/UAS0AM7AmbdCNY_80xyAZQ.ttf")), array("kind" => "webfonts#webfont", "family" => "VT323", "category" => "monospace", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/vt323/v7/ITU2YQfM073o1iYK3nSOmQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Vampiro One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/vampiroone/v7/OVDs4gY4WpS5u3Qd1gXRW6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Varela", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/varela/v7/ON7qs0cKUUixhhDFXlZUjw.ttf")), array("kind" => "webfonts#webfont", "family" => "Varela Round", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "hebrew"), "version" => "v7", "lastModified" => "2016-06-02", "files" => array("regular" => "http://fonts.gstatic.com/s/varelaround/v7/APH4jr0uSos5wiut5cpjri3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Vast Shadow", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/vastshadow/v6/io4hqKX3ibiqQQjYfW0-h6CWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Vesper Libre", "category" => "serif", "variants" => array("regular", "500", "700", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("500" => "http://fonts.gstatic.com/s/vesperlibre/v8/0liLgNkygqH6EOtsVjZDsZMQuUSAwdHsY8ov_6tk1oA.ttf", "700" => "http://fonts.gstatic.com/s/vesperlibre/v8/0liLgNkygqH6EOtsVjZDsUD2ttfZwueP-QU272T9-k4.ttf", "900" => "http://fonts.gstatic.com/s/vesperlibre/v8/0liLgNkygqH6EOtsVjZDsaObDOjC3UL77puoeHsE3fw.ttf", "regular" => "http://fonts.gstatic.com/s/vesperlibre/v8/Cg-TeZFsqV8BaOcoVwzu2C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Vibur", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/vibur/v7/xB9aKsUbJo68XP0bAg2iLw.ttf")), array("kind" => "webfonts#webfont", "family" => "Vidaloka", "category" => "serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/vidaloka/v8/C6Nul0ogKUWkx356rrt9RA.ttf")), array("kind" => "webfonts#webfont", "family" => "Viga", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/viga/v5/uD87gDbhS7frHLX4uL6agg.ttf")), array("kind" => "webfonts#webfont", "family" => "Voces", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/voces/v5/QoBH6g6yKgNIgvL8A2aE2Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Volkhov", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/volkhov/v8/L8PbKS-kEoLHm7nP--NCzPesZW2xOQ-xsNqO47m55DA.ttf", "regular" => "http://fonts.gstatic.com/s/volkhov/v8/MDIZAofe1T_J3un5Kgo8zg.ttf", "italic" => "http://fonts.gstatic.com/s/volkhov/v8/1rTjmztKEpbkKH06JwF8Yw.ttf", "700italic" => "http://fonts.gstatic.com/s/volkhov/v8/W6oG0QDDjCgj0gmsHE520C3USBnSvpkopQaUR-2r7iU.ttf")), array("kind" => "webfonts#webfont", "family" => "Vollkorn", "category" => "serif", "variants" => array("regular", "italic", "700", "700italic"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("700" => "http://fonts.gstatic.com/s/vollkorn/v6/gOwQjJVGXlDOONC12hVoBqCWcynf_cDxXwCLxiixG1c.ttf", "regular" => "http://fonts.gstatic.com/s/vollkorn/v6/IiexqYAeh8uII223thYx3w.ttf", "italic" => "http://fonts.gstatic.com/s/vollkorn/v6/UuIzosgR1ovBhJFdwVp3fvesZW2xOQ-xsNqO47m55DA.ttf", "700italic" => "http://fonts.gstatic.com/s/vollkorn/v6/KNiAlx6phRqXCwnZZG51JAJKKGfqHaYFsRG-T3ceEVo.ttf")), array("kind" => "webfonts#webfont", "family" => "Voltaire", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/voltaire/v6/WvqBzaGEBbRV-hrahwO2cA.ttf")), array("kind" => "webfonts#webfont", "family" => "Waiting for the Sunrise", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/waitingforthesunrise/v7/eNfH7kLpF1PZWpsetF-ha9TChrNgrDiT3Zy6yGf3FnM.ttf")), array("kind" => "webfonts#webfont", "family" => "Wallpoet", "category" => "display", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v8", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/wallpoet/v8/hmum4WuBN4A0Z_7367NDIg.ttf")), array("kind" => "webfonts#webfont", "family" => "Walter Turncoat", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/walterturncoat/v6/sG9su5g4GXy1KP73cU3hvQplL2YwNeota48DxFlGDUo.ttf")), array("kind" => "webfonts#webfont", "family" => "Warnes", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/warnes/v6/MXG7_Phj4YpzAXxKGItuBw.ttf")), array("kind" => "webfonts#webfont", "family" => "Wellfleet", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/wellfleet/v4/J5tOx72iFRPgHYpbK9J4XQ.ttf")), array("kind" => "webfonts#webfont", "family" => "Wendy One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin", "latin-ext"), "version" => "v4", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/wendyone/v4/R8CJT2oDXdMk_ZtuHTxoxw.ttf")), array("kind" => "webfonts#webfont", "family" => "Wire One", "category" => "sans-serif", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/wireone/v7/sRLhaQOQpWnvXwIx0CycQw.ttf")), array("kind" => "webfonts#webfont", "family" => "Work Sans", "category" => "sans-serif", "variants" => array("100", "200", "300", "regular", "500", "600", "700", "800", "900"), "subsets" => array("latin", "latin-ext"), "version" => "v2", "lastModified" => "2016-06-07", "files" => array("100" => "http://fonts.gstatic.com/s/worksans/v2/ZAhtNqLaAViKjGLajtuwWaCWcynf_cDxXwCLxiixG1c.ttf", "200" => "http://fonts.gstatic.com/s/worksans/v2/u_mYNr_qYP37m7vgvmIYZy3USBnSvpkopQaUR-2r7iU.ttf", "300" => "http://fonts.gstatic.com/s/worksans/v2/FD_Udbezj8EHXbdsqLUply3USBnSvpkopQaUR-2r7iU.ttf", "500" => "http://fonts.gstatic.com/s/worksans/v2/Nbre-U_bp6Xktt8cpgwaJC3USBnSvpkopQaUR-2r7iU.ttf", "600" => "http://fonts.gstatic.com/s/worksans/v2/z9rX03Xuz9ZNHTMg1_ghGS3USBnSvpkopQaUR-2r7iU.ttf", "700" => "http://fonts.gstatic.com/s/worksans/v2/4udXuXg54JlPEP5iKO5AmS3USBnSvpkopQaUR-2r7iU.ttf", "800" => "http://fonts.gstatic.com/s/worksans/v2/IQh-ap2Uqs7kl1YINeeEGi3USBnSvpkopQaUR-2r7iU.ttf", "900" => "http://fonts.gstatic.com/s/worksans/v2/Hjn0acvjHfjY_vAK9Uc6gi3USBnSvpkopQaUR-2r7iU.ttf", "regular" => "http://fonts.gstatic.com/s/worksans/v2/zVvigUiMvx7JVEnrJgc-5Q.ttf")), array("kind" => "webfonts#webfont", "family" => "Yanone Kaffeesatz", "category" => "sans-serif", "variants" => array("200", "300", "regular", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v7", "lastModified" => "2016-05-31", "files" => array("200" => "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRbq92v6XxU4pSv06GI0NsGc.ttf", "300" => "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRZlIwXPiNoNT_wxzJ2t3mTE.ttf", "700" => "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/We_iSDqttE3etzfdfhuPRf2R4S6PlKaGXWPfWpHpcl0.ttf", "regular" => "http://fonts.gstatic.com/s/yanonekaffeesatz/v7/YDAoLskQQ5MOAgvHUQCcLdXn3cHbFGWU4T2HrSN6JF4.ttf")), array("kind" => "webfonts#webfont", "family" => "Yantramanav", "category" => "sans-serif", "variants" => array("100", "300", "regular", "500", "700", "900"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-05-31", "files" => array("100" => "http://fonts.gstatic.com/s/yantramanav/v1/Rs1I2PF4Z8GAb6qjgvr8wIAWxXGWZ3yJw6KhWS7MxOk.ttf", "300" => "http://fonts.gstatic.com/s/yantramanav/v1/HSfbC4Z8I8BZ00wiXeA5bC9-WlPSxbfiI49GsXo3q0g.ttf", "500" => "http://fonts.gstatic.com/s/yantramanav/v1/HSfbC4Z8I8BZ00wiXeA5bMCNfqCYlB_eIx7H1TVXe60.ttf", "700" => "http://fonts.gstatic.com/s/yantramanav/v1/HSfbC4Z8I8BZ00wiXeA5bHe1Pd76Vl7zRpE7NLJQ7XU.ttf", "900" => "http://fonts.gstatic.com/s/yantramanav/v1/HSfbC4Z8I8BZ00wiXeA5bCenaqEuufTBk9XMKnKmgDA.ttf", "regular" => "http://fonts.gstatic.com/s/yantramanav/v1/FwdziO-qWAO8pZg8e376kaCWcynf_cDxXwCLxiixG1c.ttf")), array("kind" => "webfonts#webfont", "family" => "Yatra One", "category" => "display", "variants" => array("regular"), "subsets" => array("latin", "devanagari", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("regular" => "http://fonts.gstatic.com/s/yatraone/v1/ApKQzWF7_vG0Lt5TDqgUvw.ttf")), array("kind" => "webfonts#webfont", "family" => "Yellowtail", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-20", "files" => array("regular" => "http://fonts.gstatic.com/s/yellowtail/v6/HLrU6lhCTjXfLZ7X60LcB_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Yeseva One", "category" => "display", "variants" => array("regular"), "subsets" => array("cyrillic", "latin", "latin-ext"), "version" => "v10", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/yesevaone/v10/eenQQxvpzSA80JmisGcgX_esZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Yesteryear", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v5", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/yesteryear/v5/dv09hP_ZrdjVOfZQXKXuZvesZW2xOQ-xsNqO47m55DA.ttf")), array("kind" => "webfonts#webfont", "family" => "Yrsa", "category" => "serif", "variants" => array("300", "regular", "500", "600", "700"), "subsets" => array("latin", "latin-ext"), "version" => "v1", "lastModified" => "2016-06-20", "files" => array("300" => "http://fonts.gstatic.com/s/yrsa/v1/YI0C1syzAYpkrPx27UnC2w.ttf", "500" => "http://fonts.gstatic.com/s/yrsa/v1/rWuZmBLHIeKRbnfSvWCvYg.ttf", "600" => "http://fonts.gstatic.com/s/yrsa/v1/1413P-oEfrq-tBIdqnslDQ.ttf", "700" => "http://fonts.gstatic.com/s/yrsa/v1/iV49zaJV5wyo_4LgxE2yng.ttf", "regular" => "http://fonts.gstatic.com/s/yrsa/v1/JWX_dCK4_Jq-oqF7r9rFHg.ttf")), array("kind" => "webfonts#webfont", "family" => "Zeyada", "category" => "handwriting", "variants" => array("regular"), "subsets" => array("latin"), "version" => "v6", "lastModified" => "2016-05-31", "files" => array("regular" => "http://fonts.gstatic.com/s/zeyada/v6/hmonmGYYFwqTZQfG2nRswQ.ttf")))); diff --git a/app/features/mec/wizard.php b/app/features/mec/wizard.php new file mode 100755 index 0000000..adc6611 --- /dev/null +++ b/app/features/mec/wizard.php @@ -0,0 +1,567 @@ +main->get_settings(); +$archive_skins = $this->main->get_archive_skins(); +?> + +
    +
    +

    +
    +

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + + +
    +
    +
    + +
    + + + +
    + + + \ No newline at end of file diff --git a/app/features/notifications.php b/app/features/notifications.php new file mode 100755 index 0000000..e991fd1 --- /dev/null +++ b/app/features/notifications.php @@ -0,0 +1,212 @@ + + */ +class MEC_feature_notifications extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $notif_settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // MEC Notification Settings + $this->notif_settings = $this->main->get_notifications(); + } + + /** + * Initialize notifications feature + * @author Webnus + */ + public function init() + { + // Module is disabled + if(!isset($this->settings['notif_per_event']) || !$this->settings['notif_per_event']) return; + + $this->factory->action('mec_metabox_details', [$this, 'meta_box_notifications'], 30); + } + + /** + * Show notification meta box + * @author Webnus + * @param $post + */ + public function meta_box_notifications($post) + { + $values = get_post_meta($post->ID, 'mec_notifications', true); + if(!is_array($values)) $values = []; + + $notifications = $this->get_notifications(); + ?> +
    + $notification): if(isset($this->notif_settings[$key]) and isset($this->notif_settings[$key]['status']) and !$this->notif_settings[$key]['status']) continue; ?> +
    +

    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + notif_settings[$key]) and isset($this->notif_settings[$key]['content']) and trim($this->notif_settings[$key]['content'])) ? stripslashes($this->notif_settings[$key]['content']) : '')), 'mec_notifications_'.esc_attr($key).'_content', array('textarea_name'=>'mec[notifications]['.$key.'][content]')); ?> +
    +
    + + +
    +
    + +

    + display_placeholders(); ?> +
    + [ + 'label' => esc_html__('Booking Notification', 'modern-events-calendar-lite') + ], + 'booking_confirmation' => [ + 'label' => esc_html__('Booking Confirmation', 'modern-events-calendar-lite') + ], + 'booking_rejection' => [ + 'label' => esc_html__('Booking Rejection', 'modern-events-calendar-lite') + ], + 'email_verification' => [ + 'label' => esc_html__('Email Verification', 'modern-events-calendar-lite') + ], + 'cancellation_notification' => [ + 'label' => esc_html__('Booking Cancellation', 'modern-events-calendar-lite') + ], + 'booking_reminder' => [ + 'label' => esc_html__('Booking Reminder', 'modern-events-calendar-lite') + ], + 'event_finished' => [ + 'label' => esc_html__('Event Finished', 'modern-events-calendar-lite') + ], + 'event_soldout' => [ + 'label' => esc_html__('Event Soldout', 'modern-events-calendar-lite') + ], + 'admin_notification' => [ + 'label' => esc_html__('Admin Notification', 'modern-events-calendar-lite') + ], + 'certificate_send' => [ + 'label' => esc_html__('Send Certificate', 'modern-events-calendar-lite') + ], + ]; + + return apply_filters('mec_event_notifications', $notifications); + } + + public static function display_placeholders() + { + ?> +
      +
    • %%name%%:
    • +
    • %%first_name%%:
    • +
    • %%last_name%%:
    • +
    • %%user_email%%:
    • +
    • %%book_date%%:
    • +
    • %%book_time%%:
    • +
    • %%book_datetime%%:
    • +
    • %%book_other_datetimes%%:
    • +
    • %%book_date_next_occurrences%%:
    • +
    • %%book_datetime_next_occurrences%%:
    • +
    • %%book_price%%:
    • +
    • %%book_payable%%:
    • +
    • %%attendee_price%%:
    • +
    • %%book_order_time%%:
    • +
    • %%blog_name%%:
    • +
    • %%blog_url%%:
    • +
    • %%blog_description%%:
    • +
    • %%event_title%%:
    • +
    • %%event_description%%:
    • +
    • %%event_tags%%:
    • +
    • %%event_labels%%:
    • +
    • %%event_categories%%:
    • +
    • %%event_cost%%:
    • +
    • %%event_link%%:
    • +
    • %%event_speaker_name%%:
    • +
    • %%event_organizer_name%%:
    • +
    • %%event_organizer_tel%%:
    • +
    • %%event_organizer_email%%:
    • +
    • %%event_organizer_url%%:
    • +
    • %%event_other_organizers_name%%:
    • +
    • %%event_other_organizers_tel%%:
    • +
    • %%event_other_organizers_email%%:
    • +
    • %%event_location_name%%:
    • +
    • %%event_location_address%%:
    • +
    • %%event_other_locations_name%%:
    • +
    • %%event_other_locations_address%%:
    • +
    • %%event_featured_image%%:
    • +
    • %%event_more_info%%:
    • +
    • %%event_other_info%%:
    • +
    • %%online_link%%:
    • +
    • %%attendees_full_info%%:
    • +
    • %%all_bfixed_fields%%:
    • +
    • %%booking_id%%:
    • +
    • %%booking_transaction_id%%:
    • +
    • %%admin_link%%:
    • +
    • %%total_attendees%%:
    • +
    • %%amount_tickets%%:
    • +
    • %%ticket_name%%:
    • +
    • %%ticket_time%%:
    • +
    • %%ticket_name_time%%:
    • +
    • %%ticket_private_description%%:
    • +
    • %%ticket_variations%%:
    • +
    • %%payment_gateway%%:
    • +
    • %%dl_file%%:
    • +
    • %%google_calendar_link%%:
    • +
    • %%google_calendar_link_next_occurrences%%:
    • +
    • %%event_start_date%%:
    • +
    • %%event_end_date%%:
    • +
    • %%event_start_time%%:
    • +
    • %%event_end_time%%:
    • +
    • %%event_timezone%%:
    • +
    • %%event_start_date_local%%:
    • +
    • %%event_end_date_local%%:
    • +
    • %%event_start_time_local%%:
    • +
    • %%event_end_time_local%%:
    • +
    • %%event_status%%:
    • +
    • %%event_note%%:
    • + +
    + + */ +class MEC_feature_occurrences extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $db; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Import MEC DB + $this->db = $this->getDB(); + } + + /** + * Initialize occurrences feature + * @author Webnus + */ + public function init() + { + // Occurrences Status + $occurrences_status = isset($this->settings['per_occurrences_status']) && $this->settings['per_occurrences_status'] && $this->getPRO(); + + // Feature is not enabled + if(!$occurrences_status) return; + + // Tab + $this->factory->filter('mec-single-event-meta-title', array($this, 'tab'), 10, 3); + + // Metabox + $this->factory->action('mec_metabox_details', array($this, 'meta_box_occurrences'), 18); + + // Occurrences for FES + if(!isset($this->settings['fes_section_occurrences']) or (isset($this->settings['fes_section_occurrences']) and $this->settings['fes_section_occurrences'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_occurrences'), 18); + + // AJAX + $this->factory->action('wp_ajax_mec_occurrences_add', array($this, 'add')); + $this->factory->action('wp_ajax_mec_occurrences_delete', array($this, 'delete')); + + // Save Data + $this->factory->action('mec_save_event_data', array($this, 'save'), 10, 2); + + $this->factory->filter('mec_occurrence_event_title', [$this, 'title'], 10, 2); + } + + public function tab($tabs, $activated, $post) + { + $draft = !(isset($post->post_status) && $post->post_status != 'auto-draft'); + $repeat_status = get_post_meta($post->ID, 'mec_repeat_status', true); + + if($draft or !$repeat_status) return $tabs; + + $tabs[__('Occurrences', 'modern-events-calendar-lite')] = 'mec-occurrences'; + return $tabs; + } + + /** + * Show occurrences of event into the Add/Edit event page + * + * @author Webnus + * @param WP_Post $post + */ + public function meta_box_occurrences($post) + { + FormBuilder::occurrences( $post ); + } + + public function delete() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_occurrences_delete')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $occurrence_id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : ''; + + // Request is invalid! + if(!trim($occurrence_id)) $this->main->response(array('success'=>0, 'code'=>'ID_IS_INVALID')); + + $this->db->q("DELETE FROM `#__mec_occurrences` WHERE `id`='".$this->db->escape($occurrence_id)."'"); + + $this->main->response(array('success'=>1)); + } + + public function add() + { + // Check if our nonce is set. + if(!isset($_POST['_wpnonce'])) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'mec_occurrences_add')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $date = isset($_POST['date']) ? sanitize_text_field($_POST['date']) : ''; + $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : ''; + + // Date is invalid! + if(!trim($date) or !trim($id)) $this->main->response(array('success'=>0, 'code'=>'DATE_OR_ID_IS_INVALID')); + + $dates = explode(':', $date); + + // Add Occurrence + $occurrence_id = $this->db->q("INSERT INTO `#__mec_occurrences` (`post_id`,`occurrence`,`params`) VALUES ('".$id."','".$dates[0]."','".json_encode(array())."')", 'insert'); + + $success = 1; + + ob_start(); + $this->get_occurrence_form($occurrence_id); + $html = ob_get_clean(); + + $this->main->response(array('success'=>$success, 'html'=>$html)); + } + + public function get_occurrence_form($occurrence_id) + { + $params = $this->get($occurrence_id); + $data = $this->get_data($occurrence_id); + + $event_id = $data['post_id'] ?? 0; + $post = get_post($event_id); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + $datetime_format = $date_format.' '.$time_format; + + $event_status = (isset($params['event_status']) and trim($params['event_status'])) ? $params['event_status'] : 'EventScheduled'; + $moved_online_link = (isset($params['moved_online_link']) and trim($params['moved_online_link'])) ? $params['moved_online_link'] : ''; + $cancelled_reason = (isset($params['cancelled_reason']) and trim($params['cancelled_reason'])) ? $params['cancelled_reason'] : ''; + $display_cancellation_reason_in_single_page = (isset($params['display_cancellation_reason_in_single_page']) and trim($params['display_cancellation_reason_in_single_page'])) ? $params['display_cancellation_reason_in_single_page'] : ''; + + $hourly_schedules = (isset($params['hourly_schedules']) and is_array($params['hourly_schedules'])) ? $params['hourly_schedules'] : []; + $fields_data = (isset($params['fields']) and is_array($params['fields'])) ? $params['fields'] : get_post_meta($post->ID, 'mec_fields', true); + + // Status of Speakers Feature + $speakers_status = isset($this->settings['speakers_status']) && $this->settings['speakers_status']; + $speakers = get_terms('mec_speaker', array( + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => '0', + )); + + // Cost + $type = ((isset($this->settings['single_cost_type']) and trim($this->settings['single_cost_type'])) ? $this->settings['single_cost_type'] : 'numeric'); + + // Links + $read_more = (isset($params['read_more']) ? esc_attr($params['read_more']) : ''); + $more_info = (isset($params['more_info']) ? esc_attr($params['more_info']) : ''); + $more_info_title = (isset($params['more_info_title']) ? esc_attr($params['more_info_title']) : ''); + $more_info_target = (isset($params['more_info_target']) ? esc_attr($params['more_info_target']) : ''); + + // Locations + $locations = get_terms('mec_location', array('orderby'=>'name', 'hide_empty'=>'0')); + $location_id = (isset($params['location_id']) ? esc_attr($params['location_id']) : ''); + + $dont_show_map = (isset($params['dont_show_map']) ? esc_attr($params['dont_show_map']) : ''); + + // Organizers + $organizers = get_terms('mec_organizer', array('orderby'=>'name', 'hide_empty'=>'0')); + $organizer_id = (isset($params['organizer_id']) ? esc_attr($params['organizer_id']) : ''); + + // Tickets + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + $occ_tickets = (isset($params['tickets']) and is_array($params['tickets'])) ? $params['tickets'] : []; + + // Bookings + $bookings = $this->main->get_bookings($event_id, $data['occurrence']); + + // All Occurrences + $occurrences = $this->get_dates($event_id, current_time('timestamp')); + ?> +
  • +

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    main->m('event_cost', esc_html__('SEO Schema / Event Status', 'modern-events-calendar-lite'))); ?>

    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    > +
    + + +
    +
    +

    +
    +
    + +
    + +
    +

    main->m('bookings', esc_html__('Bookings', 'modern-events-calendar-lite'))); ?>

    +

    + + +
    +
    + +
    + +
    +
    + +
    +
    + +

    +
    + +
    +
    +
    +
    + getFormBuilder(); + $builder->hourlySchedule([ + 'hourly_schedules' => $hourly_schedules, + 'speakers_status' => $speakers_status, + 'speakers' => $speakers, + 'wrapper_class' => '', + 'prefix' => 'mec_occurrences_'.esc_attr($occurrence_id).'_', + 'name_prefix' => 'mec[occurrences]['.esc_attr($occurrence_id).']', + ]); + ?> +
    +
    +
    +
    + getEventFields(); + $fields->form(array( + 'id' => 'mec_occurrences_event_fields_'.esc_attr($occurrence_id), + 'class' => 'no', + 'post' => $post, + 'data' => $fields_data, + 'id_prefix' => 'mec_occurrences_'.esc_attr($occurrence_id).'_', + 'name_prefix' => 'mec[occurrences]['.esc_attr($occurrence_id).']', + 'mandatory_status' => false, + )); + ?> +
    +
    +
    +
    +

    main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite'))); ?>

    +
    + + +
    +
    +

    +
    + +
    +
    + + getPRO()): ?> +
    +
    + + +
    +
    + +
    +
    +
    +
    +

    main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))); ?>

    +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    +
    +

    main->m('event_cost', esc_html__('Event Cost', 'modern-events-calendar-lite'))); ?>

    +
    +
    + class="mec-col-3" name="mec[occurrences][][cost]" id="mec_occurrences__cost" value="" title="" placeholder=""/> +
    +
    +
    +
    + + +
    +
    +

    main->m('tickets', esc_html__('Tickets', 'modern-events-calendar-lite'))); ?>

    +
    + $ticket): if(!is_numeric($key)) continue; $occ_ticket = $occ_tickets[$key] ?? []; ?> +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +

    +
    + + + ID, esc_attr($occurrence_id)); ?> +
    +
    + + + + +
    +
    +
    + +
  • + getBook(); + + foreach($occurrences as $occurrence) + { + // Clean Hourly Schedules + $raw_hourly_schedules = $occurrence['hourly_schedules'] ?? []; + if(isset($raw_hourly_schedules[':d:'])) unset($raw_hourly_schedules[':d:']); + + $hourly_schedules = []; + foreach($raw_hourly_schedules as $raw_hourly_schedule) + { + if(isset($raw_hourly_schedule['schedules'][':i:'])) unset($raw_hourly_schedule['schedules'][':i:']); + $hourly_schedules[] = $raw_hourly_schedule; + } + + // Hourly Schedules + $occurrence['hourly_schedules'] = $hourly_schedules; + + $location_id = $occurrence['location_id'] ?? ''; + if($location_id) $location_ids[] = $location_id; + + $organizer_id = $occurrence['organizer_id'] ?? ''; + if($organizer_id) $organizer_ids[] = $organizer_id; + + // Status + $status = $occurrence['event_status'] ?? 'EventScheduled'; + $bookings_status = $occurrence['cancel_bookings'] ?? ''; + $move_bookings_to = $occurrence['move_bookings_to'] ?? ''; + + if($status === 'EventCancelled' && trim($bookings_status)) + { + $timestamp = $this->db->select("SELECT occurrence FROM `#__mec_occurrences` WHERE `id`='".esc_sql($occurrence['id'])."'", 'loadResult'); + $bookings = $this->main->get_bookings($post_id, $timestamp); + + $occ_data = $this->get_data($occurrence['id']); + + foreach($bookings as $booking) + { + if($bookings_status === 'refund') $book->cancel($booking->ID, true); + elseif($bookings_status === 'move' && trim($move_bookings_to) && isset($occ_data['occurrence'])) $book->move($booking->ID, $occ_data['occurrence'], $move_bookings_to); + elseif($bookings_status === 'move_notify' && trim($move_bookings_to) && isset($occ_data['occurrence'])) + { + $book->move($booking->ID, $occ_data['occurrence'], $move_bookings_to); + $book->move_notify($booking->ID, $move_bookings_to); + } + else $book->cancel($booking->ID, false); + } + } + + + // Save Occurrence + $this->db->q("UPDATE `#__mec_occurrences` SET `params`='".json_encode($occurrence, JSON_UNESCAPED_UNICODE)."' WHERE `id`='".$this->db->escape($occurrence['id'])."'"); + } + + $organizer_ids = array_unique($organizer_ids); + foreach($organizer_ids as $organizer_id) wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer', true); + + $location_ids = array_unique($location_ids); + foreach($location_ids as $location_id) wp_set_object_terms($post_id, (int) $location_id, 'mec_location', true); + } + + public function get_dates($post_id, $start, $limit = 100) + { + return $this->db->select("SELECT `tstart`, `tend` FROM `#__mec_dates` WHERE `post_id`='".$this->db->escape($post_id)."' AND `tstart`>='".$this->db->escape($start)."' ORDER BY `tstart` ASC LIMIT ".$this->db->escape($limit)); + } + + public function get($occurrence_id) + { + $JSON = $this->db->select("SELECT `params` FROM `#__mec_occurrences` WHERE `id`='".$this->db->escape($occurrence_id)."'", 'loadResult'); + + if(!trim($JSON)) return []; + else + { + $params = json_decode($JSON, true); + + if(!is_array($params)) return []; + else return $params; + } + } + + public function get_data($occurrence_id) + { + return $this->db->select("SELECT * FROM `#__mec_occurrences` WHERE `id`='".$this->db->escape($occurrence_id)."'", 'loadAssoc'); + } + + public function get_all_occurrences($post_id, $start = NULL) + { + return $this->db->select("SELECT * FROM `#__mec_occurrences` WHERE `post_id`='".$this->db->escape($post_id)."' ".($start ? "AND `occurrence`>='".$this->db->escape($start)."'" : '')." ORDER BY `occurrence` DESC LIMIT 200", 'loadAssocList'); + } + + public static function param($post_id, $timestamp, $key, $default = NULL) + { + // Main + $main = new MEC_main(); + + // Cache + $cache = $main->getCache(); + + // Get + $params = $cache->rememberOnce('mec_occ_param_'.$post_id.'_'.$timestamp.'_'.$key, function() use($main, $post_id, $timestamp) + { + $db = $main->getDB(); + $JSON = $db->select("SELECT `params` FROM `#__mec_occurrences` WHERE `post_id`='".$db->escape($post_id)."' AND `occurrence`='".$db->escape($timestamp)."' ORDER BY `id` DESC LIMIT 1", 'loadResult'); + + if(is_null($JSON) or !trim($JSON)) $params = []; + else $params = json_decode($JSON, true); + + return is_array($params) ? $params : []; + }); + + if($key == '*') return $params; + elseif(isset($params[$key]) and !is_array($params[$key]) and trim($params[$key]) != '') return $params[$key]; + elseif(isset($params[$key]) and is_array($params[$key])) return $params[$key]; + else return $default; + } + + public static function fetch($date_events = array()) + { + $occurrences = []; + $where = ''; + + foreach($date_events as $events) + { + foreach($events as $event) + { + $timestamp = (isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp']) and $event->date['start']['timestamp']) ? $event->date['start']['timestamp'] : NULL; + if(!$timestamp) continue; + + $occurrences[] = array($event->ID, $timestamp); + $where .= "(`post_id`=".esc_sql($event->ID)." AND `occurrence`=".esc_sql($timestamp).") OR "; + } + } + + // No Occurrences + if(!count($occurrences)) return; + + // Add to Cache + self::cache_fetched_occurrences($occurrences, $where); + } + + public static function fetch_single($event, $dates) + { + $occurrences = []; + $where = ''; + + foreach($dates as $date) + { + $timestamp = (isset($date) and isset($date['start']) and isset($date['start']['timestamp']) and $date['start']['timestamp']) ? $date['start']['timestamp'] : NULL; + if(!$timestamp) continue; + + $occurrences[] = array($event->ID, $timestamp); + $where .= "(`post_id`=".esc_sql($event->ID)." AND `occurrence`=".esc_sql($timestamp).") OR "; + } + + // No Occurrences + if(!count($occurrences)) return; + + // Add to Cache + self::cache_fetched_occurrences($occurrences, $where); + } + + public static function cache_fetched_occurrences($occurrences, $where) + { + // Main + $main = new MEC_main(); + + // Db + $db = $main->getDB(); + + // Records + $records = $db->select("SELECT `post_id`, `occurrence`, `params` FROM `#__mec_occurrences` WHERE ".rtrim($where, 'OR ')); + + // Mapped Records + $mapped_records = []; + + foreach($records as $record) + { + $JSON = $record->params; + + if(!trim($JSON)) $params = []; + else $params = json_decode($JSON, true); + + $mapped_records[$record->post_id.':'.$record->occurrence] = (is_array($params) ? $params : array()); + } + + // Cache + $cache = $main->getCache(); + + // Add to Cache + foreach($occurrences as $occurrence) + { + $post_id = $occurrence[0]; + $timestamp = $occurrence[1]; + + $value = $mapped_records[$post_id . ':' . $timestamp] ?? []; + $cache->set('mec_occ_param_'.$post_id.'_'.$timestamp, $value); + } + } + + public function title($title, $event) + { + $time = $event->data->time ?? []; + + if(is_array($time) && count($time) && isset($time['start_timestamp']) && $time['start_timestamp']) + { + $title = MEC_feature_occurrences::param($event->ID, $time['start_timestamp'], 'title', $title); + } + + return $title; + } +} \ No newline at end of file diff --git a/app/features/organizers.php b/app/features/organizers.php new file mode 100755 index 0000000..99ed7cd --- /dev/null +++ b/app/features/organizers.php @@ -0,0 +1,418 @@ + + */ +class MEC_feature_organizers extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize organizers feature + * @author Webnus + */ + public function init() + { + // Organizer Module is Disabled + if(isset($this->settings['organizers_status']) && !$this->settings['organizers_status']) return; + + $this->factory->action('init', array($this, 'register_taxonomy'), 25); + $this->factory->action('mec_organizer_edit_form_fields', array($this, 'edit_form')); + $this->factory->action('mec_organizer_add_form_fields', array($this, 'add_form')); + $this->factory->action('edited_mec_organizer', array($this, 'save_metadata')); + $this->factory->action('created_mec_organizer', array($this, 'save_metadata')); + + $this->factory->action('mec_metabox_details', array($this, 'meta_box_organizer'), 40); + if(!isset($this->settings['fes_section_organizer']) or (isset($this->settings['fes_section_organizer']) and $this->settings['fes_section_organizer'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_organizer'), 31); + + $this->factory->filter('manage_edit-mec_organizer_columns', array($this, 'filter_columns')); + $this->factory->filter('manage_mec_organizer_custom_column', array($this, 'filter_columns_content'), 10, 3); + + $this->factory->action('save_post', array($this, 'save_event'), 2); + } + + /** + * Registers organizer taxonomy + * @author Webnus + */ + public function register_taxonomy() + { + $singular_label = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_organizers', esc_html__('Organizers', 'modern-events-calendar-lite')); + + $organizer_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-organizer'), + 'public'=>false, + 'show_ui'=>true, + 'hierarchical'=>false, + ), + 'mec_organizer' + ); + register_taxonomy( + 'mec_organizer', + $this->main->get_main_post_type(), + $organizer_args + ); + + register_taxonomy_for_object_type('mec_organizer', $this->main->get_main_post_type()); + } + + /** + * Show edit form of organizer taxonomy + * @author Webnus + * @param object $term + */ + public function edit_form($term) + { + $tel = get_metadata('term', $term->term_id, 'tel', true); + $email = get_metadata('term', $term->term_id, 'email', true); + $url = get_metadata('term', $term->term_id, 'url', true); + $page_label = get_metadata('term', $term->term_id, 'page_label', true); + $facebook = get_metadata('term', $term->term_id, 'facebook', true); + $instagram = get_metadata('term', $term->term_id, 'instagram', true); + $linkedin = get_metadata('term', $term->term_id, 'linkedin', true); + $twitter = get_metadata('term', $term->term_id, 'twitter', true); + $thumbnail = get_metadata('term', $term->term_id, 'thumbnail', true); + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    '; ?>
    + + + + + + + + */ + public function add_form() + { + ?> +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + + + +
    + + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['tel'])) return; + + $tel = isset($_POST['tel']) ? sanitize_text_field($_POST['tel']) : ''; + $email = isset($_POST['email']) ? sanitize_text_field($_POST['email']) : ''; + $url = (isset($_POST['url']) and trim($_POST['url'])) ? sanitize_url($_POST['url']) : ''; + $page_label = (isset($_POST['page_label']) and trim($_POST['page_label'])) ? sanitize_text_field($_POST['page_label']) : ''; + $facebook = (isset($_POST['facebook']) and trim($_POST['facebook'])) ? esc_url($_POST['facebook']) : ''; + $twitter = (isset($_POST['twitter']) and trim($_POST['twitter'])) ? esc_url($_POST['twitter']) : ''; + $instagram = (isset($_POST['instagram']) and trim($_POST['instagram'])) ? esc_url($_POST['instagram']) : ''; + $linkedin = (isset($_POST['linkedin']) and trim($_POST['linkedin'])) ? esc_url($_POST['linkedin']) : ''; + $thumbnail = isset($_POST['thumbnail']) ? sanitize_text_field($_POST['thumbnail']) : ''; + + update_term_meta($term_id, 'tel', $tel); + update_term_meta($term_id, 'email', $email); + update_term_meta($term_id, 'url', $url); + update_term_meta($term_id, 'page_label', $page_label); + update_term_meta($term_id, 'facebook', $facebook); + update_term_meta($term_id, 'twitter', $twitter); + update_term_meta($term_id, 'instagram', $instagram); + update_term_meta($term_id, 'linkedin', $linkedin); + update_term_meta($term_id, 'thumbnail', $thumbnail); + + do_action('mec_save_organizer_extra_fields', $term_id); + } + + /** + * Filter columns of organizer taxonomy + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_columns($columns) + { + unset($columns['name']); + unset($columns['slug']); + unset($columns['description']); + unset($columns['posts']); + + $columns['id'] = esc_html__('ID', 'modern-events-calendar-lite'); + $columns['name'] = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + $columns['contact'] = esc_html__('Contact info', 'modern-events-calendar-lite'); + $columns['posts'] = esc_html__('Count', 'modern-events-calendar-lite'); + $columns['slug'] = esc_html__('Slug', 'modern-events-calendar-lite'); + + return apply_filters('organizer_filter_column', $columns); + } + + /** + * Filter content of organizer taxonomy columns + * @author Webnus + * @param string $content + * @param string $column_name + * @param int $term_id + * @return string + */ + public function filter_columns_content($content, $column_name, $term_id) + { + switch($column_name) + { + case 'id': + + $content = $term_id; + break; + + case 'contact': + + $tel = get_metadata('term', $term_id, 'tel', true); + $email = get_metadata('term', $term_id, 'email', true); + + $content = $email.(trim($tel) ? '
    '.$tel : ''); + break; + + default: + break; + } + + return apply_filters('organizer_filter_column_content', $content, $column_name, $term_id); + } + + /** + * Show organizer meta box + * @author Webnus + * @param object $post + */ + public function meta_box_organizer($post){ + + FormBuilder::organizers( $post ); + } + + /** + * Save event organizer data + * @author Webnus + * @param int $post_id + * @return boolean + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return false; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return false; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return false; + + $action = (isset($_POST['action']) ? sanitize_text_field($_POST['action']) : ''); + if($action === 'mec_fes_form') return false; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + // Selected a saved organizer + if(isset($_mec['organizer_id']) and $_mec['organizer_id']) + { + // Set term to the post + wp_set_object_terms($post_id, (int) sanitize_text_field($_mec['organizer_id']), 'mec_organizer'); + + return true; + } + + $name = (isset($_mec['organizer']['name']) and trim($_mec['organizer']['name'])) ? sanitize_text_field($_mec['organizer']['name']) : esc_html__('Organizer Name', 'modern-events-calendar-lite'); + + $term = get_term_by('name', $name, 'mec_organizer'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_organizer'); + + return true; + } + + $term = wp_insert_term($name, 'mec_organizer'); + + // An error occurred + if(is_wp_error($term)) return false; + + $organizer_id = $term['term_id']; + + if(!$organizer_id) return false; + + // Set Organizer ID to the parameters + $_POST['mec']['organizer_id'] = $organizer_id; + + // Set term to the post + wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + $tel = (isset($_mec['organizer']['tel']) and trim($_mec['organizer']['tel'])) ? sanitize_text_field($_mec['organizer']['tel']) : ''; + $email = (isset($_mec['organizer']['email']) and trim($_mec['organizer']['email'])) ? sanitize_text_field($_mec['organizer']['email']) : ''; + $url = (isset($_mec['organizer']['url']) and trim($_mec['organizer']['url'])) ? sanitize_url($_mec['organizer']['url']) : ''; + $page_label = (isset($_mec['organizer']['page_label']) and trim($_mec['organizer']['page_label'])) ? sanitize_text_field($_mec['organizer']['page_label']) : ''; + $thumbnail = (isset($_mec['organizer']['thumbnail']) and trim($_mec['organizer']['thumbnail'])) ? sanitize_text_field($_mec['organizer']['thumbnail']) : ''; + + update_term_meta($organizer_id, 'tel', $tel); + update_term_meta($organizer_id, 'email', $email); + update_term_meta($organizer_id, 'url', $url); + update_term_meta($organizer_id, 'page_label', $page_label); + update_term_meta($organizer_id, 'thumbnail', $thumbnail); + + return true; + } +} \ No newline at end of file diff --git a/app/features/partial.php b/app/features/partial.php new file mode 100755 index 0000000..2ccf420 --- /dev/null +++ b/app/features/partial.php @@ -0,0 +1,77 @@ + + */ +class MEC_feature_partial extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Partial Payment Library + * @var MEC_partial + */ + public $partial_payment; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import Partial Payment + $this->partial_payment = $this->getPartialPayment(); + } + + /** + * Initialize + * @author Webnus + */ + public function init() + { + // Pro version is required + if(!$this->getPRO()) return false; + + // Partial Payment is not enabled + if(!$this->partial_payment->is_enabled()) return false; + + // Validate Settings Form + add_filter('mec_validate_general_settings_options', [$this, 'validate_settings_form'], 10, 1); + + return true; + } + + public function validate_settings_form($all_options) + { + // It's not a settings form + if(!isset($all_options['settings'])) return $all_options; + + $payable = isset($all_options['settings']['booking_payable']) ? $all_options['settings']['booking_payable'] : 100; + $payable_type = isset($all_options['settings']['booking_payable_type']) ? $all_options['settings']['booking_payable_type'] : 'percent'; + + // Validate + [$payable, $payable_type] = $this->partial_payment->validate_payable_options($payable, $payable_type); + + $all_options['settings']['booking_payable'] = $payable; + $all_options['settings']['booking_payable_type'] = $payable_type; + + return $all_options; + } +} \ No newline at end of file diff --git a/app/features/popup.php b/app/features/popup.php new file mode 100755 index 0000000..643172d --- /dev/null +++ b/app/features/popup.php @@ -0,0 +1,681 @@ + + */ +class MEC_feature_popup extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize popup feature + * @author Webnus + */ + public function init() + { + // Shortcode & Event Popup + $this->factory->action('restrict_manage_posts', array($this, 'add_popup')); + + // Shortcode Save + $this->factory->action('wp_ajax_mec_popup_shortcode', array($this, 'shortcode_save')); + + // Event Save + $this->factory->action('wp_ajax_mec_popup_event', array($this, 'event_save')); + $this->factory->action('wp_ajax_mec_popup_event_category', array($this, 'save_category')); + } + + public function add_popup($post_type) + { + // Shortcode Popup + if($post_type == $this->main->get_shortcode_post_type()) + { + $path = MEC::import('app.features.popup.shortcode', true, true); + include $path; + } + //Event Popup + elseif($post_type == $this->main->get_main_post_type()) + { + $path = MEC::import('app.features.popup.event', true, true); + include $path; + } + } + + public function shortcode_save() + { + // Security Nonce + $wpnonce = isset($_POST['_mecnonce']) ? sanitize_text_field($_POST['_mecnonce']) : NULL; + + // Check if our nonce is set. + if(!trim($wpnonce)) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce($wpnonce, 'mec_shortcode_popup')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $params = (isset($_POST['shortcode']) and is_array($_POST['shortcode'])) ? $this->main->sanitize_deep_array($_POST['shortcode']) : []; + + $skin = isset($params['skin']) ? sanitize_text_field($params['skin']) : 'list'; + $title = isset($params['name']) ? sanitize_text_field($params['name']) : ucwords(str_replace('_', ' ', $skin)); + + $show_past_events = isset($params['show_past_events']) ? sanitize_text_field($params['show_past_events']) : 1; + $show_only_past_events = isset($params['show_only_past_events']) ? sanitize_text_field($params['show_only_past_events']) : 0; + $show_only_ongoing_events = isset($params['show_only_ongoing_events']) ? sanitize_text_field($params['show_only_ongoing_events']) : 0; + + $sed = isset($params['sed']) ? sanitize_text_field($params['sed']) : 0; + $style = isset($params['style']) ? sanitize_text_field($params['style']) : 'clean'; + $event = isset($params['event']) ? sanitize_text_field($params['event']) : 0; + $custom_style = isset($params['custom_style']) ? sanitize_text_field($params['custom_style']) : ''; + + $skin_options = array( + 'list' => array( + 'style' => $style, + 'start_date_type' => 'today', + 'start_date' => '', + 'maximum_date_range' => '', + 'include_events_times' => 0, + 'pagination_method' => 'loadmore', + 'month_divider' => 1, + 'map_on_top' => 0, + 'set_geolocation' => 0, + 'toggle_month_divider' => 0, + ), + 'grid' => array( + 'style' => $style, + 'start_date_type' => 'today', + 'start_date' => '', + 'maximum_date_range' => '', + 'count' => 3, + 'pagination_method' => 'loadmore', + 'map_on_top' => 0, + 'set_geolocation' => 0, + ), + 'agenda' => array( + 'style' => $style, + 'start_date_type' => 'today', + 'start_date' => '', + 'maximum_date_range' => '', + 'month_divider' => 1, + 'pagination_method' => 'loadmore', + ), + 'full_calendar' => array( + 'start_date_type' => 'start_current_month', + 'default_view' => 'list', + 'monthly_style' => $style, + 'list' => 1, + 'yearly' => 0, + 'monthly' => 1, + 'weekly' => 1, + 'daily' => 1, + 'display_price' => 0, + ), + 'yearly_view' => array( + 'style' => $style, + 'start_date_type' => 'start_current_year', + 'start_date' => '', + 'next_previous_button' => 1, + ), + 'monthly_view' => array( + 'style' => $style, + 'start_date_type' => 'start_current_month', + 'start_date' => '', + 'next_previous_button' => 1, + ), + 'map' => array( + 'start_date_type' => 'today', + 'start_date' => '', + 'limit' => 200, + 'geolocation' => 0, + ), + 'daily_view' => array( + 'start_date_type' => 'today', + 'start_date' => '', + 'next_previous_button' => 1, + ), + 'weekly_view' => array( + 'start_date_type' => 'start_current_week', + 'start_date' => '', + 'next_previous_button' => 1, + ), + 'timetable' => array( + 'style' => $style, + 'start_date_type' => 'start_current_week', + 'start_date' => '', + 'number_of_days' => 5, + 'week_start' => -1, + 'start_time' => 8, + 'end_time' => 20, + 'next_previous_button' => 1, + ), + 'masonry' => array( + 'start_date_type' => 'today', + 'start_date' => '', + 'maximum_date_range' => '', + 'filter_by' => '', + 'fit_to_row' => 0, + 'masonry_like_grid' => 0, + 'pagination_method' => 'loadmore', + ), + 'cover' => array( + 'style' => $style, + 'event_id' => $event, + ), + 'countdown' => array( + 'style' => $style, + 'event_id' => $event, + ), + 'available_spot' => array( + 'event_id' => $event, + ), + 'carousel' => array( + 'style' => $style, + 'start_date_type' => 'today', + 'start_date' => '', + 'count' => 3, + 'autoplay' => 1, + ), + 'slider' => array( + 'style' => $style, + 'start_date_type' => 'today', + 'start_date' => '', + 'autoplay' => 1, + ), + 'timeline' => array( + 'start_date_type' => 'today', + 'start_date' => '', + 'maximum_date_range' => '', + 'pagination_method' => 'loadmore', + 'month_divider' => 0, + ), + 'tile' => array( + 'start_date_type' => 'start_current_month', + 'start_date' => '', + 'count' => 4, + 'next_previous_button' => 1, + ), + 'custom' => array( + 'style' => $custom_style, + ), + ); + + $sk = $skin_options[$skin] ?? ['style' => $style, 'start_date_type' => 'today', 'start_date' => '']; + + $sk['sed_method'] = $sed; + $sk['image_popup'] = 0; + + $sf = []; + $sf_status = 0; + $sf_display_label = ''; + + if($skin == 'full_calendar') + { + $sf = array('month_filter'=>array('type'=>'dropdown'), 'text_search'=>array('type'=>'text_input')); + $sf_status = 1; + } + + // Create Default Calendars + $metas = array( + 'label' => '', + 'category' => '', + 'location' => '', + 'organizer' => '', + 'tag' => '', + 'author' => '', + 'skin' => $skin, + 'sk-options' => array( + $skin => $sk + ), + 'sf-options' => array($skin => $sf), + 'sf_status' => $sf_status, + 'sf_display_label' => $sf_display_label, + 'show_past_events' => $show_past_events, + 'show_only_past_events' => $show_only_past_events, + 'show_only_ongoing_events' => $show_only_ongoing_events, + ); + + $post = array('post_title'=>$title, 'post_content'=>'', 'post_type'=>'mec_calendars', 'post_status'=>'publish'); + $post_id = wp_insert_post($post); + + foreach($metas as $key=>$value) update_post_meta($post_id, $key, $value); + + $this->main->response(array('success'=>1, 'id'=>$post_id)); + } + + public function event_save() + { + // Security Nonce + $wpnonce = isset($_POST['_mecnonce']) ? sanitize_text_field($_POST['_mecnonce']) : NULL; + + // Check if our nonce is set. + if(!trim($wpnonce)) $this->main->response(array('success'=>0, 'code'=>'NONCE_MISSING')); + + // Verify that the nonce is valid. + if(!wp_verify_nonce($wpnonce, 'mec_event_popup')) $this->main->response(array('success'=>0, 'code'=>'NONCE_IS_INVALID')); + + $mec = (isset($_POST['mec']) and is_array($_POST['mec'])) ? $this->main->sanitize_deep_array($_POST['mec'], 'text', array('content', 'excerpt')) : []; + + $post_title = isset($mec['title']) ? sanitize_text_field($mec['title']) : ''; + $post_content = isset($mec['content']) ? MEC_kses::page($mec['content']) : ''; + $featured_image = isset($mec['featured_image']) ? sanitize_text_field($mec['featured_image']) : ''; + + // Post Status + $status = 'pending'; + if(current_user_can('publish_posts')) $status = 'publish'; + + $post = array('post_title'=>$post_title, 'post_content'=>$post_content, 'post_type'=>$this->main->get_main_post_type(), 'post_status'=>$status); + $post_id = wp_insert_post($post); + + // Categories + $categories = (isset($_POST['tax_input']) and isset($_POST['tax_input']['mec_category']) and is_array($_POST['tax_input']['mec_category'])) ? $this->main->sanitize_deep_array($_POST['tax_input']['mec_category']) : []; + wp_set_post_terms($post_id, $categories, 'mec_category'); + + // Color + $color = isset($mec['color']) ? sanitize_text_field(trim($mec['color'], '# ')) : ''; + update_post_meta($post_id, 'mec_color', $color); + + // Featured Image + if($featured_image) set_post_thumbnail($post_id, $featured_image); + + // Location + $location_id = isset($mec['location_id']) ? sanitize_text_field($mec['location_id']) : 0; + + // Selected a saved location + if($location_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + } + else + { + $address = (isset($mec['location']['address']) and trim($mec['location']['address'])) ? sanitize_text_field($mec['location']['address']) : ''; + $name = (isset($mec['location']['name']) and trim($mec['location']['name'])) ? sanitize_text_field($mec['location']['name']) : (trim($address) ? $address : esc_html__('Location Name', 'modern-events-calendar-lite')); + + $term = get_term_by('name', $name, 'mec_location'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_location'); + + $location_id = (int) $term->term_id; + } + else + { + $term = wp_insert_term($name, 'mec_location'); + + $location_id = $term['term_id']; + if($location_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $location_id, 'mec_location'); + + $latitude = (isset($mec['location']['latitude']) and trim($mec['location']['latitude'])) ? sanitize_text_field($mec['location']['latitude']) : 0; + $longitude = (isset($mec['location']['longitude']) and trim($mec['location']['longitude'])) ? sanitize_text_field($mec['location']['longitude']) : 0; + $thumbnail = (isset($mec['location']['thumbnail']) and trim($mec['location']['thumbnail'])) ? sanitize_text_field($mec['location']['thumbnail']) : ''; + + if(!trim($latitude) or !trim($longitude)) + { + $geo_point = $this->main->get_lat_lng($address); + + $latitude = $geo_point[0]; + $longitude = $geo_point[1]; + } + + update_term_meta($location_id, 'address', $address); + update_term_meta($location_id, 'latitude', $latitude); + update_term_meta($location_id, 'longitude', $longitude); + update_term_meta($location_id, 'thumbnail', $thumbnail); + } + else $location_id = 1; + } + } + + update_post_meta($post_id, 'mec_location_id', $location_id); + + $dont_show_map = isset($mec['dont_show_map']) ? sanitize_text_field($mec['dont_show_map']) : 0; + update_post_meta($post_id, 'mec_dont_show_map', $dont_show_map); + + // Organizer + $organizer_id = isset($mec['organizer_id']) ? sanitize_text_field($mec['organizer_id']) : 0; + + if(!isset($this->settings['organizers_status']) || $this->settings['organizers_status']) + { + // Selected a saved organizer + if($organizer_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + } + else + { + $name = (isset($mec['organizer']['name']) and trim($mec['organizer']['name'])) ? sanitize_text_field($mec['organizer']['name']) : esc_html__('Organizer Name', 'modern-events-calendar-lite'); + + $term = get_term_by('name', $name, 'mec_organizer'); + + // Term already exists + if(is_object($term) and isset($term->term_id)) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $term->term_id, 'mec_organizer'); + $organizer_id = (int) $term->term_id; + } + else + { + $term = wp_insert_term($name, 'mec_organizer'); + + $organizer_id = $term['term_id']; + if($organizer_id) + { + // Set term to the post + wp_set_object_terms($post_id, (int) $organizer_id, 'mec_organizer'); + + $tel = (isset($mec['organizer']['tel']) and trim($mec['organizer']['tel'])) ? sanitize_text_field($mec['organizer']['tel']) : ''; + $email = (isset($mec['organizer']['email']) and trim($mec['organizer']['email'])) ? sanitize_text_field($mec['organizer']['email']) : ''; + $url = (isset($mec['organizer']['url']) and trim($mec['organizer']['url'])) ? sanitize_url($mec['organizer']['url']) : ''; + $thumbnail = (isset($mec['organizer']['thumbnail']) and trim($mec['organizer']['thumbnail'])) ? sanitize_text_field($mec['organizer']['thumbnail']) : ''; + + update_term_meta($organizer_id, 'tel', $tel); + update_term_meta($organizer_id, 'email', $email); + update_term_meta($organizer_id, 'url', $url); + update_term_meta($organizer_id, 'thumbnail', $thumbnail); + } + else $organizer_id = 1; + } + } + } + + update_post_meta($post_id, 'mec_organizer_id', $organizer_id); + + // Date Options + $date = $mec['date'] ?? []; + + $start_date = (isset($date['start']['date']) and trim($date['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($date['start']['date'])) : date('Y-m-d'); + $end_date = (isset($date['end']['date']) and trim($date['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($date['end']['date'])) : date('Y-m-d'); + + // Set the start date + $date['start']['date'] = $start_date; + + $start_time_hour = isset($date['start']) ? sanitize_text_field($date['start']['hour']) : '8'; + $start_time_minutes = isset($date['start']) ? sanitize_text_field($date['start']['minutes']) : '00'; + $start_time_ampm = (isset($date['start']) and isset($date['start']['ampm'])) ? sanitize_text_field($date['start']['ampm']) : 'AM'; + + // Fix end_date if it's smaller than start_date + if(strtotime($end_date) < strtotime($start_date)) $end_date = $start_date; + + // Set the end date + $date['end']['date'] = $end_date; + + $end_time_hour = isset($date['end']) ? sanitize_text_field($date['end']['hour']) : '6'; + $end_time_minutes = isset($date['end']) ? sanitize_text_field($date['end']['minutes']) : '00'; + $end_time_ampm = (isset($date['end']) and isset($date['end']['ampm'])) ? sanitize_text_field($date['end']['ampm']) : 'PM'; + + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, NULL, 'start'), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, NULL, 'end'), $end_time_minutes); + } + else + { + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, $start_time_ampm, 'start'), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, $end_time_ampm, 'end'), $end_time_minutes); + } + + if($end_date === $start_date and $day_end_seconds < $day_start_seconds) + { + $day_end_seconds = $day_start_seconds; + + $end_time_hour = $start_time_hour; + $end_time_minutes = $start_time_minutes; + $end_time_ampm = $start_time_ampm; + + $date['end']['hour'] = $start_time_hour; + $date['end']['minutes'] = $start_time_minutes; + $date['end']['ampm'] = $start_time_ampm; + } + + // If 24 hours format is enabled then convert it back to 12 hours + if(isset($this->settings['time_format']) and $this->settings['time_format'] == 24) + { + if($start_time_hour < 12) $start_time_ampm = 'AM'; + elseif($start_time_hour == 12) $start_time_ampm = 'PM'; + elseif($start_time_hour > 12) + { + $start_time_hour -= 12; + $start_time_ampm = 'PM'; + } + elseif($start_time_hour == 0) + { + $start_time_hour = 12; + $start_time_ampm = 'AM'; + } + + if($end_time_hour < 12) $end_time_ampm = 'AM'; + elseif($end_time_hour == 12) $end_time_ampm = 'PM'; + elseif($end_time_hour > 12) + { + $end_time_hour -= 12; + $end_time_ampm = 'PM'; + } + elseif($end_time_hour == 0) + { + $end_time_hour = 12; + $end_time_ampm = 'AM'; + } + + // Set converted values to date array + $date['start']['hour'] = $start_time_hour; + $date['start']['ampm'] = $start_time_ampm; + + $date['end']['hour'] = $end_time_hour; + $date['end']['ampm'] = $end_time_ampm; + } + + $allday = isset($date['allday']) ? 1 : 0; + + // Set start time and end time if event is all day + if($allday == 1) + { + $start_time_hour = '8'; + $start_time_minutes = '00'; + $start_time_ampm = 'AM'; + + $end_time_hour = '6'; + $end_time_minutes = '00'; + $end_time_ampm = 'PM'; + } + + $start_datetime = $start_date.' '.sprintf('%02d', $start_time_hour).':'.sprintf('%02d', $start_time_minutes).' '.$start_time_ampm; + $end_datetime = $end_date.' '.sprintf('%02d', $end_time_hour).':'.sprintf('%02d', $end_time_minutes).' '.$end_time_ampm; + + update_post_meta($post_id, 'mec_start_date', $start_date); + update_post_meta($post_id, 'mec_start_time_hour', $start_time_hour); + update_post_meta($post_id, 'mec_start_time_minutes', $start_time_minutes); + update_post_meta($post_id, 'mec_start_time_ampm', $start_time_ampm); + update_post_meta($post_id, 'mec_start_day_seconds', $day_start_seconds); + update_post_meta($post_id, 'mec_start_datetime', $start_datetime); + + update_post_meta($post_id, 'mec_end_date', $end_date); + update_post_meta($post_id, 'mec_end_time_hour', $end_time_hour); + update_post_meta($post_id, 'mec_end_time_minutes', $end_time_minutes); + update_post_meta($post_id, 'mec_end_time_ampm', $end_time_ampm); + update_post_meta($post_id, 'mec_end_day_seconds', $day_end_seconds); + update_post_meta($post_id, 'mec_end_datetime', $end_datetime); + + // Repeat Options + $repeat = []; + $repeat_type = NULL; + $repeat_status = 0; + + $repeat_end = ''; + $repeat_end_at_occurrences = ''; + $repeat_end_at_date = ''; + + update_post_meta($post_id, 'mec_date', $date); + update_post_meta($post_id, 'mec_repeat', $repeat); + update_post_meta($post_id, 'mec_certain_weekdays', ''); + update_post_meta($post_id, 'mec_allday', $allday); + update_post_meta($post_id, 'mec_hide_time', 0); + update_post_meta($post_id, 'mec_hide_end_time', 0); + update_post_meta($post_id, 'mec_comment', ''); + update_post_meta($post_id, 'mec_repeat_status', $repeat_status); + update_post_meta($post_id, 'mec_repeat_type', ''); + update_post_meta($post_id, 'mec_repeat_interval', ''); + update_post_meta($post_id, 'mec_repeat_end', $repeat_end); + update_post_meta($post_id, 'mec_repeat_end_at_occurrences', $repeat_end_at_occurrences); + update_post_meta($post_id, 'mec_repeat_end_at_date', $repeat_end_at_date); + update_post_meta($post_id, 'mec_advanced_days', ''); + + // Creating $event array for inserting in mec_events table + $event = array('post_id'=>$post_id, 'start'=>$start_date, 'repeat'=>$repeat_status, 'rinterval'=>NULL, 'time_start'=>$day_start_seconds, 'time_end'=>$day_end_seconds); + + $year = NULL; + $month = NULL; + $day = NULL; + $week = NULL; + $weekday = NULL; + $weekdays = NULL; + + $in_days = ''; + $not_in_days = ''; + + update_post_meta($post_id, 'mec_in_days', $in_days); + update_post_meta($post_id, 'mec_not_in_days', $not_in_days); + + // Repeat End Date + $repeat_end_date = '0000-00-00'; + + // Add parameters to the $event + $event['end'] = $repeat_end_date; + $event['year'] = $year; + $event['month'] = $month; + $event['day'] = $day; + $event['week'] = $week; + $event['weekday'] = $weekday; + $event['weekdays'] = $weekdays; + $event['days'] = $in_days; + $event['not_in_days'] = $not_in_days; + + // DB Library + $db = $this->getDB(); + + // Update MEC Events Table + $mec_event_id = $db->select("SELECT `id` FROM `#__mec_events` WHERE `post_id`='".$db->escape($post_id)."'", 'loadResult'); + + if(!$mec_event_id) + { + $q1 = ""; + $q2 = ""; + + foreach($event as $key=>$value) + { + $q1 .= "`$key`,"; + + if(is_null($value)) $q2 .= "NULL,"; + else $q2 .= "'$value',"; + } + + $db->q("INSERT INTO `#__mec_events` (".trim($q1, ', ').") VALUES (".trim($q2, ', ').")", 'INSERT'); + } + else + { + $q = ""; + + foreach($event as $key=>$value) + { + if(is_null($value)) $q .= "`$key`=NULL,"; + else $q .= "`$key`='$value',"; + } + + $db->q("UPDATE `#__mec_events` SET ".trim($q, ', ')." WHERE `id`='$mec_event_id'"); + } + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($post_id, $schedule->get_reschedule_maximum($repeat_type)); + + // Hourly Schedule Options + $hourly_schedules = []; + update_post_meta($post_id, 'mec_hourly_schedules', $hourly_schedules); + + // Booking and Ticket Options + $booking = []; + update_post_meta($post_id, 'mec_booking', $booking); + + $tickets = []; + update_post_meta($post_id, 'mec_tickets', $tickets); + + // Fee options + $fees_global_inheritance = 1; + update_post_meta($post_id, 'mec_fees_global_inheritance', $fees_global_inheritance); + + $fees = []; + update_post_meta($post_id, 'mec_fees', $fees); + + // Ticket Variation options + $ticket_variations_global_inheritance = 1; + update_post_meta($post_id, 'mec_ticket_variations_global_inheritance', $ticket_variations_global_inheritance); + + $ticket_variations = []; + update_post_meta($post_id, 'mec_ticket_variations', $ticket_variations); + + // Registration Fields options + $reg_fields_global_inheritance = 1; + update_post_meta($post_id, 'mec_reg_fields_global_inheritance', $reg_fields_global_inheritance); + + $reg_fields = []; + update_post_meta($post_id, 'mec_reg_fields', $reg_fields); + + // Organizer Payment Options + $op = []; + update_post_meta($post_id, 'mec_op', $op); + update_user_meta(get_post_field('post_author', $post_id), 'mec_op', $op); + + // For Event Notification Badge. + update_post_meta($post_id, 'mec_event_date_submit', date('YmdHis', current_time('timestamp', 0))); + + do_action('mec_after_publish_admin_event', $post_id, false); + + // Save Event Data + do_action('mec_save_event_data', $post_id, $mec); + + $this->main->response(array( + 'success' => 1, + 'id' => $post_id, + 'link' => get_post_permalink($post_id), + )); + } + + public function save_category() + { + $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : ''; + + $term = term_exists($category, 'mec_category'); + if(!$term) + { + $term = wp_insert_term($category, 'mec_category'); + $category_id = $term['term_id']; + } + else $category_id = $term['term_id']; + + $this->main->response(array('success' => 1, 'id' => $category_id, 'name' => $category)); + } +} \ No newline at end of file diff --git a/app/features/popup/event.php b/app/features/popup/event.php new file mode 100755 index 0000000..a8da2ee --- /dev/null +++ b/app/features/popup/event.php @@ -0,0 +1,668 @@ +main->get_settings(); + +// Post Object +$post = new stdClass(); +$post->ID = 0; + +// Features +$feature_colors = new MEC_feature_colors(); + +$allday = 0; +$start_date = date('Y-m-d', strtotime('Tomorrow')); +$start_time_hour = 8; +$start_time_minutes = 0; +$start_time_ampm = 'AM'; +$end_date = $start_date; +$end_time_hour = 6; +$end_time_minutes = 0; +$end_time_ampm = 'PM'; + +$locations = get_terms('mec_location', array('orderby'=>'name', 'hide_empty'=>'0')); +$location_id = 1; +$dont_show_map = 1; + +$organizers = get_terms('mec_organizer', array('orderby'=>'name', 'hide_empty'=>'0')); +$organizer_id = 1; +$wizard_page = isset($_REQUEST['page']) ? sanitize_text_field($_REQUEST['page']) : ''; +$main_page = isset($_REQUEST['post_type']) ? sanitize_text_field($_REQUEST['post_type']) : ''; + +// This date format used for input type of datepicker. +$datepicker_format = (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? $settings['datepicker_format'] : 'Y-m-d'; + +if(!isset($post_type)) $post_type = NULL; + +$step = 1; +?> +
    +
    + +
      +
    • +
    • +
    • + +
    • + +
    • +
    • +
    • +
    • +
    +
    +
    +
    +
    +
    +
    + + + + + display_name); ?> + +
    +
    + +
    +
    +
    + + + + + meta_box_colors($post); ?> +
    +
    +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => $settings['time_format'] ?? 12, + 'time_hour' => $start_time_hour, + 'time_minutes' => $start_time_minutes, + 'time_ampm' => $start_time_ampm, + 'name' => 'mec[date][start]', + 'id_key' => 'start_', + 'include_h0' => true, + )); ?> +
    +
    +
    +
    + +
    +
    + main->timepicker(array( + 'method' => $settings['time_format'] ?? 12, + 'time_hour' => $end_time_hour, + 'time_minutes' => $end_time_minutes, + 'time_ampm' => $end_time_ampm, + 'name' => 'mec[date][end]', + 'id_key' => 'end_', + )); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +

    +
    + +
    + +
    + + getPRO()): ?> +
    + + +
    + + +
    +
    + +
    +
    +
    + +
    +
    +
    + + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +

    +
    + +
    + +
    +
    +
    +
    + +

    +
    +
    + +

    +
    +
    +
    + +

    +
    +
    +
    + +

    +
    +
    +
    +
    + +

    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
      +
    • +
    • +
    +
    +
    +
      + 'mec_category', + )); ?> +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +

    +
    + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +getFactory()->params('footer', function() use($main_page, $wizard_page, $post_type, $settings, $step) +{ + ?> + + + \ No newline at end of file diff --git a/app/features/popup/index.html b/app/features/popup/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/popup/settings.php b/app/features/popup/settings.php new file mode 100755 index 0000000..0d62fb7 --- /dev/null +++ b/app/features/popup/settings.php @@ -0,0 +1,958 @@ + +
    +
    +
    +
    + +
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • + getPRO()) : ?> +
    • 5
    • +
    • 6
    • + +
    • 5
    • + +
    +
    +
    +
    +
    + + + + + display_name); ?> +
    +
    + +
    +
    + +
    +
    +
    + +
    + + main->get_weekday_i18n_labels(); ?> +
    + +
    +
    + main->get_weekdays(); foreach($weekdays as $weekday): ?> + + +
    +
    +
    + +
    + +
    +
    + main->get_weekends(); foreach($weekdays as $weekday): ?> + + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    + +
    + + + ' /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +

    +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    + + +
    + +
    + +
    + +
    + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
      + __('Google Calendar', 'modern-events-calendar-lite'), 'ical'=>__('iCal', 'modern-events-calendar-lite')); + foreach($event_options as $event_key=>$event_option): ?> +
    • + +
      + + +
      +
    • + +
    +
    +
    +
    +
    +
    + getPRO()) : ?> +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +

    +
    +
    +
    +
    + +
    +
    +
      + 'mec-colorskin-1', + '#0093d0'=>'mec-colorskin-2', + '#e53f51'=>'mec-colorskin-3', + '#f1c40f'=>'mec-colorskin-4', + '#e64883'=>'mec-colorskin-5', + '#45ab48'=>'mec-colorskin-6', + '#9661ab'=>'mec-colorskin-7', + '#0aad80'=>'mec-colorskin-8', + '#0ab1f0'=>'mec-colorskin-9', + '#ff5a00'=>'mec-colorskin-10', + '#c3512f'=>'mec-colorskin-11', + '#55606e'=>'mec-colorskin-12', + '#fe8178'=>'mec-colorskin-13', + '#7c6853'=>'mec-colorskin-14', + '#bed431'=>'mec-colorskin-15', + '#2d5c88'=>'mec-colorskin-16', + '#77da55'=>'mec-colorskin-17', + '#2997ab'=>'mec-colorskin-18', + '#734854'=>'mec-colorskin-19', + '#a81010'=>'mec-colorskin-20', + '#4ccfad'=>'mec-colorskin-21', + '#3a609f'=>'mec-colorskin-22', + '#333333'=>'mec-colorskin-23', + '#D2D2D2'=>'mec-colorskin-24', + '#636363'=>'mec-colorskin-25', + ); + + foreach($colorskins as $colorskin=>$values): ?> +
    • + +
    • + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +

    +
    +
    +
    +
    + +
    +
    +
      + 'mec-colorskin-1', + '#0093d0'=>'mec-colorskin-2', + '#e53f51'=>'mec-colorskin-3', + '#f1c40f'=>'mec-colorskin-4', + '#e64883'=>'mec-colorskin-5', + '#45ab48'=>'mec-colorskin-6', + '#9661ab'=>'mec-colorskin-7', + '#0aad80'=>'mec-colorskin-8', + '#0ab1f0'=>'mec-colorskin-9', + '#ff5a00'=>'mec-colorskin-10', + '#c3512f'=>'mec-colorskin-11', + '#55606e'=>'mec-colorskin-12', + '#fe8178'=>'mec-colorskin-13', + '#7c6853'=>'mec-colorskin-14', + '#bed431'=>'mec-colorskin-15', + '#2d5c88'=>'mec-colorskin-16', + '#77da55'=>'mec-colorskin-17', + '#2997ab'=>'mec-colorskin-18', + '#734854'=>'mec-colorskin-19', + '#a81010'=>'mec-colorskin-20', + '#4ccfad'=>'mec-colorskin-21', + '#3a609f'=>'mec-colorskin-22', + '#333333'=>'mec-colorskin-23', + '#D2D2D2'=>'mec-colorskin-24', + '#636363'=>'mec-colorskin-25', + ); + + foreach($colorskins as $colorskin=>$values): ?> +
    • + +
    • + +
    +
    +
    +
    +
    + +
    + + + + +
    +
    +
    +
    + +getFactory()->params('footer', function() +{ +?> + + main->get_skins(); + +// MEC Events +$events = $this->main->get_events(); + +// MEC Settings +$settings = $this->main->get_settings(); +$wizard_page = isset($_REQUEST['page']) ? sanitize_text_field($_REQUEST['page']) : ''; +$main_page = isset($_REQUEST['post_type']) ? sanitize_text_field($_REQUEST['post_type']) : ''; + +if(!isset($post_type)) $post_type = NULL; +?> +
    +
    + +
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • +
    • 5
    • +
    • 6
    • +
    +
    +
    +
    +
    +
    +
    + + + + + display_name); ?> + +
    +
    + +
    +
    +
    + + + +
    +
    +
      + $name): ?> +
    • + +
    • + +
    +
    +
    +
    +
    + + + + + + + + +
    +
    + + + + + + + + + + +
    +
    + + + + +
    +
    +

    + + + + + + +
    +
    + + + + +
    +
    + + + + + + + + +
    +
    +
    +
    + + + + +
    +
    + + + + +
    +
    + + + + + +
    +
    + + + + +
    +
    + + + + + + + + + +
    +
    + + + + + + +
    +
    + + + + + +
    + +
    + + + + + + + + +
    +
    +
    +
    + + + + +
    +
    + 'mec_designer', + 'post_status' => 'publish', + 'order' => 'DESC', + 'posts_per_page' => -1, + ); + $styles = new WP_Query($args); + ?> +

    + +
    +
    +
    +
    +
    +
    +
    +

    +
    + + + +
    +
    +
    +

    + +
    +
    +
    +
    +
    + +

    +
    +
    + + + +
    +
    +
    +
    + +

    '.esc_html__('only', 'modern-events-calendar-lite').''); ?>

    +
    +
    + + + +
    +
    +
    +
    + +

    +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +

    +
    + + +
    +
    +

    +
    +
    +
    +
    +
    + + + +
    +
    +
    + + + + +getFactory()->params('footer', function() use($main_page, $wizard_page, $post_type, $fluent) +{ + ?> + + + \ No newline at end of file diff --git a/app/features/profile.php b/app/features/profile.php new file mode 100755 index 0000000..bba2353 --- /dev/null +++ b/app/features/profile.php @@ -0,0 +1,99 @@ + + */ +class MEC_feature_profile extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_book + */ + public $book; + + /** + * @var string + */ + public $PT; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC Book + $this->book = $this->getBook(); + + // Booking Post Type + $this->PT = $this->main->get_book_post_type(); + } + + /** + * Initialize profile feature + * @author Webnus + */ + public function init() + { + // Profile Shortcode + $this->factory->shortcode('MEC_profile', array($this, 'profile')); + } + + /** + * Show user profile + * @param array $atts + * @return string + */ + public function profile($atts = []) + { + // Force to array + if(!is_array($atts)) $atts = []; + + // Show login/register message if user is not logged in and guest submission is not enabled. + if(!is_user_logged_in()) + { + // Show message + $message = sprintf(esc_html__('Please %s/%s in order to see your bookings / profile.', 'modern-events-calendar-lite'), ''.esc_html__('Login', 'modern-events-calendar-lite').'', ''.esc_html__('Register', 'modern-events-calendar-lite').''); + + ob_start(); + include MEC::import('app.features.profile.message', true, true); + return ob_get_clean(); + } + + // Needs Pro + if(!$this->getPRO()) + { + // Show message + $message = sprintf(esc_html__('To use this feature you should upgrade to %s first.', 'modern-events-calendar-lite'), ''.esc_html__('MEC Pro', 'modern-events-calendar-lite').''); + + ob_start(); + include MEC::import('app.features.profile.message', true, true); + return ob_get_clean(); + } + + + $path = MEC::import('app.features.profile.profile', true, true); + + ob_start(); + include $path; + return ob_get_clean(); + } +} \ No newline at end of file diff --git a/app/features/profile/index.html b/app/features/profile/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/profile/message.php b/app/features/profile/message.php new file mode 100755 index 0000000..6f6893c --- /dev/null +++ b/app/features/profile/message.php @@ -0,0 +1,7 @@ + +
    +

    +
    \ No newline at end of file diff --git a/app/features/profile/profile.php b/app/features/profile/profile.php new file mode 100755 index 0000000..18c8519 --- /dev/null +++ b/app/features/profile/profile.php @@ -0,0 +1,272 @@ +getRender(); + +// Query +$q = array( + 'post_type'=>$this->PT, + 'author'=>get_current_user_id(), + 'posts_per_page'=>'-1', + 'post_status'=>array('pending', 'draft', 'future', 'publish'), + 'meta_query'=>array(), + 'date_query'=>array(), + 'orderby'=>'post_date', + 'order'=>'DESC', +); + +// Hide Canceled Bookings +if($hide_canceleds) +{ + $q['meta_query'][] = array('key'=>'mec_verified', 'value'=>'-1', 'compare'=>'!='); +} + +// Show Only Upcoming Bookings +if($upcomings) +{ + $q['date_query'] = array( + 'after' => current_time('Y-m-d H:i:s'), + ); +} + +// The Query +$query = new WP_Query($q); + +$id = 1; +?> +
    + have_posts()): ?> + + + + + + + + + + + + + have_posts()): $query->the_post(); + $ID = get_the_ID(); + $transaction_id = $this->book->get_transaction_id_book_id($ID); + $event_id = get_post_meta($ID, 'mec_event_id', true); + $ticket_ids = get_post_meta($ID, 'mec_ticket_id', true); + + $confirmed = get_post_meta($ID, 'mec_confirmed', true); + $verified = get_post_meta($ID, 'mec_verified', true); + + if($verified == '-1') $status_class = 'mec-book-rejected'; + elseif($confirmed == '1') $status_class = 'mec-book-confirmed'; + elseif($confirmed == '-1') $status_class = 'mec-book-rejected'; + else $status_class = 'mec-book-pending'; + + $transaction = $this->book->get_transaction($transaction_id); + $timestamps = explode(':', get_post_meta($ID, 'mec_date', true)); + + $start_time = $timestamps[0]; + $end_time = $timestamps[1]; + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + $bookings_all_occurrences = $booking_options['bookings_all_occurrences'] ?? 0; + + if($bookings_all_occurrences) + { + $dates = $render->dates($event_id, NULL, 1, NULL); + if(is_array($dates) and count($dates) and isset($dates[0])) + { + $start_time = ((isset($dates[0]['start']) and isset($dates[0]['start']['timestamp'])) ? $dates[0]['start']['timestamp'] : 0); + $end_time = ((isset($dates[0]['end']) and isset($dates[0]['end']['timestamp'])) ? $dates[0]['end']['timestamp'] : 0); + } + } + + // Check If Event Exist + $db = $this->getDB(); + $check_event_exist = $db->select("SELECT `ID` FROM `#__posts` WHERE `ID`=$event_id", 'loadResult'); + + $event = trim($check_event_exist) ? $render->data($event_id) : []; + + // Multiple Dates + $all_dates = (isset($transaction['all_dates']) and is_array($transaction['all_dates'])) ? $transaction['all_dates'] : []; + ?> + + + + + + + + + ID, $ID, $event); ?> + + +
    +
    +
    + + + + + + + + + + + + + + + +
    + $attendee) + { + if(!is_numeric($attendee_i)) continue; + + echo '
    '; + echo ''.esc_html($person_id).''; + echo ''.(isset($attendee['_name']) ? esc_html($attendee['_name']) : esc_html($attendee['name'])).''; + echo ''.esc_html($attendee['email']).''; + echo ''.((isset($event->tickets[$attendee['id']]) ? esc_html($event->tickets[$attendee['id']]['name']) : '').' '.(isset($event->tickets[$attendee['id']]) ? esc_html($event->tickets[$attendee['id']]['price_label']) : '')).''; + + // Ticket Variations + echo ''; + if(isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + $ticket_variations = $this->main->ticket_variations((trim($check_event_exist) ? $event_id : NULL), $attendee['id']); + foreach($attendee['variations'] as $variation_id=>$variation_count) + { + if(!$variation_count or $variation_count < 0) continue; + + $variation_title = (isset($ticket_variations[$variation_id]) and isset($ticket_variations[$variation_id]['title'])) ? $ticket_variations[$variation_id]['title'] : ''; + if(!trim($variation_title)) continue; + + echo ''.' + '.esc_html($variation_title).' ('.esc_html($variation_count).')'.''; + } + } + else + { + echo '-'; + } + + echo ''; + $person_id++; + echo '
    '; + } + } + ?> +
    +
    + +
    + + + + + + + + + + + + + + + +
    + + + ID) or !isset($event->title)) : ?> + + + title); ?> + + + + + + + +
    + +
    + + + +
    +
    + + main->get_verification_label($verified)) : esc_html($this->main->get_confirmation_label($confirmed)); ?> + + + + + + + + + + + - + + + + ID)) + { + $location_id = $this->main->get_master_location_id($event); + $location_latitude = $event->locations[$location_id]['latitude'] ?? NULL; + $location_longitude = $event->locations[$location_id]['longitude'] ?? NULL; + } + ?> + + + "> + + + + + + + + + + + + + +
    + +

    + +
    + diff --git a/app/features/report.php b/app/features/report.php new file mode 100755 index 0000000..fc1da92 --- /dev/null +++ b/app/features/report.php @@ -0,0 +1,319 @@ + + */ +class MEC_feature_report extends MEC_base +{ + /** + * @var MEC_factory + */ + private $factory; + + /** + * @var MEC_db + */ + private $db; + + /** + * @var MEC_main + */ + private $main; + + private $settings; + private $ml_settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC DB + $this->db = $this->getDB(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // MEC Multilingual Settings + $this->ml_settings = $this->main->get_ml_settings(); + } + + /** + * Initialize search feature + * @author Webnus + */ + public function init() + { + $this->factory->action('admin_menu', [$this, 'menu'], 11); + + // Close Custom Text Notification + $this->factory->action('wp_ajax_report_event_dates', [$this, 'report_event_dates']); + + // Event Attendees + $this->factory->action('wp_ajax_mec_attendees', [$this, 'attendees']); + + // Selective Email + $this->factory->action('wp_ajax_mec_mass_email', [$this, 'mass_email']); + + // Mass Action + $this->factory->action('wp_ajax_mec_report_mass', [$this, 'mass_actions']); + } + + public function menu() + { + if(isset($this->settings['booking_status']) && $this->settings['booking_status']) + { + add_submenu_page('mec-intro', esc_html__('MEC - Report', 'modern-events-calendar-lite'), esc_html__('Report', 'modern-events-calendar-lite'), 'mec_report', 'MEC-report', [$this, 'report']); + } + } + + /** + * Show report page + * @author Webnus + * @return void + */ + public function report() + { + $path = MEC::import('app.features.report.tpl', true, true); + + ob_start(); + include $path; + do_action('mec_display_report_page', $path); + echo MEC_kses::full(ob_get_clean()); + } + + /* Report Event Dates */ + public function report_event_dates() + { + // Current User is not Permitted + if(!current_user_can('mec_report')) $this->main->response(['success'=>0, 'code'=>'ADMIN_ONLY']); + if(!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + $event_id = sanitize_text_field($_POST['event_id']); + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + $bookings_all_occurrences = $booking_options['bookings_all_occurrences'] ?? 0; + + if($event_id != 'none') + { + $dates = $this->db->select("SELECT `tstart`, `tend` FROM `#__mec_dates` WHERE `post_id`='".$event_id."' LIMIT 100"); + $occurrence = count($dates) ? reset($dates)->tstart : ''; + + $date_format = isset($this->ml_settings['booking_date_format1']) && trim($this->ml_settings['booking_date_format1']) + ? $this->ml_settings['booking_date_format1'] + : 'Y-m-d'; + + if(get_post_meta($event_id, 'mec_repeat_type', true) === 'custom_days') $date_format .= ' '.get_option('time_format'); + + echo ''; + } + else + { + echo ''; + } + + wp_die(); + } + + public function attendees() + { + $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : 0; + + $occurrence = isset($_POST['occurrence']) ? sanitize_text_field($_POST['occurrence']) : NULL; + $occurrence = explode(':', $occurrence)[0]; + + if($occurrence == 'all') $occurrence = strtotime('+100 years'); + elseif($occurrence == 'none') $occurrence = NULL; + + $attendees = $this->main->get_event_attendees($id, $occurrence); + + $html = ''; + if(count($attendees)) + { + $html .= $this->main->get_attendees_table($attendees, $id, $occurrence); + $email_button = '

    '.esc_html__('If you want to send an email, first select your attendees and then click in the button below, please.', 'modern-events-calendar-lite').'

    '; + + // Certificate + if($occurrence && isset($this->settings['certificate_status']) && $this->settings['certificate_status']) + { + $certificates = get_posts([ + 'post_type' => $this->main->get_certificate_post_type(), + 'status' => 'publish', + 'numberposts' => -1, + 'orderby' => 'post_title', + 'order' => 'ASC' + ]); + + $certificate_options = ''; + foreach($certificates as $certificate) + { + $certificate_options .= ''; + } + + $email_button .= '
    +

    '.esc_html__('Certificate', 'modern-events-calendar-lite').'

    + + +
    +
    '; + } + } + else + { + $html .= '

    '.esc_html__("No Attendees Found!", 'modern-events-calendar-lite').'

    '; + $email_button = ''; + } + + echo json_encode(['html' => $html, 'email_button' => $email_button]); + exit; + } + + public function mass_email() + { + if(!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); + + // Current User is not Permitted + if(!current_user_can('mec_report')) $this->main->response(array('success'=>0, 'code'=>'NO_ACCESS')); + + $mail_recipients_info = isset($_POST['mail_recipients_info']) ? trim(sanitize_text_field($_POST['mail_recipients_info']), ', ') : ''; + $mail_subject = isset($_POST['mail_subject']) ? sanitize_text_field($_POST['mail_subject']) : ''; + $mail_content = isset($_POST['mail_content']) ? MEC_kses::page($_POST['mail_content']) : ''; + $mail_copy = isset($_POST['mail_copy']) ? sanitize_text_field($_POST['mail_copy']) : 0; + + $render_recipients = array_unique(explode(',', $mail_recipients_info)); + $headers = array('Content-Type: text/html; charset=UTF-8'); + + // Changing some sender email info. + $notifications = $this->getNotifications(); + $notifications->mec_sender_email_notification_filter(); + + // Send to Admin + if($mail_copy) $render_recipients[] = 'Admin:.:'.get_option('admin_email'); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', array($this->main, 'html_email_type')); + + foreach($render_recipients as $recipient) + { + $render_recipient = explode(':.:', $recipient); + + $to = isset($render_recipient[1]) ? trim($render_recipient[1]) : ''; + if(!trim($to)) continue; + + $message = $mail_content; + $message = str_replace('%%name%%', (isset($render_recipient[0]) ? trim($render_recipient[0]) : ''), $message); + + $mail_arg = array( + 'to' => $to, + 'subject' => $mail_subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => array(), + ); + + $mail_arg = apply_filters('mec_before_send_mass_email', $mail_arg, 'mass_email'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', array($this->main, 'html_email_type')); + + wp_die(true); + } + + public function mass_actions() + { + // Invalid Request + if(!wp_verify_nonce(sanitize_text_field($_REQUEST['_wpnonce'] ?? ''), 'mec_report_mass')) $this->main->response(['success'=>0, 'code'=>'INVALID_NONCE']); + + // Current User is not Permitted + if(!current_user_can('mec_report')) $this->main->response(['success'=>0, 'code'=>'NO_ACCESS']); + + $task = isset($_POST['task']) ? sanitize_text_field($_POST['task']) : 'suggest'; + $events = isset($_POST['events']) && is_array($_POST['events']) ? $_POST['events'] : []; + + // Invalid Events + if(!count($events)) $this->main->response(['success'=>0, 'code'=>'INVALID_EVENTS']); + + // Suggest New Event + if($task === 'suggest') + { + // New Event to Suggest + $new_event = isset($_POST['new_event']) ? sanitize_text_field($_POST['new_event']) : ''; + + // Invalid Event + if(!$new_event) $this->main->response(['success'=>0, 'code'=>'INVALID_EVENT']); + + // Notifications Library + $notifications = $this->getNotifications(); + + $attendees_count = 0; + $sent = []; + foreach($events as $id) + { + $attendees = $this->main->get_event_attendees($id); + foreach($attendees as $attendee) + { + $attendees_count++; + + $email = $attendee['email'] ?? ''; + if(!$email || in_array($email, $sent)) continue; + + // Do not send multiple emails to same email + $sent[] = $email; + + // Suggest the Event + $notifications->suggest_event([ + 'email' => $email, + 'name' => $attendee['name'] ?? '', + ], $new_event, $attendee['book_id'] ?? ''); + } + } + + $this->main->response(['success'=>1, 'code'=>'EMAILS_SENT', 'message' => sprintf(esc_html__('%s unique emails are sent successfully to %s attendees.', 'modern-events-calendar-lite'), count($sent), $attendees_count)]); + } + + wp_die(true); + } +} \ No newline at end of file diff --git a/app/features/report/tpl.php b/app/features/report/tpl.php new file mode 100755 index 0000000..5523b72 --- /dev/null +++ b/app/features/report/tpl.php @@ -0,0 +1,146 @@ +main->get_events(-1, ['pending', 'draft', 'future', 'publish']); +$date_format = get_option('date_format'); + +$styling = $this->main->get_styling(); +$dark_mode = $styling['dark_mode'] ?? ''; + +$logo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w.png'; +if($dark_mode == 1) $logo = plugin_dir_url(__FILE__ ) . '../../../assets/img/mec-logo-w2.png'; +?> +
    +

    +
    +
    + + +
    + +

    +

    +
    +
    +
    + +
    +
      + ID; + if($this->main->get_original_event($id) !== $id) $id = $this->main->get_original_event($id); + + $sold_tickets = $this->getBook()->get_all_sold_tickets($id); + echo '
    • '; + } + ?> +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + + +
    +
    +
    + +
    +
    +
    + +

    +

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    +

    0'); ?>

    +

    +
    +
    + +

    +
      +
    • %%name%%:
    • +
    +
    + + + + + + + + +
    + +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/app/features/restful.php b/app/features/restful.php new file mode 100755 index 0000000..d6a22d3 --- /dev/null +++ b/app/features/restful.php @@ -0,0 +1,166 @@ + + */ +class MEC_feature_restful extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_restful + */ + public $restful; + + private $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC RESTful + $this->restful = $this->getRestful(); + + // MEC Settings + $this->settings = $this->getMain()->get_settings(); + } + + /** + * Initialize + * @author Webnus + */ + public function init() + { + // Disabled + if(!isset($this->settings['restful_api_status']) || !$this->settings['restful_api_status']) return; + + $this->factory->action('rest_api_init', [$this, 'register']); + } + + public function register() + { + // Get Events + register_rest_route($this->restful->get_namespace(), 'events', [ + 'methods' => 'GET', + 'callback' => [$this, 'events'], + 'permission_callback' => [$this->restful, 'guest'], + ]); + } + + public function events(WP_REST_Request $request) + { + $limit = $request->get_param('limit'); + if(!$limit) $limit = 12; + + if(!is_numeric($limit)) + { + return $this->restful->response([ + 'data' => new WP_Error(400, esc_html__('Limit parameter must be numeric!', 'modern-events-calendar-lite')), + 'status' => 400, + ]); + } + + $order = $request->get_param('order'); + if(!$order) $order = 'ASC'; + + if(!in_array($order, ['ASC', 'DESC'])) + { + return $this->restful->response([ + 'data' => new WP_Error(400, esc_html__('Order parameter is invalid!', 'modern-events-calendar-lite')), + 'status' => 400, + ]); + } + + $start_date_type = $request->get_param('start_date_type'); + if(!$start_date_type) $start_date_type = 'today'; + + $start_date = $request->get_param('start_date'); + + if($start_date_type === 'date' && !$start_date) + { + return $this->restful->response([ + 'data' => new WP_Error(400, esc_html__('When the start_date_type parameter is set to date, then start_date parameter is required.', 'modern-events-calendar-lite')), + 'status' => 400, + ]); + } + + $end_date_type = $request->get_param('end_date_type'); + if(!$end_date_type) $end_date_type = 'date'; + + $end_date = $request->get_param('end_date'); + + $show_only_past_events = (int) $request->get_param('show_only_past_events'); + $include_past_events = (int) $request->get_param('include_past_events'); + + $show_only_ongoing_events = (int) $request->get_param('show_only_ongoing_events'); + $include_ongoing_events = (int) $request->get_param('include_ongoing_events'); + + $args = [ + 'sk-options' => [ + 'list' => [ + 'limit' => $limit, + 'order_method' => $order, + 'start_date_type' => $start_date_type, + 'start_date' => $start_date, + 'end_date_type' => $end_date_type, + 'maximum_date_range' => $end_date + ] + ], + 'show_only_past_events' => $show_only_past_events, + 'show_past_events' => $include_past_events, + 'show_only_ongoing_events' => $show_only_ongoing_events, + 'show_ongoing_events' => $include_ongoing_events, + 's' => (string) $request->get_param('keyword'), + 'label' => (string) $request->get_param('labels'), + 'ex_label' => (string) $request->get_param('ex_labels'), + 'category' => (string) $request->get_param('categories'), + 'ex_category' => (string) $request->get_param('ex_categories'), + 'location' => (string) $request->get_param('locations'), + 'ex_location' => (string) $request->get_param('ex_locations'), + 'address' => (string) $request->get_param('address'), + 'organizer' => (string) $request->get_param('organizers'), + 'ex_organizer' => (string) $request->get_param('ex_organizers'), + 'sponsor' => (string) $request->get_param('sponsors'), + 'speaker' => (string) $request->get_param('speakers'), + 'tag' => (string) $request->get_param('tags'), + 'ex_tag' => (string) $request->get_param('ex_tags'), + ]; + + // Events Object + $EO = new MEC_skin_list(); + $EO->initialize($args); + + // Set Offset + $EO->offset = (int) $request->get_param('offset'); + + // Search + $EO->search(); + + // Events + $events = $EO->fetch(); + + // Response + return $this->restful->response([ + 'data' => [ + 'events' => $events, + 'pagination' => [ + 'next_date' => $EO->end_date, + 'next_offset' => $EO->next_offset, + 'has_more_events' => $EO->has_more_events, + 'found' => $EO->found, + ], + ] + ]); + } +} diff --git a/app/features/schema.php b/app/features/schema.php new file mode 100755 index 0000000..6dce62e --- /dev/null +++ b/app/features/schema.php @@ -0,0 +1,309 @@ + + */ +class MEC_feature_schema extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize locations feature + * @author Webnus + */ + public function init() + { + // Schema Meta Box + $this->factory->action('mec_metabox_details', array($this, 'meta_box_schema'), 60); + if(!isset($this->settings['fes_section_schema']) or (isset($this->settings['fes_section_schema']) and $this->settings['fes_section_schema'])) $this->factory->action('mec_fes_metabox_details', array($this, 'meta_box_schema'), 60); + + // Save Schema Data + $this->factory->action('save_post', array($this, 'save_event')); + + // Print Schema + if(isset($this->settings['schema']) and $this->settings['schema'] != 0) + { + $this->factory->action('mec_schema', array($this, 'schema'), 10); + $this->factory->filter('mec_schema_text', array($this, 'schema_text'), 10, 2); + } + } + + /** + * Show location meta box + * @author Webnus + * @param object $post + */ + public function meta_box_schema($post) + { + $event_status = get_post_meta($post->ID, 'mec_event_status', true); + if(!trim($event_status)) $event_status = 'EventScheduled'; + + $moved_online_link = get_post_meta($post->ID, 'mec_moved_online_link', true); + $cancelled_reason = get_post_meta($post->ID, 'mec_cancelled_reason', true); + $display_cancellation_reason_in_single_page = get_post_meta($post->ID, 'mec_display_cancellation_reason_in_single_page', true); + ?> +
    +

    +

    + +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    + +

    +
    +
    > +
    + + +
    +
    +

    +
    +
    + +
    +
    +
    + +

    +
    + +
    + + + * @param int $post_id + * @return boolean + */ + public function save_event($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_event_nonce'])) return false; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_event_nonce']), 'mec_event_data')) return false; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return false; + + // Get Modern Events Calendar Data + $_mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + $event_status = isset($_mec['event_status']) ? sanitize_text_field($_mec['event_status']) : 'EventScheduled'; + if(!in_array($event_status, array('EventScheduled', 'EventRescheduled', 'EventPostponed', 'EventCancelled', 'EventMovedOnline'))) $event_status = 'EventScheduled'; + + update_post_meta($post_id, 'mec_event_status', $event_status); + + $moved_online_link = (isset($_mec['moved_online_link']) and filter_var($_mec['moved_online_link'], FILTER_VALIDATE_URL)) ? sanitize_url($_mec['moved_online_link']) : ''; + update_post_meta($post_id, 'mec_moved_online_link', $moved_online_link); + + $cancelled_reason = (isset($_mec['cancelled_reason']) and !empty($_mec['cancelled_reason'])) ? sanitize_text_field($_mec['cancelled_reason']) : ''; + update_post_meta($post_id, 'mec_cancelled_reason', $cancelled_reason); + + $display_cancellation_reason_in_single_page = (isset($_mec['display_cancellation_reason_in_single_page']) and !empty($_mec['display_cancellation_reason_in_single_page'])); + update_post_meta($post_id, 'mec_display_cancellation_reason_in_single_page', $display_cancellation_reason_in_single_page); + + return true; + } + + public function schema($event) + { + $status = $this->settings['schema'] ?? 0; + if(!$status) return; + + $speakers = []; + if(isset($event->data->speakers) and is_array($event->data->speakers) and count($event->data->speakers)) + { + foreach($event->data->speakers as $value) + { + $speakers[] = array( + "@type" => isset($value['type']) && $value['type'] == 'group' ? "PerformingGroup" : "Person", + "name" => $value['name'], + "image" => $value['thumbnail'], + "sameAs" => $value['facebook'], + ); + } + } + + $start_timestamp = ($event->data->time['start_timestamp'] ?? ($event->date['start']['timestamp'] ?? strtotime($event->date['start']['date']))); + + // All Params + $params = MEC_feature_occurrences::param($event->ID, $start_timestamp, '*'); + + $event_status = (isset($event->data->meta['mec_event_status']) and trim($event->data->meta['mec_event_status'])) ? $event->data->meta['mec_event_status'] : 'EventScheduled'; + $event_status = (isset($params['event_status']) and trim($params['event_status']) != '') ? $params['event_status'] : $event_status; + + if(!in_array($event_status, array('EventScheduled', 'EventRescheduled', 'EventPostponed', 'EventCancelled', 'EventMovedOnline'))) $event_status = 'EventScheduled'; + + $cost = $this->main->get_event_cost($event, false); + + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_date = (isset($event->date) and isset($event->date['start']) and isset($event->date['start']['date'])) ? $event->date['start']['date'] : NULL; + $end_date = (isset($event->date) and isset($event->date['end']) and isset($event->date['end']['date'])) ? $event->date['end']['date'] : NULL; + + $event_link = $this->main->get_event_date_permalink($event, $start_date); + $soldout = $this->main->is_soldout($event, $event->date); + + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = $organizer_id ? $this->main->get_organizer_data($organizer_id) : []; + + $moved_online_link = (isset($event->data->meta['mec_moved_online_link']) and trim($event->data->meta['mec_moved_online_link'])) ? $event->data->meta['mec_moved_online_link'] : ''; + $moved_online_link = (isset($params['moved_online_link']) and trim($params['moved_online_link']) != '') ? $params['moved_online_link'] : $moved_online_link; + + $content = strip_tags($event->data->post->post_content); + + $this->factory->printOnAjaxOrFooter(function() use($event, $event_status, $start_date, $end_date, $moved_online_link, $event_link, $location, $organizer, $cost, $soldout, $content, $speakers) + { + ?> + + + */ +class MEC_feature_search extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_search + */ + public $search; + + /** + * @var array + */ + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Search Library + $this->search = $this->getSearch(); + } + + /** + * Initialize search feature + * @author Webnus + */ + public function init() + { + // Search Shortcode + $this->factory->shortcode('MEC_search_bar', array($this, 'search')); + + if(isset($this->settings['search_bar_ajax_mode']) && $this->settings['search_bar_ajax_mode'] == '1') + { + $this->factory->action('wp_ajax_mec_get_ajax_search_data', array($this, 'mec_get_ajax_search_data')); + $this->factory->action('wp_ajax_nopriv_mec_get_ajax_search_data', array($this, 'mec_get_ajax_search_data')); + } + elseif(!is_admin()) + { + $this->factory->filter('pre_get_posts', array($this, 'mec_search_filter')); + } + + // Search Narrow + $this->factory->action('wp_ajax_mec_refine_search_items', array($this->search, 'refine')); + $this->factory->action('wp_ajax_nopriv_mec_refine_search_items', array($this->search, 'refine')); + } + + /** + * Show taxonomy + * @param string $taxonomy + * @param string $icon + * @return boolean|string + */ + public function show_taxonomy($taxonomy, $icon) + { + $terms = get_terms($taxonomy, array('hide_empty' => false)); + $out = ''; + + if(is_wp_error($terms) || empty($terms)) return false; + $taxonomy_name = ($taxonomy == apply_filters('mec_taxonomy_tag', '')) ? 'tag' : str_replace('mec_', '', $taxonomy); + + switch($taxonomy_name) + { + // Message Category + case 'category': + $taxonomy_name = $this->main->m('taxonomy_category', esc_html__('Category', 'modern-events-calendar-lite')); + $taxonomy_key = 'category'; + break; + + // Message Location + case 'location': + $taxonomy_name = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); + $taxonomy_key = 'location'; + break; + + // Message Organizer + case 'organizer': + $taxonomy_name = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + $taxonomy_key = 'organizer'; + break; + + // Message Organizer + case 'speaker': + $taxonomy_name = $this->main->m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite')); + $taxonomy_key = 'speaker'; + break; + + // Message Tag + case 'tag': + $taxonomy_name = esc_html__('Tag', 'modern-events-calendar-lite'); + $taxonomy_key = 'tag'; + break; + + // Message label + case 'label': + $taxonomy_name = $this->main->m('taxonomy_label', esc_html__('Label', 'modern-events-calendar-lite')); + $taxonomy_key = 'label'; + break; + + // Default Screen + default: + $taxonomy_name = str_replace('mec_', '', $taxonomy); + $taxonomy_key = $taxonomy_name; + break; + } + + $out .= ''; + + return $out; + } + + public function mec_get_ajax_search_data() + { + if(sanitize_text_field($_POST['length']) < '3') + { + esc_html_e('Please enter at least 3 characters and try again', 'modern-events-calendar-lite'); + die(); + } + + $mec_tag_query = NULL; + $mec_queries = []; + + if(!empty($_POST['location'])) + { + $location = sanitize_text_field($_POST['location']); + $mec_queries[] = array( + 'taxonomy' => 'mec_location', + 'field' => 'id', + 'terms' => array($location), + 'operator' => 'IN' + ); + } + + if(!empty($_POST['category'])) + { + $category = sanitize_text_field($_POST['category']); + $mec_queries[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => array($category), + 'operator' => 'IN' + ); + } + + if(!empty($_POST['organizer'])) + { + $organizer = sanitize_text_field($_POST['organizer']); + $mec_queries[] = array( + 'taxonomy' => 'mec_organizer', + 'field' => 'id', + 'terms' => array($organizer), + 'operator' => 'IN' + ); + } + + if(!empty($_POST['speaker'])) + { + $speaker = sanitize_text_field($_POST['speaker']); + $mec_queries[] = array( + 'taxonomy' => 'mec_speaker', + 'field' => 'id', + 'terms' => array($speaker), + 'operator' => 'IN' + ); + } + + // Tag Method + $tag_method = $this->settings['tag_method'] ?? 'post_tag'; + + if(!empty($_POST['tag'])) + { + if($tag_method === 'post_tag') + { + $term = get_term_by('id', sanitize_text_field($_POST['tag']), apply_filters('mec_taxonomy_tag', '')); + if($term) $mec_tag_query = $term->slug; + } + else + { + $mec_queries[] = array( + 'taxonomy' => apply_filters('mec_taxonomy_tag', ''), + 'field' => 'id', + 'terms' => array(sanitize_text_field($_POST['tag'])), + 'operator' => 'IN' + ); + } + } + + if(!empty($_POST['label'])) + { + $label = sanitize_text_field($_POST['label']); + $mec_queries[] = array( + 'taxonomy' => 'mec_label', + 'field' => 'id', + 'terms' => array($label), + 'operator' => 'IN' + ); + } + + $args = array( + 'tax_query' => $mec_queries, + 's' => sanitize_text_field($_POST['keyword']), + 'post_type' => $this->main->get_main_post_type(), + 'post_status' => array('publish'), + ); + + if($tag_method === 'post_tag' && $mec_tag_query) $args['tag'] = $mec_tag_query; + + // Query + $the_query = new WP_Query($args); + if($the_query->have_posts()) + { + while($the_query->have_posts()) + { + $the_query->the_post(); + include MEC::import('app.features.search_bar.search_result', true, true); + } + + wp_reset_postdata(); + } + else + { + include MEC::import('app.features.search_bar.search_noresult', true, true); + } + + die(); + } + + /** + * Search Filter + * @param WP_Query $query + * @return WP_Query $query + */ + public function mec_search_filter($query) + { + // Do not change Query if it is not search page! + if(!$query->is_search) return $query; + + // Do not do anything in Backend + if(is_admin()) return $query; + + // Do not change anything in Rest API + if(defined('REST_REQUEST')) return $query; + + // Do not change Query if it is not a search related to MEC! + if((is_array($query->get('post_type')) and !in_array($this->main->get_main_post_type(), $query->get('post_type'))) or (!is_array($query->get('post_type')) and $query->get('post_type') != 'mec-events')) return $query; + + $mec_tag_query = NULL; + $mec_queries = []; + + if(!empty($_GET['location'])) + { + $mec_queries[] = array( + 'taxonomy' => 'mec_location', + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['location'])), + 'operator' => 'IN' + ); + } + + if(!empty($_GET['category'])) + { + $mec_queries[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['category'])), + 'operator' => 'IN' + ); + } + + if(!empty($_GET['organizer'])) + { + $mec_queries[] = array( + 'taxonomy' => 'mec_organizer', + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['organizer'])), + 'operator' => 'IN' + ); + } + + if(!empty($_GET['speaker'])) + { + $mec_queries[] = array( + 'taxonomy' => 'mec_speaker', + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['speaker'])), + 'operator' => 'IN' + ); + } + + // Tag Method + $tag_method = $this->settings['tag_method'] ?? 'post_tag'; + + if(!empty($_GET['tag'])) + { + if($tag_method === 'post_tag') + { + $term = get_term_by('id', sanitize_text_field($_GET['tag']), apply_filters('mec_taxonomy_tag', '')); + if($term) $mec_tag_query = $term->slug; + } + else + { + $mec_queries[] = array( + 'taxonomy' => apply_filters('mec_taxonomy_tag', ''), + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['tag'])), + 'operator' => 'IN' + ); + } + } + + if(!empty($_GET['label'])) + { + $mec_queries[] = array( + 'taxonomy' => 'mec_label', + 'field' => 'id', + 'terms' => array(sanitize_text_field($_GET['label'])), + 'operator' => 'IN' + ); + } + + if($mec_tag_query and $tag_method === 'post_tag') $query->set('tag', $mec_tag_query); + else + { + $query->set('tag', null); + $query->set('tag_slug__in', null); + } + + if(count($mec_queries)) + { + $query->set('tax_query', $mec_queries); + $query->tax_query = $mec_queries; + } + + return $query; + } + + /** + * Show user search bar + * @return string + */ + public function search() + { + $path = MEC::import('app.features.search_bar.search_bar', true, true); + + ob_start(); + include $path; + return ob_get_clean(); + } +} \ No newline at end of file diff --git a/app/features/search_bar/index.html b/app/features/search_bar/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/features/search_bar/search_bar.php b/app/features/search_bar/search_bar.php new file mode 100755 index 0000000..cc87524 --- /dev/null +++ b/app/features/search_bar/search_bar.php @@ -0,0 +1,153 @@ +main->get_settings(); + +$modern_type = ''; +if(isset($settings['search_bar_modern_type']) && $settings['search_bar_modern_type'] == '1') $modern_type = 'mec-modern-search-bar '; + +$output = '
    '; +echo MEC_kses::form($output); +?> + \ No newline at end of file diff --git a/app/features/search_bar/search_noresult.php b/app/features/search_bar/search_noresult.php new file mode 100755 index 0000000..1306b38 --- /dev/null +++ b/app/features/search_bar/search_noresult.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/features/search_bar/search_result.php b/app/features/search_bar/search_result.php new file mode 100755 index 0000000..e5a4522 --- /dev/null +++ b/app/features/search_bar/search_result.php @@ -0,0 +1,34 @@ + main->get_settings(); +$start_hour = get_post_meta(get_the_ID(), 'mec_start_time_hour', true); +$start_min = (get_post_meta(get_the_ID(), 'mec_start_time_minutes', true) < '10') ? '0' . get_post_meta(get_the_ID(), 'mec_start_time_minutes', true) : get_post_meta(get_the_ID(), 'mec_start_time_minutes', true); +$start_ampm = get_post_meta(get_the_ID(), 'mec_start_time_ampm', true); +$end_hour = get_post_meta(get_the_ID(), 'mec_end_time_hour', true); +$end_min = (get_post_meta(get_the_ID(), 'mec_end_time_minutes', true) < '10') ? '0' . get_post_meta(get_the_ID(), 'mec_end_time_minutes', true) : get_post_meta(get_the_ID(), 'mec_end_time_minutes', true); +$end_ampm = get_post_meta(get_the_ID(), 'mec_end_time_ampm', true); +$time = (get_post_meta(get_the_ID(), 'mec_allday', true) == '1' ) ? $this->main->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) : $start_hour . ':' . $start_min . ' ' . $start_ampm . ' - ' . $end_hour . ':' . $end_min . ' ' . $end_ampm; +?> +
    +
    + main->date_i18n('d', strtotime(get_post_meta(get_the_ID(), 'mec_start_date', true)))); ?>main->date_i18n('F', strtotime(get_post_meta(get_the_ID(), 'mec_start_date', true)))); ?> +
    +
    + +
    +
    + +
    +

    + +

    +
    + name); + ?> +
    +
    \ No newline at end of file diff --git a/app/features/sms.php b/app/features/sms.php new file mode 100755 index 0000000..1d89c34 --- /dev/null +++ b/app/features/sms.php @@ -0,0 +1,140 @@ + + */ +class MEC_feature_sms extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $notifications; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // MEC Notification Library + $this->notifications = $this->main->getNotifications(); + } + + /** + * Initialize locations feature + * @author Webnus + */ + public function init() + { + // Pro Only + if(!$this->getPRO()) return; + + // SMS Status + $sms_status = (isset($this->settings['sms_status']) and $this->settings['sms_status']); + + // SMS is not enabled + if(!$sms_status) return; + + $sid = $this->settings['sms_twilio_account_sid'] ?? ''; + $auth_token = $this->settings['sms_twilio_auth_token'] ?? ''; + $from = $this->settings['sms_twilio_sender_number'] ?? ''; + + // Insufficient Credentials + if(!trim($sid) or !trim($auth_token) or !trim($from)) return; + + // Admin Notification + $this->factory->action('mec_booking_completed', array($this, 'admin_notification'), 12); + } + + /** + * Send admin notification + * + * @param int $book_id + * @return bool + * @throws \Twilio\Exceptions\ConfigurationException + * @throws \Twilio\Exceptions\TwilioException + * @author Webnus + */ + public function admin_notification($book_id) + { + if(!$book_id) return false; + + // Admin Notification is disabled + if(isset($this->settings['sms_notif_admin_status']) and !$this->settings['sms_notif_admin_status']) return false; + + $recipients_str = $this->settings['sms_notif_admin_recipients'] ?? ''; + + // No recipients + if(trim($recipients_str) === '') return false; + + $recipients = explode(',', $recipients_str); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + $message = $this->settings['sms_notif_admin_text'] ?? ''; + $message = $this->notifications->content($message, $book_id); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Strip HTML Tags + $message = strip_tags($message); + + try + { + // Twilio Client + $client = $this->get_twilio_client(); + + // From Number + $from = $this->settings['sms_twilio_sender_number'] ?? ''; + + // Send Text Messages + foreach ($recipients as $recipient) + { + $client->messages->create( + $recipient, + [ + 'from' => $from, + 'body' => $message + ] + ); + } + } + catch(Exception $e) + { + // Store the Error + update_option('mec_sms_twilio_error', $e->getMessage()); + + return false; + } + + return true; + } + + /** + * @throws \Twilio\Exceptions\ConfigurationException + */ + public function get_twilio_client() + { + require __DIR__ . '/../api/Twilio/autoload.php'; + + $sid = $this->settings['sms_twilio_account_sid'] ?? ''; + $auth_token = $this->settings['sms_twilio_auth_token'] ?? ''; + + return new Twilio\Rest\Client($sid, $auth_token); + } +} \ No newline at end of file diff --git a/app/features/speakers.php b/app/features/speakers.php new file mode 100755 index 0000000..f9512f5 --- /dev/null +++ b/app/features/speakers.php @@ -0,0 +1,565 @@ + + */ +class MEC_feature_speakers extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize speakers feature + * @author Webnus + */ + public function init() + { + // Speakers Feature is Disabled + if(!isset($this->settings['speakers_status']) || !$this->settings['speakers_status']) return; + + $this->factory->action('init', array($this, 'register_taxonomy'), 25); + $this->factory->action('mec_speaker_edit_form_fields', array($this, 'edit_form')); + $this->factory->action('mec_speaker_add_form_fields', array($this, 'add_form')); + $this->factory->action('edited_mec_speaker', array($this, 'save_metadata')); + $this->factory->action('created_mec_speaker', array($this, 'save_metadata')); + + $this->factory->action('wp_ajax_speaker_adding', array($this, 'fes_speaker_adding')); + $this->factory->action('wp_ajax_nopriv_speaker_adding', array($this, 'fes_speaker_adding')); + $this->factory->action('wp_ajax_mec_sponsor_adding', array($this, 'fes_sponsor_adding')); + $this->factory->action('wp_ajax_nopriv_mec_sponsor_adding', array($this, 'fes_sponsor_adding')); + $this->factory->action('current_screen', array($this, 'show_notices')); + + $this->factory->filter('manage_edit-mec_speaker_columns', array($this, 'filter_columns')); + $this->factory->filter('manage_mec_speaker_custom_column', array($this, 'filter_columns_content'), 10, 3); + + $this->factory->action('current_screen', array($this, 'update_speakers_list_admin')); + $this->factory->action('mec_fes_form_footer', array($this, 'update_speakers_list')); + + $this->factory->action('wp_ajax_update_speakers_list', array($this, 'get_speakers')); + $this->factory->action('wp_ajax_nopriv_update_speakers_list', array($this, 'get_speakers')); + + $this->factory->filter('post_edit_category_parent_dropdown_args', array($this, 'hide_parent_dropdown')); + } + + /** + * Registers speaker taxonomy + * @author Webnus + */ + public function register_taxonomy() + { + $singular_label = $this->main->m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_speakers', esc_html__('Speakers', 'modern-events-calendar-lite')); + $speaker_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-speaker'), + 'public'=>false, + 'show_ui'=>true, + 'show_in_rest'=>true, + 'hierarchical'=>false, + 'meta_box_cb'=>(isset($_POST['_inline_edit']) ? '' : 'post_categories_meta_box'), + ), + 'mec_speaker' + ); + register_taxonomy( + 'mec_speaker', + $this->main->get_main_post_type(), + $speaker_args + ); + + register_taxonomy_for_object_type('mec_speaker', $this->main->get_main_post_type()); + } + + /** + * Show edit form of speaker taxonomy + * @author Webnus + * @param object $term + */ + public function edit_form($term) + { + $job_title = get_metadata('term', $term->term_id, 'job_title', true); + $tel = get_metadata('term', $term->term_id, 'tel', true); + $email = get_metadata('term', $term->term_id, 'email', true); + $website = get_metadata('term', $term->term_id, 'website', true); + $index = get_metadata('term', $term->term_id, 'mec_index', true); + $facebook = get_metadata('term', $term->term_id, 'facebook', true); + $type = get_metadata('term', $term->term_id, 'type', true); + $instagram = get_metadata('term', $term->term_id, 'instagram', true); + $linkedin = get_metadata('term', $term->term_id, 'linkedin', true); + $twitter = get_metadata('term', $term->term_id, 'twitter', true); + $thumbnail = get_metadata('term', $term->term_id, 'thumbnail', true); + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    '; ?>
    + + + + + + + + */ + public function add_form() + { + ?> +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + + + +
    + + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['job_title'])) return; + + $job_title = sanitize_text_field($_POST['job_title']); + $type = isset($_POST['type']) ? sanitize_text_field($_POST['type']) : 'person'; + $tel = isset($_POST['tel']) ? sanitize_text_field($_POST['tel']) : ''; + $email = isset($_POST['email']) ? sanitize_text_field($_POST['email']) : ''; + $website = (isset($_POST['website']) and trim($_POST['website'])) ? esc_url($_POST['website']) : ''; + $index = (isset($_POST['mec_index']) and trim($_POST['mec_index'])) ? sanitize_text_field($_POST['mec_index']) : 99; + $facebook = (isset($_POST['facebook']) and trim($_POST['facebook'])) ? esc_url($_POST['facebook']) : ''; + $twitter = (isset($_POST['twitter']) and trim($_POST['twitter'])) ? esc_url($_POST['twitter']) : ''; + $instagram = (isset($_POST['instagram']) and trim($_POST['instagram'])) ? esc_url($_POST['instagram']) : ''; + $linkedin = (isset($_POST['linkedin']) and trim($_POST['linkedin'])) ? esc_url($_POST['linkedin']) : ''; + $thumbnail = isset($_POST['thumbnail']) ? sanitize_text_field($_POST['thumbnail']) : ''; + + update_term_meta($term_id, 'type', $type); + update_term_meta($term_id, 'job_title', $job_title); + update_term_meta($term_id, 'tel', $tel); + update_term_meta($term_id, 'email', $email); + update_term_meta($term_id, 'website', $website); + update_term_meta($term_id, 'mec_index', $index); + update_term_meta($term_id, 'facebook', $facebook); + update_term_meta($term_id, 'twitter', $twitter); + update_term_meta($term_id, 'instagram', $instagram); + update_term_meta($term_id, 'linkedin', $linkedin); + update_term_meta($term_id, 'thumbnail', $thumbnail); + + do_action('mec_save_speaker_extra_fields', $term_id); + } + + /** + * Filter columns of speaker taxonomy + * @author Webnus + * @param array $columns + * @return array + */ + public function filter_columns($columns) + { + unset($columns['name']); + unset($columns['slug']); + unset($columns['description']); + unset($columns['posts']); + + $columns['id'] = esc_html__('ID', 'modern-events-calendar-lite'); + $columns['name'] = $this->main->m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite')); + $columns['job_title'] = esc_html__('Job Title', 'modern-events-calendar-lite'); + $columns['tel'] = esc_html__('Tel', 'modern-events-calendar-lite'); + $columns['posts'] = esc_html__('Count', 'modern-events-calendar-lite'); + + return apply_filters('speaker_filter_column', $columns); + } + + /** + * Filter content of speaker taxonomy columns + * @author Webnus + * @param string $content + * @param string $column_name + * @param int $term_id + * @return string + */ + public function filter_columns_content($content, $column_name, $term_id) + { + switch($column_name) + { + case 'id': + + $content = $term_id; + break; + + case 'tel': + + $content = get_metadata('term', $term_id, 'tel', true); + + break; + + case 'job_title': + + $content = get_metadata('term', $term_id, 'job_title', true); + + break; + + default: + break; + } + + return apply_filters('speaker_filter_column_content', $content, $column_name, $term_id); + } + + /** + * Adding new speaker + * @author Webnus + * @return void + */ + public function fes_speaker_adding() + { + $content = isset($_REQUEST['content']) ? sanitize_text_field($_REQUEST['content']) : NULL; + $key = isset($_REQUEST['key']) ? sanitize_text_field($_REQUEST['key']) : NULL; + + $content = wp_strip_all_tags($content); + $content = sanitize_text_field($content); + $key = intval($key); + + if(!trim($content)) + { + echo '

    ' . sprintf(esc_html__('Sorry, You must insert %s name!', 'modern-events-calendar-lite'), strtolower(\MEC\Base::get_main()->m('taxonomy_speaker', esc_html__('speaker', 'modern-events-calendar-lite')))) . '

    '; + exit; + } + + if(term_exists($content, 'mec_speaker')) + { + echo '

    ' . esc_html__("Sorry, {$content} already exists!", 'modern-events-calendar-lite') . '

    '; + exit; + } + + wp_insert_term(trim($content), 'mec_speaker'); + + $speakers = ''; + $speaker_terms = get_terms(array('taxonomy'=>'mec_speaker', 'hide_empty'=>false)); + foreach($speaker_terms as $speaker_term) + { + $speakers .= ''; + } + + echo MEC_kses::form($speakers); + exit; + } + + /** + * Adding new sponsor + * @author Webnus + * @return void + */ + public function fes_sponsor_adding() + { + $content = isset($_REQUEST['content']) ? sanitize_text_field($_REQUEST['content']) : NULL; + $key = isset($_REQUEST['key']) ? sanitize_text_field($_REQUEST['key']) : NULL; + + $content = wp_strip_all_tags($content); + $content = sanitize_text_field($content); + $key = intval($key); + + if(!trim($content)) + { + echo '

    ' . sprintf(esc_html__('Sorry, You must insert %s name!', 'modern-events-calendar-lite'), strtolower(\MEC\Base::get_main()->m('taxonomy_sponsor', esc_html__('sponsor', 'modern-events-calendar-lite')))) . '

    '; + exit; + } + + if(term_exists($content, 'mec_sponsor')) + { + echo '

    ' . esc_html__("Sorry, {$content} already exists!", 'modern-events-calendar-lite') . '

    '; + exit; + } + + wp_insert_term(trim($content), 'mec_sponsor'); + + $sponsors = ''; + $sponsor_terms = get_terms(array('taxonomy'=>'mec_sponsor', 'hide_empty'=>false)); + foreach($sponsor_terms as $sponsor_term) + { + $sponsors .= ''; + } + + echo MEC_kses::form($sponsors); + exit; + } + + public function show_notices($screen) + { + if(isset($screen->id) and $screen->id == 'edit-mec_speaker') + { + add_action('admin_footer', function() + { + echo ""; + }); + } + } + + public function update_speakers_list_admin($screen) + { + if(isset($screen->id) and $screen->id == 'mec-events' and isset($screen->base) and $screen->base == 'post') + { + add_action('admin_footer', array($this, 'update_speakers_list')); + } + } + + public function update_speakers_list() + { + echo ""; + } + + public function get_speakers() + { + $speakers = get_terms('mec_speaker', array( + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => '0', + )); + + $sp = []; + foreach($speakers as $speaker) + { + $sp[] = array($speaker->term_id, $speaker->name); + } + + wp_send_json(array('speakers' => $sp)); + } + + public function hide_parent_dropdown($args) + { + if('mec_speaker' == $args['taxonomy']) $args['echo'] = false; + return $args; + } +} diff --git a/app/features/sponsors.php b/app/features/sponsors.php new file mode 100755 index 0000000..1a10f3e --- /dev/null +++ b/app/features/sponsors.php @@ -0,0 +1,176 @@ + + */ +class MEC_feature_sponsors extends MEC_base +{ + public $factory; + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize Sponsors feature + * @author Webnus + */ + public function init() + { + // Feature is not included in PRO + if(!$this->getPRO()) return; + + // Sponsors Feature is Disabled + if(!isset($this->settings['sponsors_status']) or (isset($this->settings['sponsors_status']) and !$this->settings['sponsors_status'])) return; + + $this->factory->action('init', array($this, 'register_taxonomy'), 25); + $this->factory->action('mec_sponsor_edit_form_fields', array($this, 'edit_form')); + $this->factory->action('mec_sponsor_add_form_fields', array($this, 'add_form')); + $this->factory->action('edited_mec_sponsor', array($this, 'save_metadata')); + $this->factory->action('created_mec_sponsor', array($this, 'save_metadata')); + + $this->factory->filter('post_edit_category_parent_dropdown_args', array($this, 'hide_parent_dropdown')); + } + + /** + * Registers Sponsors taxonomy + * @author Webnus + */ + public function register_taxonomy() + { + $singular_label = $this->main->m('taxonomy_sponsor', esc_html__('Sponsor', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_sponsors', esc_html__('Sponsors', 'modern-events-calendar-lite')); + + $sponsor_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-sponsor'), + 'public'=>false, + 'show_ui'=>true, + 'show_in_rest'=>true, + 'hierarchical'=>false, + 'meta_box_cb' => function_exists('wp_doing_ajax') && wp_doing_ajax() ? '' : 'post_categories_meta_box', + ), + 'mec_sponsor' + ); + register_taxonomy( + 'mec_sponsor', + $this->main->get_main_post_type(), + $sponsor_args + ); + + register_taxonomy_for_object_type('mec_sponsor', $this->main->get_main_post_type()); + } + + /** + * Show edit form of Sponsors taxonomy + * @author Webnus + * @param object $term + */ + public function edit_form($term) + { + $link = get_metadata('term', $term->term_id, 'link', true); + $logo = get_metadata('term', $term->term_id, 'logo', true); + ?> + + + + + + + + + + + + + +
    '; ?>
    + + + + + + + + */ + public function add_form() + { + ?> +
    + + +
    +
    + +
    + + + +
    + + + * @param int $term_id + */ + public function save_metadata($term_id) + { + // Quick Edit + if(!isset($_POST['link'])) return; + + $link = (isset($_POST['link']) and trim($_POST['link'])) ? esc_url($_POST['link']) : ''; + $logo = (isset($_POST['logo']) and trim($_POST['logo'])) ? esc_url($_POST['logo']) : ''; + + update_term_meta($term_id, 'link', $link); + update_term_meta($term_id, 'logo', $logo); + + do_action('mec_save_sponsor_extra_fields', $term_id); + } + + public function hide_parent_dropdown($args) + { + if('mec_sponsor' == $args['taxonomy']) $args['echo'] = false; + return $args; + } +} diff --git a/app/features/tag.php b/app/features/tag.php new file mode 100755 index 0000000..4b8fe1c --- /dev/null +++ b/app/features/tag.php @@ -0,0 +1,132 @@ + + */ +class MEC_feature_tag extends MEC_base +{ + public $factory; + public $main; + public $settings; + public $PT; + public $taxonomy; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Main Library + $this->main = $this->getMain(); + + // Settings + $this->settings = $this->main->get_settings(); + + // Post Type + $this->PT = $this->main->get_main_post_type(); + + // Taxonomy + $this->taxonomy = (isset($this->settings['tag_method']) ? $this->settings['tag_method'] : 'post_tag'); + } + + /** + * Initialize search feature + * @author Webnus + */ + public function init() + { + $this->factory->action('init', array($this, 'register_taxonomy'), 100); + $this->factory->filter('mec_taxonomy_tag', array($this, 'taxonomy'), 10); + + // Toggle Tag Method + $this->factory->action('mec_tag_method_changed', array($this, 'toggle'), 10, 2); + } + + public function register_taxonomy($taxonomy = NULL) + { + if(!$taxonomy) $taxonomy = $this->taxonomy; + + if($taxonomy === 'post_tag') register_taxonomy_for_object_type('post_tag', $this->PT); + else + { + $singular_label = $this->main->m('taxonomy_tag', esc_html__('Tag', 'modern-events-calendar-lite')); + $plural_label = $this->main->m('taxonomy_tags', esc_html__('Tags', 'modern-events-calendar-lite')); + + $tag_args = apply_filters( + 'mec_register_taxonomy_args', + array( + 'label'=>$plural_label, + 'labels'=>array( + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'all_items'=>sprintf(esc_html__('All %s', 'modern-events-calendar-lite'), $plural_label), + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $singular_label), + 'view_item'=>sprintf(esc_html__('View %s', 'modern-events-calendar-lite'), $singular_label), + 'update_item'=>sprintf(esc_html__('Update %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add New %s', 'modern-events-calendar-lite'), $singular_label), + 'new_item_name'=>sprintf(esc_html__('New %s Name', 'modern-events-calendar-lite'), $singular_label), + 'popular_items'=>sprintf(esc_html__('Popular %s', 'modern-events-calendar-lite'), $plural_label), + 'search_items'=>sprintf(esc_html__('Search %s', 'modern-events-calendar-lite'), $plural_label), + 'back_to_items'=>sprintf(esc_html__('← Back to %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found'=>sprintf(esc_html__('no %s found.', 'modern-events-calendar-lite'), strtolower($plural_label)), + ), + 'rewrite'=>array('slug'=>'events-tag'), + 'public'=>true, + 'show_ui'=>true, + 'show_in_rest'=>true, + 'hierarchical'=>false, + ), + 'mec_tag' + ); + register_taxonomy( + 'mec_tag', + $this->PT, + $tag_args + ); + + register_taxonomy_for_object_type('mec_tag', $this->PT); + } + } + + public function taxonomy($taxonomy) + { + return $this->taxonomy; + } + + public function toggle($new_method, $old_method) + { + // Register New Taxonomy + $this->register_taxonomy($new_method); + + $events = get_posts(array( + 'post_type' => $this->PT, + 'post_status' => array('publish', 'pending', 'draft', 'future', 'private', 'trash'), + 'numberposts' => -1 + )); + + foreach($events as $event) + { + $old_terms = get_the_terms($event, $old_method); + if(!is_array($old_terms) or (is_array($old_terms) and !count($old_terms))) continue; + + $new_term_ids = []; + foreach($old_terms as $old_term) + { + $term = wp_create_term($old_term->name, $new_method); + $new_term_id = (int) (is_array($term) ? $term['term_id'] : (is_numeric($term) ? $term : false)); + + if(!$new_term_id) continue; + $new_term_ids[] = $new_term_id; + } + + if(count($new_term_ids)) wp_set_object_terms($event->ID, $new_term_ids, $new_method); + wp_delete_object_term_relationships($event->ID, $old_method); + } + } +} \ No newline at end of file diff --git a/app/features/taxonomies/shortcode.php b/app/features/taxonomies/shortcode.php new file mode 100755 index 0000000..43e7e47 --- /dev/null +++ b/app/features/taxonomies/shortcode.php @@ -0,0 +1,29 @@ + +
    + +
    \ No newline at end of file diff --git a/app/features/taxonomyshortcode.php b/app/features/taxonomyshortcode.php new file mode 100755 index 0000000..2f94fa1 --- /dev/null +++ b/app/features/taxonomyshortcode.php @@ -0,0 +1,67 @@ + + */ +class MEC_feature_taxonomyshortcode extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + } + + /** + * Initialize User Events Feature + * @author Webnus + */ + public function init() + { + // User Events Shortcode + $this->factory->shortcode('MEC_taxonomy_category', array($this, 'category')); + } + + public function category(): string + { + $categories = get_terms([ + 'taxonomy' => 'mec_category' + ]); + + return $this->output($categories); + } + + /** + * Show Terms Output + * + * @param array $terms + * @return string + */ + public function output(array $terms = []): string + { + $path = MEC::import('app.features.taxonomies.shortcode', true, true); + + ob_start(); + include $path; + return ob_get_clean(); + } +} \ No newline at end of file diff --git a/app/features/update.php b/app/features/update.php new file mode 100755 index 0000000..16d93cf --- /dev/null +++ b/app/features/update.php @@ -0,0 +1,930 @@ + + */ +class MEC_feature_update extends MEC_base +{ + public $factory; + public $main; + public $db; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC DB + $this->db = $this->getDB(); + + // Import MEC Factory + $this->factory = $this->getFactory(); + } + + /** + * Initialize update feature + * @author Webnus + */ + public function init() + { + // Plugin is not installed yet so no need to run these upgrades + if(!get_option('mec_installed', 0)) return; + + // Run the Update Function + $this->factory->action('admin_init', array($this, 'update')); + } + + public function update() + { + $version = get_option('mec_version', '1.0.0'); + + // It's updated to latest version + if(version_compare($version, $this->main->get_version(), '>=')) return; + + // Run the updates one by one + if(version_compare($version, '1.0.3', '<')) $this->version103(); + if(version_compare($version, '1.3.0', '<')) $this->version130(); + if(version_compare($version, '1.5.0', '<')) $this->version150(); + if(version_compare($version, '2.2.0', '<')) $this->version220(); + if(version_compare($version, '2.9.0', '<')) $this->version290(); + if(version_compare($version, '3.2.0', '<')) $this->version320(); + if(version_compare($version, '3.5.0', '<')) $this->version350(); + if(version_compare($version, '4.0.0', '<')) $this->version400(); + if(version_compare($version, '4.3.0', '<')) $this->version430(); + if(version_compare($version, '4.4.6', '<')) $this->version446(); + if(version_compare($version, '4.6.1', '<')) $this->version461(); + if(version_compare($version, '4.9.0', '<')) $this->version490(); + if(version_compare($version, '5.0.5', '<')) $this->version505(); + if(version_compare($version, '5.5.1', '<')) $this->version551(); + if(version_compare($version, '5.7.1', '<')) $this->version571(); + if(version_compare($version, '5.10.0', '<')) $this->version5100(); + if(version_compare($version, '5.11.0', '<')) $this->version5110(); + if(version_compare($version, '5.12.6', '<')) $this->version5126(); + if(version_compare($version, '5.13.5', '<')) $this->version5135(); + if(version_compare($version, '5.14.0', '<')) $this->version5140(); + if(version_compare($version, '5.16.0', '<')) $this->version5160(); + if(version_compare($version, '5.16.1', '<')) $this->version5161(); + if(version_compare($version, '5.16.2', '<')) $this->version5162(); + if(version_compare($version, '5.17.0', '<')) $this->version5170(); + if(version_compare($version, '5.17.1', '<')) $this->version5171(); + if(version_compare($version, '5.19.1', '<')) $this->version5191(); + if(version_compare($version, '5.22.0', '<')) $this->version5220(); + if(version_compare($version, '6.0.0', '<')) $this->version600(); + // if(version_compare($version, '6.2.6', '>')) $this->version626(); + if(version_compare($version, '6.4.0', '<')) $this->version640(); + if(version_compare($version, '6.5.3', '<')) $this->version653(); + if(version_compare($version, '6.6.11', '<')) $this->version6611(); + if(version_compare($version, '6.7.5', '<')) $this->version675(); + if(version_compare($version, '6.8.35', '<')) $this->version6835(); + if(version_compare($version, '7.0.0', '<')) $this->version700(); + if(version_compare($version, '7.2.0', '<')) $this->version720(); + if(version_compare($version, '7.4.0', '<')) $this->version740(); + if(version_compare($version, '7.11.0', '<')) $this->version7110(); + if(version_compare($version, '7.13.0', '<')) $this->version7130(); + + // Update to latest version to prevent running the code twice + update_option('mec_version', $this->main->get_version()); + } + + public function update_capabilities($capabilities) + { + // Site Admin + $role = get_role('administrator'); + if($role) foreach($capabilities as $capability) $role->add_cap($capability, true); + + // Multisite + if(is_multisite()) + { + // All Super Admins + $supers = get_super_admins(); + foreach($supers as $admin) + { + $user = new WP_User(0, $admin); + foreach($capabilities as $capability) $user->add_cap($capability, true); + } + } + } + + public function reschedule() + { + // Scheduler + $schedule = $this->getSchedule(); + + // Add Schedule for All Events + $events = $this->main->get_events(); + foreach($events as $event) $schedule->reschedule($event->ID, 50); + } + + /** + * Update database to version 1.0.3 + * @author Webnus + */ + public function version103() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['new_event'] = array + ( + 'status'=>'1', + 'subject'=>'A new event is added.', + 'recipients'=>'', + 'content'=>"Hello, + + A new event just added. The event title is %%event_title%% and it's status is %%event_status%% + The new event may need to be published. Please use this link for managing your website events: %%admin_link%% + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + /** + * Update database to version 1.3.0 + * @author Webnus + */ + public function version130() + { + $this->db->q("ALTER TABLE `#__mec_events` ADD `days` TEXT NULL DEFAULT NULL, ADD `time_start` INT(10) NOT NULL DEFAULT '0', ADD `time_end` INT(10) NOT NULL DEFAULT '0'"); + } + + /** + * Update database to version 1.5.0 + * @author Webnus + */ + public function version150() + { + $this->db->q("ALTER TABLE `#__mec_events` ADD `not_in_days` TEXT NOT NULL DEFAULT '' AFTER `days`"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `days` `days` TEXT NOT NULL DEFAULT ''"); + } + + /** + * Update database to version 2.2.0 + * @author Webnus + */ + public function version220() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['booking_reminder'] = array + ( + 'status'=>'0', + 'subject'=>'Booking Reminder', + 'recipients'=>'', + 'days'=>'1,3', + 'content'=>"Hello, + + This email is to remind you that you booked %%event_title%% event on %%book_date%% date. + We're looking forward to see you at %%event_location_address%%. You can contact %%event_organizer_email%% if you have any questions. + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version290() + { + $this->db->q("UPDATE `#__postmeta` SET `meta_value`=CONCAT(',', `meta_value`) WHERE `meta_key`='mec_ticket_id'"); + $this->db->q("UPDATE `#__postmeta` SET `meta_value`=CONCAT(`meta_value`, ',') WHERE `meta_key`='mec_ticket_id'"); + } + + public function version320() + { + $this->db->q("ALTER TABLE `#__mec_events` DROP INDEX `repeat`;"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `rinterval` `rinterval` VARCHAR(10);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `year` `year` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `month` `month` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `day` `day` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `week` `week` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `weekday` `weekday` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` CHANGE `weekdays` `weekdays` VARCHAR(80);"); + $this->db->q("ALTER TABLE `#__mec_events` ADD INDEX( `start`, `end`, `repeat`, `rinterval`, `year`, `month`, `day`, `week`, `weekday`, `weekdays`, `time_start`, `time_end`);"); + } + + public function version350() + { + $this->db->q("CREATE TABLE IF NOT EXISTS `#__mec_dates` ( + `id` int(10) UNSIGNED NOT NULL, + `post_id` int(10) NOT NULL, + `dstart` date NOT NULL, + `dend` date NOT NULL, + `type` enum('include','exclude') COLLATE [:COLLATE:] NOT NULL DEFAULT 'include' + ) DEFAULT CHARSET=[:CHARSET:] COLLATE=[:COLLATE:];"); + + $this->db->q("ALTER TABLE `#__mec_dates` ADD PRIMARY KEY (`id`), ADD KEY `post_id` (`post_id`), ADD KEY `type` (`type`);"); + $this->db->q("ALTER TABLE `#__mec_dates` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;"); + + $custom_days = $this->db->select("SELECT * FROM `#__mec_events` WHERE `days`!=''", 'loadAssocList'); + foreach($custom_days as $custom_day) + { + $days = explode(',', trim($custom_day['days'], ', ')); + + $new_days_str = ''; + foreach($days as $day) + { + if(!trim($day)) continue; + + $start = $day; + $end = $day; + + $this->db->q("INSERT INTO `#__mec_dates` (`post_id`,`dstart`,`dend`,`type`) VALUES ('".$custom_day['post_id']."','$start','$end','include')"); + + $new_days_str .= $start.':'.$end.','; + } + + $new_days_str = trim($new_days_str, ', '); + + $this->db->q("UPDATE `#__mec_events` SET `days`='".$new_days_str."' WHERE `post_id`='".$custom_day['post_id']."'"); + update_post_meta($custom_day['post_id'], 'mec_in_days', $new_days_str); + } + } + + public function version400() + { + // Add Columns + $this->db->q("ALTER TABLE `#__mec_dates` ADD `tstart` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `dend`;"); + $this->db->q("ALTER TABLE `#__mec_dates` ADD `tend` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `tstart`;"); + + // Add Indexes + $this->db->q("ALTER TABLE `#__mec_dates` ADD INDEX (`tstart`);"); + $this->db->q("ALTER TABLE `#__mec_dates` ADD INDEX (`tend`);"); + + // Drop Columns + $this->db->q("ALTER TABLE `#__mec_dates` DROP COLUMN `type`;"); + + // Reschedule + $this->reschedule(); + + // Scheduler Cron job + if(!wp_next_scheduled('mec_scheduler')) wp_schedule_event(time(), 'hourly', 'mec_scheduler'); + } + + public function version430() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['cancellation_notification'] = array + ( + 'status'=>'0', + 'subject'=>'Your booking is canceled.', + 'recipients'=>'', + 'send_to_admin'=>'1', + 'send_to_organizer'=>'0', + 'send_to_user'=>'0', + 'content'=>"Hi %%name%%, + + For your information, your booking for %%event_title%% at %%book_date%% is canceled. + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version446() + { + if(!wp_next_scheduled('mec_syncScheduler')) wp_schedule_event(time(), 'daily', 'mec_syncScheduler'); + } + + public function version461() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['user_event_publishing'] = array + ( + 'status'=>'0', + 'subject'=>'Your event gets published!', + 'recipients'=>'', + 'content'=>"Hello %%name%%, + + Your event gets published. You can check it below: + + %%event_title%% + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version490() + { + // Get Booking Posts + $bookings = get_posts(array( + 'post_type' => $this->main->get_book_post_type(), + 'numberposts' => '-1', + 'post_status' => 'any', + )); + + foreach($bookings as $id => $booking) + { + $event_id = get_post_meta($booking->ID, 'mec_event_id', true); + $location_id = get_post_meta($event_id, 'mec_location_id', true); + + if(!empty($location_id)) update_post_meta($booking->ID, 'mec_booking_location', $location_id); + } + } + + public function version505() + { + if(!wp_next_scheduled('mec_syncScheduler')) wp_schedule_event(time(), 'daily', 'mec_syncScheduler'); + } + + public function version551() + { + // Get Booking Posts + $bookings = get_posts(array( + 'post_type' => $this->main->get_book_post_type(), + 'numberposts' => '-1', + 'post_status' => 'any', + )); + + foreach($bookings as $id => $booking) + { + $event_id = get_post_meta($booking->ID, 'mec_event_id', true); + + $start_time_int = (int) get_post_meta($event_id, 'mec_start_day_seconds', true); + $end_time_int = (int) get_post_meta($event_id, 'mec_end_day_seconds', true); + + $start_time = gmdate('H:i:s', $start_time_int); + $end_time = gmdate('H:i:s', $end_time_int); + + $mec_date = get_post_meta($booking->ID, 'mec_date', true); + if(is_array($mec_date) and isset($mec_date['start']) and isset($mec_date['start']['date'])) $mec_date = $mec_date['start']['date'].':'.$mec_date['end']['date']; + + list($start_date, $end_date) = explode(':', $mec_date); + if(is_numeric($start_date) or is_numeric($end_date)) continue; + + $start_datetime = $start_date.' '.$start_time; + $end_datetime = $end_date.' '.$end_time; + + // Update MEC Date + update_post_meta($booking->ID, 'mec_date', strtotime($start_datetime).':'.strtotime($end_datetime)); + + $post_date = date('Y-m-d H:i:s', strtotime($start_datetime)); + $gmt_date = get_gmt_from_date($post_date); + + // Update Booking Date + wp_update_post(array( + 'ID' => $booking->ID, + 'post_date' => $post_date, + 'post_date_gmt' => $gmt_date, + )); + } + } + + public function version571() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + if(!isset($current['notifications']['booking_reminder'])) return; + if(isset($current['notifications']['booking_reminder']['hours'])) return; + + // Change Days to Hours + $days = explode(',', trim($current['notifications']['booking_reminder']['days'], ', ')); + + $hours = ''; + foreach($days as $day) + { + $hours .= ($day * 24).','; + } + + $current['notifications']['booking_reminder']['hours'] = trim($hours, ', '); + unset($current['notifications']['booking_reminder']['days']); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version5100() + { + $this->db->q("CREATE TABLE IF NOT EXISTS `#__mec_occurrences` ( + `id` int(10) UNSIGNED NOT NULL, + `post_id` int(10) UNSIGNED NOT NULL, + `occurrence` int(10) UNSIGNED NOT NULL, + `params` text COLLATE [:COLLATE:] + ) DEFAULT CHARSET=[:CHARSET:] COLLATE=[:COLLATE:];"); + + $this->db->q("ALTER TABLE `#__mec_occurrences` ADD PRIMARY KEY (`id`), ADD KEY `post_id` (`post_id`), ADD KEY `occurrence` (`occurrence`);"); + $this->db->q("ALTER TABLE `#__mec_occurrences` MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT;"); + } + + public function version5110() + { + $this->db->q("CREATE TABLE IF NOT EXISTS `#__mec_users` ( + `id` int(10) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `email` varchar(127) NOT NULL, + `reg` TEXT NULL DEFAULT NULL, + `created_at` datetime DEFAULT NULL, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP + ) DEFAULT CHARSET=[:CHARSET:] COLLATE=[:COLLATE:];"); + + $this->db->q("ALTER TABLE `#__mec_users` ADD PRIMARY KEY (`id`);"); + $this->db->q("ALTER TABLE `#__mec_users` MODIFY `id` int NOT NULL AUTO_INCREMENT;"); + $this->db->q("ALTER TABLE `#__mec_users` AUTO_INCREMENT=1000000;"); + $this->db->q("ALTER TABLE `#__mec_users` ADD UNIQUE KEY `email` (`email`);"); + } + + public function version5126() + { + $all = $this->db->select("SELECT * FROM `#__mec_users`", 'loadAssocList'); + $zeros = $this->db->select("SELECT * FROM `#__mec_users` WHERE `id`='0'", 'loadAssocList'); + + if(is_array($all) and !count($all)) + { + $this->db->q("DROP TABLE `#__mec_users`"); + $this->version5110(); + } + elseif(is_array($zeros) and count($zeros)) + { + $this->db->q("TRUNCATE `#__mec_users`"); + $this->db->q("ALTER TABLE `#__mec_users` CHANGE `email` `email` VARCHAR(127) NOT NULL;"); + $this->db->q("ALTER TABLE `#__mec_users` ADD PRIMARY KEY (`id`);"); + $this->db->q("ALTER TABLE `#__mec_users` MODIFY `id` int NOT NULL AUTO_INCREMENT;"); + $this->db->q("ALTER TABLE `#__mec_users` AUTO_INCREMENT=1000000;"); + $this->db->q("ALTER TABLE `#__mec_users` ADD UNIQUE KEY `email` (`email`);"); + } + else + { + $this->db->q("ALTER TABLE `#__mec_users` CHANGE `email` `email` VARCHAR(127) NOT NULL;"); + } + } + + public function version5135() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['booking_rejection'] = array + ( + 'status'=>'0', + 'subject'=>'Your booking got rejected!', + 'recipients'=>'', + 'send_to_admin'=>'0', + 'send_to_organizer'=>'1', + 'send_to_user'=>'1', + 'content'=>"Hi %%name%%, + + For your information, your booking for %%event_title%% at %%book_datetime%% is rejected. + + Regards, + %%blog_name%%" + ); + + $current['notifications']['event_soldout'] = array + ( + 'status'=>'0', + 'subject'=>'Your event is soldout!', + 'recipients'=>'', + 'send_to_admin'=>'1', + 'send_to_organizer'=>'1', + 'content'=>"Hi %%name%%, + + For your information, your %%event_title%% event at %%book_datetime%% is soldout. + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version5140() + { + // List of Capabilities + $capabilities = array('mec_bookings', 'mec_add_booking', 'mec_coupons', 'mec_report', 'mec_import_export', 'mec_settings'); + + // Update Capabilities + $this->update_capabilities($capabilities); + } + + public function version5160() + { + $mec = $this->db->select("SELECT * FROM `#__mec_users`", 'loadAssocList'); + if(is_array($mec) and !count($mec)) + { + $this->db->q("DROP TABLE `#__mec_users`"); + $this->version5110(); + } + + // Add Public Column + $this->db->q("ALTER TABLE `#__mec_dates` ADD `public` INT(4) UNSIGNED NOT NULL DEFAULT 1 AFTER `tend`;"); + } + + public function version5161() + { + // Add Public Column If Not Exists + if(!$this->db->columns('mec_dates', 'public')) + { + $this->db->q("ALTER TABLE `#__mec_dates` ADD `public` INT(4) UNSIGNED NOT NULL DEFAULT 1 AFTER `tend`;"); + } + } + + public function version5162() + { + $this->version5161(); + } + + public function version5170() + { + // List of Capabilities + $capabilities = array('mec_shortcodes', 'mec_settings'); + + // Update Capabilities + $this->update_capabilities($capabilities); + } + + public function version5171() + { + $this->version5170(); + $this->reschedule(); + } + + public function version5191() + { + $this->version5170(); + } + + public function version5220() + { + // All Events + $events = $this->main->get_events(); + + foreach($events as $event) + { + $start_time_hour = get_post_meta($event->ID, 'mec_start_time_hour', true); + $start_time_minutes = get_post_meta($event->ID, 'mec_start_time_minutes', true); + $start_time_ampm = get_post_meta($event->ID, 'mec_start_time_ampm', true); + $end_time_hour = get_post_meta($event->ID, 'mec_end_time_hour', true); + $end_time_minutes = get_post_meta($event->ID, 'mec_end_time_minutes', true); + $end_time_ampm = get_post_meta($event->ID, 'mec_end_time_ampm', true); + + $day_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($start_time_hour, $start_time_ampm), $start_time_minutes); + $day_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($end_time_hour, $end_time_ampm), $end_time_minutes); + + update_post_meta($event->ID, 'mec_start_day_seconds', $day_start_seconds); + update_post_meta($event->ID, 'mec_end_day_seconds', $day_end_seconds); + } + } + + public function version600() + { + $this->db->q("CREATE TABLE IF NOT EXISTS `#__mec_bookings` ( + `id` int UNSIGNED NOT NULL, + `booking_id` int UNSIGNED NOT NULL, + `event_id` int UNSIGNED NOT NULL, + `ticket_ids` varchar(255) NOT NULL, + `status` varchar(20) NOT NULL DEFAULT 'pending', + `confirmed` tinyint NOT NULL DEFAULT '0', + `verified` tinyint NOT NULL DEFAULT '0', + `all_occurrences` tinyint NOT NULL DEFAULT '0', + `date` datetime NOT NULL, + `timestamp` int UNSIGNED NOT NULL + ) DEFAULT CHARSET=[:CHARSET:] COLLATE=[:COLLATE:];"); + + $this->db->q("ALTER TABLE `#__mec_bookings` ADD PRIMARY KEY (`id`);"); + $this->db->q("ALTER TABLE `#__mec_bookings` MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT;"); + $this->db->q("ALTER TABLE `#__mec_bookings` ADD KEY `event_id` (`event_id`,`ticket_ids`,`status`,`confirmed`,`verified`,`date`);"); + $this->db->q("ALTER TABLE `#__mec_bookings` ADD KEY `booking_id` (`booking_id`);"); + $this->db->q("ALTER TABLE `#__mec_bookings` ADD KEY `timestamp` (`timestamp`);"); + $this->db->q("ALTER TABLE `#__mec_bookings` ADD `transaction_id` VARCHAR(20) NULL AFTER `booking_id`;"); + + $this->db->q("ALTER TABLE `#__mec_bookings` ADD `user_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `booking_id`;"); + $this->db->q("ALTER TABLE `#__mec_bookings` ADD INDEX (`user_id`);"); + + // Get Booking Posts + $bookings = get_posts(array( + 'post_type' => $this->main->get_book_post_type(), + 'numberposts' => '-1', + 'post_status' => 'any', + )); + + // Booking Record + $bookingRecord = $this->getBookingRecord(); + + // Add Records for Existing Bookings + foreach($bookings as $booking) $bookingRecord->insert($booking); + } + + public function version626() + { + if(!$this->getPRO()) return; + + // Get Options + $options = get_option('mec_options'); + $code = $options['purchase_code'] ?? ''; + $item_id = $options['product_id'] ?? ''; + $url = get_home_url(); + + $reActivationOption = get_option('reActivationOption'); + if(empty($code) || $reActivationOption) return; + + if(!$reActivationOption) + { + $verify_url = MEC_API_ACTIVATION . '/activation/verify?category=mec&license=' . $code . '&url=' . $url . '&item_id=' . $item_id; + $JSON = wp_remote_retrieve_body(wp_remote_get($verify_url, array( + 'body' => null, + 'timeout' => '120', + 'redirection' => '10', + 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', + ))); + + if($JSON != '') + { + $data = json_decode($JSON); + if($data and isset($data->item_link)) + { + $options['product_id'] = $data->item_id; + + update_option('mec_license_status', 'active'); + update_option('mec_options', $options); + update_option('reActivationOption', '1'); + } + else + { + update_option('mec_license_status', 'faild'); + update_option('reActivationOption', '1'); + } + } + else update_option('reActivationOption', '1'); + } + } + + public function version640() + { + $this->db->q("ALTER TABLE `#__mec_dates` ADD `status` VARCHAR(20) NOT NULL DEFAULT 'publish' AFTER `tend`;"); + } + + public function version653() + { + $this->db->q("ALTER TABLE `#__mec_bookings` CHANGE `ticket_ids` `ticket_ids` VARCHAR(655) NOT NULL;"); + } + + public function version6611() + { + // Add Seats Columns If Not Exists + if(!$this->db->columns('mec_bookings', 'seats')) + { + $this->db->q("ALTER TABLE `#__mec_bookings` ADD `seats` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `ticket_ids`;"); + + // Booking Records + $bookings = $this->db->select("SELECT `id`, `ticket_ids` FROM `#__mec_bookings` ORDER BY `date` DESC LIMIT 2000", 'loadObjectList'); + foreach($bookings as $booking) + { + $ticket_ids = trim($booking->ticket_ids, ', '); + $seats = substr_count($ticket_ids, ',') + 1; + + $this->db->q("UPDATE `#__mec_bookings` SET `seats`='".esc_sql($seats)."' WHERE `id`=".esc_sql($booking->id)); + } + } + } + + public function version675() + { + $bookings = get_posts([ + 'post_type' => $this->main->get_book_post_type(), + 'numberposts' => 300, + 'post_status' => 'publish' + ]); + + // MEC Booking + $book = $this->getBook(); + + foreach($bookings as $booking) + { + $price = get_post_meta($booking->ID, 'mec_price', true); + + // Payable Data Exists + $existing_payable = get_post_meta($booking->ID, 'mec_payable', true); + if($existing_payable) continue; + + update_post_meta($booking->ID, 'mec_payable', $price); + + $transaction_id = get_post_meta($booking->ID, 'mec_transaction_id', true); + $transaction = $book->get_transaction($transaction_id); + + if(isset($transaction['price'])) + { + $transaction['price_details']['payable'] = $transaction['price']; + $transaction['payable'] = $transaction['price']; + + $book->update_transaction($transaction_id, $transaction); + } + } + } + + public function version6835() + { + if(!wp_next_scheduled('mec_maintenance')) wp_schedule_event(time(), 'daily', 'mec_maintenance'); + } + + public function version700() + { + // Table already exists + if($this->db->exists('mec_booking_attendees')) return; + + $this->db->q("CREATE TABLE IF NOT EXISTS `#__mec_booking_attendees` ( + `id` int UNSIGNED NOT NULL, + `mec_booking_id` int UNSIGNED NOT NULL, + `user_id` int UNSIGNED NOT NULL, + `ticket_id` int UNSIGNED NOT NULL + ) CHARSET=[:CHARSET:] COLLATE=[:COLLATE:];"); + + $this->db->q("ALTER TABLE `#__mec_booking_attendees` ADD PRIMARY KEY (`id`);"); + $this->db->q("ALTER TABLE `#__mec_booking_attendees` ADD KEY `mec_booking_id` (`mec_booking_id`);"); + $this->db->q("ALTER TABLE `#__mec_booking_attendees` MODIFY `id` int UNSIGNED NOT NULL AUTO_INCREMENT;"); + $this->db->q("ALTER TABLE `#__mec_booking_attendees` ADD CONSTRAINT `mec_booking_id` FOREIGN KEY (`mec_booking_id`) REFERENCES `#__mec_bookings`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;"); + } + + public function version720() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $current['notifications']['certificate_send'] = array + ( + 'status'=>'1', + 'subject'=>'Event Attendee Certificates', + 'recipients'=>'', + 'content'=>"Hi %%name%%, + + Congratulations for successfully attending / completing the event %%event_title%%. + Click the following link to download or print your PDF certificate. + + %%certificate_link%% + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version740() + { + $settings = $this->main->get_settings(); + + // Speaker Status + if(isset($settings['speakers_status']) && $settings['speakers_status']) + { + $speakers = get_terms('mec_speaker', [ + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => '0', + ]); + + $i = 1; + foreach($speakers as $speaker) + { + update_term_meta($speaker->term_id, 'mec_index', $i); + } + } + } + + public function version7110() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) && trim($current) == '') $current = []; + + // Booking Moved Notification + $current['notifications']['booking_moved'] = array + ( + 'status'=>'0', + 'subject'=>'Your booking has been rescheduled', + 'recipients'=>'', + 'content'=>"Hi %%name%%, + + We are writing to inform you that your booking for %%event_title%%, %%book_datetime_prev%% has been moved to a new date. Please find the updated booking details below: + + New Booking Details: + + Event/Service Name: %%event_title%% + New Date: %%book_date%% + New Time: %%book_time%% + + We apologize for any inconvenience this may cause and appreciate your understanding. If the new date and time do not work for you, you can cancel the booking using following link: + + %%cancellation_link%% + + Regards, + %%blog_name%%" + ); + + // Suggest Event Notification + $current['notifications']['suggest_event'] = array + ( + 'subject'=>"Discover more events you'll love!", + 'recipients'=>'', + 'content'=>"Hi %%name%%, + + We thought you'd be interested in the following event coming up that we think you'll love. + + %%event_title%% + %%event_description%% + + You can find more details and book your tickets on our website: %%event_link%% + + Regards, + %%blog_name%%" + ); + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } + + public function version7130() + { + // Get current MEC options + $current = get_option('mec_options', array()); + if(is_string($current) && trim($current) == '') $current = []; + + $settings = $current['settings'] ?? []; + + $trash_interval = isset($settings['events_trash_interval']) ? (int) $settings['events_trash_interval'] : 0; + $purge_interval = isset($settings['events_purge_interval']) ? (int) $settings['events_purge_interval'] : 0; + + if($trash_interval && $trash_interval <= 36) $trash_interval = $trash_interval * 30; + if($purge_interval && $purge_interval <= 36) $purge_interval = $purge_interval * 30; + + $current['settings']['events_trash_interval'] = $trash_interval; + $current['settings']['events_purge_interval'] = $purge_interval; + + // Update it only if options already exists. + if(get_option('mec_options') !== false) + { + // Save new options + update_option('mec_options', $current); + } + } +} diff --git a/app/features/userevents.php b/app/features/userevents.php new file mode 100755 index 0000000..6587aa5 --- /dev/null +++ b/app/features/userevents.php @@ -0,0 +1,84 @@ + + */ +class MEC_feature_userevents extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + } + + /** + * Initialize User Events Feature + * @author Webnus + */ + public function init() + { + // User Events Shortcode + $this->factory->shortcode('MEC_userevents', [$this, 'output']); + } + + /** + * Show user events + * @param array $atts + * @return string + */ + public function output($atts = array()) + { + // Show login/register message if user is not logged in and guest submission is not enabled. + if(!is_user_logged_in()) + { + // Show message + $message = sprintf(esc_html__('Please %s/%s in order to see your own events.', 'modern-events-calendar-lite'), ''.esc_html__('Login', 'modern-events-calendar-lite').'', ''.esc_html__('Register', 'modern-events-calendar-lite').''); + + return '
    +

    '.MEC_kses::element($message).'

    +
    '; + } + + // Render Library + $render = $this->getRender(); + + // Settings + $settings = $this->main->get_settings(); + + $shortcode_id = isset($settings['userevents_shortcode']) && trim($settings['userevents_shortcode']) ? $settings['userevents_shortcode'] : NULL; + + $atts = apply_filters('mec_calendar_atts', $render->parse($shortcode_id, [ + 'author' => get_current_user_id() + ])); + + $skin = $atts['skin'] ?? 'monthly_view'; + if(!in_array($skin, ['monthly_view', 'daily_view', 'weekly_view', 'list', 'grid', 'agenda'])) + { + return '
    +

    '.esc_html__('Invalid Skin!', 'modern-events-calendar-lite').'

    +
    '; + } + + return $render->skin($skin, $atts); + } +} \ No newline at end of file diff --git a/app/features/wc.php b/app/features/wc.php new file mode 100755 index 0000000..4aea533 --- /dev/null +++ b/app/features/wc.php @@ -0,0 +1,302 @@ + + */ +class MEC_feature_wc extends MEC_base +{ + /** + * @var MEC_factory + */ + public $factory; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var array + */ + public $settings; + + /** + * @var array + */ + public $ml_settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // General Options + $this->settings = $this->main->get_settings(); + + // MEC Multilingual Settings + $this->ml_settings = $this->main->get_ml_settings(); + } + + /** + * Initialize + * @author Webnus + */ + public function init() + { + // Pro version is required + if(!$this->getPRO()) return; + + // WC Hooks + if(isset($this->settings['wc_status']) and $this->settings['wc_status']) $this->factory->action('init', array($this, 'hooks')); + } + + public function hooks() + { + // WooCommerce is not installed + if(!class_exists('WooCommerce')) return; + + // WC library + $wc = $this->getWC(); + + // WooCommerce + $this->factory->action('woocommerce_order_status_completed', array($wc, 'completed')); + $this->factory->action('woocommerce_thankyou', array($wc, 'paid')); + $this->factory->action('woocommerce_new_order_item', array($wc, 'meta'), 10, 2); + $this->factory->action('woocommerce_order_status_cancelled', array($wc, 'cancelled')); + $this->factory->action('woocommerce_order_status_refunded', array($wc, 'cancelled')); + $this->factory->action('woocommerce_after_checkout_validation', array($this, 'validate'),10,2); + $this->factory->action('wp', [$this, 'single_product_page']); + + $this->factory->filter('woocommerce_order_item_display_meta_key', array($this, 'display_key'), 10, 2); + $this->factory->filter('woocommerce_order_item_display_meta_value', array($this, 'display_value'), 10, 2); + $this->factory->filter('woocommerce_cart_item_name', array($this, 'display_name'), 10, 2); + $this->factory->filter('woocommerce_cart_item_thumbnail', array($this, 'display_thumbnail'), 10, 2); + $this->factory->filter('woocommerce_quantity_input_args', array($this, 'adjust_quantity'), 10, 2); + } + + public function display_key($display_key, $meta) + { + if($meta->key == 'mec_event_id') $display_key = esc_html__('Event', 'modern-events-calendar-lite'); + elseif($meta->key == 'mec_date') $display_key = esc_html__('Date', 'modern-events-calendar-lite'); + elseif($meta->key == 'mec_other_dates') $display_key = esc_html__('Other Dates', 'modern-events-calendar-lite'); + elseif($meta->key == 'mec_transaction_id') $display_key = esc_html__('Transaction ID', 'modern-events-calendar-lite'); + + return $display_key; + } + + public function display_value($display_value, $meta) + { + if($meta->key == 'mec_event_id') $display_value = ''.get_the_title($meta->value).''; + elseif($meta->key == 'mec_transaction_id') $display_value = $meta->value; + elseif($meta->key == 'mec_date') + { + $date_format = (isset($this->ml_settings['booking_date_format1']) and trim($this->ml_settings['booking_date_format1'])) ? $this->ml_settings['booking_date_format1'] : 'Y-m-d'; + $time_format = get_option('time_format'); + + if(strpos($date_format, 'h') !== false or strpos($date_format, 'H') !== false or strpos($date_format, 'g') !== false or strpos($date_format, 'G') !== false) $datetime_format = $date_format; + else $datetime_format = $date_format.' '.$time_format; + + $dates = explode(':', $meta->value); + + $start_datetime = date_i18n($datetime_format, $dates[0]); + $end_datetime = date_i18n($datetime_format, $dates[1]); + + $display_value = sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $start_datetime, $end_datetime); + } + elseif($meta->key == 'mec_other_dates') + { + $date_format = (isset($this->ml_settings['booking_date_format1']) and trim($this->ml_settings['booking_date_format1'])) ? $this->ml_settings['booking_date_format1'] : 'Y-m-d'; + $time_format = get_option('time_format'); + + if(strpos($date_format, 'h') !== false or strpos($date_format, 'H') !== false or strpos($date_format, 'g') !== false or strpos($date_format, 'G') !== false) $datetime_format = $date_format; + else $datetime_format = $date_format.' '.$time_format; + + $dates = (is_array($meta->value) ? $meta->value : explode(',', $meta->value)); + + $date_values = []; + foreach($dates as $date) + { + if(!trim($date)) continue; + + $timestamps = explode(':', $date); + if(!isset($timestamps[0]) or !isset($timestamps[1])) continue; + + $start_datetime = date_i18n($datetime_format, $timestamps[0]); + $end_datetime = date_i18n($datetime_format, $timestamps[1]); + + $date_values[] = sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $start_datetime, $end_datetime); + } + + $display_value = implode('
    ', $date_values); + } + + return $display_value; + } + + public function display_name($name, $item) + { + if(!isset($item['mec_event_id']) or !trim($item['mec_event_id'])) return $name; + if(!isset($item['mec_date']) or !trim($item['mec_date'])) return $name; + + $date_format = (isset($this->ml_settings['booking_date_format1']) and trim($this->ml_settings['booking_date_format1'])) ? $this->ml_settings['booking_date_format1'] : get_option('date_format'); + $other_dates = (isset($item['mec_other_dates']) and is_array($item['mec_other_dates'])) ? $item['mec_other_dates'] : []; + + $dates = array_merge(array($item['mec_date']), $other_dates); + + $formatted_dates = []; + foreach($dates as $d) + { + $timestamps = explode(':', $d); + $formatted_dates[] = date_i18n($date_format, $timestamps[0]); + } + + $name .= ' ('.implode(', ', $formatted_dates).')'; + return $name; + } + + public function display_thumbnail($image, $item) + { + if(!isset($item['mec_event_id']) or !trim($item['mec_event_id'])) return $image; + if(!isset($item['product_id']) or !trim($item['product_id'])) return $image; + + $product_id = $item['product_id']; + if(has_post_thumbnail($product_id)) return $image; + + $event_id = $item['mec_event_id']; + if(has_post_thumbnail($event_id)) return get_the_post_thumbnail($event_id); + + return $image; + } + + public function validate($data, $errors) + { + // Cart Items + $items = WC()->cart->get_cart(); + + // Book + $book = $this->getBook(); + + $printed = false; + $all_items = []; + foreach($items as $item) + { + $event_id = $item['mec_event_id'] ?? NULL; + if(!$event_id) continue; + + $product_id = $item['product_id'] ?? NULL; + $mec_ticket = get_post_meta($product_id, 'mec_ticket', true); + + $ex = explode(':', $mec_ticket); + $ticket_id = $ex[1] ?? NULL; + if(!$ticket_id) continue; + + $date = $item['mec_date'] ?? NULL; + $timestamps = explode(':', $date); + $timestamp = $timestamps[0]; + + $other_dates = (isset($item['mec_other_dates']) and is_array($item['mec_other_dates'])) ? $item['mec_other_dates'] : []; + $all_dates = array_merge([$date], $other_dates); + + $quantity = $item['quantity'] ?? 1; + if(count($all_dates) > 1 && $quantity % count($all_dates) === 0) $quantity = $quantity / count($all_dates); + + if(!isset($all_items[$event_id])) $all_items[$event_id] = []; + if(!isset($all_items[$event_id][$ticket_id])) $all_items[$event_id][$ticket_id] = []; + + if(!isset($all_items[$event_id][$ticket_id][$timestamp])) $all_items[$event_id][$ticket_id][$timestamp] = $quantity; + else $all_items[$event_id][$ticket_id][$timestamp] += $quantity; + + $availability = $book->get_tickets_availability($event_id, $timestamp); + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + // Ticket is not available + if(!isset($availability[$ticket_id]) or ($availability[$ticket_id] != -1 and $availability[$ticket_id] < $quantity)) + { + $printed = true; + if($availability[$ticket_id] == '0') $errors->add('validation', sprintf(esc_html__('%s ticket is sold out!', 'modern-events-calendar-lite'), $tickets[$ticket_id]['name'])); + else $errors->add('validation', sprintf(esc_html__('Only %s slots remained for %s ticket so you cannot book %s ones.', 'modern-events-calendar-lite'), $availability[$ticket_id], $tickets[$ticket_id]['name'], $quantity)); + } + } + + // Error already printed + if($printed) return; + + foreach($all_items as $event_id => $tickets) + { + // User Booking Limits + list($limit, $unlimited) = $book->get_user_booking_limit($event_id); + + $total_quantity = 0; + foreach($tickets as $ticket_id => $timestamps) + { + foreach($timestamps as $timestamp => $quantity) + { + $availability = $book->get_tickets_availability($event_id, $timestamp); + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $total_quantity += $quantity; + + // Ticket is not available + if(!isset($availability[$ticket_id]) or ($availability[$ticket_id] != -1 and $availability[$ticket_id] < $quantity)) + { + if($availability[$ticket_id] == '0') $errors->add('validation', sprintf(esc_html__('%s ticket is sold out!', 'modern-events-calendar-lite'), $tickets[$ticket_id]['name'])); + else $errors->add('validation', sprintf(esc_html__('Only %s slots remained for %s ticket so you cannot book %s ones.', 'modern-events-calendar-lite'), $availability[$ticket_id], $tickets[$ticket_id]['name'], $quantity)); + } + } + } + + // Take Care of User Limit + if(!$unlimited and $total_quantity > $limit) + { + $errors->add('validation', sprintf($this->main->m('booking_restriction_message3', esc_html__("Maximum allowed number of tickets that you can book is %s.", 'modern-events-calendar-lite')), $limit)); + } + } + } + + /** + * @param $args + * @param WC_Product $product + * @return mixed + */ + public function adjust_quantity($args, $product) + { + $mec_product = get_post_meta($product->get_id(), 'mec_ticket', true); + + // Make the quantity input as read-only so nobody can change its value + if($mec_product and isset($args['input_value']) and is_numeric($args['input_value'])) + { + $args['min_value'] = $args['input_value']; + $args['max_value'] = $args['input_value']; + } + + return $args; + } + + public function single_product_page() + { + // WooCommerce Product + if(is_product()) + { + global $post; + + // MEC Product + $is_mec = get_post_meta($post->ID, 'mec_ticket', true); + if($is_mec) + { + global $wp_query; + $wp_query->set_404(); + status_header(404); + } + } + } +} diff --git a/app/features/webhooks.php b/app/features/webhooks.php new file mode 100755 index 0000000..816e659 --- /dev/null +++ b/app/features/webhooks.php @@ -0,0 +1,361 @@ + + */ +class MEC_feature_webhooks extends MEC_base +{ + public $factory; + public $main; + public $PT; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Factory + $this->factory = $this->getFactory(); + + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Webhook Post Type Name + $this->PT = $this->main->get_webhook_post_type(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Initialize Webhooks feature + * @author Webnus + */ + public function init() + { + // PRO Version is required + if(!$this->getPRO()) return false; + + // Show Webhook feature only if module is enabled + if(!isset($this->settings['webhooks_status']) or (isset($this->settings['webhooks_status']) and !$this->settings['webhooks_status'])) return false; + + $this->factory->action('init', [$this, 'register_post_type']); + $this->factory->action('save_post', [$this, 'save_webhook'], 10); + $this->factory->action('add_meta_boxes', [$this, 'register_meta_boxes'], 1); + + // Webhooks + foreach([ + 'mec_booking_confirmed', + 'mec_booking_verified', + 'mec_booking_added', + 'mec_booking_rejected', + 'mec_booking_canceled', + 'mec_booking_refunded', + ] as $hook) $this->factory->action($hook, function($booking_id) use ($hook) { + return $this->webhook_booking($booking_id, $hook); + }, 999); + + return true; + } + + /** + * Registers email post type + * @author Webnus + */ + public function register_post_type() + { + $singular_label = esc_html__('Webhook', 'modern-events-calendar-lite'); + $plural_label = esc_html__('Webhooks', 'modern-events-calendar-lite'); + + $capability = 'manage_options'; + register_post_type($this->PT, + [ + 'labels'=>[ + 'name'=>$plural_label, + 'singular_name'=>$singular_label, + 'add_new'=>sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'add_new_item'=>sprintf(esc_html__('Add %s', 'modern-events-calendar-lite'), $singular_label), + 'not_found'=>sprintf(esc_html__('No %s found!', 'modern-events-calendar-lite'), strtolower($plural_label)), + 'all_items'=>$plural_label, + 'edit_item'=>sprintf(esc_html__('Edit %s', 'modern-events-calendar-lite'), $plural_label), + 'not_found_in_trash'=>sprintf(esc_html__('No %s found in Trash!', 'modern-events-calendar-lite'), strtolower($singular_label)) + ], + 'public'=>false, + 'show_ui'=>(current_user_can($capability) ? true : false), + 'show_in_menu'=>false, + 'show_in_admin_bar'=>false, + 'show_in_nav_menus'=>false, + 'has_archive'=>false, + 'exclude_from_search'=>true, + 'publicly_queryable'=>false, + 'supports'=>['title'], + 'capabilities'=> [ + 'read'=>$capability, + 'read_post'=>$capability, + 'read_private_posts'=>$capability, + 'create_post'=>$capability, + 'create_posts'=>$capability, + 'edit_post'=>$capability, + 'edit_posts'=>$capability, + 'edit_private_posts'=>$capability, + 'edit_published_posts'=>$capability, + 'edit_others_posts'=>$capability, + 'publish_posts'=>$capability, + 'delete_post'=>$capability, + 'delete_posts'=>$capability, + 'delete_private_posts'=>$capability, + 'delete_published_posts'=>$capability, + 'delete_others_posts'=>$capability, + ], + ] + ); + } + + /** + * Registers meta boxes + * @author Webnus + */ + public function register_meta_boxes() + { + add_meta_box('mec_webhook_metabox_details', esc_html__('Details', 'modern-events-calendar-lite'), [$this, 'meta_box_details'], $this->PT, 'normal', 'high'); + } + + public function meta_box_details($post) + { + $path = MEC::import('app.features.webhooks.details', true, true); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Save webhook data from backend + * @author Webnus + * @param int $post_id + * @return void + */ + public function save_webhook($post_id) + { + // Check if our nonce is set. + if(!isset($_POST['mec_webhook_nonce'])) return; + + // Verify that the nonce is valid. + if(!wp_verify_nonce(sanitize_text_field($_POST['mec_webhook_nonce']), 'mec_webhook_data')) return; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if(defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return; + + // MEC Data + $mec = (isset($_POST['mec']) and is_array($_POST['mec'])) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + // All Options + update_post_meta($post_id, 'mec', $mec); + + update_post_meta($post_id, 'mec_hook', isset($mec['hook']) ? sanitize_text_field($mec['hook']) : ''); + update_post_meta($post_id, 'mec_url', isset($mec['url']) ? sanitize_url($mec['url']) : ''); + update_post_meta($post_id, 'mec_method', isset($mec['method']) ? strtoupper(sanitize_text_field($mec['method'])) : 'POST'); + } + + public function webhook_booking($booking_id, $hook) + { + // Get Webhooks to Call + $webhooks = $this->get($hook); + + // No Webhooks + if(!is_array($webhooks) or (is_array($webhooks) and !count($webhooks))) return; + + // Booking Data + $data = $this->booking_data($booking_id); + + // Call Webhooks + foreach($webhooks as $webhook) + { + $method = strtoupper(get_post_meta($webhook->ID, 'mec_method', true)); + $url = get_post_meta($webhook->ID, 'mec_url', true); + + // Prepare Headers + $headers = apply_filters('mec_webhooks_headers', [], $webhook, $url); + + if($method === 'GET') + { + wp_remote_get($url, apply_filters('mec_webhooks_args', [ + 'headers' => $headers, + 'body' => $data + ])); + } + else + { + wp_remote_post($url, apply_filters('mec_webhooks_args', [ + 'headers' => $headers, + 'body' => $data + ])); + } + } + } + + public function get($hook) + { + return get_posts([ + 'post_type' => $this->PT, + 'status' => 'publish', + 'numberposts' => -1, + 'meta_key' => 'mec_hook', + 'meta_value' => $hook, + ]); + } + + public function booking_data($booking_id) + { + // MEC User + $u = $this->getUser(); + + // MEC Booking + $b = $this->getBook(); + + $event_id = get_post_meta($booking_id, 'mec_event_id', true); + $transaction_id = get_post_meta($booking_id, 'mec_transaction_id', true); + $order_time = get_post_meta($booking_id, 'mec_booking_time', true); + $tickets = get_post_meta($event_id, 'mec_tickets', true); + $timestamps = explode(':', get_post_meta($booking_id, 'mec_date', true)); + + $attendees = get_post_meta($booking_id, 'mec_attendees', true); + + $booker = $u->booking($booking_id); + + $confirmed = $this->main->get_confirmation_label(get_post_meta($booking_id, 'mec_confirmed', true)); + $verified = $this->main->get_verification_label(get_post_meta($booking_id, 'mec_verified', true)); + $transaction = $b->get_transaction($transaction_id); + + // Date & Time Format + $datetime_format = get_option('date_format').' '.get_option('time_format'); + + $other_dates_formatted = []; + + $other_dates = (isset($transaction['other_dates']) and is_array($transaction['other_dates'])) ? $transaction['other_dates'] : []; + foreach($other_dates as $other_date) + { + $other_timestamps = explode(':', $other_date); + $other_dates_formatted[] = [ + date($datetime_format, $other_timestamps[0]), + date($datetime_format, $other_timestamps[1]) + ]; + } + + $reg_fields = $this->main->get_reg_fields($event_id); + $bfixed_fields = $this->main->get_bfixed_fields($event_id); + + $bfixed_data = []; + $bfixed_values = (isset($transaction['fields']) and is_array($transaction['fields'])) ? $transaction['fields'] : []; + foreach($bfixed_fields as $bfixed_field_id => $bfixed_field) + { + if(!is_numeric($bfixed_field_id)) continue; + + $bfixed_label = isset($bfixed_field['label']) ? $bfixed_field['label'] : ''; + if(trim($bfixed_label) == '') continue; + + $bfixed_data[] = [ + 'label' => $bfixed_label, + 'value' => isset($bfixed_values[$bfixed_field_id]) ? ((is_string($bfixed_values[$bfixed_field_id]) and trim($bfixed_values[$bfixed_field_id])) ? stripslashes($bfixed_values[$bfixed_field_id]) : (is_array($bfixed_values[$bfixed_field_id]) ? implode(' | ', $bfixed_values[$bfixed_field_id]) : '---')) : '' + ]; + } + + $attendees_data = []; + foreach($attendees as $key => $attendee) + { + if($key === 'attachments') continue; + if(isset($attendee[0]['MEC_TYPE_OF_DATA'])) continue; + + $variations = []; + if(isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + $ticket_variations = $this->main->ticket_variations($event_id, $attendee['id']); + foreach($attendee['variations'] as $a_variation_id => $a_variation_count) + { + if((int) $a_variation_count > 0) + { + $variations[] = [ + 'id' => $a_variation_id, + 'title' => isset($ticket_variations[$a_variation_id]) ? $ticket_variations[$a_variation_id]['title'] : 'N/A', + 'count' => $a_variation_count, + ]; + } + } + } + + $raw_price = $b->get_ticket_total_price($transaction, $attendee, $booking_id); + $rendered_price = $this->main->render_price($raw_price, $event_id); + + $ticket_id = isset($attendee['id']) ? $attendee['id'] : get_post_meta($booking_id, 'mec_ticket_id', true); + + $reg_data = []; + $reg_form = isset($attendee['reg']) ? $attendee['reg'] : []; + foreach($reg_fields as $field_id=>$reg_field) + { + // Placeholder Keys + if(!is_numeric($field_id)) continue; + + $type = isset($reg_field['type']) ? $reg_field['type'] : ''; + $label = isset($reg_field['label']) ? esc_html__($reg_field['label'], 'modern-events-calendar-lite') : ''; + + if(trim($label) == '' or $type == 'name' or $type == 'mec_email') continue; + + $reg_data[] = [ + 'label' => $label, + 'value' => isset($reg_form[$field_id]) ? ((is_string($reg_form[$field_id]) and trim($reg_form[$field_id])) ? stripslashes($reg_form[$field_id]) : (is_array($reg_form[$field_id]) ? implode(' | ', $reg_form[$field_id]) : '---')) : '', + ]; + } + + $attendees_data[] = [ + 'name' => isset($attendee['name']) ? $attendee['name'] : (isset($booker->first_name) ? trim($booker->first_name.' '.$booker->last_name) : ''), + 'email' => isset($attendee['email']) ? $attendee['email'] : @$booker->user_email, + 'ticket' => [ + 'id' => $ticket_id, + 'name' => isset($tickets[$ticket_id], $tickets[$ticket_id]['name']) ? $tickets[$ticket_id]['name'] : esc_html__('Unknown', 'modern-events-calendar-lite') + ], + 'price' => $raw_price, + 'price_rendered' => $rendered_price, + 'fields' => $reg_data, + 'variations' => $variations + ]; + } + + return [ + 'id' => $booking_id, + 'event' => [ + 'id' => $event_id, + 'title' => get_the_title($event_id), + ], + 'start' => date($datetime_format, $timestamps[0]), + 'end' => date($datetime_format, $timestamps[1]), + 'other_dates' => $other_dates_formatted, + 'order_time' => date($datetime_format, strtotime($order_time)), + 'attendees' => $attendees_data, + 'transaction_id' => $transaction_id, + 'gateway' => [ + 'key' => get_post_meta($booking_id, 'mec_gateway', true), + 'label' => get_post_meta($booking_id, 'mec_gateway_label', true), + 'ref_id' => get_post_meta($booking_id, 'mec_gateway_ref_id', true) + ], + 'confirmation' => [ + 'key' => get_post_meta($booking_id, 'mec_confirmed', true), + 'label' => $confirmed + ], + 'verification' => [ + 'key' => get_post_meta($booking_id, 'mec_verified', true), + 'label' => $verified + ], + 'fields' => $bfixed_data, + 'price' => [ + 'price' => get_post_meta($booking_id, 'mec_price', true), + 'payable' => get_post_meta($booking_id, 'mec_payable', true), + 'coupon' => get_post_meta($booking_id, 'mec_coupon_code', true), + ], + ]; + } +} \ No newline at end of file diff --git a/app/features/webhooks/details.php b/app/features/webhooks/details.php new file mode 100755 index 0000000..48115f4 --- /dev/null +++ b/app/features/webhooks/details.php @@ -0,0 +1,39 @@ +ID, 'mec_hook', true); +$method = get_post_meta($post->ID, 'mec_method', true); +$url = get_post_meta($post->ID, 'mec_url', true); +?> +
    +
    +

    + +
    + +
    +

    + + + +

    +
    + + +
    \ No newline at end of file diff --git a/app/index.html b/app/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/libraries/base.php b/app/libraries/base.php new file mode 100755 index 0000000..92a657d --- /dev/null +++ b/app/libraries/base.php @@ -0,0 +1,326 @@ + + * @abstract + */ +abstract class MEC_base extends MEC +{ + /** + * Returns MEC_db instance + * @final + * @author Webnus + * @return MEC_db instance + */ + final public function getDB() + { + return MEC::getInstance('app.libraries.db'); + } + + /** + * Returns MEC_file instance + * @final + * @author Webnus + * @return MEC_file instance + */ + final public function getFile() + { + return MEC::getInstance('app.libraries.filesystem', 'MEC_file'); + } + + /** + * Returns MEC_folder instance + * @final + * @author Webnus + * @return MEC_folder instance + */ + final public function getFolder() + { + return MEC::getInstance('app.libraries.filesystem', 'MEC_folder'); + } + + /** + * Returns MEC_path instance + * @final + * @author Webnus + * @return MEC_path instance + */ + final public function getPath() + { + return MEC::getInstance('app.libraries.filesystem', 'MEC_path'); + } + + /** + * Returns MEC_main instance + * @final + * @author Webnus + * @return MEC_main instance + */ + final public function getMain() + { + return MEC::getInstance('app.libraries.main'); + } + + /** + * Returns MEC_factory instance + * @final + * @author Webnus + * @return MEC_factory instance + */ + final public function getFactory() + { + return MEC::getInstance('app.libraries.factory'); + } + + /** + * Returns MEC_render instance + * @final + * @author Webnus + * @return MEC_render instance + */ + final public function getRender() + { + return MEC::getInstance('app.libraries.render'); + } + + /** + * Returns MEC_parser instance + * @final + * @author Webnus + * @return MEC_parser instance + */ + final public function getParser() + { + return MEC::getInstance('app.libraries.parser'); + } + + /** + * Returns MEC_feed instance + * @final + * @author Webnus + * @return MEC_feed instance + */ + final public function getFeed() + { + return MEC::getInstance('app.libraries.feed'); + } + + /** + * Returns MEC_book instance + * @final + * @author Webnus + * @return MEC_book instance + */ + final public function getBook() + { + return MEC::getInstance('app.libraries.book'); + } + + /** + * Returns MEC_notifications instance + * @final + * @author Webnus + * @return MEC_notifications instance + */ + final public function getNotifications() + { + return MEC::getInstance('app.libraries.notifications'); + } + + /** + * Returns QRCode instance + * @final + * @author Webnus + * @return QRcode instance + */ + final public function getQRcode() + { + self::import('app.libraries.qrcode'); + return new QRcode(); + } + + /** + * Returns PRO instance + * @final + * @author Webnus + * @return MEC_pro instance + */ + final public function getPRO() + { + return MEC::getInstance('app.libraries.pro'); + } + + /** + * Returns PRO instance + * @final + * @author Webnus + * @return MEC_schedule instance + */ + final public function getSchedule() + { + return MEC::getInstance('app.libraries.schedule'); + } + + /** + * Returns PRO instance + * @final + * @author Webnus + * @return MEC_syncSchedule instance + */ + final public function getSyncSchedule() + { + return MEC::getInstance('app.libraries.syncSchedule'); + } + + /** + * Returns Cache instance + * @final + * @author Webnus + * @return MEC_cache instance + */ + final public function getCache() + { + MEC::import('app.libraries.cache'); + return MEC_cache::getInstance(); + } + + /** + * Returns WC instance + * @final + * @author Webnus + * @return MEC_wc instance + */ + final public function getWC() + { + return MEC::getInstance('app.libraries.wc'); + } + + /** + * Returns User instance + * @final + * @author Webnus + * @return MEC_user instance + */ + final public function getUser() + { + return MEC::getInstance('app.libraries.user'); + } + + /** + * Returns Form Builder instance + * @final + * @author Webnus + * @return MEC_formBuilder instance + */ + final public function getFormBuilder() + { + return MEC::getInstance('app.libraries.formBuilder'); + } + + /** + * Returns Event Fields instance + * @final + * @author Webnus + * @return MEC_eventFields instance + */ + final public function getEventFields() + { + return MEC::getInstance('app.libraries.eventFields'); + } + + /** + * Returns Search instance + * @final + * @author Webnus + * @return MEC_search instance + */ + final public function getSearch() + { + return MEC::getInstance('app.libraries.search'); + } + + /** + * Returns Ticket Variations instance + * @final + * @author Webnus + * @return MEC_ticketVariations instance + */ + final public function getTicketVariations() + { + return MEC::getInstance('app.libraries.ticketVariations'); + } + + /** + * Returns Booking Record instance + * @final + * @author Webnus + * @return MEC_bookingRecord instance + */ + final public function getBookingRecord() + { + return MEC::getInstance('app.libraries.bookingRecord'); + } + + /** + * Returns MEC Cart instance + * @final + * @author Webnus + * @return MEC_cart instance + */ + final public function getCart() + { + return MEC::getInstance('app.libraries.cart'); + } + + /** + * Returns Partial Payment instance + * @final + * @author Webnus + * @return MEC_partial instance + */ + final public function getPartialPayment() + { + return MEC::getInstance('app.libraries.partial'); + } + + /** + * Returns Captcha instance + * @final + * @author Webnus + * @return MEC_captcha instance + */ + final public function getCaptcha() + { + return MEC::getInstance('app.libraries.captcha'); + } + + /** + * Returns Tickets instance + * @final + * @author Webnus + * @return MEC_tickets instance + */ + final public function getTickets() + { + return MEC::getInstance('app.libraries.tickets'); + } + + /** + * @return MEC_meetup + */ + final public function getMeetup() + { + return MEC::getInstance('app.libraries.meetup'); + } + + /** + * @return MEC_restful + */ + final public function getRestful() + { + return MEC::getInstance('app.libraries.restful'); + } +} diff --git a/app/libraries/book.php b/app/libraries/book.php new file mode 100755 index 0000000..4567298 --- /dev/null +++ b/app/libraries/book.php @@ -0,0 +1,1946 @@ + + */ +class MEC_book extends MEC_base +{ + /** + * @var array + */ + public $settings; + + /** + * @var MEC_main + */ + public $main; + + /** + * Post Type Slug + * @var string + */ + public $PT; + + /** + * @var MEC_partial + */ + public $partial_payment; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Book Post Type Name + $this->PT = $this->main->get_book_post_type(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // MEC Partial Payment + $this->partial_payment = $this->getPartialPayment(); + } + + /** + * Get invoice (Ticket price + Fees) based on tickets + * @param array $tickets + * @param int $event_id + * @param array $event_tickets + * @param array $variations + * @param array $timestamps + * @param boolean $apply_fees + * @return array + * @author Webnus + */ + public function get_price_details($tickets, $event_id, $event_tickets, $variations = [], $timestamps = [], $apply_fees = true) + { + $total_tickets_amount = 0; + $total_tickets_count = 0; + $total_variations_amount = 0; + $total_fee_amount = 0; + + $variation_details = []; + $fee_details = []; + + $details = []; + foreach ($timestamps as $timestamp) + { + $date_tickets_amount = 0; + $date_tickets_count = 0; + $date_variations_amount = 0; + $date_fee_amount = 0; + + $timestamp_ex = explode(':', $timestamp); + $timestamp = $timestamp_ex[0]; + + foreach ($tickets as $ticket_id => $count) + { + if (!$count) continue; + if (!isset($event_tickets[$ticket_id])) continue; + + $date_tickets_count += $count; + + $t_price = isset($event_tickets[$ticket_id]['price']) ? $this->get_ticket_price($event_tickets[$ticket_id], current_time('Y-m-d'), $event_id, $timestamp) : 0; + if (!is_numeric($t_price)) $t_price = 0; + + $date_tickets_amount = $date_tickets_amount + ($t_price * $count); + + // Variations module is enabled and some variations bought + if (isset($this->settings['ticket_variations_status']) and $this->settings['ticket_variations_status'] and is_array($variations) and count($variations)) + { + $ticket_variations = $this->main->ticket_variations($event_id, $ticket_id); + + foreach ($ticket_variations as $key => $ticket_variation) + { + if (!is_numeric($key)) continue; + if (!isset($ticket_variation['title']) or !trim($ticket_variation['title'])) continue; + + $booked_variations = isset($variations[$ticket_id]) && is_array($variations[$ticket_id]) ? $variations[$ticket_id] : []; + + $variation_count = $booked_variations[$key] ?? 0; + if (!$variation_count or $variation_count < 0) continue; + + $v_price = (isset($ticket_variation['price']) and trim($ticket_variation['price']) != '') ? $ticket_variation['price'] : 0; + + $variation_amount = $v_price * $variation_count; + $variation_title = $ticket_variation['title'] . ' (' . esc_html($variation_count) . ')'; + + // Add To Total + $date_variations_amount += $variation_amount; + + // Price Details + if (!isset($variation_details[$key])) $variation_details[$key] = ['amount' => $variation_amount, 'description' => __($variation_title, 'modern-events-calendar-lite'), 'type' => 'variation', 'count' => $variation_count]; + else + { + $variation_details[$key]['amount'] += $variation_amount; + + $new_count = ((int) $variation_details[$key]['count'] + $variation_count); + $variation_details[$key]['count'] = $new_count; + $variation_details[$key]['description'] = esc_html__($ticket_variation['title'] . ' (' . $new_count . ')', 'modern-events-calendar-lite'); + } + } + } + } + + $total_tickets_amount += $date_tickets_amount; + $total_variations_amount += $date_variations_amount; + $total_tickets_count += $date_tickets_count; + + // Fees module is enabled + if ($apply_fees and isset($this->settings['taxes_fees_status']) and $this->settings['taxes_fees_status']) + { + $fees = $this->get_fees($event_id); + + foreach ($fees as $key => $fee) + { + $fee_amount = 0; + if (!is_numeric($key)) continue; + + if ($fee['type'] == 'amount_per_date') $fee_amount += $fee['amount']; + else continue; + + // Add to Total + $date_fee_amount += $fee_amount; + + // Price Details + if (!isset($fee_details[$key])) $fee_details[$key] = ['amount' => $fee_amount, 'description' => __($fee['title'], 'modern-events-calendar-lite'), 'type' => 'fee', 'fee_type' => $fee['type'], 'fee_amount' => $fee['amount']]; + else $fee_details[$key]['amount'] += $fee_amount; + } + } + + $total_fee_amount += $date_fee_amount; + } + + $tax_inclusion_type = isset($this->settings['tax_inclusion']) && trim($this->settings['tax_inclusion']) ? $this->settings['tax_inclusion'] : 'excluded'; + $total_ticket_percent_fee_amount = 0; + + // Fees module is enabled + if ($apply_fees && isset($this->settings['taxes_fees_status']) && $this->settings['taxes_fees_status']) + { + $fees = $this->get_fees($event_id); + $rest_fee_amount = 0; + + // Fee Per Booking + foreach ($fees as $key => $fee) + { + if (!is_numeric($key)) continue; + + $fee_amount_config = isset($fee['amount']) ? (float) $fee['amount'] : 0; + $fee_amount = 0; + + if ($fee['type'] == 'percent') + { + if ($tax_inclusion_type === 'included') + { + $fee_amount += ($total_tickets_amount + $total_variations_amount) - (($total_tickets_amount + $total_variations_amount) / (1 + ($fee_amount_config / 100))); + + // Add to Ticket Percent Fee + $total_ticket_percent_fee_amount += $total_tickets_amount - ($total_tickets_amount / (1 + ($fee_amount_config / 100))); + + // Variation Details + if (count($variation_details)) + { + $new_variation_details = []; + foreach ($variation_details as $variation_detail) + { + $variation_fee_amount = $variation_detail['amount'] - ($variation_detail['amount'] / (1 + ($fee_amount_config / 100))); + + $variation_detail['amount'] = $variation_detail['amount'] - $variation_fee_amount; + $total_variations_amount = $total_variations_amount - $variation_fee_amount; + + $new_variation_details[] = $variation_detail; + } + + $variation_details = $new_variation_details; + } + } + else $fee_amount += (($total_tickets_amount + $total_variations_amount) * $fee_amount_config) / 100; + } + else if ($fee['type'] == 'amount') $fee_amount += ($total_tickets_count * $fee_amount_config); + else if ($fee['type'] == 'amount_per_booking') $fee_amount += $fee_amount_config; + else continue; + + // Add to Total + $rest_fee_amount += $fee_amount; + + // Price Details + if (!isset($fee_details[$key])) $fee_details[$key] = ['amount' => $fee_amount, 'description' => __($fee['title'], 'modern-events-calendar-lite'), 'type' => 'fee', 'fee_type' => $fee['type'], 'fee_amount' => $fee_amount_config]; + else $fee_details[$key]['amount'] += $fee_amount; + } + + $total_fee_amount += $rest_fee_amount; + } + + if ($tax_inclusion_type === 'included') + { + $total_tickets_amount = $total_tickets_amount - $total_ticket_percent_fee_amount; + } + + // Ticket Details + $details[] = ['amount' => $total_tickets_amount, 'description' => esc_html__('Subtotal', 'modern-events-calendar-lite'), 'type' => 'tickets']; + + // Variation Details + foreach ($variation_details as $variation_detail) $details[] = $variation_detail; + + // Fee Details + foreach ($fee_details as $fee_detail) $details[] = $fee_detail; + + $total = $total_tickets_amount + $total_fee_amount + $total_variations_amount; + $payable = $total; + + // Calculate Payable + if ($this->partial_payment->is_enabled()) $payable = $this->partial_payment->calculate($total, $event_id); + + return [ + 'total' => $total, + 'payable' => $payable, + 'details' => $details, + ]; + } + + /** + * Get fees of a certain event + * @param int $event_id + * @return array + * @author Webnus + */ + public function get_fees($event_id) + { + $fees_global_inheritance = get_post_meta($event_id, 'mec_fees_global_inheritance', true); + if (is_string($fees_global_inheritance) and trim($fees_global_inheritance) == '') $fees_global_inheritance = 1; + + // Event fees + $fees = get_post_meta($event_id, 'mec_fees', true); + + // Get fees from global options + if ($fees_global_inheritance) $fees = $this->settings['fees'] ?? []; + + // Clean + if (isset($fees[':i:'])) unset($fees[':i:']); + + return $fees; + } + + /** + * Save a temporary booking + * @param array $data + * @return int + * @author Webnus + */ + public function temporary($data = []) + { + $transaction = new Transaction(0, $data); + return $transaction->update_data(); + } + + /** + * Generate a transaction id for bookings + * @return string + * @author Webnus + */ + public function get_transaction_id()//TODO: remove + { + return Transaction::generate_transaction_id(); + } + + /** + * Get transaction data + * @param string $transaction_id + * @return array + * @author Webnus + */ + public function get_transaction($transaction_id) + { + return get_option($transaction_id, []); + } + + /** + * @param $transaction_id + * @return MEC_transaction + */ + public function get_TO($transaction_id) + { + MEC::import('app.libraries.transaction'); + return (new MEC_transaction($transaction_id)); + } + + /** + * Update a transaction + * @param string $transaction_id + * @param array $data + * @author Webnus + */ + public function update_transaction($transaction_id, $data) + { + update_option($transaction_id, $data, false); + + if ($transaction_id) + { + $transactionObject = new Transaction($transaction_id); + $transactionObject->reset_cache_tickets_details(); + } + } + + /** + * Add a booking + * @param array $values + * @param string $transaction_id + * @param int $ticket_ids + * @return int|boolean + * @author Webnus + */ + public function add($values, $transaction_id, $ticket_ids) + { + // Check Transaction State + $db = $this->main->getDB(); + $db_transaction_ids = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key` = 'mec_transaction_id' AND `meta_value` = '$transaction_id'"); + + foreach ($db_transaction_ids as $db_transaction_id) + { + $book_status = get_post_status($db_transaction_id->post_id); + if (trim($book_status) == 'trash') unset($db_transaction_ids[$db_transaction_id->post_id]); + } + + if (count($db_transaction_ids)) return false; + + // Transaction Data + $transaction = $this->get_transaction($transaction_id); + $event_id = $transaction['event_id']; + + $attention_date = $transaction['date'] ?? ''; + $attention_times = explode(':', $attention_date); + + // Default values + if (!isset($values['post_date'])) $values['post_date'] = date('Y-m-d H:i:s', trim($attention_times[0])); + if (!isset($values['post_status'])) $values['post_status'] = 'publish'; + + $book_id = wp_insert_post($values); + + // Delete Cache + delete_transient('all_sold_tickets_' . $event_id); + + // Update transaction id after insert book for prevent repeat reservation books. + update_post_meta($book_id, 'mec_transaction_id', $transaction_id); + + // Payment Gateway + if (isset($values['mec_gateway']) and isset($values['mec_gateway_label'])) + { + update_post_meta($book_id, 'mec_gateway', $values['mec_gateway']); + update_post_meta($book_id, 'mec_gateway_label', $values['mec_gateway_label']); + } + + $transaction['booking_id'] = $book_id; + $transaction['invoice_key'] = md5(time() . mt_rand(10000, 99999)); + if (isset($values['mec_gateway'])) + { + $transaction['gateway'] = $values['mec_gateway']; + } + + $this->update_transaction($transaction_id, $transaction); + + // Publish it + wp_publish_post($book_id); + + // Assign User + if (isset($values['post_author']) and $values['post_author']) + { + $u = $this->getUser(); + $u->assign($book_id, $values['post_author']); + } + + update_post_meta($book_id, 'mec_verified', 0); + update_post_meta($book_id, 'mec_verification_key', md5(time() . mt_rand(10000, 99999))); + update_post_meta($book_id, 'mec_cancellation_key', md5(time() . mt_rand(10000, 99999))); + + update_post_meta($book_id, 'mec_confirmed', 0); + + update_post_meta($book_id, 'mec_event_id', $event_id); + update_post_meta($book_id, 'mec_date', $transaction['date']); + update_post_meta($book_id, 'mec_ticket_id', $ticket_ids); + update_post_meta($book_id, 'mec_booking_time', current_time('Y-m-d H:i:s')); + update_post_meta($book_id, 'mec_locale', $transaction['locale'] ?? ''); + + // Multiple Dates + if (isset($transaction['all_dates']) and is_array($transaction['all_dates'])) update_post_meta($book_id, 'mec_all_dates', $transaction['all_dates']); + if (isset($transaction['other_dates']) and is_array($transaction['other_dates'])) update_post_meta($book_id, 'mec_other_dates', $transaction['other_dates']); + + update_post_meta($book_id, 'mec_attention_time', $attention_date); + update_post_meta($book_id, 'mec_attention_time_start', $attention_times[0]); + update_post_meta($book_id, 'mec_attention_time_end', $attention_times[1]); + + // For Badge Bubble Notification Alert Count From It. + update_post_meta($book_id, 'mec_book_date_submit', date('YmdHis', current_time('timestamp'))); + + $location_id = $this->main->get_master_location_id($event_id, $attention_times[0]); + if (!empty($location_id)) update_post_meta($book_id, 'mec_booking_location', $location_id); + + // Event Tickets + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + if (isset($values['mec_attendees'])) + { + foreach ($values['mec_attendees'] as $k => $mec_attendee) + { + if (!is_numeric($k)) continue; + $values['mec_attendees'][$k]['buyerip'] = $this->main->get_client_ip(); + + $ticket_id = $mec_attendee['id'] ?? 0; + $ticket_price = (isset($tickets[$ticket_id]) ? $tickets[$ticket_id]['price'] : 0); + + update_post_meta($book_id, 'mec_ticket_price_' . $ticket_id, $ticket_price); + } + + update_post_meta($book_id, 'mec_attendees', $values['mec_attendees']); + } + + $price = $transaction['price'] ?? ($transaction['total'] ?? 0); + update_post_meta($book_id, 'mec_price', $price); + + $payable = $transaction['payable'] ?? $price; + update_post_meta($book_id, 'mec_payable', $payable); + + // A coupon applied + if (isset($transaction['coupon'])) + { + $coupon_id = $this->coupon_get_id($transaction['coupon']); + if ($coupon_id) + { + wp_set_object_terms($book_id, $coupon_id, 'mec_coupon'); + update_post_meta($book_id, 'mec_coupon_code', $transaction['coupon']); + } + } + + // Local Data + update_post_meta($book_id, 'mec_local_timezone', $this->main->get_timezone_by_ip()); + + // Booking Record + $this->getBookingRecord()->insert($book_id); + + // Fires after adding a new booking to send notifications etc + do_action('mec_booking_added', $book_id); + + list($auto_verify_free, $auto_verify_paid) = $this->get_auto_verification_status($event_id, $book_id); + list($auto_confirm_free, $auto_confirm_paid) = $this->get_auto_confirmation_status($event_id, $book_id); + + $verified = false; + + // Auto verification for free bookings is enabled + if ($price <= 0 and $auto_verify_free) + { + $this->verify($book_id); + $verified = true; + } + + // Auto verification for paid bookings is enabled + if ($price > 0 and $auto_verify_paid) + { + $this->verify($book_id); + $verified = true; + } + + // Auto confirmation for free bookings is enabled + if ($price <= 0 and $auto_confirm_free and $verified) + { + $this->confirm($book_id, 'auto'); + } + + // Auto confirmation for paid bookings is enabled + if ($price > 0 and $auto_confirm_paid and $verified) + { + // Work or don't work auto confirmation when pay through pay locally payment. + $gateways_settings = get_option('mec_options', []); + $gateway_key = null; + $can_auto_confirm = true; + $action = isset($_GET['action']) ? sanitize_text_field($_GET['action']) : false; + + switch ($action) + { + case 'mec_do_transaction_pay_locally': + case 'mec_cart_do_transaction_pay_locally': + + $gateway_key = 1; + break; + case 'mec_do_transaction_bank_transfer': + case 'mec_cart_do_transaction_bank_transfer': + + $gateway_key = 8; + break; + } + + if (!is_null($gateway_key) && isset($gateways_settings['gateways'][$gateway_key]['disable_auto_confirmation']) && trim($gateways_settings['gateways'][$gateway_key]['disable_auto_confirmation'])) + { + $can_auto_confirm = false; + } + + if ($can_auto_confirm) $this->confirm($book_id, 'auto'); + } + + // Latest Booking Date & Time + update_option('mec_latest_booking_datetime', current_time('YmdHis'), false); + + return $book_id; + } + + /** + * Confirm a booking + * @param int $book_id + * @param string $mode + * @return boolean + * @author Webnus + */ + public function confirm($book_id, $mode = 'manually') + { + update_post_meta($book_id, 'mec_confirmed', 1); + + // Fires after confirming a booking to send notifications etc. + do_action('mec_booking_confirmed', $book_id, $mode); + + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $date = get_post_meta($book_id, 'mec_date', true); + $timestamps = explode(':', $date); + + // Booking Records + $this->getBookingRecord()->confirm($book_id); + + // Disable Cache + $cache = $this->getCache(); + $cache->disable(); + + // Event is sold-out so fire the event + $soldout = $this->main->is_sold($event_id, $timestamps[0]); + if ($soldout) do_action('mec_event_soldout', $event_id, $book_id); + + // Enable Cache + $cache->enable(); + + return true; + } + + /** + * Reject a booking + * @param int $book_id + * @return boolean + * @author Webnus + */ + public function reject($book_id) + { + update_post_meta($book_id, 'mec_confirmed', -1); + + // Booking Records + $this->getBookingRecord()->reject($book_id); + + // Fires after rejecting a booking to send notifications etc. + do_action('mec_booking_rejected', $book_id); + + return true; + } + + /** + * Make a booking pending + * @param int $book_id + * @return boolean + * @author Webnus + */ + public function pending($book_id) + { + update_post_meta($book_id, 'mec_confirmed', 0); + + // Booking Records + $this->getBookingRecord()->pending($book_id); + + // Fires after pending a booking to send notifications etc. + do_action('mec_booking_pended', $book_id); + + return true; + } + + /** + * Verify a booking + * @param int $book_id + * @return boolean + * @author Webnus + */ + public function verify($book_id) + { + update_post_meta($book_id, 'mec_verified', 1); + + // Booking Records + $this->getBookingRecord()->verify($book_id); + + // Fires after verifying a booking to send notifications etc. + do_action('mec_booking_verified', $book_id); + + return true; + } + + /** + * Cancel a booking + * @param int $book_id + * @param ?bool $refund + * @return boolean + * @author Webnus + */ + public function cancel($book_id, $refund = null) + { + $verified = -1; + $verified = apply_filters('mec_verified_value', $verified, $book_id); + + if ($verified != -1) return true; + + update_post_meta($book_id, 'mec_verified', -1); + update_post_meta($book_id, 'mec_cancelled_date', date('Y-m-d H:i:s', current_time('timestamp'))); + + if (is_null($refund)) $refund = (isset($this->settings['booking_auto_refund']) and $this->settings['booking_auto_refund']); + $gateway = get_post_meta($book_id, 'mec_gateway', true); + + if ($refund and $gateway == 'MEC_gateway_stripe') + { + $stripe = new MEC_gateway_stripe(); + $stripe->refund($book_id); + + // Actions + do_action('mec_booking_refunded', $book_id); + } + + // Booking Records + $this->getBookingRecord()->cancel($book_id); + + // Fires after canceling a booking to send notifications etc. + do_action('mec_booking_canceled', $book_id); + + return true; + } + + public function move($booking_id, $from_start, $to_start) + { + // Database + $db = $this->getDB(); + + // Event + $event_id = get_post_meta($booking_id, 'mec_event_id', true); + + $offset = (int) $this->main->get_gmt_offset_seconds($event_id, $to_start); + $to_start_datetime = wp_date('Y-m-d H:i:s', $to_start - $offset); + $to_end = (int) $db->select("SELECT `tend` FROM `#__mec_dates` WHERE `post_id`='" . esc_sql($event_id) . "' AND `tstart`='" . esc_sql($to_start) . "'", 'loadResult'); + $from_end = (int) $db->select("SELECT `tend` FROM `#__mec_dates` WHERE `post_id`='" . esc_sql($event_id) . "' AND `tstart`='" . esc_sql($from_start) . "'", 'loadResult'); + + // Update Booking Post + $db->q("UPDATE `#__posts` SET `post_date`='" . esc_sql($to_start_datetime) . "', `post_date_gmt`='" . get_gmt_from_date($to_start_datetime) . "' WHERE `ID`='" . esc_sql($booking_id) . "'"); + + // Update Booking Meta + foreach ([ + 'mec_date' => $to_start . ':' . $to_end, + 'mec_attention_time' => $to_start . ':' . $to_end, + 'mec_attention_time_start' => $to_start, + 'mec_attention_time_end' => $to_end, + ] as $key => $value) + { + // Keep Previous Data + $prev = get_post_meta($booking_id, $key, true); + update_post_meta($booking_id, $key . '_prev', $prev); + + update_post_meta($booking_id, $key, $value); + } + + // All Dates + $all_dates = get_post_meta($booking_id, 'mec_all_dates', true); + if (!is_array($all_dates)) $all_dates = []; + + $k = array_search($from_start . ':' . $from_end, $all_dates); + if ($k !== false) + { + $all_dates[$k] = $to_start . ':' . $to_end; + } + + update_post_meta($booking_id, 'mec_all_dates', $all_dates); + + // Update Transaction + $transaction_id = get_post_meta($booking_id, 'mec_transaction_id', true); + $transaction = $this->get_transaction($transaction_id); + + if (isset($transaction['timestamps']) and is_array($transaction['timestamps'])) + { + $k = array_search($transaction['date'], $transaction['timestamps']); + if ($k !== false) $transaction['timestamps'][$k] = $to_start . ':' . $to_end; + } + + $transaction['date'] = $to_start . ':' . $to_end; + $this->update_transaction($transaction_id, $transaction); + + // Update booking Record + $db->q("UPDATE `#__mec_bookings` SET `timestamp`='" . esc_sql($to_start) . "', `date`='" . esc_sql($to_start_datetime) . "' WHERE `booking_id`='" . esc_sql($booking_id) . "' AND `event_id`='" . esc_sql($event_id) . "' AND `timestamp`='" . esc_sql($from_start) . "'"); + + // Delete Cache + clean_post_cache($booking_id); + + // Fires after moving a booking to send notifications etc. + do_action('mec_booking_moved', $booking_id, $to_start); + } + + public function move_notify($booking_id, $moved_to) + { + // Fires after moving a booking to send notifications etc. + do_action('mec_booking_moved_notify', $booking_id, $moved_to); + } + + /** + * Waiting a booking + * @param int $book_id + * @return boolean + * @author Webnus + */ + public function waiting($book_id) + { + update_post_meta($book_id, 'mec_verified', 0); + + // Booking Records + $this->getBookingRecord()->waiting($book_id); + + // Fires after waiting a booking to send notifications etc. + do_action('mec_booking_waiting', $book_id); + + return true; + } + + /** + * Returns ticket availabilities of an event for a certain date + * @param int $event_id + * @param int $timestamp + * @param string $mode + * @return array|integer + * @author Webnus + */ + public function get_tickets_availability($event_id, $timestamp, $mode = 'availability') + { + $ex = explode(':', $timestamp); + $timestamp = $ex[0]; + + if (!is_numeric($timestamp)) $timestamp = strtotime($timestamp); + + $availability = []; + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + // No Ticket Found! + if (!is_array($tickets) or !count($tickets)) + { + if ($mode == 'reservation') return 0; + else return $availability; + } + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + $total_bookings_limit = (isset($booking_options['bookings_limit']) and trim($booking_options['bookings_limit']) !== '') ? $booking_options['bookings_limit'] : 100; + $bookings_limit_unlimited = $booking_options['bookings_limit_unlimited'] ?? 0; + $book_all_occurrences = isset($booking_options['bookings_all_occurrences']) ? (int) $booking_options['bookings_all_occurrences'] : 0; + + if ($bookings_limit_unlimited == '1') $total_bookings_limit = '-1'; + + // Get Per Occurrence + $total_bookings_limit = MEC_feature_occurrences::param($event_id, $timestamp, 'bookings_limit', $total_bookings_limit); + + // Total Booking Limit + $total_bookings_limit_original = $total_bookings_limit; + + // Ticket Selling Stop + $event_date = date('Y-m-d h:i a', $timestamp); + + if (!$book_all_occurrences && trim($timestamp)) $date_query = " AND `timestamp`=" . $timestamp; + else $date_query = ""; + + // Database + $db = $this->getDB(); + + // Cache + $cache = $this->getCache(); + + $booked = 0; + foreach ($tickets as $ticket_id => $ticket) + { + $limit = (isset($ticket['limit']) and trim($ticket['limit']) != '') ? $ticket['limit'] : -1; + + $ticket_seats = (isset($ticket['seats']) and is_numeric($ticket['seats'])) ? (int) $ticket['seats'] : 1; + $ticket_seats = max(1, $ticket_seats); + + $records = $cache->rememberOnce($event_id . ':' . $ticket_id . ':' . $timestamp, function () use ($db, $event_id, $ticket_id, $date_query) + { + return $db->select("SELECT `id`,`ticket_ids` FROM `#__mec_bookings` WHERE `event_id`=" . $event_id . " AND `ticket_ids` LIKE '%," . $ticket_id . ",%' AND `status` IN ('publish', 'pending', 'draft', 'future', 'private') AND `confirmed`!='-1' AND `verified`!='-1'" . $date_query); + }); + + $bookings = 0; + $booked_seats = 0; + foreach ($records as $record) + { + $ticket_ids = explode(',', trim($record->ticket_ids, ', ')); + $ticket_ids_count = array_count_values($ticket_ids); + + if (isset($ticket_ids_count[$ticket_id]) and is_numeric($ticket_ids_count[$ticket_id])) + { + $bookings += $ticket_ids_count[$ticket_id]; + $booked_seats += ($ticket_ids_count[$ticket_id] * $ticket_seats); + } + } + + if ($total_bookings_limit > 0) $total_bookings_limit = max(($total_bookings_limit - $booked_seats), 0); + $booked += $bookings; + + $availability_date_start = $ticket['availability_start'] ?? ''; + $availability_date_end = $ticket['availability_end'] ?? ''; + + if (trim($availability_date_start) && trim($availability_date_end)) + { + if (!(strtotime($availability_date_start) <= $timestamp && strtotime($availability_date_end) >= $timestamp)) + { + $availability[$ticket_id] = 0; + $availability['not_available_' . $ticket_id] = true; + $availability['seats_' . $ticket_id] = $ticket_seats; + continue; + } + } + + // Ticket Selling Stop + $stop_selling_value = isset($ticket['stop_selling_value']) ? trim($ticket['stop_selling_value']) : 0; + $stop_selling_type = isset($ticket['stop_selling_type']) ? trim($ticket['stop_selling_type']) : 'day'; + + if ($stop_selling_value > 0 and $this->main->check_date_time_validation('Y-m-d h:i a', strtolower($event_date))) + { + if (strtotime("-" . $stop_selling_value . $stop_selling_type, strtotime($event_date)) <= current_time('timestamp')) + { + $availability[$ticket_id] = 0; + $availability['stop_selling_' . $ticket_id] = true; + $availability['seats_' . $ticket_id] = $ticket_seats; + continue; + } + } + + // Few Seats + if ($ticket_seats > 1 and $total_bookings_limit > 0 and $total_bookings_limit < $ticket_seats) + { + $availability[$ticket_id] = 0; + $availability['seats_' . $ticket_id] = $ticket_seats; + continue; + } + + // Ticket is Unlimited + if ((isset($ticket['unlimited']) and $ticket['unlimited'] == 1) or $limit == -1) + { + $availability[$ticket_id] = $total_bookings_limit > 0 ? floor($total_bookings_limit / $ticket_seats) : -1; + $availability['seats_' . $ticket_id] = $ticket_seats; + continue; + } + + if ($limit == '') $limit = 0; + + $limit = (int) $limit; + $booked_seats = (int) $booked_seats; + + // Unlimited Total + if ($total_bookings_limit == '-1') $ticket_availability = $limit - $booked_seats; + else $ticket_availability = min(($limit - $booked_seats), max($total_bookings_limit, 0)); + + $availability[$ticket_id] = $ticket_availability >= 0 ? floor($ticket_availability / $ticket_seats) : 0; + $availability['seats_' . $ticket_id] = $ticket_seats; + } + + // For the time being set reservation parameter + if ($mode == 'reservation') return $booked; + + // Set Total Booking Limit + $availability['total'] = $total_bookings_limit; + + // Do not send higher limit for tickets compared to total limit + if ($total_bookings_limit != '-1' and $total_bookings_limit > 0) + { + $new_availability = []; + foreach ($availability as $ticket_id => $limit) + { + if (is_numeric($ticket_id)) + { + $ticket_seats = $availability['seats_' . $ticket_id]; + $ticket_seats = max(1, $ticket_seats); + + $seats = $limit * $ticket_seats; + $new_availability[$ticket_id] = floor(min($seats, $total_bookings_limit) / $ticket_seats); + } + else $new_availability[$ticket_id] = $limit; + } + + return apply_filters('mec_get_tickets_availability', $new_availability, $event_id, $timestamp, $mode, $tickets); + } + + // Total Booking Limit Reached + if ($total_bookings_limit_original != -1 and $booked >= $total_bookings_limit_original) + { + $new_availability = []; + foreach ($availability as $ticket_id => $limit) + { + if (is_numeric($ticket_id)) $new_availability[$ticket_id] = 0; + else $new_availability[$ticket_id] = $limit; + } + + return apply_filters('mec_get_tickets_availability', $new_availability, $event_id, $timestamp, $mode, $tickets); + } + + return apply_filters('mec_get_tickets_availability', $availability, $event_id, $timestamp, $mode, $tickets); + } + + /** + * Returns ticket availabilities of an event for a certain date + * @param int $event_id + * @param array $dates + * @return array + * @author Webnus + */ + public function get_tickets_availability_multiple($event_id, $dates) + { + $availability = []; + foreach ($dates as $date) + { + $ex = explode(':', sanitize_text_field($date)); + $date = $ex[0]; + + $a = $this->get_tickets_availability($event_id, $date); + if (!is_array($a)) continue; + + // Fill Compatibility + if (!count($availability)) $availability = $a; + + // Minimum Availability + foreach ($availability as $k => $v) + { + if (isset($a[$k])) $availability[$k] = min($a[$k], $v); + } + } + + return $availability; + } + + /** + * Check validity of a coupon + * @param string $coupon + * @param int $event_id + * @param array $transaction + * @return int + * @author Webnus + */ + public function coupon_check_validity($coupon, $event_id, $transaction) + { + $term = get_term_by('name', $coupon, 'mec_coupon'); + $coupon_id = $term->term_id ?? 0; + + // Coupon is not exists + if (!$coupon_id) return 0; + + // Usage Limit + $usage_limit = get_term_meta($coupon_id, 'usage_limit', true); + $status = ($usage_limit == '-1' or (int) $usage_limit > $term->count) ? 1 : -1; + + // Expiration Date + if ($status === 1) + { + $expiration_date = get_term_meta($coupon_id, 'expiration_date', true); + if (trim($expiration_date) and strtotime($expiration_date) < strtotime(date('Y-m-d'))) + { + $status = -2; + } + } + + // Event Specification + if ($status === 1) + { + $all_events = get_term_meta($coupon_id, 'target_event', true); + if (trim($all_events) == '') $all_events = 1; + + $target_events = get_term_meta($coupon_id, 'target_events', true); + if (!is_array($target_events)) + { + $target_events = []; + if ($all_events and $all_events != 1) $target_events[] = $all_events; + } + + if (!$all_events and is_array($target_events) and count($target_events) and !in_array($event_id, $target_events)) + { + $status = -3; + } + } + + // Category Specification + if ($status === 1) + { + $all_target_categories = get_term_meta($coupon_id, 'target_category', true); + if (trim($all_target_categories) == '') $all_target_categories = 1; + + $target_categories = get_term_meta($coupon_id, 'target_categories', true); + if (!$all_target_categories and is_array($target_categories) and count($target_categories)) + { + $event_categories = wp_get_post_terms($event_id, 'mec_category', ['fields' => 'ids']); + + $found = false; + foreach ($target_categories as $target_category) + { + if (in_array($target_category, $event_categories)) + { + $found = true; + break; + } + } + + if (!$found) $status = -6; + } + } + + // Minimum Tickets + if ($status === 1) + { + $ticket_minimum = get_term_meta($coupon_id, 'ticket_minimum', true); + if (!trim($ticket_minimum)) $ticket_minimum = 1; + + $tickets = $transaction['tickets'] ?? []; + if (isset($tickets['attachments'])) unset($tickets['attachments']); + + if (count($tickets) < $ticket_minimum) + { + $status = -4; + } + } + + // Maximum Tickets + if ($status === 1) + { + $ticket_maximum = get_term_meta($coupon_id, 'ticket_maximum', true); + if (trim($ticket_maximum)) + { + $tickets = $transaction['tickets'] ?? []; + if (isset($tickets['attachments'])) unset($tickets['attachments']); + + if (count($tickets) > $ticket_maximum) + { + $status = -5; + } + } + } + + $all_dates = (isset($transaction['all_dates']) and is_array($transaction['all_dates'])) ? $transaction['all_dates'] : []; + + // Minimum Dates + if ($status === 1 and count($all_dates) >= 1) + { + $date_minimum = get_term_meta($coupon_id, 'date_minimum', true); + if (!trim($date_minimum)) $date_minimum = 1; + + if (count($all_dates) < $date_minimum) + { + $status = -7; + } + } + + // Maximum Dates + if ($status === 1 and count($all_dates) >= 1) + { + $date_maximum = get_term_meta($coupon_id, 'date_maximum', true); + if (trim($date_maximum)) + { + if (count($all_dates) > $date_maximum) + { + $status = -8; + } + } + } + + return $status; + } + + /** + * Apply a coupon to a transaction + * @param string $coupon + * @param int $transaction_id + * @return int + * @author Webnus + */ + public function coupon_apply($coupon, $transaction_id) + { + $transaction = $this->get_transaction($transaction_id); + $event_id = $transaction['event_id'] ?? null; + + // Verify validity of coupon + if ($this->coupon_check_validity($coupon, $event_id, $transaction) != 1) return 0; + + $total = $transaction['total']; + $discount = $this->coupon_get_discount($coupon, $total); + $after_discount = $total - $discount; + + $transaction['price_details']['total'] = $after_discount; + + $price_details = $transaction['price_details']['details']; + foreach ($price_details as $i => $price_detail) + { + if (isset($price_detail['type']) and $price_detail['type'] == 'discount' and isset($price_detail['coupon'])) unset($price_details[$i]); + } + + $price_details[] = ['amount' => $discount, 'description' => __('Discount', 'modern-events-calendar-lite'), 'type' => 'discount', 'coupon' => $coupon]; + + $transaction['price_details']['details'] = $price_details; + $transaction['discount'] = $discount; + $transaction['price'] = $after_discount; + $transaction['coupon'] = $coupon; + + // Re-calculate + $transaction = $this->recalculate($transaction); + + // Update Transaction + $this->update_transaction($transaction_id, $transaction); + + return $transaction['discount'] ?? $discount; + } + + /** + * Get discount of a coupon + * @param string $coupon + * @param int $total + * @return int + * @author Webnus + */ + public function coupon_get_discount($coupon, $total) + { + $coupon_id = $this->coupon_get_id($coupon); + + // Coupon is not exists + if (!$coupon_id) return 0; + + $discount_type = get_term_meta($coupon_id, 'discount_type', true); + $discount = get_term_meta($coupon_id, 'discount', true); + + if ($discount_type == 'percent') + { + $discount_amount = ($total * $discount) / 100; + + $discount_max = get_term_meta($coupon_id, 'maximum_discount', true); + if (trim($discount_max) and is_numeric($discount_max)) $discount_amount = min($discount_amount, $discount_max); + } + else $discount_amount = min($discount, $total); + + return $discount_amount; + } + + /** + * Get id of a coupon by coupon number + * @param string $coupon + * @return int + * @author Webnus + */ + public function coupon_get_id($coupon) + { + $term = get_term_by('name', $coupon, 'mec_coupon'); + return $term->term_id ?? 0; + } + + /** + * Is coupon 100 percent? + * @param string $coupon + * @return bool + * @author Webnus + */ + public function coupon_is_100percent($coupon) + { + $coupon_id = $this->coupon_get_id($coupon); + + // Coupon is not exists + if (!$coupon_id) return false; + + $discount_type = get_term_meta($coupon_id, 'discount_type', true); + $discount = (int) get_term_meta($coupon_id, 'discount', true); + + return ($discount_type === 'percent' and $discount === 100); + } + + public function recalculate($transaction) + { + $price_details = $transaction['price_details']['details']; + + $other_dates = (isset($transaction['other_dates']) and is_array($transaction['other_dates'])) ? $transaction['other_dates'] : []; + $dates_count = count($other_dates) + 1; + + $booked_tickets = $transaction['tickets']; + if (isset($booked_tickets['attachments'])) unset($booked_tickets['attachments']); + + $total_tickets_count = (count($booked_tickets) * $dates_count); + + $total_fee_amount = 0; + $taxable = 0; + $total_discount = 0; + $fees_to_apply = []; + $discounts_to_apply = []; + + foreach ($price_details as $i => $item) + { + $type = $item['type'] ?? ''; + $amount = $item['amount'] ?? 0; + + if ($type == 'fee') $fees_to_apply[] = $item; + else if ($type == 'discount') $discounts_to_apply[] = $item; + else $taxable += $amount; + + // Remove Fee and Discount Items + if (in_array($type, ['fee', 'discount'])) unset($price_details[$i]); + } + + $total = $taxable; + + $fee_discount = 0; + $fee_discount_type = 'percent'; + + // Apply Discounts + foreach ($discounts_to_apply as $discount_item) + { + $coupon_id = $this->coupon_get_id($discount_item['coupon']); + if ($coupon_id && get_term_meta($coupon_id, 'apply_on_fees', true)) + { + $fee_discount_type = get_term_meta($coupon_id, 'discount_type', true); + $fee_discount = get_term_meta($coupon_id, 'discount', true); + } + + $discount = $this->coupon_get_discount($discount_item['coupon'], $taxable); + $taxable = max(0, ($taxable - $discount)); + $total_discount += $discount; + + $price_details[] = ['amount' => $discount, 'description' => __('Discount', 'modern-events-calendar-lite'), 'type' => 'discount', 'coupon' => $discount_item['coupon']]; + } + + // Apply Fees + foreach ($fees_to_apply as $fee_item) + { + $fee_amount = 0; + + if ($fee_item['fee_type'] == 'percent') $fee_amount += ($taxable * $fee_item['fee_amount']) / 100; + else if ($fee_item['fee_type'] == 'amount') $fee_amount += ($total_tickets_count * $fee_item['fee_amount']); + else if ($fee_item['fee_type'] == 'amount_per_date') $fee_amount += ($dates_count * $fee_item['fee_amount']); + else if ($fee_item['fee_type'] == 'amount_per_booking') $fee_amount += $fee_item['fee_amount']; + + // Apply Discount on Fee + if ($fee_discount && in_array($fee_item['fee_type'], ['amount', 'amount_per_date', 'amount_per_booking'])) + { + if ($fee_discount_type === 'percent') $fee_discount_amount = (float) ($fee_amount * min($fee_discount, 100)) / 100; + else $fee_discount_amount = (float) max($fee_discount, 0); + + $fee_discount_amount = min($fee_amount, $fee_discount_amount); + + $total_discount += $fee_discount_amount; + $fee_amount = max($fee_amount - $fee_discount_amount, 0); + } + + $total_fee_amount += $fee_amount; + $price_details[] = ['amount' => $fee_amount, 'description' => __($fee_item['description'], 'modern-events-calendar-lite'), 'type' => 'fee', 'fee_type' => $fee_item['fee_type'], 'fee_amount' => $fee_item['fee_amount']]; + } + + $total += $total_fee_amount; + $price = ($taxable + $total_fee_amount); + $payable = $price; + + // Calculate Payable + if ($this->partial_payment->is_enabled()) $payable = $this->partial_payment->calculate($price, $transaction['event_id']); + + $transaction['price_details']['total'] = $price; + $transaction['price_details']['payable'] = $payable; + $transaction['price_details']['details'] = $price_details; + $transaction['discount'] = $total_discount; + $transaction['total'] = $total; + $transaction['price'] = $price; + $transaction['payable'] = $payable; + + return $transaction; + } + + /** + * Get invoice link for certain transaction + * @param $transaction_id + * @return string + * @author Webnus + */ + public function get_invoice_link($transaction_id) + { + if (isset($this->settings['booking_invoice']) and !$this->settings['booking_invoice']) return ''; + + $main = $this->getMain(); + + $url = $main->URL(); + $url = $main->add_qs_var('method', 'mec-invoice', $url); + + // Invoice Key + $transaction = $this->get_transaction($transaction_id); + if (isset($transaction['invoice_key'])) $url = $main->add_qs_var('mec-key', $transaction['invoice_key'], $url); + + return apply_filters('mec_booking_invoice_url', $main->add_qs_var('id', $transaction_id, $url), $transaction_id); + } + + /** + * Get Downloadable file link for certain transaction + * @param $book_id + * @return string + * @author Webnus + */ + public function get_dl_file_link($book_id) + { + if (!isset($this->settings['downloadable_file_status']) or (isset($this->settings['downloadable_file_status']) and !$this->settings['downloadable_file_status'])) return ''; + + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $dl_file_id = get_post_meta($event_id, 'mec_dl_file', true); + + return apply_filters('mec_booking_dl_file_url', ($dl_file_id ? wp_get_attachment_url($dl_file_id) : ''), $book_id); + } + + public function get_bookings_by_transaction_id($transaction_id) + { + $main = $this->getMain(); + + return get_posts([ + 'posts_per_page' => -1, + 'post_type' => $main->get_book_post_type(), + 'meta_key' => 'mec_transaction_id', + 'meta_value' => $transaction_id, + ]); + } + + public function get_thankyou_page($page_id, $transaction_id = null, $cart_id = null) + { + $main = $this->getMain(); + $page = get_permalink($page_id); + + if ($transaction_id) $page = $main->add_qs_var('transaction', $transaction_id, $page); + if ($cart_id) $page = $main->add_qs_var('cart', $cart_id, $page); + + return $page; + } + + public function invoice_link_shortcode() + { + $transaction = isset($_GET['transaction']) ? sanitize_text_field($_GET['transaction']) : null; + if (!$transaction) return null; + + $book = $this->getBook(); + return '' . esc_html__('Download Invoice', 'modern-events-calendar-lite') . ''; + } + + public function get_total_attendees($book_id) + { + $attendees = get_post_meta($book_id, 'mec_attendees', true); + $count = 0; + + if (is_array($attendees)) + { + foreach ($attendees as $key => $attendee) + { + if ($key === 'attachments') continue; + + if (!isset($attendee[0]['MEC_TYPE_OF_DATA'])) $count++; + else if ($attendee[0]['MEC_TYPE_OF_DATA'] != 'attachment') $count++; + } + } + + return $count; + } + + public function get_attendees($book_id) + { + $attendees = get_post_meta($book_id, 'mec_attendees', true); + $clean = []; + + if (is_array($attendees)) + { + foreach ($attendees as $key => $attendee) + { + if ($key === 'attachments') continue; + + $clean[$key] = $attendee; + } + } + + return $clean; + } + + public function get_transaction_id_book_id($book_id) + { + return get_post_meta($book_id, 'mec_transaction_id', true); + } + + public function get_book_id_transaction_id($transaction_id) + { + $db = $this->getDB(); + return $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_transaction_id' AND `meta_value`='" . $db->escape($transaction_id) . "'", 'loadResult'); + } + + public function get_ticket_price_label($ticket, $current_date, $event_id, $timestamp = null) + { + return $this->get_ticket_price_key($ticket, $current_date, $event_id, 'price_label', $timestamp); + } + + public function get_ticket_price($ticket, $current_date, $event_id, $timestamp = null) + { + $price = $this->get_ticket_price_key($ticket, $current_date, $event_id, 'price', $timestamp); + return trim($price) ? $price : 0; + } + + public function get_ticket_regular_price_key($ticket, $current_date, $event_id, $key, $timestamp = null) + { + $data = $ticket[$key] ?? null; + + if ($timestamp and isset($ticket['id']) and trim($ticket['id']) !== '') + { + $occ_tickets = MEC_feature_occurrences::param($event_id, $timestamp, 'tickets', []); + if (is_array($occ_tickets) and isset($occ_tickets[$ticket['id']]) and is_array($occ_tickets[$ticket['id']]) and isset($occ_tickets[$ticket['id']][$key]) and trim($occ_tickets[$ticket['id']][$key]) !== '') + { + $data = $occ_tickets[$ticket['id']][$key]; + } + } + + $price_dates = (isset($ticket['dates']) and is_array($ticket['dates'])) ? $ticket['dates'] : []; + if (count($price_dates)) + { + $current_time = strtotime($current_date); + foreach ($price_dates as $k => $price_date) + { + if (!is_numeric($k)) continue; + + $start = $price_date['start']; + $end = $price_date['end']; + + if ($current_time >= strtotime($start) and $current_time <= strtotime($end)) + { + if ($key == 'price_label') $data = $price_date['label']; + else $data = $price_date[$key]; + } + } + } + + return $data; + } + + public function get_ticket_price_key($ticket, $current_date, $event_id, $key, $timestamp = null) + { + $data = $this->get_ticket_regular_price_key($ticket, $current_date, $event_id, $key, $timestamp); + + return $this->get_price_for_loggedin_users($event_id, $data, $key); + } + + /** + * Returns tickets prices of an event for a certain date + * @param int $event_id + * @param string $date + * @param string $key + * @param int $timestamp + * @return array + * @author Webnus + */ + public function get_tickets_prices($event_id, $date, $key = 'price', $timestamp = null) + { + $prices = []; + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + // No Ticket Found! + if (!is_array($tickets) || !count($tickets)) return $prices; + + foreach ($tickets as $ticket_id => $ticket) + { + $price = $this->get_ticket_price_key($ticket, $date, $event_id, $key, $timestamp); + $prices[$ticket_id] = apply_filters('mec_filter_ticket_price', $price, $ticket, $event_id, $this); + } + + return $prices; + } + + public function get_price_for_loggedin_users($event_id, $price, $type = 'price') + { + if (!is_user_logged_in()) return $price; + + $user_id = get_current_user_id(); + return $this->get_price_for_users($event_id, $price, $user_id, $type); + } + + public function get_price_for_users($event_id, $price, $user_id, $type = 'price') + { + // Guest User + if (!$user_id) return $price; + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + // User + $user = get_user_by('id', $user_id); + + // Invalid User ID + if (!$user || !isset($user->roles)) return $price; + + $roles = $user->roles; + + $loggedin_discount = $booking_options['loggedin_discount'] ?? 0; + $role_discount = $loggedin_discount; + + // Step through all roles in Array that comes from WordPress Core + foreach ($roles as $role) + { + // If role discount is higher than the preset role OR a previous roles discount, set it to the new higher discount + if (isset($booking_options['roles_discount_' . $role]) and is_numeric($booking_options['roles_discount_' . $role]) and $booking_options['roles_discount_' . $role] > $role_discount) $role_discount = $booking_options['roles_discount_' . $role]; + } + + if (trim($role_discount) and is_numeric($role_discount)) + { + if ($type === 'price_label' and !is_numeric($price)) + { + $numeric = preg_replace("/[^0-9.]/", '', $price); + if (is_numeric($numeric)) $price = $this->main->render_price(($numeric - (($numeric * $role_discount) / 100)), $event_id); + } + else + { + $price = $price - (($price * $role_discount) / 100); + } + } + + // Render Numeric Price + if ($type === 'price_label' and is_numeric($price)) $price = $this->main->render_price($price, $event_id); + + return $price; + } + + public function get_user_booking_limit($event_id) + { + $unlimited = false; + $limit = 12; + $mec_settings = $this->main->get_settings(); + $booking_options = get_post_meta($event_id, 'mec_booking', true); + + // Total user booking limited + if (isset($booking_options['bookings_user_limit_unlimited']) and !trim($booking_options['bookings_user_limit_unlimited'])) + { + $limit = (isset($booking_options['bookings_user_limit']) and trim($booking_options['bookings_user_limit'])) ? trim($booking_options['bookings_user_limit']) : $limit; + } + else + { + // If Inherit from global options activate + if (!isset($mec_settings['booking_limit']) or !trim($mec_settings['booking_limit'])) $unlimited = true; + else $limit = trim($mec_settings['booking_limit']); + } + + return [$limit, $unlimited]; + } + + public function get_minimum_tickets_per_booking($event_id) + { + $booking_options = get_post_meta($event_id, 'mec_booking', true); + + $bookings_minimum_per_booking = (isset($booking_options['bookings_minimum_per_booking']) and trim($booking_options['bookings_minimum_per_booking'])) ? (int) $booking_options['bookings_minimum_per_booking'] : 1; + return max($bookings_minimum_per_booking, 1); + } + + public function timestamp($start, $end) + { + // Timestamp is already available + if (isset($start['timestamp']) && isset($end['timestamp'])) + { + return $start['timestamp'] . ':' . $end['timestamp']; + } + + $s_hour = $start['hour']; + if (strtoupper($start['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $e_hour = $end['hour']; + if (strtoupper($end['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $start_time = $start['date'] . ' ' . sprintf("%02d", $s_hour) . ':' . sprintf("%02d", $start['minutes']) . ' ' . $start['ampm']; + $end_time = $end['date'] . ' ' . sprintf("%02d", $e_hour) . ':' . sprintf("%02d", $end['minutes']) . ' ' . $end['ampm']; + + return strtotime($start_time) . ':' . strtotime($end_time); + } + + public function get_event_id_by_transaction_id($transaction_id) + { + $transaction = $this->get_transaction($transaction_id); + return $transaction['event_id'] ?? 0; + } + + public function get_attendee_price($transaction, $email) + { + if (!is_array($transaction)) $transaction = $this->get_transaction($transaction); + + // No Attendees found! + if (!isset($transaction['tickets']) || !is_array($transaction['tickets'])) return false; + + $attendee = []; + foreach ($transaction['tickets'] as $key => $ticket) + { + if (!is_numeric($key)) continue; + + if ($ticket['email'] == $email) + { + $attendee = $ticket; + break; + } + } + + // Attendee not found + if (!count($attendee)) return false; + + $event_id = $transaction['event_id'] ?? 0; + if (!$event_id) return false; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $dates = explode(':', $transaction['date']); + + $ticket_price = isset($tickets[$attendee['id']]) ? $this->get_ticket_price($tickets[$attendee['id']], date('Y-m-d', $dates[0]), $event_id, $dates[0]) : 0; + if (!$ticket_price) return false; + + $variation_price = 0; + + // Ticket Variations + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + $ticket_variations = $this->main->ticket_variations($event_id, $attendee['id']); + foreach ($attendee['variations'] as $variation_id => $variation_count) + { + if (!$variation_count || $variation_count < 0) continue; + + $variation_price += ((isset($ticket_variations[$variation_id]['price']) and is_numeric($ticket_variations[$variation_id]['price'])) ? $ticket_variations[$variation_id]['price'] : 0); + } + } + + return ($ticket_price + $variation_price); + } + + public function get_auto_verification_status($event_id, $book_id) + { + // Booking Options + $BO = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($BO)) $BO = []; + + $event_auto_verify = (isset($BO['auto_verify']) and trim($BO['auto_verify']) != '') ? $BO['auto_verify'] : 'global'; + if (is_numeric($event_auto_verify)) $event_auto_verify = (int) $event_auto_verify; + + if ($event_auto_verify === 'global') + { + $auto_verify_free = $this->settings['booking_auto_verify_free'] ?? 0; + $auto_verify_paid = $this->settings['booking_auto_verify_paid'] ?? 0; + } + else + { + $auto_verify_free = $event_auto_verify; + $auto_verify_paid = $event_auto_verify; + } + + return apply_filters('mec_get_auto_verification_status', [$auto_verify_free, $auto_verify_paid], $event_id, $book_id); + } + + public function get_auto_confirmation_status($event_id, $book_id) + { + // Booking Options + $BO = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($BO)) $BO = []; + + $event_auto_confirm = (isset($BO['auto_confirm']) and trim($BO['auto_confirm']) != '') ? $BO['auto_confirm'] : 'global'; + if (is_numeric($event_auto_confirm)) $event_auto_confirm = (int) $event_auto_confirm; + + if ($event_auto_confirm === 'global') + { + $auto_confirm_free = $this->settings['booking_auto_confirm_free'] ?? 0; + $auto_confirm_paid = $this->settings['booking_auto_confirm_paid'] ?? 0; + } + else + { + $auto_confirm_free = $event_auto_confirm; + $auto_confirm_paid = $event_auto_confirm; + } + + return apply_filters('mec_get_auto_confirmation_status', [$auto_confirm_free, $auto_confirm_paid], $event_id, $book_id); + } + + public function get_total_tickets($event_id) + { + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $total_bookings_limit = (isset($booking_options['bookings_limit']) and trim($booking_options['bookings_limit']) !== '') ? $booking_options['bookings_limit'] : 100; + $bookings_limit_unlimited = $booking_options['bookings_limit_unlimited'] ?? 0; + + if ($bookings_limit_unlimited == '1') $total_bookings_limit = '-1'; + + $all_ticket_availability = -1; + foreach ($tickets as $ticket_id => $ticket) + { + $limit = (isset($ticket['limit']) and trim($ticket['limit']) != '') ? $ticket['limit'] : -1; + + $ticket_seats = (isset($ticket['seats']) and is_numeric($ticket['seats'])) ? (int) $ticket['seats'] : 1; + $ticket_seats = max(1, $ticket_seats); + + // Ticket is Unlimited + if ((isset($ticket['unlimited']) && $ticket['unlimited'] == 1) || $limit == -1) continue; + + // Unlimited Total + if ($total_bookings_limit == '-1') $ticket_availability = $limit; + else $ticket_availability = min($limit, max($total_bookings_limit, 0)); + + $all_ticket_availability = max($all_ticket_availability, 0); + $all_ticket_availability += $ticket_availability >= 0 ? floor($ticket_availability / $ticket_seats) : 0; + } + + $final = $all_ticket_availability != '-1' ? $all_ticket_availability : $total_bookings_limit; + + return $final == '-1' ? __('Unlimited', 'modern-events-calendar-lite') : $final; + } + + public function get_all_sold_tickets($event_id) + { + // Transient Key + $transient_key = 'all_sold_tickets_' . $event_id; + + // Cached Data + $cached = get_transient($transient_key); + + // Return Cached Data + if ($cached) return $cached; + + $query = new WP_Query([ + 'post_type' => $this->PT, + 'posts_per_page' => -1, + 'post_status' => ['publish', 'pending', 'draft', 'future', 'private'], + 'meta_query' => [ + ['key' => 'mec_event_id', 'value' => $event_id, 'compare' => '='], + ['key' => 'mec_confirmed', 'value' => 1, 'compare' => '='], + ['key' => 'mec_verified', 'value' => 1, 'compare' => '='], + ], + ]); + + $sold = 0; + if ($query->have_posts()) + { + // The Loop + while ($query->have_posts()) + { + $query->the_post(); + $sold += $this->get_total_attendees(get_the_ID()); + } + + // Restore original Post Data + wp_reset_postdata(); + } + + // Set Transient + set_transient($transient_key, $sold, 24 * HOUR_IN_SECONDS); + + return $sold; + } + + public function get_ticket_total_price($transaction, $attendee, $booking_id) + { + $event_id = $transaction['event_id']; + + $all_attendees = get_post_meta($booking_id, 'mec_attendees', true); + if (!is_array($all_attendees) || !count($all_attendees)) $all_attendees = [get_post_meta($booking_id, 'mec_attendee', true)]; + + if (isset($all_attendees['attachments'])) unset($all_attendees['attachments']); + + $total_price = get_post_meta($booking_id, 'mec_price', true); + if (count($all_attendees) == 1) return $total_price; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + $ticket_id = $attendee['id']; + + $ticket_variations = $this->main->ticket_variations($event_id, $ticket_id); + + $ticket_price_booking_saved = get_post_meta($booking_id, 'mec_ticket_price_' . $ticket_id, true); + if (trim($ticket_price_booking_saved) === '') $ticket_price_booking_saved = 0; + + $ticket_price = (isset($tickets[$ticket_id]) ? $tickets[$ticket_id]['price'] : $ticket_price_booking_saved); + + $user = $this->getUser(); + $booking_user = $user->booking($booking_id); + + $ticket_price = $this->get_price_for_users($event_id, $ticket_price, $booking_user->ID); + + // Price Per Date + if (isset($tickets[$ticket_id]['dates']) and is_array($tickets[$ticket_id]['dates']) and count($tickets[$ticket_id]['dates'])) + { + $book_time = strtotime(get_post_meta($booking_id, 'mec_booking_time', true)); + if ($book_time) + { + $pdates = $tickets[$ticket_id]['dates']; + foreach ($pdates as $pdate) + { + if (!isset($pdate['start']) or !isset($pdate['end'])) continue; + + $t_start = strtotime($pdate['start']); + $t_end = strtotime($pdate['end']); + + if ($book_time >= $t_start and $book_time <= $t_end and isset($pdate['price'])) + { + $ticket_price = $pdate['price']; + break; + } + } + } + } + + $variation_price = 0; + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + foreach ($attendee['variations'] as $variation_id => $count) + { + if (!trim($count)) continue; + if (!isset($ticket_variations[$variation_id])) continue; + + $p = $ticket_variations[$variation_id]['price']; + if (is_numeric($p) and is_numeric($count)) $variation_price += ($p * $count); + } + } + + // Fees + $total_fees = 0; + + // Discounts + $discounts = 0; + + if (isset($transaction['price_details']) and isset($transaction['price_details']['details']) and is_array($transaction['price_details']['details']) and count($transaction['price_details']['details'])) + { + foreach ($transaction['price_details']['details'] as $detail) + { + if (!isset($detail['type'])) continue; + + if ($detail['type'] == 'fee' and isset($detail['amount']) and is_numeric($detail['amount'])) $total_fees += $detail['amount']; + if ($detail['type'] == 'discount' and isset($detail['amount']) and is_numeric($detail['amount'])) $discounts += $detail['amount']; + } + } + + $ticket_total_price = null; + if (is_numeric($ticket_price) and is_numeric($variation_price) and is_numeric($total_fees) and is_numeric($discounts)) + { + + $ticket_total_price = ($ticket_price + $variation_price + ($total_fees / count($all_attendees))) - ($discounts / count($all_attendees)); + } + + return (!is_null($ticket_total_price) ? $ticket_total_price : $total_price); + } + + /** + * Remove Fees From a Transaction + * @param int $transaction_id + * @return boolean + * @author Webnus + */ + public function remove_fees($transaction_id) + { + $transaction = $this->get_transaction($transaction_id); + $price_details = $transaction['price_details']['details']; + + $removed_fees = []; + foreach ($price_details as $i => $price_detail) + { + if (isset($price_detail['type']) and $price_detail['type'] == 'fee') + { + $removed_fees[] = $price_detail; + unset($price_details[$i]); + } + } + + $transaction['price_details']['details'] = $price_details; + $transaction['removed_fees_status'] = 1; + $transaction['removed_fees'] = (count($removed_fees) ? $removed_fees : ($transaction['removed_fees'] ?? [])); + + // Re-calculate + $transaction = $this->recalculate($transaction); + + // Update Transaction + $this->update_transaction($transaction_id, $transaction); + + return true; + } + + /** + * Re-Add Fees To a Transaction + * @param int $transaction_id + * @return boolean + * @author Webnus + */ + public function readd_fees($transaction_id) + { + $transaction = $this->get_transaction($transaction_id); + + $is_removed = $transaction['removed_fees_status'] ?? 0; + if (!$is_removed) return false; + + $price_details = $transaction['price_details']['details']; + + $removed_fees = (isset($transaction['removed_fees']) and is_array($transaction['removed_fees'])) ? $transaction['removed_fees'] : []; + foreach ($removed_fees as $removed_fee) $price_details[] = $removed_fee; + + $transaction['price_details']['details'] = $price_details; + + unset($transaction['removed_fees_status']); + unset($transaction['removed_fees']); + + // Re-calculate + $transaction = $this->recalculate($transaction); + + // Update Transaction + $this->update_transaction($transaction_id, $transaction); + + return true; + } + + public function get_cancel_url($event, $booking_id) + { + $event_url = trim(get_permalink($event), '/ '); + $cancelation_key = get_post_meta($booking_id, 'mec_cancellation_key', true); + + if (strpos($event_url, '?') === false) return $event_url . '/cancel/' . $cancelation_key . '/'; + else return $this->main->add_qs_var('cancel', $cancelation_key, $event_url); + } +} diff --git a/app/libraries/bookingRecord.php b/app/libraries/bookingRecord.php new file mode 100755 index 0000000..71bed51 --- /dev/null +++ b/app/libraries/bookingRecord.php @@ -0,0 +1,195 @@ + + */ +class MEC_bookingRecord extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_db + */ + public $db; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // Import MEC DB + $this->db = $this->getDB(); + } + + /** + * @param WP_Post|integer $booking + * @return array + */ + public function insert($booking) + { + // Get Booking by ID + if(is_numeric($booking)) $booking = get_post($booking); + + if(!$booking || !is_a($booking, '\WP_Post')) return []; + + // User Library + $u = $this->getUser(); + + // Get Main User + $user = $u->booking($booking->ID); + + $user_id = $user ? $user->ID : 0; + $verified = get_post_meta($booking->ID, 'mec_verified', true); + $confirmed = get_post_meta($booking->ID, 'mec_confirmed', true); + $event_id = get_post_meta($booking->ID, 'mec_event_id', true); + $ticket_ids = get_post_meta($booking->ID, 'mec_ticket_id', true); + $transaction_id = get_post_meta($booking->ID, 'mec_transaction_id', true); + + $event_tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($event_tickets)) $event_tickets = []; + + $seats = 0; + $booked_ticket_ids = explode(',', trim($ticket_ids, ', ')); + foreach($booked_ticket_ids as $booked_ticket_id) + { + $booked_ticket_id = (int) trim($booked_ticket_id); + $data = (isset($event_tickets[$booked_ticket_id]) and is_array($event_tickets[$booked_ticket_id])) ? $event_tickets[$booked_ticket_id] : []; + + $ticket_seats = (isset($data['seats']) and is_numeric($data['seats'])) ? (int) $data['seats'] : 1; + $seats += $ticket_seats; + } + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + $all_occurrences = $booking_options['bookings_all_occurrences'] ?? 0; + + $attendees = get_post_meta($booking->ID, 'mec_attendees', true); + + $all_dates = get_post_meta($booking->ID, 'mec_all_dates', true); + $timestamps = []; + + // Multiple Dates + if($all_dates and is_array($all_dates) and count($all_dates)) $timestamps = $all_dates; + // Single Date + else $timestamps[] = get_post_meta($booking->ID, 'mec_date', true); + + $ids = []; + foreach($timestamps as $timestamp) + { + $timestamp = is_array($timestamp) ? '' : explode(':', $timestamp)[0]; + if($timestamp && !is_numeric($timestamp)) $timestamp = strtotime($timestamp); + + if(!trim($timestamp)) continue; + + // Exists? + $exists = $this->db->select("SELECT `id` FROM `#__mec_bookings` WHERE `transaction_id`='".esc_sql($transaction_id)."' AND `timestamp`='".esc_sql($timestamp)."'", 'loadResult'); + if($exists) continue; + + // Insert + $query = "INSERT INTO `#__mec_bookings` (`booking_id`,`user_id`,`transaction_id`,`event_id`,`ticket_ids`,`seats`,`status`,`confirmed`,`verified`,`all_occurrences`,`date`,`timestamp`) VALUES ('".esc_sql($booking->ID)."','".esc_sql($user_id)."','".esc_sql($transaction_id)."','".esc_sql($event_id)."','".esc_sql($ticket_ids)."','".esc_sql($seats)."','".$booking->post_status."','".esc_sql($confirmed)."','".esc_sql($verified)."','".esc_sql($all_occurrences)."','".date('Y-n-d H:i:s', $timestamp)."','".esc_sql($timestamp)."');"; + $id = $this->db->q($query, 'INSERT'); + + foreach($attendees as $k => $attendee) + { + // No Attendee + if(!is_numeric($k)) continue; + if(!isset($attendee['id'])) continue; + + // Ticket ID + $ticket_id = $attendee['id']; + + // Register attendee in MEC + $attendee_id = $u->register($attendee, [ + 'register_in_mec' => true, + ]); + + // Insert Booking Attendees + $query = "INSERT INTO `#__mec_booking_attendees` (`mec_booking_id`,`user_id`,`ticket_id`) VALUES ('".esc_sql($id)."','".esc_sql($attendee_id)."','".esc_sql($ticket_id)."');"; + $this->db->q($query, 'INSERT'); + } + + $ids[] = $id; + } + + return $ids; + } + + /** + * @param WP_Post|integer $booking + * @return array + */ + public function update($booking) + { + // Delete + $this->delete($booking); + + return $this->insert($booking); + } + + /** + * @param WP_Post|integer $booking + */ + public function delete($booking) + { + // Get Booking by ID + if(is_numeric($booking)) $booking = get_post($booking); + + $this->db->q("DELETE FROM `#__mec_bookings` WHERE `booking_id`='".$booking->ID."'"); + } + + public function confirm($booking) + { + return $this->set($booking, array('confirmed' => 1)); + } + + public function reject($booking) + { + return $this->set($booking, array('confirmed' => -1)); + } + + public function pending($booking) + { + return $this->set($booking, array('confirmed' => 0)); + } + + public function verify($booking) + { + return $this->set($booking, array('verified' => 1)); + } + + public function cancel($booking) + { + return $this->set($booking, array('verified' => -1)); + } + + public function waiting($booking) + { + return $this->set($booking, array('verified' => 0)); + } + + public function set($booking, $values) + { + // Get Booking by ID + if(is_numeric($booking)) $booking = get_post($booking); + + // Invalid Booking + if(!$booking || !is_a($booking, '\WP_Post')) return []; + + $q = ""; + foreach($values as $key => $value) $q .= "`".esc_attr($key)."`='".esc_sql($value)."',"; + + // Nothing to Update! + if(trim($q) == '') return false; + + return $this->db->q("UPDATE `#__mec_bookings` SET ".trim($q, ', ')." WHERE `booking_id`='".esc_sql($booking->ID)."'"); + } +} \ No newline at end of file diff --git a/app/libraries/cache.php b/app/libraries/cache.php new file mode 100755 index 0000000..9962e57 --- /dev/null +++ b/app/libraries/cache.php @@ -0,0 +1,87 @@ + + */ +class MEC_cache +{ + protected static $instance = null; + protected static $cache = []; + protected static $enabled = true; + + /** + * Constructor method + * @author Webnus + */ + private function __construct() + { + } + + public function __clone() + { + } + + public function __wakeup() + { + } + + public static function getInstance() + { + // Get an instance of Class + if(is_null(self::$instance)) self::$instance = new self(); + + // Return the instance + return self::$instance; + } + + public static function set($key, $value) + { + self::$cache[$key] = $value; + } + + public static function has($key) + { + return isset(self::$cache[$key]); + } + + public static function get($key) + { + return self::$cache[$key] ?? NULL; + } + + public static function delete($key) + { + if(MEC_cache::has($key)) + { + unset(self::$cache[$key]); + return true; + } + + return false; + } + + public function disable() + { + return self::$enabled = false; + } + + public function enable() + { + return self::$enabled = true; + } + + public function rememberOnce($key, $callback) + { + if($this->has($key) and self::$enabled) $data = $this->get($key); + else + { + $data = call_user_func($callback); + $this->set($key, $data); + } + + return $data; + } +} \ No newline at end of file diff --git a/app/libraries/captcha.php b/app/libraries/captcha.php new file mode 100755 index 0000000..a8f8e80 --- /dev/null +++ b/app/libraries/captcha.php @@ -0,0 +1,189 @@ + + */ +class MEC_captcha extends MEC_base +{ + const GOOGLE = 'grecaptcha'; + const MTCAPTCHA = 'mtcaptcha'; + + /** + * @var MEC_main + */ + public $main; + + /** + * @var array + */ + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Main library + $this->main = $this->getMain(); + + // MEC settings + $this->settings = $this->main->get_settings(); + } + + public function assets() + { + // Captcha Client + $client = $this->client(); + + // Captcha is disabled + if(!$client) return false; + + // Current locale + $locale = $this->main->get_current_language(); + + // Google Recaptcha + if($client === self::GOOGLE) + { + // Include Google Recaptcha Javascript API + if(apply_filters('mec_grecaptcha_include', true)) wp_enqueue_script('recaptcha', '//www.google.com/recaptcha/api.js?hl='.str_replace('_', '-', $locale), array(), $this->main->get_version(), true); + } + elseif($client === self::MTCAPTCHA) + { + $ex = explode('_', $locale); + $lang_code = $ex[0]; + + add_action('wp_head', function() use ($lang_code) + { + ?> + + client(); + + // Captcha is disabled + if(!$client) return ''; + + // Google Recaptcha + if($client === self::GOOGLE) + { + return '
    +
    +
    '; + } + elseif($client === self::MTCAPTCHA) + { + return '
    +
    +
    '; + } + + return ''; + } + + public function is_valid() + { + // Captcha Client + $client = $this->client(); + + // Captcha is disabled + if(!$client) return false; + + // Google Recaptcha + if($client === self::GOOGLE) + { + $token = isset($_REQUEST['g-recaptcha-response']) ? sanitize_text_field($_REQUEST['g-recaptcha-response']) : NULL; + + $req = ""; + foreach([ + 'secret' => $this->settings['google_recaptcha_secretkey'] ?? '', + 'remoteip' => $this->main->get_client_ip(), + 'v' => 'php_1.0', + 'response' => $token + ] as $key=>$value) $req .= $key.'='.urlencode(stripslashes($value)).'&'; + + // Validate the re-captcha + $response = $this->main->get_web_page("https://www.google.com/recaptcha/api/siteverify?".trim($req, '& ')); + $answers = json_decode($response, true); + + if(isset($answers['success']) and trim($answers['success'])) return true; + else return false; + } + elseif($client === self::MTCAPTCHA) + { + $token = isset($_REQUEST['mtcaptcha-verifiedtoken']) ? sanitize_text_field($_REQUEST['mtcaptcha-verifiedtoken']) : NULL; + + // Validate the re-captcha + $response = $this->main->get_web_page("https://service.mtcaptcha.com/mtcv1/api/checktoken?privatekey=".urlencode(stripslashes($this->settings['mtcaptcha_privatekey']))."&token=".urlencode(stripslashes($token))); + $answers = json_decode($response, true); + + if(isset($answers['success']) and $answers['success']) return true; + else return false; + } + + return false; + } + + /** + * @param string $section + * @return bool + */ + public function status($section = '') + { + // Captcha Client + $client = $this->client(); + + // Captcha is disabled + if(!$client) return false; + + // Google Recaptcha + if($client === self::GOOGLE) + { + // Check if the feature is enabled for certain section + if(trim($section) and (!isset($this->settings['google_recaptcha_'.$section]) or (isset($this->settings['google_recaptcha_'.$section]) and !$this->settings['google_recaptcha_'.$section]))) return false; + + // Check if site key and secret key is not empty + if(!isset($this->settings['google_recaptcha_sitekey']) or (isset($this->settings['google_recaptcha_sitekey']) and trim($this->settings['google_recaptcha_sitekey']) === '')) return false; + if(!isset($this->settings['google_recaptcha_secretkey']) or (isset($this->settings['google_recaptcha_secretkey']) and trim($this->settings['google_recaptcha_secretkey']) === '')) return false; + } + elseif($client === self::MTCAPTCHA) + { + // Check if the feature is enabled for certain section + if(trim($section) and (!isset($this->settings['mtcaptcha_'.$section]) or (isset($this->settings['mtcaptcha_'.$section]) and !$this->settings['mtcaptcha_'.$section]))) return false; + + // Check if site key and secret key is not empty + if(!isset($this->settings['mtcaptcha_sitekey']) or (isset($this->settings['mtcaptcha_sitekey']) and trim($this->settings['mtcaptcha_sitekey']) === '')) return false; + if(!isset($this->settings['mtcaptcha_privatekey']) or (isset($this->settings['mtcaptcha_privatekey']) and trim($this->settings['mtcaptcha_privatekey']) === '')) return false; + } + + return true; + } + + public function client() + { + // Google Recaptcha + if(isset($this->settings['google_recaptcha_status']) and $this->settings['google_recaptcha_status']) return self::GOOGLE; + // MTCaptcha + elseif(isset($this->settings['mtcaptcha_status']) and $this->settings['mtcaptcha_status']) return self::MTCAPTCHA; + + return false; + } +} \ No newline at end of file diff --git a/app/libraries/cart.php b/app/libraries/cart.php new file mode 100755 index 0000000..e483a55 --- /dev/null +++ b/app/libraries/cart.php @@ -0,0 +1,257 @@ + + */ +class MEC_cart extends MEC_base +{ + /** + * @var MEC_main + */ + private $main; + private $settings; + private $ticket_names = []; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + public function add($transaction_id) + { + $cart_id = $this->get_cart_id(); + + $cart = $this->get_cart($cart_id); + $cart[] = $transaction_id; + + $this->update_cart($cart_id, $cart); + + // Add to Ticket Names + $this->ticket_names = array_merge($this->ticket_names, $this->get_ticket_names($transaction_id)); + + return $this; + } + + public function remove($transaction_id) + { + $cart_id = $this->get_cart_id(); + + $cart = $this->get_cart($cart_id); + if(!in_array($transaction_id, $cart)) return false; + + $key = array_search($transaction_id, $cart); + if($key !== false) unset($cart[$key]); + + $this->update_cart($cart_id, $cart); + + return true; + } + + public function next() + { + $ticket_names = implode(', ', $this->ticket_names); + if(trim($ticket_names) === '') $ticket_names = esc_html__('Ticket', 'modern-events-calendar-lite'); + + // Checkout URL + if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'checkout') return array('type' => 'url', 'url' => $this->get_checkout_url()); + // Optional Checkout URL + if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'optional_cart') return array('type' => 'message', 'message' => '
    '); + // Optional Cart URL + if(isset($this->settings['cart_after_add']) and $this->settings['cart_after_add'] == 'optional_chckout') return array('type' => 'message', 'message' => '
    '); + // Cart URL + else return array('type' => 'url', 'url' => $this->get_cart_url()); + } + + public function get_cart($cart_id) + { + $cart = get_option('mec_cart_'.$cart_id, NULL); + if(is_null($cart)) + { + $cart = []; + update_option('mec_cart_'.$cart_id, $cart, false); + } + + if(!is_array($cart)) $cart = []; + return $cart; + } + + public function update_cart($cart_id, $value) + { + return update_option('mec_cart_'.$cart_id, $value, false); + } + + public function archive_cart($cart_id) + { + $value = $this->get_cart($cart_id); + return update_option('mec_cart_'.$cart_id.'_archived', $value, false); + } + + public function get_archived_cart($cart_id) + { + $cart = get_option('mec_cart_'.$cart_id.'_archived', NULL); + + if(!is_array($cart)) $cart = []; + return $cart; + } + + public function get_cart_id() + { + $cart_id = (isset($_COOKIE['mec_cart']) and trim($_COOKIE['mec_cart'])) ? sanitize_text_field($_COOKIE['mec_cart']) : NULL; + if(!$cart_id and !headers_sent()) $cart_id = $this->get_fresh_cart_id(); + + return $cart_id; + } + + public function get_fresh_cart_id() + { + $cart_id = mt_rand(100000000, 999999999); + setcookie('mec_cart', $cart_id, (time()+(30*86400)), '/'); + + return $cart_id; + } + + public function get_checkout_url() + { + $page_id = (isset($this->settings['checkout_page']) and trim($this->settings['checkout_page'])) ? $this->settings['checkout_page'] : NULL; + return ($page_id ? get_permalink($page_id) : home_url()); + } + + public function get_cart_url() + { + $page_id = (isset($this->settings['cart_page']) and trim($this->settings['cart_page'])) ? $this->settings['cart_page'] : NULL; + $language_codes_array = null; + $language_current_code = null; + if ( class_exists( 'TRP_Translate_Press' ) ){ + $trp = TRP_Translate_Press::get_trp_instance(); + $trp_settings = $trp->get_component( 'settings' ); + $language_codes_array = $trp_settings->get_settings()['publish-languages']; + $language_current_code = $_REQUEST['trp-form-language']; + } + + if(!empty($language_codes_array)){ + return home_url() . '/'.$language_current_code.str_replace(home_url(),'',get_permalink($page_id)); + }else{ + return ($page_id ? get_permalink($page_id) : home_url()); + } + } + + public function get_ticket_names($transaction_id) + { + $book = $this->getBook(); + $transaction = $book->get_transaction($transaction_id); + + $event_id = ((isset($transaction['event_id']) and $transaction['event_id']) ? $transaction['event_id'] : 0); + $tickets = ((isset($transaction['tickets']) and is_array($transaction['tickets'])) ? $transaction['tickets'] : array()); + + $event_tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($event_tickets)) $event_tickets = []; + + $names = []; + foreach($tickets as $key => $ticket) + { + if(!is_numeric($key)) continue; + + $ticket_id = (isset($ticket['id']) and $ticket['id']) ? $ticket['id'] : 0; + if(!$ticket_id) continue; + + $ticket = $event_tickets[$ticket_id] ?? []; + $ticket_name = ($ticket['name'] ?? ''); + + if(trim($ticket_name)) $names[] = $ticket_name; + } + + return array_unique($names); + } + + public function get_payable($cart = NULL) + { + if(is_null($cart)) + { + $cart_id = $this->get_cart_id(); + $cart = $this->get_cart($cart_id); + } + + // Booking Library + $book = $this->getBook(); + + $payable = 0; + foreach($cart as $transaction_id) + { + $TO = $book->get_TO($transaction_id); + + $payable += $TO->get_payable(); + } + + return $payable; + } + + public function is_free($cart = NULL) + { + $payable = $this->get_payable($cart); + return !($payable > 0); + } + + public function clear($cart_id) + { + // Save it for future usage + $this->archive_cart($cart_id); + + // Make it empty + $this->update_cart($cart_id, array()); + + // New Cart ID + $this->get_fresh_cart_id(); + } + + public function get_first_event_id($cart = NULL) + { + if(is_null($cart)) + { + $cart_id = $this->get_cart_id(); + $cart = $this->get_cart($cart_id); + } + + // Booking Library + $book = $this->getBook(); + + $event_id = NULL; + foreach($cart as $transaction_id) + { + $TO = $book->get_TO($transaction_id); + + $event_id = $TO->get_event_id(); + break; + } + + return $event_id; + } + + public function get_invoice_link($cart_id) + { + if(isset($this->settings['mec_cart_invoice']) and !$this->settings['mec_cart_invoice']) return ''; + + $url = $this->main->URL(); + $url = $this->main->add_qs_var('method', 'mec-cart-invoice', $url); + + // Invoice Key + $url = $this->main->add_qs_var('mec-key', $cart_id, $url); + + return apply_filters('mec_cart_invoice_url', $url, $cart_id); + } + + public function is_done($cart_id) + { + return (bool) $this->get_archived_cart($cart_id); + } +} diff --git a/app/libraries/db.php b/app/libraries/db.php new file mode 100755 index 0000000..bd398dd --- /dev/null +++ b/app/libraries/db.php @@ -0,0 +1,240 @@ + + */ +class MEC_db extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } + + /** + * Runs any query + * @author Webnus + * @param string $query + * @param string $type + * @return mixed + */ + public function q($query, $type = '') + { + // Apply DB prefix + $query = $this->_prefix($query); + + // Converts query type to lowercase + $type = strtolower($type); + + // Calls select function if query type is select + if($type == 'select') return $this->select($query); + + // Get WordPress DB object + $database = $this->get_DBO(); + + // If query type is insert, return the insert id + if($type == 'insert') + { + $database->query($query); + return $database->insert_id; + } + + // Run the query and return the result + return $database->query($query); + + } + + /** + * Returns records count of a query + * @author Webnus + * @param string $query + * @param string $table + * @return int + */ + public function num($query, $table = '') + { + // If table is filled, generate the query + if(trim($table) != '') $query = "SELECT COUNT(*) FROM `#__$table`"; + + // Apply DB prefix + $query = $this->_prefix($query); + + // Get WordPress Db object + $database = $this->get_DBO(); + return $database->get_var($query); + } + + /** + * Selects records from Database + * @author Webnus + * @param string $query + * @param string $result + * @return mixed + */ + public function select($query, $result = 'loadObjectList') + { + // Apply DB prefix + $query = $this->_prefix($query); + + // Get WordPress DB object + $database = $this->get_DBO(); + + if($result == 'loadObjectList') return $database->get_results($query, OBJECT_K); + elseif($result == 'loadObject') return $database->get_row($query, OBJECT); + elseif($result == 'loadAssocList') return $database->get_results($query, ARRAY_A); + elseif($result == 'loadAssoc') return $database->get_row($query, ARRAY_A); + elseif($result == 'loadResult') return $database->get_var($query); + elseif($result == 'loadColumn') return $database->get_col($query); + else return $database->get_results($query, OBJECT_K); + } + + /** + * Get a record from Database + * @author Webnus + * @param string|array $selects + * @param string $table + * @param string $field + * @param string $value + * @param boolean $return_object + * @param string $condition + * @return mixed + */ + public function get($selects, $table, $field, $value, $return_object = true, $condition = '') + { + $fields = ''; + + if(is_array($selects)) + { + foreach($selects as $select) $fields .= '`'.$select.'`,'; + $fields = trim($fields, ' ,'); + } + else + { + $fields = $selects; + } + + // Generate the condition + if(trim($condition) == '') $condition = "`$field`='".esc_sql($value)."'"; + + // Generate the query + $query = "SELECT $fields FROM `#__$table` WHERE $condition"; + + // Apply DB prefix + $query = $this->_prefix($query); + + // Get WordPress DB object + $database = $this->get_DBO(); + + if($selects != '*' and !is_array($selects)) return $database->get_var($query); + elseif($return_object) + { + return $database->get_row($query); + } + else + { + return $database->get_row($query, ARRAY_A); + } + } + + public function columns($table = 'mec_dates', $column = NULL) + { + if(trim($table) == '') return false; + + $query = "SHOW COLUMNS FROM `#__".$table."`"; + $results = $this->q($query, "select"); + + $columns = []; + foreach($results as $result) $columns[] = $result->Field; + + if(trim($column) and in_array($column, $columns)) return true; + elseif(trim($column)) return false; + + return $columns; + } + + /** + * Check if a table exist or not + * @param string $table + * @return bool + */ + public function exists($table) + { + $query = "SHOW TABLES LIKE '#__".$table."'"; + return (bool) $this->select($query, "loadObject"); + } + + /** + * Apply WordPress table prefix on queries + * @author Webnus + * @param string $query + * @return string + */ + public function _prefix($query) + { + // Get WordPress DB object + $wpdb = $this->get_DBO(); + + $charset = $wpdb->charset; + if(!trim($charset)) $charset = 'utf8'; + + $collate = $wpdb->collate; + if(!trim($collate)) + { + $charset = 'utf8'; + $collate = 'utf8_unicode_ci'; + } + + $query = str_replace('#__blogs', $wpdb->base_prefix.'blogs', $query); + $query = str_replace('#__', $wpdb->prefix, $query); + $query = str_replace('[:CHARSET:]', $charset, $query); + + return str_replace('[:COLLATE:]', $collate, $query); + } + + public function escape($parameter) + { + $database = $this->get_DBO(); + global $wp_version; + + if(is_array($parameter)) + { + $return_data = []; + foreach($parameter as $key=>$value) + { + $return_data[$key] = $this->escape($value); + } + } + else + { + if(version_compare($wp_version, '3.6', '<')) $return_data = $database->escape($parameter); + else $return_data = esc_sql($parameter); + } + + return $return_data; + } + + public function prepare($query, ...$args) + { + // Get WordPress DB object + $database = $this->get_DBO(); + + return $database->prepare($query, $args); + } + + /** + * Returns WordPres DB Object + * @author Webnus + * @global wpdb $wpdb + * @return wpdb + */ + public function get_DBO() + { + global $wpdb; + return $wpdb; + } +} \ No newline at end of file diff --git a/app/libraries/eventFields.php b/app/libraries/eventFields.php new file mode 100755 index 0000000..f8baf37 --- /dev/null +++ b/app/libraries/eventFields.php @@ -0,0 +1,131 @@ + + */ +class MEC_eventFields extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + public function form($args) + { + if(!isset($this->settings['display_event_fields_backend']) || $this->settings['display_event_fields_backend'] != 1) return; + + $id = $args['id'] ?? 'mec-event-data'; + $class = $args['class'] ?? 'mec-meta-box-fields mec-event-tab-content'; + $data = $args['data'] ?? []; + $name_prefix = $args['name_prefix'] ?? 'mec'; + $id_prefix = $args['id_prefix'] ?? 'mec_event_fields_'; + $mandatory_status = $args['mandatory_status'] ?? true; + + $event_fields = $this->main->get_event_fields(); + ?> +
    +

    + + $event_field): if(!is_numeric($j)) continue; ?> +
    + +
    + + +
    + +
    + + /> + + + /> + + + /> + + + min="1970-01-01" max="2099-12-31" /> + + + /> + + + + + $name_prefix.'[fields]['.esc_attr($j).']', + 'teeny' => true, + 'media_buttons' => false, + )); ?> + + '.do_shortcode(stripslashes($event_field['content'])).'

    '; + ?> + + + + + + + + + + + + + + +
    + +
    + + +
    + + + */ +class MEC_factory extends MEC_base +{ + public $main; + public $file; + public $folder; + public $db; + public $parser; + + /** + * @static + * @var array + */ + public static $params = []; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Load Vendors + require_once MEC_ABSPATH . 'app/vendor/autoload.php'; + + // MEC Main library + $this->main = $this->getMain(); + + // MEC File library + $this->file = $this->getFile(); + + // MEC Folder library + $this->folder = $this->getFolder(); + + // MEC DB library + $this->db = $this->getDB(); + + // MEC Parser library + $this->parser = $this->getParser(); + + // Import MEC Controller Class + $this->import('app.controller'); + } + + /** + * Register Webnus MEC actions + * @author Webnus + */ + public function load_actions() + { + // Set CronJobs + $this->action('admin_init', array($this, 'mec_add_cron_jobs'), 9999); + + // Register MEC function to be called in WordPress footer hook + $this->action('wp_footer', array($this, 'load_footer'), 9999); + $this->action('admin_footer', array($this, 'load_footer'), 9999); + + // Parse WordPress query + $this->action('parse_query', array($this->parser, 'WPQ_parse'), 99); + + // Add custom styles to header + $this->action('wp_head', array($this, 'include_styles'), 9999999999); + + if (!is_admin()) { + // MEC iCal export + $this->action('init', array($this->main, 'ical'), 9999); + + // MEC iCal export in email + $this->action('init', array($this->main, 'ical_email'), 999); + + // MEC Booking Invoice + $this->action('init', array($this->main, 'booking_invoice'), 9999); + + // MEC Cart Invoice + $this->action('init', array($this->main, 'cart_invoice'), 9999); + + // MEC Print Feature + $this->action('init', array($this->main, 'print_calendar'), 9999); + + // MEC Print Feature + $this->action('wp', array($this->main, 'booking_modal'), 9999); + + // Add Events to Tag Archive Page + $this->action('pre_get_posts', array($this->main, 'add_events_to_tags_archive')); + } + + // Redirect to MEC Dashboard + $this->action('admin_init', array($this->main, 'mec_redirect_after_activate')); + + // MEC booking verification and cancellation + $this->action('mec_before_main_content', array($this->main, 'do_endpoints'), 9999); + + // Add AJAX actions + $this->action('wp_ajax_mec_save_styles', array($this->main, 'save_options')); + $this->action('wp_ajax_mec_save_settings', array($this->main, 'save_options')); + $this->action('wp_ajax_mec_save_reg_form', array($this->main, 'save_options')); + $this->action('wp_ajax_mec_save_gateways', array($this->main, 'save_options')); + $this->action('wp_ajax_mec_save_styling', array($this->main, 'save_options')); + $this->action('wp_ajax_mec_save_notifications', array($this->main, 'save_notifications')); + $this->action('wp_ajax_mec_save_messages', array($this->main, 'save_messages')); + $this->action('wp_ajax_wizard_import_dummy_events', array($this->main, 'wizard_import_dummy_events')); + $this->action('wp_ajax_wizard_import_dummy_shortcodes', array($this->main, 'wizard_import_dummy_shortcodes')); + $this->action('wp_ajax_wizard_save_weekdays', array($this->main, 'save_wizard_options')); + $this->action('wp_ajax_wizard_save_slug', array($this->main, 'save_wizard_options')); + $this->action('wp_ajax_wizard_save_module', array($this->main, 'save_wizard_options')); + $this->action('wp_ajax_wizard_save_single', array($this->main, 'save_wizard_options')); + $this->action('wp_ajax_wizard_save_booking', array($this->main, 'save_wizard_options')); + $this->action('wp_ajax_wizard_save_styling', array($this->main, 'save_wizard_options')); + } + + /** + * Register Webnus MEC hooks such as activate, deactivate and uninstall hooks + * @author Webnus + */ + public function load_hooks() + { + register_activation_hook(MEC_ABSPATH . MEC_FILENAME, array($this, 'activate')); + register_deactivation_hook(MEC_ABSPATH . MEC_FILENAME, array($this, 'deactivate')); + } + + /** + * load MEC filters + * @author Webnus + */ + public function load_filters() + { + // Load MEC Plugin links + $this->filter('plugin_row_meta', array($this, 'load_plugin_links'), 10, 2); + $this->filter('plugin_action_links_' . plugin_basename(MEC_DIRNAME . DS . MEC_FILENAME), array($this, 'load_plugin_action_links'), 10, 1); + + // Add MEC rewrite rules + $this->filter('generate_rewrite_rules', array($this->parser, 'load_rewrites')); + $this->filter('query_vars', array($this->parser, 'add_query_vars')); + + // Manage MEC templates + $this->filter('template_include', array($this->parser, 'template'), 99); + + // Fetch Googlemap style JSON + $this->filter('mec_get_googlemap_style', array($this->main, 'fetch_googlemap_style')); + + // Filter Request + $this->filter('request', array($this->main, 'filter_request')); + + // Block Editor Category + if (function_exists('register_block_type')) $this->filter('block_categories_all', array($this->main, 'add_custom_block_cateogry'), 9999); + + // Add Taxonomy etc to filters + $this->filter('mec_vyear_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vmonth_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vweek_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vday_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vfull_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vmap_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vlist_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vgrid_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vtimetable_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vmasonry_atts', array($this->main, 'add_search_filters')); + $this->filter('mec_vagenda_atts', array($this->main, 'add_search_filters')); + $this->filter('mce_buttons', array($this->main, 'add_mce_buttons')); + $this->filter('mce_external_plugins', array($this->main, 'add_mce_external_plugins')); + + $this->filter('pre_get_document_title', array($this->parser, 'archive_document_title')); + } + + /** + * load MEC menus + * @author Webnus + */ + public function load_menus() + { + add_menu_page( + __('M.E. Calendar', 'modern-events-calendar-lite'), + esc_html__('M.E. Calendar', 'modern-events-calendar-lite'), + apply_filters('mec_menu_cap', 'edit_posts', 'mec-intro'), + 'mec-intro', + array($this->main, 'dashboard'), + plugin_dir_url(__FILE__) . '../../assets/img/mec.svg', + 26 + ); + } + + /** + * load MEC Features + * @author Webnus + */ + public function load_features() + { + $path = MEC_ABSPATH . 'app' . DS . 'features' . DS; + $files = $this->folder->files($path, '.php$'); + + foreach ($files as $file) { + $name = str_replace('.php', '', $file); + + $class = 'MEC_feature_' . $name; + MEC::getInstance('app.features.' . $name, $class); + + if (!class_exists($class)) continue; + + $object = new $class(); + $object->init(); + } + } + + /** + * Inserting MEC plugin links + * @author Webnus + * @param array $links + * @param string $file + * @return array + */ + public function load_plugin_links($links, $file) + { + if (strpos($file, MEC_DIRNAME) !== false) { + if (!$this->getPRO()) { + $upgrade = '' . _x('Upgrade to Pro Version', 'plugin link', 'modern-events-calendar-lite') . ''; + $links[] = $upgrade; + } + } + + return $links; + } + + /** + * Load MEC plugin action links + * @author Webnus + * @param array $links + * @return array + */ + public function load_plugin_action_links($links) + { + $settings = '' . _x('Settings', 'plugin link', 'modern-events-calendar-lite') . ''; + array_unshift($links, $settings); + + if (!$this->getPRO()) { + $upgrade = '' . _x('Upgrade', 'plugin link', 'modern-events-calendar-lite') . ''; + array_unshift($links, $upgrade); + } + + return $links; + } + + public function register_styles_and_scripts() + { + + // Get Current Screen + global $current_screen; + if (!isset($current_screen) && function_exists('get_current_screen')) $current_screen = get_current_screen(); + + $backend_js_dependencies = array( + 'jquery', + 'wp-color-picker', + 'jquery-ui-datepicker', + ); + if (is_a($current_screen, '\WP_Screen') && method_exists($current_screen, 'is_block_editor') and $current_screen->is_block_editor()) { + $backend_js_dependencies[] = 'wp-blocks'; + } + + $js_dependencies = array( + 'jquery', + ); + $scripts = array( + 'mec-typekit-script' => $this->main->asset('js/jquery.typewatch.js'), + 'mec-niceselect-script' => $this->main->asset('js/jquery.nice-select.min.js'), + 'mec-select2-script' => $this->main->asset('packages/select2/select2.full.min.js'), + 'mec-lity-script' => $this->main->asset('packages/lity/lity.min.js'), + 'mec-nice-scroll' => $this->main->asset('js/jquery.nicescroll.min.js'), + 'featherlight' => $this->main->asset('packages/featherlight/featherlight.js'), + 'mec-owl-carousel-script' => $this->main->asset('packages/owl-carousel/owl.carousel.min.js'), + 'mec-backend-script' => array( + 'src' => $this->main->asset('js/backend.js'), + 'deps' => $backend_js_dependencies, + 'in_footer' => false, + ), + 'mec-events-script' => $this->main->asset('js/events.js'), /// dep in front 'mec-frontend-script' + 'mec-general-calendar-script' => $this->main->asset('js/mec-general-calendar.js'), + 'mec-tooltip-script' => $this->main->asset('packages/tooltip/tooltip.js'), + 'mec-shuffle-script' => $this->main->asset('js/shuffle.min.js'), + 'mec-frontend-script' => array( + 'src' => $this->main->asset('js/frontend.js'), + 'deps' => array( + 'jquery', + 'mec-tooltip-script' + ), + ), + 'mec-colorbrightness-script' => $this->main->asset('packages/colorbrightness/colorbrightness.min.js'), + 'mec-chartjs-script' => $this->main->asset('js/chartjs.min.js'), + 'mec-date-format-script' => $this->main->asset('js/date.format.min.js'), + ); + + if (is_plugin_active('mec-single-builder/mec-single-builder.php')) { + $scripts['mec-flipcount-script'] = $this->main->asset('js/flipcount.js'); + } elseif (is_plugin_active('divi-single-builder/divi-single-builder.php') || is_plugin_active('mec-divi-single-builder/divi-single-builder.php')) { + $scripts['mec-flipcount-script'] = $this->main->asset('js/flipcount-divi.js'); + } else { + $scripts['mec-flipcount-script'] = $this->main->asset('js/flipcount.js'); + } + + foreach ($scripts as $script_id => $script) { + + $src = is_array($script) ? $script['src'] : $script; + $deps = is_array($script) && isset($script['deps']) ? $script['deps'] : $js_dependencies; + $version = $this->main->get_version(); + $in_footer = is_array($script) && isset($script['in_footer']) ? $script['in_footer'] : true; + + wp_register_script($script_id, $src, $deps, $version, $in_footer); + } + + $backend_css_dependencies = array( + 'wp-color-picker', + ); + $css_dependencies = array(); + $styles = array( + 'mec-select2-style' => $this->main->asset('packages/select2/select2.min.css'), + 'featherlight' => $this->main->asset('packages/featherlight/featherlight.css'), + 'mec-font-icons' => $this->main->asset('css/iconfonts.css'), + 'mec-backend-rtl-style' => $this->main->asset('css/mecrtl.min.css'), + 'mec-backend-style' => array( + 'src' => $this->main->asset('css/backend.min.css'), + 'deps' => $backend_css_dependencies, + ), + 'mec-lity-style' => $this->main->asset('packages/lity/lity.min.css'), + 'mec-owl-carousel-style' => $this->main->asset('packages/owl-carousel/owl.carousel.min.css'), + 'mec-niceselect-style' => $this->main->asset('css/nice-select.min.css'), + + 'mec-frontend-style' => $this->main->asset('css/frontend.min.css'), + 'accessibility' => $this->main->asset('css/a11y.min.css'), + 'mec-tooltip-style' => $this->main->asset('packages/tooltip/tooltip.css'), + 'mec-tooltip-shadow-style' => $this->main->asset('packages/tooltip/tooltipster-sideTip-shadow.min.css'), + 'mec-general-calendar-style' => $this->main->asset('css/mec-general-calendar.css'), + 'mec-google-fonts' => '//fonts.googleapis.com/css?family=Montserrat:400,700|Roboto:100,300,400,700', + 'mec-custom-google-font' => get_option('mec_gfont'), + ); + foreach ($styles as $style_id => $style) { + + $src = is_array($style) ? $style['src'] : $style; + $deps = is_array($style) && isset($style['deps']) ? $style['deps'] : $css_dependencies; + $version = $this->main->get_version(); + + wp_register_style($style_id, $src, $deps, $version); + } + + // Settings + $settings = $this->main->get_settings(); + wp_localize_script('mec-backend-script', 'mec_admin_localize', array( + 'ajax_url' => admin_url('admin-ajax.php'), + 'ajax_nonce' => wp_create_nonce('mec_settings_nonce'), + 'mce_items' => $this->main->mce_get_shortcode_list(), + 'datepicker_format' => (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? trim($settings['datepicker_format']) : 'yy-mm-dd', + )); + + if (did_action('elementor/loaded')) $elementor_edit_mode = !\Elementor\Plugin::$instance->editor->is_edit_mode() ? 'no' : 'yes'; + else $elementor_edit_mode = 'no'; + + // Settings + $grecaptcha_key = isset($settings['google_recaptcha_sitekey']) ? trim($settings['google_recaptcha_sitekey']) : ''; + $fes_thankyou_page_time = (isset($settings['fes_thankyou_page_time']) and trim($settings['fes_thankyou_page_time']) != '') ? (int) $settings['fes_thankyou_page_time'] : 2000; + + // Localize Some Strings + $mecdata = apply_filters('mec_locolize_data', array( + 'day' => __('day', 'modern-events-calendar-lite'), + 'days' => __('days', 'modern-events-calendar-lite'), + 'hour' => __('hour', 'modern-events-calendar-lite'), + 'hours' => __('hours', 'modern-events-calendar-lite'), + 'minute' => __('minute', 'modern-events-calendar-lite'), + 'minutes' => __('minutes', 'modern-events-calendar-lite'), + 'second' => __('second', 'modern-events-calendar-lite'), + 'seconds' => __('seconds', 'modern-events-calendar-lite'), + 'next' => __('Next', 'modern-events-calendar-lite'), + 'prev' => __('Prev', 'modern-events-calendar-lite'), + 'elementor_edit_mode' => $elementor_edit_mode, + 'recapcha_key' => $grecaptcha_key, + 'ajax_url' => admin_url('admin-ajax.php'), + 'fes_nonce' => wp_create_nonce('mec_fes_nonce'), + 'fes_thankyou_page_time' => $fes_thankyou_page_time, + 'fes_upload_nonce' => wp_create_nonce('mec_fes_upload_featured_image'), + 'current_year' => date('Y', current_time('timestamp', 0)), + 'current_month' => date('m', current_time('timestamp', 0)), + 'datepicker_format' => (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? trim($settings['datepicker_format']) : 'yy-mm-dd', + )); + + // Localize Some Strings + wp_localize_script('mec-frontend-script', 'mecdata', $mecdata); + } + + /** + * Load MEC Backend assets such as CSS or JavaScript files + * @author Webnus + */ + public function load_backend_assets() + { + if ($this->should_include_assets('backend')) { + // Get Current Screen + global $current_screen; + if (!isset($current_screen)) $current_screen = get_current_screen(); + + // Styling + $styling = $this->main->get_styling(); + + // Include MEC typekit script file + wp_enqueue_script('mec-typekit-script'); + + //Include the nice-select + wp_enqueue_script('mec-niceselect-script'); + + //Include Select2 + wp_enqueue_script('mec-select2-script'); + wp_enqueue_style('mec-select2-style'); + + // Include Lity Lightbox + wp_enqueue_script('mec-lity-script'); + + // Include Nicescroll + wp_enqueue_script('mec-nice-scroll'); + + wp_enqueue_style('featherlight'); + wp_enqueue_script('featherlight'); + + // Include MEC Carousel JS libraries + wp_enqueue_script('mec-owl-carousel-script'); + + // Backend Dependencies + $dependencies = array('jquery', 'wp-color-picker', 'jquery-ui-datepicker'); + + // Add WP Blocks to the dependencies only when needed! + if (method_exists($current_screen, 'is_block_editor') and $current_screen->is_block_editor()) $dependencies[] = 'wp-blocks'; + + // Register New Block Editor + if (function_exists('register_block_type')) register_block_type('mec/blockeditor', array('editor_script' => 'block.editor')); + + // Include MEC backend script file + wp_enqueue_script('mec-backend-script'); + + // Settings + $settings = $this->main->get_settings(); + + wp_localize_script('mec-backend-script', 'mec_admin_localize', array( + 'ajax_url' => admin_url('admin-ajax.php'), + 'ajax_nonce' => wp_create_nonce('mec_settings_nonce'), + 'mce_items' => $this->main->mce_get_shortcode_list(), + 'datepicker_format' => (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? trim($settings['datepicker_format']) : 'yy-mm-dd', + )); + + wp_enqueue_script('mec-events-script'); + + // Thickbox + wp_enqueue_media(); + + // WP Editor + wp_enqueue_editor(); + + // MEC Icons + wp_enqueue_style('mec-font-icons'); + + // Include "Right to Left" CSS file + if (is_rtl()) wp_enqueue_style('mec-backend-rtl-style'); + + // Include Lity CSS file + wp_enqueue_style('mec-lity-style'); + } + + // Include MEC backend CSS + wp_enqueue_style('mec-backend-style'); + + if (isset($styling) and isset($styling['accessibility']) && $styling['accessibility']) wp_enqueue_style('mec-backend-accessibility', $this->main->asset('css/a11y-backend.min.css'), $this->main->get_version()); + } + + /** + * Load MEC frontend assets such as CSS or JavaScript files + * @author Webnus + */ + public function load_frontend_assets() + { + if ($this->should_include_assets('frontend')) { + // Styling + $styling = $this->main->get_styling(); + + // Google Fonts Status + $gfonts_status = !(isset($styling['disable_gfonts']) and $styling['disable_gfonts']); + + // Include WordPress jQuery + wp_enqueue_script('jquery'); + + // Include jQuery date picker + if (!defined("SHOW_CT_BUILDER")) wp_enqueue_script('jquery-ui-datepicker'); + + // Load Isotope + if (class_exists('ET_Builder_Element')) $this->main->load_isotope_assets(); + + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + if (is_plugin_active('elementor/elementor.php') && class_exists('\Elementor\Plugin') && \Elementor\Plugin::$instance->preview->is_preview_mode()) $this->main->load_isotope_assets(); + + wp_enqueue_script('mec-typekit-script'); + wp_enqueue_script('featherlight'); + + // Include Select2 + wp_enqueue_script('mec-select2-script'); + wp_enqueue_style('mec-select2-style'); + + // General Calendar + wp_enqueue_script('mec-general-calendar-script'); + + // Include MEC frontend script files + wp_enqueue_script('mec-tooltip-script'); + wp_enqueue_script('mec-frontend-script'); + + wp_enqueue_script('mec-events-script'); + + // Include Lity Lightbox + wp_enqueue_script('mec-lity-script'); + + // Include color brightness + wp_enqueue_script('mec-colorbrightness-script'); + + // Include MEC frontend JS libraries + wp_enqueue_script('mec-owl-carousel-script'); + + if (did_action('elementor/loaded')) $elementor_edit_mode = !\Elementor\Plugin::$instance->editor->is_edit_mode() ? 'no' : 'yes'; + else $elementor_edit_mode = 'no'; + + // Settings + $settings = $this->main->get_settings(); + $grecaptcha_key = isset($settings['google_recaptcha_sitekey']) ? trim($settings['google_recaptcha_sitekey']) : ''; + $fes_thankyou_page_time = (isset($settings['fes_thankyou_page_time']) and trim($settings['fes_thankyou_page_time']) != '') ? (int) $settings['fes_thankyou_page_time'] : 2000; + + // Localize Some Strings + $mecdata = apply_filters('mec_locolize_data', array( + 'day' => __('day', 'modern-events-calendar-lite'), + 'days' => __('days', 'modern-events-calendar-lite'), + 'hour' => __('hour', 'modern-events-calendar-lite'), + 'hours' => __('hours', 'modern-events-calendar-lite'), + 'minute' => __('minute', 'modern-events-calendar-lite'), + 'minutes' => __('minutes', 'modern-events-calendar-lite'), + 'second' => __('second', 'modern-events-calendar-lite'), + 'seconds' => __('seconds', 'modern-events-calendar-lite'), + 'next' => __('Next', 'modern-events-calendar-lite'), + 'prev' => __('Prev', 'modern-events-calendar-lite'), + 'elementor_edit_mode' => $elementor_edit_mode, + 'recapcha_key' => $grecaptcha_key, + 'ajax_url' => admin_url('admin-ajax.php'), + 'fes_nonce' => wp_create_nonce('mec_fes_nonce'), + 'fes_thankyou_page_time' => $fes_thankyou_page_time, + 'fes_upload_nonce' => wp_create_nonce('mec_fes_upload_featured_image'), + 'current_year' => date('Y', current_time('timestamp', 0)), + 'current_month' => date('m', current_time('timestamp', 0)), + 'datepicker_format' => (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? trim($settings['datepicker_format']) : 'yy-mm-dd', + )); + + // Localize Some Strings + wp_localize_script('mec-frontend-script', 'mecdata', $mecdata); + + // Include Security Captcha Assets + $this->getCaptcha()->assets(); + + // Include MEC frontend CSS files + wp_enqueue_style('mec-font-icons'); + wp_enqueue_style('mec-frontend-style'); + if (isset($styling['accessibility']) && $styling['accessibility']) wp_enqueue_style('accessibility'); + + wp_enqueue_style('mec-tooltip-style'); + wp_enqueue_style('mec-tooltip-shadow-style'); + wp_enqueue_style('featherlight', $this->main->asset('packages/featherlight/featherlight.css')); + + // Include "Right to Left" CSS file + if (is_rtl()) wp_enqueue_style('mec-frontend-rtl-style'); + + // Include Google Fonts + if ($gfonts_status and get_option('mec_dyncss') == 0) wp_enqueue_style('mec-google-fonts'); + + // Include Google Font + if ($gfonts_status and get_option('mec_gfont')) wp_enqueue_style('mec-custom-google-font'); + + // Include Lity CSS file + wp_enqueue_style('mec-lity-style'); + + // General Calendar + wp_enqueue_style('mec-general-calendar-style'); + } + } + + /** + * Prints custom styles in the page header + * @author Webnus + * @return void + */ + public function include_styles() + { + if ($this->should_include_assets('frontend')) { + // Include Dynamic CSS + if (get_option('mec_dyncss')) { + echo ''; + } + + $styles = $this->main->get_styles(); + + // Print custom styles + if (isset($styles['CSS']) and trim($styles['CSS']) != '') { + $CSS = strip_tags($styles['CSS']); + echo ''; + } + } + } + + /** + * Load MEC widget + * @author Webnus + */ + public function load_widgets() + { + // register mec side bar + register_sidebar(array( + 'id' => 'mec-single-sidebar', + 'name' => esc_html__('MEC Single Sidebar', 'modern-events-calendar-lite'), + 'description' => esc_html__('Custom sidebar for single and modal page of MEC.', 'modern-events-calendar-lite'), + 'before_widget' => '
    ', + 'after_widget' => '
    ', + 'before_title' => '

    ', + 'after_title' => '

    ' + )); + + // Import MEC Widget Class + $this->import('app.widgets.MEC'); + $this->import('app.widgets.single'); + + register_widget('MEC_MEC_widget'); + register_widget('MEC_single_widget'); + } + + /** + * Register MEC shortcode in WordPress + * @author Webnus + */ + public function load_shortcodes() + { + // MEC Render library + $render = $this->getRender(); + + // Events Archive Page + $this->shortcode('MEC', array($render, 'shortcode')); + + // Event Single Page + $this->shortcode('MEC_single', array($render, 'vsingle')); + + // MEC Render library + $book = $this->getBook(); + + // Booking Invoice + $this->shortcode('MEC_invoice_link', array($book, 'invoice_link_shortcode')); + } + + /** + * Load dynamic css + * @author Webnus + */ + public function mec_dyncss() + { + // Import Dynamic CSS codes + $path = $this->import('app.features.mec.dyncss', true, true); + + ob_start(); + include $path; + echo ob_get_clean(); + } + + /** + * Load MEC skins in WordPress + * @author Webnus + */ + public function load_skins() + { + // Import MEC skins Class + $this->import('app.libraries.skins'); + + $MEC_skins = new MEC_skins(); + $MEC_skins->load(); + } + + /** + * Register MEC addons in WordPress + * @author Webnus + */ + public function load_addons() + { + // Import MEC VC addon + $this->import('app.addons.VC'); + + $MEC_addon_VC = new MEC_addon_VC(); + $MEC_addon_VC->init(); + + // Import MEC KC addon + $this->import('app.addons.KC'); + + $MEC_addon_KC = new MEC_addon_KC(); + $MEC_addon_KC->init(); + + // Import MEC Elementor addon + $this->import('app.addons.elementor'); + $MEC_addon_elementor = new MEC_addon_elementor(); + $MEC_addon_elementor->init(); + + // Import MEC Elementor addon + $this->import('app.addons.avada'); + $MEC_addon_avada = new MEC_addon_avada(); + $MEC_addon_avada->init(); + + // Import MEC Divi addon + $this->import('app.addons.divi'); + $MEC_addon_divi = new MEC_addon_divi(); + $MEC_addon_divi->init(); + + // Import MEC Beaver Builder addon + $this->import('app.addons.beaver'); + $MEC_addon_beaver = new MEC_addon_beaver(); + $MEC_addon_beaver->init(); + + // Import MEC LearnDash addon + $this->import('app.addons.learndash'); + $MEC_addon_LD = new MEC_addon_learndash(); + $MEC_addon_LD->init(); + + // Import MEC PaidMembership Pro addon + $this->import('app.addons.PMP'); + $MEC_addon_PMP = new MEC_addon_PMP(); + $MEC_addon_PMP->init(); + + // Import The Newsletter Plugin addon + $this->import('app.addons.TNP'); + $MEC_addon_TNP = new MEC_addon_TNP(); + $MEC_addon_TNP->init(); + + // Import ACF addon + $this->import('app.addons.ACF'); + $MEC_addon_ACF = new MEC_addon_ACF(); + $MEC_addon_ACF->init(); + } + + /** + * Initialize MEC Auto Update Feature + * @author Webnus + */ + public function load_auto_update() + { + $options = get_option('mec_options'); + $product_name = !empty($options['product_name']) ? esc_html__($options['product_name']) : ''; + $product_id = !empty($options['product_id']) ? esc_html__($options['product_id']) : ''; + $purchase_code = !empty($options['purchase_code']) ? esc_html__($options['purchase_code']) : ''; + $url = urlencode(get_home_url()); + + require_once MEC_ABSPATH . 'app/core/puc/plugin-update-checker.php'; + if (!$this->getPRO()) { + $MyUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + add_query_arg(array('purchase_code' => '', 'url' => '', 'id' => '', 'category' => 'mec'), MEC_API_UPDATE . '/updates/?action=get_metadata&slug=modern-events-calendar-lite'), //Metadata URL. + MEC_ABSPATH . 'modern-events-calendar-lite.php', //Full path to the main plugin file. + 'modern-events-calendar-lite', //Plugin slug. Usually it's the same as the name of the directory. + 24 + ); + } else { + $MyUpdateChecker = Puc_v4_Factory::buildUpdateChecker( + add_query_arg(array('purchase_code' => $purchase_code, 'url' => $url, 'id' => $product_id, 'category' => 'mec'), MEC_API_UPDATE . '/updates/?action=get_metadata&slug=modern-events-calendar'), //Metadata URL. + MEC_ABSPATH . 'mec.php', //Full path to the main plugin file. + 'mec', //Plugin slug. Usually it's the same as the name of the directory. + 24 + ); + } + + $name = $this->getPRO() ? 'mec' : 'modern-events-calendar-lite'; + add_filter('puc_request_info_result-' . $name, function ($info) { + if (!$info) return; + + unset($info->sections['installation']); + unset($info->sections['faq']); + unset($info->sections['screenshots']); + unset($info->sections['wordpress_event_calendar']); + unset($info->sections['best_wordpress_event_management_plugin']); + unset($info->sections['new_designed_beautiful_event_view_layouts:']); + unset($info->sections['covid-19_(coronavirus)']); + unset($info->sections['10_best_event_calendar_plugins_and_themes_for_wordpress_2020']); + unset($info->sections['experts_opinions']); + unset($info->sections['some_new_features']); + unset($info->sections['user_reviews']); + unset($info->sections['convert_your_events_in_a_few_seconds']); + unset($info->sections['virtual_events_addon']); + unset($info->sections['main_features']); + unset($info->sections['integration']); + unset($info->sections['key_features']); + unset($info->sections['addons']); + unset($info->sections['screenshots']); + unset($info->sections['helpful_documentation']); + unset($info->sections['developers']); + unset($info->sections['frequently_asked_questions']); + + return $info; + }); + } + + /** + * Add strings (CSS, JavaScript, etc.) to website sections such as footer etc. + * @author Webnus + * @param string $key + * @param string|closure $string + * @return boolean + */ + public function params($key, $string) + { + $key = (string) $key; + + if ($string instanceof Closure) { + ob_start(); + call_user_func($string); + $string = ob_get_clean(); + } + + $string = (string) $string; + + // No Key or No String + if (trim($string) == '' or trim($key) == '') return false; + + // Register the key for removing PHP notices + if (!isset(self::$params[$key])) self::$params[$key] = []; + + // Add it to the MEC params + array_push(self::$params[$key], $string); + return true; + } + + public function printOnAjaxOrFooter($string) + { + if ($string instanceof Closure) { + ob_start(); + call_user_func($string); + $string = ob_get_clean(); + } + + if (defined('DOING_AJAX') && DOING_AJAX) echo $string; + else $this->params('footer', $string); + } + + /** + * Insert MEC assets into the website footer + * @author Webnus + * @return void + */ + public function load_footer() + { + if (!isset(self::$params['footer']) or (isset(self::$params['footer']) and !count(self::$params['footer']))) return; + + // Remove duplicate strings + $strings = array_unique(self::$params['footer']); + + // Print the assets in the footer + foreach ($strings as $string) echo PHP_EOL . $string . PHP_EOL; + } + + /** + * Add MEC actions to WordPress + * @author Webnus + * @param string $hook + * @param string|array|Closure $function + * @param int $priority + * @param int $accepted_args + * @return boolean + */ + public function action($hook, $function, $priority = 10, $accepted_args = 1) + { + // Check Parameters + if (!trim($hook) or !$function) return false; + + // Add it to WordPress actions + return add_action($hook, $function, $priority, $accepted_args); + } + + /** + * Add MEC filters to WordPress filters + * @author Webnus + * @param string $tag + * @param string|array $function + * @param int $priority + * @param int $accepted_args + * @return boolean + */ + public function filter($tag, $function, $priority = 10, $accepted_args = 1) + { + // Check Parameters + if (!trim($tag) or !$function) return false; + + // Add it to WordPress filters + return add_filter($tag, $function, $priority, $accepted_args); + } + + /** + * Add MEC shortcodes to WordPress shortcodes + * @author Webnus + * @param string $shortcode + * @param string|array $function + * @return boolean + */ + public function shortcode($shortcode, $function) + { + // Check Parameters + if (!trim($shortcode) or !$function) return false; + + // Add it to WordPress shortcodes + add_shortcode($shortcode, $function); + return true; + } + + /** + * Runs on plugin activation + * @author Webnus + * @param boolean $network + * @return boolean + */ + public function activate($network = false) + { + // Redirect user to MEC Dashboard + add_option('mec_activation_redirect', true); + + // Uninstall Hook + register_uninstall_hook(MEC_ABSPATH . MEC_FILENAME, array('MEC_factory', 'uninstall')); + + $current_blog_id = get_current_blog_id(); + + // Plugin activated only for one blog + if (!function_exists('is_multisite') or (function_exists('is_multisite') and !is_multisite())) $network = false; + if (!$network) { + // Refresh WordPress rewrite rules + $this->main->flush_rewrite_rules(); + + return $this->install($current_blog_id); + } + + // Plugin activated for all blogs + $blogs = $this->db->select("SELECT `blog_id` FROM `#__blogs`", 'loadColumn'); + foreach ($blogs as $blog_id) { + switch_to_blog($blog_id); + $this->install($blog_id); + } + + switch_to_blog($current_blog_id); + + // Refresh WordPress rewrite rules + $this->main->flush_rewrite_rules(); + return true; + } + + /** + * Runs on plugin deactivation + * @author Webnus + * @param boolean $network + * @return void + */ + public function deactivate($network = false) + { + $this->main->flush_rewrite_rules(); + + // Clear Scheduler Cronjob + wp_clear_scheduled_hook('mec_scheduler'); + wp_clear_scheduled_hook('mec_syncScheduler'); + } + + /** + * Runs on plugin uninstallation + * @author Webnus + * @return boolean + */ + public static function uninstall() + { + // Main Object + $main = MEC::getInstance('app.libraries.main'); + + // Database Object + $db = MEC::getInstance('app.libraries.db'); + + // Refresh WordPress rewrite rules + $main->flush_rewrite_rules(); + + // Getting current blog + $current_blog_id = get_current_blog_id(); + + if (!function_exists('is_multisite') or (function_exists('is_multisite') and !is_multisite())) return self::purge($current_blog_id); + + // Plugin activated for all blogs + $blogs = $db->select("SELECT `blog_id` FROM `#__blogs`", 'loadColumn'); + foreach ($blogs as $blog_id) { + switch_to_blog($blog_id); + self::purge($blog_id); + } + + // Switch back to current blog + switch_to_blog($current_blog_id); + return true; + } + + /** + * Install the plugin on s certain blog + * @author Webnus + * @param int $blog_id + */ + public function install($blog_id = 1) + { + // Plugin installed before + if (get_option('mec_installed', 0)) { + // Create mec_events table if it's removed for any reason + $this->main->create_mec_tables(); + + return; + } + + // Run Queries + $query_file = MEC_ABSPATH . 'assets' . DS . 'sql' . DS . 'install.sql'; + if ($this->file->exists($query_file)) { + $queries = $this->file->read($query_file); + $sqls = explode(';', $queries); + + foreach ($sqls as $sql) { + $sql = trim($sql, '; '); + if (trim($sql) == '') continue; + + $sql .= ';'; + + try { + $this->db->q($sql); + } catch (Exception $e) { + } + } + } + + // Default Options + $options = array( + 'settings' => array( + 'multiple_day_show_method' => 'first_day_listgrid', + 'google_maps_status' => 1, + 'export_module_status' => 1, + 'sn' => array('googlecal' => 1, 'ical' => 1, 'facebook' => 1, 'gplus' => 1, 'twitter' => 1, 'linkedin' => 1, 'email' => 1), + 'countdown_status' => 1, + 'social_network_status' => 1, + 'default_skin_archive' => 'full_calendar', + ), + 'styles' => array('CSS' => ''), + 'gateways' => array(1 => array('status' => 1)), + 'notifications' => array( + 'booking_notification' => array( + 'subject' => 'Your booking is received.', + 'recipients' => '', + 'content' => "Hello %%name%%, + + Your booking is received. We will check and confirm your booking as soon as possible. + Thanks for your patience. + + Regards, + %%blog_name%%" + ), + 'email_verification' => array( + 'subject' => 'Please verify your booking.', + 'recipients' => '', + 'content' => "Hi %%name%%, + + Please verify your booking by clicking on following link: + + %%verification_link%% + + Regards, + %%blog_name%%" + ), + 'booking_confirmation' => array( + 'subject' => 'Your booking is confirmed.', + 'recipients' => '', + 'content' => "Hi %%name%%, + + Your booking is confirmed. You should be available at %%book_date%% in %%event_location_address%%. + + You can contact to event organizer by calling %%event_organizer_tel%%. + + Regards, + %%blog_name%%" + ), + 'cancellation_notification' => array( + 'status' => '0', + 'subject' => 'Your booking is canceled.', + 'recipients' => '', + 'send_to_admin' => '1', + 'send_to_organizer' => '0', + 'send_to_user' => '0', + 'content' => "Hi %%name%%, + + For your information, your booking for %%event_title%% at %%book_date%% is canceled. + + Regards, + %%blog_name%%" + ), + 'admin_notification' => array( + 'subject' => 'A new booking is received.', + 'recipients' => '', + 'content' => "Dear Admin, + + A new booking is received. Please check and confirm it as soon as possible. + + %%admin_link%% + + %%attendees_full_info%% + + Regards, + %%blog_name%%" + ), + 'new_event' => array( + 'status' => '1', + 'subject' => 'A new event is added.', + 'recipients' => '', + 'content' => "Hello, + + A new event just added. The event title is %%event_title%% and its status is %%event_status%%. + The new event may need to be published. Please use this link for managing your website events: %%admin_link%% + + Regards, + %%blog_name%%" + ), + 'user_event_publishing' => array( + 'status' => '1', + 'subject' => 'Your event gets published', + 'recipients' => '', + 'content' => "Hello %%name%%, + + Your event gets published. You can check it below: + + %%event_title%% + + Regards, + %%blog_name%%" + ), + 'event_soldout' => array( + 'status' => '0', + 'subject' => 'Your event is soldout!', + 'recipients' => '', + 'send_to_admin' => '1', + 'send_to_organizer' => '1', + 'content' => "Hi %%name%%, + + For your information, your %%event_title%% event at %%book_date%% is soldout. + + Regards, + %%blog_name%%" + ), + 'booking_rejection' => array( + 'status' => '0', + 'subject' => 'Your booking got rejected!', + 'recipients' => '', + 'send_to_admin' => '0', + 'send_to_organizer' => '1', + 'send_to_user' => '1', + 'content' => "Hi %%name%%, + + For your information, your booking for %%event_title%% at %%book_date%% is rejected. + + Regards, + %%blog_name%%" + ) + ), + ); + + add_option('mec_options', $options); + + // Mark this blog as installed + update_option('mec_installed', 1); + + // Set the version into the Database + update_option('mec_version', $this->main->get_version()); + + // MEC Capabilities + $role = get_role('administrator'); + if ($role) { + $role->add_cap('mec_bookings', true); + $role->add_cap('mec_add_booking', true); + $role->add_cap('mec_coupons', true); + $role->add_cap('mec_report', true); + $role->add_cap('mec_import_export', true); + $role->add_cap('mec_settings', true); + $role->add_cap('mec_shortcodes', true); + } + } + + /** + * Add cron jobs + * @author Webnus + */ + public function mec_add_cron_jobs() + { + // Scheduler Cron job + if (!wp_next_scheduled('mec_scheduler')) wp_schedule_event(time(), 'hourly', 'mec_scheduler'); + if (!wp_next_scheduled('mec_syncScheduler')) wp_schedule_event(time(), 'daily', 'mec_syncScheduler'); + if (!wp_next_scheduled('mec_maintenance')) wp_schedule_event(time(), 'daily', 'mec_maintenance'); + } + + /** + * Remove MEC from a blog + * @author Webnus + * @param int $blog_id + */ + public static function purge($blog_id = 1) + { + // Database Object + $main = MEC::getInstance('app.libraries.main'); + + // Settings + $settings = $main->get_settings(); + + // Purge data on uninstall + if (isset($settings['remove_data_on_uninstall']) and $settings['remove_data_on_uninstall']) { + // Database Object + $db = MEC::getInstance('app.libraries.db'); + + // Drop Tables + $db->q("DROP TABLE IF EXISTS `#__mec_events`"); + $db->q("DROP TABLE IF EXISTS `#__mec_dates`"); + $db->q("DROP TABLE IF EXISTS `#__mec_users`"); + $db->q("DROP TABLE IF EXISTS `#__mec_occurrences`"); + + // Removing MEC posts and postmeta data + $posts = $db->select("SELECT ID FROM `#__posts` WHERE `post_type`='mec-events' OR `post_type`='mec_calendars' OR `post_type`='mec-books'", 'loadAssocList'); + if (is_array($posts) and count($posts)) { + $post_ids = $meta_ids = ''; + + $remove_post_sql = "DELETE FROM `#__posts` WHERE"; + $remove_post_meta_sql = "DELETE FROM `#__postmeta` WHERE"; + + foreach ($posts as $post) { + if (isset($post['ID'])) { + $meta_ids .= ' `post_id`=' . $post['ID'] . ' OR '; + $post_ids .= ' `ID`=' . $post['ID'] . ' OR '; + } + } + + $remove_post_sql .= substr($post_ids, 0, -4); + $remove_post_meta_sql .= substr($meta_ids, 0, -4); + + $db->q($remove_post_sql); + $db->q($remove_post_meta_sql); + } + + // Removing all MEC taxonomy terms + $terms = $db->select("SELECT #__term_taxonomy.`term_id`, #__term_taxonomy.`taxonomy` FROM `#__terms` INNER JOIN `#__term_taxonomy` ON #__terms.`term_id` = #__term_taxonomy.`term_id` WHERE #__term_taxonomy.`taxonomy` = 'mec_category' OR #__term_taxonomy.`taxonomy` = 'mec_label' OR #__term_taxonomy.`taxonomy` = 'mec_location' OR #__term_taxonomy.`taxonomy` = 'mec_organizer' OR #__term_taxonomy.`taxonomy` = 'mec_speaker' OR #__term_taxonomy.`taxonomy` = 'mec_coupon'", 'loadAssocList'); + foreach ($terms as $term) { + if (isset($term['term_id']) and isset($term['taxonomy'])) { + wp_delete_term((int) $term['term_id'], trim($term['taxonomy'])); + } + } + + // MEC Deleted + delete_option('mec_installed'); + delete_option('mec_options'); + delete_option('mec_version'); + delete_option('widget_mec_mec_widget'); + delete_option('widget_mec_single_widget'); + delete_option('mec_gfont'); + delete_option('mec_dyncss'); + delete_option('mec_custom_msg_display_option'); + delete_option('mec_custom_msg_2_display_option'); + delete_option('mec_custom_msg_close_option'); + delete_option('mec_custom_msg_2_close_option'); + delete_option('mec_category_children'); + } + } + + /** + * Add a body class for active theme + * @return int $class + * @author Webnus + */ + public function mec_active_theme_body_class($classes) + { + $class = 'mec-theme-' . get_template(); + + if (is_array($classes)) { + $classes[] = $class; + } else { + $classes .= ' ' . $class . ' '; + } + return $classes; + } + + /** + * Remove MEC from a blog + * @param $dark + * @return int $dark + * @author Webnus + */ + public function mec_body_class($dark) + { + $styling = $this->main->get_styling(); + + $dark_mode = $styling['dark_mode'] ?? ''; + if (!empty($dark_mode) and $dark_mode == 1) $dark[] = 'mec-dark-mode'; + + return $dark; + } + + /** + * Remove MEC from a blog + * @param $darkadmin + * @return int $darkadmin + * @author Webnus + */ + public function mec_admin_body_class($darkadmin) + { + $styling = $this->main->get_styling(); + + $darkadmin_mode = $styling['dark_mode'] ?? ''; + if ($darkadmin_mode == 1) $darkadmin = 'mec-admin-dark-mode'; + + return $darkadmin; + } + + public function should_include_assets($client = 'frontend') + { + if ($client == 'frontend') return apply_filters('mec_include_frontend_assets', true); + else { + // Current Screen + $screen = get_current_screen(); + + $base = $screen->base; + $page = isset($_REQUEST['page']) ? sanitize_text_field($_REQUEST['page']) : ''; + $post_type = $screen->post_type; + $taxonomy = $screen->taxonomy; + + // It's one of MEC taxonomy pages + if (trim($taxonomy) and in_array($taxonomy, array( + apply_filters('mec_taxonomy_tag', ''), + 'mec_category', + 'mec_label', + 'mec_location', + 'mec_organizer', + 'mec_speaker', + 'mec_coupon' + ))) return true; + + // It's one of MEC post type pages + if (trim($post_type) and in_array($post_type, array( + $this->main->get_main_post_type(), + 'mec_calendars', + $this->main->get_book_post_type() + ))) return true; + + // It's Block Editor + if (method_exists($screen, 'is_block_editor') and $screen->is_block_editor()) return true; + + // It's one of MEC pages or the pages that MEC should work fine + if ((trim($base) and in_array($base, array( + 'toplevel_page_mec-intro', + 'm-e-calendar_page_MEC-settings', + 'm-e-calendar_page_MEC-addons', + 'm-e-calendar_page_MEC-report', + 'm-e-calendar_page_MEC-ix', + 'm-e-calendar_page_MEC-support', + 'm-e-calendar_page_MEC-wizard', + 'm-e-calendar_page_MEC-go-pro', + 'widgets', + ))) or (trim($page) and in_array($page, array( + 'mec-intro', + 'MEC-settings', + 'MEC-addons', + 'MEC-report', + 'MEC-ix', + 'MEC-support', + 'MEC-wizard', + 'MEC-go-pro', + 'mec-advanced-report', + )))) return true; + + return apply_filters('mec_include_backend_assets', false); + } + } + + function mecShowUpgradeNotification($currentPluginMetadata, $newPluginMetadata) + { + // check "upgrade_notice" + +?> +
    + + + +
    + + */ +class MEC_feed extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function title($post_id) + { + $title = get_the_title($post_id); + return apply_filters('the_title_rss', $title); + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function permalink($post_id) + { + $permalink = get_post_permalink($post_id); + return esc_url(apply_filters('the_permalink_rss', $permalink)); + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function attachment($post_id) + { + $main = $this->getMain(); + + $featured_link = $main->get_post_thumbnail_url($post_id,'full'); + return esc_url(apply_filters('the_attachment_rss', $featured_link)); + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function comments_link_feed($post_id) + { + return esc_url(apply_filters('comments_link_feed', get_comments_link($post_id))); + } + + /** + * @author Webnus + * @param int $user_id + * @return string + */ + public function author($user_id) + { + $authordata = get_userdata($user_id); + return apply_filters('the_author', is_object($authordata) ? $authordata->display_name : null); + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function excerpt($post_id) + { + $post = get_post($post_id); + + if(empty($post)) return ''; + if(post_password_required($post)) return esc_html__('There is no excerpt because this is a protected post.'); + + return apply_filters('get_the_excerpt', $post->post_excerpt, $post); + } + + /** + * @author Webnus + * @param int $post_id + * @param string $feed_type + * @return string + */ + public function content($post_id, $feed_type = NULL) + { + if(!$feed_type) $feed_type = get_default_feed(); + + $post = get_post($post_id); + $content = str_replace(']]>', ']]>', apply_filters('the_content', $post->post_content)); + + return apply_filters('the_content_feed', $content, $feed_type); + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function enclosure_rss($post_id) + { + $enclosure = ''; + if(post_password_required($post_id)) return $enclosure; + + foreach((array) get_post_custom($post_id) as $key=>$val) + { + if($key != 'enclosure') continue; + + foreach((array) $val as $enc) + { + $enc = explode("\n", $enc); + + $t = preg_split('/[ \t]/', trim($enc[2])); + $type = $t[0]; + + $enclosure .= apply_filters('rss_enclosure', ''."\n"); + } + } + + return $enclosure; + } + + /** + * @author Webnus + * @param int $post_id + * @return string + */ + public function enclosure_atom($post_id) + { + $enclosure = ''; + if(post_password_required($post_id)) return $enclosure; + + foreach((array) get_post_custom() as $key=>$val) + { + if($key != 'enclosure') continue; + foreach((array) $val as $enc) + { + $enc = explode("\n", $enc); + $enclosure .= apply_filters('atom_enclosure', ''."\n"); + } + } + + return $enclosure; + } +} \ No newline at end of file diff --git a/app/libraries/filesystem.php b/app/libraries/filesystem.php new file mode 100755 index 0000000..89870ff --- /dev/null +++ b/app/libraries/filesystem.php @@ -0,0 +1,864 @@ + + */ +class MEC_file extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } + + /** + * @author Webnus + * @param string $file + * @return string + */ + public static function getExt($file) + { + $ex = explode('.', $file); + return end($ex); + } + + /** + * @author Webnus + * @param string $file + * @return string + */ + public static function stripExt($file) + { + return preg_replace('#\.[^.]*$#', '', $file); + } + + /** + * @author Webnus + * @param string $file + * @return string + */ + public static function makeSafe($file) + { + $regex = array('#(\.){2,}#', '#[^A-Za-z0-9\.\_\- ]#', '#^\.#'); + return preg_replace($regex, '', $file); + } + + /** + * @author Webnus + * @param string $src + * @param string $dest + * @param string $path + * @return boolean + */ + public static function copy($src, $dest, $path = null) + { + // Prepend a base path if it exists + if ($path) + { + $src = MEC_path::clean($path . '/' . $src); + $dest = MEC_path::clean($path . '/' . $dest); + } + + // Check src path + if (!is_readable($src)) + { + return false; + } + + if (!@ copy($src, $dest)) + { + return false; + } + + return true; + } + + /** + * @author Webnus + * @param string $file + * @return boolean + */ + public static function delete($file) + { + if(is_array($file)) + { + $files = $file; + } + else + { + $files[] = $file; + } + + foreach($files as $file) + { + $file = MEC_path::clean($file); + + @chmod($file, 0777); + @unlink($file); + } + + return true; + } + + /** + * @author Webnus + * @param string $src + * @param string $dest + * @param string $path + * @return boolean + */ + public static function move($src, $dest, $path = '') + { + if($path) + { + $src = MEC_path::clean($path . '/' . $src); + $dest = MEC_path::clean($path . '/' . $dest); + } + + // Check src path + if(!is_readable($src)) return false; + if(!@rename($src, $dest)) return false; + + return true; + } + + /** + * @author Webnus + * @param string $filename + * @return boolean + */ + public static function read($filename) + { + // Initialise variables. + $fh = fopen($filename, 'rb'); + + if(false === $fh) return false; + + clearstatcache(); + + if($fsize = @filesize($filename)) + { + $data = fread($fh, $fsize); + + fclose($fh); + return $data; + } + else + { + fclose($fh); + return false; + } + } + + /** + * @author Webnus + * @param string $file + * @param string $buffer + * @return string + */ + public static function write($file, &$buffer) + { + @set_time_limit(ini_get('max_execution_time')); + + // If the destination directory doesn't exist we need to create it + if (!file_exists(dirname($file))) + { + MEC_folder::create(dirname($file)); + } + + $file = MEC_path::clean($file); + $ret = is_int(file_put_contents($file, $buffer)) ? true : false; + + return $ret; + } + + /** + * @author Webnus + * @param string $src + * @param string $dest + * @return boolean + */ + public static function upload($src, $dest) + { + // Ensure that the path is valid and clean + $dest = MEC_path::clean($dest); + $baseDir = dirname($dest); + + if (!file_exists($baseDir)) + { + MEC_folder::create($baseDir); + } + + if (is_writable($baseDir) && move_uploaded_file($src, $dest)) + { + // Short circuit to prevent file permission errors + if (MEC_path::setPermissions($dest)) $ret = true; + else $ret = false; + } + else $ret = false; + + return $ret; + } + + /** + * @author Webnus + * @param string $file + * @return string + */ + public static function exists($file) + { + return is_file(MEC_path::clean($file)); + } + + /** + * @author Webnus + * @param string $file + * @return string + */ + public static function getName($file) + { + // Convert backslashes to forward slashes + $file = str_replace('\\', '/', $file); + $slash = strrpos($file, '/'); + + if ($slash !== false) + { + return substr($file, $slash + 1); + } + else + { + return $file; + } + } +} + +/** + * Webnus MEC Folder class. + * @author Webnus + */ +class MEC_folder extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * @author Webnus + * @param string $src + * @param string $dest + * @param string $path + * @param boolean $force + * @return boolean + */ + public static function copy($src, $dest, $path = '', $force = false) + { + @set_time_limit(ini_get('max_execution_time')); + + if ($path) + { + $src = MEC_path::clean($path . '/' . $src); + $dest = MEC_path::clean($path . '/' . $dest); + } + + // Eliminate trailing directory separators, if any + $src = rtrim($src, DIRECTORY_SEPARATOR); + $dest = rtrim($dest, DIRECTORY_SEPARATOR); + + if (!self::exists($src)) return false; + if (self::exists($dest) && !$force) return false; + + // Make sure the destination exists + if (!self::create($dest)) return false; + if (!($dh = @opendir($src))) return false; + + // Walk through the directory copying files and recursing into folders. + while (($file = readdir($dh)) !== false) + { + $sfid = $src . '/' . $file; + $dfid = $dest . '/' . $file; + + switch (filetype($sfid)) + { + case 'dir': + + if ($file != '.' && $file != '..') + { + $ret = self::copy($sfid, $dfid, null, $force); + if ($ret !== true) + { + return $ret; + } + } + break; + + case 'file': + + if (!@copy($sfid, $dfid)) + { + return false; + } + break; + } + } + + return true; + } + + /** + * Create a folder -- and all necessary parent folders. + * @author Webnus + * @staticvar int $nested + * @param string $path + * @param int $mode + * @return boolean + */ + public static function create($path = '', $mode = 0755) + { + // Initialise variables. + static $nested = 0; + + // Check to make sure the path valid and clean + $path = MEC_path::clean($path); + + // Check if parent dir exists + $parent = dirname($path); + + if (!self::exists($parent)) + { + // Prevent infinite loops! + $nested++; + if (($nested > 20) || ($parent == $path)) + { + $nested--; + return false; + } + + // Create the parent directory + if (self::create($parent, $mode) !== true) + { + // MEC_folder::create throws an error + $nested--; + return false; + } + + // OK, parent directory has been created + $nested--; + } + + // Check if dir already exists + if (self::exists($path)) + { + return true; + } + + // We need to get and explode the open_basedir paths + $obd = ini_get('open_basedir'); + + // If open_basedir is set we need to get the open_basedir that the path is in + if ($obd != null) + { + $obdSeparator = ":"; + + // Create the array of open_basedir paths + $obdArray = explode($obdSeparator, $obd); + $inBaseDir = false; + // Iterate through open_basedir paths looking for a match + foreach ($obdArray as $test) + { + $test = MEC_path::clean($test); + if (strpos($path, $test) === 0) + { + $inBaseDir = true; + break; + } + } + if ($inBaseDir == false) + { + return false; + } + } + + // First set umask + $origmask = @umask(0); + + // Create the path + if (!$ret = @mkdir($path, $mode)) + { + @umask($origmask); + return false; + } + + // Reset umask + @umask($origmask); + + return $ret; + } + + /** + * @author Webnus + * @param string $path + * @return boolean + */ + public static function delete($path) + { + @set_time_limit(ini_get('max_execution_time')); + + // Sanity check + if (!$path) + { + return false; + } + + // Check to make sure the path valid and clean + $path = MEC_path::clean($path); + + // Is this really a folder? + if (!is_dir($path)) + { + return false; + } + + // Remove all the files in folder if they exist; disable all filtering + $files = self::files($path, '.', false, true, array(), array()); + if (!empty($files)) + { + if (MEC_file::delete($files) !== true) + { + return false; + } + } + + // Remove sub-folders of folder; disable all filtering + $folders = self::folders($path, '.', false, true, array(), array()); + foreach ($folders as $folder) + { + if (is_link($folder)) + { + if (MEC_file::delete($folder) !== true) + { + return false; + } + } + elseif (self::delete($folder) !== true) + { + return false; + } + } + + // In case of restricted permissions we zap it one way or the other + // as long as the owner is either the webserver or the ftp. + if (@rmdir($path)) + { + $ret = true; + } + else + { + $ret = false; + } + + return $ret; + } + + /** + * @author Webnus + * @param string $src + * @param string $dest + * @param string $path + * @return boolean + */ + public static function move($src, $dest, $path = '') + { + if ($path) + { + $src = MEC_path::clean($path . '/' . $src); + $dest = MEC_path::clean($path . '/' . $dest); + } + + if (!self::exists($src)) return false; + if (self::exists($dest)) return false; + + if (!@rename($src, $dest)) + { + return false; + } + + return true; + } + + /** + * @author Webnus + * @param string $path + * @return string + */ + public static function exists($path) + { + return is_dir(MEC_path::clean($path)); + } + + /** + * @author Webnus + * @param string $path + * @param string $filter + * @param boolean $recurse + * @param boolean $full + * @param array $exclude + * @param array $excludefilter + * @return boolean|array + */ + public static function files($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*', '.*~')) + { + // Check to make sure the path valid and clean + $path = MEC_path::clean($path); + + // Is the path a folder? + if (!is_dir($path)) + { + return false; + } + + // Compute the excludefilter string + if (count($excludefilter)) + { + $excludefilter_string = '/(' . implode('|', $excludefilter) . ')/'; + } + else + { + $excludefilter_string = ''; + } + + // Get the files + $arr = self::_items($path, $filter, $recurse, $full, $exclude, $excludefilter_string, true); + + // Sort the files + asort($arr); + return array_values($arr); + } + + /** + * @author Webnus + * @param string $path + * @param string $filter + * @param boolean $recurse + * @param boolean $full + * @param array $exclude + * @param array $excludefilter + * @return boolean|array + */ + public static function folders($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*')) + { + // Check to make sure the path valid and clean + $path = MEC_path::clean($path); + + // Is the path a folder? + if (!is_dir($path)) + { + return false; + } + + // Compute the excludefilter string + if (count($excludefilter)) + { + $excludefilter_string = '/(' . implode('|', $excludefilter) . ')/'; + } + else + { + $excludefilter_string = ''; + } + + // Get the folders + $arr = self::_items($path, $filter, $recurse, $full, $exclude, $excludefilter_string, false); + + // Sort the folders + asort($arr); + return array_values($arr); + } + + /** + * @author Webnus + * @param string $path + * @param string $filter + * @param boolean $recurse + * @param boolean $full + * @param array $exclude + * @param array|string $excludefilter_string + * @param boolean $findfiles + * @return array + */ + protected static function _items($path, $filter, $recurse, $full, $exclude, $excludefilter_string, $findfiles) + { + @set_time_limit(ini_get('max_execution_time')); + + // Initialise variables. + $arr = []; + + // Read the source directory + if (!($handle = @opendir($path))) + { + return $arr; + } + + while (($file = readdir($handle)) !== false) + { + if ($file != '.' && $file != '..' && !in_array($file, $exclude) + && (empty($excludefilter_string) || !preg_match($excludefilter_string, $file))) + { + // Compute the fullpath + $fullpath = $path . '/' . $file; + + // Compute the isDir flag + $isDir = is_dir($fullpath); + + if (($isDir xor $findfiles) && preg_match("/$filter/", $file)) + { + // (fullpath is dir and folders are searched or fullpath is not dir and files are searched) and file matches the filter + if ($full) + { + // Full path is requested + $arr[] = $fullpath; + } + else + { + // Filename is requested + $arr[] = $file; + } + } + + if ($isDir && $recurse) + { + // Search recursively + if (is_integer($recurse)) + { + // Until depth 0 is reached + $arr = array_merge($arr, self::_items($fullpath, $filter, $recurse - 1, $full, $exclude, $excludefilter_string, $findfiles)); + } + else + { + $arr = array_merge($arr, self::_items($fullpath, $filter, $recurse, $full, $exclude, $excludefilter_string, $findfiles)); + } + } + } + } + + closedir($handle); + return $arr; + } + + /** + * @author Webnus + * @param string $path + * @return string + */ + public static function makeSafe($path) + { + $regex = array('#[^A-Za-z0-9:_\\\/-]#'); + return preg_replace($regex, '', $path); + } +} + +/** + * Webnus MEC Path class. + * @author Webnus + */ +class MEC_path extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * @author Webnus + * @param string $path + * @return boolean + */ + public static function canChmod($path) + { + $perms = fileperms($path); + if ($perms !== false) + { + if (@chmod($path, $perms ^ 0001)) + { + @chmod($path, $perms); + return true; + } + } + + return false; + } + + /** + * @author Webnus + * @param string $path + * @param string $filemode + * @param string $foldermode + * @return boolean + */ + public static function setPermissions($path, $filemode = '0644', $foldermode = '0755') + { + // Initialise return value + $ret = true; + + if (is_dir($path)) + { + $dh = opendir($path); + + while ($file = readdir($dh)) + { + if ($file != '.' && $file != '..') + { + $fullpath = $path . '/' . $file; + if (is_dir($fullpath)) + { + if (!MEC_path::setPermissions($fullpath, $filemode, $foldermode)) + { + $ret = false; + } + } + else + { + if (isset($filemode)) + { + if (!@ chmod($fullpath, octdec($filemode))) + { + $ret = false; + } + } + } + } + } + + closedir($dh); + if (isset($foldermode)) + { + if (!@ chmod($path, octdec($foldermode))) + { + $ret = false; + } + } + } + else + { + if (isset($filemode)) + { + $ret = @ chmod($path, octdec($filemode)); + } + } + + return $ret; + } + + /** + * @author Webnus + * @param string $path + * @return string + */ + public static function getPermissions($path) + { + $path = MEC_path::clean($path); + $mode = @ decoct(@ fileperms($path) & 0777); + + if(strlen($mode) < 3) + { + return '---------'; + } + + $parsed_mode = ''; + for($i = 0; $i < 3; $i++) + { + // read + $parsed_mode .= ($mode[$i] & 04) ? "r" : "-"; + // write + $parsed_mode .= ($mode[$i] & 02) ? "w" : "-"; + // execute + $parsed_mode .= ($mode[$i] & 01) ? "x" : "-"; + } + + return $parsed_mode; + } + + /** + * @author Webnus + * @param string $path + * @param string $ds + * @return string + */ + public static function check($path, $ds = DIRECTORY_SEPARATOR) + { + $path = MEC_path::clean($path, $ds); + return $path; + } + + /** + * @author Webnus + * @param string $path + * @param string $ds + * @return string + */ + public static function clean($path, $ds = DIRECTORY_SEPARATOR) + { + $path = trim($path); + if(empty($path)) + { + $path = BASE_PATH; + } + else + { + // Remove double slashes and backslashes and convert all slashes and backslashes to DIRECTORY_SEPARATOR + $path = preg_replace('#[/\\\\]+#', $ds, $path); + } + + return $path; + } + + /** + * @author Webnus + * @param array $paths + * @param string $file + * @return boolean + */ + public static function find($paths, $file) + { + settype($paths, 'array'); //force to array + + // Start looping through the path set + foreach ($paths as $path) + { + // Get the path to the file + $fullname = $path . '/' . $file; + + // Is the path based on a stream? + if (strpos($path, '://') === false) + { + // Not a stream, so do a realpath() to avoid directory + // traversal attempts on the local file system. + $path = realpath($path); // needed for substr() later + $fullname = realpath($fullname); + } + + // The substr() check added to make sure that the realpath() + // results in a directory registered so that + // non-registered directories are not accessible via directory + // traversal attempts. + if (file_exists($fullname) && substr($fullname, 0, strlen($path)) == $path) + { + return $fullname; + } + } + + return false; + } +} \ No newline at end of file diff --git a/app/libraries/formBuilder.php b/app/libraries/formBuilder.php new file mode 100755 index 0000000..d16e0e5 --- /dev/null +++ b/app/libraries/formBuilder.php @@ -0,0 +1,246 @@ + + */ +class MEC_formBuilder extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + + /** + * @var array + */ + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * @param $args + * @return void + */ + public function hourlySchedule($args) + { + $hourly_schedules = $args['hourly_schedules']; + $speakers_status = $args['speakers_status']; + $speakers = $args['speakers']; + $wrapper_class = $args['wrapper_class'] ?? 'mec-meta-box-fields mec-event-tab-content mec-fes-hourly-schedule'; + $prefix = $args['prefix'] ?? ''; + $name_prefix = ((isset($args['name_prefix']) and trim($args['name_prefix'])) ? $args['name_prefix'] : 'mec'); + ?> +
    +

    +
    +
    + + +
    +
    +
    + +
    +

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    + $hourly_schedule): if(!is_numeric($key)) continue; $i = max($i, $key); ?> +
    + + + + + + + + + + +
    + main->m('taxonomy_speakers', esc_html__('Speakers:', 'modern-events-calendar-lite'))); ?> + + + +
    + +
    + +
    +
    + +
    +
    + + + + + + + + + + +
    + main->m('taxonomy_speakers', esc_html__('Speakers:', 'modern-events-calendar-lite'))); ?> + + + +
    + +
    +
    +
    + +
    + +
    +
    +

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    + + + + + + + + + + +
    + main->m('taxonomy_speakers', esc_html__('Speakers:', 'modern-events-calendar-lite'))); ?> + + + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + + +
    +
    +
    +

    + +

    +
    +
    + +
    + +
    +
    +
    + settings['datepicker_format']) and trim($this->settings['datepicker_format'])) ? $this->settings['datepicker_format'] : 'Y-m-d'; + $i = 1; + foreach ($values as $key => $not_in_day) : if(!is_numeric($key)) continue; ?> +
    + + main->standardize_format($not_in_day, $datepicker_format)); ?> + x +
    + +
    + +
    +
    + + :val: + x +
    +
    +
    + + */ +class MEC_icons +{ + protected $icons = []; + + /** + * Constructor method + * @author Webnus + */ + public function __construct($icons = []) + { + $this->icons = $icons; + } + + public function has($key) + { + return isset($this->icons[$key]) && trim($this->icons[$key]); + } + + public function display($key) + { + $default = $this->default($key); + $custom = isset($this->icons[$key]) && trim($this->icons[$key]) ? ''.esc_attr($key).'' : ''; + + return trim($custom) ? $custom : $default; + } + + public function default($key) + { + $all = $this->all(); + return isset($all[$key]['default']) && trim($all[$key]['default']) ? $all[$key]['default'] : ''; + } + + public function all() + { + return apply_filters('mec_icons', [ + 'location-pin' => [ + 'name' => __('Location Marker Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single', 'shortcode'], + ], + 'map-marker' => [ + 'name' => __('Map Marker Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'info' => [ + 'name' => __('Info Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ], + 'bookmark' => [ + 'name' => __('Bookmark Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ], + 'folder' => [ + 'name' => __('Folder Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single', 'shortcode'], + ], + 'home' => [ + 'name' => __('Home Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ], + 'phone' => [ + 'name' => __('Phone Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ], + 'envelope' => [ + 'name' => __('Envelope Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ], + 'calendar' => [ + 'name' => __('Calendar Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single', 'shortcode'], + ], + 'clock' => [ + 'name' => __('Clock Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single', 'shortcode'], + ], + 'clock-o' => [ + 'name' => __('Clock 2 Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'wallet' => [ + 'name' => __('Wallet Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single', 'shortcode'], + ], + 'user' => [ + 'name' => __('User Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'magnifier' => [ + 'name' => __('Magnifire Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'credit-card' => [ + 'name' => __('Credit Card Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'map' => [ + 'name' => __('Map Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'pin' => [ + 'name' => __('Pin Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'tag' => [ + 'name' => __('Tag Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'microphone' => [ + 'name' => __('Microphone Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['shortcode'], + ], + 'sitemap' => [ + 'name' => __('Website Icon', 'modern-events-calendar-lite'), + 'default' => '', + 'modules' => ['single'], + ] + ]); + } + + public function form($section = 'single', $prefix = 'mec[settings]', $values = []) + { + $all = $this->all(); + ?> +
    +
    + $icon): if(!in_array($section, $icon['modules'])) continue; $current = isset($values[$key]) && trim($values[$key]) ? $values[$key] : ''; ?> +
    +
    + + +
    +
    + + + +
    +
    +
    <?php echo esc_attr($icon['name']); ?>
    +
    +
    + +
    +
    + 1, + 'aria-*' => 1, + 'type' => 1, + 'value' => 1, + 'class' => 1, + 'id' => 1, + 'for' => 1, + 'style' => 1, + 'src' => 1, + 'alt' => 1, + 'title' => 1, + 'placeholder' => 1, + 'href' => 1, + 'rel' => 1, + 'target' => 1, + 'novalidate' => 1, + 'name' => 1, + 'tabindex' => 1, + 'action' => 1, + 'method' => 1, + 'width' => 1, + 'height' => 1, + 'selected' => 1, + 'checked' => 1, + 'readonly' => 1, + 'disabled' => 1, + 'required' => 1, + 'autocomplete' => 1, + 'min' => 1, + 'max' => 1, + 'step' => 1, + 'cols' => 1, + 'rows' => 1, + 'lang' => 1, + 'dir' => 1, + 'enctype' => 1, + 'multiple' => 1, + 'frameborder' => 1, + 'allow' => 1, + 'allowfullscreen' => 1, + 'label' => 1, + 'align' => 1, + 'accept-charset' => 1, + 'itemtype' => 1, + 'itemscope' => 1, + 'itemprop' => 1, + 'content' => 1, + 'onclick' => 1, + 'onsubmit' => 1, + 'onchange' => 1, + 'xmlns' => 1, + 'viewbox' => 1, + 'd' => 1, + 'transform' => 1, + 'fill' => 1, + 'enable-background' => 1, + 'version' => 1, + 'xml:space' => 1, + 'xmlns:xlink' => 1, + 'onkeydown' => 1, + ); + + public function __construct() + { + } + + public static function full($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_full)) + { + $allowed = wp_kses_allowed_html('post'); + self::$allowed_html_full = apply_filters('mec_kses_tags', $allowed, 'full'); + } + + if(defined('MEC_NO_JS_CSS_IN_HTML') && MEC_NO_JS_CSS_IN_HTML) return wp_kses($html, self::$allowed_html_full); + else return $html; + } + + public static function page($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_page)) + { + $allowed = wp_kses_allowed_html('post'); + self::$allowed_html_page = apply_filters('mec_kses_tags', $allowed, 'page'); + } + + return wp_kses($html, self::$allowed_html_page); + } + + public static function form($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_form)) + { + $allowed = wp_kses_allowed_html('post'); + self::$allowed_html_form = apply_filters('mec_kses_tags', $allowed, 'form'); + } + + return wp_kses($html, self::$allowed_html_form); + } + + public static function element($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_element)) + { + $allowed = wp_kses_allowed_html('post'); + self::$allowed_html_element = apply_filters('mec_kses_tags', $allowed, 'element'); + } + + return wp_kses($html, self::$allowed_html_element); + } + + /** + * Element + Embed + * @param $html + * @return string + */ + public static function rich($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_rich)) + { + $allowed = wp_kses_allowed_html('post'); + self::$allowed_html_rich = apply_filters('mec_kses_tags', $allowed, 'rich'); + } + + return wp_kses($html, self::$allowed_html_rich); + } + + /** + * Only Embed + * @param $html + * @return string + */ + public static function embed($html) + { + if(is_null($html)) return ''; + + if(is_null(self::$allowed_html_embed)) + { + self::$allowed_html_embed = apply_filters('mec_kses_tags', array(), 'embed'); + } + + return wp_kses($html, self::$allowed_html_embed); + } + + public static function tags($tags, $context) + { + foreach(array( + 'svg', + 'path', + 'div', + 'span', + 'ul', + 'li', + 'a', + 'button', + 'progress', + 'dt', + 'dl', + ) as $tag) + { + $tags[$tag] = self::$allowed_attrs; + } + + if(in_array($context, array('form', 'page', 'full'))) + { + $tags['form'] = self::$allowed_attrs; + $tags['label'] = self::$allowed_attrs; + $tags['input'] = self::$allowed_attrs; + $tags['select'] = self::$allowed_attrs; + $tags['option'] = self::$allowed_attrs; + $tags['optgroup'] = self::$allowed_attrs; + $tags['textarea'] = self::$allowed_attrs; + $tags['button'] = self::$allowed_attrs; + $tags['fieldset'] = self::$allowed_attrs; + $tags['output'] = self::$allowed_attrs; + } + + if(in_array($context, array('embed', 'rich', 'full'))) + { + if(!isset($tags['iframe'])) $tags['iframe'] = self::$allowed_attrs; + if(!isset($tags['canvas'])) $tags['canvas'] = self::$allowed_attrs; + } + + if($context === 'full') + { + if(!isset($tags['script'])) $tags['script'] = self::$allowed_attrs; + if(!isset($tags['style'])) $tags['style'] = self::$allowed_attrs; + } + + return $tags; + } + + public static function styles($styles) + { + $styles[] = 'display'; + $styles[] = 'opacity'; + + return $styles; + } +} \ No newline at end of file diff --git a/app/libraries/main.php b/app/libraries/main.php new file mode 100755 index 0000000..b9111a8 --- /dev/null +++ b/app/libraries/main.php @@ -0,0 +1,10512 @@ + + */ +class MEC_main extends MEC_base +{ + /** + * Constructor method + * @author Webnus + */ + public function __construct() {} + + /** + * Returns the archive URL of events for provided skin + * @author Webnus + * @param string $skin + * @return string + */ + public function archive_URL($skin) + { + return $this->URL('site') . $this->get_main_slug() . '/' . $skin . '/'; + } + + /** + * Returns full current URL of WordPress + * @author Webnus + * @return string + */ + public function get_full_url() + { + // Check protocol + $page_url = 'http'; + if (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on') $page_url .= 's'; + + // Get domain + $site_domain = (isset($_SERVER['HTTP_HOST']) and trim($_SERVER['HTTP_HOST']) != '') ? sanitize_text_field($_SERVER['HTTP_HOST']) : sanitize_text_field($_SERVER['SERVER_NAME']); + + $page_url .= '://'; + $page_url .= $site_domain . $_SERVER['REQUEST_URI']; + + // Return full URL + return $page_url; + } + + /** + * Get domain of a certain URL + * @author Webnus + * @param string $url + * @return string + */ + public function get_domain($url = NULL) + { + // Get current URL + if (is_null($url)) $url = $this->get_full_url(); + + $url = str_replace('http://', '', $url); + $url = str_replace('https://', '', $url); + $url = str_replace('ftp://', '', $url); + $url = str_replace('svn://', '', $url); + $url = str_replace('www.', '', $url); + + $ex = explode('/', $url); + $ex2 = explode('?', $ex[0]); + + return $ex2[0]; + } + + /** + * Remove query string from the URL + * @author Webnus + * @param string $key + * @param string $url + * @return string + */ + public function remove_qs_var($key, $url = '') + { + if (trim($url) == '') $url = $this->get_full_url(); + + $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); + return substr($url, 0, -1); + } + + /** + * Add query string to the URL + * @author Webnus + * @param string $key + * @param string $value + * @param string $url + * @return string + */ + public function add_qs_var($key, $value, $url = '') + { + if (trim($url) == '') $url = $this->get_full_url(); + + $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); + $url = substr($url, 0, -1); + + if (strpos($url, '?') === false) + return $url . '?' . $key . '=' . $value; + else + return $url . '&' . $key . '=' . $value; + } + + /** + * Add multiple query strings to the URL + * @author Webnus + * @param array $vars + * @param string $url + * @return string + */ + public function add_qs_vars($vars, $url = '') + { + if (trim($url) == '') $url = $this->get_full_url(); + + foreach ($vars as $key => $value) $url = $this->add_qs_var($key, $value, $url); + return $url; + } + + /** + * Returns WordPress authors + * @author Webnus + * @param array $args + * @return array + */ + public function get_authors($args = array()) + { + return get_users($args); + } + + /** + * Returns full URL of an asset + * @author Webnus + * @param string $asset + * @param boolean $override + * @return string + */ + public function asset($asset, $override = true) + { + $url = $this->URL('MEC') . 'assets/' . $asset; + + if ($override) { + // Search the file in the main theme + $theme_path = get_template_directory() . DS . 'webnus' . DS . MEC_DIRNAME . DS . 'assets' . DS . $asset; + + /** + * If overridden file exists on the main theme, then use it instead of normal file + * For example you can override /path/to/plugin/assets/js/frontend.js file in your theme by adding a file into the /path/to/theme/webnus/modern-events-calendar/assets/js/frontend.js + */ + if (file_exists($theme_path)) $url = get_template_directory_uri() . '/webnus/' . MEC_DIRNAME . '/assets/' . $asset; + + // If the theme is a child theme then search the file in child theme + if (get_template_directory() != get_stylesheet_directory()) { + // Child theme overridden file + $child_theme_path = get_stylesheet_directory() . DS . 'webnus' . DS . MEC_DIRNAME . DS . 'assets' . DS . $asset; + + /** + * If overridden file exists on the child theme, then use it instead of normal or main theme file + * For example you can override /path/to/plugin/assets/js/frontend.js file in your theme by adding a file into the /path/to/child/theme/webnus/modern-events-calendar/assets/js/frontend.js + */ + if (file_exists($child_theme_path)) $url = get_stylesheet_directory_uri() . '/webnus/' . MEC_DIRNAME . '/assets/' . $asset; + } + } + + return $url; + } + + public function svg($icon, $override = true) + { + $title = sprintf(__('%s icon', 'modern-events-calendar-lite'), ucfirst(str_replace('-', ' ', $icon))); + + return '' . esc_attr($title) . ''; + } + + /** + * Returns URL of WordPress items such as site, admin, plugins, MEC plugin etc. + * @author Webnus + * @param string $type + * @return string + */ + public function URL($type = 'site') + { + // Make it lowercase + $type = strtolower($type); + + // Frontend + if (in_array($type, array('frontend', 'site'))) $url = home_url() . '/'; + // Backend + elseif (in_array($type, array('backend', 'admin'))) $url = admin_url(); + // WordPress' Content directory URL + elseif ($type == 'content') $url = content_url() . '/'; + // WordPress' plugins directory URL + elseif ($type == 'plugin') $url = plugins_url() . '/'; + // WordPress include directory URL + elseif ($type == 'include') $url = includes_url(); + // Webnus MEC plugin URL + else { + // If plugin installed regularly on plugins directory + if (!defined('MEC_IN_THEME')) $url = plugins_url() . '/' . MEC_DIRNAME . '/'; + // If plugin embedded into one theme + else $url = get_template_directory_uri() . '/plugins/' . MEC_DIRNAME . '/'; + } + + return $url; + } + + /** + * Returns plugin absolute path + * @author Webnus + * @return string + */ + public function get_plugin_path() + { + return MEC_ABSPATH; + } + + /** + * Returns a WordPress option + * @author Webnus + * @param string $option + * @param mixed $default + * @return mixed + */ + public function get_option($option, $default = NULL) + { + return get_option($option, $default); + } + + /** + * Returns WordPress categories based on arguments + * @author Webnus + * @param array $args + * @return array + */ + public function get_categories($args = array()) + { + return get_categories($args); + } + + /** + * Returns WordPress tags based on arguments + * @author Webnus + * @param array $args + * @return array + */ + public function get_tags($args = array()) + { + return get_tags($args); + } + + /** + * Convert location string to latitude and longitude + * @author Webnus + * @param string $address + * @return array + */ + public function get_lat_lng($address) + { + $address = urlencode($address); + if (!trim($address)) return array(0, 0); + + // MEC Settings + $settings = $this->get_settings(); + + $url1 = "https://maps.googleapis.com/maps/api/geocode/json?address=" . $address . ((isset($settings['google_maps_api_key']) and trim($settings['google_maps_api_key']) != '') ? '&key=' . $settings['google_maps_api_key'] : ''); + $url2 = 'http://www.datasciencetoolkit.org/maps/api/geocode/json?sensor=false&address=' . $address; + + // Get Latitide and Longitude by First URL + $JSON = wp_remote_retrieve_body(wp_remote_get($url1, array( + 'body' => null, + 'timeout' => '10', + 'redirection' => '10', + ))); + + $data = json_decode($JSON, true); + + $location_point = isset($data['results'][0]) ? $data['results'][0]['geometry']['location'] : []; + if ((isset($location_point['lat']) and $location_point['lat']) and (isset($location_point['lng']) and $location_point['lng'])) { + return array($location_point['lat'], $location_point['lng']); + } + + // Get Latitide and Longitude by Second URL + $JSON = wp_remote_retrieve_body(wp_remote_get($url2, array( + 'body' => null, + 'timeout' => '10', + 'redirection' => '10', + ))); + + $data = json_decode($JSON, true); + + $location_point = isset($data['results'][0]) ? $data['results'][0]['geometry']['location'] : []; + if ((isset($location_point['lat']) and $location_point['lat']) and (isset($location_point['lng']) and $location_point['lng'])) { + return array($location_point['lat'], $location_point['lng']); + } + + return array(0, 0); + } + + /** + * @author Webnus + * @return string + */ + public function get_default_label_color() + { + return apply_filters('mec_default_label_color', '#fefefe'); + } + + /** + * @author Webnus + * @param mixed $event + * @return string + */ + public function get_post_content($event) + { + if (is_object($event)) $event_id = $event->data->ID; + else $event_id = $event; + + $post = get_post($event_id); + if (!$post) return NULL; + + $content = apply_filters('the_content', str_replace('[MEC ', '', $post->post_content)); + return str_replace(']]>', ']]>', do_shortcode($content)); + } + + /** + * @author Webnus + * @param int $post_id + * @param boolean $skip + * @return array + */ + public function get_post_meta($post_id, $skip = false) + { + // Cache + $cache = $this->getCache(); + + // Return From Cache + return $cache->rememberOnce('meta-' . $post_id . '-' . ($skip ? 1 : 0), function () use ($post_id, $skip) { + $raw_data = get_post_meta($post_id, '', true); + $data = []; + + // Invalid Raw Data + if (!is_array($raw_data)) return $data; + + foreach ($raw_data as $key => $val) { + if ($skip and strpos($key, 'mec') === false and strpos($key, 'event') === false) continue; + $data[$key] = isset($val[0]) ? (!is_serialized($val[0]) ? $val[0] : unserialize($val[0])) : NULL; + } + + return $data; + }); + } + + /** + * @author Webnus + * @return array + */ + public function get_skins() + { + $skins = array( + 'list' => __('List View', 'modern-events-calendar-lite'), + 'grid' => __('Grid View', 'modern-events-calendar-lite'), + 'agenda' => __('Agenda View', 'modern-events-calendar-lite'), + 'full_calendar' => __('Full Calendar', 'modern-events-calendar-lite'), + 'yearly_view' => __('Yearly View', 'modern-events-calendar-lite'), + 'monthly_view' => __('Calendar/Monthly View', 'modern-events-calendar-lite'), + 'daily_view' => __('Daily View', 'modern-events-calendar-lite'), + 'weekly_view' => __('Weekly View', 'modern-events-calendar-lite'), + 'timetable' => __('Timetable View', 'modern-events-calendar-lite'), + 'masonry' => __('Masonry View', 'modern-events-calendar-lite'), + 'map' => __('Map View', 'modern-events-calendar-lite'), + 'cover' => __('Cover View', 'modern-events-calendar-lite'), + 'countdown' => __('Countdown View', 'modern-events-calendar-lite'), + 'available_spot' => __('Available Spot', 'modern-events-calendar-lite'), + 'carousel' => __('Carousel View', 'modern-events-calendar-lite'), + 'slider' => __('Slider View', 'modern-events-calendar-lite'), + 'timeline' => __('Timeline View', 'modern-events-calendar-lite'), + 'tile' => __('Tile View', 'modern-events-calendar-lite'), + 'general_calendar' => __('General Calendar', 'modern-events-calendar-lite'), + ); + + return apply_filters('mec_calendar_skins', $skins); + } + + public function get_months_labels() + { + $labels = array( + 1 => date_i18n('F', strtotime(date('Y') . '-01-01')), + 2 => date_i18n('F', strtotime(date('Y') . '-02-01')), + 3 => date_i18n('F', strtotime(date('Y') . '-03-01')), + 4 => date_i18n('F', strtotime(date('Y') . '-04-01')), + 5 => date_i18n('F', strtotime(date('Y') . '-05-01')), + 6 => date_i18n('F', strtotime(date('Y') . '-06-01')), + 7 => date_i18n('F', strtotime(date('Y') . '-07-01')), + 8 => date_i18n('F', strtotime(date('Y') . '-08-01')), + 9 => date_i18n('F', strtotime(date('Y') . '-09-01')), + 10 => date_i18n('F', strtotime(date('Y') . '-10-01')), + 11 => date_i18n('F', strtotime(date('Y') . '-11-01')), + 12 => date_i18n('F', strtotime(date('Y') . '-12-01')), + ); + + + return apply_filters('mec_months_labels', $labels); + } + + /** + * Returns weekday labels + * @author Webnus + * @param integer $week_start + * @return array + */ + public function get_weekday_labels($week_start = NULL) + { + if (is_null($week_start)) $week_start = $this->get_first_day_of_week(); + + /** + * Please don't change it to translate-able strings + */ + $raw = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); + + $labels = array_slice($raw, $week_start); + $rest = array_slice($raw, 0, $week_start); + + foreach ($rest as $label) $labels[] = $label; + + return apply_filters('mec_weekday_labels', $labels); + } + + /** + * Returns abbr weekday labels + * @author Webnus + * @return array + */ + public function get_weekday_abbr_labels() + { + $week_start = $this->get_first_day_of_week(); + $raw = array( + $this->m('weekdays_su', esc_html__('SU', 'modern-events-calendar-lite')), + $this->m('weekdays_mo', esc_html__('MO', 'modern-events-calendar-lite')), + $this->m('weekdays_tu', esc_html__('TU', 'modern-events-calendar-lite')), + $this->m('weekdays_we', esc_html__('WE', 'modern-events-calendar-lite')), + $this->m('weekdays_th', esc_html__('TH', 'modern-events-calendar-lite')), + $this->m('weekdays_fr', esc_html__('FR', 'modern-events-calendar-lite')), + $this->m('weekdays_sa', esc_html__('SA', 'modern-events-calendar-lite')) + ); + + $labels = array_slice($raw, $week_start); + $rest = array_slice($raw, 0, $week_start); + + foreach ($rest as $label) $labels[] = $label; + + return apply_filters('mec_weekday_abbr_labels', $labels); + } + + /** + * Returns translatable weekday labels + * @author Webnus + * @return array + */ + public function get_weekday_i18n_labels() + { + $week_start = $this->get_first_day_of_week(); + $raw = array(array(7, esc_html__('Sunday', 'modern-events-calendar-lite')), array(1, esc_html__('Monday', 'modern-events-calendar-lite')), array(2, esc_html__('Tuesday', 'modern-events-calendar-lite')), array(3, esc_html__('Wednesday', 'modern-events-calendar-lite')), array(4, esc_html__('Thursday', 'modern-events-calendar-lite')), array(5, esc_html__('Friday', 'modern-events-calendar-lite')), array(6, esc_html__('Saturday', 'modern-events-calendar-lite'))); + + $labels = array_slice($raw, $week_start); + $rest = array_slice($raw, 0, $week_start); + + foreach ($rest as $label) $labels[] = $label; + + return apply_filters('mec_weekday_i18n_labels', $labels); + } + + /** + * Flush WordPress rewrite rules + * @author Webnus + */ + public function flush_rewrite_rules() + { + // Register Events Post Type + $MEC_events = MEC::getInstance('app.features.events', 'MEC_feature_events'); + $MEC_events->register_post_type(); + + flush_rewrite_rules(); + } + + /** + * Get single slug of MEC + * @author Webnus + * @return string + */ + public function get_single_slug() + { + $settings = $this->get_settings(); + $slug = (isset($settings['single_slug']) and trim($settings['single_slug']) != '') ? $settings['single_slug'] : 'event'; + + return strtolower($slug); + } + + /** + * Returns main slug of MEC + * @author Webnus + * @return string + */ + public function get_main_slug() + { + $settings = $this->get_settings(); + $slug = (isset($settings['slug']) and trim($settings['slug']) != '') ? $settings['slug'] : 'events'; + + return strtolower($slug); + } + + /** + * Returns category slug of MEC + * @author Webnus + * @return string + */ + public function get_category_slug() + { + $settings = $this->get_settings(); + $slug = (isset($settings['category_slug']) and trim($settings['category_slug']) != '') ? $settings['category_slug'] : 'mec-category'; + + return strtolower($slug); + } + + /** + * Get archive page title + * @param bool $meta + * @return string + * @author Webnus + */ + public function get_archive_title($meta = true) + { + $settings = $this->get_settings(); + $archive_title = (isset($settings['archive_title']) and trim($settings['archive_title']) != '') ? $settings['archive_title'] : 'Events'; + + // Add Blog Name + if ($meta and apply_filters('mec_archive_title_add_blog_name', true)) $archive_title .= ' - ' . get_bloginfo('name'); + + return apply_filters('mec_archive_title', $archive_title); + } + + public function get_archive_url() + { + $archive_link = get_post_type_archive_link($this->get_main_post_type()); + + // Archive is disabled + if ($archive_link === false) { + $archive_page = get_page_by_path('events2'); + if ($archive_page) $archive_link = get_permalink($archive_page); + } + + return $archive_link; + } + + /** + * @author Webnus + * @return string + */ + public function get_archive_thumbnail() + { + return apply_filters('mec_archive_thumbnail', ''); + } + + /** + * @author Webnus + * @return string + */ + public function get_single_thumbnail() + { + return apply_filters('mec_single_thumbnail', ''); + } + + /** + * @author Webnus + * @return string + */ + public function get_main_post_type() + { + return apply_filters('mec_post_type_name', 'mec-events'); + } + + /** + * Returns main options of MEC + * @author Webnus + * @param string $locale + * @return array + */ + public function get_options($locale = NULL) + { + if ($locale) { + $options = get_option('mec_options_' . strtolower($locale), array()); + if (!is_array($options) || !count($options)) $options = get_option('mec_options', array()); + + return $options; + } else return get_option('mec_options', array()); + } + + /** + * Returns Multilingual options of MEC + * @author Webnus + * @param string $key + * @param string $locale + * @return array + */ + public function get_ml_settings($key = NULL, $locale = NULL) + { + if (!$locale) $locale = $this->get_current_locale(); + + $options = get_option('mec_options_ml_' . strtolower($locale), array()); + if (!$this->is_multilingual() or !is_array($options) or (is_array($options) and !count($options))) { + $all = get_option('mec_options', array()); + if (!is_array($all)) $all = []; + + $options = (isset($all['settings']) ? $all['settings'] : array()); + } + + return ($key ? (isset($options[$key]) ? $options[$key] : NULL) : $options); + } + + /** + * Returns MEC settings menus + * @author Webnus + * @param string $active_menu + * @return void + */ + public function get_sidebar_menu($active_menu = 'settings') + { + $options = $this->get_settings(); + $settings = apply_filters('mec-settings-items-settings', array( + esc_html__('General', 'modern-events-calendar-lite') => 'general_option', + esc_html__('Archive Pages', 'modern-events-calendar-lite') => 'archive_options', + esc_html__('Slugs/Permalinks', 'modern-events-calendar-lite') => 'slug_option', + esc_html__('Currency', 'modern-events-calendar-lite') => 'currency_option', + esc_html__('Security Captcha', 'modern-events-calendar-lite') => 'captcha_option', + esc_html__('Search', 'modern-events-calendar-lite') => 'search_options', + ), $active_menu); + + $integrations = apply_filters('mec-settings-items-integrations', array( + esc_html__('Mailchimp', 'modern-events-calendar-lite') => 'mailchimp_option', + esc_html__('Campaign Monitor', 'modern-events-calendar-lite') => 'campaign_monitor_option', + esc_html__('MailerLite', 'modern-events-calendar-lite') => 'mailerlite_option', + esc_html__('Constant Contact', 'modern-events-calendar-lite') => 'constantcontact_option', + esc_html__('Active Campaign', 'modern-events-calendar-lite') => 'active_campaign_option', + esc_html__('AWeber', 'modern-events-calendar-lite') => 'aweber_option', + esc_html__('MailPoet', 'modern-events-calendar-lite') => 'mailpoet_option', + esc_html__('Sendfox', 'modern-events-calendar-lite') => 'sendfox_option', + esc_html__('BuddyPress', 'modern-events-calendar-lite') => 'buddy_option', + esc_html__('LearnDash', 'modern-events-calendar-lite') => 'learndash_options', + esc_html__('Paid Membership Pro', 'modern-events-calendar-lite') => 'pmp_options', + ), $active_menu); + + $single_event = apply_filters('mec-settings-item-single_event', array( + esc_html__('Single Event Page', 'modern-events-calendar-lite') => 'event_options', + esc_html__('Custom Fields', 'modern-events-calendar-lite') => 'event_form_option', + esc_html__('Sidebar', 'modern-events-calendar-lite') => 'single_sidebar_options', + esc_html__('Icons', 'modern-events-calendar-lite') => 'single_icons_options', + ), $active_menu); + + $booking = apply_filters('mec-settings-item-booking', array( + $this->m('booking', esc_html__('Booking', 'modern-events-calendar-lite')) => 'booking_option', + sprintf(esc_html__('%s Elements', 'modern-events-calendar-lite'), $this->m('booking', esc_html__('Booking', 'modern-events-calendar-lite'))) => 'booking_elements', + esc_html__('Global Tickets', 'modern-events-calendar-lite') => 'booking_tickets_option', + sprintf(esc_html__('%s Form', 'modern-events-calendar-lite'), $this->m('booking', esc_html__('Booking', 'modern-events-calendar-lite'))) => 'booking_form_option', + esc_html__('Payment Gateways', 'modern-events-calendar-lite') => 'payment_gateways_option', + esc_html__('MEC Cart', 'modern-events-calendar-lite') => 'cart_option', + esc_html__('Ticket Variations & Options', 'modern-events-calendar-lite') => 'ticket_variations_option', + esc_html__('Taxes / Fees', 'modern-events-calendar-lite') => 'taxes_option', + esc_html__('Coupons', 'modern-events-calendar-lite') => 'coupon_option', + ), $active_menu); + + $modules = apply_filters('mec-settings-item-modules', array( + esc_html__('Speakers', 'modern-events-calendar-lite') => 'speakers_option', + esc_html__('Organizers', 'modern-events-calendar-lite') => 'organizers_option', + esc_html__('Locations', 'modern-events-calendar-lite') => 'locations_option', + esc_html__('Countdown', 'modern-events-calendar-lite') => 'countdown_option', + esc_html__('Map', 'modern-events-calendar-lite') => 'googlemap_option', + esc_html__('Exceptional Days', 'modern-events-calendar-lite') => 'exceptional_option', + esc_html__('Local Time', 'modern-events-calendar-lite') => 'time_module_option', + esc_html__('Progress Bar', 'modern-events-calendar-lite') => 'progress_bar_option', + esc_html__('Event Gallery', 'modern-events-calendar-lite') => 'event_gallery_option', + esc_html__('QR Code', 'modern-events-calendar-lite') => 'qrcode_module_option', + esc_html__('Weather', 'modern-events-calendar-lite') => 'weather_module_option', + esc_html__('Related Events', 'modern-events-calendar-lite') => 'related_events', + esc_html__('Social Networks', 'modern-events-calendar-lite') => 'social_options', + esc_html__('Event Export', 'modern-events-calendar-lite') => 'export_module_option', + esc_html__('Next Event', 'modern-events-calendar-lite') => 'next_event_option', + esc_html__('Next / Previous Events', 'modern-events-calendar-lite') => 'next_previous_events', + ), $active_menu); + + $FES = apply_filters('mec-settings-items-fes', array( + esc_html__('General', 'modern-events-calendar-lite') => 'fes_general_options', + esc_html__('Access Level', 'modern-events-calendar-lite') => 'fes_acl_options', + esc_html__('FES Sections', 'modern-events-calendar-lite') => 'fes_section_options', + esc_html__('Required Fields', 'modern-events-calendar-lite') => 'fes_req_fields_options', + ), $active_menu); + + $notifications_items = array( + esc_html__('Options', 'modern-events-calendar-lite') => 'notification_options', + esc_html__('New Event', 'modern-events-calendar-lite') => 'new_event', + esc_html__('User Event Publishing', 'modern-events-calendar-lite') => 'user_event_publishing', + ); + + if ($this->getPRO()) + { + $settings[esc_html__('RESTful API', 'modern-events-calendar-lite')] = 'restful_api_options'; + + $notifications_items = [ + esc_html__('Options', 'modern-events-calendar-lite') => 'notification_options', + esc_html__('Booking', 'modern-events-calendar-lite') => 'booking_notification_section', + esc_html__('Booking Confirmation', 'modern-events-calendar-lite') => 'booking_confirmation', + esc_html__('Booking Rejection', 'modern-events-calendar-lite') => 'booking_rejection', + esc_html__('Booking Verification', 'modern-events-calendar-lite') => 'booking_verification', + esc_html__('Booking Cancellation', 'modern-events-calendar-lite') => 'cancellation_notification', + esc_html__('Booking Reminder', 'modern-events-calendar-lite') => 'booking_reminder', + esc_html__('Booking Reschedule', 'modern-events-calendar-lite') => 'booking_moved', + esc_html__('Event Soldout', 'modern-events-calendar-lite') => 'event_soldout', + esc_html__('Admin', 'modern-events-calendar-lite') => 'admin_notification', + esc_html__('Event Finished', 'modern-events-calendar-lite') => 'event_finished', + esc_html__('New Event', 'modern-events-calendar-lite') => 'new_event', + esc_html__('User Event Publishing', 'modern-events-calendar-lite') => 'user_event_publishing', + esc_html__('Auto Emails', 'modern-events-calendar-lite') => 'auto_emails_option', + esc_html__('Suggest Event', 'modern-events-calendar-lite') => 'suggest_event', + ]; + + // Certificate + if (isset($options['certificate_status']) && $options['certificate_status']) { + $notifications_items[esc_html__('Certification', 'modern-events-calendar-lite')] = 'certificate_send'; + } + + $modules = apply_filters('mec-settings-item-modules', [ + esc_html__('Speakers', 'modern-events-calendar-lite') => 'speakers_option', + esc_html__('Organizers', 'modern-events-calendar-lite') => 'organizers_option', + esc_html__('Sponsors', 'modern-events-calendar-lite') => 'sponsors_option', + esc_html__('Locations', 'modern-events-calendar-lite') => 'locations_option', + esc_html__('Countdown', 'modern-events-calendar-lite') => 'countdown_option', + esc_html__('Map', 'modern-events-calendar-lite') => 'googlemap_option', + esc_html__('Exceptional Days', 'modern-events-calendar-lite') => 'exceptional_option', + esc_html__('Local Time', 'modern-events-calendar-lite') => 'time_module_option', + esc_html__('Progress Bar', 'modern-events-calendar-lite') => 'progress_bar_option', + esc_html__('Event Gallery', 'modern-events-calendar-lite') => 'event_gallery_option', + esc_html__('QR Code', 'modern-events-calendar-lite') => 'qrcode_module_option', + esc_html__('Weather', 'modern-events-calendar-lite') => 'weather_module_option', + esc_html__('Related Events', 'modern-events-calendar-lite') => 'related_events', + esc_html__('Social Networks', 'modern-events-calendar-lite') => 'social_options', + esc_html__('Export', 'modern-events-calendar-lite') => 'export_module_option', + esc_html__('Next Event', 'modern-events-calendar-lite') => 'next_event_option', + esc_html__('Next / Previous Events', 'modern-events-calendar-lite') => 'next_previous_events', + esc_html__('Certificates', 'modern-events-calendar-lite') => 'certificate_options', + esc_html__('SMS', 'modern-events-calendar-lite') => 'sms_options', + ], $active_menu); + } + + $notifications = apply_filters('mec-settings-item-notifications', $notifications_items, $active_menu); +?> + + + + * @return array + */ + public function get_settings() + { + $options = $this->get_options(); + return (isset($options['settings']) ? $options['settings'] : array()); + } + + /** + * Returns MEC addons message + * @author Webnus + * @return string + */ + public function addons_msg() + { + $get_n_option = get_option('mec_addons_notification_option'); + if ($get_n_option == 'open') return ''; + + return ' +
    +
    +
    +
    ' . esc_html__('New Addons For MEC! Now Customize MEC in Elementor', 'modern-events-calendar-lite') . '
    +
    +
    + +
    +
    +
    +

    ' . esc_html__('The time has come at last, and the new practical add-ons for MEC have been released. This is a revolution in the world of Event Calendars. We have provided you with a wide range of features only by having the 4 add-ons below:', 'modern-events-calendar-lite') . '

    +
      +
    1. ' . esc_html__('WooCommerce Integration: You can now purchase ticket (as products) and Woo products at the same time.', 'modern-events-calendar-lite') . '
    2. +
    3. ' . esc_html__('Event API: display your events (shortcodes/single event) on other websites without MEC. Use JSON output features to make your Apps compatible with MEC.', 'modern-events-calendar-lite') . '
    4. +
    5. ' . esc_html__('Multisite Event Sync: Sync events between your subsites and main websites. Changes in the main one will be inherited by the subsites. you can set these up in the admin panel.', 'modern-events-calendar-lite') . '
    6. +
    7. ' . esc_html__('User Dashboard: Create exclusive pages for users. These pages can contain ticket purchase information, information about registered events. Users can now log in to purchase tickets.', 'modern-events-calendar-lite') . '
    8. +
    + ' . esc_html__('find out more', 'modern-events-calendar-lite') . ' +
    +
    +
    +
    +
    +
    + '; + } + + /** + * Returns MEC custom message 2 + * @author Webnus + * @return string + */ + public function mec_custom_msg_2($display_option = '', $message = '') + { + $get_cmsg_display_option = get_option('mec_custom_msg_2_display_option'); + $get_mec_saved_message_time = get_option('mec_saved_message_2_time'); + $data_url = 'https://files.webnus.site/addons-api/mec-extra-content-2.json'; + + if (!isset($get_mec_saved_message_time)): + if (ini_get('allow_url_fopen')) { + $body = @file_get_contents(plugin_dir_path(__FILE__) . '../api/addons-api/mec-extra-content-2.json'); + } + $obj = json_decode($body); + update_option('mec_saved_message_2_time', date("Y-m-d")); + else: + if (strtotime(date("Y-m-d")) > strtotime($get_mec_saved_message_time)) { + if (ini_get('allow_url_fopen')) { + $body = @file_get_contents(plugin_dir_path(__FILE__) . '../api/addons-api/mec-extra-content-2.json'); + } + $obj = json_decode($body); + update_option('mec_saved_message_2_time', date("Y-m-d")); + } else { + $mec_custom_msg_html = get_option('mec_custom_msg_2_html'); + $mec_custom_msg_display = get_option('mec_custom_msg_2_display'); + if ($get_cmsg_display_option != $mec_custom_msg_display) : + update_option('mec_custom_msg_2_display_option', $mec_custom_msg_display); + update_option('mec_custom_msg_2_close_option', 'close'); + update_option('mec_saved_message_2_time', date("Y-m-d")); + return $mec_custom_msg_html; + else: + $get_cmsg_close_option = get_option('mec_custom_msg_2_close_option'); + update_option('mec_saved_message_2_time', date("Y-m-d")); + if ($get_cmsg_close_option == 'open') return ''; + return $mec_custom_msg_html; + endif; + } + endif; + + if (!empty($obj)) { + $display = ''; + $html = ''; + + foreach ($obj as $value) { + $html = '
    Announcement
    Square Payment

    As promised, another one of the most-requested addons by you, Square Payment, is released this week. The first six addons are out already. Webex Integration and Social Auto Poster and Elementor FES Builder and Seat and Gutenberg Single Builder and Square Payment are now available on our website for purchase.

    Read More
    '; + update_option('mec_custom_msg_2_html', $html); + $display = $value->display; + update_option('mec_custom_msg_2_display', $display); + } + + if ($get_cmsg_display_option != $display) { + update_option('mec_custom_msg_2_display_option', $display); + update_option('mec_custom_msg_2_close_option', 'close'); + } else { + $get_cmsg_close_option = get_option('mec_custom_msg_2_close_option'); + if ($get_cmsg_close_option === 'open') return ''; + } + + return $html; + } + + return ''; + } + + /** + * Returns MEC custom message + * @author Webnus + * @return array + */ + public function mec_custom_msg($display_option = '', $message = '') + { + $get_cmsg_display_option = get_option('mec_custom_msg_display_option'); + $get_mec_saved_message_time = get_option('mec_saved_message_time'); + $data_url = 'https://files.webnus.site/addons-api/mec-extra-content.json'; + + if (!isset($get_mec_saved_message_time)): + if (ini_get('allow_url_fopen')) { + $body = @file_get_contents(plugin_dir_path(__FILE__) . '../api/addons-api/mec-extra-content.json'); + } + $obj = json_decode($body); + update_option('mec_saved_message_time', date("Y-m-d")); + else: + if (strtotime(date("Y-m-d")) > strtotime($get_mec_saved_message_time)) { + if (ini_get('allow_url_fopen')) { + $body = @file_get_contents(plugin_dir_path(__FILE__) . '../api/addons-api/mec-extra-content.json'); + } + $obj = json_decode($body); + update_option('mec_saved_message_time', date("Y-m-d")); + } else { + $mec_custom_msg_html = get_option('mec_custom_msg_html'); + $mec_custom_msg_display = get_option('mec_custom_msg_display'); + if ($get_cmsg_display_option != $mec_custom_msg_display) : + update_option('mec_custom_msg_display_option', $mec_custom_msg_display); + update_option('mec_custom_msg_close_option', 'close'); + update_option('mec_saved_message_time', date("Y-m-d")); + return $mec_custom_msg_html; + elseif ($get_cmsg_display_option == $mec_custom_msg_display) : + $get_cmsg_close_option = get_option('mec_custom_msg_close_option'); + update_option('mec_saved_message_time', date("Y-m-d")); + if ($get_cmsg_close_option == 'open') return; + return $mec_custom_msg_html; + endif; + } + endif; + + if (!empty($obj)) : + foreach ($obj as $key => $value) { + $html = '
    Announcement
    Liquid View Layouts

    As promised, another one of the most-requested addons by you, Liquid View Layouts, is released this week. The all addons are out already. Webex Integration and Social Auto Poster and Elementor FES Builder and Seat and Gutenberg Single Builder and Square Payment and Liquid View Layouts are now available on our website for purchase.

    Read More
    '; + update_option('mec_custom_msg_html', $html); + $display = $value->display; + update_option('mec_custom_msg_display', $display); + } + + if ($get_cmsg_display_option != $display) : + update_option('mec_custom_msg_display_option', $display); + update_option('mec_custom_msg_close_option', 'close'); + return $html; + elseif ($get_cmsg_display_option == $display) : + $get_cmsg_close_option = get_option('mec_custom_msg_close_option'); + if ($get_cmsg_close_option == 'open') return; + return $html; + endif; + else: + return ''; + endif; + } + /** + * Returns MEC settings + * @author Webnus + * @return array + */ + public function get_default_form() + { + $options = $this->get_options(); + return $options['default_form'] ?? []; + } + + /** + * Returns registration form fields + * @author Webnus + * @param integer $event_id + * @param integer $translated_event_id + * @return array + */ + public function get_reg_fields($event_id = NULL, $translated_event_id = NULL) + { + $options = $this->get_options(); + $reg_fields = $options['reg_fields'] ?? []; + + // Event Booking Fields + if ($event_id) { + $global_inheritance = get_post_meta($event_id, 'mec_reg_fields_global_inheritance', true); + if (trim($global_inheritance) == '') $global_inheritance = 1; + + if (!$global_inheritance) { + $event_reg_fields = get_post_meta($event_id, 'mec_reg_fields', true); + if (is_array($event_reg_fields)) $reg_fields = $event_reg_fields; + + // We're getting fields for a translated event + if ($translated_event_id and $event_id != $translated_event_id) { + $translated_reg_fields = get_post_meta($translated_event_id, 'mec_reg_fields', true); + if (!is_array($translated_reg_fields)) $translated_reg_fields = []; + + foreach ($translated_reg_fields as $field_id => $translated_reg_field) { + if (!isset($reg_fields[$field_id])) continue; + if (isset($translated_reg_field['label']) and trim($translated_reg_field['label'])) $reg_fields[$field_id]['label'] = $translated_reg_field['label']; + if (isset($translated_reg_field['options']) and is_array($translated_reg_field['options'])) $reg_fields[$field_id]['options'] = $translated_reg_field['options']; + } + } + } + } + + return apply_filters('mec_get_reg_fields', $reg_fields, $event_id); + } + + /** + * Returns booking fixed fields + * @author Webnus + * @param integer $event_id + * @param integer $translated_event_id + * @return array + */ + public function get_bfixed_fields($event_id = NULL, $translated_event_id = NULL) + { + $options = $this->get_options(); + $bfixed_fields = $options['bfixed_fields'] ?? []; + + // Event Fields + if ($event_id) { + $global_inheritance = get_post_meta($event_id, 'mec_reg_fields_global_inheritance', true); + if (trim($global_inheritance) == '') $global_inheritance = 1; + + if (!$global_inheritance) { + $event_bfixed_fields = get_post_meta($event_id, 'mec_bfixed_fields', true); + if (is_array($event_bfixed_fields)) $bfixed_fields = $event_bfixed_fields; + + // We're getting fields for a translated event + if ($translated_event_id and $event_id != $translated_event_id) { + $translated_bfixed_fields = get_post_meta($translated_event_id, 'mec_bfixed_fields', true); + if (!is_array($translated_bfixed_fields)) $translated_bfixed_fields = []; + + foreach ($translated_bfixed_fields as $field_id => $translated_bfixed_field) { + if (!isset($bfixed_fields[$field_id])) continue; + if (isset($translated_bfixed_field['label']) and trim($translated_bfixed_field['label'])) $bfixed_fields[$field_id]['label'] = $translated_bfixed_field['label']; + if (isset($translated_bfixed_field['options']) and is_array($translated_bfixed_field['options'])) $bfixed_fields[$field_id]['options'] = $translated_bfixed_field['options']; + } + } + } + } + + return apply_filters('mec_get_bfixed_fields', $bfixed_fields, $event_id); + } + + /** + * Returns event form fields + * @author Webnus + * @return array + */ + public function get_event_fields() + { + $options = $this->get_options(); + $event_fields = $options['event_fields'] ?? []; + + if (isset($event_fields[':i:'])) unset($event_fields[':i:']); + if (isset($event_fields[':fi:'])) unset($event_fields[':fi:']); + + return apply_filters('mec_get_event_fields', $event_fields); + } + + /** + * Returns Ticket Variations + * @author Webnus + * @param integer $event_id + * @param integer $ticket_id + * @return array + */ + public function ticket_variations($event_id = NULL, $ticket_id = NULL) + { + $settings = $this->get_settings(); + $ticket_variations = (isset($settings['ticket_variations']) and is_array($settings['ticket_variations'])) ? $settings['ticket_variations'] : []; + + // Event Ticket Variations + if ($event_id) { + $global_inheritance = get_post_meta($event_id, 'mec_ticket_variations_global_inheritance', true); + if (trim($global_inheritance) == '') $global_inheritance = 1; + + if (!$global_inheritance) { + $event_ticket_variations = get_post_meta($event_id, 'mec_ticket_variations', true); + if (is_array($event_ticket_variations)) $ticket_variations = $event_ticket_variations; + } + + // Variations Per Ticket + if ($ticket_id) { + $tickets = get_post_meta($event_id, 'mec_tickets', true); + $ticket = ((isset($tickets[$ticket_id]) and is_array($tickets[$ticket_id])) ? $tickets[$ticket_id] : array()); + + $event_inheritance = $ticket['variations_event_inheritance'] ?? 1; + if (!$event_inheritance and isset($ticket['variations']) and is_array($ticket['variations'])) $ticket_variations = $ticket['variations']; + } + } + + // Clean + if (isset($ticket_variations[':i:'])) unset($ticket_variations[':i:']); + if (isset($ticket_variations[':v:'])) unset($ticket_variations[':v:']); + + return $ticket_variations; + } + + public function has_variations_per_ticket($event_id, $ticket_id) + { + $has = false; + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + $ticket = ((isset($tickets[$ticket_id]) and is_array($tickets[$ticket_id])) ? $tickets[$ticket_id] : array()); + + $event_inheritance = $ticket['variations_event_inheritance'] ?? 1; + if (!$event_inheritance and isset($ticket['variations']) and is_array($ticket['variations'])) $has = true; + + return $has; + } + + /** + * Returns Messages Options + * @author Webnus + * @param string $locale + * @return array + */ + public function get_messages_options($locale = NULL) + { + if ($this->is_multilingual() and !$locale) $locale = $this->get_current_language(); + + $options = $this->get_options($locale); + return $options['messages'] ?? []; + } + + /** + * Returns gateways options + * @author Webnus + * @return array + */ + public function get_gateways_options() + { + $options = $this->get_options(); + return $options['gateways'] ?? []; + } + /** + * Returns notifications settings of MEC + * @author Webnus + * @param string $locale + * @return array + */ + public function get_notifications($locale = NULL) + { + if ($this->is_multilingual() and !$locale) $locale = $this->get_current_language(); + + $options = $this->get_options($locale); + return $options['notifications'] ?? []; + } + + /** + * Returns Import/Export options of MEC + * @author Webnus + * @return array + */ + public function get_ix_options() + { + $options = $this->get_options(); + return $options['ix'] ?? []; + } + + /** + * Returns style settings of MEC + * @author Webnus + * @return array + */ + public function get_styles() + { + $options = $this->get_options(); + return $options['styles'] ?? []; + } + + /** + * Returns styling option of MEC + * @author Webnus + * @return array + */ + public function get_styling() + { + $options = $this->get_options(); + return $options['styling'] ?? []; + } + + /** + * Saves MEC settings + * @author Webnus + * @return void + */ + public function save_options() + { + $wpnonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field($_REQUEST['_wpnonce']) : NULL; + + // Check if our nonce is set. + if (!trim($wpnonce)) $this->response(array('success' => 0, 'code' => 'NONCE_MISSING')); + + // Verify that the nonce is valid. + if (!wp_verify_nonce($wpnonce, 'mec_options_form')) $this->response(array('success' => 0, 'code' => 'NONCE_IS_INVALID')); + + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->response(array('success' => 0, 'code' => 'ADMIN_ONLY')); + + // Get mec options + $mec = isset($_REQUEST['mec']) ? $this->sanitize_deep_array($_REQUEST['mec']) : []; + + if (isset($mec['reg_fields']) and !is_array($mec['reg_fields'])) $mec['reg_fields'] = []; + if (isset($mec['bfixed_fields']) and !is_array($mec['bfixed_fields'])) $mec['bfixed_fields'] = []; + if (isset($mec['event_fields']) and !is_array($mec['event_fields'])) $mec['event_fields'] = []; + + $filtered = []; + foreach ($mec as $key => $value) $filtered[$key] = (is_array($value) ? $value : array()); + + // Get current MEC options + $current = get_option('mec_options', array()); + if (is_string($current) and trim($current) == '') $current = []; + + // Validations + if (isset($filtered['settings']) and isset($filtered['settings']['slug'])) $filtered['settings']['slug'] = strtolower(str_replace(' ', '-', $filtered['settings']['slug'])); + if (isset($filtered['settings']) and isset($filtered['settings']['category_slug'])) $filtered['settings']['category_slug'] = strtolower(str_replace(' ', '-', $filtered['settings']['category_slug'])); + if (isset($filtered['settings']) and isset($filtered['settings']['custom_archive'])) $filtered['settings']['custom_archive'] = isset($filtered['settings']['custom_archive']) ? str_replace('\"', '"', $filtered['settings']['custom_archive']) : ''; + + // Bellow conditional block codes is used for sortable booking form items. + if (isset($filtered['reg_fields'])) { + if (!is_array($filtered['reg_fields'])) $filtered['reg_fields'] = []; + } + + if (isset($current['reg_fields']) and isset($filtered['reg_fields'])) { + $current['reg_fields'] = $filtered['reg_fields']; + } + + // Bellow conditional block codes is used for sortable booking fixed form items. + if (isset($filtered['bfixed_fields'])) { + if (!is_array($filtered['bfixed_fields'])) $filtered['bfixed_fields'] = []; + } + + if (isset($current['bfixed_fields']) and isset($filtered['bfixed_fields'])) { + $current['bfixed_fields'] = $filtered['bfixed_fields']; + } + + // Bellow conditional block codes is used for sortable event form items. + if (isset($filtered['event_fields'])) { + if (!is_array($filtered['event_fields'])) $filtered['event_fields'] = []; + } + + if (isset($current['event_fields']) and isset($filtered['event_fields'])) { + $current['event_fields'] = $filtered['event_fields']; + } + + // Tag Method Changed + $old_tag_method = ((isset($current['settings']) and isset($current['settings']['tag_method'])) ? $current['settings']['tag_method'] : 'post_tag'); + if (isset($filtered['settings']) and isset($filtered['settings']['tag_method']) and $filtered['settings']['tag_method'] != $old_tag_method) { + do_action('mec_tag_method_changed', $filtered['settings']['tag_method'], $old_tag_method); + } + + // Third Party Validation + $filtered = apply_filters('mec_validate_general_settings_options', $filtered, $current); + + // Generate New Options + $final = $current; + + // Merge new options with previous options + foreach ($filtered as $key => $value) { + if (is_array($value)) { + foreach ($value as $k => $v) { + // Define New Array + if (!isset($final[$key])) $final[$key] = []; + + // Overwrite Old Value + $final[$key][$k] = $v; + } + } + // Overwrite Old Value + else $final[$key] = $value; + } + + // Disable some options when MEC Cart is enabled + if (isset($final['settings']) and isset($final['settings']['mec_cart_status']) and $final['settings']['mec_cart_status']) { + $final['settings']['wc_status'] = 0; + $final['settings']['currency_per_event'] = 0; + } + + $final = apply_filters('mec_save_options_final', $final); + + // MEC Save Options + do_action('mec_save_options', $final); + + // Multilingual Options + if ($this->is_multilingual()) { + // Locale + $locale = isset($_REQUEST['mec_locale']) ? sanitize_text_field($_REQUEST['mec_locale']) : NULL; + if ($locale) { + $ml_current = get_option('mec_options_ml_' . $locale, array()); + if (is_string($ml_current) and trim($ml_current) == '') $ml_current = []; + + $ml_options = $ml_current; + foreach (array('single_date_format1' => 'settings', 'booking_date_format1' => 'settings') as $k2 => $k1) { + if (isset($filtered[$k1]) and isset($filtered[$k1][$k2])) $ml_options[$k2] = $filtered[$k1][$k2]; + elseif (!isset($ml_options[$k2]) and isset($final[$k1], $final[$k1][$k2])) $ml_options[$k2] = $final[$k1][$k2]; + } + + update_option('mec_options_ml_' . $locale, $ml_options); + } + } + + // Save final options + update_option('mec_options', $final); + + // MEC Saved Options + do_action('mec_saved_options', $final); + + // Refresh WordPress rewrite rules + $this->flush_rewrite_rules(); + + // Print the response + $this->response(array('success' => 1)); + } + + /** + * Saves MEC Notifications + * @author Webnus + */ + public function save_notifications() + { + $wpnonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field($_REQUEST['_wpnonce']) : NULL; + + // Check if our nonce is set. + if (!trim($wpnonce)) $this->response(array('success' => 0, 'code' => 'NONCE_MISSING')); + + // Verify that the nonce is valid. + if (!wp_verify_nonce($wpnonce, 'mec_options_form')) $this->response(array('success' => 0, 'code' => 'NONCE_IS_INVALID')); + + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->response(array('success' => 0, 'code' => 'ADMIN_ONLY')); + + // Locale + $locale = isset($_REQUEST['mec_locale']) ? sanitize_text_field($_REQUEST['mec_locale']) : NULL; + + // Get mec options + $mec = isset($_REQUEST['mec']) ? $this->sanitize_deep_array($_REQUEST['mec']) : []; + $notifications = $mec['notifications'] ?? []; + $settings = $mec['settings'] ?? []; + + $rendered = []; + foreach ($notifications as $notif_key => $notification) { + if (isset($notification['receiver_users']) and is_string($notification['receiver_users']) and trim($notification['receiver_users'])) { + $notification['receiver_users'] = array_map('trim', explode(',', $notification['receiver_users'])); + } + + $rendered[$notif_key] = $notification; + } + + // Get current MEC notifications + $current = $this->get_notifications($locale); + if (is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $final_notifications = []; + $final_notifications['notifications'] = array_merge($current, $rendered); + + $core_options = get_option('mec_options', array()); + if (isset($core_options['settings']) and is_array($core_options['settings'])) $final_notifications['settings'] = array_merge($core_options['settings'], $settings); + + // Get current MEC options + $options = get_option('mec_options', array()); + + if ($this->is_multilingual() and $locale and !is_array($options)) $options = get_option('mec_options_' . strtolower($locale), array()); + if (is_string($options) and trim($options) == '') $options = []; + + // Merge new options with previous options + $final = array_merge($options, $final_notifications); + + if ($this->is_multilingual() and $locale) { + // Save final options + update_option('mec_options_' . strtolower($locale), $final); + + $default_locale = $this->get_current_language(); + if ($default_locale === $locale) update_option('mec_options', $final); + } + + // Save final options + update_option('mec_options', $final); + + // Print the response + $this->response(array('success' => 1)); + } + + /** + * Saves MEC settings + * @author Webnus + * @return void + */ + public function save_messages() + { + // Security Nonce + $wpnonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field($_REQUEST['_wpnonce']) : NULL; + + // Check if our nonce is set. + if (!trim($wpnonce)) $this->response(array('success' => 0, 'code' => 'NONCE_MISSING')); + + // Verify that the nonce is valid. + if (!wp_verify_nonce($wpnonce, 'mec_options_form')) $this->response(array('success' => 0, 'code' => 'NONCE_IS_INVALID')); + + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->response(array('success' => 0, 'code' => 'ADMIN_ONLY')); + + // Locale + $locale = isset($_REQUEST['mec_locale']) ? sanitize_text_field($_REQUEST['mec_locale']) : NULL; + + // Get mec options + $mec = isset($_REQUEST['mec']) ? $this->sanitize_deep_array($_REQUEST['mec']) : []; + $messages = isset($mec['messages']) ? $mec['messages'] : []; + + // Get current MEC options + $current = $this->get_messages_options($locale); + if (is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $final_messages = []; + $final_messages['messages'] = array_merge($current, $messages); + + // Get current MEC options + $options = []; + + if ($this->is_multilingual() and $locale) $options = get_option('mec_options_' . strtolower($locale), array()); + if (!is_array($options) or (is_array($options) and !count($options))) $options = get_option('mec_options', array()); + if (is_string($options) and trim($options) == '') $options = []; + + // Merge new options with previous options + $final = array_merge($options, $final_messages); + + // Multilingual + if ($this->is_multilingual() and $locale) { + // Save final options + update_option('mec_options_' . strtolower($locale), $final); + + $default_locale = $this->get_current_language(); + if ($default_locale === $locale) update_option('mec_options', $final); + } else { + // Save final options + update_option('mec_options', $final); + } + + // Print the response + $this->response(array('success' => 1)); + } + + /** + * Saves MEC Import/Export options + * @author Webnus + * @param array $ix_options + * @return boolean + */ + public function save_ix_options($ix_options = array()) + { + // Current User is not Permitted + $capability = (current_user_can('administrator') ? 'manage_options' : 'mec_import_export'); + if (!current_user_can($capability)) $this->response(array('success' => 0, 'code' => 'ADMIN_ONLY')); + + // Get current MEC ix options + $current = $this->get_ix_options(); + if (is_string($current) and trim($current) == '') $current = []; + + // Merge new options with previous options + $final_ix = []; + $final_ix['ix'] = array_merge($current, $ix_options); + + // Get current MEC options + $options = get_option('mec_options', array()); + if (is_string($options) and trim($options) == '') $options = []; + + // Merge new options with previous options + $final = array_merge($options, $final_ix); + + // Save final options + update_option('mec_options', $final); + + return true; + } + + /** + * Get first day of week from WordPress + * @author Webnus + * @return int + */ + public function get_first_day_of_week() + { + return get_option('start_of_week', 1); + } + + /** + * @author Webnus + * @param array $response + * @return void + */ + public function response($response) + { + wp_send_json($response); + } + + /** + * Check if a date passed or not + * @author Webnus + * @param mixed $end + * @param mixed $now + * @return int + */ + public function is_past($end, $now) + { + return (int) $this->is_date_after($end, $now); + } + + /** + * Check if a date is after a certain point or not + * + * @param string|int $point + * @param string|int $date + * @param boolean $equal + * + * @return boolean + */ + public function is_date_after($point, $date, $equal = false) + { + if (!is_numeric($point)) $point = strtotime($point); + if (!is_numeric($date)) $date = strtotime($date); + + // Never End + if ($point <= 0) return false; + + return ($equal ? $date >= $point : $date > $point); + } + + /** + * @author Webnus + * @param int $id + * @return string + */ + public function get_weekday_name_by_day_id($id) + { + // These names will be used in PHP functions, so they mustn't translate + $days = array(1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 7 => 'Sunday'); + return $days[$id]; + } + + /** + * Spilts 2 dates to weeks + * @author Webnus + * @param DateTime|String $start + * @param DateTime|String $end + * @param int $first_day_of_week + * @return array + */ + public function split_to_weeks($start, $end, $first_day_of_week = NULL) + { + if (is_null($first_day_of_week)) $first_day_of_week = $this->get_first_day_of_week(); + + $end_day_of_week = ($first_day_of_week - 1 >= 0) ? $first_day_of_week - 1 : 6; + + $start_time = strtotime($start); + $end_time = strtotime($end); + + $start = new DateTime(date('Y-m-d', $start_time)); + $end = new DateTime(date('Y-m-d 23:59', $end_time)); + + $interval = new DateInterval('P1D'); + $dateRange = new DatePeriod($start, $interval, $end); + + $weekday = 0; + $weekNumber = 1; + $weeks = []; + foreach ($dateRange as $date) { + // Fix the PHP notice + if (!isset($weeks[$weekNumber])) $weeks[$weekNumber] = []; + + // It's first week and the week is not started from first weekday + if ($weekNumber == 1 and $weekday == 0 and $date->format('w') != $first_day_of_week) { + $remained_days = $date->format('w'); + + if ($first_day_of_week == 0) $remained_days = $date->format('w'); // Sunday + elseif ($first_day_of_week == 1) // Monday + { + if ($remained_days != 0) $remained_days = $remained_days - 1; + else $remained_days = 6; + } elseif ($first_day_of_week == 6) // Saturday + { + if ($remained_days != 6) $remained_days = $remained_days + 1; + else $remained_days = 0; + } elseif ($first_day_of_week == 5) // Friday + { + if ($remained_days < 4) $remained_days = $remained_days + 2; + elseif ($remained_days == 5) $remained_days = 0; + elseif ($remained_days == 6) $remained_days = 1; + } + + $interval = new DateInterval('P' . $remained_days . 'D'); + $interval->invert = 1; + $date->add($interval); + + for ($i = $remained_days; $i > 0; $i--) { + $weeks[$weekNumber][] = $date->format('Y-m-d'); + $date->add(new DateInterval('P1D')); + } + } + + $weeks[$weekNumber][] = $date->format('Y-m-d'); + $weekday++; + + if ($date->format('w') == $end_day_of_week) { + $weekNumber++; + $weekday = 0; + } + } + + // Month is finished but week is not finished + if ($weekday > 0 and $weekday < 7) { + $remained_days = (6 - $weekday); + for ($i = 0; $i <= $remained_days; $i++) { + $date->add(new DateInterval('P1D')); + $weeks[$weekNumber][] = $date->format('Y-m-d'); + + if ($date->format('w') == $end_day_of_week) $weekNumber++; + } + } + + return $weeks; + } + + /** + * Returns MEC Container Width + * @author Webnus + */ + public function get_container_width() + { + $settings = $this->get_settings(); + $container_width = (isset($settings['container_width']) and trim($settings['container_width']) != '') ? $settings['container_width'] : ''; + update_option('mec_container_width', $container_width); + } + + /** + * Returns MEC colors + * @author Webnus + * @return array + */ + public function get_available_colors() + { + $colors = get_option('mec_colors', $this->get_default_colors()); + return apply_filters('mec_available_colors', $colors); + } + + /** + * Returns MEC default colors + * @author Webnus + * @return array + */ + public function get_default_colors() + { + return apply_filters('mec_default_colors', array('fdd700', '00a0d2', 'e14d43', 'dd823b', 'a3b745')); + } + + /** + * Add a new color to MEC available colors + * @author Webnus + * @param string $color + */ + public function add_to_available_colors($color) + { + $colors = $this->get_available_colors(); + $colors[] = $color; + + $colors = array_unique($colors); + update_option('mec_colors', $colors); + } + + /** + * Returns available googlemap styles + * @author Webnus + * @return array + */ + public function get_googlemap_styles() + { + $styles = array( + array('key' => 'light-dream.json', 'name' => 'Light Dream'), + array('key' => 'intown-map.json', 'name' => 'inTown Map'), + array('key' => 'midnight.json', 'name' => 'Midnight'), + array('key' => 'pale-down.json', 'name' => 'Pale Down'), + array('key' => 'blue-essence.json', 'name' => 'Blue Essence'), + array('key' => 'blue-water.json', 'name' => 'Blue Water'), + array('key' => 'apple-maps-esque.json', 'name' => 'Apple Maps Esque'), + array('key' => 'CDO.json', 'name' => 'CDO'), + array('key' => 'shades-of-grey.json', 'name' => 'Shades of Grey'), + array('key' => 'subtle-grayscale.json', 'name' => 'Subtle Grayscale'), + array('key' => 'ultra-light.json', 'name' => 'Ultra Light'), + array('key' => 'facebook.json', 'name' => 'Facebook'), + ); + + return apply_filters('mec_googlemap_styles', $styles); + } + + /** + * Filters provided google map styles + * @author Webnus + * @param string $style + * @return string + */ + public function get_googlemap_style($style) + { + return apply_filters('mec_get_googlemap_style', $style); + } + + /** + * Fetchs googlemap styles from file + * @author Webnus + * @param string $style + * @return string + */ + public function fetch_googlemap_style($style) + { + $path = $this->get_plugin_path() . 'app' . DS . 'modules' . DS . 'googlemap' . DS . 'styles' . DS . $style; + + // MEC file library + $file = $this->getFile(); + + if ($file->exists($path)) return trim($file->read($path)); + else return ''; + } + + /** + * Get marker infowindow for showing on the map + * @author Webnus + * @param array $marker + * @return string + */ + public function get_marker_infowindow($marker) + { + $count = count($marker['event_ids']); + + $content = ' +
    +
    ' . esc_html($count) . '
    +
    + ' . ($count > 1 ? esc_html__('Events at this location', 'modern-events-calendar-lite') : esc_html__('Event at this location', 'modern-events-calendar-lite')) . ' + ' . (trim($marker['address']) ? $marker['address'] : $marker['name']) . ' +
    +
    '; + + return apply_filters('mec_get_marker_infowindow', $content); + } + + /** + * Get marker Lightbox for showing on the map + * @author Webnus + * @param object $event + * @param string $date_format + * @param string $skin_style + * @return string + */ + public function get_marker_lightbox($event, $date_format = 'M d Y', $skin_style = 'classic') + { + $ex_format = explode(' ', $date_format); + $format_1 = isset($ex_format[0]) ? $ex_format[0] : 'M'; + $format_2 = isset($ex_format[1]) ? $ex_format[1] : 'd'; + $format_3 = isset($ex_format[2]) ? $ex_format[2] : 'Y'; + + $link = $this->get_event_date_permalink($event, (isset($event->date['start']) ? $event->date['start']['date'] : NULL)); + $infowindow_thumb = trim($event->data->featured_image['thumbnail']) ? '
    ' . esc_attr($event->data->title) . '
    ' : ''; + $event_start_date_day = !empty($event->date['start']['date']) ? $this->date_i18n($format_1, strtotime($event->date['start']['date'])) : ''; + $event_start_date_month = !empty($event->date['start']['date']) ? $this->date_i18n($format_2, strtotime($event->date['start']['date'])) : ''; + $event_start_date_year = !empty($event->date['start']['date']) ? $this->date_i18n($format_3, strtotime($event->date['start']['date'])) : ''; + + $content = ' +
    +
    + +
    +
    '; + + return apply_filters('mec_get_marker_lightbox', $content, $event, $date_format, $skin_style); + } + + /** + * Returns available social networks + * @author Webnus + * @return array + */ + public function get_social_networks() + { + $social_networks = array( + 'facebook' => array('id' => 'facebook', 'name' => __('Facebook', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_facebook')), + 'twitter' => array('id' => 'twitter', 'name' => __('Twitter', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_twitter')), + 'linkedin' => array('id' => 'linkedin', 'name' => __('Linkedin', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_linkedin')), + 'vk' => array('id' => 'vk', 'name' => __('VK', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_vk')), + 'tumblr' => array('id' => 'tumblr', 'name' => __('Tumblr', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_tumblr')), + 'pinterest' => array('id' => 'pinterest', 'name' => __('Pinterest', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_pinterest')), + 'flipboard' => array('id' => 'flipboard', 'name' => __('Flipboard', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_flipboard')), + 'pocket' => array('id' => 'pocket', 'name' => __('GetPocket', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_pocket')), + 'reddit' => array('id' => 'reddit', 'name' => __('Reddit', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_reddit')), + 'whatsapp' => array('id' => 'whatsapp', 'name' => __('WhatsApp', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_whatsapp')), + 'telegram' => array('id' => 'telegram', 'name' => __('Telegram', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_telegram')), + 'email' => array('id' => 'email', 'name' => __('Email', 'modern-events-calendar-lite'), 'function' => array($this, 'sn_email')), + ); + + return apply_filters('mec_social_networks', $social_networks); + } + + /** + * Do facebook link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_facebook($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do twitter link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_twitter($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do linkedin link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_linkedin($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do email link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_email($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + $event->data->title = str_replace('–', '-', $event->data->title); + $event->data->title = str_replace('”', '’’', $event->data->title); + $event->data->title = str_replace('’', "’", $event->data->title); + $event->data->title = str_replace('&', '%26', $event->data->title); + $event->data->title = str_replace('#038;', '', $event->data->title); + + return '
  • '; + } + + /** + * Do VK link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_vk($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + + /** + * Do tumblr link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_tumblr($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + return '
  • '; + } + + /** + * Do pinterest link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_pinterest($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do flipboard link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_flipboard($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • + + +
  • '; + } + + /** + * Do pocket link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_pocket($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do reddit link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_reddit($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Do telegram link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_telegram($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • + + +
  • '; + } + + /** + * Do whatsapp link for social networks + * @author Webnus + * @param string $url + * @param object $event + * @param array $social + * @return string + */ + public function sn_whatsapp($url, $event, $social = array()) + { + $occurrence = (isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''); + if (trim($occurrence) != '') $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return '
  • '; + } + + /** + * Get available skins for archive page + * @author Webnus + * @return array + */ + public function get_archive_skins() + { + if (!$this->getPRO()) { + $archive_skins = array( + array('skin' => 'full_calendar', 'name' => __('Full Calendar', 'modern-events-calendar-lite')), + array('skin' => 'monthly_view', 'name' => __('Calendar/Monthly View', 'modern-events-calendar-lite')), + array('skin' => 'weekly_view', 'name' => __('Weekly View', 'modern-events-calendar-lite')), + array('skin' => 'daily_view', 'name' => __('Daily View', 'modern-events-calendar-lite')), + array('skin' => 'list', 'name' => __('List View', 'modern-events-calendar-lite')), + array('skin' => 'grid', 'name' => __('Grid View', 'modern-events-calendar-lite')), + array('skin' => 'general_calendar', 'name' => __('General Calendar', 'modern-events-calendar-lite')), + array('skin' => 'custom', 'name' => __('Custom Shortcode', 'modern-events-calendar-lite')), + ); + } else { + $archive_skins = array( + array('skin' => 'full_calendar', 'name' => __('Full Calendar', 'modern-events-calendar-lite')), + array('skin' => 'yearly_view', 'name' => __('Yearly View', 'modern-events-calendar-lite')), + array('skin' => 'monthly_view', 'name' => __('Calendar/Monthly View', 'modern-events-calendar-lite')), + array('skin' => 'weekly_view', 'name' => __('Weekly View', 'modern-events-calendar-lite')), + array('skin' => 'daily_view', 'name' => __('Daily View', 'modern-events-calendar-lite')), + array('skin' => 'timetable', 'name' => __('Timetable View', 'modern-events-calendar-lite')), + array('skin' => 'masonry', 'name' => __('Masonry View', 'modern-events-calendar-lite')), + array('skin' => 'list', 'name' => __('List View', 'modern-events-calendar-lite')), + array('skin' => 'grid', 'name' => __('Grid View', 'modern-events-calendar-lite')), + array('skin' => 'agenda', 'name' => __('Agenda View', 'modern-events-calendar-lite')), + array('skin' => 'map', 'name' => __('Map View', 'modern-events-calendar-lite')), + array('skin' => 'general_calendar', 'name' => __('General Calendar', 'modern-events-calendar-lite')), + array('skin' => 'custom', 'name' => __('Custom Shortcode', 'modern-events-calendar-lite')), + ); + } + + return apply_filters('mec_archive_skins', $archive_skins); + } + + /** + * Get available skins for archive page + * @author Webnus + * @return array + */ + public function get_category_skins() + { + if (!$this->getPRO()) { + $category_skins = array( + array('skin' => 'full_calendar', 'name' => __('Full Calendar', 'modern-events-calendar-lite')), + array('skin' => 'monthly_view', 'name' => __('Calendar/Monthly View', 'modern-events-calendar-lite')), + array('skin' => 'weekly_view', 'name' => __('Weekly View', 'modern-events-calendar-lite')), + array('skin' => 'daily_view', 'name' => __('Daily View', 'modern-events-calendar-lite')), + array('skin' => 'list', 'name' => __('List View', 'modern-events-calendar-lite')), + array('skin' => 'grid', 'name' => __('Grid View', 'modern-events-calendar-lite')), + array('skin' => 'general_calendar', 'name' => __('General Calendar', 'modern-events-calendar-lite')), + array('skin' => 'custom', 'name' => __('Custom Shortcode', 'modern-events-calendar-lite')), + ); + } else { + $category_skins = array( + array('skin' => 'full_calendar', 'name' => __('Full Calendar', 'modern-events-calendar-lite')), + array('skin' => 'yearly_view', 'name' => __('Yearly View', 'modern-events-calendar-lite')), + array('skin' => 'monthly_view', 'name' => __('Calendar/Monthly View', 'modern-events-calendar-lite')), + array('skin' => 'weekly_view', 'name' => __('Weekly View', 'modern-events-calendar-lite')), + array('skin' => 'daily_view', 'name' => __('Daily View', 'modern-events-calendar-lite')), + array('skin' => 'timetable', 'name' => __('Timetable View', 'modern-events-calendar-lite')), + array('skin' => 'masonry', 'name' => __('Masonry View', 'modern-events-calendar-lite')), + array('skin' => 'list', 'name' => __('List View', 'modern-events-calendar-lite')), + array('skin' => 'grid', 'name' => __('Grid View', 'modern-events-calendar-lite')), + array('skin' => 'agenda', 'name' => __('Agenda View', 'modern-events-calendar-lite')), + array('skin' => 'map', 'name' => __('Map View', 'modern-events-calendar-lite')), + array('skin' => 'general_calendar', 'name' => __('General Calendar', 'modern-events-calendar-lite')), + array('skin' => 'custom', 'name' => __('Custom Shortcode', 'modern-events-calendar-lite')), + ); + } + + return apply_filters('mec_category_skins', $category_skins); + } + + /** + * Get events posts + * @author Webnus + * @param int $limit + * @param array $status + * @return WP_Post[] + */ + public function get_events($limit = -1, $status = ['publish']) + { + return get_posts([ + 'post_type' => $this->get_main_post_type(), + 'numberposts' => $limit, + 'post_status' => $status + ]); + } + + /** + * Get id of ongoing events + * @param int $now + * @param null $status + * @return array + * @author Webnus + */ + public function get_ongoing_event_ids($now = NULL, $status = NULL) + { + // Database Object + $db = $this->getDB(); + + $status_query = ''; + if ($status) $status_query .= " AND `status`='" . esc_sql($status) . "'"; + + $ids = $db->select("SELECT `post_id` FROM `#__mec_dates` WHERE `tstart` <= " . $now . " AND `tend` > " . $now . $status_query, 'loadColumn'); + return array_unique($ids); + } + + /** + * Get id of upcoming events + * @param int $now + * @param null $status + * @return array + * @author Webnus + */ + public function get_upcoming_event_ids($now = NULL, $status = NULL) + { + // Database Object + $db = $this->getDB(); + + // Current Timestamp + $start = (($now and is_numeric($now)) ? $now : current_time('timestamp')); + + $status_query = ''; + if ($status) $status_query .= " AND `status`='" . esc_sql($status) . "'"; + + $ids = $db->select("SELECT `post_id` FROM `#__mec_dates` WHERE `tstart` >= " . $start . $status_query, 'loadColumn'); + return array_unique($ids); + } + + /** + * Get id of expired events + * @param int $now + * @param null $status + * @return array + * @author Webnus + */ + public function get_expired_event_ids($now = NULL, $status = NULL) + { + // Database Object + $db = $this->getDB(); + + // Current Timestamp + $end = (($now and is_numeric($now)) ? $now : current_time('timestamp', 0)); + + $status_query = ''; + if ($status) $status_query .= " AND `status`='" . esc_sql($status) . "'"; + + $ids = $db->select("SELECT `post_id` FROM `#__mec_dates` WHERE `tend` <= " . $end . $status_query, 'loadColumn'); + return array_unique($ids); + } + + /** + * Get id of all events + * @param null $status + * @return array + * @author Webnus + */ + public function get_all_event_ids($status = NULL) + { + // Database Object + $db = $this->getDB(); + + $status_query = ''; + if ($status) $status_query .= " AND `status`='" . esc_sql($status) . "'"; + + $ids = $db->select("SELECT `post_id` FROM `#__mec_dates` WHERE 1" . $status_query, 'loadColumn'); + return array_unique($ids); + } + + /** + * Get id of events by period + * @author Webnus + * @param string|int $start + * @param string|int $end + * @return array + */ + public function get_event_ids_by_period($start, $end) + { + if (!is_numeric($start)) $start = strtotime($start); + if (!is_numeric($end)) $end = strtotime($end); + + // Database Object + $db = $this->getDB(); + + return $db->select("SELECT `post_id` FROM `#__mec_dates` WHERE (`tstart` <= " . $start . " AND `tend` >= " . $end . ") OR (`tstart` > " . $start . " AND `tend` < " . $end . ") OR (`tstart` > " . $start . " AND `tstart` < " . $end . " AND `tend` >= " . $end . ") OR (`tstart` <= " . $start . " AND `tend` > " . $start . " AND `tend` < " . $end . ")", 'loadColumn'); + } + + public function get_filtered_events($locations = [], $categories = [], $organizers = []) + { + // Taxonomy Query + $tax_query = []; + + // Filter by Location + if (count($locations)) { + $tax_query[] = [ + 'taxonomy' => 'mec_location', + 'field' => 'term_id', + 'terms' => $locations, + 'operator' => 'IN', + ]; + } + + // Filter by Categories + if (count($categories)) { + $tax_query[] = [ + 'taxonomy' => 'mec_category', + 'field' => 'term_id', + 'terms' => $categories, + 'operator' => 'IN', + ]; + } + + // Filter by Organizers + if (count($organizers)) { + $tax_query[] = [ + 'taxonomy' => 'mec_organizer', + 'field' => 'term_id', + 'terms' => $organizers, + 'operator' => 'IN', + ]; + } + + // Filter Events + return get_posts([ + 'post_type' => $this->get_main_post_type(), + 'numberposts' => -1, + 'post_status' => ['publish'], + 'tax_query' => $tax_query + ]); + } + + /** + * Get method of showing for multiple days events + * @author Webnus + * @return string + */ + public function get_multiple_days_method() + { + $settings = $this->get_settings(); + + $method = isset($settings['multiple_day_show_method']) ? $settings['multiple_day_show_method'] : 'first_day_listgrid'; + return apply_filters('mec_multiple_days_method', $method); + } + + /** + * Get method of showing/hiding events based on event time + * @author Webnus + * @return string + */ + public function get_hide_time_method() + { + $settings = $this->get_settings(); + + $method = isset($settings['hide_time_method']) ? $settings['hide_time_method'] : 'start'; + return apply_filters('mec_hide_time_method', $method); + } + + /** + * Get hour format of MEC + * @author Webnus + * @return int|string + */ + public function get_hour_format() + { + $settings = $this->get_settings(); + + $format = isset($settings['time_format']) ? $settings['time_format'] : 12; + return apply_filters('mec_hour_format', $format); + } + + /** + * Get formatted hour based on configurations + * @author Webnus + * @param int $hour + * @param int $minutes + * @param string $ampm + * @return string + */ + public function get_formatted_hour($hour, $minutes, $ampm) + { + // Hour Format of MEC (12/24) + $hour_format = $this->get_hour_format(); + + $formatted = ''; + if ($hour_format == '12') { + $formatted = sprintf("%02d", $hour) . ':' . sprintf("%02d", $minutes) . ' ' . esc_html__($ampm, 'modern-events-calendar-lite'); + } elseif ($hour_format == '24') { + if (strtoupper($ampm) == 'PM' and $hour != 12) $hour += 12; + if (strtoupper($ampm) == 'AM' and $hour == 12) $hour += 12; + + $formatted = sprintf("%02d", $hour) . ':' . sprintf("%02d", $minutes); + } + + return $formatted; + } + + /** + * Get formatted time based on WordPress Time Format + * @author Webnus + * @param int $seconds + * @return string + */ + public function get_time($seconds) + { + $format = get_option('time_format'); + if (trim($format) === '') $format = 'H:i'; + + return gmdate($format, $seconds); + } + + /** + * Renders a module such as links or googlemap + * @author Webnus + * @param string $module + * @param array $params + * @return string + */ + public function module($module, $params = array()) + { + // Get module path + $path = MEC::import('app.modules.' . $module, true, true); + + // MEC libraries + $render = $this->getRender(); + $factory = $this->getFactory(); + + // Extract Module Params + extract($params); + + ob_start(); + include $path; + return $output = ob_get_clean(); + } + + /** + * Returns MEC currencies + * @author Webnus + * @return array + */ + public function get_currencies() + { + $currencies = array( + '$' => 'USD', + '€' => 'EUR', + '£' => 'GBP', + 'CHF' => 'CHF', + 'CAD' => 'CAD', + 'AUD' => 'AUD', + 'JPY' => 'JPY', + 'SEK' => 'SEK', + 'GEL' => 'GEL', + 'AFN' => 'AFN', + 'ALL' => 'ALL', + 'DZD' => 'DZD', + 'AOA' => 'AOA', + 'ARS' => 'ARS', + 'AMD' => 'AMD', + 'AWG' => 'AWG', + 'AZN' => 'AZN', + 'BSD' => 'BSD', + 'BHD' => 'BHD', + 'BBD' => 'BBD', + 'BYR' => 'BYR', + 'BZD' => 'BZD', + 'BMD' => 'BMD', + 'BTN' => 'BTN', + 'BOB' => 'BOB', + 'BAM' => 'BAM', + 'BWP' => 'BWP', + 'BRL' => 'BRL', + 'BND' => 'BND', + 'BGN' => 'BGN', + 'BIF' => 'BIF', + 'KHR' => 'KHR', + 'CVE' => 'CVE', + 'KYD' => 'KYD', + 'XAF' => 'XAF', + 'CLP' => 'CLP', + 'COP' => 'COP', + 'KMF' => 'KMF', + 'CDF' => 'CDF', + 'NZD' => 'NZD', + 'CRC' => 'CRC', + 'HRK' => 'HRK', + 'CUC' => 'CUC', + 'CUP' => 'CUP', + 'CZK' => 'CZK', + 'DKK' => 'DKK', + 'DJF' => 'DJF', + 'DOP' => 'DOP', + 'XCD' => 'XCD', + 'EGP' => 'EGP', + 'ERN' => 'ERN', + 'EEK' => 'EEK', + 'ETB' => 'ETB', + 'FKP' => 'FKP', + 'FJD' => 'FJD', + 'GMD' => 'GMD', + 'GHS' => 'GHS', + 'GIP' => 'GIP', + 'GTQ' => 'GTQ', + 'GNF' => 'GNF', + 'GYD' => 'GYD', + 'HTG' => 'HTG', + 'HNL' => 'HNL', + 'HKD' => 'HKD', + 'HUF' => 'HUF', + 'ISK' => 'ISK', + 'INR' => 'INR', + 'IDR' => 'IDR', + 'IRR' => 'IRR', + 'IQD' => 'IQD', + 'ILS' => 'ILS', + 'NIS' => 'NIS', + 'JMD' => 'JMD', + 'JOD' => 'JOD', + 'KZT' => 'KZT', + 'KES' => 'KES', + 'KWD' => 'KWD', + 'KGS' => 'KGS', + 'LAK' => 'LAK', + 'LVL' => 'LVL', + 'LBP' => 'LBP', + 'LSL' => 'LSL', + 'LRD' => 'LRD', + 'LYD' => 'LYD', + 'LTL' => 'LTL', + 'MOP' => 'MOP', + 'MKD' => 'MKD', + 'MGA' => 'MGA', + 'MWK' => 'MWK', + 'MYR' => 'MYR', + 'MVR' => 'MVR', + 'MRO' => 'MRO', + 'MUR' => 'MUR', + 'MXN' => 'MXN', + 'MDL' => 'MDL', + 'MNT' => 'MNT', + 'MAD' => 'MAD', + 'MZN' => 'MZN', + 'MMK' => 'MMK', + 'NAD' => 'NAD', + 'NPR' => 'NPR', + 'ANG' => 'ANG', + 'TWD' => 'TWD', + 'NIO' => 'NIO', + 'NGN' => 'NGN', + 'KPW' => 'KPW', + 'NOK' => 'NOK', + 'OMR' => 'OMR', + 'PKR' => 'PKR', + 'PAB' => 'PAB', + 'PGK' => 'PGK', + 'PYG' => 'PYG', + 'PEN' => 'PEN', + 'PHP' => 'PHP', + 'PLN' => 'PLN', + 'QAR' => 'QAR', + 'CNY' => 'CNY', + 'RON' => 'RON', + 'RUB' => 'RUB', + 'RWF' => 'RWF', + 'SHP' => 'SHP', + 'SVC' => 'SVC', + 'WST' => 'WST', + 'SAR' => 'SAR', + 'RSD' => 'RSD', + 'SCR' => 'SCR', + 'SLL' => 'SLL', + 'SGD' => 'SGD', + 'SBD' => 'SBD', + 'SOS' => 'SOS', + 'ZAR' => 'ZAR', + 'KRW' => 'KRW', + 'LKR' => 'LKR', + 'SDG' => 'SDG', + 'SRD' => 'SRD', + 'SZL' => 'SZL', + 'SYP' => 'SYP', + 'STD' => 'STD', + 'TJS' => 'TJS', + 'TZS' => 'TZS', + 'THB' => 'THB', + 'TOP' => 'TOP', + 'PRB' => 'PRB', + 'TTD' => 'TTD', + 'TND' => 'TND', + 'TRY' => 'TRY', + 'TMT' => 'TMT', + 'TVD' => 'TVD', + 'UGX' => 'UGX', + 'UAH' => 'UAH', + 'AED' => 'AED', + 'UYU' => 'UYU', + 'UZS' => 'UZS', + 'VUV' => 'VUV', + 'VEF' => 'VEF', + 'VND' => 'VND', + 'XOF' => 'XOF', + 'YER' => 'YER', + 'ZMK' => 'ZMK', + 'ZWL' => 'ZWL', + 'BDT' => 'BDT', + ); + + return apply_filters('mec_currencies', $currencies); + } + + /** + * Returns MEC version + * @author Webnus + * @return string + */ + public function get_version() + { + $version = MEC_VERSION; + + if (defined('WP_DEBUG') and WP_DEBUG) $version .= '.' . time(); + return $version; + } + + /** + * Set endpoint vars to true + * @author Webnus + * @param array $vars + * @return array + */ + public function filter_request($vars) + { + if (isset($vars['gateway-cancel'])) $vars['gateway-cancel'] = true; + if (isset($vars['gateway-return'])) $vars['gateway-return'] = true; + if (isset($vars['gateway-notify'])) $vars['gateway-notify'] = true; + + return $vars; + } + + /** + * Do the jobs after endpoints and show related output + * @author Webnus + * @return boolean + */ + public function do_endpoints() + { + if (get_query_var('verify')) { + $key = sanitize_text_field(get_query_var('verify')); + + $db = $this->getDB(); + $book_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_verification_key' AND `meta_value`='$key'", 'loadResult'); + + if (!$book_id) return false; + + $status = get_post_meta($book_id, 'mec_verified', true); + if ($status == '1') { + $status_user = get_post_meta($book_id, 'mec_verified_user', true); + if (trim($status_user) == '') $status_user = 0; + + if (!$status_user) { + // User Status + update_post_meta($book_id, 'mec_verified_user', 1); + + echo '

    ' . esc_html__('Your booking has been verified successfully!', 'modern-events-calendar-lite') . '

    '; + return false; + } else { + echo '

    ' . esc_html__('Your booking already verified!', 'modern-events-calendar-lite') . '

    '; + return false; + } + } + + $book = $this->getBook(); + if ($book->verify($book_id)) { + // Confirm Booking After Verification + $confirmation_status = get_post_meta($book_id, 'mec_confirmed', true); + if (!$confirmation_status) { + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $price = get_post_meta($book_id, 'mec_price', true); + + list($auto_confirm_free, $auto_confirm_paid) = $book->get_auto_confirmation_status($event_id, $book_id); + + // Auto confirmation for free bookings is enabled + if ($price <= 0 and $auto_confirm_free) { + $book->confirm($book_id, 'auto'); + } + + // Auto confirmation for paid bookings is enabled + if ($price > 0 and $auto_confirm_paid) { + $book->confirm($book_id, 'auto'); + } + } + + echo '

    ' . esc_html__('Your booking has been verified successfully!', 'modern-events-calendar-lite') . '

    '; + } else echo '

    ' . esc_html__('Your booking cannot verify!', 'modern-events-calendar-lite') . '

    '; + } elseif (get_query_var('cancel')) { + $key = sanitize_text_field(get_query_var('cancel')); + $sure = isset($_GET['mec-sure']) ? (int) $_GET['mec-sure'] : 0; + + $db = $this->getDB(); + $book_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_cancellation_key' AND `meta_value`='$key'", 'loadResult'); + + if (!$book_id) return false; + + $status = get_post_meta($book_id, 'mec_verified', true); + if ($status == '-1') { + $status_user = get_post_meta($book_id, 'mec_canceled_user', true); + if (trim($status_user) == '') $status_user = 0; + + if (!$status_user) { + // User Status + update_post_meta($book_id, 'mec_canceled_user', 1); + + echo '

    ' . esc_html__('Your booking successfully canceled.', 'modern-events-calendar-lite') . '

    '; + } else { + echo '

    ' . esc_html__('Your booking already canceled!', 'modern-events-calendar-lite') . '

    '; + } + + return false; + } + + $timestamps = explode(':', get_post_meta($book_id, 'mec_date', true)); + $start = $timestamps[0]; + $end = $timestamps[1]; + + $right_now = current_time('timestamp', 0); + if ($right_now >= $end) { + echo '

    ' . esc_html__('The event is already finished!', 'modern-events-calendar-lite') . '

    '; + return false; + } + + // MEC Settings + $settings = $this->get_settings(); + + $cancellation_period_from = $settings['cancellation_period_from'] ?? 0; + $cancellation_period_to = $settings['cancellation_period_time'] ?? 0; + $cancellation_period_p = $settings['cancellation_period_p'] ?? 'hour'; + $cancellation_period_type = $settings['cancellation_period_type'] ?? 'before'; + + if ($cancellation_period_from or $cancellation_period_to) { + if ($cancellation_period_from) { + if ($cancellation_period_type == 'before') $min_time = ($start - ($cancellation_period_from * ($cancellation_period_p == 'hour' ? 3600 : 86400))); + else $min_time = ($start + ($cancellation_period_from * ($cancellation_period_p == 'hour' ? 3600 : 86400))); + + if ($right_now < $min_time) { + echo '

    ' . esc_html__("The cancelation window is not started yet.", 'modern-events-calendar-lite') . '

    '; + return false; + } + } + + if ($cancellation_period_to) { + if ($cancellation_period_type == 'before') $max_time = ($start - ($cancellation_period_to * ($cancellation_period_p == 'hour' ? 3600 : 86400))); + else $max_time = ($start + ($cancellation_period_to * ($cancellation_period_p == 'hour' ? 3600 : 86400))); + + if ($right_now > $max_time) { + echo '

    ' . esc_html__("The cancelation window is passed.", 'modern-events-calendar-lite') . '

    '; + return false; + } + } + } + + if (!$sure) { + echo '

    ' . esc_html__("Are you sure that you want to cancel the booking?", 'modern-events-calendar-lite') . ' ' . esc_html__('Yes, please cancel it.', 'modern-events-calendar-lite') . '

    '; + return false; + } + + $book = $this->getBook(); + if ($book->cancel($book_id)) { + echo '

    ' . esc_html__('Your booking successfully canceled.', 'modern-events-calendar-lite') . '

    '; + + $cancel_page = (isset($settings['booking_cancel_page']) and trim($settings['booking_cancel_page'])) ? $settings['booking_cancel_page'] : NULL; + $cancel_page_url = get_permalink($cancel_page); + $cancel_page_time = (isset($settings['booking_cancel_page_time']) and trim($settings['booking_cancel_page_time']) != '') ? $settings['booking_cancel_page_time'] : 2500; + + if ($cancel_page and $cancel_page_url) echo ''; + } else echo '

    ' . esc_html__('Your booking cannot be canceled.', 'modern-events-calendar-lite') . '

    '; + } elseif (get_query_var('gateway-cancel')) { + echo '

    ' . esc_html__('You canceled the payment successfully.', 'modern-events-calendar-lite') . '

    '; + } elseif (get_query_var('gateway-return')) { + echo '

    ' . esc_html__('You returned from payment gateway successfully.', 'modern-events-calendar-lite') . '

    '; + } + + // Trigget Actions + do_action('mec_gateway_do_endpoints', $this); + } + + public function booking_invoice() + { + // Booking Invoice + if (isset($_GET['method']) and sanitize_text_field($_GET['method']) == 'mec-invoice') { + $settings = $this->get_settings(); + if (isset($settings['booking_invoice']) and !$settings['booking_invoice']) wp_die(__('Cannot find the invoice!', 'modern-events-calendar-lite'), esc_html__('Invoice is invalid.', 'modern-events-calendar-lite')); + + $ml_settings = $this->get_ml_settings(); + + $transaction_id = sanitize_text_field($_GET['id']); + + // Libraries + $book = $this->getBook(); + $render = $this->getRender(); + $db = $this->getDB(); + + $transaction = $book->get_transaction($transaction_id); + $event_id = $transaction['event_id'] ?? 0; + $requested_event_id = $transaction['translated_event_id'] ?? $event_id; + + // Don't Show PDF If Booking is Pending + $book_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='" . $transaction_id . "' AND `meta_key`='mec_transaction_id'", 'loadResult'); + $mec_confirmed = get_post_meta($book_id, 'mec_confirmed', true); + + if (!$mec_confirmed and (!current_user_can('administrator') and !current_user_can('editor'))) wp_die(__('Your booking still is not confirmed. You can download it after confirmation!', 'modern-events-calendar-lite'), esc_html__('Booking Not Confirmed.', 'modern-events-calendar-lite')); + if (!$event_id) wp_die(__('Cannot find the booking!', 'modern-events-calendar-lite'), esc_html__('Booking is invalid.', 'modern-events-calendar-lite')); + + // Invoice Key + $invoice_key = $transaction['invoice_key'] ?? NULL; + if ($invoice_key and (!isset($_GET['mec-key']) or sanitize_text_field($_GET['mec-key']) != $invoice_key)) wp_die(__("You don't have access to view this invoice!", 'modern-events-calendar-lite'), esc_html__('Key is invalid.', 'modern-events-calendar-lite')); + + $event = $render->data($event_id); + + $bfixed_fields = $this->get_bfixed_fields($event_id); + $reg_fields = $this->get_reg_fields($event_id); + + $location_id = $this->get_master_location_id($event); + $location = isset($event->locations[$location_id]) ? (trim($event->locations[$location_id]['address']) ? $event->locations[$location_id]['address'] : $event->locations[$location_id]['name']) : ''; + + $dates = isset($transaction['date']) ? explode(':', $transaction['date']) : array(time(), time()); + + // Multiple Dates + $all_dates = ((isset($transaction['all_dates']) and is_array($transaction['all_dates'])) ? $transaction['all_dates'] : array()); + + // Get Booking Post + $booking = $book->get_bookings_by_transaction_id($transaction_id); + + $booking_time = isset($booking[0]) ? get_post_meta($booking[0]->ID, 'mec_booking_time', true) : NULL; + if (!$booking_time and is_numeric($dates[0])) $booking_time = date('Y-m-d', $dates[0]); + + $booking_time = date('Y-m-d', strtotime($booking_time)); + + // Coupon Code + $coupon_code = isset($booking[0]) ? get_post_meta($booking[0]->ID, 'mec_coupon_code', true) : ''; + + // Include the tFPDF Class + if (!class_exists('tFPDF')) require_once MEC_ABSPATH . 'app' . DS . 'api' . DS . 'TFPDF' . DS . 'tfpdf.php'; + + $pdf = new tFPDF(); + $pdf->AddPage(); + + // Add a Unicode font (uses UTF-8) + $pdf->AddFont('DejaVu', '', 'DejaVuSansCondensed.ttf', true); + $pdf->AddFont('DejaVuBold', '', 'DejaVuSansCondensed-Bold.ttf', true); + + $pdf->SetTitle(sprintf(esc_html__('%s Invoice', 'modern-events-calendar-lite'), $transaction_id)); + $pdf->SetAuthor(get_bloginfo('name'), true); + + // Event Information + $pdf->SetFont('DejaVuBold', '', 18); + $pdf->Write(25, html_entity_decode(get_the_title($event->ID))); + $pdf->Ln(); + + if (trim($location)) { + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(6, esc_html__('Location', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, $location); + $pdf->Ln(); + } + + $date_format = (isset($ml_settings['booking_date_format1']) and trim($ml_settings['booking_date_format1'])) ? $ml_settings['booking_date_format1'] : 'Y-m-d'; + $time_format = get_option('time_format'); + + if (is_numeric($dates[0]) and is_numeric($dates[1])) { + $start_datetime = date($date_format . ' ' . $time_format, $dates[0]); + $end_datetime = date($date_format . ' ' . $time_format, $dates[1]); + } else { + $start_datetime = $dates[0] . ' ' . $event->data->time['start']; + $end_datetime = $dates[1] . ' ' . $event->data->time['end']; + } + + $booking_options = $event->meta['mec_booking'] ?? []; + $bookings_all_occurrences = $booking_options['bookings_all_occurrences'] ?? 0; + + if (count($all_dates)) { + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(6, esc_html__('Date and Times', 'modern-events-calendar-lite')); + $pdf->Ln(); + $pdf->SetFont('DejaVu', '', 12); + + foreach ($all_dates as $one_date) { + $other_timestamps = explode(':', $one_date); + if (isset($other_timestamps[0]) and isset($other_timestamps[1])) { + $pdf->Write(6, sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->date_i18n($date_format . ' ' . $time_format, $other_timestamps[0]), $this->date_i18n($date_format . ' ' . $time_format, $other_timestamps[1]))); + $pdf->Ln(); + } + } + + $pdf->Ln(); + } elseif (!$bookings_all_occurrences) { + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(6, esc_html__('Date and Time', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, trim($start_datetime) . ' - ' . (($start_datetime != $end_datetime) ? $end_datetime . ' ' : ''), '- '); + $pdf->Ln(); + } + + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(6, esc_html__('Transaction ID', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, $transaction_id); + $pdf->Ln(); + + if (is_array($bfixed_fields) and count($bfixed_fields) and isset($transaction['fields']) and is_array($transaction['fields']) and count($transaction['fields'])) { + $pdf->SetFont('DejaVuBold', '', 16); + $pdf->Write(20, sprintf(esc_html__('%s Fields', 'modern-events-calendar-lite'), $this->m('booking', esc_html__('Booking', 'modern-events-calendar-lite')))); + $pdf->Ln(); + + foreach ($bfixed_fields as $bfixed_field_id => $bfixed_field) { + if (!is_numeric($bfixed_field_id)) continue; + + $bfixed_value = $transaction['fields'][$bfixed_field_id] ?? NULL; + if (!$bfixed_value) continue; + + $bfixed_type = $bfixed_field['type'] ?? NULL; + $bfixed_label = $bfixed_field['label'] ?? ''; + + if ($bfixed_type != 'agreement') { + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, $bfixed_label . ": " . (is_array($bfixed_value) ? stripslashes(implode(',', $bfixed_value)) : stripslashes($bfixed_value))); + $pdf->Ln(); + } + } + } + + // Attendees + if (isset($transaction['tickets']) and is_array($transaction['tickets']) and count($transaction['tickets'])) { + $pdf->SetFont('DejaVuBold', '', 16); + $pdf->Write(20, esc_html__('Attendees', 'modern-events-calendar-lite')); + $pdf->Ln(); + + $i = 1; + foreach ($transaction['tickets'] as $attendee) { + if (!isset($attendee['id'])) continue; + + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(6, stripslashes($attendee['name'])); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 10); + $pdf->Write(6, $attendee['email']); + $pdf->Ln(); + + $pdf->Write(6, ((isset($event->tickets[$attendee['id']]) ? esc_html__($this->m('ticket', esc_html__('Ticket', 'modern-events-calendar-lite'))) . ': ' . esc_html($event->tickets[$attendee['id']]['name']) : '') . ' ' . (isset($event->tickets[$attendee['id']]) ? $book->get_ticket_price_label($event->tickets[$attendee['id']], $booking_time, $event_id, $dates[0]) : ''))); + + // Registration Fields + $reg_form = (isset($attendee['reg']) and is_array($attendee['reg'])) ? $attendee['reg'] : []; + $reg_fields = apply_filters('mec_bookign_reg_form', $reg_fields, $event_id, get_post($event_id)); + + if (isset($reg_form) and count($reg_form)) { + foreach ($reg_form as $field_id => $value) { + $label = isset($reg_fields[$field_id]) ? $reg_fields[$field_id]['label'] : ''; + $type = isset($reg_fields[$field_id]) ? $reg_fields[$field_id]['type'] : ''; + + $pdf->Ln(); + + if ($type == 'agreement') { + $pdf->Write(5, sprintf(esc_html__($label, 'modern-events-calendar-lite'), get_the_title($reg_fields[$field_id]['page'])) . ": " . ($value == '1' ? esc_html__('Yes', 'modern-events-calendar-lite') : esc_html__('No', 'modern-events-calendar-lite'))); + } else { + $pdf->Write(5, $label . ": " . (is_string($value) ? stripslashes($value) : (is_array($value) ? stripslashes(implode(', ', $value)) : '---'))); + } + } + } + + // Ticket Variations + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) { + $ticket_variations = $this->ticket_variations($event_id, $attendee['id']); + + foreach ($attendee['variations'] as $variation_id => $variation_count) { + if (!$variation_count || $variation_count < 0) continue; + + $variation_title = (isset($ticket_variations[$variation_id]) and isset($ticket_variations[$variation_id]['title'])) ? $ticket_variations[$variation_id]['title'] : ''; + if (!trim($variation_title)) continue; + + $pdf->Ln(); + $pdf->Write(6, '+ ' . $variation_title . ' (' . $variation_count . ')'); + } + } + + if ($i != count($transaction['tickets'])) $pdf->Ln(12); + else $pdf->Ln(); + + $i++; + } + } + + // Billing Information + if (isset($transaction['price_details']) and isset($transaction['price_details']['details']) and is_array($transaction['price_details']['details']) and count($transaction['price_details']['details'])) { + $pdf->SetFont('DejaVuBold', '', 16); + $pdf->Write(20, esc_html__('Billing', 'modern-events-calendar-lite')); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 12); + foreach ($transaction['price_details']['details'] as $price_row) { + $pdf->Write(6, $price_row['description'] . ": " . $this->render_price($price_row['amount'], $requested_event_id)); + $pdf->Ln(); + } + + if ($coupon_code) { + $pdf->Write(6, esc_html__('Coupon Code', 'modern-events-calendar-lite') . ": " . $coupon_code); + $pdf->Ln(); + } + + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(10, esc_html__('Total', 'modern-events-calendar-lite') . ': '); + $pdf->Write(10, $this->render_price($transaction['price'], $requested_event_id)); + $pdf->Ln(); + } + + // Geteway + $pdf->SetFont('DejaVuBold', '', 16); + $pdf->Write(20, esc_html__('Payment', 'modern-events-calendar-lite')); + $pdf->Ln(); + + if (isset($transaction['payable'])) { + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, esc_html__('Paid Amount', 'modern-events-calendar-lite') . ': '); + $pdf->Write(6, $this->render_price($transaction['payable'], $requested_event_id)); + $pdf->Ln(); + } + + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, esc_html__('Gateway', 'modern-events-calendar-lite') . ': '); + $pdf->Write(6, get_post_meta($book_id, 'mec_gateway_label', true)); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, esc_html__('Transaction ID', 'modern-events-calendar-lite') . ': '); + $pdf->Write(6, ((isset($transaction['gateway_transaction_id']) and trim($transaction['gateway_transaction_id'])) ? $transaction['gateway_transaction_id'] : $transaction_id)); + $pdf->Ln(); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, esc_html__('Payment Time', 'modern-events-calendar-lite') . ': '); + $pdf->Write(6, date($date_format . ' ' . $time_format, strtotime(get_post_meta($book_id, 'mec_booking_time', true)))); + $pdf->Ln(); + + do_action('mec_book_invoice_pdf_before_qr_code', $pdf, $book_id, $transaction); + + $image = $this->module('qrcode.invoice', array('event' => $event)); + if (trim($image)) { + // QR Code + $pdf->SetX(-50); + $pdf->Image($image); + $pdf->Ln(); + } + + $pdf->Output(); + exit; + } + } + + public function cart_invoice() + { + // Cart Invoice + if (!isset($_GET['method']) or sanitize_text_field($_GET['method']) !== 'mec-cart-invoice') return; + + $settings = $this->get_settings(); + if (!isset($settings['mec_cart_invoice']) or !$settings['mec_cart_invoice']) wp_die(__('Cannot find the invoice!', 'modern-events-calendar-lite'), esc_html__('Invoice is invalid.', 'modern-events-calendar-lite')); + + $ml_settings = $this->get_ml_settings(); + + $cart_id = sanitize_text_field($_GET['mec-key']); + + $c = $this->getCart(); + $cart = $c->get_archived_cart($cart_id); + + if (!count($cart)) wp_die(__('Cannot find the invoice!', 'modern-events-calendar-lite'), esc_html__('Invoice is invalid.', 'modern-events-calendar-lite')); + + // Libraries + $book = $this->getBook(); + $render = $this->getRender(); + $db = $this->getDB(); + + // Include the tFPDF Class + if (!class_exists('tFPDF')) require_once MEC_ABSPATH . 'app' . DS . 'api' . DS . 'TFPDF' . DS . 'tfpdf.php'; + + $pdf = new tFPDF(); + $pdf->AddPage(); + + // Add a Unicode font (uses UTF-8) + $pdf->AddFont('DejaVu', '', 'DejaVuSansCondensed.ttf', true); + $pdf->AddFont('DejaVuBold', '', 'DejaVuSansCondensed-Bold.ttf', true); + + $pdf->SetTitle(sprintf(esc_html__('%s Invoice', 'modern-events-calendar-lite'), $cart_id)); + $pdf->SetAuthor(get_bloginfo('name'), true); + + foreach ($cart as $transaction_id) { + $transaction = $book->get_transaction($transaction_id); + $event_id = $transaction['event_id'] ?? 0; + $requested_event_id = $transaction['translated_event_id'] ?? $event_id; + + // Don't Show PDF If Booking is Pending + $book_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='" . $transaction_id . "' AND `meta_key`='mec_transaction_id'", 'loadResult'); + $mec_confirmed = get_post_meta($book_id, 'mec_confirmed', true); + + $event = $render->data($event_id); + + $reg_fields = $this->get_reg_fields($event_id); + $bfixed_fields = $this->get_bfixed_fields($event_id); + + $location_id = $this->get_master_location_id($event); + $location = isset($event->locations[$location_id]) ? (trim($event->locations[$location_id]['address']) ? $event->locations[$location_id]['address'] : $event->locations[$location_id]['name']) : ''; + + $dates = isset($transaction['date']) ? explode(':', $transaction['date']) : array(time(), time()); + + // Multiple Dates + $all_dates = ((isset($transaction['all_dates']) and is_array($transaction['all_dates'])) ? $transaction['all_dates'] : array()); + + // Get Booking Post + $booking = $book->get_bookings_by_transaction_id($transaction_id); + + $booking_time = isset($booking[0]) ? get_post_meta($booking[0]->ID, 'mec_booking_time', true) : NULL; + if (!$booking_time and is_numeric($dates[0])) $booking_time = date('Y-m-d', $dates[0]); + + $booking_time = date('Y-m-d', strtotime($booking_time)); + + // Coupon Code + $coupon_code = isset($booking[0]) ? get_post_meta($booking[0]->ID, 'mec_coupon_code', true) : ''; + + // Event Information + $pdf->SetFont('DejaVuBold', '', 18); + $pdf->Write(18, html_entity_decode(get_the_title($event->ID))); + $pdf->Ln(); + + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, esc_html__('Transaction ID', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, $transaction_id . ' (' . ($mec_confirmed ? esc_html__('Confirmed', 'modern-events-calendar-lite') : esc_html__('Not Confirmed', 'modern-events-calendar-lite')) . ')'); + $pdf->Ln(); + + if (trim($location)) { + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, esc_html__('Location', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, $location); + $pdf->Ln(); + } + + $date_format = (isset($ml_settings['booking_date_format1']) and trim($ml_settings['booking_date_format1'])) ? $ml_settings['booking_date_format1'] : 'Y-m-d'; + $time_format = get_option('time_format'); + + if (is_numeric($dates[0]) and is_numeric($dates[1])) { + $start_datetime = date($date_format . ' ' . $time_format, $dates[0]); + $end_datetime = date($date_format . ' ' . $time_format, $dates[1]); + } else { + $start_datetime = $dates[0] . ' ' . $event->data->time['start']; + $end_datetime = $dates[1] . ' ' . $event->data->time['end']; + } + + $booking_options = isset($event->meta['mec_booking']) ? $event->meta['mec_booking'] : []; + $bookings_all_occurrences = isset($booking_options['bookings_all_occurrences']) ? $booking_options['bookings_all_occurrences'] : 0; + + if (count($all_dates)) { + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, __('Date & Times', 'modern-events-calendar-lite')); + $pdf->Ln(); + $pdf->SetFont('DejaVu', '', 9); + + foreach ($all_dates as $one_date) { + $other_timestamps = explode(':', $one_date); + if (isset($other_timestamps[0]) and isset($other_timestamps[1])) { + $pdf->Write(5, sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->date_i18n($date_format . ' ' . $time_format, $other_timestamps[0]), $this->date_i18n($date_format . ' ' . $time_format, $other_timestamps[1]))); + $pdf->Ln(); + } + } + + $pdf->Ln(); + } elseif (!$bookings_all_occurrences) { + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, __('Date & Time', 'modern-events-calendar-lite') . ': '); + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, trim($start_datetime) . ' - ' . (($start_datetime != $end_datetime) ? $end_datetime . ' ' : ''), '- '); + $pdf->Ln(); + } + + // Booking Fixed Fields + if (is_array($bfixed_fields) and count($bfixed_fields)) { + $pdf->Ln(); + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(5, sprintf(esc_html__('%s Fields', 'modern-events-calendar-lite'), $this->m('booking', esc_html__('Booking', 'modern-events-calendar-lite')))); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 9); + foreach ($bfixed_fields as $bfixed_field_id => $bfixed_field) { + if (!is_numeric($bfixed_field_id)) continue; + + $bfixed_value = isset($transaction['fields'][$bfixed_field_id]) ? $transaction['fields'][$bfixed_field_id] : NULL; + if (!$bfixed_value) continue; + + $bfixed_type = isset($bfixed_field['type']) ? $bfixed_field['type'] : NULL; + $bfixed_label = isset($bfixed_field['label']) ? $bfixed_field['label'] : ''; + + if ($bfixed_type == 'agreement') { + $pdf->Write(5, sprintf(esc_html__($bfixed_label, 'modern-events-calendar-lite'), get_the_title($bfixed_field['page'])) . ": " . ($bfixed_value == '1' ? esc_html__('Yes', 'modern-events-calendar-lite') : esc_html__('No', 'modern-events-calendar-lite'))); + } else { + $pdf->Write(5, $bfixed_label . ": " . (is_array($bfixed_value) ? stripslashes(implode(',', $bfixed_value)) : stripslashes($bfixed_value))); + } + + $pdf->Ln(); + } + } + + // Attendees + if (isset($transaction['tickets']) and is_array($transaction['tickets']) and count($transaction['tickets'])) { + $pdf->Ln(); + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(5, esc_html__('Attendees', 'modern-events-calendar-lite')); + $pdf->Ln(); + $pdf->Ln(); + + $i = 1; + foreach ($transaction['tickets'] as $attendee) { + if (!isset($attendee['id'])) continue; + + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, stripslashes($attendee['name'])); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, $attendee['email']); + $pdf->Ln(); + + $pdf->Write(5, ((isset($event->tickets[$attendee['id']]) ? esc_html__($this->m('ticket', esc_html__('Ticket', 'modern-events-calendar-lite'))) . ': ' . esc_html($event->tickets[$attendee['id']]['name']) : '') . ' ' . (isset($event->tickets[$attendee['id']]) ? esc_html($book->get_ticket_price_label($event->tickets[$attendee['id']], $booking_time, $event_id, $dates[0])) : ''))); + + // Registration Fields + $reg_form = isset($attendee['reg']) ? $attendee['reg'] : []; + $reg_fields = apply_filters('mec_bookign_reg_form', $reg_fields, $event_id, get_post($event_id)); + + if (isset($reg_form) and count($reg_form)) { + foreach ($reg_form as $field_id => $value) { + $label = isset($reg_fields[$field_id]) ? $reg_fields[$field_id]['label'] : ''; + $type = isset($reg_fields[$field_id]) ? $reg_fields[$field_id]['type'] : ''; + + $pdf->Ln(); + + if ($type == 'agreement') { + $pdf->Write(5, sprintf(esc_html__($label, 'modern-events-calendar-lite'), get_the_title($reg_fields[$field_id]['page'])) . ": " . ($value == '1' ? esc_html__('Yes', 'modern-events-calendar-lite') : esc_html__('No', 'modern-events-calendar-lite'))); + } else { + $pdf->Write(5, $label . ": " . (is_string($value) ? $value : (is_array($value) ? implode(', ', $value) : '---'))); + } + } + } + + // Ticket Variations + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) { + $ticket_variations = $this->ticket_variations($event_id, $attendee['id']); + + foreach ($attendee['variations'] as $variation_id => $variation_count) { + if (!$variation_count or ($variation_count and $variation_count < 0)) continue; + + $variation_title = (isset($ticket_variations[$variation_id]) and isset($ticket_variations[$variation_id]['title'])) ? $ticket_variations[$variation_id]['title'] : ''; + if (!trim($variation_title)) continue; + + $pdf->Ln(); + $pdf->Write(5, '+ ' . $variation_title . ' (' . $variation_count . ')'); + } + } + + if ($i != count($transaction['tickets'])) $pdf->Ln(9); + else $pdf->Ln(); + + $i++; + } + } + + // Billing Information + if (isset($transaction['price_details']) and isset($transaction['price_details']['details']) and is_array($transaction['price_details']['details']) and count($transaction['price_details']['details'])) { + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(5, esc_html__('Billing', 'modern-events-calendar-lite')); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 9); + foreach ($transaction['price_details']['details'] as $price_row) { + $pdf->Write(5, $price_row['description'] . ": " . $this->render_price($price_row['amount'], $requested_event_id)); + $pdf->Ln(); + } + + if ($coupon_code) { + $pdf->Write(5, esc_html__('Coupon Code', 'modern-events-calendar-lite') . ": " . $coupon_code); + $pdf->Ln(); + } + + $pdf->SetFont('DejaVuBold', '', 9); + $pdf->Write(5, esc_html__('Total', 'modern-events-calendar-lite') . ': '); + $pdf->Write(5, $this->render_price($transaction['price'], $requested_event_id)); + $pdf->Ln(); + } + + // Geteway + $pdf->Ln(); + $pdf->SetFont('DejaVuBold', '', 12); + $pdf->Write(5, esc_html__('Payment', 'modern-events-calendar-lite')); + $pdf->Ln(); + + if (isset($transaction['payable'])) { + $pdf->SetFont('DejaVu', '', 12); + $pdf->Write(6, esc_html__('Paid Amount', 'modern-events-calendar-lite') . ': '); + $pdf->Write(6, $this->render_price($transaction['payable'], $requested_event_id)); + $pdf->Ln(); + } + + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, esc_html__('Gateway', 'modern-events-calendar-lite') . ': '); + $pdf->Write(5, get_post_meta($book_id, 'mec_gateway_label', true)); + $pdf->Ln(); + + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, esc_html__('Transaction ID', 'modern-events-calendar-lite') . ': '); + $pdf->Write(5, ((isset($transaction['gateway_transaction_id']) and trim($transaction['gateway_transaction_id'])) ? $transaction['gateway_transaction_id'] : $transaction_id)); + $pdf->Ln(); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + $pdf->SetFont('DejaVu', '', 9); + $pdf->Write(5, esc_html__('Payment Time', 'modern-events-calendar-lite') . ': '); + $pdf->Write(5, date($date_format . ' ' . $time_format, strtotime(get_post_meta($book_id, 'mec_booking_time', true)))); + $pdf->Ln(); + } + + $pdf->Output(); + exit; + } + + public function print_calendar() + { + // Print Calendar + if (isset($_GET['method']) and sanitize_text_field($_GET['method']) == 'mec-print' and $this->getPRO()) { + $year = isset($_GET['mec-year']) ? sanitize_text_field($_GET['mec-year']) : NULL; + $month = isset($_GET['mec-month']) ? sanitize_text_field($_GET['mec-month']) : NULL; + + // Month and Year are required! + if (!trim($year) or !trim($month)) return; + + $start = $year . '-' . $month . '-01'; + $end = date('Y-m-t', strtotime($start)); + + $atts = []; + $atts['sk-options']['agenda']['start_date_type'] = 'date'; + $atts['sk-options']['agenda']['start_date'] = $start; + $atts['sk-options']['agenda']['maximum_date_range'] = $end; + $atts['sk-options']['agenda']['style'] = 'clean'; + $atts['sk-options']['agenda']['limit'] = 1000; + $atts['sf_status'] = false; + $atts['sf_display_label'] = false; + + // Create Skin Object Class + $SKO = new MEC_skin_agenda(); + + // Initialize the skin + $SKO->initialize($atts); + + // Fetch the events + $SKO->fetch(); + + ob_start(); + ?> + + + + + + + + output()); ?> + + + + getPRO()) { + global $post; + + // Current Post is not Event + if ($post->post_type != $this->get_main_post_type()) return; + + ob_start(); + ?> + + + + + + + > + ID . '"]'); ?> + + + + + + */ + public function ical() + { + // ical export + if (isset($_GET['method']) and sanitize_text_field($_GET['method']) == 'ical') { + $id = sanitize_text_field($_GET['id']); + $post = get_post($id); + + if ($post->post_type == $this->get_main_post_type() and $post->post_status == 'publish') { + $occurrence = isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''; + + $events = $this->ical_single($id, $occurrence, '', true); + $ical_calendar = $this->ical_calendar($events); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-event-' . $id . '.ics"'); + + echo MEC_kses::full($ical_calendar); + exit; + } + } + } + + /** + * Generates ical output in email + * @author Webnus + */ + public function ical_email() + { + // ical export + if (isset($_GET['method']) and sanitize_text_field($_GET['method']) == 'ical-email') { + $id = sanitize_text_field($_GET['id']); + $book_id = sanitize_text_field($_GET['book_id']); + $key = sanitize_text_field($_GET['key']); + + if ($key != md5($book_id)) wp_die(__('Request is not valid.', 'modern-events-calendar-lite'), esc_html__('iCal export stopped!', 'modern-events-calendar-lite'), array('back_link' => true)); + + $occurrence = isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''; + + $events = $this->ical_single_email($id, $book_id, $occurrence); + $ical_calendar = $this->ical_calendar($events); + + header('Content-type: application/force-download; charset=utf-8'); + header('Content-Disposition: attachment; filename="mec-booking-' . $book_id . '.ics"'); + + echo MEC_kses::full($ical_calendar); + exit; + } + } + + /** + * Returns the iCal URL of event + * @author Webnus + * @param $event_id + * @param string $occurrence + * @return string + */ + public function ical_URL($event_id, $occurrence = '') + { + $url = $this->URL('site'); + $url = $this->add_qs_var('method', 'ical', $url); + $url = $this->add_qs_var('id', $event_id, $url); + + // Add Occurrence Date if passed + if (trim($occurrence)) $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return $url; + } + + public function ical_URL_email($event_id, $book_id, $occurrence = '') + { + $url = $this->URL('site'); + $url = $this->add_qs_var('method', 'ical-email', $url); + $url = $this->add_qs_var('id', $event_id, $url); + $url = $this->add_qs_var('book_id', $book_id, $url); + $url = $this->add_qs_var('key', md5($book_id), $url); + + // Add Occurrence Date if passed + if (trim($occurrence)) $url = $this->add_qs_var('occurrence', $occurrence, $url); + + return $url; + } + + /** + * Returns iCal export for one event + * @param int $event_id + * @param string $occurrence + * @param string $occurrence_time + * @param bool $start_from_beginning + * @return string + * @throws Exception + * @author Webnus + */ + public function ical_single($event_id, $occurrence = '', $occurrence_time = '', $start_from_beginning = false) + { + // Valid Line Separator + $crlf = "\r\n"; + + // MEC Render Library + $render = $this->getRender(); + + // Event Data + $event = $render->data($event_id); + + // Not an Event + if ($event->post->post_type != $this->get_main_post_type()) return ''; + + if ($start_from_beginning and isset($event->meta, $event->meta['mec_start_datetime'])) { + $start_time = strtotime($event->meta['mec_start_datetime']); + $end_time = strtotime($event->meta['mec_end_datetime']); + } else { + $occurrence_end_date = (trim($occurrence) ? $this->get_end_date_by_occurrence($event_id, $occurrence) : ''); + + // Event Dates + $dates = $this->get_event_next_occurrences($event, $occurrence, 2, $occurrence_time); + + $date = $dates[0] ?? []; + + if ($date['start']['hour'] == '0' && $date['start']['ampm'] == 'AM') $date['start']['hour'] = 12; + if ($date['end']['hour'] == '0' && $date['end']['ampm'] == 'AM') $date['end']['hour'] = 12; + + $start_time_string = isset($date['start']) ? sprintf("%02d", $date['start']['hour']) . ':' . sprintf("%02d", $date['start']['minutes']) . ' ' . $date['start']['ampm'] : ''; + $end_time_string = isset($date['end']) ? sprintf("%02d", $date['end']['hour']) . ':' . sprintf("%02d", $date['end']['minutes']) . ' ' . $date['end']['ampm'] : ''; + + if (isset($date['start'], $date['start']['timestamp'])) $start_time = $date['start']['timestamp']; + else $start_time = strtotime(((isset($date['start']) and trim($date['start']['date'])) ? $date['start']['date'] : $occurrence) . ' ' . $start_time_string); + + if (isset($date['end'], $date['end']['timestamp'])) $end_time = $date['end']['timestamp']; + else $end_time = strtotime((trim($occurrence_end_date) ? $occurrence_end_date : $date['end']['date']) . ' ' . $end_time_string); + } + + $gmt_offset_seconds = $this->get_gmt_offset_seconds($start_time, $event); + $stamp = strtotime($event->post->post_date); + $modified = strtotime($event->post->post_modified); + + $rrules = $this->get_ical_rrules($event); + $time_format = 'Ymd\\THi00\\Z'; + + $sequence = (isset($event->meta['mec_sequence']) ? (int) $event->meta['mec_sequence'] : 0); + + // All Day Event + if (isset($event->meta['mec_date']) and isset($event->meta['mec_date']['allday']) and $event->meta['mec_date']['allday']) { + $start_time = strtotime("Today", $start_time); + $end_time = strtotime('Tomorrow', $end_time); + } + + $ical = "BEGIN:VEVENT" . $crlf; + $ical .= "CLASS:PUBLIC" . $crlf; + $ical .= "UID:MEC-" . md5($event_id) . "@" . $this->get_domain() . $crlf; + $ical .= "DTSTART:" . gmdate($time_format, ($start_time - $gmt_offset_seconds)) . $crlf; + $ical .= "DTEND:" . gmdate($time_format, ($end_time - $gmt_offset_seconds)) . $crlf; + $ical .= "DTSTAMP:" . gmdate($time_format, ($stamp - $gmt_offset_seconds)) . $crlf; + + if (is_array($rrules) and count($rrules)) { + foreach ($rrules as $rrule) $ical .= $rrule . $crlf; + } + + $event_content = preg_replace('#]*href="((?!/)[^"]+)">[^<]+#', '$0 ( $1 )', $event->content); + $event_content = strip_shortcodes(strip_tags($event_content)); + $event_content = str_replace("\r\n", "\\n", $event_content); + $event_content = str_replace("\n", "\\n", $event_content); + $event_content = preg_replace('/(]*>.+?<\/script>|]*>.+?<\/style>)/s', '', $event_content); + + $ical .= "CREATED:" . date('Ymd', $stamp) . $crlf; + $ical .= "LAST-MODIFIED:" . date('Ymd', $modified) . $crlf; + $ical .= "PRIORITY:5" . $crlf; + $ical .= "SEQUENCE:" . $sequence . $crlf; + $ical .= "TRANSP:OPAQUE" . $crlf; + $ical .= "SUMMARY:" . html_entity_decode(apply_filters('mec_ical_single_summary', $event->title, $event_id), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "DESCRIPTION:" . html_entity_decode(apply_filters('mec_ical_single_description', $event_content, $event_id, $event), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "URL:" . apply_filters('mec_ical_single_url', $event->permalink, $event_id) . $crlf; + + // Organizer + $organizer_id = $this->get_master_organizer_id($event->ID, $start_time); + $organizer = $event->organizers[$organizer_id] ?? []; + $organizer_name = (isset($organizer['name']) and trim($organizer['name'])) ? $organizer['name'] : NULL; + $organizer_email = (isset($organizer['email']) and trim($organizer['email'])) ? $organizer['email'] : NULL; + + if ($organizer_name or $organizer_email) $ical .= "ORGANIZER;CN=" . $organizer_name . ":MAILTO:" . $organizer_email . $crlf; + + // Categories + $categories = ''; + if (isset($event->categories) and is_array($event->categories) and count($event->categories)) { + foreach ($event->categories as $category) $categories .= $category['name'] . ','; + } + + if (trim($categories) != '') $ical .= "CATEGORIES:" . trim($categories, ', ') . $crlf; + + // Location + $location_id = $this->get_master_location_id($event->ID, $start_time); + $location = $event->locations[$location_id] ?? []; + $address = ((isset($location['address']) and trim($location['address'])) ? $location['address'] : (isset($location['name']) ? $location['name'] : '')); + + if (trim($address) != '') $ical .= "LOCATION:" . $address . $crlf; + + // Featured Image + if (trim($event->featured_image['full']) != '') { + $ex = explode('/', $event->featured_image['full']); + $filename = end($ex); + $ical .= "ATTACH;FMTTYPE=" . $this->get_mime_content_type($filename) . ":" . $event->featured_image['full'] . $crlf; + } + + $ical .= "END:VEVENT" . $crlf; + + return apply_filters('mec_ical_single', $ical); + } + + public function ical_single_occurrence($start_time, $end_time, $event, $rrules = array(), $extra_lines = array()) + { + // Valid Line Separator + $crlf = "\r\n"; + + $stamp_gmt = strtotime($event->post->post_date_gmt); + $stamp = strtotime($event->post->post_date); + $modified = strtotime($event->post->post_modified); + + $timezone = $this->get_timezone($event->ID); + $time_format = 'Ymd\\THi00'; + + $sequence = (isset($event->meta['mec_sequence']) ? (int) $event->meta['mec_sequence'] : 0); + + // All Day Event + if (isset($event->meta['mec_date']) and isset($event->meta['mec_date']['allday']) and $event->meta['mec_date']['allday']) { + $time_format = 'Ymd\\T000000'; + $end_time = strtotime('+1 Day', $end_time); + } + + $ical = "BEGIN:VEVENT" . $crlf; + $ical .= "CLASS:PUBLIC" . $crlf; + $ical .= "DTSTART;TZID=" . $timezone . ":" . date($time_format, $start_time) . $crlf; + $ical .= "DTEND;TZID=" . $timezone . ":" . date($time_format, $end_time) . $crlf; + $ical .= "DTSTAMP:" . gmdate($time_format, $stamp_gmt) . $crlf; + $ical .= "UID:MEC-" . md5($event->ID) . "@" . $this->get_domain() . $crlf; + + if (is_array($rrules) and count($rrules)) { + foreach ($rrules as $rrule) $ical .= $rrule . $crlf; + } + + if (is_array($extra_lines) and count($extra_lines)) { + foreach ($extra_lines as $extra_line) $ical .= $extra_line . $crlf; + } + + $event_content = preg_replace('#]*href="((?!/)[^"]+)">[^<]+#', '$0 ( $1 )', $event->content); + $event_content = strip_shortcodes(strip_tags($event_content)); + $event_content = str_replace("\r\n", "\\n", $event_content); + $event_content = str_replace("\n", "\\n", $event_content); + $event_content = preg_replace('/(]*>.+?<\/script>|]*>.+?<\/style>)/s', '', $event_content); + + $ical .= "CREATED:" . date('Ymd', $stamp) . $crlf; + $ical .= "LAST-MODIFIED:" . date('Ymd', $modified) . $crlf; + $ical .= "PRIORITY:5" . $crlf; + $ical .= "SEQUENCE:" . $sequence . $crlf; + $ical .= "TRANSP:OPAQUE" . $crlf; + $ical .= "SUMMARY:" . html_entity_decode(apply_filters('mec_ical_single_summary', $event->title, $event->ID), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "DESCRIPTION:" . html_entity_decode(apply_filters('mec_ical_single_description', $event_content, $event->ID, $event), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "URL:" . apply_filters('mec_ical_single_url', $event->permalink, $event->ID) . $crlf; + + // Organizer + $organizer_id = $this->get_master_organizer_id($event->ID, $start_time); + $organizer = $event->organizers[$organizer_id] ?? []; + $organizer_name = (isset($organizer['name']) and trim($organizer['name'])) ? $organizer['name'] : NULL; + $organizer_email = (isset($organizer['email']) and trim($organizer['email'])) ? $organizer['email'] : NULL; + + if ($organizer_name or $organizer_email) $ical .= "ORGANIZER;CN=" . $organizer_name . ":MAILTO:" . $organizer_email . $crlf; + + // Categories + $categories = ''; + if (isset($event->categories) and is_array($event->categories) and count($event->categories)) { + foreach ($event->categories as $category) $categories .= $category['name'] . ','; + } + + if (trim($categories) != '') $ical .= "CATEGORIES:" . trim($categories, ', ') . $crlf; + + // Location + $location_id = $this->get_master_location_id($event->ID, $start_time); + $location = $event->locations[$location_id] ?? []; + $address = ((isset($location['address']) and trim($location['address'])) ? $location['address'] : (isset($location['name']) ? $location['name'] : '')); + + if (trim($address) != '') $ical .= "LOCATION:" . $address . $crlf; + + // Featured Image + if (trim($event->featured_image['full']) != '') { + $ex = explode('/', $event->featured_image['full']); + $filename = end($ex); + $ical .= "ATTACH;FMTTYPE=" . $this->get_mime_content_type($filename) . ":" . $event->featured_image['full'] . $crlf; + } + + $ical .= "END:VEVENT" . $crlf; + + return apply_filters('mec_ical_single', $ical); + } + + /** + * Returns iCal export for email + * @author Webnus + * @param int $event_id + * @param int $book_id + * @param string $occurrence + * @return string + */ + public function ical_single_email($event_id, $book_id, $occurrence = '') + { + // Valid Line Separator + $crlf = "\r\n"; + + $date = get_post_meta($book_id, 'mec_date', true); + $timestamps = explode(':', $date); + + // MEC Render Library + $render = $this->getRender(); + $event = $render->data($event_id); + + $start_time = ($timestamps[0] ?? strtotime(get_the_date($book_id))); + $end_time = ($timestamps[1] ?? strtotime(get_the_date($book_id))); + + $location_id = $this->get_master_location_id($event->ID, $start_time); + $location = $event->locations[$location_id] ?? []; + $address = (isset($location['address']) and trim($location['address'])) ? $location['address'] : (isset($location['name']) ? $location['name'] : ''); + + $gmt_offset_seconds = $this->get_gmt_offset_seconds($start_time, $event); + + $stamp = strtotime($event->post->post_date); + $modified = strtotime($event->post->post_modified); + $time_format = (isset($event->meta['mec_date']) and isset($event->meta['mec_date']['allday']) and $event->meta['mec_date']['allday']) ? 'Ymd' : 'Ymd\\THi00\\Z'; + + $sequence = (isset($event->meta['mec_sequence']) ? (int) $event->meta['mec_sequence'] : 0); + + $event_content = preg_replace('#]*href="((?!/)[^"]+)">[^<]+#', '$0 ( $1 )', $event->content); + $event_content = strip_shortcodes(strip_tags($event_content)); + $event_content = str_replace("\r\n", "\\n", $event_content); + $event_content = str_replace("\n", "\\n", $event_content); + $event_content = preg_replace('/(]*>.+?<\/script>|]*>.+?<\/style>)/s', '', $event_content); + + $ical = "BEGIN:VEVENT" . $crlf; + $ical .= "CLASS:PUBLIC" . $crlf; + $ical .= "UID:MEC-" . md5($event_id) . "@" . $this->get_domain() . $crlf; + $ical .= "DTSTART:" . gmdate($time_format, ($start_time - $gmt_offset_seconds)) . $crlf; + $ical .= "DTEND:" . gmdate($time_format, ($end_time - $gmt_offset_seconds)) . $crlf; + $ical .= "DTSTAMP:" . gmdate($time_format, ($stamp - $gmt_offset_seconds)) . $crlf; + $ical .= "CREATED:" . date('Ymd', $stamp) . $crlf; + $ical .= "LAST-MODIFIED:" . date('Ymd', $modified) . $crlf; + $ical .= "PRIORITY:5" . $crlf; + $ical .= "SEQUENCE:" . $sequence . $crlf; + $ical .= "TRANSP:OPAQUE" . $crlf; + $ical .= "SUMMARY:" . html_entity_decode(apply_filters('mec_ical_single_summary', $event->title, $event_id), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "DESCRIPTION:" . html_entity_decode(apply_filters('mec_ical_single_description', $event_content, $event_id, $event), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "X-ALT-DESC;FMTTYPE=text/html:" . html_entity_decode(apply_filters('mec_ical_single_description', $event_content, $event_id, $event), ENT_NOQUOTES, 'UTF-8') . $crlf; + $ical .= "URL:" . apply_filters('mec_ical_single_url', $event->permalink, $event_id) . $crlf; + + // Location + if (trim($address) != '') $ical .= "LOCATION:" . $address . $crlf; + + // Featured Image + if (trim($event->featured_image['full']) != '') { + $ex = explode('/', $event->featured_image['full']); + $filename = end($ex); + $ical .= "ATTACH;FMTTYPE=" . $this->get_mime_content_type($filename) . ":" . $event->featured_image['full'] . $crlf; + } + + $ical .= "END:VEVENT" . $crlf; + + return apply_filters('mec_ical_single', $ical); + } + + /** + * Returns iCal export for some events + * @author Webnus + * @param string $events + * @return string + */ + public function ical_calendar($events) + { + // Valid Line Separator + $crlf = "\r\n"; + + $ical = "BEGIN:VCALENDAR" . $crlf; + $ical .= "VERSION:2.0" . $crlf; + $ical .= "METHOD:PUBLISH" . $crlf; + $ical .= "CALSCALE:GREGORIAN" . $crlf; + $ical .= "PRODID:-//WordPress - MECv" . $this->get_version() . "//EN" . $crlf; + $ical .= "X-ORIGINAL-URL:" . $this->URL('site') . $crlf; + $ical .= "X-WR-CALNAME:" . get_bloginfo('name') . $crlf; + $ical .= "X-WR-CALDESC:" . get_bloginfo('description') . $crlf; + $ical .= "REFRESH-INTERVAL;VALUE=DURATION:PT1H" . $crlf; + $ical .= "X-PUBLISHED-TTL:PT1H" . $crlf; + $ical .= "X-MS-OLK-FORCEINSPECTOROPEN:TRUE" . $crlf; + $ical .= $events; + $ical .= "END:VCALENDAR" . $crlf; + + return $ical; + } + + /** + * Get mime-type of a file + * @author Webnus + * @param string $filename + * @return string + */ + public function get_mime_content_type($filename) + { + // Remove query string from the image name + if (strpos($filename, '?') !== false) { + $ex = explode('?', $filename); + $filename = $ex[0]; + } + + $mime_types = array( + 'txt' => 'text/plain', + 'htm' => 'text/html', + 'html' => 'text/html', + 'php' => 'text/html', + 'css' => 'text/css', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'xml' => 'application/xml', + 'swf' => 'application/x-shockwave-flash', + 'flv' => 'video/x-flv', + + // images + 'png' => 'image/png', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'webp' => 'image/webp', + 'gif' => 'image/gif', + 'bmp' => 'image/bmp', + 'ico' => 'image/vnd.microsoft.icon', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + + // archives + 'zip' => 'application/zip', + 'rar' => 'application/x-rar-compressed', + 'exe' => 'application/x-msdownload', + 'msi' => 'application/x-msdownload', + 'cab' => 'application/vnd.ms-cab-compressed', + + // audio/video + 'mp3' => 'audio/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + + // adobe + 'pdf' => 'application/pdf', + 'psd' => 'image/vnd.adobe.photoshop', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + + // MS Office + 'doc' => 'application/msword', + 'rtf' => 'application/rtf', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + + // open office + 'odt' => 'application/vnd.oasis.opendocument.text', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + ); + + $ex = explode('.', $filename); + $ext = strtolower(array_pop($ex)); + if (array_key_exists($ext, $mime_types)) { + return $mime_types[$ext]; + } elseif (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME); + $mimetype = finfo_file($finfo, $filename); + finfo_close($finfo); + + return $mimetype; + } else { + return 'application/octet-stream'; + } + } + + /** + * Returns book post type slug + * @author Webnus + * @return string + */ + public function get_book_post_type() + { + return apply_filters('mec_book_post_type_name', 'mec-books'); + } + + /** + * Returns shortcode post type slug + * @author Webnus + * @return string + */ + public function get_shortcode_post_type() + { + return apply_filters('mec_shortcode_post_type_name', 'mec_calendars'); + } + + /** + * Returns email post type + * @author Webnus + * @return string + */ + public function get_email_post_type() + { + return apply_filters('mec_email_post_type_name', 'mec-emails'); + } + + /** + * Returns certificate type + * @author Webnus + * @return string + */ + public function get_certificate_post_type() + { + return apply_filters('mec_certificate_post_type_name', 'mec-certificate'); + } + + /** + * Returns webhooks post type + * @author Webnus + * @return string + */ + public function get_webhook_post_type() + { + return apply_filters('mec_email_post_type_name', 'mec-webhooks'); + } + + public function field_icon_feature($key, $values = array(), $prefix = 'reg') + { + if ($prefix !== 'event') return ''; + + // MEC Settings + $settings = $this->get_settings(); + + // Feature is disabled + if (!isset($settings['event_fields_icon']) or (isset($settings['event_fields_icon']) and !$settings['event_fields_icon'])) return ''; + + $preview_html_id = 'mec_thumbnail_img_' . esc_attr($prefix) . '_' . esc_attr($key); + $input_html_id = 'mec_thumbnail_' . esc_attr($prefix) . '_' . esc_attr($key); + $icon = isset($values['icon']) ? $values['icon'] : ''; + + return ' +
    ' . (trim($icon) != '' ? '' : '') . '
    + + + +
    '; + } + + /** + * Show text field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_text($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Text', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show text field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_name($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('MEC Name', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' + +
    + + +
    +
  • '; + } + + /** + * Show text field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_mec_email($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('MEC Email', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' + +
    + + +
    +
  • '; + } + + /** + * Show email field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_email($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Email', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show URL field options in forms + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_url($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('URL', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show file field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_file($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('File', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + +
    +
  • '; + } + + /** + * Show date field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_date($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Date', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show tel field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_tel($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Tel', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show textarea field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_textarea($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Textarea', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    +

    + +
    + ' . ($prefix == 'event' ? '
    ' : '') . ' +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
    +
  • '; + } + + /** + * Show paragraph field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_p($key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Paragraph', 'modern-events-calendar-lite') . ' + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +
    + + +

    ' . esc_html__('HTML and shortcode are allowed.') . '

    +
    +
  • '; + } + + /** + * Show checkbox field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_checkbox($key, $values = array(), $prefix = 'reg') + { + $i = 0; + $field = '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Checkboxes', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
      '; + + if (isset($values['options']) and is_array($values['options']) and count($values['options'])) { + foreach ($values['options'] as $option_key => $option) { + $i = max($i, $option_key); + $field .= $this->field_option($key, $option_key, $values, $prefix); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show radio field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_radio($key, $values = array(), $prefix = 'reg') + { + $i = 0; + $field = '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Radio Buttons', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
      '; + + if (isset($values['options']) and is_array($values['options']) and count($values['options'])) { + foreach ($values['options'] as $option_key => $option) { + $i = max($i, $option_key); + $field .= $this->field_option($key, $option_key, $values, $prefix); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show select field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_select($key, $values = array(), $prefix = 'reg') + { + $i = 0; + $field = '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Dropdown', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + + + ' . ($prefix == 'reg' ? $this->get_wp_user_fields_dropdown('mec[' . esc_attr($prefix) . '_fields][' . esc_attr($key) . '][mapping]', ($values['mapping'] ?? '')) : '') . ' +
      '; + + if (isset($values['options']) and is_array($values['options']) and count($values['options'])) { + foreach ($values['options'] as $option_key => $option) { + $i = max($i, $option_key); + $field .= $this->field_option($key, $option_key, $values, $prefix); + } + } + + $field .= '
    + + +
    +
  • '; + + return $field; + } + + /** + * Show agreement field options in booking form + * @author Webnus + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_agreement($key, $values = array(), $prefix = 'reg') + { + // WordPress Pages + $pages = get_pages(); + + $i = 0; + $field = '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Agreement', 'modern-events-calendar-lite') . ' + ' . ($prefix == 'event' ? '%%event_field_' . esc_html($key) . '%%' : ($prefix == 'bfixed' ? '%%booking_field_' . esc_html($key) . '%%' : '')) . ' + ' . $this->field_icon_feature($key, $values, $prefix) . ' + ' . apply_filters('mec_form_field_description', '', $key, $values, $prefix) . ' +

    + +

    + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' +
    + +

    ' . esc_html__('Instead of %s, the page title with a link will be show.', 'modern-events-calendar-lite') . '

    +
    + + +
    +
    + + +
    + +
    +
  • '; + + return $field; + } + + /** + * Show option tag parameters in booking form for select, checkbox and radio tags + * @author Webnus + * @param string $field_key + * @param string $key + * @param array $values + * @param string $prefix + * @return string + */ + public function field_option($field_key, $key, $values = array(), $prefix = 'reg') + { + return '
  • + ' . esc_html__('Sort', 'modern-events-calendar-lite') . ' + ' . esc_html__('Remove', 'modern-events-calendar-lite') . ' + +
  • '; + } + + /** + * Render raw price and return its output + * @param int|object $event + * @author Webnus + * @param int $price + * @param boolean $apply_free + * @return string + */ + public function render_price($price, $event = NULL, $apply_free = true) + { + // return Free if price is 0 + if ($price == '0' and $apply_free) return esc_html__('Free', 'modern-events-calendar-lite'); + + $thousand_separator = $this->get_thousand_separator($event); + $decimal_separator = $this->get_decimal_separator($event); + + $currency = $this->get_currency_sign($event); + $currency_sign_position = $this->get_currency_sign_position($event); + $decimals = $this->get_decimals($event); + + // Force to double + if (is_string($price)) $price = (float) $price; + + $rendered = number_format($price, ($decimal_separator === false ? 0 : $decimals), ($decimal_separator === false ? '' : $decimal_separator), $thousand_separator); + + if ($currency_sign_position == 'after') $rendered = $rendered . $currency; + elseif ($currency_sign_position == 'after_space') $rendered = $rendered . ' ' . $currency; + elseif ($currency_sign_position == 'before_space') $rendered = $currency . ' ' . $rendered; + else $rendered = $currency . $rendered; + + return $rendered; + } + + /** + * Returns thousands separator + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_thousand_separator($event = NULL) + { + $settings = $this->get_settings(); + + // Separator + $separator = (isset($settings['thousand_separator']) ? $settings['thousand_separator'] : ','); + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['thousand_separator']) and trim($options['thousand_separator'])) $separator = $options['thousand_separator']; + } + + return apply_filters('mec_thousand_separator', $separator); + } + + /** + * Returns decimal separator + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_decimal_separator($event = NULL) + { + $settings = $this->get_settings(); + + // Separator + $separator = (isset($settings['decimal_separator']) ? $settings['decimal_separator'] : '.'); + + // Status + $disabled = (isset($settings['decimal_separator_status']) and $settings['decimal_separator_status'] == 0); + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['decimal_separator']) and trim($options['decimal_separator'])) $separator = $options['decimal_separator']; + if (isset($options['decimal_separator_status'])) $disabled = (bool) !$options['decimal_separator_status']; + } + + return apply_filters('mec_decimal_separator', ($disabled ? false : $separator)); + } + + /** + * @param int|object $event + * @return array + */ + public function get_event_currency_options($event) + { + $event_id = (is_object($event) ? $event->ID : $event); + + $options = get_post_meta($event_id, 'mec_currency', true); + if (!is_array($options)) $options = []; + + return $options; + } + + /** + * Returns currency of MEC + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_currency($event = NULL) + { + $settings = $this->get_settings(); + $currency = ($settings['currency'] ?? ''); + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['currency']) and trim($options['currency'])) $currency = $options['currency']; + } + + return apply_filters('mec_currency', $currency); + } + + /** + * Returns currency sign of MEC + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_currency_sign($event = NULL) + { + $settings = $this->get_settings(); + + // Get Currency Symptom + $currency = $this->get_currency($event); + if (isset($settings['currency_symptom']) and trim($settings['currency_symptom'])) $currency = $settings['currency_symptom']; + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['currency_symptom']) and trim($options['currency_symptom'])) $currency = $options['currency_symptom']; + } + + return apply_filters('mec_currency_sign', $currency); + } + + /** + * Returns currency code of MEC + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_currency_code($event = NULL) + { + $currency = $this->get_currency($event); + $currencies = $this->get_currencies(); + + return isset($currencies[$currency]) ? $currencies[$currency] : 'USD'; + } + + /** + * Returns currency sign position of MEC + * @param int|object $event + * @author Webnus + * @return string + */ + public function get_currency_sign_position($event = NULL) + { + $settings = $this->get_settings(); + + // Currency Position + $position = (isset($settings['currency_sign']) ? $settings['currency_sign'] : ''); + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['currency_sign']) and trim($options['currency_sign'])) $position = $options['currency_sign']; + } + + return apply_filters('mec_currency_sign_position', $position); + } + + public function get_decimals($event = NULL) + { + + $settings = $this->get_settings(); + + // Currency Decimals + $decimals = (isset($settings['currency_decimals']) ? (int)$settings['currency_decimals'] : 2); + + // Currency Per Event + if ($event and isset($settings['currency_per_event']) and $settings['currency_per_event']) { + $options = $this->get_event_currency_options($event); + if (isset($options['currency_decimals']) and trim($options['currency_decimals'])) $decimals = (int)$options['currency_decimals']; + } + + return apply_filters('mec_currency_decimals', $decimals); + } + + /** + * Returns MEC Payment Gateways + * @author Webnus + * @return array + */ + public function get_gateways() + { + return apply_filters('mec_gateways', array()); + } + + /** + * Check to see if user exists by its username + * @author Webnus + * @param string $username + * @return boolean + */ + public function username_exists($username) + { + /** first validation **/ + if (!trim($username)) return true; + + return username_exists($username); + } + + /** + * Check to see if user exists by its email + * @author Webnus + * @param string $email + * @return boolean + */ + public function email_exists($email) + { + /** first validation **/ + if (!trim($email)) return true; + + return email_exists($email); + } + + /** + * Register a user in WordPress + * @author Webnus + * @param string $username + * @param string $email + * @param string $password + * @param boolean $auto + * @return boolean + */ + public function register_user($username, $email, $password = NULL, $auto = true) + { + /** first validation **/ + if (!trim($username) or !trim($email)) return false; + + if ($auto) return register_new_user($username, $email); + return wp_create_user($username, $password, $email); + } + + /** + * Convert a formatted date into standard format + * @author Webnus + * @param string $date + * @return string + */ + public function to_standard_date($date) + { + $date = str_replace('-', '/', $date); + $date = str_replace('.', '/', $date); + + return date('Y-m-d', strtotime($date)); + } + + /** + * Render the date + * @author Webnus + * @param string $date + * @return string + */ + public function render_date($date) + { + return $date; + } + + /** + * Generate output of MEC Dashboard + * @author Webnus + */ + public function dashboard() + { + // Import dashboard page of MEC + $path = $this->import('app.features.mec.dashboard', true, true); + + // Create mec_events table if it's removed for any reason + $this->create_mec_tables(); + + ob_start(); + include $path; + echo MEC_kses::full(ob_get_clean()); + } + + /** + * Redirect on plugin activation + * @author Webnus + */ + public function mec_redirect_after_activate() + { + $do_redirection = apply_filters('mec_do_redirection_after_activation', true); + if (!$do_redirection) return false; + + // No need to redirect + if (!get_option('mec_activation_redirect', false)) return true; + + // Delete the option to don't do it always + delete_option('mec_activation_redirect'); + + // Redirect to MEC Dashboard + wp_redirect(admin_url('/admin.php?page=MEC-wizard')); + exit; + } + + /** + * Check if we can show booking module or not + * @author Webnus + * @param object $event + * @return boolean + */ + public function can_show_booking_module($event) + { + // PRO Version is required + if (!$this->getPRO()) return false; + + // MEC Settings + $settings = $this->get_settings(); + + // Booking on single page is disabled + if (!isset($settings['booking_status']) or (isset($settings['booking_status']) and !$settings['booking_status'])) return false; + + // Who Can Book + $wcb_all = (isset($settings['booking_wcb_all']) and is_numeric($settings['booking_wcb_all'])) ? $settings['booking_wcb_all'] : 1; + if (!$wcb_all) { + $user_id = get_current_user_id(); + + // Guest User is not Permitted + if (!$user_id) return false; + + // User + $user = get_user_by('id', $user_id); + + // Invalid User ID + if (!$user or ($user and !isset($user->roles))) return false; + + $roles = (array) $user->roles; + + $can = false; + foreach ($roles as $role) if (isset($settings['booking_wcb_' . $role]) and $settings['booking_wcb_' . $role]) $can = true; + + if (!$can) return false; + } + + $tickets = isset($event->data->tickets) ? $event->data->tickets : []; + $dates = isset($event->dates) ? $event->dates : (isset($event->date) ? $event->date : array()); + $next_date = isset($dates[0]) ? $dates[0] : (isset($event->date) ? $event->date : array()); + + // No Dates or no Tickets + if (!count($dates) or !count($tickets)) return false; + + $start_timestamp = isset($next_date['start']['timestamp']) ? $next_date['start']['timestamp'] : NULL; + + // Occurrence Canceled + if ($this->is_occurrence_cenceled($event, $start_timestamp)) return false; + + // Booking Options + $booking_options = (isset($event->data->meta['mec_booking']) and is_array($event->data->meta['mec_booking'])) ? $event->data->meta['mec_booking'] : []; + + $booking_unlimited = (!isset($booking_options['bookings_limit_unlimited']) || $booking_options['bookings_limit_unlimited']); + $booking_limit = (isset($booking_options['bookings_limit']) and trim($booking_options['bookings_limit']) !== '') ? (int) $booking_options['bookings_limit'] : -1; + + // Limit is 0 + if (!$booking_unlimited and $booking_limit === 0) return false; + + $book_all_occurrences = 0; + if (isset($event->data) and isset($event->data->meta) and isset($booking_options['bookings_all_occurrences'])) $book_all_occurrences = (int) $booking_options['bookings_all_occurrences']; + + $bookings_stop_selling_after_first_occurrence = isset($booking_options['stop_selling_after_first_occurrence']) ? $booking_options['stop_selling_after_first_occurrence'] : 0; + if ($bookings_stop_selling_after_first_occurrence and $this->is_first_occurrence_passed($event)) return false; + + $show_booking_form_interval = (isset($settings['show_booking_form_interval'])) ? $settings['show_booking_form_interval'] : 0; + if (isset($booking_options['show_booking_form_interval']) and trim($booking_options['show_booking_form_interval']) != '') $show_booking_form_interval = $booking_options['show_booking_form_interval']; + + // Check Show Booking Form Time + if ($show_booking_form_interval) { + if ($book_all_occurrences) { + $db = $this->getDB(); + $first_timestamp = $db->select("SELECT `tstart` FROM `#__mec_dates` WHERE `post_id`=" . $event->data->ID . " ORDER BY `tstart` ASC LIMIT 1", 'loadResult'); + $render_date = date('Y-m-d h:i a', $first_timestamp); + } else { + $render_date = (isset($next_date['start']['date']) ? trim($next_date['start']['date']) : date('Y-m-d')) . ' ' . (isset($next_date['start']['hour']) ? trim(sprintf('%02d', $next_date['start']['hour'])) : date('h', current_time('timestamp', 0))) . ':' + . (isset($next_date['start']['minutes']) ? trim(sprintf('%02d', $next_date['start']['minutes'])) : date('i', current_time('timestamp', 0))) . ' ' . (isset($next_date['start']['ampm']) ? trim($next_date['start']['ampm']) : date('a', current_time('timestamp', 0))); + } + + if ($this->check_date_time_validation('Y-m-d h:i a', strtolower($render_date))) { + $date_diff = $this->date_diff(date('Y-m-d h:i a', current_time('timestamp')), $render_date); + if (isset($date_diff->days) and !$date_diff->invert) { + $minute = $date_diff->days * 24 * 60; + $minute += $date_diff->h * 60; + $minute += $date_diff->i; + + if ($minute > $show_booking_form_interval) return false; + } + } + } + + // Booking OnGoing Event Option + $ongoing_event_book = (isset($settings['booking_ongoing']) and $settings['booking_ongoing'] == '1'); + + // The event is Expired/Passed + if ($ongoing_event_book) { + if (!isset($next_date['end']) or (isset($next_date['end']) and $this->is_past($next_date['end']['date'], current_time('Y-m-d')))) return false; + if (isset($next_date['end']) and isset($next_date['end']['timestamp']) and $next_date['end']['timestamp'] < current_time('timestamp', 0)) return false; + } else { + $time_format = 'Y-m-d'; + $render_date = isset($next_date['start']) ? trim($next_date['start']['date']) : false; + + if (!trim($event->data->meta['mec_repeat_status'])) { + if (isset($next_date['start']['hour'])) $render_date .= ' ' . sprintf('%02d', $next_date['start']['hour']) . ':' . sprintf('%02d', $next_date['start']['minutes']) . trim($next_date['start']['ampm']); + else $render_date .= ' ' . date('h:ia', $event->data->time['start_timestamp']); + + $time_format .= ' h:ia'; + } + + if (!$render_date or ($render_date and $this->is_past($render_date, current_time($time_format)))) return false; + } + + // MEC payment gateways + $gateway_options = $this->get_gateways_options(); + + $is_gateway_enabled = false; + foreach ($gateway_options as $gateway_option) { + if (is_array($gateway_option) and isset($gateway_option['status']) and $gateway_option['status'] != 0) { + $is_gateway_enabled = true; + break; + } + } + + $wc_status = ((isset($settings['wc_status']) and class_exists('WooCommerce')) ? (bool) $settings['wc_status'] : false); + + // No Payment gateway is enabled + if (!$is_gateway_enabled and !$wc_status) return false; + + return apply_filters('mec_can_show_booking_module', true, $event); + } + + /** + * Check if we can show countdown module or not + * @author Webnus + * @param object $event + * @return boolean + */ + public function can_show_countdown_module($event) + { + // MEC Settings + $settings = $this->get_settings(); + + // Countdown on single page is disabled + if (!isset($settings['countdown_status']) || !$settings['countdown_status']) return false; + + $date = $event->date; + $start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : date('Y-m-d'); + + $countdown_method = get_post_meta($event->ID, 'mec_countdown_method', true); + if (trim($countdown_method) == '') $countdown_method = 'global'; + + if ($countdown_method == 'global') $ongoing = isset($settings['hide_time_method']) && trim($settings['hide_time_method']) == 'end'; + else $ongoing = $countdown_method == 'end'; + + // The event is Expired/Passed + if ($this->is_past($start_date, date('Y-m-d')) and !$ongoing) return false; + + return true; + } + + /** + * @param null $event + * @return DateTimeZone + */ + public function get_TZO($event = NULL) + { + $timezone = $this->get_timezone($event); + return new DateTimeZone($timezone); + } + + /** + * Get default timezone of WordPress + * @author Webnus + * @param mixed $event + * @return string + */ + public function get_timezone($event = NULL) + { + if (!is_null($event)) { + $event_id = ((is_object($event) and isset($event->ID)) ? $event->ID : $event); + $timezone = get_post_meta($event_id, 'mec_timezone', true); + + if (trim($timezone) != '' and $timezone != 'global') $timezone_string = $timezone; + else $timezone_string = get_option('timezone_string'); + } else $timezone_string = get_option('timezone_string'); + + $gmt_offset = get_option('gmt_offset'); + + if (trim($timezone_string) == '' and trim($gmt_offset)) $timezone_string = $this->get_timezone_by_offset($gmt_offset); + elseif (trim($timezone_string) == '' and trim($gmt_offset) == '0') { + $timezone_string = 'UTC'; + } + + return $timezone_string; + } + + /** + * Get GMT offset based on hours:minutes + * @author Webnus + * @param mixed $event + * @param $date + * @return string + */ + public function get_gmt_offset($event = NULL, $date = NULL) + { + // Timezone + $timezone = $this->get_timezone($event); + + // Convert to Date + if ($date and is_numeric($date)) $date = date('Y-m-d', $date); + elseif (!$date) $date = current_time('Y-m-d'); + + $UTC = new DateTimeZone('UTC'); + $TZ = new DateTimeZone($timezone); + + $gmt_offset_seconds = $TZ->getOffset((new DateTime($date, $UTC))); + $gmt_offset = ($gmt_offset_seconds / HOUR_IN_SECONDS); + + $minutes = $gmt_offset * 60; + $hour_minutes = sprintf("%02d", $minutes % 60); + + // Convert the hour into two digits format + $h = ($minutes - $hour_minutes) / 60; + $hours = sprintf("%02d", abs($h)); + + // Add - sign to the first of hour if it's negative + if ($h < 0) $hours = '-' . $hours; + + return (substr($hours, 0, 1) == '-' ? '' : '+') . $hours . ':' . (((int) $hour_minutes < 0) ? abs($hour_minutes) : $hour_minutes); + } + + /** + * Get GMT offset based on seconds + * @author Webnus + * @param $date + * @param mixed $event + * @return string + */ + public function get_gmt_offset_seconds($date = NULL, $event = NULL) + { + if ($date) { + $timezone = new DateTimeZone($this->get_timezone($event)); + + // Convert to Date + if (is_numeric($date)) $date = date('Y-m-d H:i:s', $date); + + $target = new DateTime($date, $timezone); + return $timezone->getOffset($target); + } else { + $gmt_offset = get_option('gmt_offset'); + $seconds = $gmt_offset * HOUR_IN_SECONDS; + + return (substr($gmt_offset, 0, 1) == '-' ? '' : '+') . $seconds; + } + } + + public function get_timezone_by_offset($offset) + { + $seconds = $offset * 3600; + + $timezone = timezone_name_from_abbr('', $seconds, 0); + if ($timezone === false) { + $timezones = array( + '-12' => 'Pacific/Auckland', + '-11.5' => 'Pacific/Auckland', // Approx + '-11' => 'Pacific/Apia', + '-10.5' => 'Pacific/Apia', // Approx + '-10' => 'Pacific/Honolulu', + '-9.5' => 'Pacific/Honolulu', // Approx + '-9' => 'America/Anchorage', + '-8.5' => 'America/Anchorage', // Approx + '-8' => 'America/Los_Angeles', + '-7.5' => 'America/Los_Angeles', // Approx + '-7' => 'America/Denver', + '-6.5' => 'America/Denver', // Approx + '-6' => 'America/Chicago', + '-5.5' => 'America/Chicago', // Approx + '-5' => 'America/New_York', + '-4.5' => 'America/New_York', // Approx + '-4' => 'America/Halifax', + '-3.5' => 'America/Halifax', // Approx + '-3' => 'America/Sao_Paulo', + '-2.5' => 'America/Sao_Paulo', // Approx + '-2' => 'America/Sao_Paulo', + '-1.5' => 'Atlantic/Azores', // Approx + '-1' => 'Atlantic/Azores', + '-0.5' => 'UTC', // Approx + '0' => 'UTC', + '0.5' => 'UTC', // Approx + '1' => 'Europe/Paris', + '1.5' => 'Europe/Paris', // Approx + '2' => 'Europe/Helsinki', + '2.5' => 'Europe/Helsinki', // Approx + '3' => 'Europe/Moscow', + '3.5' => 'Europe/Moscow', // Approx + '4' => 'Asia/Dubai', + '4.5' => 'Asia/Tehran', + '5' => 'Asia/Karachi', + '5.5' => 'Asia/Kolkata', + '5.75' => 'Asia/Katmandu', + '6' => 'Asia/Yekaterinburg', + '6.5' => 'Asia/Yekaterinburg', // Approx + '7' => 'Asia/Krasnoyarsk', + '7.5' => 'Asia/Krasnoyarsk', // Approx + '8' => 'Asia/Shanghai', + '8.5' => 'Asia/Shanghai', // Approx + '8.75' => 'Asia/Tokyo', // Approx + '9' => 'Asia/Tokyo', + '9.5' => 'Asia/Tokyo', // Approx + '10' => 'Australia/Melbourne', + '10.5' => 'Australia/Adelaide', + '11' => 'Australia/Melbourne', // Approx + '11.5' => 'Pacific/Auckland', // Approx + '12' => 'Pacific/Auckland', + '12.75' => 'Pacific/Apia', // Approx + '13' => 'Pacific/Apia', + '13.75' => 'Pacific/Honolulu', // Approx + '14' => 'Pacific/Honolulu', + ); + + $timezone = isset($timezones[$offset]) ? $timezones[$offset] : NULL; + } + + return $timezone; + } + + /** + * Get status of Google recaptcha + * @author Webnus + * @deprecated + * @param string $section + * @return boolean + */ + public function get_recaptcha_status($section = '') + { + return $this->getCaptcha()->status($section); + } + + /** + * Get re-captcha verification from Google servers + * @author Webnus + * @deprecated + * @param string $remote_ip + * @param string $response + * @return boolean + */ + public function get_recaptcha_response($response, $remote_ip = NULL) + { + return $this->getCaptcha()->is_valid(); + } + + /** + * Get current language of WordPress + * @author Webnus + * @return string + */ + public function get_current_language() + { + return apply_filters('plugin_locale', get_locale(), 'modern-events-calendar-lite'); + } + + /** + * Write to a log file + * @author Webnus + * @param string|array $log_msg + * @param string $path + */ + public function debug_log($log_msg, $path = '') + { + if (trim($path) == '') $path = MEC_ABSPATH . 'log.txt'; + if (is_array($log_msg) or is_object($log_msg)) $log_msg = print_r($log_msg, true); + + $log_msg .= "\n" . '========' . "\n"; + + $fh = fopen($path, 'a'); + fwrite($fh, $log_msg); + } + + /** + * Filter Skin parameters to add taxonomy, etc. filters that come from WordPress Query + * This used for taxonomy archive pages etc. that are handled by WordPress itself + * @author Webnus + * @param array $atts + * @return array + */ + public function add_search_filters($atts = array()) + { + // Taxonomy Archive Page + if (is_tax()) { + $query = get_queried_object(); + $term_id = $query->term_id; + + if (!isset($atts['category'])) $atts['category'] = ''; + + $atts['category'] = trim(trim($atts['category'], ', ') . ',' . $term_id, ', '); + } + + return $atts; + } + + /** + * Filter TinyMce Buttons + * @author Webnus + * @param array $buttons + * @return array + */ + public function add_mce_buttons($buttons) + { + array_push($buttons, 'mec_mce_buttons'); + return $buttons; + } + + /** + * Filter TinyMce plugins + * @author Webnus + * @param array $plugins + * @return array + */ + public function add_mce_external_plugins($plugins) + { + $plugins['mec_mce_buttons'] = $this->asset('js/mec-external.js'); + return $plugins; + } + + /** + * Return JSON output id and the name of a post type + * @author Webnus + * @param string $post_type + * @return string JSON + */ + public function mce_get_shortcode_list($post_type = 'mec_calendars') + { + $shortcodes = []; + $shortcodes['mce_title'] = esc_html__('M.E. Calender', 'modern-events-calendar-lite'); + $shortcodes['shortcodes'] = []; + + if (post_type_exists($post_type)) { + $shortcodes_list = get_posts(array( + 'post_type' => $post_type, + 'post_status' => 'publish', + 'posts_per_page' => -1, + 'order' => 'DESC' + )); + + if (count($shortcodes_list)) { + foreach ($shortcodes_list as $shortcode) { + $shortcode_item = []; + $shortcode_item['ID'] = $shortcode->ID; + + // PostName + $shortcode_item['PN'] = $shortcode->post_name; + array_push($shortcodes['shortcodes'], $shortcode_item); + } + } + } + + return json_encode($shortcodes); + } + + /** + * Return date_diff + * @author Webnus + * @param string $start_date + * @param string $end_date + * @return object + */ + public function date_diff($start_date, $end_date) + { + if (version_compare(PHP_VERSION, '5.3.0', '>=')) return date_diff(date_create($start_date), date_create($end_date)); + else { + $start = new DateTime($start_date); + $end = new DateTime($end_date); + $days = round(($end->format('U') - $start->format('U')) / (60 * 60 * 24)); + + $interval = new stdClass(); + $interval->days = abs($days); + $interval->invert = ($days >= 0 ? 0 : 1); + + return $interval; + } + } + + /** + * Convert a certain time into seconds (Hours should be in 24 hours format) + * @author Webnus + * @param int $hours + * @param int $minutes + * @param int $seconds + * @return int + */ + public function time_to_seconds($hours, $minutes = 0, $seconds = 0) + { + return (((int) $hours * 3600) + ((int) $minutes * 60) + (int) $seconds); + } + + /** + * Convert a 12-hour format hour to a 24-hour format hour + * @author Webnus + * @param int $hour + * @param string $ampm + * @param string $type + * @return int + */ + public function to_24hours($hour, $ampm = 'PM', $type = 'end') + { + // Time is already in 24-hour format + if (is_null($ampm)) return $hour; + + $ampm = strtoupper($ampm); + + if ($ampm == 'AM' and $hour < 12) return $hour; + elseif ($ampm == 'AM' and $hour == 12 and $type === 'end') return 24; + elseif ($ampm == 'AM' and $hour == 12 and $type === 'start') return 0; + elseif ($ampm == 'PM' and $hour < 12) return ((int) $hour) + 12; + elseif ($ampm == 'PM' and $hour == 12) return 12; + elseif ($hour > 12) return $hour; + } + + /** + * Get rendered events based on a certain criteria + * @author Webnus + * @param array $args + * @return array + */ + public function get_rendered_events($args = array()) + { + $events = []; + $sorted = []; + + // Parse the args + $args = wp_parse_args($args, array( + 'post_type' => $this->get_main_post_type(), + 'posts_per_page' => '-1', + 'post_status' => 'publish' + )); + + // The Query + $query = new WP_Query($args); + + if ($query->have_posts()) { + // MEC Render Library + $render = $this->getRender(); + + // The Loop + while ($query->have_posts()) { + $query->the_post(); + + $event_id = get_the_ID(); + $rendered = $render->data($event_id); + + $data = new stdClass(); + $data->ID = $event_id; + $data->data = $rendered; + $data->dates = $render->dates($event_id, $rendered, 6); + $data->date = isset($data->dates[0]) ? $data->dates[0] : []; + + // Caclculate event start time + $event_start_time = strtotime($data->date['start']['date']) + $rendered->meta['mec_start_day_seconds']; + + // Add the event into the to be sorted array + if (!isset($sorted[$event_start_time])) $sorted[$event_start_time] = []; + $sorted[$event_start_time][] = $data; + } + + ksort($sorted, SORT_NUMERIC); + } + + // Add sorted events to the results + foreach ($sorted as $sorted_events) { + if (!is_array($sorted_events)) continue; + foreach ($sorted_events as $sorted_event) $events[$sorted_event->ID] = $sorted_event; + } + + // Restore original Post Data + wp_reset_postdata(); + + return $events; + } + + /** + * Duplicate an event + * @author Webnus + * @param int $post_id + * @return boolean|int + */ + public function duplicate($post_id) + { + $post = get_post($post_id); + + // Post is not exists + if (!$post) return false; + + // Duplicate Post + $new_post_id = $this->duplicate_post($post_id); + + // MEC DB Library + $db = $this->getDB(); + + // Duplicate MEC record + $mec_data = $db->select("SELECT * FROM `#__mec_events` WHERE `post_id`='$post_id'", 'loadAssoc'); + + $q1 = ""; + $q2 = ""; + foreach ($mec_data as $key => $value) { + if (in_array($key, array('id', 'post_id'))) continue; + + $q1 .= "`$key`,"; + $q2 .= "'$value',"; + } + + $db->q("INSERT INTO `#__mec_events` (`post_id`," . trim($q1, ', ') . ") VALUES ('$new_post_id'," . trim($q2, ', ') . ")"); + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($new_post_id); + + return $new_post_id; + } + + /** + * Duplicate a post + * @author Webnus + * @param int $post_id + * @return boolean|int + */ + public function duplicate_post($post_id) + { + $post = get_post($post_id); + + // Post is not exists + if (!$post) return false; + + // MEC DB Library + $db = $this->getDB(); + + // New post data array + $args = array( + 'comment_status' => $post->comment_status, + 'ping_status' => $post->ping_status, + 'post_author' => $post->post_author, + 'post_content' => $post->post_content, + 'post_excerpt' => $post->post_excerpt, + 'post_name' => sanitize_title($post->post_name . '-' . mt_rand(100, 999)), + 'post_parent' => $post->post_parent, + 'post_password' => $post->post_password, + 'post_status' => 'draft', + 'post_title' => sprintf(esc_html__('Copy of %s', 'modern-events-calendar-lite'), $post->post_title), + 'post_type' => $post->post_type, + 'to_ping' => $post->to_ping, + 'menu_order' => $post->menu_order + ); + + // insert the new post + $new_post_id = wp_insert_post($args); + + // get all current post terms ad set them to the new post draft + $taxonomies = get_object_taxonomies($post->post_type); + foreach ($taxonomies as $taxonomy) { + $post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs')); + wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); + } + + // duplicate all post meta + $post_metas = $db->select("SELECT `meta_key`, `meta_value` FROM `#__postmeta` WHERE `post_id`='$post_id'", 'loadObjectList'); + if (count($post_metas)) { + $wpdb = $db->get_DBO(); + $sql_query = "INSERT INTO `#__postmeta` (post_id, meta_key, meta_value) "; + + $sql_query_sel = []; + foreach ($post_metas as $meta_info) { + $meta_key = esc_sql($meta_info->meta_key); + $meta_value = $meta_info->meta_value; + + $sql_query_sel[] = $wpdb->prepare("SELECT $new_post_id, %s, %s", $meta_key, $meta_value); + } + + $sql_query .= implode(" UNION ALL ", $sql_query_sel); + $db->q($sql_query); + } + + return $new_post_id; + } + + /** + * Returns start/end date label + * @author Webnus + * @param array $start + * @param array $end + * @param string $format + * @param string $separator + * @param boolean $minify + * @param integer $allday + * @param object $event + * @param boolean $omit_end_date + * @return string + */ + public function date_label($start, $end, $format, $separator = ' - ', $minify = true, $allday = 0, $event = NULL, $omit_end_date = false) + { + $start_datetime = $start['date']; + $end_datetime = $end['date']; + + $start_parsed = date_parse($start_datetime); + $end_parsed = date_parse($end_datetime); + + if (isset($start['hour']) and ($start_parsed === false or (is_array($start_parsed) and isset($start_parsed['hour']) and $start_parsed['hour'] === false))) { + $s_hour = $start['hour']; + if (strtoupper($start['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_datetime .= ' ' . sprintf("%02d", $s_hour) . ':' . sprintf("%02d", $start['minutes']) . ' ' . $start['ampm']; + } + + if (isset($end['hour']) and ($end_parsed === false or (is_array($end_parsed) and isset($end_parsed['hour']) and $end_parsed['hour'] === false))) { + $e_hour = $end['hour']; + if (strtoupper($end['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $end_datetime .= ' ' . sprintf("%02d", $e_hour) . ':' . sprintf("%02d", $end['minutes']) . ' ' . $end['ampm']; + } + + $start_timestamp = strtotime($start_datetime); + $end_timestamp = strtotime($end_datetime); + + $timezone_GMT = new DateTimeZone("GMT"); + $timezone_event = new DateTimeZone($this->get_timezone($event)); + + $dt_now = new DateTime("now", $timezone_GMT); + $dt_start = new DateTime($start_datetime, $timezone_GMT); + $dt_end = new DateTime($end_datetime, $timezone_GMT); + + $offset_now = $timezone_event->getOffset($dt_now); + $offset_start = $timezone_event->getOffset($dt_start); + $offset_end = $timezone_event->getOffset($dt_end); + + if ($offset_now != $offset_start and !function_exists('wp_date')) { + $diff = $offset_start - $offset_now; + if ($diff > 0) $start_timestamp += $diff; + } + + if ($offset_now != $offset_end and !function_exists('wp_date')) { + $diff = $offset_end - $offset_now; + if ($diff > 0) $end_timestamp += $diff; + } + + // Event is All Day so remove the time formats + if ($allday) { + foreach (array('a', 'A', 'B', 'g', 'G', 'h', 'H', 'i', 's', 'u', 'v') as $f) $format = str_replace($f, '', $format); + $format = trim($format, ': '); + } + + $start_timestamp = apply_filters('mec_date_label_start_timestamp', $start_timestamp, $event); + $end_timestamp = apply_filters('mec_date_label_end_timestamp', $end_timestamp, $event); + + if ($start_timestamp >= $end_timestamp) { + $format = stripslashes($format); + + return '' . esc_html($this->date_i18n($format, $start_timestamp, $event)) . ''; + } else { + $start_date = $this->date_i18n($format, $start_timestamp, $event); + $end_date = $this->date_i18n($format, $end_timestamp, $event); + + if ($start_date == $end_date) return '' . esc_html($start_date) . ''; + else { + $start_m = date('m', $start_timestamp); + $end_m = date('m', $end_timestamp); + + $start_y = date('Y', $start_timestamp); + $end_y = date('Y', $end_timestamp); + + // Same Month but Different Days + if ($minify and $start_m == $end_m and $start_y == $end_y and date('d', $start_timestamp) != date('d', $end_timestamp)) { + $month_format = 'F'; + if (strpos($format, 'm') !== false) $month_format = 'm'; + elseif (strpos($format, 'M') !== false) $month_format = 'M'; + elseif (strpos($format, 'n') !== false) $month_format = 'n'; + + $year_format = ''; + if (strpos($format, 'Y') !== false) $year_format = 'Y'; + elseif (strpos($format, 'y') !== false) $year_format = 'y'; + + $start_m = $this->date_i18n($month_format, $start_timestamp, $event); + $start_y = (trim($year_format) ? $this->date_i18n($year_format, $start_timestamp, $event) : ''); + $end_y = (trim($year_format) ? $this->date_i18n($year_format, $end_timestamp, $event) : ''); + + $chars = str_split($format); + + $date_label = ''; + foreach ($chars as $char) { + if (in_array($char, array('d', 'D', 'j', 'l', 'N', 'S', 'w', 'z'))) { + $dot = (strpos($format, $char . '.') !== false); + $date_label .= $this->date_i18n($char, $start_timestamp, $event) . ($dot ? '.' : '') . ' - ' . $this->date_i18n($char, $end_timestamp, $event); + } elseif (in_array($char, array('F', 'm', 'M', 'n'))) { + $date_label .= $start_m; + } elseif (in_array($char, array('Y', 'y', 'o'))) { + $date_label .= ($start_y === $end_y ? $start_y : $start_y . ' - ' . $end_y); + } elseif (in_array($char, array('e', 'I', 'O', 'P', 'p', 'T', 'Z'))) { + $date_label .= $this->date_i18n($char, $start_timestamp, $event); + } else $date_label .= $char; + } + + return '' . esc_html($date_label) . ''; + } else { + $end_format = $format; + if ($omit_end_date && date('Ymd', $start_timestamp) === date('Ymd', $end_timestamp)) { + $end_format = get_option('time_format'); + } + + return apply_filters( + 'mec_date_label_start_end_html', + '' . esc_html($this->date_i18n($format, $start_timestamp, $event)) . '' . esc_html($separator . $this->date_i18n($end_format, $end_timestamp, $event)) . '', + $start_timestamp, + $end_timestamp, + $event + ); + } + } + } + } + + public function dateify($event, $format, $separator = ' - ') + { + // Settings + $settings = $this->get_settings(); + + $time = sprintf("%02d", $event->data->meta['mec_end_time_hour']) . ':'; + $time .= sprintf("%02d", $event->data->meta['mec_end_time_minutes']) . ' '; + $time .= $event->data->meta['mec_end_time_ampm']; + + $start_date = $event->date['start']['date']; + $end_date = $event->date['end']['date']; + + $start_timestamp = strtotime($event->date['start']['date']); + $end_timestamp = strtotime($event->date['end']['date']); + + // Midnight Hour + $midnight_hour = (isset($settings['midnight_hour']) and $settings['midnight_hour']) ? $settings['midnight_hour'] : 0; + $midnight = $end_timestamp + (3600 * $midnight_hour); + + // End Date is before Midnight + if ($start_timestamp < $end_timestamp and $midnight >= strtotime($end_date . ' ' . $time)) $end_date = date('Y-m-d', ($end_timestamp - 86400)); + + return $this->date_label(array('date' => $start_date), array('date' => $end_date), $format, $separator, true, 0, $event); + } + + public function date_i18n($format, $time = NULL, $event = NULL) + { + // Force to numeric + if (!is_numeric($time) && $time) $time = strtotime($time); + + if ($event and function_exists('wp_date')) { + $TZO = ((isset($event->TZO) and $event->TZO and ($event->TZO instanceof DateTimeZone)) ? $event->TZO : $this->get_TZO($event)); + + // Force to UTC + $time = $time - $TZO->getOffset(new DateTime(date('Y-m-d H:i:s', $time))); + + return wp_date($format, $time, $TZO); + } else { + $timezone_GMT = new DateTimeZone("GMT"); + $timezone_site = new DateTimeZone($this->get_timezone()); + + $dt_now = new DateTime("now", $timezone_GMT); + $dt_time = new DateTime(date('Y-m-d', $time), $timezone_GMT); + + $offset_now = $timezone_site->getOffset($dt_now); + $offset_time = $timezone_site->getOffset($dt_time); + + if ($offset_now != $offset_time and !function_exists('wp_date')) { + $diff = $offset_time - $offset_now; + if ($diff > 0) $time += $diff; + } + + return date_i18n($format, $time); + } + } + + /** + * Returns start/end time labels + * @author Webnus + * @param string $start + * @param string $end + * @param array $args + * @return string + */ + public function display_time($start = '', $end = '', $args = array()) + { + if (!trim($start)) return ''; + + $class = isset($args['class']) ? esc_attr($args['class']) : 'mec-time-details'; + $separator = isset($args['separator']) ? esc_attr($args['separator']) : '-'; + $display_svg = isset($args['display_svg']) && $args['display_svg']; + $icon = isset($args['icon']) && trim($args['icon']) ? $args['icon'] : ''; + + $return = '
    ' . ($display_svg ? $icon : ''); + $return .= '' . esc_html($start) . ''; + if (trim($end)) $return .= ' ' . $separator . ' ' . esc_html($end) . ''; + $return .= '
    '; + + return $return; + } + + /** + * Returns end date of an event based on start date + * @author Webnus + * @param string $date + * @param object $event + * @return string + */ + public function get_end_date($date, $event) + { + $start_date = $event->meta['mec_date']['start'] ?? []; + $end_date = $event->meta['mec_date']['end'] ?? []; + + // Event Past + $past = $this->is_past($event->mec->end, $date); + + // Normal event + if (isset($event->mec->repeat) and $event->mec->repeat == '0') { + return $end_date['date'] ?? $date; + } + // Custom Days + elseif ($custom_date_db = $this->get_end_date_from_db($date, $event)) { + return $custom_date_db; + } + // Past Event + elseif ($past) { + return $end_date['date'] ?? $date; + } else { + $event_period = ((isset($start_date['date']) and isset($end_date['date'])) ? $this->date_diff($start_date['date'], $end_date['date']) : false); + $event_period_days = $event_period ? $event_period->days : 0; + + /** + * Multiple Day Event + * Check to see if today is between start day and end day. + * For example start day is 5 and end day is 15, but we're in 9th so only 6 days remained till ending the event not 10 days. + */ + if ($event_period_days) { + $start_day = date('j', strtotime($start_date['date'])); + $day = date('j', strtotime($date)); + + if ($day >= $start_day) $passed_days = $day - $start_day; + else $passed_days = ($day + date('t', strtotime($start_date['date']))) - $start_day; + + if ($passed_days <= $event_period_days) $event_period_days = $event_period_days - $passed_days; + } + + return date('Y-m-d', strtotime('+' . $event_period_days . ' Days', strtotime($date))); + } + } + + public function get_end_date_from_db($date, $event) + { + // Cache + $cache = $this->getCache(); + + return $cache->rememberOnce($event->ID . ':' . $date, function () use ($event, $date) { + // DB + $db = $this->getDB(); + + return $db->select("SELECT `dend` FROM `#__mec_dates` WHERE `post_id`='" . $event->ID . "' AND `dstart`<='" . $date . "' AND `dend`>='" . $date . "' ORDER BY `id` DESC LIMIT 1", 'loadResult'); + }); + } + + /** + * Get Archive Status of MEC + * @author Webnus + * @return int + */ + public function get_archive_status() + { + $settings = $this->get_settings(); + + $status = isset($settings['archive_status']) ? $settings['archive_status'] : '1'; + return apply_filters('mec_archive_status', $status); + } + + /** + * Check to see if a table exists or not + * @author Webnus + * @param string $table + * @return boolean + */ + public function table_exists($table = 'mec_events') + { + // MEC DB library + $db = $this->getDB(); + + return $db->q("SHOW TABLES LIKE '#__$table'"); + } + + /** + * Create MEC Tables + * @author Webnus + * @return boolean + */ + public function create_mec_tables() + { + // MEC Events table already exists + if ($this->table_exists('mec_events') and $this->table_exists('mec_dates') and $this->table_exists('mec_occurrences') and $this->table_exists('mec_users') and $this->table_exists('mec_bookings') and $this->table_exists('mec_booking_attendees')) return true; + + // MEC File library + $file = $this->getFile(); + + // MEC DB library + $db = $this->getDB(); + + // Run Queries + $query_file = MEC_ABSPATH . 'assets' . DS . 'sql' . DS . 'tables.sql'; + if ($file->exists($query_file)) { + $queries = $file->read($query_file); + $sqls = explode(';', $queries); + + foreach ($sqls as $sql) { + $sql = trim($sql, '; '); + if (trim($sql) == '') continue; + + $sql .= ';'; + + try { + $db->q($sql); + } catch (Exception $e) { + } + } + } + + return true; + } + + /** + * Return HTML email type + * @author Webnus + * @param string $content_type + * @return string + */ + public function html_email_type($content_type) + { + return 'text/html'; + } + + public function get_next_upcoming_event() + { + MEC::import('app.skins.list'); + + // Get list skin + $list = new MEC_skin_list(); + + // Attributes + $atts = [ + 'show_only_past_events' => 0, + 'show_past_events' => 0, + 'start_date_type' => 'today', + 'sk-options' => [ + 'list' => ['limit' => 1] + ], + ]; + + // Initialize the skin + $list->initialize($atts); + + // General Settings + $settings = $this->get_settings(); + + // Disable Ongoing Events + $disable_for_ongoing = (isset($settings['countdown_disable_for_ongoing_events']) and $settings['countdown_disable_for_ongoing_events']); + if ($disable_for_ongoing) $list->hide_time_method = 'start'; + + // Fetch the events + $list->fetch(); + + $events = $list->events; + $key = key($events); + + return (isset($events[$key][0]) ? $events[$key][0] : array()); + } + + /** + * Return a web page + * @author Webnus + * @param string $url + * @param int $timeout + * @return string + */ + public function get_web_page($url, $timeout = 20) + { + $result = false; + + // Doing WordPress Remote + if (function_exists('wp_remote_get')) { + $result = wp_remote_retrieve_body(wp_remote_get($url, array( + 'body' => null, + 'timeout' => $timeout, + 'redirection' => 5, + ))); + } + + // Doing FGC + if ($result === false) { + $http = []; + $result = @file_get_contents($url, false, stream_context_create(array('http' => $http))); + } + + return $result; + } + + public function save_events($events = array()) + { + $ids = []; + + foreach ($events as $event) $ids[] = $this->save_event($event, (isset($event['ID']) ? $event['ID'] : NULL)); + return $ids; + } + + public function save_event($event = array(), $post_id = NULL) + { + $post = array( + 'post_title' => $event['title'], + 'post_content' => $event['content'] ?? '', + 'post_type' => $this->get_main_post_type(), + 'post_status' => $event['status'] ?? 'publish' + ); + + // Update previously inserted post + if (!is_null($post_id)) $post['ID'] = $post_id; + + // Post Author + if (isset($event['author']) and $event['author'] and is_numeric($event['author'])) $post['post_author'] = $event['author']; + + $post_id = wp_insert_post($post); + + update_post_meta($post_id, 'mec_location_id', ($event['location_id'] ?? 1)); + update_post_meta($post_id, 'mec_dont_show_map', 0); + update_post_meta($post_id, 'mec_organizer_id', ($event['organizer_id'] ?? 1)); + + $start_time_hour = ($event['start_time_hour'] ?? 8); + $start_time_minutes = ($event['start_time_minutes'] ?? 0); + $start_time_ampm = ($event['start_time_ampm'] ?? 'AM'); + + $end_time_hour = ($event['end_time_hour'] ?? 6); + $end_time_minutes = ($event['end_time_minutes'] ?? 0); + $end_time_ampm = ($event['end_time_ampm'] ?? 'PM'); + + $allday = ($event['allday'] ?? 0); + $time_comment = ($event['time_comment'] ?? ''); + $hide_time = ((isset($event['date']) and isset($event['date']['hide_time'])) ? $event['date']['hide_time'] : 0); + $hide_end_time = ((isset($event['date']) and isset($event['date']['hide_end_time'])) ? $event['date']['hide_end_time'] : 0); + + $day_start_seconds = $this->time_to_seconds($this->to_24hours($start_time_hour, $start_time_ampm), $start_time_minutes); + $day_end_seconds = $this->time_to_seconds($this->to_24hours($end_time_hour, $end_time_ampm), $end_time_minutes); + + update_post_meta($post_id, 'mec_allday', $allday); + update_post_meta($post_id, 'mec_hide_time', $hide_time); + update_post_meta($post_id, 'mec_hide_end_time', $hide_end_time); + + update_post_meta($post_id, 'mec_start_date', $event['start']); + update_post_meta($post_id, 'mec_start_time_hour', $start_time_hour); + update_post_meta($post_id, 'mec_start_time_minutes', $start_time_minutes); + update_post_meta($post_id, 'mec_start_time_ampm', $start_time_ampm); + update_post_meta($post_id, 'mec_start_day_seconds', $day_start_seconds); + + update_post_meta($post_id, 'mec_end_date', $event['end']); + update_post_meta($post_id, 'mec_end_time_hour', $end_time_hour); + update_post_meta($post_id, 'mec_end_time_minutes', $end_time_minutes); + update_post_meta($post_id, 'mec_end_time_ampm', $end_time_ampm); + update_post_meta($post_id, 'mec_end_day_seconds', $day_end_seconds); + + update_post_meta($post_id, 'mec_repeat_status', $event['repeat_status']); + update_post_meta($post_id, 'mec_repeat_type', $event['repeat_type']); + update_post_meta($post_id, 'mec_repeat_interval', $event['interval']); + + update_post_meta($post_id, 'mec_certain_weekdays', explode(',', trim(($event['weekdays'] ?? ''), ', '))); + + $date = array( + 'start' => array('date' => $event['start'], 'hour' => $start_time_hour, 'minutes' => $start_time_minutes, 'ampm' => $start_time_ampm), + 'end' => array('date' => $event['end'], 'hour' => $end_time_hour, 'minutes' => $end_time_minutes, 'ampm' => $end_time_ampm), + 'repeat' => ((isset($event['date']) and isset($event['date']['repeat']) and is_array($event['date']['repeat'])) ? $event['date']['repeat'] : array()), + 'allday' => $allday, + 'hide_time' => ((isset($event['date']) and isset($event['date']['hide_time'])) ? $event['date']['hide_time'] : 0), + 'hide_end_time' => ((isset($event['date']) and isset($event['date']['hide_end_time'])) ? $event['date']['hide_end_time'] : 0), + 'comment' => $time_comment, + ); + + // Finish Date + $finish_date = ($event['finish'] ?? ''); + + // End after count + $repeat_count = ($event['repeat_count'] ?? NULL); + if ($repeat_count and is_numeric($repeat_count)) { + $repeat_count = ($repeat_count - 1); + update_post_meta($post_id, 'mec_repeat_end_at_occurrences', $repeat_count); + update_post_meta($post_id, 'mec_repeat_end', 'occurrences'); + + $date['repeat']['end'] = 'occurrences'; + $date['repeat']['end_at_occurrences'] = $repeat_count; + + $plus_date = ''; + if ($event['repeat_type'] == 'daily') { + $plus_date = '+' . $repeat_count * $event['interval'] . ' Days'; + } elseif ($event['repeat_type'] == 'weekly') { + $plus_date = '+' . $repeat_count * ($event['interval']) . ' Days'; + } elseif ($event['repeat_type'] == 'monthly') { + $plus_date = '+' . $repeat_count * $event['interval'] . ' Months'; + } elseif ($event['repeat_type'] == 'yearly') { + $plus_date = '+' . $repeat_count * $event['interval'] . ' Years'; + } + + if ($plus_date) $finish_date = date('Y-m-d', strtotime($plus_date, strtotime($event['end']))); + } + + if ($finish_date) { + update_post_meta($post_id, 'mec_repeat_end_at_date', $finish_date); + update_post_meta($post_id, 'mec_repeat_end', ($repeat_count ? 'occurrences' : 'date')); + + $date['repeat']['end'] = ($repeat_count ? 'occurrences' : 'date'); + $date['repeat']['end_at_date'] = $finish_date; + } + + update_post_meta($post_id, 'mec_date', $date); + + // Not In Days + $not_in_days = ($event['not_in_days'] ?? ''); + if ($not_in_days) update_post_meta($post_id, 'mec_not_in_days', $not_in_days); + + // Creating $mec array for inserting in mec_events table + $mec = array('post_id' => $post_id, 'start' => $event['start'], 'repeat' => $event['repeat_status'], 'rinterval' => $event['interval'], 'time_start' => $day_start_seconds, 'time_end' => $day_end_seconds); + + // Add parameters to the $mec + $mec['end'] = (trim($finish_date) ? $finish_date : '0000-00-00'); + $mec['year'] = $event['year'] ?? NULL; + $mec['month'] = $event['month'] ?? NULL; + $mec['day'] = $event['day'] ?? NULL; + $mec['week'] = $event['week'] ?? NULL; + $mec['weekday'] = $event['weekday'] ?? NULL; + $mec['weekdays'] = $event['weekdays'] ?? NULL; + $mec['days'] = $event['days'] ?? ''; + $mec['not_in_days'] = $not_in_days; + + // MEC DB Library + $db = $this->getDB(); + + // Update MEC Events Table + $mec_event_id = $db->select("SELECT `id` FROM `#__mec_events` WHERE `post_id`='$post_id'", 'loadResult'); + + if (!$mec_event_id) { + $q1 = ""; + $q2 = ""; + + foreach ($mec as $key => $value) { + $q1 .= "`$key`,"; + + if (is_null($value)) $q2 .= "NULL,"; + else $q2 .= "'$value',"; + } + + $db->q("INSERT INTO `#__mec_events` (" . trim($q1, ', ') . ") VALUES (" . trim($q2, ', ') . ")", 'INSERT'); + } else { + $q = ""; + + foreach ($mec as $key => $value) { + if (is_null($value)) $q .= "`$key`=NULL,"; + else $q .= "`$key`='$value',"; + } + + $db->q("UPDATE `#__mec_events` SET " . trim($q, ', ') . " WHERE `id`='$mec_event_id'"); + } + + if (isset($event['meta']) and is_array($event['meta'])) foreach ($event['meta'] as $key => $value) update_post_meta($post_id, $key, $value); + + // Update Schedule + $schedule = $this->getSchedule(); + $schedule->reschedule($post_id, $schedule->get_reschedule_maximum($event['repeat_type'])); + + return $post_id; + } + + public function save_category($category = array()) + { + $name = $category['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_category'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_category'); + + // An error occurred + if (is_wp_error($term)) return false; + + $category_id = $term['term_id']; + if (!$category_id) return false; + + return $category_id; + } + + public function save_tag($tag = array()) + { + $name = $tag['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, apply_filters('mec_taxonomy_tag', '')); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, apply_filters('mec_taxonomy_tag', '')); + + // An error occurred + if (is_wp_error($term)) return false; + + $tag_id = $term['term_id']; + if (!$tag_id) return false; + + return $tag_id; + } + + public function save_label($label = array()) + { + $name = $label['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_label'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_label'); + + // An error occurred + if (is_wp_error($term)) return false; + + $label_id = $term['term_id']; + if (!$label_id) return false; + + $color = $label['color'] ?? ''; + update_term_meta($label_id, 'color', $color); + + return $label_id; + } + + public function save_organizer($organizer = array()) + { + $name = $organizer['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_organizer'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_organizer'); + + // An error occurred + if (is_wp_error($term)) return false; + + $organizer_id = $term['term_id']; + if (!$organizer_id) return false; + + if (isset($organizer['tel']) && strpos($organizer['tel'], '@') !== false) { + // Just for EventON + $tel = ''; + $email = trim($organizer['tel']) ? $organizer['tel'] : ''; + } else { + $tel = (isset($organizer['tel']) and trim($organizer['tel'])) ? $organizer['tel'] : ''; + $email = (isset($organizer['email']) and trim($organizer['email'])) ? $organizer['email'] : ''; + } + + $url = (isset($organizer['url']) and trim($organizer['url'])) ? $organizer['url'] : ''; + $thumbnail = $organizer['thumbnail'] ?? ''; + + update_term_meta($organizer_id, 'tel', $tel); + update_term_meta($organizer_id, 'email', $email); + update_term_meta($organizer_id, 'url', $url); + if (trim($thumbnail)) update_term_meta($organizer_id, 'thumbnail', $thumbnail); + + return $organizer_id; + } + + public function save_location($location = array()) + { + $name = $location['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_location'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_location'); + + // An error occurred + if (is_wp_error($term)) return false; + + $location_id = $term['term_id']; + if (!$location_id) return false; + + $latitude = (isset($location['latitude']) and trim($location['latitude'])) ? $location['latitude'] : 0; + $longitude = (isset($location['longitude']) and trim($location['longitude'])) ? $location['longitude'] : 0; + $address = $location['address'] ?? ''; + $thumbnail = $location['thumbnail'] ?? ''; + $url = $location['url'] ?? ''; + + if (!trim($latitude) or !trim($longitude)) { + $geo_point = $this->get_lat_lng($address); + + $latitude = $geo_point[0]; + $longitude = $geo_point[1]; + } + + update_term_meta($location_id, 'address', $address); + update_term_meta($location_id, 'latitude', $latitude); + update_term_meta($location_id, 'longitude', $longitude); + update_term_meta($location_id, 'url', $url); + + if (trim($thumbnail)) update_term_meta($location_id, 'thumbnail', $thumbnail); + return $location_id; + } + + public function save_speaker($speaker = array()) + { + $name = $speaker['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_speaker'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_speaker'); + + // An error occurred + if (is_wp_error($term)) return false; + + $speaker_id = $term['term_id']; + if (!$speaker_id) return false; + + $job_title = (isset($speaker['job_title']) and trim($speaker['job_title'])) ? $speaker['job_title'] : ''; + $tel = (isset($speaker['tel']) and trim($speaker['tel'])) ? $speaker['tel'] : ''; + $email = (isset($speaker['email']) and trim($speaker['email'])) ? $speaker['email'] : ''; + $facebook = (isset($speaker['facebook']) and trim($speaker['facebook'])) ? esc_url($speaker['facebook']) : ''; + $twitter = (isset($speaker['twitter']) and trim($speaker['twitter'])) ? esc_url($speaker['twitter']) : ''; + $instagram = (isset($speaker['instagram']) and trim($speaker['instagram'])) ? esc_url($speaker['instagram']) : ''; + $linkedin = (isset($speaker['linkedin']) and trim($speaker['linkedin'])) ? esc_url($speaker['linkedin']) : ''; + $website = (isset($speaker['website']) and trim($speaker['website'])) ? esc_url($speaker['website']) : ''; + $thumbnail = $speaker['thumbnail'] ?? ''; + + update_term_meta($speaker_id, 'job_title', $job_title); + update_term_meta($speaker_id, 'tel', $tel); + update_term_meta($speaker_id, 'email', $email); + update_term_meta($speaker_id, 'facebook', $facebook); + update_term_meta($speaker_id, 'twitter', $twitter); + update_term_meta($speaker_id, 'instagram', $instagram); + update_term_meta($speaker_id, 'linkedin', $linkedin); + update_term_meta($speaker_id, 'website', $website); + if (trim($thumbnail)) update_term_meta($speaker_id, 'thumbnail', $thumbnail); + + return $speaker_id; + } + + public function save_sponsor($sponsor = array()) + { + $name = $sponsor['name'] ?? ''; + if (!trim($name)) return false; + + $term = get_term_by('name', $name, 'mec_sponsor'); + + // Term already exists + if (is_object($term) and isset($term->term_id)) return $term->term_id; + + $term = wp_insert_term($name, 'mec_sponsor'); + + // An error occurred + if (is_wp_error($term)) return false; + + $sponsor_id = $term['term_id']; + if (!$sponsor_id) return false; + + $link = (isset($sponsor['link']) and trim($sponsor['link'])) ? esc_url($sponsor['link']) : ''; + $logo = (isset($sponsor['logo']) and trim($sponsor['logo'])) ? esc_url($sponsor['logo']) : ''; + + update_term_meta($sponsor_id, 'link', $link); + if (trim($logo)) update_term_meta($sponsor_id, 'logo', $logo); + + return $sponsor_id; + } + + /** + * Returns data export array for one event + * @author Webnus + * @param int $event_id + * @return stdClass + */ + public function export_single($event_id) + { + // MEC Render Library + $render = $this->getRender(); + + return $render->data($event_id); + } + + /** + * Converts array to XML string + * @author Webnus + * @param array $data + * @return string + */ + public function xml_convert($data) + { + $main_node = array_keys($data); + + // Creating SimpleXMLElement object + $xml = new SimpleXMLElement('<' . $main_node[0] . '>'); + + // Convert array to xml + $this->array_to_xml($data[$main_node[0]], $xml); + + // Return XML String + return $xml->asXML(); + } + + public function array_to_xml($data, &$xml) + { + foreach ($data as $key => $value) { + if (is_numeric($key)) $key = 'item'; + + if (is_array($value)) { + $subnode = $xml->addChild($key); + $this->array_to_xml($value, $subnode); + } elseif (is_object($value)) { + $subnode = $xml->addChild($key); + $this->array_to_xml($value, $subnode); + } else { + $xml->addChild($key, ($value ? htmlspecialchars($value) : $value)); + } + } + } + + /** + * Returns Weekdays Day Numbers + * @author Webnus + * @return array + */ + public function get_weekdays() + { + $weekdays = array(1, 2, 3, 4, 5); + + // Get weekdays from options + $settings = $this->get_settings(); + if (isset($settings['weekdays']) and is_array($settings['weekdays']) and count($settings['weekdays'])) $weekdays = $settings['weekdays']; + + return apply_filters('mec_weekday_numbers', $weekdays); + } + + /** + * Returns Weekends Day Numbers + * @author Webnus + * @return array + */ + public function get_weekends() + { + $weekends = array(6, 7); + + // Get weekdays from options + $settings = $this->get_settings(); + if (isset($settings['weekends']) and is_array($settings['weekends']) and count($settings['weekends'])) $weekends = $settings['weekends']; + + return apply_filters('mec_weekend_numbers', $weekends); + } + + /** + * Returns Event link with Occurrence Date + * @author Webnus + * @param string|object $event + * @param string $date + * @param boolean $force + * @param array $time + * @return string + */ + public function get_event_date_permalink($event, $date = NULL, $force = false, $time = NULL) + { + // Get MEC Options + $settings = $this->get_settings(); + + if (is_object($event)) { + // Event Permalink + $url = $event->data->permalink; + + // Return same URL if date is not provided + if (is_null($date)) return apply_filters('mec_event_permalink', $url); + + // Single Page Date method is set to next date + if (!$force and (!isset($settings['single_date_method']) or (isset($settings['single_date_method']) and $settings['single_date_method'] == 'next'))) return apply_filters('mec_event_permalink', $url); + + if (is_array($time) and isset($time['start_timestamp'])) $time_str = date('H:i:s', $time['start_timestamp']); + elseif (is_array($time) and isset($time['start_raw'])) $time_str = $time['start_raw']; + elseif (isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['start_timestamp'])) $time_str = date('H:i:s', $event->data->time['start_timestamp']); + elseif (isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['start_raw'])) $time_str = date('H:i:s', strtotime($event->data->time['start_raw'])); + else $time_str = $event->data->time['start_raw']; + + // Timestamp + $timestamp = strtotime($date . ' ' . $time_str); + + // Do not add occurrence when custom link is set + $read_more = (isset($event->data->meta) and isset($event->data->meta['mec_read_more']) and filter_var($event->data->meta['mec_read_more'], FILTER_VALIDATE_URL)) ? $event->data->meta['mec_read_more'] : NULL; + $read_more_occ_url = MEC_feature_occurrences::param($event->ID, $timestamp, 'read_more', $read_more); + + if ($read_more_occ_url and filter_var($read_more_occ_url, FILTER_VALIDATE_URL)) $url = $read_more_occ_url; + if ($read_more_occ_url) return apply_filters('mec_event_permalink', $url); + + // Add Date to the URL + $url = $this->add_qs_var('occurrence', $date, $url); + + $repeat_type = (isset($event->data->meta['mec_repeat_type']) ? $event->data->meta['mec_repeat_type'] : ''); + if ($repeat_type == 'custom_days' and isset($event->data->time) and isset($event->data->time['start_raw'])) { + // Add Time + $url = $this->add_qs_var('time', $timestamp, $url); + } + + return apply_filters('mec_event_permalink', $url); + } else { + // Event Permalink + $url = $event; + + // Return same URL if data is not provided + if (is_null($date)) return apply_filters('mec_event_permalink', $url); + + // Single Page Date method is set to next date + if (!$force and (!isset($settings['single_date_method']) or (isset($settings['single_date_method']) and $settings['single_date_method'] == 'next'))) return apply_filters('mec_event_permalink', $url); + + return apply_filters('mec_event_permalink', $this->add_qs_var('occurrence', $date, $url)); + } + } + + /** + * Register MEC Activity Action Type in BuddeyPress + * @return void + */ + public function bp_register_activity_actions() + { + bp_activity_set_action( + 'mec', + 'booked_event', + esc_html__('Booked an event.', 'modern-events-calendar-lite') + ); + } + + /** + * Add a new activity to BuddyPress when a user book an event + * @param int $book_id + * @return boolean|int + */ + public function bp_add_activity($book_id) + { + // Get MEC Options + $settings = $this->get_settings(); + + // BuddyPress' integration is disabled + if (!isset($settings['bp_status']) || !$settings['bp_status']) return false; + + // BuddyPress add activity is disabled + if (!isset($settings['bp_add_activity']) || !$settings['bp_add_activity']) return false; + + // BuddyPress is not installed or activated + if (!function_exists('bp_activity_add')) return false; + + $verification = get_post_meta($book_id, 'mec_verified', true); + $confirmation = get_post_meta($book_id, 'mec_confirmed', true); + + // Booking is not verified or confirmed + if ($verification != 1 or $confirmation != 1) return false; + + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $booker_id = get_post_field('post_author', $book_id); + + $event_title = get_the_title($event_id); + $event_link = get_the_permalink($event_id); + + $profile_link = bp_core_get_userlink($booker_id); + $bp_activity_id = get_post_meta($book_id, 'mec_bp_activity_id', true); + + $activity_id = bp_activity_add(array( + 'id' => $bp_activity_id, + 'action' => sprintf(esc_html__('%s booked %s event.', 'modern-events-calendar-lite'), $profile_link, '' . esc_html($event_title) . ''), + 'component' => 'mec', + 'type' => 'booked_event', + 'primary_link' => $event_link, + 'user_id' => $booker_id, + 'item_id' => $book_id, + 'secondary_item_id' => $event_id, + )); + + // Set Activity ID + update_post_meta($book_id, 'mec_bp_activity_id', $activity_id); + + return $activity_id; + } + + public function bp_add_profile_menu() + { + // Get MEC Options + $settings = $this->get_settings(); + + // BuddyPress' integration is disabled + if (!isset($settings['bp_status']) or !$settings['bp_status']) return false; + + // BuddyPress' events menus is disabled + if (!isset($settings['bp_profile_menu']) or !$settings['bp_profile_menu']) return false; + + // User is not logged in + if (!is_user_logged_in()) return false; + + global $bp; + + // Loggedin User is not Displayed User + if (!isset($bp->displayed_user) or (isset($bp->displayed_user->id) and get_current_user_id() != $bp->displayed_user->id)) return false; + + bp_core_new_nav_item(array( + 'name' => esc_html__('Events', 'modern-events-calendar-lite'), + 'slug' => 'mec-events', + 'screen_function' => array($this, 'bp_profile_menu_screen'), + 'position' => 30, + 'parent_url' => bp_loggedin_user_domain() . '/mec-events/', + 'parent_slug' => $bp->profile->slug, + 'default_subnav_slug' => 'events' + )); + + return true; + } + + public function bp_profile_menu_screen() + { + add_action('bp_template_title', array($this, 'bp_profile_menu_title')); + add_action('bp_template_content', array($this, 'bp_profile_menu_content')); + + bp_core_load_template(array('buddypress/members/single/plugins')); + } + + public function bp_profile_menu_title() + { + echo esc_html__('Events', 'modern-events-calendar-lite'); + } + + public function bp_profile_menu_content() + { + echo do_shortcode('[MEC_fes_list relative-link="1"]'); + } + + /** + * Add booker information to mailchimp list + * @param int $book_id + * @return boolean + */ + public function mailchimp_add_subscriber($book_id) + { + // Get MEC Options + $settings = $this->get_settings(); + $ml_settings = $this->get_ml_settings(); + + // Mailchim integration is disabled + if (!isset($settings['mchimp_status']) or (isset($settings['mchimp_status']) and !$settings['mchimp_status'])) return false; + + $api_key = $settings['mchimp_api_key'] ?? ''; + $list_id = $settings['mchimp_list_id'] ?? ''; + + // Mailchim credentials are required + if (!trim($api_key) or !trim($list_id)) return false; + + // Options + $date_format = (isset($ml_settings['booking_date_format1']) and trim($ml_settings['booking_date_format1'])) ? $ml_settings['booking_date_format1'] : 'Y-m-d'; + $segment_status = (isset($settings['mchimp_segment_status']) and $settings['mchimp_segment_status']); + + // Booking Date + $mec_date = get_post_meta($book_id, 'mec_date', true); + $dates = (trim($mec_date) ? explode(':', $mec_date) : array()); + $booking_date = date($date_format, $dates[0]); + + // Event Title + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $event = get_post($event_id); + + $book = $this->getBook(); + $attendees = $book->get_attendees($book_id); + + $data_center = substr($api_key, strpos($api_key, '-') + 1); + $subscription_status = isset($settings['mchimp_subscription_status']) ? $settings['mchimp_subscription_status'] : 'subscribed'; + + $member_response = NULL; + $did = []; + + foreach ($attendees as $attendee) { + // Name + $name = ((isset($attendee['name']) and trim($attendee['name'])) ? $attendee['name'] : ''); + + // Email + $email = ((isset($attendee['email']) and trim($attendee['email'])) ? $attendee['email'] : ''); + if (!is_email($email)) continue; + + // No Duplicate + if (in_array($email, $did)) continue; + $did[] = $email; + + $names = explode(' ', $name); + + $first_name = $names[0]; + unset($names[0]); + + $last_name = implode(' ', $names); + + // UPSERT + $member_response = wp_remote_request('https://' . $data_center . '.api.mailchimp.com/3.0/lists/' . $list_id . '/members/' . md5(strtolower($email)), array( + 'method' => 'PUT', + 'body' => json_encode(array( + 'email_address' => $email, + 'status' => $subscription_status, + 'merge_fields' => array( + 'FNAME' => $first_name, + 'LNAME' => $last_name + ), + 'tags' => array($booking_date, $event->post_title) + )), + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Authorization' => 'Basic ' . base64_encode('user:' . $api_key)), + )); + + // TAGS + wp_remote_post('https://' . $data_center . '.api.mailchimp.com/3.0/lists/' . $list_id . '/members/' . md5(strtolower($email)) . '/tags', array( + 'body' => json_encode(array( + 'tags' => array( + array('name' => $booking_date, 'status' => 'active'), + array('name' => $event->post_title, 'status' => 'active') + ) + )), + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Authorization' => 'Basic ' . base64_encode('user:' . $api_key)), + )); + } + + // Handle Segment + if ($segment_status) { + wp_remote_post('https://' . $data_center . '.api.mailchimp.com/3.0/lists/' . $list_id . '/segments/', array( + 'body' => json_encode(array( + 'name' => sprintf('%s at %s', $event->post_title, $booking_date), + 'options' => array( + 'match' => 'any', + 'conditions' => array() + ) + )), + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Authorization' => 'Basic ' . base64_encode('user:' . $api_key)), + )); + } + + return ($member_response ? wp_remote_retrieve_response_code($member_response) : false); + } + + /** + * Add booker information to campaign monitor list + * @param int $book_id + * @return boolean + */ + public function campaign_monitor_add_subscriber($book_id) + { + // Skip on Lite + if (!$this->getPRO()) return false; + + require_once MEC_ABSPATH . '/app/api/Campaign_Monitor/csrest_subscribers.php'; + + // Get MEC Options + $settings = $this->get_settings(); + + // Campaign Monitor integration is disabled + if (!isset($settings['campm_status']) or (isset($settings['campm_status']) and !$settings['campm_status'])) return false; + + $api_key = $settings['campm_api_key'] ?? ''; + $list_id = $settings['campm_list_id'] ?? ''; + + // Campaign Monitor credentials are required + if (!trim($api_key) or !trim($list_id)) return false; + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + $wrap = new CS_REST_Subscribers($list_id, $api_key); + $wrap->add(array( + 'EmailAddress' => $booker->user_email, + 'Name' => $booker->first_name . ' ' . $booker->last_name, + 'ConsentToTrack' => 'yes', + 'Resubscribe' => true + )); + } + + /** + * Add booker information to mailerlite list + * @param int $book_id + * @return boolean}int + */ + public function mailerlite_add_subscriber($book_id) + { + // Get MEC Options + $settings = $this->get_settings(); + + // mailerlite integration is disabled + if (!isset($settings['mailerlite_status']) or (isset($settings['mailerlite_status']) and !$settings['mailerlite_status'])) return false; + + $api_key = $settings['mailerlite_api_key'] ?? ''; + $list_id = $settings['mailerlite_list_id'] ?? ''; + + // mailerlite credentials are required + if (!trim($api_key) or !trim($list_id)) return false; + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + $url = 'https://api.mailerlite.com/api/v2/groups/' . $list_id . '/subscribers'; + + $json = json_encode(array( + 'email' => $booker->user_email, + 'name' => $booker->first_name . ' ' . $booker->last_name, + )); + + // Execute the Request and Return the Response Code + return wp_remote_retrieve_response_code(wp_remote_post($url, array( + 'body' => $json, + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'X-MailerLite-ApiKey' => $api_key), + ))); + } + + /** + * Add booker information to Active Campaign list + * @param int $book_id + * @return boolean + */ + public function active_campaign_add_subscriber($book_id) + { + // Get MEC Options + $settings = $this->get_settings(); + + // Mailchim integration is disabled + if (!isset($settings['active_campaign_status']) or (isset($settings['active_campaign_status']) and !$settings['active_campaign_status'])) return false; + + $api_url = $settings['active_campaign_api_url'] ?? ''; + $api_key = $settings['active_campaign_api_key'] ?? ''; + $list_id = $settings['active_campaign_list_id'] ?? ''; + + // Mailchim credentials are required + if (!trim($api_url) or !trim($api_key)) return false; + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + $url = $api_url . '/api/3/contact/sync'; + + $array_parameters = array( + 'email' => $booker->user_email, + 'firstName' => $booker->first_name, + 'lastName' => $booker->last_name, + ); + $array_parameters = apply_filters('mec_active_campaign_parameters', $array_parameters, $booker, $book_id); + $json = json_encode(array( + 'contact' => $array_parameters, + )); + + // Execute the Request and Return the Response Code + $request = wp_remote_post($url, array( + 'body' => $json, + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Api-Token' => $api_key), + )); + + if (is_wp_error($request) || wp_remote_retrieve_response_code($request) != 200) { + error_log(print_r($request, true)); + } + $response = wp_remote_retrieve_body($request); + + // Subscribe to list + if (trim($list_id)) { + $person = json_decode($response); + $new_url = $api_url . '/api/3/contactLists'; + $new_json = json_encode(array( + 'contactList' => array( + 'list' => (int)$list_id, + 'contact' => (int)$person->contact->id, + 'status' => 1, + ), + )); + $new_request = wp_remote_post($new_url, array( + 'body' => $new_json, + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Api-Token' => $api_key), + )); + + if (is_wp_error($new_request) || wp_remote_retrieve_response_code($new_request) != 200) { + error_log(print_r($new_request, true)); + } + + $new_response = wp_remote_retrieve_body($new_request); + } + } + + /** + * Add booker information to Aweber list + * @param int $book_id + * @return boolean + */ + public function aweber_add_subscriber($book_id) + { + // Aweber Plugin is not installed or it's not activated + if (!class_exists('AWeberWebFormPluginNamespace\AWeberWebformPlugin')) return false; + + // Get MEC Options + $settings = $this->get_settings(); + + // AWeber's integration is disabled + if (!isset($settings['aweber_status']) || !$settings['aweber_status']) return false; + + $list_id = isset($settings['aweber_list_id']) ? preg_replace("/[^0-9]/", "", $settings['aweber_list_id']) : ''; + + // AWeber's credentials are required + if (!trim($list_id)) return false; + + $aweber = new \AWeberWebFormPluginNamespace\AWeberWebformPlugin(); + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + $name = trim($booker->first_name . ' ' . $booker->last_name); + + return $aweber->create_subscriber($booker->user_email, NULL, $list_id, $name, 'a,b'); + } + + /** + * Add booker information to Mailpoet list + * @param int $book_id + * @return boolean|array + */ + public function mailpoet_add_subscriber($book_id) + { + // Mailpoet Plugin is not installed or it's not activated + if (!class_exists(\MailPoet\API\API::class)) return false; + + // Get MEC Options + $settings = $this->get_settings(); + + // MailPoet integration is disabled + if (!isset($settings['mailpoet_status']) or (isset($settings['mailpoet_status']) and !$settings['mailpoet_status'])) return false; + + // MailPoet API + $mailpoet_api = \MailPoet\API\API::MP('v1'); + + // List ID + $list_ids = (isset($settings['mailpoet_list_id']) and trim($settings['mailpoet_list_id'])) ? array($settings['mailpoet_list_id']) : NULL; + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + try { + return $mailpoet_api->addSubscriber(array( + 'email' => $booker->user_email, + 'first_name' => $booker->first_name, + 'last_name' => $booker->last_name, + ), $list_ids); + } catch (Exception $e) { + if ($e->getCode() == 12 and $list_ids) { + try { + $subscriber = $mailpoet_api->getSubscriber($booker->user_email); + return $mailpoet_api->subscribeToLists($subscriber['id'], $list_ids); + } catch (Exception $e) { + return false; + } + } + + return false; + } + } + + /** + * Add booker information to Sendfox list + * @param int $book_id + * @return boolean|array + */ + public function sendfox_add_subscriber($book_id) + { + // Sendfox Plugin is not installed or it's not activated + if (!function_exists('gb_sf4wp_add_contact')) return false; + + // Get MEC Options + $settings = $this->get_settings(); + + // Sendfox integration is disabled + if (!isset($settings['sendfox_status']) || !$settings['sendfox_status']) return false; + + // List ID + $list_id = ((isset($settings['sendfox_list_id']) and trim($settings['sendfox_list_id'])) ? (int) $settings['sendfox_list_id'] : NULL); + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + return gb_sf4wp_add_contact(array( + 'email' => $booker->user_email, + 'first_name' => $booker->first_name, + 'last_name' => $booker->last_name, + 'lists' => array($list_id) + )); + } + + /** + * Add booker information to constantcontact list + * @param int $book_id + * @return boolean|int + */ + public function constantcontact_add_subscriber($book_id) + { + + // Get MEC Options + $settings = $this->get_settings(); + + // constantcontact integration is disabled + if (!isset($settings['constantcontact_status']) || !$settings['constantcontact_status']) return false; + + $api_key = $settings['constantcontact_api_key'] ?? ''; + $access_token = $settings['constantcontact_access_token'] ?? ''; + $list_id = $settings['constantcontact_list_id'] ?? ''; + + // constantcontact credentials are required + if (!trim($api_key) or !trim($access_token) or !trim($list_id)) return false; + + // MEC User + $u = $this->getUser(); + $booker = $u->booking($book_id); + + $url = 'https://api.constantcontact.com/v2/contacts?action_by=ACTION_BY_OWNER&api_key=' . $api_key; + + $json = json_encode(array( + 'lists' => array(json_encode(array('list' => $list_id))), + 'email_addresses' => array(json_encode(array('email_address' => $booker->user_email))), + 'first_name' => $booker->first_name, + 'last_name' => $booker->last_name, + )); + + // Execute the Request and Return the Response Code + return wp_remote_retrieve_response_code(wp_remote_post($url, array( + 'body' => $json, + 'timeout' => '10', + 'redirection' => '10', + 'headers' => array('Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $access_token), + ))); + } + + /** + * Returns Booking of a certain event at certain date + * @param int $event_id + * @param integer $timestamp + * @param integer|string $limit + * @param integer $user_id + * @param boolean $verified + * @return array + */ + public function get_bookings($event_id, $timestamp = NULL, $limit = '-1', $user_id = NULL, $verified = true) + { + if ($timestamp) { + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + $book_all_occurrences = isset($booking_options['bookings_all_occurrences']) ? (int) $booking_options['bookings_all_occurrences'] : 0; + + if (!$book_all_occurrences) $date_query = " AND `timestamp`=" . $timestamp; + else $date_query = " AND `timestamp`<=" . $timestamp; + } else $date_query = ""; + + if ($user_id) $user_query = " AND `user_id`=" . $user_id; + else $user_query = ""; + + if (is_numeric($limit) and $limit > 0) $limit_query = " LIMIT " . $limit; + else $limit_query = ""; + + if ($verified) $status_query = " AND `status` IN ('publish', 'future') AND `confirmed`='1' AND `verified`='1'"; + else $status_query = ""; + + // Database + $db = $this->getDB(); + + $records = $db->select("SELECT `id`,`booking_id`,`timestamp` FROM `#__mec_bookings` WHERE `event_id`=" . $event_id . $status_query . $date_query . $user_query . $limit_query); + + $results = []; + foreach ($records as $record) { + $post = get_post($record->booking_id); + $post->mec_timestamp = $record->timestamp; + $post->mec_booking_record_id = $record->id; + + $results[] = $post; + } + + return $results; + } + + public function get_bookings_for_occurrence($timestamps, $args = array()) + { + $limit = (isset($args['limit']) and is_numeric($args['limit'])) ? $args['limit'] : -1; + $status = (isset($args['status']) and is_array($args['status'])) ? $args['status'] : []; + $confirmed = (isset($args['confirmed']) and is_numeric($args['confirmed'])) ? $args['confirmed'] : null; + $verified = (isset($args['verified']) and is_numeric($args['verified'])) ? $args['verified'] : null; + $event_id = (isset($args['event_id']) and is_numeric($args['event_id'])) ? $args['event_id'] : null; + + $start = $timestamps[0]; + $end = $timestamps[1] ?? NULL; + + // Database + $db = $this->getDB(); + + // Query + $query = "SELECT `id`,`booking_id`,`timestamp` FROM `#__mec_bookings` WHERE 1"; + + // Confirmation + if (!is_null($confirmed)) { + $query .= " AND `confirmed`='" . esc_sql($confirmed) . "'"; + } + + // Verification + if (!is_null($verified)) { + $query .= " AND `verified`='" . esc_sql($verified) . "'"; + } + + // Status + if (count($status)) { + $status_str = ''; + foreach ($status as $s) $status_str .= "'" . $s . "', "; + + $query .= " AND `status` IN (" . trim($status_str, ', ') . ")"; + } + + // Event ID + if ($event_id) { + $query .= " AND `event_id`=" . esc_sql($event_id); + } + + // Times + if ($start and $end) { + $query .= " AND `timestamp`>='" . esc_sql($start) . "' AND `timestamp`<'" . esc_sql($end) . "'"; + } else $query .= " AND `timestamp`='" . esc_sql($start) . "'"; + + // Order + $query .= " ORDER BY `id` ASC"; + + // Limit + if ($limit > 0) $query .= " LIMIT " . $limit; + + $records = $db->select($query); + + $results = []; + foreach ($records as $record) { + $post = get_post($record->booking_id); + $post->mec_timestamp = $record->timestamp; + + $results[] = $post; + } + + return $results; + } + + public function get_bookings_by_event_occurrence($event_id, $occurrence) + { + return $this->get_bookings_for_occurrence([ + $occurrence, + ], [ + 'event_id' => $event_id, + 'limit' => -1 + ]); + } + + public function get_total_attendees_by_event_occurrence($event_id, $occurrence) + { + $bookings = $this->get_bookings_by_event_occurrence($event_id, $occurrence); + + $total = 0; + if (count($bookings)) { + // Booking Library + $book = $this->getBook(); + + // Determine Total Attendees + foreach ($bookings as $booking) $total += $book->get_total_attendees($booking->ID); + } + + return $total; + } + + /** + * Check whether to show event note or not + * @param string $status + * @return boolean + */ + public function is_note_visible($status) + { + // MEC Settings + $settings = $this->get_settings(); + + // FES Note is not enabled + if (!isset($settings['fes_note']) || !$settings['fes_note']) return false; + + // Return visibility status by post status and visibility method + return (isset($settings['fes_note_visibility']) ? ($settings['fes_note_visibility'] == 'always' ? true : $status != 'publish') : true); + } + + /** + * Get Next event based on datetime of current event + * @param array $atts + * @return object + */ + public function get_next_event($atts = array()) + { + MEC::import('app.skins.list'); + + // Get list skin + $list = new MEC_skin_list(); + + // Initialize the skin + $list->initialize($atts); + + // Fetch the events + $list->fetch(); + + $events = $list->events; + $key = key($events); + + return $events[$key][0] ?? (new stdClass()); + } + + /** + * For getting event end date based on occurrence date + * @param int $event_id + * @param string $occurrence + * @return string + */ + public function get_end_date_by_occurrence($event_id, $occurrence) + { + $event_date = get_post_meta($event_id, 'mec_date', true); + + $start_date = $event_date['start'] ?? []; + $end_date = $event_date['end'] ?? []; + + $event_period = $this->date_diff($start_date['date'], $end_date['date']); + $event_period_days = $event_period ? $event_period->days : 0; + + // Single Day Event + if (!$event_period_days) return $occurrence; + + return date('Y-m-d', strtotime('+' . $event_period_days . ' days', strtotime($occurrence))); + } + + /** + * Add MEC Event CPT to Tags Archive Page + * @param object $query + */ + public function add_events_to_tags_archive($query) + { + if ($query->is_tag() and $query->is_main_query() and !is_admin()) { + $pt = $this->get_main_post_type(); + $query->set('post_type', array('post', $pt)); + } + } + + /** + * Get Post ID by meta value and meta key + * @param string $meta_key + * @param string $meta_value + * @return string + */ + public function get_post_id_by_meta($meta_key, $meta_value) + { + $db = $this->getDB(); + return $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_value`='$meta_value' AND `meta_key`='$meta_key'", 'loadResult'); + } + + /** + * Set Featured Image for a Post + * @param string $image_url + * @param int $post_id + * @param array $allowed_extensions + * @return bool|int + */ + public function set_featured_image($image_url, $post_id, $allowed_extensions = []) + { + $attach_id = $this->get_attach_id($image_url); + if (!$attach_id) { + $upload_dir = wp_upload_dir(); + $filename = basename($image_url); + + $ex = explode('.', $filename); + $extension = end($ex); + + // Invalid Extension + if (count($allowed_extensions) && !in_array($extension, $allowed_extensions)) return false; + + $validate = wp_check_filetype($filename); + if ($validate['type'] === false) return false; + + if (wp_mkdir_p($upload_dir['path'])) $file = $upload_dir['path'] . '/' . $filename; + else $file = $upload_dir['basedir'] . '/' . $filename; + + if (!file_exists($file)) { + $image_data = $this->get_web_page($image_url); + file_put_contents($file, $image_data); + } + + $wp_filetype = wp_check_filetype($filename, null); + $attachment = array( + 'post_mime_type' => $wp_filetype['type'], + 'post_title' => sanitize_file_name($filename), + 'post_content' => '', + 'post_status' => 'inherit' + ); + + $attach_id = wp_insert_attachment($attachment, $file, $post_id); + require_once ABSPATH . 'wp-admin/includes/image.php'; + + $attach_data = wp_generate_attachment_metadata($attach_id, $file); + wp_update_attachment_metadata($attach_id, $attach_data); + } + + return set_post_thumbnail($post_id, $attach_id); + } + + /** + * Get Attachment ID by Image URL + * @param string $image_url + * @return int + */ + public function get_attach_id($image_url) + { + $db = $this->getDB(); + return $db->select("SELECT `ID` FROM `#__posts` WHERE `guid`='$image_url'", 'loadResult'); + } + + /** + * Get Image Type by Buffer. Used in Facebook Importer + * @param string $buffer + * @return string + */ + public function get_image_type_by_buffer($buffer) + { + $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); + $found = 'other'; + + foreach ($types as $type => $header) { + if (strpos($buffer, $header) === 0) { + $found = $type; + break; + } + } + + return $found; + } + + /** + * Load Google Maps assets + * @var boolean $force + * @var $define_settings + * @return bool + */ + public function load_map_assets($force = false, $define_settings = null) + { + if (!$this->getPRO()) return false; + + // MEC Settings + $settings = $this->get_settings(); + + $assets = array('js' => array(), 'css' => array()); + + $local = $this->get_current_language(); + $ex = explode('_', $local); + + $language = ((isset($ex[0]) and trim($ex[0])) ? $ex[0] : 'en'); + $region = ((isset($ex[1]) and trim($ex[1])) ? $ex[1] : 'US'); + + $gm_include = apply_filters('mec_gm_include', true); + if ($gm_include or $force) $assets['js']['googlemap'] = '//maps.googleapis.com/maps/api/js?libraries=places' . ((isset($settings['google_maps_api_key']) and trim($settings['google_maps_api_key']) != '') ? '&key=' . $settings['google_maps_api_key'] : '') . '&language=' . $language . '®ion=' . $region; + + $assets['js']['mec-richmarker-script'] = $this->asset('packages/richmarker/richmarker.min.js'); // Google Maps Rich Marker + $assets['js']['mec-clustering-script'] = $this->asset('packages/clusterer/markerclusterer.min.js'); // Google Maps Clustering + $assets['js']['mec-googlemap-script'] = $this->asset('js/googlemap.js'); // Google Maps Javascript API + + // Apply Filters + $assets = apply_filters('mec_map_assets_include', $assets, $this, $define_settings); + + if (isset($assets['js']) && is_array($assets['js']) && count($assets['js']) > 0) foreach ($assets['js'] as $key => $link) wp_enqueue_script($key, $link, array('jquery'), $this->get_version()); + if (isset($assets['css']) && is_array($assets['css']) && count($assets['css']) > 0) foreach ($assets['css'] as $key => $link) wp_enqueue_style($key, $link, array(), $this->get_version()); + } + + /** + * Load Owl Carousel assets + */ + public function load_owl_assets() + { + // Include MEC frontend CSS files + wp_enqueue_style('mec-owl-carousel-style'); + wp_enqueue_style('mec-owl-carousel-theme-style', $this->asset('packages/owl-carousel/owl.theme.min.css')); + } + + /** + * Load Isotope assets + */ + public function load_isotope_assets() + { + // Isotope JS file + wp_enqueue_script('mec-isotope-script', $this->asset('js/isotope.pkgd.min.js'), array(), $this->get_version(), true); + wp_enqueue_script('mec-imagesload-script', $this->asset('js/imagesload.js'), array(), $this->get_version(), true); + } + + /** + * Load Time Picker assets + */ + public function load_time_picker_assets() + { + // Include CSS + wp_enqueue_style('mec-time-picker', $this->asset('packages/timepicker/jquery.timepicker.min.css')); + + // Include JS + wp_enqueue_script('mec-time-picker', $this->asset('packages/timepicker/jquery.timepicker.min.js')); + } + + /** + * Load Month Picker assets + */ + public function load_month_picker_assets() + { + // IncludeS files + wp_enqueue_style('mec-month-picker-style', $this->asset('packages/month-picker/MonthPicker.css')); + + $dates = []; + $d = array( + 'days' => ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + 'months' => ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + ); + + foreach ($d as $type => $values) { + foreach ($values as $k => $value) { + + switch ($type) { + case 'days': + $day_min = date_i18n('D', strtotime($value)); + + $dates['days'][$k] = date_i18n('l', strtotime($value)); + $dates['daysShort'][$k] = $day_min; + $dates['daysMin'][$k] = $day_min; + break; + case 'months': + $dates['months'][$k] = date_i18n('F', strtotime($value)); + $dates['monthsShort'][$k] = date_i18n('M', strtotime($value)); + break; + } + } + } + + $data = array( + 'dates' => $dates, + ); + echo ''; + wp_enqueue_script('mec-month-picker-js', $this->asset('packages/month-picker/MonthPicker.js')); + } + + function get_client_ip() + { + if (isset($_SERVER['HTTP_CLIENT_IP'])) $ipaddress = sanitize_text_field($_SERVER['HTTP_CLIENT_IP']); + elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ipaddress = sanitize_text_field($_SERVER['HTTP_X_FORWARDED_FOR']); + elseif (isset($_SERVER['HTTP_X_FORWARDED'])) $ipaddress = sanitize_text_field($_SERVER['HTTP_X_FORWARDED']); + elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) $ipaddress = sanitize_text_field($_SERVER['HTTP_FORWARDED_FOR']); + elseif (isset($_SERVER['HTTP_FORWARDED'])) $ipaddress = sanitize_text_field($_SERVER['HTTP_FORWARDED']); + elseif (isset($_SERVER['REMOTE_ADDR'])) $ipaddress = sanitize_text_field($_SERVER['REMOTE_ADDR']); + else $ipaddress = 'UNKNOWN'; + + $ips = explode(',', $ipaddress); + if (count($ips) > 1) $ipaddress = $ips[0]; + + return $ipaddress; + } + + public function get_timezone_by_ip() + { + // Client IP + $ip = $this->get_client_ip(); + + $cache_key = 'mec_visitor_timezone_' . $ip; + $cache = $this->getCache(); + + // Get From Cache + if ($cache->has($cache_key)) return $cache->get($cache_key); + + // First Provider + $JSON = $this->get_web_page('http://ip-api.com/json/' . $ip, 3); + $data = json_decode($JSON, true); + + // Second Provider + if (!trim($JSON) or (is_array($data) and !isset($data['timezone']))) { + $JSON = $this->get_web_page('https://ipapi.co/' . $ip . '/json/', 3); + $data = json_decode($JSON, true); + } + + // Second provider returns X instead of false in case of error! + $timezone = (isset($data['timezone']) and strtolower($data['timezone']) != 'x') ? $data['timezone'] : false; + + // Add to Cache + $cache->set($cache_key, $timezone); + + return $timezone; + } + + public function is_ajax() + { + return (defined('DOING_AJAX') && DOING_AJAX); + } + + public function load_sed_assets($settings = array()) + { + if (!is_array($settings) || !count($settings)) $settings = $this->get_settings(); + + // Load Map assets + if (isset($settings['google_maps_status']) and $settings['google_maps_status']) $this->load_map_assets(); + + // Include FlipCount library + wp_enqueue_script('mec-flipcount-script'); + } + + public function is_sold($event, $date = '') + { + if (is_object($event)) { + $event_id = $event->data->ID; + $tickets = (isset($event->data->tickets) and is_array($event->data->tickets)) ? $event->data->tickets : []; + + $timestamp = (trim($date) ? $date : ((isset($event->date['start']) and isset($event->date['start']['timestamp'])) ? $event->date['start']['timestamp'] : 0)); + } else { + $event_id = $event; + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if (!is_array($tickets)) $tickets = []; + + $timestamp = is_numeric($date) ? $date : (int) strtotime($date); + } + + // No Tickets + if (!count($tickets) or !$timestamp) return false; + + // MEC Cache + $cache = $this->getCache(); + + return $cache->rememberOnce($event_id . ':' . $timestamp, function () use ($event_id, $timestamp) { + $book = $this->getBook(); + $availability = $book->get_tickets_availability($event_id, $timestamp); + + $sold = false; + if (is_array($availability) and count($availability)) { + $remained_tickets = 0; + foreach ($availability as $ticket_id => $remained) { + if (is_numeric($ticket_id) and $remained >= 0) $remained_tickets += $remained; + if (is_numeric($ticket_id) and $remained == -1) { + $remained_tickets = -1; + break; + } + } + + // Soldout + if ($remained_tickets === 0) $sold = true; + } + + return $sold; + }); + } + + public function get_date_periods($date_start, $date_end, $type = 'daily') + { + $periods = []; + + $time_start = strtotime($date_start); + $time_end = strtotime($date_end); + + if ($type == 'daily') { + while ($time_start < $time_end) { + $periods[] = array('start' => date("Y-m-d H:i:s", $time_start), 'end' => date("Y-m-d H:i:s", ($time_start + 86399)), 'label' => date("Y-m-d", $time_start)); + $time_start += 86400; + } + } elseif ($type == 'weekly') { + } elseif ($type == 'monthly') { + $start_year = date('Y', $time_start); + $start_month = date('m', $time_start); + $start_id = (int) $start_year . $start_month; + + $end_year = date('Y', $time_end); + $end_month = date('m', $time_end); + $end_id = (int) $end_year . $end_month; + + while ($start_id <= $end_id) { + $periods[] = array('start' => $start_year . "-" . $start_month . "-01 00:00:00", 'end' => $start_year . "-" . $start_month . "-" . date('t', strtotime($start_year . "-" . $start_month . "-01 00:00:00")) . " 23:59:59", 'label' => date('Y F', strtotime($start_year . "-" . $start_month . "-01 00:00:00"))); + + if ($start_month == '12') { + $start_month = '01'; + $start_year++; + } else { + $start_month = (int) $start_month + 1; + if (strlen($start_month) == 1) $start_month = '0' . $start_month; + } + + $start_id = (int) $start_year . $start_month; + } + } elseif ($type == 'yearly') { + $start_year = date('Y', $time_start); + $end_year = date('Y', $time_end); + + while ($start_year <= $end_year) { + $periods[] = array('start' => $start_year . "-01-01 00:00:00", 'end' => $start_year . "-12-31 23:59:59", 'label' => $start_year); + $start_year++; + } + } + + return $periods; + } + + public function get_messages() + { + if ($this->getPRO()) { + $messages = array( + 'taxonomies' => array( + 'category' => array('name' => __('Taxonomies', 'modern-events-calendar-lite')), + 'messages' => array( + 'taxonomy_categories' => array('label' => __('Category Plural Label', 'modern-events-calendar-lite'), 'default' => __('Categories', 'modern-events-calendar-lite')), + 'taxonomy_category' => array('label' => __('Category Singular Label', 'modern-events-calendar-lite'), 'default' => __('Category', 'modern-events-calendar-lite')), + 'taxonomy_labels' => array('label' => __('Label Plural Label', 'modern-events-calendar-lite'), 'default' => __('Labels', 'modern-events-calendar-lite')), + 'taxonomy_label' => array('label' => __('Label Singular Label', 'modern-events-calendar-lite'), 'default' => __('label', 'modern-events-calendar-lite')), + 'taxonomy_locations' => array('label' => __('Location Plural Label', 'modern-events-calendar-lite'), 'default' => __('Locations', 'modern-events-calendar-lite')), + 'taxonomy_location' => array('label' => __('Location Singular Label', 'modern-events-calendar-lite'), 'default' => __('Location', 'modern-events-calendar-lite')), + 'taxonomy_organizers' => array('label' => __('Organizer Plural Label', 'modern-events-calendar-lite'), 'default' => __('Organizers', 'modern-events-calendar-lite')), + 'taxonomy_organizer' => array('label' => __('Organizer Singular Label', 'modern-events-calendar-lite'), 'default' => __('Organizer', 'modern-events-calendar-lite')), + 'taxonomy_speakers' => array('label' => __('Speaker Plural Label', 'modern-events-calendar-lite'), 'default' => __('Speakers', 'modern-events-calendar-lite')), + 'taxonomy_speaker' => array('label' => __('Speaker Singular Label', 'modern-events-calendar-lite'), 'default' => __('Speaker', 'modern-events-calendar-lite')), + 'taxonomy_sponsors' => array('label' => __('Sponsor Plural Label', 'modern-events-calendar-lite'), 'default' => __('Sponsors', 'modern-events-calendar-lite')), + 'taxonomy_sponsor' => array('label' => __('Sponsor Singular Label', 'modern-events-calendar-lite'), 'default' => __('Sponsor', 'modern-events-calendar-lite')), + ) + ), + 'weekdays' => array( + 'category' => array('name' => __('Weekdays', 'modern-events-calendar-lite')), + 'messages' => array( + 'weekdays_su' => array('label' => __('Sunday abbreviation', 'modern-events-calendar-lite'), 'default' => __('SU', 'modern-events-calendar-lite')), + 'weekdays_mo' => array('label' => __('Monday abbreviation', 'modern-events-calendar-lite'), 'default' => __('MO', 'modern-events-calendar-lite')), + 'weekdays_tu' => array('label' => __('Tuesday abbreviation', 'modern-events-calendar-lite'), 'default' => __('TU', 'modern-events-calendar-lite')), + 'weekdays_we' => array('label' => __('Wednesday abbreviation', 'modern-events-calendar-lite'), 'default' => __('WE', 'modern-events-calendar-lite')), + 'weekdays_th' => array('label' => __('Thursday abbreviation', 'modern-events-calendar-lite'), 'default' => __('TH', 'modern-events-calendar-lite')), + 'weekdays_fr' => array('label' => __('Friday abbreviation', 'modern-events-calendar-lite'), 'default' => __('FR', 'modern-events-calendar-lite')), + 'weekdays_sa' => array('label' => __('Saturday abbreviation', 'modern-events-calendar-lite'), 'default' => __('SA', 'modern-events-calendar-lite')), + ) + ), + 'booking' => array( + 'category' => array('name' => __('Booking', 'modern-events-calendar-lite')), + 'messages' => array( + 'booking' => array('label' => __('Booking (Singular)', 'modern-events-calendar-lite'), 'default' => __('Booking', 'modern-events-calendar-lite')), + 'bookings' => array('label' => __('Bookings (Plural)', 'modern-events-calendar-lite'), 'default' => __('Bookings', 'modern-events-calendar-lite')), + 'book_success_message' => array('label' => __('Booking Success Message', 'modern-events-calendar-lite'), 'default' => __('Thank you for booking. Your tickets are booked, booking verification might be needed, please check your email.', 'modern-events-calendar-lite')), + 'booking_restriction_message1' => array('label' => __('Booking Restriction Message 1', 'modern-events-calendar-lite'), 'default' => __('You selected %s tickets to book but maximum number of tikets per user is %s tickets.', 'modern-events-calendar-lite')), + 'booking_restriction_message2' => array('label' => __('Booking Restriction Message 2', 'modern-events-calendar-lite'), 'default' => __('You have already booked %s tickets and the maximum number of tickets per user is %s.', 'modern-events-calendar-lite')), + 'booking_restriction_message3' => array('label' => __('Booking IP Restriction Message', 'modern-events-calendar-lite'), 'default' => __('Maximum allowed number of tickets that you can book is %s.', 'modern-events-calendar-lite')), + 'booking_button' => array('label' => __('Booking Button', 'modern-events-calendar-lite'), 'default' => __('Book Now', 'modern-events-calendar-lite')), + 'ticket' => array('label' => __('Ticket (Singular)', 'modern-events-calendar-lite'), 'default' => __('Ticket', 'modern-events-calendar-lite')), + 'tickets' => array('label' => __('Tickets (Plural)', 'modern-events-calendar-lite'), 'default' => __('Tickets', 'modern-events-calendar-lite')), + ) + ), + 'others' => array( + 'category' => array('name' => __('Others', 'modern-events-calendar-lite')), + 'messages' => array( + 'register_button' => array('label' => __('Register Button', 'modern-events-calendar-lite'), 'default' => __('REGISTER', 'modern-events-calendar-lite')), + 'view_detail' => array('label' => __('View Detail Button', 'modern-events-calendar-lite'), 'default' => __('View Detail', 'modern-events-calendar-lite')), + 'event_detail' => array('label' => __('Event Detail Button', 'modern-events-calendar-lite'), 'default' => __('Event Detail', 'modern-events-calendar-lite')), + 'read_more_link' => array('label' => __('Event Link', 'modern-events-calendar-lite'), 'default' => __('Event Link', 'modern-events-calendar-lite')), + 'more_info_link' => array('label' => __('More Info Link', 'modern-events-calendar-lite'), 'default' => __('More Info', 'modern-events-calendar-lite')), + 'event_cost' => array('label' => __('Event Cost', 'modern-events-calendar-lite'), 'default' => __('Event Cost', 'modern-events-calendar-lite')), + 'cost' => array('label' => __('Cost', 'modern-events-calendar-lite'), 'default' => __('Cost', 'modern-events-calendar-lite')), + 'other_organizers' => array('label' => __('Other Organizers', 'modern-events-calendar-lite'), 'default' => __('Other Organizers', 'modern-events-calendar-lite')), + 'other_locations' => array('label' => __('Other Locations', 'modern-events-calendar-lite'), 'default' => __('Other Locations', 'modern-events-calendar-lite')), + 'all_day' => array('label' => __('All Day', 'modern-events-calendar-lite'), 'default' => __('All Day', 'modern-events-calendar-lite')), + 'expired' => array('label' => __('Expired', 'modern-events-calendar-lite'), 'default' => __('Expired', 'modern-events-calendar-lite')), + 'ongoing' => array('label' => __('Ongoing', 'modern-events-calendar-lite'), 'default' => __('Ongoing', 'modern-events-calendar-lite')), + ) + ), + ); + } else { + $messages = array( + 'taxonomies' => array( + 'category' => array('name' => __('Taxonomies', 'modern-events-calendar-lite')), + 'messages' => array( + 'taxonomy_categories' => array('label' => __('Category Plural Label', 'modern-events-calendar-lite'), 'default' => __('Categories', 'modern-events-calendar-lite')), + 'taxonomy_category' => array('label' => __('Category Singular Label', 'modern-events-calendar-lite'), 'default' => __('Category', 'modern-events-calendar-lite')), + 'taxonomy_labels' => array('label' => __('Label Plural Label', 'modern-events-calendar-lite'), 'default' => __('Labels', 'modern-events-calendar-lite')), + 'taxonomy_label' => array('label' => __('Label Singular Label', 'modern-events-calendar-lite'), 'default' => __('label', 'modern-events-calendar-lite')), + 'taxonomy_locations' => array('label' => __('Location Plural Label', 'modern-events-calendar-lite'), 'default' => __('Locations', 'modern-events-calendar-lite')), + 'taxonomy_location' => array('label' => __('Location Singular Label', 'modern-events-calendar-lite'), 'default' => __('Location', 'modern-events-calendar-lite')), + 'taxonomy_organizers' => array('label' => __('Organizer Plural Label', 'modern-events-calendar-lite'), 'default' => __('Organizers', 'modern-events-calendar-lite')), + 'taxonomy_organizer' => array('label' => __('Organizer Singular Label', 'modern-events-calendar-lite'), 'default' => __('Organizer', 'modern-events-calendar-lite')), + 'taxonomy_speakers' => array('label' => __('Speaker Plural Label', 'modern-events-calendar-lite'), 'default' => __('Speakers', 'modern-events-calendar-lite')), + 'taxonomy_speaker' => array('label' => __('Speaker Singular Label', 'modern-events-calendar-lite'), 'default' => __('Speaker', 'modern-events-calendar-lite')), + ) + ), + 'weekdays' => array( + 'category' => array('name' => __('Weekdays', 'modern-events-calendar-lite')), + 'messages' => array( + 'weekdays_su' => array('label' => __('Sunday abbreviation', 'modern-events-calendar-lite'), 'default' => __('SU', 'modern-events-calendar-lite')), + 'weekdays_mo' => array('label' => __('Monday abbreviation', 'modern-events-calendar-lite'), 'default' => __('MO', 'modern-events-calendar-lite')), + 'weekdays_tu' => array('label' => __('Tuesday abbreviation', 'modern-events-calendar-lite'), 'default' => __('TU', 'modern-events-calendar-lite')), + 'weekdays_we' => array('label' => __('Wednesday abbreviation', 'modern-events-calendar-lite'), 'default' => __('WE', 'modern-events-calendar-lite')), + 'weekdays_th' => array('label' => __('Thursday abbreviation', 'modern-events-calendar-lite'), 'default' => __('TH', 'modern-events-calendar-lite')), + 'weekdays_fr' => array('label' => __('Friday abbreviation', 'modern-events-calendar-lite'), 'default' => __('FR', 'modern-events-calendar-lite')), + 'weekdays_sa' => array('label' => __('Saturday abbreviation', 'modern-events-calendar-lite'), 'default' => __('SA', 'modern-events-calendar-lite')), + ) + ), + 'others' => array( + 'category' => array('name' => __('Others', 'modern-events-calendar-lite')), + 'messages' => array( + 'register_button' => array('label' => __('Register Button', 'modern-events-calendar-lite'), 'default' => __('REGISTER', 'modern-events-calendar-lite')), + 'view_detail' => array('label' => __('View Detail Button', 'modern-events-calendar-lite'), 'default' => __('View Detail', 'modern-events-calendar-lite')), + 'event_detail' => array('label' => __('Event Detail Button', 'modern-events-calendar-lite'), 'default' => __('Event Detail', 'modern-events-calendar-lite')), + 'read_more_link' => array('label' => __('Event Link', 'modern-events-calendar-lite'), 'default' => __('Event Link', 'modern-events-calendar-lite')), + 'more_info_link' => array('label' => __('More Info Link', 'modern-events-calendar-lite'), 'default' => __('More Info', 'modern-events-calendar-lite')), + 'event_cost' => array('label' => __('Event Cost', 'modern-events-calendar-lite'), 'default' => __('Event Cost', 'modern-events-calendar-lite')), + 'cost' => array('label' => __('Cost', 'modern-events-calendar-lite'), 'default' => __('Cost', 'modern-events-calendar-lite')), + 'other_organizers' => array('label' => __('Other Organizers', 'modern-events-calendar-lite'), 'default' => __('Other Organizers', 'modern-events-calendar-lite')), + 'other_locations' => array('label' => __('Other Locations', 'modern-events-calendar-lite'), 'default' => __('Other Locations', 'modern-events-calendar-lite')), + 'all_day' => array('label' => __('All Day', 'modern-events-calendar-lite'), 'default' => __('All Day', 'modern-events-calendar-lite')), + 'expired' => array('label' => __('Expired', 'modern-events-calendar-lite'), 'default' => __('Expired', 'modern-events-calendar-lite')), + 'ongoing' => array('label' => __('Ongoing', 'modern-events-calendar-lite'), 'default' => __('Ongoing', 'modern-events-calendar-lite')), + ) + ), + ); + } + + return apply_filters('mec_messages', $messages); + } + + /** + * For showing dynamic messages based on their default value and the inserted value in backend (if any) + * @param $message_key string + * @param $default string + * @return string + */ + public function m($message_key, $default) + { + $message_values = $this->get_messages_options(); + + // Message is not set from backend + if (!isset($message_values[$message_key]) or (!trim($message_values[$message_key]))) return $default; + + // Return the dynamic message inserted in backend + return stripslashes($message_values[$message_key]); + } + + /** + * Get Weather from the data provider + * @param $apikey + * @param $lat + * @param $lng + * @param $datetime + * @return bool|array + */ + public function get_weather_darksky($apikey, $lat, $lng, $datetime) + { + $locale = substr(get_locale(), 0, 2); + + // Set the language to English if it's not included in available languages + if (!in_array($locale, array( + 'ar', + 'az', + 'be', + 'bg', + 'bs', + 'ca', + 'cs', + 'da', + 'de', + 'el', + 'en', + 'es', + 'et', + 'fi', + 'fr', + 'hr', + 'hu', + 'id', + 'is', + 'it', + 'ja', + 'ka', + 'ko', + 'kw', + 'nb', + 'nl', + 'no', + 'pl', + 'pt', + 'ro', + 'ru', + 'sk', + 'sl', + 'sr', + 'sv', + 'tet', + 'tr', + 'uk', + 'x-pig-latin', + 'zh', + 'zh-tw' + ))) $locale = 'en'; + + // Dark Sky Provider + $JSON = $this->get_web_page('https://api.darksky.net/forecast/' . $apikey . '/' . $lat . ',' . $lng . ',' . strtotime($datetime) . '?exclude=minutely,hourly,daily,alerts&units=ca&lang=' . $locale); + $data = json_decode($JSON, true); + + return $data['currently'] ?? false; + } + + /** + * Get Weather from the data provider + * @param $apikey + * @param $lat + * @param $lng + * @param $datetime + * @return bool|array + */ + public function get_weather_visualcrossing($apikey, $lat, $lng, $datetime) + { + $locale = substr(get_locale(), 0, 2); + + // Set the language to English if it's not included in available languages + if (!in_array($locale, array( + 'de', + 'en', + 'es', + 'fi', + 'fr', + 'it', + 'ja', + 'ko', + 'pt', + 'ru', + 'zn' + ))) $locale = 'en'; + + // Visual Crossing Provider + $JSON = $this->get_web_page('https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/' . $lat . ',' . $lng . '/' . date('Y-m-d\TH:i:s', strtotime($datetime)) . '?key=' . $apikey . '&include=current&unitGroup=metric&lang=' . $locale); + $data = json_decode($JSON, true); + + return $data['currentConditions'] ?? false; + } + + /** + * Get Weather from the data provider + * @param $apikey + * @param $lat + * @param $lng + * @param $datetime + * @return bool|array + */ + public function get_weather_wa($apikey, $lat, $lng, $datetime) + { + $locale = substr(get_locale(), 0, 2); + + // Set the language to English if it's not included in available languages + if (!in_array($locale, array( + 'ar', + 'bn', + 'bg', + 'zh', + 'zh_tw', + 'cs', + 'da', + 'nl', + 'fi', + 'fr', + 'de', + 'el', + 'hi', + 'hu', + 'it', + 'ja', + 'jv', + 'ko', + 'zh_cmn', + 'mr', + 'pl', + 'pt', + 'pa', + 'ro', + 'ru', + 'si', + 'si', + 'sk', + 'es', + 'sv', + 'ta', + 'te', + 'tr', + 'uk', + 'ur', + 'vi', + 'zh_wuu', + 'zh_hsn', + 'zh_yue', + 'zu' + ))) $locale = 'en'; + + // Dark Sky Provider + $JSON = $this->get_web_page('https://api.weatherapi.com/v1/current.json?key=' . $apikey . '&q=' . $lat . ',' . $lng . '&lang=' . $locale); + $data = json_decode($JSON, true); + + return $data['current'] ?? false; + } + + /** + * Convert weather unit + * @author Webnus + * @param $value + * @param $mode + * @return false|float + */ + function weather_unit_convert($value, $mode) + { + if (func_num_args() < 2) return false; + $mode = strtoupper($mode); + + if ($mode == 'F_TO_C') return round(((floatval($value) - 32) * 5 / 9)); + else if ($mode == 'C_TO_F') return round(((1.8 * floatval($value)) + 32)); + else if ($mode == 'M_TO_KM') return round(1.609344 * floatval($value)); + else if ($mode == 'KM_TO_M') return round(0.6214 * floatval($value)); + return false; + } + + /** + * Get Integrated plugins to import events + * @return array + */ + public function get_integrated_plugins_for_import() + { + return array( + 'eventon' => esc_html__('EventON', 'modern-events-calendar-lite'), + 'the-events-calendar' => esc_html__('The Events Calendar', 'modern-events-calendar-lite'), + 'weekly-class' => esc_html__('Events Schedule WP Plugin', 'modern-events-calendar-lite'), + 'calendarize-it' => esc_html__('Calendarize It', 'modern-events-calendar-lite'), + 'event-espresso' => esc_html__('Event Espresso', 'modern-events-calendar-lite'), + 'events-manager-recurring' => esc_html__('Events Manager (Recurring)', 'modern-events-calendar-lite'), + 'events-manager-single' => esc_html__('Events Manager (Single)', 'modern-events-calendar-lite'), + 'wp-event-manager' => esc_html__('WP Event Manager', 'modern-events-calendar-lite'), + ); + } + + public function get_original_event($event_id) + { + // If WPML Plugin is installed and activated + if (class_exists('SitePress')) { + $trid = apply_filters('wpml_element_trid', NULL, $event_id, 'post_mec-events'); + $translations = apply_filters('wpml_get_element_translations', NULL, $trid, 'post_mec-events'); + + if (!is_array($translations) or !count($translations)) return $event_id; + + $original_id = $event_id; + foreach ($translations as $translation) { + if (isset($translation->original) and $translation->original) { + $original_id = $translation->element_id; + break; + } + } + + return $original_id; + } + // Poly Lang is installed and activated + elseif (function_exists('pll_default_language')) { + $def = pll_default_language(); + + $translations = pll_get_post_translations($event_id); + if (!is_array($translations) or !count($translations)) return $event_id; + + if (isset($translations[$def]) and is_numeric($translations[$def])) return $translations[$def]; + } + + return $event_id; + } + + public function is_multilingual() + { + $multilingual = false; + + // WPML + if (class_exists('SitePress')) $multilingual = true; + + // Polylang + if (function_exists('pll_default_language')) $multilingual = true; + + return $multilingual; + } + + public function get_current_locale() + { + return get_locale(); + } + + public function get_current_lang_code() + { + // WPML + if (class_exists('SitePress')) return $this->get_current_locale(); + // Polylang, etc. + else { + $ex = explode('_', $this->get_current_locale()); + return $ex[0]; + } + } + + public function get_backend_active_locale() + { + // WPML + if (class_exists('SitePress')) { + $languages = apply_filters('wpml_active_languages', array()); + if (is_array($languages) and count($languages)) { + foreach ($languages as $language) { + if (isset($language['active']) and $language['active']) return $language['default_locale']; + } + } + } + + // Polylang + if (function_exists('pll_default_language')) { + global $polylang; + return $polylang->pref_lang->locale; + } + + return $this->get_current_locale(); + } + + public function get_post_locale($post_id) + { + // WPML + if (class_exists('SitePress')) { + $lang = apply_filters('wpml_post_language_details', null, $post_id); + return $lang['locale'] ?? ''; + } + + // Polylang + if (function_exists('pll_get_post_language')) { + return pll_get_post_language( $post_id, 'locale' ); + } + + return ''; + } + + /** + * To check is a date is valid or not + * @param string $date + * @param string $format + * @return bool + */ + public function validate_date($date, $format = 'Y-m-d') + { + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; + } + + public function parse_ics($feed) + { + try { + return new ICal($feed, array( + 'defaultSpan' => 2, // Default value + 'defaultTimeZone' => 'UTC', + 'defaultWeekStart' => 'MO', // Default value + 'disableCharacterReplacement' => false, // Default value + 'skipRecurrence' => true, // Default value + 'useTimeZoneWithRRules' => false, // Default value + )); + } catch (\Exception $e) { + return $e->getMessage(); + } + } + + public function get_pro_link() + { + $link = 'https://webnus.net/mec-purchase/?ref=17/'; + return apply_filters('MEC_upgrade_link', $link); + } + + /** + * Get Label for booking confirmation + * @author Webnus + * @param int $confirmed + * @return string + */ + public function get_confirmation_label($confirmed = 1) + { + if ($confirmed == '1') $label = esc_html__('Confirmed', 'modern-events-calendar-lite'); + elseif ($confirmed == '-1') $label = esc_html__('Rejected', 'modern-events-calendar-lite'); + else $label = esc_html__('Pending', 'modern-events-calendar-lite'); + + return $label; + } + + /** + * Get Label for events status + * @author Webnus + * @param string $label + * @param boolean $return_class + * @return string|array + */ + public function get_event_label_status($label = 'empty', $return_class = true) + { + if (!trim($label)) $label = 'empty'; + switch ($label) { + case 'publish': + $label = esc_html__('Confirmed', 'modern-events-calendar-lite'); + $status_class = 'mec-book-confirmed'; + break; + case 'pending': + $label = esc_html__('Pending', 'modern-events-calendar-lite'); + $status_class = 'mec-book-pending'; + break; + case 'trash': + $label = esc_html__('Rejected', 'modern-events-calendar-lite'); + $status_class = 'mec-book-pending'; + break; + default: + $label = esc_html__(ucwords($label), 'modern-events-calendar-lite'); + $status_class = 'mec-book-other'; + break; + } + + return !$return_class ? $label : array('label' => $label, 'status_class' => $status_class); + } + + /** + * Get Label for booking verification + * @author Webnus + * @param int $verified + * @return string + */ + public function get_verification_label($verified = 1) + { + if ($verified == '1') $label = esc_html__('Verified', 'modern-events-calendar-lite'); + elseif ($verified == '-1') $label = esc_html__('Canceled', 'modern-events-calendar-lite'); + else $label = esc_html__('Waiting', 'modern-events-calendar-lite'); + + return $label; + } + + /** + * Added Block Editor Custome Category + * @author Webnus + * @param array $categories + * @return array + */ + public function add_custom_block_cateogry($categories) + { + $categories = array_merge(array(array('slug' => 'mec.block.category', 'title' => esc_html__('M.E. Calender', 'modern-events-calendar-lite'), 'icon' => 'calendar-alt')), $categories); + return $categories; + } + + /** + * Advanced Repeating MEC Active + * @author Webnus + * @param array $days + * @param string $item + */ + public function mec_active($days = array(), $item = '') + { + if (is_array($days) and in_array($item, $days)) echo 'mec-active'; + } + + /** + * Advanced repeat sorting by start of week day number + * @author Webnus + * @param int $start_of_week + * @param $day + * @return string|boolean + */ + public function advanced_repeating_sort_day($start_of_week = 1, $day = 1) + { + if (func_num_args() < 2) return false; + + $start_of_week = intval($start_of_week); + $day = intval($day) == 0 ? intval($day) : intval($day) - 1; + + // KEEP IT FOR TRANSLATORS + array(__('Sun', 'modern-events-calendar-lite'), esc_html__('Mon', 'modern-events-calendar-lite'), esc_html__('Tue', 'modern-events-calendar-lite'), esc_html__('Wed', 'modern-events-calendar-lite'), esc_html__('Thu', 'modern-events-calendar-lite'), esc_html__('Fri', 'modern-events-calendar-lite'), esc_html__('Sat', 'modern-events-calendar-lite')); + + // DO NOT MAKE THEM TRANSLATE-ABLE + $days = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); + + $s1 = array_splice($days, $start_of_week, count($days)); + $s2 = array_splice($days, 0, $start_of_week); + $merge = array_merge($s1, $s2); + + return $merge[$day]; + } + + public function get_ical_rrules($event, $only_rrule = false) + { + if (is_numeric($event)) { + $render = $this->getRender(); + $event = $render->data($event); + } + + $recurrence = []; + if (isset($event->mec->repeat) and $event->mec->repeat) { + $repeat_options = (isset($event->meta) and isset($event->meta['mec_repeat']) and is_array($event->meta['mec_repeat'])) ? $event->meta['mec_repeat'] : []; + + $finish_time = $event->time['end']; + $finish_time = str_replace(array('h:', 'H:', 'H'), 'h', $finish_time); + $finish_time = str_replace(array('h ', 'h'), ':', $finish_time); + + $finish = ''; + if ($event->mec->end != '0000-00-00') { + $time_format = 'Ymd\\THi00\\Z'; + $finish_datetime = strtotime($event->mec->end . ' ' . $finish_time); + + $gmt_offset_seconds = $this->get_gmt_offset_seconds($finish_datetime, $event); + $finish = gmdate($time_format, ($finish_datetime - $gmt_offset_seconds)); + } + + $freq = ''; + $interval = '1'; + $bysetpos = ''; + $byday = ''; + $wkst = ''; + $count = ''; + + $repeat_type = $event->meta['mec_repeat_type']; + $week_day_mapping = array('1' => 'MO', '2' => 'TU', '3' => 'WE', '4' => 'TH', '5' => 'FR', '6' => 'SA', '7' => 'SU'); + + if ($repeat_type == 'daily') { + $freq = 'DAILY'; + $interval = $event->mec->rinterval; + } elseif ($repeat_type == 'weekly') { + $freq = 'WEEKLY'; + $interval = ($event->mec->rinterval / 7); + } elseif ($repeat_type == 'monthly') { + $freq = 'MONTHLY'; + $interval = $event->mec->rinterval; + } elseif ($repeat_type == 'yearly') $freq = 'YEARLY'; + elseif ($repeat_type == 'weekday') { + $mec_weekdays = explode(',', trim($event->mec->weekdays, ',')); + foreach ($mec_weekdays as $mec_weekday) $byday .= $week_day_mapping[$mec_weekday] . ','; + + $byday = trim($byday, ', '); + $freq = 'WEEKLY'; + } elseif ($repeat_type == 'weekend') { + $mec_weekdays = explode(',', trim($event->mec->weekdays, ',')); + foreach ($mec_weekdays as $mec_weekday) $byday .= $week_day_mapping[$mec_weekday] . ','; + + $byday = trim($byday, ', '); + $freq = 'WEEKLY'; + } elseif ($repeat_type == 'certain_weekdays') { + $mec_weekdays = explode(',', trim($event->mec->weekdays, ',')); + foreach ($mec_weekdays as $mec_weekday) $byday .= $week_day_mapping[$mec_weekday] . ','; + + $byday = trim($byday, ', '); + $freq = 'WEEKLY'; + } elseif ($repeat_type == 'advanced') { + $advanced_days = is_array($event->meta['mec_advanced_days']) ? $event->meta['mec_advanced_days'] : []; + + $first_rule = $advanced_days[0] ?? NULL; + $ex = explode('.', $first_rule); + + $w = $ex[1] ?? NULL; + if ($w === 'l') $w = -1; + + $byday_mapping = array('MON' => 'MO', 'TUE' => 'TU', 'WED' => 'WE', 'THU' => 'TH', 'FRI' => 'FR', 'SAT' => 'SA', 'SUN' => 'SU'); + $byday = $w . $byday_mapping[strtoupper($ex[0])]; + + $wkst_mapping = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); + $wkst = $wkst_mapping[$this->get_first_day_of_week()]; + + $freq = 'MONTHLY'; + } elseif ($repeat_type == 'custom_days') { + $freq = ''; + $mec_periods = explode(',', trim($event->mec->days, ',')); + + // Add main occurrence + if (isset($event->meta, $event->meta['mec_start_datetime'], $event->meta['mec_end_datetime'])) { + $main_occ_start = strtotime($event->meta['mec_start_datetime']); + $main_occ_end = strtotime($event->meta['mec_end_datetime']); + + array_unshift($mec_periods, date('Y-m-d', $main_occ_start) . ':' . date('Y-m-d', $main_occ_end) . ':' . date('h-i-A', $main_occ_start) . ':' . date('h-i-A', $main_occ_end)); + } + + $days = ''; + foreach ($mec_periods as $mec_period) { + $mec_days = explode(':', trim($mec_period, ': ')); + if (!isset($mec_days[1])) continue; + + $time_start = $event->time['start']; + if (isset($mec_days[2])) $time_start = str_replace('-', ':', str_replace('-AM', ' AM', str_replace('-PM', ' PM', $mec_days[2]))); + + $time_end = $event->time['end']; + if (isset($mec_days[3])) $time_end = str_replace('-', ':', str_replace('-AM', ' AM', str_replace('-PM', ' PM', $mec_days[3]))); + + $start_time = strtotime($mec_days[0] . ' ' . $time_start); + $end_time = strtotime($mec_days[1] . ' ' . $time_end); + + // All Day Event + if (isset($event->meta['mec_date']) and isset($event->meta['mec_date']['allday']) and $event->meta['mec_date']['allday']) { + $start_time = strtotime("Today", $start_time); + $end_time = strtotime('Tomorrow', $end_time); + } + + $gmt_offset_seconds = $this->get_gmt_offset_seconds($start_time, $event); + + $days .= gmdate('Ymd\\THi00\\Z', ($start_time - $gmt_offset_seconds)) . '/' . gmdate('Ymd\\THi00\\Z', ($end_time - $gmt_offset_seconds)) . ','; + } + + // Add RDATE + $recurrence[] = trim('RDATE;VALUE=PERIOD:' . trim($days, ', '), '; '); + } + + // Add RRULE + if (trim($freq)) { + $rrule = 'RRULE:FREQ=' . $freq . ';' + . ($interval > 1 ? 'INTERVAL=' . $interval . ';' : '') + . ($count != '' ? 'COUNT=' . $count : (($finish != '0000-00-00' and $finish != '') ? 'UNTIL=' . $finish . ';' : '')) + . ($wkst != '' ? 'WKST=' . $wkst . ';' : '') + . ($bysetpos != '' ? 'BYSETPOS=' . $bysetpos . ';' : '') + . ($byday != '' ? 'BYDAY=' . $byday . ';' : ''); + + $recurrence[] = trim($rrule, '; '); + } + + if (trim($event->mec->not_in_days)) { + $mec_not_in_days = explode(',', trim($event->mec->not_in_days, ',')); + $seconds_start = $event->mec->time_start; + + $not_in_days = ''; + foreach ($mec_not_in_days as $mec_not_in_day) { + $timestamp = strtotime($mec_not_in_day) + $seconds_start; + + $gmt_offset_seconds = $this->get_gmt_offset_seconds($timestamp, $event); + $not_in_days .= gmdate('Ymd\THis\Z', $timestamp - $gmt_offset_seconds) . ','; + } + + // Add EXDATE + $recurrence[] = trim('EXDATE:' . trim($not_in_days, ', '), '; '); + } + } + + if ($only_rrule) { + $rrule = ''; + if (is_array($recurrence) and count($recurrence)) { + foreach ($recurrence as $recur) { + if (strpos($recur, 'RRULE') !== false) $rrule = $recur; + } + } + + return $rrule; + } else return $recurrence; + } + + public static function get_upcoming_events($limit = 12) + { + MEC::import('app.skins.list'); + + // Get list skin + $list = new MEC_skin_list(); + + // Attributes + $atts = [ + 'show_past_events' => 1, + 'start_date_type' => 'today', + 'sk-options' => [ + 'list' => ['limit' => 20] + ], + ]; + + // Initialize the skin + $list->initialize($atts); + + // Fetch the events + $list->fetch(); + + return $list->events; + } + + /** + * Do the shortcode and return its output + * @author Webnus + * @param integer $shortcode_id + * @return string + */ + public static function get_shortcode_events($shortcode_id) + { + // Get Render + $render = new MEC_render(); + $atts = apply_filters('mec_calendar_atts', $render->parse($shortcode_id, array())); + + $skin = isset($atts['skin']) ? $atts['skin'] : $render->get_default_layout(); + + $path = MEC::import('app.skins.' . $skin, true, true); + $skin_path = apply_filters('mec_skin_path', $skin); + + if ($skin_path != $skin and $render->file->exists($skin_path)) $path = $skin_path; + if (!$render->file->exists($path)) { + return esc_html__('Skin controller does not exist.', 'modern-events-calendar-lite'); + } + + include_once $path; + + $skin_class_name = 'MEC_skin_' . $skin; + + // Create Skin Object Class + $SKO = new $skin_class_name(); + + // Initialize the skin + $SKO->initialize($atts); + + // Fetch the events + $SKO->fetch(); + + // Return the Events + return $SKO->events; + } + + /** + * User limited for booking an event + * @author Webnus + * @param string $user_email + * @param array $ticket_info + * @param integer $limit + * @return array|boolean + */ + public function booking_permitted($user_email, $ticket_info, $limit) + { + if (!is_array($ticket_info) or is_array($ticket_info) and count($ticket_info) < 2) return false; + + $user_email = sanitize_email($user_email); + $user = $this->getUser()->by_email($user_email); + $user_id = isset($user->ID) ? $user->ID : 0; + + // It's the first booking of this email + if (!$user_id) return true; + + $event_id = isset($ticket_info['event_id']) ? intval($ticket_info['event_id']) : 0; + $count = isset($ticket_info['count']) ? intval($ticket_info['count']) : 0; + + $timestamp = isset($ticket_info['date']) ? $ticket_info['date'] : ''; + if (!is_numeric($timestamp)) $timestamp = strtotime($timestamp); + + $year = date('Y', $timestamp); + $month = date('m', $timestamp); + $day = date('d', $timestamp); + $hour = date('H', $timestamp); + $minutes = date('i', $timestamp); + + $permission = true; + $query = new WP_Query(array( + 'post_type' => $this->get_book_post_type(), + 'author' => $user_id, + 'posts_per_page' => -1, + 'post_status' => array('publish', 'pending', 'draft', 'future', 'private'), + 'year' => $year, + 'monthnum' => $month, + 'day' => $day, + 'hour' => $hour, + 'minute' => $minutes, + 'meta_query' => array( + array('key' => 'mec_event_id', 'value' => $event_id, 'compare' => '='), + array('key' => 'mec_verified', 'value' => '-1', 'compare' => '!='), // Don't include canceled bookings + array('key' => 'mec_confirmed', 'value' => '-1', 'compare' => '!='), // Don't include rejected bookings + ) + )); + + $bookings = 0; + if ($query->have_posts()) { + while ($query->have_posts()) { + $query->the_post(); + + $ticket_ids_string = trim(get_post_meta(get_the_ID(), 'mec_ticket_id', true), ', '); + $ticket_ids_count = count(explode(',', $ticket_ids_string)); + + $bookings += $ticket_ids_count; + } + } + + if (($bookings + $count) > $limit) $permission = false; + + return array('booking_count' => $bookings, 'permission' => $permission); + } + + public function booking_permitted_by_ip($event_id, $limit, $ticket_info = array()) + { + if (!is_array($ticket_info) or count($ticket_info) < 2) return false; + + $count = isset($ticket_info['count']) ? intval($ticket_info['count']) : 0; + + $timestamp = isset($ticket_info['date']) ? $ticket_info['date'] : ''; + if (!is_numeric($timestamp) && $timestamp) $timestamp = strtotime($timestamp); + + $year = date('Y', $timestamp); + $month = date('m', $timestamp); + $day = date('d', $timestamp); + $hour = date('H', $timestamp); + $minutes = date('i', $timestamp); + + $attendee_ip = $this->get_client_ip(); + + $args = array( + 'post_type' => $this->get_book_post_type(), + 'posts_per_page' => -1, + 'post_status' => array('publish', 'pending', 'draft', 'future', 'private'), + 'year' => $year, + 'monthnum' => $month, + 'day' => $day, + 'hour' => $hour, + 'minute' => $minutes, + 'meta_query' => array( + array( + 'key' => 'mec_event_id', + 'value' => $event_id, + 'compare' => '=', + ), + array( + 'key' => 'mec_verified', + 'value' => '-1', + 'compare' => '!=', + ), + array( + 'key' => 'mec_confirmed', + 'value' => '-1', + 'compare' => '!=', + ), + array( + 'key' => 'mec_attendees', + 'value' => $attendee_ip, + 'compare' => 'LIKE', + ), + ), + ); + + $bookings = 0; + $permission = true; + $mec_books = get_posts($args); + + foreach ($mec_books as $mec_book) { + $get_attendees = get_post_meta($mec_book->ID, 'mec_attendees', true); + if (is_array($get_attendees)) { + foreach ($get_attendees as $attendee) { + if (isset($attendee['buyerip']) and trim($attendee['buyerip'], '') == $attendee_ip) { + $bookings += isset($attendee['count']) ? intval($attendee['count']) : 0; + } + } + } + } + + if (($bookings + $count) > $limit) $permission = false; + + return array('booking_count' => $bookings, 'permission' => $permission); + } + + /** + * Return SoldOut Or A Few Tickets Label + * @author Webnus + * @param string|object $event + * @param string $date + * @return string|boolean + */ + public function get_flags($event, $date = NULL) + { + if (is_object($event)) { + $event_id = $event->data->ID; + + if (is_array($date) and isset($date['start']) and isset($date['start']['timestamp'])) $timestamp = $date['start']['timestamp']; + elseif (is_array($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $timestamp = $event->date['start']['timestamp']; + else $timestamp = $event->data->time['start_timestamp']; + } else { + $event_id = $event; + $timestamp = $date ? strtotime($date) : 0; + } + + if ((!isset($event_id) or !trim($event_id)) or !trim($timestamp)) return false; + + // MEC Settings + $settings = $this->get_settings(); + + // Booking on single page is disabled + if (!isset($settings['booking_status']) or (isset($settings['booking_status']) and !$settings['booking_status'])) return false; + + // Original Event ID for Multilingual Websites + $event_id = $this->get_original_event($event_id); + + // No Tickets + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if (!is_array($tickets) or (is_array($tickets) and !count($tickets))) return false; + + // MEC Cache + $cache = $this->getCache(); + + // Return from Cache + if ($cache->has('flag-' . $event_id . ':' . $timestamp)) return $cache->get('flag-' . $event_id . ':' . $timestamp); + + $total_event_seats = 0; + foreach ($tickets as $ticket_id => $ticket) { + if (!is_numeric($ticket_id)) continue; + + $bookings_limit_unlimited = isset($ticket['unlimited']) ? $ticket['unlimited'] : 0; + if (!$bookings_limit_unlimited and $total_event_seats >= 0 and isset($ticket['limit']) and is_numeric($ticket['limit']) and $ticket['limit'] >= 0) $total_event_seats += $ticket['limit']; + else $total_event_seats = -1; + } + + // Convert Timestamp + $timestamp = $this->get_start_time_of_multiple_days($event_id, $timestamp); + + $book = $this->getBook(); + $availability = $book->get_tickets_availability($event_id, $timestamp); + + if (!is_array($availability) or (is_array($availability) and !count($availability))) return false; + + $sale_stopped = false; + $remained_tickets = 0; + + foreach ($availability as $ticket_id => $remained) { + if (is_numeric($ticket_id) and $remained >= 0) $remained_tickets += $remained; + if (is_numeric($ticket_id) and isset($availability['stop_selling_' . $ticket_id]) and $availability['stop_selling_' . $ticket_id]) $sale_stopped = true; + + // Unlimited Tickets + if (is_numeric($ticket_id) and $remained == -1) { + $remained_tickets = -1; + break; + } + } + + if (isset($availability['total']) and $availability['total'] >= 0 and $remained_tickets >= 0) $remained_tickets = (int) min($availability['total'], $remained_tickets); + + $add_css_class = $remained_tickets ? 'mec-few-tickets' : ''; + $output_tag = ' %%title%% '; + + // Return Sale Has ended + if ($sale_stopped) { + $flag = str_replace('%%title%%', esc_html__('Sale has ended', 'modern-events-calendar-lite'), $output_tag) . ''; + $cache->set('flag-' . $event_id . ':' . $timestamp, $flag); + + return $flag; + } + // Return Sold Out Label + else if ($remained_tickets === 0) { + $flag = str_replace('%%title%%', esc_html__('Sold Out', 'modern-events-calendar-lite'), $output_tag) . ''; + $cache->set('flag-' . $event_id . ':' . $timestamp, $flag); + + return $flag; + } + + // Booking Options + $booking_options = get_post_meta($event_id, 'mec_booking', true); + + $bookings_last_few_tickets_percentage_inherite = isset($booking_options['last_few_tickets_percentage_inherit']) ? $booking_options['last_few_tickets_percentage_inherit'] : 1; + $bookings_last_few_tickets_percentage = ((isset($booking_options['last_few_tickets_percentage']) and trim($booking_options['last_few_tickets_percentage']) != '') ? $booking_options['last_few_tickets_percentage'] : NULL); + + $total_bookings_limit = (isset($booking_options['bookings_limit']) and trim($booking_options['bookings_limit'])) ? $booking_options['bookings_limit'] : 100; + $bookings_limit_unlimited = isset($booking_options['bookings_limit_unlimited']) ? $booking_options['bookings_limit_unlimited'] : 0; + if ($bookings_limit_unlimited == '1') $total_bookings_limit = -1; + + // Get Per Occurrence + $total_bookings_limit = MEC_feature_occurrences::param($event_id, $timestamp, 'bookings_limit', $total_bookings_limit); + + if (count($tickets) === 1) { + $ticket = reset($tickets); + if (isset($ticket['limit']) and trim($ticket['limit'])) $total_bookings_limit = $ticket['limit']; + + $bookings_limit_unlimited = isset($ticket['unlimited']) ? $ticket['unlimited'] : 0; + if ($bookings_limit_unlimited == '1') $total_bookings_limit = -1; + } + + if ($total_event_seats >= 0 and $total_bookings_limit >= 0 and $total_event_seats < $total_bookings_limit) $total_bookings_limit = $total_event_seats; + + // Percentage + $percentage = ((isset($settings['booking_last_few_tickets_percentage']) and trim($settings['booking_last_few_tickets_percentage']) != '') ? $settings['booking_last_few_tickets_percentage'] : 15); + if (!$bookings_last_few_tickets_percentage_inherite and $bookings_last_few_tickets_percentage) $percentage = (int) $bookings_last_few_tickets_percentage; + + // Return A Few Ticket Label + if (($total_bookings_limit > 0) and ($remained_tickets > 0 and $remained_tickets <= (($percentage * $total_bookings_limit) / 100))) { + $flag = str_replace('%%title%%', esc_html__('Last Few Tickets', 'modern-events-calendar-lite'), $output_tag); + $cache->set('flag-' . $event_id . ':' . $timestamp, $flag); + + return $flag; + } + + $cache->set('flag-' . $event_id . ':' . $timestamp, false); + return false; + } + + public function is_soldout($event, $date) + { + return (bool) $this->get_flags($event, $date); + } + + /** + * Add Query String To URL + * @param string $url + * @param string $key + * @param string $value + * @resourse wp-mix.com + * @return string + */ + public function add_query_string($url, $key, $value) + { + $url = preg_replace('/([?&])' . $key . '=.*?(&|$)/i', '$1$2$4', $url); + + if (substr($url, strlen($url) - 1) == "?" or substr($url, strlen($url) - 1) == "&") + $url = substr($url, 0, -1); + + if (strpos($url, '?') === false) { + return ($url . '?' . $key . '=' . $value); + } else { + return ($url . '&' . $key . '=' . $value); + } + } + + /** + * Check Is DateTime Format Validation + * @param string $format + * @param string $date + * @return boolean + */ + public function check_date_time_validation($format, $date) + { + if (func_num_args() < 2) return false; + + $check = DateTime::createFromFormat($format, $date); + + return $check && $check->format($format) === $date; + } + + public function get_start_of_multiple_days($event_id, $date) + { + if (is_null($date) || trim($date) == '') return NULL; + + if (is_numeric($date)) { + + $date = date('Y-m-d', $date); + } + + $cache = $this->getCache(); + return $cache->rememberOnce('start-multiple-days-' . $event_id . '-' . $date, function () use ($event_id, $date) { + $db = $this->getDB(); + return $db->select("SELECT `dstart` FROM `#__mec_dates` WHERE `post_id`='" . $event_id . "' AND ((`dstart`='" . esc_sql($date) . "') OR (`dstart`<'" . esc_sql($date) . "' AND `dend`>='" . esc_sql($date) . "')) ORDER BY `dstart` DESC LIMIT 1", 'loadResult'); + }); + } + + public function get_start_time_of_multiple_days($event_id, $time) + { + if (is_null($time) || !trim($time)) return NULL; + + // Cache + $cache = $this->getCache(); + + // Get Start Time + $new_time = $cache->rememberOnce('start-multiple-days-start-time' . $event_id . ':' . $time, function () use ($event_id, $time) { + // Database + $db = $this->getDB(); + + return $db->select("SELECT `tstart` FROM `#__mec_dates` WHERE `post_id`=" . $event_id . " AND ((`tstart`=" . esc_sql($time) . ") OR (`tstart`<" . esc_sql($time) . " AND `tend`>" . esc_sql($time) . ")) ORDER BY `tstart` DESC LIMIT 1", 'loadResult'); + }); + + return ($new_time ? $new_time : $time); + } + + public function is_midnight_event($event) + { + // Settings + $settings = $this->get_settings(); + + $start_timestamp = strtotime($event->date['start']['date']); + $end_timestamp = strtotime($event->date['end']['date']); + + $diff = $this->date_diff($event->date['start']['date'], $event->date['end']['date']); + $days = (isset($diff->days) and !$diff->invert) ? $diff->days : 0; + + $time = $event->data->time['end_raw']; + + // Midnight Hour + $midnight_hour = (isset($settings['midnight_hour']) and $settings['midnight_hour']) ? $settings['midnight_hour'] : 0; + $midnight = $end_timestamp + (3600 * $midnight_hour); + + // End Date is before Midnight + if ($days == 1 and $start_timestamp < $end_timestamp and $midnight >= strtotime($event->date['end']['date'] . ' ' . $time)) return true; + + return false; + } + + public function mec_content_html($text, $max_length) + { + $tags = []; + $result = ""; + $is_open = false; + $grab_open = false; + $is_close = false; + $in_double_quotes = false; + $in_single_quotes = false; + $tag = ""; + $i = 0; + $stripped = 0; + $stripped_text = strip_tags($text); + + while ($i < strlen($text) && $stripped < strlen($stripped_text) && $stripped < $max_length) { + $symbol = $text[$i]; + $result .= $symbol; + switch ($symbol) { + case '<': + $is_open = true; + $grab_open = true; + break; + + case '"': + if ($in_double_quotes) $in_double_quotes = false; + else $in_double_quotes = true; + break; + + case "'": + if ($in_single_quotes) $in_single_quotes = false; + else $in_single_quotes = true; + break; + + case '/': + if ($is_open && !$in_double_quotes && !$in_single_quotes) { + $is_close = true; + $is_open = false; + $grab_open = false; + } + + break; + + case ' ': + if ($is_open) $grab_open = false; + else $stripped++; + + break; + + case '>': + if ($is_open) { + $is_open = false; + $grab_open = false; + array_push($tags, $tag); + $tag = ""; + } elseif ($is_close) { + $is_close = false; + array_pop($tags); + $tag = ""; + } + + break; + + default: + if ($grab_open || $is_close) $tag .= $symbol; + if (!$is_open && !$is_close) $stripped++; + } + + $i++; + } + + while ($tags) $result .= ""; + + return $result; + } + + public function get_users_dropdown($current = array(), $notifications = 'booking_notification') + { + ob_start(); + $users_stat = count_users(); + + if (is_array($users_stat) and isset($users_stat['total_users']) and $users_stat['total_users'] > 500): + ?> + + + + getDB(); + $users_list = $db->select(substr(trim($query), 0, -2), 'loadObjectList'); + } + + return array_keys($users_list); + } + + public function get_roles_dropdown($current = array(), $notifications = 'booking_notification') + { + global $wp_roles; + $roles = $wp_roles->get_names(); + ob_start(); + ?> + + $role, + )); + + if (count($curren_get_users)) { + foreach ($curren_get_users as $user) { + if (isset($user->data->user_email) and !in_array($user->data->user_email, $user_list)) $user_list[] = $user->data->user_email; + } + } + } + + return $user_list; + } + + public function get_normal_labels($event, $display_label = false) + { + $output = ''; + + if ($display_label != false and is_object($event) and isset($event->data->labels) and !empty($event->data->labels)) { + foreach ($event->data->labels as $label) { + if (isset($label['style']) and !trim($label['style']) and isset($label['name']) and trim($label['name'])) $output .= '' . trim($label['name']) . ''; + } + } + + // Ongoing Event + if ($display_label and $this->is_ongoing($event)) $output .= '' . $this->m('ongoing', esc_html__('Ongoing', 'modern-events-calendar-lite')) . ''; + // Expired Event + elseif ($display_label and $this->is_expired($event)) $output .= '' . $this->m('expired', esc_html__('Expired', 'modern-events-calendar-lite')) . ''; + // Upcoming Event + elseif ($display_label and is_object($event) and isset($event->date, $event->date['start'], $event->date['start']['timestamp'])) { + // Settings + $settings = $this->get_settings(); + + // Remaining Time + $remaining = $event->date['start']['timestamp'] - current_time('timestamp'); + + // Remaining Time + if ($remaining > 0 and isset($settings['remaining_time_label']) and $settings['remaining_time_label']) { + // Months + if ($remaining >= 7776000) $remaining_str = sprintf(esc_html__('%s months', 'modern-events-calendar-lite'), number_format_i18n(round($remaining / 2592000), 0)); + // Days + else if ($remaining >= 172800) $remaining_str = sprintf(esc_html__('%s days', 'modern-events-calendar-lite'), number_format_i18n(round($remaining / 86400), 0)); + // Hours + else if ($remaining >= 7200) $remaining_str = sprintf(esc_html__('%s hours', 'modern-events-calendar-lite'), number_format_i18n(round($remaining / 3600), 0)); + // Minutes + else $remaining_str = sprintf(esc_html__('%s minutes', 'modern-events-calendar-lite'), number_format_i18n(round($remaining / 60), 0)); + + $output .= '' . $remaining_str . ''; + } + } + + return $output ? '' . MEC_kses::element($output) . '' : $output; + } + + public function display_cancellation_reason($event, $display_reason = false) + { + if (!is_object($event)) return ''; + + $event_id = $event->ID; + if (isset($event->requested_id)) $event_id = $event->requested_id; // Requested Event in Multilingual Websites + + $start_timestamp = (isset($event->data->time['start_timestamp']) ? $event->data->time['start_timestamp'] : (isset($event->date['start']['timestamp']) ? $event->date['start']['timestamp'] : strtotime($event->date['start']['date']))); + + // All Params + $params = MEC_feature_occurrences::param($event_id, $start_timestamp, '*'); + + $event_status = (isset($event->data->meta['mec_event_status']) and trim($event->data->meta['mec_event_status'])) ? $event->data->meta['mec_event_status'] : 'EventScheduled'; + $event_status = (isset($params['event_status']) and trim($params['event_status']) != '') ? $params['event_status'] : $event_status; + + $reason = get_post_meta($event_id, 'mec_cancelled_reason', true); + $reason = (isset($params['cancelled_reason']) and trim($params['cancelled_reason']) != '') ? $params['cancelled_reason'] : $reason; + + $output = ''; + if (isset($event_status) and $event_status == 'EventCancelled' && $display_reason != false and isset($reason) and !empty($reason)) { + $output = '
    ' . MEC_kses::element($reason) . '
    '; + } + + return $output; + } + + public function standardize_format($date = '', $format = 'Y-m-d') + { + if (!trim($date)) return ''; + + $date = str_replace('.', '-', $date); + $f = explode('&', trim($format)); + + if (isset($f[1])) $return = date($f[1], strtotime($date)); + else $return = date($format, strtotime($date)); + + return $return; + } + + public function timepicker($args) + { + $method = isset($args['method']) ? $args['method'] : 24; + $time_hour = isset($args['time_hour']) ? $args['time_hour'] : NULL; + $time_minutes = isset($args['time_minutes']) ? $args['time_minutes'] : NULL; + $time_ampm = isset($args['time_ampm']) ? $args['time_ampm'] : NULL; + $name = isset($args['name']) ? $args['name'] : 'mec[date]'; + $id_key = isset($args['id_key']) ? $args['id_key'] : ''; + + $hour_key = isset($args['hour_key']) ? $args['hour_key'] : 'hour'; + $minutes_key = isset($args['minutes_key']) ? $args['minutes_key'] : 'minutes'; + $ampm_key = isset($args['ampm_key']) ? $args['ampm_key'] : 'ampm'; + + if ($method == 24) { + if ($time_ampm == 'PM' and $time_hour != 12) $time_hour += 12; + if ($time_ampm == 'AM' and $time_hour == 12) $time_hour += 12; + ?> + + : + + + + : + + +is_ongoing($event)) return '
    ' . $this->m('ongoing', esc_html__('Ongoing...', 'modern-events-calendar-lite')) . '
    '; + elseif ($this->is_expired($event)) return '
    ' . $this->m('expired', esc_html__('Expired!', 'modern-events-calendar-lite')) . '
    '; + + return ''; + } + + public function is_ongoing($event) + { + $date = (($event and isset($event->date)) ? $event->date : array()); + + $start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : NULL; + $end_date = (isset($date['end']) and isset($date['end']['date'])) ? $date['end']['date'] : NULL; + + if (!$start_date or !$end_date) return false; + + $start_time = NULL; + if (isset($date['start']['hour'])) { + $s_hour = $date['start']['hour']; + if (isset($date['start']['ampm']) and strtoupper($date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_time = sprintf("%02d", $s_hour) . ':'; + $start_time .= sprintf("%02d", $date['start']['minutes']); + if (isset($date['start']['ampm'])) $start_time .= ' ' . trim($date['start']['ampm']); + } elseif (isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['start_timestamp'])) $start_time = date('H:i', $event->data->time['start_timestamp']); + + $end_time = NULL; + if (isset($date['end']['hour'])) { + $e_hour = $date['end']['hour']; + if (isset($date['end']['ampm']) and strtoupper($date['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $end_time = sprintf("%02d", $e_hour) . ':'; + $end_time .= sprintf("%02d", $date['end']['minutes']); + if ($date['end']['ampm']) $end_time .= ' ' . trim($date['end']['ampm']); + } elseif (isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['end_timestamp'])) $end_time = date('H:i', $event->data->time['end_timestamp']); + + if (!$start_time or !$end_time) return false; + + $allday = get_post_meta($event->ID, 'mec_allday', true); + if ($allday) { + $start_time = '12:01 AM'; + $end_time = '11:59 PM'; + } + + // Timezone + $TZO = $this->get_TZO($event); + + $d1 = new DateTime($start_date . ' ' . $start_time, $TZO); + $d2 = new DateTime('now', $TZO); + $d3 = new DateTime($end_date . ' ' . $end_time, $TZO); + + // The event is ongoing + if ($d1 <= $d2 and $d3 > $d2) return true; + return false; + } + + public function is_expired($event) + { + $date = (($event and isset($event->date)) ? $event->date : array()); + + $end_date = (isset($date['end']) and isset($date['end']['date'])) ? $date['end']['date'] : NULL; + if (!$end_date) return false; + + $e_hour = (isset($date['end']['hour']) ? $date['end']['hour'] : 11); + if (isset($date['end']['ampm']) and strtoupper($date['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $end_time = sprintf("%02d", $e_hour) . ':'; + $end_time .= sprintf("%02d", (isset($date['end']['minutes']) ? $date['end']['minutes'] : 59)); + $end_time .= ' ' . (isset($date['end']['ampm']) ? trim($date['end']['ampm']) : 'PM'); + + $allday = isset($date['allday']) ? $date['allday'] : 0; + if ($allday) $end_time = '11:59 PM'; + + // Timezone + $TZO = $this->get_TZO($event); + + $d1 = new DateTime('now', $TZO); + $d2 = new DateTime($end_date . ' ' . $end_time, $TZO); + + // The event is expired + if ($d2 < $d1) return true; + return false; + } + + public function is_started($event) + { + $date = (($event and isset($event->date)) ? $event->date : array()); + + $start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : NULL; + if (!$start_date) return false; + + $s_hour = (isset($date['start']['hour']) ? $date['start']['hour'] : NULL); + if (isset($date['start']['ampm']) and strtoupper($date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_time = sprintf("%02d", $s_hour) . ':'; + $start_time .= sprintf("%02d", (isset($date['start']['minutes']) ? $date['start']['minutes'] : NULL)); + $start_time .= ' ' . (isset($date['start']['ampm']) ? trim($date['start']['ampm']) : NULL); + + $allday = (isset($date['allday']) ? $date['allday'] : 0); + if ($allday) $start_time = '12:01 AM'; + + // Timezone + $TZO = $this->get_TZO($event); + + $d1 = new DateTime($start_date . ' ' . $start_time, $TZO); + $d2 = new DateTime('now', $TZO); + + // The event is started + if ($d1 <= $d2) return true; + return false; + } + + public function array_key_first($arr) + { + if (!function_exists('array_key_first')) { + reset($arr); + return key($arr); + } else return array_key_first($arr); + } + + public function array_key_last($arr) + { + if (!function_exists('array_key_last')) { + end($arr); + return key($arr); + } else return array_key_last($arr); + } + + public function is_day_first($format = '') + { + if (!trim($format)) $format = get_option('date_format'); + $chars = str_split($format); + + $status = true; + foreach ($chars as $char) { + if (in_array($char, array('d', 'D', 'j', 'l', 'N', 'S', 'w', 'z'))) { + $status = true; + break; + } elseif (in_array($char, array('F', 'm', 'M', 'n'))) { + $status = false; + break; + } + } + + return $status; + } + + public function is_year_first($format = '') + { + if (!trim($format)) $format = get_option('date_format'); + $chars = str_split($format); + + $status = true; + foreach ($chars as $char) { + if (in_array($char, array('Y', 'y', 'o'))) { + $status = true; + break; + } elseif (in_array($char, array('F', 'm', 'M', 'n', 'd', 'D', 'j', 'l', 'N', 'S', 'w', 'z'))) { + $status = false; + break; + } + } + + return $status; + } + + public function timezones($selected) + { + $output = wp_timezone_choice($selected); + + $ex = explode('ID; + + // Event Repeat Type + $repeat_type = (!empty($event->meta['mec_repeat_type']) ? $event->meta['mec_repeat_type'] : ''); + + $md_start = $this->get_start_of_multiple_days($event_id, $occurrence); + if ($md_start) $occurrence = $md_start; + + $md_start_time = $this->get_start_time_of_multiple_days($event_id, $occurrence_time); + if ($md_start_time) $occurrence_time = $md_start_time; + + if (strtotime($occurrence) and in_array($repeat_type, array('certain_weekdays', 'custom_days', 'weekday', 'weekend', 'advanced'))) $occurrence = date('Y-m-d', strtotime($occurrence)); + elseif (strtotime($occurrence)) { + $new_occurrence = date('Y-m-d', strtotime('-1 day', strtotime($occurrence))); + if (in_array($repeat_type, array('monthly')) and date('m', strtotime($new_occurrence)) != date('m', strtotime($occurrence))) $new_occurrence = date('Y-m-d', strtotime($occurrence)); + + $occurrence = $new_occurrence; + } else $occurrence = NULL; + + $render = $this->getRender(); + return $render->dates($event_id, ($event->data ?? NULL), $maximum, (trim($occurrence_time) ? date('Y-m-d H:i:s', $occurrence_time) : $occurrence)); + } + + public function get_post_thumbnail_url($post = NULL, $size = 'post-thumbnail') + { + if (function_exists('get_the_post_thumbnail_url')) return get_the_post_thumbnail_url($post, $size); + else { + $post_thumbnail_id = get_post_thumbnail_id($post); + if (!$post_thumbnail_id) return false; + + $image = wp_get_attachment_image_src($post_thumbnail_id, $size); + return $image['0'] ?? false; + } + } + + public function is_multipleday_occurrence($event, $check_same_month = false) + { + // Multiple Day Flag + if (isset($event->data) and isset($event->data->multipleday)) return (bool) $event->data->multipleday; + + $start_date = ((isset($event->date) and isset($event->date['start']) and isset($event->date['start']['date'])) ? $event->date['start']['date'] : NULL); + $end_date = ((isset($event->date) and isset($event->date['end']) and isset($event->date['end']['date'])) ? $event->date['end']['date'] : NULL); + + if ($check_same_month) { + $multipleday = (!is_null($start_date) and $start_date !== $end_date); + return ($multipleday and (date('m', strtotime($start_date)) == date('m', strtotime($end_date)))); + } + + return (!is_null($start_date) and $start_date !== $end_date); + } + + public function get_wp_user_fields() + { + $meta_keys = get_transient('mec-user-meta-keys'); + if (!empty($meta_keys)) { + + return $meta_keys; + } + + $db = $this->getDB(); + $raw_fields = $db->select("SELECT DISTINCT `meta_key` FROM `#__usermeta` WHERE `meta_value` NOT LIKE '%{%'"); + + $forbidden = array( + 'nickname', + 'syntax_highlighting', + 'comment_shortcuts', + 'admin_color', + 'use_ssl', + 'show_admin_bar_front', + 'wp_user_level', + 'user_last_view_date', + 'user_last_view_date_events', + 'wc_last_active', + 'last_update', + 'last_activity', + 'locale', + 'show_welcome_panel', + 'rich_editing', + 'nav_menu_recently_edited', + ); + + $fields = []; + foreach ($raw_fields as $raw_field) { + $key = $raw_field->meta_key; + + if (substr($key, 0, 1) === '_') continue; + if (substr($key, 0, 4) === 'icl_') continue; + if (substr($key, 0, 4) === 'mec_') continue; + if (substr($key, 0, 3) === 'wp_') continue; + if (substr($key, 0, 10) === 'dismissed_') continue; + if (in_array($key, $forbidden)) continue; + + $fields[$key] = trim(ucwords(str_replace('_', ' ', str_replace('-', ' ', $key)))); + } + + set_transient('mec-user-meta-keys', $fields, 36000); + + return $fields; + } + + public function get_wp_user_fields_dropdown($name, $value) + { + $fields = $this->get_wp_user_fields(); + + $dropdown = ''; + + return $dropdown; + } + + public function wizard_import_dummy_events() + { + if (apply_filters('mec_activation_import_events', true)) { + // Create Default Events + $events = array( + array('title' => 'One Time Multiple Day Event', 'start' => date('Y-m-d', strtotime('+5 days')), 'end' => date('Y-m-d', strtotime('+7 days')), 'finish' => date('Y-m-d', strtotime('+7 days')), 'repeat_type' => '', 'repeat_status' => 0, 'interval' => NULL, 'meta' => array('mec_color' => 'dd823b')), + array('title' => 'Daily each 3 days', 'start' => date('Y-m-d'), 'end' => date('Y-m-d'), 'repeat_type' => 'daily', 'repeat_status' => 1, 'interval' => 3, 'meta' => array('mec_color' => 'a3b745')), + array('title' => 'Weekly on Mondays', 'start' => date('Y-m-d', strtotime('Next Monday')), 'end' => date('Y-m-d', strtotime('Next Monday')), 'repeat_type' => 'weekly', 'repeat_status' => 1, 'interval' => 7, 'meta' => array('mec_color' => 'e14d43')), + array('title' => 'Monthly on 27th', 'start' => date('Y-m-27'), 'end' => date('Y-m-27'), 'repeat_type' => 'monthly', 'repeat_status' => 1, 'interval' => NULL, 'year' => '*', 'month' => '*', 'day' => ',27,', 'week' => '*', 'weekday' => '*', 'meta' => array('mec_color' => '00a0d2')), + array('title' => 'Yearly on August 20th and 21st', 'start' => date('Y-08-20'), 'end' => date('Y-08-21'), 'repeat_type' => 'yearly', 'repeat_status' => 1, 'interval' => NULL, 'year' => '*', 'month' => ',08,', 'day' => ',20,21,', 'week' => '*', 'weekday' => '*', 'meta' => array('mec_color' => 'fdd700')), + ); + + // Import Events + $this->save_events($events); + } + } + + public function wizard_import_dummy_shortcodes() + { + if (apply_filters('mec_activation_import_shortcodes', true)) { + // Search Form Options + $sf_options = array('category' => array('type' => 'dropdown'), 'text_search' => array('type' => 'text_input')); + + // Create Default Calendars + $calendars = array( + array('title' => 'Full Calendar', 'meta' => array('skin' => 'full_calendar', 'show_past_events' => 1, 'sk-options' => array('full_calendar' => array('start_date_type' => 'today', 'default_view' => 'list', 'monthly' => 1, 'weekly' => 1, 'daily' => 1, 'list' => 1)), 'sf-options' => array('full_calendar' => array('month_filter' => array('type' => 'dropdown'), 'text_search' => array('type' => 'text_input'))), 'sf_status' => 1)), + array('title' => 'Monthly View', 'meta' => array('skin' => 'monthly_view', 'show_past_events' => 1, 'sk-options' => array('monthly_view' => array('start_date_type' => 'start_current_month', 'next_previous_button' => 1)), 'sf-options' => array('monthly_view' => $sf_options), 'sf_status' => 1)), + array('title' => 'Weekly View', 'meta' => array('skin' => 'weekly_view', 'show_past_events' => 1, 'sk-options' => array('weekly_view' => array('start_date_type' => 'start_current_month', 'next_previous_button' => 1)), 'sf-options' => array('weekly_view' => $sf_options), 'sf_status' => 1)), + array('title' => 'Daily View', 'meta' => array('skin' => 'daily_view', 'show_past_events' => 1, 'sk-options' => array('daily_view' => array('start_date_type' => 'start_current_month', 'next_previous_button' => 1)), 'sf-options' => array('daily_view' => $sf_options), 'sf_status' => 1)), + array('title' => 'Map View', 'meta' => array('skin' => 'map', 'show_past_events' => 1, 'sk-options' => array('map' => array('limit' => 200)), 'sf-options' => array('map' => $sf_options), 'sf_status' => 1)), + array('title' => 'Upcoming events (List)', 'meta' => array('skin' => 'list', 'show_past_events' => 0, 'sk-options' => array('list' => array('load_more_button' => 1)), 'sf-options' => array('list' => $sf_options), 'sf_status' => 1)), + array('title' => 'Upcoming events (Grid)', 'meta' => array('skin' => 'grid', 'show_past_events' => 0, 'sk-options' => array('grid' => array('load_more_button' => 1)), 'sf-options' => array('grid' => $sf_options), 'sf_status' => 1)), + array('title' => 'Carousel View', 'meta' => array('skin' => 'carousel', 'show_past_events' => 0, 'sk-options' => array('carousel' => array('count' => 3, 'limit' => 12)), 'sf-options' => array('carousel' => $sf_options), 'sf_status' => 0)), + array('title' => 'Countdown View', 'meta' => array('skin' => 'countdown', 'show_past_events' => 0, 'sk-options' => array('countdown' => array('style' => 'style3', 'event_id' => '-1')), 'sf-options' => array('countdown' => $sf_options), 'sf_status' => 0)), + array('title' => 'Slider View', 'meta' => array('skin' => 'slider', 'show_past_events' => 0, 'sk-options' => array('slider' => array('style' => 't1', 'limit' => 6, 'autoplay' => 3000)), 'sf-options' => array('slider' => $sf_options), 'sf_status' => 0)), + array('title' => 'Masonry View', 'meta' => array('skin' => 'masonry', 'show_past_events' => 0, 'sk-options' => array('masonry' => array('limit' => 24, 'filter_by' => 'category')), 'sf-options' => array('masonry' => $sf_options), 'sf_status' => 0)), + array('title' => 'Agenda View', 'meta' => array('skin' => 'agenda', 'show_past_events' => 0, 'sk-options' => array('agenda' => array('load_more_button' => 1)), 'sf-options' => array('agenda' => $sf_options), 'sf_status' => 1)), + array('title' => 'Timetable View', 'meta' => array('skin' => 'timetable', 'show_past_events' => 0, 'sk-options' => array('timetable' => array('next_previous_button' => 1)), 'sf-options' => array('timetable' => $sf_options), 'sf_status' => 1)), + array('title' => 'Tile View', 'meta' => array('skin' => 'tile', 'show_past_events' => 0, 'sk-options' => array('tile' => array('next_previous_button' => 1)), 'sf-options' => array('tile' => $sf_options), 'sf_status' => 1)), + array('title' => 'Timeline View', 'meta' => array('skin' => 'timeline', 'show_past_events' => 0, 'sk-options' => array('timeline' => array('load_more_button' => 1)), 'sf-options' => array('timeline' => $sf_options), 'sf_status' => 0)), + ); + + foreach ($calendars as $calendar) { + // Calendar exists + if (post_exists($calendar['title'], 'MEC')) continue; + + $post = array('post_title' => $calendar['title'], 'post_content' => 'MEC', 'post_type' => 'mec_calendars', 'post_status' => 'publish'); + $post_id = wp_insert_post($post); + + update_post_meta($post_id, 'label', ''); + update_post_meta($post_id, 'category', ''); + update_post_meta($post_id, 'location', ''); + update_post_meta($post_id, 'organizer', ''); + update_post_meta($post_id, 'tag', ''); + update_post_meta($post_id, 'author', ''); + + foreach ($calendar['meta'] as $key => $value) update_post_meta($post_id, $key, $value); + } + } + } + + public function save_wizard_options() + { + $wpnonce = isset($_REQUEST['_wpnonce']) ? sanitize_text_field($_REQUEST['_wpnonce']) : NULL; + + // Check if our nonce is set. + if (!trim($wpnonce)) $this->response(array('success' => 0, 'code' => 'NONCE_MISSING')); + + // Verify that the nonce is valid. + if (!wp_verify_nonce($wpnonce, 'mec_options_wizard')) $this->response(array('success' => 0, 'code' => 'NONCE_IS_INVALID')); + + // Current User is not Permitted + if (!current_user_can('mec_settings') and !current_user_can('administrator')) $this->response(array('success' => 0, 'code' => 'ADMIN_ONLY')); + + $mec = isset($_REQUEST['mec']) ? $this->sanitize_deep_array($_REQUEST['mec']) : []; + + $filtered = []; + foreach ($mec as $key => $value) $filtered[$key] = (is_array($value) ? $value : array()); + + $current = get_option('mec_options', array()); + $final = $current; + + // Merge new options with previous options + foreach ($filtered as $key => $value) { + if (is_array($value)) { + foreach ($value as $k => $v) { + // Define New Array + if (!isset($final[$key])) $final[$key] = []; + + // Overwrite Old Value + $final[$key][$k] = $v; + } + } + // Overwrite Old Value + else $final[$key] = $value; + } + + update_option('mec_options', $final); + + // Print the response + $this->response(array('success' => 1)); + } + + public function is_user_booked($user_id, $event_id, $timestamp) + { + $bookings = $this->get_bookings($event_id, $timestamp, 1, $user_id); + return (bool) count($bookings); + } + + public function get_event_attendees($id, $occurrence = NULL, $verified = true) + { + $bookings = $this->get_bookings($id, $occurrence, '-1', NULL, $verified); + + // Attendees + $attendees = []; + foreach ($bookings as $booking) { + $atts = get_post_meta($booking->ID, 'mec_attendees', true); + $atts = apply_filters('mec_filter_event_bookings', $atts, $booking->ID, $occurrence); + + if (isset($atts['attachments'])) unset($atts['attachments']); + + foreach ($atts as $key => $value) { + if (!is_numeric($key)) continue; + + $atts[$key]['book_id'] = $booking->ID; + $atts[$key]['key'] = ($key + 1); + } + + $attendees = array_merge($attendees, $atts); + } + + $attendees = apply_filters('mec_attendees_list_data', $attendees, $id, $occurrence); + usort($attendees, function ($a, $b) { + return strcmp($a['name'], $b['name']); + }); + + return $attendees; + } + + public function mysql2date($format, $date, $timezone) + { + if (empty($date)) return false; + + $datetime = date_create($date, $timezone); + if (false === $datetime) return false; + + // Returns a sum of timestamp with timezone offset. Ideally should never be used. + if ('G' === $format || 'U' === $format) return $datetime->getTimestamp() + $datetime->getOffset(); + + return $datetime->format($format); + } + + public function is_second_booking($event_id, $email) + { + $attendees = $this->get_event_attendees($event_id, NULL, false); + if (!is_array($attendees)) $attendees = []; + + $found = false; + foreach ($attendees as $attendee) { + if ($email and isset($attendee['email']) and trim(strtolower($email)) == trim(strtolower($attendee['email']))) { + $found = true; + break; + } + } + + return $found; + } + + public function get_from_mapped_field($reg_field, $default_value = '') + { + $current_user_id = get_current_user_id(); + if (!$current_user_id) return $default_value; + + $mapped_field = (isset($reg_field['mapping']) and trim($reg_field['mapping']) != '') ? $reg_field['mapping'] : ''; + if (!$mapped_field) return $default_value; + + $value = get_user_meta($current_user_id, $mapped_field, true); + return ($value ? $value : $default_value); + } + + public function get_master_location_id($event, $occurrence = NULL) + { + // Event ID + if (is_numeric($event)) { + $location_id = get_post_meta($event, 'mec_location_id', true); + + // Get From Occurrence + if ($occurrence) $location_id = MEC_feature_occurrences::param($event, $occurrence, 'location_id', $location_id); + } + // Event Object + else { + $meta = (isset($event->data, $event->data->meta) ? $event->data->meta : (isset($event->meta) ? $event->meta : [])); + $location_id = (isset($meta['mec_location_id'])) ? $meta['mec_location_id'] : ''; + + // Get From Occurrence + if (isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $location_id = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'location_id', $location_id); + } + + if (trim($location_id) === '' or $location_id == 1) $location_id = 0; + + return apply_filters('wpml_object_id', $location_id, 'mec_location', true); + } + + public function get_master_organizer_id($event, $occurrence = NULL) + { + // Event ID + if (is_numeric($event)) { + $organizer_id = get_post_meta($event, 'mec_organizer_id', true); + + // Get From Occurrence + if ($occurrence) $organizer_id = MEC_feature_occurrences::param($event, $occurrence, 'organizer_id', $organizer_id); + } + // Event Object + else { + $organizer_id = (isset($event->data) and isset($event->data->meta) and isset($event->data->meta['mec_organizer_id'])) ? $event->data->meta['mec_organizer_id'] : ''; + + // Get From Occurrence + if (isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $organizer_id = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'organizer_id', $organizer_id); + } + + if (trim($organizer_id) === '' or $organizer_id == 1) $organizer_id = 0; + + $organizer_id = apply_filters('wpml_object_id', $organizer_id, 'mec_organizer', true); + return $organizer_id; + } + + public function get_location_data($location_id) + { + $term = get_term($location_id); + if (!isset($term->term_id) or $location_id == 1) return []; + + return array( + 'id' => $term->term_id, + 'name' => $term->name, + 'address' => get_metadata('term', $term->term_id, 'address', true), + 'opening_hour' => get_metadata('term', $term->term_id, 'opening_hour', true), + 'latitude' => get_metadata('term', $term->term_id, 'latitude', true), + 'longitude' => get_metadata('term', $term->term_id, 'longitude', true), + 'url' => get_metadata('term', $term->term_id, 'url', true), + 'tel' => get_metadata('term', $term->term_id, 'tel', true), + 'thumbnail' => get_metadata('term', $term->term_id, 'thumbnail', true) + ); + } + + public function get_organizer_data($organizer_id) + { + $term = get_term($organizer_id); + if (!isset($term->term_id) or $organizer_id == 1) return []; + + return array( + 'id' => $term->term_id, + 'name' => $term->name, + 'tel' => get_metadata('term', $term->term_id, 'tel', true), + 'email' => get_metadata('term', $term->term_id, 'email', true), + 'url' => get_metadata('term', $term->term_id, 'url', true), + 'page_label' => get_metadata('term', $term->term_id, 'page_label', true), + 'thumbnail' => get_metadata('term', $term->term_id, 'thumbnail', true) + ); + } + + public function is_uncategorized($term_id) + { + $term = get_term($term_id); + $name = strtolower($term->name); + + return ($name === 'uncategorized' or $name === esc_html__('Uncategorized')); + } + + public function get_thankyou_page_id($event_id = NULL) + { + // Global Settings + $settings = $this->get_settings(); + + // Global Thank-You Page + $thankyou_page_id = (isset($settings['booking_thankyou_page']) and is_numeric($settings['booking_thankyou_page']) and trim($settings['booking_thankyou_page'])) ? $settings['booking_thankyou_page'] : 0; + + // Get by Event + if ($event_id) { + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + $bookings_thankyou_page_inherit = isset($booking_options['thankyou_page_inherit']) ? $booking_options['thankyou_page_inherit'] : 1; + if (!$bookings_thankyou_page_inherit) { + if (isset($booking_options['booking_thankyou_page']) and $booking_options['booking_thankyou_page']) $thankyou_page_id = $booking_options['booking_thankyou_page']; + else $thankyou_page_id = 0; + } + } + + return $thankyou_page_id; + } + + public function get_thankyou_page_time($transaction_id = NULL) + { + // Global Settings + $settings = $this->get_settings(); + + // Global Time + $thankyou_page_time = (isset($settings['booking_thankyou_page_time']) and is_numeric($settings['booking_thankyou_page_time'])) ? (int) $settings['booking_thankyou_page_time'] : 2000; + + // Get by Event + if ($transaction_id) { + // Booking + $book = $this->getBook(); + $transaction = $book->get_transaction($transaction_id); + + $event_id = $transaction['event_id'] ?? 0; + if ($event_id) { + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($booking_options)) $booking_options = []; + + $bookings_thankyou_page_inherit = $booking_options['thankyou_page_inherit'] ?? 1; + if (!$bookings_thankyou_page_inherit) { + if (isset($booking_options['booking_thankyou_page_time']) and $booking_options['booking_thankyou_page_time']) $thankyou_page_time = (int) $booking_options['booking_thankyou_page_time']; + } + } + } + + return max($thankyou_page_time, 0); + } + + public function is_first_occurrence_passed($event) + { + // Event ID + if (is_numeric($event)) $event_id = $event; + // Event Object + else $event_id = $event->ID; + + $now = current_time('timestamp', 0); + + $db = $this->getDB(); + $first = $db->select("SELECT `tstart` FROM `#__mec_dates` WHERE `post_id`='" . $event_id . "' ORDER BY `tstart` ASC LIMIT 1", 'loadResult'); + + return ($first and $first < $now); + } + + public function preview() + { + // Elementor + if (isset($_GET['action']) and sanitize_text_field($_GET['action']) === 'elementor') return true; + + // Default + return false; + } + + public function display_featured_image_caption($event) + { + if (is_numeric($event)) $event_id = $event; + else $event_id = $event->ID; + + $caption = apply_filters('the_post_thumbnail_caption', get_the_post_thumbnail_caption($event_id)); + return (trim($caption) ? '' . esc_html($caption) . '' : ''); + } + + public function get_event_cost($event, $render = true) + { + $cost_auto_calculate = (isset($event->data->meta) and isset($event->data->meta['mec_cost_auto_calculate']) and trim($event->data->meta['mec_cost_auto_calculate'])) ? $event->data->meta['mec_cost_auto_calculate'] : 0; + if ($cost_auto_calculate) $cost = $this->get_cheapest_ticket_price($event); + else { + $cost = (isset($event->data->meta) and isset($event->data->meta['mec_cost']) and trim($event->data->meta['mec_cost'])) ? $event->data->meta['mec_cost'] : ''; + if (isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $cost = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'cost', $cost); + } + + $event_id = $event->ID; + if (isset($event->requested_id)) $event_id = $event->requested_id; + + if (!$render) return $cost; + return (is_numeric($cost) ? $this->render_price($cost, $event_id) : $cost); + } + + public function get_cheapest_ticket_price($event) + { + $tickets = (isset($event->data->tickets) and is_array($event->data->tickets)) ? $event->data->tickets : []; + + // Booking Library + $book = $this->getBook(); + + $timestamp = isset($event->date, $event->date['start'], $event->date['start']['timestamp']) ? $event->date['start']['timestamp'] : NULL; + + $min = NULL; + foreach ($tickets as $ticket) { + $price = $book->get_ticket_price($ticket, current_time('Y-m-d'), $event->ID, $timestamp); + + if (is_null($min)) $min = $price; + else $min = min($min, $price); + } + + return $min; + } + + public function get_time_components($event, $type = 'start') + { + $date = $event->date[$type]['date']; + $hour = $event->date[$type]['hour']; + $minutes = $event->date[$type]['minutes']; + $ampm = $event->date[$type]['ampm']; + + if ($hour == '0' and $type === 'start') { + $hour = 12; + $ampm = 'AM'; + } elseif ($hour == '0' and $type === 'end') { + $hour = 12; + } + + return array( + 'date' => $date, + 'hour' => $hour, + 'minutes' => $minutes, + 'ampm' => $ampm, + ); + } + + public function event_date_updated($event_id, $prev_start_datetime, $prev_end_datetime) + { + $prev_start_timestamp = strtotime($prev_start_datetime); + + $new_start_datetime = get_post_meta($event_id, 'mec_start_datetime', true); + $new_start_timestamp = strtotime($new_start_datetime); + + $new_end_datetime = get_post_meta($event_id, 'mec_end_datetime', true); + $new_end_timestamp = strtotime($new_end_datetime); + + // Libraries + $db = $this->getDB(); + $book = $this->getBook(); + + $bookings = $this->get_bookings($event_id, $prev_start_timestamp, -1, NULL, false); + foreach ($bookings as $booking) { + $db->q("UPDATE `#__mec_bookings` SET `timestamp`='" . esc_sql($new_start_timestamp) . "', `date`='" . date('Y-m-d H:i:s', $new_start_timestamp) . "' WHERE `id`='" . esc_sql($booking->mec_booking_record_id) . "' AND `event_id`='" . esc_sql($event_id) . "'"); + $db->q("UPDATE `#__posts` SET `post_date`='" . esc_sql(date('Y-m-d H:i:s', $new_start_timestamp)) . "', `post_date_gmt`='" . esc_sql(get_gmt_from_date(date('Y-m-d H:i:s', $new_start_timestamp))) . "' WHERE `ID`='" . esc_sql($booking->ID) . "'"); + + update_post_meta($booking->ID, 'mec_date', $new_start_timestamp . ':' . $new_end_timestamp); + update_post_meta($booking->ID, 'mec_attention_time', $new_start_timestamp . ':' . $new_end_timestamp); + update_post_meta($booking->ID, 'mec_attention_time_start', $new_start_timestamp); + update_post_meta($booking->ID, 'mec_attention_time_end', $new_end_timestamp); + + $transaction_id = get_post_meta($booking->ID, 'mec_transaction_id', true); + + $transaction = $book->get_transaction($transaction_id); + $transaction['date'] = $new_start_timestamp . ':' . $new_end_timestamp; + + $book->update_transaction($transaction_id, $transaction); + } + } + + public function get_mec_events_data($post_id) + { + // Cache + $cache = $this->getCache(); + + // Return From Cache + return $cache->rememberOnce('mec-events-data-' . $post_id, function () use ($post_id) { + $db = $this->getDB(); + return $db->select("SELECT * FROM `#__mec_events` WHERE `post_id`='$post_id'", "loadObject"); + }); + } + + public function sanitize_deep_array($inputs, $type = 'text', $excludes = array(), $path = '') + { + if (!is_array($inputs)) return $inputs; + + $sanitized = []; + foreach ($inputs as $key => $val) { + $p = $path . $key . '.'; + if ((is_array($excludes) and in_array(trim($p, '. '), $excludes)) or (is_array($excludes) and !count($excludes))) { + $sanitized[$key] = $val; + continue; + } + + if (is_array($val)) $sanitized[$key] = $this->sanitize_deep_array($val, $type, $excludes, $p); + elseif ($type == 'int') $sanitized[$key] = (int) $val; + elseif ($type == 'url') $sanitized[$key] = esc_url($val); + elseif ($type == 'email') $sanitized[$key] = sanitize_email($val); + elseif ($type == 'page') $sanitized[$key] = MEC_kses::page($val); + else { + $sanitized[$key] = sanitize_text_field($val); + } + } + + return $sanitized; + } + + public function can_display_booking_progress_bar($settings) + { + $display_progress_bar = true; + if (!isset($settings['booking_display_progress_bar']) or (isset($settings['booking_display_progress_bar']) and !$settings['booking_display_progress_bar'])) $display_progress_bar = false; + + return $display_progress_bar; + } + + public function display_progress_bar($event) + { + return $this->module('progress-bar.single', array('event' => $event)); + } + + /** + * @param stdClass $event + * @param array $dates + * @return array + */ + public function remove_canceled_dates($event, $dates = []) + { + $filtered_dates = []; + + $i = 0; + foreach ($dates as $date) { + $i++; + + // Do not remove current date + if ($i === 1) { + $filtered_dates[] = $date; + continue; + } + + if (!isset($date['start']) or !isset($date['start']['timestamp'])) continue; + + $start_timestamp = isset($date['start']['timestamp']) ? $date['start']['timestamp'] : NULL; + if ($this->is_occurrence_cenceled($event, $start_timestamp)) continue; + + $filtered_dates[] = $date; + } + + return $filtered_dates; + } + + public function is_occurrence_cenceled($event, $start_timestamp = '') + { + if (is_null($start_timestamp) or !trim($start_timestamp)) return false; + + // All Params + $params = MEC_feature_occurrences::param($event->ID, $start_timestamp, '*'); + + $event_status = (isset($event->data->meta['mec_event_status']) and trim($event->data->meta['mec_event_status'])) ? $event->data->meta['mec_event_status'] : 'EventScheduled'; + $event_status = (isset($params['event_status']) and trim($params['event_status']) != '') ? $params['event_status'] : $event_status; + + if ($event_status === 'EventCancelled') return true; + + return false; + } + + /** + * @param $info + * @return bool|mixed|void + */ + public function debug_email($info) + { + // Convert to String + if (is_array($info) || is_object($info)) $info = print_r($info, true); + + // Global Settings + $settings = $this->get_settings(); + + // Receiver + $to = $settings['gateways_debug_email'] ?? ''; + + // Receiver is not valid + if (!trim($to) || !is_email($to)) return; + + $subject = 'MEC - PayPal Standard Debug: ' . current_time('Y-m-d H:i:s'); + $message = 'Timestamp: ' . current_time('Y-m-d H:i:s') . "\n\n\n" . $info; + + // Add Request to Message + $message .= "\n\n\n" . '[Request]' . "\n\n" . print_r($_REQUEST, true); + + return wp_mail($to, $subject, $message); + } + + public function get_event_color_dot($event, $only_color_code = false) + { + $category_color = ''; + if (is_object($event) and isset($event->data->categories) and is_array($event->data->categories) and count($event->data->categories)) { + foreach ($event->data->categories as $category) { + $category_color = (isset($category['color']) && trim($category['color'])) ? $category['color'] : ''; + if ($category_color) break; + } + } + + $event_color = (isset($event->data, $event->data->meta, $event->data->meta['mec_color']) and trim($event->data->meta['mec_color'])) ? '#' . $event->data->meta['mec_color'] : ''; + + // Event Color has more priority + $color = trim($event_color) ? $event_color : $category_color; + + // Only color code + if ($only_color_code) return $color; + + // No Color + if (trim($color) === '') return ''; + return ''; + } + + /** + * @param $attendee_id + * @param $template + * @return string + */ + public function get_certificate_link($attendee_id, $template) + { + $link = get_permalink($template); + $record = $this->get_mec_attendee_record($attendee_id); + + $key = $attendee_id . '-' . $record->mec_booking_id . '-' . $record->transaction_id . '-' . $record->ticket_id; + + return $this->add_qs_var('key', $key, $link); + } + + /** + * @param $attendee_id + * @return mixed + */ + public function get_mec_attendee_record($attendee_id) + { + return $this->getDB() + ->select("SELECT * FROM `#__mec_booking_attendees` AS a LEFT JOIN `#__mec_bookings` AS b ON a.`mec_booking_id` = b.`id` WHERE a.`id`='" . esc_sql($attendee_id) . "'", 'loadObject'); + } + + /** + * @param $attendees + * @param $event_id + * @param $occurrence + * @param bool $checkbox + * @return string + */ + public function get_attendees_table($attendees, $event_id, $occurrence, $checkbox = true) + { + // Database + $db = $this->getDB(); + + // Settings + $settings = $this->get_settings(); + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $html = '
    + ' . ($checkbox ? '
    + + + +
    ' : '') + . ' +
    + ' . esc_html__('Name', 'modern-events-calendar-lite') . ' +
    + +
    + ' . esc_html($this->m('ticket', esc_html__('Ticket', 'modern-events-calendar-lite'))) . ' +
    +
    + ' . esc_html__('Variations', 'modern-events-calendar-lite') . ' +
    '; + + $html = apply_filters('mec_attendees_list_header_html', $html, $event_id, $occurrence); + $html .= '
    '; + + foreach ($attendees as $attendee) { + $mec_attendee_id = ''; + + // Attendee ID for Certificate + if ($occurrence && isset($settings['certificate_status']) && $settings['certificate_status'] && isset($attendee['id']) && isset($attendee['book_id'])) { + $mec_booking_id = $db->select("SELECT `id` FROM `#__mec_bookings` WHERE `event_id`='" . esc_sql($event_id) . "' AND `booking_id`='" . esc_sql($attendee['book_id']) . "' AND `timestamp`='" . esc_sql($occurrence) . "' ORDER BY `id` ASC LIMIT 1", 'loadResult'); + $mec_attendee_id = $db->select("SELECT `id` FROM `#__mec_booking_attendees` WHERE `mec_booking_id`='" . esc_sql($mec_booking_id) . "' AND `ticket_id`='" . esc_sql($attendee['id']) . "'", "loadResult"); + } + + $html .= '
    '; + if ($checkbox) $html .= '
    ' . esc_html($attendee['name'] . ':.:' . $attendee['email']) . ',
    '; + $html .= '
    ' . get_avatar($attendee['email']) . $attendee['name'] . '
    '; + $html .= ''; + $html .= '
    ' . ((isset($attendee['id']) and isset($tickets[$attendee['id']]['name'])) ? $tickets[$attendee['id']]['name'] : esc_html__('Unknown', 'modern-events-calendar-lite')) . '
    '; + + $variations = '
    '; + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) { + $ticket_variations = $this->ticket_variations($event_id, $attendee['id']); + + foreach ($attendee['variations'] as $variation_id => $variation_count) { + if (!$variation_count || $variation_count < 0) continue; + + $variation_title = (isset($ticket_variations[$variation_id]) and isset($ticket_variations[$variation_id]['title'])) ? $ticket_variations[$variation_id]['title'] : ''; + if (!trim($variation_title)) continue; + + $variations .= '+ ' . esc_html($variation_title) . ' + (' . esc_html($variation_count) . ')'; + } + } + + $variations .= '
    '; + + $html .= $variations; + $html = apply_filters('mec_attendees_list_html', $html, $attendee, $attendee['key'], $attendee['book_id'], $occurrence); + $html .= '
    '; + } + + return $html; + } + + /** + * @param array $dates + * @param stdClass $event + * @return array + */ + public function maybe_use_last_date($dates, $event) + { + // Only when one date is found + if (count($dates) === 1 && isset($dates[0]['end']['timestamp']) && $dates[0]['end']['timestamp']) { + // Event repeat status + $repeat_status = $event->data->meta['mec_repeat_status'] ?? 0; + + // First and only date is expired + if ($repeat_status && current_time('timestamp') > $dates[0]['end']['timestamp']) { + // DB + $db = $this->getDB(); + + $mec_date = $db->select("SELECT dstart, dend FROM `#__mec_dates` WHERE `post_id`='" . esc_sql($event->ID) . "' ORDER BY `id` DESC LIMIT 1", 'loadObject'); + if (isset($mec_date->dstart, $mec_date->dend)) { + // Render Library + $render = $this->getRender(); + + $dates = []; + $dates[] = $render->add_timestamps([ + 'start' => [ + 'date' => $mec_date->dstart, + 'hour' => $event->data->meta['mec_date']['start']['hour'], + 'minutes' => $event->data->meta['mec_date']['start']['minutes'], + 'ampm' => $event->data->meta['mec_date']['start']['ampm'] + ], + 'end' => [ + 'date' => $mec_date->dend, + 'hour' => $event->data->meta['mec_date']['end']['hour'], + 'minutes' => $event->data->meta['mec_date']['end']['minutes'], + 'ampm' => $event->data->meta['mec_date']['end']['ampm'] + ], + 'allday' => $event->data->meta['mec_allday'] ?? 0, + 'hide_time' => $event->data->meta['mec_hide_time'] ?? 0, + 'past' => 1 + ]); + } + } + } + + return $dates; + } + + public function generate_download_csv($rows, $filename) + { + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=' . $filename); + + $delimiter = "\t"; + $output = fopen('php://output', 'w'); + + fprintf($output, chr(0xEF) . chr(0xBB) . chr(0xBF)); + + foreach ($rows as $row) { + fputcsv($output, $row, $delimiter); + } + } + + public function generate_download_excel($rows, $filename) + { + include_once MEC_ABSPATH . 'app' . DS . 'api' . DS . 'XLSX' . DS . 'xlsxwriter.class.php'; + + $writer = new MEC_XLSXWriter(); + $writer->writeSheet($rows); + $writer->writeToFile($filename); + + // Download + if (file_exists($filename)) { + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($filename)); + + readfile($filename); + unlink($filename); + exit; + } + } + + /** + * @param array $icons + * @return MEC_icons + */ + public function icons(array $icons = []): MEC_icons + { + // Import Library + MEC::import('app.libraries.icons'); + + return (new MEC_icons($icons)); + } + + public function add_global_exceptional_days($days = []) + { + // Force Array + if (!is_array($days)) $days = []; + + // MEC Settings + $settings = $this->get_settings(); + + // Global Exceptional Days + $global = isset($settings['global_exceptional_days']) && is_array($settings['global_exceptional_days']) ? $settings['global_exceptional_days'] : []; + + foreach ($global as $key => $day) { + if (!is_numeric($key)) continue; + $days[] = $this->standardize_format($day); + } + + return array_unique($days); + } + + public function get_organizer_id_by_email($email) + { + $db = $this->getDB(); + $term_ids = $db->select("SELECT term_id FROM `#__termmeta` WHERE `meta_key`='email' AND `meta_value`='" . esc_sql($email) . "' LIMIT 20", 'loadColumn'); + + $organizer_id = ''; + foreach ($term_ids as $term_id) { + $term = get_term((int) $term_id); + if ($term->taxonomy === 'mec_organizer') { + $organizer_id = $term->term_id; + break; + } + } + + return $organizer_id; + } + + /** + * @param $event_id + * @return bool + */ + public function hide_end_time_status($event_id): bool + { + // Settings + $settings = $this->get_settings(); + + // Global Status + $hide_end_time_global = isset($settings['hide_event_end_time']) && $settings['hide_event_end_time']; + if ($hide_end_time_global) return true; + + $event_status = get_post_meta($event_id, 'mec_hide_end_time', true); + if (is_null($event_status) || (is_string($event_status) && trim($event_status) === '')) $event_status = 0; + + return (bool) $event_status; + } + + /** + * @param $start_date + * @param $end_date + * @return int + */ + public function get_days_diff($start_date, $end_date) + { + $event_period = $this->date_diff($start_date, $end_date); + return $event_period ? $event_period->days : 0; + } + + /** + * @param $event_id + * @param $occurrence + * @param $occurrence_time + * @return array + */ + public function get_start_date_to_get_event_dates($event_id, $occurrence, $occurrence_time = null) + { + $repeat_type = get_post_meta($event_id, 'mec_repeat_type', true); + + $md_start = $this->get_start_of_multiple_days($event_id, $occurrence); + if ($md_start) $occurrence = $md_start; + + $md_start_time = $this->get_start_time_of_multiple_days($event_id, $occurrence_time); + if ($md_start_time) $occurrence_time = $md_start_time; + + if (strtotime($occurrence) and in_array($repeat_type, array('certain_weekdays', 'custom_days', 'weekday', 'weekend'))) $occurrence = date('Y-m-d', strtotime($occurrence)); + elseif (strtotime($occurrence)) { + $new_occurrence = date('Y-m-d', strtotime('-1 day', strtotime($occurrence))); + if ($repeat_type == 'monthly' and date('m', strtotime($new_occurrence)) != date('m', strtotime($occurrence))) $new_occurrence = date('Y-m-d', strtotime($occurrence)); + + $occurrence = $new_occurrence; + } else $occurrence = NULL; + + return [$occurrence, $occurrence_time]; + } + + public function adjust_event_dates_for_booking($event, $dates, $occurrence = null) + { + // Remove First Date if it is already started! + if (count($dates) > 1 && !$occurrence) { + $all_dates = $dates; + + // Global Settings + $settings = $this->get_settings(); + + foreach ($dates as $d => $date) { + $start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : current_time('Y-m-d H:i:s'); + $end_date = (isset($date['end']) and isset($date['end']['date'])) ? $date['end']['date'] : current_time('Y-m-d H:i:s'); + + $s_time = sprintf("%02d", $date['start']['hour']) . ':'; + $s_time .= sprintf("%02d", $date['start']['minutes']); + $s_time .= trim($date['start']['ampm']); + + $start_time = date('D M j Y G:i:s', strtotime($start_date . ' ' . $s_time)); + + $e_time = sprintf("%02d", $date['end']['hour']) . ':'; + $e_time .= sprintf("%02d", $date['end']['minutes']); + $e_time .= trim($date['end']['ampm']); + + $end_time = date('D M j Y G:i:s', strtotime($end_date . ' ' . $e_time)); + + $d1 = new DateTime($start_time); + $d2 = new DateTime(current_time("D M j Y G:i:s")); + $d3 = new DateTime($end_time); + + // Booking OnGoing Event Option + $ongoing_event_book = isset($settings['booking_ongoing']) && $settings['booking_ongoing'] == '1'; + if ($ongoing_event_book) { + if ($d3 < $d2) { + unset($dates[$d]); + } + } else { + if ($d1 < $d2) { + unset($dates[$d]); + } + } + } + + if (count($dates) === 0) $dates = array(end($all_dates)); + } + + $dates = $this->remove_canceled_dates($event, array_values($dates)); + return $this->maybe_use_last_date($dates, $event); + } + + public function display_not_found_message($echo = true) + { + // Default Message + $message = esc_html__('No event found!', 'modern-events-calendar-lite'); + + // Global Settings + $settings = $this->get_settings(); + + // Get Message from Settings + if (isset($settings['not_found_message']) && trim($settings['not_found_message'])) $message = stripslashes($settings['not_found_message']); + + // Display the Message + if ($echo) echo $message; + else return $message; + } + + public function random_string_generator($length = 12) + { + return wp_generate_password($length, false); + } + + public function get_days_in_previous_month($month, $year) + { + return date('t', strtotime('-1 month', strtotime($year . '-' . $month . '-10'))); + } + + public function is_new_version_available() + { + $url = add_query_arg( + ['category' => 'mec'], + MEC_API_UPDATE . '/updates/?action=get_metadata&slug=modern-events-calendar-lite' + ); + + $response = wp_remote_get($url); + $status = wp_remote_retrieve_response_code($response); + + if ($status !== 200) return false; + + $body = wp_remote_retrieve_body($response); + if ($body === '') return false; + + $JSON = json_decode($body); + if (!is_object($JSON) || !isset($JSON->version)) return false; + + if ($JSON->version > MEC_VERSION) return $JSON->version; + + return false; + } + + public function get_book_datetime_string($timestamps, $event_id, $book_id) + { + list($start_timestamp, $end_timestamp) = explode(':', $timestamps); + + // Date & Time Format + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + $allday = get_post_meta($event_id, 'mec_allday', true); + $hide_time = get_post_meta($event_id, 'mec_hide_time', true); + $hide_end_time = $this->hide_end_time_status($event_id); + + if (trim($timestamps) && strpos($timestamps, ':') !== false) { + if (trim($start_timestamp) != trim($end_timestamp)) { + return sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $start_timestamp), $this->date_i18n($date_format . ((!$allday and !$hide_time and !$hide_end_time) ? ' ' . $time_format : ''), $end_timestamp)); + } else return get_the_date($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $book_id); + } + + return get_the_date($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $book_id); + } + + public function convert_term_name_to_id($names, $taxonomy) + { + if (!is_array($names)) { + $term = get_term_by('name', $names, $taxonomy); + return $term ? $term->term_id : null; + } + + $ids = []; + foreach ($names as $name) { + $id = $this->convert_term_name_to_id($name, $taxonomy); + if (!$id) continue; + + $ids[] = $id; + } + + return $ids; + } + + public function is_mobile() + { + $useragent = $_SERVER['HTTP_USER_AGENT']; + return preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i', $useragent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', substr($useragent, 0, 4)); + } + + public function get_raw_post_description($post_id) + { + if (function_exists('kc_add_map')) { + $post = get_post($post_id); + return strip_tags(strip_shortcodes(apply_filters('the_content', $post->post_content))); + } + + return strip_tags(strip_shortcodes(get_post_field('post_content', $post_id))); + } +} diff --git a/app/libraries/meetup.php b/app/libraries/meetup.php new file mode 100755 index 0000000..631b5ae --- /dev/null +++ b/app/libraries/meetup.php @@ -0,0 +1,242 @@ + + */ +class MEC_meetup extends MEC_base +{ + /** + * @var MEC_main + */ + private $main; + + public function __construct() + { + $this->main = $this->getMain(); + } + + /** + * @return string + */ + public function get_redirect_url(): string + { + return $this->main->URL('backend').'admin.php?page=MEC-ix&tab=MEC-meetup-import&mec-ix-action=meetup-import-start'; + } + + public function get_token() + { + // Get MEC IX options + $ix = $this->main->get_ix_options(); + + // Refresh Token + $refresh_token = $ix['meetup_refresh_token'] ?? ''; + + $response = wp_remote_post('https://secure.meetup.com/oauth2/access', [ + 'body' => [ + 'client_id' => $ix['meetup_public_key'] ?? '', + 'client_secret' => $ix['meetup_secret_key'] ?? '', + 'grant_type' => 'refresh_token', + 'refresh_token' => $refresh_token + ], + ]); + + // Error Happened + if(is_wp_error($response)) return ''; + + // Response Body + $body = json_decode(wp_remote_retrieve_body($response)); + + return $body->access_token ?? ''; + } + + public function get_tokens_by_code(string $code = '') + { + // Get MEC IX options + $ix = $this->main->get_ix_options(); + + $response = wp_remote_post('https://secure.meetup.com/oauth2/access', [ + 'body' => [ + 'client_id' => $ix['meetup_public_key'] ?? '', + 'client_secret' => $ix['meetup_secret_key'] ?? '', + 'grant_type' => 'authorization_code', + 'redirect_uri' => $this->get_redirect_url(), + 'code' => $code, + ], + ]); + + // Error Happened + if(is_wp_error($response)) return ''; + + // Response Body + $body = json_decode(wp_remote_retrieve_body($response)); + + $token = $body->access_token ?? ''; + $refresh = $body->refresh_token ?? ''; + + $this->main->save_ix_options([ + 'meetup_refresh_token' => $refresh + ]); + + return $token; + } + + /** + * Get Meetup Event by id. + * + * @return array + */ + public function get_event($token, $event_id = 0) + { + $query = 'query ($event_id: ID!) { + event(id: $event_id) { + id + title + dateTime + endTime + description + shortDescription + recurrenceDescription + duration + timezone + eventUrl + status + venue { + id + name + address + city + state + country + lat + lng + postalCode + zoom + } + onlineVenue { + type + url + } + isOnline + imageUrl + series { + weeklyRecurrence { + weeklyInterval + weeklyDaysOfWeek + } + monthlyRecurrence { + monthlyWeekOfMonth + monthlyDayOfWeek + } + endDate + description + } + feeSettings { + amount + currency + } + hosts { + id + name + email + lat + lon + city + state + country + } + group { + id + name + description + emailListAddress + urlname + logo { + baseUrl + } + } + } + }'; + + $variables = ['event_id' => $event_id]; + return $this->query($token, $query, $variables); + } + + /** + * Get Meetup Events By Group ID With pagination + * + * @return array Group ID + */ + public function get_group_events($token, $meetup_group_id = '') + { + $query = 'query ($urlname: String!, $items_num: Int!) { + groupByUrlname(urlname: $urlname) { + id + name + upcomingEvents(input: {first: $items_num}) { + pageInfo { + hasNextPage + endCursor + } + count + edges { + node { + id + token + title + eventUrl + dateTime + endTime + } + } + } + } + }'; + $variables = ['urlname' => $meetup_group_id, 'items_num' => 999]; + return $this->query($token, $query, $variables); + } + + /** + * Get Meetup Authorized User Data + * + * @return array + */ + public function get_group_name($token, $meetup_group_id) + { + $query = ' + query ($urlname: String!) { + groupByUrlname(urlname: $urlname) { + id + name + } + }'; + + $variables = ['urlname' => $meetup_group_id]; + return $this->query($token, $query, $variables); + } + + public function query(string $token, string $query, array $variables = []) + { + $headers = ['Content-Type: application/json']; + $headers[] = 'Authorization: Bearer ' . $token; + + $data = @file_get_contents( + 'https://api.meetup.com/gql', + false, + stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => $headers, + 'content' => json_encode(['query' => $query, 'variables' => $variables]), + ] + ]) + ); + + // No Data + if($data === false) return []; + + return json_decode($data, true); + } +} diff --git a/app/libraries/notifications.php b/app/libraries/notifications.php new file mode 100755 index 0000000..b16e83d --- /dev/null +++ b/app/libraries/notifications.php @@ -0,0 +1,2647 @@ + + */ +class MEC_notifications extends MEC_base +{ + public $main; + public $PT; + public $notif_settings; + public $settings; + public $styling; + public $book; + public $u; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Book Post Type Name + $this->PT = $this->main->get_book_post_type(); + + // MEC Notification Settings + $this->notif_settings = $this->main->get_notifications(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Styling + $this->styling = $this->main->get_styling(); + + // MEC Book + $this->book = $this->getBook(); + + // MEC User + $this->u = $this->getUser(); + } + + /** + * Send email verification notification + * @param int $book_id + * @param string $mode + * @return boolean + * @author Webnus + */ + public function email_verification($book_id, $mode = 'auto') + { + if (!$book_id) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + $verification_status = get_post_meta($book_id, 'mec_verified', true); + if ($verification_status == 1) return false; // Already Verified + + $price = get_post_meta($book_id, 'mec_price', true); + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + list($auto_verify_free, $auto_verify_paid) = $this->book->get_auto_verification_status($event_id, $book_id); + + // Auto verification for free bookings is enabled so don't send the verification email + if ($mode == 'auto' and $price <= 0 and $auto_verify_free) return false; + + // Auto verification for paid bookings is enabled so don't send the verification email + if ($mode == 'auto' and $price > 0 and $auto_verify_paid) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + $subject = isset($notif_settings['email_verification']['subject']) ? esc_html__($notif_settings['email_verification']['subject'], 'modern-events-calendar-lite') : esc_html__('Please verify your email.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'email_verification', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['email_verification']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['email_verification']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['email_verification']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) or !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Book Data + $key = get_post_meta($book_id, 'mec_verification_key', true); + $link = trim(get_permalink($event_id), '/') . '/verify/' . $key . '/'; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + $to = $attendee['email'] ?? ''; + if (!trim($to) or in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $message = $notif_settings['email_verification']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'email_verification', $event_id, $book_id), $book_id, $attendee); + + $message = str_replace('%%verification_link%%', $link, $message); + $message = str_replace('%%link%%', $link, $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_email_verification', $mail_arg, $book_id, 'email_verification'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // For prevention of email repeat send + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * Send booking notification + * @param int $book_id + * @return boolean + * @author Webnus + */ + public function booking_notification($book_id) + { + if (!$book_id) return false; + + $booking_notification = apply_filters('mec_booking_notification', true); + if (!$booking_notification) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Booking Notification is disabled + if (isset($notif_settings['booking_notification']['status']) and !$notif_settings['booking_notification']['status']) return false; + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['booking_notification']['subject']) ? esc_html__($notif_settings['booking_notification']['subject'], 'modern-events-calendar-lite') : esc_html__('Your booking is received.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'booking_notification', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['booking_notification']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['booking_notification']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['booking_notification']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Send the notification to event organizer + if (isset($notif_settings['booking_notification']['send_to_organizer']) and $notif_settings['booking_notification']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false) $headers[] = $CCBCC . ': ' . trim($organizer_email); + } + + // Send the notification to additional organizers + if (isset($notif_settings['booking_notification']['send_to_additional_organizers']) and $notif_settings['booking_notification']['send_to_additional_organizers'] == 1) + { + $additional_organizer_emails = $this->get_booking_additional_organizers_emails($book_id); + if (is_array($additional_organizer_emails) and count($additional_organizer_emails)) + { + foreach ($additional_organizer_emails as $additional_organizer_email) $headers[] = $CCBCC . ': ' . trim($additional_organizer_email); + } + } + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) or !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + $to = $attendee['email'] ?? ''; + if (!trim($to) or in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $message = $notif_settings['booking_notification']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'booking_notification', $event_id, $book_id), $book_id, $attendee); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_notification', $mail_arg, $book_id, 'booking_notification'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // For prevention of email repeat send + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * Send booking confirmation notification + * @param int $book_id + * @param string $mode + * @return boolean + * @author Webnus + */ + public function booking_confirmation($book_id, $mode = 'manually') + { + if (!$book_id) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Booking Confirmation is disabled + if (isset($notif_settings['booking_confirmation']['status']) and !$notif_settings['booking_confirmation']['status']) return false; + + $confirmation_notification = apply_filters('mec_booking_confirmation', true); + if (!$confirmation_notification) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + $send_in_automode = isset($this->settings['booking_auto_confirm_send_email']) && $this->settings['booking_auto_confirm_send_email'] == '1'; + + // Don't send the confirmation email + if ($mode == 'auto' and !$send_in_automode) return false; + + $timestamp = time(); + + $last_confirmation_email = get_post_meta($book_id, 'mec_last_confirmation_email', true); + if ($last_confirmation_email and is_numeric($last_confirmation_email) and ($timestamp - $last_confirmation_email) < 10) return false; + + update_post_meta($book_id, 'mec_last_confirmation_email', $timestamp); + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['booking_confirmation']['subject']) ? esc_html__($notif_settings['booking_confirmation']['subject'], 'modern-events-calendar-lite') : esc_html__('Your booking is confirmed.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'booking_confirmation', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['booking_confirmation']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['booking_confirmation']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['booking_confirmation']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) || !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + $to = $attendee['email'] ?? ''; + + if (!trim($to)) continue; + if (in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $message = $notif_settings['booking_confirmation']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'booking_confirmation', $event_id, $book_id), $book_id, $attendee); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_confirmation', $mail_arg, $book_id, 'booking_confirmation'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // Send One Single Email Only To First Attendee + if (isset($notif_settings['booking_confirmation']['send_single_one_email'])) break; + + // For prevention of email repeat send + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * Send booking cancellation + * @param int $book_id + * @return void + * @author Webnus + */ + public function booking_cancellation($book_id) + { + if (!$book_id) return; + + $cancellation_notification = apply_filters('mec_booking_cancellation', true); + if (!$cancellation_notification) return; + + $booker = $this->u->booking($book_id); + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Cancelling Notification is disabled + if (!isset($notif_settings['cancellation_notification']['status']) || !$notif_settings['cancellation_notification']['status']) return; + + $tos = []; + + // Send the notification to admin + if (isset($notif_settings['cancellation_notification']['send_to_admin']) and $notif_settings['cancellation_notification']['send_to_admin'] == 1) + { + $tos[] = get_bloginfo('admin_email'); + } + + // Send the notification to event organizer + if (isset($notif_settings['cancellation_notification']['send_to_organizer']) and $notif_settings['cancellation_notification']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false) $tos[] = trim($organizer_email); + } + + // Send the notification to additional organizers + if (isset($notif_settings['cancellation_notification']['send_to_additional_organizers']) and $notif_settings['cancellation_notification']['send_to_additional_organizers'] == 1) + { + $additional_organizer_emails = $this->get_booking_additional_organizers_emails($book_id); + if (is_array($additional_organizer_emails) and count($additional_organizer_emails)) + { + foreach ($additional_organizer_emails as $additional_organizer_email) $tos[] = trim($additional_organizer_email); + } + } + + // Send the notification to event user + if (isset($notif_settings['cancellation_notification']['send_to_user']) and $notif_settings['cancellation_notification']['send_to_user'] == 1) + { + if (isset($booker->user_email) and $booker->user_email) + { + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) || !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Prevent duplicate send + $done_emails = []; + + // Send the emails + foreach ($attendees as $attendee) + { + if (isset($attendee['email']) and !in_array($attendee['email'], $done_emails)) + { + $tos[] = $attendee; + $done_emails[] = $attendee['email']; + } + } + } + } + + // No Recipient + if (!count($tos)) return; + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['cancellation_notification']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['cancellation_notification']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['cancellation_notification']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['cancellation_notification']['subject']) ? esc_html__($notif_settings['cancellation_notification']['subject'], 'modern-events-calendar-lite') : esc_html__('booking canceled.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'cancellation_notification', $event_id, $book_id), $book_id); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + $i = 1; + foreach ($tos as $to) + { + $mailto = (is_array($to) and isset($to['email'])) ? $to['email'] : $to; + + if (!trim($mailto) or !filter_var($mailto, FILTER_VALIDATE_EMAIL)) continue; + if ($i > 1) $headers = ['Content-Type: text/html; charset=UTF-8']; + + $message = $notif_settings['cancellation_notification']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'cancellation_notification', $event_id, $book_id), $book_id, (is_array($to) ? $to : null)); + + // Book Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $this->main->get_book_post_type()], $this->main->URL('admin') . 'edit.php'), $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $mailto, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_cancellation', $mail_arg, $book_id, 'booking_cancellation'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $i++; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + } + + /** + * Send booking rejection + * @param int $book_id + * @return void + * @author Webnus + */ + public function booking_rejection($book_id) + { + if (!$book_id) return; + + $rejection_notification = apply_filters('mec_booking_rejection', true); + if (!$rejection_notification) return; + + $booker = $this->u->booking($book_id); + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Rejection Notification is disabled + if (!isset($notif_settings['booking_rejection']['status']) || !$notif_settings['booking_rejection']['status']) return; + + $tos = []; + + // Send the notification to admin + if (isset($notif_settings['booking_rejection']['send_to_admin']) and $notif_settings['booking_rejection']['send_to_admin'] == 1) + { + $tos[] = get_bloginfo('admin_email'); + } + + // Send the notification to event organizer + if (isset($notif_settings['booking_rejection']['send_to_organizer']) and $notif_settings['booking_rejection']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false) $tos[] = trim($organizer_email); + } + + // Send the notification to additional organizers + if (isset($notif_settings['booking_rejection']['send_to_additional_organizers']) and $notif_settings['booking_rejection']['send_to_additional_organizers'] == 1) + { + $additional_organizer_emails = $this->get_booking_additional_organizers_emails($book_id); + if (is_array($additional_organizer_emails) and count($additional_organizer_emails)) + { + foreach ($additional_organizer_emails as $additional_organizer_email) $tos[] = trim($additional_organizer_email); + } + } + + // Send the notification to event user + if (isset($notif_settings['booking_rejection']['send_to_user']) and $notif_settings['booking_rejection']['send_to_user'] == 1) + { + if (isset($booker->user_email) and $booker->user_email) + { + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) or !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Prevent duplicate send + $done_emails = []; + + // Send the emails + foreach ($attendees as $attendee) + { + if (isset($attendee['email']) and !in_array($attendee['email'], $done_emails)) + { + $tos[] = $attendee; + $done_emails[] = $attendee['email']; + } + } + } + } + + // No Recipient + if (!count($tos)) return; + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['booking_rejection']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['booking_rejection']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['booking_rejection']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['booking_rejection']['subject']) ? esc_html__($notif_settings['booking_rejection']['subject'], 'modern-events-calendar-lite') : esc_html__('booking rejected.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'booking_rejection', $event_id, $book_id), $book_id); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + $i = 1; + foreach ($tos as $to) + { + $mailto = (is_array($to) and isset($to['email'])) ? $to['email'] : $to; + + if (!trim($mailto) or !filter_var($mailto, FILTER_VALIDATE_EMAIL)) continue; + if ($i > 1) $headers = ['Content-Type: text/html; charset=UTF-8']; + + $message = $notif_settings['booking_rejection']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'booking_rejection', $event_id, $book_id), $book_id, (is_array($to) ? $to : null)); + + // Book Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $this->main->get_book_post_type()], $this->main->URL('admin') . 'edit.php'), $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $mailto, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_rejection', $mail_arg, $book_id, 'booking_rejection'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $i++; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + } + + /** + * Send admin notification + * @param int $book_id + * @return void + * @author Webnus + */ + public function admin_notification($book_id) + { + if (!$book_id) return; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Admin Notification is disabled + if (isset($notif_settings['admin_notification']['status']) and !$notif_settings['admin_notification']['status']) return; + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $to = get_bloginfo('admin_email'); + $subject = isset($notif_settings['admin_notification']['subject']) ? esc_html__($notif_settings['admin_notification']['subject'], 'modern-events-calendar-lite') : esc_html__('A new booking is received.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'admin_notification', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['admin_notification']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['admin_notification']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['admin_notification']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Don't send the email to admin + if (isset($notif_settings['admin_notification']['send_to_admin']) and !$notif_settings['admin_notification']['send_to_admin']) + { + if (count($recipients)) + { + $to = current($recipients); + unset($recipients[0]); + } + else if (isset($notif_settings['admin_notification']['send_to_organizer']) and $notif_settings['admin_notification']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false) $to = $organizer_email; + } + else return; + } + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Send the notification to event organizer + if (isset($notif_settings['admin_notification']['send_to_organizer']) and $notif_settings['admin_notification']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false and $organizer_email != $to) $headers[] = $CCBCC . ': ' . trim($organizer_email); + } + + // Send the notification to additional organizers + if (isset($notif_settings['admin_notification']['send_to_additional_organizers']) and $notif_settings['admin_notification']['send_to_additional_organizers'] == 1) + { + $additional_organizer_emails = $this->get_booking_additional_organizers_emails($book_id); + if (is_array($additional_organizer_emails) and count($additional_organizer_emails)) + { + foreach ($additional_organizer_emails as $additional_organizer_email) + { + if ($additional_organizer_email != $to) $headers[] = $CCBCC . ': ' . trim($additional_organizer_email); + } + } + } + + $message = $notif_settings['admin_notification']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'admin_notification', $event_id, $book_id), $book_id); + + // Book Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $this->main->get_book_post_type()], $this->main->URL('admin') . 'edit.php'), $message); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_admin_notification', $mail_arg, $book_id, 'admin_notification'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + } + + /** + * Send booking reminder notification + * @param int $book_id + * @param string $timestamps + * @return boolean + * @author Webnus + */ + public function booking_reminder($book_id, $timestamps = null) + { + if (!$book_id) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['booking_reminder']['subject']) ? esc_html__($notif_settings['booking_reminder']['subject'], 'modern-events-calendar-lite') : esc_html__('Booking Reminder', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'booking_reminder', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['booking_reminder']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['booking_reminder']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['booking_reminder']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) or !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + if (isset($attendee[0]['MEC_TYPE_OF_DATA'])) continue; + + $to = $attendee['email'] ?? ''; + + if (!trim($to)) continue; + if (in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $message = $notif_settings['booking_reminder']['content'] ?? ''; + + $message = str_replace('%%zoom_join%%', get_post_meta($event_id, 'mec_zoom_join_url', true), $message); + $message = str_replace('%%zoom_link%%', get_post_meta($event_id, 'mec_zoom_link_url', true), $message); + $message = str_replace('%%zoom_password%%', get_post_meta($event_id, 'mec_zoom_password', true), $message); + $message = str_replace('%%zoom_embed%%', get_post_meta($event_id, 'mec_zoom_embed', true), $message); + + $message = $this->content($this->get_content($message, 'booking_reminder', $event_id, $book_id), $book_id, $attendee, $timestamps); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_reminder', $mail_arg, $book_id, 'booking_reminder'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * Send new event notification + * @param int $event_id + * @param boolean $update + * @return boolean + * @author Webnus + */ + public function new_event($event_id, $update = false) + { + if (!$event_id) return false; + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if (defined('DOING_AUTOSAVE') and DOING_AUTOSAVE) return false; + + // MEC Event Post Type + $event_PT = $this->main->get_main_post_type(); + + // If it's not a MEC Event + if (get_post_type($event_id) != $event_PT) return false; + + // If it's an update request, then don't send any notification + if ($update) return false; + + // New event notification is disabled + if (!isset($this->notif_settings['new_event']['status']) or (isset($this->notif_settings['new_event']['status']) and !$this->notif_settings['new_event']['status'])) return false; + + $status = get_post_status($event_id); + + // Don't send the email if it is draft or an auto draft post + if ($status == 'auto-draft' or $status == 'draft') return false; + + $already_sent = get_post_meta($event_id, 'mec_new_event_notif_sent', true); + if ($already_sent) return false; + + $to = (!isset($this->notif_settings['new_event']['send_to_admin']) or (isset($this->notif_settings['new_event']['send_to_admin']) and $this->notif_settings['new_event']['send_to_admin'])) ? get_bloginfo('admin_email') : null; + + $disabled_send_notification_if_current_user_or_author_is_superadmin = isset($this->notif_settings['new_event']['disable_send_notification_if_current_user_or_author_is_admin']) && $this->notif_settings['new_event']['disable_send_notification_if_current_user_or_author_is_admin']; + if ($disabled_send_notification_if_current_user_or_author_is_superadmin && current_user_can('manage_options')) $to = null; + + $recipients_str = $this->notif_settings['new_event']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $this->notif_settings['new_event']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $this->notif_settings['new_event']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + if (is_null($to) and !count($recipients)) return false; + else if (is_null($to)) + { + $to = current($recipients); + unset($recipients[0]); + } + + $subject = (isset($this->notif_settings['new_event']['subject']) and trim($this->notif_settings['new_event']['subject'])) ? esc_html__($this->notif_settings['new_event']['subject'], 'modern-events-calendar-lite') : esc_html__('A new event is added.', 'modern-events-calendar-lite'); + $subject = $this->get_subject($subject, 'new_event', $event_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Date Format + $date_format = get_option('date_format'); + + $message = (isset($this->notif_settings['new_event']['content']) and trim($this->notif_settings['new_event']['content'])) ? $this->notif_settings['new_event']['content'] : ''; + $message = $this->get_content($message, 'new_event', $event_id); + + // Site Data + $message = str_replace('%%blog_name%%', get_bloginfo('name'), $message); + $message = str_replace('%%blog_url%%', get_bloginfo('url'), $message); + $message = str_replace('%%blog_description%%', get_bloginfo('description'), $message); + + // Event Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $event_PT], $this->main->URL('admin') . 'edit.php'), $message); + $message = str_replace('%%event_title%%', get_the_title($event_id), $message); + $message = str_replace('%%event_link%%', get_post_permalink($event_id), $message); + $message = str_replace('%%event_description%%', $this->main->get_raw_post_description($event_id), $message); + + $event_tags = get_the_terms($event_id, apply_filters('mec_taxonomy_tag', '')); + $message = str_replace('%%event_tags%%', (is_array($event_tags) ? join(', ', wp_list_pluck($event_tags, 'name')) : ''), $message); + + $event_labels = get_the_terms($event_id, 'mec_label'); + $message = str_replace('%%event_labels%%', (is_array($event_labels) ? join(', ', wp_list_pluck($event_labels, 'name')) : ''), $message); + + $event_categories = get_the_terms($event_id, 'mec_category'); + $message = str_replace('%%event_categories%%', (is_array($event_categories) ? join(', ', wp_list_pluck($event_categories, 'name')) : ''), $message); + + $mec_cost = get_post_meta($event_id, 'mec_cost', true); + $message = str_replace('%%event_cost%%', (is_numeric($mec_cost) ? $this->main->render_price($mec_cost, $event_id) : $mec_cost), $message); + + $message = str_replace('%%event_start_date%%', $this->main->date_i18n($date_format, strtotime(get_post_meta($event_id, 'mec_start_date', true))), $message); + $message = str_replace('%%event_end_date%%', $this->main->date_i18n($date_format, strtotime(get_post_meta($event_id, 'mec_end_date', true))), $message); + $message = str_replace('%%event_timezone%%', $this->main->get_timezone($event_id), $message); + $message = str_replace('%%event_note%%', get_post_meta($event_id, 'mec_note', true), $message); + + $status_obj = get_post_status_object($status); + $message = str_replace('%%event_status%%', (($status_obj and isset($status_obj->label)) ? $status_obj->label : $status), $message); + + // Data Fields + $event_fields = $this->main->get_event_fields(); + $event_fields_data = get_post_meta($event_id, 'mec_fields', true); + if (!is_array($event_fields_data)) $event_fields_data = []; + + foreach ($event_fields as $f => $event_field) + { + if (!is_numeric($f)) continue; + + $field_value = $event_fields_data[$f] ?? ''; + if ((!is_array($field_value) and trim($field_value) === '') or (is_array($field_value) and !count($field_value))) + { + $message = str_replace('%%event_field_' . $f . '%%', '', $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', '', $message); + + continue; + } + + $event_field_name = $event_field['label'] ?? ''; + if (is_array($field_value)) $field_value = implode(', ', $field_value); + + $message = str_replace('%%event_field_' . $f . '%%', trim($field_value, ', '), $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', trim((trim($event_field_name) ? $event_field_name . ': ' : '') . trim($field_value, ', ')), $message); + } + + $message = str_replace('%%zoom_join%%', get_post_meta($event_id, 'mec_zoom_join_url', true), $message); + $message = str_replace('%%zoom_link%%', get_post_meta($event_id, 'mec_zoom_link_url', true), $message); + $message = str_replace('%%zoom_password%%', get_post_meta($event_id, 'mec_zoom_password', true), $message); + $message = str_replace('%%zoom_embed%%', get_post_meta($event_id, 'mec_zoom_embed', true), $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Notification Subject + $subject = str_replace('%%event_title%%', get_the_title($event_id), $subject); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + wp_mail($to, html_entity_decode(stripslashes($subject), ENT_HTML5), wpautop(stripslashes($message)), $headers); + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + update_post_meta($event_id, 'mec_new_event_notif_sent', 1); + + return true; + } + + /** + * Send suggest event notification + * + * @param array $attendee + * @param int $event_id + * @param int $book_id + * @return boolean + */ + public function suggest_event($attendee, $event_id, $book_id) + { + if (!is_array($attendee) || !count($attendee) || !$event_id || !$book_id) return false; + + // If it's not a MEC Event + if (get_post_type($event_id) != $this->main->get_main_post_type()) return false; + + $status = get_post_status($event_id); + + // Don't send the email if it is draft or an auto draft post + if ($status === 'auto-draft' || $status === 'draft') return false; + + // Recipient + $to = $attendee['email'] ?? ''; + + if (!is_email($to)) return false; + + $recipients_str = $this->notif_settings['suggest_event']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $this->notif_settings['suggest_event']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $this->notif_settings['suggest_event']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + $subject = (isset($this->notif_settings['suggest_event']['subject']) and trim($this->notif_settings['suggest_event']['subject'])) ? esc_html__($this->notif_settings['suggest_event']['subject'], 'modern-events-calendar-lite') : esc_html__("Discover more events you'll love!", 'modern-events-calendar-lite'); + $subject = $this->get_subject($subject, 'suggest_event', $event_id); + + $message = (isset($this->notif_settings['suggest_event']['content']) and trim($this->notif_settings['suggest_event']['content'])) ? $this->notif_settings['suggest_event']['content'] : ''; + $message = $this->get_content($message, 'suggest_event', $event_id); + + if (trim($message) === '' || trim($subject) === '') return false; + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + $start_timestamp = strtotime(get_post_meta($event_id, 'mec_start_datetime', true)); + $end_timestamp = strtotime(get_post_meta($event_id, 'mec_end_datetime', true)); + + $message = $this->content_event($message, $event_id, $start_timestamp, $end_timestamp); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + wp_mail($to, html_entity_decode(stripslashes($subject), ENT_HTML5), wpautop(stripslashes($message)), $headers); + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + update_post_meta($event_id, 'mec_new_event_notif_sent', 1); + + return true; + } + + /** + * Send new event published notification + * @param string $new + * @param string $old + * @param WP_Post $post + * @return boolean + * @author Webnus + */ + public function user_event_publishing($new, $old, $post) + { + // MEC Event Post Type + $event_PT = $this->main->get_main_post_type(); + + // User event publishing notification is disabled + if (!isset($this->notif_settings['user_event_publishing']['status']) || !$this->notif_settings['user_event_publishing']['status']) return false; + + if ($new == 'publish' && $old != 'publish' && $post->post_type == $event_PT) + { + $email = get_post_meta($post->ID, 'fes_guest_email', true); + $owner = get_userdata($post->post_author); + + // Not Set Guest User Email + if (!trim($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) + { + $email = (is_object($owner) ? $owner->user_email : ''); + } + + if (!trim($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) return false; + + $guest_name = get_post_meta($post->ID, 'fes_guest_name', true); + if (!trim($guest_name)) $guest_name = $owner->first_name . ' ' . $owner->last_name; + + $to = $email; + $subject = (isset($this->notif_settings['user_event_publishing']['subject']) and trim($this->notif_settings['user_event_publishing']['subject'])) ? esc_html__($this->notif_settings['user_event_publishing']['subject'], 'modern-events-calendar-lite') : esc_html__('Your event is published.', 'modern-events-calendar-lite'); + $subject = $this->get_subject($subject, 'user_event_publishing', $post->ID); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $this->notif_settings['user_event_publishing']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $this->notif_settings['user_event_publishing']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $this->notif_settings['user_event_publishing']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + $message = (isset($this->notif_settings['user_event_publishing']['content']) and trim($this->notif_settings['user_event_publishing']['content'])) ? $this->notif_settings['user_event_publishing']['content'] : ''; + $message = $this->get_content($message, 'user_event_publishing', $post->ID); + + // User Data + $message = str_replace('%%name%%', $guest_name, $message); + + // Site Data + $message = str_replace('%%blog_name%%', get_bloginfo('name'), $message); + $message = str_replace('%%blog_url%%', get_bloginfo('url'), $message); + $message = str_replace('%%blog_description%%', get_bloginfo('description'), $message); + + // Date Format + $date_format = get_option('date_format'); + + // Event Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $event_PT], $this->main->URL('admin') . 'edit.php'), $message); + $message = str_replace('%%event_title%%', get_the_title($post->ID), $message); + $message = str_replace('%%event_description%%', $this->main->get_raw_post_description($post->ID), $message); + + $event_tags = get_the_terms($post->ID, apply_filters('mec_taxonomy_tag', '')); + $message = str_replace('%%event_tags%%', (is_array($event_tags) ? join(', ', wp_list_pluck($event_tags, 'name')) : ''), $message); + + $event_labels = get_the_terms($post->ID, 'mec_label'); + $message = str_replace('%%event_labels%%', (is_array($event_labels) ? join(', ', wp_list_pluck($event_labels, 'name')) : ''), $message); + + $event_categories = get_the_terms($post->ID, 'mec_category'); + $message = str_replace('%%event_categories%%', (is_array($event_categories) ? join(', ', wp_list_pluck($event_categories, 'name')) : ''), $message); + + $mec_cost = get_post_meta($post->ID, 'mec_cost', true); + $message = str_replace('%%event_cost%%', (is_numeric($mec_cost) ? $this->main->render_price($mec_cost, $post->ID) : $mec_cost), $message); + + $mec_start_date = get_post_meta($post->ID, 'mec_start_date', true); + $mec_end_date = get_post_meta($post->ID, 'mec_end_date', true); + + if (!$mec_start_date and !$mec_end_date) + { + $mec = isset($_POST['mec']) ? $this->main->sanitize_deep_array($_POST['mec']) : []; + + $mec_start_date = (isset($mec['date']) and isset($mec['date']['start']) and isset($mec['date']['start']['date']) and trim($mec['date']['start']['date'])) ? $this->main->standardize_format(sanitize_text_field($mec['date']['start']['date'])) : null; + $mec_end_date = (isset($mec['date']) and isset($mec['date']['end']) and isset($mec['date']['end']['date']) and trim($mec['date']['end']['date'])) ? $this->main->standardize_format(sanitize_text_field($mec['date']['end']['date'])) : null; + } + + $message = str_replace('%%event_link%%', get_post_permalink($post->ID), $message); + $message = str_replace('%%event_start_date%%', $this->main->date_i18n($date_format, $mec_start_date), $message); + $message = str_replace('%%event_end_date%%', $this->main->date_i18n($date_format, $mec_end_date), $message); + $message = str_replace('%%event_timezone%%', $this->main->get_timezone($post->ID), $message); + $message = str_replace('%%event_note%%', get_post_meta($post->ID, 'mec_note', true), $message); + + $status_obj = get_post_status_object($new); + $message = str_replace('%%event_status%%', (($status_obj and isset($status_obj->label)) ? $status_obj->label : $new), $message); + + // Data Fields + $event_fields = $this->main->get_event_fields(); + + $event_fields_data = get_post_meta($post->ID, 'mec_fields', true); + if (!is_array($event_fields_data)) $event_fields_data = []; + + foreach ($event_fields as $f => $event_field) + { + if (!is_numeric($f)) continue; + + $field_value = $event_fields_data[$f] ?? ''; + if (!is_array($field_value) and trim($field_value) === '') + { + $message = str_replace('%%event_field_' . $f . '%%', '', $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', '', $message); + + continue; + } + + $event_field_name = $event_field['label'] ?? ''; + if (is_array($field_value)) $field_value = implode(', ', $field_value); + + $message = str_replace('%%event_field_' . $f . '%%', trim($field_value, ', '), $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', trim((trim($event_field_name) ? $event_field_name . ': ' : '') . trim($field_value, ', ')), $message); + } + + $message = str_replace('%%zoom_join%%', get_post_meta($post->ID, 'mec_zoom_join_url', true), $message); + $message = str_replace('%%zoom_link%%', get_post_meta($post->ID, 'mec_zoom_link_url', true), $message); + $message = str_replace('%%zoom_password%%', get_post_meta($post->ID, 'mec_zoom_password', true), $message); + $message = str_replace('%%zoom_embed%%', get_post_meta($post->ID, 'mec_zoom_embed', true), $message); + + $message = apply_filters('mec_notifications_user_event_publishing_render_content', $message, $post->ID, $post, $new, $old); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Notification Subject + $subject = str_replace('%%event_title%%', get_the_title($post->ID), $subject); + $subject = apply_filters('mec_notifications_user_event_publishing_render_subject', $subject, $post->ID, $post, $new, $old); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + wp_mail($to, html_entity_decode(stripslashes($subject), ENT_HTML5), wpautop(stripslashes($message)), $headers); + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + } + + return true; + } + + public function event_soldout($event_id, $book_id) + { + if (!$book_id) return; + + $event_soldout = apply_filters('mec_event_soldout_notification', true); + if (!$event_soldout) return; + + // Event Soldout Notification is disabled + if (!isset($this->notif_settings['event_soldout']['status']) or (isset($this->notif_settings['event_soldout']['status']) and !$this->notif_settings['event_soldout']['status'])) return; + + $tos = []; + + // Send the notification to admin + if (isset($this->notif_settings['event_soldout']['send_to_admin']) and $this->notif_settings['event_soldout']['send_to_admin'] == 1) + { + $tos[] = get_bloginfo('admin_email'); + } + + // Send the notification to event organizer + if (isset($this->notif_settings['event_soldout']['send_to_organizer']) and $this->notif_settings['event_soldout']['send_to_organizer'] == 1) + { + $organizer_email = $this->get_booking_organizer_email($book_id); + if ($organizer_email !== false) $tos[] = trim($organizer_email); + } + + // Send the notification to additional organizers + if (isset($this->notif_settings['event_soldout']['send_to_additional_organizers']) and $this->notif_settings['event_soldout']['send_to_additional_organizers'] == 1) + { + $additional_organizer_emails = $this->get_booking_additional_organizers_emails($book_id); + if (is_array($additional_organizer_emails) and count($additional_organizer_emails)) + { + foreach ($additional_organizer_emails as $additional_organizer_email) $tos[] = trim($additional_organizer_email); + } + } + + // No Recipient + if (!count($tos)) return; + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $this->notif_settings['event_soldout']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $this->notif_settings['event_soldout']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $this->notif_settings['event_soldout']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + $subject = isset($this->notif_settings['event_soldout']['subject']) ? esc_html__($this->notif_settings['event_soldout']['subject'], 'modern-events-calendar-lite') : esc_html__('Event is soldout!', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'event_soldout', $event_id, $book_id), $book_id); + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the mail + $i = 1; + foreach ($tos as $to) + { + $mailto = (is_array($to) and isset($to['email'])) ? $to['email'] : $to; + + if (!trim($mailto) or !filter_var($mailto, FILTER_VALIDATE_EMAIL)) continue; + if ($i > 1) $headers = ['Content-Type: text/html; charset=UTF-8']; + + $message = $this->notif_settings['event_soldout']['content'] ?? ''; + $message = $this->content($this->get_content($message, 'event_soldout', $event_id, $book_id), $book_id, (is_array($to) ? $to : null)); + + // Book Data + $message = str_replace('%%admin_link%%', $this->link(['post_type' => $this->main->get_book_post_type()], $this->main->URL('admin') . 'edit.php'), $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $mailto, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_event_soldout', $mail_arg, $book_id, 'event_soldout'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $i++; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + } + + public function event_finished($event_id, $timestamps) + { + if (!$event_id) return false; + + // Event Finished notification is disabled + if (!isset($this->notif_settings['event_finished']['status']) or (isset($this->notif_settings['event_finished']['status']) and !$this->notif_settings['event_finished']['status'])) return false; + + list($start_timestamp, $end_timestamp) = explode(':', $timestamps); + + // Attendees + $attendees = $this->main->get_event_attendees($event_id, $start_timestamp); + + // No Attendee + if (!is_array($attendees) or !count($attendees)) return false; + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $this->notif_settings['event_finished']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $this->notif_settings['event_finished']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $this->notif_settings['event_finished']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Do not send email twice! + $done_emails = []; + + // Send the Emails + foreach ($attendees as $attendee) + { + // Book ID + $book_id = $attendee['book_id']; + + // To Address + $to = $attendee['email'] ?? ''; + + if (!trim($to)) continue; + if (in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $subject = isset($this->notif_settings['event_finished']['subject']) ? esc_html__($this->notif_settings['event_finished']['subject'], 'modern-events-calendar-lite') : esc_html__('Thanks for your attention!', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'event_finished', $event_id, $book_id), $book_id, $attendee, $timestamps); + + $message = $this->notif_settings['event_finished']['content'] ?? ''; + + $message = str_replace('%%zoom_join%%', get_post_meta($event_id, 'mec_zoom_join_url', true), $message); + $message = str_replace('%%zoom_link%%', get_post_meta($event_id, 'mec_zoom_link_url', true), $message); + $message = str_replace('%%zoom_password%%', get_post_meta($event_id, 'mec_zoom_password', true), $message); + $message = str_replace('%%zoom_embed%%', get_post_meta($event_id, 'mec_zoom_embed', true), $message); + + $message = $this->content($this->get_content($message, 'event_finished', $event_id, $book_id), $book_id, $attendee, $timestamps); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_reminder', $mail_arg, $book_id, 'booking_reminder'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + public function auto_email($book_id, $subject, $message, $timestamps = null) + { + if (!$book_id) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + // Subject + $subject = $this->content($subject, $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) || !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + if (isset($attendee[0]['MEC_TYPE_OF_DATA'])) continue; + + $to = $attendee['email'] ?? ''; + + if (!trim($to)) continue; + if (in_array($to, $done_emails) or !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + // Message + $message = $this->content($message, $book_id, $attendee, $timestamps); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Add Template + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_auto_email', $mail_arg, $book_id, 'auto_email'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * @param $booking_attendee_id + * @param $template + * @return bool + */ + public function certificate_send($booking_attendee_id, $template) + { + if (!$booking_attendee_id) return false; + + $mec_book = $this->main->get_mec_attendee_record($booking_attendee_id); + if (!isset($mec_book->booking_id)) return false; + + $book_id = $mec_book->booking_id; + + $booker = $this->u->get($mec_book->user_id); + if (!isset($booker->user_email)) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + // Subject + $subject = isset($notif_settings['certificate_send']['subject']) ? esc_html__($notif_settings['certificate_send']['subject'], 'modern-events-calendar-lite') : esc_html__('Download your certificate.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'certificate_send', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Message + $message = $notif_settings['certificate_send']['content'] ?? ''; + $message = $this->content($message, $book_id); + + $certificate_link = $this->main->get_certificate_link($booking_attendee_id, $template); + + // Certificate Link + $message = str_replace('%%certificate_link%%', $certificate_link, $message); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + // Add Template + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $booker->user_email, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_auto_email', $mail_arg, $book_id, 'auto_email'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + public function booking_moved($book_id) + { + if (!$book_id) return false; + + $booker = $this->u->booking($book_id); + if (!isset($booker->user_email)) return false; + + // Notification Settings + $notif_settings = $this->get_notification_content($book_id); + + // Booking Moved is disabled + if (!isset($notif_settings['booking_moved']['status']) || !$notif_settings['booking_moved']['status']) return false; + + // Event ID + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $subject = isset($notif_settings['booking_moved']['subject']) ? esc_html__($notif_settings['booking_moved']['subject'], 'modern-events-calendar-lite') : esc_html__('Your booking has been rescheduled.', 'modern-events-calendar-lite'); + $subject = $this->content($this->get_subject($subject, 'booking_moved', $event_id, $book_id), $book_id); + + $headers = ['Content-Type: text/html; charset=UTF-8']; + + $recipients_str = $notif_settings['booking_moved']['recipients'] ?? ''; + $recipients = trim($recipients_str) ? explode(',', $recipients_str) : []; + + $users = $notif_settings['booking_moved']['receiver_users'] ?? []; + $users_down = $this->main->get_emails_by_users($users); + $recipients = array_merge($users_down, $recipients); + + $roles = $notif_settings['booking_moved']['receiver_roles'] ?? []; + $user_roles = $this->main->get_emails_by_roles($roles); + $recipients = array_merge($user_roles, $recipients); + + // Unique Recipients + $recipients = array_map('trim', $recipients); + $recipients = array_unique($recipients); + + // Recipient Type + $CCBCC = $this->get_cc_bcc_method(); + + foreach ($recipients as $recipient) + { + // Skip if it's not a valid email + if (trim($recipient) == '' or !filter_var($recipient, FILTER_VALIDATE_EMAIL)) continue; + + $headers[] = $CCBCC . ': ' . $recipient; + } + + // Attendees + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) || !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + // Do not send email twice! + $done_emails = []; + + // Changing some sender email info. + $this->mec_sender_email_notification_filter(); + + // Set Email Type to HTML + add_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + // Send the emails + foreach ($attendees as $attendee) + { + $to = $attendee['email'] ?? ''; + if (!trim($to) || in_array($to, $done_emails) || !filter_var($to, FILTER_VALIDATE_EMAIL)) continue; + + $message = $notif_settings['booking_moved']['content'] ?? ''; + + $prev_timestamps = get_post_meta($book_id, 'mec_date_prev', true); + $prev_datetime = $this->main->get_book_datetime_string($prev_timestamps, $event_id, $book_id); + + $message = str_replace('%%book_datetime_prev%%', $prev_datetime, $message); + + $message = $this->content($this->get_content($message, 'booking_moved', $event_id, $book_id), $book_id, $attendee); + + // Remove remained placeholders + $message = preg_replace('/%%.*%%/', '', $message); + + $message = $this->add_template($message); + + // Filter the email + $mail_arg = [ + 'to' => $to, + 'subject' => $subject, + 'message' => $message, + 'headers' => $headers, + 'attachments' => [], + ]; + + $mail_arg = apply_filters('mec_before_send_booking_moved', $mail_arg, $book_id, 'booking_moved'); + + // Send the mail + wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); + + // For prevention of email repeat send + $done_emails[] = $to; + } + + // Remove the HTML Email filter + remove_filter('wp_mail_content_type', [$this->main, 'html_email_type']); + + return true; + } + + /** + * Generate a link based on parameters + * @param array $vars + * @param string $url + * @return string + * @author Webnus + */ + public function link($vars = [], $url = null) + { + if (!trim($url)) $url = $this->main->URL() . $this->main->get_main_slug() . '/'; + foreach ($vars as $key => $value) $url = $this->main->add_qs_var($key, $value, $url); + + return $url; + } + + /** + * Generate content of email + * @param string $message + * @param int $book_id + * @param array $attendee + * @param string $timestamps + * @return string + * @author Webnus + */ + public function content($message, $book_id, $attendee = [], $timestamps = '') + { + if (!$book_id) return false; + + // Disable Cache + $cache = $this->getCache(); + $cache->disable(); + + $booker = $this->u->booking($book_id); + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $first_name = isset($booker->first_name) ? $booker->first_name : ''; + $last_name = isset($booker->last_name) ? $booker->last_name : ''; + $name = (isset($booker->first_name) ? trim($booker->first_name . ' ' . (isset($booker->last_name) ? $booker->last_name : '')) : ''); + $email = (isset($booker->user_email) ? $booker->user_email : ''); + + // DB + $db = $this->getDB(); + + /** + * Get the data from Attendee instead of main booker user + */ + if (isset($attendee['name']) and trim($attendee['name'])) + { + $name = esc_html($attendee['name']); + $attendee_ex_name = explode(' ', $name); + + $first_name = $attendee_ex_name[0] ?? ''; + unset($attendee_ex_name[0]); + + $last_name = implode(' ', $attendee_ex_name); + $email = $attendee['email'] ?? $email; + } + + // Booker Data + $message = str_replace('%%first_name%%', $first_name, $message); + $message = str_replace('%%last_name%%', $last_name, $message); + $message = str_replace('%%name%%', $name, $message); + $message = str_replace('%%user_email%%', $email, $message); + $message = str_replace('%%user_id%%', ($booker->ID ?? ''), $message); + + // Site Data + $message = str_replace('%%blog_name%%', get_bloginfo('name'), $message); + $message = str_replace('%%blog_url%%', get_bloginfo('url'), $message); + $message = str_replace('%%blog_description%%', get_bloginfo('description'), $message); + + // Book Data + $transaction_id = get_post_meta($book_id, 'mec_transaction_id', true); + $transaction = $this->book->get_transaction($transaction_id); + + // Date & Time Format + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + if (!trim($timestamps)) $timestamps = get_post_meta($book_id, 'mec_date', true); + list($start_timestamp, $end_timestamp) = explode(':', $timestamps); + + // Event Data + $message = $this->content_event($message, $event_id, $start_timestamp, $end_timestamp); + + // Book Date + if (trim($timestamps) and strpos($timestamps, ':') !== false) + { + if (trim($start_timestamp) != trim($end_timestamp) and date('Y-m-d', $start_timestamp) != date('Y-m-d', $end_timestamp)) + { + $book_date = sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->main->date_i18n($date_format, $start_timestamp), $this->main->date_i18n($date_format, $end_timestamp)); + } + else $book_date = get_the_date($date_format, $book_id); + } + else $book_date = get_the_date($date_format, $book_id); + + $message = str_replace('%%book_date%%', $book_date, $message); + + // Book Time + $event_start_time = $this->main->get_time($start_timestamp); + $event_end_time = $this->main->get_time($end_timestamp); + + $allday = get_post_meta($event_id, 'mec_allday', true); + $hide_time = get_post_meta($event_id, 'mec_hide_time', true); + $hide_end_time = $this->main->hide_end_time_status($event_id); + $event_time = $allday ? $this->main->m('all_day', esc_html__('All Day', 'modern-events-calendar-lite')) : (!$hide_end_time ? sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $event_start_time, $event_end_time) : $event_start_time); + + // Condition for check some parameter simple hide event time + if (!$hide_time) $message = str_replace('%%book_time%%', $event_time, $message); + else $message = str_replace('%%book_time%%', '', $message); + + // Book Date & Time + $book_datetime = $this->main->get_book_datetime_string($timestamps, $event_id, $book_id); + + $message = str_replace('%%book_datetime%%', $book_datetime, $message); + + // Other Date & Times + $other_dates = ((isset($transaction['other_dates']) and is_array($transaction['other_dates'])) ? $transaction['other_dates'] : []); + $other_dates_datetime = ''; + + foreach ($other_dates as $other_date) + { + list($other_start_timestamp, $other_end_timestamp) = explode(':', $other_date); + + if (trim($other_start_timestamp) != trim($other_end_timestamp)) $other_dates_datetime .= sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->main->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $other_start_timestamp), $this->main->date_i18n($date_format . ((!$allday and !$hide_time and !$hide_end_time) ? ' ' . $time_format : ''), $other_end_timestamp)) . "
    "; + else $other_dates_datetime .= $this->main->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $other_start_timestamp) . "
    "; + } + + $event_booking_options = get_post_meta($event_id, 'mec_booking', true); + if (!is_array($event_booking_options)) $event_booking_options = []; + + $book_all_occurrences = 0; + if (isset($event_booking_options['bookings_all_occurrences'])) $book_all_occurrences = (int) $event_booking_options['bookings_all_occurrences']; + + if ($book_all_occurrences && !trim($other_dates_datetime)) + { + $next_occurrences = $this->getRender()->dates($event_id, null, 10, date('Y-m-d', strtotime('-1 day', strtotime($start_timestamp)))); + foreach ($next_occurrences as $next_occurrence) + { + $other_dates_datetime .= $this->main->date_label($next_occurrence['start'], $next_occurrence['end'], $date_format . ' ' . $time_format, ' - ', false, 0, $event_id) . "
    "; + } + } + + $message = str_replace('%%book_other_datetimes%%', $other_dates_datetime, $message); + + // Order Time + $order_time = get_post_meta($book_id, 'mec_booking_time', true); + $message = str_replace('%%book_order_time%%', $this->main->date_i18n($date_format . ' ' . $time_format, strtotime($order_time)), $message); + + $message = str_replace('%%invoice_link%%', $this->book->get_invoice_link($transaction_id), $message); + + $cancellation_key = get_post_meta($book_id, 'mec_cancellation_key', true); + $cancellation_link = trim(get_permalink($event_id), '/') . '/cancel/' . $cancellation_key . '/'; + + $message = str_replace('%%cancellation_link%%', $cancellation_link, $message); + + // Booking Price + $price = get_post_meta($book_id, 'mec_price', true); + $message = str_replace('%%book_price%%', $this->main->render_price(($price ?: 0), $event_id), $message); + + // Booking Payable + $payable = get_post_meta($book_id, 'mec_payable', true); + $message = str_replace('%%book_payable%%', $this->main->render_price(($payable ?: 0), $event_id), $message); + + // Total Attendees + $message = str_replace('%%total_attendees%%', $this->book->get_total_attendees($book_id), $message); + + // Attendee Price + if (isset($attendee['email'])) + { + $attendee_price = $this->book->get_attendee_price($transaction, $attendee['email']); + $message = str_replace('%%attendee_price%%', $this->main->render_price(($attendee_price ?: $price), $event_id), $message); + } + + $mec_date = explode(':', get_post_meta($book_id, 'mec_date', true)); + + // Booked Tickets + if (count($mec_date) == 2 && isset($mec_date[0])) + { + $booked_tickets = $this->book->get_tickets_availability($event_id, $mec_date[0], 'reservation'); + $message = str_replace('%%amount_tickets%%', $booked_tickets, $message); + } + + // Attendee Full Information + if (strpos($message, '%%attendee_full_info%%') !== false || strpos($message, '%%attendees_full_info%%') !== false) + { + $attendees_full_info = $this->get_full_attendees_info($book_id); + + $message = str_replace('%%attendee_full_info%%', $attendees_full_info, $message); + $message = str_replace('%%attendees_full_info%%', $attendees_full_info, $message); + } + + // Ticket Variations + if (isset($attendee['variations']) and is_array($attendee['variations']) and count($attendee['variations'])) + { + $ticket_variations = $this->main->ticket_variations($event_id, $attendee['id']); + + $ticket_variations_str = ''; + foreach ($attendee['variations'] as $variation_id => $count) + { + if (!isset($ticket_variations[$variation_id])) continue; + + $title = $ticket_variations[$variation_id]['title'] ?? ''; + $ticket_variations_str .= $title . ': ' . $count . "
    "; + + $message = str_replace('%%ticket_variations_' . $variation_id . '_title%%', $title, $message); + $message = str_replace('%%ticket_variations_' . $variation_id . '_count%%', (int) $count, $message); + } + + $message = str_replace('%%ticket_variations%%', $ticket_variations_str, $message); + } + + // Booking IDs + $message = str_replace('%%booking_id%%', $book_id, $message); + $message = str_replace('%%booking_transaction_id%%', $transaction_id, $message); + + // Payment Gateway + $message = str_replace('%%payment_gateway%%', get_post_meta($book_id, 'mec_gateway_label', true), $message); + + // Booking Fixed Fields + $bfixed_fields = $this->main->get_bfixed_fields($event_id); + $all_bfixed_fields = ''; + + if (is_array($bfixed_fields) and count($bfixed_fields) and isset($transaction['fields']) and is_array($transaction['fields']) and count($transaction['fields'])) + { + foreach ($bfixed_fields as $b => $bfixed_field) + { + if (!is_numeric($b)) continue; + + $bfixed_field_name = $bfixed_field['label'] ?? ''; + $bfixed_value = $transaction['fields'][$b] ?? ''; + + if (is_array($bfixed_value)) $bfixed_value = implode(', ', $bfixed_value); + if (trim($bfixed_value) === '') continue; + + $name_and_value = trim((trim($bfixed_field_name) ? stripslashes($bfixed_field_name) . ': ' : '') . trim(stripslashes($bfixed_value), ', ')); + $all_bfixed_fields .= $name_and_value . "
    "; + + $message = str_replace('%%booking_field_' . $b . '%%', trim(stripslashes($bfixed_value), ', '), $message); + $message = str_replace('%%booking_field_' . $b . '_with_name%%', $name_and_value, $message); + } + } + + // All Booking Fields + $message = str_replace('%%all_bfixed_fields%%', $all_bfixed_fields, $message); + + $local_timezone = get_post_meta($book_id, 'mec_local_timezone', true); + if (is_string($local_timezone) and trim($local_timezone)) + { + $gmt_offset_seconds = $this->main->get_gmt_offset_seconds(date('Y-m-d', $start_timestamp), $event_id); + $gmt_start_time = strtotime(date('Y-m-d H:i:s', $start_timestamp)) - $gmt_offset_seconds; + $gmt_end_time = strtotime(date('Y-m-d H:i:s', $end_timestamp)) - $gmt_offset_seconds; + + $user_timezone = new DateTimeZone($local_timezone); + $gmt_timezone = new DateTimeZone('GMT'); + $gmt_datetime = new DateTime(date('Y-m-d H:i:s', $gmt_start_time), $gmt_timezone); + $offset = $user_timezone->getOffset($gmt_datetime); + + $user_start_time = $gmt_start_time + $offset; + $user_end_time = $gmt_end_time + $offset; + + $message = str_replace('%%event_start_date_local%%', $this->main->date_i18n($date_format, $user_start_time), $message); + $message = str_replace('%%event_end_date_local%%', $this->main->date_i18n($date_format, $user_end_time), $message); + $message = str_replace('%%event_start_time_local%%', date_i18n($time_format, $user_start_time), $message); + $message = str_replace('%%event_end_time_local%%', date_i18n($time_format, $user_end_time), $message); + } + else + { + $message = str_replace('%%event_start_date_local%%', 'N/A', $message); + $message = str_replace('%%event_end_date_local%%', 'N/A', $message); + $message = str_replace('%%event_start_time_local%%', 'N/A', $message); + $message = str_replace('%%event_end_time_local%%', 'N/A', $message); + } + + $ticket_names = []; + $ticket_times = []; + $ticket_private_descriptions = []; + + $ticket_ids_str = get_post_meta($book_id, 'mec_ticket_id', true); + $tickets = get_post_meta($event_id, 'mec_tickets', true); + + $ticket_ids = explode(',', $ticket_ids_str); + $ticket_ids = array_filter($ticket_ids); + + if (!is_array($tickets)) $tickets = []; + + foreach ($ticket_ids as $value) + { + foreach ($tickets as $ticket => $ticket_info) + { + if ($ticket != $value) continue; + + $ticket_names[] = $ticket_info['name']; + $ticket_private_descriptions[] = $ticket_info['private_description'] ?? ''; + + $ticket_start_hour = $ticket_info['ticket_start_time_hour'] ?? ''; + $ticket_start_minute = $ticket_info['ticket_start_time_minute'] ?? ''; + $ticket_start_ampm = $ticket_info['ticket_start_time_ampm'] ?? ''; + $ticket_end_hour = $ticket_info['ticket_end_time_hour'] ?? ''; + $ticket_end_minute = $ticket_info['ticket_end_time_minute'] ?? ''; + $ticket_end_ampm = $ticket_info['ticket_end_time_ampm'] ?? ''; + + $ticket_start_minute_s = $ticket_start_minute; + $ticket_end_minute_s = $ticket_end_minute; + + if ($ticket_start_minute == '0') $ticket_start_minute_s = '00'; + if ($ticket_start_minute == '5') $ticket_start_minute_s = '05'; + if ($ticket_end_minute == '0') $ticket_end_minute_s = '00'; + if ($ticket_end_minute == '5') $ticket_end_minute_s = '05'; + + $ticket_start_seconds = $this->main->time_to_seconds($this->main->to_24hours($ticket_start_hour, $ticket_start_ampm), $ticket_start_minute_s); + $ticket_end_seconds = $this->main->time_to_seconds($this->main->to_24hours($ticket_end_hour, $ticket_end_ampm), $ticket_end_minute_s); + + $ticket_times[] = $this->main->get_time($ticket_start_seconds) . ' ' . esc_html__('to', 'modern-events-calendar-lite') . ' ' . $this->main->get_time($ticket_end_seconds); + } + } + + // Private Description + $private_description_status = (!isset($this->settings['booking_private_description']) || $this->settings['booking_private_description']); + + $ticket_times = array_unique($ticket_times); + $message = str_replace('%%ticket_time%%', implode(',', $ticket_times), $message); + $message = str_replace('%%ticket_name%%', implode(',', $ticket_names), $message); + + if ($private_description_status) $message = str_replace('%%ticket_private_description%%', implode(',', array_unique($ticket_private_descriptions)), $message); + + $ticket_name_time = ''; + foreach ($ticket_names as $t_i => $ticket_name) + { + $ticket_name_time .= $ticket_name . (isset($ticket_times[$t_i]) ? ' (' . $ticket_times[$t_i] . '), ' : ', '); + } + + $message = str_replace('%%ticket_name_time%%', trim($ticket_name_time, ', '), $message); + + $gmt_offset_seconds = $this->main->get_gmt_offset_seconds($start_timestamp, $event_id); + $event_title = get_the_title($event_id); + $event_info = get_post($event_id); + $event_content = trim($event_info->post_content) ? strip_shortcodes(strip_tags($event_info->post_content)) : $event_title; + $event_content = apply_filters('mec_add_content_to_export_google_calendar_details', $event_content, $event_id); + + $location_id = $this->main->get_master_location_id($event_id, $start_timestamp); + $google_calendar_location = get_term_meta($location_id, 'address', true); + + // Recurring Rules + $rrule = $this->main->get_ical_rrules($event_id, true); + + $google_calendar_link = '' . esc_html__('+ Add to Google Calendar', 'modern-events-calendar-lite') . ''; + $ical_export_link = '' . esc_html__('+ iCal / Outlook export', 'modern-events-calendar-lite') . ''; + + $message = str_replace('%%google_calendar_link%%', $google_calendar_link, $message); + $message = str_replace('%%ics_link%%', $ical_export_link, $message); + + // Next Occurrences + $next_occurrences = $db->select("SELECT `tstart`, `tend` FROM `#__mec_dates` WHERE `post_id`='" . $event_id . "' AND `tstart`>='" . $start_timestamp . "' ORDER BY `tstart` ASC LIMIT 20", 'loadAssocList'); + + $google_calendar_links = ''; + $book_date_next_occurrences = ''; + $book_datetime_next_occurrences = ''; + + // Occurrences + foreach ($next_occurrences as $next_occurrence) + { + // Book Date + if (isset($next_occurrence['tstart']) and trim($next_occurrence['tstart']) and isset($next_occurrence['tend']) and trim($next_occurrence['tend'])) + { + if (trim($next_occurrence['tstart']) != trim($next_occurrence['tend'])) + { + $book_date_next_occurrences .= sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->main->date_i18n($date_format, $next_occurrence['tstart']), $this->main->date_i18n($date_format, $next_occurrence['tend'])) . '
    '; + $book_datetime_next_occurrences .= sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->main->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $next_occurrence['tstart']), $this->main->date_i18n($date_format . ((!$allday and !$hide_time and !$hide_end_time) ? ' ' . $time_format : ''), $next_occurrence['tend'])) . '
    '; + } + else + { + $book_date_next_occurrences .= $this->main->date_i18n($date_format, $next_occurrence['tstart']) . '
    '; + $book_datetime_next_occurrences .= $this->main->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $next_occurrence['tstart']) . '
    '; + } + } + else + { + $book_date_next_occurrences .= $this->main->date_i18n($date_format, $next_occurrence['tstart']) . '
    '; + $book_datetime_next_occurrences .= $this->main->date_i18n($date_format . ((!$allday and !$hide_time) ? ' ' . $time_format : ''), $next_occurrence['tstart']) . '
    '; + } + + $google_calendar_links .= '' . sprintf(esc_html__('+ %s to Google Calendar', 'modern-events-calendar-lite'), date($date_format . ' ' . $time_format, $next_occurrence['tstart'])) . '
    '; + } + + $message = str_replace('%%google_calendar_link_next_occurrences%%', $google_calendar_links, $message); + $message = str_replace('%%book_date_next_occurrences%%', $book_date_next_occurrences, $message); + $message = str_replace('%%book_datetime_next_occurrences%%', $book_datetime_next_occurrences, $message); + + // Downloadable File + $dl_file = $this->book->get_dl_file_link($book_id); + $message = str_replace('%%dl_file%%', $dl_file, $message); + + // Enable Cache + $cache->enable(); + + return apply_filters('mec_render_message_email', $message, $book_id, $attendee, $timestamps); + } + + public function content_event($message, $event_id, $start_timestamp, $end_timestamp) + { + // Occurrence Params + $params = MEC_feature_occurrences::param($event_id, $start_timestamp, '*'); + + // Date & Time Format + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + // Event Data + $organizer_id = $this->main->get_master_organizer_id($event_id, $start_timestamp); + $location_id = $this->main->get_master_location_id($event_id, $start_timestamp); + $speaker_id = wp_get_post_terms($event_id, 'mec_speaker', ''); + + $organizer = get_term($organizer_id, 'mec_organizer'); + $location = get_term($location_id, 'mec_location'); + + // Data Fields + $event_fields = $this->main->get_event_fields(); + $event_fields_data = get_post_meta($event_id, 'mec_fields', true); + if (!is_array($event_fields_data)) $event_fields_data = []; + + foreach ($event_fields as $f => $event_field) + { + if (!is_numeric($f)) continue; + + $event_field_name = $event_field['label'] ?? ''; + $field_value = $event_fields_data[$f] ?? ''; + if ((!is_array($field_value) and trim($field_value) === '') or (is_array($field_value) and !count($field_value))) + { + $message = str_replace('%%event_field_' . $f . '%%', '', $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', '', $message); + + continue; + } + + if (is_array($field_value)) $field_value = implode(', ', $field_value); + + $message = str_replace('%%event_field_' . $f . '%%', trim(stripslashes($field_value), ', '), $message); + $message = str_replace('%%event_field_' . $f . '_with_name%%', trim((trim($event_field_name) ? stripslashes($event_field_name) . ': ' : '') . trim(stripslashes($field_value), ', ')), $message); + } + + $message = str_replace('%%event_title%%', get_the_title($event_id), $message); + $message = str_replace('%%event_description%%', $this->main->get_raw_post_description($event_id), $message); + + $event_tags = get_the_terms($event_id, apply_filters('mec_taxonomy_tag', '')); + $message = str_replace('%%event_tags%%', (is_array($event_tags) ? join(', ', wp_list_pluck($event_tags, 'name')) : ''), $message); + + $event_labels = get_the_terms($event_id, 'mec_label'); + $message = str_replace('%%event_labels%%', (is_array($event_labels) ? join(', ', wp_list_pluck($event_labels, 'name')) : ''), $message); + + $event_categories = get_the_terms($event_id, 'mec_category'); + $message = str_replace('%%event_categories%%', (is_array($event_categories) ? join(', ', wp_list_pluck($event_categories, 'name')) : ''), $message); + + $mec_cost = get_post_meta($event_id, 'mec_cost', true); + $mec_cost = (isset($params['cost']) and trim($params['cost']) != '') ? preg_replace("/[^0-9.]/", '', $params['cost']) : $mec_cost; + + $read_more = get_post_meta($event_id, 'mec_read_more', true); + $read_more = (isset($params['read_more']) and trim($params['read_more']) != '') ? $params['read_more'] : $read_more; + + $more_info = get_post_meta($event_id, 'mec_more_info', true); + $more_info = (isset($params['more_info']) and trim($params['more_info']) != '') ? $params['more_info'] : $more_info; + + $event_link = $this->main->get_event_date_permalink(get_permalink($event_id), date('Y-m-d', $start_timestamp)); + + // Add Time + $repeat_type = get_post_meta($event_id, 'mec_repeat_type', true); + if ($repeat_type === 'custom_days') $event_link = $this->main->add_qs_var('time', $start_timestamp, $event_link); + + $message = str_replace('%%event_cost%%', (is_numeric($mec_cost) ? $this->main->render_price($mec_cost, $event_id) : $mec_cost), $message); + $message = str_replace('%%event_link%%', $event_link, $message); + $message = str_replace('%%event_more_info%%', esc_url($read_more), $message); + $message = str_replace('%%event_other_info%%', esc_url($more_info), $message); + $message = str_replace('%%event_start_date%%', $this->main->date_i18n($date_format, $start_timestamp), $message); + $message = str_replace('%%event_end_date%%', $this->main->date_i18n($date_format, $end_timestamp), $message); + $message = str_replace('%%event_start_time%%', date_i18n($time_format, $start_timestamp), $message); + $message = str_replace('%%event_end_time%%', date_i18n($time_format, $end_timestamp), $message); + $message = str_replace('%%event_timezone%%', $this->main->get_timezone($event_id), $message); + + $online_link = MEC_feature_occurrences::param($event_id, $start_timestamp, 'moved_online_link', get_post_meta($event_id, 'mec_moved_online_link', true)); + $message = str_replace('%%online_link%%', esc_url($online_link), $message); + + $featured_image = ''; + $thumbnail_url = $this->main->get_post_thumbnail_url($event_id, 'medium'); + if (trim($thumbnail_url)) $featured_image = ''; + + $message = str_replace('%%event_featured_image%%', $featured_image, $message); + + $message = str_replace('%%event_organizer_name%%', ($organizer->name ?? ''), $message); + $message = str_replace('%%event_organizer_tel%%', get_term_meta($organizer_id, 'tel', true), $message); + $message = str_replace('%%event_organizer_email%%', get_term_meta($organizer_id, 'email', true), $message); + $message = str_replace('%%event_organizer_url%%', get_term_meta($organizer_id, 'url', true), $message); + + $additional_organizers_name = ''; + $additional_organizers_tel = ''; + $additional_organizers_email = ''; + $additional_organizers_url = ''; + + $additional_organizers_ids = get_post_meta($event_id, 'mec_additional_organizer_ids', true); + if (!is_array($additional_organizers_ids)) $additional_organizers_ids = []; + + foreach ($additional_organizers_ids as $additional_organizers_id) + { + $additional_organizer = get_term($additional_organizers_id, 'mec_organizer'); + if (isset($additional_organizer->name)) + { + $additional_organizers_name .= $additional_organizer->name . ', '; + $additional_organizers_tel .= get_term_meta($additional_organizers_id, 'tel', true) . '
    '; + $additional_organizers_email .= get_term_meta($additional_organizers_id, 'email', true) . '
    '; + $additional_organizers_url .= get_term_meta($additional_organizers_id, 'url', true) . '
    '; + } + } + + $message = str_replace('%%event_other_organizers_name%%', trim($additional_organizers_name, ', '), $message); + $message = str_replace('%%event_other_organizers_tel%%', trim($additional_organizers_tel, ', '), $message); + $message = str_replace('%%event_other_organizers_email%%', trim($additional_organizers_email, ', '), $message); + $message = str_replace('%%event_other_organizers_url%%', trim($additional_organizers_url, ', '), $message); + + $speaker_name = []; + foreach ($speaker_id as $speaker) $speaker_name[] = $speaker->name ?? null; + + $message = str_replace('%%event_speaker_name%%', (isset($speaker_name) ? implode(', ', $speaker_name) : ''), $message); + $message = str_replace('%%event_location_name%%', ($location->name ?? get_term_meta($location_id, 'address', true)), $message); + $message = str_replace('%%event_location_address%%', get_term_meta($location_id, 'address', true), $message); + + $additional_locations_name = ''; + $additional_locations_address = ''; + + $additional_locations_ids = get_post_meta($event_id, 'mec_additional_location_ids', true); + if (!is_array($additional_locations_ids)) $additional_locations_ids = []; + + foreach ($additional_locations_ids as $additional_locations_id) + { + $additional_location = get_term($additional_locations_id, 'mec_location'); + if (isset($additional_location->name)) + { + $additional_locations_name .= $additional_location->name . ', '; + $additional_locations_address .= get_term_meta($additional_locations_id, 'address', true) . '
    '; + } + } + + $message = str_replace('%%event_other_locations_name%%', trim($additional_locations_name, ', '), $message); + $message = str_replace('%%event_other_locations_address%%', trim($additional_locations_address, ', '), $message); + + $message = str_replace('%%zoom_join%%', get_post_meta($event_id, 'mec_zoom_join_url', true), $message); + $message = str_replace('%%zoom_link%%', get_post_meta($event_id, 'mec_zoom_link_url', true), $message); + $message = str_replace('%%zoom_password%%', get_post_meta($event_id, 'mec_zoom_password', true), $message); + return str_replace('%%zoom_embed%%', get_post_meta($event_id, 'mec_zoom_embed', true), $message); + } + + /** + * Get Booking Organizer Email by Book ID + * @param int $book_id + * @return string + * @author Webnus + */ + public function get_booking_organizer_email($book_id) + { + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $mec_date = explode(':', get_post_meta($book_id, 'mec_date', true)); + + $organizer_id = $this->main->get_master_organizer_id($event_id, $mec_date[0]); + $email = get_term_meta($organizer_id, 'email', true); + + return trim($email) ? $email : false; + } + + /** + * Get Emails of Additional Organizers + * @param int $book_id + * @return array + * @author Webnus + */ + public function get_booking_additional_organizers_emails($book_id) + { + $event_id = get_post_meta($book_id, 'mec_event_id', true); + + $organizer_ids = get_post_meta($event_id, 'mec_additional_organizer_ids', true); + if (!is_array($organizer_ids)) $organizer_ids = []; + + $emails = []; + + $organizer_ids = array_unique($organizer_ids); + foreach ($organizer_ids as $organizer_id) + { + $email = get_term_meta($organizer_id, 'email', true); + if ($email and is_email($email)) $emails[] = $email; + } + + return array_unique($emails); + } + + /** + * Get full attendees info + * @param $book_id + * @return string + */ + public function get_full_attendees_info($book_id) + { + $attendees_full_info = ''; + + $attendees = get_post_meta($book_id, 'mec_attendees', true); + if (!is_array($attendees) || !count($attendees)) $attendees = [get_post_meta($book_id, 'mec_attendee', true)]; + + $event_id = get_post_meta($book_id, 'mec_event_id', true); + $reg_fields = $this->main->get_reg_fields($event_id); + $reg_fields = apply_filters('mec_notification_reg_fields', $reg_fields, $event_id, $book_id); + + $attachments = (isset($attendees['attachments']) and is_array($attendees['attachments'])) ? $attendees['attachments'] : []; + $attachment_field = []; + if (count($attachments)) + { + foreach ($reg_fields as $reg_field_id => $reg_field) + { + if (!is_numeric($reg_field_id)) continue; + if ($reg_field['type'] !== 'file') continue; + + $attachment_field = $reg_field; + break; + } + } + + foreach ($attendees as $key => $attendee) + { + if ($key === 'attachments') continue; + + $reg_form = $attendee['reg'] ?? []; + + $attendees_full_info .= esc_html__('Name', 'modern-events-calendar-lite') . ': ' . ((isset($attendee['name']) and trim($attendee['name'])) ? esc_html($attendee['name']) : '---') . "\r\n"; + $attendees_full_info .= esc_html__('Email', 'modern-events-calendar-lite') . ': ' . ((isset($attendee['email']) and trim($attendee['email'])) ? $attendee['email'] : '---') . "\r\n"; + + if (is_array($reg_form) and count($reg_form)) + { + foreach ($reg_form as $field_id => $value) + { + // Placeholder Keys + if (!is_numeric($field_id)) continue; + + $reg_fields = apply_filters('mec_booking_notification_reg_fields', $reg_fields, $field_id); + + $type = $reg_fields[$field_id]['type']; + + $label = isset($reg_fields[$field_id]) ? $reg_fields[$field_id]['label'] : ''; + if (trim($label) == '') continue; + + if ($type == 'agreement') + { + $label = sprintf(esc_html__($label, 'modern-events-calendar-lite'), '' . get_the_title($reg_fields[$field_id]['page']) . ''); + $attendees_full_info .= $label . ': ' . ($value == '1' ? esc_html__('Yes', 'modern-events-calendar-lite') : esc_html__('No', 'modern-events-calendar-lite')) . "\r\n"; + } + else + { + $attendees_full_info .= esc_html__($label, 'modern-events-calendar-lite') . ': ' . (is_string($value) ? $value : (is_array($value) ? implode(', ', $value) : '---')) . "\r\n"; + } + } + } + + $attendees_full_info .= "\r\n"; + } + + // Attachment + if (count($attachments)) + { + $attendees_full_info .= esc_html__($attachment_field['label'], 'modern-events-calendar-lite') . ': ' . esc_url($attachments[0]['url']) . '' . "\r\n"; + } + + return $attendees_full_info; + } + + /** + * Add filters for sender name and sender email + */ + public function mec_sender_email_notification_filter() + { + // MEC Notification Sender Email + add_filter('wp_mail_from_name', [$this, 'notification_sender_name']); + add_filter('wp_mail_from', [$this, 'notification_sender_email']); + } + + /** + * Change Notification Sender Name + * @param string $sender_name + * @return string + */ + public function notification_sender_name($sender_name) + { + return (isset($this->settings['booking_sender_name']) and trim($this->settings['booking_sender_name'])) ? stripslashes(trim($this->settings['booking_sender_name'])) : $sender_name; + } + + /** + * Change Notification Sender Email + * @param string $sender_email + * @return string + */ + public function notification_sender_email($sender_email) + { + return (isset($this->settings['booking_sender_email']) and trim($this->settings['booking_sender_email'])) ? trim($this->settings['booking_sender_email']) : $sender_email; + } + + /** + * Add template to the email content + * @param string $content + * @return string + */ + public function add_template($content) + { + // MEC Template is disabled + if (isset($this->settings['notif_template_disable']) and $this->settings['notif_template_disable']) return apply_filters('mec_email_template', $content); + + $style = $this->main->get_styling(); + $bg = $style['notification_bg'] ?? '#f6f6f6'; + + return ' + + + +
    +
    + ' . MEC_kses::page($content) . ' +
    +
    '; + } + + /** + * Get notification subject + * @param $value + * @param $notification_key + * @param $event_id + * @param $book_id + * @return mixed + */ + public function get_subject($value, $notification_key, $event_id, $book_id = null) + { + // Translated Event + if ($book_id) + { + $transaction_id = get_post_meta($book_id, 'mec_transaction_id', true); + $transaction = $this->book->get_transaction($transaction_id); + + // Use Translated Event for Content & Subject + if (isset($transaction['translated_event_id']) && $transaction['translated_event_id'] && $transaction['translated_event_id'] != $event_id) $event_id = $transaction['translated_event_id']; + } + + $custom_subject = apply_filters('mec_notification_get_subject', '', $notification_key, $event_id); + if (!empty($custom_subject)) return $custom_subject; + + $values = get_post_meta($event_id, 'mec_notifications', true); + if (!is_array($values) or !count($values)) return $value; + + $notification = $values[$notification_key] ?? []; + + if (!is_array($notification) or !count($notification)) return $value; + if (!isset($notification['status']) or !$notification['status']) return $value; + + return ((isset($notification['subject']) and trim($notification['subject'])) ? $notification['subject'] : $value); + } + + /** + * Get Notification Content + * @param $value + * @param $notification_key + * @param $event_id + * @param $book_id + * @return mixed + */ + public function get_content($value, $notification_key, $event_id, $book_id = null) + { + // Translated Event + if ($book_id) + { + $transaction_id = get_post_meta($book_id, 'mec_transaction_id', true); + $transaction = $this->book->get_transaction($transaction_id); + + // Use Translated Event for Content & Subject + if (isset($transaction['translated_event_id']) && $transaction['translated_event_id'] && $transaction['translated_event_id'] != $event_id) $event_id = $transaction['translated_event_id']; + } + + $custom_message = apply_filters('mec_notification_get_content', '', $notification_key, $event_id); + if (!empty($custom_message)) return $custom_message; + + $values = get_post_meta($event_id, 'mec_notifications', true); + if (!is_array($values) or !count($values)) return $value; + + $notification = $values[$notification_key] ?? []; + + if (!is_array($notification) or !count($notification)) return $value; + if (!isset($notification['status']) or !$notification['status']) return $value; + + return ((isset($notification['content']) and trim($notification['content'])) ? $notification['content'] : $value); + } + + /** + * @return string + */ + public function get_cc_bcc_method() + { + return ((isset($this->settings['booking_recipients_method']) and trim($this->settings['booking_recipients_method'])) ? strtoupper($this->settings['booking_recipients_method']) : 'BCC'); + } + + public function get_notification_content($book_id = '') + { + $locale = null; + if (trim($book_id)) $locale = get_post_meta($book_id, 'mec_locale', true); + + return $this->main->get_notifications($locale); + } +} diff --git a/app/libraries/parser.php b/app/libraries/parser.php new file mode 100755 index 0000000..bf72431 --- /dev/null +++ b/app/libraries/parser.php @@ -0,0 +1,261 @@ + + */ +class MEC_parser extends MEC_base +{ + public $main; + public $render; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC main library + $this->main = $this->getMain(); + + // MEC render library + $this->render = $this->getRender(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * A wrapper function for getting WP_Query object + * @author Webnus + * @global object $wp_query + * @return object + */ + public function get_wp_query() + { + global $wp_query; + return $wp_query; + } + + /** + * load MEC Rewrite Rules + * @author Webnus + * @param WP_Rewrite $wp_rewrite + */ + public function load_rewrites(WP_Rewrite $wp_rewrite) + { + // Don't add rewrite rules if archive page of MEC is disabled + if(!$this->main->get_archive_status()) return; + + if(!$wp_rewrite instanceof WP_Rewrite) + { + global $wp_rewrite; + } + + $rules = $this->get_rewrite_rules(); + $wp_rewrite->rules = $rules + $wp_rewrite->rules; + } + + public function get_rewrite_rules() + { + // MEC main slug + $slug = $this->main->get_main_slug(); + + // MEC main post type name + $PT = $this->main->get_main_post_type(); + + return array( + // '(?:'.$slug.')/(\d{4}-\d{2})/?$'=>'index.php?post_type='.$PT.'&MecDisplay=month&MecDate=$matches[1]', + // '(?:'.$slug.')/(?:yearly)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=year', + // '(?:'.$slug.')/(?:monthly)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=month', + // '(?:'.$slug.')/(?:weekly)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=week', + // '(?:'.$slug.')/(?:daily)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=day', + // '(?:'.$slug.')/(?:timetable)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=timetable', + // '(?:'.$slug.')/(?:map)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=map', + // '(?:'.$slug.')/(?:list)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=list', + // '(?:'.$slug.')/(?:grid)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=grid', + // '(?:'.$slug.')/(?:agenda)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=agenda', + // '(?:'.$slug.')/(?:masonry)/?$'=>'index.php?post_type='.$PT.'&MecDisplay=masonry', + '(?:'.$slug.')/?$'=>'index.php?post_type='.$PT.'&MecDisplay=default', + '(?:'.$slug.')/(feed|rdf|rss|rss2|atom)/?$'=>'index.php?post_type='.$PT.'&feed=$matches[1]', + ); + } + + /** + * Adds MEC query vars to the WordPress + * @author Webnus + * @param array $qvars + * @return array + */ + public function add_query_vars($qvars) + { + $qvars[] = 'MecDisplay'; + $qvars[] = 'MecMethod'; + $qvars[] = 'MecDate'; + + return $qvars; + } + + /** + * @author Webnus + * @param object $query + */ + public function WPQ_parse($query) + { + // MEC Archive Page + if($query->get('MecDisplay') != '') + { + $query->MEC_archive = true; + $query->MEC_single = false; + + $query->set('posts_per_page', 1); + } + } + + /** + * @author Webnus + * @param string $template + * @return string + */ + public function template($template) + { + // We're in an embed post + if(is_embed()) return $template; + + $PT = $this->main->get_main_post_type(); + if(is_single() && get_post_type() == $PT) + { + // Block Themes + if(function_exists('wp_is_block_theme') && wp_is_block_theme()) + { + add_filter('the_content', [$this, 'block_theme_single_content']); + + return $template; + } + + $template = locate_template('single-'.$PT.'.php'); + if($template == '') $template = MEC_ABSPATH.'templates'.DS.'single-mec-events.php'; + } + elseif(is_post_type_archive($PT) && !is_search()) + { + // Block Themes + if(function_exists('wp_is_block_theme') && wp_is_block_theme()) + { + return $template; + } + + $template = locate_template('archive-'.$PT.'.php'); + if($template == '') $template = MEC_ABSPATH.'templates'.DS.'archive-mec-events.php'; + + add_action('mec_before_main_content', function() + { + // MEC factory library + $factory = $this->getFactory(); + + $factory->filter('the_content', [$this, 'archive_content']); + $factory->filter('mec_archive_title', [$this, 'archive_title']); + $factory->filter('post_thumbnail_html', [$this, 'archive_thumbnail']); + }); + } + elseif(is_tax('mec_category')) + { + // Block Themes + if(function_exists('wp_is_block_theme') && wp_is_block_theme()) + { + return $template; + } + + $template = locate_template('taxonomy-mec-category.php'); + if($template == '') $template = MEC_ABSPATH.'templates'.DS.'taxonomy-mec-category.php'; + } + + return $template; + } + + /** + * @author Webnus + * @param string $content + * @return string|boolean + */ + public function archive_content($content) + { + // only run it once + remove_filter('the_content', array($this, 'archive_content')); + + // WP_Query + $wp_query = $this->get_wp_query(); + + if($wp_query->get('MecDisplay') == 'list') return $this->render->vlist(); + elseif($wp_query->get('MecDisplay') == 'grid') return $this->render->vgrid(); + elseif($wp_query->get('MecDisplay') == 'agenda') return $this->render->vagenda(); + elseif($wp_query->get('MecDisplay') == 'month') return $this->render->vmonth(); + elseif($wp_query->get('MecDisplay') == 'year') return $this->render->vyear(); + elseif($wp_query->get('MecDisplay') == 'week') return $this->render->vweek(); + elseif($wp_query->get('MecDisplay') == 'day') return $this->render->vday(); + elseif($wp_query->get('MecDisplay') == 'timetable') return $this->render->vtimetable(); + elseif($wp_query->get('MecDisplay') == 'masonry') return $this->render->vmasonry(); + elseif($wp_query->get('MecDisplay') == 'map') return $this->render->vmap(); + elseif($wp_query->get('MecDisplay') == 'default') return $this->render->vdefault(); + + return false; + } + + /** + * @author Webnus + * @param string $title + * @return string + */ + public function archive_title($title) + { + // only run it once + remove_filter('mec_archive_title', [$this, 'archive_title']); + + return $this->main->get_archive_title(false); + } + + /** + * @author Webnus + * @param string $html + * @return string + */ + public function archive_thumbnail($html) + { + // only run it once + remove_filter('post_thumbnail_html', [$this, 'archive_thumbnail']); + + return $this->main->get_archive_thumbnail(); + } + + /** + * @author Webnus + * @param string $content + * @return string + */ + public function single_content($content) + { + // MEC Single Page + if(!is_singular($this->main->get_main_post_type())) return $content; + + $event_id = get_the_ID(); + return $this->render->vsingle(['id'=>$event_id, 'content'=>$content]); + } + + public function archive_document_title($title) + { + if(is_post_type_archive($this->main->get_main_post_type()) && !is_search()) + { + return $this->main->get_archive_title(); + } + + return $title; + } + + public function block_theme_single_content($content) + { + remove_filter('the_content', [$this, 'block_theme_single_content']); + return $this->single_content($content); + } +} \ No newline at end of file diff --git a/app/libraries/partial.php b/app/libraries/partial.php new file mode 100755 index 0000000..21e0623 --- /dev/null +++ b/app/libraries/partial.php @@ -0,0 +1,112 @@ + + */ +class MEC_partial extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + + /** + * @var array + */ + public $settings; + + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // General Options + $this->settings = $this->main->get_settings(); + } + + public function is_enabled() + { + return isset($this->settings['booking_partial_payment']) && $this->settings['booking_partial_payment']; + } + + public function is_payable_per_event_enabled() + { + return $this->is_enabled() && isset($this->settings['booking_payable_per_event']) && $this->settings['booking_payable_per_event']; + } + + public function is_fes_pp_section_enabled() + { + return $this->is_payable_per_event_enabled() && (!isset($this->settings['fes_section_booking_pp']) || $this->settings['fes_section_booking_pp']); + } + + /** + * @param $payable + * @param string $type + * @return array + */ + public function validate_payable_options($payable, $type) + { + // Payable Type Validation + if(!in_array($type, ['percent', 'amount'])) $type = 'percent'; + + // Payable Validation + if($type === 'percent') + { + $payable = (int) $payable; + $payable = max(1, min($payable, 100)); + } + else $payable = max(1, $payable); + + return [$payable, $type]; + } + + /** + * @param int $total + * @param int $event_id + * @return int + */ + public function calculate($total, $event_id) + { + list($payable_amount, $payable_type) = $this->get_validated_payable_options($event_id); + + $payable = $total; + if($payable_type === 'percent') + { + $payable = $total * ($payable_amount / 100); + } + elseif($payable_type === 'amount') + { + $payable = min($total, $payable_amount); + } + + return $payable; + } + + /** + * Get Payable Options + * @param int $event_id + * @return array + */ + public function get_validated_payable_options($event_id) + { + // Global Options + $payable = $this->settings['booking_payable'] ?? 100; + $payable_type = $this->settings['booking_payable_type'] ?? 'percent'; + + $booking_options = get_post_meta($event_id, 'mec_booking', true); + if(!is_array($booking_options)) $booking_options = []; + + // Event Options + $payable_inherit = !isset($booking_options['bookings_payable_inherit']) || $booking_options['bookings_payable_inherit']; + if(!$payable_inherit) + { + if(isset($booking_options['bookings_payable']) && trim($booking_options['bookings_payable']) !== '') $payable = $booking_options['bookings_payable']; + if(isset($booking_options['bookings_payable_type']) && trim($booking_options['bookings_payable_type']) !== '') $payable_type = $booking_options['bookings_payable_type']; + } + + return $this->validate_payable_options($payable, $payable_type); + } +} \ No newline at end of file diff --git a/app/libraries/qrcode.php b/app/libraries/qrcode.php new file mode 100755 index 0000000..b770f15 --- /dev/null +++ b/app/libraries/qrcode.php @@ -0,0 +1,3224 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* + * Version: 1.1.4 + * Build: 2010100721 + */ + +/* + * PHP QR Code encoder + * + * Common constants + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +// Encoding modes + +define('QR_MODE_NUL', -1); +define('QR_MODE_NUM', 0); +define('QR_MODE_AN', 1); +define('QR_MODE_8', 2); +define('QR_MODE_KANJI', 3); +define('QR_MODE_STRUCTURE', 4); + +// Levels of error correction. + +define('QR_ECLEVEL_L', 0); +define('QR_ECLEVEL_M', 1); +define('QR_ECLEVEL_Q', 2); +define('QR_ECLEVEL_H', 3); + +// Supported output formats + +define('QR_FORMAT_TEXT', 0); +define('QR_FORMAT_PNG', 1); + +class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } +} + +/* + * PHP QR Code encoder + * + * Config file, tuned-up for merged verion + */ + +define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there +define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true +define('QR_LOG_DIR', false); // default error logs dir + +define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code +define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly +define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false + +define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images + +/* + * PHP QR Code encoder + * + * Toolset, handy and debug utilites. + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = []; + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = []; + + foreach ($qrTab as $line) { + $arrAdd = []; + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public function clearCache() + { + self::$frames = []; + } + + //---------------------------------------------------------------------- + public function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + $err = date('Y-m-d H:i:s').': '.$err; + if ($outfile !== false) { + MEC_file::write(QR_LOG_DIR.basename($outfile).'-errors.txt', $err); + } else { + MEC_file::write(QR_LOG_DIR.'errors.txt', $err); + } + } + } + } + + //---------------------------------------------------------------------- + public function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = []; + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + +} + +//########################################################################## + +QRtools::markTime('start'); + +/* + * PHP QR Code encoder + * + * QR Code specifications + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +define('QRSPEC_VERSION_MAX', 40); +define('QRSPEC_WIDTH_MAX', 177); + +define('QRCAP_WIDTH', 0); +define('QRCAP_WORDS', 1); +define('QRCAP_REMINDER', 2); +define('QRCAP_EC', 3); + +class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = []; + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


            '; + echo join("
            ", $frame); + echo '






    '; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
    ", $frame); + echo "
    "; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(MEC_file::read($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + MEC_file::write($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + +} + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +define('QR_IMAGE', true); + +class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + header("Content-type: image/png"); + imagepng($image); + } else { + if($saveandprint===TRUE){ + imagepng($image, $filename); + header("Content-type: image/png"); + imagepng($image); + }else{ + imagepng($image, $filename); + } + } + + imagedestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + header("Content-type: image/jpeg"); + imagejpeg($image, null, $q); + } else { + imagejpeg($image, $filename, $q); + } + + imagedestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image = imagecreate($imgW, $imgH); + + $col[0] = imagecolorallocate($base_image,255,255,255); + $col[1] = imagecolorallocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + imagesetpixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image = imagecreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + imagecopyresized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + imagedestroy($base_image); + + return $target_image; + } +} + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +define('STRUCTURE_HEADER_BITS', 20); +define('MAX_STRUCTURED_SYMBOLS', 16); + +class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',', $setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } +} + +//########################################################################## + +class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if($size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if($index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if($val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = []; + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } +} + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +class QRbitstream { + + public $data = []; + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return []; + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } +} + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } +} + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } +} + +//########################################################################## + +class QRrs { + + public static $items = []; + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } +} + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +define('N1', 3); +define('N2', 3); +define('N3', 40); +define('N4', 10); + +class QRmask { + + public $runLength = []; + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public function serial($bitFrame) + { + $codeArr = []; + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public function unserial($code) + { + $codeArr = []; + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = []; + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(MEC_file::read($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + MEC_file::write($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = []; + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } +} + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +class QRrsblock { + public $dataLength; + public $data = []; + public $eccLength; + public $ecc = []; + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } +} + +//########################################################################## + +class QRrawcode { + public $version; + public $datacode = []; + public $ecccode = []; + public $blocks; + public $rsblocks = []; //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } +} + +//########################################################################## + +class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //-------------------------------------- Created by hoseinrafiei@gmail.com -------------------------------// + public function getImgResult($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->getEncodedPNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public function getEncodedPNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + + //---------------------------------------------------------------------- + public function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } +} + +//########################################################################## + +class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + +} + +//########################################################################## + +class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + MEC_file::write($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } +} \ No newline at end of file diff --git a/app/libraries/render.php b/app/libraries/render.php new file mode 100755 index 0000000..44aa145 --- /dev/null +++ b/app/libraries/render.php @@ -0,0 +1,1887 @@ + + */ +class MEC_render extends MEC_base +{ + public $db; + public $main; + public $file; + public $settings; + public $post_atts; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Add image size for list and carousel + add_image_size('thumblist', '300', '300', true); + add_image_size('thumbrelated', '500', '500', true); + add_image_size('meccarouselthumb', '474', '324', true); + add_image_size('gridsquare', '391', '260', true); + add_image_size('tileview', '300', '400', true); + + // Import MEC skin class + MEC::import('app.libraries.skins'); + + // MEC main library + $this->main = $this->getMain(); + + // MEC file library + $this->file = $this->getFile(); + + // MEC DB library + $this->db = $this->getDB(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + /** + * Do the shortcode and return its output + * @author Webnus + * @param array $atts + * @return string + */ + public function shortcode($atts) + { + $calendar_id = isset($atts['id']) ? (int) $atts['id'] : 0; + $atts['id'] = $calendar_id; + + global $MEC_Shortcode_id; + $MEC_Shortcode_id = $calendar_id; + $atts = apply_filters('mec_calendar_atts', $this->parse($calendar_id, $atts)); + + $skin = $atts['skin'] ?? $this->get_default_layout(); + return $this->skin($skin, $atts); + } + + /** + * Do the shortcode and return its json output + * @author Webnus + * @param array $atts + * @return string + */ + public function shortcode_json($atts) + { + $calendar_id = $atts['id'] ?? 0; + $atts = apply_filters('mec_calendar_atts', $this->parse($calendar_id, $atts)); + + $skin = $atts['skin'] ?? $this->get_default_layout(); + $json = $this->skin($skin, $atts); + + $path = MEC::import('app.skins.'.$skin, true, true); + $skin_path = apply_filters('mec_skin_path', $skin); + + if($skin_path != $skin and $this->file->exists($skin_path)) $path = $skin_path; + if(!$this->file->exists($path)) + { + return esc_html__('Skin controller does not exist.', 'modern-events-calendar-lite'); + } + + include_once $path; + + $skin_class_name = 'MEC_skin_'.$skin; + + // Create Skin Object Class + $SKO = new $skin_class_name(); + + // Initialize the skin + $SKO->initialize($atts); + + $atts['content_html'] = $SKO->output(); + + if( 'full_calendar' == $skin ) { + + $default_atts = $SKO->prepare_skin_options( $skin, $atts ); + $default_view = $default_atts['default_view'] ?? 'list'; + + $skin_class_name = 'MEC_skin_'.$default_view; + + // Create Skin Object Class + $default_SKO = new $skin_class_name(); + + // Initialize the skin + $default_SKO->initialize($default_atts); + + // Fetch the events + $atts['content_json'] = $default_SKO->fetch(); + }else{ + + // Fetch the events + $atts['content_json'] = $SKO->fetch(); + } + + return $atts; + } + + /** + * Do the widget and return its output + * @author Webnus + * @param int $calendar_id + * @param array $atts + * @return string + */ + public function widget($calendar_id, $atts = array()) + { + $atts = apply_filters('mec_calendar_atts', $this->parse($calendar_id, $atts)); + + $skin = $atts['skin'] ?? $this->get_default_layout(); + return $this->skin($skin, $atts); + } + + /** + * Do the yearly_view skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vyear($atts = array()) + { + $atts = apply_filters('mec_vyear_atts', $atts); + $skin = 'yearly_view'; + + return $this->skin($skin, $atts); + } + + /** + * Do the monthly_view skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vmonth($atts = array()) + { + $atts = apply_filters('mec_vmonth_atts', $atts); + $skin = 'monthly_view'; + + return $this->skin($skin, $atts); + } + + /** + * Do the full_calendar skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vfull($atts = array()) + { + $atts = apply_filters('mec_vfull_atts', $atts); + $skin = 'full_calendar'; + + return $this->skin($skin, $atts); + } + + /** + * Do the default_full_calendar skin and returns its output (archive page) + * @author Webnus + * @param array $atts + * @return string + */ + public function vdefaultfull($atts = array()) + { + $atts = apply_filters('mec_vdefaultfull_atts', $atts); + $skin = 'default_full_calendar'; + + return $this->skin($skin, $atts); + } + + + /** + * Do the weekly_view skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vweek($atts = array()) + { + $atts = apply_filters('mec_vweek_atts', $atts); + $skin = 'weekly_view'; + + return $this->skin($skin, $atts); + } + + /** + * Do the timetable skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vtimetable($atts = array()) + { + $atts = apply_filters('mec_vtimetable_atts', $atts); + $skin = 'timetable'; + + return $this->skin($skin, $atts); + } + + /** + * Do the Masonry skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vmasonry($atts = array()) + { + $atts = apply_filters('mec_vmasonry_atts', $atts); + $skin = 'masonry'; + + return $this->skin($skin, $atts); + } + + /** + * Do the daily_view skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vday($atts = array()) + { + $atts = apply_filters('mec_vday_atts', $atts); + $skin = 'daily_view'; + + return $this->skin($skin, $atts); + } + + /** + * Do the map skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vmap($atts = array()) + { + $atts = apply_filters('mec_vmap_atts', $atts); + $skin = 'map'; + + return $this->skin($skin, $atts); + } + + /** + * Do the list skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vlist($atts = array()) + { + $atts = apply_filters('mec_vlist_atts', $atts); + $skin = 'list'; + + return $this->skin($skin, $atts); + } + + /** + * Do the tile skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vtile($atts = array()) + { + $atts = apply_filters('mec_vtile_atts', $atts); + $skin = 'tile'; + + return $this->skin($skin, $atts); + } + + /** + * Do the custom skin and returns its output + * @author Webnus + * @param array $atts + * @param string $type + * @param boolean $category + * @return string + */ + public function vcustom($atts, $type = 'archive', $category = false) + { + $k = 'custom_'.$type; + + $shortcode = (isset($this->settings[$k]) && !empty($this->settings[$k])) ? stripslashes($this->settings[$k]) : ''; + + // Add Category + if($category and is_tax('mec_category') and get_queried_object_id()) $shortcode = str_replace(']', ' category="'.get_queried_object_id().'"]', $shortcode); + + if(trim($shortcode)) return do_shortcode($shortcode); + return ''; + } + + /** + * Do the grid skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vgrid($atts = array()) + { + $atts = apply_filters('mec_vgrid_atts', $atts); + $skin = 'grid'; + + return $this->skin($skin, $atts); + } + + /** + * Do the agenda skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vagenda($atts = array()) + { + $atts = apply_filters('mec_vagenda_atts', $atts); + $skin = 'agenda'; + + return $this->skin($skin, $atts); + } + + /** + * Do the agenda skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vgeneral_calendar($atts = array()) + { + $atts = array('is_categoy_page' => is_tax( 'mec_category' )); + $atts = apply_filters('mec_vgeneral_calendar_atts', $atts); + $skin = 'general_calendar'; + + return $this->skin($skin, $atts); + } + + public function get_skins() + { + return [ + 'monthly_view', + 'full_calendar', + 'yearly_view', + 'weekly_view', + 'daily_view', + 'timetable', + 'masonry', + 'list', + 'grid', + 'agenda', + 'map', + 'general_calendar', + 'custom' + ]; + } + + /** + * Do the default archive skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vdefault($atts = array()) + { + $skins = $this->get_skins(); + foreach($skins as $skin) + { + $skin_style = (isset($this->settings[$skin . '_archive_skin']) and trim($this->settings[$skin . '_archive_skin']) != '') ? $this->settings[$skin . '_archive_skin'] : null; + if(!empty($skin_style)) + { + $atts['sk-options'][ $skin ]['style'] = $skin_style; + } + } + + $monthly_skin = (isset($this->settings['monthly_view_archive_skin']) and trim($this->settings['monthly_view_archive_skin']) != '') ? $this->settings['monthly_view_archive_skin'] : 'clean'; + $list_skin = (isset($this->settings['list_archive_skin']) and trim($this->settings['list_archive_skin']) != '') ? $this->settings['list_archive_skin'] : 'standard'; + $grid_skin = (isset($this->settings['grid_archive_skin']) and trim($this->settings['grid_archive_skin']) != '') ? $this->settings['grid_archive_skin'] : 'classic'; + $timetable_skin = (isset($this->settings['timetable_archive_skin']) and trim($this->settings['timetable_archive_skin']) != '') ? $this->settings['timetable_archive_skin'] : 'modern'; + + if(!isset($this->settings['default_skin_archive']) or (isset($this->settings['default_skin_archive']) and trim($this->settings['default_skin_archive']) == '')) + { + return $this->vdefaultfull($atts); + } + + if($this->settings['default_skin_archive'] == 'monthly_view') $content = $this->vmonth(array_merge($atts, array('sk-options'=>array('monthly_view'=>array('style'=>$monthly_skin))))); + elseif($this->settings['default_skin_archive'] == 'full_calendar') $content = $this->vdefaultfull($atts); + elseif($this->settings['default_skin_archive'] == 'yearly_view') $content = $this->vyear($atts); + elseif($this->settings['default_skin_archive'] == 'weekly_view') $content = $this->vweek($atts); + elseif($this->settings['default_skin_archive'] == 'daily_view') $content = $this->vday($atts); + elseif($this->settings['default_skin_archive'] == 'timetable') $content = $this->vtimetable(array_merge($atts, array('sk-options'=>array('timetable'=>array('style'=>$timetable_skin))))); + elseif($this->settings['default_skin_archive'] == 'masonry') $content = $this->vmasonry($atts); + elseif($this->settings['default_skin_archive'] == 'list') $content = $this->vlist(array_merge($atts, array('sk-options'=>array('list'=>array('style'=>$list_skin))))); + elseif($this->settings['default_skin_archive'] == 'grid') $content = $this->vgrid(array_merge($atts, array('sk-options'=>array('grid'=>array('style'=>$grid_skin))))); + elseif($this->settings['default_skin_archive'] == 'agenda') $content = $this->vagenda($atts); + elseif($this->settings['default_skin_archive'] == 'map') $content = $this->vmap($atts); + elseif($this->settings['default_skin_archive'] == 'general_calendar') $content = $this->vgeneral_calendar($atts); + elseif($this->settings['default_skin_archive'] == 'custom') $content = $this->vcustom($atts); + else $content = apply_filters('mec_default_skin_content', ''); + + return $content; + } + + /** + * Do the single skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vsingle($atts) + { + // Force to array + if(!is_array($atts)) $atts = []; + + // Get event ID + $event_id = $atts['id'] ?? 0; + + $defaults = array('maximum_dates'=>$this->settings['booking_maximum_dates'] ?? 6); + $atts = apply_filters('mec_vsingle_atts', $this->parse($event_id, wp_parse_args($atts, $defaults))); + + $skin = 'single'; + return $this->skin($skin, $atts); + } + + /** + * Do the category archive skin and returns its output + * @author Webnus + * @param array $atts + * @return string + */ + public function vcategory($atts = array()) + { + // Skin + $skin = (isset($this->settings['default_skin_category']) and trim($this->settings['default_skin_category']) != '') ? $this->settings['default_skin_category'] : 'list'; + + $skins = $this->get_skins(); + foreach($skins as $sk) + { + $skin_style = (isset($this->settings[$sk . '_archive_skin']) and trim($this->settings[$sk . '_archive_skin']) != '') ? $this->settings[$sk . '_archive_skin'] : null; + if(!empty($skin_style)) + { + $atts['sk-options'][ $sk ]['style'] = $skin_style; + } + } + + // Show Only Expired Events + if(isset($this->settings['category_events_method']) and $this->settings['category_events_method'] == 2) $atts['show_only_past_events'] = 1; + + $monthly_skin = (isset($this->settings['monthly_view_category_skin']) and trim($this->settings['monthly_view_category_skin']) != '') ? $this->settings['monthly_view_category_skin'] : 'classic'; + $list_skin = (isset($this->settings['list_category_skin']) and trim($this->settings['list_category_skin']) != '') ? $this->settings['list_category_skin'] : 'standard'; + $grid_skin = (isset($this->settings['grid_category_skin']) and trim($this->settings['grid_category_skin']) != '') ? $this->settings['grid_category_skin'] : 'classic'; + $timetable_skin = (isset($this->settings['timetable_category_skin']) and trim($this->settings['timetable_category_skin']) != '') ? $this->settings['timetable_category_skin'] : 'modern'; + + if($skin == 'full_calendar') $content = $this->vfull($atts); + elseif($skin == 'yearly_view') $content = $this->vyear($atts); + elseif($skin == 'masonry') $content = $this->vmasonry($atts); + elseif($skin == 'timetable') $content = $this->vtimetable(array_merge($atts, array('sk-options'=>array('timetable'=>array('style'=>$timetable_skin))))); + elseif($skin == 'monthly_view') $content = $this->vmonth(array_merge($atts, array('sk-options'=>array('monthly_view'=>array('style'=>$monthly_skin))))); + elseif($skin == 'weekly_view') $content = $this->vweek($atts); + elseif($skin == 'daily_view') $content = $this->vday($atts); + elseif($skin == 'list') $content = $this->vlist(array_merge($atts, array('sk-options'=>array('list'=>array('style'=>$list_skin))))); + elseif($skin == 'grid') $content = $this->vgrid(array_merge($atts, array('sk-options'=>array('grid'=>array('style'=>$grid_skin))))); + elseif($skin == 'agenda') $content = $this->vagenda($atts); + elseif($skin == 'map') $content = $this->vmap($atts); + elseif($skin == 'general_calendar') $content = $this->vgeneral_calendar($atts); + elseif($skin == 'custom') $content = $this->vcustom($atts,'archive_category', true); + else $content = apply_filters('mec_default_skin_content', ''); + + return $content; + } + + /** + * Merge args + * @author Webnus + * @param int $post_id + * @param array $atts + * @return array + */ + public function parse($post_id, $atts = array()) + { + if($this->post_atts) return wp_parse_args($atts, $this->post_atts); + + $post_atts = []; + if($post_id) $post_atts = $this->main->get_post_meta($post_id); + + return wp_parse_args($atts, $post_atts); + } + + /** + * Run the skin and returns its output + * @author Webnus + * @param string $skin + * @param array $atts + * @return string + */ + public function skin($skin, $atts = array()) + { + // Pro is Required for Some Skins + if(!$this->main->getPRO() and in_array($skin, array('agenda', 'yearly_view', 'timetable', 'masonry', 'map', 'available_spot'))) + { + return ''; + } + + $path = MEC::import('app.skins.'.$skin, true, true); + $skin_path = apply_filters('mec_skin_path', $skin); + + if($skin_path != $skin and $this->file->exists($skin_path)) $path = $skin_path; + if(!$this->file->exists($path)) + { + return esc_html__('Skin controller does not exist.', 'modern-events-calendar-lite'); + } + + include_once $path; + + $skin_class_name = 'MEC_skin_'.$skin; + + // Create Skin Object Class + $SKO = new $skin_class_name(); + + // Initialize the skin + $SKO->initialize($atts); + + // Search Events If Not Found In Current Month + $c = 0; + $break = false; + + do + { + if($c > 12 || $skin !== 'monthly_view') $break = true; + + if($c && !$break) + { + if(intval($SKO->month) == 12) + { + $SKO->year = intval($SKO->year)+1; + $SKO->month = '01'; + } + else $SKO->month = sprintf("%02d", intval($SKO->month)+1); + + $SKO->start_date = date('Y-m-d', strtotime($SKO->year.'-'.$SKO->month.'-01')); + + $day = current_time('d'); + $SKO->active_day = $SKO->year.'-'.$SKO->month.'-'.$day; + } + + // Fetch the events + $events = $SKO->fetch(); + + if($break) break; + + // Auto Rotation is Disabled + if(!isset($atts['auto_month_rotation']) || !$atts['auto_month_rotation']) break; + + $c++; + } + while(!count($events)); + + // Return the output + return $SKO->output(); + } + + /** + * Returns default skin + * @author Webnus + * @return string + */ + public function get_default_layout() + { + return apply_filters('mec_default_layout', 'list'); + } + + /** + * Renders and returns all event data + * @param int $post_id + * @param string $content + * @return \stdClass + * @throws Exception + * @author Webnus + */ + public function data($post_id, $content = NULL) + { + $cached = wp_cache_get($post_id, 'mec-events-data'); + if($cached) return $cached; + + $data = new stdClass(); + + // Post Data + $data->ID = $post_id; + $data->title = get_the_title($post_id); + $data->content = is_null($content) ? $this->main->get_post_content($post_id) : $content; + + // All Post Data + $post = get_post($post_id); + $data->post = $post; + + // All Meta Data + $meta = $this->main->get_post_meta($post_id, true); + if(isset($meta['mec_notifications'])) unset($meta['mec_notifications']); + if(isset($meta['mec_fees']) and is_array($meta['mec_fees']) and isset($meta['mec_fees'][':i:'])) unset($meta['mec_fees'][':i:']); + + $data->meta = $meta; + + // All MEC Data + $data->mec = $this->main->get_mec_events_data($post_id); + + $allday = $data->meta['mec_allday'] ?? 0; + $hide_time = $data->meta['mec_hide_time'] ?? 0; + $hide_end_time = $this->main->hide_end_time_status($post_id); + + $start_timestamp = ((isset($meta['mec_start_day_seconds']) and isset($meta['mec_start_date'])) ? (strtotime($meta['mec_start_date'])+$meta['mec_start_day_seconds']) : (isset($meta['mec_start_date']) ? strtotime($meta['mec_start_date']) : 0)); + $end_timestamp = ((isset($meta['mec_end_day_seconds']) and isset($meta['mec_end_date'])) ? (strtotime($meta['mec_end_date'])+$meta['mec_end_day_seconds']) : (isset($meta['mec_end_date']) ? strtotime($meta['mec_end_date']) : 0)); + + $start_time = $this->main->get_time($start_timestamp); + $end_time = $this->main->get_time($end_timestamp); + + if($hide_time) + { + $data->time = array( + 'start'=>'', + 'end'=>'', + 'start_raw'=>$start_time, + 'end_raw'=>$end_time, + 'start_timestamp'=>$start_timestamp, + 'end_timestamp'=>$end_timestamp, + ); + } + elseif($allday) + { + $data->time = array( + 'start'=>$this->main->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')), + 'end'=>'', + 'start_raw'=>$start_time, + 'end_raw'=>$end_time, + 'start_timestamp'=>$start_timestamp, + 'end_timestamp'=>$end_timestamp, + ); + } + else + { + $data->time = array( + 'start'=>$start_time, + 'end'=>($hide_end_time ? '' : $end_time), + 'start_raw'=>$start_time, + 'end_raw'=>$end_time, + 'start_timestamp'=>$start_timestamp, + 'end_timestamp'=>$end_timestamp, + ); + } + + // Hourly Schedules + $meta_hourly_schedules = $meta['mec_hourly_schedules'] ?? []; + $first_key = key($meta_hourly_schedules); + + $hourly_schedules = []; + if(count($meta_hourly_schedules) and !isset($meta_hourly_schedules[$first_key]['schedules'])) + { + $hourly_schedules[] = array( + 'title' => esc_html__('Day 1', 'modern-events-calendar-lite'), + 'schedules'=>$meta_hourly_schedules + ); + } + else $hourly_schedules = $meta_hourly_schedules; + + $data->hourly_schedules = $hourly_schedules; + + $tickets = (isset($meta['mec_tickets']) and is_array($meta['mec_tickets'])) ? $meta['mec_tickets'] : []; + if(isset($tickets[':i:'])) unset($tickets[':i:']); + + $new_tickets = []; + foreach($tickets as $ticket_id => $ticket) + { + if(!is_numeric($ticket_id)) continue; + + $ticket['id'] = $ticket_id; + $new_tickets[$ticket_id] = $ticket; + } + + $data->tickets = $new_tickets; + $data->color = $meta['mec_color'] ?? ''; + $data->permalink = ((isset($meta['mec_read_more']) and filter_var($meta['mec_read_more'], FILTER_VALIDATE_URL)) ? $meta['mec_read_more'] : get_post_permalink($post_id)); + + // Thumbnails + $thumbnail = get_the_post_thumbnail($post, 'thumbnail', array('data-mec-postid'=>$post_id)); + $thumblist = get_the_post_thumbnail($post, 'thumblist' , array('data-mec-postid'=>$post_id)); + $gridsquare = get_the_post_thumbnail($post, 'gridsquare' , array('data-mec-postid'=>$post_id)); + $meccarouselthumb = get_the_post_thumbnail($post, 'meccarouselthumb' , array('data-mec-postid'=>$post_id)); + $medium = get_the_post_thumbnail($post, 'medium', array('data-mec-postid'=>$post_id)); + $large = get_the_post_thumbnail($post, 'large', array('data-mec-postid'=>$post_id)); + $full = get_the_post_thumbnail($post, 'full', array('data-mec-postid'=>$post_id)); + $tileview = get_the_post_thumbnail($post, 'tileview', array('data-mec-postid'=>$post_id)); + + if(trim($thumbnail) == '' and trim($medium) != '') $thumbnail = preg_replace("/height=\"[0-9]*\"/", 'height="150"', preg_replace("/width=\"[0-9]*\"/", 'width="150"', $medium)); + elseif(trim($thumbnail) == '' and trim($large) != '') $thumbnail = preg_replace("/height=\"[0-9]*\"/", 'height="150"', preg_replace("/width=\"[0-9]*\"/", 'width="150"', $large)); + + $dataThumbnails = apply_filters('mec-render-data-thumbnails', [ + 'thumbnail'=>$thumbnail, + 'thumblist'=>$thumblist, + 'gridsquare'=>$gridsquare, + 'meccarouselthumb'=>$meccarouselthumb, + 'medium'=>$medium, + 'large'=>$large, + 'full'=>$full, + 'tileview'=>$tileview + ], $post_id); + + $data->thumbnails = $dataThumbnails; + + // Featured image URLs + $dataFeaturedImage = apply_filters('mec-render-data-featured-image', array( + 'thumbnail'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'thumbnail')), + 'thumblist'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'thumblist' )), + 'gridsquare'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'gridsquare' )), + 'meccarouselthumb'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'meccarouselthumb')), + 'medium'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'medium')), + 'large'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'large')), + 'full'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'full')), + 'tileview'=>esc_url($this->main->get_post_thumbnail_url($post_id, 'tileview')) + ), $post_id); + + $data->featured_image = $dataFeaturedImage; + + $taxonomies = array('mec_label', 'mec_location', 'mec_category', apply_filters('mec_taxonomy_tag', '')); + + if(!isset($this->settings['organizers_status']) || $this->settings['organizers_status']) $taxonomies[] = 'mec_organizer'; + if($this->getPRO() and isset($this->settings['sponsors_status']) and $this->settings['sponsors_status']) $taxonomies[] = 'mec_sponsor'; + + $terms = wp_get_post_terms($post_id, $taxonomies, array('fields'=>'all')); + foreach($terms as $term) + { + // First Validation + if(!isset($term->taxonomy)) continue; + + if($term->taxonomy == 'mec_label') $data->labels[$term->term_id] = array('id'=>$term->term_id, 'name'=>$term->name, 'color'=>get_metadata('term', $term->term_id, 'color', true), 'style'=>get_metadata('term', $term->term_id, 'style', true)); + elseif($term->taxonomy == 'mec_organizer') $data->organizers[$term->term_id] = array('id'=>$term->term_id, 'name'=>$term->name, 'tel'=>get_metadata('term', $term->term_id, 'tel', true), 'email'=>get_metadata('term', $term->term_id, 'email', true), 'url'=>get_metadata('term', $term->term_id, 'url', true), 'page_label'=>get_metadata('term', $term->term_id, 'page_label', true), 'thumbnail'=>get_metadata('term', $term->term_id, 'thumbnail', true)); + elseif($term->taxonomy == 'mec_location') + { + $locations = array('id'=>$term->term_id, 'name'=>$term->name, 'address'=>get_metadata('term', $term->term_id, 'address', true), 'opening_hour'=>get_metadata('term', $term->term_id, 'opening_hour', true), 'latitude'=>get_metadata('term', $term->term_id, 'latitude', true), 'longitude'=>get_metadata('term', $term->term_id, 'longitude', true), 'url'=>get_metadata('term', $term->term_id, 'url', true), 'tel'=>get_metadata('term', $term->term_id, 'tel', true), 'thumbnail'=>get_metadata('term', $term->term_id, 'thumbnail', true)); + $data->locations[$term->term_id] = apply_filters('mec_map_load_location_terms', $locations, $term); + } + elseif($term->taxonomy == 'mec_category') + { + $data->categories[$term->term_id] = array( + 'id'=>$term->term_id, + 'name'=>$term->name, + 'icon'=>get_metadata('term', $term->term_id, 'mec_cat_icon', true), + 'color'=>get_metadata('term', $term->term_id, 'mec_cat_color', true), + ); + } + elseif($term->taxonomy == apply_filters('mec_taxonomy_tag', '')) $data->tags[$term->term_id] = array('id'=>$term->term_id, 'name'=>$term->name); + elseif($term->taxonomy == 'mec_sponsor') + { + $data->sponsors[$term->term_id] = array( + 'id'=>$term->term_id, + 'name'=>$term->name, + 'link'=>get_metadata('term', $term->term_id, 'link', true), + 'logo'=>get_metadata('term', $term->term_id, 'logo', true) + ); + } + } + + // Speakers + if(isset($this->settings['speakers_status']) and $this->settings['speakers_status']) + { + $terms = wp_get_post_terms($post_id, 'mec_speaker', [ + 'fields' => 'all', + 'orderby' => 'meta_value_num', + 'meta_key' => 'mec_index' + ]); + + foreach($terms as $term) + { + $speaker_type = get_metadata('term', $term->term_id, 'type', true); + + $data->speakers[$term->term_id] = array( + 'id'=>$term->term_id, + 'name'=>$term->name, + 'type'=>$speaker_type ?: 'person', + 'job_title'=>get_metadata('term', $term->term_id, 'job_title', true), + 'tel'=>get_metadata('term', $term->term_id, 'tel', true), + 'email'=>get_metadata('term', $term->term_id, 'email', true), + 'facebook'=>get_metadata('term', $term->term_id, 'facebook', true), + 'twitter'=>get_metadata('term', $term->term_id, 'twitter', true), + 'gplus'=>get_metadata('term', $term->term_id, 'gplus', true), + 'thumbnail'=>get_metadata('term', $term->term_id, 'thumbnail', true) + ); + } + } + + // Event Fields + $fields = $this->main->get_event_fields(); + if(!is_array($fields)) $fields = []; + + $fields_data = (isset($data->meta['mec_fields']) and is_array($data->meta['mec_fields'])) ? $data->meta['mec_fields'] : get_post_meta($post_id, 'mec_fields', true); + if(!is_array($fields_data)) $fields_data = []; + + foreach($fields as $f => $field) + { + if(!is_numeric($f)) continue; + if(!isset($field['label'])) continue; + + $field_value = isset($fields_data[$f]) ? (is_array($fields_data[$f]) ? implode(', ', $fields_data[$f]) : $fields_data[$f]) : ''; + $data->fields[] = array( + 'id' => $f, + 'type' => ($field['type'] ?? NULL), + 'label' => esc_html__(stripslashes($field['label']), 'modern-events-calendar-lite'), + 'value' => stripslashes($field_value), + ); + } + + // Timezone Object + $data->TZO = $this->main->get_TZO($post_id); + + // Add mec event past index to array. + $end_date = (isset($data->meta['mec_date']['end']) and isset($data->meta['mec_date']['end']['date'])) ? $data->meta['mec_date']['end']['date'] : current_time('Y-m-d H:i:s'); + + $e_time = ''; + $e_time .= sprintf("%02d", ($data->meta['mec_date']['end']['hour'] ?? '6')).':'; + $e_time .= sprintf("%02d", ($data->meta['mec_date']['end']['minutes'] ?? '0')); + $e_time .= isset($data->meta['mec_date']['end']['ampm']) ? trim($data->meta['mec_date']['end']['ampm']) : 'PM'; + + $end_time = date('D M j Y G:i:s', strtotime($end_date.' '.$e_time)); + + $d1 = new DateTime(current_time("D M j Y G:i:s")); + $d2 = new DateTime($end_time); + + if($d2 < $d1) $data->meta['event_past'] = true; + else $data->meta['event_past'] = false; + + // Apply Filters + $data = apply_filters('mec_render_event_data', $data, $post_id); + + // Set to cache + wp_cache_set($post_id, $data, 'mec-events-data', 43200); + + //Edited Occurrences + $settings = $this->main->get_settings(); + $edit_per_occurrences=[]; + + if(isset($settings['per_occurrences_status']) and $settings['per_occurrences_status']) + { + $occ = new MEC_feature_occurrences(); + $occurrences = $occ->get_all_occurrences($post_id); + + foreach ($occurrences as $occurrence) + { + $date_start=date('Y-m-d', $occurrence['occurrence']); + $params=json_decode($occurrence['params'], true); + $params['location'] = (isset($params['location_id']) ? $this->main->get_location_data($params['location_id']) : array()); + $params['organizer'] = (isset($params['organizer_id']) ? $this->main->get_organizer_data($params['organizer_id']) : array()); + $edit_per_occurrences[$date_start]=$params; + } + } + + $data->edited_occurrences=$edit_per_occurrences; + + return $data; + } + + /** + * @param $event + * @param MEC_skins $skin + * @param int $serie + * @return mixed + */ + public function after_render($event, $skin, $serie = 1) + { + // If event is custom days and current date is available + if(isset($event->data) and isset($event->data->meta) and isset($event->data->meta['mec_repeat_type']) and $event->data->meta['mec_repeat_type'] === 'custom_days' and isset($event->data->mec) and isset($event->data->mec->days) and isset($event->date) and is_array($event->date) and isset($event->date['start']) and isset($event->date['start']['date'])) + { + // Time is already available + if(isset($event->date['start']['hour'])) + { + $hide_time = $event->data->meta['mec_hide_time'] ?? 0; + $hide_end_time = $this->main->hide_end_time_status($event->ID); + + $s_hour = $event->date['start']['hour']; + if(strtoupper($event->date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $e_hour = $event->date['end']['hour']; + if(strtoupper($event->date['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $start_time = $event->date['start']['date'].' '.sprintf("%02d", $s_hour).':'.sprintf("%02d", $event->date['start']['minutes']).' '.$event->date['start']['ampm']; + $end_time = $event->date['end']['date'].' '.sprintf("%02d", $e_hour).':'.sprintf("%02d", $event->date['end']['minutes']).' '.$event->date['end']['ampm']; + + $start_timestamp = strtotime($start_time); + $end_timestamp = strtotime($end_time); + + $st = $this->main->get_time($start_timestamp); + $et = $this->main->get_time($end_timestamp); + + $allday = $event->data->meta['mec_allday'] ?? 0; + if($allday) + { + $st = $this->main->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')); + $et = ''; + } + + $event->data->time = array( + 'start'=>($hide_time ? '' : $st), + 'end'=>(($hide_time or $hide_end_time) ? '' : $et), + 'start_raw'=>$st, + 'end_raw'=>$et, + 'start_timestamp'=>$start_timestamp, + 'end_timestamp'=>$end_timestamp, + ); + } + // Detect the time when not available + else + { + $multiple_day_show_method = \MEC\Settings\Settings::getInstance()->get_settings('multiple_day_show_method'); + $days_str = $event->data->mec->days; + + if(trim($days_str)) + { + $original_start_date = $event->data->meta['mec_start_date']; + $p_start_date = $event->date['start']['date']; + $allday = $event->data->meta['mec_allday'] ?? 0; + + // Do not change the hour if it is the first serie of the event + if(!($original_start_date == $p_start_date and $serie == 1)) + { + if($original_start_date == $p_start_date ) $serie -= 1; + $periods = explode(',', $days_str); + + $datetime_timestamp = strtotime($p_start_date); + + $p = 0; + foreach($periods as $period) + { + $ex = explode(':', $period); + $s_date = $ex[0] ?? false; + $e_date = $ex[1] ?? false; + + if(!$s_date || ($p_start_date!== $s_date && 'all_days' !== $multiple_day_show_method)) continue; + + $sd_timestamp = strtotime($s_date); + if($e_date) + { + $ed_timestamp = strtotime($e_date); + if(!($datetime_timestamp >= $sd_timestamp && $datetime_timestamp <= $ed_timestamp && isset($ex[2]) && isset($ex[3]))) continue; + } + + $p++; + if($p !== $serie) continue; + + $pos = strpos($ex[2], '-'); + if($pos !== false) $ex[2] = substr_replace($ex[2], ':', $pos, 1); + + $pos = strpos($ex[3], '-'); + if($pos !== false) $ex[3] = substr_replace($ex[3], ':', $pos, 1); + + $start_time = $s_date . ' ' . str_replace('-', ' ', $ex[2]); + $end_time = $e_date . ' ' . str_replace('-', ' ', $ex[3]); + + $this->add_time_to_event($event, $start_time, $end_time, $allday); + } + } + + // Do not show expired occurrences + if(!$skin->args['mec-past-events']) + { + $periods = explode(',', $days_str); + $current_time = current_time('timestamp'); + + if($event->data->time['start_timestamp'] < $current_time) + { + foreach($periods as $period) + { + $ex = explode(':', $period); + $s_date = $ex[0] ?? ''; + $e_date = $ex[1] ?? ''; + + if(!$s_date or !$e_date) continue; + + $s_time = $ex[2] ?? ''; + $e_time = $ex[3] ?? ''; + + $pos = strpos($s_time, '-'); + if($pos !== false) $s_time = substr_replace($s_time, ':', $pos, 1); + + $pos = strpos($e_time, '-'); + if($pos !== false) $e_time = substr_replace($e_time, ':', $pos, 1); + + $start_time = trim($s_date . ' ' . str_replace('-', ' ', $s_time)); + $end_time = trim($e_date . ' ' . str_replace('-', ' ', $e_time)); + + if(strtotime($start_time) < $current_time) continue; + + $this->add_time_to_event($event, $start_time, $end_time, $allday); + } + } + } + } + } + } + // If not custom days + elseif(isset($event->data) and isset($event->data->time) and isset($event->data->time['start_raw']) and isset($event->data->time['end_raw']) and isset($event->date) and isset($event->date['start']) and isset($event->date['end'])) + { + $start_time = $event->date['start']['date'].' '.$event->data->time['start_raw']; + $end_time = $event->date['end']['date'].' '.$event->data->time['end_raw']; + + $start_timestamp = strtotime($start_time); + $end_timestamp = strtotime($end_time); + + if((!$start_timestamp or !$end_timestamp) and isset($event->data->meta['mec_date']) and isset($event->data->meta['mec_date']['start']) and isset($event->data->meta['mec_date']['start']['hour']) and isset($event->data->meta['mec_date']['end']) and isset($event->data->meta['mec_date']['end']['hour'])) + { + $start_time = $event->date['start']['date'].' '.sprintf("%02d", $event->data->meta['mec_date']['start']['hour']).':'.sprintf("%02d", $event->data->meta['mec_date']['start']['minutes']).' '.$event->data->meta['mec_date']['start']['ampm']; + $end_time = $event->date['end']['date'].' '.sprintf("%02d", $event->data->meta['mec_date']['end']['hour']).':'.sprintf("%02d", $event->data->meta['mec_date']['end']['minutes']).' '.$event->data->meta['mec_date']['end']['ampm']; + + $start_timestamp = strtotime($start_time); + $end_timestamp = strtotime($end_time); + } + + if($start_timestamp and $end_timestamp) + { + $event->data->time['start_timestamp'] = $start_timestamp; + $event->data->time['end_timestamp'] = $end_timestamp; + } + } + + // Fill Start and End Dates + if(!isset($event->date['start']['hour']) or !isset($event->date['end']['hour'])) + { + $s_hour = $s_minutes = $s_ampm = $e_hour = $e_minutes = $e_ampm = NULL; + + if(isset($event->data->meta['mec_date']) and isset($event->data->meta['mec_date']['start']) and is_array($event->data->meta['mec_date']['start'])) + { + $s_hour = sprintf("%02d", $event->data->meta['mec_date']['start']['hour']); + $s_minutes = sprintf("%02d", $event->data->meta['mec_date']['start']['minutes']); + $s_ampm = strtolower($event->data->meta['mec_date']['start']['ampm']); + } + + if(isset($event->data->meta['mec_date']) and isset($event->data->meta['mec_date']['end']) and is_array($event->data->meta['mec_date']['end'])) + { + $e_hour = sprintf("%02d", $event->data->meta['mec_date']['end']['hour']); + $e_minutes = sprintf("%02d", $event->data->meta['mec_date']['end']['minutes']); + $e_ampm = strtolower($event->data->meta['mec_date']['end']['ampm']); + } + + if(isset($event->data->time) and isset($event->data->time['start_timestamp']) and $event->data->time['start_timestamp']) + { + $s_hour = date('h', $event->data->time['start_timestamp']); + $s_minutes = date('i', $event->data->time['start_timestamp']); + $s_ampm = date('a', $event->data->time['start_timestamp']); + } + + if(isset($event->data->time) and isset($event->data->time['end_timestamp']) and $event->data->time['end_timestamp']) + { + $e_hour = date('h', $event->data->time['end_timestamp']); + $e_minutes = date('i', $event->data->time['end_timestamp']); + $e_ampm = date('a', $event->data->time['end_timestamp']); + } + + $start_time = $event->date['start']['date'].' '.sprintf("%02d", $s_hour).':'.sprintf("%02d", $s_minutes).' '.$s_ampm; + $end_time = $event->date['end']['date'].' '.sprintf("%02d", $e_hour).':'.sprintf("%02d", $e_minutes).' '.$e_ampm; + + if($s_hour and $s_minutes and $s_ampm and strtotime($start_time)) + { + $d = ((isset($event->date['start']) and is_array($event->date['start'])) ? $event->date['start'] : array()); + $event->date['start'] = array_merge($d, array( + 'hour' => sprintf("%02d", $s_hour), + 'minutes' => sprintf("%02d", $s_minutes), + 'ampm' => $s_ampm, + 'timestamp' => strtotime($start_time), + )); + } + + if($e_hour and $e_minutes and $e_ampm and strtotime($end_time)) + { + $d = ((isset($event->date['end']) and is_array($event->date['end'])) ? $event->date['end'] : array()); + $event->date['end'] = array_merge($d, array( + 'hour' => sprintf("%02d", $e_hour), + 'minutes' => sprintf("%02d", $e_minutes), + 'ampm' => $e_ampm, + 'timestamp' => strtotime($end_time), + )); + } + } + + if($skin->skin != 'single' and !($skin->multiple_days_method == 'first_day' or ($skin->multiple_days_method == 'first_day_listgrid' and in_array($skin->skin, array('list', 'grid', 'slider', 'carousel', 'agenda', 'tile'))))) + { + // MEC Cache + $cache = $this->getCache(); + + // Cache Key + $key = $event->data->ID.'-'.$event->date['end']['date']; + + // Is Midnight Event + $midnight = $this->main->is_midnight_event($event); + + // Improve Time for Multiple Day Events + if($cache->has($key) or ($event->date['start']['date'] !== $event->date['end']['date'] and !$midnight)) + { + $allday = $event->data->meta['mec_allday'] ?? 0; + $hide_time = $event->data->meta['mec_hide_time'] ?? 0; + $hide_end_time = $this->main->hide_end_time_status($event->ID); + + // Get From Cache (Last Day) + if($cache->has($key) and $event->date['start']['date'] === $event->date['end']['date']) + { + list($new_start_time, $new_end_time) = $cache->get($key); + + // Delete the Cache + $cache->delete($key); + } + // Get From Cache (Between Days) + elseif($cache->has($key) and $event->date['start']['date'] !== $event->date['end']['date']) + { + $new_start_time = $this->main->get_time(0); + $new_end_time = $this->main->get_time((24*3600)); + + $allday = 1; + } + // First Day + else + { + $new_start_time = $event->data->time['start_raw']; + $new_end_time = $skin->skin === 'general_calendar' ? $event->data->time['end_raw'] : $this->main->get_time((24*3600)); + $second_start_time = $this->main->get_time(0); + $second_end_time = $event->data->time['end_raw']; + + // Set to Cache + $cache->set($key, array($second_start_time, $second_end_time)); + } + + // Flag to Multiple Day + $event->data->multipleday = 1; + + $event->data->time['start_raw'] = $new_start_time; + $event->data->time['end_raw'] = $new_end_time; + + if($hide_time) + { + $event->data->time['start'] = ''; + $event->data->time['end'] = ''; + } + elseif($allday) + { + $event->data->time['start'] = $this->main->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')); + $event->data->time['end'] = ''; + } + else + { + $event->data->time['start'] = $new_start_time; + $event->data->time['end'] = ($hide_end_time ? '' : $new_end_time); + } + } + } + + return $event; + } + + public function add_time_to_event(&$event, $start_datetime, $end_datetime, $allday = false) + { + $hide_time = $event->data->meta['mec_hide_time'] ?? 0; + $hide_end_time = $this->main->hide_end_time_status($event->ID); + + $start_timestamp = strtotime($start_datetime); + $end_timestamp = strtotime($end_datetime); + + $st = $this->main->get_time($start_timestamp); + $et = $this->main->get_time($end_timestamp); + + if($allday) + { + $st = $this->main->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')); + $et = ''; + } + + $event->data->time = [ + 'start'=>($hide_time ? '' : $st), + 'end'=>(($hide_time or $hide_end_time) ? '' : $et), + 'start_raw'=>$st, + 'end_raw'=>$et, + 'start_timestamp'=>$start_timestamp, + 'end_timestamp'=>$end_timestamp, + ]; + } + + /** + * Renders and Returns event dats + * @author Webnus + * @param int $event_id + * @param object $event + * @param int $maximum + * @param string $today + * @return array + */ + public function dates($event_id, $event = NULL, $maximum = 6, $today = '') + { + if(!$today) $today = date('Y-m-d'); + + // Original Start Date + $original_start_date = $today; + $dates = []; + + // Get event data if it is NULL + if(is_null($event)) + { + $event = new stdClass(); + $event->meta = $this->main->get_post_meta($event_id, true); + $event->mec = $this->db->select("SELECT * FROM `#__mec_events` WHERE `post_id`='$event_id'", "loadObject"); + } + + $start_date = $event->meta['mec_date']['start'] ?? []; + $end_date = $event->meta['mec_date']['end'] ?? []; + $first_occurrence = $event->meta['mec_start_date'] ?? $today; + + // Return empty array if date is not valid + if(!isset($start_date['date']) or !strtotime($start_date['date'])) return $dates; + + // Return empty array if mec data is not exists on mec_events table + if(!isset($event->mec->end)) return $dates; + + $allday = $event->meta['mec_allday'] ?? 0; + $hide_time = $event->meta['mec_hide_time'] ?? 0; + + $event_period = $this->main->date_diff($start_date['date'], $end_date['date']); + $event_period_days = $event_period ? $event_period->days : 0; + + $finish_date = array('date'=>$event->mec->end, 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']); + + $exceptional_days = (isset($event->mec->not_in_days) and trim($event->mec->not_in_days)) ? explode(',', trim($event->mec->not_in_days, ', ')) : []; + $exceptional_days = $this->main->add_global_exceptional_days($exceptional_days); + + // Event Passed + $past = $this->main->is_past($finish_date['date'], $today); + + // Event is not passed for custom days + if($past and isset($event->meta['mec_repeat_type']) and $event->meta['mec_repeat_type'] == 'custom_days') $past = 0; + + // Normal event + if(isset($event->mec->repeat) and $event->mec->repeat == '0') + { + $dates[] = $this->add_timestamps(array( + 'start'=>$start_date, + 'end'=>$end_date, + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>$past + )); + } + elseif($past) + { + $dates[] = $this->add_timestamps(array( + 'start'=>$start_date, + 'end'=>$end_date, + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>$past + )); + } + else + { + $repeat_type = $event->meta['mec_repeat_type']; + + if(in_array($repeat_type, array('daily', 'weekly'))) + { + $repeat_interval = $event->meta['mec_repeat_interval']; + + $date_interval = $this->main->date_diff($start_date['date'], date('Y-m-d', strtotime($today))); + $passed_days = $date_interval ? $date_interval->days : 0; + + // Check if date interval is negative (It means the event didn't start yet) + if($date_interval and $date_interval->invert == 1) $remained_days_to_next_repeat = $passed_days; + else $remained_days_to_next_repeat = $repeat_interval - fmod($passed_days, $repeat_interval); + + $start_date = date('Y-m-d', strtotime('+'.$remained_days_to_next_repeat.' Days', strtotime($today))); + + if( + !$this->main->is_date_after($finish_date['date'], $start_date) && + $this->main->is_date_after($first_occurrence, $start_date, true) && + !in_array($start_date, $exceptional_days) + ) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$start_date, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>date('Y-m-d', strtotime('+'.$event_period_days.' Days', strtotime($start_date))), 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + for($i = 2; $i <= $maximum; $i++) + { + $start_date = date('Y-m-d', strtotime('+'.$repeat_interval.' Days', strtotime($start_date))); + + // Event Not Started + if(!$this->main->is_date_after($first_occurrence, $start_date, true)) continue; + + // Event finished + if($this->main->is_past($finish_date['date'], $start_date)) break; + + if(!in_array($start_date, $exceptional_days)) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$start_date, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>date('Y-m-d', strtotime('+'.$event_period_days.' Days', strtotime($start_date))), 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + } + } + elseif(in_array($repeat_type, array('weekday', 'weekend', 'certain_weekdays'))) + { + $date_interval = $this->main->date_diff($start_date['date'], $today); + $passed_days = $date_interval ? $date_interval->days : 0; + + // Check if date interval is negative (It means the event didn't start yet) + if($date_interval and $date_interval->invert == 1) $today = date('Y-m-d', strtotime('+'.$passed_days.' Days', strtotime($original_start_date))); + + $event_days = explode(',', trim($event->mec->weekdays, ', ')); + + $today_id = date('N', strtotime($today)); + $found = 0; + $i = 0; + + while($found < $maximum) + { + if($this->main->is_past($finish_date['date'], $today)) break; + + if(!in_array($today_id, $event_days)) + { + $today = date('Y-m-d', strtotime('+1 Days', strtotime($today))); + $today_id = date('N', strtotime($today)); + + $i++; + continue; + } + + $start_date = $today; + if(!in_array($start_date, $exceptional_days)) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$start_date, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>date('Y-m-d', strtotime('+'.$event_period_days.' Days', strtotime($start_date))), 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + $today = date('Y-m-d', strtotime('+1 Days', strtotime($today))); + $today_id = date('N', strtotime($today)); + + $found++; + $i++; + } + } + elseif($repeat_type == 'monthly') + { + $repeat_interval = ((isset($event->meta) and isset($event->meta['mec_repeat_interval'])) ? max(1, $event->meta['mec_repeat_interval']) : 1); + + // Start from Event Start Date + if(strtotime($start_date['date']) > strtotime($original_start_date)) $original_start_date = $start_date['date']; + + $event_days = explode(',', trim($event->mec->day, ', ')); + $event_start_day = $event_days[0]; + + $diff = $this->main->date_diff($start_date['date'], $end_date['date']); + $event_period_days = $diff->days; + + $found = 0; + $i = 0; + + while($found < $maximum) + { + $t = strtotime('+'.$i.' Months', strtotime($original_start_date)); + if(!$t) break; + + $today = date('Y-m-d', $t); + if($this->main->is_past($finish_date['date'], $today)) break; + + $year = date('Y', strtotime($today)); + $month = date('m', strtotime($today)); + $day = $event_start_day; + $hour = isset($event->meta['mec_date']['end']['hour']) ? sprintf('%02d', $event->meta['mec_date']['end']['hour']) : '06'; + $minutes = isset($event->meta['mec_date']['end']['minutes']) ? sprintf('%02d', $event->meta['mec_date']['end']['minutes']) : '00'; + $ampm = isset($event->meta['mec_date']['end']['ampm']) ? strtoupper($event->meta['mec_date']['end']['ampm']) : 'PM'; + + // Fix for 31st, 30th, 29th of some months + while(!checkdate((int) $month, (int) $day, (int) $year)) $day--; + + $start_date = $year.'-'.$month.'-'.$day; + $end_time = $hour.':'.$minutes.' '.$ampm; + + // Wrong Date & Time + if(!strtotime($start_date.' '.$end_time)) break; + + if(strtotime($start_date.' '.$end_time) < strtotime($original_start_date)) + { + $i += $repeat_interval; + continue; + } + + if(!in_array($start_date, $exceptional_days)) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$start_date, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>date('Y-m-d', strtotime('+'.$event_period_days.' Days', strtotime($start_date))), 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + $found++; + $i += $repeat_interval; + } + } + elseif($repeat_type == 'yearly') + { + // Start from Event Start Date + if(strtotime($start_date['date']) > strtotime($original_start_date)) $original_start_date = $start_date['date']; + + $event_days = explode(',', trim($event->mec->day, ', ')); + $event_months = explode(',', trim($event->mec->month, ', ')); + + $event_start_day = $event_days[0]; + $event_period_days = $this->main->date_diff($start_date['date'], $end_date['date'])->days; + + $event_start_year = date('Y', strtotime($original_start_date)); + $event_start_month = date('n', strtotime($original_start_date)); + + $found = 0; + $i = 0; + + while($found < $maximum) + { + $today = date('Y-m-d', strtotime($event_start_year.'-'.$event_start_month.'-'.$event_start_day)); + if($this->main->is_past($finish_date['date'], $today)) break; + + $year = date('Y', strtotime($today)); + $month = date('m', strtotime($today)); + + if(!in_array($month, $event_months)) + { + if($event_start_month == '12') + { + $event_start_month = 1; + $event_start_year += 1; + } + else $event_start_month += 1; + + $i++; + continue; + } + + $day = $event_start_day; + + // Fix for 31st, 30th, 29th of some months + while(!checkdate($month, $day, $year)) $day--; + + $event_date = $year.'-'.$month.'-'.$day; + if(strtotime($event_date) >= strtotime($original_start_date)) + { + $start_date = $event_date; + if(!in_array($start_date, $exceptional_days)) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$start_date, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>date('Y-m-d', strtotime('+'.$event_period_days.' Days', strtotime($start_date))), 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + $found++; + } + + if($event_start_month == '12') + { + $event_start_month = 1; + $event_start_year += 1; + } + else $event_start_month += 1; + + $i++; + } + } + elseif($repeat_type == 'custom_days') + { + $custom_days = explode(',', $event->mec->days); + + // Add current time if we're checking today's events + if($today == current_time('Y-m-d')) $today .= ' '.current_time('H:i:s'); + + $found = 0; + if((strtotime($event->mec->start) + $event->meta['mec_start_day_seconds']) >= strtotime($today) and !in_array($event->mec->start, $exceptional_days)) + { + $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$event->mec->start, 'hour'=>$event->meta['mec_date']['start']['hour'], 'minutes'=>$event->meta['mec_date']['start']['minutes'], 'ampm'=>$event->meta['mec_date']['start']['ampm']), + 'end'=>array('date'=>$event->mec->end, 'hour'=>$event->meta['mec_date']['end']['hour'], 'minutes'=>$event->meta['mec_date']['end']['minutes'], 'ampm'=>$event->meta['mec_date']['end']['ampm']), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + $found++; + } + + foreach($custom_days as $custom_day) + { + // Found maximum dates + if($found >= $maximum) break; + + $cday = explode(':', $custom_day); + + $c_start = $cday[0]; + if(isset($cday[2])) $c_start .= ' '.str_replace('-', ' ', substr_replace($cday[2], ':', strpos($cday[2], '-'), 1)); + + // Date is past + if(strtotime($c_start) < strtotime($today)) continue; + + $cday_start_hour = $event->meta['mec_date']['start']['hour']; + $cday_start_minutes = $event->meta['mec_date']['start']['minutes']; + $cday_start_ampm = $event->meta['mec_date']['start']['ampm']; + + $cday_end_hour = $event->meta['mec_date']['end']['hour']; + $cday_end_minutes = $event->meta['mec_date']['end']['minutes']; + $cday_end_ampm = $event->meta['mec_date']['end']['ampm']; + + if(isset($cday[2]) and isset($cday[3])) + { + $cday_start_ex = explode('-', $cday[2]); + $cday_start_hour = $cday_start_ex[0]; + $cday_start_minutes = $cday_start_ex[1]; + $cday_start_ampm = $cday_start_ex[2]; + + $cday_end_ex = explode('-', $cday[3]); + $cday_end_hour = $cday_end_ex[0]; + $cday_end_minutes = $cday_end_ex[1]; + $cday_end_ampm = $cday_end_ex[2]; + } + + if(!in_array($cday[0], $exceptional_days)) $dates[] = $this->add_timestamps(array( + 'start'=>array('date'=>$cday[0], 'hour'=>$cday_start_hour, 'minutes'=>$cday_start_minutes, 'ampm'=>$cday_start_ampm), + 'end'=>array('date'=>$cday[1], 'hour'=>$cday_end_hour, 'minutes'=>$cday_end_minutes, 'ampm'=>$cday_end_ampm), + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>0 + )); + + $found++; + } + + // No future date found so the event is passed + if(!count($dates)) + { + $dates[] = $this->add_timestamps(array( + 'start'=>$start_date, + 'end'=>$finish_date, + 'allday'=>$allday, + 'hide_time'=>$hide_time, + 'past'=>$past + )); + } + } + elseif($repeat_type == 'advanced') + { + // Start from Event Start Date + if(strtotime($start_date['date']) > strtotime($today)) $today = $start_date['date']; + + // Get user specifed days of month for repeat + $advanced_days = get_post_meta($event_id, 'mec_advanced_days', true); + + // Generate dates for event + $event_info = array('start' => $start_date, 'end' => $end_date, 'allday' => $allday, 'hide_time' => $hide_time, 'finish_date' => $finish_date['date'], 'exceptional_days' => $exceptional_days, 'mec_repeat_end' => ((isset($event->meta['mec_repeat']) and isset($event->meta['mec_repeat']['end'])) ? $event->meta['mec_repeat']['end'] : ''), 'occurrences' => ((isset($event->meta['mec_repeat']) and isset($event->meta['mec_repeat']['end_at_occurrences'])) ? $event->meta['mec_repeat']['end_at_occurrences'] : '')); + + $dates = $this->generate_advanced_days($advanced_days, $event_info, $maximum, $today); + } + } + + return $dates; + } + + /** + * Render advanced dates + * @author Webnus + * @param array $advanced_days + * @param array $event_info + * @param int $maximum + * @param string $referer_date + * @param string $mode + * @return array + */ + public function generate_advanced_days($advanced_days = array(), $event_info = array(), $maximum = 6, $referer_date = NULL, $mode = 'render') + { + if(!count($advanced_days)) return []; + if(!trim($referer_date)) $referer_date = date('Y-m-d', current_time('timestamp', 0)); + + $levels = array('first', 'second', 'third', 'fourth', 'last'); + $year = date('Y', strtotime($event_info['start']['date'])); + $dates = []; + + // Set last month for include current month results + $month = date('m', strtotime('first day of last month', strtotime($event_info['start']['date']))); + + if($month == '12') $year = $year - 1; + + $maximum = intval($maximum); + $i = 0; + + // Event info + $exceptional_days = array_key_exists('exceptional_days', $event_info) ? $event_info['exceptional_days'] : []; + $start_date = $event_info['start']; + $end_date = $event_info['end']; + $allday = array_key_exists('allday', $event_info) ? $event_info['allday'] : 0; + $hide_time = array_key_exists('hide_time', $event_info) ? $event_info['hide_time'] : 0; + $finish_date = array_key_exists('finish_date', $event_info) ? $event_info['finish_date'] : '0000-00-00'; + $event_period = $this->main->date_diff($start_date['date'], $end_date['date']); + $event_period_days = $event_period ? $event_period->days : 0; + $mec_repeat_end = array_key_exists('mec_repeat_end', $event_info) ? $event_info['mec_repeat_end'] : ''; + $occurrences = array_key_exists('occurrences', $event_info) ? $event_info['occurrences'] : 0; + + // Include default start date to results + if(!$this->main->is_past($start_date['date'], $referer_date) and !in_array($start_date['date'], $exceptional_days)) + { + $dates[] = $this->add_timestamps(array( + 'start' => $start_date, + 'end' => $end_date, + 'allday' => $allday, + 'hide_time' => $hide_time, + 'past' => 0, + )); + + if($mode == 'render') $i++; + } + + while($i < $maximum) + { + $start = NULL; + + foreach($advanced_days as $day) + { + if($i >= $maximum) break; + + // Explode $day value for example (Sun.1) to Sun and 1 + $d = explode('.', $day); + + // Set indexes for {$levels} index if number day is Last(Sun.l) then indexes set 4th {$levels} index + $index = intval($d[1]) ? (intval($d[1]) - 1) : 4; + + // Generate date + $date = date('Y-m-t', strtotime("{$year}-{$month}-01")); + + // Generate start date for example "first Sun of next month" + $start = date('Y-m-d', strtotime("{$levels[$index]} {$d[0]} of next month", strtotime($date))); + $end = date('Y-m-d', strtotime("+{$event_period_days} Days", strtotime($start))); + + // Occurence equals to the main start date + if($start === $start_date['date']) continue; + + // When ends repeat date set + if($mode == 'render' and $this->main->is_past($finish_date, $start)) continue; + + // Jump to next level if start date is past + if($this->main->is_past($start, $referer_date) or in_array($start, $exceptional_days)) continue; + + // Add dates + $dates[] = $this->add_timestamps(array( + 'start' => array( + 'date' => $start, + 'hour' => $start_date['hour'], + 'minutes' => $start_date['minutes'], + 'ampm' => $start_date['ampm'], + ), + 'end' => array( + 'date' => $end, + 'hour' => $end_date['hour'], + 'minutes' => $end_date['minutes'], + 'ampm' => $end_date['ampm'], + ), + 'allday' => $allday, + 'hide_time' => $hide_time, + 'past' => 0, + )); + + $i++; + } + + // When ends repeat date set + if($mode == 'render' and $this->main->is_past($finish_date, $start)) break; + + // Change month and years for next resualts + if(intval($month) == 12) + { + $year = intval($year) + 1; + $month = '00'; + } + + $month = sprintf("%02d", intval($month) + 1); + } + + if(($mode == 'render') and (trim($mec_repeat_end) == 'occurrences') and (count($dates) > $occurrences)) + { + $max = strtotime(reset($dates)['start']['date']); + $pos = 0; + + for($i = 1; $i < count($dates); $i++) + { + if(strtotime($dates[$i]['start']['date']) > $max) + { + $max = strtotime($dates[$i]['start']['date']); + $pos = $i; + } + } + + unset($dates[$pos]); + } + + // Remove Duplicates + $uniques = []; + $timestamps = []; + + foreach($dates as $key => $date) + { + $start_timestamp = $date['start']['timestamp']; + $end_timestamp = $date['end']['timestamp']; + $timestamp_key = $start_timestamp.'-'.$end_timestamp; + + if(isset($timestamps[$timestamp_key])) continue; + + $timestamps[$timestamp_key] = true; + $uniques[] = $date; + } + + // Sort + usort($uniques, array($this, 'sort_dates')); + + return $uniques; + } + + public function sort_dates($a, $b) + { + $a_timestamp = $a['start']['timestamp']; + $b_timestamp = $b['end']['timestamp']; + + if($a_timestamp == $b_timestamp) return 0; + return ($a_timestamp > $b_timestamp) ? +1 : -1; + } + + /** + * Render markers + * @author Webnus + * @param array $events + * @param string $skin_style + * @return array + */ + public function markers($events, $skin_style = 'classic') + { + $date_format = (isset($this->settings['google_maps_date_format1']) and trim($this->settings['google_maps_date_format1'])) ? $this->settings['google_maps_date_format1'] : 'M d Y'; + + $requested_location_id = isset($_REQUEST['sf'], $_REQUEST['sf']['location']) ? $_REQUEST['sf']['location'] : null; + + $markers = []; + foreach($events as $event) + { + if(!is_object($event)) continue; + if(!isset($event->data->locations) or (isset($event->data->locations) and !is_array($event->data->locations))) continue; + + $locations = []; + + $main_location_id = get_post_meta($event->ID, 'mec_location_id', true); + if(isset($event->date, $event->date['start'], $event->date['start']['timestamp'])) $main_location_id = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'location_id', $main_location_id); + + $main_location_id = apply_filters('wpml_object_id', $main_location_id, 'mec_location', true); + + if($main_location_id && $main_location_id > 1) $locations[] = $main_location_id; + + $additional_location_ids = get_post_meta($event->ID, 'mec_additional_location_ids', true); + if(!is_array($additional_location_ids)) $additional_location_ids = []; + + $locations = array_merge($locations, $additional_location_ids); + $locations = array_unique($locations); + + if($requested_location_id && !is_array($requested_location_id)) + { + if($main_location_id !== $requested_location_id && !in_array($requested_location_id, $additional_location_ids)) continue; + $locations = [$requested_location_id]; + } + + // No Locations + if(!count($locations)) continue; + + foreach($locations as $location_id) + { + $location_id = (int) $location_id; + + $latitude = get_term_meta($location_id, 'latitude', true); + $longitude = get_term_meta($location_id, 'longitude', true); + + // No latitude/Longitude + if(trim($latitude) == '' or trim($longitude) == '') continue; + + $location = get_term($location_id); + $name = $location->name ?? ''; + + $latitude = floatval($latitude); + $longitude = floatval($longitude); + + $key = $latitude.','.$longitude; + if(!isset($markers[$key])) + { + $markers[$key] = array( + 'latitude'=>$latitude, + 'longitude'=>$longitude, + 'name'=>$name, + 'address'=>get_term_meta($location_id, 'address', true), + 'event_ids'=>array($event->data->ID), + 'lightbox'=>$this->main->get_marker_lightbox($event, $date_format, $skin_style), + ); + } + else + { + $markers[$key]['event_ids'][] = $event->data->ID; + $markers[$key]['lightbox'] .= $this->main->get_marker_lightbox($event, $date_format, $skin_style); + } + } + } + + $points = []; + foreach($markers as $key=>$marker) + { + $points[$key] = $marker; + + $points[$key]['lightbox'] = '
    '.(trim($marker['address']) ? esc_html($marker['address']) : esc_html($marker['name'])).'
    '.MEC_kses::element($marker['lightbox']).'
    '; + $points[$key]['count'] = count($marker['event_ids']); + $points[$key]['infowindow'] = $this->main->get_marker_infowindow($marker); + } + + return apply_filters('mec_render_markers', $points); + } + + public function add_timestamps($date) + { + $start = (isset($date['start']) and is_array($date['start'])) ? $date['start'] : []; + $end = (isset($date['end']) and is_array($date['end'])) ? $date['end'] : []; + + if(!count($start) or !count($end)) return $date; + + $s_hour = $start['hour']; + if(strtoupper($start['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $e_hour = $end['hour']; + if(strtoupper($end['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $allday = ($date['allday'] ?? 0); + + // All Day Event + if($allday) + { + $s_hour = 12; + $start['minutes'] = 1; + $start['ampm'] = 'AM'; + + $e_hour = 11; + $end['minutes'] = 59; + $end['ampm'] = 'PM'; + } + + $start_time = $start['date'].' '.sprintf("%02d", $s_hour).':'.sprintf("%02d", $start['minutes']).' '.$start['ampm']; + $end_time = $end['date'].' '.sprintf("%02d", $e_hour).':'.sprintf("%02d", $end['minutes']).' '.$end['ampm']; + + $start['timestamp'] = strtotime($start_time); + $end['timestamp'] = strtotime($end_time); + + $hide_time = $date['hide_time'] ?? 0; + $past = $date['past'] ?? 0; + + return array( + 'start' => $start, + 'end' => $end, + 'allday' => $allday, + 'hide_time' => $hide_time, + 'past' => $past, + ); + } +} diff --git a/app/libraries/restful.php b/app/libraries/restful.php new file mode 100755 index 0000000..7e698c9 --- /dev/null +++ b/app/libraries/restful.php @@ -0,0 +1,117 @@ + + */ +class MEC_restful extends MEC_base +{ + /** + * @var MEC_main + */ + private $main; + + /** + * @var MEC_db + */ + private $db; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Main + $this->main = $this->getMain(); + + // Database + $this->db = $this->getDB(); + } + + public function get_endpoint_url() + { + return get_rest_url(null, $this->get_namespace()); + } + + public function get_namespace() + { + return 'mec/v1.0'; + } + + public function get_api_version() + { + return '1'; + } + + public function permission(WP_REST_Request $request) + { + // Validate API Token + if(!$this->is_api_token_valid($request, $request->get_header('mec-token'))) return new WP_Error('invalid_api_token', esc_html__('Invalid API Token!', 'modern-events-calendar-lite')); + + // Validate User Token + if(!$this->is_user_token_valid($request, $request->get_header('mec-user'))) return new WP_Error('invalid_user_token', esc_html__('Invalid User Token!', 'modern-events-calendar-lite')); + + return true; + } + + public function guest(WP_REST_Request $request) + { + // Validate API Token + if(!$this->is_api_token_valid($request, $request->get_header('mec-token'))) return new WP_Error('invalid_api_token', esc_html__('Invalid API Token!', 'modern-events-calendar-lite')); + + // Set Current User if Token Provided + $this->is_user_token_valid($request, $request->get_header('mec-user')); + + return true; + } + + public function response(array $response): WP_REST_Response + { + $data = $response['data'] ?? []; + $status = $response['status'] ?? 200; + + $wp = new WP_REST_Response($data); + $wp->set_status($status); + + return $wp; + } + + public function is_api_token_valid(WP_REST_Request $request, $token = null) + { + // Check Token + if(trim($token)) + { + $settings = $this->main->get_settings(); + + $tokens = []; + foreach($settings['api_keys'] as $k => $t) + { + if(!is_numeric($k)) continue; + $tokens[] = $t['key']; + } + + if(in_array($token, $tokens)) return true; + } + + return false; + } + + public function is_user_token_valid(WP_REST_Request $request, $token = null) + { + // Check User + if(trim($token)) + { + $user_id = $this->db->select("SELECT `user_id` FROM `#__usermeta` WHERE `meta_key`='mec_token' AND `meta_value`='".esc_sql($token)."'", 'loadResult'); + if(!$user_id) return false; + + // Set Current User + wp_set_current_user($user_id); + return true; + } + + return false; + } +} diff --git a/app/libraries/schedule.php b/app/libraries/schedule.php new file mode 100755 index 0000000..f86a89d --- /dev/null +++ b/app/libraries/schedule.php @@ -0,0 +1,162 @@ + + */ +class MEC_schedule extends MEC_base +{ + private $db; + private $main; + private $render; + + public function __construct() + { + $this->db = $this->getDB(); + $this->main = $this->getMain(); + $this->render = $this->getRender(); + } + + public function cron() + { + // Get All Events + $events = $this->main->get_events(); + + // Append Schedule for Events + foreach($events as $event) + { + $maximum = 50; + $repeat_type = get_post_meta($event->ID, 'mec_repeat_type', true); + + // Reschedule Schedule for Normal and Custom Days Events + if($repeat_type === '' or $repeat_type === 'custom_days') $this->reschedule($event->ID, 200); + else $this->append($event->ID, $maximum); + } + } + + public function reschedule($event_id, $maximum = 200) + { + // Clean Current Schedule + $this->clean($event_id); + + // Event Start Date + $start = get_post_meta($event_id, 'mec_start_date', true); + + if(trim($start) == '' or $start == '0000-00-00') $start = date('Y-m-d', strtotime('-1 Year')); + else $start = date('Y-m-d', strtotime('-1 Day', strtotime($start))); + + // New Schedule + $this->schedule($event_id, $start, $maximum); + } + + public function append($event_id, $maximum = 25) + { + // Get Start Date + $start = $this->time($event_id, 'max', 'Y-m-d'); + + // Don't create dates more than next 7 years! + if(strtotime($start) > strtotime('+7 years', current_time('timestamp', 0))) return; + + // Append Schedule + $this->schedule($event_id, $start, $maximum); + } + + public function schedule($event_id, $start, $maximum = 100) + { + // Get event dates + $dates = $this->render->dates($event_id, NULL, $maximum, $start); + + // No new date found! + if(!is_array($dates) || !count($dates)) return false; + + // All Day Event + $allday = get_post_meta($event_id, 'mec_allday', true); + + // Public Event + $public = get_post_meta($event_id, 'mec_public', true); + if(trim($public) === '') $public = 1; + + // Create Public Column If Not Exists + if(!$this->db->columns('mec_dates', 'public')) $this->db->q("ALTER TABLE `#__mec_dates` ADD `public` INT(4) UNSIGNED NOT NULL DEFAULT 1 AFTER `tend`;"); + + foreach($dates as $date) + { + $sd = $date['start']['date']; + $ed = $date['end']['date']; + + $start_hour = isset($date['start']['hour']) ? sprintf("%02d", $date['start']['hour']) : '08'; + $start_minute = isset($date['start']['minutes']) ? sprintf("%02d", $date['start']['minutes']) : '00'; + $start_ampm = $date['start']['ampm'] ?? 'AM'; + + if($start_hour == '00') + { + $start_hour = ''; + $start_minute = ''; + $start_ampm = ''; + } + + $start_time = $start_hour.':'.$start_minute.' '.$start_ampm; + + $end_hour = isset($date['end']['hour']) ? sprintf("%02d", $date['end']['hour']) : '06'; + $end_minute = isset($date['end']['minutes']) ? sprintf("%02d", $date['end']['minutes']) : '00'; + $end_ampm = $date['end']['ampm'] ?? 'PM'; + + if($end_hour == '00') + { + $end_hour = ''; + $end_minute = ''; + $end_ampm = ''; + } + + $end_time = $end_hour.':'.$end_minute.' '.$end_ampm; + + // All Day Event + if($allday) + { + $start_time = '12:01 AM'; + $end_time = '11:59 PM'; + } + + $st = strtotime(trim($date['start']['date'].' '.$start_time, ' :')); + $et = strtotime(trim($date['end']['date'].' '.$end_time, ' :')); + + $date_id = $this->db->select("SELECT `id` FROM `#__mec_dates` WHERE `post_id`='$event_id' AND `tstart`='$st' AND `tend`='$et'", 'loadResult'); + + // Add new Date + if(!$date_id) $this->db->q("INSERT INTO `#__mec_dates` (`post_id`,`dstart`,`dend`,`tstart`,`tend`,`public`) VALUES ('$event_id','$sd','$ed','$st','$et','$public');"); + // Update Existing Record + else $this->db->q("UPDATE `#__mec_dates` SET `tstart`='$st', `tend`='$et', `public`='$public' WHERE `id`='$date_id';"); + } + + return true; + } + + public function clean($event_id) + { + // Remove All Scheduled Dates + return $this->db->q("DELETE FROM `#__mec_dates` WHERE `post_id`='$event_id'"); + } + + public function time($event_id, $type = 'max', $format = 'Y-m-d') + { + $time = $this->db->select("SELECT ".(strtolower($type) == 'min' ? 'MIN' : 'MAX')."(`tstart`) FROM `#__mec_dates` WHERE `post_id`='$event_id'", 'loadResult'); + if(!$time) $time = time(); + + return date($format, $time); + } + + public function get_reschedule_maximum($repeat_type) + { + if($repeat_type == 'daily') return 370; + elseif($repeat_type == 'weekday') return 270; + elseif($repeat_type == 'advanced') return 250; + elseif($repeat_type == 'weekend') return 200; + elseif($repeat_type == 'certain_weekdays') return 200; + elseif($repeat_type == 'weekly') return 100; + elseif($repeat_type == 'monthly') return 50; + elseif($repeat_type == 'yearly') return 50; + else return 50; + } +} \ No newline at end of file diff --git a/app/libraries/search.php b/app/libraries/search.php new file mode 100755 index 0000000..11f6cb3 --- /dev/null +++ b/app/libraries/search.php @@ -0,0 +1,502 @@ + + */ +class MEC_search extends MEC_base +{ + private $main; + private $settings; + + public function __construct() + { + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + public function refine() + { + // Variables + $sf = isset($_POST['sf']) ? $this->main->sanitize_deep_array($_POST['sf']) : []; + $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : ''; + $start_date = isset($_POST['mec_start_date']) ? sanitize_text_field($_POST['mec_start_date']) : current_time('Y-m-d'); + $current_field = isset($_POST['last_field']) ? sanitize_text_field($_POST['last_field']) : ''; + $category_type = isset($_POST['category_type']) ? sanitize_text_field($_POST['category_type']) : 'dropdown'; + $location_type = isset($_POST['location_type']) ? sanitize_text_field($_POST['location_type']) : 'dropdown'; + $organizer_type = isset($_POST['organizer_type']) ? sanitize_text_field($_POST['organizer_type']) : 'dropdown'; + $speaker_type = isset($_POST['speaker_type']) ? sanitize_text_field($_POST['speaker_type']) : 'dropdown'; + $label_type = isset($_POST['label_type']) ? sanitize_text_field($_POST['label_type']) : 'dropdown'; + $event_ids = []; + + // Import + self::import('app.libraries.walker'); + if(!function_exists('wp_terms_checklist')) include ABSPATH.'wp-admin/includes/template.php'; + + // Taxonomy Query + $tax_query = array( + 'relation'=>'AND' + ); + + // Add event label to filter + if(isset($sf['label']) and trim($sf['label'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_label', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['label']), ', ')) + ); + } + + // Add event category to filter + if(isset($sf['category']) and trim($sf['category'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_category', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['category']), ', ')) + ); + } + + // Add event location to filter + if(isset($sf['location']) and trim($sf['location'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_location', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['location']), ', ')) + ); + } + + // Add event address to filter + if(isset($sf['address']) and trim($sf['address'], ', ') != '') + { + $get_locations_id = $this->get_locations_id(sanitize_text_field($sf['address'])); + $tax_query[] = array( + 'taxonomy'=>'mec_location', + 'field'=>'term_id', + 'terms'=>$get_locations_id, + ); + } + + // Add event organizer to filter + if(isset($sf['organizer']) and trim($sf['organizer'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_organizer', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['organizer']), ', ')) + ); + } + + // Add event speaker to filter + if(isset($sf['speaker']) and trim($sf['speaker'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_speaker', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['speaker']), ', ')) + ); + } + + // Event type + if(isset($sf['event_type']) and trim($sf['event_type'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_event_type', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['event_type']), ', ')) + ); + } + + // Event Type 2 + if(isset($sf['event_type_2']) and trim($sf['event_type_2'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_event_type_2', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['event_type_2']), ', ')) + ); + } + + // Add event tags to filter + if(apply_filters('mec_taxonomy_tag', '') !== 'post_tag' and isset($sf['tag']) and trim($sf['tag'], ', ') != '') + { + if(is_numeric($sf['tag'])) + { + $tax_query[] = array( + 'taxonomy'=>'mec_tag', + 'field'=>'term_id', + 'terms'=>explode(',', trim(sanitize_text_field($sf['tag']), ', ')) + ); + } + else + { + $tax_query[] = array( + 'taxonomy'=>'mec_tag', + 'field'=>'name', + 'terms'=>explode(',', trim(sanitize_text_field($sf['tag']), ', ')) + ); + } + } + + $tax_query = apply_filters('mec_map_tax_query', $tax_query, $sf); + + // Meta Query + $meta_query = array( + 'relation' => 'AND', + ); + + // Event Min Cost + if(isset($sf['cost-min']) and trim($sf['cost-min']) != '') + { + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => sanitize_text_field($sf['cost-min']), + 'type' => 'numeric', + 'compare' => '>=', + ); + } + + // Event Max Cost + if(isset($sf['cost-max']) and trim($sf['cost-max']) != '') + { + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => sanitize_text_field($sf['cost-max']), + 'type' => 'numeric', + 'compare' => '<=', + ); + } + + $meta_query = apply_filters('mec_map_meta_query', $meta_query, $sf); + + // Search Arguments + $args = array( + 'post_type' => $this->main->get_main_post_type(), + 'post_status' => 'publish', + 'posts_per_page' => '-1', + 's' => ((isset($sf['s']) and trim($sf['s'])) ? sanitize_text_field($sf['s']) : NULL), + 'tax_query' => $tax_query, + 'meta_query' => $meta_query, + ); + + // Query + $query = new WP_Query($args); + + // The Loop + if($query->have_posts()) + { + while($query->have_posts()) + { + $query->the_post(); + $event_ids[] = get_the_ID(); + } + } + + // Restore Original Post Data + wp_reset_postdata(); + + $categories = []; + $locations = []; + $organizers = []; + $speakers = []; + $tags = []; + $labels = []; + + $upcoming_ids = $this->main->get_upcoming_event_ids(strtotime($start_date)); + foreach($event_ids as $event_id) + { + // Expired Event + if(!in_array($event_id, $upcoming_ids)) continue; + + $e_categories = wp_get_post_terms($event_id, 'mec_category'); + if(!is_array($e_categories)) $e_categories = []; + + foreach($e_categories as $e_category) $categories[] = $e_category->term_id; + + $e_locations = wp_get_post_terms($event_id, 'mec_location'); + if(!is_array($e_locations)) $e_locations = []; + + foreach($e_locations as $e_location) $locations[] = $e_location->term_id; + + $e_organizers = wp_get_post_terms($event_id, 'mec_organizer'); + if(!is_array($e_organizers)) $e_organizers = []; + + foreach($e_organizers as $e_organizer) $organizers[] = $e_organizer->term_id; + + if((isset($this->settings['speakers_status']) and $this->settings['speakers_status'])) + { + $e_speakers = wp_get_post_terms($event_id, 'mec_speaker'); + if(!is_array($e_speakers)) $e_speakers = []; + + foreach($e_speakers as $e_speaker) $speakers[] = $e_speaker->term_id; + } + + $e_labels = wp_get_post_terms($event_id, 'mec_label'); + if(!is_array($e_labels)) $e_labels = []; + + foreach($e_labels as $e_label) $labels[] = $e_label->term_id; + + $e_tags = wp_get_post_terms($event_id, apply_filters('mec_taxonomy_tag', '')); + if(!is_array($e_tags)) $e_tags = []; + + foreach($e_tags as $e_tag) $tags[] = $e_tag->term_id; + } + + $categories = array_unique($categories); + $locations = array_unique($locations); + $organizers = array_unique($organizers); + $speakers = array_unique($speakers); + $tags = array_unique($tags); + $labels = array_unique($labels); + + $categories_html = ''; + $locations_html = ''; + $organizers_html = ''; + $speakers_html = ''; + $tags_html = ''; + $labels_html = ''; + + // Categories + if($category_type == 'dropdown') + { + $label = $this->main->m('taxonomy_category', esc_html__('Category', 'modern-events-calendar-lite')); + + $categories_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>'mec_category', + 'name'=>' ', + 'include'=>($current_field === 'category' ? '' : array_unique($categories)), + 'id'=>'mec_sf_category_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>(isset($sf['category']) ? sanitize_text_field($sf['category']) : ''), + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($categories) ? -1 : 0), + )); + } + elseif($category_type == 'checkboxes' and wp_count_terms(array('taxonomy' => 'mec_category'))) + { + $selected = (isset($sf['category']) and trim($sf['category'], ', ')) ? explode(',', trim(sanitize_text_field($sf['category']), ', ')) : []; + $categories_html .= wp_terms_checklist(0, array + ( + 'echo'=>false, + 'taxonomy'=>'mec_category', + 'selected_cats'=>$selected, + 'checked_ontop'=>false, + 'walker'=>(new MEC_walker(array( + 'include'=>($current_field === 'category' ? '' : array_unique($categories)), + 'id' => $id, + ))), + 'descendants_and_self'=>(!count($categories) ? -1 : 0), + )); + } + elseif($category_type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_category'))) + { + $selected = (isset($sf['category']) and trim($sf['category'], ', ')) ? explode(',', trim(sanitize_text_field($sf['category']), ', ')) : []; + foreach($categories as $category_id) + { + $term = get_term($category_id); + $categories_html .= '
  • + +
  • '; + } + } + + // Locations + $label = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); + + if($location_type == 'dropdown') + { + $locations_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>'mec_location', + 'name'=>' ', + 'include'=>($current_field === 'location' ? '' : array_unique($locations)), + 'id'=>'mec_sf_location_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>$sf['location'] ?? '', + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($locations) ? -1 : 0), + )); + } + elseif($location_type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_location'))) + { + $selected = (isset($sf['location']) and trim($sf['location'], ', ')) ? explode(',', trim(sanitize_text_field($sf['location']), ', ')) : []; + foreach($locations as $location_id) + { + $term = get_term($location_id); + $locations_html .= '
  • + +
  • '; + } + } + + // Organizers + $label = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + + if($organizer_type == 'dropdown') + { + $organizers_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>'mec_organizer', + 'name'=>' ', + 'include'=>($current_field === 'organizer' ? '' : array_unique($organizers)), + 'id'=>'mec_sf_organizer_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>(isset($sf['organizer']) ? sanitize_text_field($sf['organizer']) : ''), + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($organizers) ? -1 : 0), + )); + } + elseif($organizer_type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_organizer'))) + { + $selected = (isset($sf['organizer']) and trim($sf['organizer'], ', ')) ? explode(',', trim(sanitize_text_field($sf['organizer']), ', ')) : []; + foreach($organizers as $organizer_id) + { + $term = get_term($organizer_id); + $organizers_html .= '
  • + +
  • '; + } + } + + // Speakers + $label = $this->main->m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite')); + + if($speaker_type == 'dropdown') + { + $speakers_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>'mec_speaker', + 'name'=>' ', + 'include'=>($current_field === 'speaker' ? '' : array_unique($speakers)), + 'id'=>'mec_sf_speaker_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>(isset($sf['speaker']) ? sanitize_text_field($sf['speaker']) : ''), + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($speakers) ? -1 : 0), + )); + } + elseif($speaker_type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_speaker'))) + { + $selected = (isset($sf['speaker']) and trim($sf['speaker'], ', ')) ? explode(',', trim(sanitize_text_field($sf['speaker']), ', ')) : []; + foreach($speakers as $speaker_id) + { + $term = get_term($speaker_id); + $speakers_html .= '
  • + +
  • '; + } + } + + // Tags + $label = $this->main->m('taxonomy_tag', esc_html__('Tag', 'modern-events-calendar-lite')); + + $tags_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>apply_filters('mec_taxonomy_tag', ''), + 'name'=>' ', + 'include'=>($current_field === 'tag' ? '' : array_unique($tags)), + 'id'=>'mec_sf_tag_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>(isset($sf['tag']) ? sanitize_text_field($sf['tag']) : ''), + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($tags) ? -1 : 0), + )); + + // Labels + $label = $this->main->m('taxonomy_label', esc_html__('Label', 'modern-events-calendar-lite')); + + if($label_type == 'dropdown') + { + $labels_html .= wp_dropdown_categories(array + ( + 'echo'=>false, + 'taxonomy'=>'mec_label', + 'name'=>' ', + 'include'=>($current_field === 'label' ? '' : array_unique($labels)), + 'id'=>'mec_sf_label_'.$id, + 'hierarchical'=>true, + 'show_option_none'=>$label, + 'option_none_value'=>'', + 'selected'=>(isset($sf['label']) ? sanitize_text_field($sf['label']) : ''), + 'orderby'=>'name', + 'order'=>'ASC', + 'show_count'=>0, + 'child_of'=>(!count($labels) ? -1 : 0), + )); + } + elseif($label_type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_label'))) + { + $selected = (isset($sf['label']) and trim($sf['label'], ', ')) ? explode(',', trim(sanitize_text_field($sf['label']), ', ')) : []; + foreach($labels as $label_id) + { + $term = get_term($label_id); + $labels_html .= '
  • + +
  • '; + } + } + + $output = array( + 'success' => 1, + 'categories' => (isset($sf['category']) and trim($sf['category'], ', ')) ? '' : $categories_html, + 'locations' => $current_field === 'location' ? '' : $locations_html, + 'organizers' => $current_field === 'organizer' ? '' : $organizers_html, + 'speakers' => $current_field === 'speaker' ? '' : $speakers_html, + 'tags' => $current_field === 'tag' ? '' : $tags_html, + 'labels' => $current_field === 'label' ? '' : $labels_html, + ); + + echo json_encode($output); + exit; + } + + public function get_locations_id($address = '') + { + if(!trim($address)) return []; + + $address = str_replace(' ', ',', $address); + $locations = explode(',', $address); + $query = "SELECT `term_id` FROM `#__termmeta` WHERE `meta_key` = 'address'"; + + foreach($locations as $location) if(trim($location)) $query .= " AND `meta_value` LIKE '%" . trim($location) . "%'"; + + $db = $this->getDB(); + $locations_id = $db->select($query, 'loadAssocList'); + return array_map(function($value) + { + return intval($value['term_id']); + }, $locations_id); + } +} \ No newline at end of file diff --git a/app/libraries/skins.php b/app/libraries/skins.php new file mode 100755 index 0000000..309e30a --- /dev/null +++ b/app/libraries/skins.php @@ -0,0 +1,2553 @@ + + */ +class MEC_skins extends MEC_base +{ + /** + * Default skin + * @var string + */ + public $skin = 'list'; + + /** + * @var array + */ + public $atts = []; + + /** + * @var array + */ + public $args = []; + + /** + * @var int + */ + public $maximum_dates = 6; + + /** + * Offset for don't load duplicated events in list/grid views on load more action + * @var int + */ + public $offset = 0; + + /** + * Offset for next load more action + * @var int + */ + public $next_offset = 0; + + /** + * Display Booking Method + * @var int + */ + public $booking_button = 0; + + /** + * Single Event Display Method + * @var string + */ + public $sed_method = '0'; + + /** + * Order Method + * @var string + */ + public $order_method = 'ASC'; + + public $factory; + public $main; + public $db; + public $file; + public $render; + public $found; + public $multiple_days_method; + public $hide_time_method; + public $skin_options; + public $style; + public $show_only_expired_events; + public $maximum_date_range = ''; + public $limit; + public $paged; + public $start_date; + public $end_date; + public $show_ongoing_events; + public $include_ongoing_events; + public $maximum_date = ''; + public $html_class; + public $sf; + public $sf_status; + public $sf_display_label; + public $sf_reset_button; + public $sf_refine; + public $sf_options; + public $id; + public $events; + public $widget; + public $count; + public $settings; + public $ml_settings; + public $layout; + public $year; + public $month; + public $day; + public $next_previous_button; + public $active_date; + public $today; + public $weeks; + public $week; + public $week_of_days; + public $events_str; + public $active_day; + public $load_more_button; + public $pagination = 'loadmore'; + public $month_divider; + public $toggle_month_divider; + public $image_popup; + public $map_on_top; + public $geolocation; + public $geolocation_focus; + public $include_events_times; + public $localtime; + public $reason_for_cancellation; + public $display_label; + public $display_price; + public $display_detailed_time; + public $display_progress_bar = false; + public $cache; + public $from_full_calendar = false; + public $unique_event_ids = []; + + /** + * Has More Events + * @var bool + */ + public $has_more_events = true; + + /** + * Auto Month Rotation + * @var bool + */ + public $auto_month_rotation = true; + + /** + * @var MEC_icons + */ + public $icons; + + public $loading_more = false; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC factory library + $this->factory = $this->getFactory(); + + // MEC main library + $this->main = $this->getMain(); + + // MEC file library + $this->file = $this->getFile(); + + // MEC db library + $this->db = $this->getDB(); + + // MEC render library + $this->render = $this->getRender(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + + // Found Events + $this->found = 0; + + // How to show multiple days events + $this->multiple_days_method = $this->main->get_multiple_days_method(); + + // Hide event on start or on end + $this->hide_time_method = $this->main->get_hide_time_method(); + + // Cache + $this->cache = $this->getCache(); + + // Icons + $this->icons = $this->main->icons(); + } + + /** + * Registers skin actions into WordPress hooks + * @author Webnus + */ + public function actions() + { + } + + /** + * Loads all skins + * @author Webnus + */ + public function load() + { + $skins = $this->main->get_skins(); + foreach($skins as $skin=>$skin_name) + { + $path = MEC::import('app.skins.'.$skin, true, true); + $skin_path = apply_filters('mec_skin_path', $skin); + + if($skin_path != $skin and $this->file->exists($skin_path)) $path = $skin_path; + if(!$this->file->exists($path)) continue; + + include_once $path; + + $skin_class_name = 'MEC_skin_'.$skin; + + // Create Skin Object Class + $SKO = new $skin_class_name(); + + // init the actions + $SKO->actions(); + } + + // Init Single Skin + include_once MEC::import('app.skins.single', true, true); + + // Register the actions + $SKO = new MEC_skin_single(); + $SKO->actions(); + } + + /** + * Get path of one skin file + * @author Webnus + * @param string $file + * @return string + */ + public function get_path($file = 'tpl') + { + return MEC::import('app.skins.'.$this->skin.'.'.$file, true, true); + } + + /** + * Returns path of skin tpl + * @author Webnus + * @return string + */ + public function get_tpl_path() + { + $path = $this->get_path(); + + // Apply filters + $settings = $this->main->get_settings(); + + if('single' === $this->skin) + { + $single_style = $settings['single_single_style'] ?? ''; + $single_style = apply_filters( 'mec_filter_single_style', $single_style ); + $filtered_path = apply_filters('mec_get_skin_tpl_path', $this->skin, $single_style, $path); + } + else + { + $filtered_path = apply_filters('mec_get_skin_tpl_path', $this->skin, $this->style, $path); + } + + if($filtered_path != $this->skin and $this->file->exists($filtered_path)) $path = $filtered_path; + + return $path; + } + + /** + * Returns path of skin render file + * @author Webnus + * @return string + */ + public function get_render_path() + { + $path = $this->get_path('render'); + + // Apply filters + $filtered_path = apply_filters('mec_get_skin_render_path', $this->skin); + if($filtered_path != $this->skin and $this->file->exists($filtered_path)) $path = $filtered_path; + + return $path; + } + + /** + * Returns calendar file path of calendar views + * @author Webnus + * @param string $style + * @return string + */ + public function get_calendar_path($style = 'calendar') + { + $path = $this->get_path($style); + + // Apply filters + $filtered_path = apply_filters('mec_get_skin_calendar_path', $this->skin); + if($filtered_path != $this->skin and $this->file->exists($filtered_path)) $path = $filtered_path; + + return $path; + } + + /** + * Generates skin output + * @author Webnus + * @return string + */ + public function output() + { + if(!$this->main->getPRO() and in_array($this->skin, array('agenda', 'yearly_view', 'timetable', 'masonry', 'map', 'available_spot'))) + { + return ''; + } + + // Include needed assets for loading single event details page + if($this->sed_method === 'm1') $this->main->load_sed_assets($this->settings); + + $custom_output = apply_filters('mec_skin_output_html', null, $this); + if(!is_null($custom_output)) return $custom_output; + + ob_start(); + include $this->get_tpl_path(); + return ob_get_clean(); + } + + /** + * Returns keyword query for adding to WP_Query + * @author Webnus + * @return null|string + */ + public function keyword_query() + { + // Add keyword to filters + if(isset($this->atts['s']) and trim($this->atts['s']) != '') return $this->atts['s']; + else return NULL; + } + + /** + * Returns taxonomy query for adding to WP_Query + * @author Webnus + * @return array + */ + public function tax_query() + { + $tax_query = array('relation'=>'AND'); + + // Include label to filter + if(isset($this->atts['label']) and trim($this->atts['label'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_label', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['label'], ', ')) + ); + } + + // Exclude label from filter + if(isset($this->atts['ex_label']) and trim($this->atts['ex_label'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_label', + 'field'=>'term_id', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_label'], ', ')) + ); + } + + // Include category to filter + if(isset($this->atts['category']) and trim($this->atts['category'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_category', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['category'], ', ')) + ); + } + + // Exclude category from filter + if(isset($this->atts['ex_category']) and trim($this->atts['ex_category'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_category', + 'field'=>'term_id', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_category'], ', ')) + ); + } + + // Include location to filter + if(isset($this->atts['location']) and trim($this->atts['location'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_location', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['location'], ', ')) + ); + } + + // Exclude location from filter + if(isset($this->atts['ex_location']) and trim($this->atts['ex_location'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_location', + 'field'=>'term_id', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_location'], ', ')) + ); + } + + // Add event address to filter + if(isset($this->atts['address']) and trim($this->atts['address'], ', ') != '') + { + $get_locations_id = $this->get_locations_id($this->atts['address']); + $tax_query[] = array( + 'taxonomy'=>'mec_location', + 'field'=>'term_id', + 'terms'=>$get_locations_id, + ); + } + + // Include organizer to filter + if(isset($this->atts['organizer']) and trim($this->atts['organizer'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_organizer', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['organizer'], ', ')) + ); + } + + // Exclude location from filter + if(isset($this->atts['ex_organizer']) and trim($this->atts['ex_organizer'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_organizer', + 'field'=>'term_id', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_organizer'], ', ')) + ); + } + + // Include sponsor to filter + if(isset($this->atts['sponsor']) and trim($this->atts['sponsor'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_sponsor', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['sponsor'], ', ')) + ); + } + + // Include speaker to filter + if(isset($this->atts['speaker']) and trim($this->atts['speaker'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_speaker', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['speaker'], ', ')) + ); + } + + // Include Event Type 1 + if(isset($this->atts['event_type']) and trim($this->atts['event_type'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_event_type', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['event_type'], ', ')) + ); + } + + // Include Event Type 2 + if(isset($this->atts['event_type_2']) and trim($this->atts['event_type_2'], ', ') != '') + { + $tax_query[] = array( + 'taxonomy'=>'mec_event_type_2', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['event_type_2'], ', ')) + ); + } + + // Include tags to filter + if(apply_filters('mec_taxonomy_tag', '') !== 'post_tag' and isset($this->atts['tag']) and trim($this->atts['tag'], ', ') != '') + { + if(is_numeric($this->atts['tag'])) + { + $tax_query[] = array( + 'taxonomy'=>'mec_tag', + 'field'=>'term_id', + 'terms'=>explode(',', trim($this->atts['tag'], ', ')) + ); + } + else + { + $tax_query[] = array( + 'taxonomy'=>'mec_tag', + 'field'=>'name', + 'terms'=>explode(',', trim($this->atts['tag'], ', ')) + ); + } + } + + // Exclude tags from filter + if(isset($this->atts['ex_tag']) and trim($this->atts['ex_tag'], ', ') != '') + { + if(is_numeric($this->atts['ex_tag'])) + { + $tax_query[] = array( + 'taxonomy'=>apply_filters('mec_taxonomy_tag', ''), + 'field'=>'term_id', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_tag'], ', ')) + ); + } + else + { + $tax_query[] = array( + 'taxonomy'=>apply_filters('mec_taxonomy_tag', ''), + 'field'=>'name', + 'operator'=>'NOT IN', + 'terms'=>explode(',', trim($this->atts['ex_tag'], ', ')) + ); + } + } + + return apply_filters('mec_map_tax_query', $tax_query, $this->atts); + } + + /** + * Returns meta query for adding to WP_Query + * @author Webnus + * @return array + */ + public function meta_query() + { + $meta_query = []; + $meta_query['relation'] = 'AND'; + + // Event Min Cost + if(isset($this->atts['cost-min']) and trim($this->atts['cost-min']) != '') + { + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => $this->atts['cost-min'], + 'type' => 'numeric', + 'compare' => '>=', + ); + } + + // Event Max Cost + if(isset($this->atts['cost-max']) and trim($this->atts['cost-max']) != '') + { + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => $this->atts['cost-max'], + 'type' => 'numeric', + 'compare' => '<=', + ); + } + + // Event Fields + if(isset($this->atts['fields']) and is_array($this->atts['fields']) and count($this->atts['fields'])) + { + foreach($this->atts['fields'] as $field_id => $field_value) + { + if(is_array($field_value) and isset($field_value['date_min'], $field_value['date_max']) and trim($field_value['date_min']) and trim($field_value['date_max'])) + { + $meta_query[] = array( + 'key' => 'mec_fields_'.$field_id, + 'value' => array($field_value['date_min'], $field_value['date_max']), + 'type' => 'DATE', + 'compare' => 'BETWEEN', + ); + } + elseif(is_string($field_value) and trim($field_value) !== '') + { + $meta_query[] = array( + 'key' => 'mec_fields_'.$field_id, + 'value' => $field_value, + 'compare' => 'LIKE', + ); + } + } + } + + // Event Status + if(isset($this->atts['event_status']) && !empty($this->atts['event_status']) && trim($this->atts['event_status']) != 'all'){ + + $meta_query[] = array( + 'key' => 'mec_event_status', + 'value' => $this->atts['event_status'], + 'compare' => '=', + ); + } + + return apply_filters('mec_map_meta_query', $meta_query, $this->atts); + } + + /** + * Returns tag query for adding to WP_Query + * @author Webnus + * @return string + */ + public function tag_query() + { + $tag = ''; + + // Add event tags to filter + if(isset($this->atts['tag']) and trim($this->atts['tag'], ', ') != '') + { + if(is_numeric($this->atts['tag'])) + { + $term = get_term_by('id', $this->atts['tag'], apply_filters('mec_taxonomy_tag', '')); + if($term) $tag = $term->slug; + } + else + { + $tags = explode(',', $this->atts['tag']); + foreach($tags as $t) + { + $term = get_term_by('name', $t, apply_filters('mec_taxonomy_tag', '')); + if($term) $tag .= $term->slug.','; + } + } + } + + return trim($tag, ', '); + } + + /** + * Returns author query for adding to WP_Query + * @author Webnus + * @return array + */ + public function author_query() + { + $author = ''; + + // Add event authors to filter + if(isset($this->atts['author']) and trim($this->atts['author'], ', ') != '') + { + $author = $this->atts['author']; + } + + return $author; + } + + public function author_query_ex() + { + $author = []; + + // Exclude event authors from filter + if(isset($this->atts['ex_author']) and trim($this->atts['ex_author'], ', ') != '') + { + $author = explode(',', $this->atts['ex_author']); + } + + return $author; + } + + /** + * Set the current day for filtering events in WP_Query + * @author Webnus + * @param String $today + * @return void + */ + public function setToday($today = NULL) + { + if(is_null($today)) $today = date('Y-m-d'); + + $this->args['mec-today'] = $today; + $this->args['mec-now'] = strtotime($this->args['mec-today']); + + $this->args['mec-year'] = date('Y', $this->args['mec-now']); + $this->args['mec-month'] = date('m', $this->args['mec-now']); + $this->args['mec-day'] = date('d', $this->args['mec-now']); + + $this->args['mec-week'] = (int) ((date('d', $this->args['mec-now']) - 1) / 7) + 1; + $this->args['mec-weekday'] = date('N', $this->args['mec-now']); + } + + /** + * Join MEC table with WP_Query for filtering the events + * @author Webnus + * @param string $join + * @param object $wp_query + * @return string + */ + public function join($join, $wp_query) + { + if(is_string($wp_query->query_vars['post_type']) and $wp_query->query_vars['post_type'] == $this->main->get_main_post_type() and $wp_query->get('mec-init', false)) + { + $join .= $this->db->_prefix(" LEFT JOIN `#__mec_events` AS mece ON #__posts.ID = mece.post_id LEFT JOIN `#__mec_dates` AS mecd ON #__posts.ID = mecd.post_id"); + } + + return $join; + } + + /** + * @param string $start + * @param string $end + * @param boolean $exclude + * @return array + */ + public function period($start, $end, $exclude = false) + { + // Search till the end of End Date! + if(!$this->show_only_expired_events and $this->order_method === 'ASC' and date('H:i:s', strtotime($end)) == '00:00:00') $end .= ' 23:59:59'; + + // Search From last second of start date + if($this->show_only_expired_events or $this->order_method === 'DESC') + { + if(date('Y-m-d', strtotime($start)) !== current_time('Y-m-d') and date('H:i:s', strtotime($start)) == '00:00:00') $start .= ' 23:59:59'; + elseif(date('Y-m-d', strtotime($start)) === current_time('Y-m-d') and date('H:i:s', strtotime($start)) == '00:00:00') $start .= ' '.current_time('H:i:s'); + } + + $seconds_start = strtotime($start); + $seconds_end = strtotime($end); + + $order = "`tstart` ASC, `id` ASC"; + $where_OR = "(`tstart`>='".$seconds_start."' AND `tend`<='".$seconds_end."') OR (`tstart`<='".$seconds_end."' AND `tend`>='".$seconds_end."') OR (`tstart`<='".$seconds_start."' AND `tend`>='".$seconds_start."')"; + // (Start: In, Finish: In) OR (Start: Before or In, Finish: After) OR (Start: Before, Finish: In or After) + + if($this->show_only_expired_events or $this->order_method === 'DESC') + { + $column = 'tstart'; + + if($this->hide_time_method == 'plus1') $seconds_start -= 3600; + elseif($this->hide_time_method == 'plus2') $seconds_start -= 7200; + elseif($this->hide_time_method == 'plus10') $seconds_start -= 36000; + elseif($this->hide_time_method == 'end') $column = 'tend'; + + $order = "`tstart` DESC, `id` DESC"; + + $where_OR = "`".$column."`<'".$seconds_start."'"; + if($column != 'tend') $where_OR .= " AND `tend`<'".$seconds_start."'"; + + // Fix for Tile skin + if($this->skin === 'tile' && $this->next_previous_button) $where_OR .= " AND `tstart`>='".$seconds_end."'"; + } + elseif($this->show_ongoing_events) + { + $now = current_time('timestamp'); + if(in_array($this->skin, ['list', 'grid']) && !(strpos($this->style, 'fluent') === false || strpos($this->style, 'liquid') === false)) + { + if($this->skin_options['start_date_type'] != 'today') + { + $startDateTime = strtotime($this->start_date) + (int) $this->main->get_gmt_offset_seconds(); + $now = max($startDateTime, $now); + } + + $where_OR = "(`tstart`>'".$now."' AND `tend`<='".$seconds_end."')"; + } + else + { + $where_OR = "(`tstart`<='".$now."' AND `tend`>='".$now."')"; + } + } + + $where_AND = "1 AND `public`=1 AND `status`='publish'"; + + // Exclude Events + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $where_AND .= " AND `post_id` NOT IN (".implode(',', $this->atts['exclude']).")"; + + // Include Events + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $where_AND .= " AND `post_id` IN (".implode(',', $this->atts['include']).")"; + + $query = "SELECT * FROM `#__mec_dates` WHERE (".$where_OR.") AND (".$where_AND.") ORDER BY ".$order; + $mec_dates = $this->db->select($query); + + // Today and Now + $today = current_time('Y-m-d'); + $now = current_time('timestamp'); + + // Midnight Hour + $midnight_hour = (isset($this->settings['midnight_hour']) and $this->settings['midnight_hour']) ? $this->settings['midnight_hour'] : 0; + + // Local Time Filter + $local_time_start = NULL; + $local_time_start_datetime = NULL; + $local_time_end = NULL; + + if(isset($this->atts['time-start']) and trim($this->atts['time-start'])) $local_time_start = $this->atts['time-start']; + if(isset($this->atts['time-end']) and trim($this->atts['time-end'])) $local_time_end = $this->atts['time-end']; + + // Local Timezone + $local_timezone = NULL; + if($local_time_start or $local_time_end) + { + $local_timezone = $this->main->get_timezone_by_ip(); + if(!trim($local_timezone)) $local_timezone = $this->main->get_timezone(); + } + + $include_ongoing_events = $this->include_ongoing_events; + if($this->loading_more) $include_ongoing_events = 0; + + $dates = []; + foreach($mec_dates as $mec_date) + { + $s = strtotime($mec_date->dstart); + $e = strtotime($mec_date->dend); + + // Skip Events Based on Local Start Time Search + if($local_time_start) + { + $local_time_start_datetime = $mec_date->dstart.' '.$local_time_start; + + // Local Current Time + $local = new DateTime($local_time_start_datetime, new DateTimeZone($local_timezone)); + + $event_timezone = $this->main->get_timezone($mec_date->post_id); + $local_time_in_event_timezone = $local->setTimezone(new DateTimeZone($event_timezone))->format('Y-m-d H:i:s'); + + if(strtotime($local_time_in_event_timezone) > $mec_date->tstart) continue; + } + + // Skip Events Based on Local End Time Search + if($local_time_end) + { + $local_time_end_datetime = ($this->atts['date-range-end'] ?? $mec_date->dstart).' '.$local_time_end; + + // End Time is Earlier than Start Time so Add 1 Day to the End Date + if($local_time_start_datetime and strtotime($local_time_end_datetime) <= strtotime($local_time_start_datetime)) $local_time_end_datetime = date('Y-m-d', strtotime('+1 Day', strtotime($mec_date->dend))).' '.$local_time_end; + + // Local Current Time + $local = new DateTime($local_time_end_datetime, new DateTimeZone($local_timezone)); + + $event_timezone = $this->main->get_timezone($mec_date->post_id); + $local_time_in_event_timezone = $local->setTimezone(new DateTimeZone($event_timezone))->format('Y-m-d H:i:s'); + + if(strtotime($local_time_in_event_timezone) < $mec_date->tend) continue; + } + + // Hide Events Based on Start Time + if(!$include_ongoing_events and !$this->show_ongoing_events and !$this->show_only_expired_events and !$this->args['mec-past-events'] and $s <= strtotime($today)) + { + if($this->hide_time_method == 'start' and $now >= $mec_date->tstart) continue; + elseif($this->hide_time_method == 'plus1' and $now >= $mec_date->tstart+3600) continue; + elseif($this->hide_time_method == 'plus2' and $now >= $mec_date->tstart+7200) continue; + elseif($this->hide_time_method == 'plus10' and $now >= $mec_date->tstart+36000) continue; + } + + // Hide Events Based on End Time + if(!$this->show_only_expired_events and !$this->args['mec-past-events'] and $e <= strtotime($today)) + { + if($this->hide_time_method == 'end' and $now >= $mec_date->tend) continue; + } + + if(($this->multiple_days_method == 'first_day' or ($this->multiple_days_method == 'first_day_listgrid' and in_array($this->skin, array('list', 'grid', 'slider', 'carousel', 'agenda', 'tile'))))) + { + // Hide Shown Events on AJAX + if(defined('DOING_AJAX') and DOING_AJAX and $s != $e and $s < strtotime($start) and !$include_ongoing_events and !$this->show_only_expired_events and $this->order_method === 'ASC') continue; + + $d = date('Y-m-d', $s); + + if(!isset($dates[$d])) $dates[$d] = []; + $dates[$d][] = $mec_date->post_id; + } + else + { + $diff = $this->main->date_diff($mec_date->dstart, $mec_date->dend); + $days_long = (isset($diff->days) and !$diff->invert) ? $diff->days : 0; + + while($s <= $e) + { + if((!$this->show_only_expired_events and $this->order_method === 'ASC' and $seconds_start <= $s and $s <= $seconds_end) or (($this->show_only_expired_events or $this->order_method === 'DESC') and $seconds_start >= $s and $s >= $seconds_end)) + { + $d = date('Y-m-d', $s); + if(!isset($dates[$d])) $dates[$d] = []; + + // Check for exclude events + if($exclude) + { + $current_id = !isset($current_id) ? 0 : $current_id; + + if(!isset($not_in_day)) + { + $query = "SELECT `post_id`,`not_in_days` FROM `#__mec_events`"; + $not_in_day = $this->db->select($query); + } + + if(array_key_exists($mec_date->post_id, $not_in_day) and trim($not_in_day[$mec_date->post_id]->not_in_days)) + { + $days = $not_in_day[$mec_date->post_id]->not_in_days; + $current_id = $mec_date->post_id; + } + else $days = ''; + + if(strpos($days, $d) === false) + { + $midnight = $s+(3600*$midnight_hour); + if($days_long == '1' and $midnight >= $mec_date->tend) break; + + $dates[$d][] = $mec_date->post_id; + } + } + else + { + $midnight = $s+(3600*$midnight_hour); + if($days_long == '1' and $midnight >= $mec_date->tend) break; + + $dates[$d][] = $mec_date->post_id; + } + } + + $s += 86400; + } + } + } + + $one_occurrence_sql = "SELECT `post_id`, `tstart` FROM `#__mec_dates` WHERE `tstart` >= $now AND `tstart` <= $seconds_end ORDER BY `tstart` ASC"; + if($this->hide_time_method == 'end') $one_occurrence_sql = "SELECT `post_id`, `tstart` FROM `#__mec_dates` WHERE `tend` >= $now AND `tstart` <= $seconds_end ORDER BY `tstart` ASC"; + if($include_ongoing_events) $one_occurrence_sql = "SELECT `post_id`, `tstart` FROM `#__mec_dates` WHERE (`tstart` >= $now AND `tstart` <= $seconds_end) OR (`tstart` <= $now AND `tend` >= $now) ORDER BY `tstart` ASC"; + + // Show only one occurrence of events + $first_event = $this->db->select($one_occurrence_sql); + + // Force to Show Only Once Occurrence Based on Shortcode Options + $shortcode_display_one_occurrence = isset($this->atts['show_only_one_occurrence']) && $this->atts['show_only_one_occurrence']; + + $did_one_occurrence = []; + foreach($dates as $date => $event_ids) + { + if(!is_array($event_ids) || !count($event_ids)) continue; + + // Add to Unique Event IDs + $this->unique_event_ids = array_merge($this->unique_event_ids, $event_ids); + + foreach($event_ids as $index => $event_id) + { + $one_occurrence = get_post_meta($event_id, 'one_occurrence', true); + if($one_occurrence != '1' && !$shortcode_display_one_occurrence) continue; + + if(isset($first_event[$event_id]->tstart) and date('Y-m-d', strtotime($date)) != date('Y-m-d', $first_event[$event_id]->tstart)) + { + $dates[$date][$index] = ''; + } + else + { + if(in_array($event_id, $did_one_occurrence)) $dates[$date][$index] = ''; + else $did_one_occurrence[] = $event_id; + } + } + } + + // Remove Global Exceptional Dates + $global_exceptional_dates = isset($this->settings['global_exceptional_days']) && is_array($this->settings['global_exceptional_days']) ? $this->settings['global_exceptional_days'] : []; + foreach($global_exceptional_dates as $k => $e) + { + if(!is_numeric($k)) continue; + $e = $this->main->standardize_format($e); + + if(isset($dates[$e])) unset($dates[$e]); + } + + // Make the event ids Unique + $this->unique_event_ids = array_unique($this->unique_event_ids); + + // Initialize Metadata of Events + $this->cache_mec_events(); + + return $dates; + } + + /** + * Perform the search + * @return array of objects \stdClass + * @throws Exception + * @author Webnus + */ + public function search() + { + global $MEC_Events_dates; + if($this->show_only_expired_events) + { + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + + $start = ((isset($this->sf) || $sf) and $apply_sf_date) ? date('Y-m-t', strtotime($this->start_date)) : $this->start_date; + $end = date('Y-m-01', strtotime('-15 Years', strtotime($start))); + } + elseif($this->order_method === 'DESC') + { + $start = $this->start_date; + $end = date('Y-m-01', strtotime('-15 Years', strtotime($start))); + } + else + { + $start = $this->start_date; + $end = date('Y-m-t', strtotime('+15 Years', strtotime($start))); + } + + // Set a certain maximum date from shortcode page. + if(trim($this->maximum_date) == '' and (isset($this->maximum_date_range) and trim($this->maximum_date_range))) $this->maximum_date = $this->maximum_date_range; + + // Date Events + $dates = $this->period($start, $end, true); + + // Limit + $this->args['posts_per_page'] = apply_filters('mec_skins_search_posts_per_page', 100); + $dates = apply_filters('mec_event_dates_search', $dates, $start, $end, $this); + + $last_timestamp = NULL; + $last_event_id = NULL; + + $i = 0; + $found = 0; + $events = []; + $qs = []; + + foreach($dates as $date=>$IDs) + { + // No Event + if(!is_array($IDs) or (is_array($IDs) and !count($IDs))) continue; + + // Check Finish Date + if(isset($this->maximum_date) and trim($this->maximum_date) and ((strtotime($date) > strtotime($this->maximum_date) and $this->order_method === 'ASC') or (strtotime($date) < strtotime($this->maximum_date) and $this->order_method === 'DESC'))) break; + + // Include Available Events + $this->args['post__in'] = array_unique($IDs); + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // Extending the end date + $this->end_date = $date; + + // Continue to load rest of events in the first date + if($i === 0 and $this->start_date === $date) $this->args['offset'] = $this->offset; + // Load all events in the rest of dates + else + { + $this->offset = 0; + $this->args['offset'] = 0; + } + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + // Query Key + $q_key = base64_encode(json_encode($this->args)); + + // Get From Cache + if(isset($qs[$q_key])) $query = $qs[$q_key]; + // Search & Cache + else + { + $query = new WP_Query($this->args); + $qs[$q_key] = $query; + } + + if($query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $ID_count = $IDs_count[$ID] ?? 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date'=>$date), + 'end' => array('date'=>$this->main->get_end_date($date, $rendered)) + ); + + $event_data = $this->render->after_render($data, $this, $i); + $date_times = $this->get_event_datetimes($event_data); + + $last_timestamp = $event_data->data->time['start_timestamp']; + $last_event_id = $ID; + + // global variable for use dates + $MEC_Events_dates[$ID][] = $date_times; + + $d[] = $event_data; + $found++; + } + + if($found >= $this->limit) + { + // Next Offset + $this->next_offset = ($query->post_count-($query->current_post+1)) >= 0 ? ($query->current_post+1)+$this->offset : 0; + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + + // Restore original Post Data + wp_reset_postdata(); + + break 2; + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + + // Restore original Post Data + wp_reset_postdata(); + + $i++; + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + // Set Offset for Last Page + if($found < $this->limit) + { + // Next Offset + $this->next_offset = $found + ((isset($date) and $this->start_date === $date) ? $this->offset : 0); + } + + // Set found events + $this->found = $found; + + // Has More Events + if($last_timestamp and $last_event_id) $this->has_more_events = (boolean) $this->db->select("SELECT COUNT(id) FROM `#__mec_dates` WHERE `tstart` > ".$last_timestamp." OR (`tstart` = ".$last_timestamp." AND `post_id`!='".$last_event_id."')", 'loadResult'); + + $event_include=array(); + $occurrences_status = (isset($this->settings['per_occurrences_status']) and $this->settings['per_occurrences_status'] ); + if(isset($this->atts['location']) and trim($this->atts['location'], ', ') != '' and $occurrences_status) + { + $include_location = explode(',', trim($this->atts['location'], ', ')); + foreach ($events as $date=>$event_details){ + foreach($event_details as $event) + { + $location_id = $this->main->get_master_location_id($event); + if (in_array($location_id, $include_location) || in_array($event->data->meta['mec_location_id'], $include_location)) { + $event_include[$date]=$event_details; + } + } + } + } + + if(isset($this->atts['organizer']) and trim($this->atts['organizer'], ', ') != '' and $occurrences_status) + { + $include_organizer = explode(',', trim($this->atts['organizer'], ', ')); + foreach ($events as $date=>$event_details){ + foreach($event_details as $event) + { + $organizer_id = $this->main->get_master_organizer_id($event); + if (in_array($organizer_id, $include_organizer) || in_array($event->data->meta['mec_organizer_id'], $include_organizer)) { + $event_include[$date]=$event_details; + } + } + } + } + + if(count($event_include)>0){ + $events = $event_include; + } + + return $events; + } + + public function get_event_datetimes($event) + { + $start_date = $event->date['start']['date']; + $start_time = $event->data->time['start']; + $start_datetime = esc_html__('All Day', 'modern-events-calendar-lite') !== $start_time ? "$start_date $start_time" : $start_date; + $start_timestamp = strtotime( $start_datetime ); + + $end_date = $event->date['end']['date']; + $end_time = $event->data->time['end']; + $end_datetime = esc_html__('All Day', 'modern-events-calendar-lite') !== $end_time ? "$end_date $end_time" : $end_date; + $end_timestamp = strtotime( $end_datetime ); + + return [ + 'start' => [ + 'date' => $start_date, + 'time' => $start_time, + 'timestamp' => $start_timestamp, + ], + 'end' => [ + 'date' => $end_date, + 'time' => $end_time, + 'timestamp' => $end_timestamp, + ], + ]; + } + + /** + * Run the search command + * @return array of objects + * @throws Exception + * @author Webnus + */ + public function fetch() + { + // Events! :) + return $this->events = $this->search(); + } + + /** + * Draw Monthly Calendar + * @author Webnus + * @param string|int $month + * @param string|int $year + * @param array $events + * @param string $style + * @return string + */ + public function draw_monthly_calendar($year, $month, $events = array(), $style = 'calendar') + { + $calendar_path = $this->get_calendar_path($style); + + // Generate Month + ob_start(); + include $calendar_path; + return ob_get_clean(); + } + + /** + * @param object $event + * @return string + */ + public function get_event_classes($event) + { + // Labels are not set + if(!isset($event->data) || !isset($event->data->labels)) return NULL; + + // No Labels + if(!is_array($event->data->labels) or (is_array($event->data->labels) and !count($event->data->labels))) return NULL; + + $classes = ''; + foreach($event->data->labels as $label) + { + if(!isset($label['style']) || !trim($label['style'])) continue; + $classes .= ' '.$label['style']; + } + + return trim($classes); + } + + /** + * Generates Search Form + * @author Webnus + * @return string + */ + public function sf_search_form() + { + // If no fields specified + if(!count($this->sf_options)) return ''; + + $display_style = $fields = ''; + $first_row = 'not-started'; + $display_form = []; + + foreach($this->sf_options as $field=>$options) + { + // Event Fields is disabled + if($field === 'fields' and (!isset($this->settings['display_event_fields_search']) or (isset($this->settings['display_event_fields_search']) and !$this->settings['display_event_fields_search']))) continue; + + $display_form[] = $options['type'] ?? ($field === 'fields' ? 'fields' : NULL); + $fields_array = array('category', 'location', 'organizer', 'speaker', 'tag', 'label'); + $fields_array = apply_filters('mec_filter_fields_search_array', $fields_array); + + if(in_array($field, $fields_array) and $first_row == 'not-started') + { + $first_row = 'started'; + if($this->sf_options['category']['type'] == "0" and $this->sf_options['location']['type'] == '0' and $this->sf_options['organizer']['type'] == '0' and (isset($this->sf_options['speaker']['type']) && $this->sf_options['speaker']['type'] == '0') and (isset($this->sf_options['tag']['type']) && $this->sf_options['tag']['type'] == '0') and $this->sf_options['label']['type'] == '0') + { + $display_style = 'style="display: none;"'; + } + + $fields .= '
    '; + } + + if(!in_array($field, $fields_array) and $first_row == 'started') + { + $first_row = 'finished'; + $fields .= '
    '; + } + + $fields .= $this->sf_search_field($field, $options, $this->sf_display_label); + } + + $fields = apply_filters('mec_filter_fields_search_form', $fields, $this); + + $form = ''; + if(trim($fields) && (in_array('dropdown', $display_form) || in_array('simple-checkboxes', $display_form) || in_array('checkboxes', $display_form) || in_array('text_input', $display_form) || in_array('address_input', $display_form) || in_array('minmax', $display_form) || in_array('local-time-picker', $display_form) || in_array('fields', $display_form))) + { + $form .= '
    '; + $form .= $fields; + + // Reset Button + if($this->sf_reset_button) $form .='
    '; + + $form = apply_filters('mec_sf_search_form_end', $form, $this); + + $form .= '
    '; + } + + return apply_filters('mec_sf_search_form', $form, $this); + } + + /** + * Generate a certain search field + * @author Webnus + * @param string $field + * @param array $options + * @param int $display_label + * @return string + */ + public function sf_search_field($field, $options, $display_label = null) + { + $type = $options['type'] ?? ''; + + // Field is disabled + if(!trim($type) and $field !== 'fields') return ''; + + // Status of Speakers Feature + $speakers_status = isset($this->settings['speakers_status']) && $this->settings['speakers_status']; + + // Import + self::import('app.libraries.walker'); + if(!function_exists('wp_terms_checklist')) include ABSPATH.'wp-admin/includes/template.php'; + + $output = ''; + if($field == 'category') + { + $label = $this->main->m('taxonomy_category', esc_html__('Category', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .=''; + } + elseif($type == 'checkboxes' and wp_count_terms(array('taxonomy' => 'mec_category'))) + { + $output .= ''; + } + elseif($type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_category'))) + { + $output .= ''; + } + } + elseif($field == 'location') + { + $label = $this->main->m('taxonomy_location', esc_html__('Location', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .= ''; + } + elseif($type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_location'))) + { + $output .= ''; + } + } + elseif($field == 'organizer' && (!isset($this->settings['organizers_status']) || $this->settings['organizers_status'])) + { + $label = $this->main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .= ''; + } + elseif($type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_organizer'))) + { + $output .= ''; + } + } + elseif($field == 'speaker' and $speakers_status) + { + $label = $this->main->m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .= ''; + } + elseif($type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_speaker'))) + { + $output .= ''; + } + } + elseif($field == 'tag') + { + $label = $this->main->m('taxonomy_tag', esc_html__('Tag', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .= ''; + } + } + elseif($field == 'label') + { + $label = $this->main->m('taxonomy_label', esc_html__('Label', 'modern-events-calendar-lite')); + + if($type == 'dropdown') + { + $output .= ''; + } + elseif($type == 'simple-checkboxes' and wp_count_terms(array('taxonomy' => 'mec_label'))) + { + $output .= ''; + } + } + elseif($field == 'month_filter') + { + $label = esc_html__('Date', 'modern-events-calendar-lite'); + if($type == 'dropdown') + { + $time = isset($this->start_date) ? strtotime($this->start_date) : ''; + $now = current_time('timestamp'); + + $skins = ['list', 'grid', 'agenda', 'map']; + if(isset($this->skin_options['default_view']) and $this->skin_options['default_view'] == 'list') $skins[] = 'full_calendar'; + + $item = esc_html__('Select', 'modern-events-calendar-lite'); + $option = in_array($this->skin, $skins) ? '' : ''; + + $output .= ''; + } + elseif($type == 'date-range-picker') + { + $min_date = $this->start_date ?? NULL; + + $output .= ''; + } + } + elseif($field == 'time_filter') + { + $label = esc_html__('Time', 'modern-events-calendar-lite'); + if($type == 'local-time-picker') + { + $this->main->load_time_picker_assets(); + + $output .= ''; + } + } + elseif($field == 'text_search') + { + $label = esc_html__('Text', 'modern-events-calendar-lite'); + if($type == 'text_input') + { + $placeholder = $options['placeholder'] ?? ''; + + $output .= ''; + } + } + elseif($field == 'address_search') + { + $label = esc_html__('Address', 'modern-events-calendar-lite'); + if($type == 'address_input') + { + $placeholder = $options['placeholder'] ?? ''; + + $output .= ''; + } + } + elseif($field == 'event_cost') + { + $label = esc_html__('Cost', 'modern-events-calendar-lite'); + if($type == 'minmax') + { + $output .= '
    '; + if($display_label == 1) $output .=''; + $output .= $this->icons->display('credit-card').' + + +
    '; + } + } + elseif($field == 'fields') + { + $event_fields = $this->main->get_event_fields(); + foreach($options as $field_id => $field_options) + { + $event_field = $event_fields[$field_id] ?? []; + $label = $event_field['label'] ?? ''; + $type = $field_options['type'] ?? ''; + + // Disabled Field + if(!$label or !$type) continue; + + $field_values = (isset($event_field['options']) and is_array($event_field['options'])) ? $event_field['options'] : []; + + if($type === 'text_input') + { + $output .= ''; + } + elseif($type === 'dropdown') + { + $output .= ''; + } + elseif($type === 'date-range-picker') + { + $min_date = $this->start_date ?? NULL; + + $output .= ''; + } + } + } + + return apply_filters('mec_search_fields_to_box', $output, $field, $type, $this->atts, $this->id); + } + + public function sf_only_valid_terms($taxonomy, $existing_terms = []) + { + if($this->show_only_expired_events) $event_ids = $this->main->get_expired_event_ids(current_time('timestamp'), 'publish'); + elseif(isset($this->args['mec-past-events']) and $this->args['mec-past-events']) $event_ids = $this->main->get_all_event_ids('publish'); + elseif($this->show_ongoing_events) $event_ids = $this->main->get_ongoing_event_ids(current_time('timestamp'), 'publish'); + elseif($this->include_ongoing_events) + { + $ongoing_ids = $this->main->get_ongoing_event_ids(current_time('timestamp'), 'publish'); + $upcoming_ids = $this->main->get_upcoming_event_ids(current_time('timestamp'), 'publish'); + + $event_ids = array_merge($ongoing_ids, $upcoming_ids); + $event_ids = array_unique($event_ids); + } + else $event_ids = $this->main->get_upcoming_event_ids(current_time('timestamp'), 'publish'); + + $terms = []; + + $post_terms = wp_get_object_terms($event_ids, $taxonomy); + if(is_array($post_terms)) foreach($post_terms as $post_term) $terms[] = $post_term->term_id; + + $existing_terms = array_unique($existing_terms); + $terms = array_unique($terms); + + // No Terms + if(!count($terms)) return [-1]; + + $exclude = []; + + if($taxonomy === 'mec_category' && isset($this->atts['ex_category']) && trim($this->atts['ex_category'])) $exclude = explode(',', trim($this->atts['ex_category'], ', ')); + else if($taxonomy === 'mec_location' && isset($this->atts['ex_location']) && trim($this->atts['ex_location'])) $exclude = explode(',', trim($this->atts['ex_location'], ', ')); + else if($taxonomy === 'mec_organizer' && isset($this->atts['ex_organizer']) && trim($this->atts['ex_organizer'])) $exclude = explode(',', trim($this->atts['ex_organizer'], ', ')); + else if($taxonomy === 'mec_label' && isset($this->atts['ex_label']) && trim($this->atts['ex_label'])) $exclude = explode(',', trim($this->atts['ex_label'], ', ')); + else if($taxonomy === 'mec_tag' && isset($this->atts['ex_tag']) && trim($this->atts['ex_tag'])) $exclude = explode(',', trim($this->atts['ex_tag'], ', ')); + + // Exclude Terms + if(count($exclude)) + { + foreach($exclude as $ex_id) + { + if(in_array($ex_id, $terms)) unset($terms[array_search($ex_id, $terms)]); + } + } + + // No Existing Terms + if(!count($existing_terms)) return $terms; + + // Intersect + $intersect = array_intersect($existing_terms, $terms); + + // No Intersect + if(!count($intersect)) return $terms; + + // Return + return $intersect; + } + + public function sf_apply($atts, $sf = array(), $apply_sf_date = 1) + { + // Return normal atts if sf is empty + if(!count($sf)) return $atts; + + // Apply Text Search Query + if(isset($sf['s'])) $atts['s'] = $sf['s']; + + // Apply Address Search Query + if(isset($sf['address'])) $atts['address'] = $sf['address']; + + // Apply Category Query + if(isset($sf['category']) and trim($sf['category'])) $atts['category'] = $sf['category']; + + // Apply Location Query + if(isset($sf['location'])) $atts['location'] = $sf['location']; + + // Apply Organizer Query + if(isset($sf['organizer']) and trim($sf['organizer'])) $atts['organizer'] = $sf['organizer']; + + // Apply speaker Query + if(isset($sf['speaker']) and trim($sf['speaker'])) $atts['speaker'] = $sf['speaker']; + + // Apply tag Query + if(isset($sf['tag']) and trim($sf['tag'])) $atts['tag'] = $sf['tag']; + + // Apply Label Query + if(isset($sf['label']) and trim($sf['label'])) $atts['label'] = $sf['label']; + + // Apply Event Cost Query + if(isset($sf['cost-min'])) $atts['cost-min'] = $sf['cost-min']; + if(isset($sf['cost-max'])) $atts['cost-max'] = $sf['cost-max']; + + // Event Status + if(isset($sf['event_status'])) $atts['event_status'] = $sf['event_status']; + + // Apply Local Time Query + if(isset($sf['time-start'])) $atts['time-start'] = $sf['time-start']; + if(isset($sf['time-end'])) $atts['time-end'] = $sf['time-end']; + + // Apply Event Fields + if(isset($sf['fields']) and is_array($sf['fields']) and count($sf['fields'])) $atts['fields'] = $sf['fields']; + + // Apply SF Date or Not + if($apply_sf_date == 1) + { + // Apply Month of Month Filter + if(isset($sf['month']) and trim($sf['month'])) $_REQUEST['mec_month'] = $sf['month']; + + // Apply Year of Month Filter + if(isset($sf['year']) and trim($sf['year'])) $_REQUEST['mec_year'] = $sf['year']; + + // Apply to Start Date + if(isset($sf['month']) and trim($sf['month']) and isset($sf['year']) and trim($sf['year'])) + { + $start_date = $sf['year'].'-'.$sf['month'].'-'.($sf['day'] ?? '01'); + $_REQUEST['mec_start_date'] = $start_date; + + $skins = $this->main->get_skins(); + foreach($skins as $skin=>$label) + { + $atts['sk-options'][$skin]['start_date_type'] = 'date'; + $atts['sk-options'][$skin]['start_date'] = $start_date; + } + } + + // Apply Start and End Dates + if(isset($sf['start']) and trim($sf['start']) and isset($sf['end']) and trim($sf['end'])) + { + $start = $this->main->standardize_format($sf['start']); + $_REQUEST['mec_start_date'] = $start; + + $end = $this->main->standardize_format($sf['end']); + $_REQUEST['mec_maximum_date'] = $end; + $this->maximum_date = $end; + + $skins = $this->main->get_skins(); + foreach($skins as $skin=>$label) + { + $atts['sk-options'][$skin]['start_date_type'] = 'date'; + $atts['sk-options'][$skin]['start_date'] = $start; + } + + $atts['date-range-start'] = $start; + $atts['date-range-end'] = $end; + } + } + + return apply_filters('add_to_search_box_query', $atts, $sf); + } + + /** + * Get Locations ID + * @param string $address + * @return array + */ + public function get_locations_id($address = '') + { + if(!trim($address)) return []; + + $address = str_replace(' ', ',', $address); + $locations = explode(',', $address); + $query = "SELECT `term_id` FROM `#__termmeta` WHERE `meta_key` = 'address'"; + + foreach($locations as $location) if(trim($location)) $query .= " AND `meta_value` LIKE '%" . trim($location) . "%'"; + + $locations_id = $this->db->select($query, 'loadAssocList'); + return array_map(function($value) + { + return intval($value['term_id']); + }, $locations_id); + } + + public function sort_day_events($a, $b) + { + if(isset($a->date['start']['timestamp'], $b->date['start']['timestamp'])) + { + $a_timestamp = $a->date['start']['timestamp']; + $b_timestamp = $b->date['start']['timestamp']; + } + else + { + $a_start_date = $a->date['start']['date']; + $b_start_date = $b->date['start']['date']; + + $a_timestamp = strtotime($a_start_date.' '.$a->data->time['start_raw']); + $b_timestamp = strtotime($b_start_date.' '.$b->data->time['start_raw']); + } + + if($a_timestamp == $b_timestamp) return 0; + + if($this->order_method === 'DESC') return ($a_timestamp < $b_timestamp) ? +1 : -1; + else return ($a_timestamp > $b_timestamp) ? +1 : -1; + } + + public function sort_dates($a, $b) + { + $a_timestamp = strtotime($a); + $b_timestamp = strtotime($b); + + if($a_timestamp == $b_timestamp) return 0; + return ($a_timestamp > $b_timestamp) ? +1 : -1; + } + + public function booking_button($event, $type = 'button') + { + if(!$this->booking_button) return ''; + if(!$this->main->can_show_booking_module($event)) return ''; + if($this->main->is_sold($event, $event->data->time['start_timestamp']) and isset($this->settings['single_date_method']) and $this->settings['single_date_method'] !== 'referred') return ''; + + $link = $this->main->get_event_date_permalink($event, $event->date['start']['date']); + $link = $this->main->add_qs_var('method', 'mec-booking-modal', $link); + + $modal = 'data-featherlight="iframe" data-featherlight-iframe-height="450" data-featherlight-iframe-width="700"'; + $title = $this->main->m('booking_button', esc_html__('Book Event', 'modern-events-calendar-lite')); + + $booking_options = (isset($event->data, $event->data->meta, $event->data->meta['mec_booking'], $event->data->meta['mec_booking']) and is_array($event->data->meta['mec_booking'])) ? $event->data->meta['mec_booking'] : []; + $booking_button_label = (isset($booking_options['bookings_booking_button_label']) and trim($booking_options['bookings_booking_button_label'])) ? $booking_options['bookings_booking_button_label'] : ''; + + if(trim($booking_button_label)) $title = $booking_button_label; + + if($type === 'button') return ''.esc_html($title).''; + else return ''; + } + + public function display_custom_data($event) + { + $output = ''; + + $status = isset($this->skin_options['custom_data']) && $this->skin_options['custom_data']; + if($status and is_object($event)) + { + $single = new MEC_skin_single(); + + ob_start(); + $single->display_data_fields($event, false, true); + $output .= ob_get_clean(); + } + + return $output; + } + + public function display_detailed_time($event) + { + // Event Date + $date = ($event->date ?? array()); + + $to = $date['end']['date']; + $from = $this->main->get_start_of_multiple_days($event->ID, $to); + + $start_time = NULL; + if(isset($date['start']['hour'])) + { + $s_hour = $date['start']['hour']; + if(strtoupper($date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_time = sprintf("%02d", $s_hour).':'; + $start_time .= sprintf("%02d", $date['start']['minutes']); + $start_time .= ' '.trim($date['start']['ampm']); + } + elseif(isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['start_timestamp'])) $start_time = date('H:i', $event->data->time['start_timestamp']); + + $end_time = NULL; + if(isset($date['end']['hour'])) + { + $e_hour = $date['end']['hour']; + if(strtoupper($date['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $end_time = sprintf("%02d", $e_hour).':'; + $end_time .= sprintf("%02d", $date['end']['minutes']); + $end_time .= ' '.trim($date['end']['ampm']); + } + elseif(isset($event->data->time) and is_array($event->data->time) and isset($event->data->time['end_timestamp'])) $end_time = date('H:i', $event->data->time['end_timestamp']); + + $date_format = get_option('date_format'); + $time_format = get_option('time_format'); + + $output = '
    '; + $output .= '
    '.sprintf(esc_html__('Start from: %s - %s', 'modern-events-calendar-lite'), date_i18n($date_format, strtotime($from)), date_i18n($time_format, strtotime($from.' '.$start_time))).'
    '; + $output .= '
    '.sprintf(esc_html__('End at: %s - %s', 'modern-events-calendar-lite'), date_i18n($date_format, strtotime($to)), date_i18n($time_format, strtotime($to.' '.$end_time))).'
    '; + $output .= '
    '; + + return $output; + } + + public function display_categories($event) + { + $output = ''; + + $status = isset($this->skin_options['display_categories']) && $this->skin_options['display_categories']; + if($status and is_object($event) and isset($event->data->categories) and count($event->data->categories)) + { + foreach($event->data->categories as $category) + { + if(isset($category['name']) and trim($category['name'])) + { + $color = ((isset($category['color']) and trim($category['color'])) ? $category['color'] : ''); + + $color_html = ''; + if($color) $color_html .= ' '; + + $output .= '
  • ' . trim($category['name']) . $color_html .'
  • '; + } + } + } + + return $output ? '
    '.$this->icons->display('folder').'
      ' . $output . '
    ' : $output; + } + + public function display_organizers($event) + { + $output = ''; + + $status = isset($this->skin_options['display_organizer']) && $this->skin_options['display_organizer'] && (!isset($this->settings['organizers_status']) || $this->settings['organizers_status']); + if($status and is_object($event) and isset($event->data->organizers) and count($event->data->organizers)) + { + $organizers = []; + + // Occurrence + $occurrence = isset($event->date, $event->date['start'], $event->date['start']['timestamp']) ? $event->date['start']['timestamp'] : NULL; + + // Main Organizer + if(isset($event->data, $event->data->meta, $event->data->meta['mec_organizer_id']) and $event->data->meta['mec_organizer_id'] > 1) + { + $organizers[] = $occurrence + ? MEC_feature_occurrences::param($event->ID, $occurrence, 'organizer_id', $event->data->meta['mec_organizer_id']) + : $event->data->meta['mec_organizer_id']; + } + + // Additional Organizers + $additional_organizers = isset($event->data->meta['mec_additional_organizer_ids']) && is_array($event->data->meta['mec_additional_organizer_ids']) && count($event->data->meta['mec_additional_organizer_ids']) ? $event->data->meta['mec_additional_organizer_ids'] : []; + $organizers = array_merge($organizers, $additional_organizers); + + // Unique + $organizers = array_unique($organizers); + + foreach($organizers as $organizer_id) + { + $term = get_term($organizer_id, 'mec_organizer'); + if(!isset($term->term_id)) continue; + + $url = get_term_meta($organizer_id, 'url', true); + $name = $term->name; + + $organizer_url = !empty($url) ? 'href="'. esc_url($url) .'" target="_blank"' : ''; + if(trim($name)) + { + $name_url = trim($organizer_url) ? '' . esc_html(trim($name)) . '' : '' . esc_html(trim($name)) . ''; + $output .= '
  • '.$name_url.'
  • '; + } + } + } + + return $output ? '
    '.$this->icons->display('user').'
      ' . $output . '
    ' : $output; + } + + public function display_cost($event) + { + $output = ''; + if($this->display_price) + { + $cost = $this->main->get_event_cost($event); + if($cost) + { + $output .= '
    + '.$this->icons->display('wallet').' + '.$cost.' +
    '; + } + } + + return $output; + } + + public function get_register_button_title( $event, $event_start_date ){ + + $soldout = $this->main->get_flags($event, $event_start_date); + + $can_register = (is_array($event->data->tickets) and count($event->data->tickets) and !strpos($soldout, '%%soldout%%') and !$this->booking_button and !$this->main->is_expired($event)); + + if($can_register) + { + $title = $this->main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite')); + } + else + { + $title = $this->main->m('view_detail', esc_html__('View Detail', 'modern-events-calendar-lite')); + } + + return $title; + } + + public function get_sed_method() + { + // SED Method + $sed_method = $this->skin_options['sed_method'] ?? '0'; + + // Fix Backend Editors Like Elementor + if(is_admin() && !wp_doing_ajax()) $sed_method = '0'; + + return $sed_method; + } + + /** + * @param $event + * @param null $title + * @param null $class + * @param null $attributes + * @return string|null + */ + public function display_link($event, $title = NULL, $class = NULL, $attributes = NULL) + { + $link_for_title = false; + + // Event Title + if(is_null($title)) + { + $title = apply_filters('mec_occurrence_event_title', $event->data->title, $event); + $link_for_title = true; + } + + // Link Class + if(is_null($class)) $class = 'mec-color-hover'; + + // Single Event Display Method + $method = $this->skin_options['sed_method'] ?? false; + + // Occurrence Type + $one_occurrence = (isset($this->atts['show_only_one_occurrence']) && $this->atts['show_only_one_occurrence']); + + // Repeat Type + $repeat_label = ''; + if($one_occurrence and $link_for_title) + { + $repeat_type = (isset($event->data) and isset($event->data->meta) and isset($event->data->meta['mec_repeat_type'])) ? $event->data->meta['mec_repeat_type'] : ''; + + // Change to switch case for translate-ability + switch ($repeat_type) { + case 'daily': + $repeat_label = ''.esc_html__('Daily' , 'modern-events-calendar-lite').''; + break; + case 'weekly': + $repeat_label = ''.esc_html__('Weekly' , 'modern-events-calendar-lite').''; + break; + case 'monthly': + $repeat_label = ''.esc_html__('Monthly' , 'modern-events-calendar-lite').''; + break; + case 'yearly': + $repeat_label = ''.esc_html__('Yearly' , 'modern-events-calendar-lite').''; + break; + case 'weekend': + $repeat_label = ''.esc_html__('Every Weekend' , 'modern-events-calendar-lite').''; + break; + case 'weekday': + $repeat_label = ''.esc_html__('Every Weekday' , 'modern-events-calendar-lite').''; + break; + case 'certain_weekdays': + case 'custom_days': + case 'advanced': + $repeat_label = ''.esc_html__('Repeating Event' , 'modern-events-calendar-lite').''; + break; + } + } + + // Link is disabled + if($method == 'no' and in_array($class, array('mec-booking-button', 'mec-detail-button', 'mec-booking-button mec-bg-color-hover mec-border-color-hover', 'mec-event-link'))) return ''; + elseif($method == 'no') return MEC_kses::form($title.$repeat_label); + else + { + $sed_method = $this->skin_options['sed_method'] ?? ''; + switch($sed_method) + { + case '0': + + $sed_method = '_self'; + break; + case 'new': + + $sed_method = '_blank'; + break; + } + + $sed_method = ($sed_method ?: '_self'); + } + + $target = (!empty($sed_method) ? 'target="'.esc_attr($sed_method).'" rel="noopener"' : ''); + $target = apply_filters('mec_event_link_change_target', $target, $event->data->ID); + + return ''.MEC_kses::form($title).''.MEC_kses::element($repeat_label); + } + + public function get_end_date() + { + $end_date_type = (isset($this->skin_options['end_date_type']) and trim($this->skin_options['end_date_type'])) ? trim($this->skin_options['end_date_type']) : 'date'; + + if($end_date_type === 'today') $maximum_date = current_time('Y-m-d'); + elseif($end_date_type === 'tomorrow') $maximum_date = date('Y-m-d', strtotime('Tomorrow')); + else $maximum_date = (isset($this->skin_options['maximum_date_range']) and trim($this->skin_options['maximum_date_range'])) ? trim($this->skin_options['maximum_date_range']) : ''; + + return $maximum_date; + } + + public function get_label_captions($event, $extra_class = null) + { + $captions = ''; + if(isset($event->data->labels) and is_array($event->data->labels) and count($event->data->labels)) + { + foreach($event->data->labels as $label) + { + if(!isset($label['style']) || !trim($label['style'])) continue; + + $captions .= ''; + if($label['style'] == 'mec-label-featured') $captions .= esc_html__($label['name'], 'modern-events-calendar-lite'); + elseif($label['style'] == 'mec-label-canceled') $captions .= esc_html__($label['name'], 'modern-events-calendar-lite'); + elseif($label['style'] == 'mec-label-custom' and isset($label['name']) and trim($label['name'])) $captions .= esc_html__($label['name'], 'modern-events-calendar-lite'); + $captions .= ''; + + break; + } + } + + return $captions; + } + + public function cache_mec_events(): bool + { + // First Validation + if(!is_array($this->unique_event_ids) || !count($this->unique_event_ids)) return false; + + // Cache + $cache = $this->getCache(); + + // Db + $db = $this->getDB(); + + // Records + $records = $db->select("SELECT * FROM `#__mec_events` WHERE `post_id` IN (".implode(',', $this->unique_event_ids).")"); + + // Cache Data + foreach($records as $record) $cache->set('mec-events-data-'.$record->post_id, $record); + + return true; + } + + /** + * @param $event + * @param bool $only_color_code + * @return string + */ + public function get_event_color_dot($event, $only_color_code = false) + { + return $this->main->get_event_color_dot($event, $only_color_code); + } + + public function display_status_bar($event) + { + if(!is_object($event)) return ''; + + // Status Bar is Disabled + if(!isset($this->skin_options['status_bar']) || !$this->skin_options['status_bar']) return ''; + + $event_id = $event->ID; + if(isset($event->requested_id)) $event_id = $event->requested_id; // Requested Event in Multilingual Websites + + $start_timestamp = $event->data->time['start_timestamp'] ?? ($event->date['start']['timestamp'] ?? strtotime($event->date['start']['date'])); + + // All Params + $params = MEC_feature_occurrences::param($event_id, $start_timestamp, '*'); + + $event_status = (isset($event->data->meta['mec_event_status']) and trim($event->data->meta['mec_event_status'])) ? $event->data->meta['mec_event_status'] : 'EventScheduled'; + $event_status = (isset($params['event_status']) and trim($params['event_status']) != '') ? $params['event_status'] : $event_status; + + $output = ''; + + // Ongoing Icon + if($this->main->is_ongoing($event)) $output .= '
  • '.$this->main->svg('mec-live-now').' '.esc_html__('Live Now', 'modern-events-calendar-lite').'
  • '; + + if($event_status === 'EventScheduled') $output .= '
  • '.$this->main->svg('ontime').' '.esc_html__('On Schedule', 'modern-events-calendar-lite').'
  • '; + elseif($event_status === 'EventRescheduled') $output .= '
  • '.$this->main->svg('ontime').' '.esc_html__('Rescheduled', 'modern-events-calendar-lite').'
  • '; + elseif($event_status === 'EventPostponed') $output .= '
  • '.$this->main->svg('delay').' '.esc_html__('Delayed', 'modern-events-calendar-lite').'
  • '; + elseif($event_status === 'EventCancelled') $output .= '
  • '.$this->main->svg('cancel').' '.esc_html__('Cancelled', 'modern-events-calendar-lite').'
  • '; + elseif($event_status === 'EventMovedOnline') $output .= '
  • '.$this->main->svg('camrecorder').' '.esc_html__('Virtual', 'modern-events-calendar-lite').'
  • '; + + return trim($output) ? '
      '.$output.'
    ' : ''; + } + + public function get_pagination_bar() + { + if($this->pagination === 'loadmore' and $this->found >= $this->limit) + { + return '
    +
    '.esc_html__('Load More', 'modern-events-calendar-lite').'
    +
    '; + } + + if($this->pagination === 'scroll' and $this->found >= $this->limit) + { + return '
    '; + } + + if($this->pagination === 'nextprev' and $this->found >= $this->limit) + { + $offset = $this->end_date.':'.$this->next_offset; + + return '
    + + + '.esc_html__('Prev', 'modern-events-calendar-lite').' + + + '.esc_html__('Next', 'modern-events-calendar-lite').' + + +
    '; + } + + return ''; + } + + /** + * Display Powered By MEC URL + * + * @return string + */ + public function display_credit_url() + { + $status = (isset($this->settings['display_credit_url']) && $this->settings['display_credit_url']); + + // Disabled + if(!$status) return ''; + + // Powered By Feature + return '
    '.sprintf(esc_html__('Powered by %s', 'modern-events-calendar-lite'), 'Modern Events Calendar').'
    '; + } + + /** + * Subscribe + To Calendar + * + * @return string + */ + public function subscribe_to_calendar() + { + if($this->from_full_calendar) return ''; + + $ical_status = isset($this->settings['ical_feed']) && $this->settings['ical_feed']; + if(!$ical_status) return ''; + + $status = isset($this->settings['ical_feed_subscribe_to_calendar']) && $this->settings['ical_feed_subscribe_to_calendar']; + if(!$status) return ''; + + $base_url = trim($this->main->URL(), '/ '); + + $webcal_base_url = str_replace(['http://', 'https://'], 'webcal://', $base_url); + $webcal_feed_url = $webcal_base_url . '/?mec-ical-feed=1'; + + $feed_url = $base_url . '/?mec-ical-feed=1'; + $outlook = 'owa?path=/calendar/action/compose&rru=addsubscription&url=' . $feed_url . '&name=' . get_bloginfo('name') . ' ' . get_the_title($this->id); + + return ''; + } +} diff --git a/app/libraries/syncSchedule.php b/app/libraries/syncSchedule.php new file mode 100755 index 0000000..4ca18b4 --- /dev/null +++ b/app/libraries/syncSchedule.php @@ -0,0 +1,43 @@ + + */ +class MEC_syncSchedule extends MEC_base +{ + private $main; + + public function __construct() + { + $this->main = $this->getMain(); + } + + public function sync() + { + $ix = $this->main->get_ix_options(); + + // To run crons by force + $internal_cron_system = true; + + if(isset($ix['sync_g_import_auto']) and $ix['sync_g_import_auto'] == '1') + { + $sync_g_import = MEC_ABSPATH.'app'.DS.'crons'.DS.'g-import.php'; + if(file_exists($sync_g_import)) include_once $sync_g_import; + } + + if(isset($ix['sync_g_export_auto']) and $ix['sync_g_export_auto'] == '1') + { + $sync_g_export = MEC_ABSPATH.'app'.DS.'crons'.DS.'g-export.php'; + if(file_exists($sync_g_export)) include_once $sync_g_export; + } + + if(isset($ix['sync_meetup_import_auto']) and $ix['sync_meetup_import_auto'] == '1') + { + $sync_meetup_import = MEC_ABSPATH.'app'.DS.'crons'.DS.'meetup-import.php'; + if(file_exists($sync_meetup_import)) include_once $sync_meetup_import; + } + } +} \ No newline at end of file diff --git a/app/libraries/ticketVariations.php b/app/libraries/ticketVariations.php new file mode 100755 index 0000000..cc7db3d --- /dev/null +++ b/app/libraries/ticketVariations.php @@ -0,0 +1,86 @@ + + */ +class MEC_ticketVariations extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + public function item($args) + { + $name_prefix = $args['name_prefix'] ?? 'mec[ticket_variations]'; + $id_prefix = $args['id_prefix'] ?? 'ticket_variation'; + $ticket_variation = $args['value'] ?? []; + $i = $args['i'] ?? ':i:'; + ?> +
    +
    + +
    +
    + + + +
    +
    +
    +

    + + +

    +
    +
    + +
    +
    + + + +
    +
    +
    +

    + + +

    +
    +
    + +
    +
    + +
    +
    +
    +
    +
      +
    • %%ticket_variations__title%%
    • +
    • %%ticket_variations__count%%
    • +
    +
    +
    +
    + + */ +class MEC_tickets extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // Import MEC Main + $this->main = $this->getMain(); + + // MEC Settings + $this->settings = $this->main->get_settings(); + } + + public function builder($args) + { + $object_id = $args['object_id'] ?? null; + $tickets = $args['tickets'] ?? []; + $name_prefix = $args['name_prefix'] ?? 'mec[tickets]'; + $basic_class = $args['basic_class'] ?? 'mec-basvanced-basic'; + $advanced_class = $args['advanced_class'] ?? 'mec-basvanced-advanced w-hidden'; + $price_per_date_display = $args['perice_per_date_display'] ?? true; + + // MEC Main + $main = $this->getMain(); + + // Settings + $settings = $main->get_settings(); + + // This date format used for datepicker + $datepicker_format = (isset($settings['datepicker_format']) and trim($settings['datepicker_format'])) ? $settings['datepicker_format'] : 'Y-m-d'; + + // Private Description + $private_description_status = (!isset($settings['booking_private_description']) || $settings['booking_private_description']); + if(is_admin()) $private_description_status = true; + + // Variations Per Ticket + $variations_per_ticket_status = isset($settings['ticket_variations_per_ticket']) && $settings['ticket_variations_per_ticket']; + if(isset($settings['ticket_variations_status']) and !$settings['ticket_variations_status']) $variations_per_ticket_status = false; + + // Ticket Availability Date + $availability_dates_status = isset($settings['booking_ticket_availability_dates']) && $settings['booking_ticket_availability_dates']; + + // Ticket Times Status + $ticket_times_status = !((isset($settings['disable_ticket_times']) and $settings['disable_ticket_times'])); + + // Family Tickets Status + $family_ticket_status = isset($settings['booking_family_ticket']) && $settings['booking_family_ticket']; + ?> +
    +
    + +
    +
    + $ticket) + { + if(!is_numeric($key)) continue; + $i = max($i, $key); + ?> +
    + +
    :
    +
    + +
    + +
    + +
    + + +
    +
    + + timepicker(array( + 'method' => ($settings['time_format'] ?? 12), + 'time_hour' => ($ticket['ticket_start_time_hour'] ?? 8), + 'time_minutes' => ($ticket['ticket_start_time_minute'] ?? 0), + 'time_ampm' => ($ticket['ticket_start_time_ampm'] ?? 'AM'), + 'name' => $name_prefix.'['.esc_attr($key).']', + 'hour_key' => 'ticket_start_time_hour', + 'minutes_key' => 'ticket_start_time_minute', + 'ampm_key' => 'ticket_start_time_ampm', + 'include_h0' => true, + )); ?> +
    +
    + + timepicker(array( + 'method' => ($settings['time_format'] ?? 12), + 'time_hour' => ($ticket['ticket_end_time_hour'] ?? 6), + 'time_minutes' => ($ticket['ticket_end_time_minute'] ?? 0), + 'time_ampm' => ($ticket['ticket_end_time_ampm'] ?? 'PM'), + 'name' => $name_prefix.'['.esc_attr($key).']', + 'hour_key' => 'ticket_end_time_hour', + 'minutes_key' => 'ticket_end_time_minute', + 'ampm_key' => 'ticket_end_time_ampm', + )); ?> +
    +
    + + +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    + +
    + + + +
    +
    +

    +

    +
    + +
    +
    + + + +
    +
    +

    +

    +
    + +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +

    +
    +
    + +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +

    +
    +
    + +
    +
    +
    + + +
    +
    +
    +

    +
    +
    + +
    +
    +
    +
    + + + + ', + '', + ob_get_clean(), + '', + '' + ); ?> +
    +
    + +
    + +
    +
    +
    + +
    +
    + + $price_date) : + if (!is_numeric($p)) { + continue; + } + $j = max($j, $p); + ?> +
    +
    + + + + + +
    +
    + + +
    + +
    +
    +
    + + + + + +
    +
    +
    +
    + + + + getTicketVariations(); + ?> +
    +
    +

    +
    +
    + +
    +
    +
    + +
    +
    + $ticket_variation) + { + if(!is_numeric($tvk)) continue; + + $tvi = max($tvi, $tvk); + $TicketVariations->item(array( + 'name_prefix' => $name_prefix.'['.esc_attr($key).'][variations]', + 'id_prefix' => 'variation_per_ticket'.esc_attr($key), + 'i' => $tvi, + 'value' => $ticket_variation, + )); + } + ?> +
    +
    +
    +
    + item(array( + 'name_prefix' => $name_prefix.'['.esc_attr($key).'][variations]', + 'id_prefix' => 'variation_per_ticket'.esc_attr($key), + 'i' => ':v:', + 'value' => array(), + )); + ?> +
    +
    +
    + + + + +
    +
    +
    +


    +

    +
    + + +
    +
    +
    + + +
    + +
    + +
    + +
    +
    + +
    : :i:
    +
    + +
    +
    + +
    + +
    +
    + + timepicker(array( + 'method' => ($settings['time_format'] ?? 12), + 'time_hour' => 8, + 'time_minutes' => 0, + 'time_ampm' => 'AM', + 'name' => $name_prefix.'[:i:]', + 'hour_key' => 'ticket_start_time_hour', + 'minutes_key' => 'ticket_start_time_minute', + 'ampm_key' => 'ticket_start_time_ampm', + 'include_h0' => true, + )); ?> +
    +
    + + timepicker(array( + 'method' => ($settings['time_format'] ?? 12), + 'time_hour' => 6, + 'time_minutes' => 0, + 'time_ampm' => 'PM', + 'name' => $name_prefix.'[:i:]', + 'hour_key' => 'ticket_end_time_hour', + 'minutes_key' => 'ticket_end_time_minute', + 'ampm_key' => 'ticket_end_time_ampm', + )); ?> +
    +
    + +
    + +
    + +
    + + +
    +
    +

    +
    + +
    +
    + +
    + + + +
    +
    +

    +

    +
    + +
    +
    + + + +
    +
    +

    +

    +
    + +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +

    +
    +
    + +
    + + + +
    +
    +
    +
    + + +
    +
    +
    +

    +
    +
    + +
    +
    +
    + + +
    +
    +
    +

    +
    +
    + +
    +
    +
    +
    + + + + ', + '', + ob_get_clean(), + '', + '' + ); ?> +
    +
    + +
    + +
    +
    +

    + +
    +
    +
    + +
    +
    +
    + + + + + +
    +
    +
    +
    + + + + getTicketVariations(); + ?> +
    +
    +

    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    + item(array( + 'name_prefix' => $name_prefix.'[:i:][variations]', + 'id_prefix' => 'variation_per_ticket:i:', + 'i' => ':v:', + 'value' => array(), + )); + ?> +
    +
    +
    + + + +
    +
    +
    +


    +

    +
    + + +
    +
    +
    + + +
    +
    + + */ +class MEC_transaction extends MEC_base +{ + public $transaction_id; + public $transaction; + public $settings; + public $ml_settings; + + /** + * @var MEC_book + */ + private $book; + + /** + * @var MEC_Main + */ + private $main; + + /** + * Constructor method + * @author Webnus + * @param $transaction_id + */ + public function __construct($transaction_id) + { + $this->main = $this->getMain(); + $this->transaction_id = $transaction_id; + $this->settings = $this->main->get_settings(); + $this->ml_settings = $this->main->get_ml_settings(); + + $this->book = $this->getBook(); + $this->transaction = $this->book->get_transaction($transaction_id); + } + + public function get_total() + { + return $this->transaction['total'] ?? NULL; + } + + public function get_discount() + { + return $this->transaction['discount'] ?? NULL; + } + + public function get_price() + { + return $this->transaction['price'] ?? 0; + } + + public function get_payable() + { + return $this->transaction['payable'] ?? 0; + } + + public function get_price_html() + { + $total = $this->get_total(); + $payable = $this->get_payable(); + + if($total == $payable) return ''.esc_html($this->render_price($payable)).''; + else return ''.esc_html($this->render_price($total)).'
    '.esc_html($this->render_price($payable)).'
    '; + } + + public function render_price($amount) + { + return $this->main->render_price($amount, $this->get_event_id()); + } + + public function is_free() + { + return !$this->get_payable(); + } + + public function get_event_id() + { + return $this->transaction['event_id'] ?? 0; + } + + public function get_array() + { + return $this->transaction; + } + + /** + * @return WP_Post + */ + public function get_event() + { + return get_post($this->get_event_id()); + } + + public function get_event_link() + { + $event = $this->get_event(); + return ''.MEC_kses::element($event->post_title).''; + } + + public function get_event_featured_image() + { + $event = $this->get_event(); + return get_the_post_thumbnail($event); + } + + public function get_tickets() + { + $tickets = ((isset($this->transaction['tickets']) and is_array($this->transaction['tickets'])) ? $this->transaction['tickets'] : array()); + + // Remove Useless Key + if(isset($tickets['attachments'])) unset($tickets['attachments']); + + return $tickets; + } + + public function get_event_tickets() + { + $tickets = get_post_meta($this->get_event_id(), 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + return $tickets; + } + + public function get_tickets_html() + { + $html = '
      '; + $event_tickets = $this->get_event_tickets(); + + $tickets = $this->get_tickets(); + $rendered = []; + + foreach($tickets as $t) + { + $ticket_id = $t['id']; + + $ticket = $event_tickets[$ticket_id] ?? []; + $count = $t['count']; + + if(!isset($rendered[$ticket_id])) $rendered[$ticket_id] = ['count' => 0, 'names' => []]; + + $rendered[$ticket_id]['name'] = $ticket['name']; + $rendered[$ticket_id]['count'] += $count; + $rendered[$ticket_id]['names'][] = $t['name']; + } + + foreach($rendered as $ticket_id => $row) + { + $names = array_unique($row['names']); + + $names_html = ''; + foreach($names as $name) $names_html .= '
      '.esc_html(stripslashes($name)).'
      '; + + $html .= '
    • '.esc_html(stripslashes($row['name'])).($row['count'] > 1 ? esc_html(' ('.$row['count'].')') : '').'
      '.$names_html.'
    • '; + } + + $html .= '
    '; + return $html; + } + + public function get_dates() + { + $all_dates = (isset($this->transaction['all_dates']) and is_array($this->transaction['all_dates'])) ? $this->transaction['all_dates'] : []; + $date = $this->transaction['date'] ?? NULL; + + return (count($all_dates) ? $all_dates : array($date)); + } + + public function get_dates_html() + { + $html = '
      '; + + $date_format = (isset($this->ml_settings['booking_date_format1']) and trim($this->ml_settings['booking_date_format1'])) ? $this->ml_settings['booking_date_format1'] : get_option('date_format'); + $time_format = get_option('time_format'); + + $timestamps = $this->get_dates(); + foreach($timestamps as $timestamp) + { + if(!$timestamp) continue; + $times = explode(':', $timestamp); + + $html .= '
    • '.sprintf(esc_html__('%s to %s', 'modern-events-calendar-lite'), $this->main->date_i18n($date_format.' '.$time_format, $times[0]), $this->main->date_i18n($date_format.' '.$time_format, $times[1])).'
    • '; + } + + $html .= '
    '; + return $html; + } + + public function get_coupon() + { + return $this->transaction['coupon'] ?? NULL; + } + + public function get_price_details() + { + return (isset($this->transaction['price_details']) and is_array($this->transaction['price_details'])) ? $this->transaction['price_details'] : []; + } + + public function get_price_details_html() + { + $price_details = $this->get_price_details(); + + $html = '
      '; + foreach($price_details['details'] as $detail) + { + $html .= '
    • + '.esc_html($detail['description']).' + '.MEC_kses::element($this->main->render_price($detail['amount'], $this->get_event_id())).' +
    • '; + } + + $html .= '
    '; + return $html; + } +} \ No newline at end of file diff --git a/app/libraries/user.php b/app/libraries/user.php new file mode 100755 index 0000000..76f9c64 --- /dev/null +++ b/app/libraries/user.php @@ -0,0 +1,249 @@ + + */ +class MEC_user extends MEC_base +{ + /** + * @var MEC_main + */ + public $main; + + /** + * @var MEC_db + */ + public $db; + + /** + * @var array + */ + public $settings; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Main library + $this->main = $this->getMain(); + + // MEC DB Library + $this->db = $this->getDB(); + + // MEC settings + $this->settings = $this->main->get_settings(); + } + + public function register($attendee, $args) + { + $name = $attendee['name'] ?? ''; + $raw = (isset($attendee['reg']) and is_array($attendee['reg'])) ? $attendee['reg'] : []; + + $email = $attendee['email'] ?? ''; + if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false; + + $reg = []; + foreach($raw as $k => $v) $reg[$k] = (is_array($v) ? $v : stripslashes($v)); + + $existed_user_id = $this->main->email_exists($email); + + // User already exist + if($existed_user_id !== false) + { + // Map Data + $event_id = $args['event_id'] ?? 0; + if($event_id) $this->save_mapped_data($event_id, $existed_user_id, $reg); + + return $existed_user_id; + } + + // Update WordPress user first name and last name + if(strpos($name, ',') !== false) $ex = explode(',', $name); + else $ex = explode(' ', $name); + + $first_name = $ex[0] ?? ''; + $last_name = ''; + + if(isset($ex[1])) + { + unset($ex[0]); + $last_name = implode(' ', $ex); + } + + // Register in MEC + $MEC_method = isset($args['register_in_mec']) && $args['register_in_mec']; + + // Registration is disabled + if($MEC_method || (isset($this->settings['booking_registration']) && !$this->settings['booking_registration'])) + { + $existed_user_id = $this->db->select("SELECT `id` FROM `#__mec_users` WHERE `email`='".$this->db->escape($email)."'", 'loadResult'); + + // User already exist + if($existed_user_id) return $existed_user_id; + + $now = date('Y-m-d H:i:s'); + $user_id = (int) $this->db->q("INSERT INTO `#__mec_users` (`first_name`,`last_name`,`email`,`reg`,`created_at`,`updated_at`) VALUES ('".$this->db->escape($first_name)."','".$this->db->escape($last_name)."','".$this->db->escape($email)."','".$this->db->escape(json_encode($reg))."','".$now."','".$now."')", "INSERT"); + + // Make sure we won't create MEC users with id lower than 1 million + // To avoid conflicts with wp users of course + if($user_id < 1000000) + { + $new_id = $user_id + 1000000; + $this->db->q("UPDATE `#__mec_users` SET `id`='".esc_sql($new_id)."' WHERE `id`='".esc_sql($user_id)."'"); + + $user_id = $new_id; + } + } + else + { + $username = $email; + $password = wp_generate_password(12, true, true); + $auto = true; + + if(isset($args['username']) and trim($args['username'])) $username = $args['username']; + if(isset($args['password']) and trim($args['password'])) + { + $password = $args['password']; + $auto = false; + } + + if ( ! validate_username( $username ) ) { + $username = 'user-' . mt_rand( 100000000, 999999999999 ); + while( username_exists( $username ) ) { + $username = 'user-' . mt_rand( 100000000, 999999999999 ); + } + } + + $user_id = $this->main->register_user($username, $email, $password, $auto); + + $user = new stdClass(); + $user->ID = $user_id; + $user->first_name = $first_name; + $user->last_name = $last_name; + + wp_update_user($user); + update_user_meta($user_id, 'mec_name', $name); + update_user_meta($user_id, 'mec_reg', $reg); + update_user_meta($user_id, 'nickname', $name); + + // Map Data + $event_id = $args['event_id'] ?? 0; + if($event_id) $this->save_mapped_data($event_id, $user_id, $reg); + + // Set the User Role + $role = (isset($this->settings['booking_user_role']) and trim($this->settings['booking_user_role'])) ? $this->settings['booking_user_role'] : 'subscriber'; + + $wpuser = new WP_User($user_id); + $wpuser->set_role($role); + } + + return $user_id; + } + + public function save_mapped_data($event_id, $user_id, $reg) + { + $reg_fields = $this->main->get_reg_fields($event_id); + + foreach($reg as $reg_id => $reg_value) + { + $reg_field = $reg_fields[$reg_id] ?? []; + if(isset($reg_field['mapping']) and trim($reg_field['mapping'])) + { + $reg_value = maybe_unserialize($reg_value); + $meta_value = is_array($reg_value) ? implode(',', $reg_value) : $reg_value; + + update_user_meta($user_id, $reg_field['mapping'], $meta_value); + } + } + } + + public function assign($booking_id, $user_id) + { + // Registration is disabled + if(isset($this->settings['booking_registration']) and !$this->settings['booking_registration'] and !get_user_by('ID', $user_id)) update_post_meta($booking_id, 'mec_user_id', $user_id); + else update_post_meta($booking_id, 'mec_user_id', 'wp'); + } + + public function get($id) + { + // Registration is disabled + if(isset($this->settings['booking_registration']) and !$this->settings['booking_registration']) + { + $user = $this->mec($id); + if(!$user) $user = $this->wp($id); + } + else + { + $user = $this->wp($id); + if(!$user) $user = $this->mec($id); + } + + return $user; + } + + public function mec($id) + { + $data = $this->db->select("SELECT * FROM `#__mec_users` WHERE `id`=".((int) $id), 'loadObject'); + if(!$data) return NULL; + + $user = new stdClass(); + $user->ID = $data->id; + $user->first_name = stripslashes($data->first_name); + $user->last_name = stripslashes($data->last_name); + $user->display_name = trim(stripslashes($data->first_name).' '.stripslashes($data->last_name)); + $user->email = $data->email; + $user->user_email = $data->email; + $user->user_registered = $data->created_at; + $user->data = $user; + + return $user; + } + + public function wp($id) + { + return get_userdata($id); + } + + public function booking($id) + { + $mec_user_id = get_post_meta($id, 'mec_user_id', true); + if(trim($mec_user_id) and is_numeric($mec_user_id)) return $this->mec($mec_user_id); + + return $this->wp(get_post($id)->post_author); + } + + public function by_email($email) + { + return $this->get($this->id('email', $email)); + } + + public function id($field, $value) + { + $id = NULL; + + // Registration is disabled + if(isset($this->settings['booking_registration']) and !$this->settings['booking_registration']) + { + $id = $this->db->select("SELECT `id` FROM `#__mec_users` WHERE `".$field."`='".$this->db->escape($value)."'", 'loadResult'); + if(!$id) + { + $user = get_user_by($field, $value); + if(isset($user->ID)) $id = $user->ID; + } + } + else + { + $user = get_user_by($field, $value); + if(isset($user->ID)) $id = $user->ID; + + if(!$id) $id = $this->db->select("SELECT `id` FROM `#__mec_users` WHERE `".$field."`='".$this->db->escape($value)."'", 'loadResult'); + } + + return $id; + } +} \ No newline at end of file diff --git a/app/libraries/walker.php b/app/libraries/walker.php new file mode 100755 index 0000000..a1bc1a8 --- /dev/null +++ b/app/libraries/walker.php @@ -0,0 +1,166 @@ + + */ +class MEC_walker extends Walker +{ + public $tree_type = 'category'; + public $db_fields = [ + 'parent' => 'parent', + 'id' => 'term_id', + ]; + + public $mec_id = []; + public $mec_include = []; + public $mec_exclude = []; + + /** + * Constructor method + * @param array $params + * @author Webnus + */ + public function __construct($params = []) + { + $this->mec_id = $params['id'] ?? ''; + $this->mec_include = $params['include'] ?? []; + $this->mec_exclude = $params['exclude'] ?? []; + } + + /** + * Starts the list before the elements are added. + * + * @see Walker:start_lvl() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function start_lvl(&$output, $depth = 0, $args = array()) + { + $indent = str_repeat("\t", $depth); + $output .= "$indent
      \n"; + } + + /** + * Ends the list of after the elements are added. + * + * @see Walker::end_lvl() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function end_lvl(&$output, $depth = 0, $args = array()) + { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + /** + * Start the element output. + * + * @see Walker::start_el() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param WP_Term $data_object The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. @see wp_terms_checklist() + * @param int $current_object_id ID of the current term. + */ + public function start_el(&$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0) + { + // Term is not Included + if(is_array($this->mec_include) and count($this->mec_include) and !in_array($data_object->term_id, $this->mec_include)) return; + + // Term is Excluded + if(is_array($this->mec_exclude) and count($this->mec_exclude) and in_array($data_object->term_id, $this->mec_exclude)) return; + + if(empty($args['taxonomy'])) $taxonomy = 'category'; + else $taxonomy = $args['taxonomy']; + + $args['popular_cats'] = !empty($args['popular_cats']) ? array_map('intval', $args['popular_cats']) : []; + $class = in_array($data_object->term_id, $args['popular_cats'], true) ? ' class="popular-category"' : ''; + $args['selected_cats'] = !empty($args['selected_cats']) ? array_map('intval', $args['selected_cats']) : []; + + $is_selected = in_array($data_object->term_id, $args['selected_cats'], true); + $selected = selected( $is_selected, true, false ); + + $output .= "\n'; + } + + /** + * Ends the element output, if needed. + * + * @param string $output Used to append additional content (passed by reference). + * @param WP_Term $data_object The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. + * @see Walker::end_el() + * + * @since 2.5.1 + * + * @see wp_terms_checklist() + */ + public function end_el(&$output, $data_object, $depth = 0, $args = array()) + { + $output .= ""; + } + + /** + * @param WP_Term $element + * @param $children_elements + * @param $max_depth + * @param $depth + * @param $args + * @param $output + * @return void + */ + public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) + { + if (!$element) { + return; + } + + $id_field = $this->db_fields['id']; + $id = $element->$id_field; + + // Display this element. + $this->has_children = ! empty( $children_elements[ $id ] ); + if ( isset( $args[0] ) && is_array( $args[0] ) ) { + $args[0]['has_children'] = $this->has_children; // Back-compat. + } + + $this->start_el( $output, $element, $depth, ...array_values( $args ) ); + + // End this element. + $this->end_el( $output, $element, $depth, ...array_values( $args ) ); + } + + public function walk( $elements, $max_depth, ...$args ) + { + $output = ''; + return $output; + } +} \ No newline at end of file diff --git a/app/libraries/wc.php b/app/libraries/wc.php new file mode 100755 index 0000000..0667e65 --- /dev/null +++ b/app/libraries/wc.php @@ -0,0 +1,549 @@ + + */ +class MEC_wc extends MEC_base +{ + public $ticket_names = []; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + } + + /** + * @throws WC_Data_Exception + * @throws Exception + */ + public function cart($event_id, $date, $other_dates, $tickets, $transaction_id = NULL) + { + $translated_event_id = (isset($_REQUEST['translated_event_id']) ? sanitize_text_field($_REQUEST['translated_event_id']) : 0); + if(!trim($translated_event_id)) $translated_event_id = $event_id; + + $dates = array($date); + if(is_array($other_dates) and count($other_dates)) $dates = array_merge($dates, $other_dates); + + $db = $this->getDB(); + + // Added to cart after ticket selection + if(!$transaction_id) + { + foreach($tickets as $ticket_id => $count) + { + if(trim($ticket_id) == '') continue; + + $ticket_key = $translated_event_id.':'.$ticket_id; + + // Get Product ID + $product_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_ticket' AND `meta_value`='".$ticket_key."'", 'loadResult'); + + // Create Product if Doesn't Exist + if(!$product_id) $product_id = $this->create($translated_event_id, $ticket_id); + // Update Existing Product + else $this->update($product_id, $translated_event_id, $ticket_id); + + // Add to Cart + WC()->cart->add_to_cart($product_id, ($count * max(1, count($dates))), 0, array(), array( + 'mec_event_id' => $event_id, + 'mec_date' => $date, + 'mec_other_dates' => $other_dates, + )); + + // Add to Ticket Names + $this->ticket_names[] = $this->get_ticket_name($product_id); + } + } + // Added to cart after MEC booking form + else + { + foreach($tickets as $info) + { + $ticket_id = $info['id'] ?? ''; + if(trim($ticket_id) == '') continue; + + $ticket_key = $translated_event_id.':'.$ticket_id; + + // Get Product ID + $product_id = $db->select("SELECT `post_id` FROM `#__postmeta` WHERE `meta_key`='mec_ticket' AND `meta_value`='".$ticket_key."'", 'loadResult'); + + // Create Product if Doesn't Exist + if(!$product_id) $product_id = $this->create($translated_event_id, $ticket_id); + // Update Existing Product + else $this->update($product_id, $translated_event_id, $ticket_id); + + // Ticket Count + $count = $info['count'] ?? 1; + + // Add to Cart + WC()->cart->add_to_cart($product_id, ($count * max(1, count($dates))), 0, array(), array( + 'mec_event_id' => $event_id, + 'mec_date' => $date, + 'mec_other_dates' => $other_dates, + 'mec_transaction_id' => $transaction_id, + )); + + // Add to Ticket Names + $this->ticket_names[] = $this->get_ticket_name($product_id); + } + } + + return $this; + } + + public function next() + { + // Main + $main = $this->getMain(); + + // MEC Settings + $settings = $main->get_settings(); + + // Checkout URL + if(isset($settings['wc_after_add']) and $settings['wc_after_add'] == 'checkout') return array('type' => 'url', 'url' => wc_get_checkout_url()); + // Optional Checkout URL + if(isset($settings['wc_after_add']) and $settings['wc_after_add'] == 'optional_cart') return array('type' => 'message', 'message' => '
    '); + // Optional Cart URL + if(isset($settings['wc_after_add']) and $settings['wc_after_add'] == 'optional_chckout') return array('type' => 'message', 'message' => '
    '); + // Cart URL + else return array('type' => 'url', 'url' => wc_get_cart_url()); + } + + /** + * @throws WC_Data_Exception + */ + public function create($event_id, $ticket_id) + { + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + $ticket = $tickets[$ticket_id] ?? []; + + $product = new WC_Product(); + $product->set_name(get_the_title($event_id).': '.$ticket['name']); + $product->set_description($ticket['description']); + $product->set_short_description(get_the_title($event_id)); + $product->set_regular_price($ticket['price']); + $product->set_price($ticket['price']); + $product->set_catalog_visibility('hidden'); + $product->set_virtual(true); + + $product_id = $product->save(); + + // Set the relation + update_post_meta($product_id, 'mec_ticket', $event_id.':'.$ticket_id); + + // Trigger Action + do_action('mec_wc_product_created', $product_id, $event_id, $ticket_id); + + return $product_id; + } + + /** + * @throws WC_Data_Exception + */ + public function update($product_id, $event_id, $ticket_id) + { + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + $ticket = $tickets[$ticket_id] ?? []; + + $product = new WC_Product($product_id); + $product->set_name(get_the_title($event_id).': '.$ticket['name']); + $product->set_description($ticket['description']); + $product->set_short_description(get_the_title($event_id)); + $product->set_regular_price($ticket['price']); + $product->set_price($ticket['price']); + $product->set_catalog_visibility('hidden'); + + // Trigger Action + do_action('mec_wc_product_updated', $product_id, $event_id, $ticket_id); + + return $product->save(); + } + + /** + * @throws Exception + */ + public function meta($item_id, $item) + { + if($item instanceof WC_Order_Item_Product) + { + if(isset($item->legacy_values['mec_event_id'])) wc_add_order_item_meta($item_id, 'mec_event_id', $item->legacy_values['mec_event_id']); + if(isset($item->legacy_values['mec_date'])) wc_add_order_item_meta($item_id, 'mec_date', $item->legacy_values['mec_date']); + if(isset($item->legacy_values['mec_other_dates'])) wc_add_order_item_meta($item_id, 'mec_other_dates', implode(',', $item->legacy_values['mec_other_dates'])); + if(isset($item->legacy_values['mec_transaction_id'])) wc_add_order_item_meta($item_id, 'mec_transaction_id', $item->legacy_values['mec_transaction_id']); + } + } + + /** + * @throws Exception + */ + public function get_event_id($order_id) + { + $event_id = 0; + $order = wc_get_order($order_id); + + $items = $order->get_items(); + foreach($items as $item_id => $item) + { + $meta = wc_get_order_item_meta($item_id, 'mec_event_id'); + if(trim($meta)) + { + $event_id = $meta; + break; + } + } + + return $event_id; + } + + /** + * @throws Exception + */ + public function paid($order_id) + { + if(!$order_id) return; + + // Main + $main = $this->getMain(); + + // MEC Settings + $settings = $main->get_settings(); + + // Auto Complete + $autocomplete = !isset($settings['wc_autoorder_complete']) || $settings['wc_autoorder_complete']; + + // Auto Order Complete is not Enabled + if(!$autocomplete) return; + + // It is not a MEC Order + if(!$this->get_event_id($order_id)) return; + + $order = wc_get_order($order_id); + + $status = $order->get_status(); + if($status === 'processing') $order->update_status('completed'); + } + + /** + * @throws Exception + */ + public function completed($order_id) + { + $created_booking_ids = get_post_meta($order_id, 'mec_booking_ids', true); + if(!is_array($created_booking_ids)) $created_booking_ids = []; + + // It's already done + if(count($created_booking_ids) == 1 and get_post($created_booking_ids[0])) return false; + if(count($created_booking_ids) > 1) return false; + + $event_id = $this->get_event_id($order_id); + + // It is not a MEC Order + if(!$event_id) return false; + + // WC order + $order = wc_get_order($order_id); + + // MEC Order + $mec = []; + $original_bought_tickets = []; + + $items = $order->get_items(); + foreach($items as $item_id => $item) + { + $event_id = wc_get_order_item_meta($item_id, 'mec_event_id'); + $date = wc_get_order_item_meta($item_id, 'mec_date'); + $transaction_id = wc_get_order_item_meta($item_id, 'mec_transaction_id'); + + $other_dates_meta = wc_get_order_item_meta($item_id, 'mec_other_dates'); + $other_dates = []; + + if(is_string($other_dates_meta) and trim($other_dates_meta)) $other_dates = explode(',', $other_dates_meta); + elseif(is_array($other_dates_meta)) $other_dates = $other_dates_meta; + + $dates = array($date); + if(is_array($other_dates)) $dates = array_merge($dates, $other_dates); + + if(!trim($event_id) or !trim($date)) continue; + if(!isset($mec[$event_id])) $mec[$event_id] = []; + + $product_id = $item->get_product_id(); + + $key = get_post_meta($product_id, 'mec_ticket', true); + if(!trim($key)) continue; + + list($e, $mec_ticket_id) = explode(':', $key); + + $product_ids = []; + for($i = 1; $i <= ($item->get_quantity() / count($dates)); $i++) + { + $product_ids[] = $product_id; + + if(!isset($original_bought_tickets[$event_id])) $original_bought_tickets[$event_id] = []; + if(!isset($original_bought_tickets[$event_id][$mec_ticket_id])) $original_bought_tickets[$event_id][$mec_ticket_id] = 1; + else $original_bought_tickets[$event_id][$mec_ticket_id] += 1; + } + + $booking_key = $date.'-'.implode(',', $dates).'-'.$transaction_id; + if(isset($mec[$event_id][$booking_key], $mec[$event_id][$booking_key]['product_ids']) and is_array($mec[$event_id][$booking_key]['product_ids'])) + { + $mec[$event_id][$booking_key]['product_ids'] = array_merge($mec[$event_id][$booking_key]['product_ids'], $product_ids); + } + else + { + $mec[$event_id][$booking_key] = array( + 'date' => $date, + 'other_dates' => $other_dates, + 'transaction_id' => $transaction_id, + 'product_ids' => $product_ids, + ); + } + } + + if(!count($mec)) return false; + + // Libraries + $main = $this->getMain(); + $book = $this->getBook(); + $gateway = new MEC_gateway_woocommerce(); + + // MEC User + $u = $this->getUser(); + + // Create Bookings + $book_ids = []; + foreach($mec as $event_id => $bs) + { + foreach($bs as $b) + { + $bought_tickets = $original_bought_tickets[$event_id]; + $transaction_id = $b['transaction_id'] ?? 0; + + $date = $b['date']; + $other_dates = (isset($b['other_dates']) and is_array($b['other_dates'])) ? $b['other_dates'] : []; + + $all_dates = []; + if(count($other_dates)) $all_dates = array_merge(array($date), $other_dates); + + $timestamps = count($all_dates) ? $all_dates : array($date); + $event_tickets = get_post_meta($event_id, 'mec_tickets', true); + + $tickets = []; + if(!$transaction_id) + { + $product_ids = $b['product_ids']; + + $raw_tickets = []; + foreach($product_ids as $product_id) + { + $key = get_post_meta($product_id, 'mec_ticket', true); + if(!trim($key)) continue; + + list($e, $mec_ticket_id) = explode(':', $key); + + if(!isset($raw_tickets[$mec_ticket_id])) $raw_tickets[$mec_ticket_id] = 1; + else $raw_tickets[$mec_ticket_id] += 1; + + $ticket = []; + $ticket['name'] = $order->get_formatted_billing_full_name(); + $ticket['email'] = $order->get_billing_email(); + $ticket['id'] = $mec_ticket_id; + $ticket['count'] = 1; + $ticket['reg'] = []; + $ticket['variations'] = []; + + $tickets[] = $ticket; + } + + // Calculate price of bookings + $price_details = $book->get_price_details($raw_tickets, $event_id, $event_tickets, array(), $timestamps, false); + + $booking = []; + $booking['tickets'] = $tickets; + $booking['first_for_all'] = 1; + $booking['date'] = $date; + $booking['all_dates'] = $all_dates; + $booking['other_dates'] = $other_dates; + $booking['timestamps'] = $timestamps; + $booking['event_id'] = $event_id; + $booking['price_details'] = $price_details; + $booking['total'] = $price_details['total']; + $booking['discount'] = 0; + $booking['price'] = $price_details['total']; + $booking['payable'] = $price_details['total']; + $booking['coupon'] = NULL; + + // Save Transaction + $transactionObject = new \MEC\Transactions\Transaction( 0, $booking ); + $transaction_id = $transactionObject->update_data(); + } + + // Transaction + $transaction = $book->get_transaction($transaction_id); + + // Calculate price of bookings + $price_details = $book->get_price_details($original_bought_tickets[$event_id], $event_id, $event_tickets, array(), $timestamps, false); + + $transaction['price_details'] = $price_details; + $transaction['total'] = $price_details['total']; + $transaction['price'] = $price_details['total']; + $transaction['payable'] = $price_details['total']; + + $book->update_transaction($transaction_id, $transaction); + + // Apply Coupon + $coupons = $order->get_coupon_codes(); + if(count($coupons)) + { + $wc_discount = $order->get_total_discount(); + $wc_before_discount = $order->get_subtotal(); + + $mec_before_discount = $transaction['total']; + $mec_discount = round((($mec_before_discount * $wc_discount) / $wc_before_discount), 2); + + $transaction['price_details']['details'][] = array( + 'amount' => $mec_discount, + 'description' => esc_html__('Discount by WC Coupon', 'modern-events-calendar-lite'), + 'type' => 'discount', + 'coupon' => implode(', ', $coupons) + ); + + $transaction['discount'] = $mec_discount; + $transaction['price'] = $mec_before_discount - $mec_discount; + $transaction['payable'] = $mec_before_discount - $mec_discount; + $transaction['coupon'] = implode(', ', $coupons); + + $book->update_transaction($transaction_id, $transaction); + } + + // Attendees + $attendees = $transaction['tickets'] ?? $tickets; + + $attention_date = $transaction['date'] ?? ''; + $attention_times = explode(':', $attention_date); + $date = date('Y-m-d H:i:s', trim($attention_times[0])); + + $ticket_ids = ''; + $attendees_info = []; + + $bought_attendees = []; + foreach($attendees as $i => $attendee) + { + if(!is_numeric($i)) continue; + + $attendee_ticket_id = $attendee['id']; + + if(!isset($bought_tickets[$attendee_ticket_id])) continue; + + $bought_tickets[$attendee_ticket_id] -= 1; + if($bought_tickets[$attendee_ticket_id] == 0) unset($bought_tickets[$attendee_ticket_id]); + + $bought_attendees[] = $attendee; + + $ticket_ids .= $attendee_ticket_id . ','; + if(!array_key_exists($attendee['email'], $attendees_info)) $attendees_info[$attendee['email']] = ['count' => $attendee['count']]; + else $attendees_info[$attendee['email']]['count'] = ($attendees_info[$attendee['email']]['count'] + $attendee['count']); + } + + if(isset($transaction['attachments']) && count($transaction['attachments'])) + { + $bought_attendees['attachments'] = $transaction['attachments']; + } + + // Update Transaction + $transaction['tickets'] = $bought_attendees; + $transaction['order_id'] = $order_id; + $book->update_transaction($transaction_id, $transaction); + + // Apply only those attendees who bought tickets + $attendees = $bought_attendees; + + $main_attendee = $attendees[0] ?? []; + $name = $main_attendee['name'] ?? ''; + + $ticket_ids = ',' . trim($ticket_ids, ', ') . ','; + $user_id = $gateway->register_user($main_attendee, $transaction); + + $book_subject = $name.' - '.($main_attendee['email'] ?? $u->get($user_id)->user_email); + $book_id = $book->add( + array( + 'post_author' => $user_id, + 'post_type' => $main->get_book_post_type(), + 'post_title' => $book_subject, + 'post_date' => $date, + 'attendees_info' => $attendees_info, + 'mec_attendees' => $attendees, + 'mec_gateway' => 'MEC_gateway_woocommerce', + 'mec_gateway_label' => $gateway->title() + ), + $transaction_id, + $ticket_ids + ); + + // Assign User + $u->assign($book_id, $user_id); + + update_post_meta($book_id, 'mec_order_id', $order_id); + + // Add WC coupon code + if(count($coupons)) update_post_meta($book_id, 'mec_coupon_code', implode(', ', $coupons)); + + $book_ids[] = $book_id; + + // Fires after completely creating a new booking + do_action('mec_booking_completed', $book_id); + } + } + + update_post_meta($order_id, 'mec_booking_ids', $book_ids); + + // Redirection + $thankyou_page_id = $main->get_thankyou_page_id($event_id); + if($thankyou_page_id and !is_admin()) + { + $redirect_to = $book->get_thankyou_page($thankyou_page_id, ($transaction_id ?? NULL)); + + wp_redirect($redirect_to); + exit; + } + + return true; + } + + public function cancelled($order_id) + { + $booking_ids = get_post_meta($order_id, 'mec_booking_ids', true); + if(!is_array($booking_ids)) $booking_ids = []; + + // No Related Bookings + if(!count($booking_ids)) return; + + $book = $this->getBook(); + foreach($booking_ids as $booking_id) + { + $book->cancel($booking_id); + $book->reject($booking_id); + } + } + + public function get_ticket_name($product_id) + { + $mec_ticket = get_post_meta($product_id, 'mec_ticket', true); + list($event_id, $ticket_id) = explode(':', $mec_ticket); + + $tickets = get_post_meta($event_id, 'mec_tickets', true); + if(!is_array($tickets)) $tickets = []; + + $ticket = $tickets[$ticket_id] ?? []; + return $ticket['name'] ?? ''; + } +} \ No newline at end of file diff --git a/app/modules/attendees-list/details.php b/app/modules/attendees-list/details.php new file mode 100755 index 0000000..0be2fff --- /dev/null +++ b/app/modules/attendees-list/details.php @@ -0,0 +1,112 @@ +get_settings(); + +// BuddyPress' integration is disabled +if(!isset($settings['bp_status']) || !$settings['bp_status']) return; + +// Attendees Module is disabled +if(!isset($settings['bp_attendees_module']) || !$settings['bp_attendees_module']) return; + +// BuddyPress is not installed or activated +if(!function_exists('is_plugin_active')) +{ + include_once(ABSPATH . 'wp-admin/includes/plugin.php'); +} + +if(!(function_exists('bp_activity_add') || is_plugin_active('buddypress/bp-loader.php'))) return; + +$date = $event->date; +$timestamp = (isset($date['start']) and isset($date['start']['timestamp'])) ? $date['start']['timestamp'] : current_time('timestamp'); + +$limit = $settings['bp_attendees_module_limit'] ?? 30; +$bookings = $this->get_bookings($event->data->ID, $timestamp, $limit); + +// Book Library +$book = $this->getBook(); + +// Start Date belongs to future but booking module cannot show so return without any output +if(!$this->can_show_booking_module($event) and $timestamp > time()) return; + +$attendees = []; +foreach($bookings as $booking) +{ + if(!isset($attendees[$booking->post_author])) $attendees[$booking->post_author] = []; + $attendees[$booking->post_author][] = $booking->ID; +} + +// MEC User +$u = $this->getUser(); +?> +
    +

    + +

    + +
      + $attendee_bookings): ?> +
    • + + get($attendee_id); + + $name = $user->display_name; + if(!$name or is_email($name)) $name = trim($user->first_name.' '.$user->last_name); + + $total_attendees = 0; + foreach($attendee_bookings as $booking_id) $total_attendees += $book->get_total_attendees($booking_id); + ?> + + + +
      + $mec_attendee) + { + if(!is_numeric($mec_attendee_key)) continue; + + $email = $mec_attendee['email'] ?? NULL; + if(!$email) continue; + + if(!isset($un_attendees[$email])) $un_attendees[$email] = $mec_attendee; + else $un_attendees[$email]['count'] += $mec_attendee['count']; + } + } + + // For Display Sorting Output. + foreach($un_attendees as $mec_attendee) + { + ?> +
      + '. get_avatar($mec_attendee['email'], '50') .'
      '; + echo '
      '. (!is_email($mec_attendee['name']) ? $mec_attendee['name'] : 'N/A') .'
      '; + echo ''. sprintf(_n('%s ticket', '%s tickets', $mec_attendee['count'], 'modern-events-calendar-lite'), $mec_attendee['count']) . ''; + ?> +
      + +
    + + + + + \ No newline at end of file diff --git a/app/modules/attendees-list/index.html b/app/modules/attendees-list/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/booking/default.php b/app/modules/booking/default.php new file mode 100755 index 0000000..00f505f --- /dev/null +++ b/app/modules/booking/default.php @@ -0,0 +1,1086 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); +$ml_settings = $this->get_ml_settings(); + +// Booking module is disabled +if(!isset($settings['booking_status']) or (isset($settings['booking_status']) and !$settings['booking_status'])) return; + +// Skip First Step +$skip_step1 = isset($settings['booking_skip_step1']) && $settings['booking_skip_step1']; + +$event = $event[0]; +$uniqueid = !empty($uniqueid) ? apply_filters('mec_booking_uniqueid_value', $uniqueid) : $event->data->ID; + +$tickets = $event->data->tickets ?? []; +$dates = $event->dates ?? $event->date; + +// No Dates +if(!count($dates)) return; + +// No Tickets +if(!count($tickets)) return; + +$display_progress_bar = $this->can_display_booking_progress_bar($settings); + +// Redirect Payment Thank you +$thankyou_message = apply_filters('mec_booking_redirect_payment_thankyou', ''); +if(trim($thankyou_message)) +{ + // Used in Message Template + $message = $thankyou_message; + + include MEC::import('app.modules.booking.steps.message', true, true); + return; +} + +// Abort Booking Module +$abort = apply_filters('mec_booking_module_abort', false, $event); +if($abort !== false) +{ + echo MEC_kses::full($abort); + return; +} + +// Shortcode Options +if(!isset($from_shortcode)) $from_shortcode = false; +if(!isset($ticket_id)) $ticket_id = NULL; + +$book = $this->getBook(); + +// User Booking Limits +list($user_ticket_limit, $user_ticket_unlimited) = $book->get_user_booking_limit($event->data->ID); + +// Generate JavaScript code of Booking Module +$javascript = ''; + +$do_skip = false; +if($skip_step1 and count($tickets) === 1 and count($dates) === 1 and $user_ticket_limit == 1 and !$user_ticket_unlimited) +{ + $do_skip = true; + $javascript .= ''; +} + +$javascript = apply_filters('mec-javascript-code-of-booking-module', $javascript, $uniqueid); + +// Include javascript code into the footer +if($this->is_ajax()) echo ($javascript); +else +{ + $factory = $this->getFactory(); + $factory->params('footer', $javascript); +} +?> +
    + +
    +
    diff --git a/app/modules/booking/index.html b/app/modules/booking/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/booking/steps/checkout.php b/app/modules/booking/steps/checkout.php new file mode 100755 index 0000000..b65bf10 --- /dev/null +++ b/app/modules/booking/steps/checkout.php @@ -0,0 +1,237 @@ +ID; +$requested_event_id = $event->requested_id ?? $event_id; + +$gateways = $this->main->get_gateways(); + +$date_ex = explode(':', $date); +$occurrence = $date_ex[0]; + +$booking_options = get_post_meta($event_id, 'mec_booking', true); +if(!is_array($booking_options)) $booking_options = []; + +$gateway_settings = $this->main->get_gateways_options(); + +$active_gateways = []; +foreach($gateways as $gateway) +{ + if(!$gateway->enabled()) continue; + + // Gateway is disabled per event + if(isset($gateway_settings['gateways_per_event']) and $gateway_settings['gateways_per_event']) + { + if(isset($booking_options['gateways_'.$gateway->id().'_disabled']) and $booking_options['gateways_'.$gateway->id().'_disabled']) continue; + } + + $active_gateways[] = $gateway; + + // When Stripe Connect is enabled and organizer is connected then skip other gateways + if($gateway->id() == 7 and get_user_meta(get_post_field('post_author', $event_id), 'mec_stripe_id', true)) // Stripe Connect + { + $active_gateways = array($gateway); + break; + } +} + +$mecFluentEnable = class_exists('MEC_Fluent\Core\pluginBase\MecFluent') && (isset($this->settings['single_single_style']) and $this->settings['single_single_style'] == 'fluent'); +if($mecFluentEnable) +{ + $ticketsDetails = []; + foreach($raw_tickets as $ticket_id => $count) + { + if(!isset($event_tickets[$ticket_id])) continue; + + $ticketPrice = isset($event_tickets[$ticket_id]['price']) ? $this->book->get_ticket_price($event_tickets[$ticket_id], current_time('Y-m-d'), $event_id, $occurrence) : 0; + $ticketsDetails[$ticket_id]['name'] = $event_tickets[$ticket_id]['name']; + $ticketsDetails[$ticket_id]['count'] = $count; + $ticketsDetails[$ticket_id]['price'] = ($ticketPrice*$count); + } +} + +$first_gateway_id = NULL; + +$free_booking = isset($price_details['total']) && $price_details['total'] == 0; +$paid_booking = !$free_booking; +?> + +
    + + +
      +
    • +
    • +
    • +
    • +
    + +

    + + +
    + + +
    +
    + + + +
    +
    + +
    + + + +
    + +
    +
    + + +
    + +
    + main->svg('form/subtotal-icon'); ?> +
    + + main->render_price($detail['amount'], $requested_event_id)); ?> +
    +
    + +
    + +
    + + main->render_price($price_details['total'], $requested_event_id)); ?> +
    +
    + + +
      + +
    • + main->svg('form/subtotal-icon'); ?> +
      + + main->render_price($detail['amount'], $requested_event_id)); ?> +
      +
    • + +
    + + +
    + + +
    +
    + settings['coupons_status']) and $this->settings['coupons_status']): ?> +
    +
    + + main->svg('form/discount-icon'); ?> + + + + + + +
    +
    +
    + +
    +
    +
      + settings['coupons_status']) and $this->settings['coupons_status']): ?> +
    • + + main->render_price(($price_details['discount'] ?? 0), $requested_event_id, false)); ?> +
    • + +
    • + + main->render_price($price_details['total'], $requested_event_id)); ?> +
    • + getPartialPayment()->is_enabled()): ?> +
    • + + main->render_price($price_details['payable'], $requested_event_id)); ?> +
    • + +
    +
    +
    + + +
    +

    +
    + id(); ?> + + +
    + +
    + +
    + comment()); ?> + checkout_form($transaction_id); ?> +
    + +
    +
    + + + +

    + main->svg('form/lock-icon').' '.esc_html__('Your transaction is secured with SSL encryption.', 'modern-events-calendar-lite'); ?> +

    + + +
    +
    + + + + + + + +
    + +
    +
    +
    + +
    + +
    + + + + +
    diff --git a/app/modules/booking/steps/form.php b/app/modules/booking/steps/form.php new file mode 100755 index 0000000..3a7bd5c --- /dev/null +++ b/app/modules/booking/steps/form.php @@ -0,0 +1,53 @@ +ID; +$requested_event_id = $event->requested_id ?? $event_id; + +$reg_fields = \MEC\Base::get_main()->get_reg_fields($event_id, $translated_event_id); +$bfixed_fields = \MEC\Base::get_main()->get_bfixed_fields($event_id, $translated_event_id); + +$custom_view_fields = apply_filters('mec_have_custom_view_fields', false, $bfixed_fields, 'booking_fixed_fields', $event_id); + +$mainClass = new \MEC_main(); +$set = $mainClass->get_options(); + +if(!$custom_view_fields || + isset($set['default_form']['form_id']) && is_plugin_active('mec-form-builder/mec-form-builder.php')) +{ + \MEC\BookingForm\Attendees::output( + $event, + $date, + $tickets, + $reg_fields, + $bfixed_fields, + $uniqueid, + $all_dates + ); +} +else +{ + do_action( + 'mec_booking_attendee_form_custom_view', + $event, + $event_id, + array( + 'date' => $date, + 'uniqueid' => $uniqueid, + 'tickets' => $tickets, + ) + ); +} + + diff --git a/app/modules/booking/steps/index.html b/app/modules/booking/steps/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/booking/steps/message.php b/app/modules/booking/steps/message.php new file mode 100755 index 0000000..857638c --- /dev/null +++ b/app/modules/booking/steps/message.php @@ -0,0 +1,51 @@ +ID; + +/** @var MEC_main $main */ +$main = $this instanceof MEC_main ? $this : MEC::getInstance('app.libraries.main'); + +// Transaction ID +$transaction_id = $_REQUEST['mec_stripe_redirect_transaction_id'] ?? ''; +if(!trim($transaction_id)) $transaction_id = $_REQUEST['mec_stripe_connect_redirect_transaction_id'] ?? ''; + +$had_payment = false; +if(trim($transaction_id)) +{ + $book = $main->getBook(); + $transaction = $book->get_transaction($transaction_id); + + // Had Payment + if(isset($transaction['total'])) $had_payment = (bool) $transaction['total']; +} +?> +
    + +
      +
    • +
    • + +
    • + +
    • +
    + + +
    + + +
    +
    + +
    +
    + + + + +
    \ No newline at end of file diff --git a/app/modules/booking/steps/tickets.php b/app/modules/booking/steps/tickets.php new file mode 100755 index 0000000..4091e8a --- /dev/null +++ b/app/modules/booking/steps/tickets.php @@ -0,0 +1,330 @@ +ID; + +global $post; +if($post and $post->post_type == $this->get_main_post_type()) $translated_event_id = $post->ID; +else $translated_event_id = $event_id; + +$tickets = isset($event->data->tickets) ? $event->data->tickets : []; +$dates = isset($event->dates) ? $event->dates : array($event->date); + +if(isset($settings['booking_start_from_first_upcoming_date']) && $settings['booking_start_from_first_upcoming_date']) +{ + $maximum_dates = isset($settings['booking_maximum_dates']) && trim($settings['booking_maximum_dates']) ? $settings['booking_maximum_dates'] : 12; + list($occurrence, $occurrence_time) = $this->get_start_date_to_get_event_dates($event_id, current_time('Y-m-d')); + + $dates = $this->getRender()->dates($event_id, $event->data, $maximum_dates, ($occurrence_time ? date('Y-m-d H:i:s', $occurrence_time) : $occurrence)); + $dates = $this->adjust_event_dates_for_booking($event, $dates); +} + +$booking_options = get_post_meta($event_id, 'mec_booking', true); +if(!is_array($booking_options)) $booking_options = []; + +// WC System +$WC_status = (isset($settings['wc_status']) and $settings['wc_status'] and class_exists('WooCommerce')); +$WC_booking_form = (isset($settings['wc_booking_form']) and $settings['wc_booking_form']); + +if($ticket_id) +{ + $new_tickets = []; + foreach($tickets as $t_id => $ticket) + { + if((int) $t_id === (int) $ticket_id) + { + $new_tickets[$t_id] = $ticket; + } + } + + if(count($new_tickets)) $tickets = $new_tickets; +} + +$occurrence_time = $dates[0]['start']['timestamp'] ?? strtotime($dates[0]['start']['date']); + +$default_ticket_number = 0; +if(count($tickets) == 1) $default_ticket_number = 1; + +$book = $this->getBook(); +$availability = $book->get_tickets_availability($event_id, $occurrence_time); + +$date_format = (isset($ml_settings['booking_date_format1']) and trim($ml_settings['booking_date_format1'])) ? $ml_settings['booking_date_format1'] : 'Y-m-d'; +if(isset($event->data->meta['mec_repeat_type']) and $event->data->meta['mec_repeat_type'] === 'custom_days') $date_format .= ' '.get_option('time_format'); + +$midnight_event = $this->is_midnight_event($event); + +$book_all_occurrences = 0; +if(isset($event->data) and isset($event->data->meta) and isset($event->data->meta['mec_booking']) and isset($event->data->meta['mec_booking']['bookings_all_occurrences'])) $book_all_occurrences = (int) $event->data->meta['mec_booking']['bookings_all_occurrences']; + +// User Booking Limits +list($user_ticket_limit, $user_ticket_unlimited) = $book->get_user_booking_limit($event_id); + +// Show Booking Form Interval +$show_booking_form_interval = (isset($settings['show_booking_form_interval'])) ? $settings['show_booking_form_interval'] : 0; +if(isset($booking_options['show_booking_form_interval']) and trim($booking_options['show_booking_form_interval']) != '') $show_booking_form_interval = $booking_options['show_booking_form_interval']; + +if($show_booking_form_interval) +{ + $filtered_dates = []; + foreach($dates as $date) + { + $date_diff = $this->date_diff(date('Y-m-d h:i a', current_time('timestamp')), date('Y-m-d h:i a', $date['start']['timestamp'])); + if(isset($date_diff->days) and !$date_diff->invert) + { + $minute = $date_diff->days * 24 * 60; + $minute += $date_diff->h * 60; + $minute += $date_diff->i; + + if($minute > $show_booking_form_interval) continue; + } + + $filtered_dates[] = $date; + } + + $dates = $filtered_dates; +} + +$available_spots = 0; +$total_spots = -1; +foreach($availability as $ticket_id=>$count) +{ + if(!is_numeric($ticket_id)) + { + $total_spots = $count; + continue; + } + + if($count != '-1') $available_spots += $count; + else + { + $available_spots = -1; + break; + } +} + +if($total_spots > 0) $available_spots = min($available_spots, $total_spots); + +// Date Selection Method +$date_selection = (isset($settings['booking_date_selection']) and trim($settings['booking_date_selection'])) ? $settings['booking_date_selection'] : 'dropdown'; +if(isset($settings['booking_date_selection_per_event']) and $settings['booking_date_selection_per_event'] and isset($booking_options['bookings_date_selection']) and trim($booking_options['bookings_date_selection']) and $booking_options['bookings_date_selection'] !== 'global') +{ + $date_selection = $booking_options['bookings_date_selection']; +} + +// Omit End Dates +$omit_end_dates = isset($settings['booking_omit_end_date']) && $settings['booking_omit_end_date']; + +// Modal Booking +$modal_booking = isset($_GET['method']) && sanitize_text_field($_GET['method']) === 'mec-booking-modal'; +wp_enqueue_script('mec-niceselect-script'); +?> +
    + + +
      +
    • +
    • + +
    • + +
    • +
    • + +
    + +

    data->post->post_title : esc_html__('Book Event', 'modern-events-calendar-lite')); ?>

    + + + 1): ?> +
    + timestamp($dates[0]['start'], $dates[0]['end']); $default_selected_datetime_ex = explode(':', $default_selected_datetime); ?> + + + +
    +
    *
    +
    +
    + svg('form/calendar-icon'); ?> + date_i18n($date_format, $default_selected_datetime_ex[0]); ?> + + svg('form/up-icon'); ?> + svg('form/down-icon'); ?> + +
    +
    display_calendar($event, $uniqueid, $dates[0]['start']['date'], $default_selected_datetime); ?>
    +
    +
    + +
    +
    *
    +
    +
    display_calendar($event, $uniqueid, $dates[0]['start']['date'], $default_selected_datetime); ?>
    +
    +
    + + + +
    +
    date_label($dates[0]['start'], $dates[0]['end'], $date_format, ' - ', false, ($dates[0]['allday'] ?? 0))); ?>
    + +
    + + + + +
    + + + +
    + +
    + +
    +
    + svg('form/calendar-icon'); ?> + +
    +
    +
    + +
    + +
    + +
    date_label($date['start'], $date['end'], $date_format, ' - ', false))."
    "; ?>
    +
    + + + '.MEC_kses::element($this->date_label($dates[0]['start'], $dates[0]['end'], $date_format, ' - ', false)).''; ?> + + + +
    + $ticket): ?> + 0) + { + $maximum_purchase = (int) $ticket['maximum_ticket']; + } + + $ticket_limit = $availability[$ticket_id] ?? -1; + if($ticket_limit === '0' and count($dates) <= 1) continue; + ?> +
    + +
    +
    +
    svg('form/ticket-icon'); ?>
    +
    +
    +
    + + get_ticket_price_label($ticket, current_time('Y-m-d'), $event_id, $occurrence_time) : ''; + $price_label = apply_filters('mec_filter_price_label', $price_label, $ticket, $event_id, $book); + ?> +
    +
    +
    +
    + + +

    + +

    + + +
    m('tickets', esc_html__('Tickets', 'modern-events-calendar-lite')), (($ticket['unlimited'] and $ticket_limit == '-1') ? ''.esc_html__('Unlimited', 'modern-events-calendar-lite').'' : ($ticket_limit != '-1' ? ''.$ticket_limit.'' : ''.esc_html__('Unlimited', 'modern-events-calendar-lite').''))); ?>
    + +
    +
    +

    + + "'.esc_html($ticket['name']).'"' : ''; + $ticket_message_sales = $stop_selling_message ? sprintf($stop_selling_message, $str_replace) : sprintf(esc_html__('The %s ticket sales has ended!', 'modern-events-calendar-lite'), $str_replace); + $ticket_message_sold_out = sprintf(esc_html__('The %s ticket is sold out. You can try another ticket or another date.', 'modern-events-calendar-lite'), $str_replace); + $ticket_message_sold_out_multiple = sprintf(esc_html__('The %s ticket is sold out or not available for some of dates. You can try another ticket or another date.', 'modern-events-calendar-lite'), $str_replace); + ?> + +
    +
    + +
    + + +
    + +
    +
    + +
    + + + +
    + +
    + +
    + + 1)) && $this->getCaptcha()->status('booking')) echo $this->getCaptcha()->field(); ?> + + + + + + + + + + + + '.((!$user_ticket_unlimited and $user_ticket_limit == 1 and count($tickets) == 1) ? 1 : 0).''); ?> + +
    + +
    +
    + + + + diff --git a/app/modules/countdown/details.php b/app/modules/countdown/details.php new file mode 100755 index 0000000..261e38a --- /dev/null +++ b/app/modules/countdown/details.php @@ -0,0 +1,460 @@ +get_settings(); + +// Countdown on single page is disabled +if (!isset($settings['countdown_status']) || !$settings['countdown_status']) return; + +$event = $event[0]; +$date = $event->date; + +$start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : current_time('Y-m-d'); +$end_date = (isset($date['end']) and isset($date['end']['date'])) ? $date['end']['date'] : current_time('Y-m-d'); + +$s_time = ''; +if (!empty($date)) { + $s_hour = $date['start']['hour']; + if (strtoupper($date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $s_time .= sprintf("%02d", $s_hour) . ':'; + $s_time .= sprintf("%02d", $date['start']['minutes']); + $s_time .= ' ' . trim($date['start']['ampm']); +} + +$e_time = ''; +if (!empty($date)) { + $e_hour = $date['end']['hour']; + if (strtoupper($date['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $e_time .= sprintf("%02d", $e_hour) . ':'; + $e_time .= sprintf("%02d", $date['end']['minutes']); + $e_time .= ' ' . trim($date['end']['ampm']); +} + +$start_time = date('D M j Y G:i:s', strtotime($start_date . ' ' . $s_time)); +$end_time = date('D M j Y G:i:s', strtotime($end_date . ' ' . $e_time)); + +// Timezone +$TZO = $this->get_TZO($event); + +$d1 = new DateTime($start_time, $TZO); +$d2 = new DateTime('now', $TZO); +$d3 = new DateTime($end_time, $TZO); + +$countdown_method = get_post_meta($event->ID, 'mec_countdown_method', true); +if (trim($countdown_method) == '') $countdown_method = 'global'; + +if ($countdown_method == 'global') $ongoing = (isset($settings['hide_time_method']) and trim($settings['hide_time_method']) == 'end'); +else $ongoing = $countdown_method == 'end'; + +$disable_for_ongoing = (isset($settings['countdown_disable_for_ongoing_events']) and $settings['countdown_disable_for_ongoing_events']); + +if ($d3 < $d2) { + echo '

    ' . esc_html__('The event is finished.', 'modern-events-calendar-lite') . '

    '; + return; +} elseif (($d1 < $d2 and !$ongoing) or ($d1 < $d2 and $disable_for_ongoing)) { + echo '

    ' . esc_html__('The event is ongoing.', 'modern-events-calendar-lite') . '

    '; + return; +} + +$gmt_offset = $this->get_gmt_offset($event, strtotime($start_date . ' ' . $s_time)); +if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') === false) $gmt_offset = ' : ' . $gmt_offset; +if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') == true) $gmt_offset = substr(trim($gmt_offset), 0, 3); +if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') == true) $gmt_offset = substr(trim($gmt_offset), 2, 3); + +$datetime = $ongoing ? $end_time : $start_time; + +// Generating javascript code of countdown default module +$defaultjs = ''; + +// Generating javascript code of countdown flip module +$flipjs = ''; +$flipjsDivi = ''; +if (!function_exists('is_plugin_active')) include_once(ABSPATH . 'wp-admin/includes/plugin.php'); +?> + + is_ajax()) echo MEC_kses::full($defaultjs); + elseif (is_plugin_active('mec-single-builder/mec-single-builder.php')) echo MEC_kses::full($defaultjs); + else $factory->params('footer', $defaultjs); + ?> +
    +
    +
      +
    • + + 00 +

      +
    • +
    • + + 00 +

      +
    • +
    • + + 00 +

      +
    • +
    • + + 00 +

      +
    • +
    +
    +
    + + is_ajax()) echo MEC_kses::full($flipjs); + elseif (is_plugin_active('mec-single-builder/mec-single-builder.php')) { + wp_enqueue_script('mec-flipcount-script'); + echo MEC_kses::full($flipjs); + } elseif (is_plugin_active('divi-single-builder/divi-single-builder.php') || is_plugin_active('mec-divi-single-builder/divi-single-builder.php')) { + wp_enqueue_script('mec-flipcount-script'); + $factory->params('footer', $flipjsDivi); + } else { + // Include FlipCount library + wp_enqueue_script('mec-flipcount-script'); + + // Include the JS code + $factory->params('footer', $flipjs); + } + if (is_plugin_active('mec-gutenberg-single-builder/mec-gutenberg-single-builder.php') && str_contains($_SERVER['REQUEST_URI'],'gsb')){?> + +
    + +
    +
    +get_settings(); + +// Expired? +if($this->is_expired($event) and isset($settings['export_module_hide_expired']) and $settings['export_module_hide_expired']) return; + +// Export module on single page is disabled +if(!isset($settings['export_module_status']) || !$settings['export_module_status']) return; + +$title = isset($event->data->title) ? $event->data->title : ''; +$location_id = $this->get_master_location_id($event); +$location_data = ($location_id ? $this->get_location_data($location_id) : array()); +$location = (($location_id and $location_data) ? '&location='.urlencode($location_data['address']) : ''); +$occurrence = isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''; +$occurrence_end_date = trim($occurrence) ? $this->get_end_date_by_occurrence($event->data->ID, (isset($event->date['start']['date']) ? $event->date['start']['date'] : $occurrence)) : ''; + +$content = (isset($event->data->post->post_content) and trim($event->data->post->post_content)) ? $event->data->post->post_content : $title; +$content = preg_replace('#]*href="((?!/)[^"]+)">[^<]+#', '$0 ( $1 )', $content); +$content = strip_shortcodes(strip_tags($content)); +$content = apply_filters('mec_add_content_to_export_google_calendar_details', $content, $event->data->ID); + +$start_date_temp = $start_hour_temp = ''; +if(!empty($event->date)) +{ + $start_date_temp = isset($event->date['start']['date']) ? $event->date['start']['date'] : NULL; + $start_hour_temp = isset($event->date['start']['hour']) ? $event->date['start']['hour'] : NULL; +} + +$start_minutes_temp = isset($event->date['start']['minutes']) ? $event->date['start']['minutes'] : NULL; +$start_ampm_temp = isset($event->date['start']['ampm']) ? $event->date['start']['ampm'] : NULL; + +$end_date_temp = isset($event->date['end']['date']) ? $event->date['end']['date'] : NULL; +$end_hour_temp = isset($event->date['end']['hour']) ? $event->date['end']['hour'] : NULL; +$end_minutes_temp = isset($event->date['end']['minutes']) ? $event->date['end']['minutes'] : NULL; +$end_ampm_temp = isset($event->date['end']['ampm']) ? $event->date['end']['ampm'] : NULL; + +if($start_hour_temp == 0 && $start_ampm_temp == 'AM') $start_hour_temp = '12'; +if($end_hour_temp == 0 && $end_ampm_temp == 'AM') $end_hour_temp = '12'; + +if((is_null($start_date_temp) or is_null($start_hour_temp) or is_null($start_minutes_temp) or is_null($start_ampm_temp) or is_null($end_date_temp) or is_null($end_hour_temp) or is_null($end_minutes_temp) or is_null($end_ampm_temp)) and !trim($occurrence)) +{ + return; +} + +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +if($allday) +{ + $start_hour_temp = 12; + $start_minutes_temp = 0; + $start_ampm_temp = 'AM'; + + $end_hour_temp = 12; + $end_minutes_temp = 0; + $end_ampm_temp = 'AM'; + + if(trim($occurrence_end_date)) $occurrence_end_date = date('Y-m-d', strtotime('+1 day', strtotime($occurrence_end_date))); + $end_date_temp = date('Y-m-d', strtotime('+1 day', strtotime($end_date_temp))); +} +$start_time = strtotime((trim($occurrence) ? $occurrence : $start_date_temp).' '.sprintf("%02d", $start_hour_temp).':'.sprintf("%02d", $start_minutes_temp).' '.$start_ampm_temp); +$end_time = strtotime((trim($occurrence_end_date) ? $occurrence_end_date : $end_date_temp).' '.sprintf("%02d", $end_hour_temp).':'.sprintf("%02d", $end_minutes_temp).' '.$end_ampm_temp); +$gmt_offset_seconds = $this->get_gmt_offset_seconds($start_time, $event); + +// Recurring Rules +$rrule = $this->get_ical_rrules($event->data, true); + +$description = "$content"; + +ob_start(); +do_action('mec_add_to_calander_event_description', $event); +$description .= html_entity_decode(ob_get_clean()); +?> +
    +
    +
    +
      +
    • +
    • +
    +
    +
    +
    \ No newline at end of file diff --git a/app/modules/export/index.html b/app/modules/export/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/googlemap/details.php b/app/modules/googlemap/details.php new file mode 100755 index 0000000..006d6a0 --- /dev/null +++ b/app/modules/googlemap/details.php @@ -0,0 +1,153 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); + +// Google Maps on single page is disabled +if(!isset($settings['google_maps_status']) || !$settings['google_maps_status']) return; + +$event = $event[0]; +$uniqueid = $uniqueid ?? $event->data->ID; + +// Map is disabled for this event +$dont_show_map = ((isset($event->data->meta['mec_dont_show_map']) and is_numeric($event->data->meta['mec_dont_show_map'])) ? $event->data->meta['mec_dont_show_map'] : 0); +if(isset($event->date) and isset($event->date['start']) and isset($event->date['start']['timestamp'])) $dont_show_map = MEC_feature_occurrences::param($event->ID, $event->date['start']['timestamp'], 'dont_show_map', $dont_show_map); + +if($dont_show_map) return; + +// Event ID +$event_id = $event->ID; + +$location_id = $this->get_master_location_id($event); +$location = ($location_id ? $this->get_location_data($location_id) : array()); + +// Event location geo point +$latitude = $location['latitude'] ?? ''; +$longitude = $location['longitude'] ?? ''; +$address = $location['address'] ?? ''; + +// Try to get the latitude and longitude on the fly +if(!trim($latitude) or !trim($longitude)) +{ + $geo_point = $this->get_lat_lng($address); + + $latitude = $geo_point[0]; + $longitude = $geo_point[1]; + + if($location_id) + { + update_term_meta($location_id, 'latitude', $latitude); + update_term_meta($location_id, 'longitude', $longitude); + } +} + +// Still Latitude and Longitude are wrong! +if(!trim($latitude) or !trim($longitude)) return; + +// Include Map Assets such as JS and CSS libraries +if(!$this->is_ajax()) $this->load_map_assets(); + +// Get Direction Status +$get_direction = (isset($settings['google_maps_get_direction_status']) and in_array($settings['google_maps_get_direction_status'], array(0,1,2))) ? $settings['google_maps_get_direction_status'] : 0; + +$additional_location_ids = get_post_meta($event_id, 'mec_additional_location_ids', true); +$event_locations = array_keys((array)$event->data->locations); + +$map_data = new stdClass; +$map_data->id = $uniqueid; +$map_data->atts = array( + 'location_map_zoom' => $settings['google_maps_zoomlevel'] ?? 14, + 'location_center_lat' => null, + 'location_center_long' => null, + 'use_orig_map' => true +); + +$map_data->events = array($event_id => $event); +$map_data->render = $render; +$map_data->geolocation = '0'; +$map_data->sf_status = null; + +$current_event = (isset($map_data->events[$event_id]) ? array($map_data->events[$event_id]) : array()); +$map_data->events = apply_filters('mec_location_load_additional', $current_event, $additional_location_ids, $event_locations); + +$scrollwheel = apply_filters( 'mec_google_map_scroll_wheel', false ); + +// Initialize MEC Google Maps jQuery plugin +$javascript = ''; +$javascript = apply_filters('mec_map_load_script', $javascript, $map_data, $settings); + +if(!function_exists('is_plugin_active')) include_once(ABSPATH . 'wp-admin/includes/plugin.php'); + +// Include javascript code into the footer +if($this->is_ajax()) echo MEC_kses::full($javascript); +elseif (is_plugin_active( 'mec-single-builder/mec-single-builder.php')) echo MEC_kses::full($javascript); +else $factory->params('footer', $javascript); +?> + +
    + + + + + +
    + + +
    +
    +
    + + X +
    +
    + +
    +
    +
    +get_settings(); + +// Social networds on single page is disabled +if(!isset($settings['social_network_status']) || !$settings['social_network_status']) return; + +$url = isset($event->data->permalink) ? $event->data->permalink : ''; +if(trim($url) == '') return; + +$socials = $this->get_social_networks(); +?> +
    + +
    + +
    +
    \ No newline at end of file diff --git a/app/modules/links/index.html b/app/modules/links/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/links/list.php b/app/modules/links/list.php new file mode 100755 index 0000000..7b7e18e --- /dev/null +++ b/app/modules/links/list.php @@ -0,0 +1,23 @@ +get_settings(); + +// Social on single page is disabled +if(!isset($settings['social_network_status']) || !$settings['social_network_status']) return; + +$url = isset($event->data->permalink) ? $event->data->permalink : ''; +if(trim($url) == '') return; + +// Get social networks +$socials = $this->get_social_networks(); + +foreach($socials as $social) +{ + if(!isset($settings['sn'][$social['id']]) || !$settings['sn'][$social['id']]) continue; + if(is_callable($social['function'])) echo call_user_func($social['function'], $url, $event, $social); +} \ No newline at end of file diff --git a/app/modules/local-time/details.php b/app/modules/local-time/details.php new file mode 100755 index 0000000..f3977c8 --- /dev/null +++ b/app/modules/local-time/details.php @@ -0,0 +1,57 @@ +get_settings(); +$ml_settings = $this->get_ml_settings(); + +// The module is disabled +if(!isset($settings['local_time_module_status']) || !$settings['local_time_module_status']) return; + +// Get the visitor Timezone +$timezone = $this->get_timezone_by_ip(); + +// Timezone is not detected! +if(!$timezone) return; + +// Date Formats +$date_format1 = (isset($ml_settings['single_date_format1']) and trim($ml_settings['single_date_format1'])) ? $ml_settings['single_date_format1'] : 'M d Y'; +$time_format = get_option('time_format', 'H:i'); + +$occurrence = isset($_GET['occurrence']) ? sanitize_text_field($_GET['occurrence']) : ''; +$occurrence_end_date = trim($occurrence) ? $this->get_end_date_by_occurrence($event->data->ID, (isset($event->date['start']['date']) ? $event->date['start']['date'] : $occurrence)) : ''; + +$gmt_offset_seconds = $this->get_gmt_offset_seconds((trim($occurrence) ? $occurrence : $event->date['start']['date']), $event); + +$start_time_components = $this->get_time_components($event, 'start'); +$end_time_components = $this->get_time_components($event, 'end'); + +$gmt_start_time = strtotime((trim($occurrence) ? $occurrence : $start_time_components['date']).' '.sprintf("%02d", $start_time_components['hour']).':'.sprintf("%02d", $start_time_components['minutes']).' '.$start_time_components['ampm']) - $gmt_offset_seconds; +$gmt_end_time = strtotime((trim($occurrence_end_date) ? $occurrence_end_date : $end_time_components['date']).' '.sprintf("%02d", $end_time_components['hour']).':'.sprintf("%02d", $end_time_components['minutes']).' '.$end_time_components['ampm']) - $gmt_offset_seconds; + +$user_timezone = new DateTimeZone($timezone); +$gmt_timezone = new DateTimeZone('GMT'); +$gmt_datetime = new DateTime(date('Y-m-d H:i:s', $gmt_start_time), $gmt_timezone); +$offset = $user_timezone->getOffset($gmt_datetime); + +$user_start_time = $gmt_start_time + $offset; +$user_end_time = $gmt_end_time + $offset; + +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$hide_time = isset($event->data->meta['mec_hide_time']) ? $event->data->meta['mec_hide_time'] : 0; +$hide_end_time = $this->hide_end_time_status($event->ID); +?> +
    + display('clock') : ''); ?>

    +
      +
    • '.esc_html($timezone).''); ?>
    • +
    • date_label(array('date'=>date('Y-m-d', $user_start_time)), array('date'=>date('Y-m-d', $user_end_time)), $date_format1)); ?>
    • + +
    • '.($allday ? $this->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) : ($hide_end_time ? date($time_format, $user_start_time) : date($time_format, $user_start_time).' - '.date($time_format, $user_end_time))).''); ?>
    • + +
    +
    \ No newline at end of file diff --git a/app/modules/local-time/index.html b/app/modules/local-time/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/local-time/type1.php b/app/modules/local-time/type1.php new file mode 100755 index 0000000..446258e --- /dev/null +++ b/app/modules/local-time/type1.php @@ -0,0 +1,54 @@ +get_settings(); +$ml_settings = $this->get_ml_settings(); + +// The module is disabled +if(!isset($settings['local_time_module_status']) || !$settings['local_time_module_status']) return; + +// Get the visitor Timezone +$timezone = $this->get_timezone_by_ip(); + +// Timezone is not detected! +if(!$timezone) return; + +$start_time = isset($event->data->time['start_raw']) ? $event->data->time['start_raw'] : ''; +$end_time = isset($event->data->time['end_raw']) ? $event->data->time['end_raw'] : ''; + +// Date Formats +$date_format1 = (isset($ml_settings['single_date_format1']) and trim($ml_settings['single_date_format1'])) ? $ml_settings['single_date_format1'] : 'M d Y'; +$time_format = get_option('time_format', 'H:i'); + +$gmt_offset_seconds = $this->get_gmt_offset_seconds($event->date['start']['date'], $event); + +$gmt_start_time = strtotime($event->date['start']['date'].' '.$start_time) - $gmt_offset_seconds; +$gmt_end_time = strtotime($event->date['end']['date'].' '.$end_time) - $gmt_offset_seconds; + +$user_timezone = new DateTimeZone($timezone); +$gmt_timezone = new DateTimeZone('GMT'); +$gmt_datetime = new DateTime(date('Y-m-d H:i:s', $gmt_start_time), $gmt_timezone); +$offset = $user_timezone->getOffset($gmt_datetime); + +$user_start_time = $gmt_start_time + $offset; +$user_end_time = $gmt_end_time + $offset; + +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$hide_time = isset($event->data->meta['mec_hide_time']) ? $event->data->meta['mec_hide_time'] : 0; +$hide_end_time = $this->hide_end_time_status($event->ID); +?> +
    + + + + +
    date_label(array('date'=>date('Y-m-d', $user_start_time)), array('date'=>date('Y-m-d', $user_end_time)), $date_format1)); ?>
    + +
    '.($allday ? $this->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) : ($hide_end_time ? date($time_format, $user_start_time) : date($time_format, $user_start_time).' - '.date($time_format, $user_end_time))).''); ?>
    + +
    \ No newline at end of file diff --git a/app/modules/local-time/type2.php b/app/modules/local-time/type2.php new file mode 100755 index 0000000..04c90fe --- /dev/null +++ b/app/modules/local-time/type2.php @@ -0,0 +1,88 @@ +get_settings(); +$ml_settings = $this->get_ml_settings(); + +// The module is disabled +if(!isset($settings['local_time_module_status']) || !$settings['local_time_module_status']) return; + +// Get the visitor Timezone +$timezone = $this->get_timezone_by_ip(); + +// Timezone is not detected! +if(!$timezone) return; + +$start_time = isset($event->data->time['start_raw']) ? $event->data->time['start_raw'] : ''; +$end_time = isset($event->data->time['end_raw']) ? $event->data->time['end_raw'] : ''; + +// Date Formats +$date_format1 = (isset($ml_settings['single_date_format1']) and trim($ml_settings['single_date_format1'])) ? $ml_settings['single_date_format1'] : 'M d Y'; +$time_format = get_option('time_format', 'H:i'); + +$gmt_offset_seconds = $this->get_gmt_offset_seconds($event->date['start']['date'], $event); + +/** + * TODO: Convert to class + */ +$event_id = $event->ID; + +global $MEC_Events_dates, $MEC_Events_dates_localtime, $MEC_Shortcode_id; +if(!isset($MEC_Events_dates_localtime[$MEC_Shortcode_id]) || empty($MEC_Events_dates_localtime[$MEC_Shortcode_id])) +{ + $MEC_Events_dates_localtime[$MEC_Shortcode_id] = $MEC_Events_dates; +} + +$dates = []; +if(isset($MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id]) && is_array($MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id])) +{ + $k = $this->array_key_first($MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id]); + if(isset($MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id][$k])) + { + $dates = $MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id][$k]; + $start_time = $dates['start']['time'] ?? $start_time; + $end_time = $dates['end']['time'] ?? $end_time; + + unset($MEC_Events_dates_localtime[$MEC_Shortcode_id][$event_id][$k]); + } +} + +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$hide_time = isset($event->data->meta['mec_hide_time']) ? $event->data->meta['mec_hide_time'] : 0; +$hide_end_time = $this->hide_end_time_status($event->ID); + +if($allday) +{ + $start_time = '00:00:01'; + $start_time = '23:59:59'; +} + +$start_date = ($dates['start']['date'] ?? $event->date['start']['date']); +$end_date = ($dates['end']['date'] ?? $event->date['end']['date']); + +$gmt_start_time = strtotime($start_date.' '.$start_time) - $gmt_offset_seconds; +$gmt_end_time = strtotime($end_date.' '.$end_time) - $gmt_offset_seconds; + +$user_timezone = new DateTimeZone($timezone); +$gmt_timezone = new DateTimeZone('GMT'); +$gmt_datetime = new DateTime(date('Y-m-d H:i:s', $gmt_start_time), $gmt_timezone); +$offset = $user_timezone->getOffset($gmt_datetime); + +$user_start_time = $gmt_start_time + $offset; +$user_end_time = $gmt_end_time + $offset; +?> +
    +
    + display('clock') : ''); ?> + +
    date_label(array('date'=>date('Y-m-d', $user_start_time)), array('date'=>date('Y-m-d', $user_end_time)), $date_format1)); ?>
    + +
    '.($allday ? $this->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) : ($hide_end_time ? date($time_format, $user_start_time) : date($time_format, $user_start_time).' - '.date($time_format, $user_end_time))).''); ?>
    + +
    +
    \ No newline at end of file diff --git a/app/modules/local-time/type3.php b/app/modules/local-time/type3.php new file mode 100755 index 0000000..69b22b3 --- /dev/null +++ b/app/modules/local-time/type3.php @@ -0,0 +1,52 @@ +get_settings(); +$ml_settings = $this->get_ml_settings(); + +// The module is disabled +if(!isset($settings['local_time_module_status']) || !$settings['local_time_module_status']) return; + +// Get the visitor Timezone +$timezone = $this->get_timezone_by_ip(); + +// Timezone is not detected! +if(!$timezone) return; + +$start_time = isset($event->data->time['start_raw']) ? $event->data->time['start_raw'] : ''; +$end_time = isset($event->data->time['end_raw']) ? $event->data->time['end_raw'] : ''; + +// Date Formats +$date_format1 = (isset($ml_settings['single_date_format1']) and trim($ml_settings['single_date_format1'])) ? $ml_settings['single_date_format1'] : 'M d Y'; +$time_format = get_option('time_format', 'H:i'); + +$gmt_offset_seconds = $this->get_gmt_offset_seconds($event->date['start']['date'], $event); + +$gmt_start_time = strtotime($event->date['start']['date'].' '.$start_time) - $gmt_offset_seconds; +$gmt_end_time = strtotime($event->date['end']['date'].' '.$end_time) - $gmt_offset_seconds; + +$user_timezone = new DateTimeZone($timezone); +$gmt_timezone = new DateTimeZone('GMT'); +$gmt_datetime = new DateTime(date('Y-m-d H:i:s', $gmt_start_time), $gmt_timezone); +$offset = $user_timezone->getOffset($gmt_datetime); + +$user_start_time = $gmt_start_time + $offset; +$user_end_time = $gmt_end_time + $offset; + +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$hide_time = isset($event->data->meta['mec_hide_time']) ? $event->data->meta['mec_hide_time'] : 0; +$hide_end_time = $this->hide_end_time_status($event->ID); +?> +
    +
    +
    date_label(array('date'=>date('Y-m-d', $user_start_time)), array('date'=>date('Y-m-d', $user_end_time)), $date_format1)); ?>
    + +
    '.($allday ? $this->m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite')) : ($hide_end_time ? date($time_format, $user_start_time) : date($time_format, $user_start_time).' - '.date($time_format, $user_end_time))).''); ?>
    + +
    +
    \ No newline at end of file diff --git a/app/modules/next-event/details.php b/app/modules/next-event/details.php new file mode 100755 index 0000000..4b44ab6 --- /dev/null +++ b/app/modules/next-event/details.php @@ -0,0 +1,174 @@ +get_settings(); + +// The module is disabled +if(!isset($settings['next_event_module_status']) || !$settings['next_event_module_status']) return; + +// Next Event Method +$method = $settings['next_event_module_method'] ?? 'occurrence'; + +// Display Active Occurrence Button +$active_button = isset($settings['next_event_module_active_button']) && $settings['next_event_module_active_button']; + +// Multiple Occurrences +if($method == 'multiple') +{ + include MEC::import('app.modules.next-event.multiple', true, true); + return; +} + +// Date Format +$date_format1 = $settings['next_event_module_date_format1'] ?? 'M d Y'; + +$date = []; +if(!empty($event->date)) $date = $event->date; + +$start_date = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : date('Y-m-d'); +if(isset($_GET['occurrence']) and trim($_GET['occurrence'])) $start_date = sanitize_text_field($_GET['occurrence']); + +$next_date = []; +$next_time = []; + +// Show next occurrence from other events +if($method == 'event') +{ + $start_hour = (isset($date['start']) and isset($date['start']['hour'])) ? $date['start']['hour'] : 8; + $start_minutes = (isset($date['start']) and isset($date['start']['minutes'])) ? $date['start']['minutes'] : 0; + $start_ampm = (isset($date['start']) and isset($date['start']['ampm'])) ? $date['start']['ampm'] : 'AM'; + + $next = $this->get_next_event(array + ( + 'show_past_events'=>0, + 'sk-options'=>array + ( + 'list'=>array + ( + 'start_date_type'=>'date', + 'start_date'=>$start_date, + 'limit'=>1, + ) + ), + 'seconds_date'=>$start_date, + 'seconds'=>$this->time_to_seconds($this->to_24hours($start_hour, $start_ampm), $start_minutes), + 'exclude'=>array($event->ID), + 'include'=>NULL, + )); + + $p = get_post($event->ID); + setup_postdata($GLOBALS['post'] =& $p); + + // Nothing Found! + if(!isset($next->data)) return false; + + $next_date = $next->date; + $next_time = $next->data->time; +} +else +{ + // Nothing Found! + if(!isset($event->dates) || !is_array($event->dates) || !count($event->dates)) return false; + + $custom_days = false; + if(isset($event->data->meta['mec_repeat_type']) and $event->data->meta['mec_repeat_type'] === 'custom_days') $custom_days = true; + + if(isset($date['start']['hour']) and isset($date['start']['minutes']) and isset($date['start']['ampm'])) + { + $s_hour = $date['start']['hour']; + if(strtoupper($date['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_date .= ' '.sprintf("%02d", $s_hour).':'.sprintf("%02d", $date['start']['minutes']).' '.$date['start']['ampm']; + } + + $next = $event; + + // Occurrences + $found = false; + + foreach($event->dates as $occ) + { + $start_datetime = $occ['start']['date']; + if($custom_days) + { + $s_hour = $occ['start']['hour']; + if(strtoupper($occ['start']['ampm']) == 'AM' and $s_hour == '0') $s_hour = 12; + + $start_time = sprintf("%02d", $s_hour).':'.sprintf("%02d", $occ['start']['minutes']).' '.$occ['start']['ampm']; + $start_datetime .= ' '.$start_time; + } + + if(strtotime($start_datetime) > strtotime($start_date)) + { + $found = true; + $next_date = $occ; + $next_time = $next->data->time; + + if($custom_days) + { + $end_datetime = $occ['end']['date']; + $e_hour = $occ['end']['hour']; + if(strtoupper($occ['end']['ampm']) == 'AM' and $e_hour == '0') $e_hour = 12; + + $end_time = sprintf("%02d", $e_hour).':'.sprintf("%02d", $occ['end']['minutes']).' '.$occ['end']['ampm']; + $end_datetime .= ' '.$end_time; + + $next_time = array( + 'start' => $this->get_time(strtotime($start_datetime)), + 'end' => $this->get_time(strtotime($end_datetime)), + 'start_raw' => $start_time, + 'end_raw' => $end_time, + ); + } + + break; + } + } + + // Nothing Found! + if(!$found) return false; +} + +$time_comment = isset($next->data->meta['mec_comment']) ? $next->data->meta['mec_comment'] : ''; +$allday = isset($next->data->meta['mec_allday']) ? $next->data->meta['mec_allday'] : 0; + +$midnight_event = $this->is_midnight_event($next); +if($midnight_event) $next_date['end']['date'] = date('Y-m-d', strtotime('-1 Day', strtotime($next_date['end']['date']))); +?> +
    +
    +

    +
      +
    • + data->title); ?> +
    • +
    • + +
      +
      date_label($next_date['start'], ($next_date['end'] ?? NULL), $date_format1)); ?>
      +
    • + data->time) and trim($next->data->time['start'])): ?> +
    • + +
      + +
      + data->time) and trim($next->data->time['start'])): ?> +
      + +
      m('all_day', esc_html__('All Day' , 'modern-events-calendar-lite'))); ?>
      + +
      +
    • + +
    +
    + + + +
    \ No newline at end of file diff --git a/app/modules/next-event/index.html b/app/modules/next-event/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/next-event/multiple.php b/app/modules/next-event/multiple.php new file mode 100755 index 0000000..5fa81ac --- /dev/null +++ b/app/modules/next-event/multiple.php @@ -0,0 +1,90 @@ +get_settings(); + +// The module is disabled +if(!isset($settings['next_event_module_status']) || !$settings['next_event_module_status']) return; + +// Next Event Method +$method = ($settings['next_event_module_method'] ?? 'occurrence'); +$maximum = (isset($settings['next_event_module_multiple_count']) ? (int) $settings['next_event_module_multiple_count'] : 10); + +// Display Active Occurrence Button +$active_button = isset($settings['next_event_module_active_button']) && $settings['next_event_module_active_button']; + +// Not Multiple Occurrences +if($method != 'multiple') +{ + include MEC::import('app.modules.next-event.details', true, true); + return; +} + +// Date Format +$date_format1 = $settings['next_event_module_date_format1'] ?? 'M d Y'; +$time_format = get_option('time_format'); + +$date = []; +if(!empty($event->date)) $date = $event->date; + +$occurrence = (isset($date['start']) and isset($date['start']['date'])) ? $date['start']['date'] : date('Y-m-d'); +if(isset($_GET['occurrence']) and trim($_GET['occurrence'])) $occurrence = sanitize_text_field($_GET['occurrence']); + +$occurrence_time = isset($_GET['time']) ? (int) sanitize_text_field($_GET['time']) : ''; + +// Event Dates +$dates = $this->get_event_next_occurrences($event, $occurrence, $maximum, $occurrence_time); + +MEC_feature_occurrences::fetch_single($event, $dates); + +// Midnight Event +$midnight = $this->is_midnight_event($event); + +// Remove Current Occurrence +if(is_array($date) and isset($date['start']) and isset($date['start']['timestamp']) and is_array($dates) and isset($dates[0]) and isset($dates[0]['start']) and isset($dates[0]['start']['timestamp']) and $dates[0]['start']['timestamp'] == $date['start']['timestamp']) unset($dates[0]); + +// Nothing Found! +if(!is_array($dates) || !count($dates)) return false; + +$time_comment = isset($event->data->meta['mec_comment']) ? $event->data->meta['mec_comment'] : ''; +$allday = isset($event->data->meta['mec_allday']) ? $event->data->meta['mec_allday'] : 0; +$hide_time = isset($event->data->meta['mec_hide_time']) ? $event->data->meta['mec_hide_time'] : 0; +$hide_end_time = $this->hide_end_time_status($event->ID); +?> + \ No newline at end of file diff --git a/app/modules/progress-bar/index.html b/app/modules/progress-bar/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/progress-bar/single.php b/app/modules/progress-bar/single.php new file mode 100755 index 0000000..22f8d8a --- /dev/null +++ b/app/modules/progress-bar/single.php @@ -0,0 +1,59 @@ +get_settings(); + +// Module is not enabled +if(!isset($settings['progress_bar_status']) or !$settings['progress_bar_status']) return ''; + +$date = $event->date; + +$start_datetime = isset($date['start'], $date['start']['timestamp']) ? $date['start']['timestamp'] : null; +$end_datetime = isset($date['end'], $date['end']['timestamp']) ? $date['end']['timestamp'] : null; + +// Invalid Date & Time +if(!$start_datetime or !$end_datetime) return ''; + +$start = date('D M j Y G:i:s', $start_datetime); +$end = date('D M j Y G:i:s', $end_datetime); + +// Timezone +$TZO = $this->get_TZO($event); + +$d1 = new DateTime($start, $TZO); +$d2 = new DateTime('now', $TZO); +$d3 = new DateTime($end, $TZO); + +// Event is Finished +if($d3 < $d2) return ''; +// Event is not Started +elseif($d1 > $d2) return ''; + +$duration = $d3->getTimestamp() - $d1->getTimestamp(); +$passed = $d2->getTimestamp() - $d1->getTimestamp(); + +// Generating javascript code of countdown default module +$js = ''; + +if(!function_exists('is_plugin_active')) include_once ABSPATH . 'wp-admin/includes/plugin.php'; + +if($this->is_ajax() || is_plugin_active('mec-single-builder/mec-single-builder.php')) echo MEC_kses::full($js); +else $factory->params('footer', $js); +?> +
    + + + + +
    diff --git a/app/modules/qrcode/details.php b/app/modules/qrcode/details.php new file mode 100755 index 0000000..a6f54d1 --- /dev/null +++ b/app/modules/qrcode/details.php @@ -0,0 +1,41 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); + +// The module is disabled +if(isset($settings['qrcode_module_status']) and !$settings['qrcode_module_status']) return; + +$url = get_post_permalink($event->ID); +if(isset($_REQUEST['occurrence'])) $url = $this->add_qs_var('occurrence', sanitize_text_field($_REQUEST['occurrence']), $url); + +$file_name = 'qr_'.md5($url).'.png'; + +$upload_dir = wp_upload_dir(); +$file_path = $upload_dir['basedir'] .DS. 'mec' .DS. $file_name; + +$file = $this->getFile(); +if(!$file->exists($file_path)) +{ + if(!$file->exists(dirname($file_path))) + { + $folder = $this->getFolder(); + $folder->create(dirname($file_path)); + } + + $QRcode = $this->getQRcode(); + $QRcode->png($url, $file_path, 'L', 4, 2); +} + +$image_url = $upload_dir['baseurl'].'/mec/'.$file_name; +?> +
    + <?php echo esc_html__('QR Code', 'modern-events-calendar-lite'); ?> +
    \ No newline at end of file diff --git a/app/modules/qrcode/index.html b/app/modules/qrcode/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/qrcode/invoice.php b/app/modules/qrcode/invoice.php new file mode 100755 index 0000000..af1d9b2 --- /dev/null +++ b/app/modules/qrcode/invoice.php @@ -0,0 +1,35 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); + +// The module is disabled +if(isset($settings['qrcode_module_status']) and !$settings['qrcode_module_status']) return; + +$url = get_post_permalink($event->ID); +$file_name = 'qr_'.md5($url).'.png'; + +$upload_dir = wp_upload_dir(); +$file_path = $upload_dir['basedir'] .DS. 'mec' .DS. $file_name; + +$file = $this->getFile(); +if(!$file->exists($file_path)) +{ + if(!$file->exists(dirname($file_path))) + { + $folder = $this->getFolder(); + $folder->create(dirname($file_path)); + } + + $QRcode = $this->getQRcode(); + $QRcode->png($url, $file_path, 'L', 4, 2); +} + +echo esc_html($file_path); \ No newline at end of file diff --git a/app/modules/speakers/details.php b/app/modules/speakers/details.php new file mode 100755 index 0000000..89794a5 --- /dev/null +++ b/app/modules/speakers/details.php @@ -0,0 +1,126 @@ +get_settings(); + +// The module is disabled +if(!isset($settings['speakers_status']) || !$settings['speakers_status']) return; + +// Event Speakers +$speakers = (isset($event->data->speakers) and is_array($event->data->speakers)) ? $event->data->speakers : []; + +// No Speaker +if(!count($speakers)) return false; + +$id_speaker_page = ""; +$name_speaker = ""; +foreach($speakers as $speaker) +{ + $id_speaker_page = $speaker['id']; + $name_speaker = $speaker['name']; + break; +} + +$type_link=$settings['advanced_speaker']['speaker_type_link']??'dialog'; +?> +
    +

    m('taxonomy_speaker', esc_html__('Speaker', 'modern-events-calendar-lite'))); else: echo esc_html($this->m('taxonomy_speakers', esc_html__('Speakers', 'modern-events-calendar-lite'))); endif; ?>

    + +
    diff --git a/app/modules/speakers/index.html b/app/modules/speakers/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/sponsors/details.php b/app/modules/sponsors/details.php new file mode 100755 index 0000000..03d90bd --- /dev/null +++ b/app/modules/sponsors/details.php @@ -0,0 +1,45 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); + +// The module is disabled +if(!isset($settings['sponsors_status']) || !$settings['sponsors_status']) return; + +// Event Sponsors +$sponsors = (isset($event->data->sponsors) and is_array($event->data->sponsors)) ? $event->data->sponsors : []; + +// No Sponsor +if(!count($sponsors)) return false; +?> +
    +

    m('taxonomy_sponsor', esc_html__('Sponsor', 'modern-events-calendar-lite'))); else: echo esc_html($this->m('taxonomy_sponsors', esc_html__('Sponsors', 'modern-events-calendar-lite'))); endif; ?>

    + +
    \ No newline at end of file diff --git a/app/modules/sponsors/index.html b/app/modules/sponsors/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/weather/darksky.php b/app/modules/weather/darksky.php new file mode 100755 index 0000000..2c2f8ce --- /dev/null +++ b/app/modules/weather/darksky.php @@ -0,0 +1,71 @@ +date['start']['date']).' '.sprintf("%02d", $event->date['start']['hour']).':'.sprintf("%02d", $event->date['start']['minutes']).' '.$event->date['start']['ampm']; + +$weather = $this->get_weather_darksky($dark_sky, $lat, $lng, $date); +$imperial = (isset($settings['weather_module_imperial_units']) && $settings['weather_module_imperial_units']); + +// Weather not found! +if(!is_array($weather) || !count($weather)) return; +?> +
    +

    + + +
    + +
    +
    + +
    +
    + + +
    + + + +
    + + + weather_unit_convert($weather['temperature'], 'C_TO_F')); ?> + + +
    + + +
    + + + + + +
    + + +
    : weather_unit_convert($weather['windSpeed'], 'KM_TO_M')); ?>
    + + + +
    :
    + + + +
    : weather_unit_convert($weather['visibility'], 'KM_TO_M')); ?>
    + + +
    +
    + +
    + +
    \ No newline at end of file diff --git a/app/modules/weather/details.php b/app/modules/weather/details.php new file mode 100755 index 0000000..9526ade --- /dev/null +++ b/app/modules/weather/details.php @@ -0,0 +1,41 @@ +getPRO()) return; + +// MEC Settings +$settings = $this->get_settings(); + +// The module is disabled +if(!isset($settings['weather_module_status']) || !$settings['weather_module_status']) return; + +$dark_sky = (isset($settings['weather_module_api_key']) and trim($settings['weather_module_api_key'])) ? $settings['weather_module_api_key'] : ''; +$visual_crossing = (isset($settings['weather_module_vs_api_key']) and trim($settings['weather_module_vs_api_key'])) ? $settings['weather_module_vs_api_key'] : ''; +$weather_api = (isset($settings['weather_module_wa_api_key']) and trim($settings['weather_module_wa_api_key'])) ? $settings['weather_module_wa_api_key'] : ''; + +// No API key +if(!trim($dark_sky) and !trim($weather_api) and !trim($visual_crossing)) return; + +// Location ID +$location_id = $this->get_master_location_id($event); + +// Location is not Set +if(!$location_id) return; + +// Location +$location = $this->get_location_data($location_id); + +$lat = $location['latitude'] ?? 0; +$lng = $location['longitude'] ?? 0; + +// Cannot find the geo point +if(!$lat or !$lng) return; + +if(trim($weather_api)) include MEC::import('app.modules.weather.weatherapi', true, true); +elseif(trim($visual_crossing)) include MEC::import('app.modules.weather.visualcrossing', true, true); +elseif(trim($dark_sky)) include MEC::import('app.modules.weather.darksky', true, true); diff --git a/app/modules/weather/index.html b/app/modules/weather/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/modules/weather/visualcrossing.php b/app/modules/weather/visualcrossing.php new file mode 100755 index 0000000..a2ca347 --- /dev/null +++ b/app/modules/weather/visualcrossing.php @@ -0,0 +1,71 @@ +date['start']['date']).' '.sprintf("%02d", $event->date['start']['hour']).':'.sprintf("%02d", $event->date['start']['minutes']).' '.$event->date['start']['ampm']; + +$weather = $this->get_weather_visualcrossing($visual_crossing, $lat, $lng, $date); +$imperial = isset($settings['weather_module_imperial_units']) && $settings['weather_module_imperial_units']; + +// Weather not found! +if(!is_array($weather) || !count($weather)) return; +?> +
    +

    + + +
    + +
    +
    + +
    +
    + + +
    + + + +
    + + + weather_unit_convert($weather['temp'], 'C_TO_F')); ?> + + +
    + + +
    + + + + + +
    + + +
    : weather_unit_convert($weather['windspeed'], 'KM_TO_M')); ?>
    + + + +
    :
    + + + +
    : weather_unit_convert($weather['visibility'], 'KM_TO_M')); ?>
    + + +
    +
    + +
    + +
    \ No newline at end of file diff --git a/app/modules/weather/weatherapi.php b/app/modules/weather/weatherapi.php new file mode 100755 index 0000000..f81f9cc --- /dev/null +++ b/app/modules/weather/weatherapi.php @@ -0,0 +1,74 @@ +get_weather_wa($weather_api, $lat, $lng, $date); +$imperial = (isset($settings['weather_module_imperial_units']) && $settings['weather_module_imperial_units']); + +// Weather not found! +if(!is_array($weather) || !count($weather)) return; +?> +
    +

    + + +
    + +
    + + +
    + <?php echo esc_attr($weather['condition']['text']); ?> +
    + + +
    + + +
    + + + +
    + + + + + +
    + + +
    + + + + + +
    + + +
    :
    + + + +
    :
    + + + +
    :
    + + +
    +
    + +
    + +
    \ No newline at end of file diff --git a/app/skins/agenda.php b/app/skins/agenda.php new file mode 100755 index 0000000..23c4785 --- /dev/null +++ b/app/skins/agenda.php @@ -0,0 +1,292 @@ + + */ +class MEC_skin_agenda extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'agenda'; + + public $date_format_clean_1; + public $date_format_clean_2; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + + // MEC Render + $this->render = $this->getRender(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_agenda_load_more', array($this, 'load_more')); + $this->factory->action('wp_ajax_nopriv_mec_agenda_load_more', array($this, 'load_more')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Date Formats + $this->date_format_clean_1 = (isset($this->skin_options['clean_date_format1']) and trim($this->skin_options['clean_date_format1'])) ? $this->skin_options['clean_date_format1'] : 'l'; + $this->date_format_clean_2 = (isset($this->skin_options['clean_date_format2']) and trim($this->skin_options['clean_date_format2'])) ? $this->skin_options['clean_date_format2'] : 'F j'; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // Generate an ID for the sking + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Show "Load More" button or not + $this->load_more_button = $this->skin_options['load_more_button'] ?? true; + + // Pagination + $this->pagination = $this->skin_options['pagination'] ?? (!$this->load_more_button ? '0' : 'loadmore'); + + // Show Month Divider or not + $this->month_divider = $this->skin_options['month_divider'] ?? true; + + // The style + $this->style = $this->skin_options['style'] ?? 'clean'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'clean'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Order Method + $this->order_method = (isset($this->skin_options['order_method']) and trim($this->skin_options['order_method'])) ? $this->skin_options['order_method'] : 'ASC'; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = (in_array($this->order_method, array('ASC', 'DESC')) ? $this->order_method : 'ASC'); + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Exclude Posts + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $this->args['post__not_in'] = $this->atts['exclude']; + + // Include Posts + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $this->args['post__in'] = $this->atts['include']; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Maximum Date Range. + $this->maximum_date_range = $this->get_end_date(); + + // Show Past Events + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = isset($this->atts['show_past_events']) ? $this->atts['show_past_events'] : '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + $this->maximum_date = $this->start_date; + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Set start time + if(isset($this->atts['seconds'])) + { + $this->args['mec-seconds'] = $this->atts['seconds']; + $this->args['mec-seconds-date'] = $this->atts['seconds_date'] ?? $this->start_date; + } + + // Apply Maximum Date + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : ($_REQUEST['mec_month'] ?? ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Found Events + $this->found = 0; + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp')); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + // MEC Next Page + if(isset($_REQUEST['mec_next_page']) and trim($_REQUEST['mec_next_page'])) + { + $ex = explode(':', $_REQUEST['mec_next_page']); + + if(strtotime($ex[0])) $date = $ex[0]; + if(isset($ex[1])) $this->offset = $ex[1]; + } + + return $date; + } + + /** + * Load more events for AJAX request + * @author Webnus + * @return void + */ + public function load_more() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Override variables + $this->start_date = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + $this->end_date = $this->start_date; + $this->offset = isset($_REQUEST['mec_offset']) ? sanitize_text_field($_REQUEST['mec_offset']) : 0; + + // Apply Maximum Date + $month = (isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : ($_REQUEST['mec_month'] ?? ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Return the events + $this->atts['return_items'] = true; + $this->loading_more = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/agenda/index.html b/app/skins/agenda/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/agenda/render.php b/app/skins/agenda/render.php new file mode 100755 index 0000000..d185aeb --- /dev/null +++ b/app/skins/agenda/render.php @@ -0,0 +1,73 @@ +main->get_settings(); +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; +?> +events as $date=>$events): ?> + + month_divider and $month_id != $current_month_divider): $current_month_divider = $month_id; ?> +
    main->date_i18n('F Y', strtotime($date))); ?>
    + +
    + +
    + icons->display('calendar'); ?> + main->date_i18n($this->date_format_clean_1, strtotime($date))); ?> + main->date_i18n($this->date_format_clean_2, strtotime($date))); ?> +
    + +
    + main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $event_color = $this->get_event_color_dot($event); + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + // MEC Schema + do_action('mec_schema', $event); + + if($this->style == 'clean'): ?> +
    + icons->display('clock'); ?> + + '.esc_html($start_time).''; + if(trim($end_time)) echo ' - '.esc_html($end_time).''; + } + ?> + + + display_link($event)); ?> + main->display_cancellation_reason($event, $reason_for_cancellation); ?> + main->get_flags($event).$event_color); ?> + get_label_captions($event, 'mec-fc-style')); ?> + data->ID); ?> + booking_button($event)); ?> + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> + + display_custom_data($event)); ?> + +
    + + +
    +
    +
    +get_render_path(); + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('html' => $items_html, 'end_date' => $this->end_date, 'offset' => $this->next_offset, 'count' => $this->found, 'current_month_divider' => $current_month_divider, 'has_more_event' => (int) $this->has_more_events)); + exit; +} + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$styling = $this->main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_agenda_skin_head'); +?> +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + + found): ?> +
    +
    +
    + +
    +
    +
    +
    + main->display_not_found_message(); ?> +
    + +
    + main->display_not_found_message(); ?> +
    + + + get_pagination_bar(); ?> + +
    +display_credit_url(); \ No newline at end of file diff --git a/app/skins/available_spot.php b/app/skins/available_spot.php new file mode 100755 index 0000000..c699bec --- /dev/null +++ b/app/skins/available_spot.php @@ -0,0 +1,122 @@ + + */ +class MEC_skin_available_spot extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'available_spot'; + + public $event_id; + public $date_format1; + public $date_format2; + public $date_format_fluent_1; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + $this->style = $this->skin_options['style'] ?? 'classic'; + + // Date Formats + $this->date_format1 = (isset($this->skin_options['date_format1']) and trim($this->skin_options['date_format1'])) ? $this->skin_options['date_format1'] : 'j'; + $this->date_format2 = (isset($this->skin_options['date_format2']) and trim($this->skin_options['date_format2'])) ? $this->skin_options['date_format2'] : 'F'; + + // Fluent view - Date Formats + $this->date_format_fluent_1 = (isset($this->skin_options['fluent_date_format1']) and trim($this->skin_options['fluent_date_format1'])) ? $this->skin_options['fluent_date_format1'] : 'F d'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Search Form Status + $this->sf_status = false; + + $this->id = mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-skin'] = $this->skin; + + // Event ID + $this->event_id = $this->skin_options['event_id'] ?? '-1'; + if(!get_post($this->event_id)) $this->event_id = '-1'; + + do_action('mec-available-spot-initialize-end', $this); + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + $events = []; + + // Get next upcoming event ID + if($this->event_id == '-1') + { + $events[] = $this->main->get_next_upcoming_event(); + } + else + { + $rendered = $this->render->data($this->event_id, ($this->atts['content'] ?? '')); + + $data = new stdClass(); + $data->ID = $this->event_id; + $data->data = $rendered; + $data->dates = $this->render->dates($this->event_id, $rendered, $this->maximum_dates); + $data->date = $data->dates[0] ?? []; + + $events[] = $this->render->after_render($data, $this); + } + + return $events; + } +} diff --git a/app/skins/available_spot/index.html b/app/skins/available_spot/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/available_spot/tpl.php b/app/skins/available_spot/tpl.php new file mode 100755 index 0000000..b0c211c --- /dev/null +++ b/app/skins/available_spot/tpl.php @@ -0,0 +1,212 @@ +main->get_styling(); +$event = $this->events[0]; +$settings = $this->main->get_settings(); +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +// Event is not valid! +if(!isset($event->data)) return; + +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$location_id = $this->main->get_master_location_id($event); +$event_location = ($location_id ? $this->main->get_location_data($location_id) : array()); + +$organizer_id = $this->main->get_master_organizer_id($event); +$event_organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + +$event_date = (isset($event->date['start']) ? $event->date['start']['date'] : $event->data->meta['mec_start_date']); +$event_thumb_url = $event->data->featured_image['large']; +$start_date = (isset($event->date['start']) and isset($event->date['start']['date'])) ? $event->date['start']['date'] : date('Y-m-d H:i:s'); +$end_date = (isset($event->date['end']) and isset($event->date['end']['date'])) ? $event->date['end']['date'] : date('Y-m-d H:i:s'); + +$event_time = ''; +if(isset($event->data->time['start_raw'])) $event_time = $event->data->time['start_raw']; +else +{ + $event_time .= sprintf("%02d", ($event->data->meta['mec_date']['start']['hour'] ?? 8)).':'; + $event_time .= sprintf("%02d", ($event->data->meta['mec_date']['start']['minutes'] ?? 0)); + $event_time .= ($event->data->meta['mec_date']['start']['ampm'] ?? 'AM'); +} + +$event_etime = ''; +if(isset($event->data->time['end_raw'])) $event_etime = $event->data->time['end_raw']; +else +{ + $event_etime .= sprintf("%02d", ($event->data->meta['mec_date']['end']['hour'] ?? 6)).':'; + $event_etime .= sprintf("%02d", ($event->data->meta['mec_date']['end']['minutes'] ?? 0)); + $event_etime .= ($event->data->meta['mec_date']['end']['ampm'] ?? 'PM'); +} + +$event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + +$start_time = date('D M j Y G:i:s', strtotime($start_date.' '.date('H:i:s', strtotime($event_time)))); +$end_time = date('D M j Y G:i:s', strtotime($end_date.' '.date('H:i:s', strtotime($event_etime)))); + +$d1 = new DateTime($start_time); +$d2 = new DateTime(current_time("D M j Y G:i:s")); +$d3 = new DateTime($end_time); + +$ongoing = (isset($settings['hide_time_method']) and trim($settings['hide_time_method']) == 'end'); + +// Skip if event is expired +if($ongoing) if($d3 < $d2) $ongoing = false; +if($d1 < $d2 and !$ongoing) return; + +$gmt_offset = $this->main->get_gmt_offset($event, strtotime($start_date)); +if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') === false) $gmt_offset = ' : '.$gmt_offset; +if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') == true) $gmt_offset = ''; + +// Generating javascript code of countdown module +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$occurrence_time = $event->date['start']['timestamp'] ?? strtotime($event->date['start']['date']); + +$book = $this->getBook(); +$availability = $book->get_tickets_availability($event->data->ID, $occurrence_time); +$event_color = $this->get_event_color_dot($event); + +$spots = 0; +$total_spots = -1; +foreach($availability as $ticket_id=>$count) +{ + if(!is_numeric($ticket_id)) + { + $total_spots = $count; + continue; + } + + if($count != '-1') $spots += $count; + else + { + $spots = -1; + break; + } +} + +if($total_spots >= 0) $spots = min($spots, $total_spots); + +do_action('mec_start_skin', $this->id); +do_action('mec_available_spot_skin_head'); +?> +
    +
    + +
    +
    + + +
    + + + get_label_captions($event)); ?> + +
    +
    +
    +
    +
    +
    +
      +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    +
    +
    +
    + +
    + +
    +
    +
    main->date_i18n($this->date_format1, strtotime($event_date))); ?>
    +
    main->date_i18n($this->date_format2, strtotime($event_date))); ?>
    +
    data->time) and isset($event->data->time['start'])) ? esc_html($event->data->time['start']) : ''; ?>data->time) and isset($event->data->time['end']) and trim($event->data->time['end'])) ? esc_html(' - '.$event->data->time['end']) : ''; ?>
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
    +
    + +
    + icons->display('location-pin'); ?> +
    +
    +
    +
    +
    + +
    +
    +
    +

    display_link($event)); ?>main->get_flags($event).$event_color); ?>

    + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?> + data->ID ); ?> + data->post); + + // Safe Excerpt for UTF-8 Strings + if(!trim($excerpt)) + { + $ex = explode(' ', strip_tags(strip_shortcodes($event->data->post->post_content))); + $words = array_slice($ex, 0, 30); + + $excerpt = implode(' ', $words); + } + ?> +
    +

    +
    +
    + +
    +
    +
    + +
    + display_credit_url(); ?> +
    diff --git a/app/skins/carousel.php b/app/skins/carousel.php new file mode 100755 index 0000000..7e48d0e --- /dev/null +++ b/app/skins/carousel.php @@ -0,0 +1,253 @@ + + */ +class MEC_skin_carousel extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'carousel'; + public $date_format_type1_1; + public $date_format_type1_2; + public $date_format_type1_3; + public $date_format_type2_1; + public $date_format_type3_1; + public $archive_link; + public $head_text; + public $autoplay; + public $autoplay_status; + public $loop; + public $count_tablet; + public $count_mobile; + public $navigation; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Date Formats + $this->date_format_type1_1 = (isset($this->skin_options['type1_date_format1']) and trim($this->skin_options['type1_date_format1'])) ? $this->skin_options['type1_date_format1'] : 'd'; + $this->date_format_type1_2 = (isset($this->skin_options['type1_date_format2']) and trim($this->skin_options['type1_date_format2'])) ? $this->skin_options['type1_date_format2'] : 'F'; + $this->date_format_type1_3 = (isset($this->skin_options['type1_date_format3']) and trim($this->skin_options['type1_date_format3'])) ? $this->skin_options['type1_date_format3'] : 'Y'; + + $this->date_format_type2_1 = (isset($this->skin_options['type2_date_format1']) and trim($this->skin_options['type2_date_format1'])) ? $this->skin_options['type2_date_format1'] : 'M d, Y'; + $this->date_format_type3_1 = (isset($this->skin_options['type3_date_format1']) and trim($this->skin_options['type3_date_format1'])) ? $this->skin_options['type3_date_format1'] : 'M d, Y'; + + // Search Form Status + $this->sf_status = false; + + $this->navigation = isset($this->skin_options['navigation']) && $this->skin_options['navigation']; + + // Generate an ID for the sking + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // The style + $this->style = $this->skin_options['style'] ?? 'type1'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'type1'; + + // The archive link + $this->archive_link = $this->skin_options['archive_link'] ?? ''; + + // The Head text + $this->head_text = $this->skin_options['head_text'] ?? ''; + + // Auto Play + $this->autoplay_status = !isset($this->skin_options['autoplay_status']) || trim($this->skin_options['autoplay_status']); + $this->autoplay = (isset($this->skin_options['autoplay']) and trim($this->skin_options['autoplay'])) ? $this->skin_options['autoplay'] : 3000; + + // Loop + $this->loop = !isset($this->skin_options['loop_status']) || trim($this->skin_options['loop_status']); + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // Event Times + $this->include_events_times = $this->skin_options['include_events_times'] ?? false; + $this->localtime = $this->skin_options['include_local_time'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + if($this->widget) + { + $this->skin_options['count'] = '1'; + } + + // The count in row + $this->count = $this->skin_options['count'] ?? '3'; + $this->count_tablet = $this->skin_options['count_tablet'] ?? '2'; + $this->count_mobile = $this->skin_options['count_mobile'] ?? '1'; + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + if((strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false)) + { + $this->maximum_date = $this->start_date; + } + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Apply Maximum Date + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + if($apply_sf_date == 1) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Found Events + $this->found = 0; + + do_action('mec-carousel-initialize-end', $this); + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp', 0)); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + return $date; + } +} diff --git a/app/skins/carousel/index.html b/app/skins/carousel/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/carousel/render.php b/app/skins/carousel/render.php new file mode 100755 index 0000000..8f77faf --- /dev/null +++ b/app/skins/carousel/render.php @@ -0,0 +1,192 @@ +main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) or isset($styling['color'])) ? 'colorskin-custom' : ''; +$settings = $this->main->get_settings(); +$display_label = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; +$reason_for_cancellation = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; +?> +
    + +
    \ No newline at end of file diff --git a/app/skins/carousel/tpl.php b/app/skins/carousel/tpl.php new file mode 100755 index 0000000..3e27c7d --- /dev/null +++ b/app/skins/carousel/tpl.php @@ -0,0 +1,67 @@ +get_render_path(); +$styling = $this->main->get_styling(); + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +// Include OWL Assets +$this->main->load_owl_assets(); + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$loop = ($this->found > 1 ? $this->loop : false); +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +do_action('mec_start_skin', $this->id); +do_action('mec_carousel_skin_head'); +?> + \ No newline at end of file diff --git a/app/skins/countdown.php b/app/skins/countdown.php new file mode 100755 index 0000000..b5e2460 --- /dev/null +++ b/app/skins/countdown.php @@ -0,0 +1,132 @@ + + */ +class MEC_skin_countdown extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'countdown'; + + public $event_id; + public $date_format_style11; + public $date_format_style21; + public $date_format_style31; + public $date_format_style32; + public $date_format_style33; + public $bg_color; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Date Formats + $this->date_format_style11 = (isset($this->skin_options['date_format_style11']) and trim($this->skin_options['date_format_style11'])) ? $this->skin_options['date_format_style11'] : 'j F Y'; + $this->date_format_style21 = (isset($this->skin_options['date_format_style21']) and trim($this->skin_options['date_format_style21'])) ? $this->skin_options['date_format_style21'] : 'j F Y'; + + $this->date_format_style31 = (isset($this->skin_options['date_format_style31']) and trim($this->skin_options['date_format_style31'])) ? $this->skin_options['date_format_style31'] : 'd'; + $this->date_format_style32 = (isset($this->skin_options['date_format_style32']) and trim($this->skin_options['date_format_style32'])) ? $this->skin_options['date_format_style32'] : 'F'; + $this->date_format_style33 = (isset($this->skin_options['date_format_style33']) and trim($this->skin_options['date_format_style33'])) ? $this->skin_options['date_format_style33'] : 'Y'; + + // Background Color + $this->bg_color = (isset($this->skin_options['bg_color']) and trim($this->skin_options['bg_color'])) ? $this->skin_options['bg_color'] : '#437df9'; + + // Search Form Status + $this->sf_status = false; + + $this->id = mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // The style + $this->style = $this->skin_options['style'] ?? 'style1'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'style1'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-skin'] = $this->skin; + + // Event ID + $this->event_id = $this->skin_options['event_id'] ?? '-1'; + if(!get_post($this->event_id)) $this->event_id = '-1'; + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + $events = []; + + // Get next upcoming event ID + if($this->event_id == '-1') + { + $events[] = $this->main->get_next_upcoming_event(); + } + else + { + $rendered = $this->render->data($this->event_id, ($this->atts['content'] ?? '')); + + $data = new stdClass(); + $data->ID = $this->event_id; + $data->data = $rendered; + $data->dates = $this->render->dates($this->event_id, $rendered, $this->maximum_dates); + $data->date = $data->dates[0] ?? []; + + $events[] = $this->render->after_render($data, $this); + } + + return $events; + } +} diff --git a/app/skins/countdown/index.html b/app/skins/countdown/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/countdown/tpl.php b/app/skins/countdown/tpl.php new file mode 100755 index 0000000..5aab534 --- /dev/null +++ b/app/skins/countdown/tpl.php @@ -0,0 +1,251 @@ +main->get_styling(); +$event = $this->events[0]; +$settings = $this->main->get_settings(); +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +// Event is not valid! +if(!isset($event->data)) return; + +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$location_id = $this->main->get_master_location_id($event); +$event_location = ($location_id ? $this->main->get_location_data($location_id) : array()); + +$organizer_id = $this->main->get_master_organizer_id($event); +$event_organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + +$event_date = (isset($event->date['start']) ? $event->date['start']['date'] : $event->data->meta['mec_start_date']); +$event_title = apply_filters('mec_occurrence_event_title', $event->data->title, $event); + +$start_date = (isset($event->date['start']) and isset($event->date['start']['date'])) ? $event->date['start']['date'] : date('Y-m-d H:i:s'); +$end_date = (isset($event->date['end']) and isset($event->date['end']['date'])) ? $event->date['end']['date'] : date('Y-m-d H:i:s'); + +$event_time = ''; +if(isset($event->data->time['start_raw'])) $event_time = $event->data->time['start_raw']; +else +{ + $event_time .= sprintf("%02d", ($event->data->meta['mec_date']['start']['hour'] ?? 8)).':'; + $event_time .= sprintf("%02d", ($event->data->meta['mec_date']['start']['minutes'] ?? 0)); + $event_time .= ($event->data->meta['mec_date']['start']['ampm'] ?? 'AM'); +} + +$event_etime = ''; +if(isset($event->data->time['end_raw'])) $event_etime = $event->data->time['end_raw']; +else +{ + $event_etime .= sprintf("%02d", ($event->data->meta['mec_date']['end']['hour'] ?? 6)).':'; + $event_etime .= sprintf("%02d", ($event->data->meta['mec_date']['end']['minutes'] ?? 0)); + $event_etime .= ($event->data->meta['mec_date']['end']['ampm'] ?? 'PM'); +} + +$start_time = date('D M j Y G:i:s', strtotime($start_date.' '.date('H:i:s', strtotime($event_time)))); +$end_time = date('D M j Y G:i:s', strtotime($end_date.' '.date('H:i:s', strtotime($event_etime)))); + +// Timezone +$TZO = $this->main->get_TZO($event); + +$d1 = new DateTime($start_time, $TZO); +$d2 = new DateTime(current_time("D M j Y G:i:s"), $TZO); +$d3 = new DateTime($end_time, $TZO); + +$countdown_method = get_post_meta($event->ID, 'mec_countdown_method', true); +if(trim($countdown_method) == '') $countdown_method = 'global'; + +if($countdown_method == 'global') $ongoing = (isset($settings['hide_time_method']) and trim($settings['hide_time_method']) == 'end'); +else $ongoing = $countdown_method == 'end'; + +if($ongoing and $d3 < $d2) $ongoing = false; + +// Skip if event is ongoing +if($d1 < $d2 and !$ongoing) return; + +$gmt_offset = $this->main->get_gmt_offset($event, strtotime($start_date)); +if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') === false) $gmt_offset = ' : '.$gmt_offset; +if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') == true) $gmt_offset = substr(trim($gmt_offset), 0 , 3); +if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') == true) $gmt_offset = substr(trim($gmt_offset), 2 , 3); + +// Generating javascript code of countdown module +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +do_action('mec_start_skin', $this->id); +do_action('mec_countdown_skin_head'); +?> + +
    +style == 'style1'): ?> +
    +
    +
    '.esc_html__('Next', 'modern-events-calendar-lite').''); ?>
    +

    main->get_flags($event)); ?> get_label_captions($event ,'mec-fc-style')); ?>

    + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?> +
    +
    +
    +
    main->date_i18n($this->date_format_style11, strtotime($event_date))); ?>
    +
    +
    +
    +
      +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    • + 00 +

      +
    • +
    +
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
    +
    + display_link($event, $this->main->m('event_detail', esc_html__('EVENT DETAIL', 'modern-events-calendar-lite')), 'mec-event-button')); ?> +
    +
    +
    + style == 'style2'): ?> +
    +
    +
    '.esc_html__('Next', 'modern-events-calendar-lite').''); ?>
    +

    main->get_flags($event)); ?> get_label_captions($event,'mec-fc-style')); ?>

    + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?> +
    +
    +
    +
    main->date_i18n($this->date_format_style21, strtotime($event_date))); ?>
    +
    +
    +
    +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
    +
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
    +
    + display_link($event, $this->main->m('event_detail', esc_html__('EVENT DETAIL', 'modern-events-calendar-lite')), 'mec-event-button')); ?> +
    +
    + style == 'style3'): ?> +
    +
    +
    +
    '.esc_html__('Next', 'modern-events-calendar-lite').''); ?>
    +
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
    +
    + main->date_i18n($this->date_format_style31, strtotime($event_date))); ?> + main->date_i18n($this->date_format_style32, strtotime($event_date))); ?> + main->date_i18n($this->date_format_style33, strtotime($event_date))); ?> +
    + +
    +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
      +
    • + 00 +

      +
    • +
      +
    +
    +
    +
    +
    +
    + display_link($event, $event->data->thumbnails['meccarouselthumb'], '')); ?> +
    +
    +
    + + display_credit_url(); ?> +
    \ No newline at end of file diff --git a/app/skins/cover.php b/app/skins/cover.php new file mode 100755 index 0000000..c7e2da3 --- /dev/null +++ b/app/skins/cover.php @@ -0,0 +1,124 @@ + + */ +class MEC_skin_cover extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'cover'; + + public $event_id; + public $date_format_clean1; + public $date_format_clean2; + public $date_format_clean3; + public $date_format_classic1; + public $date_format_classic2; + public $date_format_modern1; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Date Formats + $this->date_format_clean1 = (isset($this->skin_options['date_format_clean1']) and trim($this->skin_options['date_format_clean1'])) ? $this->skin_options['date_format_clean1'] : 'd'; + $this->date_format_clean2 = (isset($this->skin_options['date_format_clean2']) and trim($this->skin_options['date_format_clean2'])) ? $this->skin_options['date_format_clean2'] : 'M'; + $this->date_format_clean3 = (isset($this->skin_options['date_format_clean3']) and trim($this->skin_options['date_format_clean3'])) ? $this->skin_options['date_format_clean3'] : 'Y'; + + $this->date_format_classic1 = (isset($this->skin_options['date_format_classic1']) and trim($this->skin_options['date_format_classic1'])) ? $this->skin_options['date_format_classic1'] : 'F d'; + $this->date_format_classic2 = (isset($this->skin_options['date_format_classic2']) and trim($this->skin_options['date_format_classic2'])) ? $this->skin_options['date_format_classic2'] : 'l'; + + $this->date_format_modern1 = (isset($this->skin_options['date_format_modern1']) and trim($this->skin_options['date_format_modern1'])) ? $this->skin_options['date_format_modern1'] : 'l, F d Y'; + + // Search Form Status + $this->sf_status = false; + + $this->id = mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // The style + $this->style = $this->skin_options['style'] ?? 'classic'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'classic'; + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-skin'] = $this->skin; + + $this->event_id = $this->skin_options['event_id'] ?? 0; + $this->maximum_dates = $this->atts['maximum_dates'] ?? 6; + } + + /** + * Search and returns the filtered events + * @return array of objects + * @throws Exception + * @author Webnus + */ + public function search() + { + if(!get_post($this->event_id)) return []; + + $events = []; + $rendered = $this->render->data($this->event_id, ($this->atts['content'] ?? '')); + + $data = new stdClass(); + $data->ID = $this->event_id; + $data->data = $rendered; + $data->dates = $this->render->dates($this->event_id, $rendered, $this->maximum_dates); + $data->date = $data->dates[0] ?? []; + + $events[] = $this->render->after_render($data, $this); + + return $events; + } +} diff --git a/app/skins/cover/index.html b/app/skins/cover/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/cover/tpl.php b/app/skins/cover/tpl.php new file mode 100755 index 0000000..9d92072 --- /dev/null +++ b/app/skins/cover/tpl.php @@ -0,0 +1,85 @@ +main->get_styling(); +$event = $this->events[0]; +$settings = $this->main->get_settings(); +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +// Event is not valid! +if(!isset($event->data)) return; + +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$location_id = $this->main->get_master_location_id($event); +$event_location = ($location_id ? $this->main->get_location_data($location_id) : array()); + +$organizer_id = $this->main->get_master_organizer_id($event); +$event_organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + +$event_date = (isset($event->date['start']) ? $event->date['start']['date'] : $event->data->meta['mec_start_date']); +$event_link = (isset($event->data->permalink) and trim($event->data->permalink)) ? $this->main->get_event_date_permalink($event, $event_date) : get_permalink($event->data->ID); +$event_color = $this->get_event_color_dot($event); +$event_thumb = $event->data->thumbnails['large']; +$event_thumb_url = $event->data->featured_image['large']; +$event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_cover_skin_head'); +?> +
    +style == 'modern' and $event_thumb_url): ?> +
    + +
    +
    + get_label_captions($event,'mec-fc-style')); ?> +
    main->date_i18n($this->date_format_modern1, strtotime($event_date))).((isset($event->data->time) and trim($event->data->time['start'])) ? ' - '.esc_html($event->data->time['start']) : ''); ?>
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +

    data->title, $event).$this->main->get_flags($event).$event_color); ?>

    + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?> +
    +
    +
    +
    + +
    +
    +
    + style == 'classic'): ?> +
    + +
    + main->date_i18n($this->date_format_classic1, strtotime($event_date))); ?> main->date_i18n($this->date_format_classic2, strtotime($event_date))); ?> +
    + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> +

    data->title, $event).$this->main->get_flags($event).$event_color); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?>get_label_captions($event,'mec-fc-style')); ?>

    +
    display_link($event, $this->main->m('event_detail', esc_html__('EVENT DETAIL', 'modern-events-calendar-lite')), 'mec-event-button')); ?>
    +
    + style == 'clean'): ?> +
    +

    display_link($event, NULL, '')); ?>main->get_flags($event).$event_color); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?>get_label_captions($event,'mec-fc-style')); ?>

    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
    +
    +
    +
    main->date_i18n($this->date_format_clean1, strtotime($event_date))); ?>
    +
    main->date_i18n($this->date_format_clean2, strtotime($event_date))); ?>
    +
    main->date_i18n($this->date_format_clean3, strtotime($event_date))); ?>
    +
    + +
    + + display_credit_url(); ?> +
    diff --git a/app/skins/custom.php b/app/skins/custom.php new file mode 100755 index 0000000..96efb8d --- /dev/null +++ b/app/skins/custom.php @@ -0,0 +1,295 @@ + + */ +class MEC_skin_custom extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'custom'; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_custom_load_more', array($this, 'load_more')); + $this->factory->action('wp_ajax_nopriv_mec_custom_load_more', array($this, 'load_more')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // The style + $this->style = $this->skin_options['style'] ?? 'modern'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'modern'; + + $this->month_divider = isset($this->skin_options['month_divider']) ? $this->skin_options['month_divider'] : true; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = isset($this->atts['sf_status']) ? $this->atts['sf_status'] : true; + $this->sf_display_label = isset($this->atts['sf_display_label']) ? $this->atts['sf_display_label'] : false; + $this->sf_reset_button = isset($this->atts['sf_reset_button']) ? $this->atts['sf_reset_button'] : false; + $this->sf_refine = isset($this->atts['sf_refine']) ? $this->atts['sf_refine'] : false; + + // Generate an ID for the sking + $this->id = isset($this->atts['id']) ? $this->atts['id'] : mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Show "Load More" button or not + $this->load_more_button = isset($this->skin_options['load_more_button']) ? $this->skin_options['load_more_button'] : true; + + // Pagination + $this->pagination = isset($this->skin_options['pagination']) ? $this->skin_options['pagination'] : (!$this->load_more_button ? '0' : 'loadmore'); + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + if($this->widget) + { + $this->skin_options['count'] = '1'; + $this->load_more_button = false; + $this->pagination = '0'; + } + + // The count in row + $this->count = $this->skin_options['count'] ?? '3'; + + // Map geolocation + $this->geolocation = ((isset($this->skin_options['map_on_top']) and (isset($this->skin_options['set_geolocation']))) and ($this->skin_options['map_on_top'] == '1' and $this->skin_options['set_geolocation'] == '1')) ? true : false; + + // Map on top + $this->map_on_top = $this->skin_options['map_on_top'] ?? false; + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Exclude Posts + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $this->args['post__not_in'] = $this->atts['exclude']; + + // Include Posts + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $this->args['post__in'] = $this->atts['include']; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + $this->maximum_date = $this->start_date; + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Set start time + if(isset($this->atts['seconds'])) + { + $this->args['mec-seconds'] = $this->atts['seconds']; + $this->args['mec-seconds-date'] = $this->atts['seconds_date'] ?? $this->start_date; + } + + // Apply Maximum Date + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Found Events + $this->found = 0; + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp', 0)); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + return $date; + } + + /** + * Load more events for AJAX request + * @author Webnus + * @return void + */ + public function load_more() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Override variables + $this->start_date = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + $this->end_date = $this->start_date; + $this->offset = isset($_REQUEST['mec_offset']) ? sanitize_text_field($_REQUEST['mec_offset']) : 0; + + // Apply Maximum Date + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Return the events + $this->atts['return_items'] = true; + $this->loading_more = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } + + /** + * Generates skin output + * @author Webnus + * @return string + */ + public function output(){ + + $booking_button_status = (bool)($this->skin_options['booking_button'] ?? 0); + if( $booking_button_status ){ + + add_filter( 'mec_shortcode_designer_readmore_button_status', '__return_true' ); + } + + $html = parent::output(); + + remove_filter( 'mec_shortcode_designer_readmore_button_status', '__return_true' ); + + return $html; + } +} diff --git a/app/skins/custom/index.html b/app/skins/custom/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/custom/render.php b/app/skins/custom/render.php new file mode 100755 index 0000000..0ed965c --- /dev/null +++ b/app/skins/custom/render.php @@ -0,0 +1,139 @@ +main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; +$settings = $this->main->get_settings(); +$current_month_divider = isset($_REQUEST['current_month_divider']) ? sanitize_text_field($_REQUEST['current_month_divider']) : 0; + +global $MEC_Shortcode_id; +$MEC_Shortcode_id = !empty($MEC_Shortcode_id) ? $MEC_Shortcode_id : $this->atts['id']; + +// colorful +$colorful_flag = $colorful_class = ''; +if($this->style == 'colorful') +{ + $colorful_flag = true; + $this->style = 'modern'; + $colorful_class = ' mec-event-custom-colorful'; +} + +global $mec_enqueue_custom_css; +$is_load_more = 'mec_custom_load_more' === ($_REQUEST['action'] ?? '') ? true : false; +$with_css = $is_load_more ? false : true; + +?> +
    +
    + count; + + if($count == 0 or $count == 5) $col = 4; + else $col = 12 / $count; + global $post; + global $mec_old_post; + $mec_old_post = $post; + + $rcount = 1; + if(!empty($this->events)) + { + foreach($this->events as $date => $events) + { + $month_id = date('Ym', strtotime($date)); + foreach($events as $event) + { + global $post; + $post = $event->data->post; + + if($this->count == '1' and $this->month_divider and $month_id != $current_month_divider): $current_month_divider = $month_id; ?> +
    main->date_i18n('F Y', strtotime($date))); ?>
    + ' : ''; + echo '
    '; + echo '
    '; + + if( isset( $mec_enqueue_custom_css[ $this->style ] ) ) { + + $with_css = false; + }else{ + + $mec_enqueue_custom_css[ $this->style ] = true; + } + + echo Plugin::instance()->frontend->get_builder_content_for_display($this->style, $with_css); + echo '
    '; + + if($rcount == $count) + { + echo '
    '; + $rcount = 0; + } + + $rcount++; + } + } + } + + global $post; + global $mec_old_post; + $post = $mec_old_post; + ?> +
    + + $value) + { + foreach($value as $keyy => $valuee) $map_eventss[] = $valuee; + } +} + +if(isset($this->map_on_top) and $this->map_on_top): +if(isset($map_eventss) and !empty($map_eventss)) +{ + // Include Map Assets such as JS and CSS libraries + $this->main->load_map_assets(); + + $map_javascript = ''; + + $map_data = new stdClass; + $map_data->id = $this->id; + $map_data->atts = $this->atts; + $map_data->events = $map_eventss; + $map_data->render = $this->render; + $map_data->geolocation = $this->geolocation; + $map_data->sf_status = null; + $map_data->main = $this->main; + + $map_javascript = apply_filters('mec_map_load_script', $map_javascript, $map_data, $settings); + + // Include javascript code into the page + if($this->main->is_ajax()) echo MEC_kses::full($map_javascript); + else $this->factory->params('footer', $map_javascript); +} +endif; \ No newline at end of file diff --git a/app/skins/custom/tpl.php b/app/skins/custom/tpl.php new file mode 100755 index 0000000..ada0695 --- /dev/null +++ b/app/skins/custom/tpl.php @@ -0,0 +1,87 @@ +get_render_path(); + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('html' => $items_html, 'end_date' => $this->end_date, 'offset' => $this->next_offset, 'count' => $this->found, 'has_more_event' => (int) $this->has_more_events)); + exit; +} + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +do_action('mec_start_skin', $this->id); +do_action('mec_custom_skin_head'); +?> +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + + found): ?> + map_on_top == '1'): ?> +
    +
    + settings['default_maps_view'])?$this->settings['default_maps_view']:'google'; + do_action('mec_map_inner_element_tools', array('map' => $map)); + ?> +
    + +
    + +
    + +
    +
    + main->display_not_found_message(); ?> +
    + +
    + main->display_not_found_message(); ?> +
    + + + get_pagination_bar(); ?> + +
    +display_credit_url(); \ No newline at end of file diff --git a/app/skins/daily_view.php b/app/skins/daily_view.php new file mode 100755 index 0000000..4150fd1 --- /dev/null +++ b/app/skins/daily_view.php @@ -0,0 +1,424 @@ + + */ +class MEC_skin_daily_view extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'daily_view'; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_daily_view_load_month', array($this, 'load_month')); + $this->factory->action('wp_ajax_nopriv_mec_daily_view_load_month', array($this, 'load_month')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + $this->style = $this->skin_options['style'] ?? 'classic'; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = isset($this->atts['sf_display_label']) ? $this->atts['sf_display_label'] : false; + $this->sf_reset_button = isset($this->atts['sf_reset_button']) ? $this->atts['sf_reset_button'] : false; + $this->sf_refine = isset($this->atts['sf_refine']) ? $this->atts['sf_refine'] : false; + + // Generate an ID for the skin + $this->id = isset($this->atts['id']) ? $this->atts['id'] : mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) ? $this->skin_options['next_previous_button'] : true; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // From Full Calendar + $this->from_full_calendar = (isset($this->skin_options['from_fc']) and trim($this->skin_options['from_fc'])); + + // Display Price + $this->display_price = (isset($this->skin_options['display_price']) and trim($this->skin_options['display_price'])); + + // Detailed Time + $this->display_detailed_time = (isset($this->skin_options['detailed_time']) and trim($this->skin_options['detailed_time'])); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + if($this->show_only_expired_events) $this->atts['show_past_events'] = '1'; + + // Show Past Events + $this->args['mec-past-events'] = isset($this->atts['show_past_events']) ? $this->atts['show_past_events'] : '0'; + + // Start Date + list($this->year, $this->month, $this->day) = $this->get_start_date(); + + $this->start_date = $this->year.'-'.$this->month.'-01'; + $this->active_day = $this->year.'-'.$this->month.'-'.$this->day; + + // Set the maximum date in current month + if($this->show_only_expired_events) $this->maximum_date = date('Y-m-d H:i:s', current_time('timestamp')); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Auto Month Rotation + $this->auto_month_rotation = !isset($this->settings['auto_month_rotation']) || $this->settings['auto_month_rotation']; + + do_action('mec-daily-initialize-end', $this); + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + if($this->show_only_expired_events) + { + $start = date('Y-m-d H:i:s', current_time('timestamp')); + $end = $this->start_date; + } + else + { + $start = $this->start_date; + $end = date('Y-m-t', strtotime($this->start_date)); + } + + // Date Events + $dates = $this->period($start, $end, true); + + $s = $this->start_date; + + $sorted = []; + while(date('m', strtotime($s)) == $this->month) + { + if(isset($dates[$s])) $sorted[$s] = $dates[$s]; + else $sorted[$s] = []; + + $s = date('Y-m-d', strtotime('+1 Day', strtotime($s))); + } + + $dates = $sorted; + + // Limit + $this->args['posts_per_page'] = $this->limit; + + $events = []; + $qs = []; + + foreach($dates as $date=>$IDs) + { + // Check Finish Date + if(isset($this->maximum_date) and trim($this->maximum_date) and strtotime($date) > strtotime($this->maximum_date)) + { + $events[$date] = []; + continue; + } + + // Include Available Events + $this->args['post__in'] = array_unique($IDs); + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // Extending the end date + $this->end_date = $date; + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + // Query Key + $q_key = base64_encode(json_encode($this->args)); + + // Get From Cache + if(isset($qs[$q_key])) $query = $qs[$q_key]; + // Search & Cache + else + { + $query = new WP_Query($this->args); + $qs[$q_key] = $query; + } + + if(is_array($IDs) and count($IDs) and $query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $ID_count = isset($IDs_count[$ID]) ? $IDs_count[$ID] : 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date' => $date), + 'end' => array('date' => $this->main->get_end_date($date, $rendered)) + ); + + $d[] = $this->render->after_render($data, $this, $i); + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + else + { + $events[$date] = []; + } + + // Restore original Post Data + wp_reset_postdata(); + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + return $events; + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return array + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $yesterday = date('Y-m-d', strtotime('Yesterday')); + if(strtotime($date) > strtotime($yesterday)) $date = $yesterday; + } + + $time = strtotime($date); + return array(date('Y', $time), date('m', $time), date('d', $time)); + } + + /** + * Returns label of dates + * @author Webnus + * @return string + */ + public function get_date_labels() + { + $labels = ''; + } + + /** + * Load month for AJAX request + * @author Webnus + * @return void + */ + public function load_month() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $navigator_click = isset($_REQUEST['navigator_click']) && sanitize_text_field($_REQUEST['navigator_click']); + + // Initialize the skin + $this->initialize($atts); + + // Daily view search repeat if not found in current month + $c = 0; + $break = false; + + do + { + if($c > 12) $break=true; + if($c and !$break) + { + if(intval($this->month == 12)) + { + $this->year = intval($this->year)+1; + $this->month = '01'; + } + + $this->month = sprintf("%02d", intval($this->month)+1); + } + else + { + // Start Date + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : current_time('Y'); + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : current_time('m'); + } + + $this->day = '1'; + + $this->start_date = $this->year.'-'.$this->month.'-01'; + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Return the events + $this->atts['return_items'] = true; + + // Fetch the events + $this->fetch(); + + // Break the loop if not result + if($break) break; + if($navigator_click) break; + + // Auto Rotation is Disabled + if(!$this->auto_month_rotation) break; + + $c++; + + } + while(!array_filter($this->events) and count($this->sf)); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/daily_view/index.html b/app/skins/daily_view/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/daily_view/render.php b/app/skins/daily_view/render.php new file mode 100755 index 0000000..d877965 --- /dev/null +++ b/app/skins/daily_view/render.php @@ -0,0 +1,60 @@ +localtime = isset($this->skin_options['include_local_time']) ? $this->skin_options['include_local_time'] : false; +$display_label = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; +$reason_for_cancellation = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; +?> +
      + events as $date=>$events): ?> +
    • + + + main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $event_color = $this->get_event_color_dot($event); + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + $mec_data = $this->display_custom_data($event); + $custom_data_class = !empty($mec_data) ? 'mec-custom-data' : ''; + + // MEC Schema + do_action('mec_schema', $event); + ?> +
      +
      +
      data->thumbnails['thumbnail']); ?>
      +
      + get_label_captions($event)); ?> + + display_detailed_time and $this->main->is_multipleday_occurrence($event)): ?> +
      icons->display('clock-o'); ?> display_detailed_time($event)); ?>
      + +
      icons->display('clock-o'); ?>
      + + +

      display_link($event)); ?>display_custom_data($event)); ?>main->get_flags($event).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?>

      + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> +
      + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + booking_button($event)); ?> +
      +
      +
      + + +
      + +
    • + +
    + \ No newline at end of file diff --git a/app/skins/daily_view/tpl.php b/app/skins/daily_view/tpl.php new file mode 100755 index 0000000..0ced81d --- /dev/null +++ b/app/skins/daily_view/tpl.php @@ -0,0 +1,146 @@ +get_render_path(); + +// before/after Month +$_1month_before = strtotime('-1 Month', strtotime($this->start_date)); +$_1month_after = strtotime('+1 Month', strtotime($this->start_date)); + +// Current month time +$current_month_time = strtotime($this->start_date); + +$date_labels = $this->get_date_labels(); + +// Generate Events +ob_start(); +include $render_path; +$date_events = ob_get_clean(); + +$navigator_html = ''; + +// Generate Month Navigator +if($this->next_previous_button) +{ + // Show previous month handler if showing past events allowed + if(!isset($this->atts['show_past_events']) or + (isset($this->atts['show_past_events']) and $this->atts['show_past_events']) or + (isset($this->atts['show_past_events']) and !$this->atts['show_past_events'] and strtotime(date('Y-m-t', $_1month_before)) >= time()) + ) + { + $navigator_html .= '
    '; + } + + $navigator_html .= '

    '.esc_html($this->main->date_i18n('Y F', $current_month_time)).'

    '; + + // Show next month handler if needed + if(!$this->show_only_expired_events or + ($this->show_only_expired_events and strtotime(date('Y-m-01', $_1month_after)) <= time()) + ) + { + $navigator_html .= '
    '; + } +} + +$month_html = '
    +
    '.MEC_kses::element($date_labels).'
    +
    '.MEC_kses::full($date_events).'
    '; + +// Return the data if called by AJAX +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array( + 'month' => $month_html, + 'navigator' => $navigator_html, + 'previous_month' => array('label' => $this->main->date_i18n('Y F', $_1month_before), 'id' => date('Ym', $_1month_before), 'year' => date('Y', $_1month_before), 'month' => date('m', $_1month_before)), + 'current_month' => array('label' => $this->main->date_i18n('Y F', $current_month_time), 'id' => date('Ym', $current_month_time), 'year' => date('Y', $current_month_time), 'month' => date('m', $current_month_time)), + 'next_month' => array('label' => $this->main->date_i18n('Y F', $_1month_after), 'id' => date('Ym', $_1month_after), 'year' => date('Y', $_1month_after), 'month' => date('m', $_1month_after)), + )); + exit; +} + +// Include OWL Assets +$this->main->load_owl_assets(); + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$styling = $this->main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_daily_skin_head'); +?> +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + +
    + next_previous_button): ?> +
    +
    +
    + +

    main->date_i18n('Y F', $current_month_time)); ?>

    + + +
    +
    + +
    +
    +
    + + subscribe_to_calendar(); ?> + display_credit_url(); ?> + +
    \ No newline at end of file diff --git a/app/skins/default_full_calendar.php b/app/skins/default_full_calendar.php new file mode 100755 index 0000000..d98774c --- /dev/null +++ b/app/skins/default_full_calendar.php @@ -0,0 +1,265 @@ + + */ +class MEC_skin_default_full_calendar extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'default_full_calendar'; + + public $default_view; + public $monthly_style; + public $yearly; + public $monthly; + public $weekly; + public $daily; + public $list; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_full_calendar_switch_skin', array($this, 'switch_skin')); + $this->factory->action('wp_ajax_nopriv_mec_full_calendar_switch_skin', array($this, 'switch_skin')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + $this->style = $this->skin_options['style'] ?? 'classic'; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = isset($this->atts['sf_display_label']) ? $this->atts['sf_display_label'] : false; + $this->sf_reset_button = isset($this->atts['sf_reset_button']) ? $this->atts['sf_reset_button'] : false; + $this->sf_refine = isset($this->atts['sf_refine']) ? $this->atts['sf_refine'] : false; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // Generate an ID for the skin + $this->id = isset($this->atts['id']) ? $this->atts['id'] : mt_rand(100, 999); + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // Default View of Full Calendar + $this->default_view = $this->skin_options['default_view'] ?? 'list'; + if(isset($this->skin_options[$this->default_view]) and !$this->skin_options[$this->default_view]) $this->default_view = 'list'; + + // Default style for Monthly View + $this->monthly_style = $this->skin_options['monthly_style'] ?? 'clean'; + if(isset($this->skin_options[$this->monthly_style]) and !$this->skin_options[$this->monthly_style]) $this->monthly_style = 'clean'; + + + $this->yearly = isset($this->skin_options['yearly']) ? $this->skin_options['yearly'] : true; + $this->monthly = isset($this->skin_options['monthly']) ? $this->skin_options['monthly'] : true; + $this->weekly = isset($this->skin_options['weekly']) ? $this->skin_options['weekly'] : true; + $this->daily = isset($this->skin_options['daily']) ? $this->skin_options['daily'] : true; + $this->list = isset($this->skin_options['list']) ? $this->skin_options['list'] : true; + + // If all of skins are disabled + if(!$this->monthly and !$this->weekly and !$this->daily and !$this->list and !$this->yearly) + { + $this->monthly = true; + $this->list = true; + } + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + } + + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_expired_events) and $this->show_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp', 0)); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + return $date; + } + + public function search() + { + } + + public function load_skin($skin = 'list') + { + switch($skin) + { + case 'yearly': + + $atts = $this->atts; + + $start_date_type = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : 'start_current_year'; + + if($start_date_type == 'start_current_month') $start_date_type = 'start_current_year'; + elseif($start_date_type == 'start_next_month') $start_date_type = 'start_next_year'; + else $start_date_type = 'date'; + + $atts['sk-options']['yearly_view']['start_date_type'] = $start_date_type; + $atts['sk-options']['yearly_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : current_time('Y-01-01'); + $atts['sk-options']['yearly_view']['style'] = 'modern'; + $atts['sk-options']['yearly_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['yearly_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['yearly_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sf_status'] = false; + + $output = $this->render->vyear($atts); + + break; + + case 'monthly': + + $atts = $this->atts; + $atts['sk-options']['monthly_view']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['monthly_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['monthly_view']['style'] = $this->monthly_style; + $atts['sk-options']['monthly_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['monthly_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['monthly_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sf_status'] = false; + + $output = $this->render->vmonth($atts); + + break; + + case 'weekly': + + $atts = $this->atts; + $atts['sk-options']['weekly_view']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['weekly_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['weekly_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['weekly_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['weekly_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sf_status'] = false; + + $output = $this->render->vweek($atts); + + break; + + case 'daily': + + $atts = $this->atts; + $atts['sk-options']['daily_view']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['daily_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['daily_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['daily_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['daily_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sf_status'] = false; + + $output = $this->render->vday($atts); + + break; + + case 'list': + default: + + $atts = $this->atts; + $atts['sk-options']['list']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['list']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['list']['style'] = 'standard'; + $atts['sk-options']['list']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['list']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['list']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['list']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sf_status'] = false; + + $output = $this->render->vlist($atts); + + break; + } + + return $output; + } + + /** + * Load skin for AJAX request + * @author Webnus + * @return void + */ + public function switch_skin() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $skin = isset($_REQUEST['skin']) ? sanitize_text_field($_REQUEST['skin']) : 'list'; + + // Single Event Display + $atts['sed_method'] = isset($_REQUEST['sed']) ? sanitize_text_field($_REQUEST['sed']) : 0; + $atts['image_popup'] = isset($_REQUEST['image']) ? sanitize_text_field($_REQUEST['image']) : 0; + + // Initialize the skin + $this->initialize($atts); + + // Return the output + $output = $this->load_skin($skin); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/default_full_calendar/index.html b/app/skins/default_full_calendar/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/default_full_calendar/tpl.php b/app/skins/default_full_calendar/tpl.php new file mode 100755 index 0000000..270a4dd --- /dev/null +++ b/app/skins/default_full_calendar/tpl.php @@ -0,0 +1,98 @@ +main->load_owl_assets(); + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$styling = $this->main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin'] ) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_full_skin_head'); +?> +
    + +
    + sf_status): ?> + "dropdown"); + $sf_text_search = array( "type"=> "text_input" ); + + $sf_month_filter_status = true; + $sf_text_search_status = true; + + $sf_columns = 7; + ?> +
    + +
    + sf_search_field('month_filter', $sf_month_filter , 0)); ?> +
    + +
    + + sf_search_field('text_search', $sf_text_search , 0)); ?> + +
    + +
    +
    +
    + yearly): ?> + monthly): ?> + weekly): ?> + daily): ?> + list): ?> +
    +
    +
    + +
    + load_skin($this->default_view)); ?> +
    + +
    + \ No newline at end of file diff --git a/app/skins/full_calendar.php b/app/skins/full_calendar.php new file mode 100755 index 0000000..ceb35a4 --- /dev/null +++ b/app/skins/full_calendar.php @@ -0,0 +1,458 @@ + + */ +class MEC_skin_full_calendar extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'full_calendar'; + + public $include_local_time; + public $reason_for_cancellation; + public $display_label; + public $default_view; + public $monthly_style; + public $yearly; + public $monthly; + public $weekly; + public $daily; + public $list; + public $list_date_end; + public $list_maximum_date; + public $grid; + public $grid_date_end; + public $grid_maximum_date; + public $tile; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_full_calendar_switch_skin', array($this, 'switch_skin')); + $this->factory->action('wp_ajax_nopriv_mec_full_calendar_switch_skin', array($this, 'switch_skin')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + $this->style = $this->skin_options['style'] ?? 'classic'; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) && $this->skin_options['next_previous_button'] ? true : false; + + // Search Form Status + $this->sf_status = isset($this->atts['sf_status']) ? $this->atts['sf_status'] : true; + $this->sf_display_label = isset($this->atts['sf_display_label']) ? $this->atts['sf_display_label'] : false; + $this->sf_reset_button = isset($this->atts['sf_reset_button']) ? $this->atts['sf_reset_button'] : false; + $this->sf_refine = isset($this->atts['sf_refine']) ? $this->atts['sf_refine'] : false; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + $this->args['mec-past-events'] = isset($this->atts['show_past_events']) ? $this->atts['show_past_events'] : '0'; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + + // Include Local Time + $this->include_local_time = (isset($this->skin_options['include_local_time']) and trim($this->skin_options['include_local_time'])) ? '1' : '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // Generate an ID for the skin + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // reason_for_cancellation + $this->reason_for_cancellation = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + + // display_label + $this->display_label = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + + // Default View of Full Calendar + $this->default_view = isset($this->skin_options['default_view']) ? $this->skin_options['default_view'] : 'list'; + + // Default style for Monthly View + $this->monthly_style = isset($this->skin_options['monthly_style']) ? $this->skin_options['monthly_style'] : 'clean'; + if(isset($this->skin_options[$this->monthly_style]) and !$this->skin_options[$this->monthly_style]) $this->monthly_style = 'clean'; + + $this->yearly = (isset($this->skin_options['yearly']) and $this->getPRO()) ? $this->skin_options['yearly'] : false; + $this->monthly = isset($this->skin_options['monthly']) ? $this->skin_options['monthly'] : true; + $this->weekly = isset($this->skin_options['weekly']) ? $this->skin_options['weekly'] : true; + $this->daily = isset($this->skin_options['daily']) ? $this->skin_options['daily'] : true; + $this->list = isset($this->skin_options['list']) ? $this->skin_options['list'] : true; + $this->grid = isset($this->skin_options['grid']) ? $this->skin_options['grid'] : true; + $this->tile = isset($this->skin_options['tile']) ? $this->skin_options['tile'] : true; + + // If all the skins are disabled + if(!$this->monthly and !$this->weekly and !$this->daily and !$this->list and !$this->yearly and !$this->grid and !$this->tile) + { + $this->monthly = true; + $this->list = true; + } + + // Validate Default View + if(isset($this->{$this->default_view}) and !$this->{$this->default_view}) $this->default_view = 'list'; + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + do_action('mec-full-calendar-initialize-end', $this); + } + + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_expired_events) and $this->show_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp')); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + return $date; + } + + public function search() + { + } + + public function prepare_skin_options( $skin, $atts ) { + + switch($skin) + { + case 'yearly': + + $start_date_type = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : 'start_current_year'; + + if($start_date_type == 'start_current_month') $start_date_type = 'start_current_year'; + elseif($start_date_type == 'start_next_month') $start_date_type = 'start_next_year'; + else $start_date_type = 'date'; + + $atts['sk-options']['yearly_view']['start_date_type'] = $start_date_type; + $atts['sk-options']['yearly_view']['start_date'] = (isset($this->skin_options['start_date']) and trim($this->skin_options['start_date'])) ? $this->skin_options['start_date'] : current_time('Y-01-01'); + $atts['sk-options']['yearly_view']['style'] = 'modern'; + $atts['sk-options']['yearly_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['yearly_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['yearly_view']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['yearly_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['yearly_view']['modern_date_format1'] = isset($this->skin_options['date_format_yearly_1']) ? $this->skin_options['date_format_yearly_1'] : 'l'; + $atts['sk-options']['yearly_view']['modern_date_format2'] = isset($this->skin_options['date_format_yearly_2']) ? $this->skin_options['date_format_yearly_2'] : 'F j'; + $atts['sk-options']['yearly_view']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['yearly_view']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['yearly_view']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['yearly_view']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['yearly_view']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-yearly', $atts, $this, 'yearly_view'); + + break; + + case 'monthly': + + $start_date_type = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : 'today'; + if($start_date_type == 'today') $start_date_type = 'start_current_month'; + + $atts['sk-options']['monthly_view']['start_date_type'] = $start_date_type; + $atts['sk-options']['monthly_view']['start_date'] = $this->skin_options['start_date'] ?? ''; + $atts['sk-options']['monthly_view']['style'] = $this->monthly_style; + $atts['sk-options']['monthly_view']['sed_method'] = $this->skin_options['sed_method'] ?? '0'; + $atts['sk-options']['monthly_view']['image_popup'] = $this->skin_options['image_popup'] ?? '0'; + $atts['sk-options']['monthly_view']['display_price'] = $this->skin_options['display_price'] ?? 0; + $atts['sk-options']['monthly_view']['limit'] = $this->skin_options['limit'] ?? 12; + $atts['sk-options']['monthly_view']['display_label'] = $this->skin_options['display_label'] ?? false; + $atts['sk-options']['monthly_view']['mobile_clean_style'] = $this->skin_options['mobile_clean_style'] ?? false; + $atts['sk-options']['monthly_view']['reason_for_cancellation'] = $this->skin_options['reason_for_cancellation'] ?? false; + $atts['sk-options']['monthly_view']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['monthly_view']['activate_first_date'] = $this->skin_options['activate_first_date'] ?? '0'; + $atts['sk-options']['monthly_view']['activate_current_day'] = $this->skin_options['activate_current_day'] ?? '1'; + $atts['sk-options']['monthly_view']['display_all'] = $this->skin_options['display_all'] ?? 0; + $atts['sk-options']['monthly_view']['booking_button'] = $this->skin_options['booking_button'] ?? 0; + $atts['sk-options']['monthly_view']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-monthly', $atts, $this, 'monthly_view'); + + break; + + case 'weekly': + + $start_date_type = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : 'today'; + if($start_date_type == 'today') $start_date_type = 'start_current_month'; + + $atts['sk-options']['weekly_view']['start_date_type'] = $start_date_type; + $atts['sk-options']['weekly_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['weekly_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['weekly_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['weekly_view']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['weekly_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['weekly_view']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['weekly_view']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['weekly_view']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['weekly_view']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['weekly_view']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-weekly', $atts, $this, 'weekly_view'); + + break; + + case 'daily': + + $atts['sk-options']['daily_view']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['daily_view']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['daily_view']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['daily_view']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['daily_view']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['daily_view']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['daily_view']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['daily_view']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['daily_view']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['daily_view']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['daily_view']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-daily', $atts, $this, 'daily_view'); + + break; + + case 'grid': + + // Maximum Date Range. + $end_date_type = (isset($this->skin_options['end_date_type_grid']) and trim($this->skin_options['end_date_type_grid'])) ? trim($this->skin_options['end_date_type_grid']) : 'date'; + + if($end_date_type === 'today') $maximum_date = current_time('Y-m-d'); + elseif($end_date_type === 'tomorrow') $maximum_date = date('Y-m-d', strtotime('Tomorrow')); + else $maximum_date = (isset($this->skin_options['maximum_date_range_grid']) and trim($this->skin_options['maximum_date_range_grid'])) ? trim($this->skin_options['maximum_date_range_grid']) : ''; + + $atts['sk-options']['grid']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['grid']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['grid']['end_date_type'] = $end_date_type; + $atts['sk-options']['grid']['maximum_date_range'] = $maximum_date; + $atts['sk-options']['grid']['order_method'] = ((isset($this->skin_options['order_method_grid']) and trim($this->skin_options['order_method_grid'])) ? $this->skin_options['order_method_grid'] : 'ASC'); + $atts['sk-options']['grid']['style'] = 'modern'; + $atts['sk-options']['grid']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['grid']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['grid']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['grid']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['grid']['modern_date_format1'] = 'd'; + $atts['sk-options']['grid']['modern_date_format2'] = 'F'; + $atts['sk-options']['grid']['modern_date_format3'] = 'l'; + $atts['sk-options']['grid']['count'] = '3'; + $atts['sk-options']['grid']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['grid']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['grid']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['grid']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['grid']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-grid', $atts, $this, 'grid'); + + break; + + case 'tile': + + $atts['sk-options']['tile']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['tile']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['tile']['style'] = 'clean'; + $atts['sk-options']['tile']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['tile']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['tile']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['tile']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['tile']['clean_date_format1'] = 'j'; + $atts['sk-options']['tile']['clean_date_format2'] = 'M'; + $atts['sk-options']['tile']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['tile']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['tile']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['tile']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['tile']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-tile', $atts, $this, 'tile'); + + break; + + case 'list': + default: + + // Maximum Date Range. + $end_date_type = (isset($this->skin_options['end_date_type_list']) and trim($this->skin_options['end_date_type_list'])) ? trim($this->skin_options['end_date_type_list']) : 'date'; + + if($end_date_type === 'today') $maximum_date = current_time('Y-m-d'); + elseif($end_date_type === 'tomorrow') $maximum_date = date('Y-m-d', strtotime('Tomorrow')); + else $maximum_date = (isset($this->skin_options['maximum_date_range_list']) and trim($this->skin_options['maximum_date_range_list'])) ? trim($this->skin_options['maximum_date_range_list']) : ''; + + $atts['sk-options']['list']['start_date_type'] = isset($this->skin_options['start_date_type']) ? $this->skin_options['start_date_type'] : ''; + $atts['sk-options']['list']['start_date'] = isset($this->skin_options['start_date']) ? $this->skin_options['start_date'] : ''; + $atts['sk-options']['list']['end_date_type'] = $end_date_type; + $atts['sk-options']['list']['maximum_date_range'] = $maximum_date; + $atts['sk-options']['list']['order_method'] = ((isset($this->skin_options['order_method_list']) and trim($this->skin_options['order_method_list'])) ? $this->skin_options['order_method_list'] : 'ASC'); + $atts['sk-options']['list']['style'] = 'standard'; + $atts['sk-options']['list']['sed_method'] = isset($this->skin_options['sed_method']) ? $this->skin_options['sed_method'] : '0'; + $atts['sk-options']['list']['image_popup'] = isset($this->skin_options['image_popup']) ? $this->skin_options['image_popup'] : '0'; + $atts['sk-options']['list']['display_price'] = isset($this->skin_options['display_price']) ? $this->skin_options['display_price'] : 0; + $atts['sk-options']['list']['limit'] = isset($this->skin_options['limit']) ? $this->skin_options['limit'] : 12; + $atts['sk-options']['list']['standard_date_format1'] = isset($this->skin_options['date_format_list']) ? $this->skin_options['date_format_list'] : 'd M'; + $atts['sk-options']['list']['display_label'] = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + $atts['sk-options']['list']['reason_for_cancellation'] = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + $atts['sk-options']['list']['include_local_time'] = $this->include_local_time; + $atts['sk-options']['list']['booking_button'] = isset($this->skin_options['booking_button']) ? $this->skin_options['booking_button'] : 0; + $atts['sk-options']['list']['from_fc'] = 1; + $atts['sf_status'] = false; + + $atts = apply_filters('mec-full-calendar-load-skin-list', $atts, $this, 'list'); + + break; + } + + return $atts; + } + + public function load_skin($skin = 'list') { + + $atts = $this->atts; + + $atts = $this->prepare_skin_options( $skin, $atts ); + + switch($skin) + { + case 'yearly': + + $output = $this->render->vyear($atts); + + break; + case 'monthly': + + // Month Rotation + $atts['auto_month_rotation'] = 1; + + $output = $this->render->vmonth($atts); + + break; + case 'weekly': + + $output = $this->render->vweek($atts); + + break; + + case 'daily': + + $output = $this->render->vday($atts); + + break; + + case 'grid': + + $output = $this->render->vgrid($atts); + + break; + + case 'tile': + + $output = $this->render->vtile($atts); + + break; + + case 'list': + default: + + $output = $this->render->vlist($atts); + + break; + } + + return $output; + } + + /** + * Load skin for AJAX request + * @author Webnus + * @return void + */ + public function switch_skin() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $skin = isset($_REQUEST['skin']) ? sanitize_text_field($_REQUEST['skin']) : 'list'; + + // Single Event Display + $atts['sed_method'] = isset($_REQUEST['sed']) ? sanitize_text_field($_REQUEST['sed']) : 0; + $atts['image_popup'] = isset($_REQUEST['image']) ? sanitize_text_field($_REQUEST['image']) : 0; + + // Initialize the skin + $this->initialize($atts); + + // Return the output + $output = $this->load_skin($skin); + + echo $output; + exit; + } +} diff --git a/app/skins/full_calendar/index.html b/app/skins/full_calendar/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/full_calendar/tpl.php b/app/skins/full_calendar/tpl.php new file mode 100755 index 0000000..3503ace --- /dev/null +++ b/app/skins/full_calendar/tpl.php @@ -0,0 +1,187 @@ +main->load_owl_assets(); + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$styling = $this->main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin'] ) || isset($styling['color'])) ? 'colorskin-custom' : ''; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +if($this->sf_display_label) $label_all_set = 'mec-there-labels'; +else $label_all_set = ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_full_skin_head'); +?> +
    + +
    + sf_status): ?> + sf_options['month_filter']) ? $this->sf_options['month_filter'] : array()); + $sf_category = (isset($this->sf_options['category']) ? $this->sf_options['category'] : array()); + $sf_location = (isset($this->sf_options['location']) ? $this->sf_options['location'] : array()); + $sf_organizer = (isset($this->sf_options['organizer']) ? $this->sf_options['organizer'] : array()); + $sf_speaker = (isset($this->sf_options['speaker']) ? $this->sf_options['speaker'] : array()); + $sf_tag = (isset($this->sf_options['tag']) ? $this->sf_options['tag'] : array()); + $sf_label = (isset($this->sf_options['label']) ? $this->sf_options['label'] : array()); + $sf_text_search = (isset($this->sf_options['text_search']) ? $this->sf_options['text_search'] : array()); + $sf_address_search = (isset($this->sf_options['address_search']) ? $this->sf_options['address_search'] : array()); + $sf_event_cost = (isset($this->sf_options['event_cost']) ? $this->sf_options['event_cost'] : array()); + $sf_local_time = (isset($this->sf_options['time_filter']) ? $this->sf_options['time_filter'] : array()); + $sf_fields = ((isset($this->sf_options['fields']) and is_array($this->sf_options['fields'])) ? $this->sf_options['fields'] : array()); + + $sf_month_filter_status = (isset($sf_month_filter['type']) and trim($sf_month_filter['type'])); + $sf_category_status = (isset($sf_category['type']) and trim($sf_category['type'])); + $sf_location_status = (isset($sf_location['type']) and trim($sf_location['type'])); + $sf_organizer_status = (isset($sf_organizer['type']) and trim($sf_organizer['type'])); + $sf_speaker_status = (isset($sf_speaker['type']) and trim($sf_speaker['type'])); + $sf_tag_status = (isset($sf_tag['type']) and trim($sf_tag['type'])); + $sf_label_status = (isset($sf_label['type']) and trim($sf_label['type'])); + $sf_text_search_status = (isset($sf_text_search['type']) and trim($sf_text_search['type'])); + $sf_address_search_status = (isset($sf_address_search['type']) and trim($sf_address_search['type'])); + $sf_event_cost_status = (isset($sf_event_cost['type']) and trim($sf_event_cost['type'])); + $sf_local_time_status = (isset($sf_local_time['type']) and trim($sf_local_time['type'])); + + $sf_fields_status = false; + if(is_array($sf_fields) and count($sf_fields)) + { + foreach($sf_fields as $sf_field) if(isset($sf_field['type']) and $sf_field['type']) $sf_fields_status = true; + } + + // Status of Speakers Feature + $speakers_status = (!isset($this->settings['speakers_status']) or (isset($this->settings['speakers_status']) and !$this->settings['speakers_status'])) ? false : true; + $sf_columns = 12; + ?> + +
    + + + +
    + + sf_search_field('category', $sf_category , $this->sf_display_label)); ?> + + + sf_search_field('location', $sf_location , $this->sf_display_label)); ?> + + + sf_search_field('organizer', $sf_organizer , $this->sf_display_label)); ?> + + + sf_search_field('speaker', $sf_speaker , $this->sf_display_label)); ?> + + + sf_search_field('tag', $sf_tag , $this->sf_display_label)); ?> + + + sf_search_field('label', $sf_label , $this->sf_display_label)); ?> + +
    +
    + +
    + sf_search_field('fields', $sf_fields , $this->sf_display_label)); ?> +
    + +
    + + sf_search_field('address_search', $sf_address_search , $this->sf_display_label)); ?> + + + sf_search_field('event_cost', $sf_event_cost , $this->sf_display_label)); ?> + +
    +
    + + sf_search_field('text_search', $sf_text_search , $this->sf_display_label)); ?> + + + sf_search_field('month_filter', $sf_month_filter , $this->sf_display_label)); ?> + + + sf_search_field('time_filter', $sf_local_time , $this->sf_display_label)); ?> + + sf_reset_button): ?> +
    + +
    +
    + yearly): ?> + monthly): ?> + weekly): ?> + daily): ?> + list): ?> + grid): ?> + tile): ?> +
    +
    +
    + +
    +
    + yearly): ?> + monthly): ?> + weekly): ?> + daily): ?> + list): ?> + grid): ?> + tile): ?> +
    +
    + sf_status): ?> +
    + +
    + load_skin($this->default_view)); ?> +
    + + subscribe_to_calendar(); ?> +
    \ No newline at end of file diff --git a/app/skins/general_calendar.php b/app/skins/general_calendar.php new file mode 100755 index 0000000..925647c --- /dev/null +++ b/app/skins/general_calendar.php @@ -0,0 +1,699 @@ + + */ +class MEC_skin_general_calendar extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'general_calendar'; + public $activate_first_date = false; + public $display_all = false; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_general_calendar_load_month', array($this, 'load_month')); + $this->factory->action('wp_ajax_nopriv_mec_general_calendar_load_month', array($this, 'load_month')); + $this->factory->action('rest_api_init', array($this, 'mec_general_calendar_get_events_api')); + } + + public function mec_general_calendar_get_events_api() + { + register_rest_route( 'mec/v1', '/events', array( + 'methods' => 'GET', + 'callback' => array($this, 'get_general_calendar_events'), + 'permission_callback' => '__return_true', + )); + } + + public function switch_language( $locale ) + { + $language = false; + + if(function_exists('PLL')) $language = PLL()->curlang->locale; + if($language) switch_to_locale($language); + } + + /** + * @param WP_REST_Request $request + * @return array + */ + public function get_general_calendar_events($request) + { + // Params + $startParam = $request->get_param('startParam'); + $endParam = $request->get_param('endParam'); + $categories = $request->get_param('categories') ? $request->get_param('categories') : NULL; + $multiCategories = $request->get_param('multiCategories') ? json_decode($request->get_param('multiCategories')) : NULL; + $location = $request->get_param('location') ? $request->get_param('location') : NULL; + $organizer = $request->get_param('organizer') ? $request->get_param('organizer') : NULL; + $speaker = $request->get_param('speaker') ? $request->get_param('speaker') : NULL; + $label = $request->get_param('label') ? $request->get_param('label') : NULL; + $tag = $request->get_param('tag') ? $request->get_param('tag') : NULL; + $cost_min = $request->get_param('cost_min') ? $request->get_param('cost_min') : NULL; + $cost_max = $request->get_param('cost_max') ? $request->get_param('cost_max') : NULL; + $show_past_events = $request->get_param('show_past_events'); + $show_only_past_events = $request->get_param('show_only_past_events'); + $show_only_one_occurrence = $request->get_param('show_only_one_occurrence'); + $display_label = $request->get_param('display_label'); + $reason_for_cancellation = $request->get_param('reason_for_cancellation'); + $is_category_page = $request->get_param('is_category_page') ? $request->get_param('is_category_page') : NULL; + $cat_id = $request->get_param('cat_id') ? $request->get_param('cat_id') : NULL; + $local_time = $request->get_param('local_time') ? $request->get_param('local_time') : NULL; + $filter_category = $request->get_param('filter_category') ? explode(',', $request->get_param('filter_category')) : NULL; + $filter_location = $request->get_param('filter_location') ? explode(',', $request->get_param('filter_location')) : NULL; + $filter_organizer = $request->get_param('filter_organizer') ? explode(',', $request->get_param('filter_organizer')) : NULL; + $filter_label = $request->get_param('filter_label') ? explode(',', $request->get_param('filter_label')) : NULL; + $filter_tag = $request->get_param('filter_tag') ? explode(',', $request->get_param('filter_tag')) : NULL; + $filter_author = $request->get_param('filter_author') ? explode(',', $request->get_param('filter_author')) : NULL; + $locale = $request->get_param('locale') ; + $type_event = $request->get_param('type_event') ; + + $this->switch_language($locale); + + // Attributes + $atts = array( + 'show_past_events' => $show_past_events, + 'show_only_past_events' => $show_only_past_events, + 'show_only_one_occurrence' => $show_only_one_occurrence, + 'start_date_type' => 'start_current_month', + 'show_ongoing_events' => '1', + 'sk-options'=> array( + 'general_calendar' => array('limit'=>100) + ), + ); + + // Initialize the skin + $this->initialize($atts); + + // Fetch the events + $upcoming_events = $this->get_events( + $startParam, + $endParam, + $categories, + $multiCategories, + $location, + $organizer, + $speaker, + $label, + $tag, + $cost_min, + $cost_max, + $is_category_page, + $cat_id, + $show_only_one_occurrence, + $filter_category, + $filter_location, + $filter_organizer, + $filter_label, + $filter_tag, + $filter_author, + $locale, + $type_event + ); + + $localtime = $this->skin_options['include_local_time'] ?? false; + $events = []; + foreach($upcoming_events as $content) + { + $event_a = []; + foreach($content as $event) + { + $loc = ''; + if(isset($event->data->locations) && !empty($event->data->locations)) + { + foreach($event->data->locations as $location) if($location['address']) $loc = $location['address']; + } + + $labels = ''; + if(isset($event->data->labels) && !empty($event->data->labels) && $display_label) + { + foreach($event->data->labels as $label) $labels .= '' . trim($label['name']) . ''; + } + + $event_title = $event->data->title; + $event_link = $this->main->get_event_date_permalink($event, $event->date['start']['date']); + $event_color = $this->get_event_color_dot($event, true); + $event_content = $event->data->content; + $event_date_start = $this->main->date_i18n('c', $event->date['start']['timestamp']); + $event_date_start_str = $event->date['start']['timestamp']; + $event_date_end = $this->main->date_i18n('c', $event->date['end']['timestamp']); + $event_date_end_str = $event->date['end']['timestamp']; + $event_image = $event->data->featured_image['full']; + $gridsquare = get_the_post_thumbnail($event->data->ID, 'gridsquare' , array('data-mec-postid' => $event->data->ID)); + $event_time = $event->data->time; + + $event_a['id'] = $event->data->ID; + $event_a['title'] = html_entity_decode($event_title); + $event_a['start'] = $event_date_start; + $event_a['end'] = $event_date_end; + $event_a['startStr'] = $event_date_start_str; + $event_a['endStr'] = $event_date_end_str; + $event_a['image'] = $event_image; + $event_a['url'] = $event_link; + $event_a['backgroundColor'] = $event_color; + $event_a['borderColor'] = $event_color; + $event_a['description'] = $event_content; + $event_a['localtime'] = $localtime; + $event_a['location'] = $loc; + $event_a['start_date'] = date_i18n(get_option('date_format'), $event_date_start_str); + $event_a['start_time'] = $event_time['start']; + $event_a['end_date'] = date_i18n(get_option('date_format'), $event_date_end_str); + $event_a['end_time'] = $event_time['end']; + $event_a['startDateStr'] = strtotime($event_a['start_date']); + $event_a['endDateStr'] = strtotime($event_a['end_date']); + $event_a['startDay'] = date_i18n("l", $event_date_start_str); + $event_a['labels'] = $labels; + $event_a['reason_for_cancellation'] = $this->main->display_cancellation_reason($event, $reason_for_cancellation); + $event_a['locaTimeHtml'] = ($local_time == '1' ? $this->main->module('local-time.type2', array('event' => $event)) : ''); + $event_a['gridsquare'] = $gridsquare; + + $event_a = apply_filters('mec_general_calendar_event_data', $event_a, $event); + $events[] = $event_a; + } + } + + return array_values( + array_reduce($events, function($r, $a){ + if (!isset($r[$a['id'] . $a['endStr']])) $r[$a['id'] . $a['endStr']] = $a; + return $r; + }, []) + ); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // The events + $this->events_str = ''; + + // Generate an ID for the skin + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // The style + $this->style = $this->skin_options['style'] ?? 'modern'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'modern'; + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) ? $this->skin_options['next_previous_button'] : true; + + // Display All Events + $this->display_all = (((in_array($this->style, array('clean', 'modern')) and isset($this->skin_options['display_all']))) && $this->skin_options['display_all']); + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // From Full Calendar + $this->from_full_calendar = (isset($this->skin_options['from_fc']) and trim($this->skin_options['from_fc'])); + + // Display Price + $this->display_price = (isset($this->skin_options['display_price']) and trim($this->skin_options['display_price'])); + + // Detailed Time + $this->display_detailed_time = (isset($this->skin_options['detailed_time']) and trim($this->skin_options['detailed_time'])); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + if($this->show_only_expired_events) $this->atts['show_past_events'] = '1'; + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? '0'; + + // Start Date + list($this->year, $this->month, $this->day) = $this->get_start_date(); + + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-'.$this->day)); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Activate First Date With Event + $this->activate_first_date = (isset($this->skin_options['activate_first_date']) and $this->skin_options['activate_first_date']); + } + + /** + * /** + * Search and returns the filtered events + * @author Webnus + * @param $start + * @param $end + * @param null $categories + * @param null $multiCategories + * @param null $location + * @param null $organizer + * @param null $speaker + * @param null $label + * @param null $tag + * @param null $cost_min + * @param null $cost_max + * @param null $is_category_page + * @param null $cat_id + * @param null $show_only_one_occurrence + * @param null $filter_category + * @param null $filter_location + * @param null $filter_organizer + * @param null $filter_label + * @param null $filter_tag + * @param null $filter_author + * @param string $locale + * @param null $type_event + * @return array of objects + */ + public function get_events($start, $end, $categories = null, $multiCategories = null, $location = null, $organizer = null, $speaker = null, $label = null, $tag = null, $cost_min = null, $cost_max = null, $is_category_page = null, $cat_id = null, $show_only_one_occurrence = null, $filter_category = null, $filter_location = null, $filter_organizer = null, $filter_label = null, $filter_tag = null, $filter_author = null, $locale = 'en',$type_event = null) + { + $start = date('Y-m-d', strtotime($start)); + $end = date('Y-m-d', strtotime($end)); + + if($this->show_only_expired_events) + { + $start = date('Y-m-d H:i:s', current_time('timestamp', 0)); + $end = date('Y-m-d', strtotime('first day of this month')); + + $this->weeks = $this->main->split_to_weeks($end, $start); + + $this->week_of_days = []; + foreach($this->weeks as $week_number=>$week) foreach($week as $day) $this->week_of_days[$day] = $week_number; + + $end = $this->main->array_key_first($this->week_of_days); + } + + // Taxonomy Query + $tax_query = array( + 'relation' => 'AND' + ); + + if (!is_null($is_category_page) && $is_category_page != 'undefined' && !is_null($cat_id) && $cat_id != 'undefined' ){ + $tax_query[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => array($cat_id), + 'operator' => 'IN' + ); + } + + if (!is_null($categories) && $categories != 'undefined' ){ + $tax_query[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => array($categories), + 'operator' => 'IN' + ); + } + + if (!is_null($multiCategories) && $multiCategories != 'undefined' && count($multiCategories) > 0 ){ + $tax_query[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => $multiCategories, + 'operator' => 'IN' + ); + } + + if (!is_null($filter_category) && $filter_category != 'undefined' ){ + $tax_query[] = array( + 'taxonomy' => 'mec_category', + 'field' => 'id', + 'terms' => is_array($filter_category) ? $filter_category : array($filter_category), + 'operator' => 'IN' + ); + } + + if (!is_null($location) && $location != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_location', + 'field' => 'id', + 'terms' => array($location), + 'operator' => 'IN' + ); + } + + if (!is_null($filter_location) && $filter_location != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_location', + 'field' => 'id', + 'terms' => is_array($filter_location) ? $filter_location : array($filter_location), + 'operator' => 'IN' + ); + } + + if (!is_null($organizer) && $organizer != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_organizer', + 'field' => 'id', + 'terms' => array($organizer), + 'operator' => 'IN' + ); + } + + if (!is_null($filter_organizer) && $filter_organizer != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_organizer', + 'field' => 'id', + 'terms' => is_array($filter_organizer) ? $filter_organizer : array($filter_organizer), + 'operator' => 'IN' + ); + } + + if (!is_null($speaker) && $speaker != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_speaker', + 'field' => 'id', + 'terms' => array($speaker), + 'operator' => 'IN' + ); + } + + if (!is_null($label) && $label != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_label', + 'field' => 'id', + 'terms' => array($label), + 'operator' => 'IN' + ); + } + + if (!is_null($filter_label) && $filter_label != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_label', + 'field' => 'id', + 'terms' => is_array($filter_label) ? $filter_label : array($filter_label), + 'operator' => 'IN' + ); + } + + if (!is_null($filter_author) && $filter_author != 'undefined'){ + $tax_query[] = array( + 'taxonomy' => 'mec_author', + 'field' => 'id', + 'terms' => is_array($filter_author) ? $filter_author : array($filter_author), + 'operator' => 'IN' + ); + } + + $mec_tag_query = NULL; + if (!is_null($tag) && $tag != 'undefined'){ + $term = get_term_by('id', $tag, apply_filters('mec_taxonomy_tag', '')); + if($term) $mec_tag_query = $term->slug; + } + + if (!is_null($filter_tag) && $filter_tag != 'undefined'){ + $term = get_term_by('id', $filter_tag, apply_filters('mec_taxonomy_tag', '')); + if($term) $mec_tag_query = $term->slug; + } + + // Meta Query + $meta_query = array( + 'relation' => 'AND', + ); + if (!is_null($cost_min) && $cost_min != 'undefined'){ + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => $cost_min, + 'type' => 'numeric', + 'compare' => '>=', + ); + } + if (!is_null($cost_max) && $cost_max != 'undefined'){ + $meta_query[] = array( + 'key' => 'mec_cost', + 'value' => $cost_max, + 'type' => 'numeric', + 'compare' => '<=', + ); + } + + if (!is_null($type_event) && $type_event != 'undefined'&& $type_event != 'all'){ + $meta_query[] = array( + 'key' => 'mec_event_status', + 'value' => $type_event, + 'compare' => '=', + ); + } + + $this->args['tax_query'] = $tax_query; + $this->args['meta_query'] = $meta_query; + $this->args['tag'] = $mec_tag_query; + $this->args['lang'] = $locale; + + $dates = $this->period($start, $end, true); + ksort($dates); + + if($this->show_only_expired_events && $this->loadMoreRunning) $this->show_only_expired_events = '1'; + + // Limit + $this->args['posts_per_page'] = $this->limit; + + $i = 0; + $found = 0; + $events = []; + + foreach($dates as $date=>$IDs) + { + // No Event + if(!is_array($IDs) or (is_array($IDs) and !count($IDs))) continue; + + // Check Finish Date + if(isset($this->maximum_date) and trim($this->maximum_date) and strtotime($date) > strtotime($this->maximum_date)) break; + + // Include Available Events + $this->args['post__in'] = $IDs; + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // Extending the end date + $this->end_date = $date; + + // Continue to load rest of events in the first date + if($i === 0) $this->args['offset'] = $this->offset; + // Load all events in the rest of dates + else + { + $this->offset = 0; + $this->args['offset'] = 0; + } + + // The Query + $this->args['posts_per_page'] = 1000; + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + $query = new WP_Query($this->args); + if($query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $one_occurrence = get_post_meta($ID, 'one_occurrence', true); + if ( $show_only_one_occurrence != '0' and !is_null($show_only_one_occurrence) ) { + if ($one_occurrence != '1') { + if ( !isset($IDs_count[$ID]) ) continue; + } else { + continue; + } + } + + $ID_count = $IDs_count[$ID] ?? 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date' => $this->main->get_start_of_multiple_days($ID, $date)), + 'end' => array('date' => $this->main->get_end_date($date, $rendered)) + ); + $d[] = $this->render->after_render($data, $this, $i); + + $found++; + } + + if($found >= 1000) + { + // Next Offset + $this->next_offset = ($query->post_count-($query->current_post+1)) >= 0 ? ($query->current_post+1)+$this->offset : 0; + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + + // Restore original Post Data + wp_reset_postdata(); + + break 2; + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + + // Restore original Post Data + wp_reset_postdata(); + $i++; + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + // Set Offset for Last Page + if($found < $this->limit) + { + // Next Offset + $this->next_offset = $found + ((isset($date) and $this->start_date === $date) ? $this->offset : 0); + } + + // Set found events + $this->found = $found; + return $events; + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return array + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $yesterday = date('Y-m-d', strtotime('Yesterday')); + if(strtotime($date) > strtotime($yesterday)) $date = $yesterday; + } + + $time = strtotime($date); + return array(date('Y', $time), date('m', $time), date('d', $time)); + } +} diff --git a/app/skins/general_calendar/render.php b/app/skins/general_calendar/render.php new file mode 100755 index 0000000..9fd1925 --- /dev/null +++ b/app/skins/general_calendar/render.php @@ -0,0 +1,3 @@ +id); +do_action('mecgeneral_calendar_skin_head'); + +// Month picker Assets +$this->main->load_month_picker_assets(); + +// Shortcode Options +$local_time = (isset($this->skin_options['include_local_time']) and !empty( $this->skin_options['include_local_time'] )) ? $this->skin_options['include_local_time'] : false; +$display_label = (isset($this->skin_options['display_label']) and !empty( $this->skin_options['display_label'] )) ? $this->skin_options['display_label'] : false; +$reason_for_cancellation = (isset($this->skin_options['reason_for_cancellation']) and !empty( $this->skin_options['reason_for_cancellation'] )) ? $this->skin_options['reason_for_cancellation'] : false; +$more_event = (isset($this->skin_options['more_event']) and !empty( $this->skin_options['more_event'] )) ? (int) $this->skin_options['more_event'] : 10; +//var_dump($more_event); + +$sed_method = ''; +if(isset($this->skin_options['sed_method']) and !empty($this->skin_options['sed_method'])) $sed_method = ($this->skin_options['sed_method'] == 'new') ? '_blank' : ($this->skin_options['sed_method'] == '0' ? '_self' : $this->skin_options['sed_method']); + +// Shortcode Filters +$filter_category = get_post_meta($this->id, 'category', true) ? get_post_meta($this->id, 'category', true) : ''; +$filter_location = get_post_meta($this->id, 'location', true) ? get_post_meta($this->id, 'location', true) : ''; +$filter_organizer = get_post_meta($this->id, 'organizer', true) ? get_post_meta($this->id, 'organizer', true) : ''; +$filter_label = get_post_meta($this->id, 'label', true) ? get_post_meta($this->id, 'label', true) : ''; +$filter_tag = get_post_meta($this->id, 'tag', true) ? get_post_meta($this->id, 'tag', true) : ''; +$filter_author = get_post_meta($this->id, 'author', true) ? get_post_meta($this->id, 'author', true) : ''; +$show_past_events = ($this->atts['show_past_events'] ?? '0'); +$show_only_past_events = ($this->atts['show_only_past_events'] ?? '0'); +$show_only_one_occurrence = (isset($this->atts['show_only_one_occurrence']) && $this->atts['show_only_one_occurrence'] != '0') ? '1' : '0'; +$mec_tax_input = (isset($this->atts['mec_tax_input']) && $this->atts['mec_tax_input'] != '0') ? $this->atts['mec_tax_input'] : ''; + +// WordPress Options +$lang = !empty(substr(get_locale(), 0, strpos(get_locale(), "_"))) ? substr(get_locale(), 0, strpos(get_locale(), "_")) : get_locale(); +$direction = is_rtl() ? 'rtl' : 'ltr'; +$border_direction = is_rtl() ? 'border-right-width' : 'border-left-width'; +$border_direction_style = is_rtl() ? 'border-left-style' : 'border-right-style'; +$is_category_page = is_tax('mec_category'); +$cat_id = ''; +if($is_category_page) +{ + $category = get_queried_object(); + $cat_id = $category->term_id; +} + +$week_start_day = (int) get_option('start_of_week'); +if(!function_exists('mec_general_calendar_find_event')) +{ + // Search Options + function mec_general_calendar_find_event($sf_options, $find_filter) + { + if($find_filter === 'find' and is_array($sf_options)) + { + if( + (isset($sf_options['category']) && $sf_options['category']['type'] != '0' && !is_null($sf_options['category']['type'])) || + (isset($sf_options['location']) && $sf_options['location']['type'] != '0' && !is_null($sf_options['location']['type'])) || + (isset($sf_options['organizer']) && $sf_options['organizer']['type'] != '0' && !is_null($sf_options['organizer']['type'])) || + (isset($sf_options['speaker']) && $sf_options['speaker']['type'] != '0' && !is_null($sf_options['speaker']['type'])) || + (isset($sf_options['tag']) && $sf_options['tag']['type'] != '0' && !is_null($sf_options['tag']['type'])) || + (isset($sf_options['label']) && $sf_options['label']['type'] != '0' && !is_null($sf_options['label']['type'])) || + (isset($sf_options['event_cost']) && $sf_options['event_cost']['type'] != '0' && !is_null($sf_options['event_cost']['type'])) || + (isset($sf_options['text_search']) && $sf_options['text_search']['type'] != '0' && !is_null($sf_options['text_search']['type'])) || + (isset($sf_options['address_search']) && $sf_options['address_search']['type'] != '0' && !is_null($sf_options['address_search']['type'])) + ) return true; + else return false; + } + + if($find_filter === 'filter' and is_array($sf_options)) + { + if( + (isset($sf_options['category']) && $sf_options['category']['type'] != '0' && !is_null($sf_options['category']['type'])) || + (isset($sf_options['location']) && $sf_options['location']['type'] != '0' && !is_null($sf_options['location']['type'])) || + (isset($sf_options['organizer']) && $sf_options['organizer']['type'] != '0' && !is_null($sf_options['organizer']['type'])) || + (isset($sf_options['speaker']) && $sf_options['speaker']['type'] != '0' && !is_null($sf_options['speaker']['type'])) || + (isset($sf_options['tag']) && $sf_options['tag']['type'] != '0' && !is_null($sf_options['tag']['type'])) || + (isset($sf_options['label']) && $sf_options['label']['type'] != '0' && !is_null($sf_options['label']['type'])) || + (isset($sf_options['event_cost']) && $sf_options['event_cost']['type'] != '0' && !is_null($sf_options['event_cost']['type'])) || + (isset($sf_options['address_search']) && $sf_options['address_search']['type'] != '0' && !is_null($sf_options['address_search']['type'])) + ) return true; + else return false; + } + + return false; + } +} +wp_enqueue_script('mec-niceselect-script'); +?> +
    + +
    +
    +
    + sf_options) && isset($this->sf_options['category']) && $this->sf_options['category']['type'] != '0') ? MEC_kses::form($this->sf_search_field('category', array('type' => $this->sf_options['category']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['location']) && $this->sf_options['location']['type'] != '0') ? MEC_kses::form($this->sf_search_field('location', array('type' => $this->sf_options['location']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['organizer']) && $this->sf_options['organizer']['type'] != '0') ? MEC_kses::form($this->sf_search_field('organizer', array('type' => $this->sf_options['organizer']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['speaker']) && $this->sf_options['speaker']['type'] != '0') ? MEC_kses::form($this->sf_search_field('speaker', array('type' => $this->sf_options['speaker']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['tag']) && $this->sf_options['tag']['type'] != '0') ? MEC_kses::form($this->sf_search_field('tag', array('type' => $this->sf_options['tag']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['label']) && $this->sf_options['label']['type'] != '0') ? MEC_kses::form($this->sf_search_field('label', array('type' => $this->sf_options['label']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['address_search']) && $this->sf_options['address_search']['type'] != '0') ? MEC_kses::form($this->sf_search_field('address_search', array('type' => $this->sf_options['address_search']['type']))) : ''); + echo ((is_array($this->sf_options) && isset($this->sf_options['event_cost']) && $this->sf_options['event_cost']['type'] != '0') ? MEC_kses::form($this->sf_search_field('event_cost', array('type' => $this->sf_options['event_cost']['type']))) : ''); + echo ($this->sf_reset_button ? '
    ' : ''); + ?> +
    +
    +
    +display_credit_url(); ?> + + + document.addEventListener("DOMContentLoaded", function () { + var calendarEl = document.getElementById("mec-gCalendar-wrap"); + var calendar = new FullCalendar.Calendar(calendarEl, { + initialView: "dayGridMonth", + initialDate: "'. esc_js($this->get_start_date()[0].'-'.$this->get_start_date()[1].'-'.$this->get_start_date()[2]) .'", + editable: false, + selectable: false, + businessHours: false, + height: "auto", + eventLimit: false, + direction: "'. $direction .'", + locale: "'. esc_js($lang) .'", + lang: "'. esc_js($lang) .'", + '; +if (mec_general_calendar_find_event($this->sf_options, 'find')) : +$javascript .=' + customButtons: { + findEvents: { + text: "'. esc_html__('Find Events', 'modern-events-calendar-lite') .'", + click: function() { + jQuery(".mec-gCalendar-filters").css("display" , "none") + var eventSource = []; + eventSource = calendar.getEventSources(); + jQuery.each(eventSource, function (key, value) { + value.remove(); + }); + calendar.addEventSource({ + url: "'. get_rest_url() .'mec/v1/events", + method: "GET", + startParam: "startParam", + endParam: "endParam", + textColor: "#000", + ajax: true, + extraParams: { + show_past_events: "'. esc_js($show_past_events).'", + show_only_past_events: "'. esc_js($show_only_past_events).'", + show_only_one_occurrence: "'. esc_js($show_only_one_occurrence).'", + categories: (jQuery("select[id^=\"mec_sf_category\"]").length > 0) ? jQuery("select[id^=\"mec_sf_category\"]").val() : "", + multiCategories: (jQuery(".select2-hidden-accessible").length > 0) ? JSON.stringify(jQuery(".select2-hidden-accessible").val()) : "", + location: jQuery("select[id^=\"mec_sf_location\"]").val(), + organizer: jQuery("select[id^=\"mec_sf_organizer\"]").val(), + speaker: jQuery("select[id^=\"mec_sf_speaker\"]").val(), + tag: jQuery("select[id^=\"mec_sf_tag\"]").val(), + label: jQuery("select[id^=\"mec_sf_label\"]").val(), + cost_min: jQuery("input[id^=\"mec_sf_event_cost_min\"]").val(), + cost_max: jQuery("input[id^=\"mec_sf_event_cost_max\"]").val(), + display_label: "'. esc_js($display_label) .'", + reason_for_cancellation: "'. esc_js($reason_for_cancellation) .'", + is_category_page: "'. esc_js($is_category_page) .'", + cat_id: "'. esc_js($cat_id) .'", + local_time: "'. esc_js($local_time) .'", + filter_category: "'. esc_js($filter_category) .'", + filter_location: "'. esc_js($filter_location) .'", + filter_organizer: "'. esc_js($filter_organizer) .'", + filter_label: "'. esc_js($filter_label) .'", + filter_tag: "'. esc_js($filter_tag) .'", + filter_author: "'. esc_js($filter_author) .'", + locale: "'. esc_js($lang) .'", + lang: "'. esc_js($lang) .'", + }, + }); + calendar.refetchEvents(); + } + }, + '; +if (mec_general_calendar_find_event($this->sf_options, 'filter')) : +$javascript .=' + filterEvents: { + text: "'. esc_html__('Filter', 'modern-events-calendar-lite') .'", + click: function() { + jQuery(".mec-gCalendar-filters").fadeToggle( "fast", "linear" ); + } + } + '; +endif; +$javascript .=' + }, + '; +endif; +$javascript .=' + firstDay: "'.esc_js($week_start_day).'", + headerToolbar: { + left: "title,prevYear,prev,today,next,nextYear", + center: "", + '; +if (mec_general_calendar_find_event($this->sf_options, 'find')): +$javascript .=' + right: "filterEvents,findEvents" + '; +else : +$javascript .=' + right: "" + '; +endif; +$javascript .=' + }, + buttonText: { + today: "'. esc_html__('Today', 'modern-events-calendar-lite') .'" + }, + eventDidMount: function(info) { + var searchField = jQuery(".mec-gCalendar-search-text"); + if (searchField.length > 0) { + var searchTerms = jQuery(".mec-gCalendar-search-text").val(); + if (searchTerms.length > 0){ + if (info.event._def.title.toLowerCase().indexOf(searchTerms) >= 0 || info.event._def.extendedProps.description.toLowerCase().indexOf(searchTerms) >= 0) { + info.event.setProp("display","block") + } else { + info.event.setProp("display","none") + } + } else { + info.event.setProp("display","block") + } + } else { + info.event.setProp("display","block") + } + var backgroundColor = info.backgroundColor == "#" ? "#00acf8" : info.backgroundColor; + var borderColor = info.borderColor == "#" ? "#00acf8" : info.borderColor; + jQuery(info.el).css("padding", "8px 3px"); + jQuery(info.el).css("font-size", "12px"); + jQuery(info.el).css("font-weight", "400"); + jQuery(info.el).css("border-radius", "0"); + jQuery(info.el).css("border-top", "none"); + jQuery(info.el).css("border-bottom", "none"); + jQuery(info.el).css("'.$border_direction.'", "3px"); + jQuery(info.el).css("'.$border_direction_style.'", "none"); + jQuery(info.el).css("background-color", "#fff"); + jQuery(info.el).css("border-color", borderColor); + jQuery(info.el).css("white-space", "normal"); + jQuery(info.el).css("font-family", "-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif"); + // jQuery(info.el).css("z-index", "1"); + jQuery(info.el).css("line-height", "1.2"); + jQuery(info.el).css("margin-top", "0"); + jQuery(info.el).attr("target", "'. esc_js($sed_method) .'"); + '; +if ( $sed_method == 'no' ) : +$javascript .=' + jQuery(info.el).css({ + "cursor": "default", + "pointer-events": "none", + "text-decoration": "none", + }); + '; +endif; +$javascript .=' + jQuery(info.el).attr("data-event-id", info.event._def.publicId); + jQuery(info.el).append(""); + jQuery(info.el).append(info.event._def.extendedProps.reason_for_cancellation); + jQuery(info.el).append(info.event._def.extendedProps.locaTimeHtml); + jQuery(info.el).append(info.event._def.extendedProps.labels); + '; +if ( $sed_method == 'm1') : +$javascript .=' + jQuery(info.el).attr("rel", "noopener"); + jQuery("#mec_skin_'.esc_attr($this->id).'").mecGeneralCalendarView( + { + id: "'. esc_attr($this->id) .'", + atts: "'. http_build_query(array('atts' => $this->atts), '', '&') .'", + ajax_url: "'. admin_url('admin-ajax.php', NULL) .'", + sed_method: "'. esc_js($sed_method) .'", + image_popup: "'. esc_js($this->image_popup) .'", + sf: + { + reset: "'. ($this->sf_reset_button ? 1 : 0) .'", + refine: "'. ($this->sf_refine ? 1 : 0) .'", + }, + }); + '; +endif; +$title_and_location_pattern = apply_filters( 'mec_skin_general_calendar_title_and_location_structure', 'Title + Location' ); +$javascript .=' + jQuery(".fc-daygrid-event-harness").mouseleave(function(e) { + jQuery(".mec-gCalendar-tooltip").remove(); + }); + }, + eventMouseEnter: function(info) { + var Image = info.event._def.extendedProps.image ? "
    " + info.event._def.extendedProps.gridsquare + "
    " : ""; + var dateText = info.event._def.extendedProps.startDateStr != info.event._def.extendedProps.endDateStr ? "'.addslashes($this->icons->display('calendar')).'
    " + info.event._def.extendedProps.start_date + "" + "" + info.event._def.extendedProps.end_date + "
    " : "'.addslashes($this->icons->display('calendar')).'
    " + info.event._def.extendedProps.start_date + "" + "" + info.event._def.extendedProps.startDay + "
    "; + + var dateTime = "'.addslashes($this->icons->display('clock')).'
    " + info.event._def.extendedProps.start_time + "" + "" + info.event._def.extendedProps.end_time + "
    "; + + var Location = info.event._def.extendedProps.location ? "
    '.addslashes($this->icons->display('location-pin')).'" + info.event._def.extendedProps.location + "
    " : ""; + + var Title = ""; + + var tooltip = "
    " + Image + + "
    " + + "
    " + dateText + "
    " + + "
    " + dateTime + "
    " + + "
    " + '. $title_and_location_pattern .' + + "
    "; + if ( jQuery(info.el).parent().find(".mec-gCalendar-tooltip").length < 1 ) jQuery(info.el).parent().append(tooltip); + '; +if ($sed_method == 'm1') : +$javascript .= ' + jQuery("#mec_skin_'.esc_attr($this->id).' .mec-gCalendar-tooltip-title a").off("click").on("click", function (e) { + e.preventDefault(); + var sed_method = jQuery(this).attr("target"); + if ("_blank" === sed_method || "_self" === sed_method || "no" === sed_method) { + + return; + } + e.preventDefault(); + var href = jQuery(this).attr("href"); + + var id = jQuery(this).data("event-id"); + var occurrence = get_parameter_by_name("occurrence", href); + var time = get_parameter_by_name("time", href); + + if( "undefined" == typeof id ){ + return; + } + mecSingleEventDisplayer.getSinglePage(id, occurrence, time, "'. admin_url('admin-ajax.php', NULL) .'", "'. esc_js($sed_method) .'", "'. esc_js($this->image_popup) .'"); + }); + '; +endif; +$javascript .= ' + }, + dayMaxEvents: ' .esc_js($more_event) .', + timeZone:"' .get_option('gmt_offset') .'", + events: { + url: "'.get_rest_url() .'mec/v1/events", + method: "GET", + startParam: "startParam", + endParam: "endParam", + textColor: "#000", + ajax: true, + extraParams: { + show_past_events: "' . esc_js($show_past_events) . '", + show_only_past_events: "' . esc_js($show_only_past_events) . '", + show_only_one_occurrence: "' . esc_js($show_only_one_occurrence) . '", + categories: (jQuery("select[id^=\"mec_sf_category\"]").lenght > 0) ? jQuery("select[id^=\"mec_sf_category\"]").val() : "", + multiCategories: (jQuery(".select2-hidden-accessible").lenght > 0) ? jQuery(".select2-hidden-accessible").val() : "", + location: jQuery("select[id^=\"mec_sf_location\"]").val(), + organizer: jQuery("select[id^=\"mec_sf_organizer\"]").val(), + speaker: jQuery("select[id^=\"mec_sf_speaker\"]").val(), + tag: jQuery("select[id^=\"mec_sf_tag\"]").val(), + label: jQuery("select[id^=\"mec_sf_label\"]").val(), + cost_min: jQuery("input[id^=\"mec_sf_event_cost_min\"]").val(), + cost_max: jQuery("input[id^=\"mec_sf_event_cost_max\"]").val(), + display_label: "' . esc_js($display_label) . '", + reason_for_cancellation: "' . esc_js($reason_for_cancellation) . '", + is_category_page: "' . esc_js($is_category_page) . '", + cat_id: "' . esc_js($cat_id) . '", + local_time: "' . esc_js($local_time) . '", + filter_category: "' . esc_js($filter_category) . '", + filter_location: "' . esc_js($filter_location) . '", + filter_organizer: "' . esc_js($filter_organizer) . '", + filter_label: "' . esc_js($filter_label) . '", + filter_tag: "' . esc_js($filter_tag) . '", + filter_author: "' . esc_js($filter_author) . '", + locale: "' . esc_js($lang) . '", + lang: "' . esc_js($lang) . '", + }, + failure: function() { + alert("there was an error while fetching events!"); + }, + }, + forceEventDuration: true, + loading: function(bool) { + document.getElementById("gCalendar-loading").style.display = + bool ? "block" : "none"; + }, + }); + calendar.render(); + + const calendarHeaderFirstChild = jQuery(".fc-header-toolbar").find(".fc-toolbar-chunk h2"); + const calendarHeaderLastChild = jQuery(".fc-header-toolbar").find(".fc-toolbar-chunk:last-child"); + const calendarHeaderButton = calendarHeaderLastChild.find(".fc-button-group"); + '; + // Search Bar Filter +if (is_array($this->sf_options) and $this->sf_options['text_search']['type'] != '0') : +$javascript .=' + jQuery( "
    '.addslashes($this->icons->display('magnifier')).'sf_options) and $this->sf_options['text_search']['placeholder']) ? esc_html__($this->sf_options['text_search']['placeholder']) : esc_html__('Search for events', 'modern-events-calendar-lite')) .'\" />
    " ).insertBefore( ".fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group" ); + + jQuery(".mec-gCalendar-search-text").keypress(function(event){ + var keycode = (event.keyCode ? event.keyCode : event.which); + if(keycode == "13"){ + jQuery(".fc-findEvents-button").trigger("click"); + } + }); + '; +endif; + + // Month Filter +if (is_array($this->sf_options) and $this->sf_options['month_filter']['type'] != '0') : +$javascript .=' + calendarHeaderFirstChild.append(""); + jQuery("#gCalendarMonthFilterButton").on("changeDate", function(ev) { + var s = new Date(ev.date.valueOf()); + let ye = new Intl.DateTimeFormat("en", { year: "numeric" }).format(s); + let mo = new Intl.DateTimeFormat("en", { month: "2-digit" }).format(s); + let da = new Intl.DateTimeFormat("en", { day: "2-digit" }).format(s); + jQuery("#gCalendarMonthFilterButton").monthPicker("hide"); + calendar.gotoDate(`${ye}-${mo}-${da}`) + }) + setTimeout(function(){ jQuery(".datepicker").appendTo(".gCalendarMonthFilterButton"); }, 1000); + '; +endif; + +if (mec_general_calendar_find_event($this->sf_options, 'filter') ) : +$javascript .=' + setTimeout(function(){ jQuery(".mec-gCalendar-filters").appendTo(calendarHeaderButton); }, 1000); + jQuery("").appendTo("button.fc-filterEvents-button.fc-button.fc-button-primary"); + if ( jQuery(".mec-gCalendar-filters-wrap").length > 0 ) jQuery(".mec-gCalendar-filters-wrap .mec-dropdown-search").find("select").niceSelect(); + + jQuery(document).on("click", function(e) { + var button = jQuery(".fc-filterEvents-button"); + var wrap = jQuery(".mec-gCalendar-filters"); + if ((!button.is(e.target) && button.has(e.target).length === 0) && (!wrap.is(e.target) && wrap.has(e.target).length === 0)) { + wrap.hide(); + if ( jQuery(".mec-searchbar-category-wrap select").length > 0 ) jQuery(".mec-searchbar-category-wrap select").select2("close"); + } else { + } + }); + jQuery(document).ready(function ($) { + jQuery(".mec-gCalendar-filters-wrap").find(".mec-search-reset-button").parents().eq(2).addClass("mec-there-reset-button"); + jQuery(".mec-gCalendar-filters-wrap").find(".mec-search-reset-button").on("click", function() { + reset() + }) + function reset() { + var $event_cost_min = $("#mec_sf_event_cost_min_'. esc_attr($this->id).'"); + var $event_cost_max = $("#mec_sf_event_cost_max_'. esc_attr($this->id).'"); + var $time_start = $("#mec_sf_timepicker_start_'. esc_attr($this->id).'"); + var $time_end = $("#mec_sf_timepicker_end_'. esc_attr($this->id).'"); + var $s = $("#mec_sf_s_'. esc_attr($this->id).'"); + var $address = $("#mec_sf_address_s_'. esc_attr($this->id).'"); + var $date_start = $("#mec_sf_date_start_'. esc_attr($this->id).'"); + var $date_end = $("#mec_sf_date_end_'. esc_attr($this->id).'"); + var $event_type = $("#mec_sf_event_type_'. esc_attr($this->id).'"); + var $event_type_2 = $("#mec_sf_event_type_2_'. esc_attr($this->id).'"); + var $attribute = $("#mec_sf_attribute_'. esc_attr($this->id).'"); + var $category = jQuery("#mec_sf_category_'. esc_attr($this->id).'"); + var $location = jQuery("#mec_sf_location_'. esc_attr($this->id).'"); + var $organizer = jQuery("#mec_sf_organizer_'. esc_attr($this->id).'"); + var $speaker = jQuery("#mec_sf_speaker_'. esc_attr($this->id).'"); + var $tag = jQuery("#mec_sf_tag_'. esc_attr($this->id).'"); + var $label = jQuery("#mec_sf_label_'. esc_attr($this->id).'"); + var $month = $("#mec_sf_month_'. esc_attr($this->id).'"); + var $year = $("#mec_sf_year_'. esc_attr($this->id).'"); + var $month_or_year = $("#mec_sf_month_'. esc_attr($this->id).'" + ", " + "#mec_sf_year_'. esc_attr($this->id) .'"); + + if ($category.length && $category.prop("tagName") && $category.prop("tagName").toLowerCase() === "div") { + $category.find("select").each(function () { + jQuery(this).val(null).trigger("change"); + }); + $category.find("select").select2(); + } else { + if ($category.length) { + $category.val(null); + $category.niceSelect("update") + } + } + + + if ($location.length) $location.val(null); + if ($organizer.length) $organizer.val(null); + if ($speaker.length) $speaker.val(null); + if ($tag.length) $tag.val(null); + if ($label.length) $label.val(null); + if ($s.length) $s.val(null); + if ($address.length) $address.val(null); + if ($month.length) $month.val(null); + if ($year.length) $year.val(null); + if ($event_cost_min.length) $event_cost_min.val(null); + if ($event_cost_max.length) $event_cost_max.val(null); + if ($date_start.length) $date_start.val(null); + if ($date_end.length) $date_end.val(null); + if ($time_start.length) $time_start.val(null); + if ($time_end.length) $time_end.val(null); + + function get_fields(){ + return [ + "state", + "city", + "region", + "region", + "street", + "postal_code", + ]; + } + var fields = get_fields(); + $.each(fields,function(i,field){ + + if( jQuery("#mec_sf_"+ field +"_'. esc_attr($this->id) .'").length ){ + + jQuery("#mec_sf_"+ field +"_'. esc_attr($this->id) .'").val(null); + if( jQuery("#mec_sf_"+ field +"_'. esc_attr($this->id) .'").is("select") ){ + jQuery("#mec_sf_"+ field +"_'. esc_attr($this->id) .'").niceSelect("update"); + } + } + }); + + // Search Again + setTimeout(function () { + jQuery(".fc-findEvents-button").trigger("click"); + }, 1); + } + }); + '; +endif; +$javascript .=' + }); +'; + +$factory = new MEC_factory(); +$factory->params('footer', $javascript); \ No newline at end of file diff --git a/app/skins/grid.php b/app/skins/grid.php new file mode 100755 index 0000000..5541445 --- /dev/null +++ b/app/skins/grid.php @@ -0,0 +1,655 @@ + + */ +class MEC_skin_grid extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'grid'; + + public $date_format_classic_1; + public $date_format_clean_1; + public $date_format_clean_2; + public $date_format_minimal_1; + public $date_format_minimal_2; + public $date_format_modern_1; + public $date_format_modern_2; + public $date_format_modern_3; + public $date_format_simple_1; + public $date_format_novel_1; + public $date_format_fluent_1; + public $loadMoreRunning; + public $widget_autoplay = true; + public $widget_autoplay_time = 3000; + public $widget_loop = true; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_grid_load_more', array($this, 'load_more')); + $this->factory->action('wp_ajax_nopriv_mec_grid_load_more', array($this, 'load_more')); + + // Fluent view + $this->factory->action('wp_ajax_mec_grid_load_month', array($this, 'load_month')); + $this->factory->action('wp_ajax_nopriv_mec_grid_load_month', array($this, 'load_month')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) && $this->skin_options['next_previous_button']; + + // The style + $this->style = $this->skin_options['style'] ?? 'modern'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'modern'; + + // Date Formats + $this->date_format_classic_1 = (isset($this->skin_options['classic_date_format1']) and trim($this->skin_options['classic_date_format1'])) ? $this->skin_options['classic_date_format1'] : 'd F Y'; + + $this->date_format_clean_1 = (isset($this->skin_options['clean_date_format1']) and trim($this->skin_options['clean_date_format1'])) ? $this->skin_options['clean_date_format1'] : 'd'; + $this->date_format_clean_2 = (isset($this->skin_options['clean_date_format2']) and trim($this->skin_options['clean_date_format2'])) ? $this->skin_options['clean_date_format2'] : 'F'; + + $this->date_format_minimal_1 = (isset($this->skin_options['minimal_date_format1']) and trim($this->skin_options['minimal_date_format1'])) ? $this->skin_options['minimal_date_format1'] : 'd'; + $this->date_format_minimal_2 = (isset($this->skin_options['minimal_date_format2']) and trim($this->skin_options['minimal_date_format2'])) ? $this->skin_options['minimal_date_format2'] : 'M'; + + $this->date_format_modern_1 = (isset($this->skin_options['modern_date_format1']) and trim($this->skin_options['modern_date_format1'])) ? $this->skin_options['modern_date_format1'] : 'd'; + $this->date_format_modern_2 = (isset($this->skin_options['modern_date_format2']) and trim($this->skin_options['modern_date_format2'])) ? $this->skin_options['modern_date_format2'] : 'F'; + $this->date_format_modern_3 = (isset($this->skin_options['modern_date_format3']) and trim($this->skin_options['modern_date_format3'])) ? $this->skin_options['modern_date_format3'] : 'l'; + + $this->date_format_simple_1 = (isset($this->skin_options['simple_date_format1']) and trim($this->skin_options['simple_date_format1'])) ? $this->skin_options['simple_date_format1'] : 'M d Y'; + + $this->date_format_novel_1 = (isset($this->skin_options['novel_date_format1']) and trim($this->skin_options['novel_date_format1'])) ? $this->skin_options['novel_date_format1'] : 'd F Y'; + + // Fluent view - Date Formats + $this->date_format_fluent_1 = (isset($this->skin_options['fluent_date_format1']) and trim($this->skin_options['fluent_date_format1'])) ? $this->skin_options['fluent_date_format1'] : 'D, F d, Y'; + + // Date Formats of colorful style + if($this->style == 'colorful') + { + $this->date_format_modern_1 = (isset($this->skin_options['colorful_date_format1']) and trim($this->skin_options['colorful_date_format1'])) ? $this->skin_options['colorful_date_format1'] : 'd'; + $this->date_format_modern_2 = (isset($this->skin_options['colorful_date_format2']) and trim($this->skin_options['colorful_date_format2'])) ? $this->skin_options['colorful_date_format2'] : 'F'; + $this->date_format_modern_3 = (isset($this->skin_options['colorful_date_format3']) and trim($this->skin_options['colorful_date_format3'])) ? $this->skin_options['colorful_date_format3'] : 'l'; + } + + // Event Times + $this->include_events_times = isset($this->skin_options['include_events_times']) ? $this->skin_options['include_events_times'] : false; + $this->localtime = isset($this->skin_options['include_local_time']) ? $this->skin_options['include_local_time'] : false; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = isset($this->atts['sf_status']) ? $this->atts['sf_status'] : true; + $this->sf_display_label = isset($this->atts['sf_display_label']) ? $this->atts['sf_display_label'] : false; + $this->sf_reset_button = isset($this->atts['sf_reset_button']) ? $this->atts['sf_reset_button'] : false; + $this->sf_refine = isset($this->atts['sf_refine']) ? $this->atts['sf_refine'] : false; + + // Generate an ID for the sking + $this->id = isset($this->atts['id']) ? $this->atts['id'] : mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Show "Load More" button or not + $this->load_more_button = isset($this->skin_options['load_more_button']) ? $this->skin_options['load_more_button'] : true; + + // Pagination + $this->pagination = isset($this->skin_options['pagination']) ? $this->skin_options['pagination'] : (!$this->load_more_button ? '0' : 'loadmore'); + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Order Method + $this->order_method = (isset($this->skin_options['order_method']) and trim($this->skin_options['order_method'])) ? $this->skin_options['order_method'] : 'ASC'; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + if($this->widget) + { + $this->skin_options['count'] = '1'; + $this->load_more_button = false; + $this->pagination = '0'; + $this->widget_autoplay = (!isset($this->atts['widget_autoplay']) or (isset($this->atts['widget_autoplay']) and $this->atts['widget_autoplay'])); + $this->widget_autoplay_time = (isset($this->atts['widget_autoplay_time']) and $this->atts['widget_autoplay_time']) ? $this->atts['widget_autoplay_time'] : 3000; + $this->widget_loop = (!isset($this->atts['widget_loop']) or (isset($this->atts['widget_loop']) and $this->atts['widget_loop'])); + } + + // From Full Calendar + $this->from_full_calendar = (isset($this->skin_options['from_fc']) and trim($this->skin_options['from_fc'])); + + // Display Price + $this->display_price = (isset($this->skin_options['display_price']) and trim($this->skin_options['display_price'])); + + // The count in row + $this->count = isset($this->skin_options['count']) ? $this->skin_options['count'] : '3'; + + // Map on top + $this->map_on_top = isset($this->skin_options['map_on_top']) ? $this->skin_options['map_on_top'] : false; + + // Map geolocation + $this->geolocation = ((isset($this->skin_options['map_on_top']) and (isset($this->skin_options['set_geolocation']))) and ($this->skin_options['map_on_top'] == '1' and $this->skin_options['set_geolocation'] == '1')); + + // Geolocation Focus + $this->geolocation_focus = isset($this->skin_options['set_geolocation_focus']) ? $this->skin_options['set_geolocation_focus'] : 0; + + // reason_for_cancellation + $this->reason_for_cancellation = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; + + // display_label + $this->display_label = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = (in_array($this->order_method, array('ASC', 'DESC')) ? $this->order_method : 'ASC'); + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Exclude Posts + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $this->args['post__not_in'] = $this->atts['exclude']; + + // Include Posts + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $this->args['post__in'] = $this->atts['include']; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Maximum Date Range. + $this->maximum_date_range = $this->get_end_date(); + + // Show Past Events + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = isset($this->atts['show_past_events']) ? $this->atts['show_past_events'] : '0'; + + // Start Date + if (strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + // Start Date + $this->start_date = $this->get_start_date(); + } + else + { + // Start Date + list($this->year, $this->month, $this->day) = $this->get_start_date(); + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-'.$this->day)); + $this->active_day = $this->year . '-' . $this->month.'-' . $this->day; + } + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) $this->maximum_date = $this->start_date; + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Set start time + if(isset($this->atts['seconds'])) + { + $this->args['mec-seconds'] = $this->atts['seconds']; + $this->args['mec-seconds-date'] = isset($this->atts['seconds_date']) ? $this->atts['seconds_date'] : $this->start_date; + } + + // Apply Maximum Date + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month) and $this->order_method === 'ASC') $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + } + + // Found Events + $this->found = 0; + + // Detect Load More Running + $this->loadMoreRunning = false; + + // Auto Month Rotation + $this->auto_month_rotation = !isset($this->settings['auto_month_rotation']) || $this->settings['auto_month_rotation']; + + do_action('mec-grid-initialize-end', $this); + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + if( false === strpos($this->style, 'fluent' ) && false === strpos($this->style, 'liquid') ) + { + return parent::search(); + } + else + { + if($this->show_only_expired_events) + { + if($this->loadMoreRunning) + { + $start = $this->start_date; + + if($this->month == date('m', current_time('timestamp'))) $end = date('Y-m-d', current_time('timestamp')); + else $end = date('Y-m-t', strtotime($this->start_date)); + } + else + { + $now = current_time('timestamp'); + $startDateTime = strtotime(date($this->year.$this->month.'t')) + (int) $this->main->get_gmt_offset_seconds(); + $now = min($startDateTime, $now); + + $start = date('Y-m-d H:i:s', $now); + $end = date('Y-m-d', strtotime($this->year.$this->month.'01')); + } + } + else + { + $start = $this->start_date; + $end = date('Y-m-t', strtotime($this->start_date)); + } + + // Date Events + if($this->show_only_expired_events && $this->loadMoreRunning) $this->show_only_expired_events = '0'; + + $dates = $this->period($start, $end, true); + ksort($dates); + + if($this->show_only_expired_events && $this->loadMoreRunning) $this->show_only_expired_events = '1'; + + // Limit + $this->args['posts_per_page'] = $this->limit; + + $i = 0; + $found = 0; + $events = []; + $qs = []; + + foreach($dates as $date=>$IDs) + { + // No Event + if(!is_array($IDs) or !count($IDs)) continue; + + // Check Finish Date + if(isset($this->maximum_date) and trim($this->maximum_date) and strtotime($date) > strtotime($this->maximum_date)) break; + + // Include Available Events + $this->args['post__in'] = array_unique($IDs); + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // Extending the end date + $this->end_date = $date; + + // Continue to load rest of events in the first date + if($i === 0) $this->args['offset'] = $this->offset; + // Load all events in the rest of dates + else + { + $this->offset = 0; + $this->args['offset'] = 0; + } + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + // Query Key + $q_key = base64_encode(json_encode($this->args)); + + // Get From Cache + if(isset($qs[$q_key])) $query = $qs[$q_key]; + // Search & Cache + else + { + $query = new WP_Query($this->args); + $qs[$q_key] = $query; + } + + if($query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $ID_count = isset($IDs_count[$ID]) ? $IDs_count[$ID] : 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date' => $date), + 'end' => array('date' => $this->main->get_end_date($date, $rendered)) + ); + + $d[] = $this->render->after_render($data, $this, $i); + $found++; + } + + if($found >= $this->limit) + { + // Next Offset + $this->next_offset = ($query->post_count-($query->current_post+1)) >= 0 ? ($query->current_post+1)+$this->offset : 0; + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + + // Restore original Post Data + wp_reset_postdata(); + + break 2; + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + + // Restore original Post Data + wp_reset_postdata(); + $i++; + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + // Set Offset for Last Page + if($found < $this->limit) + { + // Next Offset + $this->next_offset = $found + ((isset($date) and $this->start_date === $date) ? $this->offset : 0); + } + + // Set found events + $this->found = $found; + + return $events; + } + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string|array + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp')); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + // MEC Next Page + if(isset($_REQUEST['mec_next_page']) and trim($_REQUEST['mec_next_page'])) + { + $ex = explode(':', $_REQUEST['mec_next_page']); + + if(strtotime($ex[0])) $date = $ex[0]; + if(isset($ex[1])) $this->offset = $ex[1]; + } + + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) return $date; + else + { + $time = strtotime($date); + return array(date('Y', $time), date('m', $time), date('d', $time)); + } + } + + /** + * Load more events for AJAX request + * @author Webnus + * @return void + */ + public function load_more() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Override variables + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + $this->start_date = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + } + else + { + $this->maximum_date = isset($_REQUEST['mec_maximum_date']) ? sanitize_text_field($_REQUEST['mec_maximum_date']) : ''; + $mecStartDate = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + $this->start_date = strtotime($mecStartDate) > strtotime($this->maximum_date) ? $this->maximum_date : $mecStartDate; + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : NULL; + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : NULL; + $this->loadMoreRunning = true; + } + + $this->end_date = $this->start_date; + $this->offset = isset($_REQUEST['mec_offset']) ? sanitize_text_field($_REQUEST['mec_offset']) : 0; + + // Apply Maximum Date + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month) and $this->order_method === 'ASC') $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Return the events + $this->atts['return_items'] = true; + $this->loading_more = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } + + /** + * Load month for AJAX request / Fluent view + * @author Webnus + * @return void + */ + public function load_month() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $navigator_click = isset($_REQUEST['navigator_click']) && sanitize_text_field($_REQUEST['navigator_click']); + + // Initialize the skin + $this->initialize($atts); + + // Search Events If Not Found In Current Month + $c = 0; + $break = false; + + do + { + if($c > 12) $break = true; + if($c and !$break) + { + if(intval($this->month) == 12) + { + $this->year = intval($this->year)+1; + $this->month = '01'; + } + + $this->month = sprintf("%02d", intval($this->month)+1); + } + else + { + // Start Date + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : current_time('Y'); + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : current_time('m'); + } + + if($this->show_only_expired_events) + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + $this->active_day = date('Y-m-t', strtotime($this->year.'-'.$this->month.'-01')); + } + else + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + + $day = current_time('d'); + $this->active_day = $this->year.'-'.$this->month.'-'.$day; + + // If date is not valid then use the first day of month + if(!$this->main->validate_date($this->active_day)) $this->active_day = $this->year.'-'.$this->month.'-01'; + } + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Return the events + $this->atts['return_items'] = true; + + // Fetch the events + $this->fetch(); + + // Break the loop if not result + if($break) break; + + // Set active day to current day if not result + if(count($this->events)) $this->active_day = key($this->events); + if($navigator_click) break; + + // Auto Rotation is Disabled + if(!$this->auto_month_rotation) break; + + $c++; + } + while(!count($this->events)); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/grid/index.html b/app/skins/grid/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/grid/render.php b/app/skins/grid/render.php new file mode 100755 index 0000000..7e72d9b --- /dev/null +++ b/app/skins/grid/render.php @@ -0,0 +1,345 @@ +main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin'] ) || isset($styling['color'])) ? 'colorskin-custom' : ''; +$settings = $this->main->get_settings(); +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; +$map_events = []; + +// colorful +$colorful_flag = $colorful_class = ''; +if($this->style == 'colorful') +{ + $colorful_flag = true; + $this->style = 'modern'; + $colorful_class = ' mec-event-grid-colorful'; +} +?> +
    +
    + count; + $grid_div = $this->count; + $grid_limit = $this->limit; + + if($count == 0 or $count == 5) $col = 4; + else $col = 12 / $count; + + $close_row = true; + $rcount = 1 ; + + foreach($this->events as $date): + foreach($date as $event): + + $map_events[] = $event; + if($rcount == 1) + { + echo '
    '; + $close_row = true; + } + + echo '
    '; + + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + $event_color = $this->get_event_color_dot($event); + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + $mec_data = $this->display_custom_data($event); + $custom_data_class = !empty($mec_data) ? 'mec-custom-data' : ''; + + // colorful + $colorful_bg_color = ($colorful_flag && isset($event->data->meta['mec_color'])) ? ' style="background: #' . esc_attr($event->data->meta['mec_color']) . '"' : ''; + + // MEC Schema + do_action('mec_schema', $event); + + echo '
    '; + ?> + style == 'modern'): ?> +
    + +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    + +
    main->dateify($event, $this->date_format_modern_1 .' '. $this->date_format_modern_2)); ?>
    + +
    + '.$this->icons->display('location-pin'). esc_html($location['name']) . '
    ' : ''); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + get_label_captions($event)); ?> +
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    +
    + main->get_flags($event); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> +

    + display_cost($event)); ?> +
    + + style == 'classic'): ?> +
    display_link($event, $event->data->thumbnails['medium'], '')); ?>
    + +
    + +
    + main->date_i18n($this->date_format_classic_1, strtotime($event->date['start']['date']))); ?> + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> +
    + +
    + main->dateify($event, $this->date_format_classic_1)); ?> + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> +
    + + + main->get_flags($event); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    + get_label_captions($event)); ?> +

    + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + +
    + + style == 'minimal'): ?> +
    main->date_i18n($this->date_format_minimal_1, strtotime($event->date['start']['date']))); ?>main->date_i18n($this->date_format_minimal_2, strtotime($event->date['start']['date']))); ?>
    +
    +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_flags($event).$event_color); echo MEC_kses::element($this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?>get_label_captions($event,'mec-fc-style')); ?>

    + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> + include_events_times) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> +
    + '.$this->icons->display('location-pin'). esc_html($location['name']) . '
    ' : ''); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + booking_button($event)); ?> +
    +
    + style == 'clean'): ?> +
    + +
    main->date_i18n($this->date_format_clean_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_clean_2, strtotime($event->date['start']['date']))); ?>
    + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> + + +
    main->dateify($event, $this->date_format_clean_1.' '.$this->date_format_clean_2)); ?>
    + + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> + +
    + '. $this->icons->display('location-pin') . esc_html($location['name']) . '
    ' : ''); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + get_label_captions($event)); ?> +
    +
    +
    display_link($event, $event->data->thumbnails['medium'], '')); ?>
    +
    + + + main->get_flags($event); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    +

    +
    + + style == 'novel'): ?> +
    +
    +
    display_link($event, $event->data->thumbnails['thumblist'], '')); ?>
    +
    + main->get_flags($event); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    + +
    main->date_i18n($this->date_format_novel_1, strtotime($event->date['start']['date']))); ?>
    + +
    main->dateify($event, $this->date_format_novel_1)); ?>
    + + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time, array('class' => 'mec-event-detail'))); + if(isset($location['address'])) echo '
    '.esc_html($location['address']).'
    '; + if($this->localtime) echo MEC_kses::full($this->main->module('local-time.type1', array('event' => $event, 'display_svg' => true ))); + echo MEC_kses::element($this->display_categories($event)); + echo MEC_kses::element($this->display_organizers($event)); + echo MEC_kses::element($this->display_cost($event)); + ?> + get_label_captions($event)); ?> + +
    +
    + style == 'simple'): ?> + +
    main->dateify($event, $this->date_format_simple_1)); ?>
    +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_flags($event).$event_color); echo MEC_kses::element($this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?>get_label_captions($event,'mec-fc-style')); ?>

    +
    + + localtime) echo MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); ?> + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> +
    + booking_button($event)); ?> +
    '; + + if($rcount == $count) + { + echo ''; + $rcount = 0; + $close_row = false; + } + + $rcount++; + ?> + + + '; ?> + + + +map_on_top) and $this->map_on_top and isset($map_events) and !empty($map_events)) +{ + // Include Map Assets such as JS and CSS libraries + $this->main->load_map_assets(); + + // It changing geolocation focus, because after done filtering, if it doesn't. then the map position will not set correctly. + if((isset($_REQUEST['action']) and sanitize_text_field($_REQUEST['action']) == 'mec_grid_load_more') and isset($_REQUEST['sf'])) $this->geolocation_focus = true; + + $map_javascript = ''; + + $map_data = new stdClass; + $map_data->id = $this->id; + $map_data->atts = $this->atts; + $map_data->events = $map_events; + $map_data->render = $this->render; + $map_data->geolocation = $this->geolocation; + $map_data->sf_status = null; + $map_data->main = $this->main; + + $map_javascript = apply_filters('mec_map_load_script', $map_javascript, $this, $settings); + + // Include javascript code into the page + if($this->main->is_ajax()) echo MEC_kses::full($map_javascript); + else $this->factory->params('footer', $map_javascript); +} \ No newline at end of file diff --git a/app/skins/grid/tpl.php b/app/skins/grid/tpl.php new file mode 100755 index 0000000..c448f5f --- /dev/null +++ b/app/skins/grid/tpl.php @@ -0,0 +1,100 @@ +get_render_path(); +$styling = $this->main->get_styling(); + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('html' => $items_html, 'end_date' => $this->end_date, 'offset' => $this->next_offset, 'count' => $this->found, 'has_more_event' => (int) $this->has_more_events)); + exit; +} + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +do_action('mec_start_skin', $this->id); +do_action('mec_grid_skin_head'); +?> +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + + found): ?> + map_on_top == '1'): ?> +
    +
    + settings['default_maps_view'])?$this->settings['default_maps_view']:'google'; + do_action('mec_map_inner_element_tools', array('map' => $map)); + ?> +
    + +
    + +
    + +
    +
    + main->display_not_found_message(); ?> +
    + +
    + main->display_not_found_message(); ?> +
    + + + get_pagination_bar(); ?> + +
    +display_credit_url(); \ No newline at end of file diff --git a/app/skins/index.html b/app/skins/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/list.php b/app/skins/list.php new file mode 100755 index 0000000..0fcbcdf --- /dev/null +++ b/app/skins/list.php @@ -0,0 +1,657 @@ + + */ +class MEC_skin_list extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'list'; + + public $date_format_classic_1; + public $date_format_minimal_1; + public $date_format_minimal_2; + public $date_format_minimal_3; + public $date_format_modern_1; + public $date_format_modern_2; + public $date_format_modern_3; + public $date_format_standard_1; + public $date_format_acc_1; + public $date_format_acc_2; + public $display_price; + public $display_available_tickets; + public $date_format_fluent_1; + public $reason_for_cancellation; + public $display_label; + public $loadMoreRunning; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + + // MEC Render + $this->render = $this->getRender(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_list_load_more', [$this, 'load_more']); + $this->factory->action('wp_ajax_nopriv_mec_list_load_more', [$this, 'load_more']); + + // Fluent View + $this->factory->action('wp_ajax_mec_list_load_month', [$this, 'load_month']); + $this->factory->action('wp_ajax_nopriv_mec_list_load_month', [$this, 'load_month']); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) && $this->skin_options['next_previous_button']; + + // Date Formats + $this->date_format_classic_1 = (isset($this->skin_options['classic_date_format1']) and trim($this->skin_options['classic_date_format1'])) ? $this->skin_options['classic_date_format1'] : 'M d Y'; + + $this->date_format_minimal_1 = (isset($this->skin_options['minimal_date_format1']) and trim($this->skin_options['minimal_date_format1'])) ? $this->skin_options['minimal_date_format1'] : 'd'; + $this->date_format_minimal_2 = (isset($this->skin_options['minimal_date_format2']) and trim($this->skin_options['minimal_date_format2'])) ? $this->skin_options['minimal_date_format2'] : 'M'; + $this->date_format_minimal_3 = (isset($this->skin_options['minimal_date_format3']) and trim($this->skin_options['minimal_date_format3'])) ? $this->skin_options['minimal_date_format3'] : 'l'; + + $this->date_format_modern_1 = (isset($this->skin_options['modern_date_format1']) and trim($this->skin_options['modern_date_format1'])) ? $this->skin_options['modern_date_format1'] : 'd'; + $this->date_format_modern_2 = (isset($this->skin_options['modern_date_format2']) and trim($this->skin_options['modern_date_format2'])) ? $this->skin_options['modern_date_format2'] : 'F'; + $this->date_format_modern_3 = (isset($this->skin_options['modern_date_format3']) and trim($this->skin_options['modern_date_format3'])) ? $this->skin_options['modern_date_format3'] : 'l'; + + $this->date_format_standard_1 = (isset($this->skin_options['standard_date_format1']) and trim($this->skin_options['standard_date_format1'])) ? $this->skin_options['standard_date_format1'] : 'd M'; + + $this->date_format_acc_1 = (isset($this->skin_options['accordion_date_format1']) and trim($this->skin_options['accordion_date_format1'])) ? $this->skin_options['accordion_date_format1'] : 'd'; + $this->date_format_acc_2 = (isset($this->skin_options['accordion_date_format2']) and trim($this->skin_options['accordion_date_format2'])) ? $this->skin_options['accordion_date_format2'] : 'F'; + + // Fluent view - Date Formats + $this->date_format_fluent_1 = (isset($this->skin_options['fluent_date_format1']) and trim($this->skin_options['fluent_date_format1'])) ? $this->skin_options['fluent_date_format1'] : 'F d, Y'; + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // Generate an ID for the skin + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Show "Load More" button or not + $this->load_more_button = $this->skin_options['load_more_button'] ?? true; + + // Pagination + $this->pagination = $this->skin_options['pagination'] ?? (!$this->load_more_button ? '0' : 'loadmore'); + + // Show Month Divider or not + $this->month_divider = $this->skin_options['month_divider'] ?? true; + + // Toggle Month Divider or not + $this->toggle_month_divider = $this->skin_options['toggle_month_divider'] ?? 0; + + // Map on top + $this->map_on_top = $this->skin_options['map_on_top'] ?? false; + + // Map geolocation + $this->geolocation = ((isset($this->skin_options['map_on_top']) and (isset($this->skin_options['set_geolocation']))) and ($this->skin_options['map_on_top'] == '1' and $this->skin_options['set_geolocation'] == '1')); + + // Reason for Cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // Display Label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Event Times + $this->include_events_times = $this->skin_options['include_events_times'] ?? false; + $this->localtime = $this->skin_options['include_local_time'] ?? false; + + // Geolocation Focus + $this->geolocation_focus = $this->skin_options['set_geolocation_focus'] ?? 0; + + // The style + $this->style = $this->skin_options['style'] ?? 'modern'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'modern'; + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + if($this->style === 'accordion') $this->sed_method = 0; + + // Order Method + $this->order_method = (isset($this->skin_options['order_method']) and trim($this->skin_options['order_method'])) ? $this->skin_options['order_method'] : 'ASC'; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? 0; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // From Full Calendar + $this->from_full_calendar = (isset($this->skin_options['from_fc']) and trim($this->skin_options['from_fc'])); + + // Display Price + $this->display_price = (isset($this->skin_options['display_price']) and trim($this->skin_options['display_price'])); + + // Fluent & Liquid view - Available Tickets + $this->display_available_tickets = (isset($this->skin_options['display_available_tickets']) and trim($this->skin_options['display_available_tickets'])) ? $this->skin_options['display_available_tickets'] : ''; + + // Progress Bar + $this->display_progress_bar = (isset($this->skin_options['display_progress_bar']) and trim($this->skin_options['display_progress_bar'])); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = (in_array($this->order_method, array('ASC', 'DESC')) ? $this->order_method : 'ASC'); + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Exclude Posts + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $this->args['post__not_in'] = $this->atts['exclude']; + + // Include Posts + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $this->args['post__in'] = $this->atts['include']; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Maximum Date Range. + $this->maximum_date_range = $this->get_end_date(); + + // Show Past Events + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? '0'; + + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + // Start Date + $this->start_date = $this->get_start_date(); + } + else + { + // Start Date + list($this->year, $this->month, $this->day) = $this->get_start_date(); + + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-'.$this->day)); + $this->active_day = $this->year . '-' . $this->month.'-' . $this->day; + } + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + if((strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false)) + { + $this->maximum_date = $this->start_date; + } + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Set start time + if(isset($this->atts['seconds'])) + { + $this->args['mec-seconds'] = $this->atts['seconds']; + $this->args['mec-seconds-date'] = $this->atts['seconds_date'] ?? $this->start_date; + } + + // Apply Maximum Date + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + $month = (isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : ($_REQUEST['mec_month'] ?? ''); + if($apply_sf_date == 1 and trim($month) and $this->order_method === 'ASC') $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + } + + // Found Events + $this->found = 0; + + // Detect Load More Running + $this->loadMoreRunning = false; + + // Auto Month Rotation + $this->auto_month_rotation = !isset($this->settings['auto_month_rotation']) || $this->settings['auto_month_rotation']; + + do_action('mec-list-initialize-end', $this); + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + return parent::search(); + } + else + { + if($this->show_only_expired_events) + { + if($this->loadMoreRunning) + { + $start = $this->start_date; + + if($this->month == date('m', current_time('timestamp'))) $end = date('Y-m-d', current_time('timestamp')); + else $end = date('Y-m-t', strtotime($this->start_date)); + } + else + { + $now = current_time('timestamp'); + $startDateTime = strtotime(date($this->year.$this->month.'t')) + (int) $this->main->get_gmt_offset_seconds(); + $now = min($startDateTime, $now); + + $start = date('Y-m-d H:i:s', $now); + $end = date('Y-m-d', strtotime($this->year.$this->month.'01')); + } + } + else + { + $start = $this->start_date; + $end = date('Y-m-t', strtotime($this->start_date)); + + // Set a certain maximum date from shortcode page. + if(trim($this->maximum_date) == '' and (isset($this->maximum_date_range) and trim($this->maximum_date_range))) $this->maximum_date = $this->maximum_date_range; + } + + // Date Events + if($this->show_only_expired_events && $this->loadMoreRunning) $this->show_only_expired_events = '0'; + + $dates = $this->period($start, $end, true); + ksort($dates); + + if($this->show_only_expired_events && $this->loadMoreRunning) $this->show_only_expired_events = '1'; + + // Limit + $this->args['posts_per_page'] = $this->limit; + + $i = 0; + $found = 0; + $events = []; + $qs = []; + + foreach($dates as $date=>$IDs) + { + // No Event + if(!is_array($IDs) or !count($IDs)) continue; + + // Check Finish Date + if(isset($this->maximum_date) and trim($this->maximum_date) and strtotime($date) > strtotime($this->maximum_date)) break; + + // Include Available Events + $this->args['post__in'] = array_unique($IDs); + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // Extending the end date + $this->end_date = $date; + + // Continue to load rest of events in the first date + if($i === 0) $this->args['offset'] = $this->offset; + // Load all events in the rest of dates + else + { + $this->offset = 0; + $this->args['offset'] = 0; + } + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + // Query Key + $q_key = base64_encode(json_encode($this->args)); + + // Get From Cache + if(isset($qs[$q_key])) $query = $qs[$q_key]; + // Search & Cache + else + { + $query = new WP_Query($this->args); + $qs[$q_key] = $query; + } + + if($query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $ID_count = isset($IDs_count[$ID]) ? $IDs_count[$ID] : 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date' => $date), + 'end' => array('date' => $this->main->get_end_date($date, $rendered)) + ); + + $d[] = $this->render->after_render($data, $this, $i); + $found++; + } + + if($found >= $this->limit) + { + // Next Offset + $this->next_offset = ($query->post_count-($query->current_post+1)) >= 0 ? ($query->current_post+1)+$this->offset : 0; + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + + // Restore original Post Data + wp_reset_postdata(); + + break 2; + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + + // Restore original Post Data + wp_reset_postdata(); + $i++; + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + // Set Offset for Last Page + if($found < $this->limit) + { + // Next Offset + $this->next_offset = $found + ((isset($date) and $this->start_date === $date) ? $this->offset : 0); + } + + // Set found events + $this->found = $found; + + return $events; + } + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string|array + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp')); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + // MEC Next Page + if(isset($_REQUEST['mec_next_page']) and trim($_REQUEST['mec_next_page'])) + { + $ex = explode(':', $_REQUEST['mec_next_page']); + + if(strtotime($ex[0])) $date = $ex[0]; + if(isset($ex[1])) $this->offset = $ex[1]; + } + + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) return $date; + else + { + $time = strtotime($date); + return array(date('Y', $time), date('m', $time), date('d', $time)); + } + } + + /** + * Load more events for AJAX request + * @author Webnus + * @return void + */ + public function load_more() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Override variables + if(strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false) + { + $this->start_date = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + } + else + { + $this->maximum_date = isset($_REQUEST['mec_maximum_date']) ? sanitize_text_field($_REQUEST['mec_maximum_date']) : ''; + $mecStartDate = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + $this->start_date = strtotime($mecStartDate) > strtotime($this->maximum_date) ? $this->maximum_date : $mecStartDate; + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : NULL; + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : NULL; + $this->loadMoreRunning = true; + } + + $this->end_date = $this->start_date; + $this->offset = isset($_REQUEST['mec_offset']) ? sanitize_text_field($_REQUEST['mec_offset']) : 0; + + // Apply Maximum Date + $month = (isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : ($_REQUEST['mec_month'] ?? ''); + if($apply_sf_date == 1 and trim($month) and $this->order_method === 'ASC') $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Return the events + $this->atts['return_items'] = true; + if(!$apply_sf_date) $this->loading_more = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } + + /** + * Load month for AJAX request / Fluent View + * @author Webnus + * @return void + */ + public function load_month() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $navigator_click = isset($_REQUEST['navigator_click']) && sanitize_text_field($_REQUEST['navigator_click']); + + // Initialize the skin + $this->initialize($atts); + + // Search Events If Not Found In Current Month + $c = 0; + $break = false; + + do + { + if($c > 12) $break = true; + if($c and !$break) + { + if(intval($this->month) == 12) + { + $this->year = intval($this->year)+1; + $this->month = '01'; + } + + $this->month = sprintf("%02d", intval($this->month)+1); + } + else + { + // Start Date + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : current_time('Y'); + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : current_time('m'); + } + + if($this->show_only_expired_events) + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + $this->active_day = date('Y-m-t', strtotime($this->year.'-'.$this->month.'-01')); + } + else + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + + $day = current_time('d'); + $this->active_day = $this->year.'-'.$this->month.'-'.$day; + + // If date is not valid then use the first day of month + if(!$this->main->validate_date($this->active_day, 'Y-m-d')) $this->active_day = $this->year.'-'.$this->month.'-01'; + } + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Return the events + $this->atts['return_items'] = true; + + // Fetch the events + $this->fetch(); + + // Break the loop if not result + if($break) break; + + // Set active day to current day if not result + if(count($this->events)) $this->active_day = key($this->events); + if($navigator_click) break; + + // Auto Rotation is Disabled + if(!$this->auto_month_rotation) break; + + $c++; + } + while(!count($this->events)); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/list/index.html b/app/skins/list/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/list/render.php b/app/skins/list/render.php new file mode 100755 index 0000000..b650dd6 --- /dev/null +++ b/app/skins/list/render.php @@ -0,0 +1,369 @@ +main->get_styling(); +$settings = $this->main->get_settings(); +$current_month_divider = isset($_REQUEST['current_month_divider']) ? sanitize_text_field($_REQUEST['current_month_divider']) : 0; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; +$map_events = []; +?> +
    +
    + events as $date=>$events): ?> + + month_divider and $month_id != $current_month_divider): $current_month_divider = $month_id; ?> +
    main->date_i18n('F Y', strtotime($date))); ?>
    + + + main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $event_color = $this->get_event_color_dot($event); + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + $mec_data = $this->display_custom_data($event); + $custom_data_class = !empty($mec_data) ? 'mec-custom-data' : ''; + + // MEC Schema + do_action('mec_schema', $event); + ?> +
    + style == 'modern'): ?> +
    + + main->is_multipleday_occurrence($event, true)): ?> +
    +
    + main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?> - + main->date_i18n($this->date_format_modern_1, strtotime($event->date['end']['date']))); ?> +
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    + main->is_multipleday_occurrence($event)): ?> +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['end']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['end']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['end']['date']))); ?>
    +
    + +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    + +
    +
    + + main->get_flags($event); ?> +

    display_link($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>display_custom_data($event)); ?>data->ID); ?>get_label_captions($event,'mec-fc-style')); ?>

    + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> +
    +
    + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> +
    +
      main->module('links.list', array('event' => $event))); ?>
    +
    +
    + booking_button($event, 'icon')); ?> + display_link($event, ((is_array($event->data->tickets) and count($event->data->tickets) and !strpos($soldout, '%%soldout%%') and !$this->booking_button and !$this->main->is_expired($event)) ? $this->main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite')) : $this->main->m('view_detail', esc_html__('View Detail', 'modern-events-calendar-lite'))), 'mec-booking-button')); ?> + +
    + style == 'classic'): ?> +
    display_link($event, $event->data->thumbnails['thumbnail'])); ?>
    + +
    icons->display('calendar'); ?> main->date_i18n($this->date_format_classic_1, strtotime($event->date['start']['date']))); ?>
    + +
    icons->display('calendar'); ?> main->dateify($event, $this->date_format_classic_1)); ?>
    +
    include_events_times and trim($start_time)) { echo $this->icons->display('clock'); echo MEC_kses::element($this->main->display_time($start_time, $end_time)); } ?>
    + + get_label_captions($event)); ?> + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_flags($event).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    +
    icons->display('map-marker'); ?>
    + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + skin_options); ?> + booking_button($event)); ?> + style == 'minimal'): ?> + get_label_captions($event)); ?> +
    + main->is_multipleday_occurrence($event, true)): ?> +
    + main->date_i18n($this->date_format_minimal_1, strtotime($event->date['start']['date']))); ?> - main->date_i18n($this->date_format_minimal_1, strtotime($event->date['end']['date']))); ?> + main->date_i18n($this->date_format_minimal_2, strtotime($event->date['start']['date']))); ?> +
    + main->is_multipleday_occurrence($event)): ?> +
    + main->date_i18n($this->date_format_minimal_1, strtotime($event->date['start']['date']))); ?> + main->date_i18n($this->date_format_minimal_2, strtotime($event->date['start']['date']))); ?> +
    +
    + main->date_i18n($this->date_format_minimal_1, strtotime($event->date['end']['date']))); ?> + main->date_i18n($this->date_format_minimal_2, strtotime($event->date['end']['date']))); ?> +
    + +
    + main->date_i18n($this->date_format_minimal_1, strtotime($event->date['start']['date']))); ?> + main->date_i18n($this->date_format_minimal_2, strtotime($event->date['start']['date']))); ?> +
    + + + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_flags($event).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    +
    + main->date_i18n($this->date_format_minimal_3, strtotime($event->date['start']['date']))); ?>, ' . esc_html($location['name']) .'' : ''); ?>localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> +
    + + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + booking_button($event)); ?> +
    +
    display_link($event, $this->main->m('event_detail', esc_html__('EVENT DETAIL', 'modern-events-calendar-lite')), 'mec-detail-button')); ?>
    + style == 'standard'): ?> + data->post); + + // Safe Excerpt for UTF-8 Strings + if(!trim($excerpt)) + { + $ex = explode(' ', strip_tags(strip_shortcodes($event->data->post->post_content))); + $words = array_slice($ex, 0, 10); + + $excerpt = implode(' ', $words); + if(trim($excerpt)) $excerpt .= ' […]'; + } + ?> +
    + data->thumbnails['thumblist'])) : ?> +
    +
    display_link($event, $event->data->thumbnails['thumblist'], '')); ?>
    +
    + + +
    +
    + main->get_flags($event); ?> + display_status_bar($event)); ?> +

    display_link($event)); ?>display_custom_data($event)); ?>main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID ); ?>

    +
    +
    +
    +
    +
    +
    + + icons->display('calendar'); ?>main->date_i18n($this->date_format_standard_1, strtotime($event->date['start']['date']))); ?> + + icons->display('calendar'); ?>main->dateify($event, $this->date_format_standard_1)); ?> + +
    + get_label_captions($event)); ?> + main->display_time($start_time, $end_time, ['display_svg' => true, 'icon' => ($this->icons->has('clock') ? $this->icons->display('clock') : '')])); ?> + localtime) echo MEC_kses::full($this->main->module('local-time.type1', array('event' => $event, 'display_svg' => true ))); ?> + +
    + icons->has('location-pin') ? $this->icons->display('location-pin') : ''; ?> + + +
    + +
    + + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> + +
    +
    +
    + + style == 'accordion'): ?> + +
    + +
    +
    + toggle_month_divider == '1'): ?> + + +
    + +
    main->date_i18n($this->date_format_acc_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_acc_2, strtotime($event->date['start']['date']))); ?>
    + +
    main->dateify($event, $this->date_format_acc_1.' '.$this->date_format_acc_2)); ?>
    + + main->display_time($start_time, $end_time)); ?> +
    +

    + data->title), + $event, + $this + ); + ?>main->get_flags($event).$event_color); ?>

    + get_label_captions($event,'mec-fc-style')); ?> + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?>data->ID); ?> +
    + +
    +
    + style === 'admin'): ?> +
    + main->is_multipleday_occurrence($event, true)): ?> +
    +
    + main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?> - + main->date_i18n($this->date_format_modern_1, strtotime($event->date['end']['date']))); ?> +
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    + main->is_multipleday_occurrence($event)): ?> +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['end']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['end']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['end']['date']))); ?>
    +
    + +
    +
    main->date_i18n($this->date_format_modern_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_2, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_modern_3, strtotime($event->date['start']['date']))); ?>
    +
    + +
    +
    + main->get_flags($event); ?> +

    + + data->title, $event); ?> + + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?> + data->ID); ?> + get_label_captions($event,'mec-fc-style')); ?> +

    +
    +
    + include_events_times and trim($start_time)) echo MEC_kses::element($this->main->display_time($start_time, $end_time)); ?> + display_categories($event)); ?> + display_organizers($event)); ?> + display_cost($event)); ?> +
    +
    +
    + date['start']['timestamp']) && current_user_can(current_user_can('administrator') ? 'manage_options' : 'mec_bookings') && $total_attendees = $this->main->get_total_attendees_by_event_occurrence($event->data->ID, $event->date['start']['timestamp'])): ?> + () + +
    + +
    + + +
    +
    + +map_on_top) and $this->map_on_top and isset($map_events) and !empty($map_events)) +{ + // Include Map Assets such as JS and CSS libraries + $this->main->load_map_assets(); + + // It changing geolocation focus, because after done filtering, if it doesn't. then the map position will not set correctly. + if((isset($_REQUEST['action']) and sanitize_text_field($_REQUEST['action']) == 'mec_list_load_more') and isset($_REQUEST['sf'])) $this->geolocation_focus = true; + + $map_javascript = ''; + + $map_javascript = apply_filters('mec_map_load_script', $map_javascript, $this, $settings); + + // Include javascript code into the page + if($this->main->is_ajax()) echo MEC_kses::full($map_javascript); + else $this->factory->params('footer', $map_javascript); +} diff --git a/app/skins/list/tpl.php b/app/skins/list/tpl.php new file mode 100755 index 0000000..b7a3e79 --- /dev/null +++ b/app/skins/list/tpl.php @@ -0,0 +1,108 @@ +get_render_path(); +$styling = $this->main->get_styling(); + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('html' => $items_html, 'end_date' => $this->end_date, 'offset' => $this->next_offset, 'count' => $this->found, 'current_month_divider' => $current_month_divider, 'has_more_event' => (int) $this->has_more_events)); + exit; +} + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Generating javascript code tpl +$javascript = ''; + +// Do not include JS due to loading in display only views such as MEC Dashboard +if(isset($this->skin_options['ignore_js']) and $this->skin_options['ignore_js']) $javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +do_action('mec_start_skin', $this->id); +do_action('mec_list_skin_head'); +?> +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + + found): ?> + map_on_top == '1'): ?> +
    +
    + settings['default_maps_view'] ?? 'google'; + do_action('mec_map_inner_element_tools', array('map' => $map)); + ?> +
    + +
    + +
    + +
    +
    + main->display_not_found_message(); ?> +
    + +
    + main->display_not_found_message(); ?> +
    + + + get_pagination_bar(); ?> + +
    +display_credit_url(); \ No newline at end of file diff --git a/app/skins/map.php b/app/skins/map.php new file mode 100755 index 0000000..11a3fc4 --- /dev/null +++ b/app/skins/map.php @@ -0,0 +1,253 @@ + + */ +class MEC_skin_map extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'map'; + public $geolocation; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_map_get_markers', array($this, 'get_markers')); + $this->factory->action('wp_ajax_nopriv_mec_map_get_markers', array($this, 'get_markers')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + $this->style = $this->skin_options['style'] ?? 'classic'; + + // Next/Previous Month + $this->next_previous_button = isset($this->skin_options['next_previous_button']) && $this->skin_options['next_previous_button']; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // Generate an ID for the skin + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 200; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? 0; + + // Geolocation + $this->geolocation = $this->skin_options['geolocation'] ?? 0; + + // Geolocation Focus + $this->geolocation_focus = $this->skin_options['geolocation_focus'] ?? 0; + + // Start Date + $this->start_date = $this->get_start_date(); + + // End Date + $this->end_date = ((isset($this->atts['date-range-end']) and trim($this->atts['date-range-end'])) ? $this->atts['date-range-end'] : NULL); + if(!$this->end_date and isset($this->sf['month']) and trim($this->sf['month']) and isset($this->sf['year']) and trim($this->sf['year'])) $this->end_date = date('Y-m-t', strtotime($this->sf['year'].'-'.$this->sf['month'].'-01')); + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + return $date; + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array + */ + public function search() + { + $events = []; + $sorted = []; + + $yesterday = ($this->end_date ? $this->start_date : date('Y-m-d', strtotime('Yesterday', strtotime($this->start_date)))); + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + $query = new WP_Query($this->args); + + if($query->have_posts()) + { + // The Loop + while($query->have_posts()) + { + $query->the_post(); + + $event_id = get_the_ID(); + $rendered = $this->render->data($event_id); + + $data = new stdClass(); + $data->ID = $event_id; + $data->data = $rendered; + $data->dates = $this->render->dates($event_id, $rendered, 1, $yesterday); + $data->date = $data->dates[0] ?? []; + + if(strtotime($data->date['end']['date']) < strtotime($this->start_date)) continue; + if($this->end_date and strtotime($data->date['start']['date']) > strtotime($this->end_date)) continue; + + if($this->hide_time_method == 'end' and strtotime($data->date['end']['date']) < strtotime($this->start_date)) continue; + elseif($this->hide_time_method != 'end') + { + if((isset($this->atts['show_past_events']) and !$this->atts['show_past_events']) and strtotime($data->date['start']['date']) < strtotime($this->start_date)) continue; + } + + // Caclculate event start time + $event_start_time = (isset($data->date['start']) ? strtotime($data->date['start']['date']) : 0) + $rendered->meta['mec_start_day_seconds']; + + // Add the event into the to be sorted array + if(!isset($sorted[$event_start_time])) $sorted[$event_start_time] = []; + $sorted[$event_start_time][] = $this->render->after_render($data, $this); + } + + ksort($sorted, SORT_NUMERIC); + } + + // Add sorted events to the results + foreach($sorted as $sorted_events) + { + if(!is_array($sorted_events)) continue; + foreach($sorted_events as $sorted_event) $events[$sorted_event->ID] = $sorted_event; + } + + // Restore original Post Data + wp_reset_postdata(); + + return $events; + } + + /** + * Get markers for AJAX request + * @author Webnus + * @return void + */ + public function get_markers() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Return the events + $this->atts['return_items'] = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } +} diff --git a/app/skins/map/index.html b/app/skins/map/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/map/tpl.php b/app/skins/map/tpl.php new file mode 100755 index 0000000..52e8eca --- /dev/null +++ b/app/skins/map/tpl.php @@ -0,0 +1,100 @@ +main->get_settings(); +$settings['view_mode'] = $this->atts['location_view_mode'] ?? 'normal'; +$settings['map'] = $settings['default_maps_view'] ?? 'google'; + +// Return the data if called by AJAX +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('markers' => $this->render->markers($this->events, $this->style))); + exit; +} + +$events_data = $this->render->markers($this->events, $this->style); +if(count($this->events)) +{ + // Include Map Assets such as JS and CSS libraries + $this->main->load_map_assets(false, $settings); + + $javascript = ''; + + $javascript = apply_filters('mec_map_load_script', $javascript, $this, $settings); + + // Include javascript code into the page + if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); + else $this->factory->params('footer', $javascript); +} + +do_action('mec_start_skin', $this->id); +do_action('mec_map_skin_head'); +?> + +
    + + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> + + + events)): ?> +
    + +
    + +

    + + +
    + +
    +
    +
    +
    + sf_status) echo MEC_kses::full($this->sf_search_form()); ?> +
    +
    +
    +
    +
    + events)): ?> +
    + +
    + +

    + +
    +
    +
    +
    + +display_credit_url(); diff --git a/app/skins/masonry.php b/app/skins/masonry.php new file mode 100755 index 0000000..825b19b --- /dev/null +++ b/app/skins/masonry.php @@ -0,0 +1,340 @@ + + */ +class MEC_skin_masonry extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'masonry'; + public $date_format_1 = 'j'; + public $date_format_2 = 'F'; + public $filter_by = 'category'; + public $masonry_like_grid; + public $fit_to_row; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_masonry_load_more', array($this, 'load_more')); + $this->factory->action('wp_ajax_nopriv_mec_masonry_load_more', array($this, 'load_more')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Date Formats + $this->date_format_1 = (isset($this->skin_options['date_format1']) and trim($this->skin_options['date_format1'])) ? $this->skin_options['date_format1'] : 'j'; + $this->date_format_2 = (isset($this->skin_options['date_format2']) and trim($this->skin_options['date_format2'])) ? $this->skin_options['date_format2'] : 'F'; + + // Filter By + $this->filter_by = (isset($this->skin_options['filter_by']) and trim($this->skin_options['filter_by'])) ? $this->skin_options['filter_by'] : ''; + + // Search Form Options + $this->sf_options = $this->atts['sf-options'][$this->skin] ?? []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // Generate an ID for the sking + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // Show "Load More" button or not + $this->load_more_button = $this->skin_options['load_more_button'] ?? true; + + // Pagination + $this->pagination = $this->skin_options['pagination'] ?? (!$this->load_more_button ? '0' : 'loadmore'); + + // Show Masonry like grid + $this->masonry_like_grid = $this->skin_options['masonry_like_grid'] ?? true; + + // Show "Sort by date" button or not + $this->fit_to_row = $this->skin_options['fit_to_row'] ?? true; + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // Order Method + $this->order_method = (isset($this->skin_options['order_method']) and trim($this->skin_options['order_method'])) ? $this->skin_options['order_method'] : 'ASC'; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 24; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = (in_array($this->order_method, array('ASC', 'DESC')) ? $this->order_method : 'ASC'); + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Exclude Posts + if(isset($this->atts['exclude']) and is_array($this->atts['exclude']) and count($this->atts['exclude'])) $this->args['post__not_in'] = $this->atts['exclude']; + + // Include Posts + if(isset($this->atts['include']) and is_array($this->atts['include']) and count($this->atts['include'])) $this->args['post__in'] = $this->atts['include']; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Maximum Date Range. + $this->maximum_date_range = $this->get_end_date(); + + if($this->show_only_expired_events) + { + $this->atts['show_past_events'] = '1'; + $this->args['order'] = 'DESC'; + } + + // Show Past Events + $this->args['mec-past-events'] = isset($this->atts['show_past_events']) ? $this->atts['show_past_events'] : '0'; + + // Start Date + $this->start_date = $this->get_start_date(); + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) + { + $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + if((strpos($this->style, 'fluent') === false && strpos($this->style, 'liquid') === false)) + { + $this->maximum_date = $this->start_date; + } + } + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Set start time + if(isset($this->atts['seconds'])) + { + $this->args['mec-seconds'] = $this->atts['seconds']; + $this->args['mec-seconds-date'] = isset($this->atts['seconds_date']) ? $this->atts['seconds_date'] : $this->start_date; + } + + // Apply Maximum Date + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 0; + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Found Events + $this->found = 0; + + do_action('mec-masonry-initialize-end', $this); + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return string + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'today') $date = current_time('Y-m-d'); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'tomorrow') $date = date('Y-m-d', strtotime('Tomorrow')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'yesterday') $date = date('Y-m-d', strtotime('Yesterday')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $now = date('Y-m-d H:i:s', current_time('timestamp')); + if(strtotime($date) > strtotime($now)) $date = $now; + } + + // MEC Next Page + if(isset($_REQUEST['mec_next_page']) and trim($_REQUEST['mec_next_page'])) + { + $ex = explode(':', $_REQUEST['mec_next_page']); + + if(strtotime($ex[0])) $date = $ex[0]; + if(isset($ex[1])) $this->offset = $ex[1]; + } + + return $date; + } + + /** + * Load more events for AJAX request + * @author Webnus + * @return void + */ + public function load_more() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + + $mec_filter_by = isset($_REQUEST['mec_filter_by']) ? sanitize_text_field($_REQUEST['mec_filter_by']) : ''; + $mec_filter_value = isset($_REQUEST['mec_filter_value']) ? sanitize_text_field($_REQUEST['mec_filter_value']) : ''; + if($mec_filter_by and ($mec_filter_value and $mec_filter_value != '*')) $this->sf[$mec_filter_by] = $mec_filter_value; + + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + // Initialize the skin + $this->initialize($atts); + + // Override variables + $this->start_date = isset($_REQUEST['mec_start_date']) ? sanitize_text_field($_REQUEST['mec_start_date']) : date('y-m-d'); + $this->end_date = $this->start_date; + $this->offset = isset($_REQUEST['mec_offset']) ? sanitize_text_field($_REQUEST['mec_offset']) : 0; + + // Apply Maximum Date + $month = (isset($this->sf) && isset($this->sf['month']) && trim($this->sf['month'])) ? $this->sf['month'] : (isset($_REQUEST['mec_month']) ? $_REQUEST['mec_month'] : ''); + if($apply_sf_date == 1 and trim($month)) $this->maximum_date = date('Y-m-t', strtotime($this->start_date)); + + // Return the events + $this->atts['return_items'] = true; + $this->loading_more = true; + + // Fetch the events + $this->fetch(); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } + + public function filter_by() + { + $output = '
    '.esc_html__('All', 'modern-events-calendar-lite').''; + + $taxonomy = $this->filter_by_get_taxonomy(); + $terms = get_terms($taxonomy, array + ( + 'hide_empty' => true, + 'include' => ((isset($this->atts[$this->filter_by]) and trim($this->atts[$this->filter_by])) ? $this->atts[$this->filter_by] : ''), + )); + + foreach($terms as $term) $output .= ''.esc_html($term->name).''; + + $output .= '
    '; + return $output; + } + + public function filter_by_get_taxonomy() + { + if($this->filter_by == 'label') $taxonomy = 'mec_label'; + elseif($this->filter_by == 'location') $taxonomy = 'mec_location'; + elseif($this->filter_by == 'organizer') $taxonomy = 'mec_organizer'; + else $taxonomy = 'mec_category'; + + return $taxonomy; + } + + public function filter_by_classes($event_id) + { + $output = ''; + + $taxonomy = $this->filter_by_get_taxonomy(); + $terms = wp_get_post_terms($event_id, $taxonomy, array + ( + 'hide_empty' => true, + )); + + foreach($terms as $term) $output .= ' mec-t'.$term->term_id; + return trim($output); + } +} diff --git a/app/skins/masonry/index.html b/app/skins/masonry/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/skins/masonry/render.php b/app/skins/masonry/render.php new file mode 100755 index 0000000..d304ea0 --- /dev/null +++ b/app/skins/masonry/render.php @@ -0,0 +1,162 @@ +main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? 'colorskin-custom' : ''; +$settings = $this->main->get_settings(); +$this->localtime = isset($this->skin_options['include_local_time']) ? $this->skin_options['include_local_time'] : false; +$display_label = isset($this->skin_options['display_label']) ? $this->skin_options['display_label'] : false; +$reason_for_cancellation = isset($this->skin_options['reason_for_cancellation']) ? $this->skin_options['reason_for_cancellation'] : false; +?> +
    +
    + events as $date): + foreach($date as $event): + + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $organizer_id = $this->main->get_master_organizer_id($event); + $organizer = ($organizer_id ? $this->main->get_organizer_data($organizer_id) : array()); + + $event_color = $this->get_event_color_dot($event); + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + $mec_data = $this->display_custom_data($event); + $custom_data_class = !empty($mec_data) ? 'mec-custom-data' : ''; + + // MEC Schema + do_action('mec_schema', $event); + + $masonry_filter = ''; + if($this->filter_by == 'category') + { + if(isset($event->data->categories) && !empty($event->data->categories)) + { + $masonry_filter = "["; + foreach($event->data->categories as $key => $value) $masonry_filter .= '"' . $value['id'] . '",'; + + $masonry_filter .= "]"; + $masonry_filter = str_replace(",]", "]", $masonry_filter); + } + } + elseif($this->filter_by == 'label') + { + if(isset($event->data->labels) && !empty($event->data->labels)) + { + $masonry_filter = "["; + foreach($event->data->labels as $key => $value) $masonry_filter .= '"' . $value['id'] . '",'; + + $masonry_filter .= "]"; + $masonry_filter = str_replace(",]", "]", $masonry_filter); + } + } + elseif($this->filter_by == 'organizer') + { + if(isset($event->data->organizers) && !empty($event->data->organizers)) + { + $masonry_filter = "["; + foreach($event->data->organizers as $key => $value) $masonry_filter .= '"' . $value['id'] . '",'; + + $masonry_filter .= "]"; + $masonry_filter = str_replace(",]", "]", $masonry_filter); + } + } + elseif($this->filter_by == 'location') + { + if(isset($event->data->locations) && !empty($event->data->locations)) + { + $masonry_filter = "["; + foreach($event->data->locations as $key => $value) $masonry_filter .= '"' . $value['id'] . '",'; + + $masonry_filter .= "]"; + $masonry_filter = str_replace(",]", "]", $masonry_filter); + } + } + + if(empty($masonry_filter)) $masonry_filter = "[\"\"]"; + ?> +
    +
    + +
    + data->featured_image) and $this->masonry_like_grid): ?> +
    display_link($event, get_the_post_thumbnail($event->data->ID , 'thumblist'), '')); ?>
    + data->featured_image) and isset($event->data->featured_image['full']) and trim($event->data->featured_image['full'])): ?> +
    display_link($event, get_the_post_thumbnail($event->data->ID , 'full'), '')); ?>
    + + + get_label_captions($event)); ?> + +
    +
    + +
    + +
    main->date_i18n($this->date_format_1, strtotime($event->date['start']['date']))); ?>
    +
    main->date_i18n($this->date_format_2, strtotime($event->date['start']['date']))); ?>
    + +
    main->dateify($event, $this->date_format_1)); ?>
    +
    main->dateify($event, $this->date_format_2)); ?>
    + +
    + localtime) echo MEC_kses::full($this->main->module('local-time.type2', array('event' => $event))); ?> +
    + + +
    +
    + icons->display('location-pin'); ?> +
    +
    +
    +
    +
    +
    + + +
    + + data->post); + + // Safe Excerpt for UTF-8 Strings + if(!trim($excerpt)) + { + $excerpt_count = apply_filters('MEC_masonry_excerpt', '9'); + $ex = explode(' ', strip_tags(strip_shortcodes($event->data->post->post_content))); + $words = array_slice($ex, 0, apply_filters('MEC_masonry_excerpt', '9')); + + $excerpt = implode(' ', $words); + } + ?> +
    + main->get_flags($event); ?> +

    display_link($event)); ?>display_custom_data($event)); ?> data->ID ); ?>

    + main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); ?> + display_categories($event)); ?> + display_organizers($event)); ?> +
    +

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    \ No newline at end of file diff --git a/app/skins/masonry/tpl.php b/app/skins/masonry/tpl.php new file mode 100755 index 0000000..9c7769d --- /dev/null +++ b/app/skins/masonry/tpl.php @@ -0,0 +1,94 @@ +get_render_path(); + +ob_start(); +include $render_path; +$items_html = ob_get_clean(); + +if(isset($this->atts['return_items']) and $this->atts['return_items']) +{ + echo json_encode(array('html' => $items_html, 'end_date' => $this->end_date, 'offset' => $this->next_offset, 'count' => $this->found, 'has_more_event' => (int) $this->has_more_events)); + exit; +} + +$sed_method = $this->sed_method; +if($sed_method == 'new') $sed_method = '0'; + +// Inclue Isotope Assets +$this->main->load_isotope_assets(); + +// Generating javascript code tpl +$javascript = ''; + +// Include javascript code into the page +if($this->main->is_ajax() or $this->main->preview()) echo MEC_kses::full($javascript); +else $this->factory->params('footer', $javascript); + +$styling = $this->main->get_styling(); +$event_colorskin = (isset($styling['mec_colorskin']) || isset($styling['color'])) ? ' colorskin-custom ' : ''; + +$dark_mode = $styling['dark_mode'] ?? ''; +if($dark_mode == 1) $set_dark = 'mec-dark-mode'; +else $set_dark = ''; + +do_action('mec_start_skin', $this->id); +do_action('mec_masonry_skin_head'); +?> +
    + filter_by)) echo MEC_kses::element($this->filter_by()); ?> + + found): ?> +
    + +
    +
    + main->display_not_found_message(); ?> +
    + +
    + main->display_not_found_message(); ?> +
    + + + get_pagination_bar(); ?> +
    +display_credit_url(); ?> + + */ +class MEC_skin_monthly_view extends MEC_skins +{ + /** + * @var string + */ + public $skin = 'monthly_view'; + public $activate_first_date = false; + public $activate_current_day = true; + public $display_all = false; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Registers skin actions into WordPress + * @author Webnus + */ + public function actions() + { + $this->factory->action('wp_ajax_mec_monthly_view_load_month', array($this, 'load_month')); + $this->factory->action('wp_ajax_nopriv_mec_monthly_view_load_month', array($this, 'load_month')); + } + + /** + * Initialize the skin + * @author Webnus + * @param array $atts + */ + public function initialize($atts) + { + $this->atts = $atts; + + // Skin Options + $this->skin_options = (isset($this->atts['sk-options']) and isset($this->atts['sk-options'][$this->skin])) ? $this->atts['sk-options'][$this->skin] : []; + + // Icons + $this->icons = $this->main->icons( + isset($this->atts['icons']) && is_array($this->atts['icons']) ? $this->atts['icons'] : [] + ); + + // Search Form Options + $this->sf_options = (isset($this->atts['sf-options']) and isset($this->atts['sf-options'][$this->skin])) ? $this->atts['sf-options'][$this->skin] : []; + + // Search Form Status + $this->sf_status = $this->atts['sf_status'] ?? true; + $this->sf_display_label = $this->atts['sf_display_label'] ?? false; + $this->sf_reset_button = $this->atts['sf_reset_button'] ?? false; + $this->sf_refine = $this->atts['sf_refine'] ?? false; + + // The events + $this->events_str = ''; + + // Generate an ID for the skin + $this->id = $this->atts['id'] ?? mt_rand(100, 999); + + // Set the ID + if(!isset($this->atts['id'])) $this->atts['id'] = $this->id; + + // The style + $this->style = $this->skin_options['style'] ?? 'modern'; + if($this->style == 'fluent' and !is_plugin_active('mec-fluent-layouts/mec-fluent-layouts.php')) $this->style = 'modern'; + + // Next/Previous Month + $this->next_previous_button = $this->skin_options['next_previous_button'] ?? true; + + // Display All Events + $this->display_all = in_array($this->style, array('clean', 'modern')) && isset($this->skin_options['display_all']) && $this->skin_options['display_all']; + + // Override the style if the style forced by us in a widget etc + if(isset($this->atts['style']) and trim($this->atts['style']) != '') $this->style = $this->atts['style']; + + // Responsive Style + if(isset($this->skin_options['mobile_clean_style']) && $this->skin_options['mobile_clean_style'] && $this->main->is_mobile()) + { + $this->style = 'clean'; + } + + // HTML class + $this->html_class = ''; + if(isset($this->atts['html-class']) and trim($this->atts['html-class']) != '') $this->html_class = $this->atts['html-class']; + + // Booking Button + $this->booking_button = isset($this->skin_options['booking_button']) ? (int) $this->skin_options['booking_button'] : 0; + + // SED Method + $this->sed_method = $this->get_sed_method(); + + // reason_for_cancellation + $this->reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + + // display_label + $this->display_label = $this->skin_options['display_label'] ?? false; + + // Image popup + $this->image_popup = $this->skin_options['image_popup'] ?? '0'; + + // From Widget + $this->widget = isset($this->atts['widget']) && trim($this->atts['widget']); + + // From Full Calendar + $this->from_full_calendar = (isset($this->skin_options['from_fc']) and trim($this->skin_options['from_fc'])); + + // Display Price + $this->display_price = (isset($this->skin_options['display_price']) and trim($this->skin_options['display_price'])); + + // Detailed Time + $this->display_detailed_time = (isset($this->skin_options['detailed_time']) and trim($this->skin_options['detailed_time'])); + + // Init MEC + $this->args['mec-init'] = true; + $this->args['mec-skin'] = $this->skin; + + // Post Type + $this->args['post_type'] = $this->main->get_main_post_type(); + + // Post Status + $this->args['post_status'] = 'publish'; + + // Keyword Query + $this->args['s'] = $this->keyword_query(); + + // Taxonomy + $this->args['tax_query'] = $this->tax_query(); + + // Meta + $this->args['meta_query'] = $this->meta_query(); + + // Tag + if(apply_filters('mec_taxonomy_tag', '') === 'post_tag') $this->args['tag'] = $this->tag_query(); + + // Author + $this->args['author'] = $this->author_query(); + $this->args['author__not_in'] = $this->author_query_ex(); + + // Pagination Options + $this->paged = get_query_var('paged', 1); + $this->limit = (isset($this->skin_options['limit']) and trim($this->skin_options['limit'])) ? $this->skin_options['limit'] : 12; + + $this->args['posts_per_page'] = $this->limit; + $this->args['paged'] = $this->paged; + + // Sort Options + $this->args['orderby'] = 'mec_start_day_seconds ID'; + $this->args['order'] = 'ASC'; + $this->args['meta_key'] = 'mec_start_day_seconds'; + + // Show Only Expired Events + $this->show_only_expired_events = (isset($this->atts['show_only_past_events']) and trim($this->atts['show_only_past_events'])) ? '1' : '0'; + + // Show Past Events + if($this->show_only_expired_events) $this->atts['show_past_events'] = '1'; + + // Show Past Events + $this->args['mec-past-events'] = $this->atts['show_past_events'] ?? '0'; + + // Activate First Date With Event + $this->activate_first_date = (isset($this->skin_options['activate_first_date']) and $this->skin_options['activate_first_date']); + + // Start Date + list($this->year, $this->month, $this->day) = $this->get_start_date(); + + // Activate Current Day + $this->activate_current_day = (!isset($this->skin_options['activate_current_day']) || $this->skin_options['activate_current_day']); + + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-'.$this->day)); + $this->active_day = $this->year.'-'.$this->month.'-'.current_time('d'); + + if(!$this->activate_current_day and $this->month != current_time('m')) $this->active_day = $this->start_date; + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Show Ongoing Events + $this->show_ongoing_events = (isset($this->atts['show_only_ongoing_events']) and trim($this->atts['show_only_ongoing_events'])) ? '1' : '0'; + if($this->show_ongoing_events) $this->args['mec-show-ongoing-events'] = $this->show_ongoing_events; + + // Include Ongoing Events + $this->include_ongoing_events = (isset($this->atts['show_ongoing_events']) and trim($this->atts['show_ongoing_events'])) ? '1' : '0'; + if($this->include_ongoing_events) $this->args['mec-include-ongoing-events'] = $this->include_ongoing_events; + + // Auto Month Rotation + $this->auto_month_rotation = !isset($this->settings['auto_month_rotation']) || $this->settings['auto_month_rotation']; + } + + /** + * Search and returns the filtered events + * @author Webnus + * @return array of objects + */ + public function search() + { + if($this->show_only_expired_events) + { + $start = date('Y-m-d H:i:s', current_time('timestamp')); + $end = date('Y-m-d', strtotime('first day of this month')); + + $this->weeks = $this->main->split_to_weeks($end, $start); + + $this->week_of_days = []; + foreach($this->weeks as $week_number=>$week) foreach($week as $day) $this->week_of_days[$day] = $week_number; + + $end = $this->main->array_key_first($this->week_of_days); + } + else + { + $start = $this->start_date; + $end = date('Y-m-t', strtotime($this->start_date)); + + $this->weeks = $this->main->split_to_weeks($start, $end); + + $this->week_of_days = []; + foreach($this->weeks as $week_number=>$week) foreach($week as $day) $this->week_of_days[$day] = $week_number; + + $start = $this->main->array_key_first($this->week_of_days); + $end = $this->main->array_key_last($this->week_of_days); + } + + // Date Events + $dates = $this->period($start, $end, true); + + // Limit + $this->args['posts_per_page'] = $this->limit; + + $events = []; + $qs = []; + + foreach($dates as $date=>$IDs) + { + // No Event + if(!is_array($IDs) or !count($IDs)) + { + $events[$date] = []; + continue; + } + + // Include Available Events + $this->args['post__in'] = array_unique($IDs); + + // Count of events per day + $IDs_count = array_count_values($IDs); + + // The Query + $this->args = apply_filters('mec_skin_query_args', $this->args, $this); + + // Query Key + $q_key = base64_encode(json_encode($this->args)); + + // Get From Cache + if(isset($qs[$q_key])) $query = $qs[$q_key]; + // Search & Cache + else + { + $query = new WP_Query($this->args); + $qs[$q_key] = $query; + } + + if($query->have_posts()) + { + if(!isset($events[$date])) $events[$date] = []; + + if($this->activate_first_date and $this->active_day and strtotime($date) >= current_time('timestamp') and date('m', strtotime($date)) == $this->month) + { + $this->active_day = $date; + $this->activate_first_date = false; + } + + // Day Events + $d = []; + + // The Loop + while($query->have_posts()) + { + $query->the_post(); + $ID = get_the_ID(); + + $ID_count = $IDs_count[$ID] ?? 1; + for($i = 1; $i <= $ID_count; $i++) + { + $rendered = $this->render->data($ID); + + $data = new stdClass(); + $data->ID = $ID; + $data->data = $rendered; + + $data->date = array + ( + 'start' => array('date' => $date), + 'end' => array('date' => $this->main->get_end_date($date, $rendered)) + ); + + $d[] = $this->render->after_render($data, $this, $i); + } + } + + usort($d, [$this, 'sort_day_events']); + $events[$date] = $d; + } + + // Restore original Post Data + wp_reset_postdata(); + } + + // Initialize Occurrences' Data + MEC_feature_occurrences::fetch($events); + + return $events; + } + + /** + * Returns start day of skin for filtering events + * @author Webnus + * @return array + */ + public function get_start_date() + { + // Default date + $date = current_time('Y-m-d'); + + if(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_current_month') $date = date('Y-m-d', strtotime('first day of this month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_next_month') $date = date('Y-m-d', strtotime('first day of next month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'start_last_month') $date = date('Y-m-d', strtotime('first day of last month')); + elseif(isset($this->skin_options['start_date_type']) and $this->skin_options['start_date_type'] == 'date') $date = date('Y-m-d', strtotime($this->skin_options['start_date'])); + + // Hide past events + if(isset($this->atts['show_past_events']) and !trim($this->atts['show_past_events'])) + { + $today = current_time('Y-m-d'); + if(strtotime($date) < strtotime($today)) $date = $today; + } + + // Show only expired events + if(isset($this->show_only_expired_events) and $this->show_only_expired_events) + { + $yesterday = date('Y-m-d', strtotime('Yesterday')); + if(strtotime($date) > strtotime($yesterday)) $date = $yesterday; + } + + $time = strtotime($date); + return [date('Y', $time), date('m', $time), date('d', $time)]; + } + + /** + * Load month for AJAX request + * @author Webnus + * @return void + */ + public function load_month() + { + $this->sf = (isset($_REQUEST['sf']) and is_array($_REQUEST['sf'])) ? $this->main->sanitize_deep_array($_REQUEST['sf']) : []; + $apply_sf_date = isset($_REQUEST['apply_sf_date']) ? sanitize_text_field($_REQUEST['apply_sf_date']) : 1; + $atts = $this->sf_apply(((isset($_REQUEST['atts']) and is_array($_REQUEST['atts'])) ? $this->main->sanitize_deep_array($_REQUEST['atts']) : array()), $this->sf, $apply_sf_date); + + $navigator_click = isset($_REQUEST['navigator_click']) && sanitize_text_field($_REQUEST['navigator_click']); + + // Initialize the skin + $this->initialize($atts); + + // Search Events If Not Found In Current Month + $c = 0; + $break = false; + + do + { + if($c > 12) $break = true; + if($c and !$break) + { + if(intval($this->month) == 12) + { + $this->year = intval($this->year)+1; + $this->month = '01'; + } + + $this->month = sprintf("%02d", intval($this->month)+1); + } + else + { + // Start Date + $this->year = isset($_REQUEST['mec_year']) ? sanitize_text_field($_REQUEST['mec_year']) : current_time('Y'); + $this->month = isset($_REQUEST['mec_month']) ? sanitize_text_field($_REQUEST['mec_month']) : current_time('m'); + } + + if($this->show_only_expired_events) + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + $this->active_day = date('Y-m-t', strtotime($this->year.'-'.$this->month.'-01')); + } + else + { + $this->start_date = date('Y-m-d', strtotime($this->year.'-'.$this->month.'-01')); + + $day = current_time('d'); + $this->active_day = $this->year.'-'.$this->month.'-'.$day; + + if(!$this->activate_current_day && !$this->activate_first_date && $this->month != current_time('m')) $this->active_day = ''; + } + + // We will extend the end date in the loop + $this->end_date = $this->start_date; + + // Return the events + $this->atts['return_items'] = true; + + // Fetch the events + $this->fetch(); + + // Break the loop if not result + if($break) break; + if($navigator_click) break; + + // Auto Rotation is Disabled + if(!$this->auto_month_rotation) break; + + $c++; + } + while(!count($this->events)); + + // Return the output + $output = $this->output(); + + echo json_encode($output); + exit; + } + + public function day_label($time) + { + // No Label when all events are set to display + if($this->display_all) return ''; + + $date_suffix = (isset($this->settings['date_suffix']) && $this->settings['date_suffix'] == '0') ? $this->main->date_i18n('jS', $time) : $this->main->date_i18n('j', $time); + + if($this->main->is_day_first()) + { + return '
    '.sprintf(esc_html__('Events for %s %s', 'modern-events-calendar-lite'), ' '.esc_html($date_suffix).'', esc_html($this->main->date_i18n('F', $time))).'
    '; + } + else return '
    '.sprintf(esc_html__('Events for %s', 'modern-events-calendar-lite'), esc_html($this->main->date_i18n('F', $time))).'

    '.esc_html($date_suffix).'

    '; + } +} diff --git a/app/skins/monthly_view/calendar.php b/app/skins/monthly_view/calendar.php new file mode 100755 index 0000000..3e5746a --- /dev/null +++ b/app/skins/monthly_view/calendar.php @@ -0,0 +1,271 @@ +main->get_weekday_abbr_labels(); +echo '
    '.MEC_kses::element(implode('
    ', $headings)).'
    '; + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} + +$events_str = ''; +?> +
    + active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) and count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).''; + do_action('monthly_box_hook', $events[$today]); + echo '
    '; + + $events_str .= '
    '.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date'] ) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date'] ) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumbnail']).'
    '; + $events_str .= MEC_kses::element($this->get_label_captions($event)); + + if($this->display_detailed_time and $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.esc_html($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + $event_color = $this->get_event_color_dot($event); + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).MEC_kses::embed($this->display_custom_data($event)).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= MEC_kses::full(apply_filters('mec_monthly_virtual_badge', '', $event->data->ID)); + $events_str .='

    '; + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.(isset($location['name']) ? esc_html($location['name']) : '').'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::element($this->booking_button($event)); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.apply_filters( 'mec_filter_list_day_value', $list_day, $today, $this ).'
    '; + } + + $days_in_this_week++; + } + + // keep going with days .... + for($list_day = 1; $list_day <= $days_in_month; $list_day++) + { + $time = strtotime($year.'-'.$month.'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) and count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).''; + do_action('monthly_box_hook', $events[$today]); + echo '
    '; + + $events_str .= '
    '.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date'] ) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date'] ) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumbnail']).'
    '; + $events_str .= MEC_kses::element($this->get_label_captions($event)); + + if($this->display_detailed_time and $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.esc_html($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + $event_color = $this->get_event_color_dot($event); + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).MEC_kses::embed($this->display_custom_data($event)).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= MEC_kses::full(apply_filters('mec_monthly_virtual_badge', '', $event->data->ID)); + $events_str .='

    '; + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.(isset($location['name']) ? esc_html($location['name']) : '').'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::full($this->booking_button($event)); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + + $events_str .= '
    '.MEC_kses::element($this->day_label($time)); + $events_str .= '
    '; + $events_str .= '
    '.esc_html__('No Events', 'modern-events-calendar-lite').'
    '; + $events_str .= '
    '; + $events_str .= '
    '; + } + + if($running_day == 6) + { + echo '
    '; + + echo '
    '; + echo MEC_kses::full($events_str); + echo '
    '; + + if((($day_counter+1) != $days_in_month) or (($day_counter+1) == $days_in_month and $days_in_this_week == 7)) + { + echo '
    '; + $events_str = ''; + } + + $running_day = -1; + $days_in_this_week = 0; + } + + $days_in_this_week++; $running_day++; $day_counter++; + } + + // finish the rest of the days in the week + if($days_in_this_week > 1 && $days_in_this_week < 8) + { + for($x = 1; $x <= (8 - $days_in_this_week); $x++) + { + $list_day = $x; + $time = strtotime(($month == 12 ? ($year + 1) : $year).'-'.($month == 12 ? 1 : ($month + 1)).'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) and count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).''; + do_action('monthly_box_hook', $events[$today]); + echo '
    '; + + $events_str .= '
    '.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date'] ) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date'] ) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumbnail']).'
    '; + $events_str .= MEC_kses::element($this->get_label_captions($event)); + + if($this->display_detailed_time and $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.esc_html($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + $event_color = $this->get_event_color_dot($event); + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).MEC_kses::embed($this->display_custom_data($event)).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= MEC_kses::full(apply_filters('mec_monthly_virtual_badge', '', $event->data->ID)); + $events_str .='

    '; + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.(isset($location['name']) ? esc_html($location['name']) : '').'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::full($this->booking_button($event)); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.esc_html($x).'
    '; + } + } + } + ?> +
    +
    + +
    diff --git a/app/skins/monthly_view/calendar_admin.php b/app/skins/monthly_view/calendar_admin.php new file mode 100755 index 0000000..d81e2e9 --- /dev/null +++ b/app/skins/monthly_view/calendar_admin.php @@ -0,0 +1,148 @@ +main->get_weekday_abbr_labels(); +echo '
    '.MEC_kses::full(implode('
    ', $headings)).'
    '; + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +// Single Event Display Method +$target_set = false; +$target_url = 'target="_blank"'; + +$display_label = false; +$reason_for_cancellation = false; + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} +?> +
    + '.($days_in_previous_month - ($running_day-1-$x)).''; + $days_in_this_week++; + } + + // keep going with days .... + for($list_day = 1; $list_day <= $days_in_month; $list_day++) + { + $time = strtotime($year.'-'.$month.'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + $selected_day_date = (str_replace('-', '', $this->active_day) == $day_id) ? 'mec-color' : ''; + + // Print events + if(isset($events[$today]) and count($events[$today])) + { + echo '
    '.apply_filters('mec_filter_list_day_value', $list_day, $today, $this).'
    '; + foreach($events[$today] as $event) + { + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $occurrence = strtotime($today.' '.$start_time); + $event_unique = (isset($event->data->time) ? $event->data->ID.$event->data->time['start_timestamp'] : $event->data->ID); + + $attendees = $this->main->get_event_attendees($event->ID, $occurrence); + $attendees_count = count($attendees); + + echo ''; + + $this->getFactory()->params('footer', function() use($event, $occurrence) + { + ?> + + '; + } + else + { + echo '
    '.apply_filters('mec_filter_list_day_value', $list_day, $today, $this).'
    '; + echo ''; + } + + if($running_day == 6) + { + echo '
    '; + + if((($day_counter+1) != $days_in_month) or (($day_counter+1) == $days_in_month and $days_in_this_week == 7)) + { + echo '
    '; + } + + $running_day = -1; + $days_in_this_week = 0; + } + + $days_in_this_week++; $running_day++; $day_counter++; + } + + // finish the rest of the days in the week + if($days_in_this_week > 1 && $days_in_this_week < 8) + { + for($x = 1; $x <= (8 - $days_in_this_week); $x++) + { + echo '
    '.esc_html($x).'
    '; + } + } + ?> +
    diff --git a/app/skins/monthly_view/calendar_clean.php b/app/skins/monthly_view/calendar_clean.php new file mode 100755 index 0000000..0c04dd0 --- /dev/null +++ b/app/skins/monthly_view/calendar_clean.php @@ -0,0 +1,359 @@ +main->get_weekday_abbr_labels(); +echo '
    '.MEC_kses::element(implode('
    ', $headings)).'
    '; + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; +$styles_str = ''; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} + +$events_str = ''; +if($this->display_all) $events_str .= '

    '.esc_html__('Events', 'modern-events-calendar-lite').'

    '; + +$date_format = get_option('date_format'); +?> +
    + active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + $events_str .= '
    display_all) ? ' style="display: block;"' : '').'>'.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date']) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date']) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + $events_filter = $after_time_filter = ''; + + $start_datetime = isset($event->date['start']) && !empty($event->date['start']) ? $event->date['start'] : []; + $end_datetime = isset($event->date['end']) && !empty($event->date['end']) ? $event->date['end'] : []; + $start_timestamp = $start_datetime['timestamp'] ?? (isset($start_datetime['date']) ? strtotime($start_datetime['date']) : ''); + + $multiple_day_show_method = \MEC\Settings\Settings::getInstance()->get_settings('multiple_day_show_method'); + + if('first_day_listgrid' === $multiple_day_show_method) $date_label = $this->main->date_label( $start_datetime, $end_datetime, $date_format ); + else $date_label = $this->main->date_i18n( $date_format, $start_timestamp ); + + $midnight_event = $this->main->is_midnight_event($event); + + if($midnight_event) $event_date = $this->main->dateify( $event, $date_format ); + else $event_date = $date_label; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumblist']).'
    '; + $events_str .= $this->get_label_captions($event); + + if($this->display_all) $events_str .= '
    '.MEC_kses::element( $event_date ).'
    '; + + if($this->display_detailed_time && $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + if(has_filter('monthly_event_after_time')) $after_time_filter = apply_filters('monthly_event_after_time', $events_str, $event); + + $events_str .= $after_time_filter; + $event_color = $this->get_event_color_dot($event); + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= apply_filters('mec_monthly_virtual_badge', '', $event->data->ID); + $events_str .= '

    '; + + $events_str .= apply_filters('mec_calendar_clean_after_title', '', $event->ID, $event); + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.(isset($location['name']) ? esc_html($location['name']) : '').'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::element($this->booking_button($event)); + $events_str .= MEC_kses::embed($this->display_custom_data($event)); + $events_str .= MEC_kses::element($this->display_cost($event)); + + if(has_filter('monthly_event_right_box')) $events_filter = apply_filters('monthly_event_right_box', $events_str, $event); + + $events_str .= MEC_kses::full($events_filter); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.apply_filters('mec_filter_list_day_value', $list_day, $today, $this).'
    '; + } + + $days_in_this_week++; + } + + // keep going with days .... + for($list_day = 1; $list_day <= $days_in_month; $list_day++) + { + $time = strtotime($year.'-'.$month.'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + $events_str .= '
    display_all) ? ' style="display: block;"' : '').'>'.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date'] ) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date'] ) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + $events_filter = $after_time_filter = ''; + + $start_datetime = isset($event->date['start']) && !empty($event->date['start']) ? $event->date['start'] : []; + $end_datetime = isset($event->date['end']) && !empty($event->date['end']) ? $event->date['end'] : []; + $start_timestamp = $start_datetime['timestamp'] ?? (isset($start_datetime['date']) ? strtotime($start_datetime['date']) : ''); + + $multiple_day_show_method = \MEC\Settings\Settings::getInstance()->get_settings('multiple_day_show_method'); + + if('first_day_listgrid' === $multiple_day_show_method) $date_label = $this->main->date_label( $start_datetime, $end_datetime, $date_format ); + else $date_label = $this->main->date_i18n( $date_format, $start_timestamp ); + + $midnight_event = $this->main->is_midnight_event($event); + + if($midnight_event) $event_date = $this->main->dateify( $event, $date_format ); + else $event_date = $date_label; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumblist']).'
    '; + $events_str .= MEC_kses::element($this->get_label_captions($event)); + + if($this->display_all) $events_str .= '
    '.MEC_kses::element( $event_date ).'
    '; + + if($this->display_detailed_time && $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.esc_html($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + if(has_filter('monthly_event_after_time')) $after_time_filter = apply_filters('monthly_event_after_time', $events_str, $event); + + $events_str .= $after_time_filter; + $event_color = $this->get_event_color_dot($event); + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).MEC_kses::embed($this->display_custom_data($event)).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= apply_filters('mec_monthly_virtual_badge', '', $event->data->ID); + $events_str .='

    '; + + $events_str .= apply_filters('mec_calendar_clean_after_title', '', $event->ID, $event); + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.esc_html((isset($location['name']) ? $location['name'] : '')).'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::element($this->booking_button($event)); + $events_str .= MEC_kses::element($this->display_cost($event)); + + if(has_filter('monthly_event_right_box')) $events_filter = apply_filters('monthly_event_right_box', $events_str, $event); + + $events_str .= MEC_kses::full($events_filter); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + + if(!$this->display_all) + { + $events_str .= '
    display_all) ? ' style="display: block;"' : '').'>'.MEC_kses::element($this->day_label($time)); + $events_str .= '
    '; + $events_str .= '
    '.esc_html__('No Events', 'modern-events-calendar-lite').'
    '; + $events_str .= '
    '; + $events_str .= '
    '; + } + } + + echo ''; + + if($running_day == 6) + { + echo '
    '; + + if((($day_counter+1) != $days_in_month) or (($day_counter+1) == $days_in_month && $days_in_this_week == 7)) + { + echo '
    '; + } + + $running_day = -1; + $days_in_this_week = 0; + } + + $days_in_this_week++; $running_day++; $day_counter++; + } + + // finish the rest of the days in the week + if($days_in_this_week > 1 && $days_in_this_week < 8) + { + for($x = 1; $x <= (8 - $days_in_this_week); $x++) + { + $list_day = $x; + $time = strtotime(($month == 12 ? ($year + 1) : $year).'-'.($month == 12 ? 1 : ($month + 1)).'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + $events_str .= '
    display_all) ? ' style="display: block;"' : '').'>'.MEC_kses::element($this->day_label($time)); + + foreach($events[$today] as $event) + { + $location_id = $this->main->get_master_location_id($event); + $location = ($location_id ? $this->main->get_location_data($location_id) : array()); + + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + $startDate = !empty($event->data->meta['mec_date']['start']['date'] ) ? $event->data->meta['mec_date']['start']['date'] : ''; + $endDate = !empty($event->data->meta['mec_date']['end']['date'] ) ? $event->data->meta['mec_date']['end']['date'] : '' ; + $event_start_date = !empty($event->date['start']['date']) ? $event->date['start']['date'] : ''; + + $events_filter = $after_time_filter = ''; + + $start_datetime = isset($event->date['start']) && !empty($event->date['start']) ? $event->date['start'] : []; + $end_datetime = isset($event->date['end']) && !empty($event->date['end']) ? $event->date['end'] : []; + $start_timestamp = $start_datetime['timestamp'] ?? (isset($start_datetime['date']) ? strtotime($start_datetime['date']) : ''); + + $multiple_day_show_method = \MEC\Settings\Settings::getInstance()->get_settings('multiple_day_show_method'); + + if('first_day_listgrid' === $multiple_day_show_method) $date_label = $this->main->date_label($start_datetime, $end_datetime, $date_format); + else $date_label = $this->main->date_i18n($date_format, $start_timestamp); + + $midnight_event = $this->main->is_midnight_event($event); + + if($midnight_event) $event_date = $this->main->dateify($event, $date_format); + else $event_date = $date_label; + + // MEC Schema + do_action('mec_schema', $event); + + $events_str .= '
    '; + $content_style = !empty($event->data->thumbnails['thumblist']) ? 'width: calc(100% - 85px)' : 'width: 100%'; + $events_str .= '
    '.MEC_kses::element($event->data->thumbnails['thumblist']).'
    '; + $events_str .= MEC_kses::element($this->get_label_captions($event)); + + if($this->display_all) $events_str .= '
    '.MEC_kses::element( $event_date ).'
    '; + + if($this->display_detailed_time && $this->main->is_multipleday_occurrence($event)) $events_str .= '
    '.$this->icons->display('clock-o').' '.MEC_kses::element($this->display_detailed_time($event)).'
    '; + elseif(trim($start_time)) $events_str .= '
    '.$this->icons->display('clock-o').' '.esc_html($start_time.(trim($end_time) ? ' - '.$end_time : '')).'
    '; + + if(has_filter('monthly_event_after_time')) $after_time_filter = apply_filters('monthly_event_after_time', $events_str, $event); + + $events_str .= $after_time_filter; + $event_color = $this->get_event_color_dot($event); + + $events_str .= '

    '.MEC_kses::element($this->display_link($event).$this->main->get_flags($event).$event_color.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation)); + if(has_filter('mec_monthly_virtual_badge')) $events_str .= apply_filters('mec_monthly_virtual_badge', '', $event->data->ID); + $events_str .='

    '; + + $events_str .= apply_filters('mec_calendar_clean_after_title', '', $event->ID, $event); + + if($this->localtime) $events_str .= MEC_kses::full($this->main->module('local-time.type3', array('event' => $event))); + $events_str .= '
    +
    '.esc_html(($location['name'] ?? '')).'
    + '.MEC_kses::element($this->display_organizers($event)).' +
    '; + $events_str .= MEC_kses::element($this->booking_button($event)); + $events_str .= MEC_kses::embed($this->display_custom_data($event)); + $events_str .= MEC_kses::element($this->display_cost($event)); + + if(has_filter('monthly_event_right_box')) $events_filter = apply_filters('monthly_event_right_box', $events_str, $event); + + $events_str .= MEC_kses::full($events_filter); + $events_str .= '
    '; + } + + $events_str .= '
    '; + } + else + { + echo '
    '.esc_html($x).'
    '; + } + } + } + + if(trim($styles_str)) $this->factory->params('footer', ''); + ?> +
    +style == 'classic'): ?> +
    + +
    +events_str = $events_str; +endif; diff --git a/app/skins/monthly_view/calendar_novel.php b/app/skins/monthly_view/calendar_novel.php new file mode 100755 index 0000000..ee53fc4 --- /dev/null +++ b/app/skins/monthly_view/calendar_novel.php @@ -0,0 +1,214 @@ +main->get_weekday_abbr_labels(); +echo '
    '.MEC_kses::element(implode('
    ', $headings)).'
    '; + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +// Single Event Display Method +$target_set = $this->skin_options['sed_method'] ?? false; +$target_url = $target_set === 'new' ? 'target="_blank"' : ''; + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} +?> +
    + active_day) == $day_id) ? ' mec-selected-day' : ''; + $selected_day_date = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-bg-color' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters( 'mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + foreach($events[$today] as $event) + { + $event_color = $this->get_event_color_dot($event, true); + $start_date = (isset($event->date['start']['date']) ? str_replace ( '-', '', $event->date['start']['date'] ) : ''); + $end_date = (isset($event->date['end']['date']) ? str_replace ( '-', '', $event->date['end']['date'] ) : ''); + + // MEC Schema + do_action('mec_schema', $event); + + if($target_set !== 'no') echo ''; + + echo '
    '; + echo '

    '.MEC_kses::element(apply_filters('mec_occurrence_event_title', $event->data->title, $event)).'

    '.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation); + echo MEC_kses::element($this->get_label_captions($event)); + + do_action('mec_shortcode_virtual_badge', $event->data->ID); + + echo MEC_kses::element($this->display_cost($event)); + echo MEC_kses::element($this->display_organizers($event)); + echo MEC_kses::embed($this->display_custom_data($event)); + + echo '
    '; + if($target_set !== 'no') echo '
    '; + } + + echo '
    '; + } + else + { + echo '
    '.($days_in_previous_month - ($running_day-1-$x)).'
    '; + } + + $days_in_this_week++; + } + + // keep going with days .... + for($list_day = 1; $list_day <= $days_in_month; $list_day++) + { + $time = strtotime($year.'-'.$month.'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + $selected_day_date = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-bg-color' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters( 'mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + foreach($events[$today] as $event) + { + $event_color = $this->get_event_color_dot($event, true); + $start_date = (isset($event->date['start']['date']) ? str_replace ( '-', '', $event->date['start']['date'] ) : ''); + $end_date = (isset($event->date['end']['date']) ? str_replace ( '-', '', $event->date['end']['date'] ) : ''); + + // MEC Schema + do_action('mec_schema', $event); + + if($target_set !== 'no') echo ''; + + echo '
    '; + echo '

    '.MEC_kses::element(apply_filters('mec_occurrence_event_title', $event->data->title, $event)).'

    '.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation); + echo MEC_kses::element($this->get_label_captions($event)); + + do_action('mec_shortcode_virtual_badge', $event->data->ID); + + echo MEC_kses::element($this->display_cost($event)); + echo MEC_kses::element($this->display_organizers($event)); + echo MEC_kses::embed($this->display_custom_data($event)); + + echo '
    '; + if($target_set !== 'no') echo '
    '; + } + + echo '
    '; + } + else + { + echo '
    '.MEC_kses::full(apply_filters('mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + echo ''; + } + + if($running_day == 6) + { + echo '
    '; + + if((($day_counter+1) != $days_in_month) or (($day_counter+1) == $days_in_month && $days_in_this_week == 7)) + { + echo '
    '; + } + + $running_day = -1; + $days_in_this_week = 0; + } + + $days_in_this_week++; $running_day++; $day_counter++; + } + + // finish the rest of the days in the week + if($days_in_this_week > 1 && $days_in_this_week < 8) + { + for($x = 1; $x <= (8 - $days_in_this_week); $x++) + { + $list_day = $x; + $time = strtotime(($month == 12 ? ($year + 1) : $year).'-'.($month == 12 ? 1 : ($month + 1)).'-'.$list_day); + + $today = date('Y-m-d', $time); + $day_id = date('Ymd', $time); + $selected_day = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-selected-day' : ''; + $selected_day_date = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-bg-color' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.MEC_kses::full(apply_filters( 'mec_filter_list_day_value', $list_day, $today, $this)).'
    '; + foreach($events[$today] as $event) + { + $event_color = $this->get_event_color_dot($event, true); + $start_date = (isset($event->date['start']['date']) ? str_replace ( '-', '', $event->date['start']['date'] ) : ''); + $end_date = (isset($event->date['end']['date']) ? str_replace ( '-', '', $event->date['end']['date'] ) : ''); + + // MEC Schema + do_action('mec_schema', $event); + + if($target_set !== 'no') echo ''; + + echo '
    '; + echo '

    '.MEC_kses::element(apply_filters('mec_occurrence_event_title', $event->data->title, $event)).'

    '.$this->main->get_normal_labels($event, $display_label).$this->main->display_cancellation_reason($event, $reason_for_cancellation); + echo MEC_kses::element($this->get_label_captions($event)); + + do_action('mec_shortcode_virtual_badge', $event->data->ID); + + echo MEC_kses::element($this->display_cost($event)); + echo MEC_kses::element($this->display_organizers($event)); + echo MEC_kses::embed($this->display_custom_data($event)); + + echo '
    '; + if($target_set !== 'no') echo '
    '; + } + + echo '
    '; + } + else + { + echo '
    '.esc_html($x).'
    '; + } + } + } + ?> +
    diff --git a/app/skins/monthly_view/calendar_simple.php b/app/skins/monthly_view/calendar_simple.php new file mode 100755 index 0000000..ef9f088 --- /dev/null +++ b/app/skins/monthly_view/calendar_simple.php @@ -0,0 +1,296 @@ +main->get_weekday_abbr_labels(); +echo '
    '.implode('
    ', $headings).'
    '; + +// Start day of week +$week_start = $this->main->get_first_day_of_week(); + +// Single Event Display Method +$sed_method = $this->skin_options['sed_method'] ?? false; +$target_url = ($sed_method === 'new') ? 'target="_blank"' : ''; + +$this->localtime = $this->skin_options['include_local_time'] ?? false; +$display_label = $this->skin_options['display_label'] ?? false; +$reason_for_cancellation = $this->skin_options['reason_for_cancellation'] ?? false; + +// days and weeks vars +$running_day = date('w', mktime(0, 0, 0, $month, 1, $year)); +$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year)); +$days_in_previous_month = $this->main->get_days_in_previous_month($month, $year); + +$days_in_this_week = 1; +$day_counter = 0; + +if($week_start == 1) // Monday +{ + if($running_day != 0) $running_day = $running_day - 1; + else $running_day = 6; +} +elseif($week_start == 6) // Saturday +{ + if($running_day != 6) $running_day = $running_day + 1; + else $running_day = 0; +} +elseif($week_start == 5) // Friday +{ + if($running_day < 4) $running_day = $running_day + 2; + elseif($running_day == 5) $running_day = 0; + elseif($running_day == 6) $running_day = 1; +} +?> +
    + active_day) == $day_id) ? ' mec-selected-day' : ''; + $selected_day_date = (str_replace('-', '', $this->active_day) == $day_id) ? ' mec-bg-color' : ''; + + // Print events + if(isset($events[$today]) && count($events[$today])) + { + echo '
    '.apply_filters('mec_filter_list_day_value', $list_day, $today, $this).'
    '; + foreach($events[$today] as $event) + { + $start_time = (isset($event->data->time) ? $event->data->time['start'] : ''); + $end_time = (isset($event->data->time) ? $event->data->time['end'] : ''); + + $event_unique = (isset($event->data->time) ? $event->data->ID.$event->data->time['start_timestamp'] : $event->data->ID); + + // Event Content + if(!$this->cache->has($event->data->ID.'_content')) + { + if(get_post_meta($event->data->ID, '_elementor_edit_mode', true) && class_exists('\Elementor\Plugin')) $event_content = get_the_excerpt($event->data->ID); + else $event_content = isset($event->data->content) && trim($event->data->content) != '' ? mb_substr(strip_tags($event->data->content, ' + + +
    +

    PHP ICS Parser example

    +
      +
    • + eventCount ?> + The number of events +
    • +
    • + freeBusyCount ?> + The number of free/busy time slots +
    • +
    • + todoCount ?> + The number of todos +
    • +
    • + alarmCount ?> + The number of alarms +
    • +
    + + true, + 'range' => true, + 'all' => true, + ); + ?> + + eventsFromInterval('1 week'); + + if ($events) { + echo '

    Events in the next 7 days:

    '; + } + + $count = 1; + ?> +
    + +
    +
    +
    +

    iCalDateToDateTime($event->dtstart_array[3]); + echo $event->summary . ' (' . $dtstart->format('d-m-Y H:i') . ')'; + ?>

    + printData() ?> +
    +
    +
    + 1 && $count % 3 === 0) { + echo '
    '; + } + + $count++; + ?> + +
    + + + eventsFromRange('2017-03-01 12:00:00', '2017-04-31 17:00:00'); + + if ($events) { + echo '

    Events March through April:

    '; + } + + $count = 1; + ?> +
    + +
    +
    +
    +

    iCalDateToDateTime($event->dtstart_array[3]); + echo $event->summary . ' (' . $dtstart->format('d-m-Y H:i') . ')'; + ?>

    + printData() ?> +
    +
    +
    + 1 && $count % 3 === 0) { + echo '
    '; + } + + $count++; + ?> + +
    + + + sortEventsWithOrder($ical->events()); + + if ($events) { + echo '

    All Events:

    '; + } + ?> +
    + +
    +
    +
    +

    iCalDateToDateTime($event->dtstart_array[3]); + echo $event->summary . ' (' . $dtstart->format('d-m-Y H:i') . ')'; + ?>

    + printData() ?> +
    +
    +
    + 1 && $count % 3 === 0) { + echo '
    '; + } + + $count++; + ?> + +
    + +
    + + diff --git a/app/vendor/johngrogg/ics-parser/phpunit.xml b/app/vendor/johngrogg/ics-parser/phpunit.xml new file mode 100755 index 0000000..640908b --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/phpunit.xml @@ -0,0 +1,7 @@ + + + + tests + + + diff --git a/app/vendor/johngrogg/ics-parser/rector.php b/app/vendor/johngrogg/ics-parser/rector.php new file mode 100755 index 0000000..d63ba56 --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/rector.php @@ -0,0 +1,83 @@ +parameters(); + + $parameters->set(Option::IMPORT_SHORT_CLASSES, false); + + $parameters->set(Option::PHP_VERSION_FEATURES, '5.6'); + + $parameters->set(Option::AUTOLOAD_PATHS, array(__DIR__ . '/vendor/autoload.php')); + + $parameters->set(Option::EXCLUDE_RECTORS, array( + Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector::class, + Rector\CodeQuality\Rector\Concat\JoinStringConcatRector::class, + Rector\CodeQuality\Rector\FuncCall\ChangeArrayPushToArrayAssignRector::class, + Rector\CodeQuality\Rector\FuncCall\CompactToVariablesRector::class, + Rector\CodeQuality\Rector\FuncCall\IntvalToTypeCastRector::class, + Rector\CodeQuality\Rector\Identical\BooleanNotIdenticalToNotIdenticalRector::class, + Rector\CodeQuality\Rector\Identical\SimplifyBoolIdenticalTrueRector::class, + Rector\CodeQuality\Rector\If_\CombineIfRector::class, + Rector\CodeQuality\Rector\If_\ExplicitBoolCompareRector::class, + Rector\CodeQuality\Rector\If_\SimplifyIfElseToTernaryRector::class, + Rector\CodeQuality\Rector\If_\SimplifyIfReturnBoolRector::class, + Rector\CodeQuality\Rector\Isset_\IssetOnPropertyObjectToPropertyExistsRector::class, + Rector\CodeQuality\Rector\Return_\SimplifyUselessVariableRector::class, + Rector\CodingStyle\Rector\ClassConst\VarConstantCommentRector::class, + Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector::class, + Rector\CodingStyle\Rector\FuncCall\ConsistentPregDelimiterRector::class, + Rector\CodingStyle\Rector\Function_\CamelCaseFunctionNamingToUnderscoreRector::class, + Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector::class, + Rector\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector::class, + Rector\DeadCode\Rector\ClassConst\RemoveUnusedClassConstantRector::class, + Rector\DeadCode\Rector\ClassMethod\RemoveUnusedParameterRector::class, + Rector\Naming\Rector\Property\UnderscoreToCamelCasePropertyNameRector::class, + Rector\Naming\Rector\Variable\UnderscoreToCamelCaseVariableNameRector::class, + Rector\Php56\Rector\FuncCall\PowToExpRector::class, + Rector\Php70\Rector\FuncCall\NonVariableToVariableOnFunctionCallRector::class, + Rector\Php70\Rector\MethodCall\ThisCallOnStaticMethodToStaticCallRector::class, + Rector\Php70\Rector\StaticCall\StaticCallOnNonStaticToInstanceCallRector::class, + Rector\Php71\Rector\FuncCall\CountOnNullRector::class, + Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector::class, + Rector\TypeDeclaration\Rector\FunctionLike\ParamTypeDeclarationRector::class, + // PHP 5.6 incompatible + Rector\CodeQuality\Rector\Ternary\ArrayKeyExistsTernaryThenValueToCoalescingRector::class, // PHP 7 + Rector\Php70\Rector\If_\IfToSpaceshipRector::class, + Rector\Php70\Rector\Ternary\TernaryToSpaceshipRector::class, + Rector\Php71\Rector\BinaryOp\IsIterableRector::class, + Rector\Php71\Rector\List_\ListToArrayDestructRector::class, + Rector\Php71\Rector\TryCatch\MultiExceptionCatchRector::class, + Rector\Php73\Rector\FuncCall\ArrayKeyFirstLastRector::class, + Rector\Php73\Rector\BinaryOp\IsCountableRector::class, + )); + + $parameters->set(Option::SETS, array( + SetList::CODE_QUALITY, + SetList::CODING_STYLE, + SetList::DEAD_CODE, + SetList::LARAVEL_50, + SetList::LARAVEL_51, + SetList::LARAVEL_52, + SetList::LARAVEL_53, + SetList::LARAVEL_54, + SetList::PHP_56, + SetList::PHP_70, + SetList::PHP_71, + SetList::PHP_72, + SetList::PHP_73, + SetList::PHP_74, + )); + + $services = $containerConfigurator->services(); + + $services->set(TernaryToElvisRector::class); +}; diff --git a/app/vendor/johngrogg/ics-parser/src/ICal/Event.php b/app/vendor/johngrogg/ics-parser/src/ICal/Event.php new file mode 100755 index 0000000..2262819 --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/src/ICal/Event.php @@ -0,0 +1,204 @@ +%s: %s

    '; + + /** + * https://www.kanzaki.com/docs/ical/summary.html + * + * @var $summary + */ + public $summary; + + /** + * https://www.kanzaki.com/docs/ical/dtstart.html + * + * @var $dtstart + */ + public $dtstart; + + /** + * https://www.kanzaki.com/docs/ical/dtend.html + * + * @var $dtend + */ + public $dtend; + + /** + * https://www.kanzaki.com/docs/ical/duration.html + * + * @var $duration + */ + public $duration; + + /** + * https://www.kanzaki.com/docs/ical/dtstamp.html + * + * @var $dtstamp + */ + public $dtstamp; + + /** + * https://www.kanzaki.com/docs/ical/uid.html + * + * @var $uid + */ + public $uid; + + /** + * https://www.kanzaki.com/docs/ical/created.html + * + * @var $created + */ + public $created; + + /** + * https://www.kanzaki.com/docs/ical/lastModified.html + * + * @var $lastmodified + */ + public $lastmodified; + + /** + * https://www.kanzaki.com/docs/ical/description.html + * + * @var $description + */ + public $description; + + /** + * https://www.kanzaki.com/docs/ical/location.html + * + * @var $location + */ + public $location; + + /** + * https://www.kanzaki.com/docs/ical/sequence.html + * + * @var $sequence + */ + public $sequence; + + /** + * https://www.kanzaki.com/docs/ical/status.html + * + * @var $status + */ + public $status; + + /** + * https://www.kanzaki.com/docs/ical/transp.html + * + * @var $transp + */ + public $transp; + + /** + * https://www.kanzaki.com/docs/ical/organizer.html + * + * @var $organizer + */ + public $organizer; + + /** + * https://www.kanzaki.com/docs/ical/attendee.html + * + * @var $attendee + */ + public $attendee; + + /** + * Creates the Event object + * + * @param array $data + * @return void + */ + public function __construct(array $data = array()) + { + foreach ($data as $key => $value) { + $variable = self::snakeCase($key); + $this->{$variable} = self::prepareData($value); + } + } + + /** + * Prepares the data for output + * + * @param mixed $value + * @return mixed + */ + protected function prepareData($value) + { + if (is_string($value)) { + return stripslashes(trim(str_replace('\n', "\n", $value))); + } elseif (is_array($value)) { + return array_map('self::prepareData', $value); + } + + return $value; + } + + /** + * Returns Event data excluding anything blank + * within an HTML template + * + * @param string $html HTML template to use + * @return string + */ + public function printData($html = self::HTML_TEMPLATE) + { + $data = array( + 'SUMMARY' => $this->summary, + 'DTSTART' => $this->dtstart, + 'DTEND' => $this->dtend, + 'DTSTART_TZ' => $this->dtstart_tz, + 'DTEND_TZ' => $this->dtend_tz, + 'DURATION' => $this->duration, + 'DTSTAMP' => $this->dtstamp, + 'UID' => $this->uid, + 'CREATED' => $this->created, + 'LAST-MODIFIED' => $this->lastmodified, + 'DESCRIPTION' => $this->description, + 'LOCATION' => $this->location, + 'SEQUENCE' => $this->sequence, + 'STATUS' => $this->status, + 'TRANSP' => $this->transp, + 'ORGANISER' => $this->organizer, + 'ATTENDEE(S)' => $this->attendee, + ); + + // Remove any blank values + $data = array_filter($data); + + $output = ''; + + foreach ($data as $key => $value) { + $output .= sprintf($html, $key, $value); + } + + return $output; + } + + /** + * Converts the given input to snake_case + * + * @param string $input + * @param string $glue + * @param string $separator + * @return string + */ + protected static function snakeCase($input, $glue = '_', $separator = '-') + { + $input = preg_split('/(?<=[a-z])(?=[A-Z])/x', $input); + $input = implode($glue, $input); + $input = str_replace($separator, $glue, $input); + + return strtolower($input); + } +} diff --git a/app/vendor/johngrogg/ics-parser/src/ICal/ICal.php b/app/vendor/johngrogg/ics-parser/src/ICal/ICal.php new file mode 100755 index 0000000..53d217c --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/src/ICal/ICal.php @@ -0,0 +1,2633 @@ + + * @license https://opensource.org/licenses/mit-license.php MIT License + * @version 2.2.2 + */ + +namespace ICal; + +class ICal +{ + // phpcs:disable Generic.Arrays.DisallowLongArraySyntax + + const DATE_TIME_FORMAT = 'Ymd\THis'; + const DATE_TIME_FORMAT_PRETTY = 'F Y H:i:s'; + const ICAL_DATE_TIME_TEMPLATE = 'TZID=%s:'; + const ISO_8601_WEEK_START = 'MO'; + const RECURRENCE_EVENT = 'Generated recurrence event'; + const SECONDS_IN_A_WEEK = 604800; + const TIME_FORMAT = 'His'; + const TIME_ZONE_UTC = 'UTC'; + const UNIX_FORMAT = 'U'; + const UNIX_MIN_YEAR = 1970; + + /** + * Tracks the number of alarms in the current iCal feed + * + * @var integer + */ + public $alarmCount = 0; + + /** + * Tracks the number of events in the current iCal feed + * + * @var integer + */ + public $eventCount = 0; + + /** + * Tracks the free/busy count in the current iCal feed + * + * @var integer + */ + public $freeBusyCount = 0; + + /** + * Tracks the number of todos in the current iCal feed + * + * @var integer + */ + public $todoCount = 0; + + /** + * The value in years to use for indefinite, recurring events + * + * @var integer + */ + public $defaultSpan = 2; + + /** + * Enables customisation of the default time zone + * + * @var string + */ + public $defaultTimeZone; + + /** + * The two letter representation of the first day of the week + * + * @var string + */ + public $defaultWeekStart = self::ISO_8601_WEEK_START; + + /** + * Toggles whether to skip the parsing of recurrence rules + * + * @var boolean + */ + public $skipRecurrence = false; + + /** + * Toggles whether to disable all character replacement. + * + * @var boolean + */ + public $disableCharacterReplacement = false; + + /** + * With this being non-null the parser will ignore all events more than roughly this many days after now. + * + * @var integer + */ + public $filterDaysBefore; + + /** + * With this being non-null the parser will ignore all events more than roughly this many days before now. + * + * @var integer + */ + public $filterDaysAfter; + + /** + * The parsed calendar + * + * @var array + */ + public $cal = array(); + + /** + * Tracks the VFREEBUSY component + * + * @var integer + */ + protected $freeBusyIndex = 0; + + /** + * Variable to track the previous keyword + * + * @var string + */ + protected $lastKeyword; + + /** + * Cache valid IANA time zone IDs to avoid unnecessary lookups + * + * @var array + */ + protected $validIanaTimeZones = array(); + + /** + * Event recurrence instances that have been altered + * + * @var array + */ + protected $alteredRecurrenceInstances = array(); + + /** + * An associative array containing weekday conversion data + * + * The order of the days in the array follow the ISO-8601 specification of a week. + * + * @var array + */ + protected $weekdays = array( + 'MO' => 'monday', + 'TU' => 'tuesday', + 'WE' => 'wednesday', + 'TH' => 'thursday', + 'FR' => 'friday', + 'SA' => 'saturday', + 'SU' => 'sunday', + ); + + /** + * An associative array containing frequency conversion terms + * + * @var array + */ + protected $frequencyConversion = array( + 'DAILY' => 'day', + 'WEEKLY' => 'week', + 'MONTHLY' => 'month', + 'YEARLY' => 'year', + ); + + /** + * Holds the username and password for HTTP basic authentication + * + * @var array + */ + protected $httpBasicAuth = array(); + + /** + * Holds the custom User Agent string header + * + * @var string + */ + protected $httpUserAgent; + + /** + * Holds the custom Accept Language string header + * + * @var string + */ + protected $httpAcceptLanguage; + + /** + * Define which variables can be configured + * + * @var array + */ + private static $configurableOptions = array( + 'defaultSpan', + 'defaultTimeZone', + 'defaultWeekStart', + 'disableCharacterReplacement', + 'filterDaysAfter', + 'filterDaysBefore', + 'skipRecurrence', + ); + + /** + * CLDR time zones mapped to IANA time zones. + * + * @var array + */ + private static $cldrTimeZonesMap = array( + '(UTC-12:00) International Date Line West' => 'Etc/GMT+12', + '(UTC-11:00) Coordinated Universal Time-11' => 'Etc/GMT+11', + '(UTC-10:00) Hawaii' => 'Pacific/Honolulu', + '(UTC-09:00) Alaska' => 'America/Anchorage', + '(UTC-08:00) Pacific Time (US & Canada)' => 'America/Los_Angeles', + '(UTC-07:00) Arizona' => 'America/Phoenix', + '(UTC-07:00) Chihuahua, La Paz, Mazatlan' => 'America/Chihuahua', + '(UTC-07:00) Mountain Time (US & Canada)' => 'America/Denver', + '(UTC-06:00) Central America' => 'America/Guatemala', + '(UTC-06:00) Central Time (US & Canada)' => 'America/Chicago', + '(UTC-06:00) Guadalajara, Mexico City, Monterrey' => 'America/Mexico_City', + '(UTC-06:00) Saskatchewan' => 'America/Regina', + '(UTC-05:00) Bogota, Lima, Quito, Rio Branco' => 'America/Bogota', + '(UTC-05:00) Chetumal' => 'America/Cancun', + '(UTC-05:00) Eastern Time (US & Canada)' => 'America/New_York', + '(UTC-05:00) Indiana (East)' => 'America/Indianapolis', + '(UTC-04:00) Asuncion' => 'America/Asuncion', + '(UTC-04:00) Atlantic Time (Canada)' => 'America/Halifax', + '(UTC-04:00) Caracas' => 'America/Caracas', + '(UTC-04:00) Cuiaba' => 'America/Cuiaba', + '(UTC-04:00) Georgetown, La Paz, Manaus, San Juan' => 'America/La_Paz', + '(UTC-04:00) Santiago' => 'America/Santiago', + '(UTC-03:30) Newfoundland' => 'America/St_Johns', + '(UTC-03:00) Brasilia' => 'America/Sao_Paulo', + '(UTC-03:00) Cayenne, Fortaleza' => 'America/Cayenne', + '(UTC-03:00) City of Buenos Aires' => 'America/Buenos_Aires', + '(UTC-03:00) Greenland' => 'America/Godthab', + '(UTC-03:00) Montevideo' => 'America/Montevideo', + '(UTC-03:00) Salvador' => 'America/Bahia', + '(UTC-02:00) Coordinated Universal Time-02' => 'Etc/GMT+2', + '(UTC-01:00) Azores' => 'Atlantic/Azores', + '(UTC-01:00) Cabo Verde Is.' => 'Atlantic/Cape_Verde', + '(UTC) Coordinated Universal Time' => 'Etc/GMT', + '(UTC+00:00) Casablanca' => 'Africa/Casablanca', + '(UTC+00:00) Dublin, Edinburgh, Lisbon, London' => 'Europe/London', + '(UTC+00:00) Monrovia, Reykjavik' => 'Atlantic/Reykjavik', + '(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', + '(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague' => 'Europe/Budapest', + '(UTC+01:00) Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', + '(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb' => 'Europe/Warsaw', + '(UTC+01:00) West Central Africa' => 'Africa/Lagos', + '(UTC+02:00) Amman' => 'Asia/Amman', + '(UTC+02:00) Athens, Bucharest' => 'Europe/Bucharest', + '(UTC+02:00) Beirut' => 'Asia/Beirut', + '(UTC+02:00) Cairo' => 'Africa/Cairo', + '(UTC+02:00) Chisinau' => 'Europe/Chisinau', + '(UTC+02:00) Damascus' => 'Asia/Damascus', + '(UTC+02:00) Harare, Pretoria' => 'Africa/Johannesburg', + '(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius' => 'Europe/Kiev', + '(UTC+02:00) Jerusalem' => 'Asia/Jerusalem', + '(UTC+02:00) Kaliningrad' => 'Europe/Kaliningrad', + '(UTC+02:00) Tripoli' => 'Africa/Tripoli', + '(UTC+02:00) Windhoek' => 'Africa/Windhoek', + '(UTC+03:00) Baghdad' => 'Asia/Baghdad', + '(UTC+03:00) Istanbul' => 'Europe/Istanbul', + '(UTC+03:00) Kuwait, Riyadh' => 'Asia/Riyadh', + '(UTC+03:00) Minsk' => 'Europe/Minsk', + '(UTC+03:00) Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', + '(UTC+03:00) Nairobi' => 'Africa/Nairobi', + '(UTC+03:30) Tehran' => 'Asia/Tehran', + '(UTC+04:00) Abu Dhabi, Muscat' => 'Asia/Dubai', + '(UTC+04:00) Baku' => 'Asia/Baku', + '(UTC+04:00) Izhevsk, Samara' => 'Europe/Samara', + '(UTC+04:00) Port Louis' => 'Indian/Mauritius', + '(UTC+04:00) Tbilisi' => 'Asia/Tbilisi', + '(UTC+04:00) Yerevan' => 'Asia/Yerevan', + '(UTC+04:30) Kabul' => 'Asia/Kabul', + '(UTC+05:00) Ashgabat, Tashkent' => 'Asia/Tashkent', + '(UTC+05:00) Ekaterinburg' => 'Asia/Yekaterinburg', + '(UTC+05:00) Islamabad, Karachi' => 'Asia/Karachi', + '(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi' => 'Asia/Calcutta', + '(UTC+05:30) Sri Jayawardenepura' => 'Asia/Colombo', + '(UTC+05:45) Kathmandu' => 'Asia/Katmandu', + '(UTC+06:00) Astana' => 'Asia/Almaty', + '(UTC+06:00) Dhaka' => 'Asia/Dhaka', + '(UTC+06:30) Yangon (Rangoon)' => 'Asia/Rangoon', + '(UTC+07:00) Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', + '(UTC+07:00) Krasnoyarsk' => 'Asia/Krasnoyarsk', + '(UTC+07:00) Novosibirsk' => 'Asia/Novosibirsk', + '(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi' => 'Asia/Shanghai', + '(UTC+08:00) Irkutsk' => 'Asia/Irkutsk', + '(UTC+08:00) Kuala Lumpur, Singapore' => 'Asia/Singapore', + '(UTC+08:00) Perth' => 'Australia/Perth', + '(UTC+08:00) Taipei' => 'Asia/Taipei', + '(UTC+08:00) Ulaanbaatar' => 'Asia/Ulaanbaatar', + '(UTC+09:00) Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', + '(UTC+09:00) Pyongyang' => 'Asia/Pyongyang', + '(UTC+09:00) Seoul' => 'Asia/Seoul', + '(UTC+09:00) Yakutsk' => 'Asia/Yakutsk', + '(UTC+09:30) Adelaide' => 'Australia/Adelaide', + '(UTC+09:30) Darwin' => 'Australia/Darwin', + '(UTC+10:00) Brisbane' => 'Australia/Brisbane', + '(UTC+10:00) Canberra, Melbourne, Sydney' => 'Australia/Sydney', + '(UTC+10:00) Guam, Port Moresby' => 'Pacific/Port_Moresby', + '(UTC+10:00) Hobart' => 'Australia/Hobart', + '(UTC+10:00) Vladivostok' => 'Asia/Vladivostok', + '(UTC+11:00) Chokurdakh' => 'Asia/Srednekolymsk', + '(UTC+11:00) Magadan' => 'Asia/Magadan', + '(UTC+11:00) Solomon Is., New Caledonia' => 'Pacific/Guadalcanal', + '(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky' => 'Asia/Kamchatka', + '(UTC+12:00) Auckland, Wellington' => 'Pacific/Auckland', + '(UTC+12:00) Coordinated Universal Time+12' => 'Etc/GMT-12', + '(UTC+12:00) Fiji' => 'Pacific/Fiji', + "(UTC+13:00) Nuku'alofa" => 'Pacific/Tongatapu', + '(UTC+13:00) Samoa' => 'Pacific/Apia', + '(UTC+14:00) Kiritimati Island' => 'Pacific/Kiritimati', + ); + + /** + * Maps Windows (non-CLDR) time zone ID to IANA ID. This is pragmatic but not 100% precise as one Windows zone ID + * maps to multiple IANA IDs (one for each territory). For all practical purposes this should be good enough, though. + * + * Source: http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml + * + * @var array + */ + private static $windowsTimeZonesMap = array( + 'AUS Central Standard Time' => 'Australia/Darwin', + 'AUS Eastern Standard Time' => 'Australia/Sydney', + 'Afghanistan Standard Time' => 'Asia/Kabul', + 'Alaskan Standard Time' => 'America/Anchorage', + 'Aleutian Standard Time' => 'America/Adak', + 'Altai Standard Time' => 'Asia/Barnaul', + 'Arab Standard Time' => 'Asia/Riyadh', + 'Arabian Standard Time' => 'Asia/Dubai', + 'Arabic Standard Time' => 'Asia/Baghdad', + 'Argentina Standard Time' => 'America/Buenos_Aires', + 'Astrakhan Standard Time' => 'Europe/Astrakhan', + 'Atlantic Standard Time' => 'America/Halifax', + 'Aus Central W. Standard Time' => 'Australia/Eucla', + 'Azerbaijan Standard Time' => 'Asia/Baku', + 'Azores Standard Time' => 'Atlantic/Azores', + 'Bahia Standard Time' => 'America/Bahia', + 'Bangladesh Standard Time' => 'Asia/Dhaka', + 'Belarus Standard Time' => 'Europe/Minsk', + 'Bougainville Standard Time' => 'Pacific/Bougainville', + 'Canada Central Standard Time' => 'America/Regina', + 'Cape Verde Standard Time' => 'Atlantic/Cape_Verde', + 'Caucasus Standard Time' => 'Asia/Yerevan', + 'Cen. Australia Standard Time' => 'Australia/Adelaide', + 'Central America Standard Time' => 'America/Guatemala', + 'Central Asia Standard Time' => 'Asia/Almaty', + 'Central Brazilian Standard Time' => 'America/Cuiaba', + 'Central Europe Standard Time' => 'Europe/Budapest', + 'Central European Standard Time' => 'Europe/Warsaw', + 'Central Pacific Standard Time' => 'Pacific/Guadalcanal', + 'Central Standard Time (Mexico)' => 'America/Mexico_City', + 'Central Standard Time' => 'America/Chicago', + 'Chatham Islands Standard Time' => 'Pacific/Chatham', + 'China Standard Time' => 'Asia/Shanghai', + 'Cuba Standard Time' => 'America/Havana', + 'Dateline Standard Time' => 'Etc/GMT+12', + 'E. Africa Standard Time' => 'Africa/Nairobi', + 'E. Australia Standard Time' => 'Australia/Brisbane', + 'E. Europe Standard Time' => 'Europe/Chisinau', + 'E. South America Standard Time' => 'America/Sao_Paulo', + 'Easter Island Standard Time' => 'Pacific/Easter', + 'Eastern Standard Time (Mexico)' => 'America/Cancun', + 'Eastern Standard Time' => 'America/New_York', + 'Egypt Standard Time' => 'Africa/Cairo', + 'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg', + 'FLE Standard Time' => 'Europe/Kiev', + 'Fiji Standard Time' => 'Pacific/Fiji', + 'GMT Standard Time' => 'Europe/London', + 'GTB Standard Time' => 'Europe/Bucharest', + 'Georgian Standard Time' => 'Asia/Tbilisi', + 'Greenland Standard Time' => 'America/Godthab', + 'Greenwich Standard Time' => 'Atlantic/Reykjavik', + 'Haiti Standard Time' => 'America/Port-au-Prince', + 'Hawaiian Standard Time' => 'Pacific/Honolulu', + 'India Standard Time' => 'Asia/Calcutta', + 'Iran Standard Time' => 'Asia/Tehran', + 'Israel Standard Time' => 'Asia/Jerusalem', + 'Jordan Standard Time' => 'Asia/Amman', + 'Kaliningrad Standard Time' => 'Europe/Kaliningrad', + 'Korea Standard Time' => 'Asia/Seoul', + 'Libya Standard Time' => 'Africa/Tripoli', + 'Line Islands Standard Time' => 'Pacific/Kiritimati', + 'Lord Howe Standard Time' => 'Australia/Lord_Howe', + 'Magadan Standard Time' => 'Asia/Magadan', + 'Magallanes Standard Time' => 'America/Punta_Arenas', + 'Marquesas Standard Time' => 'Pacific/Marquesas', + 'Mauritius Standard Time' => 'Indian/Mauritius', + 'Middle East Standard Time' => 'Asia/Beirut', + 'Montevideo Standard Time' => 'America/Montevideo', + 'Morocco Standard Time' => 'Africa/Casablanca', + 'Mountain Standard Time (Mexico)' => 'America/Chihuahua', + 'Mountain Standard Time' => 'America/Denver', + 'Myanmar Standard Time' => 'Asia/Rangoon', + 'N. Central Asia Standard Time' => 'Asia/Novosibirsk', + 'Namibia Standard Time' => 'Africa/Windhoek', + 'Nepal Standard Time' => 'Asia/Katmandu', + 'New Zealand Standard Time' => 'Pacific/Auckland', + 'Newfoundland Standard Time' => 'America/St_Johns', + 'Norfolk Standard Time' => 'Pacific/Norfolk', + 'North Asia East Standard Time' => 'Asia/Irkutsk', + 'North Asia Standard Time' => 'Asia/Krasnoyarsk', + 'North Korea Standard Time' => 'Asia/Pyongyang', + 'Omsk Standard Time' => 'Asia/Omsk', + 'Pacific SA Standard Time' => 'America/Santiago', + 'Pacific Standard Time (Mexico)' => 'America/Tijuana', + 'Pacific Standard Time' => 'America/Los_Angeles', + 'Pakistan Standard Time' => 'Asia/Karachi', + 'Paraguay Standard Time' => 'America/Asuncion', + 'Romance Standard Time' => 'Europe/Paris', + 'Russia Time Zone 10' => 'Asia/Srednekolymsk', + 'Russia Time Zone 11' => 'Asia/Kamchatka', + 'Russia Time Zone 3' => 'Europe/Samara', + 'Russian Standard Time' => 'Europe/Moscow', + 'SA Eastern Standard Time' => 'America/Cayenne', + 'SA Pacific Standard Time' => 'America/Bogota', + 'SA Western Standard Time' => 'America/La_Paz', + 'SE Asia Standard Time' => 'Asia/Bangkok', + 'Saint Pierre Standard Time' => 'America/Miquelon', + 'Sakhalin Standard Time' => 'Asia/Sakhalin', + 'Samoa Standard Time' => 'Pacific/Apia', + 'Sao Tome Standard Time' => 'Africa/Sao_Tome', + 'Saratov Standard Time' => 'Europe/Saratov', + 'Singapore Standard Time' => 'Asia/Singapore', + 'South Africa Standard Time' => 'Africa/Johannesburg', + 'Sri Lanka Standard Time' => 'Asia/Colombo', + 'Sudan Standard Time' => 'Africa/Tripoli', + 'Syria Standard Time' => 'Asia/Damascus', + 'Taipei Standard Time' => 'Asia/Taipei', + 'Tasmania Standard Time' => 'Australia/Hobart', + 'Tocantins Standard Time' => 'America/Araguaina', + 'Tokyo Standard Time' => 'Asia/Tokyo', + 'Tomsk Standard Time' => 'Asia/Tomsk', + 'Tonga Standard Time' => 'Pacific/Tongatapu', + 'Transbaikal Standard Time' => 'Asia/Chita', + 'Turkey Standard Time' => 'Europe/Istanbul', + 'Turks And Caicos Standard Time' => 'America/Grand_Turk', + 'US Eastern Standard Time' => 'America/Indianapolis', + 'US Mountain Standard Time' => 'America/Phoenix', + 'UTC' => 'Etc/GMT', + 'UTC+12' => 'Etc/GMT-12', + 'UTC+13' => 'Etc/GMT-13', + 'UTC-02' => 'Etc/GMT+2', + 'UTC-08' => 'Etc/GMT+8', + 'UTC-09' => 'Etc/GMT+9', + 'UTC-11' => 'Etc/GMT+11', + 'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar', + 'Venezuela Standard Time' => 'America/Caracas', + 'Vladivostok Standard Time' => 'Asia/Vladivostok', + 'W. Australia Standard Time' => 'Australia/Perth', + 'W. Central Africa Standard Time' => 'Africa/Lagos', + 'W. Europe Standard Time' => 'Europe/Berlin', + 'W. Mongolia Standard Time' => 'Asia/Hovd', + 'West Asia Standard Time' => 'Asia/Tashkent', + 'West Bank Standard Time' => 'Asia/Hebron', + 'West Pacific Standard Time' => 'Pacific/Port_Moresby', + 'Yakutsk Standard Time' => 'Asia/Yakutsk', + ); + + /** + * If `$filterDaysBefore` or `$filterDaysAfter` are set then the events are filtered according to the window defined + * by this field and `$windowMaxTimestamp`. + * + * @var integer + */ + private $windowMinTimestamp; + + /** + * If `$filterDaysBefore` or `$filterDaysAfter` are set then the events are filtered according to the window defined + * by this field and `$windowMinTimestamp`. + * + * @var integer + */ + private $windowMaxTimestamp; + + /** + * `true` if either `$filterDaysBefore` or `$filterDaysAfter` are set. + * + * @var boolean + */ + private $shouldFilterByWindow = false; + + /** + * Creates the ICal object + * + * @param mixed $files + * @param array $options + * @return void + */ + public function __construct($files = false, array $options = array()) + { + ini_set('auto_detect_line_endings', '1'); + + foreach ($options as $option => $value) { + if (in_array($option, self::$configurableOptions)) { + $this->{$option} = $value; + } + } + + // Fallback to use the system default time zone + if (!isset($this->defaultTimeZone) || !$this->isValidTimeZoneId($this->defaultTimeZone)) { + $this->defaultTimeZone = date_default_timezone_get(); + } + + // Ideally you would use `PHP_INT_MIN` from PHP 7 + $php_int_min = -2147483648; + + $this->windowMinTimestamp = is_null($this->filterDaysBefore) ? $php_int_min : (new \DateTime('now'))->sub(new \DateInterval('P' . $this->filterDaysBefore . 'D'))->getTimestamp(); + $this->windowMaxTimestamp = is_null($this->filterDaysAfter) ? PHP_INT_MAX : (new \DateTime('now'))->add(new \DateInterval('P' . $this->filterDaysAfter . 'D'))->getTimestamp(); + + $this->shouldFilterByWindow = !is_null($this->filterDaysBefore) || !is_null($this->filterDaysAfter); + + if ($files !== false) { + $files = is_array($files) ? $files : array($files); + + foreach ($files as $file) { + if (!is_array($file) && $this->isFileOrUrl($file)) { + $lines = $this->fileOrUrl($file); + } else { + $lines = is_array($file) ? $file : array($file); + } + + $this->initLines($lines); + } + } + } + + /** + * Initialises lines from a string + * + * @param string $string + * @return ICal + */ + public function initString($string) + { + $string = str_replace(array("\r\n", "\n\r", "\r"), "\n", $string); + + if (empty($this->cal)) { + $lines = explode("\n", $string); + + $this->initLines($lines); + } else { + trigger_error('ICal::initString: Calendar already initialised in constructor', E_USER_NOTICE); + } + + return $this; + } + + /** + * Initialises lines from a file + * + * @param string $file + * @return ICal + */ + public function initFile($file) + { + if (empty($this->cal)) { + $lines = $this->fileOrUrl($file); + + $this->initLines($lines); + } else { + trigger_error('ICal::initFile: Calendar already initialised in constructor', E_USER_NOTICE); + } + + return $this; + } + + /** + * Initialises lines from a URL + * + * @param string $url + * @param string $username + * @param string $password + * @param string $userAgent + * @param string $acceptLanguage + * @return ICal + */ + public function initUrl($url, $username = null, $password = null, $userAgent = null, $acceptLanguage = null) + { + if (!is_null($username) && !is_null($password)) { + $this->httpBasicAuth['username'] = $username; + $this->httpBasicAuth['password'] = $password; + } + + if (!is_null($userAgent)) { + $this->httpUserAgent = $userAgent; + } + + if (!is_null($acceptLanguage)) { + $this->httpAcceptLanguage = $acceptLanguage; + } + + $this->initFile($url); + + return $this; + } + + /** + * Initialises the parser using an array + * containing each line of iCal content + * + * @param array $lines + * @return void + */ + protected function initLines(array $lines) + { + $lines = $this->unfold($lines); + + if (stristr($lines[0], 'BEGIN:VCALENDAR') !== false) { + $component = ''; + foreach ($lines as $line) { + $line = rtrim($line); // Trim trailing whitespace + $line = $this->removeUnprintableChars($line); + + if (empty($line)) { + continue; + } + + if (!$this->disableCharacterReplacement) { + $line = $this->cleanData($line); + } + + $add = $this->keyValueFromString($line); + + if ($add === false) { + continue; + } + + $keyword = $add[0]; + $values = $add[1]; // May be an array containing multiple values + + if (!is_array($values)) { + if (!empty($values)) { + $values = array($values); // Make an array as not already + $blankArray = array(); // Empty placeholder array + array_push($values, $blankArray); + } else { + $values = array(); // Use blank array to ignore this line + } + } elseif (empty($values[0])) { + $values = array(); // Use blank array to ignore this line + } + + // Reverse so that our array of properties is processed first + $values = array_reverse($values); + + foreach ($values as $value) { + switch ($line) { + // https://www.kanzaki.com/docs/ical/vtodo.html + case 'BEGIN:VTODO': + if (!is_array($value)) { + $this->todoCount++; + } + + $component = 'VTODO'; + + break; + + // https://www.kanzaki.com/docs/ical/vevent.html + case 'BEGIN:VEVENT': + if (!is_array($value)) { + $this->eventCount++; + } + + $component = 'VEVENT'; + + break; + + // https://www.kanzaki.com/docs/ical/vfreebusy.html + case 'BEGIN:VFREEBUSY': + if (!is_array($value)) { + $this->freeBusyIndex++; + } + + $component = 'VFREEBUSY'; + + break; + + case 'BEGIN:VALARM': + if (!is_array($value)) { + $this->alarmCount++; + } + + $component = 'VALARM'; + + break; + + case 'END:VALARM': + $component = 'VEVENT'; + + break; + + case 'BEGIN:DAYLIGHT': + case 'BEGIN:STANDARD': + case 'BEGIN:VCALENDAR': + case 'BEGIN:VTIMEZONE': + $component = $value; + + break; + + case 'END:DAYLIGHT': + case 'END:STANDARD': + case 'END:VCALENDAR': + case 'END:VFREEBUSY': + case 'END:VTIMEZONE': + case 'END:VTODO': + $component = 'VCALENDAR'; + + break; + + case 'END:VEVENT': + if ($this->shouldFilterByWindow) { + $this->removeLastEventIfOutsideWindowAndNonRecurring(); + } + + $component = 'VCALENDAR'; + + break; + + default: + $this->addCalendarComponentWithKeyAndValue($component, $keyword, $value); + + break; + } + } + } + + $this->processEvents(); + + if (!$this->skipRecurrence) { + $this->processRecurrences(); + + // Apply changes to altered recurrence instances + if (!empty($this->alteredRecurrenceInstances)) { + $events = $this->cal['VEVENT']; + + foreach ($this->alteredRecurrenceInstances as $alteredRecurrenceInstance) { + if (isset($alteredRecurrenceInstance['altered-event'])) { + $alteredEvent = $alteredRecurrenceInstance['altered-event']; + $key = key($alteredEvent); + $events[$key] = $alteredEvent[$key]; + } + } + + $this->cal['VEVENT'] = $events; + } + } + + if ($this->shouldFilterByWindow) { + $this->reduceEventsToMinMaxRange(); + } + + $this->processDateConversions(); + } + } + + /** + * Removes the last event (i.e. most recently parsed) if its start date is outside the window spanned by + * `$windowMinTimestamp` / `$windowMaxTimestamp`. + * + * @return void + */ + protected function removeLastEventIfOutsideWindowAndNonRecurring() + { + $events = $this->cal['VEVENT']; + + if (!empty($events)) { + $lastIndex = count($events) - 1; + $lastEvent = $events[$lastIndex]; + + if ((!isset($lastEvent['RRULE']) || $lastEvent['RRULE'] === '') && $this->doesEventStartOutsideWindow($lastEvent)) { + $this->eventCount--; + + unset($events[$lastIndex]); + } + + $this->cal['VEVENT'] = $events; + } + } + + /** + * Reduces the number of events to the defined minimum and maximum range + * + * @return void + */ + protected function reduceEventsToMinMaxRange() + { + $events = (isset($this->cal['VEVENT'])) ? $this->cal['VEVENT'] : array(); + + if (!empty($events)) { + foreach ($events as $key => $anEvent) { + if ($anEvent === null) { + unset($events[$key]); + + continue; + } + + if ($this->doesEventStartOutsideWindow($anEvent)) { + $this->eventCount--; + + unset($events[$key]); + + continue; + } + } + + $this->cal['VEVENT'] = $events; + } + } + + /** + * Determines whether the event start date is outside `$windowMinTimestamp` / `$windowMaxTimestamp`. + * Returns `true` for invalid dates. + * + * @param array $event + * @return boolean + */ + protected function doesEventStartOutsideWindow(array $event) + { + return !$this->isValidDate($event['DTSTART']) || $this->isOutOfRange($event['DTSTART'], $this->windowMinTimestamp, $this->windowMaxTimestamp); + } + + /** + * Determines whether a valid iCalendar date is within a given range + * + * @param string $calendarDate + * @param integer $minTimestamp + * @param integer $maxTimestamp + * @return boolean + */ + protected function isOutOfRange($calendarDate, $minTimestamp, $maxTimestamp) + { + $timestamp = strtotime(explode('T', $calendarDate)[0]); + + return $timestamp < $minTimestamp || $timestamp > $maxTimestamp; + } + + /** + * Unfolds an iCal file in preparation for parsing + * (https://icalendar.org/iCalendar-RFC-5545/3-1-content-lines.html) + * + * @param array $lines + * @return array + */ + protected function unfold(array $lines) + { + $string = implode(PHP_EOL, $lines); + $string = preg_replace('/' . PHP_EOL . '[ \t]/', '', $string); + + $lines = explode(PHP_EOL, $string); + + return $lines; + } + + /** + * Add one key and value pair to the `$this->cal` array + * + * @param string $component + * @param string|boolean $keyword + * @param string $value + * @return void + */ + protected function addCalendarComponentWithKeyAndValue($component, $keyword, $value) + { + if ($keyword == false) { + $keyword = $this->lastKeyword; + } + + switch ($component) { + case 'VALARM': + $key1 = 'VEVENT'; + $key2 = ($this->eventCount - 1); + $key3 = $component; + + if (!isset($this->cal[$key1][$key2][$key3]["{$keyword}_array"])) { + $this->cal[$key1][$key2][$key3]["{$keyword}_array"] = array(); + } + + if (is_array($value)) { + // Add array of properties to the end + array_push($this->cal[$key1][$key2][$key3]["{$keyword}_array"], $value); + } else { + if (!isset($this->cal[$key1][$key2][$key3][$keyword])) { + $this->cal[$key1][$key2][$key3][$keyword] = $value; + } + + if ($this->cal[$key1][$key2][$key3][$keyword] !== $value) { + $this->cal[$key1][$key2][$key3][$keyword] .= ',' . $value; + } + } + break; + + case 'VEVENT': + $key1 = $component; + $key2 = ($this->eventCount - 1); + + if (!isset($this->cal[$key1][$key2]["{$keyword}_array"])) { + $this->cal[$key1][$key2]["{$keyword}_array"] = array(); + } + + if (is_array($value)) { + // Add array of properties to the end + array_push($this->cal[$key1][$key2]["{$keyword}_array"], $value); + } else { + if (!isset($this->cal[$key1][$key2][$keyword])) { + $this->cal[$key1][$key2][$keyword] = $value; + } + + if ($keyword === 'EXDATE') { + if (trim($value) === $value) { + $array = array_filter(explode(',', $value)); + $this->cal[$key1][$key2]["{$keyword}_array"][] = $array; + } else { + $value = explode(',', implode(',', $this->cal[$key1][$key2]["{$keyword}_array"][1]) . trim($value)); + $this->cal[$key1][$key2]["{$keyword}_array"][1] = $value; + } + } else { + $this->cal[$key1][$key2]["{$keyword}_array"][] = $value; + + if ($keyword === 'DURATION') { + $duration = new \DateInterval($value); + array_push($this->cal[$key1][$key2]["{$keyword}_array"], $duration); + } + } + + if ($this->cal[$key1][$key2][$keyword] !== $value) { + $this->cal[$key1][$key2][$keyword] .= ',' . $value; + } + } + break; + + case 'VFREEBUSY': + $key1 = $component; + $key2 = ($this->freeBusyIndex - 1); + $key3 = $keyword; + + if ($keyword === 'FREEBUSY') { + if (is_array($value)) { + $this->cal[$key1][$key2][$key3][][] = $value; + } else { + $this->freeBusyCount++; + + end($this->cal[$key1][$key2][$key3]); + $key = key($this->cal[$key1][$key2][$key3]); + + $value = explode('/', $value); + $this->cal[$key1][$key2][$key3][$key][] = $value; + } + } else { + $this->cal[$key1][$key2][$key3][] = $value; + } + break; + + case 'VTODO': + $this->cal[$component][$this->todoCount - 1][$keyword] = $value; + + break; + + default: + $this->cal[$component][$keyword] = $value; + + break; + } + + $this->lastKeyword = $keyword; + } + + /** + * Gets the key value pair from an iCal string + * + * @param string $text + * @return array|boolean + */ + protected function keyValueFromString($text) + { + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $colon = strpos($text, ':'); + $quote = strpos($text, '"'); + if ($colon === false) { + $matches = array(); + } elseif ($quote === false || $colon < $quote) { + list($before, $after) = explode(':', $text, 2); + $matches = array($text, $before, $after); + } else { + list($before, $text) = explode('"', $text, 2); + $text = '"' . $text; + $matches = str_getcsv($text, ':'); + $combinedValue = ''; + + foreach (array_keys($matches) as $key) { + if ($key === 0) { + if (!empty($before)) { + $matches[$key] = $before . '"' . $matches[$key] . '"'; + } + } else { + if ($key > 1) { + $combinedValue .= ':'; + } + + $combinedValue .= $matches[$key]; + } + } + + $matches = array_slice($matches, 0, 2); + $matches[1] = $combinedValue; + array_unshift($matches, $before . $text); + } + + if (count($matches) === 0) { + return false; + } + + if (preg_match('/^([A-Z-]+)([;][\w\W]*)?$/', $matches[1])) { + $matches = array_splice($matches, 1, 2); // Remove first match and re-align ordering + + // Process properties + if (preg_match('/([A-Z-]+)[;]([\w\W]*)/', $matches[0], $properties)) { + // Remove first match + array_shift($properties); + // Fix to ignore everything in keyword after a ; (e.g. Language, TZID, etc.) + $matches[0] = $properties[0]; + array_shift($properties); // Repeat removing first match + + $formatted = array(); + foreach ($properties as $property) { + // Match semicolon separator outside of quoted substrings + preg_match_all('~[^' . PHP_EOL . '";]+(?:"[^"\\\]*(?:\\\.[^"\\\]*)*"[^' . PHP_EOL . '";]*)*~', $property, $attributes); + // Remove multi-dimensional array and use the first key + $attributes = (count($attributes) === 0) ? array($property) : reset($attributes); + + if (is_array($attributes)) { + foreach ($attributes as $attribute) { + // Match equals sign separator outside of quoted substrings + preg_match_all( + '~[^' . PHP_EOL . '"=]+(?:"[^"\\\]*(?:\\\.[^"\\\]*)*"[^' . PHP_EOL . '"=]*)*~', + $attribute, + $values + ); + // Remove multi-dimensional array and use the first key + $value = (count($values) === 0) ? null : reset($values); + + if (is_array($value) && isset($value[1])) { + // Remove double quotes from beginning and end only + $formatted[$value[0]] = trim($value[1], '"'); + } + } + } + } + + // Assign the keyword property information + $properties[0] = $formatted; + + // Add match to beginning of array + array_unshift($properties, $matches[1]); + $matches[1] = $properties; + } + + return $matches; + } else { + return false; // Ignore this match + } + } + + /** + * Returns a `DateTime` object from an iCal date time format + * + * @param string $icalDate + * @return \DateTime + * @throws \Exception + */ + public function iCalDateToDateTime($icalDate) + { + /** + * iCal times may be in 3 formats, (https://www.kanzaki.com/docs/ical/dateTime.html) + * + * UTC: Has a trailing 'Z' + * Floating: No time zone reference specified, no trailing 'Z', use local time + * TZID: Set time zone as specified + * + * Use DateTime class objects to get around limitations with `mktime` and `gmmktime`. + * Must have a local time zone set to process floating times. + */ + $pattern = '/^(?:TZID=)?([^:]*|".*")'; // [1]: Time zone + $pattern .= ':?'; // Time zone delimiter + $pattern .= '([0-9]{8})'; // [2]: YYYYMMDD + $pattern .= 'T?'; // Time delimiter + $pattern .= '(?(?<=T)([0-9]{6}))'; // [3]: HHMMSS (filled if delimiter present) + $pattern .= '(Z?)/'; // [4]: UTC flag + + preg_match($pattern, $icalDate, $date); + + if (empty($date)) { + throw new \Exception('Invalid iCal date format.'); + } + + // A Unix timestamp usually cannot represent a date prior to 1 Jan 1970. + // PHP, on the other hand, uses negative numbers for that. Thus we don't + // need to special case them. + + if ($date[4] === 'Z') { + $dateTimeZone = new \DateTimeZone(self::TIME_ZONE_UTC); + } elseif (!empty($date[1])) { + $dateTimeZone = $this->timeZoneStringToDateTimeZone($date[1]); + } else { + $dateTimeZone = new \DateTimeZone($this->defaultTimeZone); + } + + // The exclamation mark at the start of the format string indicates that if a + // time portion is not included, the time in the returned DateTime should be + // set to 00:00:00. Without it, the time would be set to the current system time. + $dateFormat = '!Ymd'; + $dateBasic = $date[2]; + if (!empty($date[3])) { + $dateBasic .= "T{$date[3]}"; + $dateFormat .= '\THis'; + } + + return \DateTime::createFromFormat($dateFormat, $dateBasic, $dateTimeZone); + } + + /** + * Returns a Unix timestamp from an iCal date time format + * + * @param string $icalDate + * @return integer + */ + public function iCalDateToUnixTimestamp($icalDate) + { + return $this->iCalDateToDateTime($icalDate)->getTimestamp(); + } + + /** + * Returns a date adapted to the calendar time zone depending on the event `TZID` + * + * @param array $event + * @param string $key + * @param string $format + * @return string|boolean + */ + public function iCalDateWithTimeZone(array $event, $key, $format = self::DATE_TIME_FORMAT) + { + if (!isset($event["{$key}_array"]) || !isset($event[$key])) { + return false; + } + + $dateArray = $event["{$key}_array"]; + + if ($key === 'DURATION') { + $dateTime = $this->parseDuration($event['DTSTART'], $dateArray[2], null); + } else { + // When constructing from a Unix Timestamp, no time zone needs passing. + $dateTime = new \DateTime("@{$dateArray[2]}"); + } + + // Set the time zone we wish to use when running `$dateTime->format`. + $dateTime->setTimezone(new \DateTimeZone($this->calendarTimeZone())); + + if (is_null($format)) { + return $dateTime; + } + + return $dateTime->format($format); + } + + /** + * Performs admin tasks on all events as read from the iCal file. + * Adds a Unix timestamp to all `{DTSTART|DTEND|RECURRENCE-ID}_array` arrays + * Tracks modified recurrence instances + * + * @return void + */ + protected function processEvents() + { + $checks = null; + $events = (isset($this->cal['VEVENT'])) ? $this->cal['VEVENT'] : array(); + + if (!empty($events)) { + foreach ($events as $key => $anEvent) { + foreach (array('DTSTART', 'DTEND', 'RECURRENCE-ID') as $type) { + if (isset($anEvent[$type])) { + $date = $anEvent["{$type}_array"][1]; + + if (isset($anEvent["{$type}_array"][0]['TZID'])) { + $timeZone = $this->escapeParamText($anEvent["{$type}_array"][0]['TZID']); + $date = sprintf(self::ICAL_DATE_TIME_TEMPLATE, $timeZone) . $date; + } + + $anEvent["{$type}_array"][2] = $this->iCalDateToUnixTimestamp($date); + $anEvent["{$type}_array"][3] = $date; + } + } + + if (isset($anEvent['RECURRENCE-ID'])) { + $uid = $anEvent['UID']; + + if (!isset($this->alteredRecurrenceInstances[$uid])) { + $this->alteredRecurrenceInstances[$uid] = array(); + } + + $recurrenceDateUtc = $this->iCalDateToUnixTimestamp($anEvent['RECURRENCE-ID_array'][3]); + $this->alteredRecurrenceInstances[$uid][$key] = $recurrenceDateUtc; + } + + $events[$key] = $anEvent; + } + + $eventKeysToRemove = array(); + + foreach ($events as $key => $event) { + $checks[] = !isset($event['RECURRENCE-ID']); + $checks[] = isset($event['UID']); + $checks[] = isset($event['UID']) && isset($this->alteredRecurrenceInstances[$event['UID']]); + + if ((bool) array_product($checks)) { + $eventDtstartUnix = $this->iCalDateToUnixTimestamp($event['DTSTART_array'][3]); + + // phpcs:ignore CustomPHPCS.ControlStructures.AssignmentInCondition + if (($alteredEventKey = array_search($eventDtstartUnix, $this->alteredRecurrenceInstances[$event['UID']])) !== false) { + $eventKeysToRemove[] = $alteredEventKey; + + $alteredEvent = array_replace_recursive($events[$key], $events[$alteredEventKey]); + $this->alteredRecurrenceInstances[$event['UID']]['altered-event'] = array($key => $alteredEvent); + } + } + + unset($checks); + } + + foreach ($eventKeysToRemove as $eventKeyToRemove) { + $events[$eventKeyToRemove] = null; + } + + $this->cal['VEVENT'] = $events; + } + } + + /** + * Processes recurrence rules + * + * @return void + */ + protected function processRecurrences() + { + $events = (isset($this->cal['VEVENT'])) ? $this->cal['VEVENT'] : array(); + + // If there are no events, then we have nothing to process. + if (empty($events)) { + return; + } + + $allEventRecurrences = array(); + $eventKeysToRemove = array(); + + foreach ($events as $key => $anEvent) { + if (!isset($anEvent['RRULE']) || $anEvent['RRULE'] === '') { + continue; + } + + // Tag as generated by a recurrence rule + $anEvent['RRULE_array'][2] = self::RECURRENCE_EVENT; + + // Create new initial starting point. + $initialEventDate = $this->icalDateToDateTime($anEvent['DTSTART_array'][3]); + + // Separate the RRULE stanzas, and explode the values that are lists. + $rrules = array(); + foreach (explode(';', $anEvent['RRULE']) as $s) { + list($k, $v) = explode('=', $s); + if (in_array($k, array('BYSETPOS', 'BYDAY', 'BYMONTHDAY', 'BYMONTH', 'BYYEARDAY', 'BYWEEKNO'))) { + $rrules[$k] = explode(',', $v); + } else { + $rrules[$k] = $v; + } + } + + // Get frequency + $frequency = $rrules['FREQ']; + + // Reject RRULE if BYDAY stanza is invalid: + // > The BYDAY rule part MUST NOT be specified with a numeric value + // > when the FREQ rule part is not set to MONTHLY or YEARLY. + // > Furthermore, the BYDAY rule part MUST NOT be specified with a + // > numeric value with the FREQ rule part set to YEARLY when the + // > BYWEEKNO rule part is specified. + if (isset($rrules['BYDAY'])) { + $checkByDays = function ($carry, $weekday) { + return $carry && substr($weekday, -2) === $weekday; + }; + if (!in_array($frequency, array('MONTHLY', 'YEARLY'))) { + if (!array_reduce($rrules['BYDAY'], $checkByDays, true)) { + error_log("ICal::ProcessRecurrences: A {$frequency} RRULE may not contain BYDAY values with numeric prefixes"); + + continue; + } + } elseif ($frequency === 'YEARLY' && !empty($rrules['BYWEEKNO'])) { + if (!array_reduce($rrules['BYDAY'], $checkByDays, true)) { + error_log('ICal::ProcessRecurrences: A YEARLY RRULE with a BYWEEKNO part may not contain BYDAY values with numeric prefixes'); + + continue; + } + } + } + + // Get Interval + $interval = (empty($rrules['INTERVAL'])) ? 1 : $rrules['INTERVAL']; + + // Throw an error if this isn't an integer. + if (!is_int($this->defaultSpan)) { + trigger_error('ICal::defaultSpan: User defined value is not an integer', E_USER_NOTICE); + } + + // Compute EXDATEs + $exdates = $this->parseExdates($anEvent); + + // Determine if the initial date is also an EXDATE + $initialDateIsExdate = array_reduce($exdates, function ($carry, $exdate) use ($initialEventDate) { + return $carry || $exdate->getTimestamp() == $initialEventDate->getTimestamp(); + }, false); + + if ($initialDateIsExdate) { + $eventKeysToRemove[] = $key; + } + + /** + * Determine at what point we should stop calculating recurrences + * by looking at the UNTIL or COUNT rrule stanza, or, if neither + * if set, using a fallback. + * + * If the initial date is also an EXDATE, it shouldn't be included + * in the count. + * + * Syntax: + * UNTIL={enddate} + * COUNT= + * + * Where: + * enddate = || + */ + $count = 1; + $countLimit = (isset($rrules['COUNT'])) ? intval($rrules['COUNT']) : 0; + $until = date_create()->modify("{$this->defaultSpan} years")->setTime(23, 59, 59)->getTimestamp(); + + if (isset($rrules['UNTIL'])) { + $until = min($until, $this->iCalDateToUnixTimestamp($rrules['UNTIL'])); + } + + $eventRecurrences = array(); + + $frequencyRecurringDateTime = clone $initialEventDate; + while ($frequencyRecurringDateTime->getTimestamp() <= $until) { + $candidateDateTimes = array(); + + // phpcs:ignore Squiz.ControlStructures.SwitchDeclaration.MissingDefault + switch ($frequency) { + case 'DAILY': + if (!empty($rrules['BYMONTHDAY'])) { + if (!isset($monthDays)) { + // This variable is unset when we change months (see below) + $monthDays = $this->getDaysOfMonthMatchingByMonthDayRRule($rrules['BYMONTHDAY'], $frequencyRecurringDateTime); + } + + if (!in_array($frequencyRecurringDateTime->format('j'), $monthDays)) { + break; + } + } + + $candidateDateTimes[] = clone $frequencyRecurringDateTime; + + break; + + case 'WEEKLY': + $initialDayOfWeek = $frequencyRecurringDateTime->format('N'); + $matchingDays = array($initialDayOfWeek); + + if (!empty($rrules['BYDAY'])) { + // setISODate() below uses the ISO-8601 specification of weeks: start on + // a Monday, end on a Sunday. However, RRULEs (or the caller of the + // parser) may state an alternate WeeKSTart. + $wkstTransition = 7; + + if (empty($rrules['WKST'])) { + if ($this->defaultWeekStart !== self::ISO_8601_WEEK_START) { + $wkstTransition = array_search($this->defaultWeekStart, array_keys($this->weekdays)); + } + } elseif ($rrules['WKST'] !== self::ISO_8601_WEEK_START) { + $wkstTransition = array_search($rrules['WKST'], array_keys($this->weekdays)); + } + + $matchingDays = array_map( + function ($weekday) use ($initialDayOfWeek, $wkstTransition, $interval) { + $day = array_search($weekday, array_keys($this->weekdays)); + + if ($day < $initialDayOfWeek) { + $day += 7; + } + + if ($day >= $wkstTransition) { + $day += 7 * ($interval - 1); + } + + // Ignoring alternate week starts, $day at this point will have a + // value between 0 and 6. But setISODate() expects a value of 1 to 7. + // Even with alternate week starts, we still need to +1 to set the + // correct weekday. + $day++; + + return $day; + }, + $rrules['BYDAY'] + ); + } + + sort($matchingDays); + + foreach ($matchingDays as $day) { + $clonedDateTime = clone $frequencyRecurringDateTime; + $candidateDateTimes[] = $clonedDateTime->setISODate( + $frequencyRecurringDateTime->format('o'), + $frequencyRecurringDateTime->format('W'), + $day + ); + } + break; + + case 'MONTHLY': + $matchingDays = array(); + + if (!empty($rrules['BYMONTHDAY'])) { + $matchingDays = $this->getDaysOfMonthMatchingByMonthDayRRule($rrules['BYMONTHDAY'], $frequencyRecurringDateTime); + if (!empty($rrules['BYDAY'])) { + $matchingDays = array_filter( + $this->getDaysOfMonthMatchingByDayRRule($rrules['BYDAY'], $frequencyRecurringDateTime), + function ($monthDay) use ($matchingDays) { + return in_array($monthDay, $matchingDays); + } + ); + } + } elseif (!empty($rrules['BYDAY'])) { + $matchingDays = $this->getDaysOfMonthMatchingByDayRRule($rrules['BYDAY'], $frequencyRecurringDateTime); + } + + if (!empty($rrules['BYSETPOS'])) { + $matchingDays = $this->filterValuesUsingBySetPosRRule($rrules['BYSETPOS'], $matchingDays); + } + + foreach ($matchingDays as $day) { + // Skip invalid dates (e.g. 30th February) + if ($day > $frequencyRecurringDateTime->format('t')) { + continue; + } + + $clonedDateTime = clone $frequencyRecurringDateTime; + $candidateDateTimes[] = $clonedDateTime->setDate( + $frequencyRecurringDateTime->format('Y'), + $frequencyRecurringDateTime->format('m'), + $day + ); + } + break; + + case 'YEARLY': + $matchingDays = array(); + + if (!empty($rrules['BYMONTH'])) { + $bymonthRecurringDatetime = clone $frequencyRecurringDateTime; + foreach ($rrules['BYMONTH'] as $byMonth) { + $bymonthRecurringDatetime->setDate( + $frequencyRecurringDateTime->format('Y'), + $byMonth, + $frequencyRecurringDateTime->format('d') + ); + + // Determine the days of the month affected + // (The interaction between BYMONTHDAY and BYDAY is resolved later.) + $monthDays = array(); + if (!empty($rrules['BYMONTHDAY'])) { + $monthDays = $this->getDaysOfMonthMatchingByMonthDayRRule($rrules['BYMONTHDAY'], $bymonthRecurringDatetime); + } elseif (!empty($rrules['BYDAY'])) { + $monthDays = $this->getDaysOfMonthMatchingByDayRRule($rrules['BYDAY'], $bymonthRecurringDatetime); + } else { + $monthDays[] = $bymonthRecurringDatetime->format('d'); + } + + // And add each of them to the list of recurrences + foreach ($monthDays as $day) { + $matchingDays[] = $bymonthRecurringDatetime->setDate( + $frequencyRecurringDateTime->format('Y'), + $bymonthRecurringDatetime->format('m'), + $day + )->format('z') + 1; + } + } + } elseif (!empty($rrules['BYWEEKNO'])) { + $matchingDays = $this->getDaysOfYearMatchingByWeekNoRRule($rrules['BYWEEKNO'], $frequencyRecurringDateTime); + } elseif (!empty($rrules['BYYEARDAY'])) { + $matchingDays = $this->getDaysOfYearMatchingByYearDayRRule($rrules['BYYEARDAY'], $frequencyRecurringDateTime); + } elseif (!empty($rrules['BYMONTHDAY'])) { + $matchingDays = $this->getDaysOfYearMatchingByMonthDayRRule($rrules['BYMONTHDAY'], $frequencyRecurringDateTime); + } + + if (!empty($rrules['BYDAY'])) { + if (!empty($rrules['BYYEARDAY']) || !empty($rrules['BYMONTHDAY']) || !empty($rrules['BYWEEKNO'])) { + $matchingDays = array_filter( + $this->getDaysOfYearMatchingByDayRRule($rrules['BYDAY'], $frequencyRecurringDateTime), + function ($yearDay) use ($matchingDays) { + return in_array($yearDay, $matchingDays); + } + ); + } elseif (count($matchingDays) === 0) { + $matchingDays = $this->getDaysOfYearMatchingByDayRRule($rrules['BYDAY'], $frequencyRecurringDateTime); + } + } + + if (count($matchingDays) === 0) { + $matchingDays = array($frequencyRecurringDateTime->format('z') + 1); + } else { + sort($matchingDays); + } + + if (!empty($rrules['BYSETPOS'])) { + $matchingDays = $this->filterValuesUsingBySetPosRRule($rrules['BYSETPOS'], $matchingDays); + } + + foreach ($matchingDays as $day) { + $clonedDateTime = clone $frequencyRecurringDateTime; + $candidateDateTimes[] = $clonedDateTime->setDate( + $frequencyRecurringDateTime->format('Y'), + 1, + $day + ); + } + break; + } + + foreach ($candidateDateTimes as $candidate) { + $timestamp = $candidate->getTimestamp(); + if ($timestamp <= $initialEventDate->getTimestamp()) { + continue; + } + + if ($timestamp > $until) { + break; + } + + // Exclusions + $isExcluded = array_filter($exdates, function ($exdate) use ($timestamp) { + return $exdate->getTimestamp() == $timestamp; + }); + + if (isset($this->alteredRecurrenceInstances[$anEvent['UID']])) { + if (in_array($timestamp, $this->alteredRecurrenceInstances[$anEvent['UID']])) { + $isExcluded = true; + } + } + + if (!$isExcluded) { + $eventRecurrences[] = $candidate; + $this->eventCount++; + } + + // Count all evaluated candidates including excluded ones + if (isset($rrules['COUNT'])) { + $count++; + + // If RRULE[COUNT] is reached then break + if ($count >= $countLimit) { + break 2; + } + } + } + + // Move forwards $interval $frequency. + $monthPreMove = $frequencyRecurringDateTime->format('m'); + $frequencyRecurringDateTime->modify("{$interval} {$this->frequencyConversion[$frequency]}"); + + // As noted in Example #2 on https://www.php.net/manual/en/datetime.modify.php, + // there are some occasions where adding months doesn't give the month you might + // expect. For instance: January 31st + 1 month == March 3rd (March 2nd on a leap + // year.) The following code crudely rectifies this. + if ($frequency === 'MONTHLY') { + $monthDiff = $frequencyRecurringDateTime->format('m') - $monthPreMove; + + if (($monthDiff > 0 && $monthDiff > $interval) || ($monthDiff < 0 && $monthDiff > $interval - 12)) { + $frequencyRecurringDateTime->modify('-1 month'); + } + } + + // $monthDays is set in the DAILY frequency if the BYMONTHDAY stanza is present in + // the RRULE. The variable only needs to be updated when we change months, so we + // unset it here, prompting a recreation next iteration. + if (isset($monthDays) && $frequencyRecurringDateTime->format('m') !== $monthPreMove) { + unset($monthDays); + } + } + + unset($monthDays); // Unset it here as well, so it doesn't bleed into the calculation of the next recurring event. + + // Determine event length + $eventLength = 0; + if (isset($anEvent['DURATION'])) { + $clonedDateTime = clone $initialEventDate; + $endDate = $clonedDateTime->add($anEvent['DURATION_array'][2]); + $eventLength = $endDate->getTimestamp() - $anEvent['DTSTART_array'][2]; + } elseif (isset($anEvent['DTEND_array'])) { + $eventLength = $anEvent['DTEND_array'][2] - $anEvent['DTSTART_array'][2]; + } + + // Whether or not the initial date was UTC + $initialDateWasUTC = substr($anEvent['DTSTART'], -1) === 'Z'; + + // Build the param array + $dateParamArray = array(); + if ( + !$initialDateWasUTC + && isset($anEvent['DTSTART_array'][0]['TZID']) + && $this->isValidTimeZoneId($anEvent['DTSTART_array'][0]['TZID']) + ) { + $dateParamArray['TZID'] = $anEvent['DTSTART_array'][0]['TZID']; + } + + // Populate the `DT{START|END}[_array]`s + $eventRecurrences = array_map( + function ($recurringDatetime) use ($anEvent, $eventLength, $initialDateWasUTC, $dateParamArray) { + $tzidPrefix = (isset($dateParamArray['TZID'])) ? 'TZID=' . $this->escapeParamText($dateParamArray['TZID']) . ':' : ''; + + foreach (array('DTSTART', 'DTEND') as $dtkey) { + $anEvent[$dtkey] = $recurringDatetime->format(self::DATE_TIME_FORMAT) . (($initialDateWasUTC) ? 'Z' : ''); + + $anEvent["{$dtkey}_array"] = array( + $dateParamArray, // [0] Array of params (incl. TZID) + $anEvent[$dtkey], // [1] ICalDateTime string w/o TZID + $recurringDatetime->getTimestamp(), // [2] Unix Timestamp + "{$tzidPrefix}{$anEvent[$dtkey]}", // [3] Full ICalDateTime string + ); + + if ($dtkey !== 'DTEND') { + $recurringDatetime->modify("{$eventLength} seconds"); + } + } + + return $anEvent; + }, + $eventRecurrences + ); + + $allEventRecurrences = array_merge($allEventRecurrences, $eventRecurrences); + } + + // Nullify the initial events that are also EXDATEs + foreach ($eventKeysToRemove as $eventKeyToRemove) { + $events[$eventKeyToRemove] = null; + } + + $events = array_merge($events, $allEventRecurrences); + + $this->cal['VEVENT'] = $events; + } + + /** + * Resolves values from indices of the range 1 -> $limit. + * + * For instance, if passed [1, 4, -16] and 28, this will return [1, 4, 13]. + * + * @param array $indexes + * @param integer $limit + * @return array + */ + protected function resolveIndicesOfRange(array $indexes, $limit) + { + $matching = array(); + foreach ($indexes as $index) { + if ($index > 0 && $index <= $limit) { + $matching[] = $index; + } elseif ($index < 0 && -$index <= $limit) { + $matching[] = $index + $limit + 1; + } + } + + sort($matching); + + return $matching; + } + + /** + * Find all days of a month that match the BYDAY stanza of an RRULE. + * + * With no {ordwk}, then return the day number of every {weekday} + * within the month. + * + * With a +ve {ordwk}, then return the {ordwk} {weekday} within the + * month. + * + * With a -ve {ordwk}, then return the {ordwk}-to-last {weekday} + * within the month. + * + * RRule Syntax: + * BYDAY={bywdaylist} + * + * Where: + * bywdaylist = {weekdaynum}[,{weekdaynum}...] + * weekdaynum = [[+]{ordwk} || -{ordwk}]{weekday} + * ordwk = 1 to 53 + * weekday = SU || MO || TU || WE || TH || FR || SA + * + * @param array $byDays + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfMonthMatchingByDayRRule(array $byDays, $initialDateTime) + { + $matchingDays = array(); + + foreach ($byDays as $weekday) { + $bydayDateTime = clone $initialDateTime; + + $ordwk = intval(substr($weekday, 0, -2)); + + // Quantise the date to the first instance of the requested day in a month + // (Or last if we have a -ve {ordwk}) + $bydayDateTime->modify( + (($ordwk < 0) ? 'Last' : 'First') . + ' ' . + $this->weekdays[substr($weekday, -2)] . // e.g. "Monday" + ' of ' . + $initialDateTime->format('F') // e.g. "June" + ); + + if ($ordwk < 0) { // -ve {ordwk} + $bydayDateTime->modify((++$ordwk) . ' week'); + $matchingDays[] = $bydayDateTime->format('j'); + } elseif ($ordwk > 0) { // +ve {ordwk} + $bydayDateTime->modify((--$ordwk) . ' week'); + $matchingDays[] = $bydayDateTime->format('j'); + } else { // No {ordwk} + while ($bydayDateTime->format('n') === $initialDateTime->format('n')) { + $matchingDays[] = $bydayDateTime->format('j'); + $bydayDateTime->modify('+1 week'); + } + } + } + + // Sort into ascending order + sort($matchingDays); + + return $matchingDays; + } + + /** + * Find all days of a month that match the BYMONTHDAY stanza of an RRULE. + * + * RRUle Syntax: + * BYMONTHDAY={bymodaylist} + * + * Where: + * bymodaylist = {monthdaynum}[,{monthdaynum}...] + * monthdaynum = ([+] || -) {ordmoday} + * ordmoday = 1 to 31 + * + * @param array $byMonthDays + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfMonthMatchingByMonthDayRRule(array $byMonthDays, $initialDateTime) + { + return $this->resolveIndicesOfRange($byMonthDays, $initialDateTime->format('t')); + } + + /** + * Find all days of a year that match the BYDAY stanza of an RRULE. + * + * With no {ordwk}, then return the day number of every {weekday} + * within the year. + * + * With a +ve {ordwk}, then return the {ordwk} {weekday} within the + * year. + * + * With a -ve {ordwk}, then return the {ordwk}-to-last {weekday} + * within the year. + * + * RRule Syntax: + * BYDAY={bywdaylist} + * + * Where: + * bywdaylist = {weekdaynum}[,{weekdaynum}...] + * weekdaynum = [[+]{ordwk} || -{ordwk}]{weekday} + * ordwk = 1 to 53 + * weekday = SU || MO || TU || WE || TH || FR || SA + * + * @param array $byDays + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfYearMatchingByDayRRule(array $byDays, $initialDateTime) + { + $matchingDays = array(); + + foreach ($byDays as $weekday) { + $bydayDateTime = clone $initialDateTime; + + $ordwk = intval(substr($weekday, 0, -2)); + + // Quantise the date to the first instance of the requested day in a year + // (Or last if we have a -ve {ordwk}) + $bydayDateTime->modify( + (($ordwk < 0) ? 'Last' : 'First') . + ' ' . + $this->weekdays[substr($weekday, -2)] . // e.g. "Monday" + ' of ' . (($ordwk < 0) ? 'December' : 'January') . + ' ' . $initialDateTime->format('Y') // e.g. "2018" + ); + + if ($ordwk < 0) { // -ve {ordwk} + $bydayDateTime->modify((++$ordwk) . ' week'); + $matchingDays[] = $bydayDateTime->format('z') + 1; + } elseif ($ordwk > 0) { // +ve {ordwk} + $bydayDateTime->modify((--$ordwk) . ' week'); + $matchingDays[] = $bydayDateTime->format('z') + 1; + } else { // No {ordwk} + while ($bydayDateTime->format('Y') === $initialDateTime->format('Y')) { + $matchingDays[] = $bydayDateTime->format('z') + 1; + $bydayDateTime->modify('+1 week'); + } + } + } + + // Sort into ascending order + sort($matchingDays); + + return $matchingDays; + } + + /** + * Find all days of a year that match the BYYEARDAY stanza of an RRULE. + * + * RRUle Syntax: + * BYYEARDAY={byyrdaylist} + * + * Where: + * byyrdaylist = {yeardaynum}[,{yeardaynum}...] + * yeardaynum = ([+] || -) {ordyrday} + * ordyrday = 1 to 366 + * + * @param array $byYearDays + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfYearMatchingByYearDayRRule(array $byYearDays, $initialDateTime) + { + // `\DateTime::format('L')` returns 1 if leap year, 0 if not. + $daysInThisYear = $initialDateTime->format('L') ? 366 : 365; + + return $this->resolveIndicesOfRange($byYearDays, $daysInThisYear); + } + + /** + * Find all days of a year that match the BYWEEKNO stanza of an RRULE. + * + * Unfortunately, the RFC5545 specification does not specify exactly + * how BYWEEKNO should expand on the initial DTSTART when provided + * without any other stanzas. + * + * A comparison of expansions used by other ics parsers may be found + * at https://github.com/s0600204/ics-parser-1/wiki/byweekno + * + * This method uses the same expansion as the python-dateutil module. + * + * RRUle Syntax: + * BYWEEKNO={bywknolist} + * + * Where: + * bywknolist = {weeknum}[,{weeknum}...] + * weeknum = ([+] || -) {ordwk} + * ordwk = 1 to 53 + * + * @param array $byWeekNums + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfYearMatchingByWeekNoRRule(array $byWeekNums, $initialDateTime) + { + // `\DateTime::format('L')` returns 1 if leap year, 0 if not. + $isLeapYear = $initialDateTime->format('L'); + $firstDayOfTheYear = date_create("first day of January {$initialDateTime->format('Y')}")->format('D'); + $weeksInThisYear = ($firstDayOfTheYear === 'Thu' || $isLeapYear && $firstDayOfTheYear === 'Wed') ? 53 : 52; + + $matchingWeeks = $this->resolveIndicesOfRange($byWeekNums, $weeksInThisYear); + $matchingDays = array(); + $byweekDateTime = clone $initialDateTime; + foreach ($matchingWeeks as $weekNum) { + $dayNum = $byweekDateTime->setISODate( + $initialDateTime->format('Y'), + $weekNum, + 1 + )->format('z') + 1; + for ($x = 0; $x < 7; ++$x) { + $matchingDays[] = $x + $dayNum; + } + } + + sort($matchingDays); + + return $matchingDays; + } + + /** + * Find all days of a year that match the BYMONTHDAY stanza of an RRULE. + * + * RRule Syntax: + * BYMONTHDAY={bymodaylist} + * + * Where: + * bymodaylist = {monthdaynum}[,{monthdaynum}...] + * monthdaynum = ([+] || -) {ordmoday} + * ordmoday = 1 to 31 + * + * @param array $byMonthDays + * @param \DateTime $initialDateTime + * @return array + */ + protected function getDaysOfYearMatchingByMonthDayRRule(array $byMonthDays, $initialDateTime) + { + $matchingDays = array(); + $monthDateTime = clone $initialDateTime; + for ($month = 1; $month < 13; $month++) { + $monthDateTime->setDate( + $initialDateTime->format('Y'), + $month, + 1 + ); + + $monthDays = $this->getDaysOfMonthMatchingByMonthDayRRule($byMonthDays, $monthDateTime); + foreach ($monthDays as $day) { + $matchingDays[] = $monthDateTime->setDate( + $initialDateTime->format('Y'), + $monthDateTime->format('m'), + $day + )->format('z') + 1; + } + } + + return $matchingDays; + } + + /** + * Filters a provided values-list by applying a BYSETPOS RRule. + * + * Where a +ve {daynum} is provided, the {ordday} position'd value as + * measured from the start of the list of values should be retained. + * + * Where a -ve {daynum} is provided, the {ordday} position'd value as + * measured from the end of the list of values should be retained. + * + * RRule Syntax: + * BYSETPOS={bysplist} + * + * Where: + * bysplist = {setposday}[,{setposday}...] + * setposday = {daynum} + * daynum = [+ || -] {ordday} + * ordday = 1 to 366 + * + * @param array $bySetPos + * @param array $valuesList + * @return array + */ + protected function filterValuesUsingBySetPosRRule(array $bySetPos, array $valuesList) + { + $filteredMatches = array(); + + foreach ($bySetPos as $setPosition) { + if ($setPosition < 0) { + $setPosition = count($valuesList) + ++$setPosition; + } + + // Positioning starts at 1, array indexes start at 0 + if (isset($valuesList[$setPosition - 1])) { + $filteredMatches[] = $valuesList[$setPosition - 1]; + } + } + + return $filteredMatches; + } + + /** + * Processes date conversions using the time zone + * + * Add keys `DTSTART_tz` and `DTEND_tz` to each Event + * These keys contain dates adapted to the calendar + * time zone depending on the event `TZID`. + * + * @return void + * @throws \Exception + */ + protected function processDateConversions() + { + $events = (isset($this->cal['VEVENT'])) ? $this->cal['VEVENT'] : array(); + + if (!empty($events)) { + foreach ($events as $key => $anEvent) { + if (is_null($anEvent) || !$this->isValidDate($anEvent['DTSTART'])) { + unset($events[$key]); + $this->eventCount--; + + continue; + } + + $events[$key]['DTSTART_tz'] = $this->iCalDateWithTimeZone($anEvent, 'DTSTART'); + + if ($this->iCalDateWithTimeZone($anEvent, 'DTEND')) { + $events[$key]['DTEND_tz'] = $this->iCalDateWithTimeZone($anEvent, 'DTEND'); + } elseif ($this->iCalDateWithTimeZone($anEvent, 'DURATION')) { + $events[$key]['DTEND_tz'] = $this->iCalDateWithTimeZone($anEvent, 'DURATION'); + } else { + $events[$key]['DTEND_tz'] = $events[$key]['DTSTART_tz']; + } + } + + $this->cal['VEVENT'] = $events; + } + } + + /** + * Returns an array of Events. + * Every event is a class with the event + * details being properties within it. + * + * @return array + */ + public function events() + { + $array = $this->cal; + $array = isset($array['VEVENT']) ? $array['VEVENT'] : array(); + + $events = array(); + + if (!empty($array)) { + foreach ($array as $event) { + $events[] = new Event($event); + } + } + + return $events; + } + + /** + * Returns the calendar name + * + * @return string + */ + public function calendarName() + { + return isset($this->cal['VCALENDAR']['X-WR-CALNAME']) ? $this->cal['VCALENDAR']['X-WR-CALNAME'] : ''; + } + + /** + * Returns the calendar description + * + * @return string + */ + public function calendarDescription() + { + return isset($this->cal['VCALENDAR']['X-WR-CALDESC']) ? $this->cal['VCALENDAR']['X-WR-CALDESC'] : ''; + } + + /** + * Returns the calendar time zone + * + * @param boolean $ignoreUtc + * @return string + */ + public function calendarTimeZone($ignoreUtc = false) + { + if (isset($this->cal['VCALENDAR']['X-WR-TIMEZONE'])) { + $timeZone = $this->cal['VCALENDAR']['X-WR-TIMEZONE']; + } elseif (isset($this->cal['VTIMEZONE']['TZID'])) { + $timeZone = $this->cal['VTIMEZONE']['TZID']; + } else { + $timeZone = $this->defaultTimeZone; + } + + // Validate the time zone, falling back to the time zone set in the PHP environment. + $timeZone = $this->timeZoneStringToDateTimeZone($timeZone)->getName(); + + if ($ignoreUtc && strtoupper($timeZone) === self::TIME_ZONE_UTC) { + return null; + } + + return $timeZone; + } + + /** + * Returns an array of arrays with all free/busy events. + * Every event is an associative array and each property + * is an element it. + * + * @return array + */ + public function freeBusyEvents() + { + $array = $this->cal; + + return isset($array['VFREEBUSY']) ? $array['VFREEBUSY'] : array(); + } + + /** + * Returns a boolean value whether the + * current calendar has events or not + * + * @return boolean + */ + public function hasEvents() + { + return (count($this->events()) > 0) ?: false; + } + + /** + * Returns a sorted array of the events in a given range, + * or an empty array if no events exist in the range. + * + * Events will be returned if the start or end date is contained within the + * range (inclusive), or if the event starts before and end after the range. + * + * If a start date is not specified or of a valid format, then the start + * of the range will default to the current time and date of the server. + * + * If an end date is not specified or of a valid format, then the end of + * the range will default to the current time and date of the server, + * plus 20 years. + * + * Note that this function makes use of Unix timestamps. This might be a + * problem for events on, during, or after 29 Jan 2038. + * See https://en.wikipedia.org/wiki/Unix_time#Representing_the_number + * + * @param string|null $rangeStart + * @param string|null $rangeEnd + * @return array + * @throws \Exception + */ + public function eventsFromRange($rangeStart = null, $rangeEnd = null) + { + // Sort events before processing range + $events = $this->sortEventsWithOrder($this->events()); + + if (empty($events)) { + return array(); + } + + $extendedEvents = array(); + + if (!is_null($rangeStart)) { + try { + $rangeStart = new \DateTime($rangeStart, new \DateTimeZone($this->defaultTimeZone)); + } catch (\Exception $exception) { + error_log("ICal::eventsFromRange: Invalid date passed ({$rangeStart})"); + $rangeStart = false; + } + } else { + $rangeStart = new \DateTime('now', new \DateTimeZone($this->defaultTimeZone)); + } + + if (!is_null($rangeEnd)) { + try { + $rangeEnd = new \DateTime($rangeEnd, new \DateTimeZone($this->defaultTimeZone)); + } catch (\Exception $exception) { + error_log("ICal::eventsFromRange: Invalid date passed ({$rangeEnd})"); + $rangeEnd = false; + } + } else { + $rangeEnd = new \DateTime('now', new \DateTimeZone($this->defaultTimeZone)); + $rangeEnd->modify('+20 years'); + } + + // If start and end are identical and are dates with no times... + if ($rangeEnd->format('His') == 0 && $rangeStart->getTimestamp() === $rangeEnd->getTimestamp()) { + $rangeEnd->modify('+1 day'); + } + + $rangeStart = $rangeStart->getTimestamp(); + $rangeEnd = $rangeEnd->getTimestamp(); + + foreach ($events as $anEvent) { + $eventStart = $anEvent->dtstart_array[2]; + $eventEnd = (isset($anEvent->dtend_array[2])) ? $anEvent->dtend_array[2] : null; + + if ( + ($eventStart >= $rangeStart && $eventStart < $rangeEnd) // Event start date contained in the range + || ($eventEnd !== null + && ( + ($eventEnd > $rangeStart && $eventEnd <= $rangeEnd) // Event end date contained in the range + || ($eventStart < $rangeStart && $eventEnd > $rangeEnd) // Event starts before and finishes after range + ) + ) + ) { + $extendedEvents[] = $anEvent; + } + } + + if (empty($extendedEvents)) { + return array(); + } + + return $extendedEvents; + } + + /** + * Returns a sorted array of the events following a given string, + * or `false` if no events exist in the range. + * + * @param string $interval + * @return array + */ + public function eventsFromInterval($interval) + { + $rangeStart = new \DateTime('now', new \DateTimeZone($this->defaultTimeZone)); + $rangeEnd = new \DateTime('now', new \DateTimeZone($this->defaultTimeZone)); + + $dateInterval = \DateInterval::createFromDateString($interval); + $rangeEnd->add($dateInterval); + + return $this->eventsFromRange($rangeStart->format('Y-m-d'), $rangeEnd->format('Y-m-d')); + } + + /** + * Sorts events based on a given sort order + * + * @param array $events + * @param integer $sortOrder Either SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING + * @return array + */ + public function sortEventsWithOrder(array $events, $sortOrder = SORT_ASC) + { + $extendedEvents = array(); + $timestamp = array(); + + foreach ($events as $key => $anEvent) { + $extendedEvents[] = $anEvent; + $timestamp[$key] = $anEvent->dtstart_array[2]; + } + + array_multisort($timestamp, $sortOrder, $extendedEvents); + + return $extendedEvents; + } + + /** + * Checks if a time zone is valid (IANA, CLDR, or Windows) + * + * @param string $timeZone + * @return boolean + */ + protected function isValidTimeZoneId($timeZone) + { + return $this->isValidIanaTimeZoneId($timeZone) !== false + || $this->isValidCldrTimeZoneId($timeZone) !== false + || $this->isValidWindowsTimeZoneId($timeZone) !== false; + } + + /** + * Checks if a time zone is a valid IANA time zone + * + * @param string $timeZone + * @return boolean + */ + protected function isValidIanaTimeZoneId($timeZone) + { + if (in_array($timeZone, $this->validIanaTimeZones)) { + return true; + } + + $valid = array(); + $tza = timezone_abbreviations_list(); + + foreach ($tza as $zone) { + foreach ($zone as $item) { + $valid[$item['timezone_id']] = true; + } + } + + unset($valid['']); + + if (isset($valid[$timeZone]) || in_array($timeZone, timezone_identifiers_list(\DateTimeZone::ALL_WITH_BC))) { + $this->validIanaTimeZones[] = $timeZone; + + return true; + } + + return false; + } + + /** + * Checks if a time zone is a valid CLDR time zone + * + * @param string $timeZone + * @return boolean + */ + public function isValidCldrTimeZoneId($timeZone) + { + return array_key_exists(html_entity_decode($timeZone), self::$cldrTimeZonesMap); + } + + /** + * Checks if a time zone is a recognised Windows (non-CLDR) time zone + * + * @param string $timeZone + * @return boolean + */ + public function isValidWindowsTimeZoneId($timeZone) + { + return array_key_exists(html_entity_decode($timeZone), self::$windowsTimeZonesMap); + } + + /** + * Parses a duration and applies it to a date + * + * @param string $date + * @param string $duration + * @param string $format + * @return integer|\DateTime + */ + protected function parseDuration($date, $duration, $format = self::UNIX_FORMAT) + { + $dateTime = date_create($date); + $dateTime->modify("{$duration->y} year"); + $dateTime->modify("{$duration->m} month"); + $dateTime->modify("{$duration->d} day"); + $dateTime->modify("{$duration->h} hour"); + $dateTime->modify("{$duration->i} minute"); + $dateTime->modify("{$duration->s} second"); + + if (is_null($format)) { + $output = $dateTime; + } elseif ($format === self::UNIX_FORMAT) { + $output = $dateTime->getTimestamp(); + } else { + $output = $dateTime->format($format); + } + + return $output; + } + + /** + * Removes unprintable ASCII and UTF-8 characters + * + * @param string $data + * @return string + */ + protected function removeUnprintableChars($data) + { + return preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $data); + } + + /** + * Provides a polyfill for PHP 7.2's `mb_chr()`, which is a multibyte safe version of `chr()`. + * Multibyte safe. + * + * @param integer $code + * @return string + */ + protected function mb_chr($code) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps + { + if (function_exists('mb_chr')) { + return mb_chr($code); + } else { + if (($code %= 0x200000) < 0x80) { + $s = chr($code); + } elseif ($code < 0x800) { + $s = chr(0xc0 | $code >> 6) . chr(0x80 | $code & 0x3f); + } elseif ($code < 0x10000) { + $s = chr(0xe0 | $code >> 12) . chr(0x80 | $code >> 6 & 0x3f) . chr(0x80 | $code & 0x3f); + } else { + $s = chr(0xf0 | $code >> 18) . chr(0x80 | $code >> 12 & 0x3f) . chr(0x80 | $code >> 6 & 0x3f) . chr(0x80 | $code & 0x3f); + } + + return $s; + } + } + + /** + * Replace all occurrences of the search string with the replacement string. + * Multibyte safe. + * + * @param string|array $search + * @param string|array $replace + * @param string|array $subject + * @param string $encoding + * @param integer $count + * @return array|string + */ + protected static function mb_str_replace($search, $replace, $subject, $encoding = null, &$count = 0) // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps + { + if (is_array($subject)) { + // Call `mb_str_replace()` for each subject in the array, recursively + foreach ($subject as $key => $value) { + $subject[$key] = self::mb_str_replace($search, $replace, $value, $encoding, $count); + } + } else { + // Normalize $search and $replace so they are both arrays of the same length + $searches = is_array($search) ? array_values($search) : array($search); + $replacements = is_array($replace) ? array_values($replace) : array($replace); + $replacements = array_pad($replacements, count($searches), ''); + + foreach ($searches as $key => $search) { + if (is_null($encoding)) { + $encoding = mb_detect_encoding($search, 'UTF-8', true); + } + + $replace = $replacements[$key]; + $searchLen = mb_strlen($search, $encoding); + + $sb = array(); + while (($offset = mb_strpos($subject, $search, 0, $encoding)) !== false) { + $sb[] = mb_substr($subject, 0, $offset, $encoding); + $subject = mb_substr($subject, $offset + $searchLen, null, $encoding); + ++$count; + } + + $sb[] = $subject; + $subject = implode($replace, $sb); + } + } + + return $subject; + } + + /** + * Places double-quotes around texts that have characters not permitted + * in parameter-texts, but are permitted in quoted-texts. + * + * @param string $candidateText + * @return string + */ + protected function escapeParamText($candidateText) + { + if (strpbrk($candidateText, ':;,') !== false) { + return '"' . $candidateText . '"'; + } + + return $candidateText; + } + + /** + * Replaces curly quotes and other special characters + * with their standard equivalents + * + * @param string $data + * @return string + */ + protected function cleanData($data) + { + $replacementChars = array( + "\xe2\x80\x98" => "'", // ‘ + "\xe2\x80\x99" => "'", // ’ + "\xe2\x80\x9a" => "'", // ‚ + "\xe2\x80\x9b" => "'", // ‛ + "\xe2\x80\x9c" => '"', // “ + "\xe2\x80\x9d" => '"', // ” + "\xe2\x80\x9e" => '"', // „ + "\xe2\x80\x9f" => '"', // ‟ + "\xe2\x80\x93" => '-', // – + "\xe2\x80\x94" => '--', // — + "\xe2\x80\xa6" => '...', // … + "\xc2\xa0" => ' ', + ); + // Replace UTF-8 characters + $cleanedData = strtr($data, $replacementChars); + + // Replace Windows-1252 equivalents + $charsToReplace = array_map(function ($code) { + return $this->mb_chr($code); + }, array(133, 145, 146, 147, 148, 150, 151, 194)); + $cleanedData = $this->mb_str_replace($charsToReplace, $replacementChars, $cleanedData); + + return $cleanedData; + } + + /** + * Parses a list of excluded dates + * to be applied to an Event + * + * @param array $event + * @return array + */ + public function parseExdates(array $event) + { + if (empty($event['EXDATE_array'])) { + return array(); + } else { + $exdates = $event['EXDATE_array']; + } + + $output = array(); + $currentTimeZone = new \DateTimeZone($this->defaultTimeZone); + + foreach ($exdates as $subArray) { + end($subArray); + $finalKey = key($subArray); + + foreach (array_keys($subArray) as $key) { + if ($key === 'TZID') { + $currentTimeZone = $this->timeZoneStringToDateTimeZone($subArray[$key]); + } elseif (is_numeric($key)) { + $icalDate = $subArray[$key]; + + if (substr($icalDate, -1) === 'Z') { + $currentTimeZone = new \DateTimeZone(self::TIME_ZONE_UTC); + } + + $output[] = new \DateTime($icalDate, $currentTimeZone); + + if ($key === $finalKey) { + // Reset to default + $currentTimeZone = new \DateTimeZone($this->defaultTimeZone); + } + } + } + } + + return $output; + } + + /** + * Checks if a date string is a valid date + * + * @param string $value + * @return boolean + * @throws \Exception + */ + public function isValidDate($value) + { + if (!$value) { + return false; + } + + try { + new \DateTime($value); + + return true; + } catch (\Exception $exception) { + return false; + } + } + + /** + * Checks if a filename exists as a file or URL + * + * @param string $filename + * @return boolean + */ + protected function isFileOrUrl($filename) + { + return (file_exists($filename) || filter_var($filename, FILTER_VALIDATE_URL)) ?: false; + } + + /** + * Reads an entire file or URL into an array + * + * @param string $filename + * @return array + * @throws \Exception + */ + protected function fileOrUrl($filename) + { + $options = array(); + if (!empty($this->httpBasicAuth) || !empty($this->httpUserAgent) || !empty($this->httpAcceptLanguage)) { + $options['http'] = array(); + $options['http']['header'] = array(); + + if (!empty($this->httpBasicAuth)) { + $username = $this->httpBasicAuth['username']; + $password = $this->httpBasicAuth['password']; + $basicAuth = base64_encode("{$username}:{$password}"); + + array_push($options['http']['header'], "Authorization: Basic {$basicAuth}"); + } + + if (!empty($this->httpUserAgent)) { + array_push($options['http']['header'], "User-Agent: {$this->httpUserAgent}"); + } + + if (!empty($this->httpAcceptLanguage)) { + array_push($options['http']['header'], "Accept-language: {$this->httpAcceptLanguage}"); + } + } + + $context = stream_context_create($options); + + // phpcs:ignore CustomPHPCS.ControlStructures.AssignmentInCondition + if (($lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES, $context)) === false) { + throw new \Exception("The file path or URL '{$filename}' does not exist."); + } + + return $lines; + } + + /** + * Returns a `DateTimeZone` object based on a string containing a time zone name. + * Falls back to the default time zone if string passed not a recognised time zone. + * + * @param string $timeZoneString + * @return \DateTimeZone + */ + public function timeZoneStringToDateTimeZone($timeZoneString) + { + // Some time zones contain characters that are not permitted in param-texts, + // but are within quoted texts. We need to remove the quotes as they're not + // actually part of the time zone. + $timeZoneString = trim($timeZoneString, '"'); + $timeZoneString = html_entity_decode($timeZoneString); + + if ($this->isValidIanaTimeZoneId($timeZoneString)) { + return new \DateTimeZone($timeZoneString); + } + + if ($this->isValidCldrTimeZoneId($timeZoneString)) { + return new \DateTimeZone(self::$cldrTimeZonesMap[$timeZoneString]); + } + + if ($this->isValidWindowsTimeZoneId($timeZoneString)) { + return new \DateTimeZone(self::$windowsTimeZonesMap[$timeZoneString]); + } + + return new \DateTimeZone($this->defaultTimeZone); + } +} diff --git a/app/vendor/johngrogg/ics-parser/tests/RecurrencesTest.php b/app/vendor/johngrogg/ics-parser/tests/RecurrencesTest.php new file mode 100755 index 0000000..6b3b2ef --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/tests/RecurrencesTest.php @@ -0,0 +1,531 @@ +originalTimeZone = date_default_timezone_get(); + } + + public function tearDown() + { + date_default_timezone_set($this->originalTimeZone); + } + + public function testYearlyFullDayTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + array('index' => 1, 'dateString' => '20010301T000000', 'message' => '2nd event, CET: '), + array('index' => 2, 'dateString' => '20020301T000000', 'message' => '3rd event, CET: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000302', + 'RRULE:FREQ=YEARLY;WKST=SU;COUNT=3', + ), + 3, + $checks + ); + } + + public function testMonthlyFullDayTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + array('index' => 1, 'dateString' => '20000401T000000', 'message' => '2nd event, CEST: '), + array('index' => 2, 'dateString' => '20000501T000000', 'message' => '3rd event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000302', + 'RRULE:FREQ=MONTHLY;BYMONTHDAY=1;WKST=SU;COUNT=3', + ), + 3, + $checks + ); + } + + public function testMonthlyFullDayTimeZoneBerlinSummerTime() + { + $checks = array( + array('index' => 0, 'dateString' => '20180701', 'message' => '1st event, CEST: '), + array('index' => 1, 'dateString' => '20180801T000000', 'message' => '2nd event, CEST: '), + array('index' => 2, 'dateString' => '20180901T000000', 'message' => '3rd event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;VALUE=DATE:20180701', + 'DTEND;VALUE=DATE:20180702', + 'RRULE:FREQ=MONTHLY;BYMONTHDAY=1;WKST=SU;COUNT=3', + ), + 3, + $checks + ); + } + + public function testMonthlyFullDayTimeZoneBerlinFromFile() + { + $checks = array( + array('index' => 0, 'dateString' => '20180701', 'message' => '1st event, CEST: '), + array('index' => 1, 'dateString' => '20180801T000000', 'message' => '2nd event, CEST: '), + array('index' => 2, 'dateString' => '20180901T000000', 'message' => '3rd event, CEST: '), + ); + $this->assertEventFile( + 'Europe/Berlin', + './tests/ical/ical-monthly.ics', + 25, + $checks + ); + } + + public function testIssue196FromFile() + { + $checks = array( + array('index' => 0, 'dateString' => '20191105T190000', 'timezone' => 'Europe/Berlin', 'message' => '1st event, CEST: '), + array('index' => 1, 'dateString' => '20191106T190000', 'timezone' => 'Europe/Berlin', 'message' => '2nd event, CEST: '), + array('index' => 2, 'dateString' => '20191107T190000', 'timezone' => 'Europe/Berlin', 'message' => '3rd event, CEST: '), + array('index' => 3, 'dateString' => '20191108T190000', 'timezone' => 'Europe/Berlin', 'message' => '4th event, CEST: '), + array('index' => 4, 'dateString' => '20191109T170000', 'timezone' => 'Europe/Berlin', 'message' => '5th event, CEST: '), + array('index' => 5, 'dateString' => '20191110T180000', 'timezone' => 'Europe/Berlin', 'message' => '6th event, CEST: '), + ); + $this->assertEventFile( + 'UTC', + './tests/ical/issue-196.ics', + 7, + $checks + ); + } + + public function testWeeklyFullDayTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + array('index' => 1, 'dateString' => '20000308T000000', 'message' => '2nd event, CET: '), + array('index' => 2, 'dateString' => '20000315T000000', 'message' => '3rd event, CET: '), + array('index' => 3, 'dateString' => '20000322T000000', 'message' => '4th event, CET: '), + array('index' => 4, 'dateString' => '20000329T000000', 'message' => '5th event, CEST: '), + array('index' => 5, 'dateString' => '20000405T000000', 'message' => '6th event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000302', + 'RRULE:FREQ=WEEKLY;WKST=SU;COUNT=6', + ), + 6, + $checks + ); + } + + public function testDailyFullDayTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + array('index' => 1, 'dateString' => '20000302T000000', 'message' => '2nd event, CET: '), + array('index' => 30, 'dateString' => '20000331T000000', 'message' => '31st event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000302', + 'RRULE:FREQ=DAILY;WKST=SU;COUNT=31', + ), + 31, + $checks + ); + } + + public function testWeeklyFullDayTimeZoneBerlinLocal() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301T000000', 'message' => '1st event, CET: '), + array('index' => 1, 'dateString' => '20000308T000000', 'message' => '2nd event, CET: '), + array('index' => 2, 'dateString' => '20000315T000000', 'message' => '3rd event, CET: '), + array('index' => 3, 'dateString' => '20000322T000000', 'message' => '4th event, CET: '), + array('index' => 4, 'dateString' => '20000329T000000', 'message' => '5th event, CEST: '), + array('index' => 5, 'dateString' => '20000405T000000', 'message' => '6th event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;TZID=Europe/Berlin:20000301T000000', + 'DTEND;TZID=Europe/Berlin:20000302T000000', + 'RRULE:FREQ=WEEKLY;WKST=SU;COUNT=6', + ), + 6, + $checks + ); + } + + public function testRFCDaily10NewYork() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'timezone' => 'America/New_York', 'message' => '1st event, EDT: '), + array('index' => 1, 'dateString' => '19970903T090000', 'timezone' => 'America/New_York', 'message' => '2nd event, EDT: '), + array('index' => 9, 'dateString' => '19970911T090000', 'timezone' => 'America/New_York', 'message' => '10th event, EDT: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;COUNT=10', + ), + 10, + $checks + ); + } + + public function testRFCDaily10Berlin() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'timezone' => 'Europe/Berlin', 'message' => '1st event, CEST: '), + array('index' => 1, 'dateString' => '19970903T090000', 'timezone' => 'Europe/Berlin', 'message' => '2nd event, CEST: '), + array('index' => 9, 'dateString' => '19970911T090000', 'timezone' => 'Europe/Berlin', 'message' => '10th event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART;TZID=Europe/Berlin:19970902T090000', + 'RRULE:FREQ=DAILY;COUNT=10', + ), + 10, + $checks + ); + } + + public function testStartDateIsExdateUsingUntil() + { + $checks = array( + array('index' => 0, 'dateString' => '20190918T095000', 'timezone' => 'Europe/London', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20191002T095000', 'timezone' => 'Europe/London', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20191016T095000', 'timezone' => 'Europe/London', 'message' => '3rd event: '), + ); + $this->assertVEVENT( + 'Europe/London', + array( + 'DTSTART;TZID=Europe/London:20190911T095000', + 'RRULE:FREQ=WEEKLY;WKST=SU;UNTIL=20191027T235959Z;BYDAY=WE', + 'EXDATE;TZID=Europe/London:20191023T095000', + 'EXDATE;TZID=Europe/London:20191009T095000', + 'EXDATE;TZID=Europe/London:20190925T095000', + 'EXDATE;TZID=Europe/London:20190911T095000', + ), + 3, + $checks + ); + } + + public function testStartDateIsExdateUsingCount() + { + $checks = array( + array('index' => 0, 'dateString' => '20190918T095000', 'timezone' => 'Europe/London', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20191002T095000', 'timezone' => 'Europe/London', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20191016T095000', 'timezone' => 'Europe/London', 'message' => '3rd event: '), + ); + $this->assertVEVENT( + 'Europe/London', + array( + 'DTSTART;TZID=Europe/London:20190911T095000', + 'RRULE:FREQ=WEEKLY;WKST=SU;COUNT=7;BYDAY=WE', + 'EXDATE;TZID=Europe/London:20191023T095000', + 'EXDATE;TZID=Europe/London:20191009T095000', + 'EXDATE;TZID=Europe/London:20190925T095000', + 'EXDATE;TZID=Europe/London:20190911T095000', + ), + 3, + $checks + ); + } + + public function testCountWithExdate() + { + $checks = array( + array('index' => 0, 'dateString' => '20200323T050000', 'timezone' => 'Europe/Paris', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20200324T050000', 'timezone' => 'Europe/Paris', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20200327T050000', 'timezone' => 'Europe/Paris', 'message' => '3rd event: '), + ); + $this->assertVEVENT( + 'Europe/London', + array( + 'DTSTART;TZID=Europe/Paris:20200323T050000', + 'DTEND;TZID=Europe/Paris:20200323T070000', + 'RRULE:FREQ=DAILY;COUNT=5', + 'EXDATE;TZID=Europe/Paris:20200326T050000', + 'EXDATE;TZID=Europe/Paris:20200325T050000', + 'DTSTAMP:20200318T141057Z', + ), + 3, + $checks + ); + } + + public function testRFCDaily10BerlinFromNewYork() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'timezone' => 'Europe/Berlin', 'message' => '1st event, CEST: '), + array('index' => 1, 'dateString' => '19970903T090000', 'timezone' => 'Europe/Berlin', 'message' => '2nd event, CEST: '), + array('index' => 9, 'dateString' => '19970911T090000', 'timezone' => 'Europe/Berlin', 'message' => '10th event, CEST: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=Europe/Berlin:19970902T090000', + 'RRULE:FREQ=DAILY;COUNT=10', + ), + 10, + $checks + ); + } + + public function testExdatesInDifferentTimezone() + { + $checks = array( + array('index' => 0, 'dateString' => '20170503T190000', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20170510T190000', 'message' => '2nd event: '), + array('index' => 9, 'dateString' => '20170712T190000', 'message' => '10th event: '), + array('index' => 19, 'dateString' => '20171004T190000', 'message' => '20th event: '), + ); + $this->assertVEVENT( + 'America/Chicago', + array( + 'DTSTART;TZID=America/Chicago:20170503T190000', + 'RRULE:FREQ=WEEKLY;BYDAY=WE;WKST=SU;UNTIL=20180101', + 'EXDATE:20170601T000000Z', + 'EXDATE:20170803T000000Z', + 'EXDATE:20170824T000000Z', + 'EXDATE:20171026T000000Z', + 'EXDATE:20171102T000000Z', + 'EXDATE:20171123T010000Z', + 'EXDATE:20171221T010000Z', + ), + 28, + $checks + ); + } + + public function testYearlyWithBySetPos() + { + $checks = array( + array('index' => 0, 'dateString' => '19970306T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970313T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970325T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19980305T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19980312T090000', 'message' => '5th occurrence: '), + array('index' => 5, 'dateString' => '19980326T090000', 'message' => '6th occurrence: '), + array('index' => 9, 'dateString' => '20000307T090000', 'message' => '10th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970306T090000', + 'RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=3;BYDAY=TU,TH;BYSETPOS=2,4,-2', + ), + 10, + $checks + ); + } + + public function testDailyWithByMonthDay() + { + $checks = array( + array('index' => 0, 'dateString' => '20000206T120000', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20000211T120000', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20000216T120000', 'message' => '3rd event: '), + array('index' => 4, 'dateString' => '20000226T120000', 'message' => '5th event, transition from February to March: '), + array('index' => 5, 'dateString' => '20000301T120000', 'message' => '6th event, transition to March from February: '), + array('index' => 11, 'dateString' => '20000331T120000', 'message' => '12th event, transition from March to April: '), + array('index' => 12, 'dateString' => '20000401T120000', 'message' => '13th event, transition to April from March: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART:20000206T120000', + 'DTEND:20000206T130000', + 'RRULE:FREQ=DAILY;BYMONTHDAY=1,6,11,16,21,26,31;COUNT=16', + ), + 16, + $checks + ); + } + + public function testYearlyWithByMonthDay() + { + $checks = array( + array('index' => 0, 'dateString' => '20001214T120000', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20001221T120000', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20010107T120000', 'message' => '3rd event: '), + array('index' => 3, 'dateString' => '20010114T120000', 'message' => '4th event: '), + array('index' => 6, 'dateString' => '20010214T120000', 'message' => '7th event: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART:20001214T120000', + 'DTEND:20001214T130000', + 'RRULE:FREQ=YEARLY;BYMONTHDAY=7,14,21;COUNT=8', + ), + 8, + $checks + ); + } + + public function testYearlyWithByMonthDayAndByDay() + { + $checks = array( + array('index' => 0, 'dateString' => '20001214T120000', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20001221T120000', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20010607T120000', 'message' => '3rd event: '), + array('index' => 3, 'dateString' => '20010614T120000', 'message' => '4th event: '), + array('index' => 6, 'dateString' => '20020214T120000', 'message' => '7th event: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART:20001214T120000', + 'DTEND:20001214T130000', + 'RRULE:FREQ=YEARLY;BYMONTHDAY=7,14,21;BYDAY=TH;COUNT=8', + ), + 8, + $checks + ); + } + + public function testYearlyWithByMonthAndByMonthDay() + { + $checks = array( + array('index' => 0, 'dateString' => '20001214T120000', 'message' => '1st event: '), + array('index' => 1, 'dateString' => '20001221T120000', 'message' => '2nd event: '), + array('index' => 2, 'dateString' => '20010607T120000', 'message' => '3rd event: '), + array('index' => 3, 'dateString' => '20010614T120000', 'message' => '4th event: '), + array('index' => 6, 'dateString' => '20011214T120000', 'message' => '7th event: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + array( + 'DTSTART:20001214T120000', + 'DTEND:20001214T130000', + 'RRULE:FREQ=YEARLY;BYMONTH=12,6;BYMONTHDAY=7,14,21;COUNT=8', + ), + 8, + $checks + ); + } + + public function assertVEVENT($defaultTimezone, $veventParts, $count, $checks) + { + $options = $this->getOptions($defaultTimezone); + + $testIcal = implode(PHP_EOL, $this->getIcalHeader()); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->formatIcalEvent($veventParts)); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->getIcalFooter()); + + $ical = new ICal(false, $options); + $ical->initString($testIcal); + + $events = $ical->events(); + + $this->assertCount($count, $events); + + foreach ($checks as $check) { + $this->assertEvent($events[$check['index']], $check['dateString'], $check['message'], isset($check['timezone']) ? $check['timezone'] : $defaultTimezone); + } + } + + public function assertEventFile($defaultTimezone, $file, $count, $checks) + { + $options = $this->getOptions($defaultTimezone); + + $ical = new ICal($file, $options); + + $events = $ical->events(); + + $this->assertCount($count, $events); + + $events = $ical->sortEventsWithOrder($events); + + foreach ($checks as $check) { + $this->assertEvent($events[$check['index']], $check['dateString'], $check['message'], isset($check['timezone']) ? $check['timezone'] : $defaultTimezone); + } + } + + public function assertEvent($event, $expectedDateString, $message, $timeZone = null) + { + if (!is_null($timeZone)) { + date_default_timezone_set($timeZone); + } + + $expectedTimeStamp = strtotime($expectedDateString); + + $this->assertEquals($expectedTimeStamp, $event->dtstart_array[2], $message . 'timestamp mismatch (expected ' . $expectedDateString . ' vs actual ' . $event->dtstart . ')'); + $this->assertAttributeEquals($expectedDateString, 'dtstart', $event, $message . 'dtstart mismatch (timestamp is okay)'); + } + + public function getOptions($defaultTimezone) + { + $options = array( + 'defaultSpan' => 2, // Default value + 'defaultTimeZone' => $defaultTimezone, // Default value: UTC + 'defaultWeekStart' => 'MO', // Default value + 'disableCharacterReplacement' => false, // Default value + 'filterDaysAfter' => null, // Default value + 'filterDaysBefore' => null, // Default value + 'skipRecurrence' => false, // Default value + ); + + return $options; + } + + public function formatIcalEvent($veventParts) + { + return array_merge( + array( + 'BEGIN:VEVENT', + 'CREATED:' . gmdate('Ymd\THis\Z'), + 'UID:M2CD-1-1-5FB000FB-BBE4-4F3F-9E7E-217F1FF97209', + ), + $veventParts, + array( + 'SUMMARY:test', + 'LAST-MODIFIED:' . gmdate('Ymd\THis\Z', filemtime(__FILE__)), + 'END:VEVENT', + ) + ); + } + + public function getIcalHeader() + { + return array( + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Google Inc//Google Calendar 70.9054//EN', + 'X-WR-CALNAME:Private', + 'X-APPLE-CALENDAR-COLOR:#FF2968', + 'X-WR-CALDESC:', + ); + } + + public function getIcalFooter() + { + return array('END:VCALENDAR'); + } +} diff --git a/app/vendor/johngrogg/ics-parser/tests/SingleEventsTest.php b/app/vendor/johngrogg/ics-parser/tests/SingleEventsTest.php new file mode 100755 index 0000000..3794c1f --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/tests/SingleEventsTest.php @@ -0,0 +1,501 @@ +originalTimeZone = date_default_timezone_get(); + } + + public function tearDown() + { + date_default_timezone_set($this->originalTimeZone); + } + + public function testFullDayTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000302', + 1, + $checks + ); + } + + public function testSeveralFullDaysTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20000301', 'message' => '1st event, CET: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + 'DTSTART;VALUE=DATE:20000301', + 'DTEND;VALUE=DATE:20000304', + 1, + $checks + ); + } + + public function testEventTimeZoneUTC() + { + $checks = array( + array('index' => 0, 'dateString' => '20180626T070000Z', 'message' => '1st event, UTC: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + 'DTSTART:20180626T070000Z', + 'DTEND:20180626T110000Z', + 1, + $checks + ); + } + + public function testEventTimeZoneBerlin() + { + $checks = array( + array('index' => 0, 'dateString' => '20180626T070000', 'message' => '1st event, CEST: '), + ); + $this->assertVEVENT( + 'Europe/Berlin', + 'DTSTART:20180626T070000', + 'DTEND:20180626T110000', + 1, + $checks + ); + } + + public function assertVEVENT($defaultTimezone, $dtstart, $dtend, $count, $checks) + { + $options = $this->getOptions($defaultTimezone); + + $testIcal = implode(PHP_EOL, $this->getIcalHeader()); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->formatIcalEvent($dtstart, $dtend)); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->getIcalTimezones()); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->getIcalFooter()); + + date_default_timezone_set('UTC'); + + $ical = new ICal(false, $options); + $ical->initString($testIcal); + + $events = $ical->events(); + + $this->assertCount($count, $events); + + foreach ($checks as $check) { + $this->assertEvent( + $events[$check['index']], + $check['dateString'], + $check['message'], + isset($check['timezone']) ? $check['timezone'] : $defaultTimezone + ); + } + } + + public function getOptions($defaultTimezone) + { + $options = array( + 'defaultSpan' => 2, // Default value + 'defaultTimeZone' => $defaultTimezone, // Default value: UTC + 'defaultWeekStart' => 'MO', // Default value + 'disableCharacterReplacement' => false, // Default value + 'filterDaysAfter' => null, // Default value + 'filterDaysBefore' => null, // Default value + 'skipRecurrence' => false, // Default value + ); + + return $options; + } + + public function getIcalHeader() + { + return array( + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Google Inc//Google Calendar 70.9054//EN', + 'X-WR-CALNAME:Private', + 'X-APPLE-CALENDAR-COLOR:#FF2968', + 'X-WR-CALDESC:', + ); + } + + public function formatIcalEvent($dtstart, $dtend) + { + return array( + 'BEGIN:VEVENT', + 'CREATED:20090213T195947Z', + 'UID:M2CD-1-1-5FB000FB-BBE4-4F3F-9E7E-217F1FF97209', + $dtstart, + $dtend, + 'SUMMARY:test', + 'LAST-MODIFIED:20110429T222101Z', + 'DTSTAMP:20170630T105724Z', + 'SEQUENCE:0', + 'END:VEVENT', + ); + } + + public function getIcalTimezones() + { + return array( + 'BEGIN:VTIMEZONE', + 'TZID:Europe/Berlin', + 'X-LIC-LOCATION:Europe/Berlin', + 'BEGIN:STANDARD', + 'DTSTART:18930401T000000', + 'RDATE:18930401T000000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+005328', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19160430T230000', + 'RDATE:19160430T230000', + 'RDATE:19400401T020000', + 'RDATE:19430329T020000', + 'RDATE:19460414T020000', + 'RDATE:19470406T030000', + 'RDATE:19480418T020000', + 'RDATE:19490410T020000', + 'RDATE:19800406T020000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19161001T010000', + 'RDATE:19161001T010000', + 'RDATE:19421102T030000', + 'RDATE:19431004T030000', + 'RDATE:19441002T030000', + 'RDATE:19451118T030000', + 'RDATE:19461007T030000', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19170416T020000', + 'RRULE:FREQ=YEARLY;UNTIL=19180415T010000Z;BYMONTH=4;BYDAY=3MO', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19170917T030000', + 'RRULE:FREQ=YEARLY;UNTIL=19180916T010000Z;BYMONTH=9;BYDAY=3MO', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19440403T020000', + 'RRULE:FREQ=YEARLY;UNTIL=19450402T010000Z;BYMONTH=4;BYDAY=1MO', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:DAYLIGHT', + 'DTSTART:19450524T020000', + 'RDATE:19450524T020000', + 'RDATE:19470511T030000', + 'TZNAME:CEMT', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0300', + 'END:DAYLIGHT', + 'BEGIN:DAYLIGHT', + 'DTSTART:19450924T030000', + 'RDATE:19450924T030000', + 'RDATE:19470629T030000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0300', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19460101T000000', + 'RDATE:19460101T000000', + 'RDATE:19800101T000000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19471005T030000', + 'RRULE:FREQ=YEARLY;UNTIL=19491002T010000Z;BYMONTH=10;BYDAY=1SU', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19800928T030000', + 'RRULE:FREQ=YEARLY;UNTIL=19950924T010000Z;BYMONTH=9;BYDAY=-1SU', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19810329T020000', + 'RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19961027T030000', + 'RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'END:VTIMEZONE', + 'BEGIN:VTIMEZONE', + 'TZID:Europe/Paris', + 'X-LIC-LOCATION:Europe/Paris', + 'BEGIN:STANDARD', + 'DTSTART:18910315T000100', + 'RDATE:18910315T000100', + 'TZNAME:PMT', + 'TZOFFSETFROM:+000921', + 'TZOFFSETTO:+000921', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19110311T000100', + 'RDATE:19110311T000100', + 'TZNAME:WEST', + 'TZOFFSETFROM:+000921', + 'TZOFFSETTO:+0000', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19160614T230000', + 'RDATE:19160614T230000', + 'RDATE:19170324T230000', + 'RDATE:19180309T230000', + 'RDATE:19190301T230000', + 'RDATE:19200214T230000', + 'RDATE:19210314T230000', + 'RDATE:19220325T230000', + 'RDATE:19230526T230000', + 'RDATE:19240329T230000', + 'RDATE:19250404T230000', + 'RDATE:19260417T230000', + 'RDATE:19270409T230000', + 'RDATE:19280414T230000', + 'RDATE:19290420T230000', + 'RDATE:19300412T230000', + 'RDATE:19310418T230000', + 'RDATE:19320402T230000', + 'RDATE:19330325T230000', + 'RDATE:19340407T230000', + 'RDATE:19350330T230000', + 'RDATE:19360418T230000', + 'RDATE:19370403T230000', + 'RDATE:19380326T230000', + 'RDATE:19390415T230000', + 'RDATE:19400225T020000', + 'TZNAME:WEST', + 'TZOFFSETFROM:+0000', + 'TZOFFSETTO:+0100', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19161002T000000', + 'RRULE:FREQ=YEARLY;UNTIL=19191005T230000Z;BYMONTH=10;BYMONTHDAY=2,3,4,5,6,', + ' 7,8;BYDAY=MO', + 'TZNAME:WET', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0000', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19201024T000000', + 'RDATE:19201024T000000', + 'RDATE:19211026T000000', + 'RDATE:19391119T000000', + 'TZNAME:WET', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0000', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19221008T000000', + 'RRULE:FREQ=YEARLY;UNTIL=19381001T230000Z;BYMONTH=10;BYMONTHDAY=2,3,4,5,6,', + ' 7,8;BYDAY=SU', + 'TZNAME:WET', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0000', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19400614T230000', + 'RDATE:19400614T230000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19421102T030000', + 'RDATE:19421102T030000', + 'RDATE:19431004T030000', + 'RDATE:19760926T010000', + 'RDATE:19770925T030000', + 'RDATE:19781001T030000', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19430329T020000', + 'RDATE:19430329T020000', + 'RDATE:19440403T020000', + 'RDATE:19760328T010000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19440825T000000', + 'RDATE:19440825T000000', + 'TZNAME:WEST', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0200', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19441008T010000', + 'RDATE:19441008T010000', + 'TZNAME:WEST', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:DAYLIGHT', + 'BEGIN:DAYLIGHT', + 'DTSTART:19450402T020000', + 'RDATE:19450402T020000', + 'TZNAME:WEMT', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19450916T030000', + 'RDATE:19450916T030000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:STANDARD', + 'DTSTART:19770101T000000', + 'RDATE:19770101T000000', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19770403T020000', + 'RRULE:FREQ=YEARLY;UNTIL=19800406T010000Z;BYMONTH=4;BYDAY=1SU', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19790930T030000', + 'RRULE:FREQ=YEARLY;UNTIL=19950924T010000Z;BYMONTH=9;BYDAY=-1SU', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19810329T020000', + 'RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU', + 'TZNAME:CEST', + 'TZOFFSETFROM:+0100', + 'TZOFFSETTO:+0200', + 'END:DAYLIGHT', + 'BEGIN:STANDARD', + 'DTSTART:19961027T030000', + 'RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU', + 'TZNAME:CET', + 'TZOFFSETFROM:+0200', + 'TZOFFSETTO:+0100', + 'END:STANDARD', + 'END:VTIMEZONE', + 'BEGIN:VTIMEZONE', + 'TZID:US-Eastern', + 'LAST-MODIFIED:19870101T000000Z', + 'TZURL:http://zones.stds_r_us.net/tz/US-Eastern', + 'BEGIN:STANDARD', + 'DTSTART:19671029T020000', + 'RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10', + 'TZOFFSETFROM:-0400', + 'TZOFFSETTO:-0500', + 'TZNAME:EST', + 'END:STANDARD', + 'BEGIN:DAYLIGHT', + 'DTSTART:19870405T020000', + 'RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4', + 'TZOFFSETFROM:-0500', + 'TZOFFSETTO:-0400', + 'TZNAME:EDT', + 'END:DAYLIGHT', + 'END:VTIMEZONE', + ); + } + + public function getIcalFooter() + { + return array('END:VCALENDAR'); + } + + public function assertEvent($event, $expectedDateString, $message, $timezone = null) + { + if ($timezone !== null) { + date_default_timezone_set($timezone); + } + + $expectedTimeStamp = strtotime($expectedDateString); + + $this->assertEquals( + $expectedTimeStamp, + $event->dtstart_array[2], + $message . 'timestamp mismatch (expected ' . $expectedDateString . ' vs actual ' . $event->dtstart . ')' + ); + $this->assertAttributeEquals( + $expectedDateString, + 'dtstart', + $event, + $message . 'dtstart mismatch (timestamp is okay)' + ); + } + + public function assertEventFile($defaultTimezone, $file, $count, $checks) + { + $options = $this->getOptions($defaultTimezone); + + date_default_timezone_set('UTC'); + + $ical = new ICal($file, $options); + + $events = $ical->events(); + + $this->assertCount($count, $events); + + foreach ($checks as $check) { + $this->assertEvent( + $events[$check['index']], + $check['dateString'], + $check['message'], + isset($check['timezone']) ? $check['timezone'] : $defaultTimezone + ); + } + } +} diff --git a/app/vendor/johngrogg/ics-parser/tests/ical/ical-monthly.ics b/app/vendor/johngrogg/ics-parser/tests/ical/ical-monthly.ics new file mode 100755 index 0000000..9ac5494 --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/tests/ical/ical-monthly.ics @@ -0,0 +1,18 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:Private +X-APPLE-CALENDAR-COLOR:#FF2968 +X-WR-CALDESC: +BEGIN:VEVENT +CREATED:20090213T195947Z +UID:M2CD-1-1-5FB000FB-BBE4-4F3F-9E7E-217F1FF97208 +RRULE:FREQ=MONTHLY;BYMONTHDAY=1;WKST=SU;COUNT=25 +DTSTART;VALUE=DATE:20180701 +DTEND;VALUE=DATE:20180702 +SUMMARY:Monthly +LAST-MODIFIED:20110429T222101Z +DTSTAMP:20170630T105724Z +SEQUENCE:0 +END:VEVENT +END:VCALENDAR diff --git a/app/vendor/johngrogg/ics-parser/tests/ical/issue-196.ics b/app/vendor/johngrogg/ics-parser/tests/ical/issue-196.ics new file mode 100755 index 0000000..7603969 --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/tests/ical/issue-196.ics @@ -0,0 +1,64 @@ +BEGIN:VCALENDAR +PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN +VERSION:2.0 +X-WR-CALNAME:Test-Calendar +X-WR-TIMEZONE:Europe/Berlin +BEGIN:VTIMEZONE +TZID:Europe/Berlin +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20180101T152047Z +LAST-MODIFIED:20181202T202056Z +DTSTAMP:20181202T202056Z +UID:529b1ea3-8de8-484d-b878-c20c7fb72bf5 +SUMMARY:test +RRULE:FREQ=DAILY;UNTIL=20191111T180000Z +DTSTART;TZID=Europe/Berlin:20191105T190000 +DTEND;TZID=Europe/Berlin:20191105T220000 +TRANSP:OPAQUE +SEQUENCE:24 +X-MOZ-GENERATION:37 +END:VEVENT +BEGIN:VEVENT +CREATED:20181202T202042Z +LAST-MODIFIED:20181202T202053Z +DTSTAMP:20181202T202053Z +UID:529b1ea3-8de8-484d-b878-c20c7fb72bf5 +SUMMARY:test +RECURRENCE-ID;TZID=Europe/Berlin:20191109T190000 +DTSTART;TZID=Europe/Berlin:20191109T170000 +DTEND;TZID=Europe/Berlin:20191109T220000 +TRANSP:OPAQUE +SEQUENCE:25 +X-MOZ-GENERATION:37 +DURATION:PT0S +END:VEVENT +BEGIN:VEVENT +CREATED:20181202T202053Z +LAST-MODIFIED:20181202T202056Z +DTSTAMP:20181202T202056Z +UID:529b1ea3-8de8-484d-b878-c20c7fb72bf5 +SUMMARY:test +RECURRENCE-ID;TZID=Europe/Berlin:20191110T190000 +DTSTART;TZID=Europe/Berlin:20191110T180000 +DTEND;TZID=Europe/Berlin:20191110T220000 +TRANSP:OPAQUE +SEQUENCE:25 +X-MOZ-GENERATION:37 +DURATION:PT0S +END:VEVENT +END:VCALENDAR diff --git a/app/vendor/johngrogg/ics-parser/tests/rfc5545RecurrenceExamplesTest.php b/app/vendor/johngrogg/ics-parser/tests/rfc5545RecurrenceExamplesTest.php new file mode 100755 index 0000000..f4c81d9 --- /dev/null +++ b/app/vendor/johngrogg/ics-parser/tests/rfc5545RecurrenceExamplesTest.php @@ -0,0 +1,1033 @@ +originalTimeZone = date_default_timezone_get(); + } + + public function tearDown() + { + date_default_timezone_set($this->originalTimeZone); + } + + // Page 123, Test 1 :: Daily, 10 Occurences + public function test_page123_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970903T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970904T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;COUNT=10', + ), + 10, + $checks + ); + } + + // Page 123, Test 2 :: Daily, until December 24th + public function test_page123_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970903T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970904T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;UNTIL=19971224T000000Z', + ), + 113, + $checks + ); + } + + // Page 124, Test 1 :: Daily, every other day, Forever + // + // UNTIL rule does not exist in original example + public function test_page124_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970904T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970906T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;INTERVAL=2;UNTIL=19971201Z', + ), + 45, + $checks + ); + } + + // Page 124, Test 2 :: Daily, 10-day intervals, 5 occurrences + public function test_page124_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970912T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970922T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5', + ), + 5, + $checks + ); + } + + // Page 124, Test 3a :: Every January day, for 3 years (Variant A) + public function test_page124_test3a() + { + $checks = array( + array('index' => 0, 'dateString' => '19980101T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19980102T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19980103T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19980101T090000', + 'RRULE:FREQ=YEARLY;UNTIL=20000131T140000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA', + ), + 93, + $checks + ); + } + +/* Requires support for BYMONTH under DAILY [No ticket] + * + // Page 124, Test 3b :: Every January day, for 3 years (Variant B) + public function test_page124_test3b() + { + $checks = array( + array('index' => 0, 'dateString' => '19980101T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19980102T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19980103T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19980101T090000', + 'RRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1', + ), + 93, + $checks + ); + } +*/ + + // Page 124, Test 4 :: Weekly, 10 occurrences + public function test_page124_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970909T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970916T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;COUNT=10', + ), + 10, + $checks + ); + } + + // Page 125, Test 1 :: Weekly, until December 24th + public function test_page125_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970909T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970916T090000', 'message' => '3rd occurrence: '), + array('index' => 16, 'dateString' => '19971223T090000', 'message' => 'last occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z', + ), + 17, + $checks + ); + } + + // Page 125, Test 2 :: Every other week, forever + // + // UNTIL rule does not exist in original example + public function test_page125_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970916T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970930T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971014T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19971028T090000', 'message' => '5th occurrence: '), + array('index' => 5, 'dateString' => '19971111T090000', 'message' => '6th occurrence: '), + array('index' => 6, 'dateString' => '19971125T090000', 'message' => '7th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU;UNTIL=19971201Z', + ), + 7, + $checks + ); + } + + // Page 125, Test 3a :: Tuesday & Thursday every week, for five weeks (Variant A) + public function test_page125_test3a() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970904T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970909T090000', 'message' => '3rd occurrence: '), + array('index' => 9, 'dateString' => '19971002T090000', 'message' => 'final occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH', + ), + 10, + $checks + ); + } + + // Page 125, Test 3b :: Tuesday & Thursday every week, for five weeks (Variant B) + public function test_page125_test3b() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970904T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970909T090000', 'message' => '3rd occurrence: '), + array('index' => 9, 'dateString' => '19971002T090000', 'message' => 'final occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH', + ), + 10, + $checks + ); + } + + // Page 125, Test 4 :: Monday, Wednesday & Friday of every other week until December 24th + public function test_page125_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970901T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970903T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970905T090000', 'message' => '3rd occurrence: '), + array('index' => 24, 'dateString' => '19971222T090000', 'message' => 'final occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970901T090000', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR', + ), + 25, + $checks + ); + } + + // Page 126, Test 1 :: Tuesday & Thursday, every other week, for 8 occurrences + public function test_page126_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970904T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970916T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH', + ), + 8, + $checks + ); + } + + // Page 126, Test 2 :: First Friday of the Month, for 10 occurrences + public function test_page126_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970905T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971003T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971107T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970905T090000', + 'RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR', + ), + 10, + $checks + ); + } + + // Page 126, Test 3 :: First Friday of the Month, until 24th December + public function test_page126_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970905T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971003T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971107T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970905T090000', + 'RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR', + ), + 4, + $checks + ); + } + + // Page 126, Test 4 :: First and last Sunday, every other Month, for 10 occurrences + public function test_page126_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970907T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970928T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971102T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971130T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19980104T090000', 'message' => '5th occurrence: '), + array('index' => 5, 'dateString' => '19980125T090000', 'message' => '6th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970907T090000', + 'RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU', + ), + 10, + $checks + ); + } + + // Page 126, Test 5 :: Second-to-last Monday of the Month, for six months + public function test_page126_test5() + { + $checks = array( + array('index' => 0, 'dateString' => '19970922T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971020T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971117T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970922T090000', + 'RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO', + ), + 6, + $checks + ); + } + + // Page 127, Test 1 :: Third-to-last day of the month, forever + // + // UNTIL rule does not exist in original example. + public function test_page127_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970928T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971029T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971128T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971229T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19980129T090000', 'message' => '5th occurrence: '), + array('index' => 5, 'dateString' => '19980226T090000', 'message' => '6th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970928T090000', + 'RRULE:FREQ=MONTHLY;BYMONTHDAY=-3;UNTIL=19980401', + ), + 7, + $checks + ); + } + + // Page 127, Test 2 :: 2nd and 15th of each Month, for 10 occurrences + public function test_page127_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970915T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971002T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971015T090000', 'message' => '4th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15', + ), + 10, + $checks + ); + } + + // Page 127, Test 3 :: First and last day of the month, for 10 occurrences + public function test_page127_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970930T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971001T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971031T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971101T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19971130T090000', 'message' => '5th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970930T090000', + 'RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1', + ), + 10, + $checks + ); + } + + // Page 127, Test 4 :: 10th through 15th, every 18 months, for 10 occurrences + public function test_page127_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970910T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970911T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970912T090000', 'message' => '3rd occurrence: '), + array('index' => 6, 'dateString' => '19990310T090000', 'message' => '7th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970910T090000', + 'RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15', + ), + 10, + $checks + ); + } + + // Page 127, Test 5 :: Every Tuesday, every other Month, forever + // + // UNTIL rule does not exist in original example. + public function test_page127_test5() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970909T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970916T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU;UNTIL=19980101', + ), + 9, + $checks + ); + } + + // Page 128, Test 1 :: June & July of each Year, for 10 occurrences + public function test_page128_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970610T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970710T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19980610T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970610T090000', + 'RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7', + ), + 10, + $checks + ); + } + + // Page 128, Test 2 :: January, February, & March, every other Year, for 10 occurrences + public function test_page128_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970310T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19990110T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19990210T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970310T090000', + 'RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3', + ), + 10, + $checks + ); + } + + // Page 128, Test 3 :: Every third Year on the 1st, 100th, & 200th day for 10 occurrences + public function test_page128_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970101T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970410T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970719T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970101T090000', + 'RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200', + ), + 10, + $checks + ); + } + + // Page 128, Test 4 :: 20th Monday of a Year, forever + // + // COUNT rule does not exist in original example. + public function test_page128_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970519T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19980518T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19990517T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970519T090000', + 'RRULE:FREQ=YEARLY;BYDAY=20MO;COUNT=4', + ), + 4, + $checks + ); + } + + // Page 129, Test 1 :: Monday of Week 20, where the default start of the week is Monday, forever + // + // COUNT rule does not exist in original example. + public function test_page129_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970512T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19980511T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19990517T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970512T090000', + 'RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO;COUNT=4', + ), + 4, + $checks + ); + } + + // Page 129, Test 2 :: Every Thursday in March, forever + // + // UNTIL rule does not exist in original example. + public function test_page129_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970313T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970320T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970327T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970313T090000', + 'RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH;UNTIL=19990401Z', + ), + 11, + $checks + ); + } + + // Page 129, Test 3 :: Every Thursday in June, July, & August, forever + // + // UNTIL rule does not exist in original example. + public function test_page129_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970605T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970612T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970619T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970605T090000', + 'RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8;UNTIL=19970901Z', + ), + 13, + $checks + ); + } + +/* Requires support for BYMONTHDAY and BYDAY in the same MONTHLY RRULE [No ticket] + * + // Page 129, Test 4 :: Every Friday 13th, forever + // + // COUNT rule does not exist in original example. + public function test_page129_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19980213T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19980313T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19981113T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19990813T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '20001013T090000', 'message' => '5th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'EXDATE;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13;COUNT=5', + ), + 5, + $checks + ); + } +*/ + + // Page 130, Test 1 :: The first Saturday that follows the first Sunday of the month, forever: + // + // COUNT rule does not exist in original example. + public function test_page130_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970913T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971011T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971108T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970913T090000', + 'RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13;COUNT=7', + ), + 7, + $checks + ); + } + + // Page 130, Test 2 :: The first Tuesday after a Monday in November, every 4 Years (U.S. Presidential Election Day), forever + // + // COUNT rule does not exist in original example. + public function test_page130_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19961105T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '20001107T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '20041102T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19961105T090000', + 'RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8;COUNT=4', + ), + 4, + $checks + ); + } + + // Page 130, Test 3 :: Third instance of either a Tuesday, Wednesday, or Thursday of a Month, for 3 months. + public function test_page130_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970904T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971007T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971106T090000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970904T090000', + 'RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3', + ), + 3, + $checks + ); + } + + // Page 130, Test 4 :: Second-to-last weekday of the month, indefinitely + // + // UNTIL rule does not exist in original example. + public function test_page130_test4() + { + $checks = array( + array('index' => 0, 'dateString' => '19970929T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19971030T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19971127T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19971230T090000', 'message' => '4th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970929T090000', + 'RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2;UNTIL=19980101', + ), + 4, + $checks + ); + } + +/* Requires support of HOURLY frequency [#101] + * + // Page 131, Test 1 :: Every 3 hours from 09:00 to 17:00 on a specific day + public function test_page131_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970902T120000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970902T150000', 'message' => '3rd occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z', + ), + 3, + $checks + ); + } +*/ + +/* Requires support of MINUTELY frequency [#101] + * + // Page 131, Test 2 :: Every 15 minutes for 6 occurrences + public function test_page131_test2() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970902T091500', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970902T093000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19970902T094500', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '19970902T100000', 'message' => '5th occurrence: '), + array('index' => 5, 'dateString' => '19970902T101500', 'message' => '6th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6', + ), + 6, + $checks + ); + } +*/ + +/* Requires support of MINUTELY frequency [#101] + * + // Page 131, Test 3 :: Every hour and a half for 4 occurrences + public function test_page131_test3() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970902T103000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970902T120000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19970902T133000', 'message' => '4th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4', + ), + 4, + $checks + ); + } +*/ + +/* Requires support of BYHOUR and BYMINUTE under DAILY [#11] + * + // Page 131, Test 4a :: Every 20 minutes from 9:00 to 16:40 every day, using DAILY + // + // UNTIL rule does not exist in original example + public function test_page131_test4a() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence, Day 1: '), + array('index' => 1, 'dateString' => '19970902T092000', 'message' => '2nd occurrence, Day 1: '), + array('index' => 2, 'dateString' => '19970902T094000', 'message' => '3rd occurrence, Day 1: '), + array('index' => 3, 'dateString' => '19970902T100000', 'message' => '4th occurrence, Day 1: '), + array('index' => 20, 'dateString' => '19970902T164000', 'message' => 'Last occurrence, Day 1: '), + array('index' => 21, 'dateString' => '19970903T090000', 'message' => '1st occurrence, Day 2: '), + array('index' => 41, 'dateString' => '19970903T164000', 'message' => 'Last occurrence, Day 2: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40;UNTIL=19970904T000000Z', + ), + 42, + $checks + ); + } +*/ + +/* Requires support of MINUTELY frequency [#101] + * + // Page 131, Test 4b :: Every 20 minutes from 9:00 to 16:40 every day, using MINUTELY + // + // UNTIL rule does not exist in original example + public function test_page131_test4b() + { + $checks = array( + array('index' => 0, 'dateString' => '19970902T090000', 'message' => '1st occurrence, Day 1: '), + array('index' => 1, 'dateString' => '19970902T092000', 'message' => '2nd occurrence, Day 1: '), + array('index' => 2, 'dateString' => '19970902T094000', 'message' => '3rd occurrence, Day 1: '), + array('index' => 3, 'dateString' => '19970902T100000', 'message' => '4th occurrence, Day 1: '), + array('index' => 20, 'dateString' => '19970902T164000', 'message' => 'Last occurrence, Day 1: '), + array('index' => 21, 'dateString' => '19970903T090000', 'message' => '1st occurrence, Day 2: '), + array('index' => 41, 'dateString' => '19970903T164000', 'message' => 'Last occurrence, Day 2: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970902T090000', + 'RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16;UNTIL=19970904T000000Z', + ), + 42, + $checks + ); + } +*/ + + // Page 131, Test 5a :: Changing the passed WKST rule, before... + public function test_page131_test5a() + { + $checks = array( + array('index' => 0, 'dateString' => '19970805T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970810T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970819T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19970824T090000', 'message' => '4th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970805T090000', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO', + ), + 4, + $checks + ); + } + + // Page 131, Test 5b :: ...and after + public function test_page131_test5b() + { + $checks = array( + array('index' => 0, 'dateString' => '19970805T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '19970817T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '19970819T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '19970831T090000', 'message' => '4th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:19970805T090000', + 'RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU', + ), + 4, + $checks + ); + } + + // Page 132, Test 1 :: Automatically ignoring an invalid date (30 February) + public function test_page132_test1() + { + $checks = array( + array('index' => 0, 'dateString' => '20070115T090000', 'message' => '1st occurrence: '), + array('index' => 1, 'dateString' => '20070130T090000', 'message' => '2nd occurrence: '), + array('index' => 2, 'dateString' => '20070215T090000', 'message' => '3rd occurrence: '), + array('index' => 3, 'dateString' => '20070315T090000', 'message' => '4th occurrence: '), + array('index' => 4, 'dateString' => '20070330T090000', 'message' => '5th occurrence: '), + ); + $this->assertVEVENT( + 'America/New_York', + array( + 'DTSTART;TZID=America/New_York:20070115T090000', + 'RRULE:FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5', + ), + 5, + $checks + ); + } + + public function assertVEVENT($defaultTimezone, $veventParts, $count, $checks) + { + $options = $this->getOptions($defaultTimezone); + + $testIcal = implode(PHP_EOL, $this->getIcalHeader()); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->formatIcalEvent($veventParts)); + $testIcal .= PHP_EOL; + $testIcal .= implode(PHP_EOL, $this->getIcalFooter()); + + $ical = new ICal(false, $options); + $ical->initString($testIcal); + + $events = $ical->events(); + + $this->assertCount($count, $events); + + foreach ($checks as $check) { + $this->assertEvent($events[$check['index']], $check['dateString'], $check['message'], isset($check['timezone']) ? $check['timezone'] : $defaultTimezone); + } + } + + public function assertEvent($event, $expectedDateString, $message, $timeZone = null) + { + if (!is_null($timeZone)) { + date_default_timezone_set($timeZone); + } + + $expectedTimeStamp = strtotime($expectedDateString); + + $this->assertEquals($expectedTimeStamp, $event->dtstart_array[2], $message . 'timestamp mismatch (expected ' . $expectedDateString . ' vs actual ' . $event->dtstart . ')'); + $this->assertAttributeEquals($expectedDateString, 'dtstart', $event, $message . 'dtstart mismatch (timestamp is okay)'); + } + + public function getOptions($defaultTimezone) + { + $options = array( + 'defaultSpan' => 2, // Default value: 2 + 'defaultTimeZone' => $defaultTimezone, // Default value: UTC + 'defaultWeekStart' => 'MO', // Default value + 'disableCharacterReplacement' => false, // Default value + 'filterDaysAfter' => null, // Default value + 'filterDaysBefore' => null, // Default value + 'skipRecurrence' => false, // Default value + ); + + return $options; + } + + public function formatIcalEvent($veventParts) + { + return array_merge( + array( + 'BEGIN:VEVENT', + 'CREATED:' . gmdate('Ymd\THis\Z'), + 'UID:RFC5545-examples-test', + ), + $veventParts, + array( + 'SUMMARY:test', + 'LAST-MODIFIED:' . gmdate('Ymd\THis\Z', filemtime(__FILE__)), + 'END:VEVENT', + ) + ); + } + + public function getIcalHeader() + { + return array( + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Google Inc//Google Calendar 70.9054//EN', + 'X-WR-CALNAME:Private', + 'X-APPLE-CALENDAR-COLOR:#FF2968', + 'X-WR-CALDESC:', + ); + } + + public function getIcalFooter() + { + return array('END:VCALENDAR'); + } +} diff --git a/app/widgets/MEC.php b/app/widgets/MEC.php new file mode 100755 index 0000000..14bda9d --- /dev/null +++ b/app/widgets/MEC.php @@ -0,0 +1,169 @@ + + */ +class MEC_MEC_widget extends WP_Widget +{ + /** + * @var MEC_render + */ + public $render; + + /** + * @var MEC_main + */ + public $main; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + // MEC Render Class + $this->render = MEC::getInstance('app.libraries.render'); + + // MEC Main Class + $this->main = MEC::getInstance('app.libraries.main'); + + parent::__construct('MEC_MEC_widget', esc_html__('Modern Events Calendar', 'modern-events-calendar-lite'), array('description'=>__('Show events based on created shortcodes.', 'modern-events-calendar-lite'))); + } + + /** + * How to display the widget on the screen. + * @param array $args + * @param array $instance + * @author Webnus + * @return void + */ + public function widget($args, $instance) + { + // Include OWL Assets. It's needed if Widget is set to load grid view + $this->main->load_owl_assets(); + + // Before Widget + echo $args['before_widget'] ?? ''; + + // Print the widget title + if(!empty($instance['title'])) + { + echo ($args['before_title'] ?? '').apply_filters('widget_title', $instance['title']).($args['after_title'] ?? ''); + } + + $calendar_id = $instance['calendar_id'] ?? 0; + + // Get Skin Options + $sk_options = get_post_meta($calendar_id, 'sk-options', true); + $sk_options_list_style = (isset($sk_options['list']) and isset($sk_options['list']['style'])) ? trim($sk_options['list']['style']) : 'classic'; + + $current_hide = $instance['current_hide'] ?? ''; + $autoplay = $instance['autoplay'] ?? 1; + $autoplay_time = $instance['autoplay_time'] ?? 3000; + $loop = $instance['loop'] ?? 1; + + // Print the skin output + echo MEC_kses::full($this->render->widget($calendar_id, array( + 'html-class'=>'mec-widget '.$current_hide, + 'style'=>$sk_options_list_style, + 'widget'=>true, + 'widget_autoplay'=>$autoplay, + 'widget_loop'=>$loop, + 'widget_autoplay_time'=>$autoplay_time, + ))); + + // After Widget + echo $args['after_widget'] ?? ''; + } + + /** + * Displays the widget settings controls on the widget panel. + * @param array $instance + * @author Webnus + * @return void + */ + public function form($instance) + { + $calendars = get_posts(array('post_type'=>'mec_calendars', 'posts_per_page'=>'-1', 'meta_query'=>array(array('key'=>'skin', 'value'=>array('list', 'grid', 'monthly_view'), 'compare'=>'IN')))); + + $current_hide = $instance['current_hide'] ?? ''; + $autoplay = $instance['autoplay'] ?? 1; + $autoplay_time = $instance['autoplay_time'] ?? 3000; + $loop = $instance['loop'] ?? 1; + + $monthly_view_options = false; + $grid_view_options = false; + + echo '

    ' + .'' + .'' + .'

    '; + + if(count($calendars)) + { + echo '

    ' + .'' + .'

    '; + + // Monthly View Options + echo '

    '; + + // Grid Options + echo '
    +

    + + + +

    +

    + + +

    +

    + + + +

    +
    '; + } + else + { + echo '

    '.esc_html__('Create some calendars first.').'

    '; + } + } + + /** + * Update the widget settings. + * @author Webnus + * @param array $new_instance + * @param array $old_instance + * @return array + */ + public function update($new_instance, $old_instance) + { + $instance = []; + $instance['title'] = isset($new_instance['title']) ? strip_tags($new_instance['title']) : ''; + $instance['calendar_id'] = isset($new_instance['calendar_id']) ? intval($new_instance['calendar_id']) : 0; + $instance['current_hide'] = isset($new_instance['current_hide']) ? strip_tags($new_instance['current_hide']) : ''; + $instance['autoplay'] = isset($new_instance['autoplay']) ? sanitize_text_field($new_instance['autoplay']) : 0; + $instance['autoplay_time'] = isset($new_instance['autoplay_time']) ? sanitize_text_field($new_instance['autoplay_time']) : 3000; + $instance['loop'] = isset($new_instance['loop']) ? sanitize_text_field($new_instance['loop']) : 0; + + return $instance; + } +} \ No newline at end of file diff --git a/app/widgets/index.html b/app/widgets/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/widgets/single.php b/app/widgets/single.php new file mode 100755 index 0000000..4e236ce --- /dev/null +++ b/app/widgets/single.php @@ -0,0 +1,148 @@ + + */ +class MEC_single_widget extends WP_Widget +{ + /** + * Unique identifier. + */ + protected $widget_slug = 'MEC_single_widget'; + + /** + * Constructor method + * @author Webnus + */ + public function __construct() + { + parent::__construct($this->get_widget_slug(), esc_html__('MEC Single Sidebar Items', 'modern-events-calendar-lite'), array('classname' => $this->get_widget_slug() . '-class', 'description' => esc_html__('To manage event details page elements.', 'modern-events-calendar-lite'))); + + // Refreshing the widget's cached output with each new post + add_action('save_post', array($this, 'flush_widget_cache')); + add_action('deleted_post', array($this, 'flush_widget_cache')); + add_action('switch_theme', array($this, 'flush_widget_cache')); + } + + /** + * @return string + */ + public function get_widget_slug() + { + return $this->widget_slug; + } + + /** + * How to display the widget on the screen. + * @author Webnus + * @param array $args + * @param array $instance + */ + public function widget($args, $instance) + { + /** @var MEC_main $main */ + $main = MEC::getInstance('app.libraries.main'); + + // Not Single Event Page + if(!is_singular($main->get_main_post_type())) return; + + // General Settings + $settings = $main->get_settings(); + + $layout = ($settings['single_single_style'] ?? 'modern'); + echo MEC_kses::full($this->get_layout_output($layout, $settings)); + } + + public function get_layout_output($layout, $settings) + { + $single = $GLOBALS['mec-widget-single'] ?? NULL; + $event = $GLOBALS['mec-widget-event'] ?? NULL; + + if(!$single or !$event) return NULL; + + $occurrence = $GLOBALS['mec-widget-occurrence'] ?? NULL; + $occurrence_full = $GLOBALS['mec-widget-occurrence_full'] ?? NULL; + $occurrence_end_date = $GLOBALS['mec-widget-occurrence_end_date'] ?? NULL; + $occurrence_end_full = $GLOBALS['mec-widget-occurrence_end_full'] ?? NULL; + $cost = $GLOBALS['mec-widget-cost'] ?? NULL; + $more_info = $GLOBALS['mec-widget-more_info'] ?? NULL; + $location_id = $GLOBALS['mec-widget-location_id'] ?? NULL; + $location = $GLOBALS['mec-widget-location'] ?? NULL; + $organizer_id = $GLOBALS['mec-widget-organizer_id'] ?? NULL; + $organizer = $GLOBALS['mec-widget-organizer'] ?? NULL; + $more_info_target = $GLOBALS['mec-widget-more_info_target'] ?? NULL; + $more_info_title = $GLOBALS['mec-widget-more_info_title'] ?? NULL; + $banner_module = $GLOBALS['mec-banner_module'] ?? 0; + $icons = $GLOBALS['mec-icons'] ?? $single->main->icons(); + + $path = MEC::import('app.widgets.single.'.$layout, true, true); + + ob_start(); + include file_exists($path) ? $path : MEC::import('app.widgets.single.default', true, true); + return ob_get_clean(); + } + + /** + * @param array $instance + * @return void + */ + public function form($instance) + { + ?> +

    Settings -> Single Event -> Sidebar page.'); ?>

    + get_widget_slug(), 'widget'); + } + + /** + * Update the widget settings. + * @author Webnus + * @param array $new_instance + * @param array $old_instance + * @return array + */ + public function update($new_instance, $old_instance) + { + $this->flush_widget_cache(); + + $alloptions = wp_cache_get('alloptions', 'options'); + if(isset($alloptions['MEC_single_widget'])) delete_option('MEC_single_widget'); + + return []; + } + + public function is_enabled($k) + { + /** @var MEC_main $main */ + $main = MEC::getInstance('app.libraries.main'); + + // General Settings + $general = $main->get_settings(); + + // Return from General Settings + if(isset($general['ss_'.$k])) return (bool) $general['ss_'.$k]; + + // Widget Settings + $settings = $this->get_settings(); + + $arr = end($settings); + $ids = []; + + if(is_array($arr) or is_object($arr)) + { + foreach($arr as $key=>$value) + { + if($key === $k) $ids[] = $value; + } + } + + return isset($ids[0]) && $ids[0] === 'on'; + } +} diff --git a/app/widgets/single/default.php b/app/widgets/single/default.php new file mode 100755 index 0000000..23c735e --- /dev/null +++ b/app/widgets/single/default.php @@ -0,0 +1,214 @@ +is_enabled('data_time') || $this->is_enabled('local_time') || $this->is_enabled('event_cost') || $this->is_enabled('more_info') || $this->is_enabled('event_label') || $this->is_enabled('event_location') || $this->is_enabled('event_categories') || $this->is_enabled('event_orgnizer') || $this->is_enabled('register_btn')): ?> +
    + data->meta['mec_date']['start']) and !empty($event->data->meta['mec_date']['start']) and $this->is_enabled('data_time')) + { + $single->display_datetime_widget($event, $occurrence_full, $occurrence_end_full); + } + + // Local Time Module + if($this->is_enabled('local_time')) echo MEC_kses::full($single->main->module('local-time.details', array('event' => $event, 'icons' => $icons))); + ?> + + is_enabled('event_cost')) + { + ?> +
    + display('wallet'); ?> +

    main->m('cost', esc_html__('Cost', 'modern-events-calendar-lite'))); ?>

    +
    +
    + + + is_enabled('more_info')) + { + ?> +
    + display('info'); ?> +

    main->m('more_info_link', esc_html__('More Info', 'modern-events-calendar-lite'))); ?>

    +
    +
    + + + data->labels) and !empty($event->data->labels) and $this->is_enabled('event_label')) + { + $single->display_labels_widget($event); + } + ?> + + data ); ?> + data ); ?> + data); ?> + + is_enabled('event_location')) + { + $single->display_location_widget($event); // Show Location Widget + $single->show_other_locations($event); // Show Additional Locations + } + ?> + + data->categories) and !empty($event->data->categories) and $this->is_enabled('event_categories')) + { + ?> +
    + display('folder'); ?> +
    main->m('taxonomy_categories', esc_html__('Category', 'modern-events-calendar-lite'))); ?>
    +
    + data->categories as $category) + { + $color = ((isset($category['color']) and trim($category['color'])) ? $category['color'] : ''); + + $color_html = ''; + if($color) $color_html .= ' '; + + $icon = $category['icon'] ?? ''; + $icon = isset($icon) && $icon != '' ? '' : ''; + + echo '
    '; + } + ?> +
    + + + + is_enabled('event_orgnizer')) + { + ?> +
    + display('home'); ?> +

    main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))); ?>

    + + + <?php echo (isset($organizer['name']) ? esc_attr($organizer['name']) : ''); ?> + +
    + +
    + + + display('link'); ?> +
    +
    + + display('home'); ?> +
    + +
    + +
    + display('phone'); ?> +
    + +
    + +
    + display('envelope'); ?> +
    + +
    + +
    + display('sitemap'); ?> +
    + + +
    + data, 'mec_organizer'); if($organizer_description_setting == '1' and is_array($organizer_terms) and count($organizer_terms)): foreach($organizer_terms as $organizer_term) { if ($organizer_term->term_id == $organizer['id'] ) { if(isset($organizer_term->description) && !empty($organizer_term->description)): ?> +

    description);?>

    + +
    + +
    + show_other_organizers($event); // Show Additional Organizers + } + ?> + + + main->can_show_booking_module($event) and $this->is_enabled('register_btn')): ?> + + main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite'))); ?> + is_enabled('register_btn') == 'on' and $more_info and !$single->main->is_expired($event)): ?> + main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite'))); ?> + + + + + +is_enabled('event_speakers')) echo MEC_kses::full($single->main->module('speakers.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('event_sponsors')) echo MEC_kses::full($single->main->module('sponsors.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('attende_module')) echo MEC_kses::full($single->main->module('attendees-list.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('next_module')) echo MEC_kses::full($single->main->module('next-event.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('links_module')) echo MEC_kses::full($single->main->module('links.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('weather_module')) echo MEC_kses::full($single->main->module('weather.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('google_map')): ?> +
    + main->module('googlemap.details', array('event' => $single->events, 'icons' => $icons))); ?> +
    + + + +is_enabled('qrcode_module')) echo MEC_kses::full($single->main->module('qrcode.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('public_download_module')) $single->display_public_download_module($event); ?> + + +is_enabled('custom_fields_module')) $single->display_data_fields($event, true); ?> diff --git a/app/widgets/single/index.html b/app/widgets/single/index.html new file mode 100755 index 0000000..e69de29 diff --git a/app/widgets/single/modern.php b/app/widgets/single/modern.php new file mode 100755 index 0000000..35f3337 --- /dev/null +++ b/app/widgets/single/modern.php @@ -0,0 +1,184 @@ +is_enabled('event_orgnizer') || $this->is_enabled('register_btn')): ?> +
    + is_enabled('event_orgnizer')) + { + ?> +
    + display('home'); ?> +

    main->m('taxonomy_organizer', esc_html__('Organizer', 'modern-events-calendar-lite'))); ?>

    + + + <?php echo (isset($organizer['name']) ? esc_attr($organizer['name']) : ''); ?> + + +
    + +
    + + + display('link'); ?> +
    +
    + + display('home'); ?> +
    + +
    + +
    + display('phone'); ?> +
    + +
    + +
    + display('envelope'); ?> +
    + +
    + +
    + display('sitemap'); ?> +
    + +
    + data, 'mec_organizer'); if($organizer_description_setting == '1' and is_array($organizer_terms) and count($organizer_terms)): foreach($organizer_terms as $organizer_term) { if ($organizer_term->term_id == $organizer['id'] ) { if(isset($organizer_term->description) && !empty($organizer_term->description)): ?> +
    +

    description); ?>

    +
    + +
    + +
    + show_other_organizers($event); // Show Additional Organizers + } + ?> + + + main->can_show_booking_module($event) and $this->is_enabled('register_btn')): ?> + uniqueid; + if(isset($settings['single_booking_style']) and $settings['single_booking_style'] == 'modal' ){ + $data_lity_class = 'mec-booking-data-lity'; + $target_id = 'mec-events-meta-group-booking-box-'.$single->uniqueid; + } ?> + main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite'))); ?> + main->is_expired($event)): ?> + main->m('register_button', esc_html__('REGISTER', 'modern-events-calendar-lite'))); ?> + +
    + + + +is_enabled('event_speakers')) echo MEC_kses::full($single->main->module('speakers.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('event_sponsors')) echo MEC_kses::full($single->main->module('sponsors.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('local_time')) echo MEC_kses::full($single->main->module('local-time.details', array('event' => $event, 'icons' => $icons))); ?> + +is_enabled('event_location') || $this->is_enabled('event_categories') || $this->is_enabled('more_info')): ?> +
    + + is_enabled('event_location')) + { + $single->display_location_widget($event); // Show Location Widget + $single->show_other_locations($event); // Show Additional Locations + } + ?> + + data->categories) and !empty($event->data->categories) and $this->is_enabled('event_categories')) + { + ?> +
    + display('folder'); ?> +
    main->m('taxonomy_categories', esc_html__('Category', 'modern-events-calendar-lite'))); ?>
    +
    + data->categories as $category) + { + $color = ((isset($category['color']) and trim($category['color'])) ? $category['color'] : ''); + + $color_html = ''; + if($color) $color_html .= ' '; + + $icon = $category['icon'] ?? ''; + $icon = isset($icon) && $icon != '' ? '' : ''; + + echo '
    '; + } + ?> +
    +
    + + + is_enabled('more_info')) + { + ?> +
    + display('info'); ?> +

    main->m('more_info_link', esc_html__('More Info', 'modern-events-calendar-lite'))); ?>

    +
    +
    + + +
    + + + +is_enabled('attende_module')) echo MEC_kses::full($single->main->module('attendees-list.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('next_module')) echo MEC_kses::full($single->main->module('next-event.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('weather_module')) echo MEC_kses::full($single->main->module('weather.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('qrcode_module')) echo MEC_kses::full($single->main->module('qrcode.details', array('event' => $event, 'icons' => $icons))); ?> + + +is_enabled('public_download_module')) $single->display_public_download_module($event); ?> + + +is_enabled('custom_fields_module')) $single->display_data_fields($event, true); ?> diff --git a/assets/css/a11y-backend.css b/assets/css/a11y-backend.css new file mode 100755 index 0000000..96b65fa --- /dev/null +++ b/assets/css/a11y-backend.css @@ -0,0 +1,164 @@ +.mec-sed-methods li a:focus-visible, +.mec-sed-methods li.active a:focus-visible, +.mec-add-booking-tabs-left a:focus-visible, +.mec-add-event-tabs-left a:focus-visible, +#webnus-dashboard select:focus-visible, +#webnus-dashboard input:focus-visible { + outline: #000 auto 1px; +} + + +.mec-add-event-tabs-wrap .select2-container:focus, +.mec-create-shortcode-tab-content .select2-container:focus, +.mec-sed-methods li.active:focus, +.post-type-mec-books.taxonomy-mec_coupon input[type=number]:focus, +.post-type-mec-books.taxonomy-mec_coupon input[type=search]:focus, +.post-type-mec-books.taxonomy-mec_coupon input[type=text]:focus, +.post-type-mec-books.taxonomy-mec_coupon input[type=url]:focus, +.post-type-mec-books.taxonomy-mec_coupon select:focus, +.post-type-mec-books.taxonomy-mec_coupon textarea:focus, +.post-type-mec-events.taxonomy-mec_category input[type=number]:focus, +.post-type-mec-events.taxonomy-mec_category input[type=search]:focus, +.post-type-mec-events.taxonomy-mec_category input[type=text]:focus, +.post-type-mec-events.taxonomy-mec_category input[type=url]:focus, +.post-type-mec-events.taxonomy-mec_category select:focus, +.post-type-mec-events.taxonomy-mec_category textarea:focus, +.post-type-mec-events.taxonomy-mec_label input[type=number]:focus, +.post-type-mec-events.taxonomy-mec_label input[type=search]:focus, +.post-type-mec-events.taxonomy-mec_label input[type=text]:focus, +.post-type-mec-events.taxonomy-mec_label input[type=url]:focus, +.post-type-mec-events.taxonomy-mec_label select:focus, +.post-type-mec-events.taxonomy-mec_label textarea:focus, +.post-type-mec-events.taxonomy-post_tag input[type=number]:focus, +.post-type-mec-events.taxonomy-post_tag input[type=search]:focus, +.post-type-mec-events.taxonomy-post_tag input[type=text]:focus, +.post-type-mec-events.taxonomy-post_tag input[type=url]:focus, +.post-type-mec-events.taxonomy-post_tag select:focus, +.post-type-mec-events.taxonomy-post_tag textarea:focus, +.taxonomy-mec_location input[type=number]:focus, +.taxonomy-mec_location input[type=search]:focus, +.taxonomy-mec_location input[type=text]:focus, +.taxonomy-mec_location input[type=url]:focus, +.taxonomy-mec_location select:focus, +.taxonomy-mec_location textarea:focus, +.taxonomy-mec_organizer input[type=number]:focus, +.taxonomy-mec_organizer input[type=search]:focus, +.taxonomy-mec_organizer input[type=text]:focus, +.taxonomy-mec_organizer input[type=url]:focus, +.taxonomy-mec_organizer select:focus, +.taxonomy-mec_organizer textarea:focus, +.taxonomy-mec_speaker input[type=number]:focus, +.taxonomy-mec_speaker input[type=search]:focus, +.taxonomy-mec_speaker input[type=text]:focus, +.taxonomy-mec_speaker input[type=url]:focus, +.taxonomy-mec_speaker select:focus, +.taxonomy-mec_speaker textare a:focus, +.post-type-mec-books.taxonomy-mec_coupon .button:focus, +.post-type-mec-books.taxonomy-mec_coupon .button-secondary:focus, +.post-type-mec-events.taxonomy-mec_category .button:focus, +.post-type-mec-events.taxonomy-mec_category .button-secondary:focus, +.post-type-mec-events.taxonomy-mec_label .button:focus, +.post-type-mec-events.taxonomy-mec_label .button-secondary:focus, +.post-type-mec-events.taxonomy-post_tag .button:focus, +.post-type-mec-events.taxonomy-post_tag .button-secondary:focus, +.taxonomy-mec_location .button:focus, +.taxonomy-mec_location .button-secondary:focus, +.taxonomy-mec_organizer .button:focus, +.taxonomy-mec_organizer .button-secondary:focus, +.taxonomy-mec_speaker .button:focus, +#mec_add_fee_button:focus, +#mec_add_ticket_variation_button:focus, +#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:focus, +#taxes_option #mec_fees_list .mec-form-row .button:focus, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:focus, +.mec-export-settings:focus, +.mec-import-settings:focus, +.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):focus, +.mec-occurrences-wrapper .button:not(.wp-color-result):focus, +.mec-calendar-metabox .mec-form-row input[type=checkbox]:focus, +.mec-meta-box-fields .mec-form-row input[type=checkbox]:focus, +.mec-attendees-wrapper select:focus, +.mec-calendar-metabox .wn-mec-select:focus, +.mec-form-row input[type=date]:focus, +.mec-form-row input[type=email]:focus, +.mec-form-row input[type=number]:focus, +.mec-form-row input[type=tel]:focus, +.mec-form-row input[type=text]:focus, +.mec-form-row input[type=url]:focus, +.mec-form-row select:focus, +.mec-form-row textarea:focus, +.mec-form-row.mec-skin-list-date-format-container input[type=text]:focus, +.mec-occurrences-wrapper input[type=date]:focus, +.mec-occurrences-wrapper input[type=email]:focus, +.mec-occurrences-wrapper input[type=number]:focus, +.mec-occurrences-wrapper input[type=tel]:focus, +.mec-occurrences-wrapper input[type=text]:focus, +.mec-occurrences-wrapper input[type=url]:focus, +.mec-occurrences-wrapper select:focus, +.mec-occurrences-wrapper textarea:focus, +.mec-add-booking-tabs-left a:focus, +.mec-add-event-tabs-left a:focus, +.mec-create-shortcode-tabs-left a:focus, +#mec-event-data input[type=date]:focus, +#mec-event-data input[type=email]:focus, +#mec-event-data input[type=tel]:focus, +#mec-event-data input[type=text]:focus, +#mec-event-data input[type=url]:focus, +#mec-event-data select:focus, +#mec-event-data textarea:focus, +#mec_exceptions_not_in_days_date:focus, +#mec_meta_box_date_form input[type=text]:focus, +#mec_select_tags.mec-create-shortcode-tab-content input[type=text]:focus, +#mec_settings_weather_module_api_key:focus, +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary:focus, +#webnus-dashboard .total-bookings button:focus, +#webnus-dashboard .w-box.total-bookings ul li a:focus, +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:focus, +button.fserv-button-submit:focus, +.post-type-mec-events #mec_metabox_label input[type=checkbox]:focus, +.post-type-mec-events .components-panel__body input[type=checkbox]:focus { + outline: #000 auto 1px; +} + +.mec-sed-methods li.active, +.mec-sed-methods li.active a, +.mec-add-booking-tabs-left a.mec-tab-active, +.mec-add-event-tabs-left a.mec-tab-active, +.mec-create-shortcode-tabs-left a.mec-tab-active, +.mec-add-booking-tabs-left a, +.mec-add-event-tabs-left a, +.mec-create-shortcode-tabs-left a, +.post-type-mec-books.taxonomy-mec_coupon .button, +.post-type-mec-books.taxonomy-mec_coupon .button-secondary, +.post-type-mec-events.taxonomy-mec_category .button, +.post-type-mec-events.taxonomy-mec_category .button-secondary, +.post-type-mec-events.taxonomy-mec_label .button, +.post-type-mec-events.taxonomy-mec_label .button-secondary, +.post-type-mec-events.taxonomy-post_tag .button, +.post-type-mec-events.taxonomy-post_tag .button-secondary, +.taxonomy-mec_location .button, +.taxonomy-mec_location .button-secondary, +.taxonomy-mec_organizer .button, +.taxonomy-mec_organizer .button-secondary, +.taxonomy-mec_speaker .button, +.taxonomy-mec_category .wp-color-result-text { + color: #000; +} + +#mec_calendar_filter .description { + color: #000 !important; +} + +.mec-switcher input { + margin: 0 0 0 0 !important; + bottom: -1px; + left: -1px; + visibility: unset; + width: 63px !important; + height: 36px !important; + border-radius: 40px; +} + +#mec_calendar_display_options .mec-col-4 input[type=checkbox] { + margin-left: 0!important; +} \ No newline at end of file diff --git a/assets/css/a11y-backend.min.css b/assets/css/a11y-backend.min.css new file mode 100755 index 0000000..7e2efcb --- /dev/null +++ b/assets/css/a11y-backend.min.css @@ -0,0 +1 @@ +#webnus-dashboard input:focus-visible,#webnus-dashboard select:focus-visible,.mec-add-booking-tabs-left a:focus-visible,.mec-add-event-tabs-left a:focus-visible,.mec-sed-methods li a:focus-visible,.mec-sed-methods li.active a:focus-visible{outline:#000 auto 1px}#mec-event-data input[type=date]:focus,#mec-event-data input[type=email]:focus,#mec-event-data input[type=tel]:focus,#mec-event-data input[type=text]:focus,#mec-event-data input[type=url]:focus,#mec-event-data select:focus,#mec-event-data textarea:focus,#mec_add_fee_button:focus,#mec_add_ticket_variation_button:focus,#mec_exceptions_not_in_days_date:focus,#mec_meta_box_date_form input[type=text]:focus,#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:focus,#mec_select_tags.mec-create-shortcode-tab-content input[type=text]:focus,#mec_settings_weather_module_api_key:focus,#taxes_option #mec_fees_list .mec-form-row .button:focus,#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:focus,#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary:focus,#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:focus,#webnus-dashboard .total-bookings button:focus,#webnus-dashboard .w-box.total-bookings ul li a:focus,.mec-add-booking-tabs-left a:focus,.mec-add-event-tabs-left a:focus,.mec-add-event-tabs-wrap .select2-container:focus,.mec-attendees-wrapper select:focus,.mec-calendar-metabox .mec-form-row input[type=checkbox]:focus,.mec-calendar-metabox .wn-mec-select:focus,.mec-create-shortcode-tab-content .select2-container:focus,.mec-create-shortcode-tabs-left a:focus,.mec-export-settings:focus,.mec-form-row input[type=date]:focus,.mec-form-row input[type=email]:focus,.mec-form-row input[type=number]:focus,.mec-form-row input[type=tel]:focus,.mec-form-row input[type=text]:focus,.mec-form-row input[type=url]:focus,.mec-form-row select:focus,.mec-form-row textarea:focus,.mec-form-row.mec-skin-list-date-format-container input[type=text]:focus,.mec-import-settings:focus,.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):focus,.mec-meta-box-fields .mec-form-row input[type=checkbox]:focus,.mec-occurrences-wrapper .button:not(.wp-color-result):focus,.mec-occurrences-wrapper input[type=date]:focus,.mec-occurrences-wrapper input[type=email]:focus,.mec-occurrences-wrapper input[type=number]:focus,.mec-occurrences-wrapper input[type=tel]:focus,.mec-occurrences-wrapper input[type=text]:focus,.mec-occurrences-wrapper input[type=url]:focus,.mec-occurrences-wrapper select:focus,.mec-occurrences-wrapper textarea:focus,.mec-sed-methods li.active:focus,.post-type-mec-books.taxonomy-mec_coupon .button-secondary:focus,.post-type-mec-books.taxonomy-mec_coupon .button:focus,.post-type-mec-books.taxonomy-mec_coupon input[type=number]:focus,.post-type-mec-books.taxonomy-mec_coupon input[type=search]:focus,.post-type-mec-books.taxonomy-mec_coupon input[type=text]:focus,.post-type-mec-books.taxonomy-mec_coupon input[type=url]:focus,.post-type-mec-books.taxonomy-mec_coupon select:focus,.post-type-mec-books.taxonomy-mec_coupon textarea:focus,.post-type-mec-events #mec_metabox_label input[type=checkbox]:focus,.post-type-mec-events .components-panel__body input[type=checkbox]:focus,.post-type-mec-events.taxonomy-mec_category .button-secondary:focus,.post-type-mec-events.taxonomy-mec_category .button:focus,.post-type-mec-events.taxonomy-mec_category input[type=number]:focus,.post-type-mec-events.taxonomy-mec_category input[type=search]:focus,.post-type-mec-events.taxonomy-mec_category input[type=text]:focus,.post-type-mec-events.taxonomy-mec_category input[type=url]:focus,.post-type-mec-events.taxonomy-mec_category select:focus,.post-type-mec-events.taxonomy-mec_category textarea:focus,.post-type-mec-events.taxonomy-mec_label .button-secondary:focus,.post-type-mec-events.taxonomy-mec_label .button:focus,.post-type-mec-events.taxonomy-mec_label input[type=number]:focus,.post-type-mec-events.taxonomy-mec_label input[type=search]:focus,.post-type-mec-events.taxonomy-mec_label input[type=text]:focus,.post-type-mec-events.taxonomy-mec_label input[type=url]:focus,.post-type-mec-events.taxonomy-mec_label select:focus,.post-type-mec-events.taxonomy-mec_label textarea:focus,.post-type-mec-events.taxonomy-post_tag .button-secondary:focus,.post-type-mec-events.taxonomy-post_tag .button:focus,.post-type-mec-events.taxonomy-post_tag input[type=number]:focus,.post-type-mec-events.taxonomy-post_tag input[type=search]:focus,.post-type-mec-events.taxonomy-post_tag input[type=text]:focus,.post-type-mec-events.taxonomy-post_tag input[type=url]:focus,.post-type-mec-events.taxonomy-post_tag select:focus,.post-type-mec-events.taxonomy-post_tag textarea:focus,.taxonomy-mec_location .button-secondary:focus,.taxonomy-mec_location .button:focus,.taxonomy-mec_location input[type=number]:focus,.taxonomy-mec_location input[type=search]:focus,.taxonomy-mec_location input[type=text]:focus,.taxonomy-mec_location input[type=url]:focus,.taxonomy-mec_location select:focus,.taxonomy-mec_location textarea:focus,.taxonomy-mec_organizer .button-secondary:focus,.taxonomy-mec_organizer .button:focus,.taxonomy-mec_organizer input[type=number]:focus,.taxonomy-mec_organizer input[type=search]:focus,.taxonomy-mec_organizer input[type=text]:focus,.taxonomy-mec_organizer input[type=url]:focus,.taxonomy-mec_organizer select:focus,.taxonomy-mec_organizer textarea:focus,.taxonomy-mec_speaker .button:focus,.taxonomy-mec_speaker input[type=number]:focus,.taxonomy-mec_speaker input[type=search]:focus,.taxonomy-mec_speaker input[type=text]:focus,.taxonomy-mec_speaker input[type=url]:focus,.taxonomy-mec_speaker select:focus,.taxonomy-mec_speaker textare a:focus,button.fserv-button-submit:focus{outline:#000 auto 1px}.mec-add-booking-tabs-left a,.mec-add-booking-tabs-left a.mec-tab-active,.mec-add-event-tabs-left a,.mec-add-event-tabs-left a.mec-tab-active,.mec-create-shortcode-tabs-left a,.mec-create-shortcode-tabs-left a.mec-tab-active,.mec-sed-methods li.active,.mec-sed-methods li.active a,.post-type-mec-books.taxonomy-mec_coupon .button,.post-type-mec-books.taxonomy-mec_coupon .button-secondary,.post-type-mec-events.taxonomy-mec_category .button,.post-type-mec-events.taxonomy-mec_category .button-secondary,.post-type-mec-events.taxonomy-mec_label .button,.post-type-mec-events.taxonomy-mec_label .button-secondary,.post-type-mec-events.taxonomy-post_tag .button,.post-type-mec-events.taxonomy-post_tag .button-secondary,.taxonomy-mec_category .wp-color-result-text,.taxonomy-mec_location .button,.taxonomy-mec_location .button-secondary,.taxonomy-mec_organizer .button,.taxonomy-mec_organizer .button-secondary,.taxonomy-mec_speaker .button{color:#000}#mec_calendar_filter .description{color:#000!important}.mec-switcher input{margin:0!important;bottom:-1px;left:-1px;visibility:unset;width:63px!important;height:36px!important;border-radius:40px}#mec_calendar_display_options .mec-col-4 input[type=checkbox]{margin-left:0!important} \ No newline at end of file diff --git a/assets/css/a11y.css b/assets/css/a11y.css new file mode 100755 index 0000000..6a36c14 --- /dev/null +++ b/assets/css/a11y.css @@ -0,0 +1,119 @@ +.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day, +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt.mec-weekly-disabled.mec-table-nullday span { + font-weight: 300; +} + +.mec-load-more-button, +.mec-wrap .mec-totalcal-box i, +.mec-event-footer .mec-booking-button, +.mec-event-sharing-wrap li a, +.mec-event-sharing-wrap:hover li ul li a, +.mec-price-details, +.mec-price-details span, +.mec-event-footer .mec-modal-booking-button, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected, +.event-carousel-type2-head .mec-event-carousel-content-type2 .mec-event-date-info, +.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button, +.mec-checkboxes-search .mec-searchbar-category-wrap, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-wrap .mec-totalcal-box input, +.mec-wrap .mec-totalcal-box select, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-wrap .mec-totalcal-box label, +.mec-calendar .mec-event-article .mec-event-detail, +.mec-calendar .mec-calendar-side .mec-next-month a, +.mec-calendar .mec-calendar-side .mec-previous-month a, +.mec-calendar .mec-table-nullday, +.mec-single-event .mec-current, +.mec-single-event .mec-event-meta .mec-events-event-categories a, +.mec-single-event .mec-event-meta dd, +.mec-single-event .mec-next-event-details abbr, +.mec-yearly-view-wrap .mec-agenda-date-wrap i, +.mec-yearly-view-wrap .mec-agenda-date-wrap span.mec-agenda-day, +.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day, +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span, +.mec-skin-tile-month-navigator-container .mec-next-month, +.mec-skin-tile-month-navigator-container .mec-previous-month, +.mec-events-agenda-wrap span.mec-agenda-day, +.mec-events-agenda-wrap .mec-agenda-time, +.mec-event-grid-modern .event-grid-modern-head .mec-event-day, +.mec-event-grid-modern .mec-event-content p, +.mec-event-grid-clean .mec-event-content p, +.mec-event-grid-classic .mec-event-content p, +.mec-event-list-modern .mec-event-date .event-f, +.mec-event-list-modern .mec-event-date .event-da, +.mec-wrap .mec-time-details, +.mec-wrap .mec-event-detail, +.mec-wrap .mec-event-loc-place, +.mec-skin-tile-month-navigator-container .mec-next-month a, +.mec-skin-tile-month-navigator-container .mec-previous-month a, +.mec-skin-tile-month-navigator-container .mec-next-month, +.mec-skin-tile-month-navigator-container .mec-previous-month, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year a, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year a, +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month, +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month, +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month a, +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month a, +.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2, +.mec-calendar.mec-calendar-daily .mec-calendar-d-top h3, +.mec-calendar.mec-calendar-daily .mec-today-container .mec-today-count, +.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event, +.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event:hover, +.mec-events-meta-group-countdown .countdown-w .block-w li, +.mec-countdown-details .countdown-w .clockdiv li p, +.mec-event-schedule-content dl dt.mec-schedule-description, +.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title, +.mec-single-event .mec-event-meta dd a, +.mec-single-event .mec-address, +.mec-next-month a, +.mec-previous-month a, +.mec-single-event .mec-event-meta dd.mec-organizer-email a, +.mec-single-event .mec-events-meta-date dd span, +.mec-single-event .mec-single-event-additional-organizers dd span, +.mec-single-event .mec-single-event-organizer dd span, +.mec-related-event-content, +.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available, +.mec-wrap .button, +.mec-wrap a.button:not(.owl-dot), +.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs), +.mec-wrap input[type=button], +.mec-wrap input[type=reset], +.mec-wrap input[type=submit] { + color: #000; +} + +.mec-event-grid-modern .mec-event-footer .mec-modal-booking-button:hover, +.mec-wrap .mec-av-spot-wrap p, +.mec-event-tile-view ul.mec-categories li.mec-category a, +.mec-event-tile-view .mec-event-loc-place, +.mec-skin-grid-container .mec-event-grid-novel .mec-event-address, +.mec-skin-grid-container .mec-event-grid-novel .mec-event-detail, +.mec-skin-grid-container .mec-event-grid-novel .mec-event-month, +.mec-skin-grid-container .mec-event-grid-novel ul.mec-categories li.mec-category a, +.mec-skin-grid-container .mec-event-grid-novel ul.mec-categories li.mec-category a:before, +.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers a, +.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers i:before, +.mec-event-grid-colorful ul.mec-categories li.mec-category a, +.mec-event-grid-colorful .mec-event-content .mec-grid-event-location, +.mec-event-grid-colorful .event-grid-modern-head .mec-event-day, +.mec-event-grid-colorful ul.mec-categories li.mec-category a, +.mec-wrap .mec-skin-grid-events-container .mec-time-details, +.mec-wrap .mec-skin-grid-events-container .mec-event-loc-place, +.mec-wrap .mec-event-grid-classic .mec-time-details { + color: #fff; +} + +.mec-wrap select:focus-visible, +.mec-wrap input:focus-visible { + outline: #000 auto 1px; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-available-spots .plus:focus, +.mec-booking .mec-event-tickets-list .mec-ticket-available-spots .minus:focus, +.mec-calendar .mec-calendar-side .mec-next-month:focus, +.mec-calendar .mec-calendar-side .mec-previous-month:focus { + outline: #000 auto 1px; +} \ No newline at end of file diff --git a/assets/css/a11y.min.css b/assets/css/a11y.min.css new file mode 100755 index 0000000..ada0e11 --- /dev/null +++ b/assets/css/a11y.min.css @@ -0,0 +1 @@ +.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day,.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt.mec-weekly-disabled.mec-table-nullday span{font-weight:300}.event-carousel-type2-head .mec-event-carousel-content-type2 .mec-event-date-info,.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button,.mec-calendar .mec-calendar-side .mec-next-month a,.mec-calendar .mec-calendar-side .mec-previous-month a,.mec-calendar .mec-event-article .mec-event-detail,.mec-calendar .mec-table-nullday,.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month,.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month a,.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month,.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month a,.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day,.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2,.mec-calendar.mec-calendar-daily .mec-calendar-d-top h3,.mec-calendar.mec-calendar-daily .mec-today-container .mec-today-count,.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event,.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event:hover,.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span,.mec-checkboxes-search .mec-searchbar-category-wrap,.mec-countdown-details .countdown-w .clockdiv li p,.mec-event-footer .mec-booking-button,.mec-event-footer .mec-modal-booking-button,.mec-event-grid-classic .mec-event-content p,.mec-event-grid-clean .mec-event-content p,.mec-event-grid-modern .event-grid-modern-head .mec-event-day,.mec-event-grid-modern .mec-event-content p,.mec-event-list-modern .mec-event-date .event-da,.mec-event-list-modern .mec-event-date .event-f,.mec-event-schedule-content dl dt.mec-schedule-description,.mec-event-sharing-wrap li a,.mec-event-sharing-wrap:hover li ul li a,.mec-events-agenda-wrap .mec-agenda-time,.mec-events-agenda-wrap span.mec-agenda-day,.mec-events-meta-group-countdown .countdown-w .block-w li,.mec-load-more-button,.mec-next-month a,.mec-previous-month a,.mec-price-details,.mec-price-details span,.mec-related-event-content,.mec-single-event .mec-address,.mec-single-event .mec-current,.mec-single-event .mec-event-meta .mec-events-event-categories a,.mec-single-event .mec-event-meta dd,.mec-single-event .mec-event-meta dd a,.mec-single-event .mec-event-meta dd.mec-organizer-email a,.mec-single-event .mec-events-meta-date dd span,.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available,.mec-single-event .mec-next-event-details abbr,.mec-single-event .mec-single-event-additional-organizers dd span,.mec-single-event .mec-single-event-organizer dd span,.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title,.mec-skin-tile-month-navigator-container .mec-next-month,.mec-skin-tile-month-navigator-container .mec-next-month a,.mec-skin-tile-month-navigator-container .mec-previous-month,.mec-skin-tile-month-navigator-container .mec-previous-month a,.mec-wrap .button,.mec-wrap .mec-event-detail,.mec-wrap .mec-event-loc-place,.mec-wrap .mec-time-details,.mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,.mec-wrap .mec-totalcal-box i,.mec-wrap .mec-totalcal-box input,.mec-wrap .mec-totalcal-box label,.mec-wrap .mec-totalcal-box select,.mec-wrap a.button:not(.owl-dot),.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs),.mec-wrap input[type=button],.mec-wrap input[type=reset],.mec-wrap input[type=submit],.mec-yearly-view-wrap .mec-agenda-date-wrap i,.mec-yearly-view-wrap .mec-agenda-date-wrap span.mec-agenda-day,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year a,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year a{color:#000}.mec-event-grid-colorful .event-grid-modern-head .mec-event-day,.mec-event-grid-colorful .mec-event-content .mec-grid-event-location,.mec-event-grid-colorful ul.mec-categories li.mec-category a,.mec-event-grid-modern .mec-event-footer .mec-modal-booking-button:hover,.mec-event-tile-view .mec-event-loc-place,.mec-event-tile-view ul.mec-categories li.mec-category a,.mec-skin-grid-container .mec-event-grid-novel .mec-event-address,.mec-skin-grid-container .mec-event-grid-novel .mec-event-detail,.mec-skin-grid-container .mec-event-grid-novel .mec-event-month,.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers a,.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers i:before,.mec-skin-grid-container .mec-event-grid-novel ul.mec-categories li.mec-category a,.mec-skin-grid-container .mec-event-grid-novel ul.mec-categories li.mec-category a:before,.mec-wrap .mec-av-spot-wrap p,.mec-wrap .mec-event-grid-classic .mec-time-details,.mec-wrap .mec-skin-grid-events-container .mec-event-loc-place,.mec-wrap .mec-skin-grid-events-container .mec-time-details{color:#fff}.mec-wrap input:focus-visible,.mec-wrap select:focus-visible{outline:#000 auto 1px}.mec-booking .mec-event-tickets-list .mec-ticket-available-spots .minus:focus,.mec-booking .mec-event-tickets-list .mec-ticket-available-spots .plus:focus,.mec-calendar .mec-calendar-side .mec-next-month:focus,.mec-calendar .mec-calendar-side .mec-previous-month:focus{outline:#000 auto 1px} \ No newline at end of file diff --git a/assets/css/admin-calendar.min.css b/assets/css/admin-calendar.min.css new file mode 100755 index 0000000..79c8c9a --- /dev/null +++ b/assets/css/admin-calendar.min.css @@ -0,0 +1,288 @@ +.mec-calendar .mec-calendar-side { + width: 590px; + display: table-cell; + padding: 40px; + position: relative; + text-align: center; + box-shadow: 0 1px 5px 6px rgba(0, 0, 0, .005) inset +} + +.mec-calendar .mec-calendar-header { + position: relative; + margin-top: 8px; + margin-bottom: 16px +} + +.mec-calendar .mec-calendar-header h2 { + text-transform: uppercase; + font-size: 22px; + font-weight: 700; + color: #333 +} + +.mec-calendar dl { + display: table; + margin: 0; + border: none; + padding: 0; + table-layout: fixed +} + +.mec-calendar dt { + display: table-cell; + transition: .66s; + color: #a4aab1; + background: #fff; + border-radius: 44px; + font-size: 16px; + width: 80px; + height: 80px; + line-height: 80px; + text-align: center +} + +.mec-calendar .mec-calendar-side .mec-next-month, +.mec-calendar .mec-calendar-side .mec-previous-month { + cursor: pointer; + position: absolute; + top: 0; + min-width: 50px; + height: 50px; + line-height: 50px; + text-align: center; + background: #fff; + color: #a9a9a9; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + padding-left: 10px; + padding-right: 10px; + border: 1px solid #efefef; + border-top: none; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, .015); + transition: .33s +} + +.mec-calendar .mec-calendar-side .mec-next-month i, +.mec-calendar .mec-calendar-side .mec-previous-month i { + font-size: 12px; + color: #40d9f1; + cursor: pointer +} + +.mec-calendar .mec-calendar-side .mec-next-month:hover, +.mec-calendar .mec-calendar-side .mec-previous-month:hover { + background-color: #f9f9f9; + color: #40d9f1 +} + +.mec-box-calendar.mec-calendar .mec-has-event a, +.mec-box-calendar.mec-calendar dt { + border-radius: 0 +} + +.mec-box-calendar.mec-calendar .mec-calendar-header { + margin-top: 2px; + margin-bottom: 30px +} + +.mec-box-calendar.mec-calendar dt { + border-bottom: 1px solid #eaeaea; + border-left: 1px solid #eaeaea +} + +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month, +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month { + border-radius: 2px; + top: 40px; + border: 1px solid #eee; + height: 30px; + line-height: 30px; + z-index: 1 +} + +.mec-calendar.mec-event-calendar-classic, +.mec-calendar.mec-event-calendar-classic .mec-calendar-side { + border: none; + padding: 0; + width: 100%; + height: 100%; + box-shadow: none +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-side { + display: block +} + +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-row, +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head { + width: 100% +} + +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head { + background: #f5f6f7 +} + +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head .mec-calendar-day-head { + background: 0 0; + height: unset; + line-height: 36px; + border-top: 1px solid #eaeaea +} + +.mec-calendar.mec-event-calendar-classic dl dt { + width: 15%; + height: 136px; + line-height: 1.2; + text-align: left; + padding: 5px 7px; + position: relative +} + +.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month, +.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-previous-month { + top: 0 +} + +.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month { + right: 0 +} + +.mec-event-container-simple .mec-monthly-tooltip h4 { + font-size: 13px; + font-weight: 500; + margin: 0; + color: #444; + border: none +} + +.mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple { + padding: 0 2px; + display: block +} + +.mec-calendar.mec-event-container-simple dl dt.mec-calendar-day { + color: #000 +} + +.mec-calendar.mec-event-container-simple dl dt.mec-calendar-day div:first-child { + margin-bottom: 10px +} + +.mec-calendar.mec-event-container-simple .mec-calendar-row dt, +.mec-calendar.mec-event-container-simple .mec-calendar-row dt:last-child, +.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt, +.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt:last-child { + border-width: 2px +} + +@font-face { + font-family: simple-line-icons; + src: url("../fonts/Simple-Line-Icons.eot?v=2.3.1"); + src: url("../fonts/Simple-Line-Icons.eot?v=2.3.1#iefix") format("embedded-opentype"), url("../fonts/Simple-Line-Icons.woff2?v=2.3.1") format("woff2"), url("../fonts/Simple-Line-Icons.woff?v=2.3.1") format("woff"), url("../fonts/Simple-Line-Icons.ttf?v=2.3.1") format("truetype"), url("../fonts/Simple-Line-Icons.svg?v=2.3.1#simple-line-icons") format("svg"); + font-weight: 400; + font-style: normal +} + +[class*=mec-sl-] { + font-family: simple-line-icons; + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.mec-sl-angle-right:before { + content: "\e606" +} + +.mec-sl-angle-left:before { + content: "\e605" +} + +.mec-load-month-link { + color: #a9a9a9; + font-size: 12px; + font-weight: 400; + letter-spacing: 1px; + text-transform: uppercase; + text-decoration: unset; + transition: .33s +} + +.mec-wrap * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day, +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day:hover { + color: #40d9f1; + border-bottom: 2px solid #40d9f1; + background: #fff +} + +.mec-calendar.mec-event-calendar-classic .mec-selected-day, +.mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover { + font-weight: 700; + background: #fafafa; + border-bottom: none +} + +.mec-color, +.mec-color-before :before, +.mec-color-hover:hover, +.mec-wrap .mec-color, +.mec-wrap .mec-color-before :before, +.mec-wrap .mec-color-hover:hover { + color: #40d9f1; + margin: 0; + width: unset; + height: unset +} + +.mec-box-calendar.mec-calendar dl dt:last-child { + border-right: 1px solid #eaeaea +} + +.mec-subscribe-to-calendar-container { + display: none +} + +.mec-admin-calendar-attendees-count { + font-size: 14px; + font-weight: 500; + color: #40d9f1 +} + +.mec-admin-calendar-attendees-count:hover { + text-decoration: underline; + cursor: pointer +} + +.mec-add-event-popup .lity-container { + width: 900px; + height: auto; + max-height: 70vh; + max-width: unset +} + +.mec-add-event-popup .lity-content { + background: #fff; + max-height: 400px; + overflow-y: scroll !important +} + +.mec-add-event-popup .lity-container .mec-attendees-head { + padding: 0 20px 18px; + margin-top: 25px +} + +.mec-attendees-content:not(:last-child) { + border-bottom: 1px solid #eee +} \ No newline at end of file diff --git a/assets/css/admin-upcoming.min.css b/assets/css/admin-upcoming.min.css new file mode 100755 index 0000000..db4c933 --- /dev/null +++ b/assets/css/admin-upcoming.min.css @@ -0,0 +1 @@ +#posts-filter, ul.subsubsub, .mec-credit-url{display: none} \ No newline at end of file diff --git a/assets/css/backend.css b/assets/css/backend.css new file mode 100755 index 0000000..0c324ae --- /dev/null +++ b/assets/css/backend.css @@ -0,0 +1,13908 @@ +body.toplevel_page_mec-intro, +body.m-e-calendar_page_MEC-settings, +body.mec_invoice_page_api-key-app, +body.m-e-calendar_page_MEC-addons, +body.m-e-calendar_page_MEC-report, +body.m-e-calendar_page_MEC-ix { + background: #fff; +} + +body.toplevel_page_mec-intro #webnus-dashboard .mec-cmsg-2-notification-box-wrap { + margin-top: 0 !important; +} + +#mec_location_thumbnail_img img, +#mec_organizer_thumbnail_img img, +#mec_sponsor_thumbnail_img img, +#mec_thumbnail_img img { + max-width: 250px; +} + +.taxonomy-mec_label .column-id, +.taxonomy-mec_location .column-id, +.taxonomy-mec_organizer .column-id, +.taxonomy-mec_speaker .column-id, +.taxonomy-mec_sponsor .column-id { + width: 40px; +} + +.taxonomy-mec_label .column-primary, +.taxonomy-mec_location .column-primary, +.taxonomy-mec_organizer .column-primary, +.taxonomy-mec_speaker .column-primary, +.taxonomy-mec_sponsor .column-primary { + width: 250px; +} + +.mec-color { + width: 16px; + height: 16px; + display: inline-block; + border-radius: 50%; + margin: 6px 10px 6px 0; + vertical-align: middle; +} + +.mec-send-email-button { + background: #008aff; + color: #fff; + width: 100%; + display: block; + text-align: center; + font-size: 20px; + padding: 10px 0; + margin-top: 18px; + font-weight: 700; + border-radius: 4px; + cursor: pointer; +} + +.mec-send-email-button:hover { + opacity: 0.9; +} + +.mec-event-color-container, +.mec-event-title-container { + display: inline-block; +} + +.mec-meta-box-colors-container .mec-form-row { + padding: 0 !important; +} + +.mec-meta-box-colors-container .mec-form-row .wp-picker-container { + margin: 10px 0; +} + +.mec-available-color-row { + margin-top: 0; +} + +.mec-available-color-row .mec-color { + cursor: pointer; +} + +.mec-widget-container a { + text-decoration: none; +} + +.mec-widget-container label { + padding-right: 15px; +} + +.mec-util-hidden { + display: none; +} + +.button.mec-util-hidden { + display: none; +} + +.wns-be-container { + max-width: 1020px; + background-color: #f7f8f9; + background-repeat: repeat-x; + border: 1px solid #dcdfe1; + border-radius: 15px; + overflow: hidden; + margin: 25px auto; + overflow: visible; + box-shadow: 0 1px 4px rgb(0 0 0 / 1%); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} + +.wns-be-sidebar { + width: 230px; + float: left; + position: relative; +} + +.wns-be-sidebar ul.wns-be-group-menu, +.wns-be-sidebar ul.wns-be-group-menu li { + list-style: none; + margin: 0; + transition: all 0.2s ease; +} + +.wns-be-sidebar .wns-be-group-menu li a { + display: block; + position: relative; + outline: 0; + padding: 13px 4px 13px 20px; + background: #e3e5e7; + background: 0 0; + border: none; + color: #3f454a; + font-size: 14px; + font-weight: 600; + text-decoration: none; + transition: all 0.2s ease; +} + +.wns-be-sidebar .wns-be-group-menu>li:hover>a { + color: #07bbe9; + background: #fff; + opacity: 1; +} + +.wns-be-sidebar .wns-be-group-menu>li.active>a { + text-shadow: none; + background: #ecf9fd; + color: #07bbe9; + border-top: 1px solid #ccecf4; +} + +.wns-be-sidebar .wns-be-group-menu>li:first-child>a { + border-top: none; +} + +.wns-be-main { + background: #fff; + margin-left: 230px; + border-left: 1px solid #e6e9eb; + padding-bottom: 84px; + box-shadow: inset 0 1px 0 #fff; + min-height: 1110px; + position: relative; + z-index: 2; +} + +.wns-be-main .wns-saved-settings { + margin: 0; + border-bottom: 1px solid #dedede; + background: #dff0d8; + color: #468847; + padding: 8px 35px 8px 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); +} + +.wns-be-container .dpr-btn { + display: inline-block; + font-size: 13px; + padding: 0 16px 1px; + height: 36px; + margin-right: 3px; + line-height: 35px; + color: #555; + border: 1px solid #ccc; + background: #f7f7f7; + text-decoration: none; + transition: 0.24s all ease; + -webkit-transition: 0.24s all ease; +} + +.wns-be-container .dpr-btn:hover { + background: #fcfcfc; + border-color: #999; + color: #303030; +} + +.wns-be-container .dpr-btn.dpr-save-btn { + display: inline-block; + text-decoration: none; + padding: 0 16px; + height: 36px; + line-height: 36px; + font-weight: 500; + font-size: 14px; + border-radius: 20px; + box-shadow: 0 1px 2px rgb(0 0 0 / 2%); + text-shadow: none; + margin-right: 5px; + background: #fff; + color: #0ec3f3; + border: 1px solid #d1e5ec; + letter-spacing: 0.2px; + transition: 0.24s all ease; +} + +.wns-be-container .dpr-btn.dpr-save-btn { + box-shadow: 0 0 0 4px #e4ffe6; + text-shadow: none; + margin-right: 5px; + background: #64e385; + color: #fff; + border: none; + cursor: pointer; + padding: 1px 22px; +} + +.wns-be-container .dpr-btn.dpr-save-btn:hover { + box-shadow: 0 0 0 6px rgb(100 227 133 / 28%); + background: #54d274; + border-color: #4ac76a; +} + +.wns-be-container .wns-be-group-tab h2, +.wns-be-container .wns-be-group-tab h4 { + margin-bottom: 27px; + margin-top: 0; + padding: 12px 15px 12px 15px; + font-size: 21px; + line-height: 27px; + letter-spacing: -0.4px; + font-weight: 700; + position: relative; +} + +.wns-be-container .wns-be-group-tab h4, +.wns-be-container .wns-be-group-tab h5 { + margin: 5px 0 10px; +} + +.wns-be-container .wns-be-group-tab h2:before, +.wns-be-container .wns-be-group-tab h4:before { + content: ""; + width: 4px; + height: 16px; + margin-right: 5px; + background-color: #07bbe9; + display: block; + position: absolute; + left: 0; + top: 19px; +} + +.wns-be-container .wns-be-group-tab h5 { + font-size: 15px; + font-weight: 700; + margin: 30px 0 25px; + position: relative; +} + +.wns-be-container .wns-be-group-tab h5::after { + content: ""; + display: inline-block; + width: 100%; + height: 1px; + border-bottom: 1px solid #eee; + position: absolute; + top: 9px; + margin-left: 10px; +} + +.wns-be-group-tab #booking_form_option h5 { + font-size: 16px; + font-weight: 400; + margin: 35px 5px 10px; +} + +.wns-be-container .wns-be-group-tab p { + font-size: 12px; + line-height: 1.6; + color: #8d9599; + font-weight: 400; + margin: 0; +} + +.wns-be-sidebar .wns-be-group-tab-link-a span { + display: block; +} + +.wns-be-sidebar .wns-be-group-tab-link-a span.wns-be-group-menu-title { + padding-left: 24px; + padding-top: 1px; + font-size: 14px; + font-weight: 600; +} + +.wns-be-sidebar li.active ul.subsection { + padding-top: 8px; + padding-bottom: 12px; + background: #fff; + border-bottom: 1px solid #e6e9eb; + margin: 0; +} + +.wns-be-sidebar li .subsection a { + background: #fff; + color: #686f73; + opacity: 1; + font-size: 13px; + font-weight: 400; + cursor: pointer; + padding: 8px 4px 8px 46px; +} + +.wns-be-sidebar li .subsection a:hover { + background: #fafafa; + color: #242525; +} + +.wns-be-container li a:active, +.wns-be-container li a:focus { + outline: 0; + box-shadow: none; +} + +.wns-be-sidebar .wns-be-group-menu li .subsection li.active a { + color: #00b0dd; + position: relative; + z-index: 99; + font-weight: 500; +} + +.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after, +.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before { + position: absolute; + z-index: 9999; + content: " "; + height: 0; + width: 0; + border: 8px solid transparent; + border-right-color: #fff; + right: -1px; + top: 10px; +} + +.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before { + border-right-color: #d7d8d9; + right: 0; +} + +.wns-be-sidebar li a i { + color: #a0abb5; + vertical-align: middle; + font-size: 16px; + position: absolute; + margin-top: 2px; +} + +.wns-be-sidebar .wns-be-group-menu li.active>a i, +.wns-be-sidebar .wns-be-group-menu li:hover>a i { + color: #07bbe9; +} + +.wns-be-sidebar .has-sub span.extra-icon { + float: right; + padding: 4px 7px 4px; + margin-left: 4px; + margin-right: 10px; + font-family: sans-serif; + font-size: 9px; + font-weight: 600; + line-height: 9px; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border: 0 solid transparent; +} + +.wns-be-sidebar .has-sub span.extra-icon i { + margin-left: -3px; + margin-top: 2px; + color: #bac6d0; + font-size: 10px; +} + +.wns-be-sidebar .wns-be-group-tab-link-a span.extra-icon i { + right: 10px; + font-size: 10px; +} + +.wns-be-sidebar .wns-be-group-menu li.active>a span.extra-icon i { + margin-top: 1px; +} + +.wns-be-container #wns-be-footer { + border-top: 1px solid #dedede; + z-index: 999; + padding: 25px 20px 20px; + background: #fafafa !important; + height: 44px; + text-align: right; + border-radius: 0 0 14px 14px; +} + +.wns-be-container #wns-be-content { + padding: 0px 20px 40px 40px; +} + +.wns-be-container #wns-be-infobar { + background: #fff; + border-bottom: 1px solid #e6e9eb; + padding: 20px; + text-align: right; + box-shadow: inset 0 1px 0 #fcfcfc; + height: 79px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + position: relative; + border-radius: 14px 14px 0 0; +} + +.wns-be-container #wns-be-infobar:before { + content: ""; + width: 93px; + height: 77px; + display: block; + position: absolute; + left: 0; + top: 0; + background: #fff url(../img/mec-logo-icon.png) no-repeat center; + background-size: 50px; + z-index: 997; + border-radius: 14px 0 0 0; +} + +.wns-be-container .notice-yellow { + margin: 0; + border-bottom: 1px solid #dedede; + background-color: #fcf8e3; + color: #c09853; + padding: 8px 35px 8px 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.wns-be-container .notice-red, +.wns-be-container .wns-be-field-errors { + margin: 0; + border-bottom: 1px solid #dedede; + background-color: #f2dede; + color: #b94a48; + padding: 8px 35px 8px 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.wns-be-container #mec_styling_form .button, +.wns-be-container #mec_styling_form .button-secondary { + border-color: #e6e9eb; + background: #fff; + vertical-align: top; + border-radius: 4px; + box-shadow: 0 3px 10px -1px rgb(0 0 0 / 1%); + transition: all 0.2s ease; +} + +.wns-be-container .wp-color-result-text { + border-color: #e6e9eb; +} + +.wns-be-container #mec_styling_form .button-secondary:hover, +.wns-be-container #mec_styling_form .button.hover, +.wns-be-container #mec_styling_form .button:hover { + background: #f0f9fc; + border-color: #d1e5ec; +} + +.wns-be-container #mec_styling_form .wp-color-result:hover { + background: #f0f9fc; +} + +@media (max-width: 1280px) { + .wns-be-container { + width: 98%; + } + + .wns-be-container #wns-be-content { + padding: 5px 20px 20px; + } + + .wns-be-sidebar li .subsection a { + padding-left: 24px; + } + + .wns-be-main { + margin-left: 210px; + } + + .wns-be-sidebar { + width: 210px; + } + + .mec-form-row .mec-col-8 label, + .mec-form-row .mec-col-9 label { + padding-right: 14px; + } + + .wns-be-container #wns-be-content { + padding: 5px 10px 0; + } + + .mec-container { + padding: 8px; + } +} + +@media (max-width: 1024px) { + .wns-be-main .mec-form-row .mec-col-3 { + min-width: 200px; + } + + .wns-be-main .mec-form-row .mec-col-9 { + width: calc(100% - 210px); + } +} + +@media (max-width: 860px) { + .wns-be-main .mec-form-row .mec-col-3 { + max-width: 100% !important; + width: 100% !important; + margin-bottom: 10px !important; + } + + .wns-be-main .mec-form-row .mec-col-9 { + width: 100% !important; + } + + .mec-container { + padding-left: 0 !important; + } + + .wns-be-container #wns-be-infobar:before { + display: none; + } + + .mec-search-settings-wrap { + margin-top: 0 !important; + } + + #wns-be-infobar.sticky { + top: 0 !important; + } + + #mec-search-settings { + margin-bottom: 10px !important; + } +} + +@media (max-width: 640px) { + .wns-be-sidebar { + width: 150px; + } + + .wns-be-main { + margin-left: 150px; + } +} + +@media (max-width: 480px) { + a.dpr-btn.dpr-save-btn { + display: block !important; + text-align: center !important; + margin-top: 20px !important; + } + + .mec-search-settings-wrap { + text-align: center !important; + display: block !important; + } + + #mec-search-settings { + margin: 0 !important; + width: 100% !important; + } + + .wns-be-container #wns-be-infobar { + height: auto !important; + } + + .wns-be-container .wns-be-sidebar { + width: 100%; + position: unset; + float: none; + } + + .wns-be-container .wns-be-main { + margin-left: 0; + width: 100%; + position: unset; + } + + .wns-be-container { + margin-top: 50px; + } + + .wns-be-container #wns-be-infobar:before { + width: 100%; + } + + .wns-be-container #wns-be-infobar { + height: 150px; + } + + #mec-search-settings { + margin-top: 80px; + width: 181px; + } +} + +body.post-type-mec-events th.column-primary { + width: 35%; +} + +body.post-type-mec-events th.column-start_date { + width: 100px; +} + +body.post-type-mec-events th.column-end_date { + width: 100px; +} + +body.post-type-mec-events th.column-repeat { + width: 75px; +} + +body.post-type-mec-events th.column-author { + width: 150px; +} + +body.post-type-mec-books th.column-primary { + width: 20%; +} + +body.post-type-mec-books th.column-event { + width: 170px; +} + +body.post-type-mec-books th.column-bdate { + width: 120px; +} + +body.post-type-mec-books th.column-confirmation { + width: 120px; +} + +body.post-type-mec-books th.column-verification { + width: 120px; +} + +body.post-type-mec-books th.column-author { + width: 150px; +} + +.mec-meta-box-labels-container .mec-form-row { + overflow: auto; +} + +.mec-form-row.mec-last-tooltip { + padding-bottom: 100px !important; +} + +.mec-tooltip { + display: inline-block; + position: relative; + margin-right: 10px; + cursor: help; + bottom: 0; + /* padding-right: 10px; */ +} + +.mec-tooltip:last-child { + margin-right: 0; +} + +.mec-tooltip:hover:after { + background: #313130; + border-radius: 5px; + bottom: 24px; + color: #fff; + content: attr(title); + left: -75px; + padding: 10px; + position: absolute; + z-index: 98; + width: 240px; +} + +.mec-tooltip:hover:before { + border: solid; + border-color: #313130 transparent; + border-width: 6px 6px 0; + bottom: 18px; + content: ""; + left: 30%; + position: absolute; + z-index: 99; +} + +.mec-tooltip .dashicons-before:before { + font-size: 24px; + color: #40d9f1; + width: 24px; + height: 38px; + line-height: 38px; + padding: 0; +} + +.mec-tooltip a:focus { + box-shadow: none; +} + +.mec-form-row .bootstrap_unvalid { + display: block; + border: 2px solid red; + position: relative; + display: inline-block; + border-bottom: 1px dotted #000; +} + +.mec-tooltiptext { + visibility: hidden; + width: 120px; + background-color: red; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 0; + position: absolute; + z-index: 1; +} + +.ui-datepicker { + background-color: #fff; + border: 1px solid #66afe9; + border-radius: 4px; + box-shadow: 0 0 8px rgba(102, 175, 233, 0.6); + display: none; + margin-top: 4px; + padding: 10px; + width: 240px; +} + +.ui-datepicker a, +.ui-datepicker a:hover { + text-decoration: none; + cursor: pointer; +} + +.ui-datepicker a:hover, +.ui-datepicker td:hover a { + color: #2c6396; + -webkit-transition: color 0.1s ease-in-out; + -moz-transition: color 0.1s ease-in-out; + -o-transition: color 0.1s ease-in-out; + transition: color 0.1s ease-in-out; +} + +.ui-datepicker .ui-datepicker-header { + margin-bottom: 4px; + text-align: center; +} + +.ui-datepicker .ui-datepicker-title { + font-weight: 700; +} + +.ui-datepicker .ui-datepicker-next, +.ui-datepicker .ui-datepicker-prev { + cursor: default; + font-family: dashicons; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: 400; + height: 20px; + line-height: 1.4; + margin-top: 2px; + width: 20px; +} + +.ui-datepicker .ui-datepicker-prev { + float: left; + text-align: left; +} + +.ui-datepicker .ui-datepicker-next { + float: right; + text-align: center; +} + +.ui-datepicker .ui-datepicker-prev:before { + content: "\f341"; +} + +.ui-datepicker .ui-datepicker-next:before { + content: "\f345"; +} + +.ui-datepicker .ui-icon { + display: none; +} + +.ui-datepicker .ui-datepicker-calendar { + table-layout: fixed; + width: 100%; +} + +.ui-datepicker .ui-datepicker-calendar td, +.ui-datepicker .ui-datepicker-calendar th { + text-align: center; + padding: 4px 0; +} + +.ui-datepicker .ui-datepicker-calendar td { + border-radius: 4px; + -webkit-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + -moz-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + -o-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; +} + +.ui-datepicker .ui-datepicker-calendar td:hover { + background-color: #eee; + cursor: pointer; +} + +.ui-datepicker .ui-datepicker-calendar td a { + text-decoration: none; +} + +.ui-datepicker .ui-datepicker-current-day { + background-color: #4289cc; +} + +.ui-datepicker .ui-datepicker-current-day a { + color: #fff; +} + +.ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover { + background-color: #fff; + cursor: default; +} + +.mec-col-1, +.mec-col-10, +.mec-col-11, +.mec-col-12, +.mec-col-2, +.mec-col-3, +.mec-col-4, +.mec-col-5, +.mec-col-6, +.mec-col-7, +.mec-col-8, +.mec-col-9 { + position: relative; + min-height: 1px; + padding: 0; + margin: 0; +} + +@media (min-width: 783px) { + + .mec-col-1, + .mec-col-10, + .mec-col-11, + .mec-col-12, + .mec-col-2, + .mec-col-3, + .mec-col-4, + .mec-col-5, + .mec-col-6, + .mec-col-7, + .mec-col-8, + .mec-col-9 { + float: left; + } + + .mec-col-12 { + width: 99%; + } + + .mec-col-11 { + width: 90.66666667%; + } + + .mec-col-10 { + width: 82.33333333%; + } + + .mec-col-9 { + width: 74%; + } + + .mec-col-8 { + width: 65.66666667%; + } + + .mec-col-7 { + width: 57.33333333%; + } + + .mec-col-6 { + width: 49%; + } + + .mec-col-5 { + width: 40.66666667%; + } + + .mec-col-4 { + width: 32.33333333%; + } + + .mec-col-3 { + width: 24%; + } + + .mec-col-2 { + width: 15.66666667%; + } + + .mec-col-1 { + width: 7.33333333%; + } +} + +#mec-occurrences .mec-occurrences-list, +#mec_bfixed_form_fields, +#mec_event_form_fields, +#mec_orgz_form_row, +#mec_reg_form_fields { + background: #f7f8f9; + padding: 20px; + margin: 0 0 20px 0; + border-radius: 3px; + min-height: 150px; + border: 2px dashed #dcdee0; +} + +#mec-occurrences .mec-occurrences-list li, +#mec_bfixed_form_fields li, +#mec_event_form_fields li, +#mec_orgz_form_row li, +#mec_reg_form_fields li { + border-radius: 5px; + padding: 25px; + background: #fff; + position: relative; + transition: all 0.3s ease; + border: 1px solid #f1f3f5; + box-shadow: 0 1px 5px rgb(0 0 0 / 2%); +} + +#mec_reg_form_fields li div input, +#mec_reg_form_fields li div select { + display: block; +} + +#mec_bfixed_form_fields li ul, +#mec_event_form_fields li ul, +#mec_reg_form_fields li ul { + padding-top: 15px; + padding-bottom: 15px; + margin: 1px; +} + +#mec_bfixed_form_fields li ul li, +#mec_event_form_fields li ul li, +#mec_reg_form_fields li ul li { + padding: 7px 30px 7px 46px; +} + +#mec_bfixed_form_fields span.mec_bfixed_field_type, +#mec_bfixed_form_fields span.mec_event_field_type, +#mec_event_form_fields span.mec_event_field_type, +#mec_orgz_form_row span.mec_orgz_item_name, +#mec_reg_form_fields span.mec_reg_field_type { + font-size: 12px; + font-weight: 600; + color: #07bbe9; + text-transform: capitalize; + letter-spacing: 0.3px; + padding-left: 20px; +} + +#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button, +#mec_bfixed_form_fields span.mec_bfixed_field_option_sort, +#mec_bfixed_form_fields span.mec_bfixed_field_remove, +#mec_bfixed_form_fields span.mec_bfixed_field_sort, +#mec_event_form_fields span.mec_event_field_option_sort, +#mec_event_form_fields span.mec_event_field_remove, +#mec_event_form_fields span.mec_event_field_sort, +#mec_orgz_form_row span.mec-additional-organizer-remove, +#mec_orgz_form_row span.mec-additional-organizer-sort, +#mec_reg_form_fields span.mec_reg_field_option_sort, +#mec_reg_form_fields span.mec_reg_field_remove, +#mec_reg_form_fields span.mec_reg_field_sort { + font-size: 0; + color: #fff; +} + +#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button, +#mec_bfixed_form_fields span.mec_bfixed_field_remove, +#mec_event_form_fields span.mec_event_field_remove, +#mec_orgz_form_row span.mec-additional-organizer-remove, +#mec_reg_form_fields span.mec_reg_field_remove { + position: absolute; + right: 0; + top: 0; + background: #fff; +} + +#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before, +#mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before, +#mec_bfixed_form_fields span.mec_bfixed_field_remove:before, +#mec_bfixed_form_fields span.mec_bfixed_field_sort:before, +#mec_event_form_fields span.mec_event_field_option_sort:before, +#mec_event_form_fields span.mec_event_field_remove:before, +#mec_event_form_fields span.mec_event_field_sort:before, +#mec_orgz_form_row span.mec-additional-organizer-remove:before, +#mec_orgz_form_row span.mec-additional-organizer-sort:before, +#mec_reg_form_fields span.mec_reg_field_option_sort:before, +#mec_reg_form_fields span.mec_reg_field_remove:before, +#mec_reg_form_fields span.mec_reg_field_sort:before { + position: absolute; + left: 20px; + top: 23px; + width: 20px; + height: 20px; + display: block; + cursor: move; + font-family: simple-line-icons; + content: "\e023"; + font-size: 15px; + color: #07bbe9; +} + +#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before { + font-weight: 400; +} + +#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before, +#mec_bfixed_form_fields span.mec_bfixed_field_remove:before, +#mec_event_form_fields span.mec_event_field_remove:before, +#mec_orgz_form_row span.mec-additional-organizer-remove:before, +#mec_reg_form_fields span.mec_reg_field_remove:before { + content: "\e082"; + width: 20px; + height: 20px; + left: auto; + right: 15px; + color: #f96666; + cursor: pointer; + font-size: 18px; +} + +#mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before, +#mec_event_form_fields span.mec_event_field_option_sort:before, +#mec_reg_form_fields span.mec_reg_field_option_sort:before { + font-size: 13px; + left: 15px; + top: 25px; + width: 15px; + height: 15px; +} + +#mec_bfixed_form_fields p.mec_bfixed_field_options, +#mec_event_form_fields p.mec_event_field_options, +#mec_reg_form_fields p.mec_reg_field_options { + margin: 12px 0 8px; +} + +#mec_bfixed_form_fields input[type="number"], +#mec_bfixed_form_fields input[type="text"], +#mec_bfixed_form_fields select, +#mec_bfixed_form_fields textarea, +#mec_event_form_fields input[type="number"], +#mec_event_form_fields input[type="text"], +#mec_event_form_fields select, +#mec_event_form_fields textarea, +#mec_reg_form_fields input[type="number"], +#mec_reg_form_fields input[type="text"], +#mec_reg_form_fields select, +#mec_reg_form_fields textarea { + min-width: 260px; + min-height: 34px; + margin-bottom: 7px; + margin-top: 7px; +} + +#mec_bfixed_form_fields textarea, +#mec_event_form_fields textarea, +#mec_reg_form_fields textarea { + min-height: 66px; +} + +#mec_bfixed_form_field_types button, +#mec_bfixed_form_fields button, +#mec_event_form_field_types button, +#mec_event_form_fields button, +#mec_reg_form_field_types button, +#mec_reg_form_fields button { + position: relative; + outline: 0; + background: #fff; + border: 1px solid #e6e9eb; + border-radius: 50px; + padding: 9px 21px 10px 31px; + line-height: 1; + font-size: 12px; + font-weight: 600; + color: #07bbe9; + letter-spacing: 0.4px; + height: auto; + cursor: pointer; + margin-top: 5px; + text-transform: capitalize; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.03); +} + +#mec_bfixed_form_field_types button:hover, +#mec_bfixed_form_fields button:hover, +#mec_event_form_field_types button:hover, +#mec_event_form_fields button:hover, +#mec_reg_form_field_types button:hover, +#mec_reg_form_fields button:hover { + border-color: #07bbe9; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.1); +} + +#mec_bfixed_form_field_types button:before, +#mec_bfixed_form_fields button:before, +#mec_event_form_field_types button:before, +#mec_event_form_fields button:before, +#mec_reg_form_field_types button:before, +#mec_reg_form_fields button:before { + position: absolute; + left: 10px; + color: #07bbe9; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block; + top: 9px; +} + +#mec_bfixed_form_field_types button.red:hover, +#mec_bfixed_form_fields button.red:hover, +#mec_event_form_field_types button.red:hover, +#mec_event_form_fields button.red:hover, +#mec_reg_form_field_types button.red:hover, +#mec_reg_form_fields button.red:hover { + border-color: #ea6485; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.1); +} + +#mec_bfixed_form_field_types button.red:before, +#mec_bfixed_form_fields button.red:before, +#mec_event_form_field_types button.red:before, +#mec_event_form_fields button.red:before, +#mec_reg_form_field_types button.red:before, +#mec_reg_form_fields button.red:before { + position: absolute; + left: 12px; + color: #ea6485; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block; +} + +.mec_form_fields .notification_placeholder, +#mec_bfixed_form_fields .mec_bfixed_notification_placeholder, +#mec_event_form_fields .mec_event_notification_placeholder { + padding: 2px; + display: block; + margin: 10px 0 20px; +} + +@media (max-width: 768px) { + + #mec_bfixed_form_fields input[type="number"], + #mec_bfixed_form_fields input[type="text"], + #mec_bfixed_form_fields select, + #mec_bfixed_form_fields textarea, + #mec_event_form_fields input[type="number"], + #mec_event_form_fields input[type="text"], + #mec_event_form_fields select, + #mec_event_form_fields textarea, + #mec_reg_form_fields input[type="number"], + #mec_reg_form_fields input[type="text"], + #mec_reg_form_fields select, + #mec_reg_form_fields textarea { + min-width: 80px; + width: 100%; + } +} + +.mec-form-row { + padding: 5px 5px 35px; +} + +.wns-be-main .mec-form-row { + padding: 0 5px 20px; + width: 100%; + clear: both; + min-height: 50px; + box-sizing: border-box; +} + +#taxes_option #mec_fees_list .mec-form-row, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row { + padding: 10px; +} + +.post-type-mec-events .mec-form-row { + padding: 0 0 20px 0; +} + +.mec-form-row .mec-col-3 { + margin: 0; + padding-right: 10px; +} + +.mec-form-row label.mec-col-3 { + cursor: default; +} + +.wns-be-main .mec-form-row .mec-col-3:not([name*="mec[settings][tickets]"]):not([for*="mec_tickets_unlimited"]) { + min-width: 290px; + padding: 1px 0 0; + margin: 0; +} + +.wns-be-main .mec-form-row .mec-col-9 { + width: calc(100% - 290px); + float: right; +} + +.mec-form-row .mec-col-9 .mec-box { + position: relative; + border: 1px solid #e6e9eb; + padding: 20px; + margin: 0; + background: #fff; + max-width: 80%; + border-radius: 8px; + box-shadow: 0 1px 3px rgb(0 0 0 / 1%); +} + +.mec-form-row .mec-col-9 .mec-box label { + display: block; + padding: 20px 20px 4px; +} + +.mec-form-row .mec-col-9 .mec-box .mec-tooltip { + position: absolute; + display: block; + width: fit-content; + left: auto; + right: 20px; + bottom: 20px; +} + +#booking_option .mec-form-row .mec-col-8 { + margin: 0; +} + +.mec-options-fields { + padding-top: 25px; + overflow: hidden; + animation: fadeEffect 0.31s; + min-height: 450px; +} + +#mec_booking_form .mec-options-fields, +#mec_integrations_form .mec-options-fields, +#mec_modules_form .mec-options-fields, +#mec_notifications_form .mec-options-fields, +#mec_settings_form .mec-options-fields, +#mec_single_form .mec-options-fields { + display: none; +} + +.mec-options-fields.active { + display: block !important; +} + +@keyframes fadeEffect { + from { + opacity: 0; + margin-left: 12px; + } + + to { + opacity: 1; + margin-left: 0; + } +} + +.mec-form-row:after, +.mec-form-row:before { + content: " "; + display: table; +} + +.mec-form-row:after { + clear: both; +} + +.mec-form-row input[type="number"], +.mec-form-row input[type="text"], +.mec-form-row input[type="url"], +.mec-form-row select, +.mec-form-row textarea { + height: 38px; + box-sizing: border-box; + margin-bottom: 8px; + padding: 0 6px; + box-shadow: none; + border-radius: 2px; + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.05); + margin: 0 1% 0 0; +} + +#mec-notifications .mec-form-row .mec-form-row input[type="text"], +#mec-notifications .mec-form-row .mec-form-row input[type="url"], +#mec-notifications .mec-form-row .mec-form-row select, +#mec-notifications .mec-form-row .mec-form-row textarea, +#mec-notifications .mec-form-row input[type="number"] { + width: 100%; + max-width: 290px; +} + +#mec_location_new_container .mec-form-row input[type="text"], +#mec_organizer_new_container .mec-form-row input[type="text"], +#mec_sponsor_new_container .mec-form-row input[type="text"] { + min-width: 200px; +} + +#mec-notifications .mec-form-row .mec-form-row textarea { + max-width: 100%; +} + +.wns-be-main .mec-form-row input[type="number"]:not([name*="mec[settings][tickets]"]), +.wns-be-main .mec-form-row input[type="password"]:not([name*="mec[settings][tickets]"]), +.wns-be-main .mec-form-row input[type="text"]:not([name*="mec[settings][tickets]"]), +.wns-be-main .mec-form-row input[type="url"]:not([name*="mec[settings][tickets]"]), +.wns-be-main .mec-form-row select:not([name*="mec[settings][tickets]"]), +.wns-be-main .mec-form-row textarea:not([name*="mec[settings][tickets]"]) { + width: 100%; + max-width: 290px; + margin-left: -1px; + margin-right: -1px; + margin-bottom: 0; +} + +.wns-be-main .mec-form-row textarea:not([name*="mec[settings][tickets]"]) { + max-width: unset; +} + +.wns-be-main .mec-form-row .wp-editor-area { + max-width: 100%; + background: #fff; + margin: 0; +} + +#mec_bfixed_form_fields input[type="number"], +#mec_bfixed_form_fields input[type="text"], +#mec_bfixed_form_fields select, +#mec_bfixed_form_fields textarea, +#mec_event_form_fields input[type="number"], +#mec_event_form_fields input[type="text"], +#mec_event_form_fields select, +#mec_event_form_fields textarea, +#mec_reg_form_fields input[type="number"], +#mec_reg_form_fields input[type="text"], +#mec_reg_form_fields select, +#mec_reg_form_fields textarea, +.wns-be-main .mec-form-row input[type="email"], +.wns-be-main .mec-form-row input[type="number"], +.wns-be-main .mec-form-row input[type="password"], +.wns-be-main .mec-form-row input[type="search"], +.wns-be-main .mec-form-row input[type="text"], +.wns-be-main .mec-form-row input[type="url"], +.wns-be-main .mec-form-row select { + border-radius: 5px; + min-height: 38px; + border: none; + background-color: #f7f8f9; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); + margin-bottom: 15px !important; +} + +.select2-container--default .select2-selection--multiple, +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-radius: 5px; + min-height: 38px; + border: none; + background-color: #f7f8f9; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + padding: 5px 0px; + min-height: 28px; + display: inline-block; + margin: 0; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + line-height: 1.2; +} + +.select2-container .select2-search--inline .select2-search__field { + min-height: unset; + margin: 0; + height: 39px; +} + +.select2-container--default .select2-selection--multiple input[type="search"] { + border-radius: unset; + min-height: 2; + border: none; + background-color: transparent; + box-shadow: none; + margin: 0 !important; +} + +.select2-container--default .select2-selection--multiple { + line-height: 17px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered li { + margin-bottom: 0; +} + +.post-type-mec-events .mec-add-event-tabs-wrap .select2-container, +.post-type-mec-events .mec-create-shortcode-tab-content .select2-container, +.wns-be-main .mec-form-row .mec-create-shortcode-tab-content .select2-container { + border: none; + background-color: #f7f8f9; + border-radius: 5px; + line-height: 38px; + padding-left: 10px; + min-height: 38px; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +.mec-add-event-tabs-wrap .select2-container .select2-selection--multiple, +.mec-create-shortcode-tab-content .select2-container .select2-selection--multiple, +.wns-be-main .mec-form-row .select2-container .select2-selection--multiple { + min-height: 38px; + padding: 0; + border: none; + box-shadow: none; + background: 0 0; + border: none !important; + box-shadow: none !important; +} + +.post-type-mec-events .select2-dropdown, +.wns-be-main .mec-form-row .select2-dropdown { + border: 1px solid #ddd !important; +} + +.post-type-mec-events .select2-container--default .select2-selection--single .select2-selection__rendered { + padding-left: 0; +} + +.wns-be-main .mec-form-row input[type="search"] { + line-height: 2 !important; +} + +.wns-be-main .mec-form-row .select2-container { + width: 100% !important; + max-width: 290px !important; +} + +.wns-be-main #mec_messages_form_container input[type="text"] { + max-width: 100%; +} + +.mec-form-row input[type="radio"] { + margin: 0 6px 0 0; +} + +.mec-form-row select { + margin-top: 0; +} + +.mec-form-row select { + min-width: 80px; +} + +.cancellation-period-box { + max-width: 290px; +} + +.mec-form-row .cancellation-period-box input[type="number"] { + width: 48%; +} + +.mec-form-row .cancellation-period-box input[type="number"]:first-child { + margin-right: calc(2% + 4px); +} + +#mec_meta_box_repeat_form .mec-form-row select { + min-width: 65px; +} + +.ui-datepicker select { + min-width: 60px; +} + +#mec_styles_CSS { + max-width: 100%; +} + +.mec-book-status-form select { + display: block; + width: 99%; + margin-top: 10px; + margin-bottom: 10px; +} + +.mec-form-row label { + vertical-align: top; + text-align: left; + margin-top: 0; + margin-bottom: 0; + line-height: 38px; + font-weight: 600; + padding: 0 !important; + display: inline-block; +} + +.mec-form-row input[type="checkbox"]+label { + padding-top: 1px; +} + +.mec-meta-box-labels-container .mec-form-row label { + padding-top: 0; + line-height: 2.1; +} + +#mec_reg_form_fields label, +#mec_reg_form_fields p.description { + display: block; +} + +.mec-form-row label.mec-col-2, +.mec-form-row label.mec-col-4 { + padding-top: 10px; +} + +#mec-event-data .mec-form-row label { + display: block; +} + +#mec_bfixed_form_fields input[type="checkbox"], +#mec_reg_form_fields input[type="checkbox"], +.mec-form-row input[type="checkbox"] { + width: 22px; + height: 22px; + min-height: 0; + background: #f7f8f9; + border: none; + margin: -1px 5px 0 0; + vertical-align: middle; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +#mec_bfixed_form_fields input[type="checkbox"]:checked, +#mec_reg_form_fields input[type="checkbox"]:checked, +.mec-form-row input[type="checkbox"]:checked { + background: #64e385; + border-color: #64e385; +} + +#mec_bfixed_form_fields input[type="checkbox"]:checked:before, +#mec_reg_form_fields input[type="checkbox"]:checked:before, +.mec-form-row input[type="checkbox"]:checked:before { + content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNC42ODgiIHZpZXdCb3g9IjAgMCAyMCAxNC42ODgiPg0KICA8ZyBpZD0idGlja18xXyIgZGF0YS1uYW1lPSJ0aWNrICgxKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk4KSI+DQogICAgPGcgaWQ9Ikdyb3VwXzEiIGRhdGEtbmFtZT0iR3JvdXAgMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA2Ny45OTcpIj4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMTkuNzA3LDY4LjI5YTEsMSwwLDAsMC0xLjQxNCwwTDYuMzEyLDgwLjI3MSwxLjcwNyw3NS42NjZBMSwxLDAsMCwwLC4yOTIsNzcuMDhMNS42LDgyLjM5MmExLDEsMCwwLDAsMS40MTQsMEwxOS43MDcsNjkuN0ExLDEsMCwwLDAsMTkuNzA3LDY4LjI5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk3KSIgZmlsbD0iI2ZmZiIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+DQo="); + line-height: 22px; + width: 15px; + float: none; + margin: 0; +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"], +.post-type-mec-events .components-panel__body input[type="checkbox"] { + border-radius: 4px; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 10%); +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"]:focus, +.post-type-mec-events .components-panel__body input[type="checkbox"]:focus { + outline: unset; + box-shadow: unset; +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"]+label, +.post-type-mec-events .components-panel__body input[type="checkbox"]+label { + padding-top: 1px; +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"], +.post-type-mec-events .components-panel__body input[type="checkbox"] { + width: 22px; + height: 22px; + min-height: 0; + background: #f7f8f9; + border: none; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"]:checked, +.post-type-mec-events .components-panel__body input[type="checkbox"]:checked { + background: #64e385; + border-color: #64e385; + color: #64e385; +} + +.post-type-mec-events #mec_metabox_label input[type="checkbox"]:checked:before, +.post-type-mec-events .components-panel__body input[type="checkbox"]:checked:before { + color: #64e385; + line-height: 16px; + width: 15px; + float: none; + margin: 2px; +} + +#mec_settings_fes_thankyou_page_url, +.mec-form-row .mec-col-4 input[type="number"], +.mec-form-row .mec-col-4 input[type="text"], +.mec-form-row .mec-col-4 select, +.mec-form-row .mec-col-4 textarea { + width: 82% !important; + max-width: 290px; +} + +#mec_calendar_display_options .mec-col-4 input { + margin-left: 20px !important; + width: 80%; +} + +.mec-form-row .description { + display: inline-block; + border-left: 1px dashed #ccc; + line-height: 32px; + padding-left: 12px; + margin-top: 5px; + color: #555; +} + +.mec-form-row .description code { + font-style: normal; +} + +.mec-form-row .time-dv { + font-size: 14px; + font-weight: 700; + margin-right: 1%; + line-height: 38px; +} + +.mec-meta-box-fields { + margin: 30px 10px; +} + +.mec-meta-box-fields>.mec-meta-box-fields { + margin-left: 0; +} + +.mec-meta-box-fields .mec-title { + margin: 5px 0; +} + +.mec-meta-box-fields h4.mec-title { + margin: 40px 0 16px; +} + +.post-type-mec-events h4, +.post-type-mec-events h5, +.post-type-mec_calendars .mec-meta-box-fields h3 { + text-transform: capitalize; + border-bottom: 1px solid #e5e5e5; + padding-bottom: 6px; + margin: 40px 0 16px; + font-size: 15px; + font-weight: 600; +} + +.mec-meta-box-fields .mec-dashicons { + font-size: 20px; + line-height: 22px; + color: #07bbe9; +} + +.mec-form-row .mec-box, +.mec-meta-box-fields .mec-box, +#mec_tickets .mec-box { + background: #fff; + padding: 20px 10px 10px; + margin: 10px 0; + border-radius: 8px; + border: 1px solid #e6e9eb; + box-shadow: 0 1px 4px -1px rgb(0 0 0 / 1%); +} + +.meta-box-sortables .mec-meta-box-fields .mec-box { + padding: 15px; +} + +.mec-form-row .mec-box { + max-width: 960px; +} + +.mec-form-row .mec-box .button, +.mec-meta-box-fields .mec-box .button:not(.mec_add_price_date_button) { + float: right; +} + +#mec_gateways_form .mec-form-row:first-child, +#mec_notifications_form_container .mec-form-row:nth-child(2) { + overflow: hidden; +} + +#mec_gateways_form .mec-tooltip { + float: right; +} + +.mec-container { + background: #fff; + padding: 15px 0 15px 15px; +} + +#mec_booking_form .mec-container, +#mec_single_form .mec-container { + padding: 0; +} + +.nav-tab-active { + background: #fff; + border-bottom: 1px solid #fff; +} + +#mec_social_networks .mec-form-row { + margin-bottom: 0; +} + +#mec_styles_form #mec_styles_CSS { + height: 200px; + margin-bottom: 5px; + font-family: Consolas, Monaco, monospace; + font-size: 13px; + width: 97%; + background: #f9f9f9; + outline: 0; +} + +#mec_calendar_filter .description { + max-width: 500px; + display: block; + margin: 0 0 5px 0; + padding: 0; + border: none; + clear: both; +} + +#mec_calendar_display_options #mec-all-month>div { + display: inline-block; + min-width: 120px; +} + +.mec-sed-methods li a { + text-decoration: unset; +} + +.mec-sed-methods li { + display: inline-block; + padding: 8px 12px; + border: 1px solid #ddd; + margin: 0 5px 5px 0; + cursor: pointer; + border-radius: 3px; + box-shadow: 0 2px 15px -2px rgba(0, 0, 0, 0.1); +} + +.mec-sed-methods li a:hover, +.mec-sed-methods li:hover { + border-color: #07bbe9; + color: #07bbe9; +} + +.mec-sed-methods li.active, +.mec-sed-methods li.active a { + border-color: #07bbe9; + background-color: #ecf9fd; + color: #07bbe9; + font-weight: 600; + cursor: default; + box-shadow: none; +} + +.meta-box-sortables .mec-switcher input+label { + max-width: 52px; + width: 52px; + height: 30px; + margin: 4px 0; +} + +.meta-box-sortables .mec-switcher input+label:after, +.meta-box-sortables .mec-switcher input+label:before { + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +.meta-box-sortables .mec-switcher input+label:after { + width: 24px; + height: 24px; +} + +.meta-box-sortables .mec-switcher input:checked+label:before { + box-shadow: 2px 2px 12px -2px #4fdc73 inset; + background: #64e385; + border-color: #64e385; +} + +.meta-box-sortables .mec-switcher input:checked+label:after { + margin-left: 24px; +} + +.mec-switcher input:checked+label:after { + margin-left: 16px; +} + +#mec_gateways_form input[type="text"], +#mec_gateways_form select, +#mec_gateways_form textarea { + width: calc(100% - 30px); +} + +#mec_gateways_form textarea { + min-height: 65px; +} + +#mec_gateways_form li .mec-gateway-options-form, +#payment_gateways_option li .mec-gateway-options-form { + padding: 35px 10px 5px 10px; + background-color: #fff; + border: 1px solid #e6e9eb; + border-left: 6px solid #e6e9eb; + margin-bottom: 40px; + margin-top: -5px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.05); +} + +#payment_gateways_option #mec_gateways6_container_toggle.mec-gateway-options-form { + padding: 10px 10px 10px 17px; +} + +#payment_gateways_option #mec_gateways6_container_toggle.mec-gateway-options-form p { + border-radius: 4px; + max-width: 90%; +} + +#mec_gateways_form_container .mec-form-row input[type="number"], +#mec_gateways_form_container .mec-form-row select { + width: 100%; +} + +div#mec_gateways_form_container .mec-required.mec-mandatory { + border: 1px solid red; +} + +#mec_payment_options_wrapper .mec-form-row .mec-col-4 select { + margin-top: 0; +} + +#mec_payment_options_wrapper .mec-col-9 .mec-form-row { + padding-bottom: 0; +} + +#mec_payment_options_wrapper .mec-col-9 .mec-form-row .mec-col-4 { + width: 103px; + margin-left: -5px; +} + +#booking_notification_section label { + display: inline-block; + min-width: 160px; +} + +div#booking_notification_section iframe { + height: 300px !important; +} + +@media (max-width: 536px) { + + #booking_notification_section input[type="text"], + #booking_notification_section select { + min-width: 100%; + } +} + +#booking_notification_section ul li:last-child .wp-editor-container { + margin-bottom: 0; +} + +#mec_messages_form_container ul li label { + display: block; + font-weight: 400; +} + +#mec_messages_form_container ul li input { + display: block; + width: 100%; +} + +.mec-message-categories li.mec-acc-label { + font-size: 15px; + font-weight: 400; + padding: 0 30px; + cursor: pointer; + background-color: #fff; + border: none; + border-bottom: 1px solid #e6e6e6; + margin: 0; + letter-spacing: 0.2px; + position: relative; +} + +.mec-message-categories li.mec-acc-label .mec-acc-cat-name { + line-height: 65px; + font-size: 17px; + transition: all 0.2s ease; +} + +.mec-message-categories li.mec-acc-label .mec-acc-cat-name:hover { + color: #07bbe9; +} + +.mec-message-categories ul { + margin: 15px 5px; +} + +.webnus-icons-list li { + width: 40px; + display: inline-block; + list-style: none; + padding: 0; +} + +.webnus-icons-list input { + visibility: hidden; + margin: 0; + padding: 0; + width: 1px; + height: 1px; + -moz-opacity: 0; + -khtml-opacity: 0; + opacity: 0; + cursor: pointer; +} + +.webnus-icons-list li label { + color: #777; + display: inline-block !important; + float: none !important; + width: 33px !important; + text-align: center; + font-size: 23px !important; + font-weight: 400 !important; + padding: 5px 0 !important; + border: 1px solid #eee !important; +} + +.mec-webnus-icon { + float: left; + margin-right: 10px; +} + +.mec-webnus-icon i { + font-size: 24px; + color: #222; +} + +.mec-accordion ul { + display: none; +} + +.mec-switcher input { + position: absolute; + margin-left: -9999px; + visibility: hidden; +} + +.mec-switcher input+label { + display: inline-block; + position: relative; + cursor: pointer; + outline: 0; + padding: 2px; + width: 50px; + height: 22px; + background-color: #e5e9ee; + border-radius: 60px; +} + +.mec-switcher input+label { + max-width: 52px; + width: 52px; + height: 30px; + margin: 4px 0; +} + +.mec-switcher input+label:after, +.mec-switcher input+label:before { + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + content: ""; +} + +.mec-switcher input+label:before { + right: 1px; + background-color: #f1f1f1; + border-radius: 60px; + transition: background 0.4s; +} + +.mec-switcher input+label:after { + width: 24px; + background-color: #fff; + border-radius: 100%; + transition: margin 0.4s; + border: 1px solid transparent; + box-shadow: 0 0 5px rgb(0 0 0 / 4%); +} + +.mec-switcher input+label:after { + margin-top: 2px; + margin-left: 2px; + width: 24px; + height: 24px; +} + +.wns-be-group-tab .mec-switcher input[value="1"]+label, +.wns-be-group-tab .mec-switcher input[value="1"]+label:before { + box-shadow: 2px 2px 12px -2px #4fdc73 inset; + position: relative; + background: #64e385; + border-color: #64e385; +} + +.wns-be-group-tab .mec-switcher input+label:before { + right: 1px; + background-color: #f1f1f1; + border-radius: 60px; + transition: background 0.4s; +} + +.wns-be-group-tab .mec-switcher input[value="1"]+label:after { + margin-left: 24px; +} + +.mec-switcher label { + display: block; +} + +.mec-sed-methods li { + display: inline-block; + padding: 10px; + border: 1px solid #ddd; + margin: 0 5px 5px 0; + cursor: pointer; +} + +#wpwrap .mec-button-primary { + border-bottom: none; + letter-spacing: 0.5px; + line-height: 18px; + height: 46px; + transition: all 0.5s ease; + color: #fff; + padding: 12px 25px; + display: block; + text-align: center; + font-size: 14px; + background: 0 0; + background-color: #008aff; + text-shadow: none; + border: 0; + box-shadow: none; + display: inline-block; + margin: 25px 0 12px; + min-width: 146px; +} + +#wpwrap .mec-button-primary:hover { + background-color: #41c9de; +} + +#wpwrap .mec-button-primary.loading { + background-color: #73c02a; +} + +#wpwrap .mec-button-primary:before { + content: "\f00c"; + font-family: fontawesome; + margin-right: 4px; + font-size: 16px; + display: none; +} + +#wpwrap .mec-button-primary.loading:before { + display: inline-block; +} + +.mec-image-select-wrap { + clear: both; + overflow: hidden; + padding: 10px 0; + margin: 0; +} + +.mec-image-select-wrap li { + float: left; + display: block; + margin-right: 5px; + margin-bottom: 0; +} + +.mec-image-select-wrap li input[type="radio"] { + display: none; +} + +.mec-form-row .mec-image-select-wrap li label { + padding: 5px 0 0; + display: block; +} + +@media (max-width: 1280px) { + .mec-image-select-wrap li { + margin-right: 20px; + } +} + +@media (max-width: 480px) { + .mec-image-select-wrap li { + margin-right: 18px; + } +} + +.mec-image-select-wrap li input { + display: none; +} + +.mec-image-select-wrap li span { + width: 35px; + height: 35px; + display: block; + margin: 3px; + border-radius: 2px; + border: 3px solid transparent; + transition: all 0.2s ease; +} + +.mec-image-select-wrap li input:checked+span { + border-color: #fff; + box-shadow: 0 0 14px rgba(0, 0, 0, 0.25); +} + +.mec-image-select-wrap li input:checked+span:after { + content: "\e080"; + font-family: simple-line-icons; + font-size: 18px; + line-height: 18px; + display: inline-block; + color: #fff; + padding: 8px 9px; + max-width: 100%; + max-height: 100%; + font-weight: 400; +} + +.m-e-calendar_page_MEC-ix #wpwrap .mec-button-primary.mec-btn-2 { + margin: 0 0 0 12px; +} + +.m-e-calendar_page_MEC-ix #wpwrap input[type="file"] { + padding-top: 12px; + padding-bottom: 12px; +} + +.m-e-calendar_page_MEC-ix #wpwrap .mec-form-row select { + min-height: 46px; +} + +.mec-image-select-wrap .mec-colorskin-1 { + background-color: #40d9f1; +} + +.mec-image-select-wrap .mec-colorskin-2 { + background-color: #0093d0; +} + +.mec-image-select-wrap .mec-colorskin-3 { + background-color: #e53f51; +} + +.mec-image-select-wrap .mec-colorskin-4 { + background-color: #f1c40f; +} + +.mec-image-select-wrap .mec-colorskin-5 { + background-color: #e64883; +} + +.mec-image-select-wrap .mec-colorskin-6 { + background-color: #45ab48; +} + +.mec-image-select-wrap .mec-colorskin-7 { + background-color: #9661ab; +} + +.mec-image-select-wrap .mec-colorskin-8 { + background-color: #0aad80; +} + +.mec-image-select-wrap .mec-colorskin-9 { + background-color: #0ab1f0; +} + +.mec-image-select-wrap .mec-colorskin-10 { + background-color: #ff5a00; +} + +.mec-image-select-wrap .mec-colorskin-11 { + background-color: #c3512f; +} + +.mec-image-select-wrap .mec-colorskin-12 { + background-color: #55606e; +} + +.mec-image-select-wrap .mec-colorskin-13 { + background-color: #fe8178; +} + +.mec-image-select-wrap .mec-colorskin-14 { + background-color: #7c6853; +} + +.mec-image-select-wrap .mec-colorskin-15 { + background-color: #bed431; +} + +.mec-image-select-wrap .mec-colorskin-16 { + background-color: #2d5c88; +} + +.mec-image-select-wrap .mec-colorskin-17 { + background-color: #77da55; +} + +.mec-image-select-wrap .mec-colorskin-18 { + background-color: #2997ab; +} + +.mec-image-select-wrap .mec-colorskin-19 { + background-color: #734854; +} + +.mec-image-select-wrap .mec-colorskin-20 { + background-color: #a81010; +} + +.mec-image-select-wrap .mec-colorskin-21 { + background-color: #4ccfad; +} + +.mec-image-select-wrap .mec-colorskin-22 { + background-color: #3a609f; +} + +.mec-image-select-wrap .mec-colorskin-23 { + background-color: #333; +} + +.mec-image-select-wrap .mec-colorskin-24 { + background-color: #d2d2d2; +} + +.mec-image-select-wrap .mec-colorskin-25 { + background-color: #636363; +} + +@media screen and (max-width: 782px) { + .mec-form-row .description { + max-width: 500px; + display: block; + margin: 0 0 5px 0; + padding: 0; + border: none; + } + + .mec-col-1, + .mec-col-10, + .mec-col-11, + .mec-col-12, + .mec-col-2, + .mec-col-3, + .mec-col-4, + .mec-col-5, + .mec-col-6, + .mec-col-7, + .mec-col-8, + .mec-col-9 { + margin-bottom: 5px; + display: block; + } + + .mec-form-row .mec-box .button, + .mec-meta-box-fields .mec-box .button { + float: left; + } + + .mec-form-row .time-dv { + padding: 0 4px; + } + + .mec-form-row .mec-col-4 input[type="text"], + .mec-form-row .mec-col-4 select { + width: auto; + min-width: 192px; + } + + .mec-tooltip .dashicons-before:before { + font-size: 32px; + } +} + +#frmb-0-clear-all, +#frmb-0-save, +#frmb-0-view-data { + display: none; +} + +#mec_sn_googlecal { + margin-bottom: 0; +} + +#mec_fee_row1 .button { + margin-right: 10px; +} + +h4.mec-form-subtitle { + font-size: 15px; + margin-top: 0; +} + +h5.mec-form-second-title { + font-size: 15px; + margin-top: 0; +} + +#webnus-dashboard * { + box-sizing: border-box; +} + +#webnus-dashboard.about-wrap { + max-width: 1040px; + margin: 25px auto 20px; +} + +@media (max-width: 1280px) { + #webnus-dashboard.about-wrap { + max-width: 1024px; + } +} + +#webnus-dashboard .change-log { + word-wrap: break-word; +} + +#webnus-dashboard .welcome-head img { + background: #fff; + padding: 15px; + border-radius: 8px 8px 0 0; + width: 216px; + margin: 0 0 0 auto; + display: block; + border: 1px solid #e3e5e7; + border-bottom: none; +} + +.w-welcome { + position: relative; + margin-top: 30px; + margin-bottom: 10px; + font-size: 19px; +} + +.w-box { + position: relative; + background: #fff; + padding: 5px 25px; + margin-top: 30px; +} + +.w-theme-version { + box-shadow: 0 2px 5px -5px #00000021; + text-shadow: none; + background: #f7f8f9; + text-align: center; + display: block; + padding: 10px 0; + color: #8e9596; + font-size: 12px; + font-weight: 400; + margin-top: 0; + border-radius: 0 0 8px 8px; + font-family: monospace; + width: 216px; + margin: 0 0 0 auto; + border: 1px solid #e3e5e7; + border-top: none; +} + +.w-box { + padding: 0; + min-height: 310px; + box-shadow: none; + border-radius: 15px; + border: 1px solid #e3e5e7; +} + +.w-box.upcoming-events .mec-load-more-wrap { + display: none; +} + +.w-box.print-events { + min-height: 134px; +} + +.w-box.gateways { + max-height: 390px; +} + +.w-box.gateways canvas { + max-height: 280px !important; +} + +.w-box-head { + font-weight: 600; + padding: 20px 72px; + position: relative; + border-bottom: 2px solid #ccecf4; + font-size: 20px; +} + +.w-box-head span { + position: absolute; + left: 0; + padding: 0 25px; + line-height: 58px; + background: #008aff; + height: 100%; + top: 0; + color: #fff; +} + +.w-box-child, +.w-box-content { + padding: 20px 30px 30px; + line-height: 24px; + font-size: 14px; +} + +.mec-count-child { + width: 50%; + margin: 0 auto; + color: #01c6d9; +} + +#webnus-dashboard .w-button a { + color: #fff !important; + border-radius: 0; + padding: 10px 24px; + font-size: 12px; + letter-spacing: 1px; + font-weight: 600; + background: #008aff; + margin: 10px 0; + display: inline-block; + text-transform: uppercase; +} + +#webnus-dashboard .w-box .w-button a:hover { + background: #222; + background: linear-gradient(95deg, #555 0, #222 50%, #000 100%); + box-shadow: 0 5px 21px -5px rgba(0, 0, 0, 0.5); +} + +.w-system-info { + margin-bottom: 7px; +} + +.w-system-info:first-child { + margin-top: 20px; +} + +.w-system-info>span { + display: inline-block; + min-width: 145px; + line-height: 20px; + font-size: 13px; +} + +#webnus-dashboard .w-current { + min-width: 110px; +} + +#webnus-dashboard .w-min { + min-width: 65px; +} + +.w-icon { + color: #fff; + padding: 3px; + border-radius: 4px; + margin-right: 10px; + vertical-align: middle; +} + +.w-icon-green { + background: #27ae60; +} + +.w-icon-red { + background: #e74c3c; +} + +.extra .w-box-head { + padding: 30px 30px 10px; + border-bottom: 1px solid #fff; + border-radius: 11px 11px 0 0; +} + +.doc .w-box-head { + color: #4cbf67; +} + +#webnus-dashboard .doc .w-button a { + background: #4cbf67; + background: linear-gradient(95deg, #6fe08a 0, #58cf74 50%, #36cb58 100%); + margin: 35px 0 17px; + box-shadow: 0 5px 10px -5px #4cbf67; + background-color: #fff; +} + +#webnus-dashboard .support .w-button a { + background: #ff876c; + background: linear-gradient(95deg, #ff876c 0, #ff7455 50%, #ff5a35 100%); + margin: 13px 0 18px; + box-shadow: 0 5px 10px -5px #ff876c; +} + +.doc .w-box-content { + background: url(../img/document.png) no-repeat right center; +} + +.doc .w-box-content p, +.w-box.support .w-box-content p { + width: 54%; + color: #666; + margin-top: 10px; + max-width: 380px; +} + +.w-box-child p { + color: #666; + margin-top: 10px; +} + +.w-box.support { + background: #fff url(../img/support.png) no-repeat top right; +} + +.w-box.support .w-box-head { + width: 50%; + color: #ff876c; +} + +.w-box-content pre { + text-align: left; + background: #f5f6f7; + font-size: 13px; + padding: 20px 25px; + height: 480px; + overflow-y: scroll; + white-space: break-spaces; + border-radius: 11px; + font-family: monospace; + margin: 0 0 10px; +} + +#webnus-dashboard .button:not(.mec-intro-section-link-tag) { + border: 0; + background: 0 0; + box-shadow: none; + color: #e74c3c; + font-weight: 700; +} + +.w-box .state { + position: absolute; + top: 0; + left: -100vw; +} + +#webnus-dashboard .button:hover { + color: #222; +} + +.w-box .state:checked~.content { + -webkit-transform: none; + -ms-transform: none; + transform: none; +} + +.w-box .state:checked~.backdrop { + bottom: 0; + opacity: 1; + z-index: 1; +} + +.w-box .lightbox { + position: fixed; + top: 0; + right: 0; + left: 0; + height: 0; + padding: 0 20px; +} + +.w-box .lightbox .content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + overflow: hidden; + position: relative; + z-index: 2; + max-width: 500px; + max-height: 95vh; + margin: 20px auto; + padding: 20px; + background: #fff; + -webkit-transform: translateY(-200%); + -ms-transform: translateY(-200%); + transform: translateY(-200%); + -webkit-transition: 0.3s -webkit-transform ease-in-out; + transition: 0.3s transform ease-in-out; + border: 1px solid rgba(0, 0, 0, 0.1); +} + +.w-box .lightbox .main { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.w-box .lightbox .backdrop { + position: fixed; + z-index: -1; + top: 0; + right: 0; + bottom: 100%; + left: 0; + opacity: 0; + background: rgba(0, 0, 0, 0.3); + -webkit-transition: 0.3s opacity ease-in-out; + transition: 0.3s opacity ease-in-out; +} + +.content .main p { + color: #bf3737; +} + +p.mec_dash_count { + font-size: 60px; + font-weight: 100; + margin: 0; + color: #38d5ed; +} + +.w-col-sm-3 .w-box.doc { + text-align: center; + min-height: auto; +} + +.w-Knowledgebase { + color: #8e5cea; +} + +.mec-view-all-articles a { + margin: 30px 0 17px; + display: inline-block; + color: #fff !important; + border-radius: 0; + padding: 10px 24px; + font-size: 12px; + letter-spacing: 1px; + font-weight: 600; + background: #8e5cea; + display: inline-block; + text-transform: uppercase; + transition: all 0.24s ease; + -webkit-transition: all 0.24s ease; +} + +.mec-view-all-articles a:hover { + background-color: #222; +} + +.w-box.upcoming-events .mec-event-article { + margin-bottom: 15px; + padding-bottom: 10px; +} + +.w-box.upcoming-events .mec-event-article .mec-event-label-captions { + padding: 2px 5px; + border-radius: 3px; + color: #fff; + font-size: 0.86em; +} + +.w-box.upcoming-events .mec-event-article .mec-event-date { + font-size: 13px; + background-color: #38d5ed; + color: #fff; + text-align: center; + border-radius: 6px; + width: 50px; + padding-bottom: 2px; + float: left; + margin-right: 10px; + text-transform: uppercase; + letter-spacing: 1px; + font-family: monospace; +} + +.w-box.upcoming-events .mec-event-article .mec-event-date:beforex { + content: "\e075"; + font-family: simple-line-icons; + font-size: 18px; + line-height: 15px; + color: #bdeaf1; + float: left; + margin-right: 11px; +} + +.w-box.upcoming-events .mec-event-article .mec-event-date span { + font-weight: 700; + border-radius: 6px 6px 0 0; + padding: 3px 0 1px; + font-size: 18px; + display: block; + background: #61dcef; + font-family: arial, sans-serif; +} + +.w-box.upcoming-events .mec-event-article .mec-event-date span.mec-multiple-dates { + font-size: 11px; +} + +.w-box.upcoming-events .mec-event-article h4.mec-event-title { + margin: 0; + font-size: 16px; + line-height: 28px; +} + +.w-box.upcoming-events .mec-event-article .mec-shortcode-virtual-badge, +.w-box.upcoming-events .mec-event-article .mec-shortcode-zoom-badge { + font-size: 11px; + line-height: 1.62; + background: #222; + padding: 2px 9px; + border-radius: 12px; + color: #fff; + margin: 0 0 0 5px; +} + +.w-box.upcoming-events .mec-event-article .mec-shortcode-virtual-badge i, +.w-box.upcoming-events .mec-event-article .mec-shortcode-zoom-badge i { + padding: 0 5px 0 0; +} + +#webnus-dashboard .w-box.upcoming-events .mec-event-article h4.mec-event-title a { + color: #5f676b; +} + +#webnus-dashboard .w-box.upcoming-events .mec-event-article h4.mec-event-title a:hover { + text-decoration: underline; +} + +.w-box.upcoming-events .mec-event-article .mec-event-detail { + font-size: 13px; + color: #979899; +} + +.w-box.upcoming-events .mec-event-article .mec-detail-button { + display: none; +} + +.w-box.total-bookings ul li { + display: inline-block; + background: #f3f4f5; + margin-right: 5px; + border-radius: 50px; + padding: 0 5px; + transition: all 0.2s ease; +} + +.w-box.total-bookings ul li.selected { + background: #fff; + border: 1px solid #e9e9e9; +} + +.w-box.total-bookings ul li a { + padding: 6px 12px; + display: inline-block; + border-radius: 3px; + text-transform: none; + font-size: 13px; + letter-spacing: 0.4px; + transition: all 0.1s ease; + font-weight: 600; + text-decoration: none; +} + +.w-box.total-bookings ul li.active { + background: #38d5ed; +} + +.w-box.total-bookings ul li:hover { + background: #38d5ed; +} + +#webnus-dashboard .w-box.total-bookings ul li a { + color: #000; +} + +#webnus-dashboard .w-box.total-bookings ul li.active a, +#webnus-dashboard .w-box.total-bookings ul li:hover a { + color: #fff; +} + +#webnus-dashboard .w-box.total-bookings ul li a:focus { + box-shadow: unset; + outline: unset; + outline-offset: 0; +} + +.info-msg, +.mec-error, +.mec-success, +.warning-msg { + margin: 10px 0; + padding: 10px; + border-radius: 11px; +} + +.post-type-mec-events.taxonomy-mec_speaker .warning-msg p { + color: #9f6000; +} + +.info-msg { + color: #059; + background-color: #bef; +} + +.info-msg-link { + background: #fff; + padding: 4px 12px 6px; + border-radius: 3px; + line-height: 1; + font-weight: 600; + color: #008aff; +} + +.mec-success { + color: #270; + background-color: #dff2bf; +} + +.warning-msg { + color: #9f6000; + background-color: #feefb3; +} + +.mec-error { + color: #d8000c !important; + background-color: #ffbaba; +} + +.w-row .fs-notifier.success.show.visible { + font-size: 12px !important; +} + +.w-row .fs-notifier.success.show.visible a { + font-size: 25px !important; + margin-top: -3px; +} + +.mec-certain-day>div, +.mec-select-deselect-actions li, +.mec-xi-facebook-import-events .mec-select-deselect-actions li, +.mec-xi-google-import-events .mec-select-deselect-actions li { + display: inline-block; + position: relative; + outline: 0; + background: #fff; + border: 1px solid #e2e2e2; + border-radius: 50px; + padding: 11px 21px 11px 21px; + line-height: 1; + font-size: 11px; + font-weight: 600; + color: #444; + letter-spacing: 2px; + height: auto; + cursor: pointer; + margin-top: 5px; + text-transform: uppercase; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.03); +} + +#mec-exceptional-days .mec-certain-day>div, +#mec_exceptions_in_days_container .mec-certain-day>div { + padding: 0 15px; + margin: 0 5px 10px 0; +} + +.mec-certain-day .mec-in-days-day, +.mec-certain-day>div .mec-not-in-days-day { + line-height: 36px; +} + +.mec-certain-day>div:hover, +.mec-select-deselect-actions li:hover, +.mec-xi-facebook-import-events .mec-select-deselect-actions li:hover, +.mec-xi-google-import-events .mec-select-deselect-actions li:hover { + border-color: #07bbe9; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.1); +} + +.mec-not-in-days-remove { + border: 1px solid #ff4b64; + border-radius: 20px; + padding: 0 0 0 1px; + color: #ff4b64; + width: 11px; + height: 12px; + text-align: center; + line-height: 12px; + display: inline-block; + margin-right: -5px; + margin-left: 6px; +} + +.mec-xi-facebook-import-events .mec-success, +.mec-xi-google-import-events .mec-success { + width: 460px; +} + +.mec-xi-facebook-import-events .mec-select-deselect-actions li, +.mec-xi-google-import-events .mec-select-deselect-actions li { + display: inline-block; + cursor: pointer; +} + +.lity-content>div { + overflow: auto; +} + +.mce-mec-mce-items { + text-transform: capitalize !important; +} + +#mec_setting_contextual li { + list-style: none !important; + font-size: 12px; + margin: 0; + padding: 6px; +} + +.mec-bbf-field-container { + margin-bottom: 10px; +} + +.mec-bbf-field-container label { + display: block; +} + +.kc-components ul.kc-components-list li .cpicon.mec-kingcomposer-icon, +.kc-element-icon .cpicon.mec-kingcomposer-icon { + background: url(../img/ico-mec-vc.png) no-repeat center center; + background-size: auto; + background-repeat: no-repeat; +} + +.mec-archive-skinsm.mec-category-skins, +.mec-carousel-archive-link, +.mec-carousel-head-text, +.mec-toggle-month-divider { + display: none; +} + +span.mec-archive-skins, +span.mec-category-skins { + vertical-align: text-bottom; +} + +.mec-archive-skins input, +.mec-archive-skins select, +.mec-category-skins input, +.mec-category-skins select { + min-width: 225px; + vertical-align: baseline; +} + +#mec_settings_default_skin_archive, +#mec_settings_default_skin_category { + min-width: 225px; +} + +.w-welcome p span { + background: #fff; + padding: 4px 10px; +} + +#mec_masonry_skin_options_container .mec-form-row .description { + margin-left: 0; + padding-left: 0; + border: none; + margin-top: -4px; +} + +@media (max-width: 1280px) { + + span.mec-archive-skins, + span.mec-category-skins { + margin-left: 0; + } +} + +.mec-shortcode-virtual-badge i { + padding: 0 5px 0 7px; +} + +.mec-search-form-options-container input[type="text"] { + margin-top: 10px; +} + +@media (min-width: 760px) and (max-width: 1280px) { + + .mec-virtual-event-wrap .mec-form-row .mec-col-1, + .mec-zoom-event-wrap .mec-form-row .mec-col-1 { + width: 12%; + } + + .mec-virtual-event-wrap .mec-form-row .mec-col-4, + .mec-virtual-event-wrap .mec-form-row .mec-col-6, + .mec-zoom-event-wrap .mec-form-row .mec-col-4, + .mec-zoom-event-wrap .mec-form-row .mec-col-6 { + width: 40%; + } + + .mec-virtual-event-wrap .mec-form-row .mec-col-3, + .mec-virtual-event-wrap .mec-form-row .mec-col-5, + .mec-zoom-event-wrap .mec-form-row .mec-col-3, + .mec-zoom-event-wrap .mec-form-row .mec-col-5 { + width: 45%; + } + + .mec-virtual-event-wrap .mec-form-row .mec-col-2, + .mec-zoom-event-wrap .mec-form-row .mec-col-2 { + width: 21%; + } +} + +#mec_zoom_checkall { + background: #fff; + border: 1px solid #282828; + border-radius: 60px; + padding: 6px 32px 8px; + margin: 30px 0 0; + cursor: pointer; + display: block; + transition: all 0.3s ease; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + -o-transition: all 0.3s ease; +} + +#mec_zoom_checkall:focus { + box-shadow: inset; + outline: 0; +} + +#mec_zoom_checkall:hover { + background: #282828; + color: #fff; +} + +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +#webnus-dashboard button, +#webnus-dashboard input, +#webnus-dashboard select, +#webnus-dashboard textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +#webnus-dashboard a { + color: #337ab7; + text-decoration: none; +} + +#webnus-dashboard a:focus, +#webnus-dashboard a:hover { + color: #23527c; +} + +#webnus-dashboard a:focus { + outline: -webkit-focus-ring-color auto 5px; + outline-offset: -2px; +} + +#webnus-dashboard figure { + margin: 0; +} + +#webnus-dashboard img { + vertical-align: middle; +} + +.w-img-responsive { + display: block; + max-width: 100%; + height: auto; +} + +.w-img-rounded { + border-radius: 6px; +} + +.w-img-thumbnail { + padding: 4px; + line-height: 1w-42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0w-2s ease-in-out; + -o-transition: all 0w-2s ease-in-out; + transition: all 0w-2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.w-img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} + +.w-sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.w-sr-only-focusable:active, +.w-sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +.w-container, +.w-container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} + +[role="button"] { + cursor: pointer; +} + +@media (min-width: 768px) { + .w-container { + width: 750px; + } +} + +@media (min-width: 992px) { + .w-container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .w-container { + width: 1170px; + } +} + +.w-row { + margin-left: -15px; + margin-right: -15px; +} + +.w-col-lg-1, +.w-col-lg-10, +.w-col-lg-11, +.w-col-lg-12, +.w-col-lg-2, +.w-col-lg-3, +.w-col-lg-4, +.w-col-lg-5, +.w-col-lg-6, +.w-col-lg-7, +.w-col-lg-8, +.w-col-lg-9, +.w-col-md-1, +.w-col-md-10, +.w-col-md-11, +.w-col-md-12, +.w-col-md-2, +.w-col-md-3, +.w-col-md-4, +.w-col-md-5, +.w-col-md-6, +.w-col-md-7, +.w-col-md-8, +.w-col-md-9, +.w-col-sm-1, +.w-col-sm-10, +.w-col-sm-11, +.w-col-sm-12, +.w-col-sm-2, +.w-col-sm-3, +.w-col-sm-4, +.w-col-sm-5, +.w-col-sm-6, +.w-col-sm-7, +.w-col-sm-8, +.w-col-sm-9, +.w-col-xs-1, +.w-col-xs-10, +.w-col-xs-11, +.w-col-xs-12, +.w-col-xs-2, +.w-col-xs-3, +.w-col-xs-4, +.w-col-xs-5, +.w-col-xs-6, +.w-col-xs-7, +.w-col-xs-8, +.w-col-xs-9 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} + +.w-col-xs-1, +.w-col-xs-10, +.w-col-xs-11, +.w-col-xs-12, +.w-col-xs-2, +.w-col-xs-3, +.w-col-xs-4, +.w-col-xs-5, +.w-col-xs-6, +.w-col-xs-7, +.w-col-xs-8, +.w-col-xs-9 { + float: left; +} + +.w-col-xs-12 { + width: 100%; +} + +.w-col-xs-11 { + width: 91.66666667%; +} + +.w-col-xs-10 { + width: 83.33333333%; +} + +.w-col-xs-9 { + width: 75%; +} + +.w-col-xs-8 { + width: 66.66666667%; +} + +.w-col-xs-7 { + width: 58.33333333%; +} + +.w-col-xs-6 { + width: 50%; +} + +.w-col-xs-5 { + width: 41.66666667%; +} + +.w-col-xs-4 { + width: 33.33333333%; +} + +.w-col-xs-3 { + width: 25%; +} + +.w-col-xs-2 { + width: 16.66666667%; +} + +.w-col-xs-1 { + width: 8.33333333%; +} + +.w-col-xs-pull-12 { + right: 100%; +} + +.w-col-xs-pull-11 { + right: 91.66666667%; +} + +.w-col-xs-pull-10 { + right: 83.33333333%; +} + +.w-col-xs-pull-9 { + right: 75%; +} + +.w-col-xs-pull-8 { + right: 66.66666667%; +} + +.w-col-xs-pull-7 { + right: 58.33333333%; +} + +.w-col-xs-pull-6 { + right: 50%; +} + +.w-col-xs-pull-5 { + right: 41.66666667%; +} + +.w-col-xs-pull-4 { + right: 33.33333333%; +} + +.w-col-xs-pull-3 { + right: 25%; +} + +.w-col-xs-pull-2 { + right: 16.66666667%; +} + +.w-col-xs-pull-1 { + right: 8.33333333%; +} + +.w-col-xs-pull-0 { + right: auto; +} + +.w-col-xs-push-12 { + left: 100%; +} + +.w-col-xs-push-11 { + left: 91.66666667%; +} + +.w-col-xs-push-10 { + left: 83.33333333%; +} + +.w-col-xs-push-9 { + left: 75%; +} + +.w-col-xs-push-8 { + left: 66.66666667%; +} + +.w-col-xs-push-7 { + left: 58.33333333%; +} + +.w-col-xs-push-6 { + left: 50%; +} + +.w-col-xs-push-5 { + left: 41.66666667%; +} + +.w-col-xs-push-4 { + left: 33.33333333%; +} + +.w-col-xs-push-3 { + left: 25%; +} + +.w-col-xs-push-2 { + left: 16.66666667%; +} + +.w-col-xs-push-1 { + left: 8.33333333%; +} + +.w-col-xs-push-0 { + left: auto; +} + +.w-col-xs-offset-12 { + margin-left: 100%; +} + +.w-col-xs-offset-11 { + margin-left: 91.66666667%; +} + +.w-col-xs-offset-10 { + margin-left: 83.33333333%; +} + +.w-col-xs-offset-9 { + margin-left: 75%; +} + +.w-col-xs-offset-8 { + margin-left: 66.66666667%; +} + +.w-col-xs-offset-7 { + margin-left: 58.33333333%; +} + +.w-col-xs-offset-6 { + margin-left: 50%; +} + +.w-col-xs-offset-5 { + margin-left: 41.66666667%; +} + +.w-col-xs-offset-4 { + margin-left: 33.33333333%; +} + +.w-col-xs-offset-3 { + margin-left: 25%; +} + +.w-col-xs-offset-2 { + margin-left: 16.66666667%; +} + +.w-col-xs-offset-1 { + margin-left: 8.33333333%; +} + +.w-col-xs-offset-0 { + margin-left: 0; +} + +@media (min-width: 768px) { + + .w-col-sm-1, + .w-col-sm-10, + .w-col-sm-11, + .w-col-sm-12, + .w-col-sm-2, + .w-col-sm-3, + .w-col-sm-4, + .w-col-sm-5, + .w-col-sm-6, + .w-col-sm-7, + .w-col-sm-8, + .w-col-sm-9 { + float: left; + } + + .w-col-sm-12 { + width: 100%; + } + + .w-col-sm-11 { + width: 91.66666667%; + } + + .w-col-sm-10 { + width: 83.33333333%; + } + + .w-col-sm-9 { + width: 75%; + } + + .w-col-sm-8 { + width: 66.66666667%; + } + + .w-col-sm-7 { + width: 58.33333333%; + } + + .w-col-sm-6 { + width: 50%; + } + + .w-col-sm-5 { + width: 41.66666667%; + } + + .w-col-sm-4 { + width: 33.33333333%; + } + + .w-col-sm-3 { + width: 25%; + } + + .w-col-sm-2 { + width: 16.66666667%; + } + + .w-col-sm-1 { + width: 8.33333333%; + } + + .w-col-sm-pull-12 { + right: 100%; + } + + .w-col-sm-pull-11 { + right: 91.66666667%; + } + + .w-col-sm-pull-10 { + right: 83.33333333%; + } + + .w-col-sm-pull-9 { + right: 75%; + } + + .w-col-sm-pull-8 { + right: 66.66666667%; + } + + .w-col-sm-pull-7 { + right: 58.33333333%; + } + + .w-col-sm-pull-6 { + right: 50%; + } + + .w-col-sm-pull-5 { + right: 41.66666667%; + } + + .w-col-sm-pull-4 { + right: 33.33333333%; + } + + .w-col-sm-pull-3 { + right: 25%; + } + + .w-col-sm-pull-2 { + right: 16.66666667%; + } + + .w-col-sm-pull-1 { + right: 8.33333333%; + } + + .w-col-sm-pull-0 { + right: auto; + } + + .w-col-sm-push-12 { + left: 100%; + } + + .w-col-sm-push-11 { + left: 91.66666667%; + } + + .w-col-sm-push-10 { + left: 83.33333333%; + } + + .w-col-sm-push-9 { + left: 75%; + } + + .w-col-sm-push-8 { + left: 66.66666667%; + } + + .w-col-sm-push-7 { + left: 58.33333333%; + } + + .w-col-sm-push-6 { + left: 50%; + } + + .w-col-sm-push-5 { + left: 41.66666667%; + } + + .w-col-sm-push-4 { + left: 33.33333333%; + } + + .w-col-sm-push-3 { + left: 25%; + } + + .w-col-sm-push-2 { + left: 16.66666667%; + } + + .w-col-sm-push-1 { + left: 8.33333333%; + } + + .w-col-sm-push-0 { + left: auto; + } + + .w-col-sm-offset-12 { + margin-left: 100%; + } + + .w-col-sm-offset-11 { + margin-left: 91.66666667%; + } + + .w-col-sm-offset-10 { + margin-left: 83.33333333%; + } + + .w-col-sm-offset-9 { + margin-left: 75%; + } + + .w-col-sm-offset-8 { + margin-left: 66.66666667%; + } + + .w-col-sm-offset-7 { + margin-left: 58.33333333%; + } + + .w-col-sm-offset-6 { + margin-left: 50%; + } + + .w-col-sm-offset-5 { + margin-left: 41.66666667%; + } + + .w-col-sm-offset-4 { + margin-left: 33.33333333%; + } + + .w-col-sm-offset-3 { + margin-left: 25%; + } + + .w-col-sm-offset-2 { + margin-left: 16.66666667%; + } + + .w-col-sm-offset-1 { + margin-left: 8.33333333%; + } + + .w-col-sm-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 992px) { + + .w-col-md-1, + .w-col-md-10, + .w-col-md-11, + .w-col-md-12, + .w-col-md-2, + .w-col-md-3, + .w-col-md-4, + .w-col-md-5, + .w-col-md-6, + .w-col-md-7, + .w-col-md-8, + .w-col-md-9 { + float: left; + } + + .w-col-md-12 { + width: 100%; + } + + .w-col-md-11 { + width: 91.66666667%; + } + + .w-col-md-10 { + width: 83.33333333%; + } + + .w-col-md-9 { + width: 75%; + } + + .w-col-md-8 { + width: 66.66666667%; + } + + .w-col-md-7 { + width: 58.33333333%; + } + + .w-col-md-6 { + width: 50%; + } + + .w-col-md-5 { + width: 41.66666667%; + } + + .w-col-md-4 { + width: 33.33333333%; + } + + .w-col-md-3 { + width: 25%; + } + + .w-col-md-2 { + width: 16.66666667%; + } + + .w-col-md-1 { + width: 8.33333333%; + } + + .w-col-md-pull-12 { + right: 100%; + } + + .w-col-md-pull-11 { + right: 91.66666667%; + } + + .w-col-md-pull-10 { + right: 83.33333333%; + } + + .w-col-md-pull-9 { + right: 75%; + } + + .w-col-md-pull-8 { + right: 66.66666667%; + } + + .w-col-md-pull-7 { + right: 58.33333333%; + } + + .w-col-md-pull-6 { + right: 50%; + } + + .w-col-md-pull-5 { + right: 41.66666667%; + } + + .w-col-md-pull-4 { + right: 33.33333333%; + } + + .w-col-md-pull-3 { + right: 25%; + } + + .w-col-md-pull-2 { + right: 16.66666667%; + } + + .w-col-md-pull-1 { + right: 8.33333333%; + } + + .w-col-md-pull-0 { + right: auto; + } + + .w-col-md-push-12 { + left: 100%; + } + + .w-col-md-push-11 { + left: 91.66666667%; + } + + .w-col-md-push-10 { + left: 83.33333333%; + } + + .w-col-md-push-9 { + left: 75%; + } + + .w-col-md-push-8 { + left: 66.66666667%; + } + + .w-col-md-push-7 { + left: 58.33333333%; + } + + .w-col-md-push-6 { + left: 50%; + } + + .w-col-md-push-5 { + left: 41.66666667%; + } + + .w-col-md-push-4 { + left: 33.33333333%; + } + + .w-col-md-push-3 { + left: 25%; + } + + .w-col-md-push-2 { + left: 16.66666667%; + } + + .w-col-md-push-1 { + left: 8.33333333%; + } + + .w-col-md-push-0 { + left: auto; + } + + .w-col-md-offset-12 { + margin-left: 100%; + } + + .w-col-md-offset-11 { + margin-left: 91.66666667%; + } + + .w-col-md-offset-10 { + margin-left: 83.33333333%; + } + + .w-col-md-offset-9 { + margin-left: 75%; + } + + .w-col-md-offset-8 { + margin-left: 66.66666667%; + } + + .w-col-md-offset-7 { + margin-left: 58.33333333%; + } + + .w-col-md-offset-6 { + margin-left: 50%; + } + + .w-col-md-offset-5 { + margin-left: 41.66666667%; + } + + .w-col-md-offset-4 { + margin-left: 33.33333333%; + } + + .w-col-md-offset-3 { + margin-left: 25%; + } + + .w-col-md-offset-2 { + margin-left: 16.66666667%; + } + + .w-col-md-offset-1 { + margin-left: 8.33333333%; + } + + .w-col-md-offset-0 { + margin-left: 0; + } +} + +@media (min-width: 1200px) { + + .w-col-lg-1, + .w-col-lg-10, + .w-col-lg-11, + .w-col-lg-12, + .w-col-lg-2, + .w-col-lg-3, + .w-col-lg-4, + .w-col-lg-5, + .w-col-lg-6, + .w-col-lg-7, + .w-col-lg-8, + .w-col-lg-9 { + float: left; + } + + .w-col-lg-12 { + width: 100%; + } + + .w-col-lg-11 { + width: 91.66666667%; + } + + .w-col-lg-10 { + width: 83.33333333%; + } + + .w-col-lg-9 { + width: 75%; + } + + .w-col-lg-8 { + width: 66.66666667%; + } + + .w-col-lg-7 { + width: 58.33333333%; + } + + .w-col-lg-6 { + width: 50%; + } + + .w-col-lg-5 { + width: 41.66666667%; + } + + .w-col-lg-4 { + width: 33.33333333%; + } + + .w-col-lg-3 { + width: 25%; + } + + .w-col-lg-2 { + width: 16.66666667%; + } + + .w-col-lg-1 { + width: 8.33333333%; + } + + .w-col-lg-pull-12 { + right: 100%; + } + + .w-col-lg-pull-11 { + right: 91.66666667%; + } + + .w-col-lg-pull-10 { + right: 83.33333333%; + } + + .w-col-lg-pull-9 { + right: 75%; + } + + .w-col-lg-pull-8 { + right: 66.66666667%; + } + + .w-col-lg-pull-7 { + right: 58.33333333%; + } + + .w-col-lg-pull-6 { + right: 50%; + } + + .w-col-lg-pull-5 { + right: 41.66666667%; + } + + .w-col-lg-pull-4 { + right: 33.33333333%; + } + + .w-col-lg-pull-3 { + right: 25%; + } + + .w-col-lg-pull-2 { + right: 16.66666667%; + } + + .w-col-lg-pull-1 { + right: 8.33333333%; + } + + .w-col-lg-pull-0 { + right: auto; + } + + .w-col-lg-push-12 { + left: 100%; + } + + .w-col-lg-push-11 { + left: 91.66666667%; + } + + .w-col-lg-push-10 { + left: 83.33333333%; + } + + .w-col-lg-push-9 { + left: 75%; + } + + .w-col-lg-push-8 { + left: 66.66666667%; + } + + .w-col-lg-push-7 { + left: 58.33333333%; + } + + .w-col-lg-push-6 { + left: 50%; + } + + .w-col-lg-push-5 { + left: 41.66666667%; + } + + .w-col-lg-push-4 { + left: 33.33333333%; + } + + .w-col-lg-push-3 { + left: 25%; + } + + .w-col-lg-push-2 { + left: 16.66666667%; + } + + .w-col-lg-push-1 { + left: 8.33333333%; + } + + .w-col-lg-push-0 { + left: auto; + } + + .w-col-lg-offset-12 { + margin-left: 100%; + } + + .w-col-lg-offset-11 { + margin-left: 91.66666667%; + } + + .w-col-lg-offset-10 { + margin-left: 83.33333333%; + } + + .w-col-lg-offset-9 { + margin-left: 75%; + } + + .w-col-lg-offset-8 { + margin-left: 66.66666667%; + } + + .w-col-lg-offset-7 { + margin-left: 58.33333333%; + } + + .w-col-lg-offset-6 { + margin-left: 50%; + } + + .w-col-lg-offset-5 { + margin-left: 41.66666667%; + } + + .w-col-lg-offset-4 { + margin-left: 33.33333333%; + } + + .w-col-lg-offset-3 { + margin-left: 25%; + } + + .w-col-lg-offset-2 { + margin-left: 16.66666667%; + } + + .w-col-lg-offset-1 { + margin-left: 8.33333333%; + } + + .w-col-lg-offset-0 { + margin-left: 0; + } +} + +.w-clearfix:after, +.w-clearfix:before, +.w-container-fluid:after, +.w-container-fluid:before, +.w-container:after, +.w-container:before, +.w-row:after, +.w-row:before { + content: " "; + display: table; +} + +.w-clearfix:after, +.w-container-fluid:after, +.w-container:after, +.w-row:after { + clear: both; +} + +.w-center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.w-pull-right { + float: right !important; +} + +.w-pull-left { + float: left !important; +} + +.w-hide { + display: none !important; +} + +.w-show { + display: block !important; +} + +.w-invisible { + visibility: hidden; +} + +.w-text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.w-hidden { + display: none !important; +} + +.w-affix { + position: fixed; +} + +.mec-image-popup-wrap { + display: none; +} + +#wns-be-infobar.sticky { + position: fixed; + top: 32px; + background: #fff; + z-index: 999; + width: 82%; +} + +.wns-be-main .wns-saved-settings.sticky { + position: fixed; + width: 62.5%; + top: 111px; + z-index: 999999999999999999; +} + +textarea.mec-import-settings-content { + display: block; + width: 100%; + min-height: 120px; + margin-bottom: 25px; + padding: 10px 15px; +} + +.mec-import-options-notification { + display: inline-block; +} + +.mec-import-options-notification .mec-message-import-error, +.mec-import-options-notification .mec-message-import-success { + display: inline-block; + padding: 15px 12px; + margin-left: 12px; + opacity: 0; + visibility: hidden; + font-weight: 700; +} + +.mec-import-options-notification .mec-message-import-success { + opacity: 1; + visibility: visible; + border: 2px solid green; +} + +.mec-import-options-notification .mec-message-import-error { + opacity: 1; + visibility: visible; + border: 2px solid #e62117; +} + +.mec-export-settings:focus, +.mec-import-settings:focus { + color: #07bbe9; +} + +.mec-import-settings-wrap { + position: relative; +} + +.mec-import-settings-wrap textarea { + max-width: unset !important; +} + +.mec-loarder-wrap { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(202, 202, 202, 0.7); + z-index: 9999; +} + +.mec-loarder-wrap.mec-settings-loader { + top: 34px; +} + +.mec-loarder { + position: absolute; + width: 64px; + height: 64px; + top: calc(50% - 32px); + left: calc(50% - 36px); +} + +.mec-loarder div { + display: inline-block; + position: absolute; + left: 6px; + width: 4px; + background: #fff; + animation: mec-loarder 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; +} + +.mec-loarder div:first-child { + left: 27px; + animation-delay: -0.24s; + background: #0075ff; +} + +.mec-loarder div:nth-child(2) { + left: 36px; + animation-delay: -0.12s; + background: #028bff; +} + +.mec-loarder div:nth-child(3) { + left: 45px; + animation-delay: 0; + background: #32a0ff; +} + +@keyframes mec-loarder { + 0% { + top: 6px; + height: 51px; + } + + 100%, + 50% { + top: 19px; + height: 26px; + } +} + +.w-box.support-page.searchbox { + background: #40d8f0; + color: #fff; + min-height: 260px; + text-align: center; + border-radius: 11px; +} + +#webnus-dashboard .search-form input { + background: rgba(255, 255, 255, 0.2); + border: none; + width: 50%; + outline: 0; + color: rgba(255, 255, 255, 0.7); + font-size: 18px; + border-radius: 4px 0 0 4px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03); + -webkit-transition: background 0.4s, box-shadow 0.2s; + transition: background 0.4s, box-shadow 0.2s; + padding: 20px 32px; + margin: 0; +} + +#webnus-dashboard .search-form button { + background: rgba(255, 255, 255, 0.2); + border: none; + padding: 20px 32px; + margin-left: -2px; + color: #fff; + border-radius: 0 4px 4px 0; + font-size: 18px; + cursor: pointer; + -webkit-transition: background 0.4s, box-shadow 0.2s; + transition: background 0.4s, box-shadow 0.2s; +} + +#webnus-dashboard .search-form button:hover { + background: #fff; + color: #3a3c4c; +} + +.w-box.support-page.searchbox p { + font-size: 30px; +} + +.search-form input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.search-form input::-moz-placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.search-form input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.7); +} + +.search-form input:-moz-placeholder { + color: rgba(255, 255, 255, 0.7); +} + +#webnus-dashboard .search-form input:active, +#webnus-dashboard .search-form input:focus { + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.14); + background: #fff; + color: #3a3c4c; +} + +#webnus-dashboard .search-form input:active::-webkit-input-placeholder, +#webnus-dashboard .search-form input:focus::-webkit-input-placeholder { + color: #3a3c4c; +} + +#webnus-dashboard .search-form input:active::-moz-placeholder, +#webnus-dashboard .search-form input:focus::-moz-placeholder { + color: #3a3c4c; +} + +#webnus-dashboard .search-form input:active:-ms-input-placeholder, +#webnus-dashboard .search-form input:focus:-ms-input-placeholder { + color: #3a3c4c; +} + +#webnus-dashboard .search-form input:active:-moz-placeholder, +#webnus-dashboard .search-form input:focus:-moz-placeholder { + color: #3a3c4c; +} + +#webnus-dashboard .w-box.support-page.mec-ticksy { + text-align: center; + min-height: 260px; +} + +#webnus-dashboard .w-box.support-page.mec-ticksy p { + font-size: 20px; + width: 70%; + margin: 0 auto; + margin-bottom: 40px; + margin-top: 40px; +} + +#webnus-dashboard .support-box a, +#webnus-dashboard .w-box.support-page.mec-ticksy a { + color: #fff; + font-weight: 500; + border-radius: 50px; + text-shadow: none; + background: #40d8f0; + border: none; + transition: 0.24s; + padding: 12px 30px; + cursor: pointer; + margin-bottom: 40px; + display: inline-block; +} + +#webnus-dashboard .support-box a:hover, +#webnus-dashboard .w-box.support-page.mec-ticksy a:hover { + background: #222; + box-shadow: 0 5px 23px -7px rgba(0, 0, 0, 0.5); +} + +#webnus-dashboard .support-box a { + margin: 40px 4px 0 4px; +} + +.mec-faq-accordion>.mec-faq-accordion-content { + display: none; +} + +#webnus-dashboard .mec-faq-accordion-trigger a { + font-size: 15px; + padding: 15px; + background: #f0f1f2; + display: block; + color: #222; + line-height: 17px; + outline: 0; + border-radius: 8px; +} + +.mec-faq-accordion-trigger { + margin-bottom: 5px; + position: relative; +} + +#webnus-dashboard .mec-faq-accordion-trigger a:after { + font-family: simple-line-icons; + content: "\e095"; + position: absolute; + right: 12px; + font-weight: 700; +} + +.mec-faq-accordion-content { + padding: 5px 14px 25px; +} + +#webnus-dashboard .mec-faq-accordion-trigger a.active:after { + content: "\e082"; +} + +#webnus-dashboard .support-page-links a { + color: #fff; + border-radius: 50px; + padding: 13px 24px; + font-size: 12px; + letter-spacing: 1px; + font-weight: 600; + text-transform: uppercase; + transition: all 0.2s ease; +} + +#webnus-dashboard .support-page-links a:hover, +#webnus-dashboard .w-box.support-page.videobox .w-button a:hover { + background: #222; + box-shadow: 0 2px 5px -1px rgba(0, 0, 0, 0.1); +} + +#webnus-dashboard .support-page-links { + display: inline-block; + margin: 12px 4px 16px 0; +} + +.support-page-links.link-to-doc a { + background: #d09d5f; +} + +.support-page-links.link-to-videos a { + background: #ff876c; +} + +.support-page-links.link-to-articles a { + background: #69ca8a; +} + +.w-box.support-page.articles-box .w-box-content a { + display: block; + padding: 6px 0; +} + +#webnus-dashboard .w-box.support-page.videobox .w-button a { + color: #fff; + font-size: 10px; + padding: 5px 15px; + min-height: 10px; + font-weight: 500; + border-radius: 22px; + box-shadow: 0 3px 10px -9px #ff5a35; + text-shadow: none; + background: #ff876c; + border: none; + transition: 0.24s; +} + +.w-box.support-page.articles-box, +.w-box.support-page.faq-box { + min-height: 500px; +} + +.w-box.support-page.videobox { + border-radius: 11px; + min-height: 282px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.01) !important; +} + +.w-box.support-page.videobox .w-box-content { + padding: 15px; +} + +.w-box.support-page.videobox .w-box-head { + font-size: 15px; + text-align: center; + padding: 20px 0 0; +} + +#webnus-dashboard .w-box.support-page.videobox .w-button a i { + margin-right: 6px; +} + +.support-page .w-box-content ul { + margin-top: 5px; + padding-left: 5px; +} + +.support-page .w-box-content ul li { + font-size: 13px; +} + +.support-page .w-box-content ul li i { + font-size: 13px; + vertical-align: text-bottom; + margin-right: 3px; + color: #40d8f0; +} + +.w-box.mec-activation { + background: #fff url(../img/dp-dsb-support.jpg) no-repeat top right; +} + +.w-box.mec-activation .w-box-head { + width: 75%; +} + +.w-box.mec-activation .w-box-content { + padding: 10px 30px; +} + +.w-box.mec-activation input[type="radio"] { + display: none; +} + +.w-box.mec-activation input[type="radio"]+label { + color: #000; + font-size: 13px; + line-height: 14px !important; + color: #7b7b7b; +} + +.w-box.mec-activation input[type="radio"].checked+label { + color: #40d8f0; +} + +.mec-form-row input[type="radio"], +.w-box.mec-activation input[type="radio"]+label span { + display: inline-block; + margin: -2px 6px 0 0; + vertical-align: middle; + cursor: pointer; + height: 22px; + width: 22px; + text-align: center; + background-color: #fff; + border: 2px solid #e1e2e3; + border-radius: 100%; + box-shadow: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: relative; + transition: all 0.3s ease; +} + +.mec-form-row input[type="radio"]:checked, +.w-box.mec-activation input[type="radio"].checked+label span { + border-color: #afebf5; +} + +.mec-form-row input[type="radio"]:before, +.w-box.mec-activation input[type="radio"]+label span:after { + content: ""; + display: block; + margin: 0; + position: absolute; + top: 4px; + left: 4px; + width: 10px; + height: 10px; + background: 0 0; + border-radius: 100%; + transition: all 0.2s ease; + transform: scale(0.1); +} + +.mec-form-row input[type="radio"]:checked:before, +.w-box.mec-activation input[type="radio"].checked+label span:after { + background: #38d5ed; + transform: scale(1); +} + +.w-box.mec-activation .LicenseType label { + padding-right: 20px; + font-weight: 500; +} + +.w-box.mec-activation .LicenseField { + display: inline-block; + position: relative; + margin-top: 20px; +} + +.w-box.mec-activation input[name="MECPurchaseCode"] { + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); + min-width: 220px; + background: #f7f8f9; + border: none; + border-radius: 33px; + width: 500px; + min-height: 50px; + margin: 0; + padding-left: 20px; + text-align: left; +} + +#webnus-dashboard .w-box.mec-activation input[type="submit"] { + height: 40px; + line-height: 40px; + font-weight: 600; + border: none; + cursor: pointer; + padding: 0 30px; + border-radius: 33px; + color: #fff; + letter-spacing: 1px; + text-transform: uppercase; + font-size: 12px; + text-shadow: none; + background: #64e385; + transition: all 0.28s ease; + position: absolute; + right: 5px; + top: 5px; + font-size: 12px; +} + +#webnus-dashboard .w-box.mec-activation input[type="submit"]:hover { + background: #45ce68; +} + +#webnus-dashboard .w-box.mec-activation input[type="submit"].delete { + background: #c2c2c2; + color: #000; +} + +#webnus-dashboard .w-box.mec-activation input[type="submit"].delete:hover { + background: #ccc; +} + +#MECActivation .MECPurchaseStatus, +.addon-activation-form .MECPurchaseStatus { + display: inline-block; + width: 40px; + height: 40px; + text-align: center; + padding-top: 9px; + color: #fff; + font-weight: 700; + font-size: 18px; + border-radius: 50%; + padding-top: 8px; + position: absolute; + right: -51px; + top: calc(50% - 20px); +} + +.MECPurchaseStatus:after, +.MECPurchaseStatus:before { + position: absolute; + border-radius: 50px; + background: #fff; + content: ""; + transform: rotate(45deg); +} + +.MECPurchaseStatus.PurchaseError:before { + width: 22px; + height: 4px; + right: 9px; + top: 18px; + transform: rotate(45deg); +} + +.MECPurchaseStatus.PurchaseError:after { + width: 22px; + height: 4px; + right: 9px; + top: 18px; + transform: rotate(-45deg); +} + +.MECPurchaseStatus.PurchaseSuccess:before { + width: 13px; + height: 4px; + right: 19px; + top: 21px; + transform: rotate(45deg); +} + +.MECPurchaseStatus.PurchaseSuccess:after { + width: 22px; + height: 4px; + right: 5px; + top: 18px; + transform: rotate(-45deg); +} + +#MECActivation .MECPurchaseStatus.PurchaseError, +.addon-activation-form .MECPurchaseStatus.PurchaseError { + background: #ff876c; +} + +#MECActivation .MECPurchaseStatus.PurchaseSuccess, +.addon-activation-form .MECPurchaseStatus.PurchaseSuccess { + background: #64e385; +} + +.wna-spinner-wrap { + position: absolute; + background: #000; + width: 509px; + height: 64px; + top: -8px; + border-radius: 50px; + z-index: 999; + background-color: #fff; + opacity: 0.9; +} + +.wna-spinner { + width: 40px; + height: 40px; + position: relative; + margin: 6px auto; +} + +.wna-spinner .double-bounce1, +.wna-spinner .double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #40d8f0; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-bounce 2s infinite ease-in-out; + animation: sk-bounce 2s infinite ease-in-out; +} + +.wna-spinner .double-bounce2 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +#MECActivation .MECLicenseMessage, +.addon-activation-form .MECLicenseMessage { + padding-top: 24px; + margin-bottom: -24px; + color: #f64; + max-width: 570px; +} + +.MECLicenseMessage.mec-message-hidden { + display: none; +} + +#webnus-dashboard .w-box.mec-activation input[type="submit"].mec_revoke { + background: #e0e0e0; + color: #222; +} + +.box-addons-activation { + margin-top: 24px; + margin-bottom: 24px; +} + +.box-addon-activation-toggle-content, +.box-addon-activation-toggle-head { + display: none; +} + +.addon-activation-form h3 { + font-size: 15px; + font-weight: 400; + margin: 34px 0 -7px; +} + +.box-addon-activation-toggle-head { + line-height: 1.5; + font-size: 14px; + margin-top: 14px; + cursor: pointer; + padding: 10px 18px; + border: 1px solid #d3d5d7; + border-radius: 25px; + transition: all 0.2s ease; +} + +.box-addon-activation-toggle-head:hover { + border-color: #a5d9e1; +} + +.box-addon-activation-toggle-head i { + margin-right: 7px; + cursor: pointer; + font-size: 13px; + font-weight: normal; +} + +#mec-advanced-wraper div:first-child>ul { + display: block; + margin: 5px 0; + padding: 5px 0; + width: 390px; + border: 1px solid #e1e2e3; + border-radius: 2px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); +} + +#mec-advanced-wraper div:first-child>ul span { + display: none; +} + +#mec-advanced-wraper div:first-child>ul * { + display: inline-block; + background: #fff; + font-size: 12px; + color: #717273; + text-align: center; +} + +#mec-advanced-wraper div:first-child>ul>li { + width: 60px; + font-weight: 700; + margin: 0 10px 0 0; + padding: 4px 0; + border-right: 1px solid #e1e2e3; +} + +#mec-advanced-wraper div:first-child>ul>ul>li { + margin: 0; + padding: 2px 10px; + cursor: pointer; + border-radius: 2px; + transition: all 0.18s ease; +} + +#mec-advanced-wraper div:first-child>ul>ul>li:hover, +.mec-active { + background: #07bbe9 !important; + color: #fff !important; +} + +@-webkit-keyframes sk-bounce { + + 0%, + 100% { + -webkit-transform: scale(0); + } + + 50% { + -webkit-transform: scale(1); + } +} + +@keyframes sk-bounce { + + 0%, + 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} + +.w-col-sm-3 .w-box.addon { + min-height: 372px; + text-align: center; + border-radius: 9px; + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 1%); +} + +.m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3 { + width: 33.33%; + clear: none !important; + min-height: 380px; +} + +@media (min-width: 768px) and (max-width: 1281px) { + .m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3 { + width: 50%; + } +} + +@media (max-width: 767px) { + .m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3 { + width: 100%; + } +} + +.w-box-child.mec-addon-box { + padding: 0; +} + +.mec-addon-box-head { + border-bottom: 1px solid #f7f8f9; + padding: 20px 20px 8px; + margin-bottom: 14px; + position: relative; +} + +.mec-addon-box-version { + position: relative; + border-radius: 1px; + padding: 0 8px; + font-family: monospace; + background: #f4f7f7; + color: #00a1b7; + font-size: 11px; + letter-spacing: 0.2px; + line-height: 21px; + display: inline-block; + margin: 10px 0; +} + +.mec-addon-box-head img { + display: block; + width: 100%; + height: 60px; + margin-bottom: 10px; + margin-top: 10px; +} + +.mec-addon-box-title { + font-weight: 600; + font-size: 18px; + line-height: 36px; + color: #27272a; + letter-spacing: -0.2px; +} + +.mec-addon-box-title a span { + color: #444; + font-size: 15px; +} + +.mec-addon-box-content { + padding: 0 20px; +} + +.mec-addon-box-content p { + color: #6e757b; + font-size: 14px; + letter-spacing: 0.1px; +} + +.mec-addon-box-mec-version { + background: #f3f3f3; + padding: 10px; + font-size: 13px; +} + +.mec-addon-box-pro { + display: inline-block; + background: #ff7d5f; + color: #fff; + font-weight: 600; + font-size: 11px; + letter-spacing: 0.2px; + line-height: 21px; + padding: 0 8px; + border-radius: 3px; +} + +.mec-addon-box-pro-lite { + background: #4cbf67; + color: #fff; + font-weight: 600; + font-size: 11px; + letter-spacing: 0.2px; + line-height: 21px; + padding: 0 8px; + border-radius: 3px; + display: inline-block; +} + +#webnus-dashboard .addons-page-links { + display: inline-block; + margin: 12px 4px 16px 0; +} + +#webnus-dashboard .addons-page-links a { + background-color: #fff; + color: #fff; + border-radius: 2px; + padding: 13px 24px; + font-size: 12px; + letter-spacing: 1px; + font-weight: 600; + text-transform: uppercase; +} + +.addons-page-links.link-to-purchase a { + background: #4cbf67; + background: linear-gradient(95deg, #6fe08a 0, #58cf74 50%, #36cb58 100%); + box-shadow: 0 5px 10px -5px #4cbf67; +} + +.addons-page-links.link-to-install-addons a { + background: #b092e6; + background: linear-gradient(95deg, #b092e6 0, #9b70e8 50%, #8e5cea 100%); + box-shadow: 0 5px 10px -5px #b092e6; +} + +#webnus-dashboard .addons-page-links a:hover, +#webnus-dashboard .w-box.addons-page.videobox .w-button a:hover { + background: #222; + background: linear-gradient(95deg, #555 0, #222 50%, #000 100%); + box-shadow: 0 5px 21px -5px rgba(0, 0, 0, 0.5); +} + +.mec-addon-box-footer { + background: #f7f8f9; + border-radius: 0 0 9px 9px; + padding: 10px 1px 8px; + margin-top: 25px; + text-align: center; + position: absolute; + left: 0; + right: 0; + bottom: 0; +} + +#webnus-dashboard .mec-addon-box-footer a { + margin-top: 10px; + display: inline-block; + text-shadow: none; + border: none; + transition: 0.24s; + position: relative; + margin-right: 7px; + font-size: 12px; + font-weight: 500; + border-radius: 8px; + padding: 9px 18px 8px; + width: 53px; + height: 34px; + line-height: 21px; + background: 0 0; + margin: 0; + box-shadow: none; +} + +#webnus-dashboard .mec-addon-box-footer a:last-of-type { + margin-right: 0; +} + +#webnus-dashboard .mec-addon-box-footer a.mec-addon-box-intro:hover { + background-color: #ff3535; + background: linear-gradient(95deg, #ff6c6c 0, #f55 50%, #ff3535 100%); +} + +#webnus-dashboard .mec-addon-box-footer a:hover { + background: #00cae6; + cursor: pointer !important; +} + +#webnus-dashboard .mec-addon-box-footer a i { + color: #00cae6; + font-size: 16px; +} + +#webnus-dashboard .mec-addon-box-footer a:hover i { + color: #fff; +} + +#mec_tickets .mec-box { + position: relative; + padding: 20px; +} + +#mec_fees_list input[type="text"].mec-col-12, +#mec_ticket_variations_list input[type="text"].mec-col-12 { + max-width: 625px; +} + +#taxes_option .mec-form-row input[type="text"].mec-col-12, +#ticket_variations_option input[type="text"].mec-col-12 { + max-width: 575px; +} + +.mec-booking-tab-content .mec-form-row textarea { + max-width: 762px; +} + +#mec_tickets .button.remove { + padding: 0; + min-height: 28px; + height: 28px; + width: 28px; + margin: 0; + border-radius: 50%; + position: absolute; + top: 20px; + right: 20px; + color: #fff; + box-shadow: none; + background: #fff; + border-color: #ea6485; + font-size: 20px; + line-height: 1.5; +} + +#mec_tickets .button.remove svg { + fill: #ea6485 !important; +} + +#mec_tickets .button.remove:hover { + color: #fff; + border-color: #ea6485; + background: #ea6485; +} + +#mec_tickets .button.remove:hover svg { + fill: #fff !important; +} + +@media (max-width: 480px) { + #mec_tickets .button.remove { + top: 5px; + right: 5px; + } +} + +.mec-ticket-id { + font-size: 12px; + line-height: 12px; + font-weight: 400; + color: #07bbe9; + padding: 0 0 8px; + margin-bottom: 14px; + cursor: default; +} + +.mec-ticket-end-time.mec-col-12 .mec-time-span, +.mec-ticket-start-time.mec-col-12 .mec-time-span { + min-width: 80px; + display: inline-block; +} + +.mec-ticket-start-time { + margin-bottom: 20px; +} + +.mec-ticket-time { + min-width: 69px; + display: inline-block; +} + +.mec-stop-selling-tickets { + min-width: 185px; +} + +#mec_meta_box_hourly_schedule_days .mec-form-row input[type="text"], +#mec_meta_box_tickets_form .mec-form-row input[type="text"] { + max-width: 290px; +} + +@media (max-width: 1366px) { + #mec_meta_box_hourly_schedule_days .mec-box.mec-form-row input[type="text"] { + max-width: 150px; + min-width: 110px; + } +} + +#mec_exceptions_not_in_days_date { + width: 100%; +} + +#mec-event-data input[type="date"], +#mec-event-data input[type="email"], +#mec-event-data input[type="tel"], +#mec-event-data input[type="text"], +#mec-event-data input[type="url"], +#mec-event-data select, +#mec-event-data textarea, +#mec_exceptions_not_in_days_date, +#mec_meta_box_date_form input[type="text"], +#mec_meta_box_date_form input[type="url"], +#mec_select_tags.mec-create-shortcode-tab-content input[type="text"], +#mec_settings_weather_module_api_key { + max-width: 290px; +} + +#mec-event-data input[type="text"].mec_date_picker.mec-col-4 #mec_meta_box_calendar_skin_options input[type="text"].mec_date_picker.mec-col-4 { + max-width: 32.33333333%; +} + +#payment_gateways_option .mec-col-4 input[type="number"], +#payment_gateways_option .mec-col-4 input[type="text"], +#payment_gateways_option .mec-col-4 select, +#payment_gateways_option .mec-col-4 textarea { + width: 90%; +} + +.mec-form-repeating-event-row .mec-col-6 input[type="text"] { + width: 35%; +} + +.addons-page-error, +.addons-page-notice { + display: block; + margin-top: 15px; + margin-bottom: 0; + background: #fff; + border-left: 4px solid #00a0d2; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + padding: 1px 12px; +} + +.addons-page-error p, +.addons-page-notice p { + margin: 0.5em 0; + padding: 2px; + font-size: 13px; +} + +.addons-page-error { + border-left-color: #dc3232; +} + +.mec-addon-box-comingsoon { + background: 0 0; + padding: 8px 11px; + color: #5a5a5a; + font-size: 14px; + font-weight: 500; + text-align: center; +} + +.mec-addons .w-row .w-col-sm-3:nth-child(4n + 1) { + clear: left; +} + +@media (min-width: 960px) { + #webnus-dashboard .mec-addon-box-footer .w-button { + text-align: right; + } +} + +@media (min-width: 1401px) { + .mec-addon-box-title a span { + font-size: 17px; + } +} + +.mec-pro-notice { + margin-top: 24px; + line-height: 30px; +} + +.mec-pro-notice .info-msg { + padding: 50px 30px; + margin-bottom: 0; +} + +#webnus-dashboard .mec-pro-notice .info-msg { + background: #fff; + box-shadow: 0 1px 2px rgb(0 0 0 / 1%); + text-align: center; + color: #55595d; +} + +#webnus-dashboard a.info-msg-link { + background: #e66f52; + background: linear-gradient(95deg, #ff8162 0, #e66f52 50%, #ff4c20 100%); + box-shadow: 0 5px 10px -5px #e66f52; + border-radius: 2px; + padding: 12px 50px; + font-size: 16px; + line-height: 24px; + border: none; + margin: 20px auto 0; + color: #fff; + transition: all 0.3s ease; + display: inline-block; +} + +#webnus-dashboard a.info-msg-link:hover { + background: #222; + background: linear-gradient(95deg, #555 0, #222 50%, #000 100%); + box-shadow: 0 5px 21px -5px rgba(0, 0, 0, 0.5); +} + +#webnus-dashboard .info-msg p { + width: 70%; + margin: 0 auto; + line-height: 1.8; +} + +#webnus-dashboard .info-msg-coupon { + font-size: 13px; + color: #777; + max-width: 600px; + line-height: 1.68; + margin: 25px auto 0; +} + +#webnus-dashboard .info-msg-coupon strong { + font-weight: 700; + color: #19ce18; +} + +.info-msg .socialfollow { + padding-top: 20px; +} + +.info-msg .socialfollow a { + margin: 0 2px; + display: inline-block; +} + +.info-msg .socialfollow a i { + background: #96a4b1; + color: #fff; + padding: 6px; + border-radius: 3px; + font-size: 18px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); + transition: all 0.25s; +} + +.info-msg .socialfollow a:hover i { + background: #008aff; +} + +.mec-intro-section .w-box-content { + text-align: center; +} + +.mec-intro-section .w-box-content.mec-intro-section-welcome { + max-width: 600px; + margin: 0 auto; +} + +.mec-intro-section .w-box-content.mec-intro-section-welcome h3 { + font-size: 26px; +} + +a.mec-intro-section-link-tag.button.button-hero { + margin: 0 10px 40px; +} + +a.mec-intro-section-link-tag.button.button-primary.button-hero { + color: #fff !important; +} + +a.mec-intro-section-link-tag.button.button-secondary.button-hero { + color: #1dbfd8 !important; +} + +.mec-intro-section-ifarme iframe { + border: 1px solid #e7e7e7; + border-radius: 9px; + padding: 15px; + box-shadow: 0 3px 10px -6px rgb(0 0 0 / 12%); +} + +.w-box-content.mec-intro-section-welcome p { + margin-bottom: 0; +} + +.mec-tooltip a:focus { + box-shadow: none; +} + +#mec_booking_form .mec-options-fields, +#mec_modules_form .mec-options-fields, +#mec_settings_form .mec-options-fields, +#mec_single_form .mec-options-fields { + padding-bottom: 0 !important; +} + +#mec_taxes_fees_container_toggle { + margin-bottom: 60px; +} + +#mec_taxes_fees_container_toggle { + margin-bottom: 60px; +} + +.wns-be-sidebar li { + position: relative; +} + +.wns-be-sidebar li .submneu-hover { + position: absolute; + top: -1px; + right: -222px; + width: 220px; + z-index: 9; + background: #fff; + border: 1px; + border-style: solid; + border-color: #dedede; + margin: 0; + overflow: visible; + opacity: 0; + visibility: hidden; + transition: all 0.23s ease; + padding-top: 8px; + padding-bottom: 12px; +} + +.wns-be-sidebar li:hover .submneu-hover { + opacity: 1; + visibility: visible; +} + +.wns-be-sidebar li .submneu-hover a { + background: #fff; + color: #636363; + opacity: 1; + font-size: 12px; + padding: 6px 4px 6px 26px; +} + +.wns-be-sidebar li .submneu-hover a:hover { + background: #f6f6f6; + color: #222; +} + +.wns-be-sidebar li .submneu-hover:before { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: #fff; + left: -15px; + top: 14px; + border-right-color: #c5c5c5; + right: 0; +} + +.wns-be-sidebar li .submneu-hover:after { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: #fff; + left: -14px; + top: 14px; +} + +.wns-be-sidebar li a:focus, +.wns-be-sidebar li:focus { + outline: -webkit-focus-ring-color auto 0; + border: 0; + box-shadow: none; +} + +@media (max-width: 480px) { + .wns-be-sidebar li .submneu-hover { + width: 175px; + right: 0; + } + + .wns-be-sidebar li .submneu-hover a { + font-size: 11px; + padding: 5px 5px 5px 20px; + } +} + +.mec-tooltip:hover:after, +.mec-tooltip:hover:before { + display: none; +} + +.mec-tooltip { + bottom: 0; +} + +.mec-tooltip .box { + min-width: 300px; + max-width: 600px; + display: inline-block; + left: 36px; + top: calc(50% - 9px); + transform: translateY(-50%); + padding: 0; + margin-top: 8px; + background-color: #535a61; + color: #fff; + font-weight: 300; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.3; + position: absolute; + z-index: 9999999; + box-sizing: border-box; + border-radius: 6px; + box-shadow: 0 4px 32px -10px #444b50; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; +} + +#webnus-dashboard .mec-tooltip .box p, +.mec-tooltip .box p { + color: #fff; + font-size: 14px; + line-height: 1.3; + margin: 0; + font-style: normal; +} + +.mec-tooltip:hover .box { + visibility: visible; + opacity: 1; +} + +.mec-tooltip:hover .box { + padding: 20px; + border-radius: 8px; +} + +.mec-tooltip .box h5 { + color: #fff; + font-size: 17px; + font-weight: 600; + margin: -30px -20px; + padding: 15px 0; + text-align: center; + margin-bottom: 10px; + background: #3a3f44; + border-bottom: 1px solid #30353a; + border-radius: 6px 6px 0 0; + z-index: 9999; +} + +.mec-tooltip .box h5:after { + display: none; +} + +#webnus-dashboard .mec-tooltip .box p a, +.mec-tooltip .box p a { + color: #40d9f1; + margin-top: 10px; + margin-left: 0; + font-weight: 400; + position: relative; + text-decoration: none; + display: block; + width: max-content; +} + +.mec-tooltip .box a:hover { + color: #f90; +} + +.mec-tooltip .box:after { + display: block; + position: absolute !important; + top: 100% !important; + right: 50% !important; + margin-top: -6px !important; + margin-right: -6px !important; + width: 12px !important; + height: 24px !important; + overflow: hidden !important; + transform: rotate(-90deg) !important; +} + +.mec-tooltip .box:before { + display: block; + content: "" !important; + position: absolute !important; + width: 12px; + height: 12px; + left: -10px !important; + top: 50% !important; + transform: translate(50%, -50%) rotate(-45deg) !important; + background-color: #535a61 !important; + box-shadow: 0 8px 9px -4px #535a61 !important; + z-index: 0 !important; +} + +.mec-tooltip .box.top { + left: 50%; + top: 0; + transform: translate(-50%, -100%); + margin-top: 0; + margin-left: -10px; +} + +.mec-tooltip .box.top:after { + top: 50% !important; + right: 100% !important; +} + +.mec-tooltip .box.top:before { + left: 50% !important; + top: 100% !important; +} + +.mec-tooltip .box.bottom { + left: 50%; + top: auto; + bottom: 0; + transform: translate(-50%, 100%); + margin-bottom: -20px; + margin-left: -10px; +} + +.mec-tooltip .box.bottom:after { + top: 0 !important; + right: 50% !important; + background-color: #3a3f44 !important; +} + +.mec-tooltip .box.bottom:before { + left: 50% !important; + top: -7px !important; + transform: translateX(-50%); + background-color: #3a3f44 !important; +} + +.mec-tooltip .box.left { + left: auto; + right: 36px; + top: calc(50% - 9px); + transform: translateY(-50%); +} + +.mec-tooltip .box.left:before { + right: 0 !important; + left: auto !important; + top: 50% !important; +} + +form#mec_reg_fields_form input[type="radio"]:before { + content: ""; + display: inline-block; + background: #fff; + border-radius: 18px; + width: 14px; + height: 14px; + margin: -1px 0 0 -2px; + cursor: pointer; + border: 2px solid #e1e7ed; + box-shadow: 0 2px 15px -3px rgba(69, 77, 89, 0.32); +} + +form#mec_reg_fields_form input[type="radio"]:checked:before { + border: 7px solid #ccecf4; + background: #fff; + box-shadow: 0 3px 16px -3px #008aff; + width: 4px; + height: 4px; +} + +form#mec_reg_fields_form input[type="radio"] { + min-height: 0; + margin-right: 6px; +} + +form#mec_reg_fields_form label { + margin-right: 20px; +} + +@media (min-width: 1200px) and (max-width: 1366px) { + .mec-tooltip .box { + min-width: 290px; + } + + .mec-tooltip .box h5 { + font-size: 15px; + } + + .mec-tooltip .box .content { + font-size: 12px; + } +} + +@media (max-width: 1366px) { + .wns-be-container .wns-be-group-tab p { + margin-top: 0; + } +} + +.mec-addons-notification-box-wrap .w-col-sm-12, +.mec-cmsg-notification-box-wrap .w-col-sm-12 { + padding: 0; +} + +.mec-addons-notification-box-wrap img { + width: auto; +} + +.mec-addons-notification-box-image { + width: 555px; + display: inline-block; + vertical-align: top; +} + +.mec-addons-notification-box-content { + width: calc(100% - 559px); + display: inline-block; +} + +.mec-addons-notification-box-content p { + margin-top: 1%; + line-height: 1.5; + font-size: 16px; +} + +.mec-addons-notification-box-content .w-box-content { + padding-top: 0; + padding-bottom: 0; +} + +.mec-addons-notification-box-content ol { + font-size: 16px; +} + +.mec-addons-notification-box-content a { + background: #38d5ed; + color: #fff !important; + padding: 10px 26px; + margin-top: 5px; + display: inline-block; + border-radius: 3px; + text-transform: capitalize; + font-size: 16px; + letter-spacing: 0.4px; + transition: all 0.1s ease; + font-weight: 600; + text-decoration: none; +} + +.mec-addons-notification-box-content a:hover { + background: #000; +} + +.w-clearfix.w-box.mec-addons-notification-box-wrap span, +.w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span, +.w-clearfix.w-box.mec-cmsg-notification-box-wrap span { + right: 0; + left: unset; + cursor: pointer; + background: 0 0; + padding: 0 16px; +} + +.w-clearfix.w-box.mec-addons-notification-box-wrap span i, +.w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span i, +.w-clearfix.w-box.mec-cmsg-notification-box-wrap span i { + font-size: 28px; + vertical-align: sub; + color: #f2113e; +} + +.mec-custom-msg-notification-wrap, +.wns-be-container .mec-addons-notification-wrap { + padding: 0; + margin: 0; +} + +.mec-custom-msg-notification-wrap .w-col-sm-12, +.wns-be-container .mec-addons-notification-wrap .w-col-sm-12 { + padding: 0; +} + +.wns-be-container .w-box { + margin-top: 0; +} + +.wns-be-container.mec-addons-notification-set-box { + margin-right: 15px; + margin-top: 50px; + margin-bottom: 27px; +} + +@media (max-width: 1200px) { + + .mec-addons-notification-box-content, + .mec-addons-notification-box-image { + width: 100%; + display: block; + } + + .mec-addons-notification-box-image { + text-align: center; + } +} + +@media (max-width: 768px) { + .mec-addons-notification-box-image img { + width: 100%; + height: auto; + } +} + +.mec-details-addons-container { + margin-top: 20px; +} + +.mec-details-addons-wrap img { + float: left; + width: 19%; + margin-right: 17px; +} + +.mec-details-addons-wrap { + clear: both; + margin-bottom: 80px; + display: block; + position: relative; +} + +.mec-details-addons-wrap a { + text-decoration: none; +} + +.mec-details-addons-wrap p { + float: left; + width: 340px; + margin-top: 0; + margin-bottom: 30px; +} + +.mec-details-addons-title { + font-weight: 700; +} + +.mec-details-addons-title a { + color: #444; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx { + border-radius: 10px !important; + box-shadow: 0 4px 38px rgba(0, 0, 0, 0.14) !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-13qutdl, +body .crisp-client .crisp-1rjpbb7 .crisp-13qutdl *, +body .crisp-client .crisp-1rjpbb7 .crisp-9dgo7z, +body .crisp-client .crisp-1rjpbb7 .crisp-9dgo7z * { + font-family: proxima-nova, -apple-system, BlinkMacSystemFont, "Segoe UI", + Catamaran, sans-serif !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-145mbcr, +body .crisp-client .crisp-1rjpbb7 .crisp-1jrqqbm:hover { + background-color: #fff !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-14u434g { + border-color: #e7e8e9 !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-1bkorcf .crisp-1vzg1qq { + font-size: 20px !important; + width: 14px !important; + height: 19px !important; + opacity: 0.85; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-1bkorcf .crisp-1vzg1qq:hover { + opacity: 0.99; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-1sps3eb .crisp-1vd2grm .crisp-12w4w1a { + font-size: 13px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-1sps3eb .crisp-1vd2grm .crisp-12w4w1a::-webkit-input-placeholder { + color: #717273 !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from="visitor"] .crisp-z89v5n .crisp-162m9xf { + background-color: #008aff !important; + color: #fff !important; + box-shadow: none !important; + border-radius: 5px !important; + padding: 15px 25px 15px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from="visitor"] .crisp-z89v5n .crisp-162m9xf .crisp-1o2g4mc { + color: #fff !important; + font-size: 13px !important; + letter-spacing: 0.3px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-z89v5n .crisp-162m9xf { + background-color: #f1f2f3 !important; + border-radius: 5px !important; + padding: 15px 25px 15px !important; + box-shadow: none !important; + color: #121314 !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-type="audio"] .crisp-z89v5n .crisp-162m9xf { + background-color: #d1d7dc !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from="operator"] .crisp-z89v5n .crisp-1o2g4mc { + color: #121314 !important; + -webkit-text-fill-color: #121314 !important; + font-size: 13px !important; + letter-spacing: 0.3px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-mkirz6 .crisp-12qaym5 .crisp-39hskb { + opacity: 0.4; + margin-right: 5px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-mkirz6 .crisp-12qaym5 .crisp-ehr6mw { + opacity: 0.68; + font-size: 12px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg { + background-image: linear-gradient(125deg, + #008aff -10%, + #0066b1 100%) !important; + height: 110px !important; + padding-top: 35px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-1uw6f17, +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-85evuk, +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-nu40j6 { + font-size: 17px !important; + line-height: 28px !important; + padding-top: 10px !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-kquevr .crisp-x94m06 { + background-color: #008aff !important; + background-image: linear-gradient(125deg, + #008aff -10%, + #008af0 100%) !important; + box-shadow: 0 5px 34px -6px #008aff !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-4oo1n4 { + background-color: transparent !important; +} + +body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx[data-chat-status="ongoing"] .crisp-1784wh6 .crisp-1xmtdlg .crisp-172kolj { + margin-top: -10px !important; +} + +body .crisp-client .crisp-1rjpbb7[data-last-operator-face="false"] .crisp-1rf4xdh .crisp-kquevr .crisp-x94m06 .crisp-16qgsyi .crisp-101bp3x[data-is-ongoing="false"] { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1OCIgaGVpZ2h0PSI1NSIgdmlld0JveD0iMCAwIDU4IDU1Ij4NCiAgPGcgaWQ9ImNoYXQtc3ZncmVwby1jb21fMV8iIGRhdGEtbmFtZT0iY2hhdC1zdmdyZXBvLWNvbSAoMSkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEuNSkiPg0KICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMjksMS41YzE2LjAxNiwwLDI5LDExLjY0MSwyOSwyNmEyNC4wMSwyNC4wMSwwLDAsMS00LjgsMTQuMzE4Yy40LDQuNzQ1LDEuNTQyLDExLjQyOCw0LjgsMTQuNjgyLDAsMC05Ljk0My0xLjQtMTYuNjc3LTUuNDYybC0uMDIyLjAwOWMtMi43NjQtMS44LTUuNTMyLTMuNjU2LTYuMS00LjEyNmExLDEsMCwwLDAtMS4zMy0uMjc3LDEuMDE3LDEuMDE3LDAsMCwwLS40ODkuODQ4Yy0uMDEuNjIyLjAwNS43ODQsNS41ODUsNC40MjFBMzEuOTE0LDMxLjkxNCwwLDAsMSwyOSw1My41Yy0xNi4wMTYsMC0yOS0xMS42NDEtMjktMjZTMTIuOTg0LDEuNSwyOSwxLjVaIiBmaWxsPSIjZmZmIi8+DQogICAgPGNpcmNsZSBpZD0iRWxsaXBzZV8xIiBkYXRhLW5hbWU9IkVsbGlwc2UgMSIgY3g9IjMiIGN5PSIzIiByPSIzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiAyNC41KSIgZmlsbD0iIzAwOGFmZiIvPg0KICAgIDxjaXJjbGUgaWQ9IkVsbGlwc2VfMiIgZGF0YS1uYW1lPSJFbGxpcHNlIDIiIGN4PSIzIiBjeT0iMyIgcj0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYgMjQuNSkiIGZpbGw9IiMwMDhhZmYiLz4NCiAgICA8Y2lyY2xlIGlkPSJFbGxpcHNlXzMiIGRhdGEtbmFtZT0iRWxsaXBzZSAzIiBjeD0iMyIgY3k9IjMiIHI9IjMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwIDI0LjUpIiBmaWxsPSIjMDA4YWZmIi8+DQogIDwvZz4NCjwvc3ZnPg0K) !important; + height: 31px !important; + top: 16px !important; + left: 14px !important; +} + +body .csh-category-item a h6 { + text-align: left; +} + +.mec-form-row.mec-syn-schedule { + background: #fff; + padding: 20px; + border: 1px solid #eee; + margin-bottom: 10px; + border-radius: 3px; +} + +.mec-form-row.mec-syn-schedule p { + padding-left: 26px; +} + +.mec-form-row.mec-syn-schedule h2 { + margin-top: 0; +} + +.mec-form-row.mec-syn-schedule h4 { + margin: 10px 0; +} + +li.wns-be-group-menu-li.mec-settings-menu a svg { + position: absolute; + margin-top: 2px; +} + +li.wns-be-group-menu-li.mec-settings-menu a svg { + fill: #a0abb5; + stroke: #a0abb5; +} + +li.wns-be-group-menu-li.mec-settings-menu:hover a svg { + fill: #07bbe9; + stroke: #07bbe9; +} + +li.wns-be-group-menu-li.mec-settings-menu.active a svg { + fill: #07bbe9; + stroke: #07bbe9; +} + +li.wns-be-group-menu-li.mec-settings-menu .mec-settings-submenu { + position: absolute; + top: -1px; + right: -222px; + width: 220px; + z-index: 9; + background: #fff; + border: 1px; + border-style: solid; + border-color: #e6e9eb; + margin: 0; + overflow: visible; + opacity: 0; + visibility: hidden; + transition: all 0.23s ease; + padding-top: 8px; + padding-bottom: 12px; + border-radius: 0 2px 2px 0; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.03); +} + +li.wns-be-group-menu-li.mec-settings-menu:hover>.mec-settings-submenu { + visibility: visible; + opacity: 1; +} + +.mec-settings-menu .mec-settings-submenu:before { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: #fff; + left: -15px; + top: 14px; + border-right-color: #d6d9db; + right: 0; +} + +.mec-settings-menu .mec-settings-submenu:after { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: #fff; + left: -14px; + top: 14px; +} + +.wns-be-sidebar .mec-settings-menu .mec-settings-submenu a { + background: #fff; + color: #666c75; + opacity: 1; + font-size: 13px; + font-weight: 400; + padding: 6px 4px 5px 26px; +} + +.wns-be-sidebar .mec-settings-menu .mec-settings-submenu a:hover { + color: #000; + background: #f7f8f9; +} + +.mec-form-row.mec-skin-countdown-date-format-container input[type="text"], +.mec-form-row.mec-skin-grid-date-format-container input[type="text"], +.mec-form-row.mec-skin-list-date-format-container input[type="text"], +.mec-skin-options-container input[type="text"] { + max-width: unset; +} + +.wn-mec-select { + width: 32.33333333% !important; + clear: unset !important; +} + +.wn-mec-select { + -webkit-tap-highlight-color: transparent; + background-color: #fff; + border-radius: 3px; + border: 1px solid #ddd; + margin-bottom: 8px; + position: relative; + text-align: left !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + box-shadow: 0 3px 13px -5px rgba(0, 0, 0, 0.1), + inset 0 1px 2px rgba(0, 0, 0, 0.07); +} + +.wn-mec-select:hover { + border-color: #dbdbdb; +} + +.wn-mec-select.open .list { + overflow: unset; + width: 100%; + margin: 0; +} + +.wn-mec-select .list { + background-color: #fff; + border-radius: 2px; + box-shadow: 0 2px 33px -2px rgba(0, 0, 0, 0.2), + inset 0 1px 2px rgba(0, 0, 0, 0.07); + box-sizing: border-box; + margin-top: 4px; + opacity: 0; + overflow: hidden; + padding: 0; + pointer-events: none; + position: absolute; + top: 100%; + left: 0; + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transform: scale(0.75) translateY(-21px); + -ms-transform: scale(0.75) translateY(-21px); + transform: scale(0.75) translateY(-21px); + -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), + opacity 0.15s ease-out; + transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; + z-index: 9; +} + +.wn-mec-select { + -webkit-tap-highlight-color: transparent; + background-color: #fff; + border-radius: 5px; + border: solid 1px #e8e8e8; + box-sizing: border-box; + clear: both; + cursor: pointer; + display: block; + float: left; + font-family: inherit; + font-size: 14px; + font-weight: 400; + height: 42px; + line-height: 40px; + outline: 0; + padding-left: 18px; + padding-right: 30px; + position: relative; + text-align: left !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + width: auto; +} + +.wn-mec-select:hover { + border-color: #dbdbdb; +} + +.wn-mec-select:after { + border-bottom: 2px solid #999; + border-right: 2px solid #999; + content: ""; + display: block; + height: 5px; + margin-top: -4px; + pointer-events: none; + position: absolute; + right: 12px; + top: 50%; + -webkit-transform-origin: 66% 66%; + -ms-transform-origin: 66% 66%; + transform-origin: 66% 66%; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transition: all 0.15s ease-in-out; + transition: all 0.15s ease-in-out; + width: 5px; +} + +.wn-mec-select.open:after { + -webkit-transform: rotate(-135deg); + -ms-transform: rotate(-135deg); + transform: rotate(-135deg); +} + +.wn-mec-select.open .list { + opacity: 1; + pointer-events: auto; + -webkit-transform: scale(1) translateY(0); + -ms-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); +} + +.wn-mec-select.disabled { + border-color: #ededed; + color: #999; + pointer-events: none; +} + +.wn-mec-select.disabled:after { + border-color: #ccc; +} + +.wn-mec-select.wide { + width: 100%; +} + +.wn-mec-select.wide .list { + left: 0 !important; + right: 0 !important; +} + +.wn-mec-select.right { + float: right; +} + +.wn-mec-select.right .list { + left: auto; + right: 0; +} + +.wn-mec-select.small { + font-size: 12px; + height: 36px; + line-height: 34px; +} + +.wn-mec-select.small:after { + height: 4px; + width: 4px; +} + +.wn-mec-select .list { + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11); + box-sizing: border-box; + margin-top: 4px; + opacity: 0; + overflow: hidden; + padding: 0; + pointer-events: none; + position: absolute; + top: 100%; + left: 0; + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transform: scale(0.75) translateY(-21px); + -ms-transform: scale(0.75) translateY(-21px); + transform: scale(0.75) translateY(-21px); + -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), + opacity 0.15s ease-out; + transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; + z-index: 9; +} + +.wn-mec-select .list:hover .option:not(:hover) { + background-color: transparent !important; +} + +.wn-mec-select .option { + cursor: pointer; + font-weight: 400; + list-style: none; + min-height: 40px; + outline: 0; + text-align: left; + position: relative; + font-size: 12px !important; + padding: 1px 12px !important; + margin: 0 !important; + line-height: 28px !important; + min-height: 28px !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.wn-mec-select .option .wn-hover-img-sh img { + position: absolute; + padding: 3px; + top: -1px; + left: 100%; + box-shadow: 0 4px 42px -5px rgba(0, 0, 0, 0.16); + visibility: hidden; + opacity: 0; + border: 1px solid #e3e3e3; + border-radius: 2px; + z-index: 99999999; + background: #fff; +} + +.wn-mec-select .option:hover .wn-hover-img-sh img { + visibility: visible; + opacity: 1; +} + +.wn-mec-select .option.focus, +.wn-mec-select .option.selected.focus, +.wn-mec-select .option:hover { + background-color: #f6f6f6; +} + +.wn-mec-select .option.selected { + font-weight: 700; +} + +.wn-mec-select .option.disabled { + background-color: transparent; + color: #999; + cursor: default; +} + +.no-csspointerevents .wn-mec-select .list { + display: none; +} + +.no-csspointerevents .wn-mec-select.open .list { + display: block; +} + +.mec-custom-nice-select ul.list li.option { + width: 30% !important; + float: left !important; + min-height: 135px !important; + height: 135px; + margin: 1.66% !important; + box-sizing: border-box; + text-align: center; + padding: 10px !important; + border-radius: 8px; + border: 1px solid transparent; + box-shadow: none; + background: #fff0 !important; +} + +.mec-custom-nice-select ul.list li.option:hover { + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.025), 0 0 0 1px #f3f4f5; +} + +.mec-custom-nice-select .list .option:hover, +.mec-custom-nice-select ul.list li.option:hover { + background: #fff !important; +} + +.mec-custom-nice-select .list:hover .option:not(:hover), +.mec-custom-nice-select ul.list:hover li.option { + background: #fff !important; +} + +.mec-custom-nice-select ul.list { + min-width: 600px !important; + padding: 20px 10px !important; + background: #fcfbfd; + border: 1px solid #e9e9e9; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05); +} + +.mec-custom-nice-select ul.list li.option.selected { + border: 1px solid #40d9f16b; + box-shadow: 0 1px 8px -3px #40d9f152 inset; + color: #00cae6; + padding: 12px 0 0 0 !important; +} + +.mec-custom-nice-select .wn-img-sh img { + margin: 4px 0 1px 1px; + line-height: 1; + max-width: 68px; + max-height: 56px; + filter: grayscale(1); + -webkit-filter: grayscale(1); + transition: all 0.22s ease; + -webkit-transition: all 0.22s ease; + -moz-transition: all 0.22s ease; + -ms-transition: all 0.22s ease; + -o-transition: all 0.22s ease; +} + +.wn-mec-select .option.focus .wn-img-sh img, +.wn-mec-select .option.selected.focus .wn-img-sh img, +.wn-mec-select .option:hover .wn-img-sh img { + background-color: #f6f6f6; + filter: grayscale(0); + -webkit-filter: grayscale(0); +} + +@media (max-width: 768px) { + .wn-mec-select { + width: 45% !important; + } + + .mec-custom-nice-select ul.list { + margin-left: -24px !important; + min-width: 404px !important; + } + + .mec-custom-nice-select ul.list li.option { + width: 46.6% !important; + } + + .wn-hover-img-sh { + display: none; + } +} + +@media (max-width: 480px) { + .wn-mec-select { + width: 100% !important; + } + + .mec-custom-nice-select ul.list { + min-width: 337px !important; + } +} + +@media (max-width: 320px) { + .mec-custom-nice-select ul.list li.option { + width: 100% !important; + } + + .mec-custom-nice-select ul.list { + min-width: 298px !important; + } +} + +.mec-sed-methods li { + line-height: 28px; + padding-left: 38px; + position: relative; +} + +.mec-sed-methods li:before { + margin-right: 0; +} + +.mec-sed-methods li:before { + border-radius: 18px; +} + +.mec-custom-nice-select ul.list li .wn-mec-text:after, +.mec-sed-methods li:before { + content: ""; + position: absolute; + display: inline-block; + background: #fff; + border-radius: 2px; + width: 12px; + height: 12px; + margin: -1px 0 0 -1px; + cursor: pointer; + border: 2px solid #e1e7ed; + border-radius: 50%; +} + +.mec-custom-nice-select ul.list li .wn-mec-text { + position: relative; + padding-top: 0; + padding-bottom: 28px; +} + +.mec-custom-nice-select ul.list li .wn-mec-text:after { + left: calc(50% - 7px); + top: auto; + bottom: 1px; +} + +.mec-custom-nice-select ul.list li .wn-img-sh { + line-height: 1; +} + +.mec-sed-methods li:before { + left: 9px; + top: calc(50% - 7px); +} + +.mec-custom-nice-select ul.list li.option.selected .wn-mec-text:after, +.mec-sed-methods li.active:before { + width: 4px; + height: 4px; + border: 7px solid #07bbe9; + background: #fff; + box-shadow: 0 3px 16px -3px #07bbe9; +} + +#menu-posts-mec-books .wp-menu-image img, +#toplevel_page_mec-intro .wp-menu-image img { + width: 18px !important; + padding-top: 7px !important; +} + +.mec-add-booking-tabs-wrap, +.mec-add-event-tabs-wrap, +.mec-create-shortcode-tabs-wrap { + display: flex; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; +} + +.mec-add-booking-tabs-left, +.mec-add-event-tabs-left { + min-width: 200px; +} + +@media (max-width: 1366px) { + + .mec-add-booking-tabs-left, + .mec-add-event-tabs-left { + min-width: 137px; + } +} + +.mec-add-booking-tabs-left, +.mec-add-event-tabs-left, +.mec-create-shortcode-tabs-left { + flex: 1; +} + +.mec-add-booking-tabs-right, +.mec-add-event-tabs-right, +.mec-create-shortcode-tabs-right { + flex: 6; +} + +a.mec-add-booking-tabs-link, +a.mec-add-event-tabs-link, +a.mec-create-shortcode-tabs-link { + display: block; +} + +.mec-booking-tab-content, +.mec-create-shortcode-tab-content, +.mec-event-tab-content { + display: none; + transition: all 0.3s ease; +} + +.mec-booking-tab-content.mec-tab-active, +.mec-create-shortcode-tab-content.mec-tab-active, +.mec-event-tab-content.mec-tab-active { + display: block; +} + +.mec-add-booking-tabs-wrap, +.mec-add-event-tabs-wrap { + background: #fff; + margin: -6px -12px -12px; +} + +.mec-create-shortcode-tabs-wrap { + margin: -30px -22px -42px; +} + +.mec-add-booking-tabs-left, +.mec-add-event-tabs-left, +.mec-create-shortcode-tabs-left { + background: #f7f8f9; +} + +.mec-add-booking-tabs-left a, +.mec-add-event-tabs-left a, +.mec-create-shortcode-tabs-left a { + display: block; + position: relative; + outline: 0; + padding: 13px 4px 13px 15px; + background: #e3e5e7; + background: 0 0; + border: solid; + border-width: 1px 0 1px 0; + border-color: transparent; + color: #3f454a; + font-size: 13px; + font-weight: 600; + text-decoration: none; + border-radius: 0; + transition: all 0.2s ease; +} + +.mec-add-booking-tabs-left a:first-of-type, +.mec-add-event-tabs-left a:first-of-type, +.mec-create-shortcode-tabs-left a:first-of-type { + border-top: none; +} + +.mec-add-booking-tabs-left a:hover, +.mec-add-event-tabs-left a:hover, +.mec-create-shortcode-tabs-left a:hover { + background: #fff; + color: #07bbe9; +} + +.mec-add-booking-tabs-left a:focus, +.mec-add-event-tabs-left a:focus, +.mec-create-shortcode-tabs-left a:focus { + box-shadow: none; + outline: unset; +} + +.mec-add-booking-tabs-left a.mec-tab-active, +.mec-add-event-tabs-left a.mec-tab-active, +.mec-create-shortcode-tabs-left a.mec-tab-active { + background: #ecf9fd; + color: #07bbe9; + border-color: #ccecf4; + position: relative; + padding-left: 17px; +} + +.inside div div>a.mec-tab-active:after, +.inside div div>a.mec-tab-active:before { + position: absolute; + z-index: 9 !important; + content: " "; + height: 0; + width: 0; + border: 8px solid transparent; + border-right-color: #fff; + right: -1px; + top: 13px; +} + +.inside div div>a.mec-tab-active:before { + border-right-color: #d7d8d9; + right: 0; +} + +.mec-add-booking-tabs-right, +.mec-add-event-tabs-right, +.mec-create-shortcode-tabs-right { + padding: 0 30px 40px; + border-left: 1px solid #e2e2e2; +} + +.mec-booking-tab-content.mec-tab-active, +.mec-create-shortcode-tab-content.mec-tab-active, +.mec-event-tab-content.mec-tab-active { + animation: fadeEffect2 0.31s; +} + +@media (max-width: 1366px) { + + .mec-add-booking-tabs-right, + .mec-add-event-tabs-right, + .mec-create-shortcode-tabs-right { + padding: 0 15px 20px; + } + + .mec-form-row select { + min-width: 60px; + } +} + +@media (min-width: 1199px) and (max-width: 1280px) { + + .mec-add-booking-tabs-right, + .mec-add-event-tabs-right, + .mec-create-shortcode-tabs-right { + padding: 0 0 0 10px; + } + + #mec_meta_box_hourly_schedule_days { + padding: 0 40px 0 0; + } + + #mec_meta_box_hourly_schedule_days .mec-form-row.mec-box { + margin-right: -40px; + } + + #mec_comment, + #mec_cost, + #mec_countdown_method, + #mec_event_timezone, + #mec_public, + #mec_repeat_type { + min-width: 220px; + width: 220px; + } + + #mec_meta_box_hourly_schedule_days .mec-box.mec-form-row input[type="text"] { + max-width: 120px; + } + + .mec-form-row .mec-time-picker select { + min-width: 60px; + } + + #mec_countdown_method, + #mec_repeat_type { + min-width: 220px; + width: 220px; + } + + #mec_exceptions_in_days_container .mec-col-4 { + width: 25%; + } + + #mec_exceptions_in_days_container .mec-col-3 { + width: 50%; + } + + #mec_exceptions_in_days_container .mec-col-5 { + width: 20%; + } + + #mec_exceptions_in_days_container input[type="text"] { + width: 95%; + } + + #mec_repeat_certain_weekdays_container label:not(.mec-col-3) { + display: block; + padding-left: 25%; + } +} + +@media (max-width: 1023px) { + + .post-type-mec-events h4, + .post-type-mec_calendars .mec-meta-box-fields h3 { + margin-top: 20px; + } + + .post-type-mec-events .mec-form-row { + padding-bottom: 20px; + } + + .post-type-mec-events .mec-form-row .mec-form-row { + padding: 0; + } + + .post-type-mec-events .mec-form-row .mec-col-1, + .post-type-mec-events .mec-form-row .mec-col-10, + .post-type-mec-events .mec-form-row .mec-col-11, + .post-type-mec-events .mec-form-row .mec-col-12, + .post-type-mec-events .mec-form-row .mec-col-2, + .post-type-mec-events .mec-form-row .mec-col-3, + .post-type-mec-events .mec-form-row .mec-col-4, + .post-type-mec-events .mec-form-row .mec-col-5, + .post-type-mec-events .mec-form-row .mec-col-6, + .post-type-mec-events .mec-form-row .mec-col-7, + .post-type-mec-events .mec-form-row .mec-col-8, + .post-type-mec-events .mec-form-row .mec-col-9 { + display: block; + width: 100%; + margin: 20px 0 0 0; + max-width: 285px; + } + + .post-type-mec-events .mec-add-booking-tabs-left, + .post-type-mec-events .mec-add-event-tabs-left { + min-width: 180px; + } + + .post-type-mec-events .mec-add-booking-tabs-left a, + .post-type-mec-events .mec-add-event-tabs-left a, + .post-type-mec-events .mec-create-shortcode-tabs-left a { + padding-left: 10px; + } + + #mec_repeat_type, + .post-type-mec-events #mec_settings_fes_thankyou_page_url, + .post-type-mec-events .mec-form-row .mec-col-4 input[type="number"], + .post-type-mec-events .mec-form-row .mec-col-4 input[type="text"], + .post-type-mec-events .mec-form-row .mec-col-4 select, + .post-type-mec-events .mec-form-row .mec-col-4 textarea { + width: 100%; + max-width: 255px; + } + + #mec-exceptional-days .mec-certain-day>div, + #mec_exceptions_in_days_container .mec-certain-day>div { + width: 100%; + max-width: 255px; + padding: 12px; + margin: 20px 10px 0 0; + border-radius: 8px; + } + + .mec-certain-day .mec-in-days-day, + .mec-certain-day>div .mec-not-in-days-day { + line-height: 21px; + font-size: 10px; + } + + #mec_repeat_certain_weekdays_container label { + display: block; + margin: 20px 0 20px 0; + } +} + +@media (max-width: 640px) { + + .mec-add-booking-tabs-wrap, + .mec-add-event-tabs-wrap, + .mec-create-shortcode-tabs-wrap { + display: block; + } + + .post-type-mec-events .mec-add-booking-tabs-left, + .post-type-mec-events .mec-add-event-tabs-left { + min-width: 100%; + width: 100% !important; + display: block !important; + float: unset; + margin: 0; + flex: unset; + height: auto; + } + + .post-type-mec-events .mec-add-booking-tabs-right, + .post-type-mec-events .mec-add-event-tabs-right, + .post-type-mec-events .mec-create-shortcode-tabs-right { + display: block; + min-width: 100%; + width: 100%; + margin: 0; + flex: unset; + } + + .post-type-mec-events .mec-add-booking-tabs-left a, + .post-type-mec-events .mec-add-event-tabs-left a, + .post-type-mec-events .mec-create-shortcode-tabs-left a { + font-size: 14px; + padding: 14px 10px 14px 15px; + line-height: 1.2; + letter-spacing: 0; + } + + .mec-add-booking-tabs-right, + .mec-add-event-tabs-right, + .mec-create-shortcode-tabs-right { + padding-left: 10px; + padding-right: 10px; + } + + #mec_tickets .mec-box { + max-width: 290px; + } +} + +@keyframes fadeEffect2 { + from { + opacity: 0; + transform: translateX(11px); + } + + to { + opacity: 1; + transform: translateX(0); + } +} + +.mec-form-row .mec-col-8 label, +.mec-form-row .mec-col-9 label { + padding-right: 20px; +} + +@media (min-width: 860px) and (max-width: 1280px) { + .mec-form-row .mec-col-9 label { + padding-right: 12px; + } +} + +#mec-event-data .mec-form-row label { + margin-right: 14px; +} + +.mec-form-row input[type="date"]::-webkit-calendar-picker-indicator { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA0QjQ2N0QwQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA0QjQ2N0QxQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDRCNDY3Q0VCNDgzMTFFQThEN0VERkNFNTExRURFMzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDRCNDY3Q0ZCNDgzMTFFQThEN0VERkNFNTExRURFMzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6WW71PAAAGIklEQVR42qRX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); + background-position: center; + background-size: cover; + width: 10px; + height: 12px; + display: block; +} + +.mec-attendees-wrapper select, +.mec-calendar-metabox .wn-mec-select, +.mec-form-row input[type="date"], +.mec-form-row input[type="email"], +.mec-form-row input[type="number"], +.mec-form-row input[type="password"], +.mec-form-row input[type="tel"], +.mec-form-row input[type="text"], +.mec-form-row input[type="url"], +.mec-form-row select, +.mec-form-row textarea, +.mec-form-row.mec-skin-list-date-format-container input[type="text"], +.mec-occurrences-wrapper input[type="date"], +.mec-occurrences-wrapper input[type="email"], +.mec-occurrences-wrapper input[type="number"], +.mec-occurrences-wrapper input[type="tel"], +.mec-occurrences-wrapper input[type="text"], +.mec-occurrences-wrapper input[type="url"], +.mec-occurrences-wrapper select, +.mec-occurrences-wrapper textarea { + border: none; + background-color: #f7f8f9; + border-radius: 5px; + height: 38px; + line-height: 38px; + padding-left: 10px; + vertical-align: top; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +.mec-calendar-metabox .wn-mec-select, +.mec-form-row select, +.post-type-mec-events .mec-form-row select, +.post-type-mec_calendars .mec-form-row select, +.wns-be-main .mec-form-row select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + cursor: pointer; + min-height: 34px; + line-height: 34px; + background-color: #f7f8f9; + border-radius: 5px; + padding-right: 24px; + box-shadow: 0 1px 3px rgb(0 0 0 / 2%); + transition: all 0.23s ease; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE3IDE3Ij4KPGc+CjwvZz4KCTxwYXRoIGQ9Ik0xNi4zNTQgNS4wNzVsLTcuODU1IDcuODU0LTcuODUzLTcuODU0IDAuNzA3LTAuNzA3IDcuMTQ1IDcuMTQ2IDcuMTQ4LTcuMTQ3IDAuNzA4IDAuNzA4eiIgZmlsbD0iIzAwMDAwMCIgLz4KPC9zdmc+Cg==); + background-repeat: no-repeat; + background-size: 26px 10px; + background-position: right center; + min-width: 160px; + border: 1px solid #e6e9eb; +} + +.post-type-mec-events .mec-form-row .mec-time-picker select, +.post-type-mec-events .wn-ticket-time select { + min-width: 60px; +} + +.wns-be-main .mec-col-4 select { + min-width: unset; +} + +.mec-form-row .nice-select { + background-image: unset; +} + +.mec-calendar-metabox .wn-mec-select.open .list { + border-radius: 0 0 2px 2px; + box-shadow: 0 0 0 1px #ddd, 0 2px 6px rgba(0, 0, 0, 0.07); +} + +.mec-calendar-metabox .mec-custom-nice-select.open ul.list { + border-radius: 5px; + box-shadow: 0 2px 6px rgb(0 0 0 / 3%); + margin-left: 0 !important; + transform: translateX(-50%); + left: 50%; +} + +.mec-custom-nice-select ul.list li.option.selected .wn-mec-text:after { + border: 6px solid #40d9f1; + box-shadow: 0 3px 16px -3px #40d9f1; +} + +.mec-form-row label+span.mec-tooltip { + bottom: 0; +} + +.mec-form-row textarea+span.mec-tooltip { + bottom: auto; + vertical-align: top; + top: 12px; +} + +.mec-form-row span+span.mec-tooltip { + bottom: 0; + vertical-align: middle; +} + +.mec-form-row .tooltip-move-up span+span.mec-tooltip i { + margin-top: -40px; +} + +.mec-form-row .mec-col-8 input[type="text"], +.mec-form-row .mec-col-8 select, +.mec-form-row .mec-col-8 span.mec-archive-skins { + vertical-align: top; +} + +.mec-form-row .mec-col-8 span.mec-archive-skins input[type="text"] { + max-width: 225px; +} + +.mec-form-row input:disabled { + opacity: 0.6; + background: #f6f6f6; +} + +.wns-be-group-tab h5 { + font-size: 16px; + font-weight: 600; + color: #444; + margin: 0 0 40px 0; +} + +.mec-form-row textarea { + height: auto; + margin-bottom: 0; + min-height: 60px; +} + +.mec-form-row .wp-picker-container input[type="text"].wp-color-picker { + height: 25px; + vertical-align: top; + width: 4rem; + margin: -1px 0 0 0 !important; +} + +.mec-form-row .wp-picker-container label { + margin: 0; +} + +.mec-image-select-wrap li span:hover { + border-color: #fff; + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.12); +} + +.mec-message-categories li.mec-acc-label:after { + content: "\e604"; + font-family: simple-line-icons; + speak: none; + font-style: normal; + font-weight: 400; + display: block; + font-size: 13px; + color: #999; + position: absolute; + right: 27px; + top: 26px; +} + +.mec-message-categories>li.mec-acc-label[data-status="open"]:after { + content: "\e607"; + color: #07bbe9; +} + +.mec-message-categories>li.mec-acc-label[data-status="open"] { + color: #07bbe9; +} + +.mec-message-categories>li.mec-acc-label:last-of-type { + border-bottom: none; +} + +.mec-message-categories>li.mec-acc-label[data-status="open"] { + border-bottom: 1px solid #e6e6e6; +} + +.mec-form-row ul.mec-message-categories { + border-radius: 5px; + overflow: hidden; + margin-top: 30px; + background: #f5f5f5; + border: 2px solid #e6e6e6; + max-width: 700px; +} + +.mec-form-row ul.mec-message-categories li ul { + padding: 10px 40px 40px; + margin: 0 -30px 0; + background: #fff; + box-shadow: inset 0 6px 7px -2px rgb(0 0 0 / 4%); + border-top: 1px solid #eee; + cursor: default; +} + +.mec-form-row ul.mec-message-categories ul label { + margin: 0; + font-size: 14px; + color: #888; + cursor: default; +} + +#mec_calendar_display_options .mec-tooltip { + bottom: 1px; +} + +#mec_add_fee_button, +#mec_add_ticket_variation_button, +#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button, +#taxes_option #mec_fees_list .mec-form-row .button, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button, +.mec-export-settings, +.mec-import-settings, +.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result), +.mec-form-row .button:not(.wp-color-result), +.mec-occurrences-wrapper .button:not(.wp-color-result), +#database_setup_button { + border-radius: 25px; + border: 1px solid #d1e5ec; + text-shadow: none; + padding: 0 12px; + height: 38px; + letter-spacing: 0.2px; + margin-right: 5px; + background: #fff; + color: #07bbe9; + box-shadow: 0 1px 5px -1px rgb(0 0 0 / 5%); + transition: all 0.2s ease; + cursor: pointer; + display: inline-block; + line-height: 36px; + text-decoration: none; +} + +#mec_add_fee_button:hover, +#mec_add_ticket_variation_button:hover, +#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:hover, +.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):hover, +.mec-occurrences-wrapper .button:not(.wp-color-result):hover, +.button:not(.wp-color-result):hover .mec-export-settings:hover, +.mec-import-settings:hover { + background: #f0f9fc; + color: #07bbe9; +} + +#taxes_option #mec_fees_list .mec-form-row .button, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button { + margin: 0; +} + +#mec-hourly-schedule .mec-form-row .mec-col-1 .button, +#mec-hourly-schedule .mec-form-row.mec-box .button, +#mec_faq_list .mec-faq-actions .mec-faq-remove, +#taxes_option #mec_fees_list .mec-form-row .button, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button, +.mec-dash-remove-btn { + color: #ea6485 !important; + border-color: #ea6485 !important; +} + +#mec-hourly-schedule .mec-form-row .mec-col-1 .button:hover, +#mec-hourly-schedule .mec-form-row.mec-box .button:hover, +#mec_faq_list .mec-faq-actions .mec-faq-remove:hover, +#taxes_option #mec_fees_list .mec-form-row .button:hover, +#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:hover, +.mec-dash-remove-btn:hover { + background: rgb(234 100 133 / 0.1) !important; +} + +#mec-hourly-schedule .mec-hourly-schedule-form-speakers { + margin-top: 20px; +} + +#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button, +#mec_meta_box_downloadable_file_options #mec_public_download_module_file_remove_image_button { + margin-top: 12px; +} + +#mec_meta_box_downloadable_file_options input[type="file"] { + max-width: 166px; + text-align: center; + transition: all 0.2s ease; + border-radius: 5px !important; + border: 2px dashed #b8e9f3; + margin-bottom: 12px; + height: 44px; + text-decoration: none; + padding: 0 15px 1px; + text-transform: none; + letter-spacing: 0; + font-weight: 600; + color: #40d9f1; + box-shadow: 0 2px 6px -3px #cfeff5; + display: block; +} + +#mec_meta_box_downloadable_file_options input[type="file"]:hover { + box-shadow: 0 2px 16px -3px #cfeff5; +} + +#mec_meta_box_downloadable_file_options input[type="file"]::-webkit-file-upload-button { + visibility: hidden; + width: 1px; + height: 38px; +} + +#mec_meta_box_downloadable_file_options input[type="file"]::-moz-file-upload-button { + visibility: hidden; + width: 1px; + height: 38px; +} + +.mec-attendees-wrapper .mec-attendees-list { + margin: 22px 0 0; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child { + background: #fff; + border-bottom: 1px solid #cfeff5; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child div span { + line-height: 1; + font-weight: 600; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix { + display: flex; + background: #f8feff; + padding: 10px; + text-align: left; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:first-child { + width: 100%; + max-width: 30%; + padding: 0; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3 a { + text-decoration: unset; +} + +.mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd) { + background: #fff; +} + +#mec-read-more .mec-form-row span.mec-tooltip { + top: 2px; + left: -4px; +} + +#mec-occurrences .mec-occurrences-list { + margin-top: 12px; +} + +#mec-occurrences .mec-occurrences-list h3 { + margin: 0 0 30px 0; +} + +#mec-occurrences .mec-occurrences-list .mec-form-row { + margin-bottom: 0; +} + +#mec-occurrences .mec-occurrences-list .mec-form-row label { + display: inline-block; + margin: 0; + width: 141px; +} + +#mec-occurrences .mec-occurrences-list .mec-form-row label.label-radio, +#mec-occurrences .mec-occurrences-list .mec-form-row label.label-checkbox { + display: block; + width: 100%; +} + +#mec-occurrences .mec-occurrences-list .mec-form-row .event-status-schema label { + width: auto; + min-width: 160px; +} + +#mec-occurrences .mec-occurrences-list .mec-form-row .event-status-schema p { + border: unset; + padding-left: 0; + margin-left: 0; +} + +#mec-search-settings { + border-radius: 21px; + min-height: 32px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.06); + margin-right: 10px; + color: #7c838a; + font-size: 13px; + width: 260px; + background: #f7f8f9; + border: none; + z-index: 1; + transition: all 0.18s ease; + outline: 0; + line-height: 36px; + padding: 2px 10px 1px 38px; +} + +#mec-search-settings:focus { + background: #fff; + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.07), 0 0 0 1px #e6e6e6; + width: 270px; +} + +.mec-search-settings-wrap { + display: inline-block; + position: relative; +} + +.mec-search-settings-wrap i { + position: absolute; + left: 16px; + top: 13px; + font-size: 13px; + color: #7e8c98; + display: block; + z-index: 2; +} + +#mec-search-settings::-webkit-input-placeholder { + color: #7c838a; +} + +#mec-search-settings::-moz-placeholder { + color: #7c838a; +} + +#mec-search-settings:-ms-input-placeholder { + color: #7c838a; +} + +#mec-search-settings:-moz-placeholder { + color: #7c838a; +} + +#wns-be-content .noresults label, +#wns-be-content .results .results .noresults label { + color: #000; +} + +#wns-be-content .results .results .results label, +#wns-be-content .results label, +#wns-be-content ul li.enable, +#wns-be-content ul li.enable label { + color: #07bbe9; +} + +#wns-be-content ul li.disable, +#wns-be-content ul li.disable label { + color: #e7e7e7; +} + +.ui-datepicker.ui-widget { + border: 1px solid #e8e8e8; + box-shadow: 0 1px 9px rgba(0, 0, 0, 0.12); +} + +.ui-datepicker.ui-widget select { + font-weight: 600; + font-size: 12px; + border-radius: 2px; + padding: 2px 10px; + margin: 1px 3px 5px; +} + +.ui-datepicker.ui-widget table { + border-spacing: 2px; +} + +.ui-datepicker.ui-widget td, +.ui-datepicker.ui-widget tr { + padding: 0; + background: 0 0 !important; +} + +.ui-datepicker.ui-widget td a { + color: #777; + font-weight: 600; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; + border-radius: 33px; + padding: 0; + background: #fff; + transition: all 0.2s ease; +} + +.ui-datepicker.ui-widget td a.ui-state-active, +.ui-datepicker.ui-widget td a:hover { + background: #40d9f1; + color: #fff; +} + +.ui-datepicker.ui-widget .ui-datepicker-next, +.ui-datepicker.ui-widget .ui-datepicker-prev { + color: #40d9f1; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; + text-align: center; + border-radius: 33px; + background: #ecfcff; + transition: all 0.2s ease; +} + +.ui-datepicker.ui-widget .ui-datepicker-next:hover, +.ui-datepicker.ui-widget .ui-datepicker-prev:hover { + background: #fff; + box-shadow: 0 0 7px -3px rgba(0, 0, 0, 0.4); +} + +#mec-wrap { + width: 92%; + margin: 20px auto; + max-width: 1200px; +} + +#mec-wrap .nav-tab-wrapper { + margin-bottom: 0; + position: relative; + z-index: 8; + padding: 0; + border-radius: 10px; + border: none; + margin-top: 35px; + clear: both; + background: #fff; + border: 1px solid #e3e5e7; +} + +#mec-wrap .nav-tab-wrapper .nav-tab { + position: relative; + padding: 28px 17px; + border: none; + background: transparent; + margin: 0; + font-size: 13px; + color: #444; + outline: 0; + letter-spacing: -0.1px; + box-shadow: none; + transition: all 0.2s ease; +} + +#mec-wrap .nav-tab-wrapper .nav-tab:hover { + color: #07bbe9; +} + +#mec-wrap .nav-tab-wrapper .nav-tab:after { + content: ""; + display: inline-block; + width: 1px; + height: 30%; + position: absolute; + right: 0; + top: 35%; + background: #e9e9e9; +} + +#mec-wrap .nav-tab-wrapper .nav-tab-active, +#mec-wrap .nav-tab-wrapper .nav-tab-active:focus, +#mec-wrap .nav-tab-wrapper .nav-tab-active:focus:active, +#mec-wrap .nav-tab-wrapper .nav-tab-active:hover { + background: #ecf9fd; + outline: 0; + z-index: 2; + border: 1px solid #ccecf4; + color: #07bbe9; + border-radius: 5px; + margin: -1px; +} + +#mec-wrap .nav-tab-wrapper .nav-tab-active:after { + content: ""; + position: absolute; + display: block; + background: 0 0; + top: auto; + height: auto; + bottom: -20px; + left: 50%; + margin-left: -10px; + width: 0; + border-width: 10px; + border-style: solid; + border-color: #ecf9fd transparent transparent; +} + +#mec-wrap .mec-container { + padding: 25px 40px 40px; +} + +.m-e-calendar_page_MEC-ix #mec-wrap .mec-container, +#mec-wrap .mec-container.booking-report-container { + border: 1px solid #e3e5e7; + border-top: none; + border-radius: 0 0 10px 10px; + margin: -2px 6px 0 6px; +} + +#wpwrap .mec-button-primary { + box-shadow: 0 0 0 4px #e4ffe6; + text-shadow: none; + margin-right: 5px; + background: #64e385; + color: #fff; + border: none; + cursor: pointer; + padding: 2px 22px; + border-radius: 22px; + font-weight: 500; + line-height: 39px; +} + +#wpwrap .mec-button-primary:hover { + box-shadow: 0 0 0 4px rgb(0 0 0 / 10%); + background: #4d5051; + border-color: #4d5051; + cursor: pointer; +} + +#mec-wrap .nav-tab-wrapper .nav-tab-active:before { + content: ""; + position: absolute; + display: block; + background: 0 0; + top: auto; + height: auto; + bottom: -24px; + left: 50%; + margin-left: -12px; + width: 0; + border-width: 12px; + border-style: solid; + border-color: #ccecf4 transparent transparent; +} + +.ui-datepicker.ui-widget select { + border-color: #e7e8e9; +} + +.wn-p-t-right { + min-width: 300px; + max-width: 400px; + display: inline-block; + top: -8px; + left: 50%; + margin-top: 0; + transform: translate(-50%, -100%); + padding: 0; + background-color: #535a61; + color: #fff; + font-weight: 300; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.5; + position: absolute; + z-index: 99999999; + box-sizing: border-box; + border-radius: 6px; + box-shadow: 0 4px 45px -8px #444b50; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; + padding: 20px; + border-radius: 8px; +} + +.wn-p-t-right i { + position: absolute !important; + top: 100%; + right: 50%; + margin-top: -6px !important; + margin-right: -6px !important; + width: 12px; + height: 24px; + overflow: hidden; + transform: rotate(-90deg); +} + +.wn-p-t-right i:after { + content: ""; + position: absolute; + width: 12px; + height: 12px; + left: 0; + top: 50%; + transform: translate(50%, -50%) rotate(-45deg); + background-color: #535a61; + box-shadow: 0 8px 9px -4px #535a61; +} + +.wn-p-t-right .wn-p-t-text-content h5 { + color: #fff; + font-size: 17px; + font-weight: 600; + margin: -20px; + padding: 15px 0; + text-align: center; + margin-bottom: 10px; + background: #3a3f44; + border-bottom: 1px solid #32363a; + border-radius: 6px 6px 0 0; +} + +.mec-addon-box-footer a:hover .wn-p-t-right { + visibility: visible; + opacity: 1; +} + +#mec_organizer_user+.select2-container, +#mec_speaker_user+.select2-container { + min-width: 224px !important; +} + +.mec-add-event-tabs-wrap .select2-container, +.mec-create-shortcode-tab-content .select2-container, +.wns-be-main .mec-form-row .select2-container { + min-height: 38px; + height: auto; + box-sizing: border-box; + padding: 0 6px 0 10px; + border-radius: 5px; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); + background-color: #f7f8f9; + color: #32373c; + outline: 0; + transition: 50ms border-color ease-in-out; + min-width: 200px; + width: 100% !important; + max-width: 290px !important; + font-size: 14px; +} + +.mec-add-event-tabs-wrap .select2-selection, +.mec-create-shortcode-tab-content .select2-selection, +.wns-be-main .mec-form-row .select2-selection { + border: none; + background: 0 0; + padding-top: 3px; + width: 100%; + height: 100%; +} + +.mec-add-event-tabs-wrap .select2-container--default.select2-container--focus .select2-selection, +.mec-create-shortcode-tab-content .select2-container--default.select2-container--focus .select2-selection, +.wns-be-main .mec-form-row .select2-container--default.select2-container--focus .select2-selection { + border: none !important; + outline: 0; +} + +.mec-add-event-tabs-wrap .select2-container--default .select2-selection--single .select2-selection__arrow, +.mec-create-shortcode-tab-content .select2-container--default .select2-selection--single .select2-selection__arrow, +.wns-be-main .mec-form-row .select2-container--default .select2-selection--single .select2-selection__arrow { + top: 5px; + right: 4px; +} + +.fs-webform-container div .fserv-container { + width: 100% !important; + max-width: none !important; + min-height: 238px !important; + box-shadow: 0 1px 6px rgb(0 0 0 / 1%) !important; + border-radius: 15px !important; + padding: 15px 0 0 !important; + margin-bottom: 0 !important; + margin-top: 30px !important; + background: url(https://webnus.net/modern-events-calendar/wp-content/uploads/2019/11/illustration.svg) no-repeat top right; + background-size: 330px; + border: 1px solid #e3e5e7; +} + +.fserv-container .fserv-form-name { + font-weight: 600 !important; + position: relative !important; + font-size: 20px !important; + padding: 30px 30px 10px !important; + text-align: left !important; + margin: 0 !important; + line-height: 1; +} + +.fserv-form-description { + padding: 10px 30px !important; + margin: 1em 0 0 !important; + line-height: 1.5 !important; + font-size: 16px !important; +} + +.fserv-container form { + padding: 0 !important; + padding-left: 28px !important; +} + +.fserv-container .fserv-label { + display: none !important; +} + +.fserv-field { + display: inline-block; + padding: 0 !important; + min-width: 260px; + margin: 0 !important; + margin-right: 25px !important; +} + +.fserv-container label.fserv-form-description { + cursor: default; +} + +.fserv-field input.fserv-input-text { + border-radius: 5px !important; + border: none !important; + background-color: #f7f8f9 !important; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%) !important; +} + +.fserv-field+div:not(.fserv-field) { + margin: 0 !important; + border: none !important; + text-align: left !important; + padding-left: 4px !important; + margin-top: 0 !important; + padding-top: 0 !important; + display: inline-block; + margin-right: 10px !important; +} + +.fserv-container .powered-by { + display: none !important; +} + +@media (max-width: 1366px) { + #webnus-dashboard .fserv-container form { + padding: 0 !important; + padding: 0 28px 40px 28px !important; + } + + #webnus-dashboard .fserv-form .fserv-field { + width: 33% !important; + } + + #webnus-dashboard .fserv-form .fserv-button-submit { + margin-left: -2px !important; + } +} + +@media (max-width: 960px) { + #webnus-dashboard .fserv-container form { + padding: 0 !important; + padding: 0 28px 40px 28px !important; + } + + #webnus-dashboard .fserv-form .fserv-field { + width: 100% !important; + } + + #webnus-dashboard .fserv-form .fserv-button-submit { + margin-left: -2px !important; + } +} + +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag { + font-weight: 500; + border-radius: 60px; + text-shadow: none; + box-shadow: 0 0 0 3px rgb(227 249 253 / 15%); + background: #fff; + background: linear-gradient(95deg, #fff 0, #fff 50%, #fff 100%) !important; + border: 1px solid #c0e5ea; + transition: 0.24s; +} + +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary, +#webnus-dashboard .total-bookings button, +button.fserv-button-submit { + color: #fff !important; + font-weight: 500 !important; + border-radius: 60px !important; + box-shadow: 0 0 0 4px rgb(56 213 237 / 1%) !important; + text-shadow: none !important; + background: #38d5ed !important; + border: none !important; + transition: 0.24s !important; +} + +#webnus-dashboard button.fserv-button-submit { + background: #64e385 !important; + box-shadow: 0 0 0 3px #64e3851a !important; +} + +#webnus-dashboard button.fserv-button-submit:hover { + background: #46d26a !important; + box-shadow: 0 0 0 4px #64e38536 !important; +} + +#webnus-dashboard .total-bookings button { + line-height: 39px; + padding: 0 36px; +} + +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary:hover { + color: #fff !important; + background: #1fcae4 !important; + box-shadow: 0 0 0 4px rgb(56 213 237 / 15%) !important; +} + +#webnus-dashboard .total-bookings button:hover, +button.fserv-button-submit:hover { + background: #26bbd2 !important; + box-shadow: 0 0 0 4px rgb(56 213 237 / 15%) !important; + cursor: pointer !important; +} + +#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:hover { + box-shadow: 0 0 0 4px rgb(56 213 237 / 8%) !important; + color: #02a3bb !important; + cursor: pointer !important; +} + +.fserv-container input::-webkit-input-placeholder { + font-family: inherit !important; + font-size: 14px; +} + +.fserv-container input::-moz-placeholder { + font-family: inherit !important; + font-size: 14px; +} + +.fserv-container input:-ms-input-placeholder { + font-family: inherit !important; + font-size: 14px; +} + +.fserv-container input:-moz-placeholder { + font-family: inherit !important; + font-size: 14px; +} + +input.fserv-input-text { + height: 38px; + box-sizing: border-box; + margin-bottom: 8px; + padding: 0 6px; + box-shadow: none; + border-radius: 2px; + box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.05); +} + +.fserv-field label.error { + display: none !important; +} + +.fs-notifier { + position: fixed !important; + top: 40px !important; + width: 300px !important; + max-width: 300px !important; + margin: 0 !important; + right: 20px !important; + left: unset !important; +} + +.post-type-mec-events .lity { + background: #edf0f3; +} + +.post-type-mec-events .lity-container { + width: 60vw; + max-width: 883px; + margin: 0 auto; + border-radius: 7px; +} + +.post-type-mec-events .lity-content:after { + display: none; +} + +.mec-manage-events-lightbox { + box-shadow: 0 3px 20px rgba(0, 0, 0, 0.05); +} + +.w-clearfix.mec-attendees-content img { + display: inline-block; + width: 25px; + height: 25px; + vertical-align: middle; + margin-right: 7px; +} + +.post-type-mec-events .mec-attendees-list-head { + background: #008aff; + color: #fff; + text-align: center; + padding: 17px 0; + text-transform: capitalize; + font-size: 26px; + font-weight: 700; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + border-radius: 7px 7px 0 0; + line-height: 43px; + box-shadow: 0 3px 15px rgba(0, 138, 255, 0.25); + z-index: 99; +} + +.mec-attendees-list-wrap { + display: flex; + width: 100%; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + background: #fff; + box-shadow: 0 3px 20px rgba(0, 0, 0, 0.05); + border-radius: 0 0 5px 5px; + overflow: hidden; +} + +.mec-attendees-list-left { + flex: 1; + background: #f6f8fa; + padding: 0; + border-radius: 0; + position: relative; +} + +.mec-attendees-list-right, +.mec-send-email-form-wrap { + flex: 1; + border-radius: 0 0 5px 5px; + padding: 0 20px 20px; + background: #f2f4f7; +} + +.mec-attendees-list-left-menu a { + display: inline-block; + line-height: 22px; + font-size: 12px; + color: #000; + font-weight: 500; + border-bottom: 1px solid #eaebec; + border-left: 1px solid #eaebec; + padding-bottom: 0; + padding: 7px 6px; + margin-bottom: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + transition: all 0.2s ease; + text-decoration: none; + text-align: center; +} + +.mec-attendees-list-left-menu a.selected-day { + color: #008aff; +} + +.mec-attendees-list-left-menu .owl-item:last-child a { + border-right: 1px solid #eaebec; +} + +.mec-attendees-list-right table { + width: 100%; +} + +.w-clearfix.mec-attendees-head { + margin-top: 30px; + border-bottom: 2px solid #ccecf4; + padding-bottom: 18px; + margin-bottom: 3px; +} + +.w-clearfix.mec-attendees-content [class^="w-col-xs-"], +.w-clearfix.mec-attendees-head [class^="w-col-xs-"] { + padding: 0; +} + +.w-clearfix.mec-attendees-head span { + font-weight: 600; + color: #000; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + font-size: 17px; +} + +.w-clearfix.mec-attendees-content { + background: #fff; + margin-bottom: 2px; + padding: 10px 20px; +} + +.mec-attendees-list-left-menu { + height: 36px; + margin-left: 35px; + margin-right: 36px; +} + +.mec-attendees-list-left-menu a:active, +.mec-attendees-list-left-menu a:focus, +.mec-attendees-list-left-menu a:visited { + outline: 0; + box-shadow: none; +} + +.mec-attendees-list-left-menu .owl-item { + display: inline-block; +} + +.mec-attendees-list-left-menu .owl-stage { + min-width: 800px !important; +} + +.owl-nav.disabled .owl-next { + position: absolute; + right: 0; + top: 0; +} + +.owl-nav.disabled .owl-prev { + position: absolute; + left: 0; + top: 0; +} + +.owl-nav.disabled button { + background: #fff; + box-shadow: none; + border: 1px solid #ccc; + height: 36px; + width: 36px; + font-size: 54px; + line-height: 54px; +} + +.owl-nav.disabled button span { + margin-top: -18px; + display: block; +} + +.mec-cover-loader:after { + content: ""; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.5); + z-index: 99999; +} + +.mec-loader { + background: rgba(0, 0, 0, 0); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 9; +} + +.mec-loader, +.mec-loader:after { + border-radius: 50%; + width: 5em; + height: 5em; + z-index: 999999999999; +} + +.mec-loader { + font-size: 10px; + text-indent: -9999em; + border-top: 0.5em solid rgba(0, 0, 0, 0.2); + border-right: 0.5em solid rgba(0, 0, 0, 0.2); + border-bottom: 0.5em solid rgba(0, 0, 0, 0.2); + border-left: 0.5em solid #fff; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation: mecloader 1.1s infinite linear; + animation: mecloader 1.1s infinite linear; +} + +@media (max-width: 992px) { + .post-type-mec-events .lity-container { + width: 80vw; + } +} + +@-webkit-keyframes mecloader { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes mecloader { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.mec-report-backtoselect-wrap, +.mec-report-sendmail-form-wrap { + display: none; +} + +.mec-report-select-event-wrap .select2, +.mec-select-wrap .select2 { + width: 100% !important; +} + +.mec-report-select-event-wrap .select2-container--default .select2-selection--single, +.mec-select-wrap .select2-container--default .select2-selection--single { + border-radius: 4px; + border: 1px solid #e2e3e4; + height: 40px; + padding-top: 5px; + padding-left: 8px; + width: 100%; + box-shadow: none; +} + +.mec-report-select-event-wrap .select2-container--default .select2-selection--single .select2-selection__arrow, +.mec-select-wrap .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 36px; +} + +.mec-report-select-event-wrap .select2-container--open .select2-dropdown--below, +.mec-select-wrap .select2-container--open .select2-dropdown--below { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); + border-color: #d7d8d9; +} + +.select2-container--default .select2-search--dropdown { + padding: 12px; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.02) inset; + border-color: #e3e5e7; + border-radius: 4px; +} + +.mec-report-select-event-wrap input, +.mec-report-select-event-wrap select, +.mec-select-wrap input[type="text"], +.mec-select-wrap select .mec-report-select-event-wrap input[type="text"] { + border: 1px solid #e2e3e4; + height: 40px; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + margin-bottom: 15px; + border-radius: 4px; + box-shadow: none; + max-width: 150px; +} + +#certificate_select { + border: 1px solid #e2e3e4; + height: 34px; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; + margin-bottom: 15px; + border-radius: 4px; + box-shadow: none; + max-width: 300px; + min-width: 200px; + margin: 0 !important; + vertical-align: bottom; +} + +.mec-report-select-event-wrap .select2-container--default, +.mec-select-wrap .select2-container--default { + max-width: 400px; +} + +.select2-dropdown.select2-dropdown { + border-color: #e3e5e7 !important; + box-shadow: none !important; +} + +.mec-report-select-event-wrap select.mec-reports-selectbox-dates, +.mec-select-wrap select.mec-reports-selectbox-dates { + min-width: 260px; + margin: 0 0 0 10px; + padding-left: 15px; +} + +.mec-report-sendmail-form-wrap, +.mec-report-sendmail-wrap { + padding: 30px 15px; + background: #fff; + border: 1px solid #e2e3e4; + margin: 15px 0 5px; + border-radius: 10px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.01); +} + +.mec-report-sendmail-wrap .w-col-sm-12:before { + background: url(../img/email-document.png) no-repeat left top; + content: ""; + display: block; + width: 90px; + height: 70px; + z-index: 100; + float: left; +} + +.mec-report-sendmail-wrap p { + margin: 0 0 15px; + font-size: 15px; + color: #7d8284; +} + +.mec-report-backtoselect-wrap button, +.mec-report-sendmail-wrap .w-col-sm-12 button, +.mec-send-email-form-wrap .mec-send-email-button { + background: #19cde9; + border: none; + color: #fff; + font-size: 13px !important; + padding: 8px 18px; + border-radius: 4px; + cursor: pointer; + box-shadow: 0 1px 2px rgba(25, 205, 233, 0.05); + transition: all 0.2s ease; +} + +.mec-report-backtoselect-wrap button:hover, +.mec-report-sendmail-wrap .w-col-sm-12 button:hover, +.mec-send-email-form-wrap .mec-send-email-button:hover { + background: #04bfdc; + box-shadow: 0 1px 2px rgba(25, 205, 233, 0.05); +} + +.mec-report-backtoselect-wrap button { + margin-top: 15px; +} + +.mec-report-selected-event-attendees-wrap { + background-color: #fff; + border: 1px solid #e1e2e3; + padding: 0; + margin: 20px 0; + border-radius: 7px; + display: none; +} + +.mec-report-selected-event-attendees-wrap .w-col-sm-12 { + width: calc(100% - 30px); +} + +.mec-report-sendmail-wrap { + display: none; +} + +#mec_report_mass_action_form .mec-form-row { + padding: 0; +} + +.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head { + background: #f5f6f7; + border-bottom: 1px solid #e1e2e3; + padding: 15px; + margin: 0; + border-radius: 5px 5px 0 0; +} + +.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content { + margin: 0; + padding: 8px 15px; + border-bottom: 1px solid #e4eef0; + font-size: 13px; + line-height: 25px; +} + +.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content:hover { + background: #f3fdfe; +} + +.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content:last-child { + border-bottom: none; + border-radius: 0 0 6px 6px; +} + +.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content img { + border-radius: 25px; + margin-left: 8px; +} + +.mec-report-selected-event-attendees-wrap input[type="checkbox"] { + border-radius: 3px; + margin-top: 0; +} + +.mec-report-selected-event-attendees-wrap .mec-attendees-head .w-col-xs-2.name { + padding-left: 10px; +} + +.mec-report-selected-event-attendees-wrap .checkin_status span { + font-weight: 600; +} + +.mec-report-selected-event-attendees-wrap .w-col-sm-12>p { + text-align: center; +} + +.mec-attendees-list-right, +.mec-send-email-form-wrap { + flex: 1; + border-radius: 0; + padding: 0; + background: 0 0; + max-width: 674px; + margin: 0 auto; +} + +.mec-report-sendmail-form-wrap { + padding: 0 30px 45px; +} + +.mec-send-email-form-wrap h2 { + background: url(../img/email-document.png) no-repeat center top; + padding-top: 70px; + font-size: 22px; + font-weight: 600; + text-align: center; + padding-bottom: 10px; + padding-left: 10px; + margin-bottom: 0; +} + +#webnus-dashboard .mec-send-email-form-wrap .wp-editor-tools button { + font-size: 13px; + font-weight: 400; + color: #444; + line-height: 1; + margin-bottom: 0; +} + +#webnus-dashboard .mec-send-email-form-wrap .wp-editor-tabs button { + min-height: 30px; +} + +.mec-send-email-form-wrap input.widefat { + min-height: 40px; + border: 1px solid #e2e3e4; + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.02); +} + +.mec-send-email-form-wrap input.widefat:focus { + border: 1px solid #96e3ef; +} + +.mec-send-email-form-wrap h4.mec-send-email-count { + font-weight: 400; + text-align: center; + margin-bottom: 30px; + margin-top: 0; + padding-top: 0; +} + +.mec-send-email-form-wrap .mec-send-email-button { + min-height: 40px; + line-height: 40px; + padding: 0; + font-size: 17px !important; + font-weight: 600; +} + +.mec-send-email-form-wrap .mce-menubtn.mce-fixed-width span { + height: 20px; + padding-top: 2px; +} + +.lity.mec-add-shortcode-popup { + background-color: #b7e4e3; +} + +.lity.mec-add-shortcode-popup .lity-content { + box-shadow: 0 3px 20px 0 rgba(91, 188, 190, 0.55); + border-radius: 10px; + height: 100%; +} + +.mec-add-shortcode-popup .lity-container { + width: 930px; + height: 620px; +} + +.mec-add-shortcode-popup .lity-content:after { + display: none; +} + +.mec-add-shortcode-popup div#mec_popup_shortcode { + background: #fff; + overflow: hidden; + display: flex; + width: 100%; + border-radius: 10px; + height: 100%; +} + +.mec-steps-container { + width: 92px; + text-align: center; + background: #fff; +} + +.mec-steps-panel { + width: calc(100% - 92px); + background: #eef4f5; +} + +.mec-steps-container ul { + text-align: center; + display: block; + margin-top: 62px; +} + +.mec-steps-container ul li { + width: 22px; + height: 70px; + margin: 0 auto; + position: relative; +} + +.mec-steps-container ul li span { + border-radius: 50px; + background-color: rgba(26, 175, 251, 0.16); + width: 22px; + height: 22px; + display: inline-block; + padding-top: 2px; + font-size: 11px; + font-weight: 700; + color: #1aaffb; + box-sizing: border-box; +} + +.mec-steps-container ul li:after, +.mec-steps-container ul li:before { + content: ""; + display: block; + height: 24px; + width: 2px; + background: rgba(26, 175, 251, 0.16); + margin-left: calc(50% - 1px); +} + +.mec-steps-panel .mec-form-row input[type="checkbox"], +.mec-steps-panel .mec-form-row input[type="radio"] { + background: #fff; +} + +.mec-box .mec-steps-panel .mec-form-row input[type="radio"], +.mec-steps-panel .mec-form-row .mec-box input[type="checkbox"] { + background: #f7f8f9; +} + +.mec-steps-panel .mec-form-row .mec-box input[type="checkbox"]:checked, +.mec-steps-panel .mec-form-row .mec-box input[type="radio"]:checked { + background: #fff; +} + +.mec-steps-container ul li:first-of-type:before, +.mec-steps-container ul li:last-of-type:after { + display: none; +} + +.mec-steps-container ul li:first-of-type { + height: 46px; +} + +li.mec-step.mec-step-passed span, +li.mec-step.mec-step-passed:after, +li.mec-step.mec-step-passed:before { + background-color: #2dcb73; + color: #fff; +} + +.mec-steps-container img { + margin-top: 30px; +} + +.mec-steps-header { + display: flex; + background: #fff; + border-radius: 5px; + box-shadow: 0 3px 22px 0 rgb(11 121 125 / 1%); + padding: 12px 22px; + margin: -15px -15px 65px; +} + +.mec-steps-header-settings { + width: 65px; +} + +.mec-steps-header-dashboard { + width: fit-content; + margin-right: 22px; +} + +.mec-steps-header-userinfo { + width: calc(100% - 65px); +} + +.mec-steps-panel { + padding: 35px; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.mec-steps-header-userinfo span { + display: inline-block; + vertical-align: middle; +} + +.mec-steps-header-userinfo span img { + height: 40px; + border-radius: 50px; + margin-right: 8px; + vertical-align: middle; +} + +.mec-steps-header-userinfo span.mec-steps-header-name { + font-size: 14px; + color: #778182; + font-weight: 600; + text-transform: capitalize; +} + +span.mec-steps-header-add-text { + color: #839294; + font-size: 12px; + margin-left: 5px; +} + +.mec-steps-header-dashboard a, +.mec-steps-header-settings a { + height: 100%; + display: block; + padding-top: 11px; + text-decoration: none; + font-size: 12px; + color: #707070; +} + +.mec-steps-header-dashboard a i, +.mec-steps-header-settings a i { + color: #1aaffb; + font-size: 16px; + vertical-align: text-top; + margin-right: 5px; +} + +.mec-next-previous-buttons { + clear: both; +} + +.mec-next-previous-buttons button.mec-button-next { + float: right; + background: #008aff; + border: none; + color: #fff; + cursor: pointer; + width: 123px; + text-align: left; + padding: 8px 18px 9px; + border-radius: 3px; + font-size: 14px; + box-shadow: 0 5px 10px 0 rgba(0, 138, 255, 0.3); + transition: all 0.3s ease; + outline: 0; +} + +.mec-next-previous-buttons button:hover { + background: #000; + box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.3); +} + +.mec-next-previous-buttons button.mec-button-next img { + position: absolute; + top: 16px; + right: 18px; +} + +.mec-next-previous-buttons button { + position: relative; +} + +.mec-next-previous-buttons button.mec-button-prev { + background: #fff; + border: none; + color: #000; + cursor: pointer; + width: 123px; + text-align: right; + padding: 8px 15px 9px; + border-radius: 3px; + font-size: 14px; + box-shadow: 0 5px 10px 0 rgba(11, 121, 125, 0.01); + transition: all 0.3s ease; + outline: 0; +} + +.mec-next-previous-buttons button.mec-button-prev img { + position: absolute; + top: 16px; + left: 18px; +} + +.mec-next-previous-buttons button.mec-button-prev:hover { + background: #000; + box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.3); + color: #fff; +} + +.mec-next-previous-buttons button.mec-button-new { + background: #008aff; + float: right; + border: none; + color: #fff; + cursor: pointer; + width: 154px; + text-align: left; + padding: 8px 18px 9px; + border-radius: 3px; + font-size: 14px; + box-shadow: 0 5px 10px 0 rgba(0, 138, 255, 0.3); + transition: all 0.3s ease; + outline: 0; +} + +.mec-next-previous-buttons button.mec-button-new:hover { + background: #000; + box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.3); +} + +.mec-next-previous-buttons button.mec-button-new img { + vertical-align: sub; + margin-left: -3px; + margin-right: 8px; +} + +div#mec_popup_shortcode_form { + height: calc(100% - 37px); +} + +.mec-steps-content-container { + display: flex; + flex-direction: column; + height: 100%; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 { + background: url(../../assets/img/popup/first-step.png) no-repeat 90% 70%; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .popup-sh-name-required { + color: red; + display: none; + font-style: italic; + font-size: 12px; + margin-top: 8px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 { + top: 50%; + position: absolute; + width: 360px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"] { + width: 360px; + height: 46px; + border: none; + border-radius: 3px; + padding-left: 36px; + font-size: 12px; + color: #b1b2b4; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]::-webkit-input-placeholder { + color: #b1b2b4; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]:-ms-input-placeholder { + color: #b1b2b4; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]::placeholder { + color: #b1b2b4; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1:before { + content: ""; + width: 14px; + height: 14px; + background: url(../../assets/img/popup/add-sh-icon.png) no-repeat center center; + position: absolute; + top: 17px; + left: 17px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul { + height: 386px; + overflow-x: hidden; + overflow-y: scroll; + margin-top: -22px; + margin-bottom: 0; + position: relative; + padding: 0 50px 150px 50px; + background: #fcfbfd !important; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li { + width: 30% !important; + float: left !important; + min-height: 135px !important; + height: 150px; + margin: 1.66% !important; + box-sizing: border-box; + text-align: center; + padding: 12px !important; + border-radius: 8px; + border: 1px solid transparent; + box-shadow: none; + background: #fff0 !important; + cursor: pointer; + transition: all 0.22s ease; + -webkit-transition: all 0.22s ease; + -moz-transition: all 0.22s ease; + -ms-transition: all 0.22s ease; + -o-transition: all 0.22s ease; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li.active { + border: 1px solid #40d9f16b !important; + box-shadow: 0 1px 8px -3px #40d9f152 inset !important; + color: #00cae6 !important; + padding: 12px 0 0 0 !important; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li:hover { + box-shadow: 0 1px 8px rgb(0 0 0 / 3%), 0 0 0 1px #f3f4f5; + background: #fff !important; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li:hover { + background: #fcfbfd; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-img img { + margin: 4px 0 1px 1px; + line-height: 1; + max-width: 68px; + max-height: 56px; + filter: grayscale(1); + -webkit-filter: grayscale(1); + transition: all 0.22s ease; + -webkit-transition: all 0.22s ease; + -moz-transition: all 0.22s ease; + -ms-transition: all 0.22s ease; + -o-transition: all 0.22s ease; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-img img, +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li:hover .mec-step-popup-skin-img img { + filter: grayscale(0); + -webkit-filter: grayscale(0); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text input { + display: block; + margin: 0 auto; + margin-top: 6px; + border: 2px solid #e1e7ed; + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.05); + position: relative; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-img { + padding-top: 16px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li .mec-step-popup-skin-text input { + display: none; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text:before { + width: 14px; + height: 14px; + content: ""; + border-radius: 50px; + background: #fff; + display: block; + position: absolute; + left: calc(50% - 7px); + top: 24px; + z-index: 99; + border: 2px solid #e1e7ed; + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.05); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text { + position: relative; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-text:before { + background: #008aff; + border: none; + box-shadow: 0 5px 10px 0 rgba(0, 138, 255, 0.3); + width: 16px; + height: 16px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-text:after { + width: 4px; + height: 4px; + display: block; + content: ""; + position: absolute; + background: #fff; + left: calc(50% - 1px); + top: 30px; + z-index: 999; + border-radius: 50px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 span.wn-hover-img-sh { + display: block; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles { + height: 386px; + overflow-x: hidden; + padding-left: 60px; + padding-bottom: 19px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label { + width: 193px !important; + float: left !important; + margin: 1.66% !important; + text-align: center; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label span { + width: 193px !important; + float: left !important; + min-height: 135px !important; + height: 150px; + box-sizing: border-box; + border-radius: 5px; + border: 2px solid #c4edff; + background: #fff !important; + cursor: pointer; + margin-bottom: 5px; + margin-top: -6px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label.active span { + border-color: #00acf8; + box-shadow: 0 3px 5px rgba(0, 172, 248, 0.2); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label div { + font-size: 14px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label.active div { + color: #008aff; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles input { + opacity: 0; + display: none; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-steps-content.mec-steps-content-3 { + margin-top: -18px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 span.wn-hover-img-sh img { + width: 189px; + height: 146px; + border-radius: 5px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 { + background: url(../../assets/img/popup/fourth-step.png) no-repeat 90% 70%; +} + +.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 .nice-select { + border: none; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 { + top: 40%; + position: absolute; + width: 330px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 h3 { + font-size: 13px; + font-weight: 400; + color: #707070; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div { + border: 2px dashed #dce2e3; + border-radius: 3px; + padding: 20px 20px 6px; + background: #fcfcfc; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div label { + display: block; + margin-bottom: 14px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div label.active input { + background: #fff; + box-shadow: none; + border: 1px solid #cacece; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup { + box-shadow: 0 3px 13px -5px rgba(0, 0, 0, 0.1), + inset 0 1px 2px rgba(0, 0, 0, 0.07); + clear: unset !important; + -webkit-tap-highlight-color: transparent; + background-color: #fff; + border-radius: 5px; + border: solid 1px #e8e8e8; + box-sizing: border-box; + clear: both; + cursor: pointer; + display: block; + float: left; + font-family: inherit; + font-size: 14px; + font-weight: 400; + height: 42px; + line-height: 40px; + outline: 0; + padding-left: 18px; + padding-right: 30px; + position: relative; + text-align: left !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + width: 300px !important; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup:hover { + border-color: #dbdbdb; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open .list { + overflow: unset; + width: 100%; + margin: 0; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .list { + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11); + box-sizing: border-box; + margin-top: 4px; + opacity: 0; + overflow: hidden; + padding: 0; + pointer-events: none; + position: absolute; + top: 100%; + left: 0; + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transform: scale(0.75) translateY(-21px); + -ms-transform: scale(0.75) translateY(-21px); + transform: scale(0.75) translateY(-21px); + -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), + opacity 0.15s ease-out; + transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; + z-index: 9; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup:after { + border-bottom: 2px solid #999; + border-right: 2px solid #999; + content: ""; + display: block; + height: 5px; + margin-top: -4px; + pointer-events: none; + position: absolute; + right: 12px; + top: 50%; + -webkit-transform-origin: 66% 66%; + -ms-transform-origin: 66% 66%; + transform-origin: 66% 66%; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transition: all 0.15s ease-in-out; + transition: all 0.15s ease-in-out; + width: 5px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open:after { + -webkit-transform: rotate(-135deg); + -ms-transform: rotate(-135deg); + transform: rotate(-135deg); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open .list { + opacity: 1; + pointer-events: auto; + -webkit-transform: scale(1) translateY(0); + -ms-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.disabled { + border-color: #ededed; + color: #999; + pointer-events: none; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.disabled:after { + border-color: #ccc; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .list:hover .option:not(:hover) { + background-color: transparent !important; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option { + cursor: pointer; + font-weight: 400; + list-style: none; + min-height: 40px; + outline: 0; + text-align: left; + position: relative; + font-size: 12px !important; + padding: 1px 12px !important; + margin: 0 !important; + line-height: 28px !important; + min-height: 28px !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option .wn-hover-img-sh img { + position: absolute; + padding: 3px; + top: -1px; + left: 100%; + box-shadow: 0 4px 42px -5px rgba(0, 0, 0, 0.16); + visibility: hidden; + opacity: 0; + border: 1px solid #e3e3e3; + border-radius: 2px; + z-index: 99999999; + background: #fff; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option:hover .wn-hover-img-sh img { + visibility: visible; + opacity: 1; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.focus, +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.selected.focus, +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option:hover { + background-color: #f6f6f6; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.selected { + font-weight: 700; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.disabled { + background-color: transparent; + color: #999; + cursor: default; +} + +.mec-add-shortcode-popup .no-csspointerevents .wn-mec-select-popup .list { + display: none; +} + +.mec-add-shortcode-popup .no-csspointerevents .wn-mec-select-popup.open .list { + display: block; +} + +.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input { + background: #fff; + position: relative; + width: 24px; + height: 24px; + border: 1px solid #cacece; +} + +.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input:before { + display: none; +} + +.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label.active input { + background: #008aff; + box-shadow: 0 5px 10px 0 rgba(0, 138, 255, 0.3); + border: none; +} + +.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label.active input:before { + background: #fff; + width: 6px; + height: 6px; + top: 6px; + left: 6px; + position: absolute; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 { + background: url(../../assets/img/popup/fifth-step.png) no-repeat 90% 70%; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 { + width: 360px; + margin-top: 16px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher label { + color: #707070; + font-size: 14px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher p { + color: #8a8a8a; + font-style: italic; + font-size: 12px; + margin-top: 7px; + margin-bottom: 0; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher { + padding-bottom: 30px; + margin-bottom: 34px; + border-bottom: 2px dashed #dce2e3; + position: relative; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher:last-of-type { + padding-bottom: 0; + margin-bottom: 0; + border: none; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher div:last-of-type label { + position: absolute; + top: -4px; + right: 0; + width: 52px; + height: 26px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input:checked+label:after { + margin-left: 26px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input+label:after, +.mec-add-shortcode-popup .mec-switcher input+label:before { + display: block; + position: absolute; + top: 2px; + left: 1px; + bottom: 2px; + content: ""; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input+label:after { + width: 26px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 { + background: url(../../assets/img/popup/sixth-step.png) no-repeat 90% 70%; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-content.mec-steps-content-6 { + margin-top: 56px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode { + width: 325px; + border: 2px dashed #dce2e3; + background: #fcfcfc; + padding: 42px 42px 47px; + text-align: center; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode h3 { + font-size: 16px; + font-weight: 400; + color: #707070; + margin-top: 7px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code { + border-radius: 3px; + background: rgba(154, 214, 222, 0.35); + width: 243px; + margin: 0 auto; + padding: 14px 17px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code code { + background: 0 0; + color: #000; + font-size: 14px; + font-weight: 600; + margin-left: -11px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button { + border: none; + background: #fff; + border-radius: 3px; + padding: 3px 8px 6px; + margin-left: 46px; + cursor: pointer; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button:hover { + background: #000; + color: #fff; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-results p { + width: 325px; + text-align: center; + font-size: 12px; + margin-top: 5px; + color: #8a8a8a; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-loading { + width: 325px; + border: 2px dashed #dce2e3; + background: #fcfcfc; + padding: 42px 42px 47px; + text-align: center; + height: 182px; + position: relative; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-loading .mec-loader { + position: absolute; + left: 136px; + top: 65px; +} + +.mec-add-event-popup button.lity-close, +.mec-add-shortcode-popup button.lity-close { + right: 0; + top: -52px; + border-radius: 50%; + width: 37px; + height: 37px; + background: #fff; + color: #a2afbc; + text-shadow: none; + padding-top: 1px; + transition: all 0.2s ease; + position: absolute; + box-shadow: 0 3px 8px 0 rgba(91, 188, 190, 0.55); +} + +.mec-add-event-popup button.lity-close:hover, +.mec-add-shortcode-popup button.lity-close:hover { + background: #ff6262; + color: #fff; + box-shadow: 0 3px 8px 0 rgb(249 162 162 / 55%); +} + +.mec-skin-styles.mec-styles-full_calendar h3 { + padding-left: 12px; +} + +.lity.mec-add-event-popup { + background-color: #b7e4e3; +} + +.mec-add-event-popup .lity-container { + width: 930px; + height: 620px; + max-width: unset; +} + +.mec-add-event-popup div#mec_popup_event { + background: #fff; + overflow: hidden; + display: flex; + width: 100%; + border-radius: 10px; + height: 100%; +} + +.lity.mec-add-event-popup .lity-content { + box-shadow: 0 3px 20px 0 rgba(91, 188, 190, 0.55); + border-radius: 10px; + height: 100%; +} + +div#mec_popup_event_form { + height: calc(100% - 37px); +} + +.mec-add-event-popup .mec-steps-container ul { + margin-top: 42px; +} + +.mec-add-event-popup .mec-steps-container ul li:first-of-type { + height: 41px; +} + +.mec-add-shortcode-popup .mec-steps-container ul li:after, +.mec-add-shortcode-popup .mec-steps-container ul li:before { + height: 24px; +} + +.mec-add-event-popup .mec-steps-container ul li:after, +.mec-add-event-popup .mec-steps-container ul li:before { + height: 19px; +} + +.mec-add-event-popup .mec-steps-container ul li { + height: 60px; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup { + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); + border: none; + clear: unset !important; + -webkit-tap-highlight-color: transparent; + background-color: #fff; + border-radius: 3px; + box-sizing: border-box; + cursor: pointer; + display: block; + float: left; + font-family: inherit; + font-size: 12px; + font-weight: 400; + line-height: 40px; + outline: 0; + padding-left: 18px; + padding-right: 30px; + position: relative; + text-align: left !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + height: 46px; + margin-right: 6px; + padding-top: 3px; + color: #707070; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open { + border-radius: 3px 3px 0 0; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup:hover { + border-color: #dbdbdb; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open .list { + overflow: unset; + width: 100%; + margin: 0; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list { + background-color: #fff; + border-radius: 0 0 3px 3px; + box-shadow: 0 0 0 0 rgba(68, 68, 68, 0.11); + box-sizing: border-box; + margin-top: 4px; + opacity: 0; + overflow: hidden; + padding: 0; + pointer-events: none; + position: absolute; + top: 100%; + left: 0; + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; + -webkit-transform: scale(0.75) translateY(-21px); + -ms-transform: scale(0.75) translateY(-21px); + transform: scale(0.75) translateY(-21px); + -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), + opacity 0.15s ease-out; + transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; + z-index: 9; + margin-top: 1px !important; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup:after { + border-bottom: 2px solid #00acf8; + border-right: 2px solid #00acf8; + content: ""; + display: block; + height: 5px; + margin-top: -4px; + pointer-events: none; + position: absolute; + right: 15px; + top: 50%; + -webkit-transform-origin: 66% 66%; + -ms-transform-origin: 66% 66%; + transform-origin: 66% 66%; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transition: all 0.15s ease-in-out; + transition: all 0.15s ease-in-out; + width: 5px; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open:after { + -webkit-transform: rotate(-135deg); + -ms-transform: rotate(-135deg); + transform: rotate(-135deg); +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open .list { + opacity: 1; + pointer-events: auto; + -webkit-transform: scale(1) translateY(0); + -ms-transform: scale(1) translateY(0); + transform: scale(1) translateY(0); +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.disabled { + border-color: #ededed; + color: #999; + pointer-events: none; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.disabled:after { + border-color: #ccc; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list:hover .option:not(:hover) { + background-color: transparent !important; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option { + cursor: pointer; + font-weight: 400; + list-style: none; + min-height: 40px; + outline: 0; + text-align: left; + position: relative; + font-size: 12px !important; + padding: 1px 12px !important; + margin: 0 !important; + line-height: 22px !important; + min-height: 22px !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.focus, +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected.focus, +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option:hover { + background-color: #f6f6f6; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected { + font-weight: 700; +} + +.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.disabled { + background-color: transparent; + color: #999; + cursor: default; +} + +.mec-add-event-popup .no-csspointerevents .wn-mec-select-popup .list { + display: none; +} + +.mec-add-event-popup .no-csspointerevents .wn-mec-select-popup.open .list { + display: block; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 { + background: url(../../assets/img/popup/add-event-first-step.png) no-repeat 100% 70%; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name { + width: 100%; + height: 46px; + border: none; + border-radius: 3px; + padding-left: 36px; + font-size: 13px; + color: #3c434a; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name::-webkit-input-placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name:-ms-input-placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name::placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1:before { + content: ""; + width: 14px; + height: 14px; + background: url(../../assets/img/popup/calendar_icon.png) no-repeat center center; + position: absolute; + top: 17px; + left: 17px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 { + top: 210px; + position: absolute; + width: 370px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .popup-sh-name-required { + color: red; + display: none; + font-style: italic; + font-size: 12px; + margin-top: 8px; +} + +.mec-add-event-popup .mec-meta-box-colors-container { + background: #fff; + padding: 17px; + border-radius: 3px; + box-shadow: 0 3px 22px rgba(11, 121, 125, 0.01); + margin-top: 15px; +} + +.mec-add-event-popup .wp-picker-container .wp-color-result.button { + border-color: #f1f2f4; + border-radius: 3px; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.04); +} + +.mec-add-event-popup .mec-recent-color-sec { + display: block !important; + font-size: 12px; + color: #707070; +} + +.mec-add-event-popup .mec-form-row.mec-available-color-row { + border: 2px dashed #dce2e3; + padding: 13px 20px !important; + background: #fcfcfc; + border-radius: 3px; +} + +.mec-add-event-popup .wp-color-result-text { + background: #f7f7f7; + border-radius: unset; + border-left: none; + color: #555; + display: block; + line-height: 2.54545455; + padding: 0 6px; + text-align: center; +} + +.mec-add-event-popup .mec-form-row.mec-available-color-row .mec-color { + width: 10px; + height: 10px; + position: absolute; + left: 11px; + z-index: 99; +} + +.mec-add-event-popup span.mec-color-meta-box-popup { + display: inline-block !important; + width: 20px; + height: 20px; + border-radius: 50px; + position: absolute; + top: 1px; + left: 6px; + z-index: 9; +} + +.mec-add-event-popup span.mec-recent-color-sec-wrap { + width: 20px; + height: 20px; + display: inline-block; + margin-right: 12px; + margin-top: 7px; + margin-left: -6px; + position: relative; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 { + background: url(../../assets/img/popup/sixth-step.png) no-repeat 95% 70%; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4 { + width: auto; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4:before { + content: ""; + width: 14px; + height: 14px; + background: url(../../assets/img/popup/calendar_icon.png) no-repeat center center; + position: absolute; + top: 17px; + left: 17px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4 input { + padding-left: 36px; + width: 148px; + padding: 22px 17px 22px 34px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date_popup, +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date_popup, +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form select { + height: 46px; + border: none; + border-radius: 3px; + padding-left: 36px; + font-size: 12px; + color: #707070; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder, +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder, +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder, +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder { + color: #b1b2b4; +} + +.mec-add-event-popup .mec-form-row .time-dv { + float: left; + margin-left: -2px; + margin-right: 4px; + margin-top: 12px; + color: #b1b2b4; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-2 { + margin-top: 60px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-2 .mec-form-row.mec-all-day-event label { + font-size: 14px; + color: #707070; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-2 .mec-form-row.mec-all-day-event { + margin-top: 13px !important; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-3, +.mec-add-event-popup .mec-steps-content.mec-steps-content-4 { + margin-top: -9px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-3 { + background: url(../../assets/img/popup/fifth-step.png) no-repeat 90% 70%; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-4 { + background: url(../../assets/img/popup/add-organizer.png) no-repeat 95% 70%; +} + +.nice-select.mec_popup_location_id.wn-mec-select-popup, +.nice-select.mec_popup_organizer_id.wn-mec-select-popup { + position: relative; + width: 200px; + padding-left: 36px; +} + +.nice-select.mec_popup_location_id.wn-mec-select-popup:before { + content: ""; + width: 14px; + height: 14px; + background: url(../../assets/img/popup/pointer.png) no-repeat center center; + position: absolute; + top: 17px; + left: 17px; +} + +.nice-select.mec_popup_organizer_id.wn-mec-select-popup:before { + content: ""; + width: 14px; + height: 14px; + background: url(../../assets/img/popup/pointer.png) no-repeat center center; + position: absolute; + top: 17px; + left: 17px; +} + +#mec_popup_event button#mec_popup_add_location:before, +#mec_popup_event button#mec_popup_add_organizer:before { + content: ""; + width: 15px; + height: 15px; + background: url(../../assets/img/popup/plus.png) no-repeat center center; + position: absolute; + top: 16px; + left: 15px; +} + +.mec-add-event-popup .mec-steps-content-container .nice-select.mec_popup_location_id.wn-mec-select-popup.open .list li, +.mec-add-event-popup .mec-steps-content-container .nice-select.mec_popup_organizer_id.wn-mec-select-popup.open .list li { + line-height: 32px !important; + min-height: 32px !important; +} + +#mec_popup_event .mec-steps-content .mec-tooltip { + bottom: 8px; +} + +#mec-location .mec-form-row span+span.mec-tooltip i, +#mec-organizer .mec-form-row span+span.mec-tooltip i { + margin-top: -18px; +} + +#mec_popup_event .mec-steps-content .mec-tooltip .dashicons-before:before { + color: #008aff; +} + +#mec_popup_event button#mec_organizer_thumbnail_button, +#mec_popup_event button#mec_popup_add_location, +#mec_popup_event button#mec_popup_add_organizer { + background: #008aff; + border-radius: 3px; + border: none; + color: #fff; + width: 146px; + height: 46px; + margin-left: 10px; + box-shadow: 0 3px 3px 0 rgba(0, 138, 255, 0.22); + font-size: 14px; + cursor: pointer; + transition: all 0.2s ease; + outline: 0; + position: relative; + padding-left: 20px; +} + +#mec_popup_event button#mec_organizer_thumbnail_button:hover, +#mec_popup_event button#mec_popup_add_location:hover, +#mec_popup_event button#mec_popup_add_organizer:hover { + background: #000; + box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.3); +} + +#mec_popup_event label[for="mec_location_dont_show_map"] { + font-size: 14px; + display: inline-block; +} + +#mec_popup_event input#mec_location_dont_show_map { + margin-top: 9px !important; +} + +#mec_popup_event .wn-mec-select-popup .current { + width: 100%; + display: inline-block; + overflow: hidden; +} + +#mec_popup_event div#mec_location_new_container, +#mec_popup_event div#mec_organizer_new_container { + border-top: 2px dashed #dce2e3; + width: 360px; + padding-top: 25px; + margin-top: 20px; +} + +#mec_popup_event div#mec_location_new_container input, +#mec_popup_event div#mec_organizer_new_container input { + width: 100%; + height: 46px; + border: none; + border-radius: 3px; + padding-left: 17px; + font-size: 12px; + color: #b1b2b4; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +#mec_popup_event div#mec_location_new_container .description, +#mec_popup_event div#mec_organizer_new_container .description { + border: none; + padding: 0; + margin: 0; + margin-left: 16px; + line-height: 19px; + font-size: 12px; + color: #707070; + font-style: normal; + margin-top: -4px; + display: block; +} + +#mec_popup_event .mec-form-row.mec-lat-lng-row input { + width: 44% !important; +} + +#mec_popup_event .mec-form-row.mec-lat-lng-row input:first-of-type { + margin-right: 10px; +} + +#mec_popup_event div#mec_organizer_new_container { + margin-top: 30px; +} + +#mec_popup_event div#mec_organizer_new_container .mec-form-row:first-of-type .mec-col-6:first-of-type { + margin-right: 14px !important; +} + +#mec_popup_event div#mec_organizer_new_container .mec-form-row:first-of-type .mec-col-6 { + width: 48%; + margin: 0; +} + +#mec_popup_event button#mec_organizer_thumbnail_button:before { + content: ""; + width: 15px; + height: 15px; + background: url(../../assets/img/popup/picture.png) no-repeat center center; + position: absolute; + top: 16px; + left: 15px; +} + +#mec_popup_event button#mec_organizer_thumbnail_button { + width: 96%; + padding-left: 30px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-4 div#mec_organizer_thumbnail_img { + position: absolute; + right: 10px; + top: -20px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-4 div#mec_organizer_thumbnail_img img { + max-width: 110px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 { + background: url(../../assets/img/popup/fourth-step.png) no-repeat 90% 70%; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input { + height: 30px; + border: none; + border-radius: 3px; + padding-left: 10px; + margin-left: 20px; + font-size: 12px; + color: #b1b2b4; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); + width: 186px; + float: right; + margin-top: -4px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-5 { + width: 326px; + margin-top: 48px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li { + display: inline-block; + background: #fff; + border: none; + cursor: pointer; + padding: 12px 18px; + border-radius: 3px; + transition: all 0.3s ease; + outline: 0; + text-align: center; + margin-right: 10px; + height: 42px; + color: #008aff; + font-size: 14px; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01); +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li.mec-categories-tab-selected, +.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li:hover { + background: #008aff; + color: #fff; + box-shadow: 0 3px 3px 0 rgba(0, 138, 255, 0.3); +} + +.mec-add-event-popup .mec-categories-tab-contents { + background: #fff; + padding: 20px; + border: 2px dashed #dce2e3; + margin-bottom: 13px; + margin-top: -5px; +} + +.mec-add-event-popup .mec-categories-tab-contents ul, +.mec-add-event-popup .mec-categories-tab-contents ul li:last-of-type { + margin: 0; +} + +.mec-add-event-popup .mec-categories-tab-contents ul li .children { + margin: 7px 0 7px 30px; +} + +.mec-add-event-popup .mec-categories-tab-contents ul li { + font-size: 14px; + color: #707070; +} + +.mec-add-event-popup .mec-categories-tab-contents.mec-form-row input[type="checkbox"] { + margin-top: 0; +} + +.mec-add-event-popup .mec-categories-tab-contents { + max-height: 200px; + overflow: hidden; + overflow-y: scroll; +} + +.mec-add-event-popup .nice-select.mec_popup_location_id .list, +.mec-add-event-popup .nice-select.mec_popup_organizer_id .list { + max-height: 240px !important; + overflow: hidden !important; + overflow-y: scroll !important; +} + +.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar, +.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar, +.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar, +#mec_popup_event div#mec_location_new_container::-webkit-scrollbar, +#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar, +#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar { + width: 5px; +} + +.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar-track, +.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar-track, +.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar-track, +#mec_popup_event div#mec_location_new_container::-webkit-scrollbar-track, +#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar-track, +#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1); +} + +.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar-thumb, +.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar-thumb, +.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar-thumb, +#mec_popup_event div#mec_location_new_container::-webkit-scrollbar-thumb, +#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar-thumb, +#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar-thumb { + background-color: #008aff; + outline: 0 solid #fff; +} + +.mec-add-event-popup span#mec_popup_new_category_button { + cursor: pointer; + position: relative; + padding-left: 18px; + font-size: 14px; +} + +.mec-add-event-popup span#mec_popup_new_category_button:before { + content: ""; + width: 15px; + height: 15px; + background: url(../../assets/img/popup/plus-blue.png) no-repeat center center; + position: absolute; + top: 3px; + left: 0; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder { + color: #b1b2b4; + font-size: 13px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder { + color: #b1b2b4; + font-size: 13px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder { + color: #b1b2b4; + font-size: 13px; +} + +.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input { + color: #3c434a; + font-size: 13px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6.mec-steps-content-active { + margin-top: -10px; + height: 70%; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-tinymce.mce-container.mce-panel { + height: 100%; + border: 1px solid #ececec !important; + box-shadow: 0 3px 22px 0 rgba(11, 121, 125, 0.01) !important; + border-radius: 3px !important; + overflow: hidden; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container-body.mce-stack-layout { + height: 100%; + background: #f5f5f5; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container * { + border: none !important; + box-shadow: none !important; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-edit-area.mce-container.mce-panel.mce-stack-layout-item { + height: 90%; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-statusbar.mce-container.mce-panel.mce-stack-layout-item.mce-last { + display: none !important; +} + +.mec-add-event-popup .mce-edit-area.mce-container.mce-panel.mce-stack-layout-item iframe { + height: 100% !important; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-7.mec-steps-content-active { + height: 70%; + background: #fff; + border: 2px dashed #dce2e3; + border-radius: 3px; + text-align: center; + vertical-align: middle; + margin-top: -10px; + position: relative; +} + +.mec-add-event-popup .mec-event-popup-featured-image-wrapper { + display: flex; + justify-content: center; + align-items: center; + height: 100%; +} + +.mec-add-event-popup button#mec_popup_upload_image_button { + background: #008aff; + color: #fff; + box-shadow: 0 3px 3px 0 rgba(0, 138, 255, 0.3); + display: inline-block; + border: none; + cursor: pointer; + padding: 12px 18px; + border-radius: 3px; + transition: all 0.3s ease; + outline: 0; + text-align: center; + height: 42px; + font-size: 14px; + margin-right: 0; +} + +.mec-add-event-popup div#mec_event_popup_featured_image_preview img { + max-height: 300px; + max-width: 740px; + margin-top: 20px; + margin-bottom: 0; +} + +.mec-add-event-popup button#mec_popup_upload_image_button:hover { + background: #000; + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.3); +} + +.mec-add-event-popup .mec-event-popup-featured-image-wrapper span i { + border-radius: 50px; + color: #bb353f; + right: 10px; + top: 10px; + font-size: 30px; + position: absolute; + cursor: pointer; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 { + height: 100%; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results .mec-steps-8-results-wrap { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + height: 100%; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-loading .mec-loader { + left: calc(50% - 2.5em); + top: calc(50% - 2.5em); +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results { + height: 100%; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view { + display: inline-block; + background: #fff; + border: none; + cursor: pointer; + padding: 12px 22px 12px 36px; + border-radius: 3px; + transition: all 0.3s ease; + outline: 0; + text-align: center; + margin-right: 10px; + height: 46px; + font-size: 14px; + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.04); + text-decoration: none; + color: #000; + position: relative; + line-height: 22px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view:hover { + background-color: #000; + color: #fff; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view:before { + content: ""; + width: 15px; + height: 15px; + background: url(../../assets/img/popup/eye.png) no-repeat center center; + position: absolute; + top: 16px; + left: 15px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new { + background: #008aff; + color: #fff; + box-shadow: 0 3px 3px 0 rgba(0, 138, 255, 0.3); + display: inline-block; + border: none; + cursor: pointer; + padding: 11px 22px 11px 36px; + border-radius: 3px; + transition: all 0.3s ease; + outline: 0; + text-align: center; + height: 46px; + font-size: 14px; + margin-right: 0; + position: relative; + line-height: 22px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new:hover { + background: #000; + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.3); +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new:before { + content: ""; + width: 15px; + height: 15px; + background: url(../../assets/img/popup/plus.png) no-repeat center center; + position: absolute; + top: 16px; + left: 15px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-popup-final-buttons { + margin-top: 22px; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results-wrap h3 { + font-size: 26px; + font-weight: 400; +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup { + width: 64px; +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list { + overflow: scroll !important; + height: 288px; + margin-top: 4px !important; + box-shadow: 0 1px 9px rgba(0, 0, 0, 0.1); + border-radius: 0; +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar-track { + background-color: #f6f6f6; +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar { + width: 3px; + background-color: #f6f6f6; +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar-thumb { + background-color: rgba(26, 175, 251, 0.16); +} + +.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup:last-child .list { + overflow: unset !important; + height: unset; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"] { + color: #3c434a !important; +} + +@media (max-width: 1280px) { + + .mec-add-event-popup .lity-container, + .mec-add-shortcode-popup .lity-container { + height: calc(100% - 110px); + margin-bottom: -80px; + } + + .mec-add-event-popup .post-type-mec-events .mec-form-row { + padding-bottom: 12px; + } + + .mec-add-event-popup .mec-steps-panel .mec-add-event-popup .mec-steps-panel, + .mec-add-shortcode-popup .mec-steps-panel .mec-add-event-popup .mec-steps-panel { + padding: 14px; + } + + .mec-add-event-popup .mec-steps-container img, + .mec-add-event-popup .mec-steps-container ul, + .mec-add-shortcode-popup .mec-steps-container img, + .mec-add-shortcode-popup .mec-steps-container ul { + margin-top: 14px; + } + + .mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:first-of-type, + .mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:first-of-type { + height: 28px; + } + + .mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li, + .mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li { + height: 46px; + } + + .mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:after, + .mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:before, + .mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:after, + .mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:before { + height: 12px; + } + + .mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 { + top: 150px; + } + + #mec_popup_event div#mec_location_new_container, + #mec_popup_event div#mec_organizer_new_container, + #mec_popup_event div#mec_sponsor_new_container { + padding-top: 12px; + margin-top: 12px; + } + + #mec_popup_event div#mec_location_new_container input, + #mec_popup_event div#mec_organizer_new_container input, + #mec_popup_event div#mec_sponsor_new_container input { + margin: 0 0 3px 0; + } +} + +@media (max-width: 960px) { + .mec-steps-content-container { + background-image: unset !important; + } + + #mec_popup_event div#mec_location_new_container, + #mec_popup_event div#mec_organizer_new_container, + #mec_popup_event div#mec_sponsor_new_container, + .mec-add-event-popup .mec-steps-content-container .mec-steps-content, + .mec-add-shortcode-popup .mec-steps-content-container .mec-steps-content { + width: 100% !important; + max-width: 100%; + position: unset !important; + margin: 0 !important; + } + + .mec-add-event-popup .lity-container, + .mec-add-shortcode-popup .lity-container, + .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"] { + width: 100%; + max-width: 100%; + } + + .mec-add-event-popup .mec-steps-panel, + .mec-add-shortcode-popup .mec-steps-panel { + overflow-x: scroll; + padding: 14px; + } + + .mec-add-event-popup .mec-steps-header, + .mec-add-shortcode-popup .mec-steps-header { + margin-bottom: 30px; + } + + .mec-add-event-popup .mec-steps-header span.mec-steps-header-add-text, + .mec-add-shortcode-popup .mec-steps-header span.mec-steps-header-add-text { + display: block; + margin-top: 10px; + width: 100%; + } + + .mec-add-event-popup .mec-col-4, + .mec-add-shortcode-popup .mec-col-4 { + width: 100% !important; + max-width: 100% !important; + } + + .mec-add-event-popup #mec_popup_event button#mec_organizer_thumbnail_button, + .mec-add-event-popup #mec_popup_event button#mec_popup_add_location, + .mec-add-event-popup #mec_popup_event button#mec_popup_add_organizer, + .mec-add-shortcode-popup #mec_popup_event button#mec_organizer_thumbnail_button, + .mec-add-shortcode-popup #mec_popup_event button#mec_popup_add_location, + .mec-add-shortcode-popup #mec_popup_event button#mec_popup_add_organizer { + margin: 10px 0 0 0; + } + + .mec-add-event-popup .mec-col-1, + .mec-add-event-popup .mec-col-10, + .mec-add-event-popup .mec-col-11, + .mec-add-event-popup .mec-col-12, + .mec-add-event-popup .mec-col-2, + .mec-add-event-popup .mec-col-3, + .mec-add-event-popup .mec-col-4, + .mec-add-event-popup .mec-col-5, + .mec-add-event-popup .mec-col-6, + .mec-add-event-popup .mec-col-7, + .mec-add-event-popup .mec-col-8, + .mec-add-event-popup .mec-col-9, + .mec-add-shortcode-popup .mec-col-1, + .mec-add-shortcode-popup .mec-col-10, + .mec-add-shortcode-popup .mec-col-11, + .mec-add-shortcode-popup .mec-col-12, + .mec-add-shortcode-popup .mec-col-2, + .mec-add-shortcode-popup .mec-col-3, + .mec-add-shortcode-popup .mec-col-4, + .mec-add-shortcode-popup .mec-col-5, + .mec-add-shortcode-popup .mec-col-6, + .mec-add-shortcode-popup .mec-col-7, + .mec-add-shortcode-popup .mec-col-8, + .mec-add-shortcode-popup .mec-col-9 { + margin: 0 0 10px 0; + } + + .mec-add-event-popup .mec-steps-content h3, + .mec-add-shortcode-popup .mec-steps-content h3 { + font-size: 18px !important; + } + + .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul, + .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles { + height: 480px; + width: 100%; + } +} + +@media (max-width: 320px) { + + .mec-add-event-popup .mec-steps-container, + .mec-add-shortcode-popup .mec-steps-container { + display: none; + } + + .mec-add-event-popup .mec-steps-panel, + .mec-add-shortcode-popup .mec-steps-panel { + width: 100% !important; + } +} + +#mec_popup_event input[type="checkbox"] { + margin-right: 9px; +} + +#mec_popup_event input#mec_location_dont_show_map { + margin-top: 0 !important; +} + +#mec_popup_settings #mec_next_previous_events_container_toggle label, +#mec_popup_settings #mec_related_events_container_toggle label { + padding: 0; +} + +#mec_popup_event input[type="checkbox"]:checked, +#mec_popup_event input[type="radio"]:checked, +#mec_popup_settings input[type="checkbox"]:checked, +#mec_popup_settings input[type="radio"]:checked, +#mec_popup_shortcode input[type="checkbox"]:checked, +#mec_popup_shortcode input[type="radio"]:checked { + background: #64e385; + border-color: #64e385; +} + +#mec_popup_event input[type="checkbox"]:checked:before, +#mec_popup_event input[type="radio"]:checked:before, +#mec_popup_settings input[type="checkbox"]:checked:before, +#mec_popup_settings input[type="radio"]:checked:before, +#mec_popup_shortcode input[type="checkbox"]:checked:before, +#mec_popup_shortcode input[type="radio"]:checked:before { + content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNC42ODgiIHZpZXdCb3g9IjAgMCAyMCAxNC42ODgiPg0KICA8ZyBpZD0idGlja18xXyIgZGF0YS1uYW1lPSJ0aWNrICgxKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk4KSI+DQogICAgPGcgaWQ9Ikdyb3VwXzEiIGRhdGEtbmFtZT0iR3JvdXAgMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA2Ny45OTcpIj4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMTkuNzA3LDY4LjI5YTEsMSwwLDAsMC0xLjQxNCwwTDYuMzEyLDgwLjI3MSwxLjcwNyw3NS42NjZBMSwxLDAsMCwwLC4yOTIsNzcuMDhMNS42LDgyLjM5MmExLDEsMCwwLDAsMS40MTQsMEwxOS43MDcsNjkuN0ExLDEsMCwwLDAsMTkuNzA3LDY4LjI5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk3KSIgZmlsbD0iI2ZmZiIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+DQo="); + line-height: 16px; + width: 15px; + float: none; + margin: 2px; + display: block; +} + +#mec_popup_shortcode .mec-steps-content.mec-steps-content-4 label input[type="radio"]:before { + background: unset; + margin: -2px 0 0 0; +} + +.mec-add-event-popup .mec-steps-content.mec-steps-content-5 { + width: 366px; + margin-top: 48px; +} + +#mec_popup_event div#mec_location_new_container, +#mec_popup_event div#mec_organizer_new_container, +#mec_popup_event div#mec_sponsor_new_container { + border-top: 2px dashed #dce2e3; + width: 375px; + padding-top: 25px; + margin-top: 0; + overflow-y: scroll; + overflow-x: hidden; + max-height: 240px; +} + +#mec_popup_event div#mec_location_new_container .mec-form-row, +#mec_popup_event div#mec_organizer_new_container .mec-form-row, +#mec_popup_event div#mec_sponsor_new_container .mec-form-row { + padding-bottom: 20px; +} + +#mec_popup_event div#mec_location_new_container .description, +#mec_popup_event div#mec_organizer_new_container .description, +#mec_popup_event div#mec_sponsor_new_container .description { + margin: 9px 0; +} + +#mec_popup_event div#mec_location_new_container .mec-form-row.mec-thumbnail-row, +#mec_popup_event div#mec_organizer_new_container .mec-form-row.mec-thumbnail-row, +#mec_popup_event div#mec_sponsor_new_container .mec-form-row.mec-thumbnail-row { + padding: 0; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher div:last-of-type label { + position: absolute; + top: -12px; + max-width: 52px; + width: 100%; + height: 30px; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input+label { + background: #e5e9ee; + box-shadow: unset; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input+label:after { + margin-left: 0; + margin-top: -1px; + border-color: #e5e9ee; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input[value="1"]:checked+label, +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input[value="1"]:checked+label:before { + box-shadow: 2px 2px 12px -2px #4fdc73 inset; + position: relative; + background: #64e385; + border-color: #64e385; +} + +.lity.mec-add-event-popup .lity-content, +.lity.mec-settings .lity-content { + box-shadow: 0 3px 20px 0 rgb(91 188 190 / 55%); + border-radius: 10px; + height: 100%; + overflow: hidden; +} + +.mec-settings .lity-container { + width: 930px; + height: 620px; + max-width: unset; +} + +#mec_popup_settings #mec_next_previous_events_container_toggle label:first-child, +#mec_popup_settings #mec_related_events_container_toggle label:first-child { + display: block; + margin: 0 0 20px 0; +} + +#mec_popup_event .mec-categories-tab-contents, +#mec_popup_settings #mec_settings_weekdays .mec-box, +#mec_popup_settings #mec_settings_weekends .mec-box { + background: rgb(220 226 227 / 0.3); +} + +#mec_popup_settings .mec-switcher input+label { + max-width: 62px !important; + width: 100%; + height: 33px; +} + +#mec_popup_settings .mec-image-select-wrap li input:checked+span:after { + padding: 5px; +} + +.ac-mec-events.ac-search-enabled .tablenav .ac-search> :not(#ac-s).lity-hide { + display: none; +} + +.tablenav .actions .input-field { + float: left; + margin-right: 6px; +} + +.tablenav .actions .input-field .select2-selection { + height: 30px; +} + +.mec-go-pro-content-title { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; +} + +.mec-go-pro-features-wrap p { + font-size: 14px; +} + +.mec-go-pro-features-wrap .mec-addons-notification-box-content { + width: calc(100% - 590px); + display: inline-block; + padding-left: 20px; +} + +.mec-go-pro-features-wrap ul { + float: left; + width: 50%; + margin: 0 0 12px; +} + +.mec-go-pro-features-wrap ul li { + margin-bottom: 1px; + font-size: 13px; + color: #717479; + padding-left: 18px; + position: relative; +} + +.mec-go-pro-features-wrap ul li:before { + position: absolute; + left: -1px; + top: 6px; + color: #36da74; + font-size: 13px; + font-weight: 700; + vertical-align: middle; + font-family: simple-line-icons; + border-radius: 50%; + padding: 0; + width: 13px; + height: 13px; + line-height: 13px; + z-index: 3; + background: rgba(64, 241, 147, 0.12); + content: "\e080"; +} + +/* +.post-type-mec-books.taxonomy-mec_coupon .metabox-prefs .screen-options label, +.post-type-mec-events.taxonomy-mec_category .metabox-prefs .screen-options label, +.post-type-mec-events.taxonomy-mec_label .metabox-prefs .screen-options label, +.post-type-mec-events.taxonomy-post_tag .metabox-prefs .screen-options label, +.taxonomy-mec_location .metabox-prefs .screen-options label, +.taxonomy-mec_organizer .metabox-prefs .screen-options label, +.taxonomy-mec_speaker .metabox-prefs .screen-options label, +.taxonomy-mec_sponsor .metabox-prefs .screen-options label { + margin-top: -15px; +} + +.post-type-mec-books.taxonomy-mec_coupon #mec_thumbnail_img img, +.post-type-mec-events.taxonomy-mec_category #mec_thumbnail_img img, +.post-type-mec-events.taxonomy-mec_label #mec_thumbnail_img img, +.post-type-mec-events.taxonomy-post_tag #mec_thumbnail_img img, +.taxonomy-mec_location #mec_thumbnail_img img, +.taxonomy-mec_organizer #mec_thumbnail_img img, +.taxonomy-mec_speaker #mec_thumbnail_img img, +.taxonomy-mec_sponsor #mec_thumbnail_img img { + margin: 0 0 20px 0; + border: solid 1px #ddd; + border-radius: 2px; +} + +.post-type-mec-books.taxonomy-mec_coupon .form-wrap label, +.post-type-mec-events.taxonomy-mec_category .form-wrap label, +.post-type-mec-events.taxonomy-mec_label .form-wrap label, +.post-type-mec-events.taxonomy-post_tag .form-wrap label, +.taxonomy-mec_location .form-wrap label, +.taxonomy-mec_organizer .form-wrap label, +.taxonomy-mec_speaker .form-wrap label, +.taxonomy-mec_sponsor .form-wrap label { + padding: 0; + margin: 10px 0; +} + +.post-type-mec-books.taxonomy-mec_coupon input[type='number'], +.post-type-mec-books.taxonomy-mec_coupon input[type='search'], +.post-type-mec-books.taxonomy-mec_coupon input[type='text'], +.post-type-mec-books.taxonomy-mec_coupon input[type='url'], +.post-type-mec-books.taxonomy-mec_coupon select, +.post-type-mec-books.taxonomy-mec_coupon textarea, +.post-type-mec-events.taxonomy-mec_category input[type='number'], +.post-type-mec-events.taxonomy-mec_category input[type='search'], +.post-type-mec-events.taxonomy-mec_category input[type='text'], +.post-type-mec-events.taxonomy-mec_category input[type='url'], +.post-type-mec-events.taxonomy-mec_category select, +.post-type-mec-events.taxonomy-mec_category textarea, +.post-type-mec-events.taxonomy-mec_label input[type='number'], +.post-type-mec-events.taxonomy-mec_label input[type='search'], +.post-type-mec-events.taxonomy-mec_label input[type='text'], +.post-type-mec-events.taxonomy-mec_label input[type='url'], +.post-type-mec-events.taxonomy-mec_label select, +.post-type-mec-events.taxonomy-mec_label textarea, +.post-type-mec-events.taxonomy-post_tag input[type='number'], +.post-type-mec-events.taxonomy-post_tag input[type='search'], +.post-type-mec-events.taxonomy-post_tag input[type='text'], +.post-type-mec-events.taxonomy-post_tag input[type='url'], +.post-type-mec-events.taxonomy-post_tag select, +.post-type-mec-events.taxonomy-post_tag textarea, +.taxonomy-mec_location input[type='number'], +.taxonomy-mec_location input[type='search'], +.taxonomy-mec_location input[type='text'], +.taxonomy-mec_location input[type='url'], +.taxonomy-mec_location select, +.taxonomy-mec_location textarea, +.taxonomy-mec_organizer input[type='number'], +.taxonomy-mec_organizer input[type='search'], +.taxonomy-mec_organizer input[type='text'], +.taxonomy-mec_organizer input[type='url'], +.taxonomy-mec_organizer select, +.taxonomy-mec_organizer textarea, +.taxonomy-mec_speaker input[type='number'], +.taxonomy-mec_speaker input[type='search'], +.taxonomy-mec_speaker input[type='text'], +.taxonomy-mec_speaker input[type='url'], +.taxonomy-mec_speaker select, +.taxonomy-mec_speaker textarea, +.taxonomy-mec_sponsor input[type='number'], +.taxonomy-mec_sponsor input[type='search'], +.taxonomy-mec_sponsor input[type='text'], +.taxonomy-mec_sponsor input[type='url'], +.taxonomy-mec_sponsor select, +.taxonomy-mec_sponsor textarea { + border-radius: 5px; + min-height: 38px; + border: none; + background-color: #fff; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +.post-type-mec-books.taxonomy-mec_coupon select, +.post-type-mec-events.taxonomy-mec_category select, +.post-type-mec-events.taxonomy-mec_label select, +.post-type-mec-events.taxonomy-post_tag select, +.taxonomy-mec_location select, +.taxonomy-mec_organizer select, +.taxonomy-mec_speaker select, +.taxonomy-mec_sponsor select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + cursor: pointer; + min-height: 39px; + line-height: 39px; + background-color: #fff; + border-radius: 2px; + padding-left: 8px; + box-shadow: 0 1px 3px rgb(0 0 0 / 2%); + transition: all 0.23s ease; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE3IDE3Ij4KPGc+CjwvZz4KCTxwYXRoIGQ9Ik0xNi4zNTQgNS4wNzVsLTcuODU1IDcuODU0LTcuODUzLTcuODU0IDAuNzA3LTAuNzA3IDcuMTQ1IDcuMTQ2IDcuMTQ4LTcuMTQ3IDAuNzA4IDAuNzA4eiIgZmlsbD0iIzAwMDAwMCIgLz4KPC9zdmc+Cg==); + background-repeat: no-repeat; + background-size: 26px 10px; + background-position: right center; + min-width: 160px; + border: 1px solid #e6e9eb; +} + +.post-type-mec-books.taxonomy-mec_coupon table.fixed, +.post-type-mec-events.taxonomy-mec_category table.fixed, +.post-type-mec-events.taxonomy-mec_label table.fixed, +.post-type-mec-events.taxonomy-post_tag table.fixed, +.taxonomy-mec_location table.fixed, +.taxonomy-mec_organizer table.fixed, +.taxonomy-mec_speaker table.fixed, +.taxonomy-mec_sponsor table.fixed { + margin-top: 21px; +} + +.taxonomy-mec_category .wp-color-result-text { + all: unset; + color: #fff; + font-weight: 500; + line-height: 1.4; +} + +.taxonomy-mec_category .wp-picker-input-wrap label { + margin-top: 0 !important; +} + +.post-type-mec-books.taxonomy-mec_coupon textarea, +.post-type-mec-events.taxonomy-mec_category textarea, +.post-type-mec-events.taxonomy-mec_label textarea, +.post-type-mec-events.taxonomy-post_tag textarea, +.taxonomy-mec_location textarea, +.taxonomy-mec_organizer textarea, +.taxonomy-mec_speaker textarea, +.taxonomy-mec_sponsor textarea { + min-height: 86px; +} + +.post-type-mec-books.taxonomy-mec_coupon .button, +.post-type-mec-books.taxonomy-mec_coupon .button-secondary, +.post-type-mec-events.taxonomy-mec_category .button, +.post-type-mec-events.taxonomy-mec_category .button-secondary, +.post-type-mec-events.taxonomy-mec_label .button, +.post-type-mec-events.taxonomy-mec_label .button-secondary, +.post-type-mec-events.taxonomy-post_tag .button, +.post-type-mec-events.taxonomy-post_tag .button-secondary, +.taxonomy-mec_location .button, +.taxonomy-mec_location .button-secondary, +.taxonomy-mec_organizer .button, +.taxonomy-mec_organizer .button-secondary, +.taxonomy-mec_speaker .button, +.taxonomy-mec_sponsor .button, +.taxonomy-mec_sponsor .button-secondary { + color: #fff; + font-weight: 500; + border-radius: 60px; + box-shadow: 0 0 0 4px rgb(56 213 237 / 1%); + text-shadow: none; + background: #38d5ed; + border: none; + transition: 0.24s; + line-height: 1.4; + padding: 9px 36px 12px; +} + +.post-type-mec-books.taxonomy-mec_coupon .mec_upload_image_button, +.post-type-mec-events.taxonomy-mec_category .mec_upload_image_button, +.post-type-mec-events.taxonomy-mec_label .mec_upload_image_button, +.post-type-mec-events.taxonomy-post_tag .mec_upload_image_button, +.taxonomy-mec_location .mec_upload_image_button, +.taxonomy-mec_organizer .mec_upload_image_button, +.taxonomy-mec_speaker .mec_upload_image_button, +.taxonomy-mec_sponsor .mec_upload_image_button { + margin-bottom: 20px; +} + +.post-type-mec-books.taxonomy-mec_coupon .button-secondary:focus, +.post-type-mec-books.taxonomy-mec_coupon .button-secondary:hover, +.post-type-mec-books.taxonomy-mec_coupon .button.focus, +.post-type-mec-books.taxonomy-mec_coupon .button:focus, +.post-type-mec-books.taxonomy-mec_coupon .button:hover, +.post-type-mec-events.taxonomy-mec_category .button-secondary:focus, +.post-type-mec-events.taxonomy-mec_category .button-secondary:hover, +.post-type-mec-events.taxonomy-mec_category .button.focus, +.post-type-mec-events.taxonomy-mec_category .button:focus, +.post-type-mec-events.taxonomy-mec_category .button:hover, +.post-type-mec-events.taxonomy-mec_label .button-secondary:focus, +.post-type-mec-events.taxonomy-mec_label .button-secondary:hover, +.post-type-mec-events.taxonomy-mec_label .button.focus, +.post-type-mec-events.taxonomy-mec_label .button:focus, +.post-type-mec-events.taxonomy-mec_label .button:hover, +.post-type-mec-events.taxonomy-post_tag .button-secondary:focus, +.post-type-mec-events.taxonomy-post_tag .button-secondary:hover, +.post-type-mec-events.taxonomy-post_tag .button.focus, +.post-type-mec-events.taxonomy-post_tag .button:focus, +.post-type-mec-events.taxonomy-post_tag .button:hover, +.taxonomy-mec_location .button-secondary:focus, +.taxonomy-mec_location .button-secondary:hover, +.taxonomy-mec_location .button.focus, +.taxonomy-mec_location .button:focus, +.taxonomy-mec_location .button:hover, +.taxonomy-mec_organizer .button-secondary:focus, +.taxonomy-mec_organizer .button-secondary:hover, +.taxonomy-mec_organizer .button.focus, +.taxonomy-mec_organizer .button:focus, +.taxonomy-mec_organizer .button:hover, +.taxonomy-mec_speaker .button-secondary:focus, +.taxonomy-mec_speaker .button-secondary:hover, +.taxonomy-mec_speaker .button.focus, +.taxonomy-mec_speaker .button:focus, +.taxonomy-mec_speaker .button:hover, +.taxonomy-mec_sponsor .button-secondary:focus, +.taxonomy-mec_sponsor .button-secondary:hover, +.taxonomy-mec_sponsor .button.focus, +.taxonomy-mec_sponsor .button:focus, +.taxonomy-mec_sponsor .button:hover { + background: #26bbd2; + box-shadow: 0 0 0 4px rgb(56 213 237 / 15%); + cursor: pointer; + color: #fff; +} */ + +.post-type-mec-events #TB_window { + height: 470px !important; + top: calc(50% - 235px) !important; +} + +.post-type-mec-events #TB_ajaxContent { + width: calc(100% - 30px) !important; +} + +.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container .fserv-form-description { + position: relative !important; +} + +.taxonomy-mec_category #TB_window { + overflow: hidden; +} + +@media (max-width: 480px) { + + .m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container .fserv-form-description, + .m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container form { + padding-left: 90px !important; + } + + .m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container form .fserv-field { + width: 40% !important; + } + + .m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container:before { + top: 100px; + left: 10px; + } +} + +.post-type-mec-events.taxonomy-mec_label .button.wp-color-result { + background: 0 0; + text-align: right; + padding: 0 0 0 32px; + border-radius: 4px; + box-shadow: unset; + border: 1px solid #ddd; +} + +.post-type-mec-events.taxonomy-mec_label .button.wp-color-result .wp-color-result-text { + height: 30px; +} + +.post-type-mec-events.taxonomy-mec_label .wp-picker-container input[type="text"].wp-color-picker { + width: 70px; + margin-top: -10px; + height: 32px; +} + +.post-type-mec-events.taxonomy-mec_label .wp-picker-default { + height: 32px; + padding-top: 2px; + padding-bottom: 2px; +} + +.post-type-mec-events.taxonomy-mec_label .wp-picker-container .iris-picker { + margin-top: -10px; +} + +.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper .nav-tab, +.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper { + background: #1f1f1f; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .mec-container { + border-color: #353535; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active { + background: #404040 !important; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab:not(.nav-tab-active):after { + background: #4f4f4f; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active:after { + border-color: #404040 transparent transparent; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active:before { + border-color: #404040 transparent transparent; +} + +.mec-admin-dark-mode #mec_bfixed_form_fields li, +.mec-admin-dark-mode #mec_calendar_filter, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-wrap, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-wrap, +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left, +.mec-admin-dark-mode #mec_metabox_booking, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-wrap, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-wrap, +.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left, +.mec-admin-dark-mode #mec_metabox_details, +.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left, +.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-wrap, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap .select2-container, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tab-content .select2-container, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left, +.mec-admin-dark-mode #webnus-dashboard .mec-pro-notice .info-msg, +.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd), +.mec-admin-dark-mode .w-box, +.mec-admin-dark-mode .w-box-content pre, +.mec-admin-dark-mode .w-clearfix.w-box.mec-addons-notification-box-wrap span, +.mec-admin-dark-mode .w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span, +.mec-admin-dark-mode .w-clearfix.w-box.mec-cmsg-notification-box-wrap span, +.mec-admin-dark-mode .wns-be-main, +.mec-admin-dark-mode .wns-be-main .mec-container, +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix .mec-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-content, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-editor-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-pro-notice .info-msg, +.mec-admin-dark-mode.post-type-mec-books #major-publishing-actions, +.mec-admin-dark-mode.post-type-mec-books #screen-meta, +.mec-admin-dark-mode.post-type-mec-books #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec-books .postbox, +.mec-admin-dark-mode.post-type-mec-events #major-publishing-actions, +.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields li, +.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields li, +.mec-admin-dark-mode.post-type-mec-events #post-status-info, +.mec-admin-dark-mode.post-type-mec-events #screen-meta, +.mec-admin-dark-mode.post-type-mec-events #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec-events .categorydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .components-popover__content, +.mec-admin-dark-mode.post-type-mec-events .customlinkdiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .postbox, +.mec-admin-dark-mode.post-type-mec-events .posttypediv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .taxonomydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec-events .wp-tab-active, +.mec-admin-dark-mode.post-type-mec-events .wp-tab-panel, +.mec-admin-dark-mode.post-type-mec-events div.mce-panel, +.mec-admin-dark-mode.post-type-mec-events div.mce-toolbar-grp, +.mec-admin-dark-mode.post-type-mec-events ul.add-menu-item-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec-events ul.category-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec_calendars #major-publishing-actions, +.mec-admin-dark-mode.post-type-mec_calendars #post-status-info, +.mec-admin-dark-mode.post-type-mec_calendars #screen-meta, +.mec-admin-dark-mode.post-type-mec_calendars #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec_calendars .categorydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .customlinkdiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .postbox, +.mec-admin-dark-mode.post-type-mec_calendars .posttypediv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .taxonomydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-active, +.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-panel, +.mec-admin-dark-mode.post-type-mec_calendars div.mce-panel, +.mec-admin-dark-mode.post-type-mec_calendars div.mce-toolbar-grp, +.mec-admin-dark-mode.post-type-mec_calendars ul.add-menu-item-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec_calendars ul.category-tabs li.tabs { + background: #1f1f1f; + color: #fff; +} + + +.mec-admin-dark-mode .mec-form-row .mec-box, +.mec-admin-dark-mode .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode .mec-form-row ul.mec-message-categories li ul, +.mec-admin-dark-mode .mec-meta-box-fields .mec-box, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-faq-accordion-trigger a { + background: #333; + border-color: #353535; + box-shadow: 0 1px 6px -2px #000; +} + +.mec-admin-dark-mode .wns-be-container .dpr-btn.dpr-save-btn, +.mec-admin-dark-mode #wpwrap .mec-button-primary { + box-shadow: none; + background: #5e7a65; +} + +.mec-admin-dark-mode .wns-be-container .dpr-btn.dpr-save-btn:hover, +.mec-admin-dark-mode #wpwrap .mec-button-primary:hover { + box-shadow: none; + background: #559164; + border-color: none; +} + +.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper .nav-tab { + border-radius: 7px; +} + +.mec-admin-dark-mode #mec_bfixed_form_fields, +.mec-admin-dark-mode #mec_bfixed_form_fields #mec_bfixed_form_fields li, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left a, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left a, +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left a, +.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left a, +.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left a, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix .mec-form-row.mec-syn-schedule, +.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields, +.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields, +.mec-admin-dark-mode.post-type-mec-events .select2-search--dropdown, +.mec-admin-dark-mode.post-type-mec_calendars .select2-search--dropdown { + background: #282828; + border-color: #353535; +} + +.mec-admin-dark-mode .select2-container--default .select2-selection--multiple .select2-selection__choice { + color: #000; +} + +.mec-admin-dark-mode.post-type-mec-books ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.post-type-mec-books ul#adminmenu>li.current>a.current:after, +.mec-admin-dark-mode.post-type-mec-events ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.post-type-mec-events ul#adminmenu>li.current>a.current:after, +.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu>li.current>a.current:after, +.mec-admin-dark-mode.toplevel_page_mec-intro ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.toplevel_page_mec-intro ul#adminmenu>li.current>a.current:after { + border-right-color: #23282d; +} + +.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a.mec-tab-active, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left a.mec-tab-active, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-dropdown, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_gateways_form li .mec-gateway-options-form, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #payment_gateways_option li .mec-gateway-options-form, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple, +.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list { + background: #000; + box-shadow: 0 2px 12px -5px #000; +} + +.mec-admin-dark-mode .extra .w-box-head, +.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child, +.mec-admin-dark-mode .mec-form-row ul.mec-message-categories, +.mec-admin-dark-mode .mec-message-categories li.mec-acc-label, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mce-btn-group:not(:first-child), +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-search--dropdown .select2-search__field, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-dropdown, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .wp-editor-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-occurrences .mec-occurrences-list li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields li, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .html-active .switch-html, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-set-box.extra, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple .select2-selection__choice, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .tmce-active .switch-tmce, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-content, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-footer, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar:before, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-core-ui .quicktags-toolbar input.button.button-small, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-editor-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec-books #screen-meta, +.mec-admin-dark-mode.post-type-mec-books #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec-books .postbox, +.mec-admin-dark-mode.post-type-mec-books .postbox .hndle, +.mec-admin-dark-mode.post-type-mec-books .postbox hr, +.mec-admin-dark-mode.post-type-mec-books .wp-heading-inline+.page-title-action, +.mec-admin-dark-mode.post-type-mec-events #major-publishing-actions, +.mec-admin-dark-mode.post-type-mec-events #post-status-info, +.mec-admin-dark-mode.post-type-mec-events #screen-meta, +.mec-admin-dark-mode.post-type-mec-events #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec-events .categorydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .components-popover__content, +.mec-admin-dark-mode.post-type-mec-events .customlinkdiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff .stuffbox>h3, +.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff h2.hndle, +.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff h3.hndle, +.mec-admin-dark-mode.post-type-mec-events .postbox, +.mec-admin-dark-mode.post-type-mec-events .postbox h2, +.mec-admin-dark-mode.post-type-mec-events .posttypediv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .taxonomydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec-events .wp-editor-container, +.mec-admin-dark-mode.post-type-mec-events .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec-events .wp-tab-active, +.mec-admin-dark-mode.post-type-mec-events .wp-tab-panel, +.mec-admin-dark-mode.post-type-mec-events div.mce-panel, +.mec-admin-dark-mode.post-type-mec-events div.mce-toolbar-grp, +.mec-admin-dark-mode.post-type-mec-events ul.add-menu-item-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec-events ul.category-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec_calendars #major-publishing-actions, +.mec-admin-dark-mode.post-type-mec_calendars #post-status-info, +.mec-admin-dark-mode.post-type-mec_calendars #screen-meta, +.mec-admin-dark-mode.post-type-mec_calendars #screen-meta-links .show-settings, +.mec-admin-dark-mode.post-type-mec_calendars .categorydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .customlinkdiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list, +.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option, +.mec-admin-dark-mode.post-type-mec_calendars .mec-sed-methods li, +.mec-admin-dark-mode.post-type-mec_calendars .postbox, +.mec-admin-dark-mode.post-type-mec_calendars .postbox h2, +.mec-admin-dark-mode.post-type-mec_calendars .posttypediv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .taxonomydiv div.tabs-panel, +.mec-admin-dark-mode.post-type-mec_calendars .wp-editor-container, +.mec-admin-dark-mode.post-type-mec_calendars .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-active, +.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-panel, +.mec-admin-dark-mode.post-type-mec_calendars div.mce-panel, +.mec-admin-dark-mode.post-type-mec_calendars div.mce-toolbar-grp, +.mec-admin-dark-mode.post-type-mec_calendars ul.add-menu-item-tabs li.tabs, +.mec-admin-dark-mode.post-type-mec_calendars ul.category-tabs li.tabs, +.mec-admin-dark-mode .mec-cmsg-2-notification-box-wrap, +.mec-admin-dark-mode .mec-cmsg-notification-box-wrap, +.mec-admin-dark-mode .w-box { + border-color: #353535; +} + +.mec-admin-dark-mode .notice.notice-warning.is-dismissible { + color: #353535; +} + +.mec-admin-dark-mode #mec_bfixed_form_fields input[type="checkbox"], +.mec-admin-dark-mode #mec_calendar_filter .mec-calendar-metabox .wn-mec-select, +.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type="number"], +.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type="text"], +.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type="url"], +.mec-admin-dark-mode #mec_calendar_filter .mec-form-row select, +.mec-admin-dark-mode #mec_calendar_filter .mec-form-row textarea, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-wrap .select2-container, +.mec-admin-dark-mode #mec_metabox_booking .mec-calendar-metabox .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode #mec_metabox_booking .mec-calendar-metabox .wn-mec-select, +.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tab-content .select2-container, +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type="number"], +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type="text"], +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type="url"], +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row select, +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row textarea, +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row.mec-skin-list-date-format-container input[type="text"], +.mec-admin-dark-mode #mec_metabox_booking .mec-meta-box-fields .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap .select2-container, +.mec-admin-dark-mode #mec_metabox_details .mec-calendar-metabox .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode #mec_metabox_details .mec-calendar-metabox .wn-mec-select, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tab-content .select2-container, +.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type="number"], +.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type="text"], +.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type="url"], +.mec-admin-dark-mode #mec_metabox_details .mec-form-row select, +.mec-admin-dark-mode #mec_metabox_details .mec-form-row textarea, +.mec-admin-dark-mode #mec_metabox_details .mec-form-row.mec-skin-list-date-format-container input[type="text"], +.mec-admin-dark-mode #mec_metabox_details .mec-meta-box-fields .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode #mec_reg_form_fields input[type="checkbox"], +.mec-admin-dark-mode .mec-addon-box-version, +.mec-admin-dark-mode .mec-calendar-metabox .wn-mec-select, +.mec-admin-dark-mode .mec-form-row input[type="checkbox"], +.mec-admin-dark-mode .mec-form-row input[type="number"], +.mec-admin-dark-mode .mec-form-row input[type="radio"], +.mec-admin-dark-mode .mec-form-row input[type="text"], +.mec-admin-dark-mode .mec-form-row input[type="url"], +.mec-admin-dark-mode .mec-form-row select, +.mec-admin-dark-mode .mec-form-row textarea, +.mec-admin-dark-mode .mec-form-row.mec-skin-list-date-format-container input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons, +.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .html-active .switch-html, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-select-event-wrap .select2-container--default .select2-selection--single, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-sendmail-form-wrap, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-sendmail-wrap, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-send-email-form-wrap input.widefat, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-results__option--highlighted[aria-selected], +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-search--dropdown .select2-search__field, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .tmce-active .switch-tmce, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .wp-switch-editor, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report div.mce-toolbar-grp, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-invoice-custom-css, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields input[type="number"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields select, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields textarea, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields input[type="number"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields select, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields textarea, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields input[type="number"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields select, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields textarea, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #titlediv #title, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-add-event-tabs-wrap .select2-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-add-event-tabs-wrap .select2-container span, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-create-shortcode-tab-content .select2-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-create-shortcode-tab-content .select2-container span, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .quicktags-toolbar, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default.select2-container--focus .select2-selection--multiple, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-dropdown, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-results__option[aria-selected], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="email"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="number"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="password"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="search"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type="url"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row select, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-core-ui .quicktags-toolbar input.button.button-small, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="checkbox"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="color"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="date"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="datetime-local"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="datetime"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="email"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="month"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="number"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="password"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="radio"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="search"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="tel"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="text"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="time"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="url"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type="week"], +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings select, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings textarea, +.mec-admin-dark-mode.post-type-mec-books .wn-mec-select, +.mec-admin-dark-mode.post-type-mec-books input[type="checkbox"], +.mec-admin-dark-mode.post-type-mec-books input[type="email"], +.mec-admin-dark-mode.post-type-mec-books input[type="number"], +.mec-admin-dark-mode.post-type-mec-books input[type="text"], +.mec-admin-dark-mode.post-type-mec-books input[type="url"], +.mec-admin-dark-mode.post-type-mec-books select, +.mec-admin-dark-mode.post-type-mec-books textarea, +.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields button, +.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_field_types button, +.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields button, +.mec-admin-dark-mode.post-type-mec-events #titlediv #title, +.mec-admin-dark-mode.post-type-mec-events .components-form-token-field__input-container, +.mec-admin-dark-mode.post-type-mec-events .components-panel__body, +.mec-admin-dark-mode.post-type-mec-events .mec-add-event-tabs-wrap .select2-container span, +.mec-admin-dark-mode.post-type-mec-events .mec-certain-day>div, +.mec-admin-dark-mode.post-type-mec-events .mec-create-shortcode-tab-content .select2-container span, +.mec-admin-dark-mode.post-type-mec-events .mec-xi-facebook-import-events .mec-select-deselect-actions li, +.mec-admin-dark-mode.post-type-mec-events .mec-xi-google-import-events .mec-select-deselect-actions li, +.mec-admin-dark-mode.post-type-mec-events .select2-dropdown, +.mec-admin-dark-mode.post-type-mec-events .select2-results__option[aria-selected], +.mec-admin-dark-mode.post-type-mec-events .wp-admin p label input[type="checkbox"], +.mec-admin-dark-mode.post-type-mec-events input[type="checkbox"], +.mec-admin-dark-mode.post-type-mec-events input[type="color"], +.mec-admin-dark-mode.post-type-mec-events input[type="date"], +.mec-admin-dark-mode.post-type-mec-events input[type="datetime-local"], +.mec-admin-dark-mode.post-type-mec-events input[type="datetime"], +.mec-admin-dark-mode.post-type-mec-events input[type="email"], +.mec-admin-dark-mode.post-type-mec-events input[type="month"], +.mec-admin-dark-mode.post-type-mec-events input[type="number"], +.mec-admin-dark-mode.post-type-mec-events input[type="password"], +.mec-admin-dark-mode.post-type-mec-events input[type="radio"], +.mec-admin-dark-mode.post-type-mec-events input[type="search"], +.mec-admin-dark-mode.post-type-mec-events input[type="tel"], +.mec-admin-dark-mode.post-type-mec-events input[type="text"], +.mec-admin-dark-mode.post-type-mec-events input[type="time"], +.mec-admin-dark-mode.post-type-mec-events input[type="url"], +.mec-admin-dark-mode.post-type-mec-events input[type="week"], +.mec-admin-dark-mode.post-type-mec-events select, +.mec-admin-dark-mode.post-type-mec-events textarea, +.mec-admin-dark-mode.post-type-mec_calendars #titlediv #title, +.mec-admin-dark-mode.post-type-mec_calendars .mec-add-event-tabs-wrap .select2-container, +.mec-admin-dark-mode.post-type-mec_calendars .mec-add-event-tabs-wrap .select2-container span, +.mec-admin-dark-mode.post-type-mec_calendars .mec-create-shortcode-tab-content .select2-container, +.mec-admin-dark-mode.post-type-mec_calendars .mec-create-shortcode-tab-content .select2-container span, +.mec-admin-dark-mode.post-type-mec_calendars .select2-container--default .select2-selection--multiple .select2-selection__choice, +.mec-admin-dark-mode.post-type-mec_calendars .select2-dropdown, +.mec-admin-dark-mode.post-type-mec_calendars .select2-results__option[aria-selected], +.mec-admin-dark-mode.post-type-mec_calendars input[type="checkbox"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="color"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="date"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="datetime-local"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="datetime"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="email"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="month"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="number"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="password"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="radio"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="search"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="tel"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="text"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="time"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="url"], +.mec-admin-dark-mode.post-type-mec_calendars input[type="week"], +.mec-admin-dark-mode.post-type-mec_calendars select, +.mec-admin-dark-mode.post-type-mec_calendars textarea, +.mec-admin-dark-mode.toplevel_page_mec-intro .w-box.mec-activation input[name="MECPurchaseCode"], +.mec-admin-dark-mode.toplevel_page_mec-intro .w-box.mec-activation input[type="radio"]+label span, +.mec-select-deselect-actions li, +.mec-admin-dark-mode .mec-backend-tab { + background: #1d1d1d; + border-color: #353535; + color: #d2d2d2; +} + +.mec-admin-dark-mode .mec-b-active-tab { + background: #505050; + color: #dbdbdb; +} + +.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type="checkbox"]:checked, +.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type="checkbox"]:checked, +.mec-admin-dark-mode .mec-custom-nice-select ul.list li .wn-mec-text:after, +.mec-admin-dark-mode .mec-sed-methods li:before { + box-shadow: 0 1px 6px -2px #000; + border-color: #353535; + background: #222; +} + +.mec-admin-dark-mode .mec-sed-methods li.active, +.mec-admin-dark-mode .mec-switcher input+label, +.mec-admin-dark-mode .mec-switcher input+label:before, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-results__option { + background-color: #000; +} + +.mec-admin-dark-mode .wn-mec-select .option.focus .wn-img-sh img, +.mec-admin-dark-mode .wn-mec-select .option.selected.focus .wn-img-sh img, +.mec-admin-dark-mode .wn-mec-select .option:hover .wn-img-sh img { + background: 0 0; +} + +.mec-admin-dark-mode .ui-datepicker { + background-color: #000; + border: 1px solid #000; + box-shadow: 0 0 8px rgba(33, 33, 33, 0.6); +} + +.mec-admin-dark-mode .ui-datepicker.ui-widget td a, +.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article .mec-detail-button, +.mec-admin-dark-mode.post-type-mec-events, +.mec-admin-dark-mode.post-type-mec-events .postbox h2, +.mec-admin-dark-mode.post-type-mec_calendars .postbox h2 { + color: #d2d2d2; + background: #282828; +} + +.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul * { + background: #282828; +} + +.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul>ul>li, +.mec-admin-dark-mode #mec_styles_form #mec_styles_CSS, +.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix, +.mec-admin-dark-mode .mec-message-categories li.mec-acc-label, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields { + background: #000; +} + +.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul>ul>li:hover, +.mec-admin-dark-mode .mec-active, +.mec-admin-dark-mode.post-type-mec-events .select2-container--default .select2-results__option--highlighted[aria-selected] { + background: #888 !important; +} + +.mec-admin-dark-mode.post-type-mec_calendars .mec-calendar-metabox .wn-mec-select .list { + border-radius: 0 0 2px 2px; + box-shadow: 0 0 0 1px #353535, 0 2px 6px rgba(0, 0, 0, 0.07); +} + +.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-right, +.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-right, +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-right, +.mec-admin-dark-mode #mec_calendar_filter .ui-sortable-handle, +.mec-admin-dark-mode #mec_gateways_form li .mec-gateway-options-form, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-right, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-right, +.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-right, +.mec-admin-dark-mode #mec_metabox_booking .ui-sortable-handle, +.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-right, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-right, +.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-right, +.mec-admin-dark-mode #mec_metabox_details .ui-sortable-handle, +.mec-admin-dark-mode #payment_gateways_option li .mec-gateway-options-form, +.mec-admin-dark-mode .mec-meta-box-fields h4 { + border-color: #000 !important; +} + +.mec-admin-dark-mode .wns-be-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content, +.mec-admin-dark-mode.post-type-mec-events #wp-content-editor-tools, +.mec-admin-dark-mode.post-type-mec_calendars, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .list { + background-color: #282828; + border-color: #353535; +} + +.mec-admin-dark-mode .mec-intro-section-ifarme iframe, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container *, +.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container, +.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container * { + background: #1f1f1f !important; + border-color: #353535 !important; +} + +.mec-admin-dark-mode .fserv-field input.fserv-input-text { + background: #000 !important; +} + +.mec-admin-dark-mode .block-editor-block-types-list__item-icon, +.mec-admin-dark-mode .block-editor-block-types-list__item-title, +.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article h4.mec-event-title, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-selection--single .select2-selection__rendered, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support .about-wrap h3, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container .fserv-form-name, +.mec-admin-dark-mode.toplevel_page_mec-intro .about-wrap h3, +.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container .fserv-form-name { + color: #d2d2d2 !important; +} + +.mec-admin-dark-mode .wns-be-sidebar li a:hover, +.mec-admin-dark-mode .wns-be-sidebar li:hover, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .html-active .switch-html, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .tmce-active .switch-tmce, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-switch-editor, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option:hover { + background: #000; + color: #d2d2d2; +} + +.mec-admin-dark-mode .wns-be-sidebar li a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h1, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h2, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h3, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h4, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head span, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report h2, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report h4, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-faq-accordion-trigger a, +.mec-admin-dark-mode.post-type-mec-books .postbox h1, +.mec-admin-dark-mode.post-type-mec-books .postbox h2, +.mec-admin-dark-mode.post-type-mec-books .postbox h3, +.mec-admin-dark-mode.post-type-mec-events .components-panel__body-toggle.components-button, +.mec-admin-dark-mode.post-type-mec-events .wrap h1.wp-heading-inline, +.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option .wn-mec-text { + color: #d2d2d2; +} + +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a, +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a:hover { + border: none; +} + +.mec-admin-dark-mode .wns-be-sidebar li.active ul.subsection { + background: #282828; + border-bottom: 1px solid #353535; +} + +.mec-admin-dark-mode .wns-be-sidebar li .subsection a { + background: #282828; + color: #636363; + opacity: 1; + font-size: 12px; + padding: 6px 4px 6px 46px; +} + +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main { + box-shadow: 0 2px 12px -5px #000; +} + +.mec-admin-dark-mode .wns-be-sidebar .mec-settings-menu .mec-settings-submenu a, +.mec-admin-dark-mode li.wns-be-group-menu-li.mec-settings-menu .mec-settings-submenu, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option.focus, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option.selected.focus, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option:hover { + background: #000; + color: #d2d2d2; + border-color: #353535; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings, +.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option { + background: #000 !important; + color: #fff !important; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons, +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .about-wrap h1, +.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro, +.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro h1, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h1, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report, +.mec-admin-dark-mode.m-e-calendar_page_MEC-report h1, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings div.mce-panel, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support, +.mec-admin-dark-mode.m-e-calendar_page_MEC-support h1, +.mec-admin-dark-mode.post-type-mec-books, +.mec-admin-dark-mode.post-type-mec-books h1, +.mec-admin-dark-mode.post-type-mec_calendars, +.mec-admin-dark-mode.post-type-mec_calendars .wrap h1.wp-heading-inline, +.mec-admin-dark-mode.toplevel_page_mec-intro, +.mec-admin-dark-mode.toplevel_page_mec-intro .about-wrap h1 { + background: #282828 !important; + color: #d2d2d2; +} + +.mec-admin-dark-mode .w-theme-version { + background: #1f1f1f; +} + +.mec-admin-dark-mode .mec-sed-methods li.active, +.mec-admin-dark-mode .wns-be-container .wns-be-group-tab h2, +.mec-admin-dark-mode .wns-be-container .wns-be-group-tab h4, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab, +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple .select2-selection__choice { + color: #d2d2d2; +} + +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li a:hover { + color: #07bbe9; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active { + background: #008aff; + background: linear-gradient(95deg, #36a2ff 0, #008aff 50%, #0072ff 100%); +} + +.mec-admin-dark-mode .wns-be-container #wns-be-infobar:before { + content: ""; + width: 261px; + height: 78px; + display: block; + position: absolute; + left: 0; + top: 0; + background: #1f1f1f url(../img/webnus-logo2.png) no-repeat center; + border-bottom: 1px solid #dedede; + background-size: 220px; + z-index: 997; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-set-box.extra, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-footer, +.mec-admin-dark-mode.post-type-mec-books #titlediv #title, +.mec-admin-dark-mode.post-type-mec-books .postbox h1 { + background: #1f1f1f !important; +} + +.mec-admin-dark-mode .mec-settings-menu .mec-settings-submenu:after, +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after, +.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before { + border-right-color: #353535; +} + +.mec-admin-dark-mode .mec-switcher input:checked+label:before { + background-color: #d2d2d2; + box-shadow: 2px 2px 12px -2px #ccc inset; +} + +.mec-admin-dark-mode .mec-switcher input:checked+label { + box-shadow: 0 3px 11px -7px #000; +} + +.mec-admin-dark-mode .lity.mec-add-event-popup, +.mec-admin-dark-mode .lity.mec-add-shortcode-popup, +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup, +.mec-admin-dark-mode .mec-add-shortcode-popup div#mec_popup_shortcode { + background: #282828; +} + +.mec-admin-dark-mode .lity.mec-add-event-popup .lity-content, +.mec-admin-dark-mode .lity.mec-add-shortcode-popup .lity-content { + box-shadow: 0 3px 20px 0 rgba(0, 0, 0, 0.55); +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-meta-box-colors-container, +.mec-admin-dark-mode .mec-steps-container, +.mec-admin-dark-mode .mec-steps-header { + background: #000; +} + +.mec-admin-dark-mode .mec-add-event-popup div#mec_popup_event, +.mec-admin-dark-mode .mec-steps-panel { + background: #1f1f1f; +} + +.mec-admin-dark-mode button.lity-close { + background: #000; + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.55); +} + +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li { + border: 2px solid #282828; + background: #000 !important; +} + +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text:before, +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input { + background: #282828; + border-color: #1f1f1f; + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.05); +} + +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li.active { + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); +} + +.mec-admin-dark-mode .nicescroll-cursors { + background-color: #000 !important; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-categories-tab-contents, +.mec-admin-dark-mode .mec-add-event-popup .mec-form-row.mec-available-color-row, +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content.mec-steps-content-7.mec-steps-content-active, +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div, +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode { + border-color: #282828; + background: #000; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code { + background: rgba(266, 266, 266, 0.35); +} + +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code code, +.mec-admin-dark-mode .mec-steps-content h3 { + color: #d2d2d2; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.focus, +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected.focus, +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option:hover { + background: #000; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list { + background: #282828; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list::-webkit-scrollbar-track { + background-color: #333; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list::-webkit-scrollbar { + width: 3px; + background-color: #333; +} + +.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button { + margin-left: unset; +} + +.mec-admin-dark-mode .wp-picker-container .wp-color-result.button { + background: inherit; +} + +.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container-body.mce-stack-layout { + background: #000; + border-color: #000 !important; +} + +.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup { + background-color: #000; + border-color: #282828; +} + +.mec-admin-dark-mode #wns-be-content .noresults label, +.mec-admin-dark-mode #wns-be-content .results .results .noresults label, +.mec-admin-dark-mode #wns-be-content ul li.disable, +.mec-admin-dark-mode #wns-be-content ul li.disable label { + color: #666; +} + +.mec-admin-dark-mode #wns-be-content .results .results .results label, +.mec-admin-dark-mode #wns-be-content .results label, +.mec-admin-dark-mode #wns-be-content ul li.enable, +.mec-admin-dark-mode #wns-be-content ul li.enable label { + color: #fff; +} + +.mec-admin-dark-mode.post-type-mec-books table.widefat, +.mec-admin-dark-mode.post-type-mec_calendars table.widefat, +.post-type-mec-events.mec-admin-dark-mode table.widefat { + background: #1f1f1f; + border-color: #353535; + color: #d2d2d2; +} + +.mec-admin-dark-mode.post-type-mec-books .striped>tbody> :nth-child(odd), +.mec-admin-dark-mode.post-type-mec-books ul.striped> :nth-child(odd), +.mec-admin-dark-mode.post-type-mec-events .striped>tbody> :nth-child(odd), +.mec-admin-dark-mode.post-type-mec-events ul.striped> :nth-child(odd), +.mec-admin-dark-mode.post-type-mec_calendars .striped>tbody> :nth-child(odd), +.mec-admin-dark-mode.post-type-mec_calendars ul.striped> :nth-child(odd) { + background: #282828; + border-color: #353535; + color: #d2d2d2; +} + +.mec-admin-dark-mode.post-type-mec-books .widefat td, +.mec-admin-dark-mode.post-type-mec-books .widefat th, +.mec-admin-dark-mode.post-type-mec-events .widefat td, +.mec-admin-dark-mode.post-type-mec-events .widefat th, +.mec-admin-dark-mode.post-type-mec_calendars .widefat td, +.mec-admin-dark-mode.post-type-mec_calendars .widefat th { + border-color: #000; + color: #d2d2d2; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings ul#adminmenu>li.current>a.current:after, +.mec-admin-dark-mode.post-type-mec-events ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.post-type-mec-events ul#adminmenu>li.current>a.current:after, +.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu a.wp-has-current-submenu:after, +.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu>li.current>a.current:after { + border-right-color: #1f1f1f; +} + +.mec-admin-dark-mode #mec_add_fee_button, +.mec-admin-dark-mode #mec_add_ticket_variation_button, +.mec-admin-dark-mode #mec_bfixed_form_field_types button, +.mec-admin-dark-mode #mec_bfixed_form_fields button, +.mec-admin-dark-mode #mec_event_form_field_types button, +.mec-admin-dark-mode #mec_event_form_fields button, +.mec-admin-dark-mode #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button, +.mec-admin-dark-mode #mec_reg_form_field_types button, +.mec-admin-dark-mode #mec_reg_form_fields button, +.mec-admin-dark-mode #taxes_option #mec_fees_list .mec-form-row .button, +.mec-admin-dark-mode #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button, +.mec-admin-dark-mode .mec-export-settings, +.mec-admin-dark-mode .mec-import-settings, +.mec-admin-dark-mode .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result), +.mec-admin-dark-mode .mec-occurrences-wrapper .button:not(.wp-color-result), +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button-secondary, +.mec-admin-dark-mode.post-type-mec-books .button, +.mec-admin-dark-mode.post-type-mec-books .wp-heading-inline+.page-title-action, +.mec-admin-dark-mode.post-type-mec-events .button, +.mec-admin-dark-mode.post-type-mec-events .button-secondary, +.mec-admin-dark-mode.post-type-mec-events .wp-heading-inline+.page-title-action, +.mec-admin-dark-mode.post-type-mec_calendars .button, +.mec-admin-dark-mode.post-type-mec_calendars .wp-heading-inline+.page-title-action { + color: #d2d2d2 !important; + border-color: #353535 !important; + background: #000; +} + +.mec-admin-dark-mode #mec_add_fee_button:hover, +.mec-admin-dark-mode #mec_add_ticket_variation_button:hover, +.mec-admin-dark-mode #mec_bfixed_form_field_types button:hover, +.mec-admin-dark-mode #mec_bfixed_form_fields button:hover, +.mec-admin-dark-mode #mec_event_form_field_types button:hover, +.mec-admin-dark-mode #mec_event_form_fields button:hover, +.mec-admin-dark-mode #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:hover, +.mec-admin-dark-mode #mec_reg_form_field_types button:hover, +.mec-admin-dark-mode #mec_reg_form_fields button:hover, +.mec-admin-dark-mode #taxes_option #mec_fees_list .mec-form-row .button:hover, +.mec-admin-dark-mode #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:hover, +.mec-admin-dark-mode .mec-export-settings:hover, +.mec-admin-dark-mode .mec-import-settings:hover, +.mec-admin-dark-mode .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):hover, +.mec-admin-dark-mode .mec-occurrences-wrapper .button:not(.wp-color-result):hover, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button-secondary:hover, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button.hover, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button:hover, +.mec-admin-dark-mode.post-type-mec-events .button-secondary:hover, +.mec-admin-dark-mode.post-type-mec-events .button.hover, +.mec-admin-dark-mode.post-type-mec-events .button:hover, +.mec-admin-dark-mode.post-type-mec_calendars .button-secondary:hover, +.mec-admin-dark-mode.post-type-mec_calendars .button.hover, +.mec-admin-dark-mode.post-type-mec_calendars .button:hover { + background: #111; + border-color: #333 !important; + color: #fff; +} + +.mec-admin-dark-mode.post-type-mec-events .mec-form-row .button:not(.wp-color-result) { + height: 37px; + margin-top: 1px; + box-shadow: inset 0 2px 4px #282828, inset 0 -2px 4px rgba(0, 0, 0, 0.05), + 0 2px 2px rgba(0, 0, 0, 0.06); +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-color-result-text, +.mec-admin-dark-mode.post-type-mec-events .wp-color-result-text { + border-left: 1px solid #353535; + color: #d2d2d2; + background: #000; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-search-settings { + color: #d2d2d2; + background: #282828; +} + +.mec-admin-dark-mode.taxonomy-mec_category .button, +.mec-admin-dark-mode.taxonomy-mec_label .button, +.mec-admin-dark-mode.taxonomy-mec_location .button, +.mec-admin-dark-mode.taxonomy-mec_organizer .button, +.mec-admin-dark-mode.taxonomy-mec_speaker .button, +.mec-admin-dark-mode.taxonomy-mec_sponsor .button, +.mec-admin-dark-mode.taxonomy-mec_tag .button { + box-shadow: 0 3px 10px -4px #000 !important; +} + +.mec-admin-dark-mode.post-type-mec_calendars .mec-switcher input+label:after, +.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option .wn-hover-img-sh img { + background: #282828; +} + +.mec-admin-dark-mode .attachment-info, +.mec-admin-dark-mode .media-frame-toolbar .media-toolbar { + border-color: #282828; +} + +.mec-admin-dark-mode #webnus-dashboard .welcome-head img, +.mec-admin-dark-mode .mce-content-body { + background-color: #000 !important; +} + +.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article { + border-bottom: 1px solid #444; +} + +.mec-admin-dark-mode #webnus-dashboard a, +.mec-admin-dark-mode #webnus-dashboard pre, +.mec-admin-dark-mode .extra .w-box-head, +.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a, +.mec-admin-dark-mode .mec-form-row label, +.mec-admin-dark-mode .mec-form-row span, +.mec-admin-dark-mode .mec-meta-box-fields h4, +.mec-admin-dark-mode .mec-meta-box-fields label, +.mec-admin-dark-mode .mec-meta-box-fields p, +.mec-admin-dark-mode .mec-meta-box-fields span, +.mec-admin-dark-mode .mec-meta-box-fields strong, +.mec-admin-dark-mode .mec-new-addons .mec-addons-notification-title, +.mec-admin-dark-mode .mec-new-addons p, +.mec-admin-dark-mode .mec-new-addons strong, +.mec-admin-dark-mode .w-box-content p, +.mec-admin-dark-mode .w-box.doc, +.mec-admin-dark-mode .w-box.total-bookings ul li, +.mec-admin-dark-mode .w-box.total-bookings ul li a, +.mec-admin-dark-mode .wns-be-sidebar .mec-settings-menu .mec-settings-submenu a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button { + color: #d2d2d2 !important; +} + +.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a { + box-shadow: 0 0 0 3px rgb(255 255 255 / 24%) !important; +} + +.mec-admin-dark-mode #webnus-dashboard .mec-event-detail { + color: #444; +} + +.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag { + border-color: #2d2d2d; +} + +.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag { + color: #282828 !important; +} + +.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:hover { + color: #fff !important; +} + +.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:nth-child(2):hover, +.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:nth-child(3):hover { + color: #999 !important; +} + +.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a, +.mec-admin-dark-mode .w-box.total-bookings ul li { + background: #333; + box-shadow: 0 2px 3px -2px #000; +} + +.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a:hover, +.mec-admin-dark-mode .w-box.total-bookings ul li:hover { + background: #000; +} + +.mec-admin-dark-mode #webnus-dashboard .total-bookings input[type="text"], +.mec-admin-dark-mode #webnus-dashboard .total-bookings select { + background: #000; + color: #999; + border-color: #111; +} + +.mec-admin-dark-mode #mec_category-add-toggle, +.mec-admin-dark-mode #sample-permalink a, +.mec-admin-dark-mode #set-post-thumbnail, +.mec-admin-dark-mode .button-link, +.mec-admin-dark-mode .category-tabs a, +.mec-admin-dark-mode .mec-add-booking-tabs-left a, +.mec-admin-dark-mode .mec-add-event-tabs-left a, +.mec-admin-dark-mode .mec-create-shortcode-tabs-left a, +.mec-admin-dark-mode.post-type-mec-events .wp-list-table .row-title, +.mec-admin-dark-mode.post-type-mec_calendars .wp-list-table .row-title { + color: #888 !important; +} + +.mec-admin-dark-mode .mec-add-booking-tabs-left a.mec-tab-active, +.mec-admin-dark-mode .mec-add-event-tabs-left a.mec-tab-active, +.mec-admin-dark-mode .mec-create-shortcode-tabs-left a.mec-tab-active { + color: #00b0dd; +} + +.mec-admin-dark-mode #TB_title, +.mec-admin-dark-mode #TB_window { + background: #000; +} + +.mec-admin-dark-mode #webnus-dashboard .welcome-head img, +.mec-admin-dark-mode .webnus-icons-list li:hover { + background: #111; +} + +.mec-admin-dark-mode #TB_window i { + color: #999; +} + +.mec-admin-dark-mode #TB_title, +.mec-admin-dark-mode .webnus-icons-list li label { + border: unset !important; +} + +.mec-admin-dark-mode.post-type-mec-books .notice-success, +.mec-admin-dark-mode.post-type-mec-books div.updated, +.mec-admin-dark-mode.post-type-mec-events .notice-success, +.mec-admin-dark-mode.post-type-mec-events div.updated, +.mec-admin-dark-mode.post-type-mec_calendars .notice-success, +.mec-admin-dark-mode.post-type-mec_calendars div.updated { + background: #111; + border-top: unset; + border-bottom: unset; +} + +.mec-admin-dark-mode.post-type-mec-books input, +.mec-admin-dark-mode.post-type-mec-events input, +.mec-admin-dark-mode.post-type-mec_calendars input { + background: #000; + color: #888; +} + +.mec-admin-dark-mode.post-type-mec-books .subsubsub a, +.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item, +.mec-admin-dark-mode.post-type-mec-events .subsubsub a, +.mec-admin-dark-mode.post-type-mec_calendars .subsubsub a { + color: #2271b1; +} + +.mec-admin-dark-mode.post-type-mec-books .subsubsub a:hover, +.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item:hover, +.mec-admin-dark-mode.post-type-mec-events .subsubsub a:hover, +.mec-admin-dark-mode.post-type-mec_calendars .subsubsub a:hover { + color: #135e96; +} + +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a, +.mec-admin-dark-mode.post-type-mec-events #set-post-thumbnail, +.mec-admin-dark-mode.post-type-mec-events .attachment-info .filename { + color: #888; +} + +.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a:hover, +.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a:hover, +.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a:hover, +.mec-admin-dark-mode.post-type-mec-events #set-post-thumbnail:hover { + color: #a9a9a9; +} + +.mec-admin-dark-mode #webnus-dashboard .welcome-head img, +.mec-admin-dark-mode .w-theme-version, +.mec-admin-dark-mode.post-type-mec_calendars .mec-switcher input+label:after { + border-color: #444; +} + +.mec-admin-dark-mode.post-type-mec-books .postbox-header, +.mec-admin-dark-mode.post-type-mec-events .postbox-header, +.mec-admin-dark-mode.post-type-mec_calendars .postbox-header { + border-color: #000; +} + +.mec-admin-dark-mode.post-type-mec-events .inside div div>a.mec-tab-active:after, +.mec-admin-dark-mode.post-type-mec-events .inside div div>a.mec-tab-active:before, +.mec-admin-dark-mode.post-type-mec_calendars .inside div div>a.mec-tab-active:after, +.mec-admin-dark-mode.post-type-mec_calendars .inside div div>a.mec-tab-active:before { + border-right-color: #2d2d2d; +} + +.mec-admin-dark-mode .mec-form-row input[type="radio"] { + box-shadow: 0 1px 10px -2px #000; +} + +.mec-admin-dark-mode.post-type-mec-books .form-wrap label, +.mec-admin-dark-mode.post-type-mec-books .media-frame-title h1, +.mec-admin-dark-mode.post-type-mec-books h2, +.mec-admin-dark-mode.post-type-mec-events .form-wrap label, +.mec-admin-dark-mode.post-type-mec-events .media-frame-title h1, +.mec-admin-dark-mode.post-type-mec-events h2 { + color: #d2d2d2; +} + +.mec-admin-dark-mode.post-type-mec-books.taxonomy-mec_coupon .button, +.mec-admin-dark-mode.post-type-mec-events.taxonomy-post_tag .button { + box-shadow: 0 3px 10px -4px #000; +} + +.mec-admin-dark-mode.post-type-mec-events .attachments-browser .media-toolbar, +.mec-admin-dark-mode.post-type-mec-events .media-frame-content, +.mec-admin-dark-mode.post-type-mec-events .media-modal-content { + background: #2d2d2d; + color: #888; +} + +.mec-admin-dark-mode.post-type-mec-events .media-router .active, +.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item.active:last-child, +.mec-admin-dark-mode.post-type-mec-events .media-sidebar, +.mec-admin-dark-mode.post-type-mec-events .quicktags-toolbar { + background: #222; +} + +.mec-admin-dark-mode.post-type-mec-events .attachments-browser .media-toolbar, +.mec-admin-dark-mode.post-type-mec-events .media-frame-content, +.mec-admin-dark-mode.post-type-mec-events .media-modal-content, +.mec-admin-dark-mode.post-type-mec-events .media-router .active, +.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item.active:last-child, +.mec-admin-dark-mode.post-type-mec-events .media-sidebar, +.mec-admin-dark-mode.post-type-mec-events .quicktags-toolbar { + border-color: #000; +} + +.mec-admin-dark-mode.post-type-mec-events .wp-core-ui .attachment-preview { + background: #000; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-footer, +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-head, +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .w-col-sm-3 .w-box.addon { + border-color: #444; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-footer { + background: #444; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-title span { + color: #d2d2d2; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard { + background: #282828 !important; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap { + background: #1f1f1f; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap .mec-wizard-starter-video a, +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button { + background: #000; + border-color: #353535; + transition: all 0.2s ease; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap .mec-wizard-starter-video a:hover, +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover { + border-color: #515151; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-back-box .mec-wizard-back-button { + background: 0 0; + box-shadow: unset; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap svg path { + fill: #7b7b7b; + stroke: #7b7b7b; + transition: all 0.2s ease; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a p, +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button span { + color: #7b7b7b; + transition: all 0.2s ease; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a:hover p, +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover span { + color: #fff; +} + +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a:hover svg path, +.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover svg path { + fill: #fff; + stroke: #fff; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip { + position: relative; +} + +.mec-attendees-wrapper .mec-attendees-list strong, +.post-type-mec-books .attendees strong { + line-height: 26px; + padding-left: 26px; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:before, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip:before { + position: absolute; + content: "\e001"; + font-family: simple-line-icons; + margin: 12px 0; + top: -30px; + left: 0; + font-size: 18px; + line-height: 12px; + color: #40d9f1; + padding: 0 60px 5px 0; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul { + position: absolute; + min-width: 300px; + max-width: 600px; + display: inline-block; + left: 60px; + top: 50%; + transform: translateY(-50%); + background-color: #535a61; + color: #fff; + font-weight: 300; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.3; + z-index: 9999999; + box-sizing: border-box; + box-shadow: 0 4px 45px -8px #444b50; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; + padding: 23px 20px 20px 20px; + border-radius: 8px; + margin-top: -13px; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul:before, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul:before { + display: block; + content: "" !important; + position: absolute !important; + width: 12px; + height: 12px; + left: -10px !important; + top: 50% !important; + transform: translate(50%, -50%) rotate(-45deg) !important; + background-color: #535a61 !important; + box-shadow: 0 8px 9px -4px #535a61 !important; + z-index: 0 !important; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:hover ul, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip:hover ul { + visibility: visible; + opacity: 1; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul a, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul a { + color: #40d9f1; + margin-bottom: 14px; + margin-left: 0; + font-weight: 400; + font-size: 14px; + letter-spacing: 0.5px; + position: relative; + text-decoration: none; + display: block; + width: max-content; +} + +.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul li:last-child a, +.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul li:last-child a { + margin-bottom: 0; +} + +.mec-metabox-head-version img, +.mec-metabox-head-version p { + float: left; +} + +.mec-metabox-head-version a { + float: right; +} + +.mec-metabox-head-version p { + margin-top: 3px; + margin-left: 5px; + margin-bottom: 34px; +} + +h3.mec-metabox-feed-head { + border-top: 1px solid #ccc; +} + +div#mec_widget_news_features .inside { + padding: 0; +} + +.mec-metabox-head-wrap { + padding: 0 12px; +} + +#dashboard-widgets h3.mec-metabox-feed-head { + padding: 8px 12px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + font-weight: 700; +} + +.mec-metabox-feed-content { + padding: 0 12px; +} + +.mec-metabox-feed-content ul li a { + font-weight: 600; + display: block; +} + +.mec-metabox-feed-content ul li p { + margin: 3px 0 24px; +} + +.mec-metabox-footer a span { + font-size: 17px; + vertical-align: middle; + margin-left: 2px; +} + +.mec-metabox-footer a { + text-decoration: none; + border-right: 1px solid #eee; + padding-right: 10px; + margin-right: 12px; +} + +.mec-metabox-footer { + padding: 11px 12px 10px; + border-top: 1px solid #eee; +} + +.mec-metabox-footer a:last-of-type { + border: none; +} + +.mec-metabox-upcoming-wrap h3 { + border-top: none !important; + padding-top: 13px !important; +} + +.mec-metabox-head-wrap { + box-shadow: 0 5px 8px rgba(0, 0, 0, 0.05); +} + +.mec-metabox-upcoming-wrap ul li span { + float: left; +} + +.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event { + float: left; + margin-left: 10px; +} + +.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event-date { + float: right; +} + +.mec-metabox-upcoming-wrap ul { + padding: 0 12px; + background: #f7f7f7; + margin: 0; +} + +.mec-metabox-upcoming-wrap ul li { + border-bottom: 1px solid #eee; + padding: 14px 0; + margin-bottom: 0; +} + +.mec-metabox-upcoming-wrap ul li:last-of-type { + border: none; +} + +.mec-metabox-upcoming-wrap h3 { + margin-bottom: 0 !important; +} + +.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event a { + font-weight: 600; +} + +.mec-metabox-head-version a span { + vertical-align: middle; +} + +.mec-metabox-head-version a { + padding-left: 6px !important; +} + +#mec_widget_total_bookings .w-box.total-bookings ul li:first-child { + margin-left: 1px; +} + +#mec_widget_total_bookings .w-box.total-bookings ul li { + margin-right: 4px; +} + +#mec_widget_total_bookings .w-box.total-bookings ul li:last-child { + margin-right: 0; +} + +#mec_widget_total_bookings .w-box.total-bookings ul li a { + color: #000; +} + +#mec_widget_total_bookings .w-box.total-bookings ul li:hover a { + color: #fff; +} + +#mec_widget_total_bookings { + overflow: hidden; +} + +#mec_widget_total_bookings .inside, +#mec_widget_total_bookings .w-box { + margin: 0; + padding-bottom: 0; +} + +#mec_widget_total_bookings .w-col-sm-12 { + padding: 0; +} + +#mec_widget_total_bookings .w-box-content button { + color: #fff !important; + font-weight: 500 !important; + border-radius: 2px !important; + box-shadow: 0 3px 10px -4px #008aff !important; + text-shadow: none !important; + background: #008aff !important; + background: linear-gradient(95deg, + #36a2ff 0, + #008aff 50%, + #0072ff 100%) !important; + border: none !important; + transition: 0.24s !important; + line-height: 39px; + padding: 0 36px; + width: calc(33% - 7px); + margin-bottom: 14px; +} + +#mec_widget_total_bookings .w-box-content input[type="text"], +#mec_widget_total_bookings .w-box-content select { + border: solid 1px #ddd; + border-radius: 2px; + height: 40px; + line-height: 38px; + padding-left: 10px; + box-shadow: 0 3px 10px -2px rgba(0, 0, 0, 0.05), + inset 0 1px 2px rgba(0, 0, 0, 0.02); +} + +#mec_widget_total_bookings .w-box-content input[type="text"] { + width: calc(50% - 5px); +} + +#mec_widget_total_bookings .w-box-content select { + width: calc(33% - 2px); + margin-bottom: 24px; + margin-top: 20px; +} + +div#mec-schema .mec-form-row label { + display: inline-block; + width: 141px; +} + +.event-status-schema { + background: rgb(247 248 249 / 10%); + padding: 20px 40px; + margin: 10px 0 35px; + border-radius: 4px; + border: 1px solid #e6e6e6; +} + +@media (min-width: 1281px) { + .event-status-schema { + max-width: 70%; + } +} + +.event-status-schema p { + margin-bottom: 35px; +} + +div#mec_cancelled_reason_wrapper label { + width: 100% !important; +} + +.mec-fluent-hidden { + display: none; +} + +#webnus-dashboard .total-bookings input[type="text"] { + height: 38px; + line-height: 38px; + padding-left: 10px; + border-radius: 5px; + border: none; + background-color: #f7f8f9; + box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%); +} + +#webnus-dashboard .total-bookings select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + cursor: pointer; + min-height: 34px; + line-height: 34px; + background-color: #f7f8f9; + border-radius: 2px; + padding-left: 8px; + box-shadow: 0 1px 3px rgb(0 0 0 / 2%); + transition: all 0.23s ease; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE3IDE3Ij4KPGc+CjwvZz4KCTxwYXRoIGQ9Ik0xNi4zNTQgNS4wNzVsLTcuODU1IDcuODU0LTcuODUzLTcuODU0IDAuNzA3LTAuNzA3IDcuMTQ1IDcuMTQ2IDcuMTQ4LTcuMTQ3IDAuNzA4IDAuNzA4eiIgZmlsbD0iIzAwMDAwMCIgLz4KPC9zdmc+Cg==); + background-repeat: no-repeat; + background-size: 26px 10px; + background-position: right center; + min-width: 160px; + border: 1px solid #e6e9eb; +} + +#webnus-dashboard select { + margin-top: -5px; +} + +#mec_styles_CSS { + line-height: 1.6; +} + +.mec-search-forms-options-container label.mec-col-12 { + margin-bottom: 10px; +} + +@media (max-width: 480px) { + .toplevel_page_mec-intro .mec-intro-section-ifarme iframe { + width: auto !important; + height: auto !important; + } + + .w-box.mec-activation input[name="MECPurchaseCode"] { + min-width: 200px !important; + width: 330px; + } + + .w-box.mec-activation { + background: #fff; + } + + .mec-addons { + padding-right: 15px; + } + + .mec-report-wrap { + margin-top: 20px; + } + + .mec-report-select-event-wrap .select2-container--default, + .mec-report-select-event-wrap select.mec-reports-selectbox-dates { + max-width: 100%; + width: 100%; + margin: 10px 0; + } + + .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content, + .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head { + padding: 10px; + } + + .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head span { + font-size: 13px; + } + + .mec-report-selected-event-attendees-wrap .mec-attendees-content .w-col-xs-3 { + word-wrap: break-word; + } + + .mec-report-selected-event-attendees-wrap .w-col-xs-3.name img { + display: block; + } + + .mec-report-selected-event-attendees-wrap input[type="checkbox"], + .mec-report-selected-event-attendees-wrap input[type="radio"] { + height: 0.85rem; + width: 0.85rem; + } + + .wns-be-container .dpr-btn.dpr-save-btn { + margin: 0 !important; + } + + #mec_booking_form .mec-container { + padding-left: 0; + padding-right: 0; + } + + #mec_event_form_fields, + #mec_reg_form_fields { + padding: 10px; + } + + .mec-search-forms-options-container .mec-form-row select { + width: 100%; + } + + #mec_skin_monthly_view_start_date_container { + display: unset; + } + + #mec_calendar_display_options input[type="number"], + #mec_calendar_display_options input[type="text"], + #mec_calendar_display_options select { + max-width: 100% !important; + width: 100%; + margin: 10px 0; + } + + #mec_select_tags.mec-create-shortcode-tab-content input[type="text"] { + width: auto; + } + + #mec_tickets .mec-box { + padding: 20px 7px; + } + + .fserv-container form, + .fserv-form-description { + padding: 10px 15px !important; + } + + .fserv-field { + display: inline-block; + width: 25% !important; + padding: 0 !important; + margin: 0 !important; + margin-right: 10px !important; + } + + #webnus-dashboard .total-bookings button { + margin: 15px 0; + } +} + +.mec-skin-styles.mec-styles-custom { + padding-left: 0 !important; + top: 40%; + position: absolute; + width: 330px; + height: auto !important; + overflow: visible !important; +} + +.mec-skin-styles.mec-styles-custom .nice-select { + box-shadow: 0 3px 13px -5px rgba(0, 0, 0, 0.1), + inset 0 1px 2px rgba(0, 0, 0, 0.07); + clear: unset !important; + -webkit-tap-highlight-color: transparent; + background-color: #fff; + border-radius: 5px; + border: solid 1px #e8e8e8; + box-sizing: border-box; + clear: both; + cursor: pointer; + display: block; + float: left; + font-family: inherit; + font-size: 14px; + font-weight: 400; + height: 42px; + line-height: 40px; + outline: 0; + padding-left: 18px; + padding-right: 30px; + position: relative; + text-align: left !important; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + width: 300px !important; +} + +.mec-styles-custom h3 { + font-size: 13px; + font-weight: 400; + color: #707070; +} + +.post-type-mec_calendars .mec-form-row .select2-selection { + height: auto; +} + +.mec-form-row .mec-col-12 ul li span { + display: inline-block; + background: #f7f8f9; + padding: 8px 15px; + margin-right: 5px; + border-radius: 3px; + border: 1px dashed #d7d8d9; + font-family: monospace; + letter-spacing: 0.4px; +} + +.post-type-mec-events .ui-datepicker.ui-widget .ui-state-disabled .ui-state-default { + color: #ccc; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; +} + +.post-type-mec-events .ui-datepicker.ui-widget .ui-button, +.post-type-mec-events .ui-datepicker.ui-widget .ui-button.ui-state-disabled:active, +.post-type-mec-events .ui-datepicker.ui-widget .ui-button.ui-state-disabled:hover, +.post-type-mec-events .ui-datepicker.ui-widget .ui-state-default, +.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-content .ui-state-default, +.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-header .ui-state-default, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button.ui-state-disabled:active, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button.ui-state-disabled:hover, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-state-default, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-content .ui-state-default, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-header .ui-state-default { + border: 0; + background-color: #fff; + font-weight: 400; + color: #212121; + text-align: center; +} + +.post-type-mec-events .ui-datepicker.ui-widget td a.ui-state-active, +.post-type-mec-events .ui-datepicker.ui-widget td a:hover, +.post-type-mec_calendars .ui-datepicker.ui-widget td a.ui-state-active, +.post-type-mec_calendars .ui-datepicker.ui-widget td a:hover { + background: #40d9f1; + color: #fff; +} + +.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-header, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-header { + border: 0; + background: unset; + background-color: #fff; +} + +.post-type-mec-events .ui-datepicker.ui-widget .ui-icon, +.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-content .ui-icon, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-icon, +.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-content .ui-icon { + background-image: unset; +} + +.post-type-mec-events .ui-datepicker.ui-widget select, +.post-type-mec_calendars .ui-datepicker.ui-widget select { + font-weight: 600; + font-size: 12px; + border-radius: 2px; + padding: 2px 10px; + margin: 1px 3px 5px; +} + +.mec-update-warning+p { + display: none; +} + +#mec_sf_timetable_address_search_placeholder, +#mec_sf_timetable_txt_search_placeholder { + margin-top: 4px; +} + +body.rtl .wns-be-sidebar { + width: 260px; + float: right; + position: relative; +} + +body.rtl .wns-be-main { + margin-left: 0; + border-left: 0; + margin-right: 260px; + border-right: 1px solid #dedede; +} + +body.rtl .w-box.mec-activation .LicenseField { + direction: rtl; +} + +body.rtl .w-box.mec-activation input[name="MECPurchaseCode"] { + text-align: right; + padding-right: 20px; +} + +body.rtl #MECActivation .MECPurchaseStatus, +body.rtl .addon-activation-form .MECPurchaseStatus { + right: auto; + left: -51px; +} + +body.rtl #webnus-dashboard .w-box.mec-activation input[type="submit"] { + right: auto; + left: 5px; +} + +body.rtl .wns-be-sidebar .wns-be-group-menu li a { + padding: 13px 20px 13px 4px; +} + +body.rtl .wns-be-sidebar .wns-be-group-tab-link-a span.wns-be-group-menu-title { + padding-left: 0; + padding-right: 24px; +} + +body.rtl .wns-be-sidebar .has-sub span.extra-icon { + float: left; +} + +body.rtl .wns-be-sidebar .wns-be-group-tab-link-a span.extra-icon i { + right: auto; + left: 10px; +} + +body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after, +body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: transparent; + border-left-color: #fff; + right: auto; + left: -1px; + top: 10px; +} + +body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before { + border-right-color: transparent; + border-left-color: #c5c5c5; + right: auto; + left: 0; +} + +body.rtl .mec-col-1, +body.rtl .mec-col-10, +body.rtl .mec-col-11, +body.rtl .mec-col-12, +body.rtl .mec-col-2, +body.rtl .mec-col-3, +body.rtl .mec-col-4, +body.rtl .mec-col-5, +body.rtl .mec-col-6, +body.rtl .mec-col-7, +body.rtl .mec-col-8, +body.rtl .mec-col-9 { + float: right; + margin: 0; +} + +body.rtl .wns-be-sidebar li .submneu-hover { + right: auto; + left: -222px; +} + +body.rtl .wns-be-sidebar li .submneu-hover:after { + position: absolute; + z-index: 999; + content: " "; + height: 0; + width: 0; + border: 7px solid transparent; + border-right-color: #fff; + left: auto; + right: -1px; + top: 14px; +} + +body.rtl #mec_styles_form #mec_styles_CSS { + direction: ltr; +} + +body.rtl .w-box.mec-activation { + -moz-transform: scaleY(-1); + -o-transform: scaleY(-1); + -webkit-transform: scaleY(-1); + transform: scaleX(-1); +} + +body.rtl .w-box.mec-activation .w-box-content, +body.rtl .w-box.mec-activation .w-box-head { + -moz-transform: scaleY(-1); + -o-transform: scaleY(-1); + -webkit-transform: scaleY(-1); + transform: scaleX(-1); + display: block; +} + +body.rtl .w-box.mec-activation .w-box-head { + width: 100%; +} + +body.rtl .wns-be-container #wns-be-infobar:before { + left: auto; + right: 0; +} + +body.rtl .wns-be-container .dpr-btn.dpr-save-btn { + float: left; +} + +body.rtl .wns-be-container .wns-be-group-tab h2:before, +body.rtl .wns-be-container .wns-be-group-tab h4:before { + left: auto; + right: 0; + margin-right: 0; + margin-left: 5px; +} + +body.rtl #mec_gateways_form .mec-tooltip { + float: left; +} + +body.rtl .fserv-container .fserv-form-name { + text-align: right !important; +} + +body.rtl #webnus-dashboard .mec-activation .w-box-head { + max-width: calc(100% - 250px); + margin-right: 250px; + text-align: right; +} + +body.rtl #webnus-dashboard .w-box.mec-activation .LicenseType label { + padding-left: 20px; + padding-right: 0; + font-weight: 500; +} + +body.rtl #webnus-dashboard .w-box.mec-activation input[type="radio"]+label span { + margin-right: 0; + margin-left: 6px; +} + +body.rtl #webnus-dashboard .upcoming-events .w-box-content .mec-event-article { + display: block; +} + +body.rtl #webnus-dashboard .upcoming-events .w-box-content .mec-event-article .col-md-9.col-sm-9 { + float: unset; +} + +body.rtl #webnus-dashboard .total-bookings input[type="text"], +body.rtl #webnus-dashboard .total-bookings select { + min-width: 125px; + margin: 0; +} + +body.rtl.post-type-mec-events .mec-form-row input[type="number"], +body.rtl.post-type-mec-events .mec-form-row input[type="text"], +body.rtl.post-type-mec-events .mec-form-row input[type="url"], +body.rtl.post-type-mec-events .mec-form-row select, +body.rtl.post-type-mec-events .mec-form-row textarea, +body.rtl.post-type-mec_calendars .mec-form-row input[type="number"], +body.rtl.post-type-mec_calendars .mec-form-row input[type="text"], +body.rtl.post-type-mec_calendars .mec-form-row input[type="url"], +body.rtl.post-type-mec_calendars .mec-form-row select, +body.rtl.post-type-mec_calendars .mec-form-row textarea { + margin: 0 0 0 1%; +} + +body.rtl .mec-form-row .mec-col-8 label, +body.rtl .mec-form-row .mec-col-9 label { + padding-left: 10px; +} + +body.rtl .mec-form-row label { + text-align: right; +} + +body.rtl .mec-form-row .mec-col-3 { + margin: 0; + padding-left: 10px; + padding-right: 0; +} + +body.rtl .mec-calendar-metabox .mec-form-row input[type="checkbox"], +body.rtl .mec-meta-box-fields .mec-form-row input[type="checkbox"] { + margin-left: 6px; + margin-right: 0; +} + +body.rtl .mec-form-row input[type="radio"] { + margin: 0 0 0 6px; +} + +body.rtl .mec-form-row .description { + border-left: 0; + border-right: 1px dashed #ccc; + padding-left: 0; + padding-right: 12px; +} + +body.rtl #mec_add_fee_button, +body.rtl #mec_add_ticket_variation_button, +body.rtl #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button, +body.rtl #taxes_option #mec_fees_list .mec-form-row .button, +body.rtl #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button, +body.rtl .mec-export-settings, +body.rtl .mec-import-settings, +body.rtl .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result), +body.rtl .mec-occurrences-wrapper .button:not(.wp-color-result) { + margin-right: 0; + margin-left: 5px; +} + +body.rtl .mec-add-booking-tabs-right, +body.rtl .mec-add-event-tabs-right, +body.rtl .mec-create-shortcode-tabs-right { + border-left: 0; + border-right: 1px solid #e2e2e2; +} + +body.rtl .mec-add-booking-tabs-left a, +body.rtl .mec-add-event-tabs-left a, +body.rtl .mec-create-shortcode-tabs-left a { + padding: 13px 20px 13px 4px; +} + +body.rtl .mec-add-booking-tabs-left a.mec-tab-active, +body.rtl .mec-add-event-tabs-left a.mec-tab-active, +body.rtl .mec-create-shortcode-tabs-left a.mec-tab-active { + padding-left: 0; + padding-right: 22px; +} + +body.rtl .mec-calendar-metabox .wn-mec-select, +body.rtl .mec-form-row select, +body.rtl .post-type-mec-events .mec-form-row select, +body.rtl .post-type-mec_calendars .mec-form-row select, +body.rtl .wns-be-main .mec-form-row select { + background-position: left center !important; +} + +body.rtl .mec-calendar-metabox .wn-mec-select, +body.rtl .mec-form-row select, +body.rtl .post-type-mec-events .mec-form-row select, +body.rtl .post-type-mec_calendars .mec-form-row select, +body.rtl .wns-be-main .mec-form-row select { + text-align: right !important; +} + +body.rtl #mec_calendar_display_options .mec-col-4 input { + margin-left: 0 !important; + margin-right: 20px !important; +} + +body.rtl .meta-box-sortables .mec-switcher input:checked+label:after { + right: auto; + left: 2px; + margin-left: 0; +} + +body.rtl .mec-sed-methods li { + margin: 0 0 5px 5px; +} + +body.rtl .wn-mec-select:after { + left: 10px; + right: auto; +} + +body.rtl .inside div div>a.mec-tab-active:after, +body.rtl .inside div div>a.mec-tab-active:before { + border-right: 0; + border-left-color: #fff; +} + +body.rtl .inside div div>a.mec-tab-active:after { + right: auto; + left: -1px; +} + +body.rtl .inside div div>a.mec-tab-active:before { + border-right: 0; + border-left-color: #d7d8d9; + right: auto; + left: 0; +} + +body.rtl #mec_tickets .button.remove { + right: auto; + left: 20px; + line-height: 1.8; +} + +body.rtl .mec-calendar-metabox .wn-mec-select, +body.rtl .mec-form-row input[type="date"], +body.rtl .mec-form-row input[type="email"], +body.rtl .mec-form-row input[type="number"], +body.rtl .mec-form-row input[type="tel"], +body.rtl .mec-form-row input[type="text"], +body.rtl .mec-form-row input[type="url"], +body.rtl .mec-form-row select, +body.rtl .mec-form-row textarea, +body.rtl .mec-form-row.mec-skin-list-date-format-container input[type="text"], +body.rtl .mec-occurrences-wrapper input[type="date"], +body.rtl .mec-occurrences-wrapper input[type="email"], +body.rtl .mec-occurrences-wrapper input[type="number"], +body.rtl .mec-occurrences-wrapper input[type="tel"], +body.rtl .mec-occurrences-wrapper input[type="text"], +body.rtl .mec-occurrences-wrapper input[type="url"], +body.rtl .mec-occurrences-wrapper select, +body.rtl .mec-occurrences-wrapper textarea { + padding: 0 10px; +} + +body.rtl #mec-occurrences .mec-occurrences-list li, +body.rtl #mec_bfixed_form_fields li, +body.rtl #mec_event_form_fields li, +body.rtl #mec_reg_form_fields li { + border-radius: 11px 3px 3px 3px; +} + +body.rtl #mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button, +body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_remove, +body.rtl #mec_event_form_fields span.mec_event_field_remove, +body.rtl #mec_reg_form_fields span.mec_reg_field_remove { + position: absolute; + right: auto; + left: 47px; + top: 0; + background: #fff; +} + +body.rtl #mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before, +body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before, +body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_remove:before, +body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_sort:before, +body.rtl #mec_event_form_fields span.mec_event_field_option_sort:before, +body.rtl #mec_event_form_fields span.mec_event_field_remove:before, +body.rtl #mec_event_form_fields span.mec_event_field_sort:before, +body.rtl #mec_reg_form_fields span.mec_reg_field_option_sort:before, +body.rtl #mec_reg_form_fields span.mec_reg_field_remove:before, +body.rtl #mec_reg_form_fields span.mec_reg_field_sort:before { + left: auto; + right: 20px; + top: 7px; +} + +body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_type, +body.rtl #mec_bfixed_form_fields span.mec_event_field_type, +body.rtl #mec_event_form_fields span.mec_event_field_type, +body.rtl #mec_reg_form_fields span.mec_reg_field_type { + padding-left: 0; + padding-right: 25px; +} + +body.rtl .wns-be-main .mec-form-row .mec-col-3 { + padding: 0; +} + +body.rtl .wns-be-main .mec-form-row .mec-col-9 { + float: left; +} + +body.rtl .mec-form-row .mec-col-9 .mec-box .mec-tooltip { + left: 15px; + right: auto; +} + +body.rtl .mec-tooltip .box { + left: auto !important; + right: 30px !important; +} + +body.rtl .mec-tooltip .box:before { + left: auto !important; + right: 0 !important; +} + +body.rtl .mec-tooltip .box.left { + left: 30px !important; + right: auto !important; +} + +body.rtl .mec-tooltip .box.left:before { + left: -12px !important; + right: auto !important; +} + +body.rtl .mec-form-row .cancellation-period-box input[type="number"]:first-child { + margin-left: calc(2% + 4px); + margin-right: 0; +} + +body.rtl .support-page .w-box-content ul li i { + margin: 0 0 0 10px; + float: right; +} + +body.rtl .support-page .w-box-content ul li .mec-sl-arrow-right-circle:before { + content: "\e07a"; +} + +body.rtl #webnus-dashboard .w-box.support-page.videobox .w-button a i { + float: left; + line-height: 24px; +} + +body.rtl #webnus-dashboard .mec-faq-accordion-trigger a { + padding-right: 34px; + font-size: 15px; +} + +form .wbmec-mandatory { + color: red; +} + +input.mec-error, +select.mec-error, +textarea.mec-error { + border-color: red; +} + +.mec-copied { + position: absolute; + top: 0; + width: 40%; + opacity: 0; + z-index: -9; + transition: all 0.33s cubic-bezier(); +} + +.mec-copied.mec-copied-done { + opacity: 1; + left: 135px; + z-index: 9; +} + +.m-e-calendar_page_MEC-settings .mec-addons-notification-box-image img { + max-width: 555px; +} + +.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-wrap, +.m-e-calendar_page_MEC-settings .wns-be-container .mec-addons-notification-wrap { + max-width: 1020px; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery { + display: flex; + flex-flow: row wrap; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li { + flex: 0 1 calc(33.333333% - 10px); + margin-right: 10px; + position: relative; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li img { + width: 100% !important; + height: 75px; + object-fit: cover; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete { + padding: 0; + min-height: 20px; + height: 20px; + width: 20px; + margin: 0; + border-radius: 50%; + position: absolute; + top: 2px; + right: 2px; + box-shadow: none; + background: #fff; + border-color: #e3e4e5; + font-size: 0px; + cursor: pointer; + transition: 0.2s; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:before { + content: ""; + width: 20px; + height: 20px; + display: block; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZWE2NDg1Ij48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg=="); + background-position: center; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover { + color: #fff; + border-color: #ea6485; + background: #ea6485; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover:before { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZmZmZmZmIj48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg=="); +} + +.mec-show-hide-password { + cursor: pointer; +} + +.mec-show-hide-password:hover { + text-decoration: underline; +} + +.mec-in-days-add-mode #mec_cancel_in_days, +.mec-in-days-add-mode #mec_edit_in_days, +.mec-in-days-edit-mode #mec_add_in_days { + display: none; +} + +.mec-in-days-add-mode #mec_add_in_days, +.mec-in-days-edit-mode #mec_cancel_in_days, +.mec-in-days-edit-mode #mec_edit_in_days { + display: inline; +} + +ul.system-information li { + display: flex; +} + +ul.system-information li .mec-si-label { + width: 250px; + font-weight: 500; +} + +div[id*="mec_event_fields"] div[aria-label="Fullscreen"] { + display: none; +} + +.mec-backend-tab-wrap { + margin-bottom: 40px; +} + +.mec-backend-tab { + display: inline-block; + padding: 4px; + border: 1px solid #e3e4e5; + border-radius: 6px; + background: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} + +.mec-backend-tab-item { + display: inline-block; + padding: 11px 33px; + line-height: 1; + font-size: 14px; + font-weight: 400; + border-radius: 5px; + border: 1px solid transparent; + cursor: pointer; + transition: all 0.2s ease; +} + +.mec-backend-tab-item:hover { + color: #07bbe9; +} + +.mec-b-active-tab { + background: #ecf9fd; + color: #07bbe9; + cursor: default; + font-weight: 600; +} + +#mec_export_module_options { + margin: 0; +} + +.mec-hourly-schedule-form-speakers-label { + line-height: 38px; + margin-right: 10px; +} + +.wp-picker-container button { + margin: 4px 6px; +} + +#mec_meta_box_event_banner_options #mec_banner_thumbnail_img { + margin-bottom: 20px; +} + +.mec-label { + line-height: 38px; +} + +.mec-metabox-visibility label.post-attributes-label, +#mec_sb_choose_single_page label.post-attributes-label { + display: block; + margin-bottom: 4px; +} + +.mec-metabox-visibility select, +#mec_sb_choose_single_page select { + width: 100%; +} + +.mec-image-picker-page { + display: flex; + flex-wrap: wrap; + gap: 20px; +} + +.mec-image-picker-page .mec-image-picker-wrapper { + box-sizing: border-box; + max-width: 332px; + flex-basis: calc(100% / 2); + border: 1px solid #e3e5e7; + border-radius: 4px; + padding: 10px; + max-height: 46px; + display: flex; + flex-wrap: wrap; + flex-direction: row; + align-items: center; + justify-content: space-between; + position: relative; + padding-right: 43px; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default { + display: flex; + flex-wrap: wrap; + flex-direction: row; + align-items: center; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default .default { + display: flex; + margin: 2px 5px 0 0; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default .default i { + font-size: 14px; + color: #686f73; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default label { + font-size: 13px; + line-height: 17px; + font-weight: 400; + color: #686f73; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button { + font-size: 11px; + font-weight: 400; + line-height: 24px; + border: 1px solid; + border-radius: 4px; + height: unset; + min-height: unset; + margin: 0 10px 0 0; + padding: 0 10px 0 28px; + background-repeat: no-repeat; + background-position: 10px center; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button.mec-image-picker-upload { + color: #07bbe9; + border-color: #ccecf4; + background-color: #ecf9fd; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMS41NjUiIHZpZXdCb3g9IjAgMCAxNCAxMS41NjUiPg0KICA8cGF0aCBpZD0ibWVjLXVwbG9hZC1pY29uIiBkPSJNMTEsOTY0LjM2MmE0LjIxOSw0LjIxOSwwLDAsMSw0LjE2NiwzLjQyOSwzLjQ5MSwzLjQ5MSwwLDAsMS0uNjY2LDYuOTE5SDEyLjgyNmEuNDU3LjQ1NywwLDEsMSwwLS45MTNIMTQuNWEyLjU4OCwyLjU4OCwwLDAsMCwuMjM4LTUuMTY0LjQ1Ny40NTcsMCwwLDEtLjQwOS0uNCwzLjM1LDMuMzUsMCwxLDAtNi42NTMuNzg5LjQ1Ni40NTYsMCwwLDEtLjQ1Mi41MTRINy4wNDNhMi4xMywyLjEzLDAsMCwwLDAsNC4yNjFoMi4xM2EuNDU3LjQ1NywwLDEsMSwwLC45MTNINy4wNDNhMy4wMzUsMy4wMzUsMCwwLDEtLjI3Ni02LjA1OEE0LjIxNCw0LjIxNCwwLDAsMSwxMSw5NjQuMzYyWm0wLDUuMTc0YS40MDkuNDA5LDAsMCwxLC4zMDkuMTE5bDEuNjc0LDEuNTIyYS40NjEuNDYxLDAsMCwxLC4wMjkuNjQ3LjQ3OC40NzgsMCwwLDEtLjY0Ny4wMjlsLS45MDgtLjgyOHY0LjQ0NmEuNDU3LjQ1NywwLDEsMS0uOTEzLDB2LTQuNDQ2bC0uOTA4LjgyN2EuNDg4LjQ4OCwwLDAsMS0uNjQ3LS4wMjkuNDYuNDYsMCwwLDEsLjAyOS0uNjQ3bDEuNjc0LTEuNTIyYS4zODUuMzg1LDAsMCwxLC4zMDktLjExOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00IC05NjQuMzYyKSIgZmlsbD0iIzA3YmJlOSIvPg0KPC9zdmc+DQo="); +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button.mec-image-picker-remove { + color: #e95271; + border-color: #f3c2c9; + background-color: #feebee; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5LjkyNSIgaGVpZ2h0PSIxMyIgdmlld0JveD0iMCAwIDkuOTI1IDEzIj4NCiAgPHBhdGggaWQ9InRyYXNoLWljb24iIGQ9Ik0xMC4yMDksMS44NjhhMS44LDEuOCwwLDAsMC0zLjQ4OCwwSDMuNXYuOWg5LjkyNXYtLjlIMTAuMjA5Wk04LjQ2MywxLjRhLjkxOS45MTksMCwwLDEsLjc5LjQ2Nkg3LjY4OEEuODkxLjg5MSwwLDAsMSw4LjQ2MywxLjRabTMuNjA5LDIuMjU2aC45djguNDg5QTEuMzU1LDEuMzU1LDAsMCwxLDExLjYyMSwxMy41SDUuM2ExLjM1NSwxLjM1NSwwLDAsMS0xLjM1My0xLjM1M1YzLjY1OGguOXY4LjQ4OUEuNDUyLjQ1MiwwLDAsMCw1LjMsMTIuNmg2LjMxNmEuNDUyLjQ1MiwwLDAsMCwuNDUxLS40NTFWMy42NThabS00LjUxMS45djYuMjE4aC0uOVY0LjU2Wm0yLjcwNywwdjYuMjE4aC0uOVY0LjU2WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuNSAtMC41KSIgZmlsbD0iI2U5NTI3MSIvPg0KPC9zdmc+DQo="); +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper { + background-color: #fafbfc; + width: 42px; + height: 44px; + border-left: 1px solid #e3e5e7; + display: block; + position: absolute; + right: 0; + top: 0; + border-radius: 0 4px 4px 0; + display: flex; + align-items: center; + justify-content: center; +} + +.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper .mec-image-picker-preview, +.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper .mec-image-picker-preview img { + display: block; + max-width: 24px; +} + +button#mec_add_not_in_days { + margin-left: 20px; +} + +.mec-hourly-schedule-schedules .mec-form-row { + cursor: grab; +} + +.mec-hourly-schedule-schedules .mec-form-row.ui-sortable-helper { + cursor: grabbing; +} + +.taxonomy-add-new { + margin: 0; + line-height: 30px; +} + +/* Newsletter */ +.fserv-form-loaded .fs-webform-container .fserv-form-name { + text-align: left !important +} + +/* Extra Content 2 */ +#webnus-dashboard .mec-cmsg-2-notification-box-wrap, +#webnus-dashboard .mec-cmsg-notification-box-wrap { + margin-top: 30px !important; +} + +body[class^="page_MEC-settings"] .w-clearfix.w-box.mec-cmsg-notification-box-wrap { + margin-top: 0; +} + +body[class*="page_MEC-settings"] .mec-custom-msg-notification-set-box.extra, +body[class*="page_MEC-settings"] .mec-custom-msg-2-notification-set-box.extra { + font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Oxygen, Roboto, sans-serif; + max-width: 1018px; + border-radius: 11px; + overflow: hidden; + margin-right: auto; + margin-left: auto; + margin-top: 25px; + margin-bottom: 27px +} + +.mec-addons-key-features ul { + margin: 5px 0 15px; +} + +.mec-addons-key-features ul li { + margin-bottom: 1px; + font-size: 13px; + color: #717479; + padding-left: 18px; + position: relative; +} + +.mec-addons-notification-box-content.mec-new-addons p { + font-size: 14px; +} + +.mec-new-addons .mec-addons-notification-title { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; +} + +.mec-addons-key-features ul li:before { + position: absolute; + left: -1px; + top: 6px; + color: #36da74; + background: none; + font-size: 13px; + font-weight: bold; + vertical-align: middle; + font-family: "simple-line-icons"; + border-radius: 50%; + padding: 0; + width: 13px; + height: 13px; + line-height: 13px; + z-index: 3; + background: rgba(64, 241, 147, 0.12); + content: "\e080"; +} + +.mec-addons-notification-box-content.mec-new-addons a { + background: #1fcae4; + color: #fff !important; + padding: 6px 20px; + margin-top: 3px; + margin-bottom: 12px; + display: inline-block; + border-radius: 60px; + text-transform: none; + font-size: 13px; + letter-spacing: .4px; + transition: all .1s ease; + font-weight: 600; + text-decoration: none; + box-shadow: 0 0 0 3px rgb(56 213 237 / 8%) !important; +} + +.mec-addons-notification-box-content.mec-new-addons a:hover { + background: #1fcae4; + box-shadow: 0 0 0 4px rgb(56 213 237 / 15%) !important; +} + +.mec-new-addons-wrap .mec-addons-notification-box-image { + width: 590px; + display: inline-block; + vertical-align: top; +} + +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-image { + width: 450px; +} + +.mec-new-addons-wrap .mec-addons-notification-box-content { + width: calc(100% - 590px); + display: inline-block; + padding-left: 20px; +} + +.mec-new-addons-wrap .mec-addons-notification-box-image img { + max-width: 590px; +} + +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-image img { + max-width: 450px; +} + +body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content { + width: calc(100% - 470px); +} + +.mec-new-addons-wrap .w-box-content code { + display: block; + margin-bottom: 6px; +} + +@media(max-width:480px) { + + .mec-new-addons-wrap .mec-addons-notification-box-content { + width: 100%; + padding: 0; + } + + .mec-addons-notification-box-content .w-box-content { + padding-top: 30px; + padding-bottom: 30px; + padding-left: 0; + } + + .mec-new-addons-wrap .mec-addons-notification-box-image { + width: 100% !important; + } + + body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content { + width: 100% !important; + padding: 0 !important; + } + + body[class*="page_MEC-settings"] .mec-new-addons-wrap .mec-addons-notification-box-content .w-box-content { + padding: 0; + } + +} + +#webnus-dashboard .mec-new-addons-wrap { + margin-top: 30px !important; +} + +#webnus-dashboard .info-msg.w-box.mec-intro-section.version-info-message { + margin-bottom: 25px; + min-height: auto; +} + +#webnus-dashboard .info-msg.w-box.mec-intro-section.version-info-message a.info-msg-link { + line-height: 40px; + font-weight: 600; + border: none; + cursor: pointer; + padding: 0 30px; + border-radius: 33px; + color: #fff; + letter-spacing: 1px; + text-transform: uppercase; + font-size: 12px; + text-shadow: none; + background: #64e385; + transition: all .28s ease; + box-shadow: 0 5px 10px -5px #64e385; +} + +tr[data-slug="mec"] a.open-plugin-details-modal { + display: none; +} + +#mec_restful_container_toggle .mec-api-key-wrapper code { + line-height: 38px; + margin-left: 20px; +} \ No newline at end of file diff --git a/assets/css/backend.min.css b/assets/css/backend.min.css new file mode 100755 index 0000000..8229f91 --- /dev/null +++ b/assets/css/backend.min.css @@ -0,0 +1,5 @@ +body.m-e-calendar_page_MEC-addons,body.m-e-calendar_page_MEC-ix,body.m-e-calendar_page_MEC-report,body.m-e-calendar_page_MEC-settings,body.mec_invoice_page_api-key-app,body.toplevel_page_mec-intro{background:#fff}body.toplevel_page_mec-intro #webnus-dashboard .mec-cmsg-2-notification-box-wrap{margin-top:0!important}#mec_location_thumbnail_img img,#mec_organizer_thumbnail_img img,#mec_sponsor_thumbnail_img img,#mec_thumbnail_img img{max-width:250px}.taxonomy-mec_label .column-id,.taxonomy-mec_location .column-id,.taxonomy-mec_organizer .column-id,.taxonomy-mec_speaker .column-id,.taxonomy-mec_sponsor .column-id{width:40px}.taxonomy-mec_label .column-primary,.taxonomy-mec_location .column-primary,.taxonomy-mec_organizer .column-primary,.taxonomy-mec_speaker .column-primary,.taxonomy-mec_sponsor .column-primary{width:250px}.mec-color{width:16px;height:16px;display:inline-block;border-radius:50%;margin:6px 10px 6px 0;vertical-align:middle}.mec-send-email-button{background:#008aff;color:#fff;width:100%;display:block;text-align:center;font-size:20px;padding:10px 0;margin-top:18px;font-weight:700;border-radius:4px;cursor:pointer}.mec-send-email-button:hover{opacity:.9}.mec-event-color-container,.mec-event-title-container{display:inline-block}.mec-meta-box-colors-container .mec-form-row{padding:0!important}.mec-meta-box-colors-container .mec-form-row .wp-picker-container{margin:10px 0}.mec-available-color-row{margin-top:0}.mec-available-color-row .mec-color{cursor:pointer}.mec-widget-container a{text-decoration:none}.mec-widget-container label{padding-right:15px}.mec-util-hidden{display:none}.button.mec-util-hidden{display:none}.wns-be-container{max-width:1020px;background-color:#f7f8f9;background-repeat:repeat-x;border:1px solid #dcdfe1;border-radius:15px;overflow:hidden;margin:25px auto;overflow:visible;box-shadow:0 1px 4px rgb(0 0 0 / 1%);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}.wns-be-sidebar{width:230px;float:left;position:relative}.wns-be-sidebar ul.wns-be-group-menu,.wns-be-sidebar ul.wns-be-group-menu li{list-style:none;margin:0;transition:all .2s ease}.wns-be-sidebar .wns-be-group-menu li a{display:block;position:relative;outline:0;padding:13px 4px 13px 20px;background:#e3e5e7;background:0 0;border:none;color:#3f454a;font-size:14px;font-weight:600;text-decoration:none;transition:all .2s ease}.wns-be-sidebar .wns-be-group-menu>li:hover>a{color:#07bbe9;background:#fff;opacity:1}.wns-be-sidebar .wns-be-group-menu>li.active>a{text-shadow:none;background:#ecf9fd;color:#07bbe9;border-top:1px solid #ccecf4}.wns-be-sidebar .wns-be-group-menu>li:first-child>a{border-top:none}.wns-be-main{background:#fff;margin-left:230px;border-left:1px solid #e6e9eb;padding-bottom:84px;box-shadow:inset 0 1px 0 #fff;min-height:1110px;position:relative;z-index:2}.wns-be-main .wns-saved-settings{margin:0;border-bottom:1px solid #dedede;background:#dff0d8;color:#468847;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,.6)}.wns-be-container .dpr-btn{display:inline-block;font-size:13px;padding:0 16px 1px;height:36px;margin-right:3px;line-height:35px;color:#555;border:1px solid #ccc;background:#f7f7f7;text-decoration:none;transition:.24s all ease;-webkit-transition:.24s all ease}.wns-be-container .dpr-btn:hover{background:#fcfcfc;border-color:#999;color:#303030}.wns-be-container .dpr-btn.dpr-save-btn{display:inline-block;text-decoration:none;padding:0 16px;height:36px;line-height:36px;font-weight:500;font-size:14px;border-radius:20px;box-shadow:0 1px 2px rgb(0 0 0 / 2%);text-shadow:none;margin-right:5px;background:#fff;color:#0ec3f3;border:1px solid #d1e5ec;letter-spacing:.2px;transition:.24s all ease}.wns-be-container .dpr-btn.dpr-save-btn{box-shadow:0 0 0 4px #e4ffe6;text-shadow:none;margin-right:5px;background:#64e385;color:#fff;border:none;cursor:pointer;padding:1px 22px}.wns-be-container .dpr-btn.dpr-save-btn:hover{box-shadow:0 0 0 6px rgb(100 227 133 / 28%);background:#54d274;border-color:#4ac76a}.wns-be-container .wns-be-group-tab h2,.wns-be-container .wns-be-group-tab h4{margin-bottom:27px;margin-top:0;padding:12px 15px 12px 15px;font-size:21px;line-height:27px;letter-spacing:-.4px;font-weight:700;position:relative}.wns-be-container .wns-be-group-tab h4,.wns-be-container .wns-be-group-tab h5{margin:5px 0 10px}.wns-be-container .wns-be-group-tab h2:before,.wns-be-container .wns-be-group-tab h4:before{content:"";width:4px;height:16px;margin-right:5px;background-color:#07bbe9;display:block;position:absolute;left:0;top:19px}.wns-be-container .wns-be-group-tab h5{font-size:15px;font-weight:700;margin:30px 0 25px;position:relative}.wns-be-container .wns-be-group-tab h5::after{content:"";display:inline-block;width:100%;height:1px;border-bottom:1px solid #eee;position:absolute;top:9px;margin-left:10px}.wns-be-group-tab #booking_form_option h5{font-size:16px;font-weight:400;margin:35px 5px 10px}.wns-be-container .wns-be-group-tab p{font-size:12px;line-height:1.6;color:#8d9599;font-weight:400;margin:0}.wns-be-sidebar .wns-be-group-tab-link-a span{display:block}.wns-be-sidebar .wns-be-group-tab-link-a span.wns-be-group-menu-title{padding-left:24px;padding-top:1px;font-size:14px;font-weight:600}.wns-be-sidebar li.active ul.subsection{padding-top:8px;padding-bottom:12px;background:#fff;border-bottom:1px solid #e6e9eb;margin:0}.wns-be-sidebar li .subsection a{background:#fff;color:#686f73;opacity:1;font-size:13px;font-weight:400;cursor:pointer;padding:8px 4px 8px 46px}.wns-be-sidebar li .subsection a:hover{background:#fafafa;color:#242525}.wns-be-container li a:active,.wns-be-container li a:focus{outline:0;box-shadow:none}.wns-be-sidebar .wns-be-group-menu li .subsection li.active a{color:#00b0dd;position:relative;z-index:99;font-weight:500}.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after,.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before{position:absolute;z-index:9999;content:" ";height:0;width:0;border:8px solid transparent;border-right-color:#fff;right:-1px;top:10px}.wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before{border-right-color:#d7d8d9;right:0}.wns-be-sidebar li a i{color:#a0abb5;vertical-align:middle;font-size:16px;position:absolute;margin-top:2px}.wns-be-sidebar .wns-be-group-menu li.active>a i,.wns-be-sidebar .wns-be-group-menu li:hover>a i{color:#07bbe9}.wns-be-sidebar .has-sub span.extra-icon{float:right;padding:4px 7px 4px;margin-left:4px;margin-right:10px;font-family:sans-serif;font-size:9px;font-weight:600;line-height:9px;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;border:0 solid transparent}.wns-be-sidebar .has-sub span.extra-icon i{margin-left:-3px;margin-top:2px;color:#bac6d0;font-size:10px}.wns-be-sidebar .wns-be-group-tab-link-a span.extra-icon i{right:10px;font-size:10px}.wns-be-sidebar .wns-be-group-menu li.active>a span.extra-icon i{margin-top:1px}.wns-be-container #wns-be-footer{border-top:1px solid #dedede;z-index:999;padding:25px 20px 20px;background:#fafafa!important;height:44px;text-align:right;border-radius:0 0 14px 14px}.wns-be-container #wns-be-content{padding:0 20px 40px 40px}.wns-be-container #wns-be-infobar{background:#fff;border-bottom:1px solid #e6e9eb;padding:20px;text-align:right;box-shadow:inset 0 1px 0 #fcfcfc;height:79px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;position:relative;border-radius:14px 14px 0 0}.wns-be-container #wns-be-infobar:before{content:"";width:93px;height:77px;display:block;position:absolute;left:0;top:0;background:#fff url(../img/mec-logo-icon.png) no-repeat center;background-size:50px;z-index:997;border-radius:14px 0 0 0}.wns-be-container .notice-yellow{margin:0;border-bottom:1px solid #dedede;background-color:#fcf8e3;color:#c09853;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.wns-be-container .notice-red,.wns-be-container .wns-be-field-errors{margin:0;border-bottom:1px solid #dedede;background-color:#f2dede;color:#b94a48;padding:8px 35px 8px 14px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.wns-be-container #mec_styling_form .button,.wns-be-container #mec_styling_form .button-secondary{border-color:#e6e9eb;background:#fff;vertical-align:top;border-radius:4px;box-shadow:0 3px 10px -1px rgb(0 0 0 / 1%);transition:all .2s ease}.wns-be-container .wp-color-result-text{border-color:#e6e9eb}.wns-be-container #mec_styling_form .button-secondary:hover,.wns-be-container #mec_styling_form .button.hover,.wns-be-container #mec_styling_form .button:hover{background:#f0f9fc;border-color:#d1e5ec}.wns-be-container #mec_styling_form .wp-color-result:hover{background:#f0f9fc}@media (max-width:1280px){.wns-be-container{width:98%}.wns-be-container #wns-be-content{padding:5px 20px 20px}.wns-be-sidebar li .subsection a{padding-left:24px}.wns-be-main{margin-left:210px}.wns-be-sidebar{width:210px}.mec-form-row .mec-col-8 label,.mec-form-row .mec-col-9 label{padding-right:14px}.wns-be-container #wns-be-content{padding:5px 10px 0}.mec-container{padding:8px}}@media (max-width:1024px){.wns-be-main .mec-form-row .mec-col-3{min-width:200px}.wns-be-main .mec-form-row .mec-col-9{width:calc(100% - 210px)}}@media (max-width:860px){.wns-be-main .mec-form-row .mec-col-3{max-width:100%!important;width:100%!important;margin-bottom:10px!important}.wns-be-main .mec-form-row .mec-col-9{width:100%!important}.mec-container{padding-left:0!important}.wns-be-container #wns-be-infobar:before{display:none}.mec-search-settings-wrap{margin-top:0!important}#wns-be-infobar.sticky{top:0!important}#mec-search-settings{margin-bottom:10px!important}}@media (max-width:640px){.wns-be-sidebar{width:150px}.wns-be-main{margin-left:150px}}@media (max-width:480px){a.dpr-btn.dpr-save-btn{display:block!important;text-align:center!important;margin-top:20px!important}.mec-search-settings-wrap{text-align:center!important;display:block!important}#mec-search-settings{margin:0!important;width:100%!important}.wns-be-container #wns-be-infobar{height:auto!important}.wns-be-container .wns-be-sidebar{width:100%;position:unset;float:none}.wns-be-container .wns-be-main{margin-left:0;width:100%;position:unset}.wns-be-container{margin-top:50px}.wns-be-container #wns-be-infobar:before{width:100%}.wns-be-container #wns-be-infobar{height:150px}#mec-search-settings{margin-top:80px;width:181px}}body.post-type-mec-events th.column-primary{width:35%}body.post-type-mec-events th.column-start_date{width:100px}body.post-type-mec-events th.column-end_date{width:100px}body.post-type-mec-events th.column-repeat{width:75px}body.post-type-mec-events th.column-author{width:150px}body.post-type-mec-books th.column-primary{width:20%}body.post-type-mec-books th.column-event{width:170px}body.post-type-mec-books th.column-bdate{width:120px}body.post-type-mec-books th.column-confirmation{width:120px}body.post-type-mec-books th.column-verification{width:120px}body.post-type-mec-books th.column-author{width:150px}.mec-meta-box-labels-container .mec-form-row{overflow:auto}.mec-form-row.mec-last-tooltip{padding-bottom:100px!important}.mec-tooltip{display:inline-block;position:relative;margin-right:10px;cursor:help;bottom:0}.mec-tooltip:last-child{margin-right:0}.mec-tooltip:hover:after{background:#313130;border-radius:5px;bottom:24px;color:#fff;content:attr(title);left:-75px;padding:10px;position:absolute;z-index:98;width:240px}.mec-tooltip:hover:before{border:solid;border-color:#313130 transparent;border-width:6px 6px 0;bottom:18px;content:"";left:30%;position:absolute;z-index:99}.mec-tooltip .dashicons-before:before{font-size:24px;color:#40d9f1;width:24px;height:38px;line-height:38px;padding:0}.mec-tooltip a:focus{box-shadow:none}.mec-form-row .bootstrap_unvalid{display:block;border:2px solid red;position:relative;display:inline-block;border-bottom:1px dotted #000}.mec-tooltiptext{visibility:hidden;width:120px;background-color:red;color:#fff;text-align:center;border-radius:6px;padding:5px 0;position:absolute;z-index:1}.ui-datepicker{background-color:#fff;border:1px solid #66afe9;border-radius:4px;box-shadow:0 0 8px rgba(102,175,233,.6);display:none;margin-top:4px;padding:10px;width:240px}.ui-datepicker a,.ui-datepicker a:hover{text-decoration:none;cursor:pointer}.ui-datepicker a:hover,.ui-datepicker td:hover a{color:#2c6396;-webkit-transition:color .1s ease-in-out;-moz-transition:color .1s ease-in-out;-o-transition:color .1s ease-in-out;transition:color .1s ease-in-out}.ui-datepicker .ui-datepicker-header{margin-bottom:4px;text-align:center}.ui-datepicker .ui-datepicker-title{font-weight:700}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{cursor:default;font-family:dashicons;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;height:20px;line-height:1.4;margin-top:2px;width:20px}.ui-datepicker .ui-datepicker-prev{float:left;text-align:left}.ui-datepicker .ui-datepicker-next{float:right;text-align:center}.ui-datepicker .ui-datepicker-prev:before{content:"\f341"}.ui-datepicker .ui-datepicker-next:before{content:"\f345"}.ui-datepicker .ui-icon{display:none}.ui-datepicker .ui-datepicker-calendar{table-layout:fixed;width:100%}.ui-datepicker .ui-datepicker-calendar td,.ui-datepicker .ui-datepicker-calendar th{text-align:center;padding:4px 0}.ui-datepicker .ui-datepicker-calendar td{border-radius:4px;-webkit-transition:background-color .1s ease-in-out,color .1s ease-in-out;-moz-transition:background-color .1s ease-in-out,color .1s ease-in-out;-o-transition:background-color .1s ease-in-out,color .1s ease-in-out;transition:background-color .1s ease-in-out,color .1s ease-in-out}.ui-datepicker .ui-datepicker-calendar td:hover{background-color:#eee;cursor:pointer}.ui-datepicker .ui-datepicker-calendar td a{text-decoration:none}.ui-datepicker .ui-datepicker-current-day{background-color:#4289cc}.ui-datepicker .ui-datepicker-current-day a{color:#fff}.ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover{background-color:#fff;cursor:default}.mec-col-1,.mec-col-10,.mec-col-11,.mec-col-12,.mec-col-2,.mec-col-3,.mec-col-4,.mec-col-5,.mec-col-6,.mec-col-7,.mec-col-8,.mec-col-9{position:relative;min-height:1px;padding:0;margin:0}@media (min-width:783px){.mec-col-1,.mec-col-10,.mec-col-11,.mec-col-12,.mec-col-2,.mec-col-3,.mec-col-4,.mec-col-5,.mec-col-6,.mec-col-7,.mec-col-8,.mec-col-9{float:left}.mec-col-12{width:99%}.mec-col-11{width:90.66666667%}.mec-col-10{width:82.33333333%}.mec-col-9{width:74%}.mec-col-8{width:65.66666667%}.mec-col-7{width:57.33333333%}.mec-col-6{width:49%}.mec-col-5{width:40.66666667%}.mec-col-4{width:32.33333333%}.mec-col-3{width:24%}.mec-col-2{width:15.66666667%}.mec-col-1{width:7.33333333%}}#mec-occurrences .mec-occurrences-list,#mec_bfixed_form_fields,#mec_event_form_fields,#mec_orgz_form_row,#mec_reg_form_fields{background:#f7f8f9;padding:20px;margin:0 0 20px 0;border-radius:3px;min-height:150px;border:2px dashed #dcdee0}#mec-occurrences .mec-occurrences-list li,#mec_bfixed_form_fields li,#mec_event_form_fields li,#mec_orgz_form_row li,#mec_reg_form_fields li{border-radius:5px;padding:25px;background:#fff;position:relative;transition:all .3s ease;border:1px solid #f1f3f5;box-shadow:0 1px 5px rgb(0 0 0 / 2%)}#mec_reg_form_fields li div input,#mec_reg_form_fields li div select{display:block}#mec_bfixed_form_fields li ul,#mec_event_form_fields li ul,#mec_reg_form_fields li ul{padding-top:15px;padding-bottom:15px;margin:1px}#mec_bfixed_form_fields li ul li,#mec_event_form_fields li ul li,#mec_reg_form_fields li ul li{padding:7px 30px 7px 46px}#mec_bfixed_form_fields span.mec_bfixed_field_type,#mec_bfixed_form_fields span.mec_event_field_type,#mec_event_form_fields span.mec_event_field_type,#mec_orgz_form_row span.mec_orgz_item_name,#mec_reg_form_fields span.mec_reg_field_type{font-size:12px;font-weight:600;color:#07bbe9;text-transform:capitalize;letter-spacing:.3px;padding-left:20px}#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button,#mec_bfixed_form_fields span.mec_bfixed_field_option_sort,#mec_bfixed_form_fields span.mec_bfixed_field_remove,#mec_bfixed_form_fields span.mec_bfixed_field_sort,#mec_event_form_fields span.mec_event_field_option_sort,#mec_event_form_fields span.mec_event_field_remove,#mec_event_form_fields span.mec_event_field_sort,#mec_orgz_form_row span.mec-additional-organizer-remove,#mec_orgz_form_row span.mec-additional-organizer-sort,#mec_reg_form_fields span.mec_reg_field_option_sort,#mec_reg_form_fields span.mec_reg_field_remove,#mec_reg_form_fields span.mec_reg_field_sort{font-size:0;color:#fff}#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button,#mec_bfixed_form_fields span.mec_bfixed_field_remove,#mec_event_form_fields span.mec_event_field_remove,#mec_orgz_form_row span.mec-additional-organizer-remove,#mec_reg_form_fields span.mec_reg_field_remove{position:absolute;right:0;top:0;background:#fff}#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before,#mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before,#mec_bfixed_form_fields span.mec_bfixed_field_remove:before,#mec_bfixed_form_fields span.mec_bfixed_field_sort:before,#mec_event_form_fields span.mec_event_field_option_sort:before,#mec_event_form_fields span.mec_event_field_remove:before,#mec_event_form_fields span.mec_event_field_sort:before,#mec_orgz_form_row span.mec-additional-organizer-remove:before,#mec_orgz_form_row span.mec-additional-organizer-sort:before,#mec_reg_form_fields span.mec_reg_field_option_sort:before,#mec_reg_form_fields span.mec_reg_field_remove:before,#mec_reg_form_fields span.mec_reg_field_sort:before{position:absolute;left:20px;top:23px;width:20px;height:20px;display:block;cursor:move;font-family:simple-line-icons;content:"\e023";font-size:15px;color:#07bbe9}#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before{font-weight:400}#mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before,#mec_bfixed_form_fields span.mec_bfixed_field_remove:before,#mec_event_form_fields span.mec_event_field_remove:before,#mec_orgz_form_row span.mec-additional-organizer-remove:before,#mec_reg_form_fields span.mec_reg_field_remove:before{content:"\e082";width:20px;height:20px;left:auto;right:15px;color:#f96666;cursor:pointer;font-size:18px}#mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before,#mec_event_form_fields span.mec_event_field_option_sort:before,#mec_reg_form_fields span.mec_reg_field_option_sort:before{font-size:13px;left:15px;top:25px;width:15px;height:15px}#mec_bfixed_form_fields p.mec_bfixed_field_options,#mec_event_form_fields p.mec_event_field_options,#mec_reg_form_fields p.mec_reg_field_options{margin:12px 0 8px}#mec_bfixed_form_fields input[type=number],#mec_bfixed_form_fields input[type=text],#mec_bfixed_form_fields select,#mec_bfixed_form_fields textarea,#mec_event_form_fields input[type=number],#mec_event_form_fields input[type=text],#mec_event_form_fields select,#mec_event_form_fields textarea,#mec_reg_form_fields input[type=number],#mec_reg_form_fields input[type=text],#mec_reg_form_fields select,#mec_reg_form_fields textarea{min-width:260px;min-height:34px;margin-bottom:7px;margin-top:7px}#mec_bfixed_form_fields textarea,#mec_event_form_fields textarea,#mec_reg_form_fields textarea{min-height:66px}#mec_bfixed_form_field_types button,#mec_bfixed_form_fields button,#mec_event_form_field_types button,#mec_event_form_fields button,#mec_reg_form_field_types button,#mec_reg_form_fields button{position:relative;outline:0;background:#fff;border:1px solid #e6e9eb;border-radius:50px;padding:9px 21px 10px 31px;line-height:1;font-size:12px;font-weight:600;color:#07bbe9;letter-spacing:.4px;height:auto;cursor:pointer;margin-top:5px;text-transform:capitalize;box-shadow:0 0 3px rgba(0,0,0,.03)}#mec_bfixed_form_field_types button:hover,#mec_bfixed_form_fields button:hover,#mec_event_form_field_types button:hover,#mec_event_form_fields button:hover,#mec_reg_form_field_types button:hover,#mec_reg_form_fields button:hover{border-color:#07bbe9;box-shadow:0 0 7px rgba(0,0,0,.1)}#mec_bfixed_form_field_types button:before,#mec_bfixed_form_fields button:before,#mec_event_form_field_types button:before,#mec_event_form_fields button:before,#mec_reg_form_field_types button:before,#mec_reg_form_fields button:before{position:absolute;left:10px;color:#07bbe9;content:"\e095";font-family:simple-line-icons;font-size:13px;display:inline-block;top:9px}#mec_bfixed_form_field_types button.red:hover,#mec_bfixed_form_fields button.red:hover,#mec_event_form_field_types button.red:hover,#mec_event_form_fields button.red:hover,#mec_reg_form_field_types button.red:hover,#mec_reg_form_fields button.red:hover{border-color:#ea6485;box-shadow:0 0 7px rgba(0,0,0,.1)}#mec_bfixed_form_field_types button.red:before,#mec_bfixed_form_fields button.red:before,#mec_event_form_field_types button.red:before,#mec_event_form_fields button.red:before,#mec_reg_form_field_types button.red:before,#mec_reg_form_fields button.red:before{position:absolute;left:12px;color:#ea6485;content:"\e095";font-family:simple-line-icons;font-size:13px;display:inline-block}#mec_bfixed_form_fields .mec_bfixed_notification_placeholder,#mec_event_form_fields .mec_event_notification_placeholder,.mec_form_fields .notification_placeholder{padding:2px;display:block;margin:10px 0 20px}@media (max-width:768px){#mec_bfixed_form_fields input[type=number],#mec_bfixed_form_fields input[type=text],#mec_bfixed_form_fields select,#mec_bfixed_form_fields textarea,#mec_event_form_fields input[type=number],#mec_event_form_fields input[type=text],#mec_event_form_fields select,#mec_event_form_fields textarea,#mec_reg_form_fields input[type=number],#mec_reg_form_fields input[type=text],#mec_reg_form_fields select,#mec_reg_form_fields textarea{min-width:80px;width:100%}}.mec-form-row{padding:5px 5px 35px}.wns-be-main .mec-form-row{padding:0 5px 20px;width:100%;clear:both;min-height:50px;box-sizing:border-box}#taxes_option #mec_fees_list .mec-form-row,#ticket_variations_option #mec_ticket_variations_list .mec-form-row{padding:10px}.post-type-mec-events .mec-form-row{padding:0 0 20px 0}.mec-form-row .mec-col-3{margin:0;padding-right:10px}.mec-form-row label.mec-col-3{cursor:default}.wns-be-main .mec-form-row .mec-col-3:not([name*="mec[settings][tickets]"]):not([for*=mec_tickets_unlimited]){min-width:290px;padding:1px 0 0;margin:0}.wns-be-main .mec-form-row .mec-col-9{width:calc(100% - 290px);float:right}.mec-form-row .mec-col-9 .mec-box{position:relative;border:1px solid #e6e9eb;padding:20px;margin:0;background:#fff;max-width:80%;border-radius:8px;box-shadow:0 1px 3px rgb(0 0 0 / 1%)}.mec-form-row .mec-col-9 .mec-box label{display:block;padding:20px 20px 4px}.mec-form-row .mec-col-9 .mec-box .mec-tooltip{position:absolute;display:block;width:fit-content;left:auto;right:20px;bottom:20px}#booking_option .mec-form-row .mec-col-8{margin:0}.mec-options-fields{padding-top:25px;overflow:hidden;animation:fadeEffect .31s;min-height:450px}#mec_booking_form .mec-options-fields,#mec_integrations_form .mec-options-fields,#mec_modules_form .mec-options-fields,#mec_notifications_form .mec-options-fields,#mec_settings_form .mec-options-fields,#mec_single_form .mec-options-fields{display:none}.mec-options-fields.active{display:block!important}@keyframes fadeEffect{from{opacity:0;margin-left:12px}to{opacity:1;margin-left:0}}.mec-form-row:after,.mec-form-row:before{content:" ";display:table}.mec-form-row:after{clear:both}.mec-form-row input[type=number],.mec-form-row input[type=text],.mec-form-row input[type=url],.mec-form-row select,.mec-form-row textarea{height:38px;box-sizing:border-box;margin-bottom:8px;padding:0 6px;box-shadow:none;border-radius:2px;box-shadow:inset 0 1px 5px rgba(0,0,0,.05);margin:0 1% 0 0}#mec-notifications .mec-form-row .mec-form-row input[type=text],#mec-notifications .mec-form-row .mec-form-row input[type=url],#mec-notifications .mec-form-row .mec-form-row select,#mec-notifications .mec-form-row .mec-form-row textarea,#mec-notifications .mec-form-row input[type=number]{width:100%;max-width:290px}#mec_location_new_container .mec-form-row input[type=text],#mec_organizer_new_container .mec-form-row input[type=text],#mec_sponsor_new_container .mec-form-row input[type=text]{min-width:200px}#mec-notifications .mec-form-row .mec-form-row textarea{max-width:100%}.wns-be-main .mec-form-row input[type=number]:not([name*="mec[settings][tickets]"]),.wns-be-main .mec-form-row input[type=password]:not([name*="mec[settings][tickets]"]),.wns-be-main .mec-form-row input[type=text]:not([name*="mec[settings][tickets]"]),.wns-be-main .mec-form-row input[type=url]:not([name*="mec[settings][tickets]"]),.wns-be-main .mec-form-row select:not([name*="mec[settings][tickets]"]),.wns-be-main .mec-form-row textarea:not([name*="mec[settings][tickets]"]){width:100%;max-width:290px;margin-left:-1px;margin-right:-1px;margin-bottom:0}.wns-be-main .mec-form-row textarea:not([name*="mec[settings][tickets]"]){max-width:unset}.wns-be-main .mec-form-row .wp-editor-area{max-width:100%;background:#fff;margin:0}#mec_bfixed_form_fields input[type=number],#mec_bfixed_form_fields input[type=text],#mec_bfixed_form_fields select,#mec_bfixed_form_fields textarea,#mec_event_form_fields input[type=number],#mec_event_form_fields input[type=text],#mec_event_form_fields select,#mec_event_form_fields textarea,#mec_reg_form_fields input[type=number],#mec_reg_form_fields input[type=text],#mec_reg_form_fields select,#mec_reg_form_fields textarea,.wns-be-main .mec-form-row input[type=email],.wns-be-main .mec-form-row input[type=number],.wns-be-main .mec-form-row input[type=password],.wns-be-main .mec-form-row input[type=search],.wns-be-main .mec-form-row input[type=text],.wns-be-main .mec-form-row input[type=url],.wns-be-main .mec-form-row select{border-radius:5px;min-height:38px;border:none;background-color:#f7f8f9;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%);margin-bottom:15px!important}.select2-container--default .select2-selection--multiple,.select2-container--default.select2-container--focus .select2-selection--multiple{border-radius:5px;min-height:38px;border:none;background-color:#f7f8f9;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}.select2-container--default .select2-selection--multiple .select2-selection__rendered{padding:5px 0;min-height:28px;display:inline-block;margin:0}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{line-height:1.2}.select2-container .select2-search--inline .select2-search__field{min-height:unset;margin:0;height:39px}.select2-container--default .select2-selection--multiple input[type=search]{border-radius:unset;min-height:2;border:none;background-color:transparent;box-shadow:none;margin:0!important}.select2-container--default .select2-selection--multiple{line-height:17px}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{margin-bottom:0}.post-type-mec-events .mec-add-event-tabs-wrap .select2-container,.post-type-mec-events .mec-create-shortcode-tab-content .select2-container,.wns-be-main .mec-form-row .mec-create-shortcode-tab-content .select2-container{border:none;background-color:#f7f8f9;border-radius:5px;line-height:38px;padding-left:10px;min-height:38px;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}.mec-add-event-tabs-wrap .select2-container .select2-selection--multiple,.mec-create-shortcode-tab-content .select2-container .select2-selection--multiple,.wns-be-main .mec-form-row .select2-container .select2-selection--multiple{min-height:38px;padding:0;border:none;box-shadow:none;background:0 0;border:none!important;box-shadow:none!important}.post-type-mec-events .select2-dropdown,.wns-be-main .mec-form-row .select2-dropdown{border:1px solid #ddd!important}.post-type-mec-events .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:0}.wns-be-main .mec-form-row input[type=search]{line-height:2!important}.wns-be-main .mec-form-row .select2-container{width:100%!important;max-width:290px!important}.wns-be-main #mec_messages_form_container input[type=text]{max-width:100%}.mec-form-row input[type=radio]{margin:0 6px 0 0}.mec-form-row select{margin-top:0}.mec-form-row select{min-width:80px}.cancellation-period-box{max-width:290px}.mec-form-row .cancellation-period-box input[type=number]{width:48%}.mec-form-row .cancellation-period-box input[type=number]:first-child{margin-right:calc(2% + 4px)}#mec_meta_box_repeat_form .mec-form-row select{min-width:65px}.ui-datepicker select{min-width:60px}#mec_styles_CSS{max-width:100%}.mec-book-status-form select{display:block;width:99%;margin-top:10px;margin-bottom:10px}.mec-form-row label{vertical-align:top;text-align:left;margin-top:0;margin-bottom:0;line-height:38px;font-weight:600;padding:0!important;display:inline-block}.mec-form-row input[type=checkbox]+label{padding-top:1px}.mec-meta-box-labels-container .mec-form-row label{padding-top:0;line-height:2.1}#mec_reg_form_fields label,#mec_reg_form_fields p.description{display:block}.mec-form-row label.mec-col-2,.mec-form-row label.mec-col-4{padding-top:10px}#mec-event-data .mec-form-row label{display:block}#mec_bfixed_form_fields input[type=checkbox],#mec_reg_form_fields input[type=checkbox],.mec-form-row input[type=checkbox]{width:22px;height:22px;min-height:0;background:#f7f8f9;border:none;margin:-1px 5px 0 0;vertical-align:middle;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}#mec_bfixed_form_fields input[type=checkbox]:checked,#mec_reg_form_fields input[type=checkbox]:checked,.mec-form-row input[type=checkbox]:checked{background:#64e385;border-color:#64e385}#mec_bfixed_form_fields input[type=checkbox]:checked:before,#mec_reg_form_fields input[type=checkbox]:checked:before,.mec-form-row input[type=checkbox]:checked:before{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNC42ODgiIHZpZXdCb3g9IjAgMCAyMCAxNC42ODgiPg0KICA8ZyBpZD0idGlja18xXyIgZGF0YS1uYW1lPSJ0aWNrICgxKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk4KSI+DQogICAgPGcgaWQ9Ikdyb3VwXzEiIGRhdGEtbmFtZT0iR3JvdXAgMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA2Ny45OTcpIj4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMTkuNzA3LDY4LjI5YTEsMSwwLDAsMC0xLjQxNCwwTDYuMzEyLDgwLjI3MSwxLjcwNyw3NS42NjZBMSwxLDAsMCwwLC4yOTIsNzcuMDhMNS42LDgyLjM5MmExLDEsMCwwLDAsMS40MTQsMEwxOS43MDcsNjkuN0ExLDEsMCwwLDAsMTkuNzA3LDY4LjI5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk3KSIgZmlsbD0iI2ZmZiIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+DQo=");line-height:22px;width:15px;float:none;margin:0}.post-type-mec-events #mec_metabox_label input[type=checkbox],.post-type-mec-events .components-panel__body input[type=checkbox]{border-radius:4px;box-shadow:inset 0 1px 2px rgb(0 0 0 / 10%)}.post-type-mec-events #mec_metabox_label input[type=checkbox]:focus,.post-type-mec-events .components-panel__body input[type=checkbox]:focus{outline:unset;box-shadow:unset}.post-type-mec-events #mec_metabox_label input[type=checkbox]+label,.post-type-mec-events .components-panel__body input[type=checkbox]+label{padding-top:1px}.post-type-mec-events #mec_metabox_label input[type=checkbox],.post-type-mec-events .components-panel__body input[type=checkbox]{width:22px;height:22px;min-height:0;background:#f7f8f9;border:none;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}.post-type-mec-events #mec_metabox_label input[type=checkbox]:checked,.post-type-mec-events .components-panel__body input[type=checkbox]:checked{background:#64e385;border-color:#64e385;color:#64e385}.post-type-mec-events #mec_metabox_label input[type=checkbox]:checked:before,.post-type-mec-events .components-panel__body input[type=checkbox]:checked:before{color:#64e385;line-height:16px;width:15px;float:none;margin:2px}#mec_settings_fes_thankyou_page_url,.mec-form-row .mec-col-4 input[type=number],.mec-form-row .mec-col-4 input[type=text],.mec-form-row .mec-col-4 select,.mec-form-row .mec-col-4 textarea{width:82%!important;max-width:290px}#mec_calendar_display_options .mec-col-4 input{margin-left:20px!important;width:80%}.mec-form-row .description{display:inline-block;border-left:1px dashed #ccc;line-height:32px;padding-left:12px;margin-top:5px;color:#555}.mec-form-row .description code{font-style:normal}.mec-form-row .time-dv{font-size:14px;font-weight:700;margin-right:1%;line-height:38px}.mec-meta-box-fields{margin:30px 10px}.mec-meta-box-fields>.mec-meta-box-fields{margin-left:0}.mec-meta-box-fields .mec-title{margin:5px 0}.mec-meta-box-fields h4.mec-title{margin:40px 0 16px}.post-type-mec-events h4,.post-type-mec-events h5,.post-type-mec_calendars .mec-meta-box-fields h3{text-transform:capitalize;border-bottom:1px solid #e5e5e5;padding-bottom:6px;margin:40px 0 16px;font-size:15px;font-weight:600}.mec-meta-box-fields .mec-dashicons{font-size:20px;line-height:22px;color:#07bbe9}#mec_tickets .mec-box,.mec-form-row .mec-box,.mec-meta-box-fields .mec-box{background:#fff;padding:20px 10px 10px;margin:10px 0;border-radius:8px;border:1px solid #e6e9eb;box-shadow:0 1px 4px -1px rgb(0 0 0 / 1%)}.meta-box-sortables .mec-meta-box-fields .mec-box{padding:15px}.mec-form-row .mec-box{max-width:960px}.mec-form-row .mec-box .button,.mec-meta-box-fields .mec-box .button:not(.mec_add_price_date_button){float:right}#mec_gateways_form .mec-form-row:first-child,#mec_notifications_form_container .mec-form-row:nth-child(2){overflow:hidden}#mec_gateways_form .mec-tooltip{float:right}.mec-container{background:#fff;padding:15px 0 15px 15px}#mec_booking_form .mec-container,#mec_single_form .mec-container{padding:0}.nav-tab-active{background:#fff;border-bottom:1px solid #fff}#mec_social_networks .mec-form-row{margin-bottom:0}#mec_styles_form #mec_styles_CSS{height:200px;margin-bottom:5px;font-family:Consolas,Monaco,monospace;font-size:13px;width:97%;background:#f9f9f9;outline:0}#mec_calendar_filter .description{max-width:500px;display:block;margin:0 0 5px 0;padding:0;border:none;clear:both}#mec_calendar_display_options #mec-all-month>div{display:inline-block;min-width:120px}.mec-sed-methods li a{text-decoration:unset}.mec-sed-methods li{display:inline-block;padding:8px 12px;border:1px solid #ddd;margin:0 5px 5px 0;cursor:pointer;border-radius:3px;box-shadow:0 2px 15px -2px rgba(0,0,0,.1)}.mec-sed-methods li a:hover,.mec-sed-methods li:hover{border-color:#07bbe9;color:#07bbe9}.mec-sed-methods li.active,.mec-sed-methods li.active a{border-color:#07bbe9;background-color:#ecf9fd;color:#07bbe9;font-weight:600;cursor:default;box-shadow:none}.meta-box-sortables .mec-switcher input+label{max-width:52px;width:52px;height:30px;margin:4px 0}.meta-box-sortables .mec-switcher input+label:after,.meta-box-sortables .mec-switcher input+label:before{top:0;left:0;bottom:0;right:0}.meta-box-sortables .mec-switcher input+label:after{width:24px;height:24px}.meta-box-sortables .mec-switcher input:checked+label:before{box-shadow:2px 2px 12px -2px #4fdc73 inset;background:#64e385;border-color:#64e385}.meta-box-sortables .mec-switcher input:checked+label:after{margin-left:24px}.mec-switcher input:checked+label:after{margin-left:16px}#mec_gateways_form input[type=text],#mec_gateways_form select,#mec_gateways_form textarea{width:calc(100% - 30px)}#mec_gateways_form textarea{min-height:65px}#mec_gateways_form li .mec-gateway-options-form,#payment_gateways_option li .mec-gateway-options-form{padding:35px 10px 5px 10px;background-color:#fff;border:1px solid #e6e9eb;border-left:6px solid #e6e9eb;margin-bottom:40px;margin-top:-5px;border-top-right-radius:4px;border-bottom-right-radius:4px;box-shadow:0 1px 4px -1px rgba(0,0,0,.05)}#payment_gateways_option #mec_gateways6_container_toggle.mec-gateway-options-form{padding:10px 10px 10px 17px}#payment_gateways_option #mec_gateways6_container_toggle.mec-gateway-options-form p{border-radius:4px;max-width:90%}#mec_gateways_form_container .mec-form-row input[type=number],#mec_gateways_form_container .mec-form-row select{width:100%}div#mec_gateways_form_container .mec-required.mec-mandatory{border:1px solid red}#mec_payment_options_wrapper .mec-form-row .mec-col-4 select{margin-top:0}#mec_payment_options_wrapper .mec-col-9 .mec-form-row{padding-bottom:0}#mec_payment_options_wrapper .mec-col-9 .mec-form-row .mec-col-4{width:103px;margin-left:-5px}#booking_notification_section label{display:inline-block;min-width:160px}div#booking_notification_section iframe{height:300px!important}@media (max-width:536px){#booking_notification_section input[type=text],#booking_notification_section select{min-width:100%}}#booking_notification_section ul li:last-child .wp-editor-container{margin-bottom:0}#mec_messages_form_container ul li label{display:block;font-weight:400}#mec_messages_form_container ul li input{display:block;width:100%}.mec-message-categories li.mec-acc-label{font-size:15px;font-weight:400;padding:0 30px;cursor:pointer;background-color:#fff;border:none;border-bottom:1px solid #e6e6e6;margin:0;letter-spacing:.2px;position:relative}.mec-message-categories li.mec-acc-label .mec-acc-cat-name{line-height:65px;font-size:17px;transition:all .2s ease}.mec-message-categories li.mec-acc-label .mec-acc-cat-name:hover{color:#07bbe9}.mec-message-categories ul{margin:15px 5px}.webnus-icons-list li{width:40px;display:inline-block;list-style:none;padding:0}.webnus-icons-list input{visibility:hidden;margin:0;padding:0;width:1px;height:1px;-moz-opacity:0;-khtml-opacity:0;opacity:0;cursor:pointer}.webnus-icons-list li label{color:#777;display:inline-block!important;float:none!important;width:33px!important;text-align:center;font-size:23px!important;font-weight:400!important;padding:5px 0!important;border:1px solid #eee!important}.mec-webnus-icon{float:left;margin-right:10px}.mec-webnus-icon i{font-size:24px;color:#222}.mec-accordion ul{display:none}.mec-switcher input{position:absolute;margin-left:-9999px;visibility:hidden}.mec-switcher input+label{display:inline-block;position:relative;cursor:pointer;outline:0;padding:2px;width:50px;height:22px;background-color:#e5e9ee;border-radius:60px}.mec-switcher input+label{max-width:52px;width:52px;height:30px;margin:4px 0}.mec-switcher input+label:after,.mec-switcher input+label:before{display:block;position:absolute;top:0;left:0;bottom:0;content:""}.mec-switcher input+label:before{right:1px;background-color:#f1f1f1;border-radius:60px;transition:background .4s}.mec-switcher input+label:after{width:24px;background-color:#fff;border-radius:100%;transition:margin .4s;border:1px solid transparent;box-shadow:0 0 5px rgb(0 0 0 / 4%)}.mec-switcher input+label:after{margin-top:2px;margin-left:2px;width:24px;height:24px}.wns-be-group-tab .mec-switcher input[value="1"]+label,.wns-be-group-tab .mec-switcher input[value="1"]+label:before{box-shadow:2px 2px 12px -2px #4fdc73 inset;position:relative;background:#64e385;border-color:#64e385}.wns-be-group-tab .mec-switcher input+label:before{right:1px;background-color:#f1f1f1;border-radius:60px;transition:background .4s}.wns-be-group-tab .mec-switcher input[value="1"]+label:after{margin-left:24px}.mec-switcher label{display:block}.mec-sed-methods li{display:inline-block;padding:10px;border:1px solid #ddd;margin:0 5px 5px 0;cursor:pointer}#wpwrap .mec-button-primary{border-bottom:none;letter-spacing:.5px;line-height:18px;height:46px;transition:all .5s ease;color:#fff;padding:12px 25px;display:block;text-align:center;font-size:14px;background:0 0;background-color:#008aff;text-shadow:none;border:0;box-shadow:none;display:inline-block;margin:25px 0 12px;min-width:146px}#wpwrap .mec-button-primary:hover{background-color:#41c9de}#wpwrap .mec-button-primary.loading{background-color:#73c02a}#wpwrap .mec-button-primary:before{content:"\f00c";font-family:fontawesome;margin-right:4px;font-size:16px;display:none}#wpwrap .mec-button-primary.loading:before{display:inline-block}.mec-image-select-wrap{clear:both;overflow:hidden;padding:10px 0;margin:0}.mec-image-select-wrap li{float:left;display:block;margin-right:5px;margin-bottom:0}.mec-image-select-wrap li input[type=radio]{display:none}.mec-form-row .mec-image-select-wrap li label{padding:5px 0 0;display:block}@media (max-width:1280px){.mec-image-select-wrap li{margin-right:20px}}@media (max-width:480px){.mec-image-select-wrap li{margin-right:18px}}.mec-image-select-wrap li input{display:none}.mec-image-select-wrap li span{width:35px;height:35px;display:block;margin:3px;border-radius:2px;border:3px solid transparent;transition:all .2s ease}.mec-image-select-wrap li input:checked+span{border-color:#fff;box-shadow:0 0 14px rgba(0,0,0,.25)}.mec-image-select-wrap li input:checked+span:after{content:"\e080";font-family:simple-line-icons;font-size:18px;line-height:18px;display:inline-block;color:#fff;padding:8px 9px;max-width:100%;max-height:100%;font-weight:400}.m-e-calendar_page_MEC-ix #wpwrap .mec-button-primary.mec-btn-2{margin:0 0 0 12px}.m-e-calendar_page_MEC-ix #wpwrap input[type=file]{padding-top:12px;padding-bottom:12px}.m-e-calendar_page_MEC-ix #wpwrap .mec-form-row select{min-height:46px}.mec-image-select-wrap .mec-colorskin-1{background-color:#40d9f1}.mec-image-select-wrap .mec-colorskin-2{background-color:#0093d0}.mec-image-select-wrap .mec-colorskin-3{background-color:#e53f51}.mec-image-select-wrap .mec-colorskin-4{background-color:#f1c40f}.mec-image-select-wrap .mec-colorskin-5{background-color:#e64883}.mec-image-select-wrap .mec-colorskin-6{background-color:#45ab48}.mec-image-select-wrap .mec-colorskin-7{background-color:#9661ab}.mec-image-select-wrap .mec-colorskin-8{background-color:#0aad80}.mec-image-select-wrap .mec-colorskin-9{background-color:#0ab1f0}.mec-image-select-wrap .mec-colorskin-10{background-color:#ff5a00}.mec-image-select-wrap .mec-colorskin-11{background-color:#c3512f}.mec-image-select-wrap .mec-colorskin-12{background-color:#55606e}.mec-image-select-wrap .mec-colorskin-13{background-color:#fe8178}.mec-image-select-wrap .mec-colorskin-14{background-color:#7c6853}.mec-image-select-wrap .mec-colorskin-15{background-color:#bed431}.mec-image-select-wrap .mec-colorskin-16{background-color:#2d5c88}.mec-image-select-wrap .mec-colorskin-17{background-color:#77da55}.mec-image-select-wrap .mec-colorskin-18{background-color:#2997ab}.mec-image-select-wrap .mec-colorskin-19{background-color:#734854}.mec-image-select-wrap .mec-colorskin-20{background-color:#a81010}.mec-image-select-wrap .mec-colorskin-21{background-color:#4ccfad}.mec-image-select-wrap .mec-colorskin-22{background-color:#3a609f}.mec-image-select-wrap .mec-colorskin-23{background-color:#333}.mec-image-select-wrap .mec-colorskin-24{background-color:#d2d2d2}.mec-image-select-wrap .mec-colorskin-25{background-color:#636363}@media screen and (max-width:782px){.mec-form-row .description{max-width:500px;display:block;margin:0 0 5px 0;padding:0;border:none}.mec-col-1,.mec-col-10,.mec-col-11,.mec-col-12,.mec-col-2,.mec-col-3,.mec-col-4,.mec-col-5,.mec-col-6,.mec-col-7,.mec-col-8,.mec-col-9{margin-bottom:5px;display:block}.mec-form-row .mec-box .button,.mec-meta-box-fields .mec-box .button{float:left}.mec-form-row .time-dv{padding:0 4px}.mec-form-row .mec-col-4 input[type=text],.mec-form-row .mec-col-4 select{width:auto;min-width:192px}.mec-tooltip .dashicons-before:before{font-size:32px}}#frmb-0-clear-all,#frmb-0-save,#frmb-0-view-data{display:none}#mec_sn_googlecal{margin-bottom:0}#mec_fee_row1 .button{margin-right:10px}h4.mec-form-subtitle{font-size:15px;margin-top:0}h5.mec-form-second-title{font-size:15px;margin-top:0}#webnus-dashboard *{box-sizing:border-box}#webnus-dashboard.about-wrap{max-width:1040px;margin:25px auto 20px}@media (max-width:1280px){#webnus-dashboard.about-wrap{max-width:1024px}}#webnus-dashboard .change-log{word-wrap:break-word}#webnus-dashboard .welcome-head img{background:#fff;padding:15px;border-radius:8px 8px 0 0;width:216px;margin:0 0 0 auto;display:block;border:1px solid #e3e5e7;border-bottom:none}.w-welcome{position:relative;margin-top:30px;margin-bottom:10px;font-size:19px}.w-box{position:relative;background:#fff;padding:5px 25px;margin-top:30px}.w-theme-version{box-shadow:0 2px 5px -5px #00000021;text-shadow:none;background:#f7f8f9;text-align:center;display:block;padding:10px 0;color:#8e9596;font-size:12px;font-weight:400;margin-top:0;border-radius:0 0 8px 8px;font-family:monospace;width:216px;margin:0 0 0 auto;border:1px solid #e3e5e7;border-top:none}.w-box{padding:0;min-height:310px;box-shadow:none;border-radius:15px;border:1px solid #e3e5e7}.w-box.upcoming-events .mec-load-more-wrap{display:none}.w-box.print-events{min-height:134px}.w-box.gateways{max-height:390px}.w-box.gateways canvas{max-height:280px!important}.w-box-head{font-weight:600;padding:20px 72px;position:relative;border-bottom:2px solid #ccecf4;font-size:20px}.w-box-head span{position:absolute;left:0;padding:0 25px;line-height:58px;background:#008aff;height:100%;top:0;color:#fff}.w-box-child,.w-box-content{padding:20px 30px 30px;line-height:24px;font-size:14px}.mec-count-child{width:50%;margin:0 auto;color:#01c6d9}#webnus-dashboard .w-button a{color:#fff!important;border-radius:0;padding:10px 24px;font-size:12px;letter-spacing:1px;font-weight:600;background:#008aff;margin:10px 0;display:inline-block;text-transform:uppercase}#webnus-dashboard .w-box .w-button a:hover{background:#222;background:linear-gradient(95deg,#555 0,#222 50%,#000 100%);box-shadow:0 5px 21px -5px rgba(0,0,0,.5)}.w-system-info{margin-bottom:7px}.w-system-info:first-child{margin-top:20px}.w-system-info>span{display:inline-block;min-width:145px;line-height:20px;font-size:13px}#webnus-dashboard .w-current{min-width:110px}#webnus-dashboard .w-min{min-width:65px}.w-icon{color:#fff;padding:3px;border-radius:4px;margin-right:10px;vertical-align:middle}.w-icon-green{background:#27ae60}.w-icon-red{background:#e74c3c}.extra .w-box-head{padding:30px 30px 10px;border-bottom:1px solid #fff;border-radius:11px 11px 0 0}.doc .w-box-head{color:#4cbf67}#webnus-dashboard .doc .w-button a{background:#4cbf67;background:linear-gradient(95deg,#6fe08a 0,#58cf74 50%,#36cb58 100%);margin:35px 0 17px;box-shadow:0 5px 10px -5px #4cbf67;background-color:#fff}#webnus-dashboard .support .w-button a{background:#ff876c;background:linear-gradient(95deg,#ff876c 0,#ff7455 50%,#ff5a35 100%);margin:13px 0 18px;box-shadow:0 5px 10px -5px #ff876c}.doc .w-box-content{background:url(../img/document.png) no-repeat right center}.doc .w-box-content p,.w-box.support .w-box-content p{width:54%;color:#666;margin-top:10px;max-width:380px}.w-box-child p{color:#666;margin-top:10px}.w-box.support{background:#fff url(../img/support.png) no-repeat top right}.w-box.support .w-box-head{width:50%;color:#ff876c}.w-box-content pre{text-align:left;background:#f5f6f7;font-size:13px;padding:20px 25px;height:480px;overflow-y:scroll;white-space:break-spaces;border-radius:11px;font-family:monospace;margin:0 0 10px}#webnus-dashboard .button:not(.mec-intro-section-link-tag){border:0;background:0 0;box-shadow:none;color:#e74c3c;font-weight:700}.w-box .state{position:absolute;top:0;left:-100vw}#webnus-dashboard .button:hover{color:#222}.w-box .state:checked~.content{-webkit-transform:none;-ms-transform:none;transform:none}.w-box .state:checked~.backdrop{bottom:0;opacity:1;z-index:1}.w-box .lightbox{position:fixed;top:0;right:0;left:0;height:0;padding:0 20px}.w-box .lightbox .content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow:hidden;position:relative;z-index:2;max-width:500px;max-height:95vh;margin:20px auto;padding:20px;background:#fff;-webkit-transform:translateY(-200%);-ms-transform:translateY(-200%);transform:translateY(-200%);-webkit-transition:.3s -webkit-transform ease-in-out;transition:.3s transform ease-in-out;border:1px solid rgba(0,0,0,.1)}.w-box .lightbox .main{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.w-box .lightbox .backdrop{position:fixed;z-index:-1;top:0;right:0;bottom:100%;left:0;opacity:0;background:rgba(0,0,0,.3);-webkit-transition:.3s opacity ease-in-out;transition:.3s opacity ease-in-out}.content .main p{color:#bf3737}p.mec_dash_count{font-size:60px;font-weight:100;margin:0;color:#38d5ed}.w-col-sm-3 .w-box.doc{text-align:center;min-height:auto}.w-Knowledgebase{color:#8e5cea}.mec-view-all-articles a{margin:30px 0 17px;display:inline-block;color:#fff!important;border-radius:0;padding:10px 24px;font-size:12px;letter-spacing:1px;font-weight:600;background:#8e5cea;display:inline-block;text-transform:uppercase;transition:all .24s ease;-webkit-transition:all .24s ease}.mec-view-all-articles a:hover{background-color:#222}.w-box.upcoming-events .mec-event-article{margin-bottom:15px;padding-bottom:10px}.w-box.upcoming-events .mec-event-article .mec-event-label-captions{padding:2px 5px;border-radius:3px;color:#fff;font-size:.86em}.w-box.upcoming-events .mec-event-article .mec-event-date{font-size:13px;background-color:#38d5ed;color:#fff;text-align:center;border-radius:6px;width:50px;padding-bottom:2px;float:left;margin-right:10px;text-transform:uppercase;letter-spacing:1px;font-family:monospace}.w-box.upcoming-events .mec-event-article .mec-event-date:beforex{content:"\e075";font-family:simple-line-icons;font-size:18px;line-height:15px;color:#bdeaf1;float:left;margin-right:11px}.w-box.upcoming-events .mec-event-article .mec-event-date span{font-weight:700;border-radius:6px 6px 0 0;padding:3px 0 1px;font-size:18px;display:block;background:#61dcef;font-family:arial,sans-serif}.w-box.upcoming-events .mec-event-article .mec-event-date span.mec-multiple-dates{font-size:11px}.w-box.upcoming-events .mec-event-article h4.mec-event-title{margin:0;font-size:16px;line-height:28px}.w-box.upcoming-events .mec-event-article .mec-shortcode-virtual-badge,.w-box.upcoming-events .mec-event-article .mec-shortcode-zoom-badge{font-size:11px;line-height:1.62;background:#222;padding:2px 9px;border-radius:12px;color:#fff;margin:0 0 0 5px}.w-box.upcoming-events .mec-event-article .mec-shortcode-virtual-badge i,.w-box.upcoming-events .mec-event-article .mec-shortcode-zoom-badge i{padding:0 5px 0 0}#webnus-dashboard .w-box.upcoming-events .mec-event-article h4.mec-event-title a{color:#5f676b}#webnus-dashboard .w-box.upcoming-events .mec-event-article h4.mec-event-title a:hover{text-decoration:underline}.w-box.upcoming-events .mec-event-article .mec-event-detail{font-size:13px;color:#979899}.w-box.upcoming-events .mec-event-article .mec-detail-button{display:none}.w-box.total-bookings ul li{display:inline-block;background:#f3f4f5;margin-right:5px;border-radius:50px;padding:0 5px;transition:all .2s ease}.w-box.total-bookings ul li.selected{background:#fff;border:1px solid #e9e9e9}.w-box.total-bookings ul li a{padding:6px 12px;display:inline-block;border-radius:3px;text-transform:none;font-size:13px;letter-spacing:.4px;transition:all .1s ease;font-weight:600;text-decoration:none}.w-box.total-bookings ul li.active{background:#38d5ed}.w-box.total-bookings ul li:hover{background:#38d5ed}#webnus-dashboard .w-box.total-bookings ul li a{color:#000}#webnus-dashboard .w-box.total-bookings ul li.active a,#webnus-dashboard .w-box.total-bookings ul li:hover a{color:#fff}#webnus-dashboard .w-box.total-bookings ul li a:focus{box-shadow:unset;outline:unset;outline-offset:0}.info-msg,.mec-error,.mec-success,.warning-msg{margin:10px 0;padding:10px;border-radius:11px}.post-type-mec-events.taxonomy-mec_speaker .warning-msg p{color:#9f6000}.info-msg{color:#059;background-color:#bef}.info-msg-link{background:#fff;padding:4px 12px 6px;border-radius:3px;line-height:1;font-weight:600;color:#008aff}.mec-success{color:#270;background-color:#dff2bf}.warning-msg{color:#9f6000;background-color:#feefb3}.mec-error{color:#d8000c!important;background-color:#ffbaba}.w-row .fs-notifier.success.show.visible{font-size:12px!important}.w-row .fs-notifier.success.show.visible a{font-size:25px!important;margin-top:-3px}.mec-certain-day>div,.mec-select-deselect-actions li,.mec-xi-facebook-import-events .mec-select-deselect-actions li,.mec-xi-google-import-events .mec-select-deselect-actions li{display:inline-block;position:relative;outline:0;background:#fff;border:1px solid #e2e2e2;border-radius:50px;padding:11px 21px 11px 21px;line-height:1;font-size:11px;font-weight:600;color:#444;letter-spacing:2px;height:auto;cursor:pointer;margin-top:5px;text-transform:uppercase;box-shadow:0 0 3px rgba(0,0,0,.03)}#mec-exceptional-days .mec-certain-day>div,#mec_exceptions_in_days_container .mec-certain-day>div{padding:0 15px;margin:0 5px 10px 0}.mec-certain-day .mec-in-days-day,.mec-certain-day>div .mec-not-in-days-day{line-height:36px}.mec-certain-day>div:hover,.mec-select-deselect-actions li:hover,.mec-xi-facebook-import-events .mec-select-deselect-actions li:hover,.mec-xi-google-import-events .mec-select-deselect-actions li:hover{border-color:#07bbe9;box-shadow:0 0 7px rgba(0,0,0,.1)}.mec-not-in-days-remove{border:1px solid #ff4b64;border-radius:20px;padding:0 0 0 1px;color:#ff4b64;width:11px;height:12px;text-align:center;line-height:12px;display:inline-block;margin-right:-5px;margin-left:6px}.mec-xi-facebook-import-events .mec-success,.mec-xi-google-import-events .mec-success{width:460px}.mec-xi-facebook-import-events .mec-select-deselect-actions li,.mec-xi-google-import-events .mec-select-deselect-actions li{display:inline-block;cursor:pointer}.lity-content>div{overflow:auto}.mce-mec-mce-items{text-transform:capitalize!important}#mec_setting_contextual li{list-style:none!important;font-size:12px;margin:0;padding:6px}.mec-bbf-field-container{margin-bottom:10px}.mec-bbf-field-container label{display:block}.kc-components ul.kc-components-list li .cpicon.mec-kingcomposer-icon,.kc-element-icon .cpicon.mec-kingcomposer-icon{background:url(../img/ico-mec-vc.png) no-repeat center center;background-size:auto;background-repeat:no-repeat}.mec-archive-skinsm.mec-category-skins,.mec-carousel-archive-link,.mec-carousel-head-text,.mec-toggle-month-divider{display:none}span.mec-archive-skins,span.mec-category-skins{vertical-align:text-bottom}.mec-archive-skins input,.mec-archive-skins select,.mec-category-skins input,.mec-category-skins select{min-width:225px;vertical-align:baseline}#mec_settings_default_skin_archive,#mec_settings_default_skin_category{min-width:225px}.w-welcome p span{background:#fff;padding:4px 10px}#mec_masonry_skin_options_container .mec-form-row .description{margin-left:0;padding-left:0;border:none;margin-top:-4px}@media (max-width:1280px){span.mec-archive-skins,span.mec-category-skins{margin-left:0}}.mec-shortcode-virtual-badge i{padding:0 5px 0 7px}.mec-search-form-options-container input[type=text]{margin-top:10px}@media (min-width:760px) and (max-width:1280px){.mec-virtual-event-wrap .mec-form-row .mec-col-1,.mec-zoom-event-wrap .mec-form-row .mec-col-1{width:12%}.mec-virtual-event-wrap .mec-form-row .mec-col-4,.mec-virtual-event-wrap .mec-form-row .mec-col-6,.mec-zoom-event-wrap .mec-form-row .mec-col-4,.mec-zoom-event-wrap .mec-form-row .mec-col-6{width:40%}.mec-virtual-event-wrap .mec-form-row .mec-col-3,.mec-virtual-event-wrap .mec-form-row .mec-col-5,.mec-zoom-event-wrap .mec-form-row .mec-col-3,.mec-zoom-event-wrap .mec-form-row .mec-col-5{width:45%}.mec-virtual-event-wrap .mec-form-row .mec-col-2,.mec-zoom-event-wrap .mec-form-row .mec-col-2{width:21%}}#mec_zoom_checkall{background:#fff;border:1px solid #282828;border-radius:60px;padding:6px 32px 8px;margin:30px 0 0;cursor:pointer;display:block;transition:all .3s ease;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease}#mec_zoom_checkall:focus{box-shadow:inset;outline:0}#mec_zoom_checkall:hover{background:#282828;color:#fff}/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */#webnus-dashboard button,#webnus-dashboard input,#webnus-dashboard select,#webnus-dashboard textarea{font-family:inherit;font-size:inherit;line-height:inherit}#webnus-dashboard a{color:#337ab7;text-decoration:none}#webnus-dashboard a:focus,#webnus-dashboard a:hover{color:#23527c}#webnus-dashboard a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}#webnus-dashboard figure{margin:0}#webnus-dashboard img{vertical-align:middle}.w-img-responsive{display:block;max-width:100%;height:auto}.w-img-rounded{border-radius:6px}.w-img-thumbnail{padding:4px;line-height:1w-42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all 0w-2s ease-in-out;-o-transition:all 0w-2s ease-in-out;transition:all 0w-2s ease-in-out;display:inline-block;max-width:100%;height:auto}.w-img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.w-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.w-sr-only-focusable:active,.w-sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.w-container,.w-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}[role=button]{cursor:pointer}@media (min-width:768px){.w-container{width:750px}}@media (min-width:992px){.w-container{width:970px}}@media (min-width:1200px){.w-container{width:1170px}}.w-row{margin-left:-15px;margin-right:-15px}.w-col-lg-1,.w-col-lg-10,.w-col-lg-11,.w-col-lg-12,.w-col-lg-2,.w-col-lg-3,.w-col-lg-4,.w-col-lg-5,.w-col-lg-6,.w-col-lg-7,.w-col-lg-8,.w-col-lg-9,.w-col-md-1,.w-col-md-10,.w-col-md-11,.w-col-md-12,.w-col-md-2,.w-col-md-3,.w-col-md-4,.w-col-md-5,.w-col-md-6,.w-col-md-7,.w-col-md-8,.w-col-md-9,.w-col-sm-1,.w-col-sm-10,.w-col-sm-11,.w-col-sm-12,.w-col-sm-2,.w-col-sm-3,.w-col-sm-4,.w-col-sm-5,.w-col-sm-6,.w-col-sm-7,.w-col-sm-8,.w-col-sm-9,.w-col-xs-1,.w-col-xs-10,.w-col-xs-11,.w-col-xs-12,.w-col-xs-2,.w-col-xs-3,.w-col-xs-4,.w-col-xs-5,.w-col-xs-6,.w-col-xs-7,.w-col-xs-8,.w-col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.w-col-xs-1,.w-col-xs-10,.w-col-xs-11,.w-col-xs-12,.w-col-xs-2,.w-col-xs-3,.w-col-xs-4,.w-col-xs-5,.w-col-xs-6,.w-col-xs-7,.w-col-xs-8,.w-col-xs-9{float:left}.w-col-xs-12{width:100%}.w-col-xs-11{width:91.66666667%}.w-col-xs-10{width:83.33333333%}.w-col-xs-9{width:75%}.w-col-xs-8{width:66.66666667%}.w-col-xs-7{width:58.33333333%}.w-col-xs-6{width:50%}.w-col-xs-5{width:41.66666667%}.w-col-xs-4{width:33.33333333%}.w-col-xs-3{width:25%}.w-col-xs-2{width:16.66666667%}.w-col-xs-1{width:8.33333333%}.w-col-xs-pull-12{right:100%}.w-col-xs-pull-11{right:91.66666667%}.w-col-xs-pull-10{right:83.33333333%}.w-col-xs-pull-9{right:75%}.w-col-xs-pull-8{right:66.66666667%}.w-col-xs-pull-7{right:58.33333333%}.w-col-xs-pull-6{right:50%}.w-col-xs-pull-5{right:41.66666667%}.w-col-xs-pull-4{right:33.33333333%}.w-col-xs-pull-3{right:25%}.w-col-xs-pull-2{right:16.66666667%}.w-col-xs-pull-1{right:8.33333333%}.w-col-xs-pull-0{right:auto}.w-col-xs-push-12{left:100%}.w-col-xs-push-11{left:91.66666667%}.w-col-xs-push-10{left:83.33333333%}.w-col-xs-push-9{left:75%}.w-col-xs-push-8{left:66.66666667%}.w-col-xs-push-7{left:58.33333333%}.w-col-xs-push-6{left:50%}.w-col-xs-push-5{left:41.66666667%}.w-col-xs-push-4{left:33.33333333%}.w-col-xs-push-3{left:25%}.w-col-xs-push-2{left:16.66666667%}.w-col-xs-push-1{left:8.33333333%}.w-col-xs-push-0{left:auto}.w-col-xs-offset-12{margin-left:100%}.w-col-xs-offset-11{margin-left:91.66666667%}.w-col-xs-offset-10{margin-left:83.33333333%}.w-col-xs-offset-9{margin-left:75%}.w-col-xs-offset-8{margin-left:66.66666667%}.w-col-xs-offset-7{margin-left:58.33333333%}.w-col-xs-offset-6{margin-left:50%}.w-col-xs-offset-5{margin-left:41.66666667%}.w-col-xs-offset-4{margin-left:33.33333333%}.w-col-xs-offset-3{margin-left:25%}.w-col-xs-offset-2{margin-left:16.66666667%}.w-col-xs-offset-1{margin-left:8.33333333%}.w-col-xs-offset-0{margin-left:0}@media (min-width:768px){.w-col-sm-1,.w-col-sm-10,.w-col-sm-11,.w-col-sm-12,.w-col-sm-2,.w-col-sm-3,.w-col-sm-4,.w-col-sm-5,.w-col-sm-6,.w-col-sm-7,.w-col-sm-8,.w-col-sm-9{float:left}.w-col-sm-12{width:100%}.w-col-sm-11{width:91.66666667%}.w-col-sm-10{width:83.33333333%}.w-col-sm-9{width:75%}.w-col-sm-8{width:66.66666667%}.w-col-sm-7{width:58.33333333%}.w-col-sm-6{width:50%}.w-col-sm-5{width:41.66666667%}.w-col-sm-4{width:33.33333333%}.w-col-sm-3{width:25%}.w-col-sm-2{width:16.66666667%}.w-col-sm-1{width:8.33333333%}.w-col-sm-pull-12{right:100%}.w-col-sm-pull-11{right:91.66666667%}.w-col-sm-pull-10{right:83.33333333%}.w-col-sm-pull-9{right:75%}.w-col-sm-pull-8{right:66.66666667%}.w-col-sm-pull-7{right:58.33333333%}.w-col-sm-pull-6{right:50%}.w-col-sm-pull-5{right:41.66666667%}.w-col-sm-pull-4{right:33.33333333%}.w-col-sm-pull-3{right:25%}.w-col-sm-pull-2{right:16.66666667%}.w-col-sm-pull-1{right:8.33333333%}.w-col-sm-pull-0{right:auto}.w-col-sm-push-12{left:100%}.w-col-sm-push-11{left:91.66666667%}.w-col-sm-push-10{left:83.33333333%}.w-col-sm-push-9{left:75%}.w-col-sm-push-8{left:66.66666667%}.w-col-sm-push-7{left:58.33333333%}.w-col-sm-push-6{left:50%}.w-col-sm-push-5{left:41.66666667%}.w-col-sm-push-4{left:33.33333333%}.w-col-sm-push-3{left:25%}.w-col-sm-push-2{left:16.66666667%}.w-col-sm-push-1{left:8.33333333%}.w-col-sm-push-0{left:auto}.w-col-sm-offset-12{margin-left:100%}.w-col-sm-offset-11{margin-left:91.66666667%}.w-col-sm-offset-10{margin-left:83.33333333%}.w-col-sm-offset-9{margin-left:75%}.w-col-sm-offset-8{margin-left:66.66666667%}.w-col-sm-offset-7{margin-left:58.33333333%}.w-col-sm-offset-6{margin-left:50%}.w-col-sm-offset-5{margin-left:41.66666667%}.w-col-sm-offset-4{margin-left:33.33333333%}.w-col-sm-offset-3{margin-left:25%}.w-col-sm-offset-2{margin-left:16.66666667%}.w-col-sm-offset-1{margin-left:8.33333333%}.w-col-sm-offset-0{margin-left:0}}@media (min-width:992px){.w-col-md-1,.w-col-md-10,.w-col-md-11,.w-col-md-12,.w-col-md-2,.w-col-md-3,.w-col-md-4,.w-col-md-5,.w-col-md-6,.w-col-md-7,.w-col-md-8,.w-col-md-9{float:left}.w-col-md-12{width:100%}.w-col-md-11{width:91.66666667%}.w-col-md-10{width:83.33333333%}.w-col-md-9{width:75%}.w-col-md-8{width:66.66666667%}.w-col-md-7{width:58.33333333%}.w-col-md-6{width:50%}.w-col-md-5{width:41.66666667%}.w-col-md-4{width:33.33333333%}.w-col-md-3{width:25%}.w-col-md-2{width:16.66666667%}.w-col-md-1{width:8.33333333%}.w-col-md-pull-12{right:100%}.w-col-md-pull-11{right:91.66666667%}.w-col-md-pull-10{right:83.33333333%}.w-col-md-pull-9{right:75%}.w-col-md-pull-8{right:66.66666667%}.w-col-md-pull-7{right:58.33333333%}.w-col-md-pull-6{right:50%}.w-col-md-pull-5{right:41.66666667%}.w-col-md-pull-4{right:33.33333333%}.w-col-md-pull-3{right:25%}.w-col-md-pull-2{right:16.66666667%}.w-col-md-pull-1{right:8.33333333%}.w-col-md-pull-0{right:auto}.w-col-md-push-12{left:100%}.w-col-md-push-11{left:91.66666667%}.w-col-md-push-10{left:83.33333333%}.w-col-md-push-9{left:75%}.w-col-md-push-8{left:66.66666667%}.w-col-md-push-7{left:58.33333333%}.w-col-md-push-6{left:50%}.w-col-md-push-5{left:41.66666667%}.w-col-md-push-4{left:33.33333333%}.w-col-md-push-3{left:25%}.w-col-md-push-2{left:16.66666667%}.w-col-md-push-1{left:8.33333333%}.w-col-md-push-0{left:auto}.w-col-md-offset-12{margin-left:100%}.w-col-md-offset-11{margin-left:91.66666667%}.w-col-md-offset-10{margin-left:83.33333333%}.w-col-md-offset-9{margin-left:75%}.w-col-md-offset-8{margin-left:66.66666667%}.w-col-md-offset-7{margin-left:58.33333333%}.w-col-md-offset-6{margin-left:50%}.w-col-md-offset-5{margin-left:41.66666667%}.w-col-md-offset-4{margin-left:33.33333333%}.w-col-md-offset-3{margin-left:25%}.w-col-md-offset-2{margin-left:16.66666667%}.w-col-md-offset-1{margin-left:8.33333333%}.w-col-md-offset-0{margin-left:0}}@media (min-width:1200px){.w-col-lg-1,.w-col-lg-10,.w-col-lg-11,.w-col-lg-12,.w-col-lg-2,.w-col-lg-3,.w-col-lg-4,.w-col-lg-5,.w-col-lg-6,.w-col-lg-7,.w-col-lg-8,.w-col-lg-9{float:left}.w-col-lg-12{width:100%}.w-col-lg-11{width:91.66666667%}.w-col-lg-10{width:83.33333333%}.w-col-lg-9{width:75%}.w-col-lg-8{width:66.66666667%}.w-col-lg-7{width:58.33333333%}.w-col-lg-6{width:50%}.w-col-lg-5{width:41.66666667%}.w-col-lg-4{width:33.33333333%}.w-col-lg-3{width:25%}.w-col-lg-2{width:16.66666667%}.w-col-lg-1{width:8.33333333%}.w-col-lg-pull-12{right:100%}.w-col-lg-pull-11{right:91.66666667%}.w-col-lg-pull-10{right:83.33333333%}.w-col-lg-pull-9{right:75%}.w-col-lg-pull-8{right:66.66666667%}.w-col-lg-pull-7{right:58.33333333%}.w-col-lg-pull-6{right:50%}.w-col-lg-pull-5{right:41.66666667%}.w-col-lg-pull-4{right:33.33333333%}.w-col-lg-pull-3{right:25%}.w-col-lg-pull-2{right:16.66666667%}.w-col-lg-pull-1{right:8.33333333%}.w-col-lg-pull-0{right:auto}.w-col-lg-push-12{left:100%}.w-col-lg-push-11{left:91.66666667%}.w-col-lg-push-10{left:83.33333333%}.w-col-lg-push-9{left:75%}.w-col-lg-push-8{left:66.66666667%}.w-col-lg-push-7{left:58.33333333%}.w-col-lg-push-6{left:50%}.w-col-lg-push-5{left:41.66666667%}.w-col-lg-push-4{left:33.33333333%}.w-col-lg-push-3{left:25%}.w-col-lg-push-2{left:16.66666667%}.w-col-lg-push-1{left:8.33333333%}.w-col-lg-push-0{left:auto}.w-col-lg-offset-12{margin-left:100%}.w-col-lg-offset-11{margin-left:91.66666667%}.w-col-lg-offset-10{margin-left:83.33333333%}.w-col-lg-offset-9{margin-left:75%}.w-col-lg-offset-8{margin-left:66.66666667%}.w-col-lg-offset-7{margin-left:58.33333333%}.w-col-lg-offset-6{margin-left:50%}.w-col-lg-offset-5{margin-left:41.66666667%}.w-col-lg-offset-4{margin-left:33.33333333%}.w-col-lg-offset-3{margin-left:25%}.w-col-lg-offset-2{margin-left:16.66666667%}.w-col-lg-offset-1{margin-left:8.33333333%}.w-col-lg-offset-0{margin-left:0}}.w-clearfix:after,.w-clearfix:before,.w-container-fluid:after,.w-container-fluid:before,.w-container:after,.w-container:before,.w-row:after,.w-row:before{content:" ";display:table}.w-clearfix:after,.w-container-fluid:after,.w-container:after,.w-row:after{clear:both}.w-center-block{display:block;margin-left:auto;margin-right:auto}.w-pull-right{float:right!important}.w-pull-left{float:left!important}.w-hide{display:none!important}.w-show{display:block!important}.w-invisible{visibility:hidden}.w-text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.w-hidden{display:none!important}.w-affix{position:fixed}.mec-image-popup-wrap{display:none}#wns-be-infobar.sticky{position:fixed;top:32px;background:#fff;z-index:999;width:82%}.wns-be-main .wns-saved-settings.sticky{position:fixed;width:62.5%;top:111px;z-index:999999999999999999}textarea.mec-import-settings-content{display:block;width:100%;min-height:120px;margin-bottom:25px;padding:10px 15px}.mec-import-options-notification{display:inline-block}.mec-import-options-notification .mec-message-import-error,.mec-import-options-notification .mec-message-import-success{display:inline-block;padding:15px 12px;margin-left:12px;opacity:0;visibility:hidden;font-weight:700}.mec-import-options-notification .mec-message-import-success{opacity:1;visibility:visible;border:2px solid green}.mec-import-options-notification .mec-message-import-error{opacity:1;visibility:visible;border:2px solid #e62117}.mec-export-settings:focus,.mec-import-settings:focus{color:#07bbe9}.mec-import-settings-wrap{position:relative}.mec-import-settings-wrap textarea{max-width:unset!important}.mec-loarder-wrap{position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(202,202,202,.7);z-index:9999}.mec-loarder-wrap.mec-settings-loader{top:34px}.mec-loarder{position:absolute;width:64px;height:64px;top:calc(50% - 32px);left:calc(50% - 36px)}.mec-loarder div{display:inline-block;position:absolute;left:6px;width:4px;background:#fff;animation:mec-loarder 1.2s cubic-bezier(0,.5,.5,1) infinite}.mec-loarder div:first-child{left:27px;animation-delay:-.24s;background:#0075ff}.mec-loarder div:nth-child(2){left:36px;animation-delay:-.12s;background:#028bff}.mec-loarder div:nth-child(3){left:45px;animation-delay:0;background:#32a0ff}@keyframes mec-loarder{0%{top:6px;height:51px}100%,50%{top:19px;height:26px}}.w-box.support-page.searchbox{background:#40d8f0;color:#fff;min-height:260px;text-align:center;border-radius:11px}#webnus-dashboard .search-form input{background:rgba(255,255,255,.2);border:none;width:50%;outline:0;color:rgba(255,255,255,.7);font-size:18px;border-radius:4px 0 0 4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.03);-webkit-transition:background .4s,box-shadow .2s;transition:background .4s,box-shadow .2s;padding:20px 32px;margin:0}#webnus-dashboard .search-form button{background:rgba(255,255,255,.2);border:none;padding:20px 32px;margin-left:-2px;color:#fff;border-radius:0 4px 4px 0;font-size:18px;cursor:pointer;-webkit-transition:background .4s,box-shadow .2s;transition:background .4s,box-shadow .2s}#webnus-dashboard .search-form button:hover{background:#fff;color:#3a3c4c}.w-box.support-page.searchbox p{font-size:30px}.search-form input::-webkit-input-placeholder{color:rgba(255,255,255,.7)}.search-form input::-moz-placeholder{color:rgba(255,255,255,.7)}.search-form input:-ms-input-placeholder{color:rgba(255,255,255,.7)}.search-form input:-moz-placeholder{color:rgba(255,255,255,.7)}#webnus-dashboard .search-form input:active,#webnus-dashboard .search-form input:focus{box-shadow:0 10px 20px rgba(0,0,0,.14);background:#fff;color:#3a3c4c}#webnus-dashboard .search-form input:active::-webkit-input-placeholder,#webnus-dashboard .search-form input:focus::-webkit-input-placeholder{color:#3a3c4c}#webnus-dashboard .search-form input:active::-moz-placeholder,#webnus-dashboard .search-form input:focus::-moz-placeholder{color:#3a3c4c}#webnus-dashboard .search-form input:active:-ms-input-placeholder,#webnus-dashboard .search-form input:focus:-ms-input-placeholder{color:#3a3c4c}#webnus-dashboard .search-form input:active:-moz-placeholder,#webnus-dashboard .search-form input:focus:-moz-placeholder{color:#3a3c4c}#webnus-dashboard .w-box.support-page.mec-ticksy{text-align:center;min-height:260px}#webnus-dashboard .w-box.support-page.mec-ticksy p{font-size:20px;width:70%;margin:0 auto;margin-bottom:40px;margin-top:40px}#webnus-dashboard .support-box a,#webnus-dashboard .w-box.support-page.mec-ticksy a{color:#fff;font-weight:500;border-radius:50px;text-shadow:none;background:#40d8f0;border:none;transition:.24s;padding:12px 30px;cursor:pointer;margin-bottom:40px;display:inline-block}#webnus-dashboard .support-box a:hover,#webnus-dashboard .w-box.support-page.mec-ticksy a:hover{background:#222;box-shadow:0 5px 23px -7px rgba(0,0,0,.5)}#webnus-dashboard .support-box a{margin:40px 4px 0 4px}.mec-faq-accordion>.mec-faq-accordion-content{display:none}#webnus-dashboard .mec-faq-accordion-trigger a{font-size:15px;padding:15px;background:#f0f1f2;display:block;color:#222;line-height:17px;outline:0;border-radius:8px}.mec-faq-accordion-trigger{margin-bottom:5px;position:relative}#webnus-dashboard .mec-faq-accordion-trigger a:after{font-family:simple-line-icons;content:"\e095";position:absolute;right:12px;font-weight:700}.mec-faq-accordion-content{padding:5px 14px 25px}#webnus-dashboard .mec-faq-accordion-trigger a.active:after{content:"\e082"}#webnus-dashboard .support-page-links a{color:#fff;border-radius:50px;padding:13px 24px;font-size:12px;letter-spacing:1px;font-weight:600;text-transform:uppercase;transition:all .2s ease}#webnus-dashboard .support-page-links a:hover,#webnus-dashboard .w-box.support-page.videobox .w-button a:hover{background:#222;box-shadow:0 2px 5px -1px rgba(0,0,0,.1)}#webnus-dashboard .support-page-links{display:inline-block;margin:12px 4px 16px 0}.support-page-links.link-to-doc a{background:#d09d5f}.support-page-links.link-to-videos a{background:#ff876c}.support-page-links.link-to-articles a{background:#69ca8a}.w-box.support-page.articles-box .w-box-content a{display:block;padding:6px 0}#webnus-dashboard .w-box.support-page.videobox .w-button a{color:#fff;font-size:10px;padding:5px 15px;min-height:10px;font-weight:500;border-radius:22px;box-shadow:0 3px 10px -9px #ff5a35;text-shadow:none;background:#ff876c;border:none;transition:.24s}.w-box.support-page.articles-box,.w-box.support-page.faq-box{min-height:500px}.w-box.support-page.videobox{border-radius:11px;min-height:282px;box-shadow:0 1px 2px rgba(0,0,0,.01)!important}.w-box.support-page.videobox .w-box-content{padding:15px}.w-box.support-page.videobox .w-box-head{font-size:15px;text-align:center;padding:20px 0 0}#webnus-dashboard .w-box.support-page.videobox .w-button a i{margin-right:6px}.support-page .w-box-content ul{margin-top:5px;padding-left:5px}.support-page .w-box-content ul li{font-size:13px}.support-page .w-box-content ul li i{font-size:13px;vertical-align:text-bottom;margin-right:3px;color:#40d8f0}.w-box.mec-activation{background:#fff url(../img/dp-dsb-support.jpg) no-repeat top right}.w-box.mec-activation .w-box-head{width:75%}.w-box.mec-activation .w-box-content{padding:10px 30px}.w-box.mec-activation input[type=radio]{display:none}.w-box.mec-activation input[type=radio]+label{color:#000;font-size:13px;line-height:14px!important;color:#7b7b7b}.w-box.mec-activation input[type=radio].checked+label{color:#40d8f0}.mec-form-row input[type=radio],.w-box.mec-activation input[type=radio]+label span{display:inline-block;margin:-2px 6px 0 0;vertical-align:middle;cursor:pointer;height:22px;width:22px;text-align:center;background-color:#fff;border:2px solid #e1e2e3;border-radius:100%;box-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;transition:all .3s ease}.mec-form-row input[type=radio]:checked,.w-box.mec-activation input[type=radio].checked+label span{border-color:#afebf5}.mec-form-row input[type=radio]:before,.w-box.mec-activation input[type=radio]+label span:after{content:"";display:block;margin:0;position:absolute;top:4px;left:4px;width:10px;height:10px;background:0 0;border-radius:100%;transition:all .2s ease;transform:scale(.1)}.mec-form-row input[type=radio]:checked:before,.w-box.mec-activation input[type=radio].checked+label span:after{background:#38d5ed;transform:scale(1)}.w-box.mec-activation .LicenseType label{padding-right:20px;font-weight:500}.w-box.mec-activation .LicenseField{display:inline-block;position:relative;margin-top:20px}.w-box.mec-activation input[name=MECPurchaseCode]{box-shadow:inset 0 1px 2px rgba(0,0,0,.07);min-width:220px;background:#f7f8f9;border:none;border-radius:33px;width:500px;min-height:50px;margin:0;padding-left:20px;text-align:left}#webnus-dashboard .w-box.mec-activation input[type=submit]{height:40px;line-height:40px;font-weight:600;border:none;cursor:pointer;padding:0 30px;border-radius:33px;color:#fff;letter-spacing:1px;text-transform:uppercase;font-size:12px;text-shadow:none;background:#64e385;transition:all .28s ease;position:absolute;right:5px;top:5px;font-size:12px}#webnus-dashboard .w-box.mec-activation input[type=submit]:hover{background:#45ce68}#webnus-dashboard .w-box.mec-activation input[type=submit].delete{background:#c2c2c2;color:#000}#webnus-dashboard .w-box.mec-activation input[type=submit].delete:hover{background:#ccc}#MECActivation .MECPurchaseStatus,.addon-activation-form .MECPurchaseStatus{display:inline-block;width:40px;height:40px;text-align:center;padding-top:9px;color:#fff;font-weight:700;font-size:18px;border-radius:50%;padding-top:8px;position:absolute;right:-51px;top:calc(50% - 20px)}.MECPurchaseStatus:after,.MECPurchaseStatus:before{position:absolute;border-radius:50px;background:#fff;content:"";transform:rotate(45deg)}.MECPurchaseStatus.PurchaseError:before{width:22px;height:4px;right:9px;top:18px;transform:rotate(45deg)}.MECPurchaseStatus.PurchaseError:after{width:22px;height:4px;right:9px;top:18px;transform:rotate(-45deg)}.MECPurchaseStatus.PurchaseSuccess:before{width:13px;height:4px;right:19px;top:21px;transform:rotate(45deg)}.MECPurchaseStatus.PurchaseSuccess:after{width:22px;height:4px;right:5px;top:18px;transform:rotate(-45deg)}#MECActivation .MECPurchaseStatus.PurchaseError,.addon-activation-form .MECPurchaseStatus.PurchaseError{background:#ff876c}#MECActivation .MECPurchaseStatus.PurchaseSuccess,.addon-activation-form .MECPurchaseStatus.PurchaseSuccess{background:#64e385}.wna-spinner-wrap{position:absolute;background:#000;width:509px;height:64px;top:-8px;border-radius:50px;z-index:999;background-color:#fff;opacity:.9}.wna-spinner{width:40px;height:40px;position:relative;margin:6px auto}.wna-spinner .double-bounce1,.wna-spinner .double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#40d8f0;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-bounce 2s infinite ease-in-out;animation:sk-bounce 2s infinite ease-in-out}.wna-spinner .double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}#MECActivation .MECLicenseMessage,.addon-activation-form .MECLicenseMessage{padding-top:24px;margin-bottom:-24px;color:#f64;max-width:570px}.MECLicenseMessage.mec-message-hidden{display:none}#webnus-dashboard .w-box.mec-activation input[type=submit].mec_revoke{background:#e0e0e0;color:#222}.box-addons-activation{margin-top:24px;margin-bottom:24px}.box-addon-activation-toggle-content,.box-addon-activation-toggle-head{display:none}.addon-activation-form h3{font-size:15px;font-weight:400;margin:34px 0 -7px}.box-addon-activation-toggle-head{line-height:1.5;font-size:14px;margin-top:14px;cursor:pointer;padding:10px 18px;border:1px solid #d3d5d7;border-radius:25px;transition:all .2s ease}.box-addon-activation-toggle-head:hover{border-color:#a5d9e1}.box-addon-activation-toggle-head i{margin-right:7px;cursor:pointer;font-size:13px;font-weight:400}#mec-advanced-wraper div:first-child>ul{display:block;margin:5px 0;padding:5px 0;width:390px;border:1px solid #e1e2e3;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.05)}#mec-advanced-wraper div:first-child>ul span{display:none}#mec-advanced-wraper div:first-child>ul *{display:inline-block;background:#fff;font-size:12px;color:#717273;text-align:center}#mec-advanced-wraper div:first-child>ul>li{width:60px;font-weight:700;margin:0 10px 0 0;padding:4px 0;border-right:1px solid #e1e2e3}#mec-advanced-wraper div:first-child>ul>ul>li{margin:0;padding:2px 10px;cursor:pointer;border-radius:2px;transition:all .18s ease}#mec-advanced-wraper div:first-child>ul>ul>li:hover,.mec-active{background:#07bbe9!important;color:#fff!important}@-webkit-keyframes sk-bounce{0%,100%{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,100%{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.w-col-sm-3 .w-box.addon{min-height:372px;text-align:center;border-radius:9px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 1%)}.m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3{width:33.33%;clear:none!important;min-height:380px}@media (min-width:768px) and (max-width:1281px){.m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3{width:50%}}@media (max-width:767px){.m-e-calendar_page_MEC-addons .welcome-content .w-col-sm-3{width:100%}}.w-box-child.mec-addon-box{padding:0}.mec-addon-box-head{border-bottom:1px solid #f7f8f9;padding:20px 20px 8px;margin-bottom:14px;position:relative}.mec-addon-box-version{position:relative;border-radius:1px;padding:0 8px;font-family:monospace;background:#f4f7f7;color:#00a1b7;font-size:11px;letter-spacing:.2px;line-height:21px;display:inline-block;margin:10px 0}.mec-addon-box-head img{display:block;width:100%;height:60px;margin-bottom:10px;margin-top:10px}.mec-addon-box-title{font-weight:600;font-size:18px;line-height:36px;color:#27272a;letter-spacing:-.2px}.mec-addon-box-title a span{color:#444;font-size:15px}.mec-addon-box-content{padding:0 20px}.mec-addon-box-content p{color:#6e757b;font-size:14px;letter-spacing:.1px}.mec-addon-box-mec-version{background:#f3f3f3;padding:10px;font-size:13px}.mec-addon-box-pro{display:inline-block;background:#ff7d5f;color:#fff;font-weight:600;font-size:11px;letter-spacing:.2px;line-height:21px;padding:0 8px;border-radius:3px}.mec-addon-box-pro-lite{background:#4cbf67;color:#fff;font-weight:600;font-size:11px;letter-spacing:.2px;line-height:21px;padding:0 8px;border-radius:3px;display:inline-block}#webnus-dashboard .addons-page-links{display:inline-block;margin:12px 4px 16px 0}#webnus-dashboard .addons-page-links a{background-color:#fff;color:#fff;border-radius:2px;padding:13px 24px;font-size:12px;letter-spacing:1px;font-weight:600;text-transform:uppercase}.addons-page-links.link-to-purchase a{background:#4cbf67;background:linear-gradient(95deg,#6fe08a 0,#58cf74 50%,#36cb58 100%);box-shadow:0 5px 10px -5px #4cbf67}.addons-page-links.link-to-install-addons a{background:#b092e6;background:linear-gradient(95deg,#b092e6 0,#9b70e8 50%,#8e5cea 100%);box-shadow:0 5px 10px -5px #b092e6}#webnus-dashboard .addons-page-links a:hover,#webnus-dashboard .w-box.addons-page.videobox .w-button a:hover{background:#222;background:linear-gradient(95deg,#555 0,#222 50%,#000 100%);box-shadow:0 5px 21px -5px rgba(0,0,0,.5)}.mec-addon-box-footer{background:#f7f8f9;border-radius:0 0 9px 9px;padding:10px 1px 8px;margin-top:25px;text-align:center;position:absolute;left:0;right:0;bottom:0}#webnus-dashboard .mec-addon-box-footer a{margin-top:10px;display:inline-block;text-shadow:none;border:none;transition:.24s;position:relative;margin-right:7px;font-size:12px;font-weight:500;border-radius:8px;padding:9px 18px 8px;width:53px;height:34px;line-height:21px;background:0 0;margin:0;box-shadow:none}#webnus-dashboard .mec-addon-box-footer a:last-of-type{margin-right:0}#webnus-dashboard .mec-addon-box-footer a.mec-addon-box-intro:hover{background-color:#ff3535;background:linear-gradient(95deg,#ff6c6c 0,#f55 50%,#ff3535 100%)}#webnus-dashboard .mec-addon-box-footer a:hover{background:#00cae6;cursor:pointer!important}#webnus-dashboard .mec-addon-box-footer a i{color:#00cae6;font-size:16px}#webnus-dashboard .mec-addon-box-footer a:hover i{color:#fff}#mec_tickets .mec-box{position:relative;padding:20px}#mec_fees_list input[type=text].mec-col-12,#mec_ticket_variations_list input[type=text].mec-col-12{max-width:625px}#taxes_option .mec-form-row input[type=text].mec-col-12,#ticket_variations_option input[type=text].mec-col-12{max-width:575px}.mec-booking-tab-content .mec-form-row textarea{max-width:762px}#mec_tickets .button.remove{padding:0;min-height:28px;height:28px;width:28px;margin:0;border-radius:50%;position:absolute;top:20px;right:20px;color:#fff;box-shadow:none;background:#fff;border-color:#ea6485;font-size:20px;line-height:1.5}#mec_tickets .button.remove svg{fill:#ea6485!important}#mec_tickets .button.remove:hover{color:#fff;border-color:#ea6485;background:#ea6485}#mec_tickets .button.remove:hover svg{fill:#fff!important}@media (max-width:480px){#mec_tickets .button.remove{top:5px;right:5px}}.mec-ticket-id{font-size:12px;line-height:12px;font-weight:400;color:#07bbe9;padding:0 0 8px;margin-bottom:14px;cursor:default}.mec-ticket-end-time.mec-col-12 .mec-time-span,.mec-ticket-start-time.mec-col-12 .mec-time-span{min-width:80px;display:inline-block}.mec-ticket-start-time{margin-bottom:20px}.mec-ticket-time{min-width:69px;display:inline-block}.mec-stop-selling-tickets{min-width:185px}#mec_meta_box_hourly_schedule_days .mec-form-row input[type=text],#mec_meta_box_tickets_form .mec-form-row input[type=text]{max-width:290px}@media (max-width:1366px){#mec_meta_box_hourly_schedule_days .mec-box.mec-form-row input[type=text]{max-width:150px;min-width:110px}}#mec_exceptions_not_in_days_date{width:100%}#mec-event-data input[type=date],#mec-event-data input[type=email],#mec-event-data input[type=tel],#mec-event-data input[type=text],#mec-event-data input[type=url],#mec-event-data select,#mec-event-data textarea,#mec_exceptions_not_in_days_date,#mec_meta_box_date_form input[type=text],#mec_meta_box_date_form input[type=url],#mec_select_tags.mec-create-shortcode-tab-content input[type=text],#mec_settings_weather_module_api_key{max-width:290px}#mec-event-data input[type=text].mec_date_picker.mec-col-4 #mec_meta_box_calendar_skin_options input[type=text].mec_date_picker.mec-col-4{max-width:32.33333333%}#payment_gateways_option .mec-col-4 input[type=number],#payment_gateways_option .mec-col-4 input[type=text],#payment_gateways_option .mec-col-4 select,#payment_gateways_option .mec-col-4 textarea{width:90%}.mec-form-repeating-event-row .mec-col-6 input[type=text]{width:35%}.addons-page-error,.addons-page-notice{display:block;margin-top:15px;margin-bottom:0;background:#fff;border-left:4px solid #00a0d2;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);padding:1px 12px}.addons-page-error p,.addons-page-notice p{margin:.5em 0;padding:2px;font-size:13px}.addons-page-error{border-left-color:#dc3232}.mec-addon-box-comingsoon{background:0 0;padding:8px 11px;color:#5a5a5a;font-size:14px;font-weight:500;text-align:center}.mec-addons .w-row .w-col-sm-3:nth-child(4n+1){clear:left}@media (min-width:960px){#webnus-dashboard .mec-addon-box-footer .w-button{text-align:right}}@media (min-width:1401px){.mec-addon-box-title a span{font-size:17px}}.mec-pro-notice{margin-top:24px;line-height:30px}.mec-pro-notice .info-msg{padding:50px 30px;margin-bottom:0}#webnus-dashboard .mec-pro-notice .info-msg{background:#fff;box-shadow:0 1px 2px rgb(0 0 0 / 1%);text-align:center;color:#55595d}#webnus-dashboard a.info-msg-link{background:#e66f52;background:linear-gradient(95deg,#ff8162 0,#e66f52 50%,#ff4c20 100%);box-shadow:0 5px 10px -5px #e66f52;border-radius:2px;padding:12px 50px;font-size:16px;line-height:24px;border:none;margin:20px auto 0;color:#fff;transition:all .3s ease;display:inline-block}#webnus-dashboard a.info-msg-link:hover{background:#222;background:linear-gradient(95deg,#555 0,#222 50%,#000 100%);box-shadow:0 5px 21px -5px rgba(0,0,0,.5)}#webnus-dashboard .info-msg p{width:70%;margin:0 auto;line-height:1.8}#webnus-dashboard .info-msg-coupon{font-size:13px;color:#777;max-width:600px;line-height:1.68;margin:25px auto 0}#webnus-dashboard .info-msg-coupon strong{font-weight:700;color:#19ce18}.info-msg .socialfollow{padding-top:20px}.info-msg .socialfollow a{margin:0 2px;display:inline-block}.info-msg .socialfollow a i{background:#96a4b1;color:#fff;padding:6px;border-radius:3px;font-size:18px;box-shadow:0 2px 3px rgba(0,0,0,.1);transition:all .25s}.info-msg .socialfollow a:hover i{background:#008aff}.mec-intro-section .w-box-content{text-align:center}.mec-intro-section .w-box-content.mec-intro-section-welcome{max-width:600px;margin:0 auto}.mec-intro-section .w-box-content.mec-intro-section-welcome h3{font-size:26px}a.mec-intro-section-link-tag.button.button-hero{margin:0 10px 40px}a.mec-intro-section-link-tag.button.button-primary.button-hero{color:#fff!important}a.mec-intro-section-link-tag.button.button-secondary.button-hero{color:#1dbfd8!important}.mec-intro-section-ifarme iframe{border:1px solid #e7e7e7;border-radius:9px;padding:15px;box-shadow:0 3px 10px -6px rgb(0 0 0 / 12%)}.w-box-content.mec-intro-section-welcome p{margin-bottom:0}.mec-tooltip a:focus{box-shadow:none}#mec_booking_form .mec-options-fields,#mec_modules_form .mec-options-fields,#mec_settings_form .mec-options-fields,#mec_single_form .mec-options-fields{padding-bottom:0!important}#mec_taxes_fees_container_toggle{margin-bottom:60px}#mec_taxes_fees_container_toggle{margin-bottom:60px}.wns-be-sidebar li{position:relative}.wns-be-sidebar li .submneu-hover{position:absolute;top:-1px;right:-222px;width:220px;z-index:9;background:#fff;border:1px;border-style:solid;border-color:#dedede;margin:0;overflow:visible;opacity:0;visibility:hidden;transition:all .23s ease;padding-top:8px;padding-bottom:12px}.wns-be-sidebar li:hover .submneu-hover{opacity:1;visibility:visible}.wns-be-sidebar li .submneu-hover a{background:#fff;color:#636363;opacity:1;font-size:12px;padding:6px 4px 6px 26px}.wns-be-sidebar li .submneu-hover a:hover{background:#f6f6f6;color:#222}.wns-be-sidebar li .submneu-hover:before{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:#fff;left:-15px;top:14px;border-right-color:#c5c5c5;right:0}.wns-be-sidebar li .submneu-hover:after{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:#fff;left:-14px;top:14px}.wns-be-sidebar li a:focus,.wns-be-sidebar li:focus{outline:-webkit-focus-ring-color auto 0;border:0;box-shadow:none}@media (max-width:480px){.wns-be-sidebar li .submneu-hover{width:175px;right:0}.wns-be-sidebar li .submneu-hover a{font-size:11px;padding:5px 5px 5px 20px}}.mec-tooltip:hover:after,.mec-tooltip:hover:before{display:none}.mec-tooltip{bottom:0}.mec-tooltip .box{min-width:300px;max-width:600px;display:inline-block;left:36px;top:calc(50% - 9px);transform:translateY(-50%);padding:0;margin-top:8px;background-color:#535a61;color:#fff;font-weight:300;font-size:14px;letter-spacing:.5px;line-height:1.3;position:absolute;z-index:9999999;box-sizing:border-box;border-radius:6px;box-shadow:0 4px 32px -10px #444b50;visibility:hidden;opacity:0;transition:opacity .23s}#webnus-dashboard .mec-tooltip .box p,.mec-tooltip .box p{color:#fff;font-size:14px;line-height:1.3;margin:0;font-style:normal}.mec-tooltip:hover .box{visibility:visible;opacity:1}.mec-tooltip:hover .box{padding:20px;border-radius:8px}.mec-tooltip .box h5{color:#fff;font-size:17px;font-weight:600;margin:-30px -20px;padding:15px 0;text-align:center;margin-bottom:10px;background:#3a3f44;border-bottom:1px solid #30353a;border-radius:6px 6px 0 0;z-index:9999}.mec-tooltip .box h5:after{display:none}#webnus-dashboard .mec-tooltip .box p a,.mec-tooltip .box p a{color:#40d9f1;margin-top:10px;margin-left:0;font-weight:400;position:relative;text-decoration:none;display:block;width:max-content}.mec-tooltip .box a:hover{color:#f90}.mec-tooltip .box:after{display:block;position:absolute!important;top:100%!important;right:50%!important;margin-top:-6px!important;margin-right:-6px!important;width:12px!important;height:24px!important;overflow:hidden!important;transform:rotate(-90deg)!important}.mec-tooltip .box:before{display:block;content:""!important;position:absolute!important;width:12px;height:12px;left:-10px!important;top:50%!important;transform:translate(50%,-50%) rotate(-45deg)!important;background-color:#535a61!important;box-shadow:0 8px 9px -4px #535a61!important;z-index:0!important}.mec-tooltip .box.top{left:50%;top:0;transform:translate(-50%,-100%);margin-top:0;margin-left:-10px}.mec-tooltip .box.top:after{top:50%!important;right:100%!important}.mec-tooltip .box.top:before{left:50%!important;top:100%!important}.mec-tooltip .box.bottom{left:50%;top:auto;bottom:0;transform:translate(-50%,100%);margin-bottom:-20px;margin-left:-10px}.mec-tooltip .box.bottom:after{top:0!important;right:50%!important;background-color:#3a3f44!important}.mec-tooltip .box.bottom:before{left:50%!important;top:-7px!important;transform:translateX(-50%);background-color:#3a3f44!important}.mec-tooltip .box.left{left:auto;right:36px;top:calc(50% - 9px);transform:translateY(-50%)}.mec-tooltip .box.left:before{right:0!important;left:auto!important;top:50%!important}form#mec_reg_fields_form input[type=radio]:before{content:"";display:inline-block;background:#fff;border-radius:18px;width:14px;height:14px;margin:-1px 0 0 -2px;cursor:pointer;border:2px solid #e1e7ed;box-shadow:0 2px 15px -3px rgba(69,77,89,.32)}form#mec_reg_fields_form input[type=radio]:checked:before{border:7px solid #ccecf4;background:#fff;box-shadow:0 3px 16px -3px #008aff;width:4px;height:4px}form#mec_reg_fields_form input[type=radio]{min-height:0;margin-right:6px}form#mec_reg_fields_form label{margin-right:20px}@media (min-width:1200px) and (max-width:1366px){.mec-tooltip .box{min-width:290px}.mec-tooltip .box h5{font-size:15px}.mec-tooltip .box .content{font-size:12px}}@media (max-width:1366px){.wns-be-container .wns-be-group-tab p{margin-top:0}}.mec-addons-notification-box-wrap .w-col-sm-12,.mec-cmsg-notification-box-wrap .w-col-sm-12{padding:0}.mec-addons-notification-box-wrap img{width:auto}.mec-addons-notification-box-image{width:555px;display:inline-block;vertical-align:top}.mec-addons-notification-box-content{width:calc(100% - 559px);display:inline-block}.mec-addons-notification-box-content p{margin-top:1%;line-height:1.5;font-size:16px}.mec-addons-notification-box-content .w-box-content{padding-top:0;padding-bottom:0}.mec-addons-notification-box-content ol{font-size:16px}.mec-addons-notification-box-content a{background:#38d5ed;color:#fff!important;padding:10px 26px;margin-top:5px;display:inline-block;border-radius:3px;text-transform:capitalize;font-size:16px;letter-spacing:.4px;transition:all .1s ease;font-weight:600;text-decoration:none}.mec-addons-notification-box-content a:hover{background:#000}.w-clearfix.w-box.mec-addons-notification-box-wrap span,.w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span,.w-clearfix.w-box.mec-cmsg-notification-box-wrap span{right:0;left:unset;cursor:pointer;background:0 0;padding:0 16px}.w-clearfix.w-box.mec-addons-notification-box-wrap span i,.w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span i,.w-clearfix.w-box.mec-cmsg-notification-box-wrap span i{font-size:28px;vertical-align:sub;color:#f2113e}.mec-custom-msg-notification-wrap,.wns-be-container .mec-addons-notification-wrap{padding:0;margin:0}.mec-custom-msg-notification-wrap .w-col-sm-12,.wns-be-container .mec-addons-notification-wrap .w-col-sm-12{padding:0}.wns-be-container .w-box{margin-top:0}.wns-be-container.mec-addons-notification-set-box{margin-right:15px;margin-top:50px;margin-bottom:27px}@media (max-width:1200px){.mec-addons-notification-box-content,.mec-addons-notification-box-image{width:100%;display:block}.mec-addons-notification-box-image{text-align:center}}@media (max-width:768px){.mec-addons-notification-box-image img{width:100%;height:auto}}.mec-details-addons-container{margin-top:20px}.mec-details-addons-wrap img{float:left;width:19%;margin-right:17px}.mec-details-addons-wrap{clear:both;margin-bottom:80px;display:block;position:relative}.mec-details-addons-wrap a{text-decoration:none}.mec-details-addons-wrap p{float:left;width:340px;margin-top:0;margin-bottom:30px}.mec-details-addons-title{font-weight:700}.mec-details-addons-title a{color:#444}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx{border-radius:10px!important;box-shadow:0 4px 38px rgba(0,0,0,.14)!important}body .crisp-client .crisp-1rjpbb7 .crisp-13qutdl,body .crisp-client .crisp-1rjpbb7 .crisp-13qutdl *,body .crisp-client .crisp-1rjpbb7 .crisp-9dgo7z,body .crisp-client .crisp-1rjpbb7 .crisp-9dgo7z *{font-family:proxima-nova,-apple-system,BlinkMacSystemFont,"Segoe UI",Catamaran,sans-serif!important}body .crisp-client .crisp-1rjpbb7 .crisp-145mbcr,body .crisp-client .crisp-1rjpbb7 .crisp-1jrqqbm:hover{background-color:#fff!important}body .crisp-client .crisp-1rjpbb7 .crisp-14u434g{border-color:#e7e8e9!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-1bkorcf .crisp-1vzg1qq{font-size:20px!important;width:14px!important;height:19px!important;opacity:.85}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-1bkorcf .crisp-1vzg1qq:hover{opacity:.99}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-1sps3eb .crisp-1vd2grm .crisp-12w4w1a{font-size:13px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-1sps3eb .crisp-1vd2grm .crisp-12w4w1a::-webkit-input-placeholder{color:#717273!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from=visitor] .crisp-z89v5n .crisp-162m9xf{background-color:#008aff!important;color:#fff!important;box-shadow:none!important;border-radius:5px!important;padding:15px 25px 15px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from=visitor] .crisp-z89v5n .crisp-162m9xf .crisp-1o2g4mc{color:#fff!important;font-size:13px!important;letter-spacing:.3px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-z89v5n .crisp-162m9xf{background-color:#f1f2f3!important;border-radius:5px!important;padding:15px 25px 15px!important;box-shadow:none!important;color:#121314!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-type=audio] .crisp-z89v5n .crisp-162m9xf{background-color:#d1d7dc!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv[data-from=operator] .crisp-z89v5n .crisp-1o2g4mc{color:#121314!important;-webkit-text-fill-color:#121314!important;font-size:13px!important;letter-spacing:.3px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-mkirz6 .crisp-12qaym5 .crisp-39hskb{opacity:.4;margin-right:5px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-zyxrmn .crisp-1bu0ive .crisp-z7oo2o .crisp-lgu84d .crisp-1ohjrf0 .crisp-dqw9ko .crisp-bhspdv .crisp-mkirz6 .crisp-12qaym5 .crisp-ehr6mw{opacity:.68;font-size:12px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg{background-image:linear-gradient(125deg,#008aff -10%,#0066b1 100%)!important;height:110px!important;padding-top:35px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-1uw6f17,body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-85evuk,body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx .crisp-1784wh6 .crisp-1xmtdlg .crisp-rhv8pz .crisp-nu40j6{font-size:17px!important;line-height:28px!important;padding-top:10px!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-kquevr .crisp-x94m06{background-color:#008aff!important;background-image:linear-gradient(125deg,#008aff -10%,#008af0 100%)!important;box-shadow:0 5px 34px -6px #008aff!important}body .crisp-client .crisp-1rjpbb7 .crisp-4oo1n4{background-color:transparent!important}body .crisp-client .crisp-1rjpbb7 .crisp-1rf4xdh .crisp-ewasyx[data-chat-status=ongoing] .crisp-1784wh6 .crisp-1xmtdlg .crisp-172kolj{margin-top:-10px!important}body .crisp-client .crisp-1rjpbb7[data-last-operator-face=false] .crisp-1rf4xdh .crisp-kquevr .crisp-x94m06 .crisp-16qgsyi .crisp-101bp3x[data-is-ongoing=false]{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1OCIgaGVpZ2h0PSI1NSIgdmlld0JveD0iMCAwIDU4IDU1Ij4NCiAgPGcgaWQ9ImNoYXQtc3ZncmVwby1jb21fMV8iIGRhdGEtbmFtZT0iY2hhdC1zdmdyZXBvLWNvbSAoMSkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTEuNSkiPg0KICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMjksMS41YzE2LjAxNiwwLDI5LDExLjY0MSwyOSwyNmEyNC4wMSwyNC4wMSwwLDAsMS00LjgsMTQuMzE4Yy40LDQuNzQ1LDEuNTQyLDExLjQyOCw0LjgsMTQuNjgyLDAsMC05Ljk0My0xLjQtMTYuNjc3LTUuNDYybC0uMDIyLjAwOWMtMi43NjQtMS44LTUuNTMyLTMuNjU2LTYuMS00LjEyNmExLDEsMCwwLDAtMS4zMy0uMjc3LDEuMDE3LDEuMDE3LDAsMCwwLS40ODkuODQ4Yy0uMDEuNjIyLjAwNS43ODQsNS41ODUsNC40MjFBMzEuOTE0LDMxLjkxNCwwLDAsMSwyOSw1My41Yy0xNi4wMTYsMC0yOS0xMS42NDEtMjktMjZTMTIuOTg0LDEuNSwyOSwxLjVaIiBmaWxsPSIjZmZmIi8+DQogICAgPGNpcmNsZSBpZD0iRWxsaXBzZV8xIiBkYXRhLW5hbWU9IkVsbGlwc2UgMSIgY3g9IjMiIGN5PSIzIiByPSIzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiAyNC41KSIgZmlsbD0iIzAwOGFmZiIvPg0KICAgIDxjaXJjbGUgaWQ9IkVsbGlwc2VfMiIgZGF0YS1uYW1lPSJFbGxpcHNlIDIiIGN4PSIzIiBjeT0iMyIgcj0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYgMjQuNSkiIGZpbGw9IiMwMDhhZmYiLz4NCiAgICA8Y2lyY2xlIGlkPSJFbGxpcHNlXzMiIGRhdGEtbmFtZT0iRWxsaXBzZSAzIiBjeD0iMyIgY3k9IjMiIHI9IjMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwIDI0LjUpIiBmaWxsPSIjMDA4YWZmIi8+DQogIDwvZz4NCjwvc3ZnPg0K)!important;height:31px!important;top:16px!important;left:14px!important}body .csh-category-item a h6{text-align:left}.mec-form-row.mec-syn-schedule{background:#fff;padding:20px;border:1px solid #eee;margin-bottom:10px;border-radius:3px}.mec-form-row.mec-syn-schedule p{padding-left:26px}.mec-form-row.mec-syn-schedule h2{margin-top:0}.mec-form-row.mec-syn-schedule h4{margin:10px 0}li.wns-be-group-menu-li.mec-settings-menu a svg{position:absolute;margin-top:2px}li.wns-be-group-menu-li.mec-settings-menu a svg{fill:#a0abb5;stroke:#a0abb5}li.wns-be-group-menu-li.mec-settings-menu:hover a svg{fill:#07bbe9;stroke:#07bbe9}li.wns-be-group-menu-li.mec-settings-menu.active a svg{fill:#07bbe9;stroke:#07bbe9}li.wns-be-group-menu-li.mec-settings-menu .mec-settings-submenu{position:absolute;top:-1px;right:-222px;width:220px;z-index:9;background:#fff;border:1px;border-style:solid;border-color:#e6e9eb;margin:0;overflow:visible;opacity:0;visibility:hidden;transition:all .23s ease;padding-top:8px;padding-bottom:12px;border-radius:0 2px 2px 0;box-shadow:0 2px 4px rgba(0,0,0,.03)}li.wns-be-group-menu-li.mec-settings-menu:hover>.mec-settings-submenu{visibility:visible;opacity:1}.mec-settings-menu .mec-settings-submenu:before{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:#fff;left:-15px;top:14px;border-right-color:#d6d9db;right:0}.mec-settings-menu .mec-settings-submenu:after{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:#fff;left:-14px;top:14px}.wns-be-sidebar .mec-settings-menu .mec-settings-submenu a{background:#fff;color:#666c75;opacity:1;font-size:13px;font-weight:400;padding:6px 4px 5px 26px}.wns-be-sidebar .mec-settings-menu .mec-settings-submenu a:hover{color:#000;background:#f7f8f9}.mec-form-row.mec-skin-countdown-date-format-container input[type=text],.mec-form-row.mec-skin-grid-date-format-container input[type=text],.mec-form-row.mec-skin-list-date-format-container input[type=text],.mec-skin-options-container input[type=text]{max-width:unset}.wn-mec-select{width:32.33333333%!important;clear:unset!important}.wn-mec-select{-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:3px;border:1px solid #ddd;margin-bottom:8px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;box-shadow:0 3px 13px -5px rgba(0,0,0,.1),inset 0 1px 2px rgba(0,0,0,.07)}.wn-mec-select:hover{border-color:#dbdbdb}.wn-mec-select.open .list{overflow:unset;width:100%;margin:0}.wn-mec-select .list{background-color:#fff;border-radius:2px;box-shadow:0 2px 33px -2px rgba(0,0,0,.2),inset 0 1px 2px rgba(0,0,0,.07);box-sizing:border-box;margin-top:4px;opacity:0;overflow:hidden;padding:0;pointer-events:none;position:absolute;top:100%;left:0;-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.75) translateY(-21px);-ms-transform:scale(.75) translateY(-21px);transform:scale(.75) translateY(-21px);-webkit-transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;z-index:9}.wn-mec-select{-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:5px;border:solid 1px #e8e8e8;box-sizing:border-box;clear:both;cursor:pointer;display:block;float:left;font-family:inherit;font-size:14px;font-weight:400;height:42px;line-height:40px;outline:0;padding-left:18px;padding-right:30px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;width:auto}.wn-mec-select:hover{border-color:#dbdbdb}.wn-mec-select:after{border-bottom:2px solid #999;border-right:2px solid #999;content:"";display:block;height:5px;margin-top:-4px;pointer-events:none;position:absolute;right:12px;top:50%;-webkit-transform-origin:66% 66%;-ms-transform-origin:66% 66%;transform-origin:66% 66%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;width:5px}.wn-mec-select.open:after{-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.wn-mec-select.open .list{opacity:1;pointer-events:auto;-webkit-transform:scale(1) translateY(0);-ms-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}.wn-mec-select.disabled{border-color:#ededed;color:#999;pointer-events:none}.wn-mec-select.disabled:after{border-color:#ccc}.wn-mec-select.wide{width:100%}.wn-mec-select.wide .list{left:0!important;right:0!important}.wn-mec-select.right{float:right}.wn-mec-select.right .list{left:auto;right:0}.wn-mec-select.small{font-size:12px;height:36px;line-height:34px}.wn-mec-select.small:after{height:4px;width:4px}.wn-mec-select .list{background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(68,68,68,.11);box-sizing:border-box;margin-top:4px;opacity:0;overflow:hidden;padding:0;pointer-events:none;position:absolute;top:100%;left:0;-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.75) translateY(-21px);-ms-transform:scale(.75) translateY(-21px);transform:scale(.75) translateY(-21px);-webkit-transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;z-index:9}.wn-mec-select .list:hover .option:not(:hover){background-color:transparent!important}.wn-mec-select .option{cursor:pointer;font-weight:400;list-style:none;min-height:40px;outline:0;text-align:left;position:relative;font-size:12px!important;padding:1px 12px!important;margin:0!important;line-height:28px!important;min-height:28px!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wn-mec-select .option .wn-hover-img-sh img{position:absolute;padding:3px;top:-1px;left:100%;box-shadow:0 4px 42px -5px rgba(0,0,0,.16);visibility:hidden;opacity:0;border:1px solid #e3e3e3;border-radius:2px;z-index:99999999;background:#fff}.wn-mec-select .option:hover .wn-hover-img-sh img{visibility:visible;opacity:1}.wn-mec-select .option.focus,.wn-mec-select .option.selected.focus,.wn-mec-select .option:hover{background-color:#f6f6f6}.wn-mec-select .option.selected{font-weight:700}.wn-mec-select .option.disabled{background-color:transparent;color:#999;cursor:default}.no-csspointerevents .wn-mec-select .list{display:none}.no-csspointerevents .wn-mec-select.open .list{display:block}.mec-custom-nice-select ul.list li.option{width:30%!important;float:left!important;min-height:135px!important;height:135px;margin:1.66%!important;box-sizing:border-box;text-align:center;padding:10px!important;border-radius:8px;border:1px solid transparent;box-shadow:none;background:#fff0!important}.mec-custom-nice-select ul.list li.option:hover{box-shadow:0 1px 8px rgba(0,0,0,.025),0 0 0 1px #f3f4f5}.mec-custom-nice-select .list .option:hover,.mec-custom-nice-select ul.list li.option:hover{background:#fff!important}.mec-custom-nice-select .list:hover .option:not(:hover),.mec-custom-nice-select ul.list:hover li.option{background:#fff!important}.mec-custom-nice-select ul.list{min-width:600px!important;padding:20px 10px!important;background:#fcfbfd;border:1px solid #e9e9e9;box-shadow:0 1px 4px rgba(0,0,0,.05)}.mec-custom-nice-select ul.list li.option.selected{border:1px solid #40d9f16b;box-shadow:0 1px 8px -3px #40d9f152 inset;color:#00cae6;padding:12px 0 0 0!important}.mec-custom-nice-select .wn-img-sh img{margin:4px 0 1px 1px;line-height:1;max-width:68px;max-height:56px;filter:grayscale(1);-webkit-filter:grayscale(1);transition:all .22s ease;-webkit-transition:all .22s ease;-moz-transition:all .22s ease;-ms-transition:all .22s ease;-o-transition:all .22s ease}.wn-mec-select .option.focus .wn-img-sh img,.wn-mec-select .option.selected.focus .wn-img-sh img,.wn-mec-select .option:hover .wn-img-sh img{background-color:#f6f6f6;filter:grayscale(0);-webkit-filter:grayscale(0)}@media (max-width:768px){.wn-mec-select{width:45%!important}.mec-custom-nice-select ul.list{margin-left:-24px!important;min-width:404px!important}.mec-custom-nice-select ul.list li.option{width:46.6%!important}.wn-hover-img-sh{display:none}}@media (max-width:480px){.wn-mec-select{width:100%!important}.mec-custom-nice-select ul.list{min-width:337px!important}}@media (max-width:320px){.mec-custom-nice-select ul.list li.option{width:100%!important}.mec-custom-nice-select ul.list{min-width:298px!important}}.mec-sed-methods li{line-height:28px;padding-left:38px;position:relative}.mec-sed-methods li:before{margin-right:0}.mec-sed-methods li:before{border-radius:18px}.mec-custom-nice-select ul.list li .wn-mec-text:after,.mec-sed-methods li:before{content:"";position:absolute;display:inline-block;background:#fff;border-radius:2px;width:12px;height:12px;margin:-1px 0 0 -1px;cursor:pointer;border:2px solid #e1e7ed;border-radius:50%}.mec-custom-nice-select ul.list li .wn-mec-text{position:relative;padding-top:0;padding-bottom:28px}.mec-custom-nice-select ul.list li .wn-mec-text:after{left:calc(50% - 7px);top:auto;bottom:1px}.mec-custom-nice-select ul.list li .wn-img-sh{line-height:1}.mec-sed-methods li:before{left:9px;top:calc(50% - 7px)}.mec-custom-nice-select ul.list li.option.selected .wn-mec-text:after,.mec-sed-methods li.active:before{width:4px;height:4px;border:7px solid #07bbe9;background:#fff;box-shadow:0 3px 16px -3px #07bbe9}#menu-posts-mec-books .wp-menu-image img,#toplevel_page_mec-intro .wp-menu-image img{width:18px!important;padding-top:7px!important}.mec-add-booking-tabs-wrap,.mec-add-event-tabs-wrap,.mec-create-shortcode-tabs-wrap{display:flex;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mec-add-booking-tabs-left,.mec-add-event-tabs-left{min-width:200px}@media (max-width:1366px){.mec-add-booking-tabs-left,.mec-add-event-tabs-left{min-width:137px}}.mec-add-booking-tabs-left,.mec-add-event-tabs-left,.mec-create-shortcode-tabs-left{flex:1}.mec-add-booking-tabs-right,.mec-add-event-tabs-right,.mec-create-shortcode-tabs-right{flex:6}a.mec-add-booking-tabs-link,a.mec-add-event-tabs-link,a.mec-create-shortcode-tabs-link{display:block}.mec-booking-tab-content,.mec-create-shortcode-tab-content,.mec-event-tab-content{display:none;transition:all .3s ease}.mec-booking-tab-content.mec-tab-active,.mec-create-shortcode-tab-content.mec-tab-active,.mec-event-tab-content.mec-tab-active{display:block}.mec-add-booking-tabs-wrap,.mec-add-event-tabs-wrap{background:#fff;margin:-6px -12px -12px}.mec-create-shortcode-tabs-wrap{margin:-30px -22px -42px}.mec-add-booking-tabs-left,.mec-add-event-tabs-left,.mec-create-shortcode-tabs-left{background:#f7f8f9}.mec-add-booking-tabs-left a,.mec-add-event-tabs-left a,.mec-create-shortcode-tabs-left a{display:block;position:relative;outline:0;padding:13px 4px 13px 15px;background:#e3e5e7;background:0 0;border:solid;border-width:1px 0 1px 0;border-color:transparent;color:#3f454a;font-size:13px;font-weight:600;text-decoration:none;border-radius:0;transition:all .2s ease}.mec-add-booking-tabs-left a:first-of-type,.mec-add-event-tabs-left a:first-of-type,.mec-create-shortcode-tabs-left a:first-of-type{border-top:none}.mec-add-booking-tabs-left a:hover,.mec-add-event-tabs-left a:hover,.mec-create-shortcode-tabs-left a:hover{background:#fff;color:#07bbe9}.mec-add-booking-tabs-left a:focus,.mec-add-event-tabs-left a:focus,.mec-create-shortcode-tabs-left a:focus{box-shadow:none;outline:unset}.mec-add-booking-tabs-left a.mec-tab-active,.mec-add-event-tabs-left a.mec-tab-active,.mec-create-shortcode-tabs-left a.mec-tab-active{background:#ecf9fd;color:#07bbe9;border-color:#ccecf4;position:relative;padding-left:17px}.inside div div>a.mec-tab-active:after,.inside div div>a.mec-tab-active:before{position:absolute;z-index:9!important;content:" ";height:0;width:0;border:8px solid transparent;border-right-color:#fff;right:-1px;top:13px}.inside div div>a.mec-tab-active:before{border-right-color:#d7d8d9;right:0}.mec-add-booking-tabs-right,.mec-add-event-tabs-right,.mec-create-shortcode-tabs-right{padding:0 30px 40px;border-left:1px solid #e2e2e2}.mec-booking-tab-content.mec-tab-active,.mec-create-shortcode-tab-content.mec-tab-active,.mec-event-tab-content.mec-tab-active{animation:fadeEffect2 .31s}@media (max-width:1366px){.mec-add-booking-tabs-right,.mec-add-event-tabs-right,.mec-create-shortcode-tabs-right{padding:0 15px 20px}.mec-form-row select{min-width:60px}}@media (min-width:1199px) and (max-width:1280px){.mec-add-booking-tabs-right,.mec-add-event-tabs-right,.mec-create-shortcode-tabs-right{padding:0 0 0 10px}#mec_meta_box_hourly_schedule_days{padding:0 40px 0 0}#mec_meta_box_hourly_schedule_days .mec-form-row.mec-box{margin-right:-40px}#mec_comment,#mec_cost,#mec_countdown_method,#mec_event_timezone,#mec_public,#mec_repeat_type{min-width:220px;width:220px}#mec_meta_box_hourly_schedule_days .mec-box.mec-form-row input[type=text]{max-width:120px}.mec-form-row .mec-time-picker select{min-width:60px}#mec_countdown_method,#mec_repeat_type{min-width:220px;width:220px}#mec_exceptions_in_days_container .mec-col-4{width:25%}#mec_exceptions_in_days_container .mec-col-3{width:50%}#mec_exceptions_in_days_container .mec-col-5{width:20%}#mec_exceptions_in_days_container input[type=text]{width:95%}#mec_repeat_certain_weekdays_container label:not(.mec-col-3){display:block;padding-left:25%}}@media (max-width:1023px){.post-type-mec-events h4,.post-type-mec_calendars .mec-meta-box-fields h3{margin-top:20px}.post-type-mec-events .mec-form-row{padding-bottom:20px}.post-type-mec-events .mec-form-row .mec-form-row{padding:0}.post-type-mec-events .mec-form-row .mec-col-1,.post-type-mec-events .mec-form-row .mec-col-10,.post-type-mec-events .mec-form-row .mec-col-11,.post-type-mec-events .mec-form-row .mec-col-12,.post-type-mec-events .mec-form-row .mec-col-2,.post-type-mec-events .mec-form-row .mec-col-3,.post-type-mec-events .mec-form-row .mec-col-4,.post-type-mec-events .mec-form-row .mec-col-5,.post-type-mec-events .mec-form-row .mec-col-6,.post-type-mec-events .mec-form-row .mec-col-7,.post-type-mec-events .mec-form-row .mec-col-8,.post-type-mec-events .mec-form-row .mec-col-9{display:block;width:100%;margin:20px 0 0 0;max-width:285px}.post-type-mec-events .mec-add-booking-tabs-left,.post-type-mec-events .mec-add-event-tabs-left{min-width:180px}.post-type-mec-events .mec-add-booking-tabs-left a,.post-type-mec-events .mec-add-event-tabs-left a,.post-type-mec-events .mec-create-shortcode-tabs-left a{padding-left:10px}#mec_repeat_type,.post-type-mec-events #mec_settings_fes_thankyou_page_url,.post-type-mec-events .mec-form-row .mec-col-4 input[type=number],.post-type-mec-events .mec-form-row .mec-col-4 input[type=text],.post-type-mec-events .mec-form-row .mec-col-4 select,.post-type-mec-events .mec-form-row .mec-col-4 textarea{width:100%;max-width:255px}#mec-exceptional-days .mec-certain-day>div,#mec_exceptions_in_days_container .mec-certain-day>div{width:100%;max-width:255px;padding:12px;margin:20px 10px 0 0;border-radius:8px}.mec-certain-day .mec-in-days-day,.mec-certain-day>div .mec-not-in-days-day{line-height:21px;font-size:10px}#mec_repeat_certain_weekdays_container label{display:block;margin:20px 0 20px 0}}@media (max-width:640px){.mec-add-booking-tabs-wrap,.mec-add-event-tabs-wrap,.mec-create-shortcode-tabs-wrap{display:block}.post-type-mec-events .mec-add-booking-tabs-left,.post-type-mec-events .mec-add-event-tabs-left{min-width:100%;width:100%!important;display:block!important;float:unset;margin:0;flex:unset;height:auto}.post-type-mec-events .mec-add-booking-tabs-right,.post-type-mec-events .mec-add-event-tabs-right,.post-type-mec-events .mec-create-shortcode-tabs-right{display:block;min-width:100%;width:100%;margin:0;flex:unset}.post-type-mec-events .mec-add-booking-tabs-left a,.post-type-mec-events .mec-add-event-tabs-left a,.post-type-mec-events .mec-create-shortcode-tabs-left a{font-size:14px;padding:14px 10px 14px 15px;line-height:1.2;letter-spacing:0}.mec-add-booking-tabs-right,.mec-add-event-tabs-right,.mec-create-shortcode-tabs-right{padding-left:10px;padding-right:10px}#mec_tickets .mec-box{max-width:290px}}@keyframes fadeEffect2{from{opacity:0;transform:translateX(11px)}to{opacity:1;transform:translateX(0)}}.mec-form-row .mec-col-8 label,.mec-form-row .mec-col-9 label{padding-right:20px}@media (min-width:860px) and (max-width:1280px){.mec-form-row .mec-col-9 label{padding-right:12px}}#mec-event-data .mec-form-row label{margin-right:14px}.mec-form-row input[type=date]::-webkit-calendar-picker-indicator{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA0QjQ2N0QwQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA0QjQ2N0QxQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDRCNDY3Q0VCNDgzMTFFQThEN0VERkNFNTExRURFMzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDRCNDY3Q0ZCNDgzMTFFQThEN0VERkNFNTExRURFMzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6WW71PAAAGIklEQVR42qRXS28bVRQ+586Mx3ZC1DSpVFojRU2CqMIGiSKxAVoUduzoDjYIlhU/Av4AYsdjRXfkD0Cjom6QqIqEqEhRo1aRkkZpkpY6j7GduQ++c2dsj1+BlInGztxvzj3nfudpPlM/otc2W2QjJmU0rZ0uUytUpBxNnN9p/FYhctF0+XUi2nPGkX7WJOfwxNRzqXxtbfI4eUvm7xY1o4iiI0d/vFiisL2BgTAz0yvbCRnLhP0uNEtqrgUseZRcwPPvJewaldSA8o48vo+Tj0U+CnrkOgZwvkEzEmGm1PF9fzK5Y3U/YlllsjRUv19zXl7571HyAjooc/kmYerpcmPO0Mfa0SyxEtji44ynOjPuayjecd7M46/MQOdGyIs9ThnzMLD0XRrwIdeetmoLm41fWiG95Ar792tydLLrOPkAlpW027hbG3+T37lf/5EtvYcXUuhfBjWp9wHRBO63c5lbEkQj2B92uaHy4l2EAQ66GFgbmiD4id/9q661ooAtf8rsvmUEilAHEqcgtJvvNq3YPTkJA8PksT9ZFxD8+4my9pvAOqOMxIMoJHfPZoJkJNiYat3duOac6hxt1N3GR8lnt0O623s+c2CVZEGaZ8Oks1mElvxu7hGYaQjpHLpH3q/YFQE7Oh5Y6gFTaHhAXlasxmoWpZO5L9Ow4DTv+UBZBAkWNO+CqhkbSOzaXWWyzY+n3WcACdVscnklz5CHYsmv1L/RyUJ/cs7zdT3Ey8pTgw/QgNNuS4XjNMvffwvBNmwDH+pdeZ3J+1qDdW15vS0iBhjZWzF9ge8HWl7zNLluYhP/9/jvFANXyL+ufF4jZvOCZsK8isp77+sixf10n7QQjJT39bBtjzdA5chtLG61n7kgk6UvDy29z4HL4c/ifkN0hYV+cA3Bc7stKAfossgSSF06+3HOu8QovE8eThDlv4pu1TbUOpqySDNUKMSDQRIo6QgVRHbFcID1mCITUGgNKLI9uBbcCC59xUi+DsiHBq0XOLb3utqOUYV+LglH9XJASRAsRNqt4xHVj59Exqw3AlrYi0PaiwNqBKoX12Y9iQSP/GkD4xZC0yt/GPFCvZzhUBoMtmPftRwMEEtpupy2auzadLraXtlNoXLhKQYLbjrWRx0cXNf24wxPSmWw5aZPNXSNOi5ytXqZpjTwSqs3PsJi0I61LG29EFG9GtyaeqgvxU17TrAkDjbvnq/eKcTYrbcemi5eHoI/OLgUt7r4n+cqd04llmZ3mjBSDQ4kYtERLLz4OKGt0xGKA9+RgiSGSRV7+UlCVvka72lEvHRx04vLGW2f/PzTBk3VtddRrGlhMXVaIdME5sLJ3ZQOTPQBNqj58uzcxsXtZEkqmQ7IB9ihLeA2x6FQqyG4cRuvbh8uNZSigzBCALhBBtrjkwjjQItQ+kPXWY6eBuEi/lmOlC8kvTh38ZLH3QC+y+GiIl4OqbeZ9RggQZgcVIXe1ep48jPkz/oGw7x1yoytIq1o59AH1Wp1rNHBSXA9tip87zYyvFzpx8dXLVTvqySvhUMNsN6+1ERrrNQVQs57H4K6cR35GrapffICb16RpO7glOHrrQyvjHXxQHB0/j1ugV0LpcFwAzS4n6hiZoIvEp2znwcSigfGJhxpMmseLc0dvFjcvRuLvdEdNyl2+0DOALwE863TM/jnJqhfQa6v4AfJzUNOZ/aVlhqIUpoO4PuU4XFsqFrSM866m9hxBXSvWPx/wHpGqA96Vfa5AH9HnMjYNI96dbkwaVzcCw/nAK+xHzp4Hp89eD04nENzX6v4cYrnrVWXXQF/Fh7MQfWasmogCNsmaT+qwD0g4gYsuYqnWlboeKMUumUr86LycxdwdRUb+zQTvAzcgL0jLXFkbkQUX5UKyFTE2bvZD0a5B8SAUu6dPf+7AInssja2VPSZRud2Ni/NKse5M2VQqkO4BxSzZLmV8Wwpa8S9OHsK3X6+Lc7F/JidOwvkc7z3FbIgzd7smy1c35TEg7NGrg6Ucs88UsCliOLHH1+Td8HYFl++W//QxfT9iSee/3lJWy5X6aMwtK3rTVWJUU4/g4GzdLLp73ku8cEDxNmXUZhc/0eAAQAVgX0RHvvILQAAAABJRU5ErkJggg==);background-position:center;background-size:cover;width:10px;height:12px;display:block}.mec-attendees-wrapper select,.mec-calendar-metabox .wn-mec-select,.mec-form-row input[type=date],.mec-form-row input[type=email],.mec-form-row input[type=number],.mec-form-row input[type=password],.mec-form-row input[type=tel],.mec-form-row input[type=text],.mec-form-row input[type=url],.mec-form-row select,.mec-form-row textarea,.mec-form-row.mec-skin-list-date-format-container input[type=text],.mec-occurrences-wrapper input[type=date],.mec-occurrences-wrapper input[type=email],.mec-occurrences-wrapper input[type=number],.mec-occurrences-wrapper input[type=tel],.mec-occurrences-wrapper input[type=text],.mec-occurrences-wrapper input[type=url],.mec-occurrences-wrapper select,.mec-occurrences-wrapper textarea{border:none;background-color:#f7f8f9;border-radius:5px;height:38px;line-height:38px;padding-left:10px;vertical-align:top;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}.mec-calendar-metabox .wn-mec-select,.mec-form-row select,.post-type-mec-events .mec-form-row select,.post-type-mec_calendars .mec-form-row select,.wns-be-main .mec-form-row select{appearance:none;-webkit-appearance:none;-moz-appearance:none;cursor:pointer;min-height:34px;line-height:34px;background-color:#f7f8f9;border-radius:5px;padding-right:24px;box-shadow:0 1px 3px rgb(0 0 0 / 2%);transition:all .23s ease;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE3IDE3Ij4KPGc+CjwvZz4KCTxwYXRoIGQ9Ik0xNi4zNTQgNS4wNzVsLTcuODU1IDcuODU0LTcuODUzLTcuODU0IDAuNzA3LTAuNzA3IDcuMTQ1IDcuMTQ2IDcuMTQ4LTcuMTQ3IDAuNzA4IDAuNzA4eiIgZmlsbD0iIzAwMDAwMCIgLz4KPC9zdmc+Cg==);background-repeat:no-repeat;background-size:26px 10px;background-position:right center;min-width:160px;border:1px solid #e6e9eb}.post-type-mec-events .mec-form-row .mec-time-picker select,.post-type-mec-events .wn-ticket-time select{min-width:60px}.wns-be-main .mec-col-4 select{min-width:unset}.mec-form-row .nice-select{background-image:unset}.mec-calendar-metabox .wn-mec-select.open .list{border-radius:0 0 2px 2px;box-shadow:0 0 0 1px #ddd,0 2px 6px rgba(0,0,0,.07)}.mec-calendar-metabox .mec-custom-nice-select.open ul.list{border-radius:5px;box-shadow:0 2px 6px rgb(0 0 0 / 3%);margin-left:0!important;transform:translateX(-50%);left:50%}.mec-custom-nice-select ul.list li.option.selected .wn-mec-text:after{border:6px solid #40d9f1;box-shadow:0 3px 16px -3px #40d9f1}.mec-form-row label+span.mec-tooltip{bottom:0}.mec-form-row textarea+span.mec-tooltip{bottom:auto;vertical-align:top;top:12px}.mec-form-row span+span.mec-tooltip{bottom:0;vertical-align:middle}.mec-form-row .tooltip-move-up span+span.mec-tooltip i{margin-top:-40px}.mec-form-row .mec-col-8 input[type=text],.mec-form-row .mec-col-8 select,.mec-form-row .mec-col-8 span.mec-archive-skins{vertical-align:top}.mec-form-row .mec-col-8 span.mec-archive-skins input[type=text]{max-width:225px}.mec-form-row input:disabled{opacity:.6;background:#f6f6f6}.wns-be-group-tab h5{font-size:16px;font-weight:600;color:#444;margin:0 0 40px 0}.mec-form-row textarea{height:auto;margin-bottom:0;min-height:60px}.mec-form-row .wp-picker-container input[type=text].wp-color-picker{height:25px;vertical-align:top;width:4rem;margin:-1px 0 0 0!important}.mec-form-row .wp-picker-container label{margin:0}.mec-image-select-wrap li span:hover{border-color:#fff;box-shadow:0 1px 8px rgba(0,0,0,.12)}.mec-message-categories li.mec-acc-label:after{content:"\e604";font-family:simple-line-icons;speak:none;font-style:normal;font-weight:400;display:block;font-size:13px;color:#999;position:absolute;right:27px;top:26px}.mec-message-categories>li.mec-acc-label[data-status=open]:after{content:"\e607";color:#07bbe9}.mec-message-categories>li.mec-acc-label[data-status=open]{color:#07bbe9}.mec-message-categories>li.mec-acc-label:last-of-type{border-bottom:none}.mec-message-categories>li.mec-acc-label[data-status=open]{border-bottom:1px solid #e6e6e6}.mec-form-row ul.mec-message-categories{border-radius:5px;overflow:hidden;margin-top:30px;background:#f5f5f5;border:2px solid #e6e6e6;max-width:700px}.mec-form-row ul.mec-message-categories li ul{padding:10px 40px 40px;margin:0 -30px 0;background:#fff;box-shadow:inset 0 6px 7px -2px rgb(0 0 0 / 4%);border-top:1px solid #eee;cursor:default}.mec-form-row ul.mec-message-categories ul label{margin:0;font-size:14px;color:#888;cursor:default}#mec_calendar_display_options .mec-tooltip{bottom:1px}#database_setup_button,#mec_add_fee_button,#mec_add_ticket_variation_button,#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button,#taxes_option #mec_fees_list .mec-form-row .button,#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button,.mec-export-settings,.mec-form-row .button:not(.wp-color-result),.mec-import-settings,.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result),.mec-occurrences-wrapper .button:not(.wp-color-result){border-radius:25px;border:1px solid #d1e5ec;text-shadow:none;padding:0 12px;height:38px;letter-spacing:.2px;margin-right:5px;background:#fff;color:#07bbe9;box-shadow:0 1px 5px -1px rgb(0 0 0 / 5%);transition:all .2s ease;cursor:pointer;display:inline-block;line-height:36px;text-decoration:none}#mec_add_fee_button:hover,#mec_add_ticket_variation_button:hover,#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:hover,.button:not(.wp-color-result):hover .mec-export-settings:hover,.mec-import-settings:hover,.mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):hover,.mec-occurrences-wrapper .button:not(.wp-color-result):hover{background:#f0f9fc;color:#07bbe9}#taxes_option #mec_fees_list .mec-form-row .button,#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button{margin:0}#mec-hourly-schedule .mec-form-row .mec-col-1 .button,#mec-hourly-schedule .mec-form-row.mec-box .button,#mec_faq_list .mec-faq-actions .mec-faq-remove,#taxes_option #mec_fees_list .mec-form-row .button,#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button,.mec-dash-remove-btn{color:#ea6485!important;border-color:#ea6485!important}#mec-hourly-schedule .mec-form-row .mec-col-1 .button:hover,#mec-hourly-schedule .mec-form-row.mec-box .button:hover,#mec_faq_list .mec-faq-actions .mec-faq-remove:hover,#taxes_option #mec_fees_list .mec-form-row .button:hover,#ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:hover,.mec-dash-remove-btn:hover{background:rgb(234 100 133 / .1)!important}#mec-hourly-schedule .mec-hourly-schedule-form-speakers{margin-top:20px}#mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button,#mec_meta_box_downloadable_file_options #mec_public_download_module_file_remove_image_button{margin-top:12px}#mec_meta_box_downloadable_file_options input[type=file]{max-width:166px;text-align:center;transition:all .2s ease;border-radius:5px!important;border:2px dashed #b8e9f3;margin-bottom:12px;height:44px;text-decoration:none;padding:0 15px 1px;text-transform:none;letter-spacing:0;font-weight:600;color:#40d9f1;box-shadow:0 2px 6px -3px #cfeff5;display:block}#mec_meta_box_downloadable_file_options input[type=file]:hover{box-shadow:0 2px 16px -3px #cfeff5}#mec_meta_box_downloadable_file_options input[type=file]::-webkit-file-upload-button{visibility:hidden;width:1px;height:38px}#mec_meta_box_downloadable_file_options input[type=file]::-moz-file-upload-button{visibility:hidden;width:1px;height:38px}.mec-attendees-wrapper .mec-attendees-list{margin:22px 0 0}.mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child{background:#fff;border-bottom:1px solid #cfeff5}.mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child div span{line-height:1;font-weight:600}.mec-attendees-wrapper .mec-attendees-list .w-clearfix{display:flex;background:#f8feff;padding:10px;text-align:left}.mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:first-child{width:100%;max-width:30%;padding:0}.mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3 a{text-decoration:unset}.mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd){background:#fff}#mec-read-more .mec-form-row span.mec-tooltip{top:2px;left:-4px}#mec-occurrences .mec-occurrences-list{margin-top:12px}#mec-occurrences .mec-occurrences-list h3{margin:0 0 30px 0}#mec-occurrences .mec-occurrences-list .mec-form-row{margin-bottom:0}#mec-occurrences .mec-occurrences-list .mec-form-row label{display:inline-block;margin:0;width:141px}#mec-occurrences .mec-occurrences-list .mec-form-row label.label-checkbox,#mec-occurrences .mec-occurrences-list .mec-form-row label.label-radio{display:block;width:100%}#mec-occurrences .mec-occurrences-list .mec-form-row .event-status-schema label{width:auto;min-width:160px}#mec-occurrences .mec-occurrences-list .mec-form-row .event-status-schema p{border:unset;padding-left:0;margin-left:0}#mec-search-settings{border-radius:21px;min-height:32px;box-shadow:inset 0 1px 2px rgba(0,0,0,.06);margin-right:10px;color:#7c838a;font-size:13px;width:260px;background:#f7f8f9;border:none;z-index:1;transition:all .18s ease;outline:0;line-height:36px;padding:2px 10px 1px 38px}#mec-search-settings:focus{background:#fff;box-shadow:0 1px 6px rgba(0,0,0,.07),0 0 0 1px #e6e6e6;width:270px}.mec-search-settings-wrap{display:inline-block;position:relative}.mec-search-settings-wrap i{position:absolute;left:16px;top:13px;font-size:13px;color:#7e8c98;display:block;z-index:2}#mec-search-settings::-webkit-input-placeholder{color:#7c838a}#mec-search-settings::-moz-placeholder{color:#7c838a}#mec-search-settings:-ms-input-placeholder{color:#7c838a}#mec-search-settings:-moz-placeholder{color:#7c838a}#wns-be-content .noresults label,#wns-be-content .results .results .noresults label{color:#000}#wns-be-content .results .results .results label,#wns-be-content .results label,#wns-be-content ul li.enable,#wns-be-content ul li.enable label{color:#07bbe9}#wns-be-content ul li.disable,#wns-be-content ul li.disable label{color:#e7e7e7}.ui-datepicker.ui-widget{border:1px solid #e8e8e8;box-shadow:0 1px 9px rgba(0,0,0,.12)}.ui-datepicker.ui-widget select{font-weight:600;font-size:12px;border-radius:2px;padding:2px 10px;margin:1px 3px 5px}.ui-datepicker.ui-widget table{border-spacing:2px}.ui-datepicker.ui-widget td,.ui-datepicker.ui-widget tr{padding:0;background:0 0!important}.ui-datepicker.ui-widget td a{color:#777;font-weight:600;width:30px;height:30px;line-height:30px;display:inline-block;border-radius:33px;padding:0;background:#fff;transition:all .2s ease}.ui-datepicker.ui-widget td a.ui-state-active,.ui-datepicker.ui-widget td a:hover{background:#40d9f1;color:#fff}.ui-datepicker.ui-widget .ui-datepicker-next,.ui-datepicker.ui-widget .ui-datepicker-prev{color:#40d9f1;width:30px;height:30px;line-height:30px;display:inline-block;text-align:center;border-radius:33px;background:#ecfcff;transition:all .2s ease}.ui-datepicker.ui-widget .ui-datepicker-next:hover,.ui-datepicker.ui-widget .ui-datepicker-prev:hover{background:#fff;box-shadow:0 0 7px -3px rgba(0,0,0,.4)}#mec-wrap{width:92%;margin:20px auto;max-width:1200px}#mec-wrap .nav-tab-wrapper{margin-bottom:0;position:relative;z-index:8;padding:0;border-radius:10px;border:none;margin-top:35px;clear:both;background:#fff;border:1px solid #e3e5e7}#mec-wrap .nav-tab-wrapper .nav-tab{position:relative;padding:28px 17px;border:none;background:0 0;margin:0;font-size:13px;color:#444;outline:0;letter-spacing:-.1px;box-shadow:none;transition:all .2s ease}#mec-wrap .nav-tab-wrapper .nav-tab:hover{color:#07bbe9}#mec-wrap .nav-tab-wrapper .nav-tab:after{content:"";display:inline-block;width:1px;height:30%;position:absolute;right:0;top:35%;background:#e9e9e9}#mec-wrap .nav-tab-wrapper .nav-tab-active,#mec-wrap .nav-tab-wrapper .nav-tab-active:focus,#mec-wrap .nav-tab-wrapper .nav-tab-active:focus:active,#mec-wrap .nav-tab-wrapper .nav-tab-active:hover{background:#ecf9fd;outline:0;z-index:2;border:1px solid #ccecf4;color:#07bbe9;border-radius:5px;margin:-1px}#mec-wrap .nav-tab-wrapper .nav-tab-active:after{content:"";position:absolute;display:block;background:0 0;top:auto;height:auto;bottom:-20px;left:50%;margin-left:-10px;width:0;border-width:10px;border-style:solid;border-color:#ecf9fd transparent transparent}#mec-wrap .mec-container{padding:25px 40px 40px}#mec-wrap .mec-container.booking-report-container,.m-e-calendar_page_MEC-ix #mec-wrap .mec-container{border:1px solid #e3e5e7;border-top:none;border-radius:0 0 10px 10px;margin:-2px 6px 0 6px}#wpwrap .mec-button-primary{box-shadow:0 0 0 4px #e4ffe6;text-shadow:none;margin-right:5px;background:#64e385;color:#fff;border:none;cursor:pointer;padding:2px 22px;border-radius:22px;font-weight:500;line-height:39px}#wpwrap .mec-button-primary:hover{box-shadow:0 0 0 4px rgb(0 0 0 / 10%);background:#4d5051;border-color:#4d5051;cursor:pointer}#mec-wrap .nav-tab-wrapper .nav-tab-active:before{content:"";position:absolute;display:block;background:0 0;top:auto;height:auto;bottom:-24px;left:50%;margin-left:-12px;width:0;border-width:12px;border-style:solid;border-color:#ccecf4 transparent transparent}.ui-datepicker.ui-widget select{border-color:#e7e8e9}.wn-p-t-right{min-width:300px;max-width:400px;display:inline-block;top:-8px;left:50%;margin-top:0;transform:translate(-50%,-100%);padding:0;background-color:#535a61;color:#fff;font-weight:300;font-size:14px;letter-spacing:.5px;line-height:1.5;position:absolute;z-index:99999999;box-sizing:border-box;border-radius:6px;box-shadow:0 4px 45px -8px #444b50;visibility:hidden;opacity:0;transition:opacity .23s;padding:20px;border-radius:8px}.wn-p-t-right i{position:absolute!important;top:100%;right:50%;margin-top:-6px!important;margin-right:-6px!important;width:12px;height:24px;overflow:hidden;transform:rotate(-90deg)}.wn-p-t-right i:after{content:"";position:absolute;width:12px;height:12px;left:0;top:50%;transform:translate(50%,-50%) rotate(-45deg);background-color:#535a61;box-shadow:0 8px 9px -4px #535a61}.wn-p-t-right .wn-p-t-text-content h5{color:#fff;font-size:17px;font-weight:600;margin:-20px;padding:15px 0;text-align:center;margin-bottom:10px;background:#3a3f44;border-bottom:1px solid #32363a;border-radius:6px 6px 0 0}.mec-addon-box-footer a:hover .wn-p-t-right{visibility:visible;opacity:1}#mec_organizer_user+.select2-container,#mec_speaker_user+.select2-container{min-width:224px!important}.mec-add-event-tabs-wrap .select2-container,.mec-create-shortcode-tab-content .select2-container,.wns-be-main .mec-form-row .select2-container{min-height:38px;height:auto;box-sizing:border-box;padding:0 6px 0 10px;border-radius:5px;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%);background-color:#f7f8f9;color:#32373c;outline:0;transition:50ms border-color ease-in-out;min-width:200px;width:100%!important;max-width:290px!important;font-size:14px}.mec-add-event-tabs-wrap .select2-selection,.mec-create-shortcode-tab-content .select2-selection,.wns-be-main .mec-form-row .select2-selection{border:none;background:0 0;padding-top:3px;width:100%;height:100%}.mec-add-event-tabs-wrap .select2-container--default.select2-container--focus .select2-selection,.mec-create-shortcode-tab-content .select2-container--default.select2-container--focus .select2-selection,.wns-be-main .mec-form-row .select2-container--default.select2-container--focus .select2-selection{border:none!important;outline:0}.mec-add-event-tabs-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,.mec-create-shortcode-tab-content .select2-container--default .select2-selection--single .select2-selection__arrow,.wns-be-main .mec-form-row .select2-container--default .select2-selection--single .select2-selection__arrow{top:5px;right:4px}.fs-webform-container div .fserv-container{width:100%!important;max-width:none!important;min-height:238px!important;box-shadow:0 1px 6px rgb(0 0 0 / 1%)!important;border-radius:15px!important;padding:15px 0 0!important;margin-bottom:0!important;margin-top:30px!important;background:url(https://webnus.net/modern-events-calendar/wp-content/uploads/2019/11/illustration.svg) no-repeat top right;background-size:330px;border:1px solid #e3e5e7}.fserv-container .fserv-form-name{font-weight:600!important;position:relative!important;font-size:20px!important;padding:30px 30px 10px!important;text-align:left!important;margin:0!important;line-height:1}.fserv-form-description{padding:10px 30px!important;margin:1em 0 0!important;line-height:1.5!important;font-size:16px!important}.fserv-container form{padding:0!important;padding-left:28px!important}.fserv-container .fserv-label{display:none!important}.fserv-field{display:inline-block;padding:0!important;min-width:260px;margin:0!important;margin-right:25px!important}.fserv-container label.fserv-form-description{cursor:default}.fserv-field input.fserv-input-text{border-radius:5px!important;border:none!important;background-color:#f7f8f9!important;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)!important}.fserv-field+div:not(.fserv-field){margin:0!important;border:none!important;text-align:left!important;padding-left:4px!important;margin-top:0!important;padding-top:0!important;display:inline-block;margin-right:10px!important}.fserv-container .powered-by{display:none!important}@media (max-width:1366px){#webnus-dashboard .fserv-container form{padding:0!important;padding:0 28px 40px 28px!important}#webnus-dashboard .fserv-form .fserv-field{width:33%!important}#webnus-dashboard .fserv-form .fserv-button-submit{margin-left:-2px!important}}@media (max-width:960px){#webnus-dashboard .fserv-container form{padding:0!important;padding:0 28px 40px 28px!important}#webnus-dashboard .fserv-form .fserv-field{width:100%!important}#webnus-dashboard .fserv-form .fserv-button-submit{margin-left:-2px!important}}#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag{font-weight:500;border-radius:60px;text-shadow:none;box-shadow:0 0 0 3px rgb(227 249 253 / 15%);background:#fff;background:linear-gradient(95deg,#fff 0,#fff 50%,#fff 100%)!important;border:1px solid #c0e5ea;transition:.24s}#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary,#webnus-dashboard .total-bookings button,button.fserv-button-submit{color:#fff!important;font-weight:500!important;border-radius:60px!important;box-shadow:0 0 0 4px rgb(56 213 237 / 1%)!important;text-shadow:none!important;background:#38d5ed!important;border:none!important;transition:.24s!important}#webnus-dashboard button.fserv-button-submit{background:#64e385!important;box-shadow:0 0 0 3px #64e3851a!important}#webnus-dashboard button.fserv-button-submit:hover{background:#46d26a!important;box-shadow:0 0 0 4px #64e38536!important}#webnus-dashboard .total-bookings button{line-height:39px;padding:0 36px}#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag.button-primary:hover{color:#fff!important;background:#1fcae4!important;box-shadow:0 0 0 4px rgb(56 213 237 / 15%)!important}#webnus-dashboard .total-bookings button:hover,button.fserv-button-submit:hover{background:#26bbd2!important;box-shadow:0 0 0 4px rgb(56 213 237 / 15%)!important;cursor:pointer!important}#webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:hover{box-shadow:0 0 0 4px rgb(56 213 237 / 8%)!important;color:#02a3bb!important;cursor:pointer!important}.fserv-container input::-webkit-input-placeholder{font-family:inherit!important;font-size:14px}.fserv-container input::-moz-placeholder{font-family:inherit!important;font-size:14px}.fserv-container input:-ms-input-placeholder{font-family:inherit!important;font-size:14px}.fserv-container input:-moz-placeholder{font-family:inherit!important;font-size:14px}input.fserv-input-text{height:38px;box-sizing:border-box;margin-bottom:8px;padding:0 6px;box-shadow:none;border-radius:2px;box-shadow:inset 0 1px 5px rgba(0,0,0,.05)}.fserv-field label.error{display:none!important}.fs-notifier{position:fixed!important;top:40px!important;width:300px!important;max-width:300px!important;margin:0!important;right:20px!important;left:unset!important}.post-type-mec-events .lity{background:#edf0f3}.post-type-mec-events .lity-container{width:60vw;max-width:883px;margin:0 auto;border-radius:7px}.post-type-mec-events .lity-content:after{display:none}.mec-manage-events-lightbox{box-shadow:0 3px 20px rgba(0,0,0,.05)}.w-clearfix.mec-attendees-content img{display:inline-block;width:25px;height:25px;vertical-align:middle;margin-right:7px}.post-type-mec-events .mec-attendees-list-head{background:#008aff;color:#fff;text-align:center;padding:17px 0;text-transform:capitalize;font-size:26px;font-weight:700;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;border-radius:7px 7px 0 0;line-height:43px;box-shadow:0 3px 15px rgba(0,138,255,.25);z-index:99}.mec-attendees-list-wrap{display:flex;width:100%;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;background:#fff;box-shadow:0 3px 20px rgba(0,0,0,.05);border-radius:0 0 5px 5px;overflow:hidden}.mec-attendees-list-left{flex:1;background:#f6f8fa;padding:0;border-radius:0;position:relative}.mec-attendees-list-right,.mec-send-email-form-wrap{flex:1;border-radius:0 0 5px 5px;padding:0 20px 20px;background:#f2f4f7}.mec-attendees-list-left-menu a{display:inline-block;line-height:22px;font-size:12px;color:#000;font-weight:500;border-bottom:1px solid #eaebec;border-left:1px solid #eaebec;padding-bottom:0;padding:7px 6px;margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;transition:all .2s ease;text-decoration:none;text-align:center}.mec-attendees-list-left-menu a.selected-day{color:#008aff}.mec-attendees-list-left-menu .owl-item:last-child a{border-right:1px solid #eaebec}.mec-attendees-list-right table{width:100%}.w-clearfix.mec-attendees-head{margin-top:30px;border-bottom:2px solid #ccecf4;padding-bottom:18px;margin-bottom:3px}.w-clearfix.mec-attendees-content [class^=w-col-xs-],.w-clearfix.mec-attendees-head [class^=w-col-xs-]{padding:0}.w-clearfix.mec-attendees-head span{font-weight:600;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;font-size:17px}.w-clearfix.mec-attendees-content{background:#fff;margin-bottom:2px;padding:10px 20px}.mec-attendees-list-left-menu{height:36px;margin-left:35px;margin-right:36px}.mec-attendees-list-left-menu a:active,.mec-attendees-list-left-menu a:focus,.mec-attendees-list-left-menu a:visited{outline:0;box-shadow:none}.mec-attendees-list-left-menu .owl-item{display:inline-block}.mec-attendees-list-left-menu .owl-stage{min-width:800px!important}.owl-nav.disabled .owl-next{position:absolute;right:0;top:0}.owl-nav.disabled .owl-prev{position:absolute;left:0;top:0}.owl-nav.disabled button{background:#fff;box-shadow:none;border:1px solid #ccc;height:36px;width:36px;font-size:54px;line-height:54px}.owl-nav.disabled button span{margin-top:-18px;display:block}.mec-cover-loader:after{content:"";position:absolute;top:0;right:0;left:0;bottom:0;background:rgba(255,255,255,.5);z-index:99999}.mec-loader{background:rgba(0,0,0,0);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:9}.mec-loader,.mec-loader:after{border-radius:50%;width:5em;height:5em;z-index:999999999999}.mec-loader{font-size:10px;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid #fff;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:mecloader 1.1s infinite linear;animation:mecloader 1.1s infinite linear}@media (max-width:992px){.post-type-mec-events .lity-container{width:80vw}}@-webkit-keyframes mecloader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mecloader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mec-report-backtoselect-wrap,.mec-report-sendmail-form-wrap{display:none}.mec-report-select-event-wrap .select2,.mec-select-wrap .select2{width:100%!important}.mec-report-select-event-wrap .select2-container--default .select2-selection--single,.mec-select-wrap .select2-container--default .select2-selection--single{border-radius:4px;border:1px solid #e2e3e4;height:40px;padding-top:5px;padding-left:8px;width:100%;box-shadow:none}.mec-report-select-event-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,.mec-select-wrap .select2-container--default .select2-selection--single .select2-selection__arrow{height:36px}.mec-report-select-event-wrap .select2-container--open .select2-dropdown--below,.mec-select-wrap .select2-container--open .select2-dropdown--below{box-shadow:0 2px 8px rgba(0,0,0,.12);border-color:#d7d8d9}.select2-container--default .select2-search--dropdown{padding:12px}.select2-container--default .select2-search--dropdown .select2-search__field{box-shadow:0 2px 8px rgba(0,0,0,.02) inset;border-color:#e3e5e7;border-radius:4px}.mec-report-select-event-wrap input,.mec-report-select-event-wrap select,.mec-select-wrap input[type=text],.mec-select-wrap select .mec-report-select-event-wrap input[type=text]{border:1px solid #e2e3e4;height:40px;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;margin-bottom:15px;border-radius:4px;box-shadow:none;max-width:150px}#certificate_select{border:1px solid #e2e3e4;height:34px;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif!important;margin-bottom:15px;border-radius:4px;box-shadow:none;max-width:300px;min-width:200px;margin:0!important;vertical-align:bottom}.mec-report-select-event-wrap .select2-container--default,.mec-select-wrap .select2-container--default{max-width:400px}.select2-dropdown.select2-dropdown{border-color:#e3e5e7!important;box-shadow:none!important}.mec-report-select-event-wrap select.mec-reports-selectbox-dates,.mec-select-wrap select.mec-reports-selectbox-dates{min-width:260px;margin:0 0 0 10px;padding-left:15px}.mec-report-sendmail-form-wrap,.mec-report-sendmail-wrap{padding:30px 15px;background:#fff;border:1px solid #e2e3e4;margin:15px 0 5px;border-radius:10px;box-shadow:0 1px 4px rgba(0,0,0,.01)}.mec-report-sendmail-wrap .w-col-sm-12:before{background:url(../img/email-document.png) no-repeat left top;content:"";display:block;width:90px;height:70px;z-index:100;float:left}.mec-report-sendmail-wrap p{margin:0 0 15px;font-size:15px;color:#7d8284}.mec-report-backtoselect-wrap button,.mec-report-sendmail-wrap .w-col-sm-12 button,.mec-send-email-form-wrap .mec-send-email-button{background:#19cde9;border:none;color:#fff;font-size:13px!important;padding:8px 18px;border-radius:4px;cursor:pointer;box-shadow:0 1px 2px rgba(25,205,233,.05);transition:all .2s ease}.mec-report-backtoselect-wrap button:hover,.mec-report-sendmail-wrap .w-col-sm-12 button:hover,.mec-send-email-form-wrap .mec-send-email-button:hover{background:#04bfdc;box-shadow:0 1px 2px rgba(25,205,233,.05)}.mec-report-backtoselect-wrap button{margin-top:15px}.mec-report-selected-event-attendees-wrap{background-color:#fff;border:1px solid #e1e2e3;padding:0;margin:20px 0;border-radius:7px;display:none}.mec-report-selected-event-attendees-wrap .w-col-sm-12{width:calc(100% - 30px)}.mec-report-sendmail-wrap{display:none}#mec_report_mass_action_form .mec-form-row{padding:0}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head{background:#f5f6f7;border-bottom:1px solid #e1e2e3;padding:15px;margin:0;border-radius:5px 5px 0 0}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content{margin:0;padding:8px 15px;border-bottom:1px solid #e4eef0;font-size:13px;line-height:25px}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content:hover{background:#f3fdfe}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content:last-child{border-bottom:none;border-radius:0 0 6px 6px}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content img{border-radius:25px;margin-left:8px}.mec-report-selected-event-attendees-wrap input[type=checkbox]{border-radius:3px;margin-top:0}.mec-report-selected-event-attendees-wrap .mec-attendees-head .w-col-xs-2.name{padding-left:10px}.mec-report-selected-event-attendees-wrap .checkin_status span{font-weight:600}.mec-report-selected-event-attendees-wrap .w-col-sm-12>p{text-align:center}.mec-attendees-list-right,.mec-send-email-form-wrap{flex:1;border-radius:0;padding:0;background:0 0;max-width:674px;margin:0 auto}.mec-report-sendmail-form-wrap{padding:0 30px 45px}.mec-send-email-form-wrap h2{background:url(../img/email-document.png) no-repeat center top;padding-top:70px;font-size:22px;font-weight:600;text-align:center;padding-bottom:10px;padding-left:10px;margin-bottom:0}#webnus-dashboard .mec-send-email-form-wrap .wp-editor-tools button{font-size:13px;font-weight:400;color:#444;line-height:1;margin-bottom:0}#webnus-dashboard .mec-send-email-form-wrap .wp-editor-tabs button{min-height:30px}.mec-send-email-form-wrap input.widefat{min-height:40px;border:1px solid #e2e3e4;border-radius:2px;box-shadow:0 1px 4px rgba(0,0,0,.02)}.mec-send-email-form-wrap input.widefat:focus{border:1px solid #96e3ef}.mec-send-email-form-wrap h4.mec-send-email-count{font-weight:400;text-align:center;margin-bottom:30px;margin-top:0;padding-top:0}.mec-send-email-form-wrap .mec-send-email-button{min-height:40px;line-height:40px;padding:0;font-size:17px!important;font-weight:600}.mec-send-email-form-wrap .mce-menubtn.mce-fixed-width span{height:20px;padding-top:2px}.lity.mec-add-shortcode-popup{background-color:#b7e4e3}.lity.mec-add-shortcode-popup .lity-content{box-shadow:0 3px 20px 0 rgba(91,188,190,.55);border-radius:10px;height:100%}.mec-add-shortcode-popup .lity-container{width:930px;height:620px}.mec-add-shortcode-popup .lity-content:after{display:none}.mec-add-shortcode-popup div#mec_popup_shortcode{background:#fff;overflow:hidden;display:flex;width:100%;border-radius:10px;height:100%}.mec-steps-container{width:92px;text-align:center;background:#fff}.mec-steps-panel{width:calc(100% - 92px);background:#eef4f5}.mec-steps-container ul{text-align:center;display:block;margin-top:62px}.mec-steps-container ul li{width:22px;height:70px;margin:0 auto;position:relative}.mec-steps-container ul li span{border-radius:50px;background-color:rgba(26,175,251,.16);width:22px;height:22px;display:inline-block;padding-top:2px;font-size:11px;font-weight:700;color:#1aaffb;box-sizing:border-box}.mec-steps-container ul li:after,.mec-steps-container ul li:before{content:"";display:block;height:24px;width:2px;background:rgba(26,175,251,.16);margin-left:calc(50% - 1px)}.mec-steps-panel .mec-form-row input[type=checkbox],.mec-steps-panel .mec-form-row input[type=radio]{background:#fff}.mec-box .mec-steps-panel .mec-form-row input[type=radio],.mec-steps-panel .mec-form-row .mec-box input[type=checkbox]{background:#f7f8f9}.mec-steps-panel .mec-form-row .mec-box input[type=checkbox]:checked,.mec-steps-panel .mec-form-row .mec-box input[type=radio]:checked{background:#fff}.mec-steps-container ul li:first-of-type:before,.mec-steps-container ul li:last-of-type:after{display:none}.mec-steps-container ul li:first-of-type{height:46px}li.mec-step.mec-step-passed span,li.mec-step.mec-step-passed:after,li.mec-step.mec-step-passed:before{background-color:#2dcb73;color:#fff}.mec-steps-container img{margin-top:30px}.mec-steps-header{display:flex;background:#fff;border-radius:5px;box-shadow:0 3px 22px 0 rgb(11 121 125 / 1%);padding:12px 22px;margin:-15px -15px 65px}.mec-steps-header-settings{width:65px}.mec-steps-header-dashboard{width:fit-content;margin-right:22px}.mec-steps-header-userinfo{width:calc(100% - 65px)}.mec-steps-panel{padding:35px;position:relative;display:flex;flex-direction:column;justify-content:space-between}.mec-steps-header-userinfo span{display:inline-block;vertical-align:middle}.mec-steps-header-userinfo span img{height:40px;border-radius:50px;margin-right:8px;vertical-align:middle}.mec-steps-header-userinfo span.mec-steps-header-name{font-size:14px;color:#778182;font-weight:600;text-transform:capitalize}span.mec-steps-header-add-text{color:#839294;font-size:12px;margin-left:5px}.mec-steps-header-dashboard a,.mec-steps-header-settings a{height:100%;display:block;padding-top:11px;text-decoration:none;font-size:12px;color:#707070}.mec-steps-header-dashboard a i,.mec-steps-header-settings a i{color:#1aaffb;font-size:16px;vertical-align:text-top;margin-right:5px}.mec-next-previous-buttons{clear:both}.mec-next-previous-buttons button.mec-button-next{float:right;background:#008aff;border:none;color:#fff;cursor:pointer;width:123px;text-align:left;padding:8px 18px 9px;border-radius:3px;font-size:14px;box-shadow:0 5px 10px 0 rgba(0,138,255,.3);transition:all .3s ease;outline:0}.mec-next-previous-buttons button:hover{background:#000;box-shadow:0 5px 10px 0 rgba(0,0,0,.3)}.mec-next-previous-buttons button.mec-button-next img{position:absolute;top:16px;right:18px}.mec-next-previous-buttons button{position:relative}.mec-next-previous-buttons button.mec-button-prev{background:#fff;border:none;color:#000;cursor:pointer;width:123px;text-align:right;padding:8px 15px 9px;border-radius:3px;font-size:14px;box-shadow:0 5px 10px 0 rgba(11,121,125,.01);transition:all .3s ease;outline:0}.mec-next-previous-buttons button.mec-button-prev img{position:absolute;top:16px;left:18px}.mec-next-previous-buttons button.mec-button-prev:hover{background:#000;box-shadow:0 5px 10px 0 rgba(0,0,0,.3);color:#fff}.mec-next-previous-buttons button.mec-button-new{background:#008aff;float:right;border:none;color:#fff;cursor:pointer;width:154px;text-align:left;padding:8px 18px 9px;border-radius:3px;font-size:14px;box-shadow:0 5px 10px 0 rgba(0,138,255,.3);transition:all .3s ease;outline:0}.mec-next-previous-buttons button.mec-button-new:hover{background:#000;box-shadow:0 5px 10px 0 rgba(0,0,0,.3)}.mec-next-previous-buttons button.mec-button-new img{vertical-align:sub;margin-left:-3px;margin-right:8px}div#mec_popup_shortcode_form{height:calc(100% - 37px)}.mec-steps-content-container{display:flex;flex-direction:column;height:100%}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1{background:url(../../assets/img/popup/first-step.png) no-repeat 90% 70%}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .popup-sh-name-required{color:red;display:none;font-style:italic;font-size:12px;margin-top:8px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1{top:50%;position:absolute;width:360px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]{width:360px;height:46px;border:none;border-radius:3px;padding-left:36px;font-size:12px;color:#b1b2b4;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]::-webkit-input-placeholder{color:#b1b2b4}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]:-ms-input-placeholder{color:#b1b2b4}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]::placeholder{color:#b1b2b4}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1:before{content:"";width:14px;height:14px;background:url(../../assets/img/popup/add-sh-icon.png) no-repeat center center;position:absolute;top:17px;left:17px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul{height:386px;overflow-x:hidden;overflow-y:scroll;margin-top:-22px;margin-bottom:0;position:relative;padding:0 50px 150px 50px;background:#fcfbfd!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li{width:30%!important;float:left!important;min-height:135px!important;height:150px;margin:1.66%!important;box-sizing:border-box;text-align:center;padding:12px!important;border-radius:8px;border:1px solid transparent;box-shadow:none;background:#fff0!important;cursor:pointer;transition:all .22s ease;-webkit-transition:all .22s ease;-moz-transition:all .22s ease;-ms-transition:all .22s ease;-o-transition:all .22s ease}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li.active{border:1px solid #40d9f16b!important;box-shadow:0 1px 8px -3px #40d9f152 inset!important;color:#00cae6!important;padding:12px 0 0 0!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li:hover{box-shadow:0 1px 8px rgb(0 0 0 / 3%),0 0 0 1px #f3f4f5;background:#fff!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li:hover{background:#fcfbfd}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-img img{margin:4px 0 1px 1px;line-height:1;max-width:68px;max-height:56px;filter:grayscale(1);-webkit-filter:grayscale(1);transition:all .22s ease;-webkit-transition:all .22s ease;-moz-transition:all .22s ease;-ms-transition:all .22s ease;-o-transition:all .22s ease}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-img img,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li:hover .mec-step-popup-skin-img img{filter:grayscale(0);-webkit-filter:grayscale(0)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text input{display:block;margin:0 auto;margin-top:6px;border:2px solid #e1e7ed;box-shadow:0 3px 6px 0 rgba(0,0,0,.05);position:relative}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-img{padding-top:16px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li .mec-step-popup-skin-text input{display:none}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text:before{width:14px;height:14px;content:"";border-radius:50px;background:#fff;display:block;position:absolute;left:calc(50% - 7px);top:24px;z-index:99;border:2px solid #e1e7ed;box-shadow:0 3px 6px 0 rgba(0,0,0,.05)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text{position:relative}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-text:before{background:#008aff;border:none;box-shadow:0 5px 10px 0 rgba(0,138,255,.3);width:16px;height:16px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 li.active .mec-step-popup-skin-text:after{width:4px;height:4px;display:block;content:"";position:absolute;background:#fff;left:calc(50% - 1px);top:30px;z-index:999;border-radius:50px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 span.wn-hover-img-sh{display:block}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles{height:386px;overflow-x:hidden;padding-left:60px;padding-bottom:19px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label{width:193px!important;float:left!important;margin:1.66%!important;text-align:center}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label span{width:193px!important;float:left!important;min-height:135px!important;height:150px;box-sizing:border-box;border-radius:5px;border:2px solid #c4edff;background:#fff!important;cursor:pointer;margin-bottom:5px;margin-top:-6px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label.active span{border-color:#00acf8;box-shadow:0 3px 5px rgba(0,172,248,.2)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label div{font-size:14px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles label.active div{color:#008aff}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles input{opacity:0;display:none}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-steps-content.mec-steps-content-3{margin-top:-18px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 span.wn-hover-img-sh img{width:189px;height:146px;border-radius:5px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4{background:url(../../assets/img/popup/fourth-step.png) no-repeat 90% 70%}.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 .nice-select{border:none;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4{top:40%;position:absolute;width:330px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 h3{font-size:13px;font-weight:400;color:#707070}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div{border:2px dashed #dce2e3;border-radius:3px;padding:20px 20px 6px;background:#fcfcfc}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div label{display:block;margin-bottom:14px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div label.active input{background:#fff;box-shadow:none;border:1px solid #cacece}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup{box-shadow:0 3px 13px -5px rgba(0,0,0,.1),inset 0 1px 2px rgba(0,0,0,.07);clear:unset!important;-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:5px;border:solid 1px #e8e8e8;box-sizing:border-box;clear:both;cursor:pointer;display:block;float:left;font-family:inherit;font-size:14px;font-weight:400;height:42px;line-height:40px;outline:0;padding-left:18px;padding-right:30px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;width:300px!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup:hover{border-color:#dbdbdb}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open .list{overflow:unset;width:100%;margin:0}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .list{background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(68,68,68,.11);box-sizing:border-box;margin-top:4px;opacity:0;overflow:hidden;padding:0;pointer-events:none;position:absolute;top:100%;left:0;-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.75) translateY(-21px);-ms-transform:scale(.75) translateY(-21px);transform:scale(.75) translateY(-21px);-webkit-transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;z-index:9}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup:after{border-bottom:2px solid #999;border-right:2px solid #999;content:"";display:block;height:5px;margin-top:-4px;pointer-events:none;position:absolute;right:12px;top:50%;-webkit-transform-origin:66% 66%;-ms-transform-origin:66% 66%;transform-origin:66% 66%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;width:5px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open:after{-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.open .list{opacity:1;pointer-events:auto;-webkit-transform:scale(1) translateY(0);-ms-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.disabled{border-color:#ededed;color:#999;pointer-events:none}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup.disabled:after{border-color:#ccc}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .list:hover .option:not(:hover){background-color:transparent!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option{cursor:pointer;font-weight:400;list-style:none;min-height:40px;outline:0;text-align:left;position:relative;font-size:12px!important;padding:1px 12px!important;margin:0!important;line-height:28px!important;min-height:28px!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option .wn-hover-img-sh img{position:absolute;padding:3px;top:-1px;left:100%;box-shadow:0 4px 42px -5px rgba(0,0,0,.16);visibility:hidden;opacity:0;border:1px solid #e3e3e3;border-radius:2px;z-index:99999999;background:#fff}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option:hover .wn-hover-img-sh img{visibility:visible;opacity:1}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.focus,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.selected.focus,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option:hover{background-color:#f6f6f6}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.selected{font-weight:700}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup .option.disabled{background-color:transparent;color:#999;cursor:default}.mec-add-shortcode-popup .no-csspointerevents .wn-mec-select-popup .list{display:none}.mec-add-shortcode-popup .no-csspointerevents .wn-mec-select-popup.open .list{display:block}.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input{background:#fff;position:relative;width:24px;height:24px;border:1px solid #cacece}.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input:before{display:none}.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label.active input{background:#008aff;box-shadow:0 5px 10px 0 rgba(0,138,255,.3);border:none}.mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label.active input:before{background:#fff;width:6px;height:6px;top:6px;left:6px;position:absolute}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5{background:url(../../assets/img/popup/fifth-step.png) no-repeat 90% 70%}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5{width:360px;margin-top:16px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher label{color:#707070;font-size:14px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher p{color:#8a8a8a;font-style:italic;font-size:12px;margin-top:7px;margin-bottom:0}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher{padding-bottom:30px;margin-bottom:34px;border-bottom:2px dashed #dce2e3;position:relative}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher:last-of-type{padding-bottom:0;margin-bottom:0;border:none}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher div:last-of-type label{position:absolute;top:-4px;right:0;width:52px;height:26px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input:checked+label:after{margin-left:26px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input+label:after,.mec-add-shortcode-popup .mec-switcher input+label:before{display:block;position:absolute;top:2px;left:1px;bottom:2px;content:""}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher input+label:after{width:26px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6{background:url(../../assets/img/popup/sixth-step.png) no-repeat 90% 70%}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-content.mec-steps-content-6{margin-top:56px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode{width:325px;border:2px dashed #dce2e3;background:#fcfcfc;padding:42px 42px 47px;text-align:center}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode h3{font-size:16px;font-weight:400;color:#707070;margin-top:7px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code{border-radius:3px;background:rgba(154,214,222,.35);width:243px;margin:0 auto;padding:14px 17px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code code{background:0 0;color:#000;font-size:14px;font-weight:600;margin-left:-11px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button{border:none;background:#fff;border-radius:3px;padding:3px 8px 6px;margin-left:46px;cursor:pointer}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button:hover{background:#000;color:#fff}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-results p{width:325px;text-align:center;font-size:12px;margin-top:5px;color:#8a8a8a}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-loading{width:325px;border:2px dashed #dce2e3;background:#fcfcfc;padding:42px 42px 47px;text-align:center;height:182px;position:relative}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-steps-6-loading .mec-loader{position:absolute;left:136px;top:65px}.mec-add-event-popup button.lity-close,.mec-add-shortcode-popup button.lity-close{right:0;top:-52px;border-radius:50%;width:37px;height:37px;background:#fff;color:#a2afbc;text-shadow:none;padding-top:1px;transition:all .2s ease;position:absolute;box-shadow:0 3px 8px 0 rgba(91,188,190,.55)}.mec-add-event-popup button.lity-close:hover,.mec-add-shortcode-popup button.lity-close:hover{background:#ff6262;color:#fff;box-shadow:0 3px 8px 0 rgb(249 162 162 / 55%)}.mec-skin-styles.mec-styles-full_calendar h3{padding-left:12px}.lity.mec-add-event-popup{background-color:#b7e4e3}.mec-add-event-popup .lity-container{width:930px;height:620px;max-width:unset}.mec-add-event-popup div#mec_popup_event{background:#fff;overflow:hidden;display:flex;width:100%;border-radius:10px;height:100%}.lity.mec-add-event-popup .lity-content{box-shadow:0 3px 20px 0 rgba(91,188,190,.55);border-radius:10px;height:100%}div#mec_popup_event_form{height:calc(100% - 37px)}.mec-add-event-popup .mec-steps-container ul{margin-top:42px}.mec-add-event-popup .mec-steps-container ul li:first-of-type{height:41px}.mec-add-shortcode-popup .mec-steps-container ul li:after,.mec-add-shortcode-popup .mec-steps-container ul li:before{height:24px}.mec-add-event-popup .mec-steps-container ul li:after,.mec-add-event-popup .mec-steps-container ul li:before{height:19px}.mec-add-event-popup .mec-steps-container ul li{height:60px}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup{box-shadow:0 3px 22px 0 rgba(11,121,125,.01);border:none;clear:unset!important;-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:3px;box-sizing:border-box;cursor:pointer;display:block;float:left;font-family:inherit;font-size:12px;font-weight:400;line-height:40px;outline:0;padding-left:18px;padding-right:30px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;height:46px;margin-right:6px;padding-top:3px;color:#707070}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open{border-radius:3px 3px 0 0}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup:hover{border-color:#dbdbdb}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open .list{overflow:unset;width:100%;margin:0}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list{background-color:#fff;border-radius:0 0 3px 3px;box-shadow:0 0 0 0 rgba(68,68,68,.11);box-sizing:border-box;margin-top:4px;opacity:0;overflow:hidden;padding:0;pointer-events:none;position:absolute;top:100%;left:0;-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.75) translateY(-21px);-ms-transform:scale(.75) translateY(-21px);transform:scale(.75) translateY(-21px);-webkit-transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(.5, 0, 0, 1.25),opacity .15s ease-out;z-index:9;margin-top:1px!important}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup:after{border-bottom:2px solid #00acf8;border-right:2px solid #00acf8;content:"";display:block;height:5px;margin-top:-4px;pointer-events:none;position:absolute;right:15px;top:50%;-webkit-transform-origin:66% 66%;-ms-transform-origin:66% 66%;transform-origin:66% 66%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;width:5px}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open:after{-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.open .list{opacity:1;pointer-events:auto;-webkit-transform:scale(1) translateY(0);-ms-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.disabled{border-color:#ededed;color:#999;pointer-events:none}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup.disabled:after{border-color:#ccc}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list:hover .option:not(:hover){background-color:transparent!important}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option{cursor:pointer;font-weight:400;list-style:none;min-height:40px;outline:0;text-align:left;position:relative;font-size:12px!important;padding:1px 12px!important;margin:0!important;line-height:22px!important;min-height:22px!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.focus,.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected.focus,.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option:hover{background-color:#f6f6f6}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected{font-weight:700}.mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.disabled{background-color:transparent;color:#999;cursor:default}.mec-add-event-popup .no-csspointerevents .wn-mec-select-popup .list{display:none}.mec-add-event-popup .no-csspointerevents .wn-mec-select-popup.open .list{display:block}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1{background:url(../../assets/img/popup/add-event-first-step.png) no-repeat 100% 70%}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name{width:100%;height:46px;border:none;border-radius:3px;padding-left:36px;font-size:13px;color:#3c434a;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name::-webkit-input-placeholder{color:#b1b2b4}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name:-ms-input-placeholder{color:#b1b2b4}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 #mec_event_name::placeholder{color:#b1b2b4}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1:before{content:"";width:14px;height:14px;background:url(../../assets/img/popup/calendar_icon.png) no-repeat center center;position:absolute;top:17px;left:17px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1{top:210px;position:absolute;width:370px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .popup-sh-name-required{color:red;display:none;font-style:italic;font-size:12px;margin-top:8px}.mec-add-event-popup .mec-meta-box-colors-container{background:#fff;padding:17px;border-radius:3px;box-shadow:0 3px 22px rgba(11,121,125,.01);margin-top:15px}.mec-add-event-popup .wp-picker-container .wp-color-result.button{border-color:#f1f2f4;border-radius:3px;box-shadow:0 2px 2px rgba(0,0,0,.04)}.mec-add-event-popup .mec-recent-color-sec{display:block!important;font-size:12px;color:#707070}.mec-add-event-popup .mec-form-row.mec-available-color-row{border:2px dashed #dce2e3;padding:13px 20px!important;background:#fcfcfc;border-radius:3px}.mec-add-event-popup .wp-color-result-text{background:#f7f7f7;border-radius:unset;border-left:none;color:#555;display:block;line-height:2.54545455;padding:0 6px;text-align:center}.mec-add-event-popup .mec-form-row.mec-available-color-row .mec-color{width:10px;height:10px;position:absolute;left:11px;z-index:99}.mec-add-event-popup span.mec-color-meta-box-popup{display:inline-block!important;width:20px;height:20px;border-radius:50px;position:absolute;top:1px;left:6px;z-index:9}.mec-add-event-popup span.mec-recent-color-sec-wrap{width:20px;height:20px;display:inline-block;margin-right:12px;margin-top:7px;margin-left:-6px;position:relative}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2{background:url(../../assets/img/popup/sixth-step.png) no-repeat 95% 70%}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4{width:auto}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4:before{content:"";width:14px;height:14px;background:url(../../assets/img/popup/calendar_icon.png) no-repeat center center;position:absolute;top:17px;left:17px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form .mec-col-4 input{padding-left:36px;width:148px;padding:22px 17px 22px 34px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date_popup,.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date_popup,.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form select{height:46px;border:none;border-radius:3px;padding-left:36px;font-size:12px;color:#707070;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder,.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder{color:#b1b2b4}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder,.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder{color:#b1b2b4}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_end_date::placeholder,.mec-add-event-popup .mec-steps-content-container.mec-steps-content-2 #mec_meta_box_date_form input#mec_start_date::placeholder{color:#b1b2b4}.mec-add-event-popup .mec-form-row .time-dv{float:left;margin-left:-2px;margin-right:4px;margin-top:12px;color:#b1b2b4}.mec-add-event-popup .mec-steps-content.mec-steps-content-2{margin-top:60px}.mec-add-event-popup .mec-steps-content.mec-steps-content-2 .mec-form-row.mec-all-day-event label{font-size:14px;color:#707070}.mec-add-event-popup .mec-steps-content.mec-steps-content-2 .mec-form-row.mec-all-day-event{margin-top:13px!important}.mec-add-event-popup .mec-steps-content.mec-steps-content-3,.mec-add-event-popup .mec-steps-content.mec-steps-content-4{margin-top:-9px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-3{background:url(../../assets/img/popup/fifth-step.png) no-repeat 90% 70%}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-4{background:url(../../assets/img/popup/add-organizer.png) no-repeat 95% 70%}.nice-select.mec_popup_location_id.wn-mec-select-popup,.nice-select.mec_popup_organizer_id.wn-mec-select-popup{position:relative;width:200px;padding-left:36px}.nice-select.mec_popup_location_id.wn-mec-select-popup:before{content:"";width:14px;height:14px;background:url(../../assets/img/popup/pointer.png) no-repeat center center;position:absolute;top:17px;left:17px}.nice-select.mec_popup_organizer_id.wn-mec-select-popup:before{content:"";width:14px;height:14px;background:url(../../assets/img/popup/pointer.png) no-repeat center center;position:absolute;top:17px;left:17px}#mec_popup_event button#mec_popup_add_location:before,#mec_popup_event button#mec_popup_add_organizer:before{content:"";width:15px;height:15px;background:url(../../assets/img/popup/plus.png) no-repeat center center;position:absolute;top:16px;left:15px}.mec-add-event-popup .mec-steps-content-container .nice-select.mec_popup_location_id.wn-mec-select-popup.open .list li,.mec-add-event-popup .mec-steps-content-container .nice-select.mec_popup_organizer_id.wn-mec-select-popup.open .list li{line-height:32px!important;min-height:32px!important}#mec_popup_event .mec-steps-content .mec-tooltip{bottom:8px}#mec-location .mec-form-row span+span.mec-tooltip i,#mec-organizer .mec-form-row span+span.mec-tooltip i{margin-top:-18px}#mec_popup_event .mec-steps-content .mec-tooltip .dashicons-before:before{color:#008aff}#mec_popup_event button#mec_organizer_thumbnail_button,#mec_popup_event button#mec_popup_add_location,#mec_popup_event button#mec_popup_add_organizer{background:#008aff;border-radius:3px;border:none;color:#fff;width:146px;height:46px;margin-left:10px;box-shadow:0 3px 3px 0 rgba(0,138,255,.22);font-size:14px;cursor:pointer;transition:all .2s ease;outline:0;position:relative;padding-left:20px}#mec_popup_event button#mec_organizer_thumbnail_button:hover,#mec_popup_event button#mec_popup_add_location:hover,#mec_popup_event button#mec_popup_add_organizer:hover{background:#000;box-shadow:0 5px 10px 0 rgba(0,0,0,.3)}#mec_popup_event label[for=mec_location_dont_show_map]{font-size:14px;display:inline-block}#mec_popup_event input#mec_location_dont_show_map{margin-top:9px!important}#mec_popup_event .wn-mec-select-popup .current{width:100%;display:inline-block;overflow:hidden}#mec_popup_event div#mec_location_new_container,#mec_popup_event div#mec_organizer_new_container{border-top:2px dashed #dce2e3;width:360px;padding-top:25px;margin-top:20px}#mec_popup_event div#mec_location_new_container input,#mec_popup_event div#mec_organizer_new_container input{width:100%;height:46px;border:none;border-radius:3px;padding-left:17px;font-size:12px;color:#b1b2b4;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}#mec_popup_event div#mec_location_new_container .description,#mec_popup_event div#mec_organizer_new_container .description{border:none;padding:0;margin:0;margin-left:16px;line-height:19px;font-size:12px;color:#707070;font-style:normal;margin-top:-4px;display:block}#mec_popup_event .mec-form-row.mec-lat-lng-row input{width:44%!important}#mec_popup_event .mec-form-row.mec-lat-lng-row input:first-of-type{margin-right:10px}#mec_popup_event div#mec_organizer_new_container{margin-top:30px}#mec_popup_event div#mec_organizer_new_container .mec-form-row:first-of-type .mec-col-6:first-of-type{margin-right:14px!important}#mec_popup_event div#mec_organizer_new_container .mec-form-row:first-of-type .mec-col-6{width:48%;margin:0}#mec_popup_event button#mec_organizer_thumbnail_button:before{content:"";width:15px;height:15px;background:url(../../assets/img/popup/picture.png) no-repeat center center;position:absolute;top:16px;left:15px}#mec_popup_event button#mec_organizer_thumbnail_button{width:96%;padding-left:30px}.mec-add-event-popup .mec-steps-content.mec-steps-content-4 div#mec_organizer_thumbnail_img{position:absolute;right:10px;top:-20px}.mec-add-event-popup .mec-steps-content.mec-steps-content-4 div#mec_organizer_thumbnail_img img{max-width:110px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5{background:url(../../assets/img/popup/fourth-step.png) no-repeat 90% 70%}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input{height:30px;border:none;border-radius:3px;padding-left:10px;margin-left:20px;font-size:12px;color:#b1b2b4;box-shadow:0 3px 22px 0 rgba(11,121,125,.01);width:186px;float:right;margin-top:-4px}.mec-add-event-popup .mec-steps-content.mec-steps-content-5{width:326px;margin-top:48px}.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li{display:inline-block;background:#fff;border:none;cursor:pointer;padding:12px 18px;border-radius:3px;transition:all .3s ease;outline:0;text-align:center;margin-right:10px;height:42px;color:#008aff;font-size:14px;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)}.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li.mec-categories-tab-selected,.mec-add-event-popup .mec-steps-content.mec-steps-content-5 .mec-categories-tabs ul li:hover{background:#008aff;color:#fff;box-shadow:0 3px 3px 0 rgba(0,138,255,.3)}.mec-add-event-popup .mec-categories-tab-contents{background:#fff;padding:20px;border:2px dashed #dce2e3;margin-bottom:13px;margin-top:-5px}.mec-add-event-popup .mec-categories-tab-contents ul,.mec-add-event-popup .mec-categories-tab-contents ul li:last-of-type{margin:0}.mec-add-event-popup .mec-categories-tab-contents ul li .children{margin:7px 0 7px 30px}.mec-add-event-popup .mec-categories-tab-contents ul li{font-size:14px;color:#707070}.mec-add-event-popup .mec-categories-tab-contents.mec-form-row input[type=checkbox]{margin-top:0}.mec-add-event-popup .mec-categories-tab-contents{max-height:200px;overflow:hidden;overflow-y:scroll}.mec-add-event-popup .nice-select.mec_popup_location_id .list,.mec-add-event-popup .nice-select.mec_popup_organizer_id .list{max-height:240px!important;overflow:hidden!important;overflow-y:scroll!important}#mec_popup_event div#mec_location_new_container::-webkit-scrollbar,#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar,#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar,.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar,.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar,.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar{width:5px}#mec_popup_event div#mec_location_new_container::-webkit-scrollbar-track,#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar-track,#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar-track,.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar-track,.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar-track,.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar-track{box-shadow:inset 0 0 6px rgba(0,0,0,.1)}#mec_popup_event div#mec_location_new_container::-webkit-scrollbar-thumb,#mec_popup_event div#mec_organizer_new_container::-webkit-scrollbar-thumb,#mec_popup_event div#mec_sponsor_new_container::-webkit-scrollbar-thumb,.mec-add-event-popup .mec-categories-tab-contents::-webkit-scrollbar-thumb,.mec-add-event-popup .nice-select.mec_popup_location_id .list::-webkit-scrollbar-thumb,.mec-add-event-popup .nice-select.mec_popup_organizer_id .list::-webkit-scrollbar-thumb{background-color:#008aff;outline:0 solid #fff}.mec-add-event-popup span#mec_popup_new_category_button{cursor:pointer;position:relative;padding-left:18px;font-size:14px}.mec-add-event-popup span#mec_popup_new_category_button:before{content:"";width:15px;height:15px;background:url(../../assets/img/popup/plus-blue.png) no-repeat center center;position:absolute;top:3px;left:0}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder{color:#b1b2b4;font-size:13px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder{color:#b1b2b4;font-size:13px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input::placeholder{color:#b1b2b4;font-size:13px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-5 .mec-categories-add-new input{color:#3c434a;font-size:13px}.mec-add-event-popup .mec-steps-content.mec-steps-content-6.mec-steps-content-active{margin-top:-10px;height:70%}.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-tinymce.mce-container.mce-panel{height:100%;border:1px solid #ececec!important;box-shadow:0 3px 22px 0 rgba(11,121,125,.01)!important;border-radius:3px!important;overflow:hidden}.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container-body.mce-stack-layout{height:100%;background:#f5f5f5}.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container *{border:none!important;box-shadow:none!important}.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-edit-area.mce-container.mce-panel.mce-stack-layout-item{height:90%}.mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-statusbar.mce-container.mce-panel.mce-stack-layout-item.mce-last{display:none!important}.mec-add-event-popup .mce-edit-area.mce-container.mce-panel.mce-stack-layout-item iframe{height:100%!important}.mec-add-event-popup .mec-steps-content.mec-steps-content-7.mec-steps-content-active{height:70%;background:#fff;border:2px dashed #dce2e3;border-radius:3px;text-align:center;vertical-align:middle;margin-top:-10px;position:relative}.mec-add-event-popup .mec-event-popup-featured-image-wrapper{display:flex;justify-content:center;align-items:center;height:100%}.mec-add-event-popup button#mec_popup_upload_image_button{background:#008aff;color:#fff;box-shadow:0 3px 3px 0 rgba(0,138,255,.3);display:inline-block;border:none;cursor:pointer;padding:12px 18px;border-radius:3px;transition:all .3s ease;outline:0;text-align:center;height:42px;font-size:14px;margin-right:0}.mec-add-event-popup div#mec_event_popup_featured_image_preview img{max-height:300px;max-width:740px;margin-top:20px;margin-bottom:0}.mec-add-event-popup button#mec_popup_upload_image_button:hover{background:#000;box-shadow:0 3px 3px 0 rgba(0,0,0,.3)}.mec-add-event-popup .mec-event-popup-featured-image-wrapper span i{border-radius:50px;color:#bb353f;right:10px;top:10px;font-size:30px;position:absolute;cursor:pointer}.mec-add-event-popup .mec-steps-content.mec-steps-content-8{height:100%}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results .mec-steps-8-results-wrap{display:flex;justify-content:center;align-items:center;flex-direction:column;height:100%}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-loading .mec-loader{left:calc(50% - 2.5em);top:calc(50% - 2.5em)}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results{height:100%}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view{display:inline-block;background:#fff;border:none;cursor:pointer;padding:12px 22px 12px 36px;border-radius:3px;transition:all .3s ease;outline:0;text-align:center;margin-right:10px;height:46px;font-size:14px;box-shadow:0 3px 3px 0 rgba(0,0,0,.04);text-decoration:none;color:#000;position:relative;line-height:22px}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view:hover{background-color:#000;color:#fff}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 a.mec-button-view:before{content:"";width:15px;height:15px;background:url(../../assets/img/popup/eye.png) no-repeat center center;position:absolute;top:16px;left:15px}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new{background:#008aff;color:#fff;box-shadow:0 3px 3px 0 rgba(0,138,255,.3);display:inline-block;border:none;cursor:pointer;padding:11px 22px 11px 36px;border-radius:3px;transition:all .3s ease;outline:0;text-align:center;height:46px;font-size:14px;margin-right:0;position:relative;line-height:22px}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new:hover{background:#000;box-shadow:0 3px 3px 0 rgba(0,0,0,.3)}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 button.mec-button-new:before{content:"";width:15px;height:15px;background:url(../../assets/img/popup/plus.png) no-repeat center center;position:absolute;top:16px;left:15px}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-popup-final-buttons{margin-top:22px}.mec-add-event-popup .mec-steps-content.mec-steps-content-8 .mec-steps-8-results-wrap h3{font-size:26px;font-weight:400}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup{width:64px}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list{overflow:scroll!important;height:288px;margin-top:4px!important;box-shadow:0 1px 9px rgba(0,0,0,.1);border-radius:0}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar-track{background-color:#f6f6f6}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar{width:3px;background-color:#f6f6f6}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup .list::-webkit-scrollbar-thumb{background-color:rgba(26,175,251,.16)}.mec-add-event-popup .mec-steps-content-container .mec-time-picker .wn-mec-select-popup:last-child .list{overflow:unset!important;height:unset}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]{color:#3c434a!important}@media (max-width:1280px){.mec-add-event-popup .lity-container,.mec-add-shortcode-popup .lity-container{height:calc(100% - 110px);margin-bottom:-80px}.mec-add-event-popup .post-type-mec-events .mec-form-row{padding-bottom:12px}.mec-add-event-popup .mec-steps-panel .mec-add-event-popup .mec-steps-panel,.mec-add-shortcode-popup .mec-steps-panel .mec-add-event-popup .mec-steps-panel{padding:14px}.mec-add-event-popup .mec-steps-container img,.mec-add-event-popup .mec-steps-container ul,.mec-add-shortcode-popup .mec-steps-container img,.mec-add-shortcode-popup .mec-steps-container ul{margin-top:14px}.mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:first-of-type,.mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:first-of-type{height:28px}.mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li,.mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li{height:46px}.mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:after,.mec-add-event-popup .mec-add-event-popup .mec-steps-container ul li:before,.mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:after,.mec-add-shortcode-popup .mec-add-event-popup .mec-steps-container ul li:before{height:12px}.mec-add-event-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1{top:150px}#mec_popup_event div#mec_location_new_container,#mec_popup_event div#mec_organizer_new_container,#mec_popup_event div#mec_sponsor_new_container{padding-top:12px;margin-top:12px}#mec_popup_event div#mec_location_new_container input,#mec_popup_event div#mec_organizer_new_container input,#mec_popup_event div#mec_sponsor_new_container input{margin:0 0 3px 0}}@media (max-width:960px){.mec-steps-content-container{background-image:unset!important}#mec_popup_event div#mec_location_new_container,#mec_popup_event div#mec_organizer_new_container,#mec_popup_event div#mec_sponsor_new_container,.mec-add-event-popup .mec-steps-content-container .mec-steps-content,.mec-add-shortcode-popup .mec-steps-content-container .mec-steps-content{width:100%!important;max-width:100%;position:unset!important;margin:0!important}.mec-add-event-popup .lity-container,.mec-add-shortcode-popup .lity-container,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-1 .mec-steps-content.mec-steps-content-1 input[name="shortcode[name]"]{width:100%;max-width:100%}.mec-add-event-popup .mec-steps-panel,.mec-add-shortcode-popup .mec-steps-panel{overflow-x:scroll;padding:14px}.mec-add-event-popup .mec-steps-header,.mec-add-shortcode-popup .mec-steps-header{margin-bottom:30px}.mec-add-event-popup .mec-steps-header span.mec-steps-header-add-text,.mec-add-shortcode-popup .mec-steps-header span.mec-steps-header-add-text{display:block;margin-top:10px;width:100%}.mec-add-event-popup .mec-col-4,.mec-add-shortcode-popup .mec-col-4{width:100%!important;max-width:100%!important}.mec-add-event-popup #mec_popup_event button#mec_organizer_thumbnail_button,.mec-add-event-popup #mec_popup_event button#mec_popup_add_location,.mec-add-event-popup #mec_popup_event button#mec_popup_add_organizer,.mec-add-shortcode-popup #mec_popup_event button#mec_organizer_thumbnail_button,.mec-add-shortcode-popup #mec_popup_event button#mec_popup_add_location,.mec-add-shortcode-popup #mec_popup_event button#mec_popup_add_organizer{margin:10px 0 0 0}.mec-add-event-popup .mec-col-1,.mec-add-event-popup .mec-col-10,.mec-add-event-popup .mec-col-11,.mec-add-event-popup .mec-col-12,.mec-add-event-popup .mec-col-2,.mec-add-event-popup .mec-col-3,.mec-add-event-popup .mec-col-4,.mec-add-event-popup .mec-col-5,.mec-add-event-popup .mec-col-6,.mec-add-event-popup .mec-col-7,.mec-add-event-popup .mec-col-8,.mec-add-event-popup .mec-col-9,.mec-add-shortcode-popup .mec-col-1,.mec-add-shortcode-popup .mec-col-10,.mec-add-shortcode-popup .mec-col-11,.mec-add-shortcode-popup .mec-col-12,.mec-add-shortcode-popup .mec-col-2,.mec-add-shortcode-popup .mec-col-3,.mec-add-shortcode-popup .mec-col-4,.mec-add-shortcode-popup .mec-col-5,.mec-add-shortcode-popup .mec-col-6,.mec-add-shortcode-popup .mec-col-7,.mec-add-shortcode-popup .mec-col-8,.mec-add-shortcode-popup .mec-col-9{margin:0 0 10px 0}.mec-add-event-popup .mec-steps-content h3,.mec-add-shortcode-popup .mec-steps-content h3{font-size:18px!important}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-3 .mec-skin-styles{height:480px;width:100%}}@media (max-width:320px){.mec-add-event-popup .mec-steps-container,.mec-add-shortcode-popup .mec-steps-container{display:none}.mec-add-event-popup .mec-steps-panel,.mec-add-shortcode-popup .mec-steps-panel{width:100%!important}}#mec_popup_event input[type=checkbox]{margin-right:9px}#mec_popup_event input#mec_location_dont_show_map{margin-top:0!important}#mec_popup_settings #mec_next_previous_events_container_toggle label,#mec_popup_settings #mec_related_events_container_toggle label{padding:0}#mec_popup_event input[type=checkbox]:checked,#mec_popup_event input[type=radio]:checked,#mec_popup_settings input[type=checkbox]:checked,#mec_popup_settings input[type=radio]:checked,#mec_popup_shortcode input[type=checkbox]:checked,#mec_popup_shortcode input[type=radio]:checked{background:#64e385;border-color:#64e385}#mec_popup_event input[type=checkbox]:checked:before,#mec_popup_event input[type=radio]:checked:before,#mec_popup_settings input[type=checkbox]:checked:before,#mec_popup_settings input[type=radio]:checked:before,#mec_popup_shortcode input[type=checkbox]:checked:before,#mec_popup_shortcode input[type=radio]:checked:before{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNC42ODgiIHZpZXdCb3g9IjAgMCAyMCAxNC42ODgiPg0KICA8ZyBpZD0idGlja18xXyIgZGF0YS1uYW1lPSJ0aWNrICgxKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk4KSI+DQogICAgPGcgaWQ9Ikdyb3VwXzEiIGRhdGEtbmFtZT0iR3JvdXAgMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA2Ny45OTcpIj4NCiAgICAgIDxwYXRoIGlkPSJQYXRoXzEiIGRhdGEtbmFtZT0iUGF0aCAxIiBkPSJNMTkuNzA3LDY4LjI5YTEsMSwwLDAsMC0xLjQxNCwwTDYuMzEyLDgwLjI3MSwxLjcwNyw3NS42NjZBMSwxLDAsMCwwLC4yOTIsNzcuMDhMNS42LDgyLjM5MmExLDEsMCwwLDAsMS40MTQsMEwxOS43MDcsNjkuN0ExLDEsMCwwLDAsMTkuNzA3LDY4LjI5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtNjcuOTk3KSIgZmlsbD0iI2ZmZiIvPg0KICAgIDwvZz4NCiAgPC9nPg0KPC9zdmc+DQo=");line-height:16px;width:15px;float:none;margin:2px;display:block}#mec_popup_shortcode .mec-steps-content.mec-steps-content-4 label input[type=radio]:before{background:unset;margin:-2px 0 0 0}.mec-add-event-popup .mec-steps-content.mec-steps-content-5{width:366px;margin-top:48px}#mec_popup_event div#mec_location_new_container,#mec_popup_event div#mec_organizer_new_container,#mec_popup_event div#mec_sponsor_new_container{border-top:2px dashed #dce2e3;width:375px;padding-top:25px;margin-top:0;overflow-y:scroll;overflow-x:hidden;max-height:240px}#mec_popup_event div#mec_location_new_container .mec-form-row,#mec_popup_event div#mec_organizer_new_container .mec-form-row,#mec_popup_event div#mec_sponsor_new_container .mec-form-row{padding-bottom:20px}#mec_popup_event div#mec_location_new_container .description,#mec_popup_event div#mec_organizer_new_container .description,#mec_popup_event div#mec_sponsor_new_container .description{margin:9px 0}#mec_popup_event div#mec_location_new_container .mec-form-row.mec-thumbnail-row,#mec_popup_event div#mec_organizer_new_container .mec-form-row.mec-thumbnail-row,#mec_popup_event div#mec_sponsor_new_container .mec-form-row.mec-thumbnail-row{padding:0}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-steps-content.mec-steps-content-5 .mec-switcher div:last-of-type label{position:absolute;top:-12px;max-width:52px;width:100%;height:30px}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input+label{background:#e5e9ee;box-shadow:unset}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input+label:after{margin-left:0;margin-top:-1px;border-color:#e5e9ee}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input[value="1"]:checked+label,.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-5 .mec-switcher input[value="1"]:checked+label:before{box-shadow:2px 2px 12px -2px #4fdc73 inset;position:relative;background:#64e385;border-color:#64e385}.lity.mec-add-event-popup .lity-content,.lity.mec-settings .lity-content{box-shadow:0 3px 20px 0 rgb(91 188 190 / 55%);border-radius:10px;height:100%;overflow:hidden}.mec-settings .lity-container{width:930px;height:620px;max-width:unset}#mec_popup_settings #mec_next_previous_events_container_toggle label:first-child,#mec_popup_settings #mec_related_events_container_toggle label:first-child{display:block;margin:0 0 20px 0}#mec_popup_event .mec-categories-tab-contents,#mec_popup_settings #mec_settings_weekdays .mec-box,#mec_popup_settings #mec_settings_weekends .mec-box{background:rgb(220 226 227 / .3)}#mec_popup_settings .mec-switcher input+label{max-width:62px!important;width:100%;height:33px}#mec_popup_settings .mec-image-select-wrap li input:checked+span:after{padding:5px}.ac-mec-events.ac-search-enabled .tablenav .ac-search>:not(#ac-s).lity-hide{display:none}.tablenav .actions .input-field{float:left;margin-right:6px}.tablenav .actions .input-field .select2-selection{height:30px}.mec-go-pro-content-title{font-size:20px;font-weight:600;margin-bottom:12px}.mec-go-pro-features-wrap p{font-size:14px}.mec-go-pro-features-wrap .mec-addons-notification-box-content{width:calc(100% - 590px);display:inline-block;padding-left:20px}.mec-go-pro-features-wrap ul{float:left;width:50%;margin:0 0 12px}.mec-go-pro-features-wrap ul li{margin-bottom:1px;font-size:13px;color:#717479;padding-left:18px;position:relative}.mec-go-pro-features-wrap ul li:before{position:absolute;left:-1px;top:6px;color:#36da74;font-size:13px;font-weight:700;vertical-align:middle;font-family:simple-line-icons;border-radius:50%;padding:0;width:13px;height:13px;line-height:13px;z-index:3;background:rgba(64,241,147,.12);content:"\e080"}.post-type-mec-events #TB_window{height:470px!important;top:calc(50% - 235px)!important}.post-type-mec-events #TB_ajaxContent{width:calc(100% - 30px)!important}.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container .fserv-form-description{position:relative!important}.taxonomy-mec_category #TB_window{overflow:hidden}@media (max-width:480px){.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container .fserv-form-description,.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container form{padding-left:90px!important}.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container form .fserv-field{width:40%!important}.m-e-calendar_page_MEC-support #wpwrap .welcome-content .fserv-container:before{top:100px;left:10px}}.post-type-mec-events.taxonomy-mec_label .button.wp-color-result{background:0 0;text-align:right;padding:0 0 0 32px;border-radius:4px;box-shadow:unset;border:1px solid #ddd}.post-type-mec-events.taxonomy-mec_label .button.wp-color-result .wp-color-result-text{height:30px}.post-type-mec-events.taxonomy-mec_label .wp-picker-container input[type=text].wp-color-picker{width:70px;margin-top:-10px;height:32px}.post-type-mec-events.taxonomy-mec_label .wp-picker-default{height:32px;padding-top:2px;padding-bottom:2px}.post-type-mec-events.taxonomy-mec_label .wp-picker-container .iris-picker{margin-top:-10px}.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper,.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper .nav-tab,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper{background:#1f1f1f}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .mec-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab{border-color:#353535}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active{background:#404040!important}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab:not(.nav-tab-active):after{background:#4f4f4f}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active:after{border-color:#404040 transparent transparent}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active:before{border-color:#404040 transparent transparent}.mec-admin-dark-mode #mec_bfixed_form_fields li,.mec-admin-dark-mode #mec_calendar_filter,.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left,.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-wrap,.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left,.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-wrap,.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left,.mec-admin-dark-mode #mec_metabox_booking,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-wrap,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-wrap,.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left,.mec-admin-dark-mode #mec_metabox_details,.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left,.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-wrap,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap .select2-container,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tab-content .select2-container,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left,.mec-admin-dark-mode #webnus-dashboard .mec-pro-notice .info-msg,.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd),.mec-admin-dark-mode .w-box,.mec-admin-dark-mode .w-box-content pre,.mec-admin-dark-mode .w-clearfix.w-box.mec-addons-notification-box-wrap span,.mec-admin-dark-mode .w-clearfix.w-box.mec-cmsg-2-notification-box-wrap span,.mec-admin-dark-mode .w-clearfix.w-box.mec-cmsg-notification-box-wrap span,.mec-admin-dark-mode .wns-be-main,.mec-admin-dark-mode .wns-be-main .mec-container,.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix .mec-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-content,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-editor-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-pro-notice .info-msg,.mec-admin-dark-mode.post-type-mec-books #major-publishing-actions,.mec-admin-dark-mode.post-type-mec-books #screen-meta,.mec-admin-dark-mode.post-type-mec-books #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec-books .postbox,.mec-admin-dark-mode.post-type-mec-events #major-publishing-actions,.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields li,.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields li,.mec-admin-dark-mode.post-type-mec-events #post-status-info,.mec-admin-dark-mode.post-type-mec-events #screen-meta,.mec-admin-dark-mode.post-type-mec-events #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec-events .categorydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .components-popover__content,.mec-admin-dark-mode.post-type-mec-events .customlinkdiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .postbox,.mec-admin-dark-mode.post-type-mec-events .posttypediv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .taxonomydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .wp-switch-editor,.mec-admin-dark-mode.post-type-mec-events .wp-tab-active,.mec-admin-dark-mode.post-type-mec-events .wp-tab-panel,.mec-admin-dark-mode.post-type-mec-events div.mce-panel,.mec-admin-dark-mode.post-type-mec-events div.mce-toolbar-grp,.mec-admin-dark-mode.post-type-mec-events ul.add-menu-item-tabs li.tabs,.mec-admin-dark-mode.post-type-mec-events ul.category-tabs li.tabs,.mec-admin-dark-mode.post-type-mec_calendars #major-publishing-actions,.mec-admin-dark-mode.post-type-mec_calendars #post-status-info,.mec-admin-dark-mode.post-type-mec_calendars #screen-meta,.mec-admin-dark-mode.post-type-mec_calendars #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec_calendars .categorydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .customlinkdiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .postbox,.mec-admin-dark-mode.post-type-mec_calendars .posttypediv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .taxonomydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .wp-switch-editor,.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-active,.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-panel,.mec-admin-dark-mode.post-type-mec_calendars div.mce-panel,.mec-admin-dark-mode.post-type-mec_calendars div.mce-toolbar-grp,.mec-admin-dark-mode.post-type-mec_calendars ul.add-menu-item-tabs li.tabs,.mec-admin-dark-mode.post-type-mec_calendars ul.category-tabs li.tabs{background:#1f1f1f;color:#fff}.mec-admin-dark-mode .mec-form-row .mec-box,.mec-admin-dark-mode .mec-form-row input[type=checkbox],.mec-admin-dark-mode .mec-form-row ul.mec-message-categories li ul,.mec-admin-dark-mode .mec-meta-box-fields .mec-box,.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-faq-accordion-trigger a{background:#333;border-color:#353535;box-shadow:0 1px 6px -2px #000}.mec-admin-dark-mode #wpwrap .mec-button-primary,.mec-admin-dark-mode .wns-be-container .dpr-btn.dpr-save-btn{box-shadow:none;background:#5e7a65}.mec-admin-dark-mode #wpwrap .mec-button-primary:hover,.mec-admin-dark-mode .wns-be-container .dpr-btn.dpr-save-btn:hover{box-shadow:none;background:#559164;border-color:none}.mec-admin-dark-mode #mec-wrap .nav-tab-wrapper .nav-tab{border-radius:7px}.mec-admin-dark-mode #mec_bfixed_form_fields,.mec-admin-dark-mode #mec_bfixed_form_fields #mec_bfixed_form_fields li,.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left a,.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left a,.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left a,.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left a,.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left a,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left a,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix .mec-form-row.mec-syn-schedule,.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields,.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields,.mec-admin-dark-mode.post-type-mec-events .select2-search--dropdown,.mec-admin-dark-mode.post-type-mec_calendars .select2-search--dropdown{background:#282828;border-color:#353535}.mec-admin-dark-mode .select2-container--default .select2-selection--multiple .select2-selection__choice{color:#000}.mec-admin-dark-mode.post-type-mec-books ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.post-type-mec-books ul#adminmenu>li.current>a.current:after,.mec-admin-dark-mode.post-type-mec-events ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.post-type-mec-events ul#adminmenu>li.current>a.current:after,.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu>li.current>a.current:after,.mec-admin-dark-mode.toplevel_page_mec-intro ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.toplevel_page_mec-intro ul#adminmenu>li.current>a.current:after{border-right-color:#23282d}.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a.mec-tab-active,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-left a.mec-tab-active,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-dropdown,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_gateways_form li .mec-gateway-options-form,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #payment_gateways_option li .mec-gateway-options-form,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple,.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list{background:#000;box-shadow:0 2px 12px -5px #000}.mec-admin-dark-mode .extra .w-box-head,.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child,.mec-admin-dark-mode .mec-cmsg-2-notification-box-wrap,.mec-admin-dark-mode .mec-cmsg-notification-box-wrap,.mec-admin-dark-mode .mec-form-row ul.mec-message-categories,.mec-admin-dark-mode .mec-message-categories li.mec-acc-label,.mec-admin-dark-mode .w-box,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mce-btn-group:not(:first-child),.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-search--dropdown .select2-search__field,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-dropdown,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .wp-editor-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-occurrences .mec-occurrences-list li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields li,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .html-active .switch-html,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-set-box.extra,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple .select2-selection__choice,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .tmce-active .switch-tmce,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-content,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-footer,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar:before,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-core-ui .quicktags-toolbar input.button.button-small,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-editor-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-switch-editor,.mec-admin-dark-mode.post-type-mec-books #screen-meta,.mec-admin-dark-mode.post-type-mec-books #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec-books .postbox,.mec-admin-dark-mode.post-type-mec-books .postbox .hndle,.mec-admin-dark-mode.post-type-mec-books .postbox hr,.mec-admin-dark-mode.post-type-mec-books .wp-heading-inline+.page-title-action,.mec-admin-dark-mode.post-type-mec-events #major-publishing-actions,.mec-admin-dark-mode.post-type-mec-events #post-status-info,.mec-admin-dark-mode.post-type-mec-events #screen-meta,.mec-admin-dark-mode.post-type-mec-events #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec-events .categorydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .components-popover__content,.mec-admin-dark-mode.post-type-mec-events .customlinkdiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff .stuffbox>h3,.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff h2.hndle,.mec-admin-dark-mode.post-type-mec-events .edit-post-meta-boxes-area #poststuff h3.hndle,.mec-admin-dark-mode.post-type-mec-events .postbox,.mec-admin-dark-mode.post-type-mec-events .postbox h2,.mec-admin-dark-mode.post-type-mec-events .posttypediv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .taxonomydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec-events .wp-editor-container,.mec-admin-dark-mode.post-type-mec-events .wp-switch-editor,.mec-admin-dark-mode.post-type-mec-events .wp-tab-active,.mec-admin-dark-mode.post-type-mec-events .wp-tab-panel,.mec-admin-dark-mode.post-type-mec-events div.mce-panel,.mec-admin-dark-mode.post-type-mec-events div.mce-toolbar-grp,.mec-admin-dark-mode.post-type-mec-events ul.add-menu-item-tabs li.tabs,.mec-admin-dark-mode.post-type-mec-events ul.category-tabs li.tabs,.mec-admin-dark-mode.post-type-mec_calendars #major-publishing-actions,.mec-admin-dark-mode.post-type-mec_calendars #post-status-info,.mec-admin-dark-mode.post-type-mec_calendars #screen-meta,.mec-admin-dark-mode.post-type-mec_calendars #screen-meta-links .show-settings,.mec-admin-dark-mode.post-type-mec_calendars .categorydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .customlinkdiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list,.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option,.mec-admin-dark-mode.post-type-mec_calendars .mec-sed-methods li,.mec-admin-dark-mode.post-type-mec_calendars .postbox,.mec-admin-dark-mode.post-type-mec_calendars .postbox h2,.mec-admin-dark-mode.post-type-mec_calendars .posttypediv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .taxonomydiv div.tabs-panel,.mec-admin-dark-mode.post-type-mec_calendars .wp-editor-container,.mec-admin-dark-mode.post-type-mec_calendars .wp-switch-editor,.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-active,.mec-admin-dark-mode.post-type-mec_calendars .wp-tab-panel,.mec-admin-dark-mode.post-type-mec_calendars div.mce-panel,.mec-admin-dark-mode.post-type-mec_calendars div.mce-toolbar-grp,.mec-admin-dark-mode.post-type-mec_calendars ul.add-menu-item-tabs li.tabs,.mec-admin-dark-mode.post-type-mec_calendars ul.category-tabs li.tabs{border-color:#353535}.mec-admin-dark-mode .notice.notice-warning.is-dismissible{color:#353535}.mec-admin-dark-mode #mec_bfixed_form_fields input[type=checkbox],.mec-admin-dark-mode #mec_calendar_filter .mec-calendar-metabox .wn-mec-select,.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type=number],.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type=text],.mec-admin-dark-mode #mec_calendar_filter .mec-form-row input[type=url],.mec-admin-dark-mode #mec_calendar_filter .mec-form-row select,.mec-admin-dark-mode #mec_calendar_filter .mec-form-row textarea,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-wrap .select2-container,.mec-admin-dark-mode #mec_metabox_booking .mec-calendar-metabox .mec-form-row input[type=checkbox],.mec-admin-dark-mode #mec_metabox_booking .mec-calendar-metabox .wn-mec-select,.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tab-content .select2-container,.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type=number],.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type=text],.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type=url],.mec-admin-dark-mode #mec_metabox_booking .mec-form-row select,.mec-admin-dark-mode #mec_metabox_booking .mec-form-row textarea,.mec-admin-dark-mode #mec_metabox_booking .mec-form-row.mec-skin-list-date-format-container input[type=text],.mec-admin-dark-mode #mec_metabox_booking .mec-meta-box-fields .mec-form-row input[type=checkbox],.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-wrap .select2-container,.mec-admin-dark-mode #mec_metabox_details .mec-calendar-metabox .mec-form-row input[type=checkbox],.mec-admin-dark-mode #mec_metabox_details .mec-calendar-metabox .wn-mec-select,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tab-content .select2-container,.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type=number],.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type=text],.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type=url],.mec-admin-dark-mode #mec_metabox_details .mec-form-row select,.mec-admin-dark-mode #mec_metabox_details .mec-form-row textarea,.mec-admin-dark-mode #mec_metabox_details .mec-form-row.mec-skin-list-date-format-container input[type=text],.mec-admin-dark-mode #mec_metabox_details .mec-meta-box-fields .mec-form-row input[type=checkbox],.mec-admin-dark-mode #mec_reg_form_fields input[type=checkbox],.mec-admin-dark-mode .mec-addon-box-version,.mec-admin-dark-mode .mec-backend-tab,.mec-admin-dark-mode .mec-calendar-metabox .wn-mec-select,.mec-admin-dark-mode .mec-form-row input[type=checkbox],.mec-admin-dark-mode .mec-form-row input[type=number],.mec-admin-dark-mode .mec-form-row input[type=radio],.mec-admin-dark-mode .mec-form-row input[type=text],.mec-admin-dark-mode .mec-form-row input[type=url],.mec-admin-dark-mode .mec-form-row select,.mec-admin-dark-mode .mec-form-row textarea,.mec-admin-dark-mode .mec-form-row.mec-skin-list-date-format-container input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-addons,.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .html-active .switch-html,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-select-event-wrap .select2-container--default .select2-selection--single,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-sendmail-form-wrap,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-sendmail-wrap,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-send-email-form-wrap input.widefat,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-results__option--highlighted[aria-selected],.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-search--dropdown .select2-search__field,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .tmce-active .switch-tmce,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .wp-switch-editor,.mec-admin-dark-mode.m-e-calendar_page_MEC-report div.mce-toolbar-grp,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-invoice-custom-css,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields input[type=number],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields select,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields textarea,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields input[type=number],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields select,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields textarea,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields input[type=number],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields select,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields textarea,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #titlediv #title,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-add-event-tabs-wrap .select2-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-add-event-tabs-wrap .select2-container span,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-create-shortcode-tab-content .select2-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-create-shortcode-tab-content .select2-container span,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .quicktags-toolbar,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default.select2-container--focus .select2-selection--multiple,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-dropdown,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-results__option[aria-selected],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=email],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=number],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=password],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=search],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row input[type=url],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main .mec-form-row select,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-core-ui .quicktags-toolbar input.button.button-small,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=checkbox],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=color],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=date],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=datetime-local],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=datetime],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=email],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=month],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=number],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=password],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=radio],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=search],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=tel],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=text],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=time],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=url],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings input[type=week],.mec-admin-dark-mode.m-e-calendar_page_MEC-settings select,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings textarea,.mec-admin-dark-mode.post-type-mec-books .wn-mec-select,.mec-admin-dark-mode.post-type-mec-books input[type=checkbox],.mec-admin-dark-mode.post-type-mec-books input[type=email],.mec-admin-dark-mode.post-type-mec-books input[type=number],.mec-admin-dark-mode.post-type-mec-books input[type=text],.mec-admin-dark-mode.post-type-mec-books input[type=url],.mec-admin-dark-mode.post-type-mec-books select,.mec-admin-dark-mode.post-type-mec-books textarea,.mec-admin-dark-mode.post-type-mec-events #mec_event_form_fields button,.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_field_types button,.mec-admin-dark-mode.post-type-mec-events #mec_reg_form_fields button,.mec-admin-dark-mode.post-type-mec-events #titlediv #title,.mec-admin-dark-mode.post-type-mec-events .components-form-token-field__input-container,.mec-admin-dark-mode.post-type-mec-events .components-panel__body,.mec-admin-dark-mode.post-type-mec-events .mec-add-event-tabs-wrap .select2-container span,.mec-admin-dark-mode.post-type-mec-events .mec-certain-day>div,.mec-admin-dark-mode.post-type-mec-events .mec-create-shortcode-tab-content .select2-container span,.mec-admin-dark-mode.post-type-mec-events .mec-xi-facebook-import-events .mec-select-deselect-actions li,.mec-admin-dark-mode.post-type-mec-events .mec-xi-google-import-events .mec-select-deselect-actions li,.mec-admin-dark-mode.post-type-mec-events .select2-dropdown,.mec-admin-dark-mode.post-type-mec-events .select2-results__option[aria-selected],.mec-admin-dark-mode.post-type-mec-events .wp-admin p label input[type=checkbox],.mec-admin-dark-mode.post-type-mec-events input[type=checkbox],.mec-admin-dark-mode.post-type-mec-events input[type=color],.mec-admin-dark-mode.post-type-mec-events input[type=date],.mec-admin-dark-mode.post-type-mec-events input[type=datetime-local],.mec-admin-dark-mode.post-type-mec-events input[type=datetime],.mec-admin-dark-mode.post-type-mec-events input[type=email],.mec-admin-dark-mode.post-type-mec-events input[type=month],.mec-admin-dark-mode.post-type-mec-events input[type=number],.mec-admin-dark-mode.post-type-mec-events input[type=password],.mec-admin-dark-mode.post-type-mec-events input[type=radio],.mec-admin-dark-mode.post-type-mec-events input[type=search],.mec-admin-dark-mode.post-type-mec-events input[type=tel],.mec-admin-dark-mode.post-type-mec-events input[type=text],.mec-admin-dark-mode.post-type-mec-events input[type=time],.mec-admin-dark-mode.post-type-mec-events input[type=url],.mec-admin-dark-mode.post-type-mec-events input[type=week],.mec-admin-dark-mode.post-type-mec-events select,.mec-admin-dark-mode.post-type-mec-events textarea,.mec-admin-dark-mode.post-type-mec_calendars #titlediv #title,.mec-admin-dark-mode.post-type-mec_calendars .mec-add-event-tabs-wrap .select2-container,.mec-admin-dark-mode.post-type-mec_calendars .mec-add-event-tabs-wrap .select2-container span,.mec-admin-dark-mode.post-type-mec_calendars .mec-create-shortcode-tab-content .select2-container,.mec-admin-dark-mode.post-type-mec_calendars .mec-create-shortcode-tab-content .select2-container span,.mec-admin-dark-mode.post-type-mec_calendars .select2-container--default .select2-selection--multiple .select2-selection__choice,.mec-admin-dark-mode.post-type-mec_calendars .select2-dropdown,.mec-admin-dark-mode.post-type-mec_calendars .select2-results__option[aria-selected],.mec-admin-dark-mode.post-type-mec_calendars input[type=checkbox],.mec-admin-dark-mode.post-type-mec_calendars input[type=color],.mec-admin-dark-mode.post-type-mec_calendars input[type=date],.mec-admin-dark-mode.post-type-mec_calendars input[type=datetime-local],.mec-admin-dark-mode.post-type-mec_calendars input[type=datetime],.mec-admin-dark-mode.post-type-mec_calendars input[type=email],.mec-admin-dark-mode.post-type-mec_calendars input[type=month],.mec-admin-dark-mode.post-type-mec_calendars input[type=number],.mec-admin-dark-mode.post-type-mec_calendars input[type=password],.mec-admin-dark-mode.post-type-mec_calendars input[type=radio],.mec-admin-dark-mode.post-type-mec_calendars input[type=search],.mec-admin-dark-mode.post-type-mec_calendars input[type=tel],.mec-admin-dark-mode.post-type-mec_calendars input[type=text],.mec-admin-dark-mode.post-type-mec_calendars input[type=time],.mec-admin-dark-mode.post-type-mec_calendars input[type=url],.mec-admin-dark-mode.post-type-mec_calendars input[type=week],.mec-admin-dark-mode.post-type-mec_calendars select,.mec-admin-dark-mode.post-type-mec_calendars textarea,.mec-admin-dark-mode.toplevel_page_mec-intro .w-box.mec-activation input[name=MECPurchaseCode],.mec-admin-dark-mode.toplevel_page_mec-intro .w-box.mec-activation input[type=radio]+label span,.mec-select-deselect-actions li{background:#1d1d1d;border-color:#353535;color:#d2d2d2}.mec-admin-dark-mode .mec-b-active-tab{background:#505050;color:#dbdbdb}.mec-admin-dark-mode #mec_metabox_booking .mec-form-row input[type=checkbox]:checked,.mec-admin-dark-mode #mec_metabox_details .mec-form-row input[type=checkbox]:checked,.mec-admin-dark-mode .mec-custom-nice-select ul.list li .wn-mec-text:after,.mec-admin-dark-mode .mec-sed-methods li:before{box-shadow:0 1px 6px -2px #000;border-color:#353535;background:#222}.mec-admin-dark-mode .mec-sed-methods li.active,.mec-admin-dark-mode .mec-switcher input+label,.mec-admin-dark-mode .mec-switcher input+label:before,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-results__option{background-color:#000}.mec-admin-dark-mode .wn-mec-select .option.focus .wn-img-sh img,.mec-admin-dark-mode .wn-mec-select .option.selected.focus .wn-img-sh img,.mec-admin-dark-mode .wn-mec-select .option:hover .wn-img-sh img{background:0 0}.mec-admin-dark-mode .ui-datepicker{background-color:#000;border:1px solid #000;box-shadow:0 0 8px rgba(33,33,33,.6)}.mec-admin-dark-mode .ui-datepicker.ui-widget td a,.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article .mec-detail-button,.mec-admin-dark-mode.post-type-mec-events,.mec-admin-dark-mode.post-type-mec-events .postbox h2,.mec-admin-dark-mode.post-type-mec_calendars .postbox h2{color:#d2d2d2;background:#282828}.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul *{background:#282828}.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul>ul>li,.mec-admin-dark-mode #mec_styles_form #mec_styles_CSS,.mec-admin-dark-mode .mec-attendees-wrapper .mec-attendees-list .w-clearfix,.mec-admin-dark-mode .mec-message-categories li.mec-acc-label,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_bfixed_form_fields,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_event_form_fields,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_fields{background:#000}.mec-admin-dark-mode #mec-advanced-wraper div:first-child>ul>ul>li:hover,.mec-admin-dark-mode .mec-active,.mec-admin-dark-mode.post-type-mec-events .select2-container--default .select2-results__option--highlighted[aria-selected]{background:#888!important}.mec-admin-dark-mode.post-type-mec_calendars .mec-calendar-metabox .wn-mec-select .list{border-radius:0 0 2px 2px;box-shadow:0 0 0 1px #353535,0 2px 6px rgba(0,0,0,.07)}.mec-admin-dark-mode #mec_calendar_filter .mec-add-booking-tabs-right,.mec-admin-dark-mode #mec_calendar_filter .mec-add-event-tabs-right,.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-right,.mec-admin-dark-mode #mec_calendar_filter .ui-sortable-handle,.mec-admin-dark-mode #mec_gateways_form li .mec-gateway-options-form,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-right,.mec-admin-dark-mode #mec_metabox_booking .mec-add-event-tabs-right,.mec-admin-dark-mode #mec_metabox_booking .mec-create-shortcode-tabs-right,.mec-admin-dark-mode #mec_metabox_booking .ui-sortable-handle,.mec-admin-dark-mode #mec_metabox_details .mec-add-booking-tabs-right,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-right,.mec-admin-dark-mode #mec_metabox_details .mec-create-shortcode-tabs-right,.mec-admin-dark-mode #mec_metabox_details .ui-sortable-handle,.mec-admin-dark-mode #payment_gateways_option li .mec-gateway-options-form,.mec-admin-dark-mode .mec-meta-box-fields h4{border-color:#000!important}.mec-admin-dark-mode .wns-be-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content,.mec-admin-dark-mode.post-type-mec-events #wp-content-editor-tools,.mec-admin-dark-mode.post-type-mec_calendars,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .list{background-color:#282828;border-color:#353535}.mec-admin-dark-mode .mec-intro-section-ifarme iframe,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head,.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container,.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container *,.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container,.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container *{background:#1f1f1f!important;border-color:#353535!important}.mec-admin-dark-mode .fserv-field input.fserv-input-text{background:#000!important}.mec-admin-dark-mode .block-editor-block-types-list__item-icon,.mec-admin-dark-mode .block-editor-block-types-list__item-title,.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article h4.mec-event-title,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .select2-container--default .select2-selection--single .select2-selection__rendered,.mec-admin-dark-mode.m-e-calendar_page_MEC-support .about-wrap h3,.mec-admin-dark-mode.m-e-calendar_page_MEC-support .fserv-container .fserv-form-name,.mec-admin-dark-mode.toplevel_page_mec-intro .about-wrap h3,.mec-admin-dark-mode.toplevel_page_mec-intro .fserv-container .fserv-form-name{color:#d2d2d2!important}.mec-admin-dark-mode .wns-be-sidebar li a:hover,.mec-admin-dark-mode .wns-be-sidebar li:hover,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .html-active .switch-html,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .tmce-active .switch-tmce,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-switch-editor,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option:hover{background:#000;color:#d2d2d2}.mec-admin-dark-mode .wns-be-sidebar li a,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h1,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h2,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h3,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h4,.mec-admin-dark-mode.m-e-calendar_page_MEC-report .mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head span,.mec-admin-dark-mode.m-e-calendar_page_MEC-report h2,.mec-admin-dark-mode.m-e-calendar_page_MEC-report h4,.mec-admin-dark-mode.m-e-calendar_page_MEC-support #webnus-dashboard .mec-faq-accordion-trigger a,.mec-admin-dark-mode.post-type-mec-books .postbox h1,.mec-admin-dark-mode.post-type-mec-books .postbox h2,.mec-admin-dark-mode.post-type-mec-books .postbox h3,.mec-admin-dark-mode.post-type-mec-events .components-panel__body-toggle.components-button,.mec-admin-dark-mode.post-type-mec-events .wrap h1.wp-heading-inline,.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option .wn-mec-text{color:#d2d2d2}.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a,.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a:hover{border:none}.mec-admin-dark-mode .wns-be-sidebar li.active ul.subsection{background:#282828;border-bottom:1px solid #353535}.mec-admin-dark-mode .wns-be-sidebar li .subsection a{background:#282828;color:#636363;opacity:1;font-size:12px;padding:6px 4px 6px 46px}.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu>li.active>a,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-infobar,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-main{box-shadow:0 2px 12px -5px #000}.mec-admin-dark-mode .wns-be-sidebar .mec-settings-menu .mec-settings-submenu a,.mec-admin-dark-mode li.wns-be-group-menu-li.mec-settings-menu .mec-settings-submenu,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option.focus,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option.selected.focus,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option:hover{background:#000;color:#d2d2d2;border-color:#353535}.mec-admin-dark-mode.m-e-calendar_page_MEC-settings,.mec-admin-dark-mode.post-type-mec_calendars .mec-custom-nice-select ul.list li.option{background:#000!important;color:#fff!important}.mec-admin-dark-mode.m-e-calendar_page_MEC-addons,.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .about-wrap h1,.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro,.mec-admin-dark-mode.m-e-calendar_page_MEC-go-pro h1,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix h1,.mec-admin-dark-mode.m-e-calendar_page_MEC-report,.mec-admin-dark-mode.m-e-calendar_page_MEC-report h1,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings div.mce-panel,.mec-admin-dark-mode.m-e-calendar_page_MEC-support,.mec-admin-dark-mode.m-e-calendar_page_MEC-support h1,.mec-admin-dark-mode.post-type-mec-books,.mec-admin-dark-mode.post-type-mec-books h1,.mec-admin-dark-mode.post-type-mec_calendars,.mec-admin-dark-mode.post-type-mec_calendars .wrap h1.wp-heading-inline,.mec-admin-dark-mode.toplevel_page_mec-intro,.mec-admin-dark-mode.toplevel_page_mec-intro .about-wrap h1{background:#282828!important;color:#d2d2d2}.mec-admin-dark-mode .w-theme-version{background:#1f1f1f}.mec-admin-dark-mode .mec-sed-methods li.active,.mec-admin-dark-mode .wns-be-container .wns-be-group-tab h2,.mec-admin-dark-mode .wns-be-container .wns-be-group-tab h4,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper,.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .select2-container--default .select2-selection--multiple .select2-selection__choice{color:#d2d2d2}.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li a:hover{color:#07bbe9}.mec-admin-dark-mode.m-e-calendar_page_MEC-ix #mec-wrap .nav-tab-wrapper .nav-tab-active{background:#008aff;background:linear-gradient(95deg,#36a2ff 0,#008aff 50%,#0072ff 100%)}.mec-admin-dark-mode .wns-be-container #wns-be-infobar:before{content:"";width:261px;height:78px;display:block;position:absolute;left:0;top:0;background:#1f1f1f url(../img/webnus-logo2.png) no-repeat center;border-bottom:1px solid #dedede;background-size:220px;z-index:997}.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-set-box.extra,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wns-be-container #wns-be-footer,.mec-admin-dark-mode.post-type-mec-books #titlediv #title,.mec-admin-dark-mode.post-type-mec-books .postbox h1{background:#1f1f1f!important}.mec-admin-dark-mode .mec-settings-menu .mec-settings-submenu:after,.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after,.mec-admin-dark-mode .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before{border-right-color:#353535}.mec-admin-dark-mode .mec-switcher input:checked+label:before{background-color:#d2d2d2;box-shadow:2px 2px 12px -2px #ccc inset}.mec-admin-dark-mode .mec-switcher input:checked+label{box-shadow:0 3px 11px -7px #000}.mec-admin-dark-mode .lity.mec-add-event-popup,.mec-admin-dark-mode .lity.mec-add-shortcode-popup,.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup,.mec-admin-dark-mode .mec-add-shortcode-popup div#mec_popup_shortcode{background:#282828}.mec-admin-dark-mode .lity.mec-add-event-popup .lity-content,.mec-admin-dark-mode .lity.mec-add-shortcode-popup .lity-content{box-shadow:0 3px 20px 0 rgba(0,0,0,.55)}.mec-admin-dark-mode .mec-add-event-popup .mec-meta-box-colors-container,.mec-admin-dark-mode .mec-steps-container,.mec-admin-dark-mode .mec-steps-header{background:#000}.mec-admin-dark-mode .mec-add-event-popup div#mec_popup_event,.mec-admin-dark-mode .mec-steps-panel{background:#1f1f1f}.mec-admin-dark-mode button.lity-close{background:#000;box-shadow:0 3px 8px 0 rgba(0,0,0,.55)}.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li{border:2px solid #282828;background:#000!important}.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-step-popup-skin-text:before,.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content.mec-steps-content-4 label input{background:#282828;border-color:#1f1f1f;box-shadow:0 3px 6px 0 rgba(0,0,0,.05)}.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-2 .mec-steps-content.mec-steps-content-2 ul li.active{box-shadow:0 3px 5px rgba(0,0,0,.2)}.mec-admin-dark-mode .nicescroll-cursors{background-color:#000!important}.mec-admin-dark-mode .mec-add-event-popup .mec-categories-tab-contents,.mec-admin-dark-mode .mec-add-event-popup .mec-form-row.mec-available-color-row,.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content.mec-steps-content-7.mec-steps-content-active,.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .mec-steps-content.mec-steps-content-4 .mec-multiple-skin-options div,.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode{border-color:#282828;background:#000}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code{background:rgba(266,266,266,.35)}.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code code,.mec-admin-dark-mode .mec-steps-content h3{color:#d2d2d2}.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.focus,.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option.selected.focus,.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .option:hover{background:#000}.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list{background:#282828}.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list::-webkit-scrollbar-track{background-color:#333}.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content-container .wn-mec-select-popup .list::-webkit-scrollbar{width:3px;background-color:#333}.mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-6 .mec-popup-shortcode-code button{margin-left:unset}.mec-admin-dark-mode .wp-picker-container .wp-color-result.button{background:inherit}.mec-admin-dark-mode .mec-add-event-popup .mec-steps-content.mec-steps-content-6 .mce-container-body.mce-stack-layout{background:#000;border-color:#000!important}.mec-admin-dark-mode .mec-add-shortcode-popup .mec-steps-content-container.mec-steps-content-4 .wn-mec-select-popup{background-color:#000;border-color:#282828}.mec-admin-dark-mode #wns-be-content .noresults label,.mec-admin-dark-mode #wns-be-content .results .results .noresults label,.mec-admin-dark-mode #wns-be-content ul li.disable,.mec-admin-dark-mode #wns-be-content ul li.disable label{color:#666}.mec-admin-dark-mode #wns-be-content .results .results .results label,.mec-admin-dark-mode #wns-be-content .results label,.mec-admin-dark-mode #wns-be-content ul li.enable,.mec-admin-dark-mode #wns-be-content ul li.enable label{color:#fff}.mec-admin-dark-mode.post-type-mec-books table.widefat,.mec-admin-dark-mode.post-type-mec_calendars table.widefat,.post-type-mec-events.mec-admin-dark-mode table.widefat{background:#1f1f1f;border-color:#353535;color:#d2d2d2}.mec-admin-dark-mode.post-type-mec-books .striped>tbody>:nth-child(odd),.mec-admin-dark-mode.post-type-mec-books ul.striped>:nth-child(odd),.mec-admin-dark-mode.post-type-mec-events .striped>tbody>:nth-child(odd),.mec-admin-dark-mode.post-type-mec-events ul.striped>:nth-child(odd),.mec-admin-dark-mode.post-type-mec_calendars .striped>tbody>:nth-child(odd),.mec-admin-dark-mode.post-type-mec_calendars ul.striped>:nth-child(odd){background:#282828;border-color:#353535;color:#d2d2d2}.mec-admin-dark-mode.post-type-mec-books .widefat td,.mec-admin-dark-mode.post-type-mec-books .widefat th,.mec-admin-dark-mode.post-type-mec-events .widefat td,.mec-admin-dark-mode.post-type-mec-events .widefat th,.mec-admin-dark-mode.post-type-mec_calendars .widefat td,.mec-admin-dark-mode.post-type-mec_calendars .widefat th{border-color:#000;color:#d2d2d2}.mec-admin-dark-mode.m-e-calendar_page_MEC-settings ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings ul#adminmenu>li.current>a.current:after,.mec-admin-dark-mode.post-type-mec-events ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.post-type-mec-events ul#adminmenu>li.current>a.current:after,.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu a.wp-has-current-submenu:after,.mec-admin-dark-mode.post-type-mec_calendars ul#adminmenu>li.current>a.current:after{border-right-color:#1f1f1f}.mec-admin-dark-mode #mec_add_fee_button,.mec-admin-dark-mode #mec_add_ticket_variation_button,.mec-admin-dark-mode #mec_bfixed_form_field_types button,.mec-admin-dark-mode #mec_bfixed_form_fields button,.mec-admin-dark-mode #mec_event_form_field_types button,.mec-admin-dark-mode #mec_event_form_fields button,.mec-admin-dark-mode #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button,.mec-admin-dark-mode #mec_reg_form_field_types button,.mec-admin-dark-mode #mec_reg_form_fields button,.mec-admin-dark-mode #taxes_option #mec_fees_list .mec-form-row .button,.mec-admin-dark-mode #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button,.mec-admin-dark-mode .mec-export-settings,.mec-admin-dark-mode .mec-import-settings,.mec-admin-dark-mode .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result),.mec-admin-dark-mode .mec-occurrences-wrapper .button:not(.wp-color-result),.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button-secondary,.mec-admin-dark-mode.post-type-mec-books .button,.mec-admin-dark-mode.post-type-mec-books .wp-heading-inline+.page-title-action,.mec-admin-dark-mode.post-type-mec-events .button,.mec-admin-dark-mode.post-type-mec-events .button-secondary,.mec-admin-dark-mode.post-type-mec-events .wp-heading-inline+.page-title-action,.mec-admin-dark-mode.post-type-mec_calendars .button,.mec-admin-dark-mode.post-type-mec_calendars .wp-heading-inline+.page-title-action{color:#d2d2d2!important;border-color:#353535!important;background:#000}.mec-admin-dark-mode #mec_add_fee_button:hover,.mec-admin-dark-mode #mec_add_ticket_variation_button:hover,.mec-admin-dark-mode #mec_bfixed_form_field_types button:hover,.mec-admin-dark-mode #mec_bfixed_form_fields button:hover,.mec-admin-dark-mode #mec_event_form_field_types button:hover,.mec-admin-dark-mode #mec_event_form_fields button:hover,.mec-admin-dark-mode #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button:hover,.mec-admin-dark-mode #mec_reg_form_field_types button:hover,.mec-admin-dark-mode #mec_reg_form_fields button:hover,.mec-admin-dark-mode #taxes_option #mec_fees_list .mec-form-row .button:hover,.mec-admin-dark-mode #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button:hover,.mec-admin-dark-mode .mec-export-settings:hover,.mec-admin-dark-mode .mec-import-settings:hover,.mec-admin-dark-mode .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result):hover,.mec-admin-dark-mode .mec-occurrences-wrapper .button:not(.wp-color-result):hover,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button-secondary:hover,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button.hover,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .button:hover,.mec-admin-dark-mode.post-type-mec-events .button-secondary:hover,.mec-admin-dark-mode.post-type-mec-events .button.hover,.mec-admin-dark-mode.post-type-mec-events .button:hover,.mec-admin-dark-mode.post-type-mec_calendars .button-secondary:hover,.mec-admin-dark-mode.post-type-mec_calendars .button.hover,.mec-admin-dark-mode.post-type-mec_calendars .button:hover{background:#111;border-color:#333!important;color:#fff}.mec-admin-dark-mode.post-type-mec-events .mec-form-row .button:not(.wp-color-result){height:37px;margin-top:1px;box-shadow:inset 0 2px 4px #282828,inset 0 -2px 4px rgba(0,0,0,.05),0 2px 2px rgba(0,0,0,.06)}.mec-admin-dark-mode.m-e-calendar_page_MEC-settings .wp-color-result-text,.mec-admin-dark-mode.post-type-mec-events .wp-color-result-text{border-left:1px solid #353535;color:#d2d2d2;background:#000}.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec-search-settings{color:#d2d2d2;background:#282828}.mec-admin-dark-mode.taxonomy-mec_category .button,.mec-admin-dark-mode.taxonomy-mec_label .button,.mec-admin-dark-mode.taxonomy-mec_location .button,.mec-admin-dark-mode.taxonomy-mec_organizer .button,.mec-admin-dark-mode.taxonomy-mec_speaker .button,.mec-admin-dark-mode.taxonomy-mec_sponsor .button,.mec-admin-dark-mode.taxonomy-mec_tag .button{box-shadow:0 3px 10px -4px #000!important}.mec-admin-dark-mode.post-type-mec_calendars .mec-switcher input+label:after,.mec-admin-dark-mode.post-type-mec_calendars .wn-mec-select .option .wn-hover-img-sh img{background:#282828}.mec-admin-dark-mode .attachment-info,.mec-admin-dark-mode .media-frame-toolbar .media-toolbar{border-color:#282828}.mec-admin-dark-mode #webnus-dashboard .welcome-head img,.mec-admin-dark-mode .mce-content-body{background-color:#000!important}.mec-admin-dark-mode .w-box.upcoming-events .mec-event-article{border-bottom:1px solid #444}.mec-admin-dark-mode #webnus-dashboard a,.mec-admin-dark-mode #webnus-dashboard pre,.mec-admin-dark-mode .extra .w-box-head,.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a,.mec-admin-dark-mode .mec-form-row label,.mec-admin-dark-mode .mec-form-row span,.mec-admin-dark-mode .mec-meta-box-fields h4,.mec-admin-dark-mode .mec-meta-box-fields label,.mec-admin-dark-mode .mec-meta-box-fields p,.mec-admin-dark-mode .mec-meta-box-fields span,.mec-admin-dark-mode .mec-meta-box-fields strong,.mec-admin-dark-mode .mec-new-addons .mec-addons-notification-title,.mec-admin-dark-mode .mec-new-addons p,.mec-admin-dark-mode .mec-new-addons strong,.mec-admin-dark-mode .w-box-content p,.mec-admin-dark-mode .w-box.doc,.mec-admin-dark-mode .w-box.total-bookings ul li,.mec-admin-dark-mode .w-box.total-bookings ul li a,.mec-admin-dark-mode .wns-be-sidebar .mec-settings-menu .mec-settings-submenu a,.mec-admin-dark-mode.m-e-calendar_page_MEC-settings #mec_reg_form_field_types button{color:#d2d2d2!important}.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a{box-shadow:0 0 0 3px rgb(255 255 255 / 24%)!important}.mec-admin-dark-mode #webnus-dashboard .mec-event-detail{color:#444}.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag{border-color:#2d2d2d}.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag{color:#282828!important}.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:hover{color:#fff!important}.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:nth-child(2):hover,.mec-admin-dark-mode #webnus-dashboard .mec-intro-section .mec-intro-section-link-tag:nth-child(3):hover{color:#999!important}.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a,.mec-admin-dark-mode .w-box.total-bookings ul li{background:#333;box-shadow:0 2px 3px -2px #000}.mec-admin-dark-mode .mec-addons-notification-box-content.mec-new-addons a:hover,.mec-admin-dark-mode .w-box.total-bookings ul li:hover{background:#000}.mec-admin-dark-mode #webnus-dashboard .total-bookings input[type=text],.mec-admin-dark-mode #webnus-dashboard .total-bookings select{background:#000;color:#999;border-color:#111}.mec-admin-dark-mode #mec_category-add-toggle,.mec-admin-dark-mode #sample-permalink a,.mec-admin-dark-mode #set-post-thumbnail,.mec-admin-dark-mode .button-link,.mec-admin-dark-mode .category-tabs a,.mec-admin-dark-mode .mec-add-booking-tabs-left a,.mec-admin-dark-mode .mec-add-event-tabs-left a,.mec-admin-dark-mode .mec-create-shortcode-tabs-left a,.mec-admin-dark-mode.post-type-mec-events .wp-list-table .row-title,.mec-admin-dark-mode.post-type-mec_calendars .wp-list-table .row-title{color:#888!important}.mec-admin-dark-mode .mec-add-booking-tabs-left a.mec-tab-active,.mec-admin-dark-mode .mec-add-event-tabs-left a.mec-tab-active,.mec-admin-dark-mode .mec-create-shortcode-tabs-left a.mec-tab-active{color:#00b0dd}.mec-admin-dark-mode #TB_title,.mec-admin-dark-mode #TB_window{background:#000}.mec-admin-dark-mode #webnus-dashboard .welcome-head img,.mec-admin-dark-mode .webnus-icons-list li:hover{background:#111}.mec-admin-dark-mode #TB_window i{color:#999}.mec-admin-dark-mode #TB_title,.mec-admin-dark-mode .webnus-icons-list li label{border:unset!important}.mec-admin-dark-mode.post-type-mec-books .notice-success,.mec-admin-dark-mode.post-type-mec-books div.updated,.mec-admin-dark-mode.post-type-mec-events .notice-success,.mec-admin-dark-mode.post-type-mec-events div.updated,.mec-admin-dark-mode.post-type-mec_calendars .notice-success,.mec-admin-dark-mode.post-type-mec_calendars div.updated{background:#111;border-top:unset;border-bottom:unset}.mec-admin-dark-mode.post-type-mec-books input,.mec-admin-dark-mode.post-type-mec-events input,.mec-admin-dark-mode.post-type-mec_calendars input{background:#000;color:#888}.mec-admin-dark-mode.post-type-mec-books .subsubsub a,.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item,.mec-admin-dark-mode.post-type-mec-events .subsubsub a,.mec-admin-dark-mode.post-type-mec_calendars .subsubsub a{color:#2271b1}.mec-admin-dark-mode.post-type-mec-books .subsubsub a:hover,.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item:hover,.mec-admin-dark-mode.post-type-mec-events .subsubsub a:hover,.mec-admin-dark-mode.post-type-mec_calendars .subsubsub a:hover{color:#135e96}.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a,.mec-admin-dark-mode.post-type-mec-events #set-post-thumbnail,.mec-admin-dark-mode.post-type-mec-events .attachment-info .filename{color:#888}.mec-admin-dark-mode #mec_calendar_filter .mec-create-shortcode-tabs-left a:hover,.mec-admin-dark-mode #mec_metabox_booking .mec-add-booking-tabs-left a:hover,.mec-admin-dark-mode #mec_metabox_details .mec-add-event-tabs-left a:hover,.mec-admin-dark-mode.post-type-mec-events #set-post-thumbnail:hover{color:#a9a9a9}.mec-admin-dark-mode #webnus-dashboard .welcome-head img,.mec-admin-dark-mode .w-theme-version,.mec-admin-dark-mode.post-type-mec_calendars .mec-switcher input+label:after{border-color:#444}.mec-admin-dark-mode.post-type-mec-books .postbox-header,.mec-admin-dark-mode.post-type-mec-events .postbox-header,.mec-admin-dark-mode.post-type-mec_calendars .postbox-header{border-color:#000}.mec-admin-dark-mode.post-type-mec-events .inside div div>a.mec-tab-active:after,.mec-admin-dark-mode.post-type-mec-events .inside div div>a.mec-tab-active:before,.mec-admin-dark-mode.post-type-mec_calendars .inside div div>a.mec-tab-active:after,.mec-admin-dark-mode.post-type-mec_calendars .inside div div>a.mec-tab-active:before{border-right-color:#2d2d2d}.mec-admin-dark-mode .mec-form-row input[type=radio]{box-shadow:0 1px 10px -2px #000}.mec-admin-dark-mode.post-type-mec-books .form-wrap label,.mec-admin-dark-mode.post-type-mec-books .media-frame-title h1,.mec-admin-dark-mode.post-type-mec-books h2,.mec-admin-dark-mode.post-type-mec-events .form-wrap label,.mec-admin-dark-mode.post-type-mec-events .media-frame-title h1,.mec-admin-dark-mode.post-type-mec-events h2{color:#d2d2d2}.mec-admin-dark-mode.post-type-mec-books.taxonomy-mec_coupon .button,.mec-admin-dark-mode.post-type-mec-events.taxonomy-post_tag .button{box-shadow:0 3px 10px -4px #000}.mec-admin-dark-mode.post-type-mec-events .attachments-browser .media-toolbar,.mec-admin-dark-mode.post-type-mec-events .media-frame-content,.mec-admin-dark-mode.post-type-mec-events .media-modal-content{background:#2d2d2d;color:#888}.mec-admin-dark-mode.post-type-mec-events .media-router .active,.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item.active:last-child,.mec-admin-dark-mode.post-type-mec-events .media-sidebar,.mec-admin-dark-mode.post-type-mec-events .quicktags-toolbar{background:#222}.mec-admin-dark-mode.post-type-mec-events .attachments-browser .media-toolbar,.mec-admin-dark-mode.post-type-mec-events .media-frame-content,.mec-admin-dark-mode.post-type-mec-events .media-modal-content,.mec-admin-dark-mode.post-type-mec-events .media-router .active,.mec-admin-dark-mode.post-type-mec-events .media-router .media-menu-item.active:last-child,.mec-admin-dark-mode.post-type-mec-events .media-sidebar,.mec-admin-dark-mode.post-type-mec-events .quicktags-toolbar{border-color:#000}.mec-admin-dark-mode.post-type-mec-events .wp-core-ui .attachment-preview{background:#000}.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-footer,.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-head,.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .w-col-sm-3 .w-box.addon{border-color:#444}.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-footer{background:#444}.mec-admin-dark-mode.m-e-calendar_page_MEC-addons .mec-addon-box-title span{color:#d2d2d2}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard{background:#282828!important}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap{background:#1f1f1f}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap .mec-wizard-starter-video a,.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button{background:#000;border-color:#353535;transition:all .2s ease}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap .mec-wizard-starter-video a:hover,.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover{border-color:#515151}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-back-box .mec-wizard-back-button{background:0 0;box-shadow:unset}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap svg path{fill:#7b7b7b;stroke:#7b7b7b;transition:all .2s ease}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a p,.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button span{color:#7b7b7b;transition:all .2s ease}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a:hover p,.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover span{color:#fff}.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap a:hover svg path,.mec-admin-dark-mode.m-e-calendar_page_MEC-wizard .mec-wizard-wrap button:hover svg path{fill:#fff;stroke:#fff}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip,.post-type-mec-books .attendees .mec-booking-attendees-tooltip{position:relative}.mec-attendees-wrapper .mec-attendees-list strong,.post-type-mec-books .attendees strong{line-height:26px;padding-left:26px}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:before,.post-type-mec-books .attendees .mec-booking-attendees-tooltip:before{position:absolute;content:"\e001";font-family:simple-line-icons;margin:12px 0;top:-30px;left:0;font-size:18px;line-height:12px;color:#40d9f1;padding:0 60px 5px 0}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul,.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul{position:absolute;min-width:300px;max-width:600px;display:inline-block;left:60px;top:50%;transform:translateY(-50%);background-color:#535a61;color:#fff;font-weight:300;font-size:14px;letter-spacing:.5px;line-height:1.3;z-index:9999999;box-sizing:border-box;box-shadow:0 4px 45px -8px #444b50;visibility:hidden;opacity:0;transition:opacity .23s;padding:23px 20px 20px 20px;border-radius:8px;margin-top:-13px}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul:before,.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul:before{display:block;content:""!important;position:absolute!important;width:12px;height:12px;left:-10px!important;top:50%!important;transform:translate(50%,-50%) rotate(-45deg)!important;background-color:#535a61!important;box-shadow:0 8px 9px -4px #535a61!important;z-index:0!important}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:hover ul,.post-type-mec-books .attendees .mec-booking-attendees-tooltip:hover ul{visibility:visible;opacity:1}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul a,.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul a{color:#40d9f1;margin-bottom:14px;margin-left:0;font-weight:400;font-size:14px;letter-spacing:.5px;position:relative;text-decoration:none;display:block;width:max-content}.mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul li:last-child a,.post-type-mec-books .attendees .mec-booking-attendees-tooltip ul li:last-child a{margin-bottom:0}.mec-metabox-head-version img,.mec-metabox-head-version p{float:left}.mec-metabox-head-version a{float:right}.mec-metabox-head-version p{margin-top:3px;margin-left:5px;margin-bottom:34px}h3.mec-metabox-feed-head{border-top:1px solid #ccc}div#mec_widget_news_features .inside{padding:0}.mec-metabox-head-wrap{padding:0 12px}#dashboard-widgets h3.mec-metabox-feed-head{padding:8px 12px;border-top:1px solid #eee;border-bottom:1px solid #eee;font-weight:700}.mec-metabox-feed-content{padding:0 12px}.mec-metabox-feed-content ul li a{font-weight:600;display:block}.mec-metabox-feed-content ul li p{margin:3px 0 24px}.mec-metabox-footer a span{font-size:17px;vertical-align:middle;margin-left:2px}.mec-metabox-footer a{text-decoration:none;border-right:1px solid #eee;padding-right:10px;margin-right:12px}.mec-metabox-footer{padding:11px 12px 10px;border-top:1px solid #eee}.mec-metabox-footer a:last-of-type{border:none}.mec-metabox-upcoming-wrap h3{border-top:none!important;padding-top:13px!important}.mec-metabox-head-wrap{box-shadow:0 5px 8px rgba(0,0,0,.05)}.mec-metabox-upcoming-wrap ul li span{float:left}.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event{float:left;margin-left:10px}.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event-date{float:right}.mec-metabox-upcoming-wrap ul{padding:0 12px;background:#f7f7f7;margin:0}.mec-metabox-upcoming-wrap ul li{border-bottom:1px solid #eee;padding:14px 0;margin-bottom:0}.mec-metabox-upcoming-wrap ul li:last-of-type{border:none}.mec-metabox-upcoming-wrap h3{margin-bottom:0!important}.mec-metabox-upcoming-wrap ul li .mec-metabox-upcoming-event a{font-weight:600}.mec-metabox-head-version a span{vertical-align:middle}.mec-metabox-head-version a{padding-left:6px!important}#mec_widget_total_bookings .w-box.total-bookings ul li:first-child{margin-left:1px}#mec_widget_total_bookings .w-box.total-bookings ul li{margin-right:4px}#mec_widget_total_bookings .w-box.total-bookings ul li:last-child{margin-right:0}#mec_widget_total_bookings .w-box.total-bookings ul li a{color:#000}#mec_widget_total_bookings .w-box.total-bookings ul li:hover a{color:#fff}#mec_widget_total_bookings{overflow:hidden}#mec_widget_total_bookings .inside,#mec_widget_total_bookings .w-box{margin:0;padding-bottom:0}#mec_widget_total_bookings .w-col-sm-12{padding:0}#mec_widget_total_bookings .w-box-content button{color:#fff!important;font-weight:500!important;border-radius:2px!important;box-shadow:0 3px 10px -4px #008aff!important;text-shadow:none!important;background:#008aff!important;background:linear-gradient(95deg,#36a2ff 0,#008aff 50%,#0072ff 100%)!important;border:none!important;transition:.24s!important;line-height:39px;padding:0 36px;width:calc(33% - 7px);margin-bottom:14px}#mec_widget_total_bookings .w-box-content input[type=text],#mec_widget_total_bookings .w-box-content select{border:solid 1px #ddd;border-radius:2px;height:40px;line-height:38px;padding-left:10px;box-shadow:0 3px 10px -2px rgba(0,0,0,.05),inset 0 1px 2px rgba(0,0,0,.02)}#mec_widget_total_bookings .w-box-content input[type=text]{width:calc(50% - 5px)}#mec_widget_total_bookings .w-box-content select{width:calc(33% - 2px);margin-bottom:24px;margin-top:20px}div#mec-schema .mec-form-row label{display:inline-block;width:141px}.event-status-schema{background:rgb(247 248 249 / 10%);padding:20px 40px;margin:10px 0 35px;border-radius:4px;border:1px solid #e6e6e6}@media (min-width:1281px){.event-status-schema{max-width:70%}}.event-status-schema p{margin-bottom:35px}div#mec_cancelled_reason_wrapper label{width:100%!important}.mec-fluent-hidden{display:none}#webnus-dashboard .total-bookings input[type=text]{height:38px;line-height:38px;padding-left:10px;border-radius:5px;border:none;background-color:#f7f8f9;box-shadow:inset 0 1px 2px rgb(0 0 0 / 7%)}#webnus-dashboard .total-bookings select{appearance:none;-webkit-appearance:none;-moz-appearance:none;cursor:pointer;min-height:34px;line-height:34px;background-color:#f7f8f9;border-radius:2px;padding-left:8px;box-shadow:0 1px 3px rgb(0 0 0 / 2%);transition:all .23s ease;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0ZWQgYnkgSWNvTW9vbi5pbyAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgdmlld0JveD0iMCAwIDE3IDE3Ij4KPGc+CjwvZz4KCTxwYXRoIGQ9Ik0xNi4zNTQgNS4wNzVsLTcuODU1IDcuODU0LTcuODUzLTcuODU0IDAuNzA3LTAuNzA3IDcuMTQ1IDcuMTQ2IDcuMTQ4LTcuMTQ3IDAuNzA4IDAuNzA4eiIgZmlsbD0iIzAwMDAwMCIgLz4KPC9zdmc+Cg==);background-repeat:no-repeat;background-size:26px 10px;background-position:right center;min-width:160px;border:1px solid #e6e9eb}#webnus-dashboard select{margin-top:-5px}#mec_styles_CSS{line-height:1.6}.mec-search-forms-options-container label.mec-col-12{margin-bottom:10px}@media (max-width:480px){.toplevel_page_mec-intro .mec-intro-section-ifarme iframe{width:auto!important;height:auto!important}.w-box.mec-activation input[name=MECPurchaseCode]{min-width:200px!important;width:330px}.w-box.mec-activation{background:#fff}.mec-addons{padding-right:15px}.mec-report-wrap{margin-top:20px}.mec-report-select-event-wrap .select2-container--default,.mec-report-select-event-wrap select.mec-reports-selectbox-dates{max-width:100%;width:100%;margin:10px 0}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-content,.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head{padding:10px}.mec-report-selected-event-attendees-wrap .w-clearfix.mec-attendees-head span{font-size:13px}.mec-report-selected-event-attendees-wrap .mec-attendees-content .w-col-xs-3{word-wrap:break-word}.mec-report-selected-event-attendees-wrap .w-col-xs-3.name img{display:block}.mec-report-selected-event-attendees-wrap input[type=checkbox],.mec-report-selected-event-attendees-wrap input[type=radio]{height:.85rem;width:.85rem}.wns-be-container .dpr-btn.dpr-save-btn{margin:0!important}#mec_booking_form .mec-container{padding-left:0;padding-right:0}#mec_event_form_fields,#mec_reg_form_fields{padding:10px}.mec-search-forms-options-container .mec-form-row select{width:100%}#mec_skin_monthly_view_start_date_container{display:unset}#mec_calendar_display_options input[type=number],#mec_calendar_display_options input[type=text],#mec_calendar_display_options select{max-width:100%!important;width:100%;margin:10px 0}#mec_select_tags.mec-create-shortcode-tab-content input[type=text]{width:auto}#mec_tickets .mec-box{padding:20px 7px}.fserv-container form,.fserv-form-description{padding:10px 15px!important}.fserv-field{display:inline-block;width:25%!important;padding:0!important;margin:0!important;margin-right:10px!important}#webnus-dashboard .total-bookings button{margin:15px 0}}.mec-skin-styles.mec-styles-custom{padding-left:0!important;top:40%;position:absolute;width:330px;height:auto!important;overflow:visible!important}.mec-skin-styles.mec-styles-custom .nice-select{box-shadow:0 3px 13px -5px rgba(0,0,0,.1),inset 0 1px 2px rgba(0,0,0,.07);clear:unset!important;-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:5px;border:solid 1px #e8e8e8;box-sizing:border-box;clear:both;cursor:pointer;display:block;float:left;font-family:inherit;font-size:14px;font-weight:400;height:42px;line-height:40px;outline:0;padding-left:18px;padding-right:30px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;width:300px!important}.mec-styles-custom h3{font-size:13px;font-weight:400;color:#707070}.post-type-mec_calendars .mec-form-row .select2-selection{height:auto}.mec-form-row .mec-col-12 ul li span{display:inline-block;background:#f7f8f9;padding:8px 15px;margin-right:5px;border-radius:3px;border:1px dashed #d7d8d9;font-family:monospace;letter-spacing:.4px}.post-type-mec-events .ui-datepicker.ui-widget .ui-state-disabled .ui-state-default{color:#ccc;width:30px;height:30px;line-height:30px;display:inline-block}.post-type-mec-events .ui-datepicker.ui-widget .ui-button,.post-type-mec-events .ui-datepicker.ui-widget .ui-button.ui-state-disabled:active,.post-type-mec-events .ui-datepicker.ui-widget .ui-button.ui-state-disabled:hover,.post-type-mec-events .ui-datepicker.ui-widget .ui-state-default,.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-content .ui-state-default,.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-header .ui-state-default,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button.ui-state-disabled:active,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-button.ui-state-disabled:hover,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-state-default,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-content .ui-state-default,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-header .ui-state-default{border:0;background-color:#fff;font-weight:400;color:#212121;text-align:center}.post-type-mec-events .ui-datepicker.ui-widget td a.ui-state-active,.post-type-mec-events .ui-datepicker.ui-widget td a:hover,.post-type-mec_calendars .ui-datepicker.ui-widget td a.ui-state-active,.post-type-mec_calendars .ui-datepicker.ui-widget td a:hover{background:#40d9f1;color:#fff}.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-header,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-header{border:0;background:unset;background-color:#fff}.post-type-mec-events .ui-datepicker.ui-widget .ui-icon,.post-type-mec-events .ui-datepicker.ui-widget .ui-widget-content .ui-icon,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-icon,.post-type-mec_calendars .ui-datepicker.ui-widget .ui-widget-content .ui-icon{background-image:unset}.post-type-mec-events .ui-datepicker.ui-widget select,.post-type-mec_calendars .ui-datepicker.ui-widget select{font-weight:600;font-size:12px;border-radius:2px;padding:2px 10px;margin:1px 3px 5px}.mec-update-warning+p{display:none}#mec_sf_timetable_address_search_placeholder,#mec_sf_timetable_txt_search_placeholder{margin-top:4px}body.rtl .wns-be-sidebar{width:260px;float:right;position:relative}body.rtl .wns-be-main{margin-left:0;border-left:0;margin-right:260px;border-right:1px solid #dedede}body.rtl .w-box.mec-activation .LicenseField{direction:rtl}body.rtl .w-box.mec-activation input[name=MECPurchaseCode]{text-align:right;padding-right:20px}body.rtl #MECActivation .MECPurchaseStatus,body.rtl .addon-activation-form .MECPurchaseStatus{right:auto;left:-51px}body.rtl #webnus-dashboard .w-box.mec-activation input[type=submit]{right:auto;left:5px}body.rtl .wns-be-sidebar .wns-be-group-menu li a{padding:13px 20px 13px 4px}body.rtl .wns-be-sidebar .wns-be-group-tab-link-a span.wns-be-group-menu-title{padding-left:0;padding-right:24px}body.rtl .wns-be-sidebar .has-sub span.extra-icon{float:left}body.rtl .wns-be-sidebar .wns-be-group-tab-link-a span.extra-icon i{right:auto;left:10px}body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:after,body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:transparent;border-left-color:#fff;right:auto;left:-1px;top:10px}body.rtl .wns-be-sidebar .wns-be-group-menu li .subsection li.active a:before{border-right-color:transparent;border-left-color:#c5c5c5;right:auto;left:0}body.rtl .mec-col-1,body.rtl .mec-col-10,body.rtl .mec-col-11,body.rtl .mec-col-12,body.rtl .mec-col-2,body.rtl .mec-col-3,body.rtl .mec-col-4,body.rtl .mec-col-5,body.rtl .mec-col-6,body.rtl .mec-col-7,body.rtl .mec-col-8,body.rtl .mec-col-9{float:right;margin:0}body.rtl .wns-be-sidebar li .submneu-hover{right:auto;left:-222px}body.rtl .wns-be-sidebar li .submneu-hover:after{position:absolute;z-index:999;content:" ";height:0;width:0;border:7px solid transparent;border-right-color:#fff;left:auto;right:-1px;top:14px}body.rtl #mec_styles_form #mec_styles_CSS{direction:ltr}body.rtl .w-box.mec-activation{-moz-transform:scaleY(-1);-o-transform:scaleY(-1);-webkit-transform:scaleY(-1);transform:scaleX(-1)}body.rtl .w-box.mec-activation .w-box-content,body.rtl .w-box.mec-activation .w-box-head{-moz-transform:scaleY(-1);-o-transform:scaleY(-1);-webkit-transform:scaleY(-1);transform:scaleX(-1);display:block}body.rtl .w-box.mec-activation .w-box-head{width:100%}body.rtl .wns-be-container #wns-be-infobar:before{left:auto;right:0}body.rtl .wns-be-container .dpr-btn.dpr-save-btn{float:left}body.rtl .wns-be-container .wns-be-group-tab h2:before,body.rtl .wns-be-container .wns-be-group-tab h4:before{left:auto;right:0;margin-right:0;margin-left:5px}body.rtl #mec_gateways_form .mec-tooltip{float:left}body.rtl .fserv-container .fserv-form-name{text-align:right!important}body.rtl #webnus-dashboard .mec-activation .w-box-head{max-width:calc(100% - 250px);margin-right:250px;text-align:right}body.rtl #webnus-dashboard .w-box.mec-activation .LicenseType label{padding-left:20px;padding-right:0;font-weight:500}body.rtl #webnus-dashboard .w-box.mec-activation input[type=radio]+label span{margin-right:0;margin-left:6px}body.rtl #webnus-dashboard .upcoming-events .w-box-content .mec-event-article{display:block}body.rtl #webnus-dashboard .upcoming-events .w-box-content .mec-event-article .col-md-9.col-sm-9{float:unset}body.rtl #webnus-dashboard .total-bookings input[type=text],body.rtl #webnus-dashboard .total-bookings select{min-width:125px;margin:0}body.rtl.post-type-mec-events .mec-form-row input[type=number],body.rtl.post-type-mec-events .mec-form-row input[type=text],body.rtl.post-type-mec-events .mec-form-row input[type=url],body.rtl.post-type-mec-events .mec-form-row select,body.rtl.post-type-mec-events .mec-form-row textarea,body.rtl.post-type-mec_calendars .mec-form-row input[type=number],body.rtl.post-type-mec_calendars .mec-form-row input[type=text],body.rtl.post-type-mec_calendars .mec-form-row input[type=url],body.rtl.post-type-mec_calendars .mec-form-row select,body.rtl.post-type-mec_calendars .mec-form-row textarea{margin:0 0 0 1%}body.rtl .mec-form-row .mec-col-8 label,body.rtl .mec-form-row .mec-col-9 label{padding-left:10px}body.rtl .mec-form-row label{text-align:right}body.rtl .mec-form-row .mec-col-3{margin:0;padding-left:10px;padding-right:0}body.rtl .mec-calendar-metabox .mec-form-row input[type=checkbox],body.rtl .mec-meta-box-fields .mec-form-row input[type=checkbox]{margin-left:6px;margin-right:0}body.rtl .mec-form-row input[type=radio]{margin:0 0 0 6px}body.rtl .mec-form-row .description{border-left:0;border-right:1px dashed #ccc;padding-left:0;padding-right:12px}body.rtl #mec_add_fee_button,body.rtl #mec_add_ticket_variation_button,body.rtl #mec_meta_box_downloadable_file_options #mec_downloadable_file_remove_image_button,body.rtl #taxes_option #mec_fees_list .mec-form-row .button,body.rtl #ticket_variations_option #mec_ticket_variations_list .mec-form-row .button,body.rtl .mec-export-settings,body.rtl .mec-import-settings,body.rtl .mec-meta-box-fields .mec-form-row .button:not(.wp-color-result),body.rtl .mec-occurrences-wrapper .button:not(.wp-color-result){margin-right:0;margin-left:5px}body.rtl .mec-add-booking-tabs-right,body.rtl .mec-add-event-tabs-right,body.rtl .mec-create-shortcode-tabs-right{border-left:0;border-right:1px solid #e2e2e2}body.rtl .mec-add-booking-tabs-left a,body.rtl .mec-add-event-tabs-left a,body.rtl .mec-create-shortcode-tabs-left a{padding:13px 20px 13px 4px}body.rtl .mec-add-booking-tabs-left a.mec-tab-active,body.rtl .mec-add-event-tabs-left a.mec-tab-active,body.rtl .mec-create-shortcode-tabs-left a.mec-tab-active{padding-left:0;padding-right:22px}body.rtl .mec-calendar-metabox .wn-mec-select,body.rtl .mec-form-row select,body.rtl .post-type-mec-events .mec-form-row select,body.rtl .post-type-mec_calendars .mec-form-row select,body.rtl .wns-be-main .mec-form-row select{background-position:left center!important}body.rtl .mec-calendar-metabox .wn-mec-select,body.rtl .mec-form-row select,body.rtl .post-type-mec-events .mec-form-row select,body.rtl .post-type-mec_calendars .mec-form-row select,body.rtl .wns-be-main .mec-form-row select{text-align:right!important}body.rtl #mec_calendar_display_options .mec-col-4 input{margin-left:0!important;margin-right:20px!important}body.rtl .meta-box-sortables .mec-switcher input:checked+label:after{right:auto;left:2px;margin-left:0}body.rtl .mec-sed-methods li{margin:0 0 5px 5px}body.rtl .wn-mec-select:after{left:10px;right:auto}body.rtl .inside div div>a.mec-tab-active:after,body.rtl .inside div div>a.mec-tab-active:before{border-right:0;border-left-color:#fff}body.rtl .inside div div>a.mec-tab-active:after{right:auto;left:-1px}body.rtl .inside div div>a.mec-tab-active:before{border-right:0;border-left-color:#d7d8d9;right:auto;left:0}body.rtl #mec_tickets .button.remove{right:auto;left:20px;line-height:1.8}body.rtl .mec-calendar-metabox .wn-mec-select,body.rtl .mec-form-row input[type=date],body.rtl .mec-form-row input[type=email],body.rtl .mec-form-row input[type=number],body.rtl .mec-form-row input[type=tel],body.rtl .mec-form-row input[type=text],body.rtl .mec-form-row input[type=url],body.rtl .mec-form-row select,body.rtl .mec-form-row textarea,body.rtl .mec-form-row.mec-skin-list-date-format-container input[type=text],body.rtl .mec-occurrences-wrapper input[type=date],body.rtl .mec-occurrences-wrapper input[type=email],body.rtl .mec-occurrences-wrapper input[type=number],body.rtl .mec-occurrences-wrapper input[type=tel],body.rtl .mec-occurrences-wrapper input[type=text],body.rtl .mec-occurrences-wrapper input[type=url],body.rtl .mec-occurrences-wrapper select,body.rtl .mec-occurrences-wrapper textarea{padding:0 10px}body.rtl #mec-occurrences .mec-occurrences-list li,body.rtl #mec_bfixed_form_fields li,body.rtl #mec_event_form_fields li,body.rtl #mec_reg_form_fields li{border-radius:11px 3px 3px 3px}body.rtl #mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button,body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_remove,body.rtl #mec_event_form_fields span.mec_event_field_remove,body.rtl #mec_reg_form_fields span.mec_reg_field_remove{position:absolute;right:auto;left:47px;top:0;background:#fff}body.rtl #mec-occurrences .mec-occurrences-list .mec-occurrences-delete-button:before,body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before,body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_remove:before,body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_sort:before,body.rtl #mec_event_form_fields span.mec_event_field_option_sort:before,body.rtl #mec_event_form_fields span.mec_event_field_remove:before,body.rtl #mec_event_form_fields span.mec_event_field_sort:before,body.rtl #mec_reg_form_fields span.mec_reg_field_option_sort:before,body.rtl #mec_reg_form_fields span.mec_reg_field_remove:before,body.rtl #mec_reg_form_fields span.mec_reg_field_sort:before{left:auto;right:20px;top:7px}body.rtl #mec_bfixed_form_fields span.mec_bfixed_field_type,body.rtl #mec_bfixed_form_fields span.mec_event_field_type,body.rtl #mec_event_form_fields span.mec_event_field_type,body.rtl #mec_reg_form_fields span.mec_reg_field_type{padding-left:0;padding-right:25px}body.rtl .wns-be-main .mec-form-row .mec-col-3{padding:0}body.rtl .wns-be-main .mec-form-row .mec-col-9{float:left}body.rtl .mec-form-row .mec-col-9 .mec-box .mec-tooltip{left:15px;right:auto}body.rtl .mec-tooltip .box{left:auto!important;right:30px!important}body.rtl .mec-tooltip .box:before{left:auto!important;right:0!important}body.rtl .mec-tooltip .box.left{left:30px!important;right:auto!important}body.rtl .mec-tooltip .box.left:before{left:-12px!important;right:auto!important}body.rtl .mec-form-row .cancellation-period-box input[type=number]:first-child{margin-left:calc(2% + 4px);margin-right:0}body.rtl .support-page .w-box-content ul li i{margin:0 0 0 10px;float:right}body.rtl .support-page .w-box-content ul li .mec-sl-arrow-right-circle:before{content:"\e07a"}body.rtl #webnus-dashboard .w-box.support-page.videobox .w-button a i{float:left;line-height:24px}body.rtl #webnus-dashboard .mec-faq-accordion-trigger a{padding-right:34px;font-size:15px}form .wbmec-mandatory{color:red}input.mec-error,select.mec-error,textarea.mec-error{border-color:red}.mec-copied{position:absolute;top:0;width:40%;opacity:0;z-index:-9;transition:all .33s cubic-bezier()}.mec-copied.mec-copied-done{opacity:1;left:135px;z-index:9}.m-e-calendar_page_MEC-settings .mec-addons-notification-box-image img{max-width:555px}.m-e-calendar_page_MEC-settings .mec-custom-msg-notification-wrap,.m-e-calendar_page_MEC-settings .wns-be-container .mec-addons-notification-wrap{max-width:1020px}#mec-event-gallery ul#mec_meta_box_event_gallery{display:flex;flex-flow:row wrap}#mec-event-gallery ul#mec_meta_box_event_gallery li{flex:0 1 calc(33.333333% - 10px);margin-right:10px;position:relative}#mec-event-gallery ul#mec_meta_box_event_gallery li img{width:100%!important;height:75px;object-fit:cover}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete{padding:0;min-height:20px;height:20px;width:20px;margin:0;border-radius:50%;position:absolute;top:2px;right:2px;box-shadow:none;background:#fff;border-color:#e3e4e5;font-size:0px;cursor:pointer;transition:.2s}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:before{content:"";width:20px;height:20px;display:block;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZWE2NDg1Ij48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg==");background-position:center}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover{color:#fff;border-color:#ea6485;background:#ea6485}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover:before{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZmZmZmZmIj48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg==")}.mec-show-hide-password{cursor:pointer}.mec-show-hide-password:hover{text-decoration:underline}.mec-in-days-add-mode #mec_cancel_in_days,.mec-in-days-add-mode #mec_edit_in_days,.mec-in-days-edit-mode #mec_add_in_days{display:none}.mec-in-days-add-mode #mec_add_in_days,.mec-in-days-edit-mode #mec_cancel_in_days,.mec-in-days-edit-mode #mec_edit_in_days{display:inline}ul.system-information li{display:flex}ul.system-information li .mec-si-label{width:250px;font-weight:500}div[id*=mec_event_fields] div[aria-label=Fullscreen]{display:none}.mec-backend-tab-wrap{margin-bottom:40px}.mec-backend-tab{display:inline-block;padding:4px;border:1px solid #e3e4e5;border-radius:6px;background:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}.mec-backend-tab-item{display:inline-block;padding:11px 33px;line-height:1;font-size:14px;font-weight:400;border-radius:5px;border:1px solid transparent;cursor:pointer;transition:all .2s ease}.mec-backend-tab-item:hover{color:#07bbe9}.mec-b-active-tab{background:#ecf9fd;color:#07bbe9;cursor:default;font-weight:600}#mec_export_module_options{margin:0}.mec-hourly-schedule-form-speakers-label{line-height:38px;margin-right:10px}.wp-picker-container button{margin:4px 6px}#mec_meta_box_event_banner_options #mec_banner_thumbnail_img{margin-bottom:20px}.mec-label{line-height:38px}#mec_sb_choose_single_page label.post-attributes-label,.mec-metabox-visibility label.post-attributes-label{display:block;margin-bottom:4px}#mec_sb_choose_single_page select,.mec-metabox-visibility select{width:100%}.mec-image-picker-page{display:flex;flex-wrap:wrap;gap:20px}.mec-image-picker-page .mec-image-picker-wrapper{box-sizing:border-box;max-width:332px;flex-basis:calc(100% / 2);border:1px solid #e3e5e7;border-radius:4px;padding:10px;max-height:46px;display:flex;flex-wrap:wrap;flex-direction:row;align-items:center;justify-content:space-between;position:relative;padding-right:43px}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default{display:flex;flex-wrap:wrap;flex-direction:row;align-items:center}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default .default{display:flex;margin:2px 5px 0 0}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default .default i{font-size:14px;color:#686f73}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-default label{font-size:13px;line-height:17px;font-weight:400;color:#686f73}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button{font-size:11px;font-weight:400;line-height:24px;border:1px solid;border-radius:4px;height:unset;min-height:unset;margin:0 10px 0 0;padding:0 10px 0 28px;background-repeat:no-repeat;background-position:10px center}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button.mec-image-picker-upload{color:#07bbe9;border-color:#ccecf4;background-color:#ecf9fd;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMS41NjUiIHZpZXdCb3g9IjAgMCAxNCAxMS41NjUiPg0KICA8cGF0aCBpZD0ibWVjLXVwbG9hZC1pY29uIiBkPSJNMTEsOTY0LjM2MmE0LjIxOSw0LjIxOSwwLDAsMSw0LjE2NiwzLjQyOSwzLjQ5MSwzLjQ5MSwwLDAsMS0uNjY2LDYuOTE5SDEyLjgyNmEuNDU3LjQ1NywwLDEsMSwwLS45MTNIMTQuNWEyLjU4OCwyLjU4OCwwLDAsMCwuMjM4LTUuMTY0LjQ1Ny40NTcsMCwwLDEtLjQwOS0uNCwzLjM1LDMuMzUsMCwxLDAtNi42NTMuNzg5LjQ1Ni40NTYsMCwwLDEtLjQ1Mi41MTRINy4wNDNhMi4xMywyLjEzLDAsMCwwLDAsNC4yNjFoMi4xM2EuNDU3LjQ1NywwLDEsMSwwLC45MTNINy4wNDNhMy4wMzUsMy4wMzUsMCwwLDEtLjI3Ni02LjA1OEE0LjIxNCw0LjIxNCwwLDAsMSwxMSw5NjQuMzYyWm0wLDUuMTc0YS40MDkuNDA5LDAsMCwxLC4zMDkuMTE5bDEuNjc0LDEuNTIyYS40NjEuNDYxLDAsMCwxLC4wMjkuNjQ3LjQ3OC40NzgsMCwwLDEtLjY0Ny4wMjlsLS45MDgtLjgyOHY0LjQ0NmEuNDU3LjQ1NywwLDEsMS0uOTEzLDB2LTQuNDQ2bC0uOTA4LjgyN2EuNDg4LjQ4OCwwLDAsMS0uNjQ3LS4wMjkuNDYuNDYsMCwwLDEsLjAyOS0uNjQ3bDEuNjc0LTEuNTIyYS4zODUuMzg1LDAsMCwxLC4zMDktLjExOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00IC05NjQuMzYyKSIgZmlsbD0iIzA3YmJlOSIvPg0KPC9zdmc+DQo=")}.mec-image-picker-page .mec-image-picker-wrapper .mec-icon-uploader button.mec-image-picker-remove{color:#e95271;border-color:#f3c2c9;background-color:#feebee;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5LjkyNSIgaGVpZ2h0PSIxMyIgdmlld0JveD0iMCAwIDkuOTI1IDEzIj4NCiAgPHBhdGggaWQ9InRyYXNoLWljb24iIGQ9Ik0xMC4yMDksMS44NjhhMS44LDEuOCwwLDAsMC0zLjQ4OCwwSDMuNXYuOWg5LjkyNXYtLjlIMTAuMjA5Wk04LjQ2MywxLjRhLjkxOS45MTksMCwwLDEsLjc5LjQ2Nkg3LjY4OEEuODkxLjg5MSwwLDAsMSw4LjQ2MywxLjRabTMuNjA5LDIuMjU2aC45djguNDg5QTEuMzU1LDEuMzU1LDAsMCwxLDExLjYyMSwxMy41SDUuM2ExLjM1NSwxLjM1NSwwLDAsMS0xLjM1My0xLjM1M1YzLjY1OGguOXY4LjQ4OUEuNDUyLjQ1MiwwLDAsMCw1LjMsMTIuNmg2LjMxNmEuNDUyLjQ1MiwwLDAsMCwuNDUxLS40NTFWMy42NThabS00LjUxMS45djYuMjE4aC0uOVY0LjU2Wm0yLjcwNywwdjYuMjE4aC0uOVY0LjU2WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuNSAtMC41KSIgZmlsbD0iI2U5NTI3MSIvPg0KPC9zdmc+DQo=")}.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper{background-color:#fafbfc;width:42px;height:44px;border-left:1px solid #e3e5e7;display:block;position:absolute;right:0;top:0;border-radius:0 4px 4px 0;display:flex;align-items:center;justify-content:center}.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper .mec-image-picker-preview,.mec-image-picker-page .mec-image-picker-wrapper .mec-image-picker-preview-wrapper .mec-image-picker-preview img{display:block;max-width:24px}button#mec_add_not_in_days{margin-left:20px}.mec-hourly-schedule-schedules .mec-form-row{cursor:grab}.mec-hourly-schedule-schedules .mec-form-row.ui-sortable-helper{cursor:grabbing}.taxonomy-add-new{margin:0;line-height:30px}.fserv-form-loaded .fs-webform-container .fserv-form-name{text-align:left!important}#webnus-dashboard .mec-cmsg-2-notification-box-wrap,#webnus-dashboard .mec-cmsg-notification-box-wrap{margin-top:30px!important}body[class^=page_MEC-settings] .w-clearfix.w-box.mec-cmsg-notification-box-wrap{margin-top:0}body[class*=page_MEC-settings] .mec-custom-msg-2-notification-set-box.extra,body[class*=page_MEC-settings] .mec-custom-msg-notification-set-box.extra{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Oxygen,Roboto,sans-serif;max-width:1018px;border-radius:11px;overflow:hidden;margin-right:auto;margin-left:auto;margin-top:25px;margin-bottom:27px}.mec-addons-key-features ul{margin:5px 0 15px}.mec-addons-key-features ul li{margin-bottom:1px;font-size:13px;color:#717479;padding-left:18px;position:relative}.mec-addons-notification-box-content.mec-new-addons p{font-size:14px}.mec-new-addons .mec-addons-notification-title{font-size:20px;font-weight:600;margin-bottom:12px}.mec-addons-key-features ul li:before{position:absolute;left:-1px;top:6px;color:#36da74;background:0 0;font-size:13px;font-weight:700;vertical-align:middle;font-family:simple-line-icons;border-radius:50%;padding:0;width:13px;height:13px;line-height:13px;z-index:3;background:rgba(64,241,147,.12);content:"\e080"}.mec-addons-notification-box-content.mec-new-addons a{background:#1fcae4;color:#fff!important;padding:6px 20px;margin-top:3px;margin-bottom:12px;display:inline-block;border-radius:60px;text-transform:none;font-size:13px;letter-spacing:.4px;transition:all .1s ease;font-weight:600;text-decoration:none;box-shadow:0 0 0 3px rgb(56 213 237 / 8%)!important}.mec-addons-notification-box-content.mec-new-addons a:hover{background:#1fcae4;box-shadow:0 0 0 4px rgb(56 213 237 / 15%)!important}.mec-new-addons-wrap .mec-addons-notification-box-image{width:590px;display:inline-block;vertical-align:top}body[class*=page_MEC-settings] .mec-new-addons-wrap .mec-addons-notification-box-image{width:450px}.mec-new-addons-wrap .mec-addons-notification-box-content{width:calc(100% - 590px);display:inline-block;padding-left:20px}.mec-new-addons-wrap .mec-addons-notification-box-image img{max-width:590px}body[class*=page_MEC-settings] .mec-new-addons-wrap .mec-addons-notification-box-image img{max-width:450px}body[class*=page_MEC-settings] .mec-new-addons-wrap .mec-addons-notification-box-content{width:calc(100% - 470px)}.mec-new-addons-wrap .w-box-content code{display:block;margin-bottom:6px}@media(max-width:480px){.mec-new-addons-wrap .mec-addons-notification-box-content{width:100%;padding:0}.mec-addons-notification-box-content .w-box-content{padding-top:30px;padding-bottom:30px;padding-left:0}.mec-new-addons-wrap .mec-addons-notification-box-image{width:100%!important}body[class*=page_MEC-settings] .mec-new-addons-wrap .mec-addons-notification-box-content{width:100%!important;padding:0!important}body[class*=page_MEC-settings] .mec-new-addons-wrap .mec-addons-notification-box-content .w-box-content{padding:0}}#webnus-dashboard .mec-new-addons-wrap{margin-top:30px!important}#webnus-dashboard .info-msg.w-box.mec-intro-section.version-info-message{margin-bottom:25px;min-height:auto}#webnus-dashboard .info-msg.w-box.mec-intro-section.version-info-message a.info-msg-link{line-height:40px;font-weight:600;border:none;cursor:pointer;padding:0 30px;border-radius:33px;color:#fff;letter-spacing:1px;text-transform:uppercase;font-size:12px;text-shadow:none;background:#64e385;transition:all .28s ease;box-shadow:0 5px 10px -5px #64e385}tr[data-slug=mec] a.open-plugin-details-modal{display:none}#mec_restful_container_toggle .mec-api-key-wrapper code{line-height:38px;margin-left:20px} \ No newline at end of file diff --git a/assets/css/dyncss.css b/assets/css/dyncss.css new file mode 100755 index 0000000..e69de29 diff --git a/assets/css/frontend.css b/assets/css/frontend.css new file mode 100755 index 0000000..422be6a --- /dev/null +++ b/assets/css/frontend.css @@ -0,0 +1,27342 @@ +/*---------------------------------- + Plug-in Name: Modern Events Calendar + Author: WEBNUS + Author URI: https://webnus.net/ + Description: Modern Events Calendar + License: GNU General Public License +/*-----------------------------------------------------------------------------------*/ + +/* #CSS Base & Typography + ================================================== */ +/* .mec-wrap, +.mec-wrap div:not([class^="elementor-"]), +.lity-container { + font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} */ + +.mec-wrap { + position: relative; +} + +.mec-wrap h1, +.mec-wrap h2, +.mec-wrap h3, +.mec-wrap h4, +.mec-wrap h5, +.mec-wrap h6, +.entry-content .mec-wrap h1, +.entry-content .mec-wrap h2, +.entry-content .mec-wrap h3, +.entry-content .mec-wrap h4, +.entry-content .mec-wrap h5, +.entry-content .mec-wrap h6 { + color: #171c24; + font-weight: 300; + font-style: inherit; + letter-spacing: normal; + clear: none; +} + +.mec-wrap h1 { + font-size: 50px; + line-height: 1.16; + margin-bottom: 12px; + letter-spacing: -1px; +} + +.mec-wrap h2 { + font-size: 36px; + line-height: 1.14; + margin-bottom: 10px; +} + +.mec-wrap h3 { + font-size: 28px; + line-height: 1.2; + margin-bottom: 8px; +} + +.mec-wrap h4 { + font-size: 24px; + line-height: 1.2; + margin-bottom: 10px; +} + +.mec-wrap h5 { + font-size: 18px; + line-height: 1.3; + margin-bottom: 7px; +} + +.mec-wrap h6 { + font-size: 16px; + line-height: 1.3; + margin-bottom: 4px; +} + +.mec-wrap .subheader { + color: #849098; +} + +.mec-wrap h1 strong { + font-weight: 700; +} + +.mec-wrap :not(.elementor-widget-container) > p { + margin: 0 0 20px 0; + color: #616161; + font-size: 14px; + line-height: 1.8; +} + +.mec-wrap .read-more-text p span.more-text { + display: none; +} + +.mec-wrap .mec-event-article .mec-color-hover { + box-shadow: none; + border: none; +} + +.mec-wrap abbr, +.mec-wrap acronym { + cursor: auto; + border: none; +} + +.entry-content .mec-wrap a { + box-shadow: none; +} + +.mec-single-event-description.mec-events-content ul li, +.mec-single-event-description.mec-events-content ol li { + color: #616161; + font-size: 14px; + line-height: 1.8; + font-weight: 300; +} + +/* Buttons Default */ +.mec-wrap .button, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button), +.mec-wrap input[type="submit"], +.mec-wrap input[type="reset"], +.mec-wrap input[type="button"], +.lity-content .button, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button), +.lity-content input[type="submit"], +.lity-content input[type="reset"], +.lity-content input[type="button"], +.lity-content input[type="submit"], +.mec-nextprev-next-button, +.mec-nextprev-prev-button { + position: relative; + border: 1px solid #ccecf4; + border-radius: 4px; + box-shadow: 0 1px 0 0 #fcfcfc; + color: #07bbe9; + display: inline-block; + font-size: 14px; + line-height: 18px; + text-transform: capitalize; + font-weight: 600; + text-decoration: none; + cursor: pointer; + margin-bottom: 20px; + margin-right: 10px; + padding: 10px 24px 10px; + background: #ecf9fd; + -webkit-transition: all 0.21s ease; + -moz-transition: all 0.21s ease; + transition: all 0.21s ease; +} + +.mec-wrap .button:hover, +.mec-wrap a.button:hover, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):hover, +.mec-wrap input[type="submit"]:hover, +.mec-wrap input[type="reset"]:hover, +.mec-wrap input[type="button"]:hover, +.lity-content .button:hover, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):hover, +.lity-content input[type="submit"]:hover, +.lity-content input[type="reset"]:hover, +.lity-content input[type="button"]:hover, +.lity-content input[type="submit"]:hover { + border: 1px solid #38d5ed; + box-shadow: 0 1px 0 0 #fafafa; +} + +.mec-wrap .button svg, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.et-fb-button) + svg, +.mec-wrap input[type="submit"] svg, +.mec-wrap input[type="reset"] svg, +.mec-wrap input[type="button"] svg, +.lity-content .button svg, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.et-fb-button) + svg, +.lity-content input[type="submit"] svg, +.lity-content input[type="reset"] svg, +.lity-content input[type="button"] svg, +.mec-nextprev-next-button svg, +.mec-nextprev-prev-button svg { + margin-left: 30px; +} + +.mec-wrap .button svg.back, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.et-fb-button) + svg.back { + margin-right: 30px; + margin-left: 0; +} + +/* Form Builder Button */ +.mec-booking-form-container button { + display: block; +} + +/* Distance (Vertical Spaces) */ +.vertical-space, +.vertical-space1, +.vertical-space2, +.vertical-space3, +.vertical-space4, +.vertical-space5 { + display: block; + width: 100%; + margin: 0; + clear: both; + border: 0 none; + height: 20px; +} + +.vertical-space2 { + height: 40px; +} + +.vertical-space3 { + height: 60px; +} + +.vertical-space4 { + height: 80px; +} + +.vertical-space5 { + height: 100px; +} + +* + html hr.vertical-space, +* + html hr.vertical-space1, +* + html hr .vertical-space2, +* + html hr.vertical-space3, +* + html hr.vertical-space4, +* + html hr.vertical-space5 { + height: 0; + margin: 10px 0; + background: #fff; + border: 1px solid #fff; +} + +* + html hr.vertical-space2 { + margin: 20px 0; +} + +* + html hr.vertical-space3 { + margin: 30px 0; +} + +* + html hr.vertical-space4 { + margin: 40px 0; +} + +* + html hr.vertical-space5 { + margin: 50px 0; +} + +@media only screen and (max-width: 479px) { + .vertical-space, + .vertical-space1 { + height: 8px; + } + + .vertical-space2 { + height: 14px; + } + + .vertical-space3 { + height: 28px; + } + + .vertical-space4 { + height: 40px; + } + + .vertical-space5 { + height: 60px; + } +} + +@media only screen and (max-width: 960px) { + .vertical-space, + .vertical-space1 { + height: 12px; + } + + .vertical-space2 { + height: 18px; + } + + .vertical-space3 { + height: 36px; + } + + .vertical-space4 { + height: 50px; + } + + .vertical-space5 { + height: 80px; + } +} + +.mec-wrap abbr { + cursor: auto; + border-bottom: 0; +} + +/* Rotating Keyframe */ +@-webkit-keyframes rotating { + from { + -ms-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + + to { + -ms-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes rotating { + from { + -ms-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + + to { + -ms-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +/* --------------------- + + + + /* # Modern Events Calendar (WP Plugin) Styles + ================================================== */ +.mec-wrap { + font: 14px/25px; + font-weight: 400; + color: #626262; +} + +.mec-wrap .mec-events a { + border-bottom: none; +} + +.mec-wrap .mec-container a { + box-shadow: none; +} + +.mec-event-content p { + font-weight: 300; +} + +.mec-wrap .mec-clear:before, +.mec-wrap .mec-clear:after { + content: " "; + display: table; +} + +.mec-wrap .mec-clear:after { + clear: both; +} + +.mec-events-button { + background: #fff; + padding: 12px 28px; + font-size: 15px; + font-weight: 400; + letter-spacing: 0; + border: 1px solid #e3e3e3; + border-radius: 2px; + text-shadow: none; + margin-right: 10px; + box-shadow: 0 2px 0 0 rgb(0 0 0 / 3%); + transition: 0.3s; +} + +.mec-wrap .mec-events-button:hover { + color: #fff; +} + +.mec-no-event { + display: none; +} + +/* MEC Current Day Event Toggle + -------------------------- */ +#mec-active-current { + display: block; +} + +.current-hide #mec-active-current { + display: none !important; +} + +/* MEC Events Grid Classic + -------------------------- */ +.mec-event-grid-classic .mec-event-article { + position: relative; + border: 2px solid #e3e3e3; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); + margin-bottom: 30px; + max-width: none; +} + +.mec-event-grid-classic .mec-event-content { + color: #767676; + padding: 0 20px 5px; + text-align: center; + min-height: 125px; +} + +.mec-event-grid-classic .mec-event-title { + color: #202020; + margin: 10px 0; + font-weight: bold; + font-size: 20px; + letter-spacing: 1px; + text-transform: uppercase; +} + +.mec-event-grid-classic .mec-event-title a { + color: #202020; + transition: all 0.24s ease; +} + +.mec-event-grid-classic .mec-event-date { + font-weight: 400; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1px; + color: #fff; + padding: 3px 20px; + margin: 0 -20px 20px -20px; + text-align: center; +} + +.widget_mec_mec_widget .mec-event-grid-classic .mec-event-date { + margin: 0; +} + +.mec-event-grid-classic .mec-event-content p { + font-size: 15px; + color: #8a8a8a; +} + +.mec-event-grid-classic .mec-event-content .mec-grid-event-location { + margin: 0; + font-size: 12px; + font-weight: 400; + line-height: 16px; +} + +.mec-event-grid-classic .mec-event-detail { + display: none; +} + +.mec-event-grid-classic .mec-price-details { + font-size: 12px; + font-weight: 400; +} + +.mec-event-grid-classic img { + margin-bottom: 0; + width: 100%; +} + +.mec-event-footer { + position: relative; + border-top: 1px solid #efefef; + padding: 20px; + min-height: 80px; + margin: 0; + background: #fafafa; +} + +.mec-event-sharing-wrap { + left: 15px; + position: absolute; + list-style: none; + margin: 0; + padding-left: 0; +} + +.mec-event-sharing-wrap .mec-event-sharing { + position: absolute; + padding: 8px 0 2px; + left: -6px; + bottom: 54px; + margin: 0; + margin-top: 6px; + border-radius: 5px; + min-width: 50px; + visibility: hidden; + opacity: 0; + border: 1px solid #e2e2e2; + background: #fff; + box-shadow: 0 0 9px 0 rgba(0, 0, 0, 0.06); + z-index: 99; + -webkit-transition: all 0.18s ease; + transition: all 0.18s ease; +} + +.mec-event-sharing-wrap .mec-event-sharing:after, +.mec-event-sharing-wrap .mec-event-sharing:before { + content: ""; + display: block; + position: absolute; + bottom: -10px; + left: 50%; + margin-left: -10px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px; +} + +.mec-event-sharing-wrap .mec-event-sharing:before { + bottom: -21px; + border-color: #e2e2e2 transparent transparent transparent; +} + +.mec-event-sharing-wrap .mec-event-sharing:after { + bottom: -19px; + border-color: #ffffff transparent transparent transparent; +} + +.mec-event-sharing-wrap:hover .mec-event-sharing { + opacity: 1; + visibility: visible; +} + +.mec-event-sharing-wrap li { + text-align: center; + border: 0; + display: block; + margin-right: 2px; + overflow: hidden; + margin: 0 auto 6px; + width: 38px; +} + +.mec-event-sharing-wrap li.mec-event-share { + height: 38px; +} + +.mec-event-sharing-wrap:hover > li { + cursor: pointer; + background-color: #40d9f1; +} + +.mec-event-sharing-wrap:hover li a { + color: #fff; +} + +.mec-event-sharing-wrap > li:first-of-type { + border: 1px solid #d9d9d9; +} + +.mec-event-sharing-wrap:hover li ul li a, +.mec-event-sharing-wrap li a { + border: none; + color: #767676; + display: block; +} + +.mec-event-sharing-wrap li a .mec-social-title { + padding-right: 10px; + display: none; +} + +.mec-event-sharing-wrap li i { + width: 36px; + height: 36px; + display: table-cell; + vertical-align: middle; +} + +.mec-event-sharing-wrap li svg { + height: 16px; +} + +.mec-event-sharing-wrap .mec-event-sharing li a { + display: block; +} + +.mec-event-sharing-wrap .mec-event-sharing li:hover a { + color: #40d9f1; +} + +.mec-event-sharing .mec-event-share:hover .event-sharing-icon { + background: #40d9f1; + border-width: 0 1px 0; + cursor: pointer; +} + +.mec-event-sharing .mec-event-map { + border-width: 1px 0 1px; +} + +.mec-event-footer .mec-booking-button { + box-shadow: none; + transition: all 0.21s ease; + font-size: 11px; + font-weight: 500; + letter-spacing: 1px; + text-transform: uppercase; + background: #fff; + color: #767676; + border: 1px solid #e8e8e8; + position: absolute; + top: 20px; + right: 15px; + padding: 0 16px; + line-height: 37px; + height: 38px; + border-radius: 2px; +} + +.mec-event-footer .mec-booking-button:hover { + background: #191919; + color: #fff; + border-color: #191919; +} + +@media only screen and (max-width: 960px) { + .mec-event-grid-classic { + margin-bottom: 30px; + } +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel { + padding: 36px 0 16px; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav { + margin: 5px 0; + width: 100%; + position: absolute; + top: 15px; + padding: 0; +} + +/* Events Grid Widget */ +.mec-skin-grid-container.mec-widget { + padding-top: 18px; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel { + padding: 20px 0 16px; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav { + margin: 0; + width: 100%; + position: absolute; + top: 0; + padding: 0; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav div { + position: absolute; + background: #fff; + line-height: 0; + width: 34px; + height: 26px; + padding: 6px; + text-align: center; + margin-top: -17px; + border-radius: 3px; + border: 1px solid #e2e2e2; + text-align: center; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.028); + transition: all 0.33s ease; +} + +.mec-skin-grid-container .mec-categories { + padding: 0; +} + +.mec-skin-grid-container .mec-categories li { + list-style: none; +} + +.mec-skin-grid-container .mec-categories li a { + color: #000; + text-align: left; + transition: all 0.23s ease; + -webkit-transition: all 0.23s ease; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav i { + font-size: 12px; + color: #40d9f1; + cursor: pointer; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav .owl-next { + right: 0; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav .owl-prev { + left: 0; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-event-sharing { + display: none; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-event-footer { + text-align: center; +} + +.mec-widget + .mec-event-grid-classic.mec-owl-carousel + .mec-event-footer + .mec-booking-button { + position: static; + padding: 11px 16px; +} + +.widget .mec-event-footer ul.mec-event-sharing-wrap li a.mec-event-share-icon { + padding: 0; +} + +@media screen and (min-width: 56.875em) { + .mec-widget .mec-month-container dl { + margin-bottom: 0; + } +} + +.mec-widget .mec-event-grid-classic.owl-carousel .mec-event-footer { + text-align: right; +} + +.mec-widget .mec-event-grid-classic.owl-carousel .mec-event-sharing-wrap { + left: 5px; + padding-left: 5px; +} + +.mec-widget + .mec-event-grid-classic.owl-carousel + .mec-event-sharing-wrap + .mec-event-sharing { + left: 0; +} + +.mec-widget .mec-event-sharing-wrap .mec-event-sharing { + position: absolute; + top: auto; + bottom: 52px; + margin: 0; + margin-top: 0; + border-radius: 5px; +} + +.mec-widget .mec-event-sharing-wrap .mec-event-sharing:after { + top: auto; + bottom: -17px; + border-color: #fff transparent transparent transparent; +} + +.mec-widget .mec-event-sharing-wrap .mec-event-sharing:before { + top: auto; + bottom: -18px; + border-color: #e2e2e2 transparent transparent transparent; +} + +/* Widgets View List and Grid */ +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button { + position: absolute; + background: #fff; + padding: 6px; + margin-top: -17px; + border-radius: 3px; + border: 1px solid #e2e2e2; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.028); +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button:hover { + background: #40d9f1; + border-color: #40d9f1; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button:hover i { + color: #fff; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-booking-button { + width: 40%; + float: right; + color: #202020; + height: 36px; + line-height: 14px; + font-size: 12px; + width: auto; +} + +.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-booking-button:hover { + color: #fff; +} + +.mec-widget .mec-event-list-modern .col-md-2.col-sm-2, +.mec-widget .mec-event-list-modern .col-md-6.col-sm-6 { + padding: 0; + width: 100%; + display: block; + position: unset; +} + +.mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button { + width: 80%; + height: 46px; + line-height: 22px; + padding: 11px 20px; + float: right; +} + +.mec-widget .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper { + top: auto; + bottom: 5%; +} + +@media (max-width: 480px) { + .mec-widget .mec-event-list-modern .col-md-4.col-sm-4 { + padding: 0; + } + + .mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button { + width: 100%; + } +} + +.mec-widget .mec-event-list-modern .mec-month-divider { + margin: 30px 0 10px 0; +} + +.mec-widget .mec-event-list-minimal .mec-event-date span { + font-size: 12px; +} + +.mec-widget .mec-event-list-minimal .mec-event-date:after { + height: 29px; +} + +.mec-widget .mec-event-list-minimal .col-md-9, +.mec-widget .mec-event-list-minimal .col-md-3 { + display: block; + width: 100%; + text-align: left; +} + +.mec-widget .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper { + position: relative; +} + +.mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button { + width: 100%; + text-align: center; +} + +.mec-widget .mec-event-list-minimal .mec-event-date:first-child { + margin-right: 24px; +} + +/* MEC Events Grid Clean + -------------------------- */ +.mec-event-grid-clean { + margin-bottom: 10px; + max-width: none; +} + +.mec-event-grid-clean .mec-event-article { + margin-bottom: 30px; + position: relative; + border: 1px solid #e2e2e2; + text-align: center; + padding: 15px 15px 0; + background: #fff; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-grid-clean .mec-event-content { + background: #fff; + color: #767676; + padding: 25px 16px 0; + text-align: left; +} + +.mec-event-grid-clean .mec-event-title { + color: #202020; + margin: 0 0 10px 0; + font-weight: bold; + font-size: 21px; + text-transform: capitalize; +} + +.mec-event-grid-clean .mec-event-title a { + color: #202020; + transition: all 0.24s ease; +} + +.mec-event-grid-clean .mec-event-date { + font-weight: 400; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1px; + background-color: #40d9f1; + color: #fff; + padding: 3px 0; + margin: 0; + text-align: center; +} + +.mec-event-grid-clean .mec-event-content p { + font-size: 15px; + color: #9a9a9a; + line-height: 1.54; +} + +.mec-event-grid-clean img { + margin-bottom: 0; + width: 100%; +} + +.mec-event-grid-clean .event-grid-t2-head { + margin-bottom: 10px; + color: #fff; + padding: 9px 14px 6px; + text-align: left; +} + +.mec-event-grid-clean .event-grid-t2-head .mec-event-date { + font-size: 50px; + line-height: 50px; + float: left; + margin-right: 11px; +} + +.mec-event-grid-clean .event-grid-t2-head .mec-event-month { + text-transform: uppercase; + font-size: 17px; + line-height: 20px; + padding-top: 4px; +} + +.mec-event-grid-clean .event-grid-t2-head .mec-event-detail { + font-size: 12px; +} + +.mec-event-grid-clean .event-grid-t2-head .mec-categories li a { + margin-bottom: 10px; + color: #fff; +} + +.mec-event-grid-clean .event-grid-t2-head .mec-categories li a:hover { + color: #000; +} + +.mec-event-grid-clean .mec-event-sharing-wrap { + left: 0; + padding-left: 0; +} + +.mec-event-grid-clean .mec-event-footer { + position: relative; + border-top: 2px solid; + padding: 20px 0; + margin: 0 14px; + text-align: left; + background: none; +} + +.mec-event-grid-clean .mec-event-footer .mec-booking-button { + right: 0; +} + +.mec-event-grid-clean .row { + margin-bottom: 30px; +} + +/* MEC Events Grid Modern + -------------------------- */ +.mec-event-grid-modern { + margin-bottom: 10px; + max-width: none; +} + +.mec-event-grid-modern .mec-event-article { + position: relative; + border: 1px solid #e2e2e2; + text-align: center; + margin-bottom: 30px; + padding: 45px 15px 10px; + background: #fff; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-grid-modern .mec-event-content { + color: #767676; + padding: 0 15px 10px; + text-align: left; +} + +.mec-event-grid-modern .mec-event-title { + color: #202020; + margin: 0 0 10px 0; + font-weight: bold; + font-size: 24px; + text-transform: none; + letter-spacing: -1px; +} + +.mec-event-grid-modern .mec-event-title a { + color: #202020; + transition: all 0.24s ease; +} + +.mec-event-grid-modern .mec-event-content .mec-categories-wrapper, +.mec-event-grid-modern .mec-event-content .mec-shortcode-organizers { + margin-bottom: 10px; +} + +.mec-event-grid-modern .mec-event-content p, +.mec-event-grid-modern .mec-event-content .mec-categories-wrapper, +.mec-event-grid-modern .mec-event-content .mec-shortcode-organizers { + font-size: 15px; + color: #9a9a9a; + line-height: 1.54; +} + +.mec-event-grid-modern img { + margin-bottom: 0; + width: 100%; +} + +.mec-event-grid-modern .event-grid-modern-head { + margin-bottom: 0; + padding: 9px 14px 6px; + text-align: left; +} + +.mec-event-grid-modern .event-grid-modern-head .mec-event-date { + font-size: 50px; + line-height: 50px; + float: left; + margin-right: 11px; +} + +.mec-event-grid-modern .event-grid-modern-head .mec-event-month { + text-transform: uppercase; + font-size: 17px; + line-height: 20px; + padding-top: 4px; + margin-bottom: 5px; +} + +.mec-event-grid-modern .event-grid-modern-head .mec-event-detail { + font-size: 12px; +} + +.mec-event-grid-modern .event-grid-modern-head .mec-event-day { + margin-top: 9px; + color: #c0c0c0; + font-size: 35px; + font-weight: 100; + text-transform: uppercase; + letter-spacing: -1px; +} + +.mec-event-grid-modern .mec-event-footer { + position: relative; + height: 90px; + padding: 20px 0; + border: none; + margin: 0 14px; + text-align: left; + background: none; +} + +.mec-event-grid-modern .mec-event-footer .mec-booking-button { + right: auto; + left: 0; +} + +.mec-event-grid-modern .mec-event-sharing-wrap { + left: auto; + right: 0; + padding-left: 0; +} + +.mec-event-grid-modern .mec-event-sharing { + left: auto; + right: -6px; +} + +.mec-event-grid-modern .mec-event-sharing-wrap li { + border-radius: 55px; +} + +.mec-event-grid-modern .row { + margin-bottom: 0; +} + +@media only screen and (max-width: 479px) { + .mec-event-grid-modern .mec-event-article { + padding-bottom: 30px; + } + + .mec-event-grid-modern .mec-event-sharing { + top: 60px; + left: 0; + right: auto; + } + + .mec-event-grid-modern .mec-event-footer .mec-booking-button { + top: 0; + } +} + +/* MEC Events Sold Out + ------------------------------------ */ +span.mec-event-title-soldout { + font-size: 8px; + font-weight: 700; + letter-spacing: 0.5px; + text-transform: uppercase; + background: #e63360; + color: #fff; + padding: 3px 8px; + line-height: 1; + border-radius: 15px; + white-space: nowrap; + vertical-align: middle; +} + +/* MEC Repeating Label + ------------------------------------ */ +.mec-repeating-label { + background: #222; + color: #fff; + padding: 3px 8px; + font-size: 8px; + font-weight: 700; + letter-spacing: 0.5px; + border-radius: 40px; + display: inline-block; +} + +/* MEC Events Grid Modern Colorful + ------------------------------------ */ +.mec-event-grid-colorful .mec-event-article { + min-height: 400px; + border: none; + box-shadow: none; + background: #40d9f1; + padding-top: 25px; + margin: 0; + color: #fff; +} + +.mec-event-grid-colorful .mec-event-content { + background: none; +} + +.mec-event-grid-colorful .mec-event-content p, +.mec-event-grid-colorful .event-grid-modern-head, +.mec-event-grid-colorful .mec-event-sharing-wrap > li > a, +.mec-event-grid-colorful .event-grid-modern-head .mec-event-day, +.mec-event-grid-colorful .mec-event-title a, +.mec-event-grid-colorful .event-grid-modern-head .mec-event-date, +.mec-event-grid-colorful ul.mec-categories li.mec-category a { + color: #fff; +} + +.mec-event-grid-colorful .mec-event-footer .mec-booking-button, +.mec-event-grid-colorful .mec-event-footer .mec-modal-booking-button { + border: none; +} + +.mec-event-grid-colorful .mec-event-sharing-wrap > li { + border-color: #fff; +} + +.mec-event-grid-colorful .mec-event-sharing-wrap:hover > li { + background: #333; + border-color: #333; +} + +.mec-event-grid-colorful .mec-event-title a.mec-color-hover:hover { + color: #fff; + text-decoration: underline; +} + +.mec-event-grid-colorful .mec-event-title .event-color { + display: none; +} + +.mec-event-grid-colorful div[class^="col-md-"] { + padding: 0 1px 1px 0; + margin: 0; +} + +.mec-event-grid-colorful .mec-event-article .mec-time-details, +.mec-event-grid-colorful .mec-event-article .mec-price-details { + color: #fff; +} + +@media only screen and (min-width: 768px) { + .mec-wrap.mec-sm959.mec-event-grid-colorful + .event-grid-modern-head + .mec-event-day { + font-size: 26px; + } + + .mec-wrap.mec-sm959.mec-event-grid-colorful + .event-grid-modern-head + .mec-event-month { + font-size: 15px; + } + + .mec-wrap.mec-sm959.mec-event-grid-colorful + .event-grid-modern-head + .mec-event-date { + font-size: 50px; + } + + .mec-wrap.mec-sm959.mec-event-grid-colorful .mec-event-title { + font-size: 21px; + } + + .mec-wrap.mec-sm959.mec-event-grid-colorful .mec-event-content p { + font-size: 13px; + } + + .mec-wrap + .mec-event-grid-colorful + .col-md-3.col-sm-3 + .mec-event-sharing-wrap { + bottom: 100px; + } +} + +@media only screen and (min-width: 768px) and (max-width: 1200px) { + .mec-wrap.mec-sm959.mec-event-grid-colorful div[class^="col-md-"] { + width: 50%; + } +} + +/* MEC Event-list Minimal + -------------------------- */ +.mec-event-list-minimal .mec-event-article { + border-bottom: 1px solid #efefef; + padding: 24px 0 16px; +} + +.mec-event-list-minimal .mec-wrap .col-md-9 { + padding: 0; +} + +.mec-event-list-minimal .mec-event-date { + position: relative; + float: left; + margin-right: 30px; + color: #fff; + width: 52px; + padding: 6px 4px 3px; + text-align: center; + text-transform: uppercase; + border-radius: 3px; +} + +.mec-event-list-minimal .mec-event-date { + min-width: 52px; + width: fit-content; +} + +.mec-event-list-minimal .mec-event-date:nth-child(2) { + margin: 0 30px 0 -20px; +} + +.mec-event-list-minimal .mec-event-date span { + display: block; + font-size: 24px; + font-weight: 700; + text-align: center; + margin-bottom: 4px; +} + +.mec-event-list-minimal .mec-event-date:after { + display: block; + content: ""; + position: absolute; + width: 50px; + left: 1px; + top: 1px; + height: 34px; + background: rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.02); +} + +.mec-event-list-minimal .mec-event-date:after { + width: 100%; +} + +.mec-event-list-minimal .mec-event-title { + margin-top: 0; + margin-bottom: 10px; + font-weight: 700; + font-size: 18px; + text-transform: uppercase; + letter-spacing: 0; + padding-top: 10px; +} + +.mec-event-list-minimal .mec-time-details, +.mec-event-list-minimal .mec-event-detail, +.mec-event-list-minimal .mec-price-details, +.mec-event-list-minimal .mec-categories-wrapper, +.mec-event-list-minimal .mec-shortcode-organizers { + font-size: 15px; + font-weight: 300; + line-height: 1; + letter-spacing: 0; + color: #9a9a9a; + margin-bottom: 10px; +} + +.mec-event-list-minimal .btn-wrapper { + text-align: right; + padding-right: 0; + padding-top: 6px; + text-align: center; +} + +.mec-event-list-minimal .btn-wrapper .mec-detail-button { + border-bottom: 0; + margin-bottom: 14px; + margin-right: 0; + box-shadow: none; +} + +.mec-event-list-minimal a.mec-detail-button { + text-align: center; + display: inline-block; + background: #ededed; + color: #191919; + padding: 12px; + border-radius: 2px; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 2px; + transition: all 0.24s ease; +} + +.mec-event-list-minimal a.mec-detail-button:hover { + background: #292929; + color: #fff; +} + +.vc_col-sm-4 .mec-event-list-minimal .mec-event-date, +.vc_col-sm-6 .mec-event-list-minimal .mec-event-date { + margin-right: 12px; +} + +.vc_col-sm-4 .mec-event-list-minimal .mec-event-title, +.vc_col-sm-6 .mec-event-list-minimal .mec-event-title { + font-size: 15px; + letter-spacing: 2px; +} + +@media only screen and (min-width: 480px) and (max-width: 767px) { + .mec-event-list-minimal .btn-wrapper { + padding-left: 0; + } + + .mec-event-list-minimal .mec-event-date { + margin-right: 10px; + } +} + +@media only screen and (max-width: 767px) { + .mec-event-list-minimal .btn-wrapper .mec-detail-button { + display: block; + text-align: center; + margin: 0; + margin-top: 16px; + padding: 8px; + } + + .mec-event-list-minimal .btn-wrapper { + margin: 12px 0; + } +} + +@media only screen and (max-width: 479px) { + .mec-event-list-minimal .mec-event-date { + float: none; + width: 160px; + margin: 8px auto; + } + + .mec-event-list-minimal .mec-event-date span { + display: inline; + padding-right: 25px; + margin-right: 7px; + font-size: inherit; + } + + .mec-event-list-minimal .mec-event-date:after { + width: 45%; + box-shadow: 4px 0 4px rgba(0, 0, 0, 0.02); + } + + .mec-event-list-minimal .btn-wrapper { + text-align: center; + padding-left: 0; + } + + .mec-event-list-minimal { + text-align: center; + } + + .mec-event-list-minimal .mec-event-detail { + margin-bottom: 10px; + } +} + +@media only screen and (min-width: 479px) { + .mec-event-list-minimal .mec-event-article { + display: flex; + align-items: center; + justify-content: space-between; + } +} + +/* MEC Event-list Modern + -------------------------- */ +.mec-wrap .mec-event-list-modern .mec-event-title { + margin-top: 0; + margin-bottom: 10px; +} + +.mec-event-list-modern .mec-event-article { + border-bottom: 1px solid #efefef; + padding: 30px 0 10px; +} + +.mec-event-list-modern .mec-event-article:last-child { + border-bottom: none; +} + +.mec-event-list-modern .mec-event-title a { + color: #191919; + transition: all 0.24s ease; + box-shadow: none; +} + +.mec-event-list-modern .mec-event-date { + text-transform: uppercase; + padding: 10px 0; +} + +.mec-event-list-modern .mec-event-date .event-d { + font-size: 48px; + display: table-cell; + padding: 10px 0 0; +} + +.mec-event-list-modern .mec-event-date .event-d.mec-multiple-dates { + font-size: 20px; + padding: 0; +} + +.mec-event-list-modern .mec-event-date.mec-multiple-date-event:first-child { + padding: 10px 0 6px 0; + position: relative; + width: fit-content; +} + +.mec-event-list-modern + .mec-event-date.mec-multiple-date-event:first-child:after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + background: silver; +} + +.mec-event-list-modern .mec-event-date.mec-multiple-date-event:last-child { + padding: 5px 0 10px 0; +} + +.mec-event-list-modern .mec-event-date.mec-multiple-date-event .event-d { + font-size: 20px; + padding: 0; +} + +.mec-event-list-modern .mec-event-date.mec-multiple-date-event .event-da { + font-size: 20px; + margin: 0; +} + +.mec-event-list-modern .mec-event-date .event-f { + font-size: 13px; + display: table-cell; + vertical-align: middle; + padding-left: 7px; + font-weight: 500; + letter-spacing: 3px; + color: #777; +} + +.mec-event-list-modern .mec-event-detail { + font-weight: 300; + color: #8a8a8a; +} + +.mec-event-list-modern .mec-event-detail .mec-time-details { + display: inline; +} + +.mec-event-list-modern .mec-event-date .event-da { + margin-top: 9px; + color: silver; + font-size: 28px; + font-weight: 100; + text-transform: uppercase; + letter-spacing: -1px; + text-align: left; +} + +.mec-event-list-modern .mec-btn-wrapper .mec-booking-button { + border-radius: 1px; + letter-spacing: 2px; + border: 1px solid #e6e6e6; + color: #333; + background-color: #fff; + padding: 13px 20px; + font-weight: 700; + font-size: 11px; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); + transition: all 0.28s ease; +} + +.mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover { + border-color: #222; + background: #222; + color: #fff; +} + +.mec-event-list-modern .mec-event-title { + font-weight: 700; + font-size: 20px; + text-transform: uppercase; + letter-spacing: 1px; +} + +.mec-event-list-modern .mec-event-detail, +.mec-event-list-modern .mec-price-details, +.mec-event-list-modern .mec-shortcode-organizers, +.mec-event-list-modern .mec-categories-wrapper { + color: #9a9a9a; + font-size: 15px; + font-weight: 300; + line-height: 25px; +} + +.mec-event-list-modern .mec-btn-wrapper { + text-align: right; + padding: 10px 0; + text-transform: uppercase; +} + +.mec-event-list-modern .mec-event-sharing { + position: relative; + margin: 10px 0; + padding-left: 0; +} + +.mec-event-list-modern .mec-event-sharing > li { + display: inline-block; + border: none; + border-radius: 50%; + margin-right: 10px; + margin-bottom: 5px; +} + +/* +.mec-event-list-modern .mec-event-sharing .telegram { + min-width: 36px; + min-height: 36px; + line-height: 36px; + padding: 9px 1px 10px; + border-radius: 60px; +} + +.mec-event-list-modern .mec-event-sharing>li .telegram { + padding-top: 8px; + padding-bottom: 9px; + border-radius: 50%; + border: 1px solid #ddd; +} */ + +/* .mec-event-list-modern .mec-event-sharing .telegram .svg-inline--fa.fa-telegram.fa-w-16 { + width: 3.246rem; + padding: 2px 10px 0 10px; + margin-bottom: -2px; +} + +.mec-event-list-modern .mec-event-sharing .telegram .svg-inline--fa.fa-telegram.fa-w-16 path { + fill: #767676; +} + +.mec-event-list-modern .mec-event-sharing li:hover .telegram { + background-color: #40d9f1; +} + +.mec-event-list-modern .mec-event-sharing li:hover .telegram .svg-inline--fa.fa-telegram.fa-w-16 path { + fill: #fff; +} */ + +.mec-event-list-modern .mec-event-sharing > li:hover { + display: inline-block; +} + +.mec-event-list-modern .mec-event-sharing > li:hover a i { + color: #fff; + background: #40d9f1; + border-color: #40d9f1; +} + +.mec-event-list-modern .mec-event-sharing > li i { + width: 36px; + display: inline-block; + line-height: 35px; + color: #767676; + text-align: center; + border-radius: 50%; + border: 1px solid #ddd; + font-size: 14px; + margin-right: 3px; + transition: all ease 300ms; +} + +.mec-event-list-modern .mec-event-sharing > li i svg { + height: 16px; + vertical-align: middle; +} + +.mec-event-list-modern .mec-event-sharing > li .mec-social-title { + color: #767676; + font-size: 14px; +} + +.mec-event-list-modern + .mec-event-sharing + .mec-event-share:hover + .mec-event-sharing-icon { + background: #40d9f1; + border-color: #40d9f1; + cursor: pointer; + border-radius: 50%; +} + +.mec-event-list-modern .mec-event-sharing li:hover a i { + background: #40d9f1; +} + +/* +.mec-event-list-modern .mec-event-sharing li .fa-telegram { + fill: #000; + max-width: 20px !important; + width: 20px !important; + max-height: 20px !important; + height: 20px; + position: relative; + padding: 0 !important; + margin-bottom: -4px !important; +} + +.mec-event-list-modern .mec-event-sharing li .fa-telegram * { + transform: scale(0.04); +} + +.mec-event-list-modern .mec-event-sharing li .svg-inline--fa.fa-telegram.fa-w-16 path { + fill: #767676; +} + +.mec-event-list-modern .mec-event-sharing li .telegram { + width: 36px !important; + height: 36px !important; + padding: 9px 7px 9px; +} */ + +@media only screen and (min-width: 768px) { + .mec-event-list-modern .mec-event-article { + position: relative; + min-height: 160px; + overflow: visible; + } + + .mec-event-list-modern .col-md-2.col-sm-2 { + width: 210px; + position: absolute; + left: 0; + top: 20px; + padding: 0; + } + + .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper { + padding: 0; + position: absolute; + right: 0; + top: 30%; + } + + .mec-event-list-modern .col-md-6.col-sm-6 { + width: 100%; + padding-left: 225px; + padding-right: 195px; + } +} + +@media only screen and (max-width: 767px) { + .mec-event-list-modern .mec-btn-wrapper .mec-booking-button { + letter-spacing: 1px; + border: 1px solid #e1e1e1; + } + + .mec-event-list-modern .mec-btn-wrapper { + padding: 0 0 12px; + } + + .mec-event-list-modern .mec-event-sharing { + margin-bottom: 0; + } + + .mec-event-list-modern .mec-event-sharing li { + margin-bottom: 7px; + } +} + +/* MEC Event-grid Minimal + -------------------------- */ +.mec-event-grid-minimal .mec-event-article { + margin: 15px 0; + min-height: 80px; + display: table; +} + +.mec-event-grid-minimal .event-detail-wrap { + display: table-cell; + vertical-align: middle; +} + +.mec-event-grid-minimal .mec-event-date { + width: 70px; + float: left; + margin-right: 20px; + padding: 12px 16px 10px; + text-align: center; + text-transform: uppercase; + border-radius: 4px; + border: 1px solid #e6e6e6; + transition: all 0.37s ease-in-out; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-grid-minimal .mec-event-date span { + display: block; + font-size: 24px; + font-weight: 700; + text-align: center; + margin-bottom: 4px; + color: #2a2a2a; + transition: color 0.3s ease; +} + +.mec-event-grid-minimal .mec-event-title { + margin-top: 0; + margin-bottom: 10px; + font-weight: 700; + line-height: 21px; + font-size: 16px; + text-transform: uppercase; + transition: color 0.3s ease; +} + +.mec-event-grid-minimal .mec-event-title a { + color: #191919; + transition: color 0.3s ease; +} + +.mec-event-grid-minimal .mec-time-details, +.mec-event-grid-minimal .mec-event-detail .mec-event-loc-place, +.mec-event-grid-minimal .mec-event-detail .mec-categories-wrapper, +.mec-event-grid-minimal + .mec-event-detail + .mec-categories-wrapper + ul.mec-categories + li.mec-category + a, +.mec-event-grid-minimal .mec-event-detail .mec-shortcode-organizers, +.mec-event-grid-minimal .mec-event-detail .mec-price-details { + font-size: 15px; + font-weight: 300; + line-height: 1; + letter-spacing: 0; + color: #9a9a9a; + margin-bottom: 10px; +} + +.mec-event-grid-minimal .mec-event-date:hover { + color: #fff; +} + +.mec-event-grid-minimal .mec-event-date:hover span { + color: #fff; +} + +.mec-wrap .mec-event-grid-minimal .mec-event-date:hover { + color: #fff; +} + +/* MEC Event-list Classic + -------------------------- */ +.mec-event-list-classic .mec-event-article { + padding: 12px 0; + margin-bottom: 20px; +} + +.mec-event-list-classic .mec-event-image { + float: left; + width: 86px; + margin-right: 20px; +} + +.mec-event-list-classic .mec-event-date, +.mec-event-list-classic .mec-event-time { + font-weight: 400; + font-size: 13px; + letter-spacing: 0; + line-height: 18px; + text-align: left; + display: initial; + margin-right: 12px; +} + +.mec-event-list-classic .mec-event-time .mec-time-details, +.mec-event-list-classic .mec-event-time i { + display: inline; + margin-right: 3px; +} + +.mec-event-list-classic .mec-event-date span { + font-weight: 500; + margin-bottom: 6px; +} + +.mec-event-list-classic .mec-event-title { + font-size: 15px; + margin: 10px 0 12px; + font-weight: 700; + text-transform: uppercase; +} + +.mec-event-list-classic .mec-event-title a { + color: #494949; + transition: color 0.3s ease; +} + +.mec-event-list-classic .mec-event-detail, +.mec-event-list-classic .mec-price-details { + color: #777; + font-weight: 400; + line-height: 12px; + font-size: 12px; + overflow: hidden; +} + +@media only screen and (max-width: 480px) { + .mec-event-list-classic .mec-event-detail { + float: right; + width: calc(100% - 104px); + } +} + +.mec-event-list-classic a.magicmore { + padding: 10px 16px; + color: #fff; + background: #222; + letter-spacing: 2px; + font-size: 11px; +} + +.mec-event-list-classic a.magicmore:after { + content: ""; + display: none; +} + +.mec-event-list-classic a.magicmore:hover { + color: #40d9f1; +} + +/* MEC Event-grid Simple + -------------------------- */ +.mec-event-grid-simple .mec-event-article { + position: relative; + margin-bottom: 30px; +} + +.mec-event-grid-simple .mec-event-article:after { + border-right: 1px solid #e6e6e6; + height: 60px; + position: absolute; + top: 50%; + margin-top: -30px; + right: -1px; +} + +.mec-event-grid-simple .row div:last-child .mec-event-article:after { + border: none; +} + +.mec-event-grid-simple .row { + margin: 15px 0 30px; + text-align: center; +} + +.mec-event-grid-simple .mec-event-date { + padding: 0; + margin: 0; + text-transform: capitalize; + font-size: 12px; + font-weight: 700; +} + +.mec-event-grid-simple .mec-event-title { + margin-top: 0; + margin-bottom: 10px; + font-weight: 700; + line-height: 21px; + font-size: 15px; + padding-top: 5px; + padding-left: 5px; + padding-right: 5px; + text-transform: uppercase; + transition: color 0.37s ease; +} + +.mec-event-grid-simple .mec-event-title a { + color: #494949; + transition: color 0.3s ease; +} + +.mec-event-grid-simple .mec-event-detail { + font-weight: 400; + line-height: 1; + letter-spacing: 0; + font-size: 13px; + color: #777; +} + +.mec-event-grid-simple .mec-event-detail .mec-time-details { + margin-top: 7px; +} + +.mec-event-grid-simple .mec-event-title:hover { + color: #40d9f1; +} + +.mec-event-grid-simple .mec-event-date:hover { + background: transparent; +} + +.event-last:after { + display: none; +} + +@media only screen and (max-width: 767px) { + .mec-event-grid-simple .mec-event-article { + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #eee; + } + + .mec-event-grid-simple .mec-event-article:after { + border: none; + } +} + +/* MEC Event-grid Novel */ +.mec-event-grid-novel .mec-event-article { + position: relative; + margin-bottom: 30px; + padding: 60px 5% 60px 7%; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 10px; + background-color: #0050fd; + -webkit-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; + z-index: 1; +} + +.mec-event-grid-novel .mec-event-article .novel-grad-bg { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 10px; + opacity: 0; + z-index: -1; + -webkit-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; +} + +.mec-event-grid-novel .mec-event-article:hover { + -webkit-box-shadow: 0 13px 36px 0 rgba(0, 0, 0, 0.23); + box-shadow: 0 13px 36px 0 rgba(0, 0, 0, 0.23); + border-color: transparent; +} + +.mec-event-grid-novel .mec-event-article:hover .novel-grad-bg { + background-image: -webkit-gradient( + linear, + left top, + right top, + from(rgb(38, 46, 50)), + to(rgb(14, 16, 21)) + ); + background-image: -webkit-linear-gradient( + left, + rgb(38, 46, 50) 0%, + rgb(14, 16, 21) 100% + ); + background-image: -o-linear-gradient( + left, + rgb(38, 46, 50) 0%, + rgb(14, 16, 21) 100% + ); + background-image: linear-gradient( + 90deg, + rgb(38, 46, 50) 0%, + rgb(14, 16, 21) 100% + ); + opacity: 1; +} + +.mec-event-grid-novel .mec-event-image { + float: left; + width: 150px; + height: 150px; +} + +.mec-event-grid-novel .mec-event-image img { + width: 150px; + height: 150px; + border-radius: 50%; +} + +.mec-event-grid-novel .mec-event-detail-wrap { + margin-left: 200px; +} + +.mec-event-grid-novel .mec-event-content h4 { + position: relative; + margin-bottom: 10px; + display: inline-block; +} + +.mec-event-grid-novel .mec-event-content h4 a { + font-size: 24px; + line-height: 35px; + color: #fafcff; +} + +.mec-event-grid-novel + .mec-event-content + h4.mec-gCalendar-search-text-wrap + input[type="text"]:before { + content: ""; + position: absolute; + top: 8px; + left: -30px; + width: 17px; + height: 17px; + background: #5cd0ed; + opacity: 0.4; + border-radius: 50%; + padding-right: 5px; +} + +.mec-skin-grid-container .mec-event-grid-novel .mec-categories li a { + color: #fff; +} + +.mec-event-grid-novel .mec-local-time-details, +.mec-event-grid-novel .mec-event-month, +.mec-event-grid-novel .mec-event-detail, +.mec-event-grid-novel .mec-event-address { + position: relative; + padding-left: 35px; + font-size: 15px; + line-height: 30px; + color: rgba(255, 255, 255, 0.4); +} + +.mec-event-grid-novel .mec-price-details { + position: relative; + padding-left: 7px; + font-size: 15px; + line-height: 30px; + color: rgba(255, 255, 255, 0.4); +} + +.mec-event-grid-novel .mec-price-details i { + margin-right: 8px; +} + +.mec-event-grid-novel .mec-local-time-details:before, +.mec-event-grid-novel .mec-event-month::before, +.mec-event-grid-novel .mec-event-detail::before, +.mec-event-grid-novel .mec-event-address::before, +.mec-event-grid-novel .mec-categories-wrapper::before { + position: absolute; + top: 6px; + left: 6px; + font-size: 17px; + font-family: "simple-line-icons"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; +} + +.mec-event-grid-novel .mec-local-time-details::before { + content: "\e007"; +} + +.mec-event-grid-novel .mec-event-month::before { + content: "\e075"; +} + +.mec-event-grid-novel .mec-event-detail::before { + content: "\e081"; +} + +.mec-event-grid-novel .mec-event-address::before { + content: "\e096"; +} + +.mec-event-grid-novel .mec-categories-wrapper::before { + content: "\e089"; +} + +.mec-event-grid-novel .mec-event-footer { + clear: both; + padding: 20px 0; + border-top: none; + background: transparent; +} + +.mec-event-grid-novel .mec-event-footer .mec-booking-button { + right: 0; + left: auto; + height: 38px; + width: 148px; + padding: 0 20px; + font-size: 14px; + font-weight: normal; + line-height: 38px; + text-align: center; + color: #fff; + background: transparent; + border-color: rgba(255, 255, 255, 0.1); + border-radius: 50px; +} + +.mec-event-grid-novel .mec-event-footer .mec-booking-button:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.mec-event-grid-novel .mec-event-sharing-wrap { + left: 0; + cursor: pointer; + padding-left: 0; +} + +.mec-event-grid-novel .mec-event-sharing-wrap > li { + border-color: rgba(255, 255, 255, 0.1); + border-radius: 50%; +} + +.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-share { + position: absolute; + z-index: 2; +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing { + top: -6px; + left: 0; + padding: 5px 10px 2px 50px; + min-width: 150px; + width: inherit; + height: 38px; + background-color: rgba(255, 255, 255, 0.1); + -webkit-box-shadow: none; + box-shadow: none; + border: none; + border-radius: 50px; + backdrop-filter: blur(10px); +} + +.mec-event-grid-novel .mec-event-sharing-wrap:hover > li { + background-color: rgba(255, 255, 255, 0.1); +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing::before, +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing::after { + display: none; +} + +.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon, +.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon a, +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li i { + display: inline; +} + +.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon a { + padding: 0 10px; +} + +.mec-event-grid-novel .mec-event-sharing-wrap > li a { + color: #fff; +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a { + color: rgba(255, 255, 255, 0.4); +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a:hover { + color: rgba(255, 255, 255, 1); +} + +/* Fix Icons */ +.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon { + margin: 0; + width: auto; +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing { + display: flex; + align-items: center; + padding-top: 0; +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a { + display: flex; + align-items: center; + width: 31px; +} + +.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon a i { + width: auto; + height: auto; +} + +.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon a svg { + fill: rgba(255, 255, 255, 0.4); + padding: 0; + width: 36px; + height: 36px; + border-radius: 0; + margin: 0; +} + +@media only screen and (max-width: 1200px) { + .mec-event-grid-novel .row .col-md-6.col-sm-6 { + width: 100%; + float: none; + } + + .mec-event-grid-novel .mec-event-image { + float: none; + margin-top: -20px; + margin-bottom: 20px; + } + + .mec-event-grid-novel .mec-event-detail-wrap { + margin-left: 20px; + } + + .mec-event-grid-novel .mec-event-footer { + margin-top: 30px; + } +} + +@media only screen and (max-width: 767px) { + .mec-event-grid-novel .mec-event-footer { + margin-top: 0; + padding-top: 30px; + margin-bottom: 24px; + } + + .mec-event-grid-novel .mec-event-footer .mec-booking-button { + display: block; + position: relative; + } + + .mec-event-grid-novel .mec-event-sharing-wrap { + left: 0; + bottom: -55px; + padding-left: 0; + } + + .mec-event-grid-novel .mec-event-content h4 a { + font-size: 20px; + line-height: 1.3; + } +} + +.mec-event-grid-novel .mec-event-sharing-wrap { + padding-left: 0; +} + +.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing { + width: fit-content; + z-index: 1; +} + +@media (min-width: 1280px) { + .mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-article img { + width: 100px; + height: 100px; + } + + .mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-detail-wrap { + margin-left: 150px; + } + + .mec-event-grid-novel .col-md-3.col-sm-3 .mec-event-content .mec-event-image, + .mec-event-grid-novel + .col-md-3.col-sm-3 + .mec-event-content + .mec-event-detail-wrap { + width: 100%; + } + + .mec-event-grid-novel + .col-md-3.col-sm-3 + .mec-event-content + .mec-event-detail-wrap { + margin-left: 20px; + } +} + +@media (min-width: 760px) and (max-width: 1024px) { + .mec-event-grid-novel .col-md-4.col-sm-4 { + width: 100%; + } + + .mec-event-grid-novel .mec-event-image { + float: left; + } + + .mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-article img { + width: 100px; + height: 100px; + } +} + +/* MEC Event Cover Modern + -------------------------- */ +.mec-event-cover-modern { + position: relative; +} + +.mec-event-cover-modern .mec-event-cover-a { + background: transparent; + position: absolute; + color: #fff; + bottom: 0; + left: 0; + text-decoration: none; +} + +.mec-event-cover-modern .mec-event-cover-a .mec-event-overlay { + transition: all 0.5s; + opacity: 0.8; + width: 100%; + height: 100%; + position: absolute; +} + +.mec-event-cover-modern .mec-event-cover-a:hover .mec-event-overlay { + opacity: 1; +} + +.mec-event-cover-modern .mec-event-detail { + padding: 40px; + position: relative; +} + +.mec-event-cover-modern .mec-event-cover-a:hover .mec-event-tag { + color: #333; + transition: all 0.5s; +} + +.mec-event-cover-modern .mec-event-cover-a .mec-event-title:hover { + text-decoration: underline; +} + +.mec-event-cover-modern .mec-event-tag { + background: #fff; + display: inline-block; + padding: 5px 9px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 24px; +} + +.mec-event-cover-modern .mec-event-date { + text-transform: uppercase; + font-size: 17px; + font-weight: 300; +} + +.mec-event-cover-modern .mec-event-title { + color: #fff; + text-transform: uppercase; + font-size: 40px; + font-weight: 700; + margin: 6px 0; +} + +.mec-event-cover-modern .mec-event-place { + font-weight: 400; + font-size: 18px; +} + +@media only screen and (max-width: 767px) { + .mec-event-cover-modern .mec-event-cover-a { + width: 100%; + } +} + +/* MEC Event Cover Classic + -------------------------- */ +.mec-event-cover-classic { + position: relative; + overflow: hidden; + background: #fff; + padding: 6px; + border: 1px solid #e8e8e8; +} + +.mec-event-cover-classic .mec-event-overlay { + position: absolute; + left: 6px; + right: 6px; + bottom: 6px; + top: 6px; + width: auto; + height: auto; + background-color: rgba(36, 36, 36, 0.4); + transition: all 0.33s ease-in-out; +} + +.mec-event-cover-classic:hover .mec-event-overlay { + background-color: rgba(36, 36, 36, 0.6); +} + +.mec-event-cover-classic .mec-event-content { + font-size: 15px; + color: #fff; + position: absolute; + bottom: 0; + padding: 50px 35px; + transition: all 0.33s ease-in-out; +} + +.mec-event-cover-classic .mec-event-date { + font-size: 14px; + text-transform: uppercase; + font-weight: 400; + line-height: 1.6; + text-align: left; +} + +.mec-event-cover-classic .mec-event-date span { + display: block; + font-weight: 700; + font-size: 16px; +} + +.mec-event-cover-classic .mec-event-title { + color: #fff; + margin: 20px 0 38px; + font-size: 24px; + font-weight: bold; + text-transform: uppercase; + font-style: normal; +} + +.mec-event-cover-classic .mec-btn-wrapper { + text-align: left; +} + +.mec-event-cover-classic .mec-event-icon { + font-size: 18px; + float: left; + margin-right: 14px; + color: #fff; + padding: 13px; +} + +.mec-event-cover-classic .mec-event-button { + color: #fff; + background-color: #191919; + border: 2px #191919 solid; + padding: 12px 20px; + letter-spacing: 3px; + font-size: 12px; + font-weight: bold; + font-style: normal; + transition: all 0.22s ease; + text-decoration: none; +} + +.mec-event-cover-classic .mec-event-button:hover { + color: #191919; + background-color: #fff; + border-color: #fff; + border-radius: 1px; +} + +.mec-event-cover-classic .mec-event-image img { + min-width: 100%; +} + +@media only screen and (max-width: 960px) { + .mec-event-cover-classic .mec-event-content { + padding: 20px; + } + + .mec-event-cover-classic .mec-event-button { + font-size: 11px; + padding: 7px 10px; + letter-spacing: 1px; + } + + .mec-event-cover-classic .mec-event-title { + font-size: 19px; + margin: 15px 0 25px; + } + + .mec-event-cover-classic .mec-event-date { + font-size: 12px; + } +} + +@media only screen and (max-width: 767px) { + .mec-event-cover-classic { + margin-bottom: 30px; + } +} + +@media only screen and (max-width: 479px) { + .mec-event-cover-classic .mec-event-content { + padding: 15px; + font-size: 15px; + } + + .mec-event-cover-classic .mec-event-title { + font-size: 15px; + margin: 10px 0; + } + + .mec-event-cover-classic .mec-event-button { + font-size: 10px; + padding: 6px; + letter-spacing: 1px; + } + + .mec-event-cover-classic .mec-event-icon { + padding: 10px; + } +} + +/* MEC LOAD MORE BUTTON + -------------------------- */ +.mec-load-more-wrap { + text-align: center; + display: block; + width: 100%; + padding-top: 20px; + text-align: center; + position: relative; +} + +.mec-load-more-button { + box-shadow: none; + transition: all 0.21s ease; + font-size: 12px; + font-weight: 500; + letter-spacing: 1px; + text-transform: uppercase; + background: #fff; + color: #767676; + border: 2px solid #e8e8e8; + border-radius: 50px; + padding: 0 28px; + margin-bottom: 20px; + cursor: pointer; + line-height: 40px; + height: 42px; + display: inline-block; +} + +.mec-load-more-button:hover { + background: #191919; + color: #fff; + border-color: #191919; +} + +.mec-load-more-loading { + content: url("../img/ajax-loader.gif"); + cursor: wait; + background: transparent; + border-style: none; +} + +.mec-load-more-loading:hover { + background: transparent; +} + +.mec-modal-preloader, +.mec-month-navigator-loading { + width: 100%; + height: 100%; + background: no-repeat rgba(255, 255, 255, 0.88) url("../img/ajax-loader.gif") + center; + border-style: none; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 9; +} + +.mec-event-calendar-classic .mec-calendar-side .mec-calendar-table { + min-height: 1024px; +} + +.mec-calendar-side .mec-calendar-table { + min-height: 450px; +} + +.mec-skin-weekly-view-events-container.mec-month-navigator-loading { + margin-top: 0; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-side { + display: block; +} + +.mec-skin-daily-view-events-container.mec-month-navigator-loading { + margin-top: 0; +} + +@media only screen and (min-width: 961px) { + .mec-wrap.mec-sm959 .mec-calendar-side .mec-calendar-table { + min-height: 1px; + } +} + +@media only screen and (max-width: 479px) { + .mec-calendar-side .mec-calendar-table { + min-height: 1px; + } +} + +/* MEC Event Cover Clean + -------------------------- */ +.mec-event-cover-clean { + position: relative; + border: 1px solid #e6e6e6; + padding: 8px; +} + +.mec-event-cover-clean .mec-event-overlay { + height: 100%; + background-color: rgba(36, 36, 36, 0.4); + position: absolute; + width: 100%; + left: 0; + border: 8px solid #fff; + top: 0; + transition: all 0.5s ease-in-out; +} + +.mec-event-cover-clean .mec-event-content { + color: #fff; + position: absolute; + bottom: 20px; + padding: 40px 60px; + transition: all 0.5s ease-in-out; +} + +.mec-event-cover-clean .mec-event-title { + color: #fff; + font-weight: 700; + margin: 46px 0 19px; + font-size: 29px; + text-transform: uppercase; + text-shadow: 0 0 1px rgba(0, 0, 0, 0.5); +} + +.mec-event-cover-clean .mec-event-title a { + color: #fff; + transition: all 0.5s; + text-decoration: none; + outline: none; + border: none; + box-shadow: none; +} + +.mec-event-cover-clean .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-event-cover-clean .mec-event-date { + position: absolute; + top: -20px; + right: 60px; + color: #fff; + width: 60px; + padding: 14px 10px; + z-index: 1; +} + +.mec-event-cover-clean .mec-event-date div { + text-align: center; + text-transform: uppercase; + letter-spacing: 1px; + line-height: 16px; +} + +.mec-event-cover-clean .mec-event-date .dday { + padding-bottom: 15px; + border-bottom: 1px solid rgba(255, 255, 255, 0.5); + margin-bottom: 13px; + font-size: 24px; +} + +.mec-event-cover-clean .mec-event-date .dmonth { + letter-spacing: 2px; +} + +.mec-event-cover-clean .mec-event-place { + font-size: 18px; +} + +.mec-event-cover-clean .mec-event-image img { + width: 100%; +} + +@media only screen and (max-width: 768px) { + .mec-event-cover-clean .mec-event-content { + padding: 20px; + bottom: 5px; + } + + .mec-event-cover-clean .mec-event-title { + font-size: 23px; + } + + .mec-event-cover-clean .mec-event-date { + right: 20px; + padding: 10px; + width: 50px; + } +} + +@media only screen and (max-width: 479px) { + .mec-event-cover-clean .mec-event-content { + padding: 10px; + } + + .mec-event-cover-clean .mec-event-title { + font-size: 19px; + padding-right: 25px; + } + + .mec-event-cover-clean .mec-event-date { + right: -20px; + top: -10px; + } + + .mec-event-cover-clean .mec-event-detail { + font-size: 12px; + } +} + +/* MEC Events List Default Loop + --------------------------------- */ +.mec-month-divider { + text-align: center; + margin: 60px 0 40px 0; +} + +.widget .mec-month-divider { + margin: 10px 0; +} + +.mec-month-divider span { + text-transform: uppercase; + font-size: 22px; + font-weight: bold; + padding-bottom: 5px; + color: #313131; + border-bottom: 4px solid #ebebeb; + width: 100%; + display: block; + padding-bottom: 10px; + position: relative; +} + +.mec-month-divider span:before { + border-bottom: 4px solid #40d9f1; + font-size: 6px; + content: ""; + text-align: center; + position: absolute; + bottom: -4px; + margin-left: -30px; + left: 50%; + width: 60px; +} + +.widget .mec-month-divider span { + font-size: 13px; +} + +.mec-event-list-standard .mec-events-pagination { + margin-top: 60px; + border-top: 4px solid #ebebeb; + min-height: 80px; + padding-top: 20px; +} + +.mec-event-list-standard .mec-events-pagination .mec-events-pag-previous { + float: left; + margin-left: 0; +} + +.mec-event-list-standard .mec-events-pagination .mec-events-pag-next { + float: right; + margin-right: 0; +} + +.mec-event-list-standard .mec-event-article { + position: relative; + display: block; + margin-bottom: 25px; + background-color: #fff; + border: 1px solid #e9e9e9; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-list-standard .mec-topsec { + display: table; + width: 100%; +} + +.mec-event-list-standard .col-md-3.mec-event-image-wrap { + padding-left: 0; +} + +.mec-event-list-standard .mec-event-content { + padding-top: 15px; + padding-right: 30px; +} + +.mec-event-list-standard ul.mec-event-status-icons { + list-style: none; + padding: 0; + margin-bottom: 10px; +} + +.mec-event-list-standard ul.mec-event-status-icons li { + display: inline-flex; + align-items: inherit; + justify-content: center; + font-size: 12px; + font-weight: 400; + line-height: 16px; + border-radius: 5px; + padding: 2px 5px; + margin-right: 10px; +} + +.mec-event-list-standard ul.mec-event-status-icons li img { + margin-right: 5px; +} + +.mec-event-list-standard + ul.mec-event-status-icons + li.mec-event-status-scheduled { + color: #58aa22; + background: #e9f8d7; +} + +.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-ongoing { + color: #1aa82a; + background: #e4f6df; +} + +.mec-event-list-standard + ul.mec-event-status-icons + li.mec-event-status-postponed { + color: #a1830d; + background: #fff3b7; +} + +.mec-event-list-standard + ul.mec-event-status-icons + li.mec-event-status-cancelled { + color: #bb1313; + background: #fed8d8; +} + +.mec-event-list-standard + ul.mec-event-status-icons + li.mec-event-status-movedonline { + color: #f35e04; + background: #feebd7; +} + +.mec-event-list-standard .mec-event-title { + font-size: 29px; + font-weight: 600; + letter-spacing: -1px; + margin: 0 0 10px; +} + +.mec-event-list-standard .mec-event-title a { + color: #292929; + text-decoration: none; + transition: color 0.3s ease; +} + +.mec-event-list-standard .mec-col-table-c { + display: table-cell; + height: 100%; + vertical-align: middle; + float: none !important; +} + +.mec-event-list-standard .mec-col-table-c.mec-event-meta-wrap { + padding: 20px; +} + +.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap { + vertical-align: top; +} + +.mec-topsec .mec-event-image { + line-height: 1px; +} + +.mec-topsec .mec-event-image a { + display: block; +} + +.mec-event-list-standard .mec-event-meta-wrap { + border-left: 1px solid #eee; +} + +.mec-event-list-standard .mec-time-details { + text-transform: uppercase; + font-size: 12px; + font-weight: 400; + line-height: 17px; + color: #707070; + padding-top: 0; + text-align: left; +} + +.mec-event-list-standard .mec-event-meta .mec-venue-details span { + font-size: 12px; + font-weight: 400; + line-height: 17px; + color: #707070; + padding-top: 0; + text-align: left; +} + +.mec-event-list-standard + .mec-event-meta + .mec-venue-details + .mec-event-address + span { + font-style: normal; + letter-spacing: 0; + font-size: 12px; + font-weight: 400; + color: #707172; + margin-left: 29px; +} + +.mec-event-list-standard .mec-event-meta span.mec-event-d, +.mec-event-list-standard .mec-event-meta span.mec-event-m { + font-size: 13px; + font-weight: 600; + line-height: 17px; + padding-right: 6px; + color: #414243; + text-transform: uppercase; +} + +.mec-event-list-standard .mec-event-meta span.mec-event-d .mec-start-date-label, +.mec-event-list-standard .mec-event-meta .mec-time-details .mec-start-time, +.mec-event-list-standard .mec-event-meta .mec-time-details .mec-end-time, +.mec-event-list-standard .mec-event-meta .mec-venue-details span { + vertical-align: middle; +} + +.mec-event-list-standard .mec-event-meta svg { + vertical-align: middle; + margin-right: 12px; + width: 20px; + height: 20px; +} + +.mec-event-list-standard .mec-local-time-details, +.mec-event-list-standard .mec-venue-details, +.mec-event-list-standard .mec-date-details, +.mec-event-list-standard .mec-time-details, +.mec-event-list-standard .mec-categories-wrapper, +.mec-event-list-standard .mec-shortcode-organizers { + position: relative; + margin-bottom: 10px; +} + +.mec-event-list-standard .mec-local-time-details .mec-local-title { + font-size: 13px; + font-weight: 400; + line-height: 17px; + color: #414243; + margin-left: -3px; +} + +.mec-event-list-standard .mec-local-time-details .mec-local-date, +.mec-event-list-standard .mec-local-time-details .mec-local-time { + font-style: normal; + letter-spacing: 0; + font-size: 11px; + color: #8a8a8a; + font-weight: 300; + line-height: 1.6; + margin-left: 29px; +} + +.mec-event-list-standard .mec-date-details i, +.mec-event-list-standard .mec-categories-wrapper i, +.mec-event-list-standard .mec-shortcode-organizers i { + margin-right: 12px; +} + +.mec-event-list-standard .mec-categories-wrapper i:before, +.mec-event-list-standard + .mec-event-meta-wrap + .mec-event-meta + .mec-price-details + i:before { + font-size: 16px; +} + +.mec-event-list-standard .mec-event-title .mec-labels-normal { + line-height: 18px; + height: 18px; + display: inline-block; + vertical-align: middle; +} + +.mec-event-list-standard .mec-event-title .mec-labels-normal .mec-label-normal { + vertical-align: bottom; +} + +.mec-event-list-standard .mec-event-description { + font-size: 14px; +} + +.mec-event-list-minimal .mec-event-title a { + color: #292929; + transition: color 0.3s ease; +} + +.mec-event-meta-wrap .mec-price-details { + margin-bottom: 10px; +} + +.mec-price-details i { + margin-right: 4px; + line-height: 16px; +} + +.mec-event-meta-wrap .mec-event-meta .mec-price-details i:before { + font-size: 15px; +} + +.mec-event-list-standard .mec-price-details { + font-size: 12px; + font-weight: 400; + line-height: 17px; + color: #707070; + padding-top: 0; + text-align: left; +} + +.mec-event-list-standard .mec-price-details i { + margin-right: 10px; +} + +.mec-month-side .mec-price-details { + margin-left: 2px; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-content + .mec-price-details + i, +.mec-month-side .mec-price-details i { + padding-top: 4px; + vertical-align: unset; +} + +.mec-event-list-standard ul.mec-categories { + position: relative; + margin-bottom: 10px; +} + +/* .mec-event-list-standard ul.mec-categories li.mec-category a:before { + font-size: 16px !important; + content: "\f105"; + position: absolute; + font-family: fontawesome; + left: 8px; + font-size: 15px; +} */ + +@media only screen and (max-width: 960px) { + .mec-event-list-standard .mec-topsec { + display: block; + } + + .mec-event-list-standard .mec-col-table-c.mec-event-image-wrap { + display: block; + width: 40%; + } + + .mec-event-list-standard .mec-col-table-c.mec-event-content-wrap { + display: block; + min-height: 230px; + } + + .mec-event-list-standard .mec-event-meta-wrap { + display: block; + border-left: none; + border-top: 1px solid #eee; + width: 100%; + float: none; + padding-top: 20px; + } +} + +@media only screen and (min-width: 480px) and (max-width: 960px) { + .mec-event-list-standard .mec-col-table-c.mec-event-image-wrap, + .mec-event-list-standard .mec-col-table-c.mec-event-content-wrap { + display: table-cell; + } +} + +@media only screen and (max-width: 479px) { + .mec-event-list-standard .mec-col-table-c.mec-event-image-wrap, + .mec-event-list-standard .mec-col-table-c.mec-event-image-wrap img { + float: none; + width: 100%; + padding: 0; + } + + .mec-event-list-standard .mec-col-table-c.mec-event-content-wrap { + padding: 10px 10px 10px 30px; + } +} + +/* Local Time + -------------------------- */ +.mec-localtime-details { + color: #777; + font-weight: 400; + line-height: 12px; + font-size: 12px; +} + +.mec-localtime-details .mec-localtitle, +.mec-localtime-details .mec-localdate, +.mec-localtime-details .mec-localtime { + display: inline-block; +} + +.mec-localtime-details .mec-start-date-label { + padding-right: 5px; +} + +.mec-localtime-details .mec-localtime { + padding-left: 5px; +} + +.mec-event-list-minimal .mec-localtime-details { + display: inline-flex; + font-size: 15px; + font-weight: 300; + line-height: 1; + letter-spacing: 0; + color: #9a9a9a; + padding-left: 9px; +} + +.mec-event-grid-clean .mec-localtime-details, +.mec-event-grid-classic .mec-localtime-details { + color: #fff; + font-weight: 400; + font-size: 11px; + text-transform: uppercase; + letter-spacing: -0.02em; + color: #fff; + padding: 0 0; + line-height: 18px; + margin-top: -3px; +} + +.tooltipster-box .mec-localtime-details, +.mec-event-grid-colorful .mec-localtime-details, +.mec-event-grid-clean .mec-localtime-details { + line-height: 22px; + padding-top: 10px; +} + +.mec-event-grid-colorful .mec-localtime-details { + color: #fff; +} + +.mec-event-grid-classic .mec-localtime-details { + text-align: center; +} + +.mec-event-grid-minimal .mec-localtime-details { + line-height: 22px; +} + +.mec-wrap .mec-yearly-view-wrap .mec-localtime-wrap i { + display: inline-block; + margin-left: -1px; +} + +.mec-timetable-t2-content .mec-local-time-details { + padding-left: 19px; +} + +.mec-timetable-t2-content .mec-local-time-details { + position: relative; +} + +.mec-timetable-t2-content .mec-local-time-details:before { + content: "\e007"; + font-family: "simple-line-icons"; + position: absolute; + font-size: 12px; + margin-right: 4px; + left: 0; +} + +.mec-masonry .mec-masonry-col6 .mec-localtime-details { + margin-top: 10px; + line-height: 21px; +} + +.mec-masonry .mec-masonry-col6 .mec-localtime-details i { + height: auto; +} + +.mec-event-cover-classic .mec-localtime-details { + color: #fff; + margin-top: 12px; +} + +.mec-event-cover-classic .mec-localtime-details i { + padding-right: 8px; +} + +.mec-event-cover-clean .mec-localtime-details { + color: #fff; + margin-bottom: 20px; +} + +.mec-event-cover-modern .mec-localtime-details { + color: #fff; + margin: 10px 0; + font-weight: 400; + font-size: 18px; +} + +.mec-event-countdown-style3 .mec-localtime-details, +.mec-event-countdown-style2 .mec-localtime-details, +.mec-event-countdown-style1 .mec-localtime-details { + color: #fff; + padding: 8px 5px 0; + font-size: 14px; + line-height: 25px; +} + +.mec-event-countdown-style1 .mec-localtime-details { + text-align: center; +} + +.mec-event-hover-carousel-type4 .mec-localtime-details { + display: block; + color: #fff; + font-size: 11px; +} + +.mec-event-footer-carousel-type3 .mec-localtime-details span, +.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localdate, +.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localtime, +.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localtitle { + display: inline-flex; + line-height: 20px; + text-align: left; + margin: 0 !important; + font-size: 12px; + color: #777; + line-height: 28px; +} + +.mec-owl-crousel-skin-type1 .mec-localtime-details { + margin-top: -7px; + margin-bottom: 12px; +} + +.mec-wrap .mec-slider-t5 .mec-localtime-details { + margin-top: 14px; + line-height: 20px; +} + +.mec-wrap .mec-slider-t5 .mec-localtime-details i { + font-size: 18px; + height: 20px; +} + +.mec-timeline-event-local-time .mec-localtime-details { + font-size: 13px; + font-weight: 500; + vertical-align: middle; + margin-left: 6px; + color: inherit; + line-height: 24px; +} + +.mec-timeline-event-local-time .mec-localtime-details i { + font-size: 17px; + vertical-align: middle; + margin-left: -7px; + padding-right: 3px; +} + +/* Register Button for Shortcodes + Modal Booking + -------------------------- */ +.mec-booking-modal { + background-color: #e6f7ff; +} + +.mec-booking-modal + .mec-booking-shortcode + .mec-book-form-gateway-label + input[type="radio"]:before { + top: -1px; +} + +.mec-modal-booking-button { + box-shadow: none; + transition: all 0.21s ease; + font-size: 11px; + font-weight: 500; + letter-spacing: 1px; + text-transform: uppercase; + background: #fff; + color: #767676; + border: 1px solid #e8e8e8; + padding: 12px 16px; + line-height: 37px; + height: 38px; + margin: 12px 0; +} + +.mec-modal-booking-button:hover { + background: #191919; + color: #fff; + border-color: #191919; +} + +.mec-modal-booking-button.mec-mb-icon i { + font-size: 14px; +} + +/* Custom Style */ +.mec-event-list-classic .mec-modal-booking-button { + height: 0; + line-height: 1; + margin: 7px 0 0; + display: inline-table; + letter-spacing: 0; + padding: 12px 14px; +} + +/* Category on Griv view Novel style */ +.mec-event-grid-novel .mec-categories-wrapper { + position: relative; + color: rgba(255, 255, 255, 0.4); + padding-left: 35px; +} + +.mec-event-grid-novel ul.mec-categories { + line-height: 30px; + font-size: 15px; +} + +.mec-event-grid-novel .mec-categories-wrapper i { + display: none; +} + +.mec-event-grid-novel ul.mec-categories li.mec-category a { + color: rgba(255, 255, 255, 0.4); + line-height: 30px; + font-size: 15px; +} + +.mec-event-grid-novel ul.mec-organizers li.mec-organizer-item span { + padding-left: 35px; + color: rgba(255, 255, 255, 0.4); + line-height: 30px; + font-size: 15px; +} + +.mec-timetable-t2-col .mec-modal-booking-button, +.mec-event-container-classic .mec-modal-booking-button, +.mec-calendar-events-side .mec-modal-booking-button, +.mec-event-grid-minimal .mec-modal-booking-button, +.mec-event-list-minimal .mec-modal-booking-button { + margin: 0; + color: #282828; + font-size: 12px; + transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + position: relative; + padding: 0 0 0 24px; + background: 0 0; + text-align: left; + display: inline; + border: 0; + font-weight: 700; +} + +.mec-timetable-t2-col .mec-modal-booking-button { + color: #fff; + padding-left: 19px; +} + +.mec-timetable-t2-col .mec-modal-booking-button:hover { + color: #282828; +} + +.mec-event-list-minimal .mec-modal-booking-button { + margin: 0 4px 0 84px; +} + +.mec-event-container-classic .mec-modal-booking-button:before, +.mec-calendar-events-side .mec-modal-booking-button:before, +.mec-event-grid-minimal .mec-modal-booking-button:before, +.mec-event-list-minimal .mec-modal-booking-button:before { + content: ""; + position: absolute; + background: #7a7272; + width: 18px; + height: 1px; + left: 0; + top: 45%; + transition: all 0.1s ease; + -webkit-transition: all 0.1s ease; +} + +.mec-skin-carousel-container .mec-modal-booking-button { + line-height: 70px; +} + +.mec-event-list-modern .mec-modal-booking-button.mec-mb-icon { + border-radius: 1px; + letter-spacing: 2px; + border: 1px solid #e6e6e6; + color: #333; + background-color: #fff; + padding: 13px 12px 13px 14px; + font-weight: 700; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); + transition: all 0.28s ease; + line-height: unset; +} + +.mec-event-list-modern .mec-modal-booking-button.mec-mb-icon:hover { + border-color: #222; + background: #222; + color: #fff; +} + +.mec-event-footer .mec-modal-booking-button { + position: absolute; + top: 20px; + right: 125px; + margin: 0; + padding: 0 16px; + line-height: 37px; + border-radius: 2px; + margin-right: 5px; +} + +.mec-skin-carousel-container + .mec-event-footer-carousel-type2 + .mec-modal-booking-button { + font-size: 12px; + line-height: 17px; + height: 41px; +} + +.mec-skin-carousel-container + .mec-event-footer-carousel-type3 + .mec-modal-booking-button { + line-height: 36px; + font-size: 12px; + padding: 0 10px; + letter-spacing: 0; + float: right; + margin: 0 5px 0 0; + height: unset; +} + +.mec-skin-carousel-container + .mec-owl-crousel-skin-type4 + .mec-modal-booking-button { + color: #fff; + background-color: #191919; + border: 2px #191919 solid; + padding: 10px 14px; + letter-spacing: 1.5px; + font-size: 11px; + font-weight: 700; + font-style: normal; + transition: all 0.22s ease; + text-decoration: none; + margin: 0 0 0 12px; +} + +.mec-skin-carousel-container + .mec-owl-crousel-skin-type4 + .mec-modal-booking-button:hover { + color: #191919; + background-color: #fff; + border: 2px #fff solid; +} + +.mec-event-grid-modern .mec-event-footer .mec-modal-booking-button { + right: auto; + left: 110px; +} + +.mec-events-agenda .mec-modal-booking-button, +.mec-event-grid-simple .mec-modal-booking-button { + margin: 0; + font-size: 12px; + transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + position: relative; + padding: 0; + background: 0 0; + text-align: left; + display: inline; + border: 0; + font-weight: 700; +} + +.mec-events-agenda .mec-modal-booking-button { + display: block; + height: unset; + padding-left: 173px; + line-height: 14px; + margin-bottom: 7px; +} + +.mec-yearly-view-wrap .mec-modal-booking-button { + margin: 0; + padding-left: 14px; + text-transform: capitalize; +} + +.mec-event-grid-novel .mec-event-footer .mec-modal-booking-button.mec-mb-icon { + right: auto; + left: 50px; + width: 36px; + height: 36px; + display: table-cell; + vertical-align: middle; + padding: 0 10px; + border-color: rgba(255, 255, 255, 0.1); + background-color: rgba(0, 0, 0, 0); + color: #fff; + border-radius: 36px; +} + +.mec-event-grid-novel + .mec-event-footer + .mec-modal-booking-button.mec-mb-icon:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.mec-events-yearlu .mec-modal-booking-button:hover, +.mec-events-agenda .mec-modal-booking-button:hover, +.mec-event-grid-simple .mec-modal-booking-button:hover { + color: #191919; +} + +.mec-event-masonry .mec-event-footer .mec-modal-booking-button { + font-size: 12px; + padding: 0 31px; + line-height: 49px; + height: 50px; + top: 0; + box-shadow: 0 5px 11px -3px rgba(0, 0, 0, 0.05); + right: auto; + left: 155px; +} + +.mec-timeline-event .mec-modal-booking-button { + position: absolute; + top: 0; + right: 0; + display: inline-block; + padding: 7px 20px 7px; + line-height: 22px; + height: unset; + border: unset; + text-transform: capitalize; + font-weight: 500; + font-size: 13px; + letter-spacing: 0; + margin: 0; + border-radius: 0 0 0 10px; +} + +.mec-timeline-event .mec-modal-booking-button:hover { + background: #191919; + color: #fff; +} + +.mec-skin-daily-view-events-container .mec-modal-booking-button, +.mec-weekly-view-dates-events .mec-event-article .mec-modal-booking-button { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 15px; + line-height: 26px; + height: 49px; + border: unset; + text-align: center; + display: inline-block; + background: #ededed; + color: #191919; + padding: 12px; + border-radius: 2px; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 2px; + transition: all 0.24s ease; + margin: 0; +} + +.mec-skin-daily-view-events-container .mec-modal-booking-button:hover, +.mec-weekly-view-dates-events + .mec-event-article + .mec-modal-booking-button:hover { + background: #292929; + color: #fff; +} + +@media (max-width: 1023px) { + .mec-skin-daily-view-events-container .mec-modal-booking-button, + .mec-weekly-view-dates-events .mec-event-article .mec-modal-booking-button { + position: relative; + top: unset; + transform: unset; + margin: 14px 16px 0; + padding: 8px; + line-height: 20px; + height: 35px; + } +} + +@media (max-width: 768px) { + .featherlight .featherlight-inner { + width: 100%; + } + + .mec-events-agenda .mec-modal-booking-button { + padding: 0; + } +} + +@media (max-width: 480px) { + .mec-booking-modal .mec-events-meta-group-booking-shortcode { + padding: 20px; + } + + .mec-booking-modal .mec-booking-shortcode .mec-book-reg-field-name, + .mec-booking-modal .mec-booking-shortcode .mec-book-reg-field-mec_email { + width: 100%; + } + + .mec-booking-modal .mec-booking-shortcode button#mec-book-form-btn-step-2 { + margin-left: 20px; + } + + .mec-booking-modal + .mec-booking-shortcode + .mec-click-pay + button[type="submit"] { + bottom: 22px; + } + + .mec-calendar-events-side .mec-modal-booking-button:before, + .mec-event-container-classic .mec-modal-booking-button:before, + .mec-event-grid-minimal .mec-modal-booking-button:before, + .mec-event-list-minimal .mec-modal-booking-button:before { + display: none; + } + + .mec-calendar-events-side .mec-modal-booking-button, + .mec-event-container-classic .mec-modal-booking-button, + .mec-event-grid-minimal .mec-modal-booking-button, + .mec-event-list-minimal .mec-modal-booking-button, + .mec-timetable-t2-col .mec-modal-booking-button { + margin: 0; + padding: 0; + } + + .mec-event-grid-modern .mec-event-footer .mec-booking-button { + top: 20px; + } +} + +/* MEC Event- Single + -------------------------- */ +.mec-wrap .mec-events-cal-links { + margin-bottom: 0; +} + +.mec-single-event #mec-wrap { + padding: 0; + margin-top: 35px; +} + +.single-mec-events .mec-wrap.mec-no-access-error h1, +.mec-wrap .mec-single-title { + margin-top: 0; + margin-bottom: 30px; + font-weight: 700; + font-size: 33px; +} + +.mec-single-event .mec-event-content { + padding: 40px 0 30px; + margin-bottom: 10px; +} + +.mec-single-event .mec-frontbox, +.mec-single-event .mec-events-meta-group-booking, +.mec-events-meta-group-booking .mec-booking-shortcode { + margin-bottom: 30px; + padding: 40px; + background: #fff; + border: 1px solid #e6e7e8; +} + +.mec-events-meta-group.mec-events-meta-group-gmap { + margin-bottom: 30px; +} + +.lity-content .mec-events-meta-group-booking { + padding: 40px; + background: #fff; + border: 1px solid #e6e7e8; +} + +.mec-single-event .mec-frontbox, +.lity-content .mec-events-meta-group-booking, +.mec-single-event .mec-events-meta-group-booking, +.mec-events-meta-group-booking .mec-booking-shortcode, +.mec-single-event .mec-events-meta-group-countdown, +.mec-single-event .mec-events-meta-group-gmap, +.mec-single-modern .mec-single-event-bar { + border-radius: 3px; + overflow: hidden; + margin-bottom: 30px; +} + +.mec-wrap #main-content { + overflow: hidden; + padding-top: 35px; +} + +.mec-single-event .mec-map-get-direction-address-cnt { + position: relative; +} + +.mec-single-event + .mec-map-get-direction-address-cnt + input.mec-map-get-direction-address { + width: 100%; + height: 46px; + padding: 13px 10px; + margin-bottom: 0; + background: #fcfcfc; + border: 1px solid #e0e0e0; + border-radius: 0; + box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.081); +} + +.mec-single-event + .mec-map-get-direction-address-cnt + input.mec-map-get-direction-address:focus { + color: #444; + background: #fff; + border-color: #b0b0b0; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); +} + +.mec-single-event .mec-map-get-direction-btn-cnt input { + width: 100%; +} + +.mec-single-event .mec-map-get-direction-reset { + position: absolute; + z-index: 2; + top: 5px; + right: 10px; + font-size: 11px; + cursor: pointer; +} + +/* Tags */ +.mec-events-meta-group-tags { + margin-top: 20px; +} + +.mec-events-meta-group-tags a { + display: inline-block; + color: #444; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1.5px; + font-weight: 500; + padding: 3px 7px; + border: 1px solid #ddd; + border-radius: 2px; + background: #fff; + margin: 1px 3px; +} + +.mec-events-meta-group-tags a:hover { + text-decoration: underline; + background: #f9f9f9; +} + +.mec-local-time-details li { + list-style: none; + font-size: 14px; + font-weight: 300; +} + +.mec-single-event:not(.mec-single-modern) .mec-local-time-details { + padding: 12px 14px 8px; + margin-bottom: 12px; + vertical-align: baseline; + position: relative; + border: none; +} + +.mec-single-event:not(.mec-single-modern) .mec-local-time-details ul { + margin: 0; + padding-left: 35px; +} + +.mec-single-event:not(.mec-single-modern) .mec-local-time-details h3 { + border: none; + padding-left: 15px; +} + +.mec-single-event:not(.mec-single-modern) .mec-local-time-details h3:before { + display: none; +} + +.mec-single-event.mec-single-modern i.mec-sl-speedometer { + display: none; +} + +.mec-single-modern .mec-local-time-details.mec-frontbox i { + display: none; +} + +/* Booking */ +.lity-content .mec-events-meta-group-booking, +.mec-single-event .mec-events-meta-group-booking, +.mec-events-meta-group-booking .mec-booking-shortcode { + z-index: 1; + overflow: visible; +} + +.lity-content + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container, +.mec-single-event + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container, +.mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container, +.lity-content + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields { + margin: 0px -41.835px; + overflow: hidden; + clear: both; +} + +.mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li { + margin-left: 41.835px; + margin-right: 41.835px; +} + +.lity-content .mec-events-meta-group-booking ul, +.mec-single-event .mec-events-meta-group-booking ul, +.mec-events-meta-group-booking .mec-booking-shortcode ul { + list-style: none; + padding-left: 0; + margin-left: 0; +} + +.lity-content + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container { + margin: 0; +} + +.lity-content + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container + .col-md-6 { + float: left; +} + +.lity-content .mec-events-meta-group-booking ul li, +.mec-single-event .mec-events-meta-group-booking ul li, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper, +.mec-events-meta-group-booking .mec-booking-shortcode ul li:not(.option), +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-ticket-variation-wrapper { + padding: 0; + list-style: none; + margin-top: 0; + margin-bottom: 30px; +} + +.lity-content .mec-events-meta-group-booking ul li.col-md-6:first-child, +.mec-single-event .mec-events-meta-group-booking ul li.col-md-6:first-child { + width: calc(50% - 10px); + margin-right: 10px; + margin-left: 0; +} + +.lity-content .mec-events-meta-group-booking ul li.col-md-6:nth-child(2), +.mec-single-event .mec-events-meta-group-booking ul li.col-md-6:nth-child(2) { + width: calc(50% - 10px); + margin-right: 0; + margin-left: 10px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-form-container + > .col-md-12, +.mec-events-meta-group-booking .mec-booking-shortcode .col-md-12, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-form-container + > .col-md-12 { + display: flex; + align-items: center; + padding: 0 0 30px 0; + margin-bottom: 30px; + border-bottom: 1px solid #f0f1f2; +} + +.lity-content + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-icon-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-icon-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .col-md-12 + .mec-ticket-icon-wrapper { + margin-right: 25px; +} + +.lity-content + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span, +.mec-single-event + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span, +.mec-events-meta-group-booking + .mec-booking-shortcode + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span { + display: block; + font-size: 14px; + font-weight: 400; + line-height: 19px; + color: #606367; + margin-bottom: 4px; +} + +.lity-content + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span.mec-ticket-price, +.mec-single-event + .mec-events-meta-group-booking + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span.mec-ticket-price, +.mec-events-meta-group-booking + .mec-booking-shortcode + .col-md-12 + .mec-ticket-name-description-wrapper + .mec-ticket-price-wrapper + span.mec-ticket-price { + font-size: 18px; + font-weight: 600; + line-height: 24px; + color: #212224; + margin: 0; +} + +.lity-content + .mec-events-meta-group-booking + [id*="mec_booking_quantity_wrapper_"], +.mec-single-event + .mec-events-meta-group-booking + [id*="mec_booking_quantity_wrapper_"], +.mec-events-meta-group-booking + .mec-booking-shortcode + [id*="mec_booking_quantity_wrapper_"] { + font-size: 13px; + font-weight: 400; + line-height: 16px; + color: #8e9195; + display: block; + margin-bottom: 5px; + text-align: end; +} + +.lity-content .mec-events-meta-group-booking .mec-first-for-all-wrapper, +.mec-single-event .mec-events-meta-group-booking .mec-first-for-all-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-first-for-all-wrapper { + clear: both; + margin-bottom: 26px; +} + +.lity-content .mec-events-meta-group-booking li h4, +.mec-single-event .mec-events-meta-group-booking li h4, +.mec-events-meta-group-booking .mec-booking-shortcode li h4 { + font-size: 19px; +} + +.lity-content .mec-events-meta-group-booking input, +.mec-single-event .mec-events-meta-group-booking input, +.mec-events-meta-group-booking .mec-booking-shortcode input, +.lity-content .mec-events-meta-group-booking button, +.mec-single-event .mec-events-meta-group-booking button, +.mec-events-meta-group-booking .mec-booking-shortcode button { + border-radius: 0; + margin-bottom: 6px; +} + +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-3, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-3, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-3 { + color: #636f72; + background: #f6f7f8; + border: 1px solid #e7e8e9; + float: left; + margin: 0; +} + +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover, +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-3:hover { + border: 1px solid #d9dadc; +} + +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2 + img.mec-svg-icon, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-2 + img.mec-svg-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-2 + img.mec-svg-icon, +.lity-content + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-3 + img.mec-svg-icon, +.mec-wrap + .mec-single-event + .mec-events-meta-group-booking + button.mec-book-form-back-button#mec-book-form-back-btn-step-3 + img.mec-svg-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + button.mec-book-form-back-button#mec-book-form-back-btn-step-3 + img.mec-svg-icon, +.mec-nextprev-prev-button svg { + margin-left: unset; + margin-right: 30px; +} + +mec-book-form-pay-button button#mec-book-form-back-btn-step-3 { + float: none; +} + +/* Booking Occurrences list */ +.mec-next-occ-booking, +.mec-next-occ-booking-p { + padding-left: 15px; +} + +/* Sell all occurrences by one booking */ +.mec-events-meta-group-booking .mec-next-occ-booking-p, +.mec-events-meta-group-booking .mec-next-occ-booking { + padding: 0; + font-size: 12px; + letter-spacing: 0; + margin: 3px 0; + padding: 5px 1em 3px 0; +} + +/* Registration */ +.mec-book-username-password-wrapper { + padding: 0 15px; +} + +.lity-container .mec-next-occ-booking, +.lity-container .mec-next-occ-booking-p { + padding-left: 0; +} + +.mec-ssl-protection-message { + display: none; +} + +/* Pay Buttons Position */ +.lity-content .mec-events-meta-group-booking .mec-click-pay, +.mec-single-event .mec-events-meta-group-booking .mec-click-pay, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay { + max-width: 100%; +} + +.lity-content + .mec-events-meta-group-booking + .mec-click-pay + #mec_woo_add_to_cart_btn_r, +.mec-single-event + .mec-events-meta-group-booking + .mec-click-pay + #mec_woo_add_to_cart_btn_r, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-click-pay + #mec_woo_add_to_cart_btn_r, +.lity-content + .mec-events-meta-group-booking + .mec-click-pay + button.mec-book-form-next-button, +.mec-single-event + .mec-events-meta-group-booking + .mec-click-pay + button.mec-book-form-next-button, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-click-pay + button.mec-book-form-next-button { + float: right; + margin: 30px 0 0 0 !important; + background: #47dc6e !important; + border-color: #47dc6e !important; + color: #fff !important; + font-weight: 700 !important; +} + +.lity-content + .mec-events-meta-group-booking + .mec-click-pay + #mec_woo_add_to_cart_btn_r:hover, +.mec-single-event + .mec-events-meta-group-booking + .mec-click-pay + #mec_woo_add_to_cart_btn_r:hover, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-click-pay + #mec_woo_add_to_cart_btn_r:hover, +.lity-content + .mec-events-meta-group-booking + .mec-click-pay + button.mec-book-form-next-button:hover, +.mec-single-event + .mec-events-meta-group-booking + .mec-click-pay + button.mec-book-form-next-button:hover, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-click-pay + button.mec-book-form-next-button:hover { + background: #54d274; +} + +.lity-container .mec-click-pay { + max-width: 400px; +} + +.lity-container .mec-click-pay #mec_woo_add_to_cart_btn_r, +.lity-container .mec-book-form-btn-wrap button.mec-book-form-next-button { + float: right; +} + +.lity-container button.mec-book-form-next-button { + float: right; +} + +.lity-container .mec-click-pay #mec_woo_add_to_cart_btn_r:hover, +.lity-container .mec-click-pay button.mec-book-form-next-button:hover { + background: #000; +} + +/* Free booking with coupon */ +.lity-content .mec-events-meta-group-booking .mec-click-next, +.mec-single-event .mec-events-meta-group-booking .mec-click-next, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-next { + float: right; + position: relative; + width: calc(100% - 186px); +} + +.lity-container .mec-click-next { + float: right; + position: relative; + width: calc(100% - 186px); +} + +.mec-single-event .mec-book-form-coupon button { + margin-left: 0; +} + +.mec-single-event .mec-book-form-gateway-checkout button { + margin-left: 0; +} + +.mec-single-event .mec-single-event .mec-book-form-gateway-checkout button { + margin-right: 20px; +} + +/* .mec-single-event button#mec-book-form-back-btn-step-3 { + margin-left: 0; +} */ + +/* MEC Progress */ +.lity-content .mec-booking-progress-bar, +.mec-booking-shortcode .mec-booking-progress-bar, +.mec-single-event .mec-booking-progress-bar, +.mec-booking-progress-bar { + display: flex; + flex-wrap: wrap; + margin: 60px 0 25px; + position: relative; + padding: 0; +} + +.lity-content .mec-booking-progress-bar li, +.mec-booking-shortcode .mec-booking-progress-bar li, +.mec-wrap .mec-booking-progress-bar li { + margin: 28px 0 15px !important; + text-align: center; + font-size: 15px; + font-weight: 700; + color: #000; + position: relative; + flex: 1; + align-items: center; + justify-content: center; + list-style: none; + z-index: 99999; +} + +.lity-content .mec-booking-progress-bar li .progress-index, +.mec-booking-shortcode .mec-booking-progress-bar li .progress-index, +.mec-wrap .mec-booking-progress-bar li .progress-index { + font-size: 14px; + font-weight: 600; + line-height: 24px; + color: var(--mec-color-skin); + position: absolute; + width: 24px; + height: 24px; + background: var(--mec-color-skin-rgba-1); + border-radius: 50%; + top: -39px; + left: calc(50% - 12px); + z-index: 1; +} + +.lity-content .mec-booking-progress-bar li.mec-active .progress-index, +.mec-booking-shortcode .mec-booking-progress-bar li.mec-active .progress-index, +.mec-wrap .mec-booking-progress-bar li.mec-active .progress-index { + background: #54d274; + border-color: #54d274; + color: #fff; +} + +.lity-content .mec-booking-progress-bar li:before, +.mec-booking-shortcode .mec-booking-progress-bar li:before, +.mec-wrap .mec-booking-progress-bar li:before { + content: ""; + position: absolute; + width: calc(50% - 12px); + height: 2px; + background: var(--mec-color-skin-rgba-1); + top: -28px; + left: 0; +} + +.lity-content .mec-booking-progress-bar li:after, +.mec-booking-shortcode .mec-booking-progress-bar li:after, +.mec-wrap .mec-booking-progress-bar li:after { + content: ""; + position: absolute; + width: calc(50% - 12px); + height: 2px; + background: var(--mec-color-skin-rgba-1); + top: -28px; + left: calc(50% + 12px); +} + +.lity-content .mec-booking-progress-bar li.mec-active, +.mec-booking-shortcode .mec-booking-progress-bar li.mec-active, +.mec-wrap .mec-booking-progress-bar li.mec-active { + color: #54d274; +} + +.lity-content .mec-booking-progress-bar li.mec-active:before, +.mec-booking-shortcode .mec-booking-progress-bar li.mec-active:before, +.mec-wrap .mec-booking-progress-bar li.mec-active:before, +.lity-content .mec-booking-progress-bar li.mec-active:after, +.mec-booking-shortcode .mec-booking-progress-bar li.mec-active:after, +.mec-wrap .mec-booking-progress-bar li.mec-active:after { + background: #54d274; +} + +.mec-single-event .row-done .mec-booking-progress-bar:after { + background: #54d274; +} + +@media (max-width: 480px) { + .lity-content .mec-booking-progress-bar li, + .mec-booking-shortcode .mec-booking-progress-bar li, + .mec-wrap .mec-booking-progress-bar li { + font-size: 12px; + } +} + +@media (max-width: 390px) { + .lity-content .mec-booking-progress-bar li, + .mec-booking-shortcode .mec-booking-progress-bar li, + .mec-wrap .mec-booking-progress-bar li { + font-size: 8px; + } + + .lity-content .mec-booking-progress-bar li.mec-active:after, + .mec-booking-shortcode .mec-booking-progress-bar li.mec-active:after, + .mec-wrap .mec-booking-progress-bar li.mec-active:after { + font-size: 14px; + } +} + +.mec-wrap .mec-booking-progress-bar li.mec-active:last-child:before { + width: 50%; +} + +.mec-booking .mec-event-tickets-list .mec-event-ticket-available { + margin-top: 12px; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + input[type="number"] { + display: block; + margin: 0 0 10px auto; + box-shadow: unset; + border: 1px solid #e3e5e7; + border-radius: 4px; + background: #fff; + min-width: 80px; + width: 80px !important; + min-height: 40px; + height: 40px; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + input::-webkit-outer-spin-button, +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-ticket-style-row-section-3 { + margin-left: auto; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-input-wrapper { + position: relative; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + input[type="number"] { + -moz-appearance: textfield; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus, +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus { + position: absolute; + right: 5px; + line-height: 1; + height: 14px; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus { + top: 5px; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus { + top: auto; + bottom: 5px; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus:hover, +.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus:hover { + background: #dbdbdb; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row a { + text-decoration: none; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row { + margin-bottom: 30px; +} + +.mec-ticket-style-row.mec-ticket-available-spots { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + align-content: stretch; + flex-wrap: nowrap; +} + +.mec-booking .mec-event-tickets-list .mec-ticket-style-row > div { + width: unset; +} + +@media (max-width: 480px) { + .mec-ticket-style-row.mec-ticket-available-spots { + max-width: 100%; + display: flex; + flex-direction: unset; + align-items: unset; + justify-content: unset; + align-content: unset; + flex-wrap: unset; + } + + .mec-wrap .mec-booking .mec-event-tickets-list .mec-ticket-style-row > div { + width: 100%; + margin-bottom: 10px; + } +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-ticket-style-row-section-1 { + width: unset; + margin: 5px 25px 0 0; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-available, +.mec-booking .mec-event-tickets-list .mec-ticket-style-row > div { + border: 0; + display: block; + box-shadow: unset; + margin: 0; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-available { + font-size: 13px; + font-weight: 400; + line-height: 16px; + color: #8e9195; + text-align: right; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-name { + font-size: 14px; + font-weight: 400; + line-height: 19px; + color: #606367; + margin-bottom: 4px; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-price { + font-size: 18px; + font-weight: 600; + line-height: 24px; + color: #212224; +} + +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-ticket-style-row-section-3 + div, +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-description, +.mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-event-ticket-price { + margin: 0; +} + +.mec-single-event .mec-book-form-price, +.mec-single-event .mec-book-form-gateways, +.mec-single-event form.mec-click-next, +.mec-single-event .mec-book-first, +.mec-single-event .mec-event-tickets-list { + padding-left: 0; + padding-right: 0; +} + +.lity-content .mec-book-first .mec-booking-calendar-wrapper, +.mec-booking-calendar-wrapper, +.mec-single-fluent-wrap .mec-booking-calendar-wrapper, +.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 30px; + margin-bottom: 30px; + border-bottom: 1px solid #f0f1f2; +} + +@media only screen and (max-width: 767px) { + .lity-content .mec-events-meta-group-booking select, + .mec-single-event .mec-events-meta-group-booking select, + .mec-events-meta-group-booking .mec-booking-shortcode select { + width: unset !important; + } +} + +@media only screen and (max-width: 479px) { + .lity-content .mec-book-first .mec-booking-calendar-wrapper, + .mec-single-event .mec-book-first .mec-booking-calendar-wrapper, + .mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper, + .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper { + flex-direction: column; + align-items: flex-start; + } + + .mec-booking + .mec-event-tickets-list + .mec-ticket-style-row + .mec-ticket-style-row-section-1 { + display: none; + } +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label { + font-size: 14px; + font-weight: 400; + color: #606367; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label + span.mec-required, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label + span.mec-required, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label + span.mec-required, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-label + span.mec-required { + color: #ec3365; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown, +.lity-content + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown, +.mec-single-event + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown, +.mec-booking-shortcode + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown { + border: 1px solid #e3e5e7; + border-radius: 3px; + max-width: 300px; + width: auto; + height: 42px; + display: flex; + background-color: #fff; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icon, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icon, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icon, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icon, +.lity-content + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + span.mec-select-date-calendar-icon, +.mec-single-event + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + span.mec-select-date-calendar-icon, +.mec-booking-shortcode + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + span.mec-select-date-calendar-icon { + display: flex; + justify-content: center; + align-items: center; + border-right: 1px solid #e3e5e7; + background: #fafafa; + min-width: 40px; +} + +.lity-content + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + .mec-custom-nice-select, +.mec-single-event + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + .mec-custom-nice-select, +.mec-booking-shortcode + .mec-book-first + .mec-select-date-dropdown-wrapper + .mec-select-date-dropdown + .mec-custom-nice-select { + margin: 0; + border: none; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + .mec-select-date-calendar-formatted-date, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + .mec-select-date-calendar-formatted-date, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + .mec-select-date-calendar-formatted-date, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + .mec-select-date-calendar-formatted-date { + font-size: 13px; + line-height: 40px; + padding: 0 12px; + width: 240px; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icons, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icons, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icons, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-dropdown + span.mec-select-date-calendar-icons { + cursor: pointer; + line-height: 33px; + position: relative; + right: 10px; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container { + position: absolute; + right: 40px; + z-index: 99; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar.mec-wrap, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar.mec-wrap, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar.mec-wrap, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar.mec-wrap { + border: 1px solid #e3e5e7; + border-radius: 5px; +} + +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.mec-single-event + .mec-book-first + .mec-select-date-express-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.lity-content + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-previous-month, +.mec-single-event + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-previous-month, +.mec-single-event + .mec-book-first + .mec-select-date-express-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-next-month, +.mec-single-fluent-wrap + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-previous-month, +.mec-booking-shortcode + .mec-book-first + .mec-booking-calendar-wrapper + .mec-select-date-calendar-container + .mec-booking-calendar-month-navigation + .mec-previous-month { + border: none; + box-shadow: none; + line-height: 40px; + margin: 0; + border-radius: 5px; + padding: 0 20px; +} + +.mec-single-event label.mec-fill-attendees { + margin-left: 0; +} + +.lity-content .mec-booking .mec-book-form-btn-wrap, +.mec-wrap .mec-booking .mec-book-form-btn-wrap { + padding-top: 30px; + border-top: 1px solid #f0f1f2; +} + +.lity-content .mec-booking .mec-book-form-btn-wrap:after, +.mec-wrap .mec-booking .mec-book-form-btn-wrap:after { + content: ""; + display: block; + clear: both; +} + +.mec-events-meta-group-booking #mec-book-form-btn-step-1, +.mec-events-meta-group-booking #mec-book-form-btn-step-2 { + margin: 0; + float: right; +} + +.mec-wrap .mec-booking-form-container .col-md-12 { + padding-left: 0; +} + +.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row { + margin: 0; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-title, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-title, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-title { + font-size: 18px; + font-weight: 600; + line-height: 24px; + color: #212224; + margin-bottom: 20px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons { + display: flex; + flex-wrap: wrap; + padding-bottom: 20px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option { + flex: calc(50% - 20px); + max-width: calc(50% - 10px); + border: 1px solid #e6e7e8; + border-radius: 3px; + margin-bottom: 20px; + padding: 14.5px 20px 14.5px 15px; + display: flex; + justify-content: flex-start; + align-items: center; + cursor: pointer; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:has(input:checked), +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:has(input:checked), +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:has(input:checked) { + border: 1px solid var(--mec-color-skin-rgba-2); +} + +@media only screen and (max-width: 767px) { + .lity-content + .mec-events-meta-group-booking + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option, + .mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option { + flex: 100%; + max-width: 100%; + } + + .lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1), + .mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1), + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1) { + margin-right: 0 !important; + } +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1), +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1), +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option:nth-child(2n + 1) { + margin-right: 20px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-svg, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-svg, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-svg { + display: flex; + margin-right: 10px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-title, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-title, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-title { + font-size: 14px; + font-weight: 600; + line-height: 18px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio { + margin-left: auto; +} + +.lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio + input, +.mec-wrap + .mec-events-meta-group-booking + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio + input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout.row + .mec-book-form-gateways + .mec-book-form-gateways-radio-buttons + .mec-book-form-gateway-option + .mec-book-form-gateway-option-radio + input { + left: -2px; +} + +.lity-content + .mec-wrap-checkout + .mec-book-form-gateways + .mec-book-form-gateway-label, +.mec-wrap + .mec-wrap-checkout + .mec-book-form-gateways + .mec-book-form-gateway-label, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout + .mec-book-form-gateways + .mec-book-form-gateway-label { + padding-left: 3px; +} + +.mec-events-progress-bar { + display: flex; + align-items: center; + margin-top: 40px; +} + +.mec-event-list-standard .mec-events-progress-bar { + position: absolute; + margin-top: 15px; + left: calc(50% - 210px); +} + +.mec-single-modern .mec-events-progress-bar { + justify-content: flex-end; + padding: 0 20px; + margin-top: 10px; +} + +.mec-events-progress-bar .mec-progress-bar-time-passed, +.mec-events-progress-bar .mec-progress-bar-time-remained { + font-size: 10px; + line-height: 14px; + margin: 0 10px 0 0; + color: #959ca7; + width: 50px; + text-align: center; +} + +.mec-events-progress-bar .mec-progress-bar-time-remained { + margin: 0 0 0 10px; +} + +.mec-events-progress-bar progress { + width: 300px; + height: 4px; + border-radius: 3px; + position: relative; +} + +.mec-events-progress-bar progress:after { + content: ""; + width: 12px; + height: 12px; + display: block; + border-radius: 100%; + background-color: #38d5ed; + position: absolute; + top: -4px; +} + +.mec-events-progress-bar progress::-webkit-progress-bar { + background-color: #e6e7e8; + border-radius: 3px; +} + +.mec-events-progress-bar progress::-webkit-progress-value { + background-color: #38d5ed; + border-radius: 3px; +} + +.lity-content .mec-events-meta-group-booking .mec-event-ticket-available, +.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-event-ticket-available { + display: block; + margin-bottom: 20px; + margin-top: -17px; + font-size: 11px; + color: #8a8a8a; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper { + display: flex; + justify-content: space-between; + margin: 30px 0 40px; +} + +@media only screen and (max-width: 767px) { + .lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper, + .mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper { + flex-direction: column; + } + + .lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input, + .mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input { + width: 100%; + } + + .lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button, + .mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + button { + left: unset !important; + right: 5px; + } +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul { + display: flex; + align-items: center; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li { + margin-bottom: 0; + text-align: right; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li { + padding-left: 30px; + margin-left: 30px; + border-left: 1px dashed #e6e7e8; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li:first-child, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li:first-child, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li:first-child { + padding-left: unset; + margin-left: unset; + border-left: none; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span { + display: block; + font-size: 14px; + font-weight: 400; + line-height: 19px; + color: #606367; + margin-bottom: 4px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span:last-child, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span:last-child, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span:last-child { + font-size: 18px; + font-weight: 600; + line-height: 24px; + color: #212224; + margin: 0; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span.mec-book-price-total, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span.mec-book-price-total, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li + span.mec-book-price-total { + font-weight: 700; +} + +@media only screen and (max-width: 767px) { + .lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, + .mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul { + margin-top: 30px; + } +} + +.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form, +.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form { + margin: 0; + position: relative; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-wrapper { + width: 330px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper { + display: flex; + border: 1px solid #e3e5e7; + border-radius: 3px; + max-width: 330px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + .mec-booking-coupon-field-icon, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + .mec-booking-coupon-field-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + .mec-booking-coupon-field-icon { + display: flex; + justify-content: center; + align-items: center; + border-right: 1px solid #e3e5e7; + background: #fafafa; + min-width: 40px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + span.mec-booking-coupon-field-wrapper + input { + border: none; + line-height: 48px; + height: unset; +} + +.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + button { + margin: 0 !important; + position: absolute !important; + top: 6px; + left: auto; + right: 6px; + padding: 9px 18px 10px !important; +} + +.lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button.loading, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button.loading, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + button.loading { + color: #ecf9fd !important; +} + +.lity-content + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button.loading:after, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-form-coupon + form + button.loading:after, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-form-coupon + form + button.loading:after { + position: absolute; + left: calc(50% - 10px); +} + +.lity-content .mec-events-meta-group-booking label, +.mec-single-event .mec-events-meta-group-booking label, +.mec-events-meta-group-booking .mec-booking-shortcode label, +.lity-content .mec-events-meta-group-booking h5, +.mec-single-event .mec-events-meta-group-booking h5, +.mec-events-meta-group-booking .mec-booking-shortcode h5 { + color: #606367; + font-size: 14px; + font-weight: 400; + line-height: 19px; + letter-spacing: 0; + margin: 0 0 4px 0; + display: block; + clear: none; + padding: 0 1em 5px 0; +} + +.lity-content .mec-events-meta-group-booking h5 span, +.mec-single-event .mec-events-meta-group-booking h5 span, +.mec-events-meta-group-booking .mec-booking-shortcode h5 span { + display: inline-block; +} + +.lity-content .mec-events-meta-group-booking h5 span.mec-ticket-variation-name, +.mec-single-event + .mec-events-meta-group-booking + h5 + span.mec-ticket-variation-name, +.mec-events-meta-group-booking + .mec-booking-shortcode + h5 + span.mec-ticket-variation-name { + padding-right: 5px; + text-transform: capitalize; +} + +.lity-content .mec-events-meta-group-booking input::-webkit-input-placeholder, +.mec-single-event + .mec-events-meta-group-booking + input::-webkit-input-placeholder, +.mec-events-meta-group-booking + .mec-booking-shortcode + input::-webkit-input-placeholder { + color: #aaa; +} + +.lity-content .mec-events-meta-group-booking input:-moz-placeholder, +.mec-single-event .mec-events-meta-group-booking input:-moz-placeholder, +.mec-events-meta-group-booking .mec-booking-shortcode input:-moz-placeholder { + color: #aaa; +} + +.lity-content .mec-events-meta-group-booking input[type="text"], +.mec-single-event .mec-events-meta-group-booking input[type="text"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="text"], +.lity-content .mec-events-meta-group-booking input[type="date"], +.mec-single-event .mec-events-meta-group-booking input[type="date"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="date"], +.lity-content .mec-events-meta-group-booking input[type="number"], +.mec-single-event .mec-events-meta-group-booking input[type="number"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="number"], +.lity-content .mec-events-meta-group-booking input[type="email"], +.mec-single-event .mec-events-meta-group-booking input[type="email"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="email"], +.lity-content .mec-events-meta-group-booking input[type="password"], +.mec-single-event .mec-events-meta-group-booking input[type="password"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="password"], +.lity-content .mec-events-meta-group-booking input[type="tel"], +.mec-single-event .mec-events-meta-group-booking input[type="tel"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="tel"], +.lity-content .mec-events-meta-group-booking textarea, +.mec-single-event .mec-events-meta-group-booking textarea, +.mec-events-meta-group-booking .mec-booking-shortcode textarea, +.lity-content .mec-events-meta-group-booking select, +.mec-single-event .mec-events-meta-group-booking select, +.mec-events-meta-group-booking .mec-booking-shortcode select { + display: block; + background: #fff; + min-height: 40px; + min-width: 180px; + font-size: 13px; + line-height: 38px; + color: #606367; + border: 1px solid #e3e5e7; + border-radius: 3px; + padding: 0 12px; + width: 100%; + margin-bottom: 0; + box-shadow: unset; + clear: both; +} + +.lity-content + .mec-events-meta-group-booking + select:not(#mec_paypal_credit_card_card_type), +.mec-single-event + .mec-events-meta-group-booking + select:not(#mec_paypal_credit_card_card_type), +.mec-events-meta-group-booking + .mec-booking-shortcode + select:not(#mec_paypal_credit_card_card_type) { + width: 100%; + -webkit-appearance: none; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMS40MjQiIGhlaWdodD0iNi40MiIgdmlld0JveD0iMCAwIDExLjQyNCA2LjQyIj4NCiAgPGcgaWQ9Ikdyb3VwXzY1NjI3IiBkYXRhLW5hbWU9Ikdyb3VwIDY1NjI3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjIxMiAwLjIxMikiPg0KICAgIDxwYXRoIGlkPSJhbmdsZS1sZWZ0IiBkPSJNLjk5LDUuNWw1LDUuMDA1LS41LjVMMCw1LjUsNS41LDAsNiwuNS45OSw1LjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDUuOTk1KSByb3RhdGUoLTkwKSIgZmlsbD0iIzYzNmY3MiIgc3Ryb2tlPSIjNjM2ZjcyIiBzdHJva2Utd2lkdGg9IjAuMyIvPg0KICA8L2c+DQo8L3N2Zz4NCg=="); + background-position: calc(100% - 12px) center; + background-repeat: no-repeat; +} + +.mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li { + width: calc(100% - 83.665px); + float: left; +} + +.lity-content .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-ticket-variation-wrapper { + width: 100%; +} + +.lity-content + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields + li { + width: 50%; + float: left; +} + +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields + li, +.mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li:first-child, +.mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li:nth-child(2), +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li { + width: calc(50% - 83.665px); +} + +.lity-content + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields { + padding-top: 20px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li.mec-paypal-credit-card-expiration-date-month + select, +.mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li.mec-paypal-credit-card-expiration-date-month + select, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields + li.mec-paypal-credit-card-expiration-date-month + select { + width: calc(50% - 24px) !important; + display: inline-block; + min-width: unset; +} + +@media only screen and (max-width: 768px) { + .mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li:first-child, + .lity-content + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li:nth-child(2n + 1), + .mec-single-event + .mec-events-meta-group-booking + .mec-paypal-credit-card-payment-fields + li:nth-child(2n + 1), + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-paypal-credit-card-payment-fields + li:nth-child(2n + 1), + .mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li:nth-child(2) { + width: calc(100% - 83.665px); + max-width: unset; + } + + .lity-content + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container + li + input, + .lity-content + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper + input, + .mec-single-event + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container + li + input, + .mec-single-event + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper + input, + .mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li + input, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-ticket-variation-wrapper + input { + max-width: unset !important; + } + + .lity-content + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container + li:nth-child(2n) + input, + .lity-content + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper:nth-child(2n) + input, + .mec-single-event + .mec-events-meta-group-booking + ul.mec-book-tickets-reg-fields-container + li:nth-child(2n) + input, + .mec-single-event + .mec-events-meta-group-booking + .mec-book-ticket-variation-wrapper:nth-child(2n) + input, + .mec-events-meta-group-booking + .mec-booking-shortcode + ul.mec-book-tickets-reg-fields-container + li:nth-child(2n) + input, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-book-ticket-variation-wrapper:nth-child(2n) + input { + margin-left: 0px; + } +} + +.wbmec-mandatory { + padding-left: 5px; + font-size: 14px; + color: red; +} + +.lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-email-field-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-email-field-wrapper, +.lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-name-field-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-name-field-wrapper, +.lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper, +.mec-single-event + .mec-events-meta-group-booking + .mec-stripe-name-and-email-wrapper, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-stripe-name-and-email-wrapper, +.lity-content .mec-events-meta-group-booking .mec-field-wrapper, +.mec-single-event .mec-events-meta-group-booking .mec-field-wrapper, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper { + display: flex; + align-items: flex-start; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-email-field-wrapper + span.mec-booking-email-field-icon, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-email-field-wrapper + span.mec-booking-email-field-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-email-field-wrapper + span.mec-booking-email-field-icon, +.lity-content + .mec-events-meta-group-booking + .mec-booking-name-field-wrapper + span.mec-booking-name-field-icon, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-name-field-wrapper + span.mec-booking-name-field-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-name-field-wrapper + span.mec-booking-name-field-icon, +.lity-content + .mec-events-meta-group-booking + .mec-stripe-name-and-email-wrapper + span.mec-booking-email-field-icon, +.mec-single-event + .mec-events-meta-group-booking + .mec-stripe-name-and-email-wrapper + span.mec-booking-email-field-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-stripe-name-and-email-wrapper + span.mec-booking-email-field-icon, +.lity-content + .mec-events-meta-group-booking + .mec-field-wrapper + span.mec-field-icon, +.mec-single-event + .mec-events-meta-group-booking + .mec-field-wrapper + span.mec-field-icon, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-field-wrapper + span.mec-field-icon { + border: 1px solid #e3e5e7; + background: #fafafa; + border-radius: 3px 0 0 3px; + min-width: 40px; + height: 40px; + display: flex; + justify-content: center; + align-items: center; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-email-field-wrapper + input, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-email-field-wrapper + input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-email-field-wrapper + input, +.lity-content + .mec-events-meta-group-booking + .mec-stripe-name-and-email-wrapper + input, +.mec-single-event + .mec-events-meta-group-booking + .mec-stripe-name-and-email-wrapper + input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-stripe-name-and-email-wrapper + input { + border-left: none; + border-radius: 0 3px 3px 0; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-name-field-wrapper + input, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-name-field-wrapper + input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-name-field-wrapper + input, +.lity-content .mec-events-meta-group-booking .mec-field-wrapper input, +.mec-single-event .mec-events-meta-group-booking .mec-field-wrapper input, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper input { + border-left: none; + border-radius: 0 3px 3px 0; +} + +.lity-content .mec-events-meta-group-booking .mec-red-notification input, +.mec-single-event .mec-events-meta-group-booking .mec-red-notification input, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-red-notification + input, +.lity-content .mec-events-meta-group-booking .mec-red-notification textarea, +.mec-single-event .mec-events-meta-group-booking .mec-red-notification textarea, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-red-notification + textarea, +.lity-content .mec-events-meta-group-booking .mec-red-notification select, +.mec-single-event .mec-events-meta-group-booking .mec-red-notification select, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-red-notification + select { + border: 1px solid #ff3c3c !important; +} + +.mec-single-event + .mec-events-meta-group-booking + .mec-red-notification + input[type="radio"], +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-red-notification + input[type="radio"], +.mec-single-event + .mec-events-meta-group-booking + .mec-red-notification + input[type="checkbox"], +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-red-notification + input[type="checkbox"], +.lity-content + .mec-events-meta-group-booking + .mec-red-notification + input[type="checkbox"], +.lity-content + .mec-events-meta-group-booking + .mec-red-notification + input[type="radio"] { + outline: 1px solid #ff3c3c !important; +} + +/* Modal booking - required forms */ +.lity-content .mec-book-ticket-container .mec-red-notification input, +.lity-content .mec-book-ticket-container .mec-red-notification select, +.lity-content .mec-book-ticket-container .mec-red-notification textarea { + border: 1px solid #ff3c3c !important; +} + +.mec-booking .woocommerce-notices-wrapper .woocommerce-message { + color: #089740; + background-color: #effdef; + margin: 0; + line-height: 40px; + border: 0; + border-radius: 5px; +} + +.mec-booking .woocommerce-notices-wrapper .woocommerce-message a { + margin: 0; +} + +@media only screen and (max-width: 479px) { + .lity-content .mec-events-meta-group-booking input[type="text"], + .mec-single-event .mec-events-meta-group-booking input[type="text"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="text"], + .lity-content .mec-events-meta-group-booking input[type="date"], + .mec-single-event .mec-events-meta-group-booking input[type="date"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="date"], + .lity-content .mec-events-meta-group-booking input[type="number"], + .mec-single-event .mec-events-meta-group-booking input[type="number"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="number"], + .lity-content .mec-events-meta-group-booking input[type="email"], + .mec-single-event .mec-events-meta-group-booking input[type="email"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="email"], + .lity-content .mec-events-meta-group-booking input[type="password"], + .mec-single-event .mec-events-meta-group-booking input[type="password"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="password"], + .lity-content .mec-events-meta-group-booking input[type="tel"], + .mec-single-event .mec-events-meta-group-booking input[type="tel"], + .mec-events-meta-group-booking .mec-booking-shortcode input[type="tel"], + .lity-content .mec-events-meta-group-booking textarea, + .mec-single-event .mec-events-meta-group-booking textarea, + .mec-events-meta-group-booking .mec-booking-shortcode textarea, + .lity-content .mec-events-meta-group-booking select, + .mec-single-event .mec-events-meta-group-booking select, + .mec-events-meta-group-booking .mec-booking-shortcode select { + width: 100%; + } + + .lity-content .mec-events-meta-group-booking, + .mec-single-event .mec-events-meta-group-booking, + .mec-events-meta-group-booking .mec-booking-shortcode { + padding: 20px 10px; + } +} + +.lity-content .mec-events-meta-group-booking input[type="text"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="text"]:focus, +.mec-events-meta-group-booking .mec-booking-shortcode input[type="text"]:focus, +.lity-content .mec-events-meta-group-booking input[type="number"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="number"]:focus, +.mec-events-meta-group-booking .mec-booking-shortcodec, +.lity-content .mec-events-meta-group-booking input[type="number"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="number"]:focus, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="number"]:focus, +.lity-content .mec-events-meta-group-booking input[type="email"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="email"]:focus, +.mec-events-meta-group-booking .mec-booking-shortcode input[type="email"]:focus, +.lity-content .mec-events-meta-group-booking input[type="password"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="password"]:focus, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="password"]:focus, +.lity-content .mec-events-meta-group-booking input[type="tel"]:focus, +.mec-single-event .mec-events-meta-group-booking input[type="tel"]:focus, +.mec-events-meta-group-booking .mec-booking-shortcode input[type="tel"]:focus, +.lity-content .mec-events-meta-group-booking textarea:focus, +.mec-single-event .mec-events-meta-group-booking textarea:focus, +.mec-events-meta-group-booking .mec-booking-shortcode textarea:focus, +.lity-content .mec-events-meta-group-booking select:focus, +.mec-single-event .mec-events-meta-group-booking select:focus, +.mec-events-meta-group-booking .mec-booking-shortcode select:focus { + outline: none; +} + +.lity-content .mec-events-meta-group-booking input[type="checkbox"], +.mec-single-event .mec-events-meta-group-booking input[type="checkbox"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="checkbox"], +.lity-content .mec-events-meta-group-booking input[type="radio"], +.mec-single-event .mec-events-meta-group-booking input[type="radio"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="radio"] { + margin-right: 6px; + margin-top: 5px; + min-height: 20px; + clear: none; + margin: 0; +} + +.lity-content .mec-events-meta-group-booking input[type="radio"]:before, +.mec-single-event .mec-events-meta-group-booking input[type="radio"]:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="radio"]:before, +.lity-container .mec-events-meta-group-booking input[type="radio"]:before { + content: ""; + display: inline-block; + background: #fff; + border-radius: 50%; + width: 18px; + height: 18px; + cursor: pointer; + border: 2px solid #e1e7ed; + position: absolute; + top: -2px; + left: -2px; +} + +.mec-single-event + .mec-events-meta-group-booking + input[type="radio"]:checked:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="radio"]:checked:before, +.lity-container + .mec-events-meta-group-booking + input[type="radio"]:checked:before { + background: #38d5ed; + border: 4px solid #fff; + box-shadow: 0 0 0 2px #afebf5; + width: 14px; + height: 14px; + top: 0px; + left: 0px; +} + +.lity-content .mec-events-meta-group-booking input[type="radio"], +.mec-single-event .mec-events-meta-group-booking input[type="radio"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="radio"], +.lity-container .mec-events-meta-group-booking input[type="radio"] { + min-height: 0; + margin: 0; + position: relative; + top: 3px; + left: 3px; + width: 14px; + height: 14px; +} + +.lity-content .mec-events-meta-group-booking input[type="checkbox"], +.mec-single-event .mec-events-meta-group-booking input[type="checkbox"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="checkbox"] { + float: left; +} + +.mec-events-meta-group-booking ul.mec-book-price-details { + list-style: none; + padding: 0; + overflow: hidden; + display: flex; + align-items: center; +} + +.mec-events-meta-group-booking ul.mec-book-price-details li { + list-style: none; + margin: 0; + border-right: 1px dashed #e6e7e8; + padding-right: 30px !important; + margin-right: 30px; + text-align: center; +} + +.mec-events-meta-group-booking + ul.mec-book-price-details + li.mec-book-price-detail.mec-book-price-detail-type-tickets { + display: flex; + align-items: center; +} + +.mec-events-meta-group-booking ul.mec-book-price-details li span { + display: block; + font-size: 14px; + font-weight: 400; + line-height: 19px; + color: #606367; + margin-bottom: 4px; +} + +.mec-events-meta-group-booking + ul.mec-book-price-details + li + span.mec-book-price-detail-icon { + margin: 0 30px 0 0; + width: 48px; +} + +.mec-events-meta-group-booking + ul.mec-book-price-details + li + span.mec-book-price-detail-amount { + font-size: 18px; + font-weight: 600; + line-height: 24px; + color: #212224; + margin-bottom: 0; +} + +.mec-events-meta-group-booking ul.mec-book-price-details li:last-child { + border-right: none; +} + +@media only screen and (max-width: 767px) { + .mec-events-meta-group-booking ul.mec-book-price-details { + flex-direction: column; + } + + .mec-events-meta-group-booking ul.mec-book-price-details li { + border-right: none; + padding-right: 0 !important; + margin-right: 0; + border-bottom: 1px dashed #e6e7e8; + padding-bottom: 30px !important; + margin-bottom: 30px; + } + + .lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, + .mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul { + flex-direction: column; + } + + .lity-content + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, + .mec-single-event + .mec-events-meta-group-booking + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li, + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-checkout-coupon-total-wrapper + .mec-booking-checkout-total-wrapper + ul + li { + padding-left: 0; + margin-left: 0; + border-left: none; + padding-bottom: 30px; + margin-bottom: 30px; + border-bottom: 1px dashed #e6e7e8; + } +} + +.lity-content .mec-events-meta-group-booking .mec_book_first_for_all, +.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all, +.mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all, +.lity-container .mec-events-meta-group-booking .mec_book_first_for_all, +.lity-content .mec-events-meta-group-booking input[type="checkbox"], +.mec-single-event .mec-events-meta-group-booking input[type="checkbox"], +.mec-events-meta-group-booking .mec-booking-shortcode input[type="checkbox"], +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"], +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes + input[type="checkbox"], +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"], +.mec-booking input[type="checkbox"], +.mec-wrap .mec-simple-checkboxes-search ul li label input[type="checkbox"] { + -webkit-appearance: none; + appearance: none; + font: inherit; + width: 20px; + height: 20px; + min-height: unset; + padding: 0; + border: 1px solid #e3e5e7; + border-radius: 4px; + display: flex; + margin: 0 10px 0 1px; + overflow: hidden; +} + +.lity-content .mec-events-meta-group-booking .mec_book_first_for_all:before, +.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec_book_first_for_all:before, +.lity-container .mec-events-meta-group-booking .mec_book_first_for_all:before, +.lity-content .mec-events-meta-group-booking input[type="checkbox"]:before, +.mec-single-event .mec-events-meta-group-booking input[type="checkbox"]:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="checkbox"]:before, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes + input[type="checkbox"]:before, +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:before, +.mec-booking input[type="checkbox"]:before, +.mec-wrap + .mec-simple-checkboxes-search + ul + li + label + input[type="checkbox"]:before { + content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTAgOCI+DQogIDxwYXRoIGlkPSJEb25lIiBkPSJNOS4xNzUsMGEuOC44LDAsMCwwLS42NjUuMzA2bC01LjIsNS42NDdMMS4zODgsMy44MzNhLjcuNywwLDAsMC0uNjczLS4yMTIsMS4zODIsMS4zODIsMCwwLDAtLjcuNy44NjIuODYyLDAsMCwwLC4yMjYuNzI0TDIuNzk1LDcuNzkxYS43OTIuNzkyLDAsMCwwLDEuMDYyLjAxTDkuNzY5LDEuMzI5QS44MzIuODMyLDAsMCwwLDkuOTYuNTIxLDEsMSwwLDAsMCw5LjE3NSwwWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo="); + min-width: 18px; + height: auto; + line-height: 16px; + border-radius: 2px; + transform: scale(0); + transition: 120ms transform ease-in-out; + background-color: var(--mec-color-skin); + display: flex; + justify-content: center; +} + +.mec-single-event + .mec-events-meta-group-booking + .mec_book_first_for_all:checked, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec_book_first_for_all:checked, +.lity-container .mec-events-meta-group-booking .mec_book_first_for_all:checked, +.lity-content .mec-events-meta-group-booking input[type="checkbox"]:checked, +.mec-single-event .mec-events-meta-group-booking input[type="checkbox"]:checked, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="checkbox"]:checked, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked, +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked, +.mec-booking input[type="checkbox"]:checked, +.mec-wrap + .mec-simple-checkboxes-search + ul + li + label + input[type="checkbox"]:checked { + border: 1px solid var(--mec-color-skin) !important; +} + +.mec-single-event + .mec-events-meta-group-booking + .mec_book_first_for_all:checked:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec_book_first_for_all:checked:before, +.lity-container + .mec-events-meta-group-booking + .mec_book_first_for_all:checked:before, +.mec-single-event + .mec-events-meta-group-booking + input[type="checkbox"]:checked:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="checkbox"]:checked:before, +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked:before, +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"]:checked:before, +.mec-booking input[type="checkbox"]:checked:before, +.mec-wrap + .mec-simple-checkboxes-search + ul + li + label + input[type="checkbox"]:checked:before { + transform: scale(1); +} + +.lity-content .mec-events-meta-group-booking label.wn-checkbox-label, +.mec-single-event .mec-events-meta-group-booking label.wn-checkbox-label, +.mec-events-meta-group-booking .mec-booking-shortcode label.wn-checkbox-label, +.lity-container .mec-events-meta-group-booking label.wn-checkbox-label { + display: none; +} + +.mec-single-event a.button:after, +.lity-content .mec-events-meta-group-booking button[type="submit"]:after, +.mec-single-event .mec-events-meta-group-booking button[type="submit"]:after, +.mec-events-meta-group-booking + .mec-booking-shortcode + button[type="submit"]:after, +.mec-wrap .mec-events-meta-group-booking button[type="submit"]:after { + display: none; + font-family: "simple-line-icons"; + content: "\e098"; + margin-left: 4px; + -webkit-animation: rotating 1.2s linear infinite; + -moz-animation: rotating 1.2s linear infinite; + -ms-animation: rotating 1.2s linear infinite; + -o-animation: rotating 1.2s linear infinite; + animation: rotating 1.2s linear infinite; +} + +.mec-single-event a.button.loading:after, +.lity-content + .mec-events-meta-group-booking + button[type="submit"].loading:after, +.mec-single-event + .mec-events-meta-group-booking + button[type="submit"].loading:after, +.mec-events-meta-group-booking + .mec-booking-shortcode + button[type="submit"].loading:after, +.mec-wrap .mec-events-meta-group-booking button[type="submit"].loading:after { + display: inline-block; +} + +.mec-single-event .mec-event-export-module { + display: block; +} + +.mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul { + display: table; + width: 100%; +} + +.mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li { + display: table-cell; +} + +.mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li:last-child { + text-align: right; +} + +.mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a:hover { + color: #fff; +} + +.mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul { + padding-left: 0; + margin: 15px 5px; +} + +.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting { + padding-left: 0; + margin: 0; +} + +.mec-ticket-price { + margin-left: 10px; + font-size: 13px; + font-weight: 300; +} + +.mec-book-reg-field-checkbox label, +.mec-book-reg-field-radio label { + line-height: 1.36; +} + +.mec-book-reg-field-checkbox input[type="checkbox"] { + float: left; + margin-right: 10px !important; +} + +.mec-book-reg-field-radio input[type="radio"] { + float: left; + margin-right: 12px !important; +} + +.mec-book-ticket-container .wbmec-mandatory, +.mec-book-ticket-container .mec-reg-mandatory:nth-child(2) label:after, +.mec-book-ticket-container .mec-reg-mandatory:nth-child(3) label:after { + content: ""; + color: red; + width: 50px; + height: 50px; + font-size: 14px; + padding-left: 5px; +} + +@media only screen and (max-width: 767px) { + .mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li { + width: 100%; + min-height: 40px; + margin-bottom: 15px; + text-align: center; + float: none; + display: block; + } + + .mec-single-event + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a { + width: 100%; + padding-left: 0; + padding-right: 0; + text-align: center; + display: block; + font-size: 12px; + } +} + +@media only screen and (max-width: 767px) { + .lity-content + .mec-events-meta-group-booking + .mec-single-event + .mec-events-meta-group-booking, + .mec-events-meta-group-booking .mec-booking-shortcode { + margin-bottom: 30px; + } +} + +.mec-single-modern .col-md-4 .mec-sponsors-details h3, +.mec-sponsors-details .mec-events-single-section-title, +.mec-single-event .mec-event-meta h3, +.mec-single-event .mec-event-meta dt { + text-transform: uppercase; + font-size: 16px; + font-weight: bold; + padding-bottom: 5px; + display: inline; + color: #000; + padding-left: 10px; +} + +.mec-single-event-sponsor span, +.mec-single-event .mec-event-meta h6 { + font-size: 14px; + padding-bottom: 5px; + display: inline-block; + color: #8d8d8d; + margin: 0; + padding: 0; +} + +.mec-single-event .mec-event-meta dd, +.mec-single-event .mec-event-meta .mec-events-event-categories a { + font-size: 14px; + color: #8d8d8d; +} + +.mec-single-event .mec-event-meta .mec-location dd.author { + color: #3c3b3b; +} + +.mec-single-event .mec-event-meta dd { + margin: 0; + padding-left: 35px; +} + +.mec-single-event .mec-event-meta dd.mec-events-event-categories { + min-height: 35px; + line-height: 35px; +} + +/* Fix booking modal */ +@media only screen and (max-width: 480px) { + .single-mec-events .lity-container { + width: 100%; + } + + .single-mec-events .lity-content .mec-events-meta-group-booking { + padding: 20px; + width: 85%; + margin: 0 auto; + } +} + +/*.mec-single-event .mec-event-meta dd.mec-events-event-categories:before { font-family: 'FontAwesome'; color: #40d9f1;font-size: 16px; content: "\f105"; padding: 10px; padding-left: 0; }*/ +.mec-single-event .mec-event-meta dd.mec-events-event-categories:first-of-type { + padding-top: 5px; +} + +.mec-single-event .mec-event-meta dd.mec-events-event-categories:last-of-type { + border-bottom: 0; +} + +.mec-single-event .mec-event-meta dd a { + color: #8d8d8d; + transition: all 0.2s ease; + -ms-word-wrap: break-word; + word-wrap: break-word; +} + +.mec-single-event .mec-event-meta dd a i:before { + font-size: 16px !important; +} + +.mec-single-event .mec-event-meta dd a i { + margin-right: 8px; +} + +.mec-single-event .mec-event-meta dl { + margin-bottom: 0; +} + +.mec-single-event .mec-event-meta .mec-events-event-cost { + font-size: 14px; + font-weight: 300; +} + +.mec-single-event .mec-event-meta .mec-events-address .mec-address, +.mec-single-event .mec-event-meta .mec-location-opening-hour span, +.mec-single-event .mec-event-meta .mec-location-url span { + font-size: 12px; + color: #a9a9a9; + display: block; +} + +.mec-single-event .mec-event-meta .mec-location-opening-hour, +.mec-single-event .mec-event-meta .mec-location-url, +.mec-single-event .mec-event-meta .mec-location-tel { + margin-top: 10px; +} + +.mec-single-event .mec-event-meta .mec-location-description { + margin-top: 15px; + padding: 0; +} + +.mec-single-event .mec-event-meta .mec-events-meta-group-venue .author { + margin-bottom: 0; + color: #8d8d8d; + font-size: 13px; +} + +.mec-single-event .mec-events-event-image { + margin-bottom: 0; +} + +.mec-single-event .mec-events-event-image img { + border-radius: 5px; + max-width: 100%; + height: auto; +} + +.mec-event-gallery-wrapper { + display: flex; + flex-direction: row; +} + +.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper { + min-width: 90px; + margin-right: 30px; +} + +.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul { + list-style: none; + padding: 0; +} + +.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li { + display: flex; + margin-bottom: 15px; + cursor: pointer; +} + +.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li img { + width: 90px; + border-radius: 5px; +} + +.mec-event-gallery-wrapper .mec-event-gallery-image img { + border-radius: 5px; +} + +@media (max-width: 960px) { + .mec-event-gallery-wrapper { + flex-direction: column-reverse; + } + + .mec-event-gallery-wrapper .mec-event-gallery-image { + margin-bottom: 10px; + } + + .mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper { + margin-right: 0; + } + + .mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul { + display: flex; + flex-flow: row wrap; + } + + .mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li { + margin-bottom: 15px; + margin-right: 15px; + flex: 1 1 calc(15% - 20px); + } +} + +#mec-event-gallery ul#mec_meta_box_event_gallery { + display: flex; + flex-flow: row wrap; + list-style: none; + padding: 0; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li { + flex: 0 1 calc(33.333333% - 10px); + margin-right: 10px; + position: relative; +} + +#mec-event-gallery ul#mec_meta_box_event_gallery li img { + width: 100% !important; + height: 75px; + object-fit: cover; +} + +#mec-event-gallery + ul#mec_meta_box_event_gallery + li + span.mec-event-gallery-delete { + padding: 0; + min-height: 20px; + height: 20px; + width: 20px; + margin: 0; + border-radius: 50%; + position: absolute; + top: 2px; + right: 2px; + box-shadow: none; + background: #fff; + border-color: #e3e4e5; + font-size: 0px; + cursor: pointer; + transition: 0.2s; +} + +#mec-event-gallery + ul#mec_meta_box_event_gallery + li + span.mec-event-gallery-delete:before { + content: ""; + width: 20px; + height: 20px; + display: block; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZWE2NDg1Ij48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg=="); + background-position: center; +} + +#mec-event-gallery + ul#mec_meta_box_event_gallery + li + span.mec-event-gallery-delete:hover { + color: #fff; + border-color: #ea6485; + background: #ea6485; +} + +#mec-event-gallery + ul#mec_meta_box_event_gallery + li + span.mec-event-gallery-delete:hover:before { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZmZmZmZmIj48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg=="); +} + +.mec-single-event h2.mec-single-event-title { + margin-bottom: 30px; + font-weight: 700; + font-size: 33px; +} + +.mec-single-event .mec-booking-button { + border-bottom: none; + letter-spacing: 0.5px; + line-height: 48px; + height: 76px; + transition: all 0.5s ease; + color: #fff; + padding: 16px; + display: block; + text-align: center; + font-size: 16px; + border-radius: 2px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); +} + +.mec-single-event .mec-booking-button:hover { + background-color: #101010 !important; +} + +.mec-single-event .mec-event-tags a { + display: inline-block; + color: #444; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1.5px; + font-weight: 500; + padding: 3px 7px; + border: 1px solid #ddd; + border-radius: 2px; + background: #fff; + margin: 1px 3px; +} + +.mec-single-event .mec-event-tags:before { + font-size: 24px; + color: #303030; + margin-right: 5px; + content: "\f02c"; + font-family: fontawesome; +} + +.mec-single-event .mec-event-tags { + padding-top: 13px; +} + +.mec-single-event .mec-event-sharing { + margin: 30px 0 10px; +} + +.mec-single-event .mec-street-address, +.mec-region.mec-events-abbr { + font-style: normal; + font-size: 13px; +} + +.mec-single-event-date:before, +.mec-single-event-time:before, +.mec-events-meta-group.mec-events-meta-group-venue:before { + color: #40d9f1; +} + +.mec-single-event .mec-event-social { + text-align: center; +} + +.mec-single-event .mec-event-social h3 { + text-transform: uppercase; + font-size: 15px; + font-weight: bold; + padding-bottom: 5px; + color: #313131; + border-bottom: 4px solid #ebebeb; + width: 100%; + display: block; + padding-bottom: 10px; + position: relative; +} + +.mec-single-event .mec-social-single:before { + padding: 13px 35px; + border-bottom: 4px solid #40d9f1; + font-size: 6px; + content: ""; + text-align: center; + position: absolute; + bottom: -4px; + margin-left: 39px; +} + +.mec-single-event .mec-event-social .event-sharing { + margin-top: 30px; +} + +.mec-single-event .mec-event-social ul { + list-style: none; + margin-left: 0; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; +} + +.mec-single-event .mec-event-social li.mec-event-social-icon { + display: inline-block; +} + +.mec-single-event .mec-event-social li.mec-event-social-icon a { + display: inline-block; + color: #fff; + width: 40px; + height: 40px; + padding: 6px; + font-size: 18px; + margin-right: 5px; + margin-bottom: 5px; + border-radius: 2px; +} + +.mec-single-event .mec-event-social a.facebook { + background: #3b5996; +} + +.mec-single-event .mec-event-social a.facebook:hover { + background: #28385c; +} + +.mec-single-event .mec-event-social a.twitter svg { + width: 22px; + height: 22px; + margin-top: 0px; + padding: 0; +} + +.mec-single-event .mec-event-social a.twitter { + background: #e1e1e1; + padding: 9px !important; +} + +.mec-single-event .mec-event-social a.twitter:hover { + background: #e1e1e1; +} + +.mec-single-event .mec-event-social a.twitter:hover { + background: #373737; +} + +.mec-single-event .mec-event-social a.twitter:hover svg path { + fill: #fff; +} + +.mec-single-event .mec-event-social a.vimeo { + background: #0dadd6; +} + +.mec-single-event .mec-event-social a.vimeo:hover { + background: #0a85a3; +} + +.mec-single-event .mec-event-social a.dribble { + background: #d53e68; +} + +.mec-single-event .mec-event-social a.dribble:hover { + background: #bf4c78; +} + +.mec-single-event .mec-event-social a.youtube { + background: #cb322c; +} + +.mec-single-event .mec-event-social a.youtube:hover { + background: #992622; +} + +.mec-single-event .mec-event-social a.pinterest { + background: #cb2027; +} + +.mec-single-event .mec-event-social a.pinterest:hover { + background: #99181d; +} + +.mec-single-event .mec-event-social a.google { + background: #c3391c; +} + +.mec-single-event .mec-event-social a.google:hover { + background: #99181f; +} + +.mec-single-event .mec-event-social a.linkedin { + background: #0073b2; +} + +.mec-single-event .mec-event-social a.linkedin:hover { + background: #005380; +} + +.mec-single-event .mec-event-social a.email { + background: #ff5d5e; +} + +.mec-single-event .mec-event-social a.email:hover { + background: #cc4949; +} + +.mec-single-event .mec-event-social a.vk { + background: #5b88bd; +} + +.mec-single-event .mec-event-social a.vk:hover { + background: #3d608a; +} + +.mec-single-event .mec-event-social a.tumblr { + background: #34465d; +} + +.mec-single-event .mec-event-social a.tumblr:hover { + background: #273649; +} + +.mec-single-event .mec-event-social a.telegram { + background: #0088cc; +} + +.mec-single-event .mec-event-social a.telegram:hover { + background: rgb(16, 118, 190); +} + +.mec-single-event .mec-event-social a.whatsapp { + background: #25d366; +} + +.mec-single-event .mec-event-social a.whatsapp:hover { + background: #23ac55; +} + +.mec-single-event .mec-event-social a.flipboard { + background: #e12828; +} + +.mec-single-event .mec-event-social a.flipboard:hover { + background: #af1e1e; +} + +.mec-single-event .mec-event-social a.pocket { + background: #ef4056; +} + +.mec-single-event .mec-event-social a.pocket:hover { + background: #8d1717; +} + +.mec-single-event .mec-event-social a.reddit { + background: #ff5700; +} + +.mec-single-event .mec-event-social a.reddit:hover { + background: #c94909; +} + +.mec-single-event .mec-event-social a.telegram svg, +.mec-single-event .mec-event-social a.flipboard svg { + height: 18px; + margin-top: 5px; +} + +.mec-single-event .mec-event-social li.mec-event-social-icon a svg { + display: unset; +} + +.mec-single-event .mec-event-social a.rss { + background: #f29a1d; +} + +.mec-single-event .mec-event-social a.rss:hover { + background: #cc7400; +} + +.mec-single-event .mec-event-social a.instagram { + background: #457399; +} + +.mec-single-event .mec-event-social a.instagram:hover { + background: #2e4d66; +} + +.mec-single-event .mec-event-social a.linkedin { + background: #457399; +} + +.mec-single-event .mec-event-social a.linkedin:hover { + background: #2e4d66; +} + +.mec-single-event .mec-event-social a.other-social { + background: #ff5d5e; +} + +.mec-single-event .mec-event-social a.other-social:hover { + background: #cc4949; +} + +.mec-single-event .mec-event-social { + text-align: center; +} + +.lity-content .mec-events-meta-group-booking form, +.mec-single-event .mec-events-meta-group-booking form, +.mec-events-meta-group-booking .mec-booking-shortcode form, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout { + margin: 0; +} + +.mec-single-event .mec-frontbox-title, +.mec-single-event .mec-wrap-checkout h4, +.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4, +.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4, +.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout h4, +.lity-content .mec-events-meta-group-booking form > h4, +.mec-single-event .mec-events-meta-group-booking form > h4, +.mec-events-meta-group-booking .mec-booking-shortcode form > h4 { + text-transform: uppercase; + font-size: 15px; + font-weight: bold; + color: #313131; + border-bottom: 4px solid #ebebeb; + width: 100%; + display: block; + padding-bottom: 10px; + position: relative; + text-align: center; + margin: 0 0 40px 0; +} + +.mec-single-event .mec-frontbox-title:before, +.mec-single-event .mec-wrap-checkout h4:before, +.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4:before, +.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout + h4:before, +.lity-content .mec-events-meta-group-booking form > h4:before, +.mec-single-event .mec-events-meta-group-booking form > h4:before, +.mec-events-meta-group-booking .mec-booking-shortcode form > h4:before { + padding: 1px 35px; + border-bottom: 4px solid #40d9f1; + font-size: 6px; + content: ""; + text-align: center; + position: absolute; + bottom: -4px; + margin-left: -35px; + left: 50%; +} + +.lity-content .mec-events-meta-group-booking input[data-stripe="exp-month"], +.mec-single-event .mec-events-meta-group-booking input[data-stripe="exp-month"], +.mec-events-meta-group-booking + .mec-booking-shortcode + input[data-stripe="exp-month"], +.lity-content .mec-events-meta-group-booking input[data-stripe="exp-year"], +.mec-single-event .mec-events-meta-group-booking input[data-stripe="exp-year"], +.mec-events-meta-group-booking + .mec-booking-shortcode + input[data-stripe="exp-year"] { + width: 47% !important; + margin-right: 12px; + margin-top: 5px; + display: inline-block !important; +} + +@media (max-width: 768px) { + .mec-single-event + .mec-events-meta-group-booking + input[data-stripe="exp-month"], + .mec-events-meta-group-booking + .mec-booking-shortcode + input[data-stripe="exp-month"], + .mec-single-event + .mec-events-meta-group-booking + input[data-stripe="exp-year"], + .mec-events-meta-group-booking + .mec-booking-shortcode + input[data-stripe="exp-year"] { + width: 100% !important; + margin-right: 0; + display: block !important; + } +} + +/* Booking Checkboxes */ +.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes, +.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes { + margin-bottom: 22px; +} + +.mec-single-event + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + label, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-booking-dates-checkboxes + label, +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + label { + margin-bottom: 3px; + line-height: 20px; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + label { + display: flex; +} + +.lity-content + .mec-events-meta-group-booking + .mec-booking-dates-checkboxes + input[type="checkbox"] { + margin-top: -1px; +} + +.mec-events-meta-group-booking-shortcode .mec-booking-dates-checkboxes label { + display: flex; + align-items: center; +} + +.mec-events-meta-group-booking-shortcode + .mec-booking-dates-checkboxes + input[type="checkbox"] { + margin-top: 1px; +} + +.mec-event-meta i:before { + font-size: 20px !important; + vertical-align: middle; +} + +.mec-event-meta .mec-single-event-organizer dl dd i:before, +.mec-event-meta .mec-single-event-additional-organizers dl dd i:before, +.mec-event-meta .mec-single-event-location dl dd i:before { + font-size: 14px !important; +} + +#mec-wrap .mec-events-day-time-slot .mec-events-content { + float: left; + width: 33%; + padding: 0 15px; +} + +#mec-wrap .mec-events-day-time-slot .mec-events-event-image { + padding-left: 0; +} + +#mec-events-content .mec-events-abbr { + color: #8d8d8d; + font-size: 14px; +} + +.mec-single-event .mec-events-content { + margin-bottom: 30px; +} + +.mec-single-event .mec-organizer-url a { + word-wrap: break-word; +} + +.mec-single-event #headline { + margin: 0 0 10px; +} + +.mec-single-event #headline h2 { + padding: 0; +} + +.mec-single-event + .mec-events-meta-group.mec-events-meta-group-gmap + .mec-events-venue-map { + margin-top: 0; + padding: 8px; + border: 1px solid #e5e5e5; + border-radius: 7px; +} + +#mec-events-gmap-0 { + height: 325px !important; +} + +.mec-events-list .mec-events-day-time-slot .mec-events-event-meta { + width: 33%; + float: left; + padding: 40px; + height: auto; + margin: 0; +} + +.mec-events-day-time-slot .mec-events-content.description.entry-summary { + font-size: 15px; + font-weight: 300; + color: #8d8d8d; +} + +.mec-events-day-time-slot .type-mec_events h2 { + font-size: 28px; + padding-bottom: 20px; +} + +.mec-events-day .mec-events-day-time-slot .type-mec_events { + margin: 0; +} + +.mec-events-day .mec-events-day-time-slot h5 { + background-color: #8d8d8d; +} + +.mec-single-event + .mec-event-meta + .mec-single-event-organizer + .mec-events-single-section-title, +.mec-single-event + .mec-event-meta + .mec-single-event-additional-organizers + .mec-events-single-section-title, +.mec-single-event .mec-events-meta-date h3, +.mec-single-event + .mec-event-meta + .mec-single-event-location + .mec-events-single-section-title, +.mec-single-event + .mec-event-meta + .mec-single-event-additional-locations + .mec-events-single-section-title { + padding: 0 0 5px 10px; + margin-top: 0; + display: inline-block; +} + +.mec-events-single-section-title a span { + font-size: 12px; +} + +.mec-single-event-additional-locations .mec-single-event-location { + padding: 0; +} + +.mec-single-event .mec-events-meta-date h3 { + width: 100%; +} + +.mec-single-event .mec-events-event-image { + border: 0; +} + +.mec-single-event .mec-events-venue-map { + padding: 0; +} + +.mec-single-event-date, +.mec-single-event-time, +.mec-single-event-location, +.mec-single-event-additional-locations, +.mec-single-event-category, +.mec-single-event-sponsor, +.mec-single-event-label, +.mec-single-event-sponsor, +.mec-single-event-organizer, +.mec-single-event-additional-organizers, +.mec-events-meta-date, +.mec-event-cost, +.mec-event-website, +.mec-event-more-info, +.mec-local-time-details { + padding: 12px 14px 8px; + margin-bottom: 12px; + vertical-align: baseline; + position: relative; +} + +.mec-single-event-sponsor ul { + margin: 0; + padding: 0; + list-style: none; +} + +.mec-single-event-sponsor ul li { + margin-bottom: 35px; +} + +.mec-single-event-sponsor ul li:last-child { + margin-bottom: 0; +} + +.mec-wrap .mec-single-modern .col-md-4 .mec-sponsors-details h3, +.mec-wrap .mec-single-event-sponsor h3 { + padding: 0 0 20px 0; + margin: 0; + display: block; +} + +.mec-single-event .mec-single-event-organizer dd, +.mec-single-event .mec-single-event-additional-organizers dd, +.mec-single-event .mec-events-meta-date dd { + padding-left: 0; + margin-bottom: 10px; +} + +.mec-single-event .mec-single-event-location dd { + padding-left: 0; +} + +.mec-single-event .mec-single-event-location dd.author > a { + font-size: 16px; + font-weight: 300; +} + +.mec-single-event .mec-event-meta dd.mec-organizer-email a, +.mec-single-event .mec-single-event-organizer dd span, +.mec-single-event .mec-single-event-additional-organizers dd span, +.mec-single-event .mec-events-meta-date dd span, +.mec-single-event .mec-single-event-location dd span { + display: block; + padding-left: 0px; + color: #8d8d8d; +} + +.mec-single-event .mec-events-meta-date i, +.mec-single-event .mec-single-event-additional-organizers i, +.mec-single-event .mec-single-event-location dl dd i, +.mec-single-event .mec-single-event-organizer dl dd i { + margin-right: 10px; + margin-left: 12px; +} + +.mec-events-meta-group.mec-events-meta-group-venue dl { + margin-bottom: 0; +} + +address.mec-events-address { + line-height: 19px; + font-style: normal; + font-size: 12px; +} + +.mec-single-event .mec-event-content dt { + margin-top: 5px; +} + +.mec-single-event + .mec-single-event-additional-organizers + .mec-single-event-additional-organizer { + margin-bottom: 15px; + padding-bottom: 5px; +} + +.mec-single-event + .mec-single-event-additional-organizers + .mec-single-event-additional-organizer:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +.mec-event-category-color { + width: 9px; + height: 9px; + display: inline-block; + vertical-align: middle; + margin: 0 0 0 4px; + border-radius: 9px; +} + +/* Hourly Schedule */ +.mec-event-schedule-content { + border-left: 4px solid #f0f0f0; + padding-top: 10px; + margin-top: 30px; + margin-left: 25px; + margin-bottom: 20px; + color: #8a8a8a; +} + +.mec-event-schedule-content dl { + padding-left: 24px; + font-size: 12px; + position: relative; + margin-bottom: 35px; +} + +.mec-event-schedule-content dl:before { + content: ""; + display: block; + position: absolute; + left: 0; + top: 4px; + width: 20px; + height: 0; + border-top: 4px solid #f0f0f0; +} + +.mec-event-schedule-content dl dt { + margin: 0 0 10px; + line-height: 1.16; +} + +.mec-event-schedule-content dl dt.mec-schedule-title { + font-size: 13px; + color: #5a5a5a; + font-weight: 700; +} + +.mec-event-schedule-content dl dt.mec-schedule-description { + font-weight: 300; +} + +.mec-event-schedule-content .mec-schedule-speakers { + padding: 10px; +} + +.mec-wrap .mec-event-schedule-content h6 { + font-size: 13px; + color: #5a5a5a; + font-weight: 700; + display: inline-block; +} + +.mec-wrap .mec-event-schedule-content a { + font-weight: 400; + color: #5a5a5a; + transition: all 0.1s ease; +} + +/* Speaker Widget */ +.single-mec-events .mec-speakers-details ul { + padding: 0; + margin-left: 0; +} + +.mec-single-event .mec-speakers-details ul li { + list-style: none; + padding: 5px 5px 18px 5px; + margin-top: 14px; +} + +.mec-single-event .mec-speakers-details ul li a { + -webkit-transition: 0.2s all ease; + transition: 0.2s all ease; +} + +.mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a img { + float: left; + border-radius: 50%; + transition: 0.2s all ease; + border: 2px solid transparent; + width: 68px; + height: 68px; + object-fit: cover; +} + +.mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a:hover img { + border-color: #40d9f1; +} + +.mec-single-event .mec-speakers-details .speaker-details { + display: inline-block; +} + +.mec-single-event .mec-speakers-details ul li .mec-speaker-name { + display: inline-block; + margin-top: 10px; + font-size: 15px; + line-height: 1.8; + text-transform: capitalize; + font-weight: 700 !important; + padding-left: 8px; +} + +.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title { + display: block; + font-size: 12px; + margin-top: -1px; + padding-left: 8px; + color: #888; +} + +/* Location */ +.mec-sponsor img, +.mec-single-event-location img, +.mec-single-event-organizer img, +.mec-single-event-additional-organizers img { + margin-bottom: 5px; + width: 100%; +} + +.mec-qrcode-details { + text-align: center; +} + +/* time */ +.mec-time-comment { + font-size: 11px; +} + +/* buddy */ +.mec-wrap .mec-attendees-list-details p { + font-weight: 300; + margin: 20px 0 0 0; + color: #8d8d8d; +} + +.mec-wrap .mec-attendees-list-details li { + list-style: none; + display: block; + margin-top: 15px; +} + +.mec-wrap .mec-attendees-list-details li .mec-attendee-avatar { + display: inline-block; +} + +.mec-wrap .mec-attendees-list-details li .mec-attendee-profile-link { + display: inline-block; + vertical-align: top; + margin-left: 10px; +} + +.mec-attendees-list-details ul { + margin-bottom: 0; +} + +.mec-attendees-list-details .mec-attendee-profile-link a { + color: #8d8d8d; + display: block; +} + +.mec-attendees-list-details .mec-attendee-profile-link span { + display: inline-block; + color: #000; + vertical-align: middle; + cursor: pointer; +} + +.mec-attendees-list-details span.mec-attendee-profile-ticket-number { + border-radius: 50px; + width: 20px; + height: 20px; + font-size: 12px; + text-align: center; + color: #fff; + margin-right: 4px; + line-height: 20px; +} + +#wrap .mec-attendees-list-details span.mec-attendee-profile-ticket-number { + line-height: 19px; +} + +.mec-attendees-list-details .mec-attendee-profile-link span i { + vertical-align: middle; + font-size: 9px; + font-weight: bold; + margin-left: 5px; +} + +.mec-attendees-list-details .mec-attendees-toggle { + border: 1px solid #e6e6e6; + background: #fafafa; + padding: 15px 15px 0; + border-radius: 3px; + margin: 12px 0 20px 52px; + position: relative; + font-size: 13px; + box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.02); +} + +.mec-attendees-list-details .mec-attendees-toggle:before, +.mec-attendees-list-details .mec-attendees-toggle:after { + content: ""; + display: block; + position: absolute; + left: 50px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px; +} + +.mec-attendees-list-details .mec-attendees-toggle:after { + top: -20px; + border-color: transparent transparent #fafafa transparent; +} + +.mec-attendees-list-details .mec-attendees-toggle:before { + top: -21px; + border-color: transparent transparent #e1e1e1 transparent; +} + +.mec-attendees-list-details .mec-attendees-toggle .mec-attendees-item { + padding-bottom: 15px; +} + +.mec-attendees-list-details .mec-attendee-avatar img { + border-radius: 3px; +} + +.mec-attendee-avatar-sec { + float: left; + width: 50px; + margin-right: 12px; +} + +.mec-attendee-profile-name-sec, +.mec-attendee-profile-ticket-sec { + float: left; + width: calc(100% - 62px); + margin-top: 3px; +} + +/* MEC Events Calendar Clean + ----------------------------------------- */ +.mec-calendar { + margin-bottom: 20px; + border: 1px solid #e8e8e8; + width: 100%; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-calendar .mec-calendar-topsec { + display: table; + background: #fff; +} + +.mec-calendar .mec-calendar-topsec .mec-calendar-side .mec-calendar-table { + border-top: 1px solid #eaeaea; +} + +.mec-calendar .mec-calendar-topsec .mec-calendar-events-sec { + display: none; +} + +.mec-calendar .mec-calendar-side { + width: 590px; + display: table-cell; + padding: 40px; + position: relative; + text-align: center; + box-shadow: 0 1px 5px 6px rgba(0, 0, 0, 0.005) inset; +} + +.mec-calendar .mec-calendar-events-side { + display: table-cell; + height: 100%; + border-left: 1px solid #efefef; + padding: 40px; + width: 100%; +} + +.mec-calendar .mec-calendar-events-side .mec-table-side-day { + width: 46px; + height: 46px; + margin: 0 auto 20px; + position: relative; + text-align: center; + line-height: 44px; + border: 1px solid #40d9f1; + border-radius: 50%; + font-size: 14px; + font-weight: 600; + padding: 0; +} + +.mec-calendar .mec-calendar-events-side .mec-table-side-title { + text-align: center; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 3px; + margin-bottom: 14px; +} + +.mec-calendar .mec-calendar-header { + position: relative; + width: 560px; + margin-top: 8px; + margin-bottom: 16px; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-header { + width: unset; +} + +.mec-calendar .mec-calendar-header h2 { + text-transform: uppercase; + font-size: 22px; + font-weight: 700; + color: #333; +} + +.mec-calendar .mec-event-footer { + width: auto; + min-height: 60px; +} + +.mec-calendar dl { + display: table; + margin: 0; + border: none; + padding: 0; + table-layout: fixed; +} + +.mec-calendar dt { + display: table-cell; + transition: all 0.66s ease; + color: #a4aab1; + background: #fff; + border-radius: 44px; + font-size: 14px; + width: 80px; + height: 80px; + line-height: 80px; + text-align: center; +} + +/* Fix MEC Calendars on the Neve theme */ +.excerpt-wrap .mec-wrap dt, +.nv-content-wrap .mec-wrap dt { + display: table-cell; +} + +.mec-calendar .mec-calendar-table .mec-no-event { + display: none; +} + +.mec-calendar .mec-calendar-table-head dt { + font-weight: 600; + text-transform: uppercase; + font-size: 15px; + color: #636f72; +} + +.mec-calendar .mec-calendar-row dt:hover { + background: #f4f4f4; +} + +.mec-calendar .mec-table-nullday { + color: #cacaca; +} + +.mec-calendar.mec-box-calendar .mec-table-nullday:last-child { + border-right: 1px solid #eaeaea; +} + +.mec-calendar .mec-prev-month:hover, +.mec-calendar .mec-next-month:hover { + background: #f4f4f4; +} + +.mec-calendar .mec-selected-day, +.mec-calendar .mec-selected-day:hover { + background: #40d9f1; + color: #fff; +} + +.mec-calendar .mec-selected-day a { + color: #fff; +} + +.mec-calendar .mec-has-event { + position: relative; +} + +.mec-calendar .mec-calendar-row dt.mec-has-event:hover { + background: #40d9f1; +} + +.mec-calendar .mec-has-event a { + cursor: pointer; + display: block; + width: 100%; + height: 100%; + border-radius: 50%; + color: #4d4d4d; + transition: all 0.25s ease; + text-decoration: none; + box-shadow: none; +} + +.mec-calendar .mec-calendar-row dt.mec-has-event:hover a, +.mec-calendar .mec-calendar-row dt.mec-has-event.mec-selected-day a { + color: #fff; +} + +.mec-calendar .mec-has-event:after { + background-color: #40d9f1; + border-radius: 50%; + display: block; + content: ""; + width: 8px; + height: 8px; + bottom: 10px; + left: calc(50% - 4px); + position: absolute; + transition: all 0.25s ease; +} + +.mec-calendar .mec-calendar-row dt.mec-has-event:hover:after { + background-color: #fff; +} + +.mec-calendar .mec-has-event.mec-selected-day:after { + display: none; +} + +.mec-calendar .mec-event-article { + display: flex; + text-align: left; + margin-bottom: 0; + padding-bottom: 25px; + padding-top: 26px; + border-top: 1px solid #efefef; + transition: all 0.33s ease; +} + +@media only screen and (max-width: 479px) { + .mec-calendar.mec-calendar-weekly .mec-event-article, + .mec-calendar.mec-calendar-daily .mec-event-artile { + flex-direction: column; + gap: 15px; + } +} + +.mec-weekly-contents-wrapper, +.mec-daily-contents-wrapper { + display: flex; +} + +.mec-calendar .mec-month-side .mec-event-article { + padding-left: 5px; + padding-right: 5px; +} + +.mec-calendar .mec-event-article:hover { + background-color: #fafafa; +} + +.mec-calendar .mec-event-article .mec-event-time { + font-size: 11px; + line-height: 1.1; + margin: 0; +} + +.mec-calendar .mec-event-article .mec-event-title { + font-size: 13px; + padding: 0; + margin: 10px 0 8px; + font-weight: 700; + text-transform: uppercase; +} + +.mec-calendar .mec-event-article .mec-event-title a { + text-decoration: none; + color: #494949; + transition: color 0.3s ease; +} + +.mec-calendar .mec-event-article .mec-event-title a:hover { + color: #40d9f1; +} + +.mec-calendar .mec-event-list-classic .mec-event-image img { + width: 65px; + height: auto; +} + +.mec-calendar .mec-event-article .mec-event-image { + max-width: 70px; + margin-right: 15px; + height: auto; +} + +.mec-calendar .mec-event-article .mec-localtime-details div, +.mec-calendar .mec-event-article .mec-event-detail, +.mec-calendar .mec-event-article .mec-categories-wrapper, +.mec-calendar + .mec-event-article + .mec-categories-wrapper + ul.mec-categories + li.mec-category + a, +.mec-calendar .mec-event-article .mec-shortcode-organizers, +.mec-calendar + .mec-event-article + .mec-shortcode-organizers + .mec-organizer-item + span { + font-size: 13px; + line-height: 1.3; + color: #9a9a9a; + margin-bottom: 0; +} + +.mec-calendar .mec-calendar-side .mec-previous-month, +.mec-calendar .mec-calendar-side .mec-next-month { + cursor: pointer; + position: absolute; + top: 0; + min-width: 50px; + height: 50px; + line-height: 50px; + text-align: center; + background: #fff; + color: #a9a9a9; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + padding-left: 10px; + padding-right: 10px; + border: 1px solid #efefef; + border-top: none; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.015); + transition: all 0.33s ease; +} + +.mec-calendar .mec-calendar-side .mec-previous-month i, +.mec-calendar .mec-calendar-side .mec-next-month i { + font-size: 12px; + color: #40d9f1; + cursor: pointer; +} + +.mec-calendar .mec-calendar-side .mec-previous-month:hover, +.mec-calendar .mec-calendar-side .mec-next-month:hover { + background-color: #f9f9f9; + color: #40d9f1; +} + +.mec-calendar .mec-calendar-side .mec-previous-month { + left: 0; + border-bottom-right-radius: 6px; + border-left: none; +} + +.mec-calendar .mec-calendar-side .mec-next-month { + right: 0; + border-bottom-left-radius: 6px; + border-right: none; +} + +/* Page with sidebar fix */ +@media only screen and (min-width: 961px) { + .mec-wrap.mec-sm959 + .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) + .mec-has-event:after { + width: 6px; + height: 6px; + bottom: 6px; + } + + .mec-wrap.mec-sm959 + .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) + .mec-calendar-side { + width: 370px; + } + + .mec-wrap.mec-sm959 + .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) + .mec-calendar-header { + position: relative; + width: 350px; + margin-top: 30px; + margin-bottom: 20px; + padding-top: 20px; + } + + .mec-wrap.mec-sm959 + .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) + dt { + width: 50px; + height: 50px; + line-height: 50px; + } +} + +@media only screen and (max-width: 1200px) { + .mec-calendar .mec-has-event:after { + width: 6px; + height: 6px; + bottom: 6px; + } + + .mec-calendar .mec-calendar-side { + width: 370px; + } + + .mec-calendar .mec-calendar-header { + position: relative; + width: 350px; + margin-top: 30px; + } + + .mec-calendar dt { + width: 50px; + height: 50px; + line-height: 50px; + } +} + +@media only screen and (max-width: 767px) { + .mec-calendar .mec-calendar-header h2 { + font-size: 18px; + } + + .mec-calendar .mec-calendar-topsec { + width: 100%; + } + + .mec-calendar .mec-calendar-side { + width: 100%; + display: block; + padding: 30px; + } + + .mec-calendar .mec-calendar-header { + width: auto; + } + + .mec-calendar .mec-calendar-events-side { + width: 100%; + display: block; + height: 100%; + border-left: none; + border-top: 1px solid #efefef; + padding: 20px; + } + + .mec-calendar dl { + width: 100%; + } + + .mec-calendar dt { + width: 14%; + height: 60px; + line-height: 60px; + border-radius: 50px; + } +} + +@media only screen and (max-width: 479px) { + .mec-calendar .mec-has-event:after { + width: 4px; + height: 4px; + } + + .mec-calendar .mec-calendar-header h2 { + font-size: 16px; + margin-top: 33px; + } + + .mec-calendar dt { + height: 38px; + line-height: 38px; + } + + .mec-calendar .mec-event-list-classic .mec-event-title, + .mec-calendar .mec-event-list-classic .mec-event-detail { + font-size: 12px; + } + + .mec-calendar .mec-event-list-classic .mec-event-time { + font-size: 10px; + } +} + +/* MEC Events Calendar Modern + --------------------------------------------- */ +.mec-box-calendar.mec-calendar .mec-has-event a, +.mec-box-calendar.mec-calendar dt { + border-radius: 0; +} + +.mec-box-calendar.mec-calendar .mec-calendar-header { + margin-top: 2px; + margin-bottom: 30px; +} + +.mec-box-calendar.mec-calendar dt { + border-bottom: 1px solid #eaeaea; + border-left: 1px solid #eaeaea; +} + +.mec-box-calendar.mec-calendar dl dt:last-child { + border-right: 1px solid #eaeaea; +} + +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month, +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + border-radius: 2px; + top: 40px; + border: 1px solid #eee; + height: 30px; + line-height: 30px; + z-index: 1; +} + +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month { + left: 40px; +} + +.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + right: 40px; +} + +.mec-box-calendar.mec-calendar .mec-calendar-side { + box-shadow: none; +} + +.mec-box-calendar.mec-calendar .mec-calendar-events-side { + border: none; +} + +.mec-box-calendar.mec-calendar .mec-calendar-events-side .mec-table-side-day { + border-radius: 2px; +} + +.mec-box-calendar.mec-calendar h4.mec-month-label { + position: relative; + width: 560px; + margin-top: 2px; + margin-bottom: 30px; + text-transform: uppercase; + font-size: 22px; + font-weight: 700; + color: #333; +} + +.mec-widget .mec-box-calendar.mec-calendar h4.mec-month-label { + width: 100%; + margin-top: 8px; + font-size: 13px; +} + +@media only screen and (max-width: 1200px) { + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month { + left: 42px; + } + + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + right: 42px; + } + + .mec-calendar .mec-calendar-header h2 { + font-size: 17px; + margin-top: 7px; + } +} + +@media only screen and (max-width: 767px) { + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month, + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + top: 28px; + font-size: 10px; + } + + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month { + left: 30px; + } + + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + right: 30px; + } + + .mec-calendar .mec-calendar-header h2 { + font-size: 15px; + } +} + +@media only screen and (max-width: 479px) { + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month, + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + font-size: 0; + padding: 4px 8px; + text-align: center; + min-width: 33px; + } + + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month { + left: 10px; + } + + .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + right: 10px; + } +} + +/* MEC Events Calendar Classic + ------------------------------------------------ */ +.mec-calendar.mec-event-calendar-classic, +.mec-calendar.mec-event-calendar-classic .mec-calendar-side { + border: none; + padding: 0; + width: 100%; + height: 100%; + box-shadow: none; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-side { + display: block; +} + +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head, +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-row { + width: 100%; +} + +.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head { + background: #f5f6f7; +} + +.mec-calendar.mec-event-calendar-classic + dl.mec-calendar-table-head + .mec-calendar-day-head { + background: transparent; + height: unset; + line-height: 36px; + border-top-width: 1px; + border-top-style: solid; + border-top-color: #eaeaea; +} + +.mec-calendar.mec-event-calendar-classic dl dt { + width: 15%; + height: 136px; + line-height: 1.2; + text-align: left; + padding: 5px 7px; + position: relative; +} + +.mec-box-calendar.mec-calendar.mec-event-calendar-classic + .mec-calendar-side + .mec-previous-month, +.mec-box-calendar.mec-calendar.mec-event-calendar-classic + .mec-calendar-side + .mec-next-month { + top: 0; +} + +.mec-calendar.mec-event-calendar-classic .mec-has-event:after { + bottom: auto; + top: 24px; + left: 7px; + margin: 0; +} + +.mec-box-calendar.mec-calendar.mec-event-calendar-classic + .mec-calendar-side + .mec-previous-month { + left: 0; +} + +.mec-box-calendar.mec-calendar.mec-event-calendar-classic + .mec-calendar-side + .mec-next-month { + right: 0; +} + +/* Shortcode next previous link disable for accessibility*/ +.mec-next-month a, +.mec-previous-month a { + pointer-events: none; + line-height: 15px; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec { + text-align: left; + background: #fafafa; + border: 1px solid #eaeaea; + border-top: none; + padding: 10px 20px; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec { + display: none; +} + +.mec-calendar.mec-event-calendar-classic + .mec-calendar-events-sec + .mec-event-article:hover { + background-color: #fcfcfc; +} + +.mec-calendar.mec-event-calendar-classic .mec-selected-day, +.mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover { + color: #40d9f1; + font-weight: 700; + background: #fafafa; + border-bottom: none; +} + +.mec-wrap + .mec-calendar.mec-event-calendar-classic:not(.mec-event-container-simple) + .mec-selected-day:hover { + color: #fff !important; +} + +.mec-calendar.mec-event-calendar-classic + .mec-calendar-events-sec + .mec-table-side-title, +.mec-calendar.mec-event-calendar-classic + .mec-calendar-events-sec + .mec-table-side-day { + display: inline-block; + margin: 0; + margin-bottom: 15px; + font-weight: 700; +} + +.mec-calendar.mec-event-calendar-classic + .mec-calendar-events-sec + .mec-table-side-day { + margin-left: 4px; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-row dt.mec-has-event a { + color: #4d4d4d; +} + +.mec-calendar.mec-event-calendar-classic + .mec-calendar-row + dt.mec-has-event:not(.mec-selected-day):hover + a { + color: #fff; +} + +@media only screen and (max-width: 1200px) { + .mec-calendar.mec-event-calendar-classic dl dt { + height: 100px; + } +} + +@media only screen and (max-width: 767px) { + .mec-calendar.mec-event-calendar-classic dl dt { + height: 40px; + } +} + +@media only screen and (max-width: 479px) { + .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec { + padding: 10px; + } +} + +/* Monthly Calendar/Novel + ------------------------------------------------ */ +.mec-calendar .mec-event-article.mec-single-event-novel { + padding: 4px 8px; + min-height: 25px; + margin: 0 -3px; + border-radius: 0; + display: block; +} + +.mec-calendar .mec-event-article.mec-single-event-novel h4 { + margin: 0; + font-size: 13px; + line-height: 1.5; + font-weight: 500; + text-transform: capitalize; + margin: 0 0 2px 0; +} + +.mec-calendar + .mec-event-article.mec-single-event-novel + .mec-shortcode-organizers + i, +.mec-calendar + .mec-event-article.mec-single-event-novel + .mec-shortcode-organizers + ul + li + span { + color: #000; +} + +.mec-calendar.mec-event-container-novel dl dt { + padding: 3px; +} + +.mec-calendar.mec-event-calendar-classic .mec-calendar-novel-selected-day { + display: inline-block; + padding: 4px; + margin-left: 1px; +} + +.mec-wrap .mec-calendar.mec-event-container-novel .mec-selected-day:hover { + color: #fff !important; +} + +.mec-calendar.mec-event-calendar-classic + .mec-selected-day + .mec-calendar-novel-selected-day { + color: #fff; +} + +.mec-calendar.mec-event-calendar-classic.mec-event-container-novel + .mec-selected-day, +.mec-calendar.mec-event-calendar-classic.mec-event-container-novel + dt.mec-selected-day:hover { + border-bottom: 1px solid #eaeaea; +} + +.mec-calendar.mec-event-calendar-classic.mec-event-container-novel + .mec-calendar-side + .mec-calendar-table { + min-height: auto; +} + +.mec-single-event-novel.light h4 { + color: #000 !important; +} + +.mec-single-event-novel.dark h4 { + color: #fff !important; +} + +@media only screen and (max-width: 768px) { + .mec-calendar .mec-event-article.mec-single-event-novel { + padding: 2px; + min-height: 5px; + } + + .mec-calendar .mec-event-article.mec-single-event-novel h4 { + display: block; + font-size: 13px; + } +} + +@media only screen and (max-width: 480px) { + .mec-calendar .mec-event-article.mec-single-event-novel h4 { + font-size: 11px; + } +} + +/* Monthly Calendar/Simple + ------------------------------------------------ */ +.mec-event-container-simple .event-single-content-simple { + display: none; +} + +.mec-event-calendar-classic.mec-event-container-simple + .mec-calendar-side + .mec-calendar-table { + min-height: unset; +} + +.mec-event-container-simple .mec-monthly-tooltip h4 { + font-size: 13px; + font-weight: 500; + margin: 0; + color: #444; +} + +.mec-event-container-simple .mec-monthly-tooltip h4:hover { + text-decoration: underline; + color: #111; +} + +.mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple { + border-bottom: 1px dashed #e3e3e3; + padding: 5px 2px; + display: block; +} + +.mec-event-container-simple + .simple-skin-ended:nth-last-of-type(2) + .mec-monthly-tooltip.event-single-link-simple { + border-bottom: none; +} + +.mec-event-container-simple + .mec-calendar-day + .ended-relative:nth-last-child(1 of .ended-relative) + .mec-monthly-tooltip.event-single-link-simple { + border: none; +} + +.mec-calendar.mec-event-container-simple dl dt.mec-calendar-day { + font-size: 30px; + color: #000; +} + +.mec-calendar.mec-event-container-simple .mec-calendar-row dt:hover { + background: unset; +} + +.mec-calendar.mec-event-container-simple .mec-calendar-row dt, +.mec-calendar.mec-event-container-simple .mec-calendar-row dt:last-child, +.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt, +.mec-calendar.mec-event-container-simple + .mec-calendar-table-head + dt:last-child { + border-width: 2px; +} + +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day, +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day:hover { + border-bottom: 2px solid #40d9f1; + background: unset; +} + +.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt { + border-top-width: 2px !important; +} + +@media (max-width: 768px) { + .mec-calendar.mec-event-container-simple, + .mec-calendar.mec-event-container-novel { + overflow-x: scroll; + } + + .mec-calendar.mec-event-container-simple .mec-calendar-side, + .mec-calendar.mec-event-container-novel .mec-calendar-side { + min-width: 100%; + } + + .mec-event-container-simple .mec-calendar-side, + .mec-event-container-novel .mec-calendar-side { + min-width: 650px !important; + } +} + +.mec-wrap.colorskin-custom + .mec-calendar.mec-event-container-simple + .mec-selected-day:hover { + background: #f4f4f4; +} + +.mec-tooltip-event-title { + font-size: 16px; + font-weight: bold; + color: #000; + margin-bottom: 2px; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-content + .mec-price-details, +.mec-tooltip-event-time { + font-size: 12px; + color: #888; + margin-bottom: 8px; + margin-top: 5px; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-content { + padding: 17px; +} + +.mec-tooltip-event-content { + clear: both; +} + +.mec-tooltip-event-featured { + float: left; + margin-right: 13px; + margin-bottom: 1px; +} + +.mec-tooltip-event-featured img { + max-width: 120px; +} + +.mec-tooltip-event-desc { + font-size: 14px; + color: #444; + line-height: 18px; +} + +.mec-tooltip-event-desc p { + font-size: 13px; + line-height: 1.4; + margin-bottom: 10px; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-box { + border-radius: 3px !important; + border: 1px solid #e2e3e4 !important; + background: #fff !important; + box-shadow: 0 -1px 30px -2px rgba(0, 0, 0, 0.15) !important; +} + +.tooltipster-box .mec-tooltip-event-desc { + margin-bottom: 12px; +} + +.tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-arrow { + overflow: visible !important; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-arrow-border { + border-width: 12px !important; +} + +.tooltipster-sidetip.tooltipster-shadow.tooltipster-right:not( + .uael-tooltipster-active + ) + .tooltipster-arrow-border { + border-right-color: #e2e3e4 !important; +} + +.tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-arrow-border { + left: -12px !important; + z-index: 9999999999 !important; +} + +.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + display: block !important; +} + +.tooltipster-sidetip:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + border-width: 11px !important; + z-index: 99999999999 !important; +} + +.tooltipster-sidetip.tooltipster-right:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + left: -9px !important; + top: 1px !important; + border-right-color: #ffffff !important; +} + +.tooltipster-sidetip.tooltipster-top:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + border-top-color: #ffffff !important; + left: 0 !important; + top: -1px !important; +} + +.tooltipster-sidetip.tooltipster-top:not(.uael-tooltipster-active) + .tooltipster-arrow-border { + left: -1px !important; +} + +.tooltipster-sidetip.tooltipster-shadow.tooltipster-top:not( + .uael-tooltipster-active + ) + .tooltipster-arrow-border { + border-top-color: #e2e3e4 !important; +} + +.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom:not( + .uael-tooltipster-active + ) + .tooltipster-arrow-border { + left: -1px !important; + top: -11px !important; +} + +.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom:not( + .uael-tooltipster-active + ) + .tooltipster-arrow-border { + border-bottom-color: #e2e3e4 !important; +} + +.tooltipster-sidetip.tooltipster-bottom:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + top: -9px !important; + border-bottom-color: #ffffff !important; +} + +.tooltipster-sidetip.tooltipster-left:not(.uael-tooltipster-active) + .tooltipster-arrow-background { + border-left-color: #ffffff !important; + left: -2px !important; + top: 0 !important; +} + +.tooltipster-sidetip.tooltipster-shadow.tooltipster-left:not( + .uael-tooltipster-active + ) + .tooltipster-arrow-border { + border-left-color: #e2e3e4 !important; + left: -1px !important; + top: -1px !important; +} + +@media (max-width: 768px) { + .mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple h4 { + font-size: 13px; + } +} + +@media (max-width: 480px) { + .mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple h4 { + font-size: 11px; + } +} + +/* MEC Events - Calendar Daily + -------------------------------- */ +.mec-calendar.mec-calendar-daily .mec-calendar-day-events .mec-event-article { + padding-left: 15px; + padding-right: 15px; + position: relative; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-a-month { + text-align: center; + background-color: #fff; + border-bottom: 2px solid #f4f4f4; + position: relative; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-a-month h4 { + color: #444; + font-size: 18px; + line-height: 1.2; + padding: 15px 0 11px; + margin: 0; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + border-bottom: 1px solid #e6e6e6; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-top { + text-align: center; + padding: 10px 0; + position: relative; + background-color: #fafafa; +} + +.mec-calendar.mec-calendar-daily .mec-previous-month, +.mec-calendar.mec-calendar-daily .mec-next-month { + position: absolute; + top: 50%; + left: 50%; + margin-top: -25px; + min-width: 50px; + height: 50px; + line-height: 50px; + text-align: center; + background: #fff; + border: 1px solid #e2e2e2; + border-radius: 50px; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.015); + transition: all 0.33s ease; + cursor: pointer; +} + +.mec-calendar.mec-calendar-daily .mec-previous-month i, +.mec-calendar.mec-calendar-daily .mec-next-month i { + font-size: 14px; + cursor: pointer; +} + +.mec-calendar.mec-calendar-daily .mec-previous-month:hover, +.mec-calendar.mec-calendar-daily .mec-next-month:hover { + border-color: #d0d0d0; + color: #444; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.075); +} + +.mec-calendar.mec-calendar-daily .mec-previous-month { + margin-left: -150px; +} + +.mec-calendar.mec-calendar-daily .mec-next-month { + margin-left: 100px; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month, +.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month { + min-height: 28px; + height: 28px; + line-height: 28px; + width: 28px; + margin-top: -14px; + border-radius: 3px; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2, +.mec-calendar.mec-calendar-daily .mec-calendar-d-top h3 { + margin-top: 9px; + color: #b9b9b9; + font-size: 30px; + font-weight: 100; + text-transform: uppercase; + margin-bottom: 12px; + line-height: 1; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2 { + font-size: 81px; + color: #444; + margin-bottom: 10px; + line-height: 1.1; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table { + overflow: hidden; + background: #fff; + min-height: 60px; + border-top: 1px solid #e6e6e6; + border-bottom: 2px solid #f3f3f3; + padding: 0 50px; + position: relative; +} + +@media only screen and (min-width: 479px) { + .mec-calendar.mec-calendar-daily .mec-calendar-d-table { + padding: 0 55px; + } +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl { + width: 1310px; + display: block; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl { + display: none; +} + +.mec-calendar.mec-calendar-weekly + .mec-calendar-d-table + dl.mec-weekly-view-week-active { + display: flex; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt, +.mec-calendar.mec-calendar-daily .mec-calendar-d-table a { + display: block; + background: #fff; + width: 42px; + height: 60px; + line-height: 60px; + text-align: center; + float: left; + border-right: 1px solid #e6e6e6; + border-bottom: 1px solid #e6e6e6; + border-radius: 0; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt:hover, +.mec-calendar.mec-calendar-daily + .mec-calendar-d-table + .mec-daily-view-day:hover { + background: #fafafa; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.065) inset; + cursor: pointer; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day { + cursor: default; + background: #fff; + color: #c1c1c1; + line-height: 59px; + text-align: center; + border-right: 1px solid #e6e6e6; + border-bottom: 1px solid #e6e6e6; +} + +.mec-calendar.mec-calendar-daily + .mec-calendar-d-table + .mec-daily-view-day.mec-has-event { + cursor: pointer; + font-weight: 700; + color: #4a4a4a; +} + +.mec-calendar.mec-calendar-daily + .mec-calendar-d-table + dl + dt.mec-table-d-current, +.mec-calendar.mec-calendar-daily + .mec-calendar-d-table + .mec-daily-view-day.mec-daily-view-day-active { + font-weight: 700; + background: #fafafa; + color: #40d9f1; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev, +.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next { + float: none; + font-size: 14px; + width: 55px; + position: absolute; + top: 0; + left: 0; + cursor: pointer; +} + +.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next { + left: auto; + right: 0; + border-left: 1px solid #e6e6e6; + border-right: none; +} + +.mec-calendar.mec-calendar-daily .mec-today-container .mec-today-count { + font-size: 12px; + color: #888; + text-align: center; +} + +@media only screen and (max-width: 479px) { + .mec-calendar.mec-calendar-daily .mec-previous-month { + margin-left: -130px; + } + + .mec-calendar.mec-calendar-daily .mec-next-month { + margin-left: 80px; + } + + .mec-calendar.mec-calendar-daily .mec-calendar-a-month h4 { + font-size: 14px; + letter-spacing: 0; + } +} + +.widget .mec-calendar.mec-calendar-daily .mec-calendar-a-month h4 { + font-size: 14px; + letter-spacing: 0; +} + +.widget .mec-calendar.mec-calendar-daily .mec-previous-month { + margin-left: -130px; +} + +.widget .mec-calendar.mec-calendar-daily .mec-next-month { + margin-left: 80px; +} + +.mec-util-hidden { + display: none; +} + +.mec-frontbox.mec-util-hidden { + display: none !important; +} + +.mec-daily-view-dates-events { + padding: 0; + background-color: #fff; +} + +.mec-daily-view-date-events, +.mec-weekly-view-date-events { + list-style: none; + margin: 0; +} + +/* MEC Events - Calendar Weekly + -------------------------------- */ +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table { + padding: 0; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl { + width: calc(100% - 1px); +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt { + width: 100%; + height: 70px; + line-height: normal; + cursor: default; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:hover { + background: #fff; + cursor: default; +} + +.mec-calendar-weekly article:hover li { + background: transparent; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:last-child { + border-right: none; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span { + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + display: block; + margin: 15px 0 6px; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table a.mec-table-d-prev, +.mec-calendar.mec-calendar-weekly .mec-calendar-d-table a.mec-table-d-next { + display: none; +} + +ul.mec-weekly-view-dates-events, +ul.mec-weekly-view-dates-events li { + padding: 0; + margin: 0; + line-height: initial; + background: #fff; +} + +.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date { + width: 64px; + height: 64px; + margin-right: 10px; + font-size: 11px; + text-transform: uppercase; + float: left; + text-align: center; + padding-top: 2px; +} + +.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span { + font-size: 40px; + line-height: 30px; + font-weight: 700; + display: block; + margin-bottom: 6px; + letter-spacing: 1px; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-a-month .mec-previous-month { + margin-left: 0; + left: 12px; +} + +.mec-calendar.mec-calendar-weekly .mec-calendar-a-month .mec-next-month { + margin-left: 0; + left: auto; + right: 12px; +} + +@media only screen and (max-width: 479px) { + .mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span { + font-size: 9px; + letter-spacing: 0; + } + + .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date { + width: 100%; + height: 36px; + margin-bottom: 12px; + line-height: 1; + font-size: 10px; + margin-right: 5px; + text-align: left; + } + + .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span { + font-size: 18px; + margin-bottom: 5px; + } +} + +.widget .mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span { + font-size: 9px; + letter-spacing: 0; +} + +.widget .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date { + width: 100%; + height: 36px; + margin-bottom: 12px; + line-height: 1; + font-size: 10px; + margin-right: 5px; + text-align: left; +} + +.widget .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span { + font-size: 18px; + margin-bottom: 5px; +} + +.mec-week-events-container .mec-weekly-view-dates-events li.mec-no-event-found { + list-style: none !important; +} + +li.mec-no-event-found .mec-event-title { + text-align: center; +} + +/* MEC Events - Calendar Widget + -------------------------------- */ +.mec-widget .mec-calendar { + max-width: 100%; +} + +.mec-widget .mec-calendar dl dt, +.mec-wrap.mec-sm959.mec-widget .mec-calendar.mec-event-calendar-classic dl dt { + height: 40px; +} + +.mec-widget .mec-calendar .mec-calendar-events-sec { + padding: 10px; +} + +.mec-widget .mec-calendar .mec-calendar-header h2 { + font-size: 13px; + margin-top: 8px; +} + +.mec-widget .mec-calendar .mec-event-list-classic .mec-event-image { + margin-right: 12px; +} + +.mec-widget .mec-calendar .mec-has-event:after { + width: 4px; + height: 4px; +} + +.mec-widget + .mec-calendar.mec-event-calendar-classic + .mec-calendar-events-sec + .mec-table-side-title { + font-size: 14px; +} + +.mec-widget .mec-calendar .mec-event-article .mec-event-image { + margin-right: 11px; +} + +.mec-widget .mec-box-calendar.mec-calendar .mec-calendar-header { + margin-bottom: 20px; +} + +.mec-widget + .mec-box-calendar.mec-calendar + .mec-calendar-side + .mec-previous-month, +.mec-widget .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month { + font-size: 0; + padding: 4px; + text-align: center; + min-width: 33px; +} + +.mec-widget .mec-event-calendar-classic .mec-calendar-side .mec-calendar-table { + min-height: 200px; +} + +/* List Widget */ +.mec-widget .mec-event-list-classic { + margin-bottom: 8px; + padding: 8px 0; +} + +.mec-widget .mec-event-list-classic .mec-event-article { + margin-bottom: 0; + padding: 10px 0; + position: relative; + min-height: 86px; + padding-left: 80px; +} + +.mec-widget .mec-event-list-classic .mec-event-date { + font-size: 10px; + line-height: 14px; + text-transform: uppercase; +} + +.mec-widget .mec-event-list-classic .mec-event-title { + font-size: 13px; +} + +.mec-widget .mec-event-list-classic .mec-event-detail { + font-size: 11px; +} + +.mec-widget .mec-event-list-classic .mec-event-image { + width: 68px; + position: absolute; + left: 0; +} + +.mec-event-list-classic .mec-event-image img { + width: 100%; +} + +.mec-widget .mec-event-list-classic .mec-event-detail { + overflow: visible; +} + +.event-color { + width: 14px; + display: inline-block; + vertical-align: middle; + height: 14px; + margin-left: 5px; + border-radius: 50%; +} + +/* MEC Events - Map view + -------------------------------- */ +/* lightbox */ +.mec-map-lightbox-wp { + padding: 15px 15px 0; + background-color: #fff; +} + +.mec-map-view-event-detail.mec-event-detail { + background-color: #e9e9e9; + padding: 8px 15px; +} + +.mec-map-lightbox-wp.mec-event-list-classic .mec-event-article { + padding: 0 0 15px; + margin: 0; +} + +.mec-map-lightbox-wp.mec-event-list-classic .mec-event-image { + width: 70px; + margin-right: 15px; +} + +/* infobox */ +.mec-marker-infowindow-wp { + padding: 10px; +} + +.mec-marker-infowindow-wp .mec-marker-infowindow-count { + width: 60px; + height: 60px; + display: block; + text-align: center; + line-height: 60px; + border: 1px solid #40d9f1; + border-radius: 50%; + font-size: 32px; + color: #40d9f1; + float: left; + margin-right: 11px; +} + +.mec-marker-infowindow-wp .mec-marker-infowindow-content { + overflow: hidden; + padding-top: 6px; +} + +.mec-marker-infowindow-wp .mec-marker-infowindow-content span { + display: block; + color: #222; +} + +.mec-marker-infowindow-wp .mec-marker-infowindow-content span:first-child { + font-size: 15px; + font-weight: 700; +} + +/* marker */ +.mec-marker-wrap { + display: inline-block; + width: 35px; + height: 35px; + margin: 15px 0 0 4px; + border-radius: 50% 50% 50% 0; + background: #00cae9; + animation-name: mec-map-bounce; + animation-fill-mode: both; + animation-duration: 1s; + border: 1px solid #fff; + cursor: pointer; +} + +.mec-marker-wrap .mec-marker { + margin-top: 5px; + display: block; + -webkit-transform: rotate(45deg) translate(1px, 0); + transform: rotate(45deg) translate(1px, 0); + text-align: center; + color: #fff; + font-size: 17px; +} + +.mec-marker-wrap .mec-marker-pulse-wrap { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + display: inline-block; + margin-left: -11px; + margin-top: 0; +} + +.mec-marker-wrap .mec-marker-pulse { + display: inline-block; + background: #01cae947; + border-radius: 50%; + height: 12px; + width: 14px; + margin-left: 3px; + -webkit-transform: rotateX(55deg); + transform: rotateX(55deg); + z-index: -2; +} + +.mec-marker-wrap .mec-marker-pulse:after { + content: ""; + border-radius: 50%; + height: 40px; + width: 40px; + position: absolute; + margin: -13px 0 0 -13px; + animation: pulsate 1s ease-out; + animation-iteration-count: infinite; + opacity: 0; + box-shadow: 0 0 1px 2px #00cae9; + animation-delay: 1.1s; +} + +@keyframes pulsate { + 0% { + transform: scale(0.1, 0.1); + opacity: 0; + } + + 50% { + opacity: 1; + } + + 100% { + transform: scale(1.2, 1.2); + opacity: 0; + } +} + +@keyframes mec-map-bounce { + 0% { + opacity: 0; + transform: translateY(-2000px) rotate(-45deg); + } + + 60% { + opacity: 1; + transform: translateY(30px) rotate(-45deg); + } + + 80% { + transform: translateY(-10px) rotate(-45deg); + } + + 100% { + transform: translateY(0) rotate(-45deg); + } +} + +.mec-skin-grid-container .mec-skin-map-container, +.mec-skin-list-container .mec-skin-map-container { + margin-bottom: 20px; +} + +/* Mec Countdown + -------------------------------- */ + +.mec-single-event .mec-events-meta-group-countdown { + color: #c9c9c9; + text-align: center; + margin-bottom: 30px; + padding: 20px 30px; + background: #fff; + border: 1px solid #e6e6e6; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-events-meta-group-countdown .countdown-w { + text-align: center; + font-size: 36px; + margin: 0 auto; + padding: 40px 0 0; + position: relative; + display: table; + table-layout: fixed; +} + +.mec-events-meta-group-countdown .countdown-w .icon-w { + font-size: 24px; +} + +.mec-events-meta-group-countdown .countdown-w .label-w { + font-size: 15px; + font-weight: 300; + letter-spacing: 1px; + text-transform: uppercase; + position: relative; +} + +.mec-events-meta-group-countdown .countdown-w .block-w { + display: table-cell; + margin: 0 20px 10px; + position: relative; + height: 70px; + width: 190px; + font-size: 72px; + transition: all 0.3s ease-in-out; + line-height: 1.2; +} + +.mec-events-meta-group-countdown .countdown-w .block-w.done-w { + border: 0 none; +} + +.mec-events-meta-group-countdown .countdown-w .block-w li { + font-size: 50px; +} + +.mec-events-meta-group-countdown .countdown-w span { + padding: 24px 0 20px; +} + +.mec-events-meta-group-countdown .countdown-w .div-d { + display: none; +} + +.mec-events-meta-group-countdown .countdown-w .countdown-message { + display: none; +} + +.mec-events-meta-group-countdown .countdown-w .block-w i { + display: none; +} + +#countdown { + list-style: none; + margin-bottom: 0; + margin-top: 0; + margin-left: 0; + padding-left: 0; +} + +.mec-events-meta-group-countdown .mec-end-counts h3 { + display: inherit; + text-align: center; + font-size: 16px; + right: 50%; +} + +.mec-countdown-details .countdown-w .clockdiv li p { + margin-top: 23px; +} + +@media (min-width: 481px) and (max-width: 768px) { + .mec-events-meta-group-countdown .countdown-w { + padding: 0; + } + + .mec-events-meta-group-countdown .countdown-w .label-w { + font-size: 12px; + letter-spacing: 0; + } + + .mec-events-meta-group-countdown .countdown-w span { + font-size: 34px; + } +} + +@media (min-width: 320px) and (max-width: 480px) { + .mec-events-meta-group-countdown .countdown-w .label-w { + font-size: 10px; + } + + .mec-events-meta-group-countdown .countdown-w span { + font-size: 28px; + } + + .mec-countdown-details .countdown-w .clockdiv li p { + margin-top: 16px; + } +} + +@media (max-width: 320px) { + .mec-events-meta-group-countdown .countdown-w .label-w { + font-size: 9px; + letter-spacing: 0; + } + + .mec-events-meta-group-countdown .countdown-w span { + font-size: 22px; + } +} + +/* Mec Warning + -------------------------------- */ +.info-msg, +.mec-success, +.warning-msg, +.mec-error { + margin: 30px 0 20px 0; + padding: 10px; + border-radius: 5px; + font-size: 13px; + line-height: 22px; +} + +.info-msg { + color: #07bbe9; + background-color: #ecf9fe; +} + +.mec-cart .mec-success, +.mec-success { + color: #2ca84c; + background-color: #e8f9ed; +} + +.warning-msg { + color: #cf7909; + background-color: #fef7e7; +} + +.mec-error { + color: #cb2916 !important; + background-color: #fef2f2; +} + +/* Mec Frontend Submission + -------------------------------- */ +.mec-fes-form, +.mec-fes-list { + background: #f8feff; + padding: 30px 3%; + color: #798f96; +} + +.mec-fes-list ul, +.mec-fes-list .mec-fes-list-top-actions { + margin: 0 auto 15px; + max-width: 960px; + list-style: none; + padding-left: 40px; +} + +.mec-fes-form-cntt .dashicons-editor-help { + display: none; +} + +.mec-fes-list ul li * { + text-decoration: none !important; +} + +.mec-fes-list ul li { + padding: 20px 15px; + border-radius: 3px; + margin-bottom: 15px; + border: 1px solid #cfeff5; + box-shadow: 0 2px 6px -4px #cfeff5; + background: #fff; + line-height: normal; +} + +.mec-fes-list ul li a { + box-shadow: none; + color: #181818; +} + +.mec-fes-list ul li a:hover { + color: #40d9f1; +} + +.mec-fes-list ul li .mec-event-title { + font-size: 17px; + font-weight: 600; + width: calc(100% - 250px); + display: inline-block; +} + +@media (max-width: 680px) { + .mec-fes-list ul li .mec-event-title { + width: 100%; + font-size: 13px; + margin: 0 0 20px 0; + display: block; + } + + .mec-fes-list ul li { + padding: 10px 12px 40px; + } +} + +@media (max-width: 480px) { + .mec-fes-list .mec-fes-list-top-actions, + .mec-fes-list ul { + padding-left: 0; + } +} + +.mec-fes-form .mec-required { + color: #ff3c3c; +} + +.mec-fes-list .mec-event-status { + color: #fff !important; + border-color: transparent !important; +} + +.mec-fes-list .mec-book-confirmed, +.mec-fes-form .mec-book-confirmed { + background: #50d477 !important; +} + +.mec-fes-list .mec-book-pending, +.mec-fes-form .mec-book-pending { + background: #fcbe69 !important; +} + +.mec-fes-list .mec-book-rejected, +.mec-fes-form .mec-book-rejected { + background: #fe686a !important; +} + +.mec-fes-list .mec-book-other, +.mec-fes-form .mec-book-other { + background: #40d9f1 !important; +} + +.mec-fes-list ul li .mec-fes-event-remove, +.mec-fes-list ul li .mec-fes-event-view, +.mec-fes-list ul li .mec-fes-event-edit { + font-size: 11px; + padding: 0; + border: 0; + background: #f7f8f9; + float: right; + margin-left: 5px; + border-radius: 2px; + transition: all 0.2s ease; +} + +.mec-fes-list ul li .mec-fes-event-remove, +.mec-fes-list ul li .mec-fes-event-view a, +.mec-fes-list ul li .mec-fes-event-edit a, +.mec-fes-list ul li .mec-fes-event-export a { + padding: 4px 8px; + display: inline-block; + border: 1px solid #e7e8e9; + border-radius: 2px; + color: #789; + position: relative; +} + +@media (max-width: 600px) { + .mec-fes-list ul li .mec-fes-event-remove, + .mec-fes-list ul li .mec-fes-event-view a, + .mec-fes-list ul li .mec-fes-event-export a, + .mec-fes-list ul li .mec-fes-event-edit a { + font-size: 10px; + } +} + +.mec-fes-list ul li .mec-fes-event-remove:hover { + cursor: pointer; + background: #f96f8a; + border-color: #f96f8a; + color: #fff; +} + +.mec-fes-list ul li .mec-fes-event-view a:hover, +.mec-fes-list ul li .mec-fes-event-edit a:hover, +.mec-fes-list ul li .mec-fes-event-export a:hover { + background: #40d9f1; + color: #fff; + border-color: #40d9f1; +} + +.single-mec-events .pmpro_content_message a, +.single-mec-events .pmpro_content_message a:link, +.mec-fes-form-top-actions a, +.mec-fes-list-top-actions a { + position: relative; + border: none; + border-radius: 3px; + color: #fff !important; + display: inline-block; + font-size: 13px; + line-height: 1; + text-transform: none; + font-weight: 400; + text-decoration: none; + cursor: pointer; + margin-bottom: 20px !important; + margin-right: 10px; + line-height: 1; + letter-spacing: 0; + padding: 15px 22px; + background: #39c36e; + box-shadow: 0 1px 7px -3px #39c36e !important; + -webkit-transition: all 0.21s ease; + -moz-transition: all 0.21s ease; + transition: all 0.21s ease; + text-decoration: unset; +} + +.single-mec-events .pmpro_content_message a:hover, +.single-mec-events .pmpro_content_message a:hover:link, +.mec-fes-list-top-actions a:hover, +.mec-fes-form-top-actions a:hover { + background: #222; + color: #fff; +} + +.mec-fes-list-top-actions a { + font-weight: 600; + text-transform: capitalize; +} + +.mec-fes-form-top-actions a:before { + content: ""; + border: solid #fff; + border-width: 0 2px 2px 0; + display: inline-block; + padding: 6px; + margin-right: 5px; + vertical-align: sub; + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.mec-fes-form .mec-form-row, +.mec-fes-list .mec-form-row { + margin-bottom: 10px; + clear: both; +} + +.mec-fes-form label { + font-size: 13px; + display: block; + color: #798f96; + font-weight: 400; + padding: 0 0 4px 2px; +} + +.mec-fes-form input + label { + padding-top: 8px; + padding-left: 3px; + margin: 0; + display: inline-block; + vertical-align: top; +} + +#wrap .mec-fes-form input + label { + padding-top: 0; +} + +.mec-fes-form .post-status { + float: right !important; + margin: 0 5px; + color: #fff; + padding: 0 10px; + border-radius: 12px; + font-style: italic; + font-size: 18px; +} + +.mec-fes-form #mec-event-data input[type="date"], +.mec-fes-form input[type="text"], +.mec-fes-form input[type="url"], +.mec-fes-form input[type="number"], +.mec-fes-form input[type="email"], +.mec-fes-form input[type="password"], +.mec-fes-form input[type="tel"], +.mec-fes-form textarea, +.mec-fes-form select { + min-width: inherit; + width: auto; + display: inline; + min-height: 30px; + font-size: 13px; + padding: 10px; + margin-bottom: 20px; + clear: both; + background: #fff; + border: 1px solid #cfeff5; + box-shadow: 0 2px 5px rgba(207, 239, 245, 0.38) inset; + border-radius: 3px; + height: 40px; + max-width: 280px; + color: #798f96; + font-family: inherit; +} + +.lity-content + .mec-events-meta-group-booking + input[type="date"]::-webkit-calendar-picker-indicator, +.lity-content + #mec_fes_form + input[type="date"]::-webkit-calendar-picker-indicator, +.mec-single-event + .mec-events-meta-group-booking + input[type="date"]::-webkit-calendar-picker-indicator, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="date"]::-webkit-calendar-picker-indicator, +#mec_fes_form input[type="date"]::-webkit-calendar-picker-indicator { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA0QjQ2N0QwQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA0QjQ2N0QxQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDRCNDY3Q0VCNDgzMTFFQThEN0VERkNFNTExRURFMzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDRCNDY3Q0ZCNDgzMTFFQThEN0VERkNFNTExRURFMzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6WW71PAAAGIklEQVR42qRX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"); + background-position: center; + background-size: cover; + width: 10px; + height: 12px; + display: block; +} + +.mec-fes-form input { + background: #fff; + border-radius: 3px; +} + +.mec-fes-form textarea { + height: 80px; +} + +.mec-fes-form input::-webkit-input-placeholder { + color: #798f96; +} + +.mec-fes-form input::-moz-placeholder { + color: #798f96; +} + +.mec-fes-form input:-ms-input-placeholder { + color: #798f96; +} + +.mec-fes-form input:-moz-placeholder { + color: #798f96; +} + +#mec-excerpt .mec-form-row .widefat { + max-width: 100%; +} + +#mec_more_info_target { + width: 100%; +} + +@media only screen and (min-width: 961px) { + .mec-fes-form #mec-event-data input[type="date"], + .mec-fes-form input[type="text"], + .mec-fes-form input[type="url"], + .mec-fes-form input[type="email"], + .mec-fes-form input[type="tel"], + .mec-fes-form input[type="password"], + .mec-fes-form #mec-event-data select, + .mec-fes-form textarea { + width: 100%; + display: inline-block; + } +} + +@media only screen and (max-width: 768px) { + .mec-fes-form #mec-event-data input[type="date"], + .mec-fes-form input[type="text"], + .mec-fes-form input[type="url"], + .mec-fes-form input[type="email"], + .mec-fes-form input[type="password"], + .mec-fes-form #mec-event-data select, + .mec-fes-form textarea { + width: 100%; + } +} + +.mec-fes-form input[type="text"]#mec_fes_title { + padding: 5px 10px; + min-height: 32px; + height: 50px; + background: #fff !important; + max-width: 100%; + font-size: 19px; + font-weight: 400; +} + +.mec-fes-form input[type="checkbox"], +.mec-fes-form input[type="radio"] { + display: inline !important; + float: left; + margin: 5px 5px 0 0; +} + +.mec-fes-form input[type="text"]:focus, +.mec-fes-form input[type="number"]:focus, +.mec-fes-form input[type="email"]:focus, +.mec-fes-form input[type="url"]:focus, +.mec-fes-form input[type="password"]:focus, +.mec-fes-form input[type="tel"]:focus, +.mec-fes-form textarea:focus, +.mec-fes-form select:focus { + border: 1px solid #aaa; + color: #444; + background: #fff; + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + outline: none; +} + +.mec-form-row .mec-color { + cursor: pointer; +} + +.mec-form-row.mec-available-color-row span { + margin: 10px; + width: 14px; + height: 14px; + display: inline-block; + margin-right: 6px; + border-radius: 20px 20px 20px 20px; + vertical-align: middle; +} + +.mec-form-row.mec-available-color-row span:first-of-type { + margin-left: 0; +} + +.mec-fes-form.mec-fes-form .mec-tooltip { + display: inline; +} + +.mec-fes-form-cntt .dashicons-editor-help { + display: block; +} + +.mec-fes-form .mec-tooltip:hover:after, +.mec-fes-form .mec-tooltip:hover:before { + display: none; +} + +.mec-fes-form.mec-fes-form .mec-tooltip { + display: inline-flex; + bottom: 7px; +} + +.mec-fes-form .mec-tooltip .box { + min-width: 300px; + max-width: 600px; + display: inline-block; + left: 26px; + top: 50%; + transform: translateY(-50%); + padding: 0; + margin-top: 8px; + background-color: #535a61; + color: #fff; + font-weight: 300; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.3; + position: absolute; + z-index: 9999999; + box-sizing: border-box; + border-radius: 6px; + box-shadow: 0 4px 45px -8px #444b50; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; +} + +#webnus-dashboard .mec-fes-form .mec-tooltip .box p, +.mec-fes-form .mec-tooltip .box p { + color: #fff !important; + font-size: 14px; + line-height: 1.3; + margin: 0; +} + +.mec-fes-form .mec-tooltip:hover .box { + visibility: visible; + opacity: 1; +} + +.mec-fes-form .mec-tooltip:hover .box { + padding: 20px; + border-radius: 8px; +} + +.mec-fes-form .mec-tooltip .box h5 { + color: #fff; + font-size: 17px; + font-weight: 600; + margin: -30px -20px; + padding: 20px 0; + text-align: center; + margin-bottom: 10px; + background: #3a3f44; + border-bottom: 1px solid #32363a; + border-radius: 6px 6px 0 0; + z-index: 9999; +} + +#webnus-dashboard .mec-fes-form .mec-tooltip .box p a, +.mec-fes-form .mec-tooltip .box p a { + color: #40d9f1; + margin-top: 10px; + margin-left: 0; + font-weight: 400; + position: relative; + text-decoration: none; + display: block; + width: max-content; +} + +.mec-fes-form .mec-tooltip .box a:hover { + color: #f90; +} + +.mec-fes-form .mec-tooltip .box:after { + display: block; + position: absolute !important; + top: 100% !important; + right: 50% !important; + margin-top: -6px !important; + margin-right: -6px !important; + width: 12px !important; + height: 24px !important; + overflow: hidden !important; + transform: rotate(-90deg) !important; +} + +.mec-fes-form .mec-tooltip .box:before { + display: block; + content: "" !important; + position: absolute !important; + width: 12px; + height: 12px; + left: -10px !important; + top: 50% !important; + transform: translate(50%, -50%) rotate(-45deg) !important; + background-color: #535a61 !important; + box-shadow: 0 8px 9px -4px #535a61 !important; + z-index: 0 !important; +} + +.mec-fes-form .mec-tooltip .box.top { + left: 50%; + top: 0; + transform: translate(-50%, -100%); + margin-top: 0; + margin-left: -10px; +} + +.mec-fes-form .mec-tooltip .box.top:after { + top: 50% !important; + right: 100% !important; +} + +.mec-fes-form .mec-tooltip .box.top:before { + left: 50% !important; + top: 100% !important; +} + +.mec-fes-form .mec-tooltip .box.bottom { + left: 50%; + top: auto; + bottom: 0; + transform: translate(-50%, 100%); + margin-bottom: -20px; + margin-left: -10px; +} + +.mec-fes-form .mec-tooltip .box.bottom:after { + top: 0 !important; + right: 50% !important; + background-color: #3a3f44 !important; +} + +.mec-fes-form .mec-tooltip .box.bottom:before { + left: 50% !important; + top: -7px !important; + transform: translateX(-50%); + background-color: #3a3f44 !important; +} + +.mec-fes-form .mec-tooltip .box.left { + left: auto; + right: 26px; + top: 50%; + transform: translateY(-50%); +} + +.mec-fes-form .mec-tooltip .box.left:before { + right: 0 !important; + left: auto !important; + top: 50% !important; +} + +.mec-fes-form .mec-tooltip { + display: inline-block; + position: relative; + margin-right: 10px; + cursor: help; + bottom: 5px; + left: 3px; +} + +.mec-fes-form .mec-tooltip:last-child { + margin-right: 0; +} + +.mec-fes-form .mec-tooltip:hover:after { + background: #313130; + border-radius: 5px; + bottom: 24px; + color: #fff; + content: attr(title); + left: -75px; + padding: 10px; + position: absolute; + z-index: 98; + width: 240px; +} + +.mec-fes-form .mec-tooltip:hover:before { + border: solid; + border-color: #313130 transparent; + border-width: 6px 6px 0; + bottom: 18px; + content: ""; + left: 30%; + position: absolute; + z-index: 99; +} + +.mec-fes-form .mec-tooltip .dashicons-before:before { + font-size: 24px; + color: #008aff; + line-height: 37px; +} + +.mec-fes-form .mec-tooltip a:focus { + box-shadow: none; +} + +.mec-form-row .bootstrap_unvalid { + display: block; + border: 2px solid red; + position: relative; + display: inline-block; + border-bottom: 1px dotted #000; +} + +.mec-fes-form .mec-tooltiptext { + visibility: hidden; + width: 120px; + background-color: red; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 0; + position: absolute; + z-index: 1; +} + +.mec-fes-form .mec-tooltip .content p a { + display: none; +} + +@media only screen and (min-width: 961px) { + .mec-fes-form .mec-fes-form-cntt, + .mec-fes-form .mec-fes-form-sdbr { + width: 68%; + float: left; + padding-right: 20px; + } + + .mec-fes-form .mec-fes-form-sdbr { + width: 32%; + padding-right: 0; + padding-left: 20px; + } + + .mec-fes-submit-mobile { + display: none; + } +} + +.mec-fes-form .mec-meta-box-fields { + padding: 0 20px 20px; + border: 1px solid #cfeff5; + margin-bottom: 20px !important; + box-shadow: 0 2px 6px -3px #cfeff5; + border-radius: 3px; + background: #fff; +} + +.mec-fes-form .mec-meta-box-fields h4, +.mec-fes-form .mec-meta-box-fields h4 label { + margin: 0 -20px; + font-size: 15px; + font-weight: 600; + letter-spacing: 0; + color: #40d9f1; + text-transform: capitalize; + padding: 15px 20px; + margin-bottom: 20px; +} + +.mec-fes-form .mec-meta-box-fields h4 label { + padding: 0; + margin: 0; +} + +.mec-fes-sub-button { + width: 100%; +} + +.mec-available-color-row span.color-selected { + border: 3px solid #fff; + box-sizing: content-box; + box-shadow: 0 0 0 2px #40d9f1, 0 2px 8px -1px #40d9f1; +} + +.mec-fes-loading:before { + content: url("../img/ajax-loader.gif"); + background: transparent; + border-style: none; + display: block; + margin-left: 47%; +} + +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"] { + width: 190px; + margin-right: 1.4%; +} + +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"].mec-col-1, +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"].mec-col-2 { + width: 120px; + margin-right: 10px; +} + +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"].widefat { + width: 100%; +} + +.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row { + border-bottom: none; + padding-bottom: 10px; +} + +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"].mec-col-6 { + width: 39%; +} + +.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row button { + margin-right: 0; + padding: 9px 26px; +} + +.mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + button.mec-add-hourly-schedule-button { + font-size: 12px; + height: 30px; + line-height: 25px; +} + +.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row .description { + display: inline-block; + border-left: 1px dashed #bfcacc; + margin-left: 12px; + line-height: 28px; + padding-left: 12px; + margin-top: 5px; + font-style: italic; +} + +@media only screen and (max-width: 768px) { + .mec-fes-form + #mec_meta_box_hourly_schedule_days + .mec-form-row + input[type="text"] { + width: 100% !important; + } +} + +#mec_fes_form_message { + max-width: 838px; + margin: 10px auto; + display: block !important; + text-align: center; +} + +/* FES Attendees */ +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip { + position: relative; +} + +.mec-fes-form .mec-attendees-wrapper .mec-attendees-list strong, +.post-type-mec-books .attendees strong { + line-height: 26px; + padding-left: 26px; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip:before { + position: absolute; + content: "\e001"; + font-family: simple-line-icons; + margin: 12px 0; + top: -30px; + left: 0; + font-size: 18px; + line-height: 12px; + color: #40d9f1; + padding: 0 60px 5px 0; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip + ul { + position: absolute; + min-width: 300px; + max-width: 600px; + display: inline-block; + left: 60px; + top: 50%; + transform: translateY(-50%); + background-color: #535a61; + color: #fff; + font-weight: 300; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.3; + z-index: 9999999; + box-sizing: border-box; + box-shadow: 0 4px 45px -8px #444b50; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; + padding: 23px 20px 20px 20px; + border-radius: 8px; + margin-top: -13px; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip + ul:before { + display: block; + content: "" !important; + position: absolute !important; + width: 12px; + height: 12px; + left: -10px !important; + top: 50% !important; + transform: translate(50%, -50%) rotate(-45deg) !important; + background-color: #535a61 !important; + box-shadow: 0 8px 9px -4px #535a61 !important; + z-index: 0 !important; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip:hover + ul { + visibility: visible; + opacity: 1; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip + ul + li { + list-style: none; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip + ul + a { + color: #40d9f1; + margin-bottom: 14px; + margin-left: 0; + font-weight: 400; + font-size: 14px; + letter-spacing: 0.5px; + position: relative; + text-decoration: none; + display: block; + width: max-content; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip + ul + li:last-child + a { + margin-bottom: 0; +} + +.mec-fes-form .mec-attendees-wrapper .mec-attendees-list { + margin: 0; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:first-child { + background: #fff; + border-bottom: 1px solid #cfeff5; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:first-child + div + span { + line-height: 1; + font-weight: 600; + font-size: 13px; +} + +.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix { + display: flex; + background: #f8feff; + padding: 10px; + text-align: left; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3 { + width: 25%; + word-wrap: break-word; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3:first-child { + width: 45%; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3:nth-child(2) { + width: 15%; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3:nth-child(3) { + width: 25%; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3:nth-child(4) { + width: 20%; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:not(:first-child) + .w-col-xs-3 { + font-size: 13px; + display: block; + color: #798f96; + font-weight: 400; + padding: 0; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix + .w-col-xs-3 + a { + text-decoration: unset; +} + +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:nth-child(odd) { + background: #fff; +} + +/* FES Pagination */ +.mec-pagination { + display: block; + margin: 40px 0 0 0; +} + +.mec-pagination ul.page-numbers { + display: flex; + justify-content: center; + align-content: space-around; + flex-wrap: nowrap; + align-items: center; + flex-direction: row; +} + +.mec-pagination .page-numbers li { + margin: 0 7px; + padding: 0; + display: flex; +} + +.mec-pagination .page-numbers li .page-numbers { + text-align: center; + font-size: 14px; + line-height: 3; + width: 42px; +} + +.mec-pagination .page-numbers li .page-numbers.prev, +.mec-pagination .page-numbers li .page-numbers.next { + width: 110px; +} + +/* MEC Total Calendar + -------------------------------- */ +.mec-wrap .mec-totalcal-box { + position: relative; + border: 1px solid #efefef; + padding: 20px 5px; + margin: 0 0 20px; + background: #fafafa; + overflow: hidden; + box-shadow: 0 3px 2px 0 rgba(0, 0, 0, 0.012); + min-height: 78px; +} + +.mec-wrap .mec-totalcal-box i { + float: left; + margin: 0; + width: 36px; + height: 36px; + background: #fff; + border: 1px solid #efefef; + text-align: center; + padding: 10px 0; + font-size: 15px; + color: #888; +} + +.mec-wrap .mec-totalcal-box input, +.mec-wrap .mec-totalcal-box select, +.mec-checkboxes-search .mec-searchbar-category-wrap, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span { + width: auto; + min-height: 36px; + height: 36px; + line-height: 36px; + background: #fff; + font-size: 13px; + color: #777; + border: 1px solid #efefef; + margin: 0 0 0 -1px; + float: left; + padding: 0 5px; + font-family: inherit; +} + +.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected { + border-right-width: 2px; +} + +.mec-there-labels .mec-totalcal-view { + margin-top: 28px; +} + +.mec-wrap .mec-totalcal-box input[type="submit"] { + cursor: pointer; + padding: 0 16px; + text-transform: uppercase; + font-size: 11px; + transition: all 0.21s ease; +} + +.mec-wrap .mec-totalcal-box input[type="submit"]:hover { + background: #222; + color: #fff; +} + +.mec-wrap .mec-totalcal-box .mec-totalcal-view span { + display: inline-block; + text-transform: uppercase; + font-size: 11px; + padding: 0 12px; + cursor: pointer; +} + +.mec-wrap .mec-totalcal-box .mec-totalcal-view span:hover { + color: #40d9f1; +} + +.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected { + color: #fff; + background: #40d9f1; + border-color: #40d9f1; +} + +.mec-wrap .mec-totalcal-box .mec-totalcal-view { + text-align: right; + float: right; +} + +.mec-wrap .mec-totalcal-box input[type="search"] { + width: calc(100% - 36px); +} + +.mec-there-reset-button .mec-totalcal-box { + padding-bottom: 48px; +} + +.mec-wrap .mec-totalcal-box .mec-search-reset-button .mec-button { + position: absolute !important; + margin: 0 !important; + bottom: 0 !important; + right: 0 !important; + padding: 9px 25px !important; + border-radius: 2px 0 0 0 !important; + background: #fff !important; + color: #767676 !important; + border-top: 1px solid !important; + border-left: 1px solid !important; + border-color: #e8e8e8 !important; + overflow: hidden !important; +} + +.mec-wrap .mec-totalcal-box .mec-search-reset-button .mec-button:hover { + background: #000 !important; + color: #fff !important; + border-color: #000 !important; +} + +.mec-full-calendar-wrap .mec-search-form .col-md-7 { + padding: 0; +} + +.mec-wrap .mec-date-search .mec-col-3, +.mec-wrap .mec-minmax-event-cost .mec-minmax-price { + width: calc(50% - 17px); +} + +.mec-wrap .mec-text-address-search.with-mec-cost { + width: calc(100% - 356px); +} + +.mec-wrap .mec-minmax-event-cost { + display: block; + float: left; + width: 50%; + margin-left: 10px; +} + +.mec-wrap .mec-minmax-event-cost.with-mec-address { + display: block; + width: 336px; + max-width: 50%; + float: right; + margin-left: 0; + margin-right: 10px; +} + +.mec-wrap .mec-checkboxes-search { + margin-left: 10px; + margin-right: 10px; + display: table-caption; +} + +.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap { + width: calc(100% - 36px) !important; + max-width: calc(100% - 36px) !important; + padding: 0; + position: relative; + line-height: inherit; + height: auto; +} + +.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap select { + line-height: 20px; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container.select2-container--default { + width: calc(100% - 36px) !important; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + input[type="search"] { + width: calc(100% - 36px) !important; + min-height: 30px; + margin: 0; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + ul, +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container.select2-container--default { + height: auto; + overflow: unset; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + ul { + display: block; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple { + border: unset; + width: 100%; + height: 0 !important; + border-radius: 0; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + ul + li { + line-height: 12px !important; + max-height: 20px !important; + width: auto; + margin-right: 5px; + margin-top: 5px; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + .select2-selection__choice { + letter-spacing: 0; + color: #777; + text-transform: capitalize; + padding: 4px 6px; + background-color: #efefef; + border-radius: 2px; + border: 0; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + margin-bottom: 5px; + font-size: 11px; + text-transform: uppercase; +} + +.mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + .select2-selection__choice__remove { + color: #777; +} + +@media only screen and (min-width: 961px) and (max-width: 1200px) { + .mec-wrap .mec-totalcal-box { + padding: 37px 5px; + } +} + +@media only screen and (max-width: 960px) { + .mec-wrap .mec-totalcal-box .col-md-3, + .mec-wrap .mec-totalcal-box .col-md-4, + .mec-wrap .mec-totalcal-box .col-md-5 { + width: 100%; + float: none; + clear: both; + overflow: hidden; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-3, + .mec-full-calendar-wrap .mec-search-form .col-md-4, + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + display: block; + max-width: 100%; + padding: 0; + margin: 0 0 10px 0; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-3 { + padding-bottom: 10px !important; + } + + .mec-wrap .mec-search-form .mec-date-search select { + width: calc(100% - 106px); + } + + .mec-wrap .mec-search-form .mec-date-search select:last-child { + width: 70px; + } + + .mec-wrap .mec-totalcal-box .mec-totalcal-view { + float: none; + } + + .mec-wrap + .mec-checkboxes-search + .mec-searchbar-category-wrap + .select2-container + .select2-selection--multiple + .select2-selection__choice { + display: block; + max-width: 100%; + white-space: break-spaces; + max-height: unset !important; + height: auto !important; + } +} + +@media only screen and (min-width: 768px) and (max-width: 960px) { + .mec-wrap .mec-totalcal-box .col-md-4 { + position: relative; + width: initial; + } + + .mec-wrap .mec-totalcal-box .col-md-5 { + padding-bottom: 0; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + margin-top: 20px; + } + + .mec-wrap .mec-totalcal-box { + padding: 37px 5px; + } +} + +@media only screen and (max-width: 767px) { + .mec-wrap .mec-totalcal-box .mec-totalcal-view { + float: none; + } + + .mec-wrap .mec-totalcal-box .col-md-4 { + padding-bottom: 0; + } + + .mec-wrap .mec-text-address-search.with-mec-cost, + .mec-wrap .mec-minmax-event-cost.with-mec-address { + width: 100%; + float: left; + } + + .mec-wrap .mec-minmax-event-cost.with-mec-address { + max-width: calc(100% - 20px); + margin: 0 10px 20px 10px; + } + + .mec-wrap .mec-minmax-event-cost .mec-minmax-price { + width: calc(50% - 17px); + } +} + +@media only screen and (max-width: 479px) { + .mec-wrap .mec-totalcal-box .mec-totalcal-view span { + padding: 0 8px; + font-size: 10px; + } + + .mec-wrap .mec-totalcal-box input[type="submit"] { + padding: 0 10px; + font-size: 10px; + } +} + +@media only screen and (min-width: 961px) { + .mec-wrap.mec-sm959 .mec-totalcal-box .col-md-3, + .mec-wrap .mec-wrap.mec-sm959 .mec-totalcal-box .col-md-5 { + padding-bottom: 20px; + clear: both; + overflow: hidden; + } + + .mec-wrap.mec-sm959 .mec-totalcal-box .col-md-5 { + right: 10px; + width: initial; + } + + .mec-wrap.mec-sm959 .mec-totalcal-box .col-md-4 { + padding-bottom: 0; + width: 100%; + } +} + +@media (min-width: 961px) and (max-width: 1200px) { + .mec-full-calendar-wrap .mec-totalcal-box { + padding: 15px 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2 { + width: 50%; + } + + .mec-wrap .mec-totalcal-box .mec-totalcal-view span { + padding: 0 10px; + } + + .mec-search-form .mec-date-search, + .mec-search-form .mec-dropdown-search, + .mec-search-form .mec-text-input-search, + .mec-search-form .mec-text-address-search { + padding: 0 4px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2, + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3, + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4, + .mec-full-calendar-wrap .mec-totalcal-box .col-md-5 { + padding-bottom: 20px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2 select { + min-width: calc(100% - 36px); + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3 select { + min-width: calc(30% - 10px); + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3:last-child select { + min-width: calc(50% - 19px); + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + font-size: 9px; + text-align: center; + } +} + +@media only screen and (max-width: 1200px) { + .post-type-archive-mec-events .mec-totalcal-box .col-md-3, + .post-type-archive-mec-events .mec-totalcal-box .col-md-4 { + width: 100%; + padding: 0; + } + + .post-type-archive-mec-events .mec-totalcal-box select:last-child { + min-width: auto; + } + + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + position: relative; + float: right; + max-width: 100%; + left: 0; + top: 20px; + width: 100% !important; + display: block; + clear: both; + } + + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view { + max-width: 100%; + width: 100%; + } + + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span { + width: 20.1%; + font-size: 10px; + } +} + +@media only screen and (max-width: 960px) { + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + top: 10px; + } +} + +@media only screen and (max-width: 760px) { + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + top: 0 !important; + } +} + +@media only screen and (max-width: 480px) { + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span { + font-size: 8px; + } +} + +@media (min-width: 1201px) and (max-width: 1280px) { + .mec-full-calendar-wrap .mec-totalcal-view span { + font-size: 9px; + padding: 0 10px; + } +} + +@media (min-width: 761px) and (max-width: 1200px) { + .mec-full-calendar-wrap + .mec-search-form + .mec-dropdown-wrap + .mec-dropdown-search { + width: 33.3333%; + display: block; + float: left; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-4 .mec-text-input-search { + padding: 0; + margin-bottom: 20px; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-3 { + width: 100%; + } + + .mec-full-calendar-wrap .mec-search-form .mec-date-search select:last-child { + min-width: 70px; + width: 70px; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + float: right; + padding: 0 0 10px 0; + } + + .mec-full-calendar-wrap .mec-totalcal-view span { + font-size: 11px; + } +} + +@media (max-width: 760px) { + .mec-full-calendar-wrap .mec-search-form .col-md-3 { + width: 100%; + } + + .mec-full-calendar-wrap .mec-search-form .mec-date-search select:last-child { + min-width: 70px; + width: 70px; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + float: right; + padding: 0 0 10px 0; + } + + .mec-full-calendar-wrap .mec-totalcal-view span { + font-size: 11px; + } +} + +@media (max-width: 960px) { + .mec-full-calendar-wrap .mec-totalcal-box { + padding: 20px 20px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2 { + width: 50%; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2, + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3, + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4 { + padding-bottom: 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2 select { + min-width: calc(100% - 36px); + margin-bottom: 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view { + margin-left: 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + font-size: 10px; + text-align: center; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-2 { + width: 100%; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + min-width: 14.3%; + text-align: center; + font-size: 10px; + margin-right: -1px; + } +} + +@media (max-width: 780px) { + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3 select { + width: calc(50% - 18px) !important; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4 { + position: unset; + padding-right: 0; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-3, + .mec-full-calendar-wrap .mec-search-form .col-md-4, + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + margin: 0; + padding: 0; + } + + .mec-wrap .mec-totalcal-box .mec-totalcal-view span { + padding: 0 7px; + margin-top: 20px; + } +} + +@media (max-width: 480px) { + .mec-full-calendar-wrap .mec-totalcal-box { + padding: 15px 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + min-width: 13.5%; + text-align: center; + font-size: 11px; + } +} + +@media (max-width: 411px) { + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + min-width: 12%; + font-size: 10px; + } +} + +@media (max-width: 320px) { + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + min-width: 22.5%; + font-size: 11px; + } +} + +/* FullCalendar Search field items responsive */ +.mec-totalcalview-selected:hover { + color: #fff !important; +} + +/* Cal search form */ +.mec-search-form { + padding: 20px 10px; +} + +.mec-search-form .mec-dropdown-wrap { + display: table; + width: 100%; +} + +.mec-search-form .mec-date-input-search, +.mec-search-form .mec-time-input-search, +.mec-search-form .mec-dropdown-search, +.mec-search-form .mec-text-input-search, +.mec-search-form .mec-date-search { + padding: 0 10px; + float: left; + /* min-height: 55px; */ +} + +.mec-search-form .mec-date-search, +.mec-search-form .mec-totalcal-view, +.mec-search-form .mec-time-picker-search { + padding: 0 10px; +} + +.mec-search-form .mec-text-input-search { + width: 100%; +} + +.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search { + width: 50%; +} + +.mec-search-form .mec-date-search, +.mec-search-form .mec-time-picker-search { + width: 50%; + float: left; +} + +.mec-search-form .mec-date-search.with-mec-time-picker, +.mec-search-form .mec-time-picker-search.with-mec-date-search { + width: 25%; + float: left; +} + +.mec-search-form .mec-tab-loader.col-md-6 .mec-totalcal-view { + padding: 0; +} + +.mec-wrap .mec-search-form .with-mec-date-search .mec-timepicker-start, +.mec-wrap .mec-search-form .with-mec-date-search .mec-timepicker-end { + width: calc(50% - 17px); +} + +.mec-search-form .mec-text-address-search, +.mec-search-form .mec-minmax-event-cost, +.mec-search-form + .mec-full-calendar-search-ends + .mec-text-input-search.col-md-12 { + min-height: 55px; +} + +.mec-search-form + .mec-full-calendar-search-ends + .mec-text-input-search.col-md-12, +.mec-widget .mec-search-form .mec-text-input-search, +.mec-widget .mec-search-form .mec-date-search { + width: 100%; +} + +.mec-search-form + .mec-full-calendar-search-ends + .mec-text-input-search.col-md-12 { + padding: 0 10px; +} + +.mec-there-labels + .mec-search-form + .mec-full-calendar-search-ends + .mec-text-input-search.col-md-12 { + margin-top: 20px; +} + +.mec-search-form .mec-text-address-search, +.mec-search-form .mec-minmax-event-cost, +.mec-widget .mec-search-form .mec-text-input-search { + margin-top: 10px; +} + +.mec-search-form .mec-date-search { + clear: left; +} + +.mec-search-form .mec-dropdown-wrap .mec-dropdown-search { + display: table-cell; + float: none; +} + +.mec-widget .mec-search-form .mec-dropdown-wrap .mec-dropdown-search { + display: block; +} + +.mec-checkboxes-search .mec-searchbar-category-wrap, +.mec-wrap .mec-search-form .mec-dropdown-wrap .mec-dropdown-search select { + width: calc(100% - 36px); + margin-bottom: 10px; +} + +.mec-wrap .mec-search-form .mec-text-input-search input, +.mec-wrap .mec-search-form .mec-minmax-price input, +.mec-wrap .mec-search-form .mec-text-address-search input { + margin-bottom: 10px; +} + +.mec-wrap .mec-totalcal-box label { + display: block; + line-height: 1.8; + margin-bottom: 4px; + font-size: 13px; + color: #9a9a9a; +} + +.mec-wrap .mec-search-form .mec-date-search select { + width: calc(100% - 106px); +} + +.mec-wrap .mec-search-form .mec-date-search select:last-child { + width: 70px; +} + +@media only screen and (max-width: 781px) { + .mec-search-form .mec-dropdown-search, + .mec-search-form .mec-text-input-search, + .mec-search-form .mec-date-search { + width: 100%; + float: none; + } + + .mec-search-form .mec-date-search { + min-height: 55px; + } + + .mec-search-form .mec-dropdown-wrap .mec-dropdown-search { + display: block; + width: 50%; + float: left; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-3 { + margin-bottom: 0; + padding-bottom: 0 !important; + } +} + +@media only screen and (max-width: 479px) { + .mec-search-form .mec-dropdown-wrap .mec-dropdown-search { + display: block; + width: 100%; + float: none; + } +} + +/* Final fix full calendar shortcode */ +@media only screen and (min-width: 961px) and (max-width: 1200px) { + .post-type-archive-mec-events .mec-totalcal-box .col-md-3, + .post-type-archive-mec-events .mec-totalcal-box .col-md-4, + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + max-width: 100%; + width: 100%; + } + + .post-type-archive-mec-events .mec-totalcal-box .col-md-4 { + padding: 0 10px; + } + + .post-type-archive-mec-events + .mec-totalcal-box + .col-md-4 + .mec-text-input-search { + margin: 0; + } + + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + margin-bottom: 20px; + padding: 0 10px 10px 10px; + } +} + +@media only screen and (max-width: 960px) { + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4, + .post-type-archive-mec-events .mec-totalcal-box .col-md-4 { + padding: 0 10px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4 { + margin-bottom: 0; + } + + .post-type-archive-mec-events + .mec-totalcal-box + .col-md-4 + .mec-text-input-search { + margin: 0; + } + + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view { + padding-right: 15px; + } + + .mec-full-calendar-wrap .mec-search-form .col-md-5 { + margin-bottom: 0; + } + + .post-type-archive-mec-events .mec-totalcal-box .col-md-5 { + padding: 0; + } +} + +@media only screen and (max-width: 780px) { + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span { + margin-top: 10px; + margin-bottom: 10px; + } + + .mec-wrap .mec-totalcal-box .mec-totalcal-view span { + margin-top: 0; + } +} + +@media only screen and (max-width: 760px) { + .post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span { + margin-top: 20px; + margin-bottom: 0; + } + + .mec-wrap .mec-totalcal-box .mec-totalcal-view span { + margin-top: 20px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .col-md-4, + .post-type-archive-mec-events .mec-totalcal-box .col-md-4 { + padding: 0; + } +} + +@media only screen and (max-width: 1200px) { + .post-type-archive-mec-events + .mec-full-calendar-wrap + .mec-totalcal-view + span { + width: 14.333%; + font-size: 8px; + } +} + +@media only screen and (min-width: 320px) and (max-width: 960px) { + .post-type-archive-mec-events .mec-search-form .col-md-5 span { + width: 20% !important; + } +} + +.mec-search-form .mec-text-address-search { + float: left; + width: 100%; + padding: 0 10px; +} + +@media (max-width: 960px) { + .mec-search-form .mec-dropdown-search { + margin-bottom: 10px; + } + + .mec-wrap .mec-minmax-event-cost.with-mec-address, + .mec-wrap .mec-text-address-search.with-mec-cost { + margin-top: 0; + } + + .mec-search-form .mec-date-search.with-mec-time-picker, + .mec-search-form .mec-time-picker-search.with-mec-date-search { + width: 50%; + margin-bottom: 20px; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view { + margin: 0; + } + + .mec-full-calendar-wrap .mec-tab-loader { + width: 100%; + display: block; + float: unset; + padding: 0 0 0 10px; + } +} + +@media (max-width: 780px) { + .mec-full-calendar-wrap .mec-totalcal-box { + padding: 10px; + } + + .mec-search-form .mec-date-search.with-mec-time-picker, + .mec-search-form .mec-time-picker-search.with-mec-date-search { + margin: 20px 0; + height: auto; + } + + .mec-search-form .mec-date-search { + min-height: unset; + } +} + +@media (max-width: 480px) { + .mec-search-form .mec-date-search.with-mec-time-picker, + .mec-search-form .mec-time-picker-search.with-mec-date-search { + width: 100%; + } + + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + min-width: 12%; + text-align: center; + font-size: 9px; + } + + .mec-search-form .mec-minmax-event-cost, + .mec-search-form .mec-text-address-search, + .mec-search-form .mec-full-calendar-search-ends .mec-text-input-search, + .mec-search-form .mec-date-search.with-mec-time-picker, + .mec-search-form .mec-time-picker-search.with-mec-date-search, + .mec-wrap .mec-minmax-event-cost.with-mec-address, + .mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span { + margin-bottom: 0; + margin-top: 10px; + min-height: auto; + } + + .mec-wrap .mec-minmax-event-cost.with-mec-address { + margin-bottom: 10px; + } + + .mec-wrap.mec-widget + .mec-search-form + .mec-time-picker-search.with-mec-date-search, + .mec-wrap.mec-widget .mec-minmax-event-cost.with-mec-address, + .mec-wrap.mec-widget .mec-text-address-search.with-mec-cost { + display: block !important; + width: 100% !important; + max-width: 100% !important; + } + + .mec-wrap.mec-widget .mec-minmax-event-cost.with-mec-address { + float: left !important; + max-width: calc(100% - 20px) !important; + margin: 0 0 0 10px !important; + } + + .mec-wrap.mec-widget + .mec-search-form + .mec-time-picker-search.with-mec-date-search { + margin-top: 20px !important; + } + + .mec-wrap.mec-widget .mec-search-form .mec-text-input-search { + padding: 10px !important; + } +} + +/* MEC Datepicker + ---------------------*/ +.ui-datepicker { + background-color: #fff; + border: 1px solid #66afe9; + border-radius: 4px; + box-shadow: 0 0 8px rgba(102, 175, 233, 0.6); + display: none; + margin-top: 4px; + padding: 10px; + width: 240px; +} + +.ui-datepicker a, +.ui-datepicker a:hover { + text-decoration: none; + cursor: pointer; +} + +.ui-datepicker a:hover, +.ui-datepicker td:hover a { + color: #2c6396; + -webkit-transition: color 0.1s ease-in-out; + -moz-transition: color 0.1s ease-in-out; + -o-transition: color 0.1s ease-in-out; + transition: color 0.1s ease-in-out; +} + +.ui-datepicker .ui-datepicker-header { + margin-bottom: 4px; + text-align: center; +} + +.ui-datepicker .ui-datepicker-title { + font-weight: 700; +} + +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + cursor: default; + font-family: dashicons; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + height: 20px; + line-height: 1.4; + margin-top: 2px; + width: 20px; +} + +.ui-datepicker .ui-datepicker-prev { + float: left; + text-align: left; +} + +.ui-datepicker .ui-datepicker-next { + float: right; + text-align: center; +} + +.ui-datepicker .ui-datepicker-prev:before { + content: "\f341"; +} + +.ui-datepicker .ui-datepicker-next:before { + content: "\f345"; +} + +.ui-datepicker .ui-icon { + display: none; +} + +.ui-datepicker .ui-datepicker-calendar { + table-layout: fixed; + width: 100%; +} + +.ui-datepicker .ui-datepicker-calendar th, +.ui-datepicker .ui-datepicker-calendar td { + text-align: center; + padding: 4px 0; +} + +.ui-datepicker .ui-datepicker-calendar td { + border-radius: 4px; + -webkit-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + -moz-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + -o-transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; + transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out; +} + +.ui-datepicker .ui-datepicker-calendar td:hover { + background-color: #eee; + cursor: pointer; +} + +.ui-datepicker .ui-datepicker-calendar td a { + text-decoration: none; +} + +.ui-datepicker .ui-datepicker-current-day { + background-color: #4289cc; +} + +.ui-datepicker .ui-datepicker-current-day a { + color: #fff; +} + +.ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover { + background-color: #fff; + cursor: default; +} + +/* MEC Events Carousel Type1 */ + +@media only screen and (max-width: 768px) { + .mec-owl-theme .owl-nav [class*="owl-"] { + display: none !important; + } +} + +.mec-owl-theme .owl-dots .owl-dot { + border: none; +} + +.event-carousel-type1-head .mec-event-image { + position: relative; + min-height: 150px; + overflow: hidden; +} + +.event-carousel-type1-head .mec-event-image img { + width: 100%; +} + +.mec-event-carousel-content .mec-event-carousel-title a { + transition: all 0.2s ease; +} + +.event-carousel-type1-head .mec-event-date-carousel { + position: absolute; + top: 25px; + left: 1px; + font-size: 41px; + width: 160px; + color: #fff; + font-weight: 500; + background-color: #40d9f1; + padding-left: 14px; + height: 97px; + line-height: 2.3; + padding-right: 85px; +} + +.event-carousel-type1-head .mec-event-date-carousel:after { + content: ""; + position: absolute; + display: inline-block; + z-index: -1; + bottom: -13px; + left: 5px; + width: 0; + border-width: 13px; + border-style: solid; + border-color: transparent transparent #40d9f1 transparent; + transform: rotate(45deg); +} + +.event-carousel-type1-head .mec-event-date-info { + font-size: 12px; + font-weight: 300; + position: absolute; + top: 27px; + left: 75px; +} + +.event-carousel-type1-head .mec-event-date-info-year { + font-size: 12px; + font-weight: 300; + position: absolute; + top: 45px; + left: 75px; +} + +.mec-event-carousel-content { + border: 1px solid #e8e8e8; + border-top: none; + margin-top: -5px; + padding: 34px 9px 11px 37px; +} + +.mec-event-carousel-content .mec-event-carousel-title a { + font-size: 23px; + font-weight: 500; + color: #000; + letter-spacing: -1px; +} + +.mec-event-carousel-content p { + font-size: 14px; + color: #7a7272; + font-weight: 300; +} + +.mec-owl-crousel-skin-type1 .owl-item .mec-event-article { + padding: 0 19px; +} + +.mec-event-carousel-type1 .owl-page.active span { + background-color: #00aeef; + height: 14px; + width: 14px; +} + +.mec-event-carousel-type1 .mec-event-carousel-content { + margin-bottom: 15px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); + transition: all 0.27s ease; +} + +.mec-skin-carousel-container .mec-owl-carousel button:focus { + outline: none; +} + +.mec-event-carousel-type1 .mec-event-carousel-content:hover { + box-shadow: 0 0 35px rgba(0, 0, 0, 0.07); +} + +.mec-skin-carousel-container .mec-multiple-event .mec-event-date-carousel { + width: 255px; +} + +.mec-skin-carousel-container + .mec-multiple-event + .event-carousel-type1-head + .mec-event-date-info-year, +.mec-skin-carousel-container + .mec-multiple-event + .event-carousel-type1-head + .mec-event-date-info { + left: 175px; +} + +.mec-skin-carousel-container .mec-time-details span, +.mec-skin-carousel-container .mec-time-details { + font-size: 11px; + font-weight: 400; + line-height: 1.9; + letter-spacing: 0; + color: #000; + border-radius: 2px; + white-space: nowrap; +} + +.mec-event-carousel-type4 .mec-time-details span, +.mec-event-carousel-type4 .mec-time-details { + color: #fff; +} + +.mec-skin-carousel-container .mec-time-details span { + margin: 0; + display: inline-block; +} + +@media only screen and (min-width: 768px) and (max-width: 1000px), + (min-width: 270px) and (max-width: 448px) { + .event-carousel-type1-head .mec-event-date-carousel { + font-size: 25px; + line-height: 2.5; + padding-right: 70px; + height: 64px; + width: 120px; + } + + .event-carousel-type1-head .mec-event-date-carousel:after { + left: 7px; + } + + .event-carousel-type1-head .mec-event-date-info { + font-size: 10px; + top: 13px; + left: 55px; + } + + .event-carousel-type1-head .mec-event-date-info-year { + font-size: 10px; + top: 25px; + left: 55px; + } + + .event-carousel-type1-head .mec-event-date-carousel:after { + top: 48px; + } +} + +/* MEC Events Carousel Type2 + ---------------------------- */ +.event-carousel-type2-head { + background: #fff; + border: 1px solid #e6e6e6; +} + +.event-carousel-type2-head .mec-event-carousel-content-type2 { + margin-top: 15px; + min-height: 182px; +} + +.event-carousel-type2-head + .mec-event-carousel-content-type2 + .mec-event-date-info { + font-size: 15px; + color: #9a9a9a; + font-weight: 300; +} + +.event-carousel-type2-head + .mec-event-carousel-content-type2 + .mec-event-carousel-title { + font-size: 26px; + font-weight: bold; + color: #1c1d21; + margin-top: 15px; + letter-spacing: -1px; +} + +.mec-event-carousel-content-type2 .mec-event-carousel-title a { + color: inherit; +} + +.mec-event-carousel-type2 + .event-carousel-type2-head + .mec-event-carousel-content-type2 + p { + font-size: 16px; + font-weight: 300; + color: #444444; +} + +.event-carousel-type2-head .mec-event-footer-carousel-type2 { + margin-top: 33px; + position: relative; + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: flex-end; +} + +.mec-event-carousel-type2 + .mec-event-footer-carousel-type2 + .mec-event-sharing-wrap { + padding-left: 0; + position: relative; + left: 0; + margin-right: auto; +} + +.event-carousel-type2-head + .mec-event-footer-carousel-type2 + .mec-event-sharing-wrap + > li { + border: none; + -webkit-transition: all 0.25s ease; + transition: all 0.25s ease; +} + +.event-carousel-type2-head + .mec-event-footer-carousel-type2 + .mec-booking-button { + border: 1px solid #e4e4e4; + padding: 7px 23px 7px; + font-size: 12px; + text-transform: uppercase; + color: #707070; + font-weight: 500; + -webkit-transition: all 0.25s ease; + transition: all 0.25s ease; +} + +.event-carousel-type2-head + .mec-event-footer-carousel-type2 + .mec-booking-button:hover { + color: #fff; +} + +.mec-event-article .event-carousel-type2-head { + padding: 10%; + margin-right: -1px; +} + +.mec-event-carousel-type2 .mec-owl-carousel .owl-wrapper-outer { + border-right: 1px solid #e6e6e6; +} + +.event-carousel-type2-head + .mec-event-footer-carousel-type2 + .mec-booking-button { + line-height: 17px; + height: 41px; + padding: 12px 10px; +} + +.event-carousel-type2-head + .mec-event-footer-carousel-type2 + .mec-modal-booking-button { + margin: 0; + padding: 12px 10px; + margin-left: 15px; +} + +.mec-wrap .mec-event-carousel-type2 .owl-prev, +.mec-wrap .mec-event-carousel-type2 .owl-next, +.mec-wrap .mec-event-carousel-type3 .owl-prev, +.mec-wrap .mec-event-carousel-type3 .owl-next, +.mec-wrap .mec-event-carousel-type4 .owl-prev, +.mec-wrap .mec-event-carousel-type4 .owl-next { + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 47%; + background-color: transparent !important; + position: absolute !important; +} + +.mec-event-carousel-type2 .owl-next { + right: -60px; +} + +.mec-event-carousel-type2 .owl-prev { + left: -60px; +} + +.mec-event-carousel-type2 .owl-prev, +.mec-event-carousel-type2 .owl-next, +.mec-event-carousel-type3 .owl-prev, +.mec-event-carousel-type3 .owl-next, +.mec-event-carousel-type4 .owl-prev, +.mec-event-carousel-type4 .owl-next { + border: none; +} + +.mec-event-carousel-type2 .owl-prev i, +.mec-event-carousel-type2 .owl-next i, +.mec-event-carousel-type3 .owl-prev i, +.mec-event-carousel-type3 .owl-next i, +.mec-event-carousel-type4 .owl-prev i, +.mec-event-carousel-type4 .owl-next i { + font-size: 40px; + color: #282828; +} + +.mec-event-carousel-type2 .owl-prev i:hover, +.mec-event-carousel-type2 .owl-next i:hover, +.mec-event-carousel-type3 .owl-prev i:hover, +.mec-event-carousel-type3 .owl-next i:hover { + color: #000; + cursor: pointer; +} + +.mec-event-footer-carousel-type2 .mec-event-sharing-wrap .mec-event-sharing { + top: auto; + bottom: 60px; +} + +.mec-event-footer-carousel-type2 + .mec-event-sharing-wrap + .mec-event-sharing:after, +.mec-event-footer-carousel-type2 + .mec-event-sharing-wrap + .mec-event-sharing:before { + top: auto; + bottom: -19px; + border-color: #e2e2e2 transparent transparent transparent; +} + +.mec-event-footer-carousel-type2 + .mec-event-sharing-wrap + .mec-event-sharing:after { + bottom: -18px; + border-color: #fff transparent transparent transparent; +} + +@media only screen and (min-width: 320px) and (max-width: 768px) { + .mec-event-carousel-type2 .owl-prev, + .mec-event-carousel-type2 .owl-next, + .mec-event-carousel-type3 .owl-prev, + .mec-event-carousel-type3 .owl-next, + .mec-event-carousel-type4 .owl-prev, + .mec-event-carousel-type4 .owl-next { + position: initial; + top: 100%; + } +} + +/* MEC Events Carousel Type3 + ----------------------------- */ +.mec-event-carousel-type3 .mec-event-article { + margin: 0 10px; +} + +.event-carousel-type3-head .mec-event-image, +.event-carousel-type3-head .mec-event-image img { + width: 100%; + height: auto; +} + +.event-carousel-type3-head .mec-event-footer-carousel-type3 { + background: #fff; + display: inline-block; + width: calc(100% - 40px); + margin-top: -74px; + position: relative; + margin-left: 20px; + margin-right: 20px; + margin-bottom: 6px; + padding: 8% 11%; + box-shadow: 0 2px 10px -2px rgba(0, 0, 0, 0.2); +} + +.event-carousel-type3-head + .mec-event-footer-carousel-type3 + .mec-booking-button { + border: 1px solid #e4e4e4; + text-transform: uppercase; + float: right; + padding: 0 10px; + font-size: 12px; + line-height: 36px; + color: #707070; + font-weight: 500; +} + +.event-carousel-type3-head + .mec-event-footer-carousel-type3 + .mec-booking-button:hover { + color: #fff; +} + +.mec-event-footer-carousel-type3 span { + font-size: 15px; + color: #9a9a9a; + font-weight: 300; +} + +.mec-event-footer-carousel-type3 .mec-event-carousel-title { + font-size: 29px; + font-weight: 700; +} + +.event-carousel-type3-head + .mec-event-footer-carousel-type3 + .mec-event-carousel-title { + font-size: 26px; + font-weight: bold; + color: #1c1d21; + margin-top: 15px; + letter-spacing: -1px; +} + +.mec-event-footer-carousel-type3 .mec-event-carousel-title a { + color: inherit; +} + +.event-carousel-type3-head .mec-event-footer-carousel-type3 p { + font-size: 16px; + font-weight: 300; + color: #444444 !important; + margin-bottom: 36px; +} + +.mec-event-carousel-type3 .owl-next { + right: -70px; +} + +.mec-event-carousel-type3 .owl-prev { + left: -70px; +} + +.mec-event-footer-carousel-type3 .mec-event-sharing-wrap { + position: static; + float: left; +} + +.mec-event-footer-carousel-type3 .mec-event-sharing-wrap .mec-event-sharing { + top: auto; + bottom: 60px; +} + +.mec-event-footer-carousel-type3 + .mec-event-sharing-wrap + .mec-event-sharing:after, +.mec-event-footer-carousel-type3 + .mec-event-sharing-wrap + .mec-event-sharing:before { + top: auto; + bottom: -19px; + border-color: #e2e2e2 transparent transparent transparent; +} + +.mec-event-footer-carousel-type3 + .mec-event-sharing-wrap + .mec-event-sharing:after { + bottom: -18px; + border-color: #fff transparent transparent transparent; +} + +.event-carousel-type3-head .mec-end-date-label { + display: inline; + margin-left: 2px; +} + +/* MEC Events Carousel Type4 + ----------------------------- */ +.event-carousel-type4-head.clearfix { + position: relative; + overflow: hidden; + background: #fff; +} + +.event-carousel-type4-head .mec-event-overlay { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + width: auto; + height: auto; + background-color: rgba(36, 36, 36, 0.4); + transition: all 0.33s ease-in-out; +} + +.mec-event-hover-carousel-type4 { + font-size: 15px; + color: #fff; + position: absolute; + bottom: 0; + padding: 50px 35px; + transition: all 0.33s ease-in-out; + opacity: 0; + visibility: hidden; +} + +.event-carousel-type4-head .mec-event-image img { + min-height: 360px; + object-fit: cover; +} + +.mec-event-carousel-type4 .mec-event-article { + margin: 0 10px; +} + +.mec-event-carousel-type4 + .mec-event-article:hover + .mec-event-hover-carousel-type4 { + opacity: 1; + visibility: visible; +} + +.mec-event-hover-carousel-type4 .mec-event-icon { + font-size: 18px; + float: left; + margin-right: 14px; + color: #fff; + padding: 13px; +} + +.mec-event-hover-carousel-type4 .mec-event-date { + font-size: 11px; + text-transform: uppercase; + font-weight: 400; + line-height: 1.6; + text-align: left; +} + +.mec-event-hover-carousel-type4 .mec-event-date span { + display: block; + font-weight: 700; + font-size: 14px; +} + +.mec-event-hover-carousel-type4 .mec-event-title { + color: #fff; + margin: 20px 0 38px; + font-size: 16px; + font-weight: 700; + text-transform: uppercase; + font-style: normal; +} + +.mec-event-hover-carousel-type4 .mec-btn-wrapper { + text-align: left; +} + +.mec-event-hover-carousel-type4 .mec-event-button { + color: #fff; + background-color: #191919; + border: 2px #191919 solid; + padding: 10px 14px; + letter-spacing: 1.5px; + font-size: 11px; + font-weight: 700; + font-style: normal; + transition: all 0.22s ease; + text-decoration: none; +} + +.mec-event-hover-carousel-type4 .mec-event-button:hover { + color: #191919; + background-color: #fff; + border-color: #fff; + border-radius: 1px; +} + +.mec-event-carousel-type4 .owl-next { + right: -70px; +} + +.mec-event-carousel-type4 .owl-prev { + left: -70px; +} + +.mec-carousel-type4-head { + margin-bottom: 25px; +} + +.mec-carousel-type4-head-title { + padding: 0 11px; + text-align: left; + font-weight: bold; + font-size: 20px; + color: #000; +} + +.mec-carousel-type4-head-link { + text-align: right; + padding: 0 11px; +} + +.mec-carousel-type4-head-link a { + background: #222; + color: #fff; + padding: 10px 38px; + transition: all 0.3s ease; +} + +.mec-carousel-type4-head-link a:hover, +.mec-carousel-type4-head-link a:visited { + color: #fff; +} + +@media (max-width: 960px) { + .mec-event-carousel-type4 .owl-stage { + left: -50px; + } +} + +/* MEC Countdown View Style1 + ----------------------------- */ +.mec-wrap .mec-event-countdown-style1 { + color: #fff; + padding: 0 !important; + display: table; + background: #437df9; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1 { + z-index: 5; + padding: 50px 1% 50px 4%; + display: table-cell; + float: none; + vertical-align: middle; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2 { + background-color: rgba(0, 0, 0, 0.05); + height: 100%; + padding-top: 0; + display: table-cell; + float: none; + position: relative; + vertical-align: middle; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3 { + background-color: #f8f8f8; + display: table-cell; + float: none; + text-align: center; + vertical-align: middle; +} + +.mec-wrap + .mec-event-countdown-style1 + .mec-event-countdown-part1 + .mec-event-title { + color: #fff; + font-size: 15px; + margin-top: 30px; +} + +.mec-wrap + .mec-event-countdown-style1 + .mec-event-countdown-part1 + .mec-event-upcoming { + font-size: 36px; + font-weight: bold; + line-height: 1; + margin-top: 0; +} + +.mec-wrap + .mec-event-countdown-style1 + .mec-event-countdown-part2 + .mec-event-countdown + > div { + display: inline-block; +} + +.mec-event-countdown-style1 .mec-events-meta-group-countdown { + color: #c9c9c9; + margin-bottom: 30px; + padding: 20px 30px; + background: #fff; + border: 1px solid #e6e6e6; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-countdown-style1 + .mec-event-countdown-part1 + .mec-event-upcoming + span { + display: block; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2:after { + content: ""; + position: absolute; + display: inline-block; + z-index: 1; + top: 50%; + margin-top: -11px; + right: -24px; + width: 0; + border-width: 12px; + border-style: solid; + border-color: transparent transparent transparent #4077ed; +} + +.mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date-place { + text-align: center; + padding-bottom: 8px; +} + +.mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date, +.mec-event-countdown-part2 .mec-event-place { + display: inline; + font-size: 14px; + padding: 0 5px; + text-align: center; +} + +.mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button { + display: inline-block; + padding: 14px 30px; + vertical-align: middle; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + color: #fff; + background: #4077ed; + transition: all 0.24s ease; +} + +.mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button:hover { + background: #222; +} + +.mec-event-countdown-style1 .mec-event-countdown { + text-align: center; + display: table; + table-layout: fixed; + margin: 0 auto; +} + +.mec-event-countdown-style1 .mec-event-countdown .label-w { + letter-spacing: 1px; + text-transform: uppercase; + position: relative; +} + +.mec-event-countdown-style1 .mec-event-countdown .block-w { + display: table-cell; + margin: 0 20px 10px; + position: relative; + height: 70px; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li { + background-color: rgba(0, 0, 0, 0.1); + margin: 5px; + padding: 20px 0; + min-width: 94px; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li span { + font-size: 30px; +} + +.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li .label-w { + font-size: 12px; + color: #fff; + margin: 8px 0 0; + line-height: 1; +} + +@media only screen and (min-width: 1200px) { + .mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part1, + .mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part2, + .mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part3 { + width: 100%; + display: block; + padding-top: 50px; + padding-bottom: 50px; + } + + .mec-wrap.mec-sm959 + .mec-event-countdown-style1 + .mec-event-countdown-part2:after { + border-color: #4077ed transparent transparent transparent; + top: auto; + margin-top: 0; + bottom: -24px; + margin-left: -11px; + left: 50%; + } +} + +@media (max-width: 960px) { + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1, + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2, + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3 { + width: 100%; + display: block; + padding-top: 50px; + padding-bottom: 50px; + } + + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2:after { + border-color: #4077ed transparent transparent transparent; + top: auto; + margin-top: 0; + bottom: -24px; + margin-left: -11px; + left: 50%; + transform: rotate(90deg); + } +} + +@media (max-width: 480px) { + .mec-event-countdown-style1 .mec-event-countdown .block-w { + margin: 3px; + height: auto; + } + + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown li { + padding: 10px 5px; + min-width: 50px; + margin: 3px 1px; + } + + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown li span { + font-size: 15px; + } + + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown li .label-w { + font-size: 8px; + } + + .mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date-place { + display: inline; + } +} + +/* MEC Countdown View Style2 + ----------------------------- */ +.mec-wrap .mec-event-countdown-style2 { + color: #fff; + padding: 30px 0; + background: #437df9; + max-width: 600px; +} + +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part1, +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2, +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part3 { + width: 100%; + float: none; + vertical-align: middle; + padding: 50px 10% 50px 10%; +} + +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2 { + padding-top: 12%; + padding-bottom: 0; +} + +.mec-wrap + .mec-event-countdown-style2 + .mec-event-countdown-part1 + .mec-event-title { + color: #fff; + font-size: 15px; + margin-top: 30px; +} + +.mec-wrap + .mec-event-countdown-style2 + .mec-event-countdown-part1 + .mec-event-upcoming { + font-size: 36px; + font-weight: bold; + line-height: 1; + margin-top: 0; +} + +.mec-wrap + .mec-event-countdown-style2 + .mec-event-countdown-part2 + .mec-event-countdown + > div { + display: inline-block; +} + +.mec-event-countdown-style2 .mec-events-meta-group-countdown { + color: #c9c9c9; + margin-bottom: 30px; + padding: 20px 30px; + background: #fff; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-countdown-style2 + .mec-event-countdown-part1 + .mec-event-upcoming + span { + display: block; +} + +.mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date-place { + text-align: left; + padding-bottom: 8px; +} + +.mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date, +.mec-event-countdown-part2 .mec-event-place { + display: inline; + font-size: 14px; + padding: 0 8px; +} + +.mec-event-countdown-style2 .mec-event-countdown-part3 .mec-event-button { + display: inline-block; + padding: 14px 30px; + vertical-align: middle; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + color: #222; + background: #fff; + transition: all 0.24s ease; +} + +.mec-event-countdown-style2 .mec-event-countdown-part3 .mec-event-button:hover { + background: #222; + color: #fff; +} + +.mec-event-countdown-style2 .mec-event-countdown { + text-align: center; + display: table; + table-layout: fixed; + margin: 0; +} + +.mec-event-countdown-style2 .mec-event-countdown .label-w { + letter-spacing: 1px; + text-transform: uppercase; + position: relative; +} + +.mec-event-countdown-style2 .mec-event-countdown .block-w { + display: table-cell; + margin: 0 20px 10px; + position: relative; + height: 70px; +} + +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li { + background-color: rgba(0, 0, 0, 0.1); + margin: 5px; + padding: 20px 0; + min-width: 94px; +} + +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span { + font-size: 30px; +} + +.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w { + font-size: 12px; + color: #fff; + margin: 8px 0 0; + line-height: 1; +} + +@media only screen and (max-width: 767px) { + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li { + min-width: 80px; + padding: 15px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span { + font-size: 26px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w { + font-size: 11px; + } +} + +@media only screen and (max-width: 479px) { + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li { + min-width: 40px; + padding: 15px 10px; + margin: 2px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span { + font-size: 20px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w { + font-size: 9px; + } +} + +@media (max-width: 380px) { + .mec-event-countdown-style2 .mec-event-countdown .block-w { + margin: 3px; + height: auto; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li { + padding: 10px 4px; + margin: 4px 1px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span { + font-size: 15px; + } + + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w { + font-size: 7px; + } +} + +/* MEC Countdown View Style3 + ----------------------------- */ +.mec-wrap .mec-event-countdown-style3 { + color: #fff; + padding: 0; + background: #282828; + display: table; + width: 100%; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 { + width: 68%; + padding: 50px 1% 50px 4%; + vertical-align: middle; + display: table-cell; + position: relative; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2 { + width: 32%; + display: table-cell; + position: relative; + padding-bottom: 0; + padding-top: 0; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2 img { + width: 100%; + display: block; +} + +.mec-wrap + .mec-event-countdown-style3 + .mec-event-countdown-part1 + .mec-event-countdown-part-title + span { + font-weight: 300; + display: block; +} + +.mec-wrap + .mec-event-countdown-style3 + .mec-event-countdown-part1 + .mec-event-upcoming { + color: #fff; + font-size: 36px; + letter-spacing: -2px; + font-weight: bold; + line-height: 1; + margin-top: -10px; +} + +.mec-wrap + .mec-event-countdown-style3 + .mec-event-countdown-part2 + .mec-event-countdown + > div { + display: inline-block; +} + +.mec-event-countdown-style3 .mec-events-meta-group-countdown { + color: #c9c9c9; + margin-bottom: 30px; + padding: 20px 30px; + background: #fff; + border: 1px solid #e6e6e6; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.016); +} + +.mec-event-countdown-style3 .mec-event-countdown-part2 .mec-event-date-place { + text-align: center; + padding-bottom: 8px; +} + +.mec-event-countdown-style3 .mec-event-countdown-part2 .mec-event-date, +.mec-event-countdown-part2 .mec-event-place { + display: inline; + font-size: 14px; + padding: 0 5px; + text-align: center; +} + +.mec-event-countdown-style3 .mec-event-countdown-part3 .mec-event-button { + display: inline-block; + padding: 14px 30px; + vertical-align: middle; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + color: #fff; + background: #4077ed; + transition: all 0.24s ease; +} + +.mec-event-countdown-style3 .mec-event-countdown-part3 .mec-event-button:hover { + background: #222; +} + +.mec-event-countdown-style3 .mec-event-countdown { + text-align: center; + display: table; + table-layout: fixed; + margin: 0 auto; + position: absolute; + top: 40px; + right: 20px; +} + +.mec-event-countdown-style3 .mec-event-countdown .label-w { + letter-spacing: 1px; + text-transform: uppercase; + position: relative; +} + +.mec-event-countdown-style3 .mec-event-countdown .block-w { + display: table-cell; + margin: 0 20px 10px; + position: relative; + height: 70px; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li { + padding: 15px; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li span { + font-size: 30px; +} + +.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li .label-w { + font-size: 11px; + color: #888; + margin: 8px 0 0; + line-height: 1; +} + +.mec-event-countdown-style3 .mec-event-date { + width: 176px; + height: 96px; + background: #40d9f1; + color: #fff; + font-size: 13px; + position: absolute; + left: -27px; + top: 146px; +} + +.mec-event-countdown-style3 .mec-event-date:after { + content: ""; + position: absolute; + display: inline-block; + z-index: 1; + bottom: -18px; + left: 8px; + width: 0; + border-width: 19px; + border-style: solid; + border-color: transparent transparent #40d9f1 transparent; + transform: rotate(45deg); +} + +.mec-event-countdown-style3 .mec-event-date .mec-date1 { + font-size: 50px; + position: absolute; + top: 7px; + left: 12px; + letter-spacing: -3px; +} + +.mec-event-countdown-style3 .mec-event-date .mec-date2 { + position: absolute; + left: 80px; + top: 26px; +} + +.mec-event-countdown-style3 .mec-event-date .mec-date3 { + position: absolute; + left: 80px; + top: 45px; +} + +.mec-event-countdown-style3 .mec-event-countdown-part-details { + padding-top: 35px; + margin-bottom: 50px; + min-height: 100px; +} + +.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-title { + font-size: 17px; + color: #fff; + line-height: 1.4; + padding-right: 20px; +} + +.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link { + color: #fff; + font-size: 12px; + position: relative; + padding-left: 22px; +} + +.mec-event-countdown-style3 + .mec-event-countdown-part-details + .mec-event-link:before { + content: ""; + display: inline-block; + width: 18px; + border-top: 1px solid #fff; + position: absolute; + left: 0; + top: 8px; +} + +.mec-event-countdown-style3 .mec-event-title-link { + position: absolute; + left: 190px; + top: 152px; +} + +.mec-event-countdown-style3 .mec-event-date:before, +.event-carousel-type1-head .mec-event-date-carousel:before { + content: ""; + position: absolute; + left: 0; + bottom: 0; + z-index: 2; + width: 100%; + height: 96px; + display: inline-block; + box-shadow: 0 5px 5px rgba(0, 0, 0, 0.12); + background: transparent; +} + +@media only screen and (min-width: 960px) { + .mec-wrap.mec-sm959 .mec-event-countdown-style3 .mec-event-countdown li { + padding: 10px; + } + + .mec-wrap.mec-sm959 + .mec-event-countdown-style3 + .mec-event-countdown-part1 + .mec-event-upcoming { + font-size: 31px; + } +} + +@media (max-width: 959px) { + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1, + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2 { + width: 100%; + display: block; + } + + .mec-event-countdown-style3 .mec-event-title-link { + top: 190px; + } + + .mec-event-countdown-style3 .mec-event-countdown { + top: 96px; + } + + .mec-event-countdown-style3 .mec-event-date { + left: 0; + top: 190px; + } + + .mec-event-countdown-style3 .mec-event-date:after { + display: none; + } + + .mec-wrap + .mec-event-countdown-style3 + .mec-event-countdown-part1 + .mec-event-countdown-part-title + span { + display: inline; + } + + .mec-event-countdown-style3 .mec-event-countdown-part-details { + min-height: 150px; + } +} + +@media (max-width: 767px) { + .mec-wrap + .mec-event-countdown-style3 + .mec-event-countdown-part1 + .mec-event-upcoming { + font-size: 26px; + letter-spacing: -1px; + } + + .mec-event-countdown-style3 .mec-event-title-link { + left: 130px; + } + + .mec-event-countdown-style3 .mec-event-date { + width: 120px; + font-size: 10px; + height: 63px; + } + + .mec-event-countdown-style3 .mec-event-date .mec-date1 { + font-size: 36px; + top: 3px; + left: 4px; + letter-spacing: -2px; + } + + .mec-event-countdown-style3 .mec-event-date .mec-date2 { + position: absolute; + left: 52px; + top: 12px; + } + + .mec-event-countdown-style3 .mec-event-date .mec-date3 { + position: absolute; + left: 52px; + top: 28px; + } +} + +@media (max-width: 380px) { + .mec-event-countdown-style3 .mec-event-title-link { + left: 10px; + top: 260px; + } + + .mec-event-countdown-style3 .mec-event-countdown-part-details { + min-height: 300px; + } + + .mec-event-countdown-style3 .mec-event-countdown .block-w { + margin: 3px; + height: auto; + } + + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown li { + padding: 10px 5px; + } + + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown li span { + font-size: 15px; + } + + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown li .label-w { + font-size: 8px; + } +} + +/* MEC Slider 1 + -------------------------------- */ +.mec-slider-t1-wrap { + width: 100%; + padding: 60px 90px; + background: #f7f7f7; + min-height: 560px; + position: relative; +} + +.mec-slider-t1 { + height: 500px; + box-shadow: 0 5px 35px 0 rgba(0, 0, 0, 0.13); +} + +.mec-slider-t1 .mec-event-article { + position: relative; + height: 500px; +} + +.mec-slider-t1 .mec-slider-t1-img { + position: relative; + background-size: cover !important; + background-position: center !important; + width: 50%; + height: 100%; + float: right; + margin: 0; + overflow: hidden; +} + +.mec-slider-t1 .mec-slider-t1-content { + width: 50%; + float: left; + height: 100%; + background: #fff; + padding: 6%; +} + +.mec-slider-t1-content.mec-event-grid-modern .mec-event-article { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +.mec-slider-t1-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-slider-t1-content.mec-event-grid-modern .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-slider-t1-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 12px; + padding: 0 31px; + line-height: 49px; + height: 50px; +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next { + opacity: 1; + width: 54px; + height: 54px; + line-height: 48px; + border-radius: 0; + text-align: center; + background: #fff; + box-shadow: 0 2px 11px 0 rgba(0, 0, 0, 0.045); + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 50%; + margin-top: -27px; + cursor: pointer; +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev:hover, +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next:hover { + box-shadow: 0 4px 29px 0 rgba(0, 0, 0, 0.095); +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next { + left: auto; + right: -100px; +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev { + right: auto; + left: -100px; +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i { + font-size: 12px; + color: #282828; + transition: all 0.21s ease; +} + +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev:hover i, +.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next:hover i { + font-size: 13px; + color: #000; + cursor: pointer; +} + +@media only screen and (min-width: 961px) { + .mec-slider-t1 { + margin: 0 auto; + max-width: 900px; + } +} + +@media only screen and (max-width: 960px) { + .mec-slider-t1 .mec-slider-t1-img, + .mec-slider-t1 .mec-slider-t1-content { + width: 100%; + float: none; + } + + .mec-slider-t1 .mec-slider-t1-img { + height: 300px; + } + + .mec-slider-t1, + .mec-slider-t1 .mec-event-article { + height: auto; + } +} + +@media only screen and (max-width: 768px) { + .mec-slider-t1-wrap { + padding: 0; + } + + .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev, + .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next { + top: 40px; + margin-top: 0; + } + + .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next { + left: auto; + right: 10px; + } + + .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev { + right: auto; + left: 10px; + } +} + +@media only screen and (max-width: 479px) { + .mec-slider-t1-content.mec-event-grid-modern .mec-event-title { + font-size: 22px; + } + + .mec-slider-t1-content.mec-event-grid-modern + .event-grid-modern-head + .mec-event-day { + font-size: 25px; + } +} + +/* MEC Slider 2 + -------------------------------- */ +.mec-slider-t2-wrap { + width: 100%; + padding: 0; + background: #fff; + min-height: 600px; + position: relative; +} + +.mec-slider-t2 .mec-event-article { + height: 600px; + position: relative; + border: none; + padding: 0; + margin: 0; + box-shadow: none; + background: none; +} + +.mec-slider-t2 .mec-slider-t2-img { + position: absolute; + left: 0; + top: 0; + background-size: cover !important; + background-position: center !important; + width: 70%; + height: 100%; + margin: 0; + overflow: hidden; +} + +.mec-slider-t2 .mec-slider-t2-content { + width: 50%; + position: absolute; + right: 0; + top: 60px; + bottom: 60px; + padding: 3%; +} + +.mec-slider-t2 .mec-slider-t2-content.mec-event-grid-modern * { + color: #fff; +} + +.mec-slider-t2 .mec-slider-t2-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-slider-t2-content.mec-event-grid-modern .mec-event-content, +.mec-slider-t2-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + background: none; +} + +.mec-slider-t2-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 12px; + padding: 0 31px; + line-height: 49px; + height: 50px; +} + +.mec-slider-t2-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button:hover { + background: #fff; + color: #000; + border-color: #fff; +} + +.mec-slider-t2-content.mec-event-grid-modern .mec-event-title a:hover, +.mec-slider-t2-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button:hover { + color: #111; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next { + opacity: 1; + width: 44px; + height: 44px; + line-height: 38px; + border-radius: 0; + text-align: center; + background: transparent; + border: 1px solid #fff; + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 84px; + cursor: pointer; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev:hover, +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next:hover { + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.075); + background: #fff; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next { + right: 30px; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev { + right: 82px; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next i { + font-size: 14px; + color: #fff; + opacity: 1; + transition: all 0.25s ease; +} + +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev:hover i, +.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next:hover i { + color: #000; + cursor: pointer; +} + +.mec-wrap.colorskin-custom + .mec-slider-t2 + .mec-event-article + .mec-event-date.mec-color { + color: #fff; +} + +@media only screen and (min-width: 961px) { + .mec-slider-t2 { + margin: 0 auto; + max-width: 1200px; + } +} + +@media only screen and (max-width: 960px) { + .mec-slider-t2 .mec-slider-t2-img, + .mec-slider-t2 .mec-slider-t2-content { + width: 100%; + float: none; + position: static; + } + + .mec-slider-t2 .mec-slider-t2-img { + height: 300px; + } + + .mec-slider-t2 .mec-event-article { + height: auto; + } + + .mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev, + .mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next { + top: 40px; + } +} + +@media only screen and (max-width: 479px) { + .mec-slider-t2-content.mec-event-grid-modern .mec-event-title { + font-size: 22px; + } +} + +/* MEC Slider 3 + -------------------------------- */ +.mec-slider-t3-wrap { + width: 100%; + padding: 0; + background: #161616; + min-height: 700px; + position: relative; +} + +.mec-slider-t3 .mec-event-article { + height: 700px; + position: relative; + border: none; + padding: 0; + margin: 0; + box-shadow: none; + background: none; +} + +.mec-slider-t3 .mec-slider-t3-img { + position: absolute; + left: 0; + top: 0; + background-size: cover !important; + background-position: center !important; + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; + opacity: 0.68; + z-index: 1; +} + +.mec-slider-t3 .mec-slider-t3-content { + width: 50%; + height: auto; + vertical-align: middle; + display: table; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + bottom: 0; + padding: 0 2% 0 7%; + margin: auto 0; + background: none; + z-index: 2; +} + +.mec-slider-t3 .mec-slider-t3-content.mec-event-grid-modern *:not(.mec-color) { + color: #fff; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-event-content, +.mec-slider-t3-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + background: none; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-booking-button { + display: inline-block; + border: 1px solid; + font-weight: 500; + letter-spacing: 1px; + text-transform: uppercase; + font-size: 13px; + padding: 0 42px; + line-height: 49px; + height: 50px; + transition: all 0.21s ease; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-booking-button:hover { + background: #fff; + color: #000; + border-color: #fff; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-slider-t3-footer { + text-align: left; + padding: 15px 15px 10px; +} + +.mec-slider-t3-content.mec-event-grid-modern .mec-event-title a:hover, +.mec-slider-t3-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button:hover { + color: #40d9f1; +} + +.mec-slider-t3-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button:hover { + border-color: #40d9f1; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next { + opacity: 1; + width: 44px; + height: 44px; + line-height: 38px; + border-radius: 0; + text-align: center; + background: transparent; + border: 1px solid #fff; + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 50%; + margin-top: -22px; + cursor: pointer; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev:hover, +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next:hover { + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.075); + background: #fff; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next { + right: 10px; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev { + right: auto; + left: 10px; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next i { + font-size: 14px; + color: #fff; + opacity: 1; + transition: all 0.25s ease; +} + +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev:hover i, +.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next:hover i { + color: #000; + cursor: pointer; +} + +@media only screen and (min-width: 961px) { + .mec-slider-t3-content.mec-event-grid-modern .mec-event-title { + font-size: 50px; + font-weight: 300; + } + + .mec-slider-t3-content.mec-event-grid-modern .mec-event-description { + font-size: 19px; + } +} + +.mec-event-description { + line-height: 1.7; +} + +@media only screen and (max-width: 767px) { + .mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev, + .mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next { + top: 40px; + margin-top: 0; + } +} + +@media only screen and (max-width: 479px) { + .mec-slider-t3 .mec-slider-t3-content { + width: 100%; + } + + .mec-slider-t3-content.mec-event-grid-modern .mec-event-title { + font-size: 22px; + } + + .mec-slider-t1-content.mec-event-grid-modern + .event-grid-modern-head + .mec-event-day { + font-size: 25px; + } +} + +/* MEC Slider 4 + -------------------------------- */ +.mec-slider-t4-wrap { + width: 100%; + padding: 0; + background: #161616; + min-height: 700px; + position: relative; +} + +.mec-slider-t4 .mec-event-article { + height: 700px; + border: none; + padding: 0; + margin: 0; + box-shadow: none; + background: none; +} + +.mec-slider-t4 .mec-slider-t4-img { + position: absolute; + left: 0; + top: 0; + background-size: cover !important; + background-position: center !important; + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; + z-index: 1; +} + +.mec-slider-t4 .mec-slider-t4-content { + width: auto; + max-width: 700px; + background: rgba(37, 37, 37, 0.94) !important; + height: auto; + vertical-align: middle; + display: table; + position: absolute; + left: 8%; + top: 19%; + padding: 3%; + margin: auto 0; + background: none; + z-index: 2; +} + +.mec-slider-t4 .mec-slider-t4-content.mec-event-grid-modern *:not(.mec-color) { + color: #fff; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-event-content, +.mec-slider-t4-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + background: none; +} + +.mec-slider-t4-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 13px; + padding: 0 42px; + line-height: 49px; + height: 50px; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-event-title a:hover { + color: #40d9f1; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-slider-t4-footer { + text-align: left; + padding: 15px 15px 10px; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-booking-button { + display: inline-block; + border: 1px solid; + font-weight: 500; + letter-spacing: 1px; + text-transform: uppercase; + font-size: 13px; + padding: 0 42px; + line-height: 49px; + height: 50px; + transition: all 0.21s ease; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-booking-button:hover { + background: #fff; + color: #000; + border-color: #fff; +} + +.mec-slider-t4-content.mec-event-grid-modern .mec-event-title a:hover, +.mec-slider-t4-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button:hover { + color: #111; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next { + opacity: 1; + width: 44px; + height: 44px; + line-height: 40px; + border-radius: 0; + text-align: center; + background: transparent; + border: 1px solid #fff; + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 34px; + cursor: pointer; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev:hover, +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next:hover { + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.075); + background: #fff; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next { + right: 60px; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev { + right: 112px; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next i { + font-size: 14px; + color: #fff; + opacity: 1; + transition: all 0.25s ease; +} + +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev:hover i, +.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next:hover i { + color: #000; + cursor: pointer; +} + +@media only screen and (max-width: 767px) { + .mec-slider-t4 .mec-slider-t4-content { + width: 100%; + left: 0; + top: auto; + bottom: 0; + } + + .mec-slider-t4-content.mec-event-grid-modern .mec-event-title { + font-size: 22px; + } + + .mec-slider-t1-content.mec-event-grid-modern + .event-grid-modern-head + .mec-event-day { + font-size: 25px; + } +} + +/* MEC Slider 5 + -------------------------------- */ +.mec-slider-t5-wrap { + width: auto; + max-width: 570px; + padding: 0; + margin: 0 auto 25px; + background: #f7f7f7; + min-height: 480px; + position: relative; +} + +.mec-slider-t5 { + height: auto; + box-shadow: 0 5px 35px 0 rgba(0, 0, 0, 0.13); +} + +.mec-slider-t5 .mec-event-article { + position: relative; + height: auto; +} + +.mec-slider-t5 .mec-slider-t5-img { + position: relative; + background-size: cover !important; + background-position: center !important; + width: 100%; + height: 300px; + float: none; + margin: 0; + overflow: hidden; +} + +.mec-slider-t5 .mec-slider-t5-content { + width: 100%; + float: none; + height: 100%; + background: #fff; + padding: 0 20px 20px; + margin-bottom: 0; +} + +.mec-slider-t5 .mec-events-content p { + margin-bottom: 20px; +} + +.mec-slider-t5-content.mec-event-grid-modern .mec-event-article { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +.mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head { + margin-bottom: 10px; + padding: 14px 34px; + margin-left: -20px; + margin-right: -20px; + text-align: left; + background: #f9f9f9; + border-bottom: 1px solid #eee; +} + +.mec-slider-t5-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-slider-t5 .mec-slider-t5-col6 { + width: 50%; + float: left; + height: 100%; +} + +.mec-slider-t5 .mec-slider-t5-col6 i { + font-size: 42px; + float: left; + margin-right: 7px; + height: 58px; +} + +.mec-slider-t5 .mec-slider-t5-col6 h6 { + text-transform: uppercase; + font-size: 17px; + padding: 4px 0; + display: inline; + color: #444; +} + +.mec-slider-t5 .mec-slider-t5-col6 address { + font-size: 12px; + margin-bottom: 0; +} + +.mec-slider-t5-content.mec-event-grid-modern .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-slider-t5-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 12px; + padding: 0 31px; + line-height: 49px; + height: 50px; + top: 0; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next { + opacity: 1; + width: 44px; + height: 44px; + line-height: 40px; + border-radius: 0; + text-align: center; + background: transparent; + border: 1px solid #fff; + transition: all 0.25s ease; + -webkit-transition: all 0.25s ease; + position: absolute; + top: 34px; + cursor: pointer; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev:hover, +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next:hover { + box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.075); + background: #fff; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next { + right: 30px; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev { + right: 82px; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next i { + font-size: 14px; + color: #fff; + opacity: 1; + transition: all 0.25s ease; +} + +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev:hover i, +.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next:hover i { + color: #000; + cursor: pointer; +} + +@media only screen and (max-width: 768px) { + .mec-slider-t5 .mec-slider-t5-col6 { + width: 100%; + margin: 10px 0; + } +} + +@media only screen and (max-width: 479px) { + .mec-slider-t5-content.mec-event-grid-modern .mec-event-title { + font-size: 24px; + } +} + +/* MEC Single Modern + -------------------------------- */ +.mec-single-modern .mec-events-event-image { + text-align: center; +} + +.mec-single-modern .mec-events-event-image img { + width: 100%; +} + +.mec-single-modern .mec-single-event-bar { + margin: 20px 0 0; + padding: 15px; + display: table; + width: 100%; + background: #fff; + border: 1px solid #e6e6e6; +} + +.mec-single-modern .mec-single-event-bar > div { + display: table-cell; +} + +.mec-single-modern .mec-single-event-bar > div i { + font-size: 20px; + vertical-align: middle; +} + +.mec-single-modern .mec-single-event-bar > div .mec-time-comment { + font-size: 12px; + color: #999; +} + +.mec-single-modern .mec-single-event-bar > div h3 { + text-transform: uppercase; + font-size: 16px; + font-weight: bold; + padding-bottom: 5px; + display: inline; + color: #000; + padding-left: 10px; +} + +.mec-single-modern .mec-single-event-bar > div dd { + font-size: 14px; + color: #8d8d8d; + padding-left: 34px; + margin-bottom: 0; +} + +.mec-single-modern .col-md-4 .mec-sponsors-details, +.mec-single-modern .col-md-4 .mec-frontbox { + margin-top: -50px; + margin-bottom: 70px; + padding: 20px; + border: 1px solid #e6e6e6; + box-shadow: none; +} + +.mec-single-modern .col-md-4.mec-no-image .mec-frontbox { + margin-top: 20px; +} + +.mec-next-occurrence ul { + padding-left: 0; + margin-left: 0; +} + +.mec-next-occurrence li { + list-style: none; +} + +@media only screen and (min-width: 960px) { + .mec-single-modern .col-md-4 .mec-sponsors-details, + .mec-single-modern .col-md-4 .mec-frontbox { + margin-left: 20px; + } + + .featherlight-content .col-md-4 .mec-sponsors-details { + margin-left: 0; + margin-bottom: 15px; + } +} + +@media only screen and (max-width: 960px) { + .mec-single-modern .mec-single-event-bar > div { + display: block; + } +} + +.lity-content > div { + overflow: auto; + max-height: 80vh !important; +} + +.mec-next-event-details li { + list-style: none; + margin-top: 20px; +} + +.mec-next-event-details h6 { + text-transform: uppercase; + font-size: 13px; + padding-bottom: 5px; + display: inline; + color: #222; + padding-left: 0; +} + +.mec-next-event-details abbr { + display: block; + padding-left: 0; + color: #8d8d8d; +} + +.mec-next-event-details i { + margin-right: 10px; + margin-left: 12px; +} + +.mec-next-event-details i:before { + color: #40d9f1; +} + +.mec-next-event-details a { + text-align: center; + display: block; + background: #fff; + padding: 6px 0; + font-size: 11px; + font-weight: 400; + letter-spacing: 0; + border: 1px solid #e3e3e3; + transition: 0.3s; +} + +.mec-active-occurrence-button { + margin-top: 20px; +} + +/* MEC Single Modal + -------------------------------- */ +.mec-single-modal.mec-single-modern .mec-single-title { + text-align: center; + padding: 15px 10px 0; +} + +.admin-bar .mec-single-modal.mec-single-modern .mec-single-title { + padding-top: 40px; +} + +.mec-single-modal.mec-single-modern .mec-single-event-bar { + width: calc(100% - 30px); + margin: 0 auto 15px; + padding: 5px; +} + +.mec-single-modal.mec-single-modern .mec-events-event-image { + width: calc(100% - 30px); + margin: 0 auto; +} + +.mec-single-modal.mec-single-modern .mec-single-event-bar > div dd { + font-size: 13px; +} + +.mec-single-modal.mec-single-modern .mec-single-event-bar > div h3 { + font-size: 15px; +} + +@media only screen and (min-width: 960px) { + .mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox { + margin-left: 0; + } +} + +.mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox { + margin-top: 10px; + margin-bottom: 10px; +} + +.mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox.mec-event-meta { + padding: 0; +} + +@media (min-width: 961px) { + .mec-single-event.mec-sticky { + position: relative; + } + + .mec-single-event.mec-sticky .col-md-4 { + position: -webkit-sticky; + position: sticky; + top: 120px; + } + + .mec-single-modern.mec-sticky .col-md-4 { + top: 170px; + } + + /* Margin on Sticky Sidebar */ + .single-mec-events .mec-sticky .col-md-8 > div:last-child { + margin-bottom: 30px; + } + + .single-mec-events .mec-single-modern.mec-sticky .col-md-8 > div:last-child { + margin-bottom: 70px; + } +} + +.mec-single-modal .mec-event-meta dd.mec-organizer-url a, +.mec-single-modal .mec-event-meta dd.mec-organizer-email a { + font-size: 12px; + display: block; +} + +.mec-organizer-description p { + padding-left: 12px; +} + +.mec-modal-wrap { + max-width: 90vw; + max-height: 90vh !important; + background: #fff; + box-shadow: 0 1px 55px rgba(0, 0, 0, 0.5); + overflow-x: hidden !important; +} + +@media (max-width: 1023px) { + .mec-modal-wrap { + max-width: 80vw; + } +} + +.mec-single-modal + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li, +.mec-single-modal + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a.mec-events-button { + display: block; + text-align: center; +} + +.mec-single-modal + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li:first-child { + margin-bottom: 20px; +} + +/* Expired and Ongoing Event Label */ +.mec-holding-status-expired { + color: #d8000c; +} + +.mec-holding-status-ongoing { + color: #0dbf52; +} + +/* Feather Light Modal */ + +body .featherlight { + z-index: 999999 !important; +} + +body .featherlight .featherlight-content { + background: transparent; + overflow: unset; + z-index: 9999; +} + +body .featherlight .featherlight-close-icon { + position: fixed; + top: 40px; + right: 40px; + background: transparent; + color: #fff; + border: 1px solid #fff; + border-radius: 0; +} + +body .featherlight .featherlight-close-icon:hover { + background: #fff; + color: #000; + border: 1px solid #000; +} + +/* filp-clock Responsive */ +@media (max-width: 320px) { + .mec-wrap span.flip-clock-divider { + width: 20px; + } + + .mec-single-event .mec-events-meta-group-countdown { + padding: 15px 12%; + } +} + +@media only screen and (min-width: 320px) and (max-width: 767px) { + .mec-wrap .flip-clock-wrapper ul { + padding: 0; + } +} + +@media (max-width: 414px) { + .mec-wrap span.flip-clock-divider { + width: 30px; + } + + .mec-single-event .mec-events-meta-group-countdown { + margin-left: 0; + padding: 15px 7%; + } +} + +@media (max-width: 480px) { + body .featherlight .featherlight-content { + width: 95%; + } + + .mec-wrap span.flip-clock-divider { + width: 7px; + } + + .mec-single-event .mec-events-meta-group-countdown { + margin-left: 0; + padding: 15px 1%; + } + + /* Close Button - Feather Light Modal */ + body .featherlight .featherlight-close-icon { + color: #000; + border-color: #000; + } +} + +@media (max-width: 1366px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 20px !important; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 20px 15px; + } + + body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul { + width: 48px; + } +} + +@media (max-width: 1280px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 14px !important; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 15px 10px; + } + + body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul { + width: 38px; + } +} + +@media (min-width: 961px) and (max-width: 1024px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 7px !important; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 15px 5px; + } + + body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul { + width: 14px; + } + + body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul li a div { + font-size: 30px; + } +} + +@media (max-width: 640px) { + body .mec-modal-wrap .mec-single-modal.featherlight-close-icon { + top: 14px; + right: 14px; + } +} + +@media (max-width: 480px) { + .featherlight .featherlight-content, + body .mec-modal-wrap { + max-width: 100%; + } + + body .mec-modal-wrap.flip-clock-divider .flip-clock-label { + display: block; + } +} + +@media (max-width: 414px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 50px !important; + } + + .mec-wrap .flip-clock-divider .flip-clock-label { + display: none; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 20px 5px 20px 65px; + } + + body + .featherlight-content + .mec-modal-wrap + .mec-single-modal + .mec-events-meta-group-countdown { + padding: 20px 2px 20px 2px !important; + } + + body + .featherlight-content + .mec-modal-wrap + .mec-single-modal + .flip-clock-divider:not(:first-child) { + width: 3px !important; + } +} + +@media (max-width: 375px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 50px !important; + } + + .mec-wrap .flip-clock-divider .flip-clock-label { + display: none; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 20px 5px 20px 45px; + } +} + +@media (max-width: 320px) { + body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child) { + width: 20px !important; + } + + body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown { + padding: 20px 5px 20px 40px; + } +} + +/* Other themes conflict fix on MEC */ +.mec-single-event-bar dd { + margin-left: 0; +} + +/* MEC Toggle List + -------------------------------- */ +.mec-events-toggle { + max-width: 960px; + margin-left: auto; + margin-right: auto; +} + +.mec-events-toggle .mec-toggle-item { + border: 1px solid #e4e4e4; + margin-bottom: 15px; + box-shadow: 0 10px 15px #f3f3f3; +} + +.mec-events-toggle .mec-toggle-item-inner { + cursor: pointer; + position: relative; + padding: 30px 60px 30px 15px; + background: #fff; + transition: all 0.3s ease; + min-height: 100px; + display: table; + width: 100%; + border-collapse: separate; +} + +.mec-events-toggle .mec-toggle-item-inner:hover { + background: #fbfbfb; +} + +.mec-toggle-item-col { + width: 200px; + border-right: 1px solid #e3e3e3; + margin-right: 15px; + display: table-cell; + padding-right: 5px; +} + +.mec-toggle-item-col .mec-event-date { + font-size: 38px; + line-height: 40px; + float: left; + margin-right: 8px; +} + +.mec-toggle-item-col .mec-event-month, +.mec-toggle-item-col .mec-time-details { + text-transform: uppercase; + font-size: 12px; + line-height: 14px; + padding-top: 4px; + font-weight: 700; +} + +.mec-toggle-item-col .mec-event-detail { + font-size: 10px; +} + +.mec-toggle-item-col .mec-event-day { + margin-top: 9px; + color: #c0c0c0; + font-size: 35px; + font-weight: 100; + text-transform: uppercase; + letter-spacing: -1px; +} + +.mec-events-toggle .mec-toggle-title { + color: #000; + font-size: 23px; + font-weight: 600; + margin-bottom: 0; + transition: all 0.3s ease; + display: table-cell; + text-align: left; + max-width: calc(100% - 200px); + padding-left: 15px; + vertical-align: middle; +} + +.mec-events-toggle .mec-toggle-item-inner span.event-color { + width: 5px; + height: 100%; + position: absolute; + left: -1px; + top: 0; + bottom: 0; + border-radius: 0; + margin: 0; +} + +.mec-events-toggle .mec-toggle-item-inner i { + position: absolute; + font-size: 30px; + right: 25px; + top: 50%; + transform: translate(0, -50%); + cursor: pointer; +} + +.mec-events-toggle .mec-toggle-item.is-open i.mec-sl-plus:before { + content: "\e615"; +} + +.mec-events-toggle .mec-toggle-item.is-open .mec-toggle-title { + background: #f8f8f8; + cursor: pointer; +} + +.mec-events-toggle .mec-toggle-content { + border-top: 1px solid #e4e4e4; +} + +.mec-events-toggle .mec-toggle-content .mec-modal-wrap { + margin: 0; + max-width: 100%; + box-shadow: none; +} + +.mec-events-toggle .mec-toggle-content .mec-modal-wrap .mec-single-event { + margin: 0; +} + +.mec-events-toggle .mec-toggle-content h1.mec-single-title, +.mec-events-toggle .mec-toggle-content .mec-single-event-bar { + display: none; +} + +.mec-events-toggle .media-links a { + margin-bottom: 0; +} + +.mec-events-toggle .mec-toggle-content .mec-toggle-meta { + margin-bottom: 14px; +} + +.mec-events-toggle .mec-toggle-content .mec-frontbox { + padding: 12px 14px 8px; +} + +.mec-events-toggle .mec-toggle-content .mec-frontbox .mec-speakers-details { + border: none; +} + +.mec-events-toggle .mec-toggle-content .mec-frontbox .mec-speakers-details ul { + padding-left: 0; +} + +.mec-events-toggle #mec_speakers_details.mec-frontbox { + padding: 0; + margin: 0; +} + +.mec-events-toggle .mec-toggle-item h3.mec-speakers { + border: none; + text-align: left; + margin-bottom: 20px; +} + +.mec-events-toggle .mec-toggle-item h3.mec-speakers:before { + content: "\e063"; + font-family: simple-line-icons; + border: none; + position: relative; + display: inline-block; + left: 3px; + bottom: unset; + font-size: 22px; + font-weight: normal; + padding: 0 11px 0 28px; + vertical-align: middle; +} + +.mec-events-toggle .mec-event-data-fields.mec-frontbox { + border: none; + padding: 0; + overflow: visible; +} + +@media only screen and (max-width: 767px) { + .mec-toggle-item-inner .mec-toggle-item-col { + float: none; + width: 100%; + border-right: none; + margin-bottom: 5px; + display: block; + max-width: 100%; + padding-left: 15px; + } + + .mec-events-toggle .mec-toggle-title { + display: block; + width: 100%; + max-width: 100%; + } +} + +/* MEC Agenda View + -------------------------------- */ +.mec-events-agenda-wrap { + margin: 10px 0; + border: 1px solid #e9e9e9; + background: #fff; + padding-left: 20px; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.03); +} + +.mec-events-agenda { + padding: 0; + border-bottom: 1px solid #e9e9e9; +} + +.mec-agenda-date-wrap { + width: 210px; + padding-top: 15px; + float: left; + font-size: 13px; +} + +.mec-agenda-date-wrap i, +.mec-agenda-event i { + font-size: 11px; + color: #aaa; + margin-right: 4px; + margin-left: 1px; +} + +.mec-agenda-event i { + vertical-align: middle; + margin-right: 1px; +} + +.mec-agenda-events-wrap { + float: left; + width: calc(100% - 210px); + background: #f9f9f9; + padding: 15px; +} + +.mec-agenda-event { + margin-bottom: 10px; +} + +.mec-agenda-time { + font-size: 11px; + color: #707070; + padding-right: 10px; + width: 138px; + display: inline-block; +} + +.mec-agenda-event-title { + position: relative; + padding-left: 14px; +} + +.mec-agenda-event-title a { + font-size: 14px; + font-weight: 600; + color: #333; +} + +.mec-agenda-event-title span.event-color { + width: 9px; + height: 9px; + position: absolute; + left: 0; + top: 6px; + margin: 0; +} + +.mec-agenda-date-wrap span.mec-agenda-day { + color: #aaa; + font-size: 12px; +} + +@media only screen and (max-width: 767px) { + .mec-agenda-date-wrap, + .mec-agenda-events-wrap { + float: none; + width: 100%; + } + + .mec-events-agenda-wrap { + padding-left: 0; + } + + .mec-events-agenda span.mec-agenda-event-title { + display: block; + width: 100%; + } + + .mec-agenda-event-title span.event-color { + top: 7px; + } + + .mec-agenda-event-title a { + font-size: 13px; + } +} + +/* MEC Yearly View + -------------------------------- */ +.mec-yearly-view-wrap { + margin: 0 0 15px; + border: 1px solid #e6e6e6; + background: #fff; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); + border-bottom-width: 4px; +} + +.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar { + max-width: 100%; + width: 232px; + padding: 10px; + background: #fff; + margin: 10px; + display: inline-block; +} + +.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar dl dt { + transition: none; + height: 30px; + width: 30px; + line-height: 30px; + border-radius: 0; + font-size: 12px; +} + +.mec-yearly-view-wrap + .mec-calendar.mec-yearly-calendar + .mec-calendar-events-sec { + padding: 10px; +} + +.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar .mec-has-event:after { + width: 4px; + height: 4px; + bottom: 3px; + margin-left: -2px; +} + +.mec-yearly-view-wrap .mec-calendar-side .mec-calendar-table { + min-height: 200px; +} + +.mec-calendar.mec-yearly-calendar .mec-calendar-table-head dl dt { + background: #f9f9f9; + font-size: 13px; +} + +.mec-calendar.mec-yearly-calendar .mec-calendar-table-title { + text-align: center; + font-size: 15px; + font-weight: 700; + color: #222; + margin-top: -5px; + padding-bottom: 5px; +} + +.mec-yearly-view-wrap .mec-yearly-calendar-sec { + min-height: 200px; + width: 538px; + overflow: hidden; + float: left; + background: #f8f8f8; + padding: 15px; +} + +.mec-yearly-view-wrap .mec-yearly-agenda-sec { + min-height: 200px; + width: calc(100% - 538px); + float: left; + padding: 0 0 0 20px; + overflow: hidden; +} + +.mec-yearly-view-wrap .mec-yearly-title-sec { + position: relative; + padding: 15px; + text-align: center; + border-bottom: 1px solid #e6e6e6; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02); +} + +.mec-yearly-view-wrap .mec-yearly-title-sec h2 { + font-size: 30px; + line-height: 40px; + color: #333; + margin: 0; + font-weight: 700; +} + +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year { + position: absolute; + top: 50%; + margin-top: -15px; + min-width: 30px; + height: 30px; + line-height: 30px; + padding: 0 8px; + text-align: center; + background: #fff; + color: #666; + font-size: 14px; + border: 1px solid #eee; + border-radius: 2px; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.015); + transition: all 0.33s ease; + cursor: pointer; +} + +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year { + right: auto; + left: 20px; + padding-right: 14px; +} + +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year { + left: auto; + right: 20px; + padding-left: 14px; +} + +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year i, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year i { + font-size: 12px; + color: #40d9f1; + cursor: pointer; +} + +.mec-yearly-view-wrap .mec-events-agenda.mec-selected { + box-shadow: -10px 0 0 0 #fffcf2, 0 -1px 0 #fbebb6; + background: #fffcf2; + border-color: #fbebb6; + color: #f9af29; +} + +.mec-yearly-agenda-sec span.mec-event-label-captions.mec-fc-style { + right: 0; + top: 0; +} + +@media only screen and (max-width: 959px) { + .mec-yearly-view-wrap .mec-yearly-calendar-sec { + width: 268px; + padding: 10px 5px; + } + + .mec-yearly-view-wrap .mec-yearly-agenda-sec { + width: calc(100% - 268px); + padding: 0 0 0 10px; + } +} + +@media only screen and (max-width: 767px) { + .mec-yearly-view-wrap .mec-yearly-calendar-sec, + .mec-yearly-view-wrap .mec-yearly-agenda-sec { + width: 100%; + float: none; + } + + .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar { + width: auto; + } + + .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar dl dt { + width: 14.2%; + } + + .mec-yearly-view-wrap .mec-yearly-title-sec h2 { + font-size: 25px; + } +} + +/* agenda in yearly view */ +.mec-yearly-view-wrap .mec-agenda-time, +.mec-yearly-view-wrap .mec-agenda-event i { + display: none; +} + +@media only screen and (min-width: 768px) { + .mec-yearly-view-wrap .mec-events-agenda-wrap { + margin-top: 0; + border: none; + padding-left: 0; + box-shadow: none; + } + + .mec-yearly-view-wrap .mec-agenda-date-wrap { + width: 174px; + font-size: 11px; + padding-top: 10px; + } + + .mec-yearly-view-wrap .mec-agenda-events-wrap { + width: calc(100% - 174px); + padding: 10px; + } + + .mec-yearly-view-wrap .mec-agenda-event-title a { + font-size: 13px; + } + + .mec-yearly-view-wrap .mec-agenda-event-title span.event-color { + width: 8px; + height: 8px; + } + + .mec-yearly-view-wrap .mec-agenda-date-wrap span.mec-agenda-day { + font-size: 11px; + } + + .mec-yearly-view-wrap .mec-yearly-calendar-sec { + box-shadow: -2px 0 5px rgba(0, 0, 0, 0.03) inset; + } +} + +@media only screen and (max-width: 1200px) { + .mec-yearly-view-wrap .mec-agenda-event-title a { + font-size: 12px; + padding-right: 6px; + } +} + +/* Timetable View + -------------------------------- */ +.mec-calendar.mec-calendar-timetable .mec-calendar-d-table { + padding-bottom: 10px; + border-bottom: none; +} + +.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt:hover { + cursor: pointer; +} + +.mec-calendar.mec-calendar-timetable + .mec-calendar-d-table + dl + dt.mec-timetable-has-no-event, +.mec-calendar.mec-calendar-timetable + .mec-calendar-d-table + dl + dt.mec-timetable-has-no-event:hover { + color: #bbb; + cursor: default; +} + +.mec-calendar.mec-calendar-timetable + .mec-calendar-d-table + dl + dt.mec-timetable-day-active { + background: #40d9f1; + color: #fff; + position: relative; +} + +.mec-calendar.mec-calendar-timetable + .mec-calendar-d-table + dl + dt.mec-timetable-day-active:after { + content: ""; + position: absolute; + display: block; + bottom: -20px; + left: 50%; + margin-left: -10px; + width: 0; + border-width: 10px; + border-style: solid; + border-color: #40d9f1 transparent transparent transparent; +} + +.mec-week-events-container { + background: #fff; +} + +.mec-timetable-events-list { + padding: 10px 20px; + border: none; + margin: 0; +} + +.mec-timetable-events-list .mec-timetable-event { + padding: 10px 0; + border-bottom: 1px dashed #ddd; +} + +.mec-timetable-events-list .mec-timetable-event:last-child { + border: none; +} + +.mec-timetable-event .mec-timetable-event-span { + font-size: 12px; + color: #444; + padding-right: 30px; + line-height: 22px; +} + +.mec-timetable-events-list .mec-timetable-event i { + font-size: 13px; + color: #aaa; + margin-right: 3px; + vertical-align: baseline; +} + +.mec-timetable-event .mec-timetable-event-span a { + color: #333; +} + +.mec-timetable-event .mec-timetable-event-time { + font-size: 11px; +} + +.mec-timetable-event .mec-timetable-event-time i { + vertical-align: text-bottom; +} + +.mec-timetable-event .mec-timetable-event-title { + font-size: 13px; +} + +.mec-timetable-event .mec-timetable-event-title .event-color { + width: 10px; + height: 10px; +} + +.mec-timetable-events-list .mec-timetable-event.mec-util-hidden { + display: none; +} + +.mec-timetable-events-list.mec-util-hidden { + display: none; +} + +@media only screen and (min-width: 768px) { + .mec-timetable-events-list { + display: table; + width: 100%; + margin: 10px 0 20px; + } + + .mec-timetable-events-list .mec-timetable-event { + display: table-row; + padding: 0; + border: none; + background: #fff; + } + + .mec-timetable-events-list .mec-timetable-event:hover { + background: #fafafa; + } + + .mec-timetable-event .mec-timetable-event-span { + display: table-cell; + padding: 10px 15px; + border-bottom: 1px solid #ebebeb; + } + + .mec-timetable-events-list + .mec-timetable-event:last-child + .mec-timetable-event-span { + border-bottom: none; + } +} + +@media only screen and (max-width: 767px) { + .mec-timetable-event .mec-timetable-event-title { + display: block; + width: 100%; + padding: 5px 0 10px; + font-weight: 700; + } +} + +/* Timetable View type 2 + -------------------------------- */ +.mec-timetable-t2-wrap { + border: 1px solid #e6e6e6; + background: #fafafa; + padding: 0 15px 15px; + overflow: hidden; + box-shadow: 0 3px 2px 0 rgba(0, 0, 0, 0.012); +} + +.mec-timetable-t2-col { + width: 20%; + float: left; + min-height: 20px; + padding-right: 1px; + background: none; +} + +.mec-ttt2-title { + background: #fafafa; + color: #333; + font-size: 13px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 1px; + text-align: center; + padding: 25px 10px 10px; + margin-bottom: 1px; +} + +.mec-timetable-t2-col .mec-event-article { + position: relative; +} + +.mec-timetable-t2-col .mec-event-article .event-color { + position: absolute; + width: auto; + height: auto; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: 0; + z-index: 1; + border-radius: 2px; +} + +.mec-timetable-t2-content { + position: relative; + z-index: 2; + color: #fff; + padding: 15px 15px 20px; + text-align: left; + height: auto; + margin-bottom: 1px; + overflow: hidden; +} + +.mec-timetable-t2-content .mec-event-title { + line-height: 22px; + margin-bottom: 13px; + white-space: nowrap; + padding-right: 1px; + overflow: hidden; +} + +.mec-timetable-t2-content .mec-event-title a { + color: #fff; + font-size: 15px; + font-weight: 600; + white-space: pre-line; + overflow: hidden; +} + +.mec-timetable-t2-content div { + color: #fff; + font-size: 11px; + font-weight: 400; + line-height: 19px; + white-space: nowrap; +} + +.mec-timetable-t2-content div i { + font-size: 12px; + margin-right: 4px; +} + +@media only screen and (max-width: 960px) { + .mec-timetable-t2-col { + width: 100%; + float: none; + } +} + +@media (min-width: 961px) { + .mec-timetable-col-7 { + width: 14.28%; + } + + .mec-timetable-col-6 { + width: 16.6666%; + } +} + +/* MEC Timetable Classic + -------------------------------- */ +.mec-timetable-t3-wrap td { + position: relative; + padding: 0; +} + +.mec-timetable-t3-wrap td a { + width: 100%; + display: block; + min-height: 110px; +} + +/* MEC Weather widget + -------------------------------- */ +.mec-weather-box { + padding: 15px 0; +} + +.mec-weather-head { + min-height: 90px; + padding: 5px 0; + clear: both; + overflow: hidden; + margin-bottom: 25px; + border-radius: 10px; + background: #238af5; + position: relative; +} + +.mec-weather-icon-box { + float: left; + width: 80px; + height: 80px; + border-radius: 10px; + overflow: hidden; + background: #238af5; +} + +.mec-weather-icon { + width: 80px; + height: 80px; + display: inline-block; + border-radius: 10px; +} + +.mec-weather-summary { + float: left; + width: calc(100% - 80px); + padding-left: 10px; + margin: 10px 0; + height: 60px; +} + +.mec-weather-summary-report { + font-size: 15px; + color: rgba(255, 255, 255, 0.68); + margin-bottom: 6px; +} + +.mec-weather-summary-temp { + font-weight: 300; + color: #fff; + font-size: 29px; + line-height: 1; +} + +.degrees-mode { + background: rgba(0, 0, 0, 0.2); + cursor: pointer; + font-weight: 300; + font-size: 18px; + padding: 4px 5px; + line-height: 1; + color: #fff; + position: absolute; + border-radius: 8px; + bottom: 16px; + left: 16px; +} + +.mec-weather-extras { + width: auto; + padding: 10px 15px 0 15px; + float: right; + min-height: 80px; + color: #fff; + font-size: 13px; + line-height: 1; +} + +.mec-weather-extras { + width: auto; + padding: 10px 15px 0 15px; + float: right; + min-height: 80px; + color: #fff; + font-size: 13px; + line-height: 1; +} + +.mec-weather-extras div { + line-height: 20px; + height: 20px; +} + +.mec-weather-extras span { + color: rgba(255, 255, 255, 0.68); + font-size: 12px; + text-transform: uppercase; +} + +.mec-weather-extras var { + font-size: 11px; + letter-spacing: 0.4px; +} + +/* weather icons */ +.mec-weather-icon.clear-day, +.mec-weather-icon.clear-night { + background-image: url(../img/mec-weather-icon-01.png); +} + +.mec-weather-icon.partly-sunny-day, +.mec-weather-icon.partly-sunny-night { + background-image: url(../img/mec-weather-icon-02.png); +} + +.mec-weather-icon.partly-cloudy-day, +.mec-weather-icon.partly-cloudy-night { + background-image: url(../img/mec-weather-icon-03.png); +} + +.mec-weather-icon.cloudy, +.mec-weather-icon.fog, +.mec-weather-icon.wind { + background-image: url(../img/mec-weather-icon-04.png); +} + +.mec-weather-icon.thunderstorm { + background-image: url(../img/mec-weather-icon-05.png); +} + +.mec-weather-icon.rain { + background-image: url(../img/mec-weather-icon-06.png); +} + +.mec-weather-icon.snow, +.mec-weather-icon.hail, +.mec-weather-icon.sleet { + background-image: url(../img/mec-weather-icon-07.png); +} + +/* MEC Available spot + -------------------------------- */ +.mec-av-spot-wrap { + width: auto; + max-width: 1200px; + padding: 0; + margin: 0 auto 25px; + background: #f7f7f7; + min-height: 480px; + position: relative; +} + +.mec-av-spot { + height: auto; + border: 1px solid #eee; + box-shadow: 0 6px 12px -4px rgba(0, 0, 0, 0.05); +} + +.mec-av-spot .mec-event-article { + position: relative; + height: auto; +} + +.mec-av-spot .mec-av-spot-img { + position: relative; + background-size: cover !important; + background-position: center !important; + width: 100%; + height: 330px; + float: none; + margin: 0; + overflow: hidden; +} + +.mec-av-spot .mec-av-spot-content, +.mec-av-spot .mec-av-spot-head { + width: 100%; + float: none; + height: 100%; + background: #fff; + padding: 0 20px 20px; + margin-bottom: 0; +} + +.mec-av-spot .mec-av-spot-head { + background: #222; + color: #fff; + min-height: 80px; +} + +.mec-av-spot .mec-av-spot-head .mec-av-spot-box { + padding-top: 25px; + font-size: 13px; + color: #ddd; +} + +.mec-av-spot .mec-av-spot-head .mec-av-spot-box span { + color: #40d9f1; + font-size: 40px; + font-weight: bold; + font-style: italic; +} + +.mec-av-spot .mec-av-spot-head .mec-event-countdown { + text-align: center; + padding-top: 10px; + display: table; + table-layout: fixed; + margin: 0 auto; + float: right; +} + +.mec-av-spot .mec-av-spot-head .mec-event-countdown li { + display: table-cell; + padding: 10px 20px; + position: relative; + height: 60px; +} + +.mec-av-spot .mec-av-spot-head .mec-event-countdown p { + margin-bottom: 0; +} + +.mec-av-spot .mec-events-content p { + margin-bottom: 20px; +} + +.mec-av-spot-content.mec-event-grid-modern .mec-event-article { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +.mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head { + margin-bottom: 10px; + padding: 14px 34px; + margin-left: -20px; + margin-right: -20px; + text-align: left; + background: #f9f9f9; + border-bottom: 1px solid #eee; +} + +.mec-av-spot-content.mec-event-grid-modern .mec-event-title { + font-size: 29px; +} + +.mec-av-spot .mec-av-spot-col6 { + width: 50%; + float: left; + height: 100%; +} + +.mec-av-spot .mec-av-spot-col6 i { + font-size: 42px; + float: left; + margin-right: 7px; + height: 58px; +} + +.mec-av-spot .mec-av-spot-col6 h6 { + text-transform: uppercase; + font-size: 17px; + padding: 4px 0; + display: inline; + color: #444; +} + +.mec-av-spot .mec-av-spot-col6 address { + font-size: 12px; + margin-bottom: 0; +} + +.mec-av-spot-content.mec-event-grid-modern .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-av-spot-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 12px; + padding: 0 31px; + line-height: 49px; + height: 50px; + top: 0; + box-shadow: 0 5px 11px -3px rgba(0, 0, 0, 0.05); +} + +@media only screen and (max-width: 768px) { + .mec-av-spot .mec-av-spot-col6 { + width: 100%; + margin: 10px 0; + } +} + +@media only screen and (max-width: 479px) { + .mec-av-spot-content.mec-event-grid-modern .mec-event-title { + font-size: 24px; + } +} + +/* MEC Masonry + -------------------------------- */ +.mec-events-masonry-wrap { + display: block; + width: auto; +} + +.mec-masonry-item-wrap { + width: calc(33.33% - 30px); + padding: 0; + margin: 0 15px 30px; + min-height: 10px; + position: relative; + float: left; +} + +.mec-events-masonry-cats { + padding: 10px; + margin-bottom: 25px; + text-align: center; + clear: both; + list-style: none outside none; +} + +.mec-events-masonry-cats a { + border-radius: 2px; + padding: 6px 12px; + font-size: 13px; + line-height: 1.2; + color: #333; + font-weight: normal; + margin-top: 0 !important; + text-align: center; + display: inline-block; + width: auto; + border: 2px solid transparent; + transition: all 0.2s ease; +} + +.mec-events-masonry-cats a:hover { + border-color: #40d9f1; + color: #333; +} + +.mec-events-masonry-cats a.mec-masonry-cat-selected { + border: 2px solid #40d9f1; + color: #40d9f1; +} + +.mec-masonry { + background: #f7f7f7; + height: auto; + border: 1px solid #eee; + box-shadow: 0 6px 12px -4px rgba(0, 0, 0, 0.05); +} + +.mec-masonry .mec-event-article { + position: relative; + height: auto; +} + +.mec-masonry .mec-masonry-img { + position: relative; + width: 100%; + height: auto; + float: none; + margin: 0; + overflow: hidden; +} + +.mec-masonry .mec-masonry-img img { + width: 100%; +} + +.mec-masonry .mec-masonry-content, +.mec-masonry .mec-masonry-head { + width: 100%; + float: none; + height: 100%; + background: #fff; + padding: 0 20px 20px; + margin-bottom: 0; +} + +.mec-masonry .mec-events-content p { + margin-bottom: 20px; +} + +.mec-masonry-content.mec-event-grid-modern .mec-event-article { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +.mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head { + min-height: 79px; + margin-bottom: 10px; + padding: 14px 5%; + margin-left: -20px; + margin-right: -20px; + text-align: left; + background: #f9f9f9; + border-bottom: 1px solid #eee; +} + +.mec-masonry-content.mec-event-grid-modern .mec-event-title { + font-size: 22px; +} + +.mec-masonry-content.mec-event-grid-modern .mec-event-content { + padding-top: 20px; +} + +@media (max-width: 480px) { + .mec-masonry-content.mec-event-grid-modern .mec-labels-normal { + display: block; + } +} + +.mec-masonry-content.mec-event-grid-modern .mec-event-footer { + height: auto; + display: flex; + gap: 10px; +} + +.mec-wrap + .mec-event-masonry + .mec-masonry-content.mec-event-grid-modern + .mec-event-footer + a { + position: static; + padding: 0; + flex: auto; + text-align: center; +} + +.mec-masonry .mec-masonry-col6 .mec-event-date { + font-size: 52px; + letter-spacing: -2px; + line-height: 41px; + vertical-align: top; +} + +.mec-masonry .mec-masonry-col6 { + width: 50%; + float: left; + height: 100%; +} + +.mec-masonry .mec-masonry-col6 i { + font-size: 24px; + float: left; + margin-right: 7px; + height: 50px; +} + +.mec-masonry .mec-masonry-col6 h6, +.mec-masonry .mec-masonry-col6 .mec-event-month { + text-transform: capitalize; + font-size: 15px; + padding: 4px 0; + display: inline; + color: #444; +} + +.mec-masonry .mec-masonry-col6 address, +.mec-masonry .mec-masonry-col6 .mec-event-detail { + font-size: 11px; + margin-bottom: 0; +} + +.mec-masonry-content.mec-event-grid-modern .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-masonry-content.mec-event-grid-modern + .mec-event-footer + .mec-booking-button { + font-size: 12px; + line-height: 49px; + height: 50px; + box-shadow: 0 5px 11px -3px rgba(0, 0, 0, 0.05); +} + +@media only screen and (max-width: 960px) { + .mec-masonry-item-wrap { + width: calc(50% - 30px); + } +} + +@media only screen and (max-width: 768px) { + .mec-masonry .mec-masonry-col6 { + width: 100%; + margin: 10px 0; + } + + .mec-masonry-item-wrap { + width: calc(100% - 30px); + } +} + +@media only screen and (max-width: 479px) { + .mec-masonry-content.mec-event-grid-modern .mec-event-title { + font-size: 24px; + } +} + +.mec-wrap.mec-skin-masonry-container .mec-load-more-wrap { + position: unset; +} + +/* MEC Single Page CountDown + -------------------------------- */ + +/* event countdown */ +.btn-wrapper { + text-align: center; +} + +.countdown-wrapper .btn-wrapper { + padding-top: 10px; + padding-right: 0; +} + +.countdown-wrapper h5.countdown-message { + letter-spacing: 5px; + font-weight: 500; + font-size: 18px; +} + +.countdown-wrapper p, +.blox.dar .countdown-wrapper p { + color: #888; +} + +.countdown-wrapper a.button.black { + float: right; + margin-right: 0; +} + +/* event countdown-clock */ + +.mec-wrap .threedaydigits .days .flip-clock-label { + right: -100px; +} + +@media only screen and (min-width: 320px) and (max-width: 767px) { + .mec-wrap .flip-clock-wrapper ul { + width: 29px !important; + } + + .mec-wrap .flip-clock-wrapper ul li a div div.inn { + font-size: 25px !important; + } + + .mec-wrap .flip-clock-divider .flip-clock-label { + left: 0; + font-weight: 300; + } + + .mec-wrap span.flip-clock-divider { + width: 12px; + } +} + +@media only screen and (min-width: 320px) and (max-width: 480px) { + .mec-wrap .flip-clock-wrapper ul { + width: 29px !important; + } + + .mec-wrap .flip-clock-wrapper ul li a div div.inn { + font-size: 25px !important; + } + + .mec-wrap .flip-clock-divider .flip-clock-label { + display: none; + } + + .mec-wrap span.flip-clock-divider:first-child { + width: 0; + } + + .mec-wrap span.flip-clock-divider { + width: 5px; + } + + .mec-single-event .mec-events-meta-group-countdown { + margin-left: 0; + padding: 15px 18%; + } +} + +@media screen and (min-width: 960px) and (max-width: 1200px) { + .mec-wrap .threedaydigits ul { + height: 50px; + width: 47px; + } +} + +@media screen and (min-width: 480px) and (max-width: 768px) { + .mec-wrap .threedaydigits ul { + height: 48px; + width: 26px !important; + } + + .mec-wrap .threedaydigits .flip-clock-label { + font-size: 8px; + left: -8px; + } +} + +@media screen and (min-width: 320px) and (max-width: 480px) { + .mec-wrap .threedaydigits ul { + height: 48px; + width: 22px !important; + } +} + +/* reset */ +.mec-wrap .flip-clock-wrapper * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -o-backface-visibility: hidden; + backface-visibility: hidden; +} + +.mec-wrap .flip-clock-wrapper a { + cursor: pointer; + text-decoration: none; + color: #ccc; +} + +.mec-wrap .flip-clock-wrapper a:hover { + color: #fff; +} + +.mec-wrap .flip-clock-wrapper ul { + list-style: none; +} + +.mec-wrap .flip-clock-wrapper.clearfix:before, +.flip-clock-wrapper.clearfix:after { + content: " "; + display: table; +} + +.mec-wrap .flip-clock-wrapper.clearfix:after { + clear: both; +} + +.mec-wrap .flip-clock-wrapper.clearfix { + *zoom: 1; +} + +/* main */ +.mec-wrap .flip-clock-wrapper { + font: normal 11px "helvetica neue", "helvetica", sans-serif; + -webkit-user-select: none; +} + +.mec-wrap .flip-clock-meridium { + background: none !important; + box-shadow: 0 0 0 !important; + font-size: 36px !important; +} + +.mec-wrap .flip-clock-meridium a { + color: #313333; +} + +.mec-wrap .flip-clock-wrapper { + text-align: center; + position: relative; + display: inline-block; + padding-bottom: 10px; +} + +.mec-wrap .flip-clock-wrapper:before, +.flip-clock-wrapper:after { + content: " "; + /* 1 */ + display: table; + /* 2 */ +} + +.mec-wrap .flip-clock-wrapper:after { + clear: both; +} + +/* skeleton */ +.mec-wrap .flip-clock-wrapper ul { + position: relative; + float: left; + margin: 2px; + width: 50px; + height: 50px; + font-size: 80px; + font-weight: bold; + line-height: 87px; + border-radius: 3px; + background: rgba(0, 0, 0, 0.21); +} + +.mec-wrap .flip-clock-wrapper ul li { + z-index: 1; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + line-height: 54px; + text-decoration: none !important; +} + +.mec-wrap .flip-clock-wrapper ul li:first-child { + z-index: 2; +} + +.mec-wrap .flip-clock-wrapper ul li a { + display: block; + height: 100%; + -webkit-perspective: 200px; + -moz-perspective: 200px; + perspective: 200px; + margin: 0 !important; + overflow: visible !important; + cursor: default !important; +} + +.mec-wrap .flip-clock-wrapper ul li a div { + z-index: 1; + position: absolute; + left: 0; + width: 100%; + height: 50%; + font-size: 80px; + overflow: hidden; + outline: 1px solid transparent; +} + +.mec-wrap .flip-clock-wrapper ul li a div .shadow { + position: absolute; + width: 100%; + height: 100%; + z-index: 2; +} + +.mec-wrap .flip-clock-wrapper ul li a div.up { + -webkit-transform-origin: 50% 100%; + -moz-transform-origin: 50% 100%; + -ms-transform-origin: 50% 100%; + -o-transform-origin: 50% 100%; + transform-origin: 50% 100%; + top: 0; +} + +.mec-wrap .flip-clock-wrapper ul li a div.up:after { + content: ""; + position: absolute; + top: 24px; + left: 0; + z-index: 5; + width: 100%; + height: 3px; + background-color: rgba(0, 0, 0, 0.12); +} + +.mec-wrap .flip-clock-wrapper ul li a div.down { + -webkit-transform-origin: 50% 0; + -moz-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + -o-transform-origin: 50% 0; + transform-origin: 50% 0; + bottom: 0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.mec-wrap .flip-clock-wrapper ul li a div div.inn { + position: absolute; + left: 0; + z-index: 1; + width: 100%; + height: 200%; + color: #fff; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.25); + text-align: center; + background-color: #40d9f1; + border-radius: 3px; + font-size: 48px; +} + +.mec-wrap .flip-clock-wrapper ul li a div.up div.inn { + top: 0; +} + +.mec-wrap .flip-clock-wrapper ul li a div.down div.inn { + bottom: 0; +} + +/* play */ +.mec-wrap .flip-clock-wrapper ul.play li.flip-clock-before { + z-index: 3; +} + +.mec-wrap .flip-clock-wrapper .flip { + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.17); +} + +.mec-wrap .flip-clock-wrapper ul.play li.flip-clock-active { + -webkit-animation: asd 0.5s 0.5s linear both; + -moz-animation: asd 0.5s 0.5s linear both; + animation: asd 0.5s 0.5s linear both; + z-index: 5; +} + +.mec-wrap .flip-clock-divider { + float: left; + display: inline-block; + position: relative; + width: 18px; + height: 62px; +} + +.mec-wrap .flip-clock-divider:first-child { + width: 0; +} + +.mec-wrap .flip-clock-dot { + display: none; + background: #323434; + width: 10px; + height: 10px; + position: absolute; + border-radius: 50%; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + left: 5px; +} + +.mec-wrap .flip-clock-divider .flip-clock-label { + position: absolute; + bottom: -1.5em; + right: -71px; + color: #101010; + font-weight: bold; + text-shadow: none; + text-transform: uppercase; +} + +.mec-wrap .blox.dark .flip-clock-divider .flip-clock-label { + color: #8a8a8a; +} + +.mec-wrap .flip-clock-divider.seconds .flip-clock-label { + right: -82px; +} + +.mec-wrap .flip-clock-dot.top { + top: 30px; +} + +.mec-wrap .flip-clock-dot.bottom { + bottom: 30px; +} + +@-webkit-keyframes asd { + 0% { + z-index: 2; + } + + 20% { + z-index: 4; + } + + 100% { + z-index: 4; + } +} + +@-moz-keyframes asd { + 0% { + z-index: 2; + } + + 20% { + z-index: 4; + } + + 100% { + z-index: 4; + } +} + +@-o-keyframes asd { + 0% { + z-index: 2; + } + + 20% { + z-index: 4; + } + + 100% { + z-index: 4; + } +} + +@keyframes asd { + 0% { + z-index: 2; + } + + 20% { + z-index: 4; + } + + 100% { + z-index: 4; + } +} + +.flip-clock-wrapper ul.play li.flip-clock-active .down { + z-index: 2; + -webkit-animation: turn 0.5s 0.5s linear both; + -moz-animation: turn 0.5s 0.5s linear both; + animation: turn 0.5s 0.5s linear both; +} + +@-webkit-keyframes turn { + 0% { + -webkit-transform: rotatex(90deg); + } + + 100% { + -webkit-transform: rotatex(0deg); + } +} + +@-moz-keyframes turn { + 0% { + -moz-transform: rotatex(90deg); + } + + 100% { + -moz-transform: rotatex(0deg); + } +} + +@-o-keyframes turn { + 0% { + -o-transform: rotatex(90deg); + } + + 100% { + -o-transform: rotatex(0deg); + } +} + +@keyframes turn { + 0% { + transform: rotatex(90deg); + } + + 100% { + transform: rotatex(0deg); + } +} + +.flip-clock-wrapper ul.play li.flip-clock-before .up { + z-index: 2; + -webkit-animation: turn2 0.5s linear both; + -moz-animation: turn2 0.5s linear both; + animation: turn2 0.5s linear both; +} + +@-webkit-keyframes turn2 { + 0% { + -webkit-transform: rotatex(0deg); + } + + 100% { + -webkit-transform: rotatex(-90deg); + } +} + +@-moz-keyframes turn2 { + 0% { + -moz-transform: rotatex(0deg); + } + + 100% { + -moz-transform: rotatex(-90deg); + } +} + +@-o-keyframes turn2 { + 0% { + -o-transform: rotatex(0deg); + } + + 100% { + -o-transform: rotatex(-90deg); + } +} + +@keyframes turn2 { + 0% { + transform: rotatex(0deg); + } + + 100% { + transform: rotatex(-90deg); + } +} + +.flip-clock-wrapper ul li.flip-clock-active { + z-index: 3; +} + +/* shadow */ +.flip-clock-wrapper ul.play li.flip-clock-before .up .shadow { + background: -moz-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0%, rgba(0, 0, 0, 0.1)), + color-stop(100%, rgba(64, 64, 64, 0.68)) + ); + background: linear, top, rgba(0, 0, 0, 0.1) 0%, rgba(64, 64, 64, 0.68) 100%; + background: -o-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: -ms-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100%; + -webkit-animation: show 0.5s linear both; + -moz-animation: show 0.5s linear both; + animation: show 0.5s linear both; +} + +.flip-clock-wrapper ul.play li.flip-clock-active .up .shadow { + background: -moz-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0%, rgba(0, 0, 0, 0.1)), + color-stop(100%, rgba(64, 64, 64, 0.68)) + ); + background: linear, top, rgba(0, 0, 0, 0.1) 0%, rgba(64, 64, 64, 0.68) 100%; + background: -o-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: -ms-linear-gradient( + top, + rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100% + ); + background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, + rgba(64, 64, 64, 0.68) 100%; + -webkit-animation: hide 0.5s 0.3s linear both; + -moz-animation: hide 0.5s 0.3s linear both; + animation: hide 0.5s 0.3s linear both; +} + +/*down*/ +.flip-clock-wrapper ul.play li.flip-clock-before .down .shadow { + background: -moz-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0%, rgba(64, 64, 64, 0.68)), + color-stop(100%, rgba(0, 0, 0, 0.1)) + ); + background: linear, top, rgba(64, 64, 64, 0.68) 0%, rgba(0, 0, 0, 0.1) 100%; + background: -o-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: -ms-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: linear, to bottom, rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100%; + -webkit-animation: show 0.5s linear both; + -moz-animation: show 0.5s linear both; + animation: show 0.5s linear both; +} + +.flip-clock-wrapper ul.play li.flip-clock-active .down .shadow { + background: -moz-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0%, rgba(64, 64, 64, 0.68)), + color-stop(100%, rgba(0, 0, 0, 0.1)) + ); + background: linear, top, rgba(64, 64, 64, 0.68) 0%, rgba(0, 0, 0, 0.1) 100%; + background: -o-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: -ms-linear-gradient( + top, + rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100% + ); + background: linear, to bottom, rgba(64, 64, 64, 0.68) 0%, + rgba(0, 0, 0, 0.1) 100%; + -webkit-animation: hide 0.5s 0.3s linear both; + -moz-animation: hide 0.5s 0.3s linear both; + animation: hide 0.5s 0.2s linear both; +} + +@-webkit-keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@-moz-keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@-o-keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes show { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@-webkit-keyframes hide { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes hide { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes hide { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes hide { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@media only screen and (min-width: 320px) and (max-width: 480px) { + .single-mec-events .mec-wrap .flip-clock-wrapper { + padding-bottom: 0; + max-width: 218px; + } + + .single-mec-events .mec-wrap .mec-events-meta-group-countdown { + padding: 20px 10px 20px 10px; + } + + .mec-wrap .flip-clock-wrapper ul { + width: 25px !important; + padding: 0; + } + + .single-mec-events .mec-wrap .flip-clock-wrapper .flip { + margin-bottom: 40px; + } + + .single-mec-events .mec-wrap .flip-clock-divider .flip-clock-label { + display: block; + } + + .single-mec-events .mec-wrap .flip-clock-divider.days .flip-clock-label { + left: -15px; + } + + .single-mec-events .mec-wrap .flip-clock-divider.hours .flip-clock-label { + left: 0; + } + + .single-mec-events .mec-wrap .flip-clock-divider.minutes .flip-clock-label { + left: 0; + } + + .single-mec-events .mec-wrap .flip-clock-divider.seconds .flip-clock-label { + left: -15px; + } + + .single-mec-events .mec-wrap .flip-clock-wrapper { + max-width: unset; + } +} + +/* MEC Events - Extras + -------------------------------- */ +@font-face { + font-family: "simple-line-icons"; + src: url("../fonts/Simple-Line-Icons.eot?v=2.3.1"); + src: url("../fonts/Simple-Line-Icons.eot?v=2.3.1#iefix") + format("embedded-opentype"), + url("../fonts/Simple-Line-Icons.woff2?v=2.3.1") format("woff2"), + url("../fonts/Simple-Line-Icons.woff?v=2.3.1") format("woff"), + url("../fonts/Simple-Line-Icons.ttf?v=2.3.1") format("truetype"), + url("../fonts/Simple-Line-Icons.svg?v=2.3.1#simple-line-icons") + format("svg"); + font-weight: normal; + font-style: normal; +} + +[class*="mec-sl-"] { + font-family: "simple-line-icons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.mec-sl-facebook:before { + content: "\e00b"; +} + +.mec-sl-twitter:before { + content: "\e009"; +} + +.mec-sl-google-plus:before { + content: "\e60d"; +} + +.mec-sl-angle-left:before { + content: "\e605"; +} + +.mec-sl-angle-right:before { + content: "\e606"; +} + +.mec-sl-calendar:before { + content: "\e075"; +} + +.mec-sl-clock-o:before { + content: "\e081"; +} + +.mec-sl-home:before { + content: "\e069"; +} + +.mec-sl-phone:before { + content: "\e600"; +} + +.mec-sl-envelope:before { + content: "\e086"; +} + +.mec-sl-sitemap:before { + content: "\e037"; +} + +.mec-sl-map-marker:before { + content: "\e096"; +} + +.mec-sl-floder:before { + content: "\e089"; +} + +.mec-sl-wallet:before { + content: "\e02a"; +} + +/* # Color Skins + ================================================== */ +/* colorskin-1 */ +.mec-color, +.mec-color-hover:hover, +.mec-color-before *:before, +.mec-wrap .mec-color, +.mec-wrap .mec-color-hover:hover, +.mec-wrap .mec-color-before *:before { + color: #40d9f1; +} + +.mec-bg-color, +.mec-bg-color-hover:hover, +.mec-wrap .mec-bg-color, +.mec-wrap .mec-bg-color-hover:hover { + background-color: #40d9f1; +} + +.mec-box-marker, +.mec-vip-content-notice { + box-shadow: 5px 0 0 #40d9f1 inset; + padding: 5px 10px; +} + +.mec-border-color, +.mec-border-color-hover:hover, +.mec-wrap .mec-border-color, +.mec-wrap .mec-border-color-hover:hover { + border-color: #40d9f1; +} + +/* # Toggle Month Divider + ================================================== */ +.mec-toggle-month-divider.mec-skin-list-events-container { + border: 1px solid #e8e8e8; + margin-bottom: 30px; + background: #f8f8f8; + box-shadow: 0 2px 18px -1px rgba(0, 0, 0, 0.1); + border-radius: 2px; +} + +.mec-toggle-month-divider .mec-month-divider { + margin: 0; + text-align: left; + background: #fff; + position: relative; + cursor: pointer; + border-top: 1px solid #e8e8e8; +} + +.mec-toggle-month-divider .mec-month-divider span { + padding: 20px; + border-bottom: 1px solid #e8e8e8; +} + +.mec-toggle-month-divider .mec-month-divider i { + position: absolute; + right: 20px; + top: 24px; + font-size: 20px; + cursor: pointer; +} + +.mec-toggle-month-divider .mec-month-divider span:before { + display: none; +} + +.mec-toggle-month-divider .mec-month-divider + article { + margin-top: 20px; +} + +.mec-toggle-month-divider .mec-wrap .mec-month-divider:first-of-type { + border-top: none; +} + +.mec-toggle-month-divider + .mec-event-list-accordion + .mec-month-divider:not(:first-of-type) + ~ article { + display: none; +} + +.mec-skin-list-events-container:not(.mec-toggle-month-divider) + .mec-month-divider + i { + display: none; +} + +.mec-month-divider { + display: flex; + align-items: center; +} + +.mec-month-divider:before, +.mec-month-divider:after { + content: ""; + flex: 1; + height: 4px; + background: #ebebeb; +} + +.mec-month-divider h5 { + font-size: 22px; + font-weight: 700; + text-transform: uppercase; + margin: 0 20px; +} + +.mec-month-divider i { + display: none; +} + +.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-month { + display: inline-block; + padding-top: 0; +} + +.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-date { + font-size: 14px; + line-height: 14px; + float: none; + display: inline-block; + margin-right: 0; + font-weight: 700; +} + +.mec-events-toggle .mec-toogle-inner-month-divider.mec-toggle-item-inner { + padding: 20px 60px 30px 15px; +} + +.mec-toogle-inner-month-divider .mec-toggle-month-inner-image { + float: left; + clear: right; + width: 100px; + margin-right: 20px; + margin-left: 10px; +} + +.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-detail { + margin-top: -6px; +} + +.mec-toogle-inner-month-divider .mec-toggle-item-col { + float: none; + width: 100%; + margin-top: 10px; + display: block; + border: none; +} + +.mec-events-toggle .mec-toogle-inner-month-divider .mec-toggle-title { + font-size: 19px; + display: block; + padding-top: 10px; +} + +@media only screen and (max-width: 768px) { + .mec-events-toggle .mec-toogle-inner-month-divider .mec-toggle-title { + font-size: 14px; + padding-top: 0; + } + + .mec-toogle-inner-month-divider .mec-toggle-item-col { + margin-top: 0; + } + + .mec-toogle-inner-month-divider .mec-toggle-month-inner-image { + width: 70px; + } +} + +/* # Featured/Canceled Label + ================================================== */ +/* .mec-wrap article:not([class^="mec-event-countdown"]):not([class^="mec-event-cover-"]).mec-label-featured:before, +.mec-wrap article:not([class^="mec-event-countdown"]):not([class^="mec-event-cover-"]).mec-label-canceled:before { + z-index: 1; + position: absolute; + top: 25px; + right: -37px; + font-size: 11px; + letter-spacing: 1px; + text-transform: uppercase; + background: #04de78; + padding: 2px 40px; + color: #fff; + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transition: .5s cubic-bezier(.25, .5, .06, .85); + transition: .5s cubic-bezier(.25, .5, .06, .85); + content: attr(data-style); +} */ + +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-label-featured, +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-label-canceled, +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-label-custom { + overflow: hidden; + position: relative; +} + +.mec-event-label-captions { + z-index: 1; + position: absolute; + top: 30px; + right: -37px; + font-size: 10px; + letter-spacing: 1px; + text-transform: uppercase; + background: #04de78; + padding: 2px 0; + color: #fff; + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-transition: 0.5s cubic-bezier(0.25, 0.5, 0.06, 0.85); + transition: 0.5s cubic-bezier(0.25, 0.5, 0.06, 0.85); + list-style: none; + text-align: center; + width: 150px; + max-width: 150px; +} + +.mec-event-agenda-clean .mec-event-label-captions { + top: 0; +} + +.mec-box-calendar.mec-event-calendar-classic.mec-event-container-novel + .mec-event-label-captions { + display: none; +} + +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-label-canceled:before { + background: #de0404; +} + +/* Full Calendar/Weekly view */ +ul.mec-weekly-view-dates-events article:before, +.mec-daily-view-date-events article:before { + padding: 7px 40px !important; + top: 27px !important; +} + +/* Full Calendar/Yearly View */ +.mec-timeline-event .mec-fc-style, +.mec-wrap .mec-events-agenda .mec-agenda-event .mec-fc-style, +.mec-wrap .mec-event-list-modern article .mec-fc-style, +.mec-wrap .mec-event-list-accordion article .mec-fc-style, +.mec-timetable-wrap article .mec-fc-style, +.mec-event-grid-minimal article .mec-fc-style, +.mec-event-grid-classic article .mec-fc-style, +.mec-event-grid-simple article .mec-fc-style, +.mec-wrap article.mec-event-cover-modern .mec-fc-style, +.mec-wrap article.mec-event-cover-classic .mec-fc-style, +.mec-wrap article.mec-event-cover-clean .mec-fc-style, +.mec-wrap article[class^="mec-event-countdown-"] .mec-fc-style { + font-size: 9px; + letter-spacing: 0.5px; + text-transform: uppercase; + background: #04de78; + padding: 2px 7px; + color: #fff; + position: relative; + margin-left: 5px; + border-radius: 2px; +} + +.mec-timeline-event.mec-label-canceled .mec-fc-style, +.mec-wrap .mec-events-agenda .mec-agenda-event.mec-label-canceled .mec-fc-style, +.mec-wrap article.mec-event-cover-modern.mec-label-canceled .mec-fc-style { + background: #de0404; +} + +.mec-timeline-event .mec-fc-style:before, +.mec-wrap .mec-events-agenda .mec-agenda-event .mec-fc-style:before, +.mec-wrap .mec-event-list-modern article .mec-fc-style:before, +.mec-wrap .mec-event-list-accordion article .mec-fc-style:before, +.mec-timetable-wrap article .mec-fc-style:before, +.mec-event-grid-minimal article .mec-fc-style:before, +.mec-event-grid-simple article .mec-fc-style:before, +.mec-wrap article.mec-event-cover-classic .mec-fc-style:before, +.mec-wrap article.mec-event-cover-clean .mec-fc-style:before, +.mec-wrap article[class^="mec-event-countdown-"] .mec-fc-style:before { + width: 0; + height: 0; + border-top: 4px solid transparent !important; + border-right: 5px solid; + border-bottom: 4px solid transparent; + margin: 0; + top: 50%; + left: -5px; + transform: translateY(-4.5px); + position: absolute; + content: ""; + color: var(--background-color); +} + +.mec-timeline-event.mec-label-canceled .mec-fc-style:before, +.mec-wrap + .mec-events-agenda + .mec-agenda-event.mec-label-canceled + .mec-fc-style:before { + color: #de0404; +} + +/* List view/Modern & Accordion */ +.mec-wrap .mec-event-list-modern article.mec-label-featured:before, +.mec-wrap .mec-event-list-modern article.mec-label-canceled:before, +.mec-wrap .mec-event-list-accordion article.mec-label-featured:before, +.mec-wrap .mec-event-list-accordion article.mec-label-canceled:before, +.mec-event-grid-minimal article.mec-label-featured:before, +.mec-event-grid-minimal article.mec-label-canceled:before, +.mec-event-grid-simple article.mec-label-featured:before, +.mec-event-grid-simple article.mec-label-canceled:before, +.mec-event-grid-classic article.mec-label-featured:before, +.mec-event-grid-classic article.mec-label-canceled:before, +.mec-timetable-wrap article.mec-label-featured:before, +.mec-timetable-wrap article.mec-label-canceled:before { + display: none; +} + +.mec-wrap .mec-event-list-modern article .mec-fc-style, +.mec-wrap .mec-event-list-accordion article .mec-fc-style, +.mec-wrap article.mec-event-cover-classic .mec-fc-style, +.mec-wrap article.mec-event-cover-clean .mec-fc-style, +.mec-wrap article[class^="mec-event-countdown-"] .mec-fc-style { + top: -1px; + right: -3px; + font-size: 11px; + white-space: nowrap; +} + +.mec-wrap .mec-event-list-modern article.mec-label-canceled .mec-fc-style, +.mec-wrap .mec-event-list-accordion article.mec-label-canceled .mec-fc-style, +.mec-timetable-wrap article.mec-label-canceled .mec-fc-style, +.mec-event-grid-minimal article.mec-label-canceled .mec-fc-style, +.mec-event-grid-classic article.mec-label-canceled .mec-fc-style, +.mec-event-grid-simple article.mec-label-canceled .mec-fc-style, +.mec-wrap article.mec-event-cover-classic.mec-label-canceled .mec-fc-style, +.mec-wrap article.mec-event-cover-clean.mec-label-canceled .mec-fc-style, +.mec-wrap + article[class^="mec-event-countdown-"].mec-label-canceled + .mec-fc-style { + background: #de0404; +} + +.mec-wrap + .mec-event-list-modern + article.mec-label-canceled + .mec-fc-style:before, +.mec-wrap + .mec-event-list-accordion + article.mec-label-canceled + .mec-fc-style:before, +.mec-timetable-wrap article.mec-label-canceled .mec-fc-style:before, +.mec-event-grid-minimal article.mec-label-canceled .mec-fc-style:before, +.mec-event-grid-classic article.mec-label-canceled .mec-fc-style:before, +.mec-event-grid-simple article.mec-label-canceled .mec-fc-style:before, +.mec-wrap + article.mec-event-cover-classic.mec-label-canceled + .mec-fc-style:before, +.mec-wrap article.mec-event-cover-clean.mec-label-canceled .mec-fc-style:before, +.mec-wrap + article[class^="mec-event-countdown-"].mec-label-canceled + .mec-fc-style:before { + color: #de0404; +} + +/* Slider view */ +.mec-wrap + .mec-slider-t5 + article:not([class^="mec-event-countdown"]).mec-label-featured:before, +.mec-wrap + .mec-slider-t5 + article:not([class^="mec-event-countdown"]).mec-label-canceled:before { + -ms-transform: none; + -webkit-transform: none; + transform: none; + -webkit-transition: none; + transition: none; + top: 271px; + right: 0; +} + +/* Timetable view */ +.mec-timetable-wrap article .mec-fc-style { + top: -2px; + font-size: 10px; + right: 0; +} + +/* Cover View */ +.mec-wrap article.mec-event-cover-modern .mec-fc-style { + padding: 5px 9px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 24px; + display: inline-block; + border-radius: 2px; + -ms-transform: rotate(0); + -webkit-transform: rotate(0); + transform: rotate(0); + right: 0; + top: 0; +} + +/* Grid View/Clean */ +.mec-skin-grid-events-container + .mec-wrap + .mec-event-grid-clean + .mec-event-article:before { + -ms-transform: none; + -webkit-transform: none; + transform: none !important; + -webkit-transition: none; + transition: none; + top: 22px !important; + right: 22px !important; + padding: 0 10px !important; +} + +/* Grid view/Minimal */ +.mec-event-grid-minimal article .mec-fc-style, +.mec-event-grid-simple article .mec-fc-style { + top: -4px; + font-size: 10px; + margin-left: 10px; + right: 0; +} + +.mec-event-grid-classic article .mec-fc-style { + padding: 5px 20px; + font-size: 12px; + margin-top: 8px; + display: inline-block; +} + +/* # Common Style For All Shortcodes + ================================================== */ + +/* Next & Previous Month */ +.mec-load-month-link { + color: #a9a9a9; + font-size: 12px; + font-weight: 400; + letter-spacing: 1px; + text-transform: uppercase; + text-decoration: unset; + transition: all 0.33s ease; +} + +/* Categories*/ +.mec-categories-wrapper { + font-size: 12px; + font-weight: 400; + line-height: 18px; +} + +.mec-categories-wrapper i { + margin-right: 4px; + display: inline-block; +} + +ul.mec-categories { + padding: 0; + display: inline; + vertical-align: top; +} + +ul.mec-categories li.mec-category { + list-style: none; + display: inline-block; + margin-right: 3px; + cursor: pointer; +} + +ul.mec-categories li.mec-category:not(:last-of-type):after { + content: ","; +} + +ul.mec-categories li.mec-category a { + color: #777; + text-align: left; + transition: all 0.23s ease; + -webkit-transition: all 0.23s ease; +} + +/* Tooltip for custom data fields */ +.mec-wrap [id^="mec_skin_events_"] .mec-event-data-fields { + display: inline-block; + width: 18px; + height: 18px; + position: relative; + vertical-align: middle; + cursor: pointer; + margin: 0 0 0 4px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAD90lEQVRoge2ZzWscZRjAf8/OJpUkQrF6SJMcNB+zobVdk8WCWEwqBEou0kMKtkgPHoRUD54VFMQ/wJBYhJ6MoGvFg3rQQ7dQFJVN09RANl9UkrgRbVrFuDZpZh4PSWqYmd2Z2a8Ize+0+7zPO/N7dt7l/RjYY48HGynHRZKqRltm7mmBXo1It9jEEBqBhq2UVYSswrTYmraVVFdn248iYpd675IK+GluruXehg4KchZoCtl9SVRHJcrw0fb2pWIdiirg2uzsY2LLOyjngNpib77FOujFdd1481hn50rYzqELGJ+afxGxh0AeCdvXhxURBuNm2ydhOgUuIJ1O1xgN+0eAl0OrhUDgwp3lxVd7e3s3Aub7k05n64yG3CXgZEl2QVG+sv6uG0gkDub8UiN+CZu/fBXlAYR+oz6XTKVSUb9U3wK2hk315LcR+vc3Nr/nn1aA8cz8GdDR8lmFR9DT8Vh7Mn97Hn6YmjpQKzUZ4NGKmAVnxRIrljDNW16NeYdQbaTmXXZfHuCAYUffytfo+QQmZmebbUvmKX2SKhdrIlZr3DR/cTZ4PgHL4jz/H3mAfUp00KvBVYCqRgQ5U3mnkKi+lFQ1nGFXAeOZuWNAc1WkwtHUMXOz2xl0FSDQWx2f8NjoCWfM4z8giWrIFIMorifgnqojdKDeF7Asi69TVxm7MYkIdB85TF/PcQzDqGjeNoqa/gWoNuab3765cpUr331//3vq283PJ5/vqWjeNgKNzpjXEGpwxzZJT0zuSmwHDzsDvou5nYjHg4l4xMqdVwiPAnQ1X3L3kcOuWNfRJyuet4O/nAH3f0BkGcVzu9jXcxyAsRuT9wX6nnu24nnbKCy7dJ2Ba9Nzn4lyKu9VdhX59KlY68DOiHsis3WsekLhEHC5uQqwlcvV0QmPitvNNYRUNTI+Pf+zQEt1tAKzEDdbH3ee5rmHkIgdUf2oel4BEUa9jiI95wGJMgysV1wqOGuCNeLV4FnA5lmlXqysU3BE+MBrNwaF9sTWQ28Av1fMKjgra/a9t/M15i3g0KGW2yq8Vhmn4Cj6SqFD34JroS6z7WOBC+XXCoYIQ12x9kuFcnwXczNm63mUz8unFRDRL+9kF1/3TQtyrXQ6W2fU55II/aWb+aPIF3fra08/09Lyj19uoOV0InEw98eviy+Avl+6XmFEGPpzeeFUEHko4gXH9czsgCLDlP/U7jdFB/3GvJNQGxqAeKw9WWvtM1EZBtbC9ncicFeEIWO9JhZWfqt/8Vyfnm5SooOqeraItdMC8KGyMdIVi2WLdSjLa1ZVjUzM3EzY6AlRuhU1BW36b3+tqyBLIDMCaRUuxzueGCvHa9Y99njQ+RcbkGTacAW/agAAAABJRU5ErkJggg=="); + background-position: center center; + background-size: cover; + padding: 0; + border: none; + background-color: transparent; + overflow: visible; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip { + position: absolute; + width: 160px; + bottom: 24px; + left: calc(50% - 80px); + background: #fff; + border-radius: 5px; + border: 1px solid #535a6121; + box-shadow: 0 4px 45px -8px #444b5061; + visibility: hidden; + opacity: 0; + transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.25s ease; + transform: scale(0.9); + z-index: 99; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields:hover + .mec-data-fields-tooltip { + visibility: visible; + opacity: 1; + transform: scale(1); +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip:before { + display: block; + content: ""; + position: absolute; + width: 12px; + height: 12px; + left: calc(50% - 12px); + top: 100%; + transform: translate(50%, -50%) rotate(-45deg); + background-color: #fff; + box-shadow: 0 8px 9px -4px #535a61; + z-index: 0; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box { + overflow: hidden; + border-radius: 11px; + padding: 12px 0; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul { + width: 100%; + height: fit-content; + overflow-y: scroll; + padding: 9px 15px; + text-align: left; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul::-webkit-scrollbar-track { + background-color: #fafafa; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul::-webkit-scrollbar { + width: 4px; + background-color: #fafafa; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul::-webkit-scrollbar-thumb { + background-color: #40d9f1; + border-radius: 4px; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul + .mec-event-data-field-item { + display: block; + width: 100%; + text-transform: none; + margin: 0 0 8px 0; + color: #616263; + font-size: 13px; + line-height: 1.5; + font-weight: 400; + padding-bottom: 8px; + border-bottom: 1px dashed #e1e2e3; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-event-data-fields + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul + .mec-event-data-field-item:last-child { + border-bottom: none; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul + .mec-event-data-field-item + a { + color: #40d9f1; + font-size: 13px; + line-height: 1.5; + font-weight: 400; +} + +.mec-wrap + [id^="mec_skin_events_"] + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul + .mec-event-data-field-item + a:hover { + color: #000; +} + +/* Custom Data with Label */ +.mec-wrap .mec-custom-data .mec-timetable-t2-content, +.mec-wrap .mec-custom-data .mec-timetable-t2-content .mec-event-title, +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-custom-data.mec-label-canceled, +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-custom-data.mec-label-featured { + overflow: visible !important; +} + +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-custom-data.mec-label-canceled + .mec-event-label-captions, +.mec-wrap + article:not([class^="mec-event-countdown"]):not( + [class^="mec-event-cover-"] + ).mec-custom-data.mec-label-featured + .mec-event-label-captions { + -ms-transform: rotate(0); + -webkit-transform: rotate(0); + transform: rotate(0); + width: fit-content; + top: 7px; + right: 7px; + padding: 2px 5px; + border-radius: 4px; +} + +@media (min-width: 769px) { + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-custom + .mec-event-data-fields + .mec-data-fields-tooltip, + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-featured + .mec-event-data-fields + .mec-data-fields-tooltip, + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-canceled + .mec-event-data-fields + .mec-data-fields-tooltip { + bottom: calc(50% - 110px); + left: 30px; + } + + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-custom + .mec-event-data-fields + .mec-data-fields-tooltip:before, + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-featured + .mec-event-data-fields + .mec-data-fields-tooltip:before, + .mec-wrap + [id^="mec_skin_events_"] + .mec-event-list-standard + .mec-label-canceled + .mec-event-data-fields + .mec-data-fields-tooltip:before { + left: -10px; + top: calc(100% - 110px); + box-shadow: -8px -5px 9px -4px #535a61; + } +} + +/* # Speaker Modal + ================================================== */ +.mec-hourly-schedule-speaker-info { + background: #fff; + padding: 30px; + border: 1px solid #e6e6e6; +} + +.mec-hourly-schedule-speaker-thumbnail { + float: left; + max-width: 30%; + width: 30%; +} + +.mec-hourly-schedule-speaker-name { + font-weight: 700; + font-size: 26px; + line-height: 1.2; + color: #333; + text-transform: uppercase; +} + +.mec-hourly-schedule-speaker-details { + float: left; + width: 69%; + padding-left: 25px; +} + +.mec-hourly-schedule-speaker-job-title { + font-size: 16px; + line-height: 1.3; + margin-bottom: 4px; +} + +.mec-hourly-schedule-speaker-description { + font-size: 14px; + font-weight: 400; + color: #6d7683; + line-height: 1.7; + text-align: left; +} + +.mec-organizer-social-information a i, +.mec-hourly-schedule-speaker-contact-information a i { + color: #6b6b6b; + background: #ebebeb; + line-height: 29px; + margin: 9px 7px 9px 0; + width: 30px; + height: 30px; + display: inline-block; + text-align: center; + transition: all 0.2s ease; + font-size: 15px; + cursor: pointer; + border-radius: 3px; +} + +.mec-organizer-social-information a i:hover, +.mec-hourly-schedule-speaker-contact-information a i:hover { + background: #222; + color: #fff; +} + +@media only screen and (max-width: 479px) { + .mec-hourly-schedule-speaker-thumbnail { + float: none; + max-width: none; + margin-right: 0; + margin-bottom: 15px; + width: 100%; + } + + .mec-hourly-schedule-speaker-thumbnail img { + width: 100%; + } + + .mec-hourly-schedule-speaker-details { + padding-left: 0; + } + + .mec-hourly-schedule-speaker-info { + width: 90%; + margin: 0 auto; + } +} + +/* # Profile page + ================================================== */ +.mec-profile { + overflow-x: auto; +} + +.mec-profile .mec-profile-bookings { + border: 2px solid #e6e6e6; + text-align: center; + min-width: 600px; +} + +.mec-profile .mec-profile-bookings tbody tr:first-child { + background: #f7f7f7; + font-weight: bold; + text-transform: capitalize; +} + +.mec-profile .mec-profile-bookings tbody tr { + border-bottom: 1px solid #e6e6e6; + font-size: 14px; +} + +.mec-profile .mec-profile-bookings tbody tr td { + border: 1px solid #e6e6e6; + padding: 10px; + text-align: center; + word-break: initial; +} + +.mec-profile .mec-profile-bookings tbody tr td a { + text-decoration: none; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(1) { + width: 5%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(2) { + width: 30%; + text-align: left; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(3) { + width: 30%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(4) { + width: 7%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(5) { + width: 7%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(6) { + width: 7%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(7) { + width: 7%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(8) { + width: 7%; +} + +.mec-profile .mec-profile-bookings tbody tr td:nth-child(8) i { + color: #fe686a; +} + +.mec-profile .mec-event-status { + padding: 5px 10px; + color: #fff; + border-radius: 2px; + font-size: 12px; + line-height: 12px; + letter-spacing: 0.4px; +} + +.mec-profile .mec-event-status.mec-book-confirmed { + background: #50d477; +} + +.mec-profile .mec-event-status.mec-book-pending { + background: #fcbe69; +} + +.mec-profile .mec-event-status.mec-book-rejected { + background: #fe686a; +} + +.mec-profile .mec-event-date { + font-size: 12px; + color: #888; +} + +/* MEC Profile date and status with icon */ +.mec-event-status, +.mec-event-date { + text-align: center; +} + +.mec-event-status .mec-tooltip, +.mec-event-date .mec-tooltip { + position: relative; + width: fit-content; + margin: auto; +} + +.mec-profile i { + font-size: 15px; + color: #008aff; + vertical-align: text-bottom; + margin-right: 4px; +} + +.mec-event-status .mec-tooltip .box, +.mec-event-date .mec-tooltip .box { + min-width: 250px; + max-width: 300px; + display: inline-block; + top: -8px; + left: 50%; + margin-top: 0; + transform: translate(-50%, -100%); + padding: 0; + background-color: #000; + color: #fff; + font-weight: 400; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.5; + position: absolute; + z-index: 99999999; + box-sizing: border-box; + border-radius: 6px; + box-shadow: 0 4px 45px -8px #535a61; + padding: 5px 10px 6px; + border-radius: 8px; + text-align: center; + font-style: normal; + opacity: 0; + visibility: hidden; + display: none; +} + +.mec-event-date .mec-tooltip .box, +.mec-event-status .mec-tooltip .box { + font-size: 13px; + letter-spacing: 1.1px; + font-weight: 500; +} + +.mec-event-status .mec-tooltip:hover .box:after, +.mec-event-date .mec-tooltip:hover .box:after { + content: ""; + position: absolute; + width: 12px; + height: 12px; + left: calc(50% - 12px); + bottom: -12px; + transform: translate(50%, -50%) rotate(-45deg); + background-color: #000; + box-shadow: 0 8px 9px -4px #535a61; +} + +.mec-event-status .mec-tooltip .box { + min-width: 100px; +} + +.mec-event-status.mec-book-confirmed .mec-tooltip:hover .box:after, +.mec-event-status.mec-book-confirmed .mec-tooltip .box { + background-color: #50d477; +} + +.mec-event-status.mec-book-rejected .mec-tooltip:hover .box:after, +.mec-event-status.mec-book-rejected .mec-tooltip .box { + background-color: #fe686a; +} + +.mec-event-status.mec-book-pending .mec-tooltip:hover .box:after, +.mec-event-status.mec-book-pending .mec-tooltip .box { + background-color: #fcbe69; +} + +.mec-event-status .mec-tooltip:hover .box, +.mec-event-date .mec-tooltip:hover .box { + opacity: 1; + visibility: visible; + display: block; +} + +.mec-profile .mec-booking-number-of-attendees { + font-size: 13px; + color: #888; +} + +.mec-profile .mec-booking-number-of-attendees i, +.mec-profile .mec-profile-bookings-view-invoice i { + font-size: 15px; + color: #008aff; + vertical-align: text-bottom; + margin-right: 4px; +} + +.mec-booking-attendees { + background: #fff; + padding: 10px; +} + +.mec-booking-attendees { + width: 850px; + text-align: center; +} + +.mec-booking-attendees-wrapper { + border: 2px solid #e6e6e6; + font-size: 14px; +} + +.mec-booking-attendees-head { + display: table; + width: 100%; + background: #f7f7f7; + border-bottom: 1px solid #e6e6e6; + font-weight: bold; +} + +.mec-booking-attendees-head span, +.mec-booking-attendees-head-content > span { + vertical-align: middle; + display: table-cell; + padding: 7px; + border-right: 1px solid #e6e6e6; + font-size: 12px; +} + +.mec-booking-attendees-head-content { + display: table; + width: 100%; + border-bottom: 1px solid #e6e6e6; +} + +.mec-booking-attendees-wrapper .mec-booking-attendees-head-content:last-child { + border: none; +} + +.mec-booking-attendees-head span:nth-child(1), +.mec-booking-attendees-head-content > span:nth-child(1) { + width: 4%; +} + +.mec-booking-attendees-head span:nth-child(2), +.mec-booking-attendees-head-content > span:nth-child(2) { + width: 20%; +} + +.mec-booking-attendees-head span:nth-child(3), +.mec-booking-attendees-head-content > span:nth-child(3) { + width: 24%; +} + +.mec-booking-attendees-head span:nth-child(4), +.mec-booking-attendees-head-content > span:nth-child(4) { + width: 26%; +} + +.mec-booking-attendees-head span:nth-child(5), +.mec-booking-attendees-head-content > span:nth-child(5) { + width: 26%; +} + +@media only screen and (max-width: 759px) { + .mec-booking-attendees { + width: 470px; + } + + .mec-booking-attendees-head span, + .mec-booking-attendees-head-content > span { + word-break: break-all; + } +} + +/* User Profile Responsive */ +@media (max-width: 1366px) { + .mec-profile .mec-profile-bookings tbody tr td:nth-child(1) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(2) { + width: 30%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(3) { + width: 30%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(4) { + width: 10%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(5) { + width: 10%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(6) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(7) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(8) { + width: 5%; + } +} + +@media (max-width: 1024px) { + .mec-profile .mec-profile-bookings tbody tr td:nth-child(1) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(2) { + width: 30%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(3) { + width: 30%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(4) { + width: 10%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(5) { + width: 10%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(6) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(7) { + width: 5%; + } + + .mec-profile .mec-profile-bookings tbody tr td:nth-child(8) { + width: 5%; + } +} + +@media (max-width: 780px) { + .mec-profile i, + .mec-profile .mec-profile-bookings tbody tr { + font-size: 12px; + } + + .mec-event-date .mec-tooltip .box { + min-width: 200px; + } + + .mec-event-status .mec-tooltip .box { + min-width: 90px; + } + + .mec-event-date .mec-tooltip .box, + .mec-event-status .mec-tooltip .box { + padding: 4px 5px !important; + } + + .mec-profile .mec-profile-bookings tbody tr { + font-size: 12px; + } +} + +@media (max-width: 480px) { + .mec-profile .mec-booking-number-of-attendees, + .mec-profile i, + .mec-profile .mec-profile-bookings tbody tr, + .mec-profile .mec-event-date { + font-size: 10px !important; + } + + .mec-profile .mec-event-status { + padding: 2px 4px; + font-size: 10px; + line-height: 20px; + } + + .mec-profile .mec-profile-bookings tbody tr td { + padding: 3px; + } + + .mec-event-date .mec-tooltip .box, + .mec-event-status .mec-tooltip .box { + font-size: 8px; + } + + .mec-event-date .mec-tooltip .box { + min-width: 75px; + } + + .mec-event-status .mec-tooltip .box { + min-width: 70px; + } + + .mec-event-date .mec-tooltip .box, + .mec-event-status .mec-tooltip .box { + padding: 4px 5px !important; + } +} + +/* # Woocommerce + ================================================== */ +.mec-woo-booking-checkout { + position: relative; + border: none; + border-radius: 0; + color: #fff; + display: inline-block; + font-size: 12px; + letter-spacing: 1px; + line-height: 1.5; + text-transform: uppercase; + font-weight: 600; + text-decoration: none; + cursor: pointer; + margin-bottom: 21px; + margin-right: 10px; + line-height: 1; + padding: 18px 20px 16px; + background: #39c36e; + -webkit-transition: all 0.21s ease; + -moz-transition: all 0.21s ease; + transition: all 0.21s ease; + border-radius: 0; + margin-bottom: 6px; + min-width: 170px; + margin-top: 5px; + text-align: center; +} + +.mec-woo-booking-checkout:hover { + background: #222; + color: #fff; +} + +.mec-woo-booking-checkout:focus, +.mec-woo-booking-checkout:visited { + color: #fff; +} + +/* # Booking Modal + ================================================== */ +.single-mec-events .lity-container { + max-width: 768px; + width: 768px; +} + +.lity-content .mec-events-meta-group-booking { + width: 100%; + background: #fff; + overflow-y: auto; +} + +@media only screen and (max-width: 480px) { + .lity-content .mec-events-meta-group-booking { + padding: 20px; + width: 340px; + margin: 0 auto; + } +} + +@media (max-width: 480px) { + .single-mec-events .lity-container { + max-width: 440px; + width: 440px; + margin: 0 auto !important; + } +} + +@media (max-width: 411px) { + .single-mec-events .lity-container { + max-width: 380px; + width: 380px; + } +} + +@media (max-width: 375px) { + .single-mec-events .lity-container { + max-width: 350px; + width: 350px; + } +} + +@media (max-width: 320px) { + .single-mec-events .lity-container { + max-width: 300px; + width: 300px; + } +} + +/* Booking Cover Overley */ +.mec-events-meta-group-booking { + position: relative; +} + +.mec-cover-loader:after { + content: ""; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.5); + z-index: 99999; +} + +.mec-loader { + background: rgba(0, 0, 0, 0); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 9; +} + +.mec-loader, +.mec-loader:after { + border-radius: 50%; + width: 5em; + height: 5em; + z-index: 999999999999; +} + +.mec-loader { + font-size: 10px; + text-indent: -9999em; + border-top: 0.5em solid rgba(0, 0, 0, 0.2); + border-right: 0.5em solid rgba(0, 0, 0, 0.2); + border-bottom: 0.5em solid rgba(0, 0, 0, 0.2); + border-left: 0.5em solid #ffffff; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation: mecloader 1.1s infinite linear; + animation: mecloader 1.1s infinite linear; +} + +@-webkit-keyframes mecloader { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes mecloader { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +/* Recaptcha Style on booking page */ +.mec-google-recaptcha { + margin: 0 0 20px 16px; +} + +/* Bootstrap v3.0.3 * * Copyright 2013 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ +.mec-wrap * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mec-wrap *:before, +.mec-wrap *:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.lity .clearfix:before, +.lity .clearfix:after, +.mec-wrap .clearfix:before, +.mec-wrap .clearfix:after { + content: "\0020"; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; +} + +.lity .clearfix:after, +.mec-wrap .clearfix:after { + clear: both; +} + +.lity .clearfix, +.mec-wrap .clearfix { + zoom: 1; +} + +.lity .clear, +.lity .clr, +.mec-wrap .clear, +.mec-wrap .clr { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; +} + +.lity .clr, +.mec-wrap .clr { + visibility: visible; + overflow: visible; +} + +.mec-container [class*="col-"] img { + max-width: 100%; +} + +.mec-container { + margin-right: auto; + margin-left: auto; + padding-left: 10px; + padding-right: 10px; +} + +.mec-container:before, +.mec-container:after { + content: " "; + display: table; +} + +.mec-container:after { + clear: both; +} + +@media only screen and (max-width: 479px) { + .mec-container { + width: 300px; + } +} + +@media only screen and (min-width: 480px) and (max-width: 767px) { + .mec-container { + width: 420px; + } +} + +@media only screen and (min-width: 768px) and (max-width: 960px) { + .mec-container { + width: 768px; + /* webnus */ + } +} + +@media only screen and (min-width: 961px) { + .mec-container { + width: 960px; + } +} + +@media only screen and (min-width: 1200px) { + .mec-container { + width: 1196px; + padding-left: 15px; + padding-right: 15px; + } +} + +@media only screen and (min-width: 1921px) { + .mec-container { + max-width: 1690px; + } +} + +.mec-wrap .row { + margin-left: -10px; + margin-right: -10px; +} + +.mec-wrap .row:before, +.mec-wrap .row:after { + content: " "; + display: table; +} + +.mec-wrap .row:after { + clear: both; +} + +.mec-wrap .col-xs-1, +.mec-wrap .col-sm-1, +.mec-wrap .col-md-1, +.mec-wrap .col-lg-1, +.mec-wrap .col-xs-2, +.mec-wrap .col-sm-2, +.mec-wrap .col-md-2, +.mec-wrap .col-lg-2, +.mec-wrap .col-xs-3, +.mec-wrap .col-sm-3, +.mec-wrap .col-md-3, +.mec-wrap .col-lg-3, +.mec-wrap .col-xs-4, +.mec-wrap .col-sm-4, +.mec-wrap .col-md-4, +.mec-wrap .col-lg-4, +.mec-wrap .col-xs-5, +.mec-wrap .col-sm-5, +.mec-wrap .col-md-5, +.mec-wrap .col-lg-5, +.mec-wrap .col-xs-6, +.mec-wrap .col-sm-6, +.mec-wrap .col-md-6, +.mec-wrap .col-lg-6, +.mec-wrap .col-xs-7, +.mec-wrap .col-sm-7, +.mec-wrap .col-md-7, +.mec-wrap .col-lg-7, +.mec-wrap .col-xs-8, +.mec-wrap .col-sm-8, +.mec-wrap .col-md-8, +.mec-wrap .col-lg-8, +.mec-wrap .col-xs-9, +.mec-wrap .col-sm-9, +.mec-wrap .col-md-9, +.mec-wrap .col-lg-9, +.mec-wrap .col-xs-10, +.mec-wrap .col-sm-10, +.mec-wrap .col-md-10, +.mec-wrap .col-lg-10, +.mec-wrap .col-xs-11, +.mec-wrap .col-sm-11, +.mec-wrap .col-md-11, +.mec-wrap .col-lg-11, +.mec-wrap .col-xs-12, +.mec-wrap .col-sm-12, +.mec-wrap .col-md-12, +.mec-wrap .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 10px; + padding-right: 10px; +} + +@media only screen and (min-width: 1200px) { + .mec-wrap .col-xs-1, + .mec-wrap .col-sm-1, + .mec-wrap .col-md-1, + .mec-wrap .col-lg-1, + .mec-wrap .col-xs-2, + .mec-wrap .col-sm-2, + .mec-wrap .col-md-2, + .mec-wrap .col-lg-2, + .mec-wrap .col-xs-3, + .mec-wrap .col-sm-3, + .mec-wrap .col-md-3, + .mec-wrap .col-lg-3, + .mec-wrap .col-xs-4, + .mec-wrap .col-sm-4, + .mec-wrap .col-md-4, + .mec-wrap .col-lg-4, + .mec-wrap .col-xs-5, + .mec-wrap .col-sm-5, + .mec-wrap .col-md-5, + .mec-wrap .col-lg-5, + .mec-wrap .col-xs-6, + .mec-wrap .col-sm-6, + .mec-wrap .col-md-6, + .mec-wrap .col-lg-6, + .mec-wrap .col-xs-7, + .mec-wrap .col-sm-7, + .mec-wrap .col-md-7, + .mec-wrap .col-lg-7, + .mec-wrap .col-xs-8, + .mec-wrap .col-sm-8, + .mec-wrap .col-md-8, + .mec-wrap .col-lg-8, + .mec-wrap .col-xs-9, + .mec-wrap .col-sm-9, + .mec-wrap .col-md-9, + .mec-wrap .col-lg-9, + .mec-wrap .col-xs-10, + .mec-wrap .col-sm-10, + .mec-wrap .col-md-10, + .mec-wrap .col-lg-10, + .mec-wrap .col-xs-11, + .mec-wrap .col-sm-11, + .mec-wrap .col-md-11, + .mec-wrap .col-lg-11, + .mec-wrap .col-xs-12, + .mec-wrap .col-sm-12, + .mec-wrap .col-md-12, + .mec-wrap .col-lg-12 { + padding-left: 15px; + padding-right: 15px; + } + + .mec-wrap .row { + margin-left: -15px; + margin-right: -15px; + } +} + +.mec-container [class*="col-"].alpha { + padding-left: 0; +} + +.mec-container [class*="col-"].omega { + padding-right: 0; +} + +.mec-wrap .col-xs-1, +.mec-wrap .col-xs-2, +.mec-wrap .col-xs-3, +.mec-wrap .col-xs-4, +.mec-wrap .col-xs-5, +.mec-wrap .col-xs-6, +.mec-wrap .col-xs-7, +.mec-wrap .col-xs-8, +.mec-wrap .col-xs-9, +.mec-wrap .col-xs-10, +.mec-wrap .col-xs-11, +.mec-wrap .col-xs-12 { + float: left; +} + +.mec-wrap .col-xs-12 { + width: 100%; +} + +.mec-wrap .col-xs-11 { + width: 91.66666666666666%; +} + +.mec-wrap .col-xs-10 { + width: 83.33333333333334%; +} + +.mec-wrap .col-xs-9 { + width: 75%; +} + +.mec-wrap .col-xs-8 { + width: 66.66666666666666%; +} + +.mec-wrap .col-xs-7 { + width: 58.333333333333336%; +} + +.mec-wrap .col-xs-6 { + width: 50%; +} + +.mec-wrap .col-xs-5 { + width: 41.66666666666667%; +} + +.mec-wrap .col-xs-4 { + width: 33.33333333333333%; +} + +.mec-wrap .col-xs-3 { + width: 25%; +} + +.mec-wrap .col-xs-2 { + width: 16.666666666666664%; +} + +.mec-wrap .col-xs-1 { + width: 8.333333333333332%; +} + +@media (min-width: 769px) { + .mec-wrap .col-sm-1, + .mec-wrap .col-sm-2, + .mec-wrap .col-sm-3, + .mec-wrap .col-sm-4, + .mec-wrap .col-sm-5, + .mec-wrap .col-sm-6, + .mec-wrap .col-sm-7, + .mec-wrap .col-sm-8, + .mec-wrap .col-sm-9, + .mec-wrap .col-sm-10, + .mec-wrap .col-sm-11, + .mec-wrap .col-sm-12 { + float: left; + } + + .mec-wrap .col-sm-12 { + width: 100%; + } + + .mec-wrap .col-sm-11 { + width: 91.66666666666666%; + } + + .mec-wrap .col-sm-10 { + width: 83.33333333333334%; + } + + .mec-wrap .col-sm-9 { + width: 75%; + } + + .mec-wrap .col-sm-8 { + width: 66.66666666666666%; + } + + .mec-wrap .col-sm-7 { + width: 58.333333333333336%; + } + + .mec-wrap .col-sm-6 { + width: 50%; + } + + .mec-wrap .col-sm-5 { + width: 41.66666666666667%; + } + + .mec-wrap .col-sm-4 { + width: 33.33333333333333%; + } + + .mec-wrap .col-sm-3 { + width: 25%; + } + + .mec-wrap .col-sm-2 { + width: 16.666666666666664%; + } + + .mec-wrap .col-sm-1 { + width: 8.333333333333332%; + } +} + +@media (min-width: 961px) { + .mec-wrap .col-md-1, + .mec-wrap .col-md-2, + .mec-wrap .col-md-3, + .mec-wrap .col-md-4, + .mec-wrap .col-md-5, + .mec-wrap .col-md-6, + .mec-wrap .col-md-7, + .mec-wrap .col-md-8, + .mec-wrap .col-md-9, + .mec-wrap .col-md-10, + .mec-wrap .col-md-11, + .mec-wrap .col-md-12 { + float: left; + } + + .mec-wrap .col-md-12 { + width: 100%; + } + + .mec-wrap .col-md-11 { + width: 91.66666666666666%; + } + + .mec-wrap .col-md-10 { + width: 83.33333333333334%; + } + + .mec-wrap .col-md-9 { + width: 75%; + } + + .mec-wrap .col-md-8 { + width: 66.66666666666666%; + } + + .mec-wrap .col-md-7 { + width: 58.333333333333336%; + } + + .mec-wrap .col-md-6 { + width: 50%; + } + + .mec-wrap .col-md-5 { + width: 41.66666666666667%; + } + + .mec-wrap .col-md-4 { + width: 33.33333333333333%; + } + + .mec-wrap .col-md-3 { + width: 25%; + } + + .mec-wrap .col-md-2 { + width: 16.666666666666664%; + } + + .mec-wrap .col-md-1 { + width: 8.333333333333332%; + } +} + +@media (min-width: 1200px) { + .mec-wrap .col-lg-1, + .mec-wrap .col-lg-2, + .mec-wrap .col-lg-3, + .mec-wrap .col-lg-4, + .mec-wrap .col-lg-5, + .mec-wrap .col-lg-6, + .mec-wrap .col-lg-7, + .mec-wrap .col-lg-8, + .mec-wrap .col-lg-9, + .mec-wrap .col-lg-10, + .mec-wrap .col-lg-11, + .mec-wrap .col-lg-12 { + float: left; + } + + .mec-wrap .col-lg-12 { + width: 100%; + } + + .mec-wrap .col-lg-11 { + width: 91.66666666666666%; + } + + .mec-wrap .col-lg-10 { + width: 83.33333333333334%; + } + + .mec-wrap .col-lg-9 { + width: 75%; + } + + .mec-wrap .col-lg-8 { + width: 66.66666666666666%; + } + + .mec-wrap .col-lg-7 { + width: 58.333333333333336%; + } + + .mec-wrap .col-lg-6 { + width: 50%; + } + + .mec-wrap .col-lg-5 { + width: 41.66666666666667%; + } + + .mec-wrap .col-lg-4 { + width: 33.33333333333333%; + } + + .mec-wrap .col-lg-3 { + width: 25%; + } + + .mec-wrap .col-lg-2 { + width: 16.666666666666664%; + } + + .mec-wrap .col-lg-1 { + width: 8.333333333333332%; + } +} + +/* WooCommerce Addon */ +#mec_woo_add_to_cart_btn { + min-width: 170px; + margin-top: 5px; + text-align: center; +} + +/* Breadcrumbs */ + +.mec-breadcrumbs { + border-radius: 2px; + padding: 9px 15px 6px; + font-size: 11px; + color: #8d8d8d; + letter-spacing: 0; + text-transform: none; + font-weight: 500; + margin: auto 15px 33px 15px; + border: 1px solid #e6e6e6; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.025); +} + +.mec-breadcrumbs-modern { + margin: auto 0 33px 0; +} + +.mec-breadcrumbs a { + color: #000; + padding-left: 4px; +} + +.mec-breadcrumbs a:hover { + text-decoration: underline; +} + +.mec-breadcrumbs i { + font-size: 8px; + margin: 0 0 0 4px; +} + +.mec-breadcrumbs .container { + padding-left: 20px; +} + +/* Notification single builder */ +.mec-content-notification a { + margin-left: 5px; +} + +.mec-content-notification { + background: #f7f7f7; + padding: 10px 10px 10px; + border: 1px solid #e8e8e8; +} + +.mec-content-notification p { + margin-bottom: 0; +} + +/* Advanced Repeating */ + +.mec-fes-form #mec-advanced-wraper div:first-child > ul { + border: 1px solid #cfeff5; + width: auto; + box-shadow: 0 1px 4px -2px #cfeff5; + display: block; + margin: 5px 0 10px; + padding: 5px 0; + border-radius: 2px; +} + +.mec-fes-form #mec-advanced-wraper div:first-child > ul:last-of-type { + margin-bottom: 35px; +} + +#mec-advanced-wraper div:first-child > ul span { + display: none; +} + +#mec-advanced-wraper div:first-child > ul * { + display: inline-block; + background: #fff; + font-size: 12px; + color: #717273; + text-align: center; +} + +#mec-advanced-wraper div:first-child > ul > li { + width: 60px; + font-weight: 700; + margin: 0 10px 0 0; + padding: 4px 0; + border-right: 1px solid #cfeff5; +} + +#mec-advanced-wraper div:first-child > ul > ul > li { + margin: 0; + padding: 2px 10px; + cursor: pointer; + border-radius: 2px; + transition: all 0.18s ease; +} + +.mec-fes-form #mec-advanced-wraper div:first-child > ul > ul > li:hover, +.mec-fes-form #mec-advanced-wraper div:first-child > ul > ul > li.mec-active { + background: #40d9f1 !important; + box-shadow: 0 1px 9px -3px #40d9f1; + color: #fff !important; +} + +/* Search Bar */ +.mec-search-bar-wrap .mec-search-form .mec-text-input-search { + width: 83%; +} + +.mec-search-bar-wrap + .mec-search-form + .mec-ajax-search-result + .mec-text-input-search { + width: 100%; + float: none; +} + +.mec-search-bar-wrap input#mec-search-bar-input { + width: calc(100% - 84%); + margin-left: 11px; + background: #40d9f1; + color: #fff; + font-weight: normal; +} + +.mec-text-input-search + input#mec-search-bar-input { + margin-left: -3px; +} + +.mec-search-bar-wrap input#mec-search-bar-input:hover { + background: #000; +} + +.mec-wrap.mec-search-bar-wrap .mec-totalcal-box input { + float: none; +} + +@media (max-width: 768px) { + .mec-search-bar-wrap .mec-search-form .mec-text-input-search { + display: inline-block; + } +} + +@media (max-width: 480px) { + .mec-search-bar-wrap .mec-search-form .mec-text-input-search { + width: 64%; + } + + .mec-search-bar-wrap input#mec-search-bar-input { + width: calc(100% - 67%); + } +} + +/* Ajax search bar result */ +.mec-wrap.mec-search-bar-wrap .mec-totalcal-box { + overflow: visible; +} + +.mec-ajax-search-result { + position: relative; +} + +.mec-search-bar-wrap.mec-wrap .mec-totalcal-box input[type="text"] { + width: calc(100% - 36px); +} + +.mec-search-bar-wrap.mec-wrap .mec-totalcal-box input[type="text"]:focus { + border-color: #efefef; +} + +div#mec-ajax-search-result-wrap { + position: absolute; + top: 100%; + opacity: 0; + visibility: hidden; + width: calc(100% - 2px); + min-height: 50px; + left: 0; + right: 0; + padding: 0 10px; + z-index: 9999; + transition: all 0.3s ease; +} + +.mec-ajax-search-result-events { + background: #ffffff; + padding: 10px 20px; + border: 1px solid #efefef; + border-top: none; +} + +.mec-ajax-search-result-events article:first-of-type { + border: none; +} + +article.mec-search-bar-result { + text-align: left; + margin-bottom: 0; + padding-bottom: 25px; + padding-top: 26px; + border-top: 1px solid #efefef; + transition: all 0.33s ease; + clear: both; +} + +.mec-search-bar-result .mec-event-list-search-bar-date { + width: 64px; + height: 64px; + margin-right: 10px; + font-size: 11px; + text-transform: uppercase; + float: left; + text-align: center; + padding-top: 2px; +} + +.mec-search-bar-result .mec-event-list-search-bar-date span { + font-size: 40px; + line-height: 30px; + font-weight: 700; + display: block; + margin-bottom: 6px; + letter-spacing: 1px; +} + +.mec-search-bar-result .mec-event-image { + float: left; + margin-right: 20px; + width: 65px; + height: auto; +} + +.mec-search-bar-result .mec-event-time { + font-size: 11px; + line-height: 1.1; + margin: 0; +} + +.mec-search-bar-result .mec-event-time i { + color: #40d9f1; + float: none; + width: unset; + height: unset; + font-size: inherit; + margin-right: 3px; + border: none; + padding: 0; +} + +.mec-search-bar-result .mec-event-title { + font-size: 13px; + padding: 0; + margin: 10px 0 8px; + font-weight: 700; + text-transform: uppercase; +} + +.mec-search-bar-result .mec-event-title a { + text-decoration: none; + color: #494949; + transition: color 0.3s ease; +} + +.mec-search-bar-result .mec-event-detail { + font-size: 13px; + line-height: 1.3; + color: #9a9a9a; + margin-bottom: 0; +} + +/* Modern Search bar */ +.mec-wrap.mec-modern-search-bar .mec-totalcal-box { + background: rgba(255, 255, 255, 0.87); + border: none; + padding: 35px; + border-radius: 3px; + box-shadow: 0 3px 13px rgba(0, 0, 0, 0.4); + position: relative; +} + +.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type="search"], +.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type="text"] { + height: 58px; + background: rgba(255, 255, 255, 0.99); + border-radius: 2px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1) inset; + border: 1px solid #ccc; + width: 100%; + padding-left: 45px; + padding-right: 13px; + font-size: 16px; +} + +.mec-wrap.mec-modern-search-bar .mec-totalcal-box .mec-text-input-search i { + position: absolute; + background: none; + border: none; + font-size: 21px; + left: 15px; + top: calc(50% - 19px); + color: #40d9f1; +} + +.mec-wrap.mec-modern-search-bar .mec-text-input-search { + position: relative; + height: 58px; +} + +.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type="submit"] { + height: 58px; + border: none; + border-radius: 2px; + background: #fc4a1a; + font-size: 17px; + font-weight: bold !important; +} + +.mec-wrap.mec-modern-search-bar + .mec-text-input-search + + input#mec-search-bar-input { + margin-left: 0; +} + +.mec-wrap.mec-modern-search-bar + .mec-search-form + .mec-dropdown-wrap + .mec-dropdown-search + select { + height: 45px; + background: rgba(255, 255, 255, 0.99); + border-radius: 2px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1) inset; + border: 1px solid #ccc; + padding-right: 13px; + font-size: 16px; + border-left: 0; +} + +.mec-wrap.mec-modern-search-bar .mec-search-form .mec-dropdown-wrap i { + height: 45px; + background: #ffff; + border-radius: 2px 0 0 2px; + box-shadow: none; + border: 1px solid #ccc; + font-size: 15px; + padding-top: 14px; + border-right: 0; + color: #40d9f1; + margin-right: -1px; +} + +.mec-wrap.mec-modern-search-bar .mec-search-form .mec-dropdown-wrap { + min-height: 64px; +} + +@media (max-width: 768px) { + .mec-wrap.mec-modern-search-bar .mec-search-form .mec-text-input-search { + width: 70%; + } + + .mec-wrap.mec-modern-search-bar input#mec-search-bar-input { + width: calc(100% - 72%); + } +} + +@media (max-width: 480px) { + .mec-wrap.mec-modern-search-bar input#mec-search-bar-input { + width: 92%; + padding: 0 10px; + position: relative; + display: block; + margin-left: 11px; + } + + .mec-wrap.mec-modern-search-bar .mec-search-form .mec-text-input-search { + width: 100%; + margin-bottom: 20px; + } + + .mec-wrap.mec-modern-search-bar + .mec-text-input-search + + input#mec-search-bar-input { + margin-left: 10px; + } +} + +/* Related Events */ + +.mec-wrap .mec-related-events-wrap { + margin-left: 0; + margin-right: 0; +} + +.mec-related-events { + margin-right: -15px; + margin-left: -15px; +} + +@media (max-width: 980px) { + .mec-related-events { + margin-right: -10px; + margin-left: -10px; + } +} + +.mec-related-events-wrap { + margin-top: 50px; +} + +.mec-related-events-wrap h3.mec-rec-events-title:before { + content: ""; + background: #2c2f34; + width: 46px; + height: 4px; + position: absolute; + top: 59px; + left: 0; +} + +.mec-related-events-wrap h3.mec-rec-events-title { + font-size: 21px; + font-weight: 600; + padding: 17px 0; + margin-bottom: 28px; + text-transform: uppercase; + border-bottom: 1px solid #e8e8e8; + position: relative; +} + +.mec-related-event-post figure { + margin: 0; +} + +.mec-related-event-post figure img { + width: 100%; + border-radius: 3px; + height: auto; +} + +.mec-related-event-content { + background-color: #fff; + margin: -40px 20px 15px; + border-radius: 2px; + position: relative; + max-width: 90%; + padding: 10px 12px 16px 17px; +} + +.mec-related-event-content h5 a { + font-size: 16px; + color: #121212; + font-weight: 600; + transition: all 0.3s ease; +} + +@media (max-width: 480px) { + .mec-wrap .mec-related-events .mec-related-event-post { + padding-right: 15px; + padding-left: 15px; + } +} + +/* Next / Previous Events */ +.mec-next-previous-events { + width: 100%; + height: 104px; + display: block; + padding: 0; + margin: 0; +} + +.mec-next-previous-events li { + list-style: none; + width: 50%; + display: inline-block; + margin: 40px 0 40px; +} + +.mec-next-previous-events li:last-child { + text-align: right; + float: right; +} + +.mec-next-previous-events li a { + padding: 9px 14px 9px 14px; + border: 1px solid #000; + transition: 0.3s; +} + +.mec-wrap .mec-next-previous-events li a:hover { + color: #fff !important; +} + +.mec-previous-event { + float: left; + text-align: left; +} + +.mec-next-event ul { + padding-left: 0; + margin: 0; +} + +.mec-next-previous-events .mec-previous-event i { + padding-right: 20px; +} + +.mec-next-previous-events .mec-next-event i { + padding-left: 20px; +} + +.mec-next-multiple ul { + padding: 0; + margin: 0; +} + +.mec-next-multiple ul li a { + display: block; + position: relative; + padding: 11px 14px 9px; + z-index: 9; +} + +.mec-next-multiple ul .mec-time, +.mec-next-multiple ul .mec-date { + display: inline-block; +} + +.mec-next-multiple ul .mec-time { + width: 40%; +} + +.mec-next-multiple ul .mec-date { + width: 60%; +} + +.mec-next-multiple ul .mec-date { + float: left; + text-align: left; +} + +.mec-next-multiple ul .mec-time { + text-align: right; + position: relative; + z-index: -1; +} + +.mec-next-multiple ul .mec-time dd { + margin: 0; + padding: 0; +} + +.mec-next-multiple ul .mec-date .mec-end-date-label, +.mec-next-multiple ul .mec-time .mec-events-abbr, +.mec-next-multiple ul .mec-date .mec-start-date-label { + font-size: 11px; + line-height: 24px; +} + +@media (max-width: 1280px) { + .mec-next-multiple ul li a { + padding: 7px 9px 5px; + } + + .mec-next-multiple ul .mec-time .mec-events-abbr, + .mec-next-multiple ul .mec-date .mec-start-date-label { + font-size: 12px; + } +} + +@media (max-width: 480px) { + .mec-next-previous-events li { + list-style: none; + width: 100%; + display: block; + margin: 10px 0; + float: unset; + } + + .mec-next-previous-events li a { + width: 100%; + max-width: 100%; + float: unset; + display: block; + text-align: center; + font-size: 16px; + } +} + +/* Fronrend Organizer Payment */ +.mec-fes-form-cntt #mec-organizer-payments ul { + list-style: none; + background: transparent; + margin: 0; + padding-left: 0; +} + +.mec-fes-form-cntt #mec-organizer-payments ul li h4 { + background: transparent; + letter-spacing: 0.2px; + display: inline-block; + padding-left: 0 !important; + padding-bottom: 10px !important; + margin: 0; + margin-bottom: 1px; + letter-spacing: 1px; + text-transform: capitalize; + padding-top: 1px; +} + +.mec-fes-form-cntt #mec-organizer-payments ul > li { + width: 100%; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; +} + +.mec-fes-form #mec_gateway_options_form_stripe_connection_button { + padding: 9px 13px !important; +} + +/* Login Module */ +#mec-login-form.mec-login-form { + width: 100%; + background: #fff; + padding: 20px; + margin: 0 auto; + text-align: center; + position: relative; +} + +#mec-login-form.mec-login-form .mec-login-input { + display: block; + width: 286px; + margin: 0 auto; + margin-bottom: 12px; +} + +#mec-login-form.mec-login-form .mec-login-forgotpassword { + display: inline-block; +} + +.mec-login-forgotpassword a { + color: #000; +} + +#mec-login-form.mec-login-form .mec-login-submit { + float: right; + text-align: right; + width: 49%; + padding-right: 2px; +} + +#mec-login-form.mec-login-form .mec-login-input input { + border: none; + box-shadow: none; + background: #fff; + color: #ccc; + border-left: 1px solid #e6e6e6; + border-radius: 0; + padding: 0; + height: 100%; + background-image: none !important; + padding-left: 10px; + padding-right: 0; + width: 222px; + margin-left: 0; + clear: none; + float: left; +} + +#mec-login-form.mec-login-form .mec-login-input label { + border: 1px solid #e6e6e6; + height: 52px; + display: inline-block; + padding: 0; + border-radius: 3px; + overflow: hidden; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); +} + +#mec-login-form.mec-login-form + .mec-login-input + label + i:not(.mec-sl-display-controller-password) { + padding: 15px 13px 17px 16px; + vertical-align: middle; + font-size: 20px; + width: 50px; + color: #c5cad0; + background: #fafafa; + margin-right: 0; + float: left; +} + +#mec-login-form.mec-login-form .mec-login-forgotpassword { + float: left; + width: 49%; + text-align: left; + padding-top: 10px; + font-size: 13px; + padding-left: 2px; +} + +#mec-login-form.mec-login-form button { + width: 120px; + height: 44px; + font-size: 12px; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + transition: all 0.22s ease; + margin: 0; + min-width: unset; +} + +.mec-login-form button { + box-shadow: 0 4px 22px -7px #40d9f1; + background-color: #40d9f1; +} + +#mec-login-form.mec-login-form .mec-login-form-footer { + width: 286px; + margin: 0 auto; + margin-top: 20px; + clear: both; + position: relative; + display: block; + min-height: 50px; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading { + position: absolute; + background: #ffffffc2; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +#mec-login-form.mec-login-form .lds-ripple { + position: absolute; + width: 64px; + height: 64px; + top: calc(50% - 23px); + left: calc(50% - 23px); +} + +#mec-login-form.mec-login-form .lds-ripple div { + position: absolute; + border: 4px solid #40d9f1; + opacity: 1; + border-radius: 50%; + animation: lds-ripple 1.2s cubic-bezier(0, 0.2, 0.1, 0.8) infinite; +} + +#mec-login-form.mec-login-form .lds-ripple div:nth-child(2) { + animation-delay: -0.5s; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading-text { + position: absolute; + min-width: 200px; + top: calc(50% - 18px); + left: calc(50% - 124px); + color: #fff; + padding: 10px 22px; + border-radius: 3px; + background: #fff; + height: 47px; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading-text strong { + color: #3fcc60; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading-text strong:before { + content: ""; + position: absolute; + top: 8px; + left: 1px; + border-right: 2px solid #3fcc60; + border-bottom: 2px solid #3acb5c; + transform: rotate(45deg); + transform-origin: 0 100%; + color: #000; + animation: checkbox-check 130ms 140ms cubic-bezier(0.4, 0, 0.23, 1) forwards; + width: 8px; + height: 14px; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading-text.error strong:after { + content: ""; + position: absolute; + top: 14px; + left: 5px; + border-bottom: 2px solid #ff5d39; + transform: rotate(45deg); + transform-origin: 0 100%; + color: #000; + animation: checkbox-check 130ms 140ms cubic-bezier(0.4, 0, 0.23, 1) forwards; + width: 14px; + height: 4px; +} + +#mec-login-form.mec-login-form .mec-ajax-login-loading-text.error strong { + color: #ff5d39; +} + +#mec-login-form.mec-login-form + .mec-ajax-login-loading-text.error + strong:before { + border-color: #ff5d39; + border-bottom: none; +} + +@keyframes lds-ripple { + 0% { + top: 28px; + left: 28px; + width: 0; + height: 0; + opacity: 1; + } + + 100% { + top: -1px; + left: -1px; + width: 58px; + height: 58px; + opacity: 0; + } +} + +/* Stripe V3 */ + +.mec-card-element-stripe { + margin-bottom: 30px; +} + +.mec-book-form-gateway-checkout + [id*="mec_do_transaction_stripe_"] + .mec-form-row.mec-stripe-name-and-email-wrapper { + width: 100%; +} + +.mec-book-form-gateway-checkout + [id*="mec_do_transaction_stripe_"] + .mec-form-row.mec-stripe-name-and-email-wrapper + .mec-form-row { + width: 50%; +} + +.mec-book-form-gateway-checkout + [id*="mec_do_transaction_stripe_"] + .mec-form-row.mec-stripe-name-and-email-wrapper + .mec-form-row:nth-child(2) { + margin-left: 12px; +} + +.mec-book-form-gateway-checkout + [id*="mec_do_transaction_stripe_"] + .mec-form-row.mec-stripe-name-and-email-wrapper + .mec-form-row + input { + max-width: unset; + margin-bottom: 20px; +} + +.mec-events-meta-group-booking .StripeElement--invalid { + border-color: #fa755a; +} + +.mec-events-meta-group-booking .StripeElement--webkit-autofill { + background-color: #fefde5 !important; +} + +/* front-end submition new edition */ + +#mec_occurrences_add { + position: relative; + top: -2px; +} + +.mec-occurrences-wrapper ul.mec-occurrences-list { + list-style: none; + padding: 0; +} + +.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item { + border: 2px dashed #eee; +} + +.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item { + border: 2px dashed #eee; + padding: 20px; +} + +.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3 { + font-size: 1rem; +} + +.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3 { + font-size: 1rem; + position: relative; +} + +.mec-occurrences-wrapper + ul.mec-occurrences-list + li.mec_occurrences_item + h3 + span.mec-occurrences-delete-button { + position: absolute; + right: 10px; + top: 0; + margin: 0; + padding: 6px 8px !important; + font-size: 11px; + line-height: 12px !important; + min-height: 10px; + height: auto; + display: block; + cursor: pointer; + color: #ea6485; + border: 2px solid #ffd2dd; + border-radius: 3px; + letter-spacing: 0.4px; +} + +.mec-occurrences-wrapper + ul.mec-occurrences-list + li.mec_occurrences_item + h3 + span.mec-occurrences-delete-button:hover { + background: #ea6485; + color: #fff; + border-color: #ea6485; + box-shadow: 0 2px 6px -3px #ea6485; +} + +ul#mec_bfixed_form_fields li .mec_bfixed_field_remove, +ul#mec_orgz_form_row li .mec-additional-organizer-remove, +ul#mec_reg_form_fields li .mec_reg_field_remove, +.mec-booking-tab-content .mec-reg-field-add-option, +.mec-booking-tab-content .mec-bfixed-field-add-option, +.mec-booking-tab-content .button, +.mec-fes-form .mec-form-row .button:not(.wp-color-result), +.mec-fes-form input[type="file"], +#mec_occurrences_add { + height: 40px; + margin-top: 1px; + text-decoration: none; + font-size: 14px; + line-height: 34px !important; + margin: 0; + padding: 0 15px 1px !important; + text-transform: none; + letter-spacing: 0; + font-weight: 600; + color: #40d9f1; + background: #fff; + border-radius: 3px; + margin-right: 8px; + border: 2px solid #cfeff5; + box-shadow: 0 2px 6px -3px #cfeff5; +} + +.mec-fes-form .mec-additional-organizers .select2-container { + margin-bottom: 0; +} + +.mec-booking-tab-content .mec-bfixed-field-add-option:hover, +.mec-booking-tab-content .mec-reg-field-add-option:hover, +.mec-booking-tab-content .button:hover, +.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover { + background: #40d9f1; + color: #fff; + border-color: #40d9f1; + box-shadow: 0 2px 6px -3px #40d9f1; +} + +.mec-fes-form .mec-form-row input + button.button { + vertical-align: top; +} + +.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small { + border-width: 1px; + padding: 0 7px; + color: #80c6d2; + font-weight: 400; + margin: 1px; + transform: none; +} + +.mec-fes-form input[type="file"] { + max-width: 166px; + text-align: center; + height: 44px; + transition: all 0.2s ease; + border-radius: 5px !important; + border: 2px dashed #b8e9f3; +} + +.mec-fes-form input[type="file"]:hover { + box-shadow: 0 2px 16px -3px #cfeff5; +} + +.mec-fes-form input[type="file"]::-webkit-file-upload-button { + visibility: hidden; + width: 1px; + height: 38px; +} + +.mec-fes-form input[type="file"]::-moz-file-upload-button { + visibility: hidden; + width: 1px; + height: 38px; +} + +.mec-fes-form .mec-meta-box-fields > label { + padding: 0; +} + +#mec_bfixed_form_fields li, +#mec_orgz_form_row li, +#mec_reg_form_fields li { + list-style: none; +} + +ul#mec_bfixed_form_fields, +ul#mec_orgz_form_row, +ul#mec_reg_form_fields { + padding: 0; + margin: 0; +} + +ul#mec_bfixed_form_fields li, +ul#mec_orgz_form_row li, +ul#mec_reg_form_fields li { + background: #f8feff; + margin: 6px -20px; + padding: 15px 25px 10px; + width: auto; + font-size: 13px; + border-top: 1px solid #e8fafd; + border-bottom: 1px solid #e8fafd; + position: relative; +} + +ul#mec_bfixed_form_fields li .mec_bfixed_field_remove, +ul#mec_orgz_form_row li .mec-additional-organizer-remove, +ul#mec_reg_form_fields li .mec_reg_field_remove { + position: absolute; + right: 10px; + top: 10px; + margin: 0; + padding: 6px 8px !important; + font-size: 11px; + line-height: 12px !important; + min-height: 10px; + height: auto; + display: block; + cursor: pointer; + color: #ea6485; + border-color: #ffd2dd; + letter-spacing: 0.4px; +} + +ul#mec_bfixed_form_fields li .mec_bfixed_field_remove:hover, +ul#mec_orgz_form_row li .mec-additional-organizer-remove:hover, +ul#mec_reg_form_fields li .mec_reg_field_remove:hover { + background: #ea6485; + color: #fff; + border-color: #ea6485; + box-shadow: 0 2px 6px -3px #ea6485; +} + +/* from backend */ +#mec_bfixed_form_fields input[type="checkbox"], +#mec_bfixed_form_fields input[type="radio"], +#mec_reg_form_fields input[type="checkbox"], +#mec_reg_form_fields input[type="radio"], +.mec-form-row input[type="checkbox"], +.mec-form-row input[type="radio"] { + background-color: #fff; + border: 1px solid #cfeff5; + box-shadow: 0 1px 3px -1px #cfeff5; + padding: 9px; + border-radius: 3px; + min-width: 24px; + min-height: 24px; + display: inline-block !important; + vertical-align: middle; + float: none; + transition: all 0.18s ease; + outline: none; + margin: 1px 4px 4px 0; + text-align: left; + cursor: pointer; + -webkit-appearance: none; + -moz-appearance: none; +} + +#mec_bfixed_form_fields input[type="checkbox"]:focus, +#mec_bfixed_form_fields input[type="radio"]:focus, +#mec_reg_form_fields input[type="checkbox"]:focus, +#mec_reg_form_fields input[type="radio"]:focus, +.mec-form-row input[type="checkbox"]:focus, +.mec-form-row input[type="radio"]:focus { + outline: none; +} + +#mec_bfixed_form_fields input[type="radio"], +#mec_reg_form_fields input[type="radio"], +.mec-form-row input[type="radio"] { + -webkit-appearance: none; + border-radius: 20px !important; + min-width: 20px; + min-height: 20px; + margin: 0 0 4px 0; + vertical-align: middle; +} + +#mec_bfixed_form_fields input[type="checkbox"]:hover, +#mec_bfixed_form_fields input[type="radio"]:hover, +#mec_reg_form_fields input[type="checkbox"]:hover, +#mec_reg_form_fields input[type="radio"]:hover, +.mec-form-row input[type="checkbox"]:hover, +.mec-form-row input[type="radio"]:hover { + border-color: #40d9f1; +} + +#mec_bfixed_form_fields input[type="checkbox"]:checked, +#mec_bfixed_form_fields input[type="radio"]:checked, +#mec_reg_form_fields input[type="checkbox"]:checked, +#mec_reg_form_fields input[type="radio"]:checked, +.mec-fes-form .mec-form-row input[type="checkbox"]:checked, +.mec-fes-form .mec-form-row input[type="radio"]:checked { + box-shadow: 0 1px 6px -2px #40d9f1; + border-color: #40d9f1; + background: #40d9f1; + border-radius: 2px; + position: relative; +} + +.mec-form-row input[type="radio"]:checked { + box-shadow: 0 1px 6px -2px #40d9f1, inset 0 0 0 3px #fff !important; +} + +#mec_bfixed_form_fields input[type="checkbox"]:checked::before, +#mec_reg_form_fields input[type="checkbox"]:checked::before, +.mec-form-row input[type="checkbox"]:checked:before { + content: ""; + font: normal; + position: absolute; + top: 12px; + left: 5px; + margin: 0; + vertical-align: middle; + line-height: 1; + border-right: 2px solid #fff !important; + border-bottom: 2px solid #fff !important; + transform: rotate(45deg); + transform-origin: 0% 100%; + color: #fff; + transition: all 0.2s ease; + animation: checkbox-check 130ms 140ms cubic-bezier(0.4, 0, 0.23, 1) forwards; +} + +@keyframes checkbox-check { + 0% { + width: 0; + height: 0; + border-color: #fff; + transform: translate3d(0, 0, 0) rotate(45deg); + } + + 33% { + width: 6px; + height: 0; + transform: translate3d(0, 0, 0) rotate(45deg); + } + + 100% { + width: 6px; + height: 12px; + border-color: #fff; + transform: translate3d(0, -12px, 0) rotate(45deg); + } +} + +/* Deep Theme and BuddyPress style on MEC Event Data */ +#wrap #mec-event-data input[type="radio"] { + position: relative; +} + +#wrap #mec-event-data input[type="radio"]:empty::before { + display: none; +} + +#mec_bfixed_form_field_types .button, +#mec_reg_form_field_types .button { + position: relative; + outline: 0; + border-radius: 50px; + padding: 2px 21px 2px 31px !important; + line-height: 1; + font-size: 11px; + font-weight: 600; + color: #40d9f1; + letter-spacing: 2px; + height: auto; + cursor: pointer; + margin-top: 5px; + text-transform: uppercase; + box-shadow: 0 2px 6px -3px #40d9f1; + border: 2px solid #cfeff5; +} + +#mec_meta_box_tickets_form [id^="mec_ticket_row"] button, +#mec_fes_organizer_remove_image_button, +#mec_fes_location_remove_image_button, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-form-row.mec-box + .button, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-col-1 + .button, +#mec_reg_form_field_types .button.red { + color: #ea6485; + box-shadow: 0 2px 6px -3px #ea6485; + background: #fff; + border-color: #ffd2dd; +} + +#mec_meta_box_tickets_form [id^="mec_ticket_row"] button:hover, +#mec_fes_organizer_remove_image_button:hover, +#mec_fes_location_remove_image_button:hover, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-form-row.mec-box + .button:hover, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-col-1 + .button:hover, +#mec_reg_form_field_types .button.red:hover { + background: #ea6485; + color: #fff; +} + +#mec_bfixed_form_field_types .button:before, +#mec_reg_form_field_types .button:before { + position: absolute; + left: 12px; + color: #40d9f1; + content: "\e095"; + font-family: simple-line-icons; + font-size: 13px; + display: inline-block; +} + +#mec_reg_form_field_types .button.red:before { + color: #ea6485; +} + +#mec_reg_form_field_types .button.red:hover:before, +#mec_bfixed_form_field_types .button:hover:before, +#mec_reg_form_field_types .button:hover:before { + color: #fff; +} + +#mec_meta_box_tickets_form [id^="mec_ticket_row"] button:hover, +#mec_fes_organizer_remove_image_button:hover, +#mec_fes_location_remove_image_button:hover, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-form-row.mec-box + .button:hover, +#mec_meta_box_hourly_schedule_days + [id^="mec_meta_box_hourly_schedule_day_"] + .mec-col-1 + .button:hover, +#mec_price_per_dates_container .button:hover, +#mec_reg_form_field_types .button.red:hover { + color: #fff; + border: 2px solid #ea6485; +} + +#mec_ticket_variations_list [id^="mec_remove_ticket_variation_button"], +#mec_taxes_fees_container_toggle [id^="mec_remove_fee_button"] { + color: #ea6485; + border-color: #ffd2dd; +} + +#mec_ticket_variations_list [id^="mec_remove_ticket_variation_button"]:hover, +#mec_taxes_fees_container_toggle [id^="mec_remove_fee_button"]:hover { + color: #fff; + border: 2px solid #ea6485; + background: #ea6485; +} + +#mec_fees_list [id^="mec_remove_fee_button"], +#mec_meta_box_ticket_variations_form + .mec-form-row + [id^="mec_remove_ticket_variation_button"] { + margin-left: 14px !important; +} + +#mec_meta_box_hourly_schedule_days .mec-add-hourly-schedule-button { + line-height: 10px !important; +} + +#mec_meta_box_tickets_form [id^="mec_ticket_row"] .mec_add_price_date_button { + color: #40d9f1; + box-shadow: 0 2px 6px -3px #40d9f1; + border: 2px solid #cfeff5; +} + +#mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button:hover, +#mec_reg_form_field_types .button:hover { + color: #fff; + border: 2px solid #40d9f1; + background: #40d9f1; +} + +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_sort, +.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort, +.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_sort { + font-size: 0; + color: #fff; + padding-left: 20px; +} + +.mec-fes-form #mec_reg_form_fields .mec_reg_field_options, +.mec-fes-form #mec_bfixed_form_fields .mec_bfixed_field_option_sort, +.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort, +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort { + font-size: 0; +} + +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort:before, +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_options:before, +.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort:before, +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_sort:before, +.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before, +.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_sort:before { + position: absolute; + left: px; + top: 12px; + width: 80px; + height: 20px; + display: block; + cursor: move; + font-family: simple-line-icons; + content: "\e023"; + font-size: 18px; + color: #888; +} + +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort:before, +.mec-fes-form #mec_reg_form_fields span.mec_reg_field_options:before, +.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before { + font-size: 13px; + left: 2px; + top: 26px; + width: 14px; + height: 14px; +} + +.mec-fes-form #mec_reg_form_fields .mec_reg_field_options, +.mec-fes-form #mec_bfixed_form_fields .mec_bfixed_field_options { + margin-top: 20px; +} + +.mec-fes-form + #mec_fes_form + #mec_bfixed_form_fields + .mec_bfixed_notification_placeholder { + font-size: 0; +} + +.mec-form-row select + span.mec-tooltip, +.mec-form-row input + span.mec-tooltip { + bottom: 10px; +} + +.mec-form-row label + span.mec-tooltip { + bottom: 8px; +} + +.mec-form-row textarea + span.mec-tooltip { + bottom: auto; + vertical-align: top; + top: 12px; +} + +.mec-form-row span + span.mec-tooltip { + bottom: 0; + vertical-align: middle; +} + +.mec-form-row .mec-col-8 span.mec-archive-skins, +.mec-form-row .mec-col-8 select, +.mec-form-row .mec-col-8 input[type="text"] { + vertical-align: top; +} + +.mec-form-row input:disabled { + opacity: 0.6; + background: #f6f6f6; +} + +.mec-form-row p { + font-size: 12px !important; + line-height: 18px !important; + color: #97b2bb !important; +} + +.mec-form-row p.description { + font-style: italic; +} + +.ui-datepicker.ui-widget { + border: 1px solid #e8e8e8; + box-shadow: 0 1px 9px rgba(0, 0, 0, 0.12); +} + +table.ui-datepicker-calendar { + margin-bottom: 0; +} + +.ui-datepicker-calendar th { + font-weight: 700; + color: #4a4b4c; +} + +.ui-datepicker-calendar tr, +.ui-datepicker-calendar td, +.ui-datepicker-calendar th { + border: none; +} + +.ui-datepicker.ui-widget select { + font-weight: 600; + font-size: 12px; + display: inline-block; + border-radius: 2px; + padding: 2px 10px; + margin: 5px 3px; + width: auto; + min-height: 20px; + height: 26px; + border: 1px solid #e3e3e3; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.ui-datepicker.ui-widget table { + border-spacing: 2px; + border: none; +} + +.ui-datepicker.ui-widget td, +.ui-datepicker.ui-widget tr { + padding: 0; + background: none !important; +} + +.ui-datepicker.ui-widget td a { + color: #9a9b9c; + font-weight: 600; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; + border-radius: 33px; + padding: 0; + background: #fff; + transition: all 0.2s ease; +} + +.ui-datepicker.ui-widget td a:hover, +.ui-datepicker.ui-widget td a.ui-state-active { + background: #40d9f1; + color: #fff; +} + +.ui-datepicker.ui-widget .ui-datepicker-next, +.ui-datepicker.ui-widget .ui-datepicker-prev { + color: #40d9f1; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; + text-align: center; + border-radius: 33px; + background: #ecfcff; + transition: all 0.2s ease; +} + +.ui-datepicker.ui-widget .ui-datepicker-next:hover, +.ui-datepicker.ui-widget .ui-datepicker-prev:hover { + background: #fff; + box-shadow: 0 0 7px -3px rgba(0, 0, 0, 0.4); +} + +.mec-fes-form .mec-tooltip .dashicons-before:before { + color: #40d9f1; +} + +.mec-fes-form button[type="submit"].mec-fes-sub-button { + border-radius: 3px; + background: #40d9f1; + color: #fff; + height: 54px; + font-size: 17px; + font-weight: 700; + box-shadow: 0 2px 8px -4px #40d9f1; + display: block; + transition: all 0.28s ease; + text-transform: uppercase; + margin: 20px 0 0; + padding: 14px 20px; + border: 0; + cursor: pointer; + text-align: center; + letter-spacing: 0.1em; + line-height: 1; +} + +.mec-fes-form button[type="submit"].mec-fes-sub-button:hover { + box-shadow: 0 2px 12px -2px #40d9f1; +} + +.mec-fes-form button[type="submit"].mec-fes-sub-button:focus { + margin-bottom: -2px; + background: #1dc2dc; +} + +.mec-fes-form .mec-title span.mec-dashicons { + color: #40d9f1; + float: left; + margin-right: 5px; +} + +.mec-fes-form .mec-tooltip .box h5 { + padding: 14px 2px; +} + +#mec_fes_form, +.mec-fes-form-top-actions { + max-width: 838px; + margin: 0 auto; +} + +@media only screen and (min-width: 961px) { + .mec-fes-form .mec-fes-form-cntt { + width: calc(100% - 300px); + float: left; + padding-right: 20px; + max-width: 538px; + display: block; + } + + .mec-fes-form .mec-fes-form-sdbr { + width: 300px; + } +} + +.mec-fes-form div.mce-toolbar-grp, +.mec-fes-form .quicktags-toolbar { + background: #ecfcff; + border-bottom: 1px solid #cfeff5; + box-shadow: 0 1px 0 1px #cfeff5; +} + +.mec-fes-form .quicktags-toolbar { + margin-right: -1px; + border-top: 1px solid #cfeff5; +} + +.mec-fes-form div.mce-statusbar { + border-top-color: #cfeff5; +} + +.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-listbox { + border: 1px solid #cfeff5; + border-radius: 3px; +} + +.mec-fes-form .mce-tinymce.mce-container.mce-panel { + border: 1px solid #cfeff5; + box-shadow: 0 2px 6px -3px #cfeff5; + border-radius: 2px 0 2px 2px; +} + +.mec-fes-form .wp-editor-tools .wp-media-buttons { + transform: translateY(-6px); + margin-top: -6px; +} + +.mec-fes-form .wp-editor-tabs { + padding-right: 0; + margin-right: -2px; +} + +.mec-fes-form .wp-editor-tabs .wp-switch-editor { + border-radius: 3px 3px 0 0; + border-color: #cfeff5; + background: #fff; + color: #96b8bd; + border-bottom: 1px solid #ecfcff; +} + +.mec-fes-form .wp-editor-tabs .wp-switch-editor:active, +.mec-fes-form .html-active .switch-html, +.mec-fes-form .tmce-active .switch-tmce { + background: #ecfcff; + color: #40d9f1; +} + +.mec-fes-form .wp-editor-container, +.mec-fes-form div.mce-edit-area.mce-panel { + border: none; + box-shadow: none; +} + +.mec-fes-form .wp-editor-container textarea.wp-editor-area { + max-width: 100%; +} + +.mec-fes-form .mce-toolbar .mce-listbox button { + font-size: 12px; + line-height: 22px; + color: #798f96; +} + +.mec-fes-form .mce-toolbar .mce-ico { + color: #627f88; +} + +.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-active, +.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn:active, +.mec-fes-form .qt-dfw.active { + background: #fff; + border-color: #40d9f1; + box-shadow: inset 0 2px 6px -3px rgba(106, 231, 255, 0.7); +} + +.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-active .mce-ico { + color: #40d9f1; +} + +body .mce-menu .mce-menu-item.mce-active.mce-menu-item-normal, +body.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview, +body .mce-menu .mce-menu-item.mce-selected, +body .mce-menu .mce-menu-item:focus, +body .mce-menu .mce-menu-item:hover { + background: #40d9f1; + color: #fff; +} + +.mec-fes-form .mec-not-in-days-day { + display: inline-block; + padding: 4px 32px 4px 15px; + border-radius: 33px; + border: 1px solid #cfeff5; + box-shadow: 0 1px 3px -1px #cfeff5; + background: #fbfeff; + color: #40d9f1; + vertical-align: top; +} + +.mec-fes-form .mec-not-in-days-remove { + display: inline-block; + padding: 0 1px 0 0; + margin-left: -30px; + vertical-align: sub; + background: #ff918a; + color: #fff; + font-family: cursive; + width: 21px; + height: 21px; + line-height: 17px; + text-align: center; + border-radius: 20px; + cursor: pointer; +} + +.mec-fes-list ul li .mec-event-status { + float: left; + margin-right: 10px; + margin-left: 0; + font-size: 11px; + font-weight: 400; + letter-spacing: 0.3px; + border-radius: 3px; + padding: 4px 8px; +} + +.mec-fes-list ul li .mec-event-status.mec-book-confirmed:before, +.mec-fes-form .post-status.mec-book-confirmed:before { + content: ""; + margin: 0; + vertical-align: middle; + line-height: 1; + border-right: 2px solid #fff !important; + border-bottom: 2px solid #fff !important; + transform: rotate(45deg); + color: #fff; + width: 6px; + height: 12px; + float: left; + margin-right: 6px; +} + +.mec-fes-list ul li .mec-fes-event-remove:before, +.mec-fes-list ul li .mec-fes-event-view a:before, +.mec-fes-list ul li .mec-fes-event-edit a:before, +.mec-fes-list-top-actions a:before, +.mec-fes-list ul li .mec-fes-event-export a:before { + content: "\e054"; + font-family: simple-line-icons; + font-size: 13px; + vertical-align: middle; +} + +.mec-fes-list ul li .mec-fes-event-view a:before { + content: "\e087"; +} + +.mec-fes-list ul li .mec-fes-event-edit a:before { + content: "\e060"; +} + +.mec-fes-list-top-actions a:before { + content: "\e095"; + font-weight: 400; + margin-right: 6px; +} + +.mec-fes-list ul li .mec-fes-event-export a:before { + content: "\e083"; +} + +.mec-fes-form .post-status { + border-radius: 20px; +} + +.mec-fes-form .post-status.mec-book-confirmed:before { + height: 20px; + width: 9px; + margin: 3px 10px; +} + +.ui-datepicker-calendar th, +.ui-datepicker .ui-datepicker-calendar td { + height: auto; + padding: 0; +} + +.ui-datepicker-calendar th, +.ui-datepicker .ui-datepicker-calendar td a { + font-size: 14px; + line-height: 30px; +} + +.ui-datepicker.ui-widget .ui-state-disabled .ui-state-default { + color: #ccc; + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; +} + +.mec-fes-form .description { + font-size: 16px; +} + +/* FireFox Checkbox */ +.mec-fes-form input[type="file"] { + text-align: left; +} + +/* FES Export */ +.mec-fes-export-wrapper { + width: 640px; + background: #f8feff; + padding: 40px 25px; +} + +.mec-fes-export-wrapper .mec-fes-btn-date { + font-size: 16px; + line-height: 44px; + overflow: hidden; +} + +.mec-fes-export-wrapper .date-messgae { + font-family: sans-serif; + padding: 2px 18px; +} + +.mec-fes-list ul li .mec-event-export-csv, +.mec-fes-list ul li .mec-event-export-excel { + font-size: 12px; + border: 1px solid #40d9f1; + padding: 1px 4px; + background: rgba(141, 229, 243, 0.18); + border-radius: 4px; + color: #40d9f1; + font-family: sans-serif; + cursor: pointer; + display: inline-block; + height: 26px; + line-height: 22px; +} + +.mec-export-badge { + font-size: 11px; + color: #40d9f1; + width: auto; + height: 24px; + line-height: 25px; + display: inline-block; + padding: 0 8px; + text-align: center; + border-radius: 3px; + background: #ecfcff; + transition: all 0.2s ease; +} + +.mec-fes-list ul li .mec-fes-event-export { + font-size: 11px; + background: #f7f7f7; + float: right; + margin-left: 5px; +} + +.mec-fes-list ul li .mec-fes-event-export:hover { + cursor: pointer; + background: rgb(144, 240, 224); + border-color: rgb(77, 200, 204); +} + +.mec-fes-export-wrapper ul { + padding: 0; + width: 100%; + text-align: center; +} + +.mec-fes-export-wrapper ul li { + list-style: none; + display: inline-block; + width: 30%; + padding: 10px 15px 10px 32px; + border-radius: 3px; + margin-bottom: 15px; + border: 1px solid #cfeff5; + box-shadow: 0 2px 6px -4px #cfeff5; + background: #fff; + line-height: normal; + margin-right: 10px; + position: relative; + cursor: pointer; + font-size: 13px; + line-height: 1; + transition: all 0.2s ease; +} + +.mec-fes-export-wrapper ul li:nth-child(3n + 0) { + margin-right: 0; +} + +.mec-fes-export-wrapper ul li:hover { + box-shadow: 0 2px 16px -1px #c6e8ef; +} + +.mec-fes-export-wrapper ul li:before { + content: ""; + position: absolute; + display: inline-block; + background: #fff; + width: 15px; + height: 15px; + margin: -1px 0 0 5px; + cursor: pointer; + border: 2px solid #e1e7ed; + box-shadow: 0 2px 15px -3px rgba(69, 77, 89, 0.32); + border-radius: 50%; + left: 9px; + top: calc(50% - 7px); +} + +.mec-fes-export-wrapper ul li.fes-export-date-active { + color: #40d9f1; +} + +.mec-fes-export-wrapper ul li.fes-export-date-active:before { + width: 15px; + height: 15px; + border: 6px solid #40d9f1; + background: #fff; + box-shadow: 0 3px 16px -3px #40d9f1; +} + +.mec-fes-btn-export { + margin-left: 15px; + margin-top: 12px; +} + +.mec-fes-btn-export span { + position: relative; + border: none; + border-radius: 3px; + color: #fff !important; + display: inline-block; + font-size: 13px; + line-height: 1; + text-transform: none; + font-weight: 400; + text-decoration: none; + cursor: pointer; + margin-right: 4px; + line-height: 1; + letter-spacing: 0; + padding: 15px 22px; + background: #39c36e; + box-shadow: 0 1px 7px -3px #39c36e !important; + -webkit-transition: all 0.21s ease; + -moz-transition: all 0.21s ease; + transition: all 0.21s ease; + cursor: pointer; + margin-left: 6px; +} + +.mec-fes-btn-export span:hover { + background: #222; +} + +span.mec-event-export-csv:before, +.mec-event-export-excel:before { + content: "\e083"; + font-family: simple-line-icons; + font-size: 13px; + vertical-align: middle; + margin-right: 7px; + margin-top: -1px; + display: inline-block; +} + +.mec-fes-list .wn-p-t-right { + min-width: 170px; + max-width: 200px; + display: inline-block; + top: -8px; + left: 50%; + margin-top: 0; + transform: translate(-50%, -100%); + padding: 0; + background-color: #000; + color: #fff; + font-weight: 400; + font-size: 14px; + letter-spacing: 0.5px; + line-height: 1.5; + position: absolute; + z-index: 99999999; + box-sizing: border-box; + border-radius: 6px; + box-shadow: 0 4px 45px -8px #535a61; + visibility: hidden; + opacity: 0; + transition: opacity 0.23s; + padding: 5px 10px 6px; + border-radius: 8px; + text-align: center; + font-style: normal; +} + +.mec-fes-list .mec-fes-event-export:hover .wn-p-t-right, +.mec-fes-list .mec-fes-event-view:hover .wn-p-t-right, +.mec-fes-list .mec-fes-event-remove:hover .wn-p-t-right, +.mec-fes-list .mec-fes-event-edit:hover .wn-p-t-right { + visibility: visible; + opacity: 1; +} + +.mec-fes-list .wn-p-t-right i { + position: absolute !important; + top: 100%; + right: 50%; + margin-top: -6px !important; + margin-right: -6px !important; + width: 12px; + height: 24px; + overflow: hidden; + transform: rotate(-90deg); +} + +.mec-fes-list .wn-p-t-right i:after { + content: ""; + position: absolute; + width: 12px; + height: 12px; + left: 0; + top: 50%; + transform: translate(50%, -50%) rotate(-45deg); + background-color: #000; + box-shadow: 0 8px 9px -4px #535a61; +} + +/* Select 2 Styles */ +.mec-fes-form .select2-container { + min-height: 38px; + box-sizing: border-box; + margin-bottom: 8px; + padding: 0 6px; + border-radius: 2px; + border: 1px solid #ddd; + box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.07); + background-color: #fff; + color: #32373c; + outline: none; + transition: 0.05s border-color ease-in-out; + min-width: 200px; + font-size: 14px; +} + +.mec-fes-form .select2-selection { + border: none; + background: transparent; + padding-top: 2px; + width: 100%; + height: 100%; +} + +.mec-fes-form + .select2-container--default.select2-container--focus + .select2-selection { + border: none !important; + outline: 0; +} + +.mec-fes-form + .select2-container--default + .select2-selection--single + .select2-selection__arrow { + top: 5px; + right: 4px; +} + +.select2-results { + font-size: 14px; +} + +/* FES SubCategories */ +.mec-fes-category-children .mec-fes-category-children, +.mec-fes-category-children { + padding-left: 24px; +} + +/* Timeline view */ +.mec-timeline-events-container { + margin-left: 19px; + padding-top: 20px; + padding-bottom: 9px; +} + +.mec-events-timeline-wrap { + position: relative; + display: block; + overflow: visible; + padding-left: 95px; +} + +.mec-events-timeline-wrap:before { + width: 1px; + content: ""; + height: 100%; + position: absolute; + background: #b8f5ff; + left: 95px; +} + +.mec-timeline-month-divider + .mec-timeline-events-container { + padding-top: 110px; +} + +.mec-timeline-right-content { + float: right; + width: 300px; +} + +.mec-timeline-left-content { + float: left; + width: calc(100% - 300px); + padding-left: 15px; + padding-right: 15px; + position: relative; +} + +.mec-timeline-month-divider { + position: absolute; + display: block; + background: #fff; + right: calc(100% - 95px); + left: 0; + width: 190px; + text-align: center; + border: 1px solid #b8f5ff; + border-radius: 50px; + font-size: 15px; + padding: 12px 27px; + color: #40d9f1; +} + +.mec-timeline-event-date { + position: relative; +} + +.mec-timeline-events-container .mec-timeline-event-date:before { + content: ""; + width: 11px; + height: 11px; + position: absolute; + background: #40d9f1; + border-radius: 50px; + top: 8px; + left: -24px; + z-index: 9; +} + +.mec-timeline-events-container .mec-timeline-event-date:after { + content: ""; + width: 21px; + height: 21px; + position: absolute; + background: rgba(64, 217, 241, 0.3); + border-radius: 50px; + top: 3px; + left: -29px; +} + +.mec-timeline-event-date { + float: left; + width: 17%; + margin-top: 27px; +} + +.mec-timeline-event-content { + float: left; + width: 82%; + background: #fff; + box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.1); + border-radius: 10px; + overflow: visible; + position: relative; +} + +.mec-timeline-main-content { + padding: 23px 30px; +} + +.mec-timeline-main-content h4 { + margin-bottom: 15px; +} + +.mec-timeline-main-content h4 a { + font-size: 25px; + font-weight: bold; + color: #000; + line-height: 33px; + text-decoration: none; +} + +.mec-timeline-main-content p { + font-size: 15px; + color: #515151; + line-height: 24px; + margin-bottom: 36px; +} + +a.mec-timeline-readmore { + width: 100%; + display: block; + text-align: center; + color: #fff; + text-decoration: none; + line-height: 52px; + font-size: 17px; + font-weight: bold; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + border-radius: 0 0 10px 10px; +} + +a.mec-timeline-readmore:hover { + background: #222; + color: #fff; +} + +.mec-timeline-event-time .mec-time-details, +.mec-timeline-event-location address span, +.mec-timeline-event-organizer .mec-organizer-item span, +.mec-timeline-event-categories ul.mec-categories li.mec-category a { + display: inline-block; + font-size: 13px; + font-weight: 500; + color: inherit; +} + +.mec-timeline-event-organizer .mec-shortcode-organizers, +.mec-timeline-event-categories .mec-categories-wrapper { + line-height: unset; +} + +.mec-timeline-event-location, +.mec-timeline-event-time, +.mec-timeline-event-local-time, +.mec-timeline-event-organizer, +.mec-timeline-event-categories { + background: rgba(64, 217, 241, 0.11); + display: inline-block; + padding: 0 20px; + border-radius: 50px; + line-height: 32px; + vertical-align: middle; +} + +.mec-timeline-event-time i, +.mec-timeline-event-organizer i, +.mec-timeline-event-categories i, +.mec-timeline-event-location i { + font-size: 16px; + margin-right: 6px; + position: relative; + top: 2px; +} + +.mec-timeline-event-location address { + font-style: normal; + margin-bottom: 0; +} + +.mec-timeline-event-details + .mec-timeline-event-details { + margin-top: 12px; +} + +.mec-timeline-event-content .col-md-4 { + padding: 0; +} + +.mec-timeline-event-content:after { + content: ""; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px; +} + +.mec-timeline-event-content:after { + top: 30px; + border-color: transparent #ffffff transparent transparent; + left: -10px; +} + +.mec-timeline-event-image img { + border-radius: 0 10px 0 0; + width: 100%; +} + +.mec-timeline-event-image a { + display: block; + line-height: 0; +} + +a.mec-timeline-readmore i { + vertical-align: middle; + margin-left: 10px; + font-size: 9px; +} + +.mec-wrap .mec-timeline-event-content a.mec-timeline-readmore:hover { + background: #444; +} + +@media (min-width: 1024px) { + .mec-timeline-event { + margin: 50px 0; + } +} + +@media (max-width: 1023px) { + .mec-timeline-event { + margin: 25px 0; + } + + .mec-events-timeline-wrap { + padding-left: 20px; + } + + .mec-events-timeline-wrap:before { + left: 20px; + } +} + +@media (max-width: 1200px) and (min-width: 992px) { + .mec-timeline-event-content { + width: 81%; + } + + .mec-timeline-event-date { + width: 18%; + } +} + +@media (max-width: 992px) { + .mec-timeline-right-content, + .mec-timeline-left-content { + float: none; + width: 100%; + text-align: center; + } + + .mec-timeline-right-content .mec-timeline-event-image { + text-align: center; + } + + .mec-timeline-right-content .mec-timeline-event-image img { + max-width: 300px; + border-radius: 10px; + margin-top: 35px; + } +} + +@media (max-width: 440px) { + .mec-timeline-right-content .mec-timeline-event-image img { + margin-top: 0; + } +} + +@media (max-width: 320px) { + .mec-timeline-event-date, + .mec-timeline-event-content { + float: none; + width: 100%; + } + + .mec-timeline-event-date { + margin-bottom: 8px; + } + + .mec-timeline-event-content:after { + display: none; + } + + .mec-timeline-main-content { + padding: 23px 0; + } + + .mec-timeline-main-content p { + font-size: 13px; + } + + .mec-timeline-main-content h4 a { + font-size: 23px; + line-height: 24px; + } + + .mec-time-details span { + font-size: 11px; + } + + .mec-timeline-event-location address span { + font-size: 12px; + } + + a.mec-timeline-readmore { + line-height: 44px; + font-size: 14px; + } +} + +.mec-timeline-event-image img { + margin-bottom: -7px; + border-radius: 0 10px 10px 0; +} + +.mec-timeline-event-image a img { + margin-bottom: 0; + border-radius: 0 10px 0 0; +} + +/* Tile View */ +.mec-event-tile-view article.mec-tile-item { + height: 400px; + margin: 15px 0; + border-radius: 22px; + padding: 35px 25px; + position: relative; + color: #fff; + background-size: cover !important; + background-position: center !important; + box-shadow: 0 2px 9px rgba(0, 0, 0, 0.25); + transition: all 0.22s ease; +} + +.mec-event-tile-view article.mec-tile-item:hover { + cursor: pointer; + box-shadow: 0 4px 19px rgba(0, 0, 0, 0.5); +} + +.mec-event-tile-view article.mec-tile-item div { + position: relative; + z-index: 3; + line-height: 1.5; +} + +.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper { + color: #fff; +} + +.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper i { + font-size: 16px; +} + +.mec-event-tile-view + article.mec-tile-item + .mec-categories-wrapper + ul.mec-categories + li.mec-category + a, +.mec-event-tile-view article.mec-tile-item .mec-shortcode-organizers { + color: #fff; + font-size: 15px; +} + +.mec-event-tile-view article.mec-tile-item .mec-shortcode-organizers, +.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper, +.mec-event-tile-view article.mec-tile-item .mec-event-loc-place { + margin-bottom: 5px; +} + +.mec-event-tile-view article.mec-tile-item:before, +.mec-event-tile-view article.mec-tile-item:after { + position: absolute; + background: -moz-linear-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + background: -webkit-gradient( + left top, + right top, + color-stop(0%, rgba(0, 0, 0, 0.35)), + color-stop(65%, rgba(0, 0, 0, 0.48)), + color-stop(100%, rgba(0, 0, 0, 0.72)) + ); + background: -webkit-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + background: linear-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + content: ""; + left: 0; + right: 0; + bottom: 0; + top: 0; + width: 100%; + height: 100%; + display: block; + border-radius: 22px; + z-index: 1; +} + +.mec-event-tile-view article.mec-tile-item:after { + background-color: inherit; + background-image: none; + top: 35px; + bottom: auto; + height: 40px; + border-radius: 0 3px 3px 0; + width: 110px; + z-index: 2; + box-shadow: 2px 1px 7px rgba(0, 0, 0, 0.1); +} + +.mec-event-tile-view article.mec-tile-item .event-tile-view-head { + padding: 8px 3px; + font-size: 16px; + font-weight: 700; + margin-bottom: 50px; + text-transform: uppercase; +} + +.mec-event-tile-view article.mec-tile-item .event-tile-view-head > div { + display: inline; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-time { + color: #d6d6d6; + font-size: 15px; + font-weight: 400; + line-height: 1; + padding-top: 4px; + position: absolute; + right: 1px; + top: 10px; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-time i { + vertical-align: baseline; + font-size: 14px; + float: left; +} + +.mec-event-tile-view article.mec-tile-item i { + margin-right: 5px; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-title { + color: #fff; + font-weight: 700; + font-size: 23px; + padding-top: 12px; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-title a { + color: #fff; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-title a:hover { + text-decoration: underline; +} + +.mec-event-tile-view article.mec-tile-item .mec-event-content { + position: absolute; + height: 100%; + bottom: 0; + left: 0; + right: 0; +} + +.mec-event-tile-view article.mec-tile-item .mec-tile-into-content-link { + position: absolute; + content: ""; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: transparent; +} + +.mec-tile-event-content { + position: absolute !important; + bottom: 25px; + left: 25px; + right: 25px; +} + +.mec-event-tile-view article.mec-label-canceled:before, +.mec-event-tile-view article.mec-label-featured:before { + /* top: 17px !important; + left: 110px !important; */ + height: auto; +} + +.mec-skin-tile-month-navigator-container { + position: relative; + text-align: center; + font-size: 12px; + height: 80px; + background: #f7f7f7; + padding: 28px; + border-radius: 11px; + margin-bottom: 20px; +} + +.mec-skin-tile-month-navigator-container:before, +.mec-skin-tile-month-navigator-container:after { + content: ""; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px; +} + +.mec-skin-tile-month-navigator-container:after { + bottom: -20px; + border-color: #f7f7f7 transparent transparent transparent; +} + +.mec-skin-tile-month-navigator-container:before { + bottom: -21px; + border-color: #ffffff transparent transparent transparent; +} + +@media only screen and (max-width: 480px) { + .mec-skin-tile-month-navigator-container { + height: 110px; + padding-top: 68px; + } +} + +.mec-skin-tile-month-navigator-container h2 { + font-size: 23px; + font-weight: 700; +} + +.mec-skin-tile-month-navigator-container .mec-previous-month, +.mec-skin-tile-month-navigator-container .mec-next-month { + position: absolute; + top: 28px; + left: 20px; + cursor: pointer; + padding: 3px 12px; + line-height: 23px; + background: #fff; + border-radius: 32px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02); + transition: all 0.22s ease; +} + +.mec-skin-tile-month-navigator-container .mec-next-month { + left: auto; + right: 20px; +} + +.mec-skin-tile-month-navigator-container .mec-previous-month:hover, +.mec-skin-tile-month-navigator-container .mec-next-month:hover { + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + color: #000; +} + +.mec-wrap .mec-event-tile-view article.mec-label-canceled:before, +.mec-wrap .mec-event-tile-view article.mec-label-featured:before { + position: absolute; + bottom: auto; + text-align: center; + right: auto; + font-size: 10px; +} + +/* Tile View Overlay */ +.mec-event-tile-view article.mec-tile-item .mec-tile-overlay { + position: absolute; + background: -moz-linear-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + background: -webkit-gradient( + left top, + right top, + color-stop(0, rgba(0, 0, 0, 0.35)), + color-stop(65%, rgba(0, 0, 0, 0.48)), + color-stop(100%, rgba(0, 0, 0, 0.72)) + ); + background: -webkit-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + background: linear-gradient( + 180deg, + rgba(0, 0, 0, 0.35) 0, + rgba(0, 0, 0, 0.48) 65%, + rgba(0, 0, 0, 0.72) 100% + ); + content: ""; + left: 0; + right: 0; + bottom: 0; + top: 0; + width: 100%; + height: 100%; + display: block; + border-radius: 22px; + z-index: 1; +} + +.mec-wrap .mec-event-tile-view .col-md-3 article.mec-label-canceled:before, +.mec-wrap .mec-event-tile-view .col-md-3 article.mec-label-featured:before { + top: 12px; + left: 103px; + z-index: 9; +} + +.mec-wrap .mec-event-tile-view .col-md-4 article.mec-label-canceled:before, +.mec-wrap .mec-event-tile-view .col-md-4 article.mec-label-featured:before { + top: 18px; + left: 125px; +} + +.mec-wrap .mec-event-tile-view .col-md-6 article.mec-label-canceled:before, +.mec-wrap .mec-event-tile-view .col-md-6 article.mec-label-featured:before { + top: 20px; + left: 200px; +} + +@media (max-width: 960px) { + .mec-wrap .mec-event-tile-view .col-sm-3 { + width: 50%; + } +} + +@media (max-width: 480px) { + .mec-wrap .mec-event-tile-view .col-sm-3 { + width: 100%; + } +} + +.mec-event-tile-view article.mec-tile-item.tile-multipleday-event:after { + width: 185px; +} + +.mec-event-tile-view + article.mec-tile-item.tile-multipleday-event + .mec-event-time { + right: auto; + top: 50px; + left: 0; +} + +/* Tile View Responsive */ +.mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before { + top: 100px; + left: 140px; +} + +.mec-event-tile-view .col-md-4.col-sm-4 article.mec-label-canceled:before { + top: 20px; + left: 140px; +} + +@media (min-width: 761px) and (max-width: 1200px) { + .mec-event-tile-view .col-md-3.col-sm-3 { + width: 50%; + } + + .mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before { + top: 80px; + left: 90px; + } + + .mec-event-tile-view .col-md-4.col-sm-4 article.mec-label-canceled:before { + top: 40px; + left: 70px; + } + + .mec-event-tile-view .col-md-3.col-sm-3 article.mec-label-canceled:before { + top: 90px; + left: 110px; + } +} + +@media (min-width: 761px) and (max-width: 1024px) { + .mec-event-tile-view .col-md-4.col-sm-4 { + width: 50%; + } + + .mec-event-tile-view .col-md-4.col-sm-4:nth-child(1n + 3) { + width: 100%; + } +} + +@media (max-width: 760px) { + .mec-event-tile-view .col-md-3.col-sm-3 { + width: 100%; + } + + .mec-event-tile-view .col-md-4.col-sm-4 { + width: 100%; + } +} + +@media (max-width: 480px) { + .mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before { + top: 100px; + left: 80px; + } +} + +/* Date style for calendar view */ +.mec-calendar .mec-event-article .mec-event-date { + font-size: 12px; + text-align: left; +} + +.mec-event-detailed-time { + display: flex; +} + +.mec-event-detailed-time i { + width: 15px; + padding-top: 7px; +} + +/* Normal Label - Default Style for All Skins */ +.mec-ongoing-normal-label { + background-color: #40d9f1; +} + +.mec-expired-normal-label { + background-color: #000; +} + +.mec-wrap .mec-labels-normal .mec-label-normal, +.mec-wrap .mec-cancellation-reason span { + position: relative; + font-size: 11px; + font-weight: 300; + margin-left: 10px; + line-height: 1.9; + letter-spacing: 1px; + color: #fff; + padding: 2px 7px; + border-radius: 2px; + white-space: nowrap; +} + +.mec-wrap .mec-cancellation-reason span, +.mec-wrap .mec-labels-normal .mec-label-normal { + white-space: normal; + display: inline-block; + line-height: 14px; +} + +.mec-remaining-time-normal-label { + background-color: var(--mec-color-skin); +} + +.mec-timetable-event .mec-labels-normal .mec-label-normal, +.tooltipster-box .mec-labels-normal .mec-label-normal, +.mec-agenda-event-title .mec-labels-normal .mec-label-normal { + font-size: 9px; + letter-spacing: 0.5px; + text-transform: uppercase; + padding: 2px 7px; + color: #fff; + position: relative; + margin-left: 5px; + border-radius: 2px; + top: 0; +} + +.mec-tile-item .mec-labels-normal .mec-label-normal, +.mec-timeline-event .mec-labels-normal .mec-label-normal, +.mec-owl-carousel:not(.mec-slider-t1) .mec-labels-normal .mec-label-normal, +.mec-av-spot .mec-labels-normal .mec-label-normal, +.mec-event-countdown-part1 .mec-labels-normal .mec-label-normal, +.mec-event-countdown-part2 .mec-labels-normal .mec-label-normal, +.mec-event-cover-modern .mec-labels-normal .mec-label-normal, +.mec-masonry-content .mec-labels-normal .mec-label-normal, +.tooltipster-box .mec-labels-normal .mec-label-normal { + margin: 0 5px 0 0; +} + +.mec-event-countdown-style3 .mec-labels-normal .mec-label-normal { + margin: 0 0 0 5px; +} + +.mec-event-footer-carousel-type3 .mec-labels-normal .mec-label-normal { + display: inline; +} + +.mec-event-carousel-type4 .mec-fc-style { + display: none; +} + +.mec-event-carousel-type4 .mec-labels-normal { + top: -20px; + position: relative; +} + +/* Cancelled Reason */ +.mec-wrap .mec-cancellation-reason { + display: inline-block; +} + +.mec-wrap .mec-cancellation-reason span { + line-height: 1.3; + background: #eb3450; + text-transform: none; + display: inline-block; + white-space: nowrap; +} + +.mec-wrap .mec-event-list-accordion .mec-labels-normal .mec-label-normal, +.mec-wrap .mec-event-list-accordion .mec-cancellation-reason span { + top: 7px; +} + +.mec-agenda-event-title .mec-cancellation-reason span, +.mec-timetable-event .mec-cancellation-reason span, +.tooltipster-box .mec-cancellation-reason span { + font-size: 9px; + letter-spacing: 0.5px; + text-transform: uppercase; + padding: 2px 7px; + color: #fff; + position: relative; + margin-left: 5px; + border-radius: 2px; + top: 0; +} + +.mec-wrap .mec-event-container-novel .mec-cancellation-reason span, +.mec-wrap .mec-event-container-novel .mec-labels-normal .mec-label-normal { + white-space: inherit; + margin-left: 0; +} + +.mec-wrap .mec-event-container-simple .mec-cancellation-reason span, +.mec-wrap .mec-event-container-simple .mec-labels-normal .mec-label-normal { + top: -5px; + white-space: inherit; + margin-left: 0; + margin-right: 3px; +} + +.mec-tile-item .mec-cancellation-reason span, +.mec-timeline-event .mec-cancellation-reason span, +.mec-owl-carousel:not(.mec-slider-t1) .mec-cancellation-reason span, +.mec-av-spot .mec-cancellation-reason span, +.mec-event-countdown-part1 .mec-cancellation-reason span, +.mec-event-countdown-part2 .mec-cancellation-reason span, +.mec-event-cover-modern .mec-cancellation-reason span, +.mec-masonry-content .mec-cancellation-reason span, +.tooltipster-box .mec-cancellation-reason span { + margin: 0 5px 0 0; +} + +.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-event-title-soldout, +.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-few-tickets { + display: inline; +} + +.mec-owl-carousel .mec-event-footer-carousel-type3 span.soldout, +.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-labels-normal { + margin-top: 0; + color: #fff; + display: unset; +} + +.mec-wrap .mec-single-event .mec-cancellation-reason span { + margin: 0; + padding: 6px 12px; + font-size: 14px; + font-weight: bold; + white-space: normal; + word-break: break-word; +} + +.featherlight-content .mec-cancellation-reason { + display: block; + width: 100%; + text-align: center; + margin-top: 20px; + margin-bottom: -10px; +} + +/* Display Custom Data Fields */ +.mec-event-data-fields { + margin-bottom: 30px; +} + +.mec-event-data-fields ul.mec-event-data-field-items { + overflow: hidden; + padding-top: 10px; + padding-left: 0; + margin-left: 0; +} + +.mec-event-data-fields .mec-event-data-field-item { + list-style: none; + margin-bottom: 10px; + border-bottom: 1px dashed #e1e2e3; + padding-bottom: 8px; + width: 100%; + float: left; +} + +.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-value { + margin: 0 0 8px 0; + color: #616263 !important; + font-size: 13px; + line-height: 1.5; + word-wrap: break-word; + white-space: break-spaces; +} + +.mec-event-data-fields .mec-event-data-field-item:last-child { + border: none; + width: 100%; +} + +.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-name { + text-transform: none; + font-size: 13px; + font-weight: 600; + padding-bottom: 5px; + color: #313131 !important; + width: 100%; + padding-bottom: 10px; + position: relative; + letter-spacing: -0.2px; +} + +@media (max-width: 768px) { + .mec-event-data-fields .mec-event-data-field-item { + width: 100%; + } +} + +.mec-wrap .col-md-4 .mec-event-data-fields .mec-event-data-field-item { + width: 100%; + display: block; +} + +/* #Organizer for all shorrcodes + ================================================== */ +.mec-shortcode-organizers { + overflow: hidden; + font-weight: 400; + line-height: 18px; + font-size: 12px; +} + +.mec-event-list-minimal .mec-shortcode-organizers { + margin-top: 6px; +} + +.mec-shortcode-organizers i { + margin-right: 4px; + display: inline-block; +} + +.mec-shortcode-organizers .mec-organizers { + display: inline-block; + list-style: none; + padding: 0; +} + +.mec-organizer-item a { + color: #777; +} + +/* List standard */ +.mec-event-list-standard .mec-shortcode-organizers .mec-sl-user:before { + font-size: 16px; +} + +.mec-shortcode-organizers { + position: relative; +} + +/* Grid View*/ +.mec-skin-grid-container .mec-organizers, +.mec-skin-grid-container .mec-shortcode-organizers { + padding: 0; + margin: 0; +} + +.mec-skin-grid-container .mec-event-grid-colorful .mec-shortcode-organizers a, +.mec-skin-grid-container + .mec-event-grid-colorful + .mec-shortcode-organizers + a:hover, +.mec-skin-grid-container .mec-event-grid-clean .mec-shortcode-organizers a, +.mec-skin-grid-container + .mec-event-grid-clean + .mec-shortcode-organizers + a:hover { + color: #fff; + font-size: 12px; +} + +.mec-skin-grid-container + .mec-event-grid-colorful + .mec-shortcode-organizers + a:hover, +.mec-skin-grid-container + .mec-event-grid-clean + .mec-shortcode-organizers + a:hover { + text-decoration: underline; +} + +.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers { + position: relative; +} + +.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers i { + display: block; + color: rgba(255, 255, 255, 0.4); +} + +.mec-skin-grid-container + .mec-event-grid-novel + .mec-shortcode-organizers + i:before { + position: absolute; + top: 6px; + left: 6px; + font-size: 17px; + font-family: simple-line-icons; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; +} + +.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers a { + padding-left: 35px; + font-size: 15px; + line-height: 30px; + color: rgba(255, 255, 255, 0.4); +} + +.mec-skin-grid-container + .mec-event-grid-novel + .mec-shortcode-organizers + a:hover { + color: #fff; +} + +/* weekly */ +.mec-calendar-daily .mec-shortcode-organizers, +.mec-calendar-daily .mec-shortcode-organizers .mec-organizers { + padding: 0; +} + +.mec-calendar-daily .mec-organizer-item a { + font-size: 13px; + line-height: 1.3; + color: #9a9a9a; + margin-bottom: 0; +} + +/* Masonry View */ + +.mec-events-masonry-wrap .mec-shortcode-organizers, +.mec-events-masonry-wrap .mec-shortcode-organizers .mec-organizers { + padding: 0; +} + +.mec-events-timeline-wrap .mec-shortcode-organizers .mec-organizers, +.mec-events-timeline-wrap .mec-organizer-item { + margin: 0; + display: inline; +} + +.mec-events-timeline-wrap .mec-shortcode-organizers i { + line-height: 24px; + margin-right: 7px; +} + +.mec-events-timeline-wrap .mec-organizer-item:after { + content: ","; +} + +.mec-events-timeline-wrap .mec-organizer-item:last-child:after { + content: ""; + padding: 0; +} + +.mec-events-timeline-wrap .mec-organizer-item:after, +.mec-events-timeline-wrap .mec-organizer-item a { + font-weight: 500; +} + +.mec-events-timeline-wrap .mec-organizer-item a:hover { + text-decoration: underline; +} + +/* Tile View */ +.mec-event-tile-view .mec-shortcode-organizers, +.mec-event-tile-view .mec-shortcode-organizers .mec-organizers { + padding: 0; +} + +.mec-event-tile-view .mec-shortcode-organizers i { + line-height: 24px; +} + +.mec-event-tile-view .mec-shortcode-organizers i, +.mec-event-tile-view .mec-shortcode-organizers .mec-organizers a { + color: #fff; +} + +/* MEC - Dark Mode*/ +.mec-dark-mode + .mec-calendar.mec-calendar-daily + .mec-calendar-d-table + .mec-modal-preloader, +.mec-dark-mode .mec-month-navigator-loading { + background-color: rgba(40, 40, 40, 0.88); +} + +.mec-dark-mode .mec-modal-wrap, +.mec-dark-mode .mec-fes-form .mec-meta-box-fields, +.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next, +.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-dark-mode .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button, +.mec-dark-mode .mec-timetable-events-list .mec-timetable-event, +.mec-dark-mode .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt, +.mec-dark-mode .mec-calendar .mec-calendar-row dt:hover, +.mec-dark-mode .mec-event-grid-classic .mec-event-content, +.mec-dark-mode .mec-map-view-event-detail.mec-event-detail, +.mec-dark-mode .mec-events-toggle .mec-toggle-content .mec-modal-wrap, +.mec-dark-mode .mec-event-footer .mec-booking-button, +/* Up Shortcode */ +.mec-dark-mode .mec-wrap .button, +.mec-dark-mode .mec-wrap a.button:not(.owl-dot):hover, +.mec-dark-mode .mec-wrap button:not(.owl-dot):hover, +.mec-dark-mode .mec-wrap input[type=button]:hover, +.mec-dark-mode .mec-wrap input[type=reset]:hover, +.mec-dark-mode .mec-wrap input[type=submit]:hover, +.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a i, +.mec-dark-mode .mec-organizer-social-information a i, +.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a:hover, +.mec-dark-mode .mec-events-meta-group-tags a:hover, +.mec-dark-mode .mec-next-event-details a, +.mec-dark-mode .mec-event-schedule-content .mec-schedule-speakers { + background-color: #1f1f1f; + color: #d2d2d2; +} + +/* Modal Popup Scroolbar */ +.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar { + width: 12px; +} + +.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar-track { + background: #000; +} + +.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar-thumb { + background-color: #333; + border-radius: 20px; + border: 2px solid #000; +} + +/* Modal Popup Overlay */ +.mec-dark-mode .mec-modal-preloader, +.mec-dark-mode .mec-month-navigator-loading { + background-color: #1f1f1f; +} + +.mec-dark-mode .mec-skin-tile-month-navigator-container, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table { + background: #282828; +} + +.mec-dark-mode .mec-skin-tile-month-navigator-container:after { + border-color: #282828 transparent transparent transparent; +} + +.mec-dark-mode .mec-event-grid-novel .mec-event-article, +body.mec-dark-mode .mec-single-modern .mec-single-event-bar { + background-color: #282828; + color: #d2d2d2; +} + +.mec-dark-mode .mec-fes-form input[type=email], +.mec-dark-mode .mec-fes-form input[type=number], +.mec-dark-mode .mec-fes-form input[type=password], +.mec-dark-mode .mec-fes-form input[type=tel], +.mec-dark-mode .mec-fes-form input[type=text], +.mec-dark-mode .mec-fes-form select, +.mec-dark-mode .mec-fes-form textarea, +.mec-dark-mode .mec-fes-form, +.mec-dark-mode .mec-fes-list, +/* FES */ +.mec-dark-mode .mec-slider-t1-wrap, +.mec-dark-mode .event-carousel-type2-head, +.mec-dark-mode .mec-event-carousel-content, +.mec-dark-mode .mec-wrap .mec-event-countdown-style2, +.mec-dark-mode .mec-wrap .mec-event-countdown-style1, +.mec-dark-mode .mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button, +.mec-dark-mode .mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-ttt2-title, +.mec-dark-mode .mec-timetable-t2-wrap, +.mec-dark-mode .mec-timetable-events-list .mec-timetable-event, +.mec-dark-mode .mec-calendar .mec-event-article:hover, +.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-table-head dt, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-event-article:hover, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-selected-day, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year:hover, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year:hover, +.mec-dark-mode .mec-calendar.mec-yearly-calendar .mec-calendar-table-head dl dt, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month, +.mec-dark-mode .mec-events-agenda-wrap, +.mec-dark-mode .mec-event-grid-classic .mec-event-content .mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-dark-mode .mec-wrap .mec-totalcal-box input, +.mec-dark-mode .mec-wrap .mec-totalcal-box select, +.mec-dark-mode .mec-wrap .mec-totalcal-box i, +.mec-dark-mode .mec-map-lightbox-wp, +.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner, +.mec-dark-mode .mec-event-footer, +.mec-dark-mode .mec-event-list-standard .mec-topsec, +.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button, +.mec-dark-mode.mec-wrap .mec-totalcal-box i, +.mec-dark-mode.mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-dark-mode.mec-wrap .mec-totalcal-box input, +.mec-dark-mode.mec-wrap .mec-totalcal-box select, +.mec-dark-mode .mec-event-list-minimal a.mec-detail-button, +.mec-dark-mode .mec-load-more-button, +/*up shortcodes */ +.mec-dark-mode .mec-wrap .mec-totalcal-box, +.mec-dark-mode .mec-hourly-schedule-speaker-info, +.mec-dark-mode .mec-related-event-content, +.mec-dark-mode .mec-events-meta-group-tags a, +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .lity-content .mec-events-meta-group-booking select, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select, +.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea, +.mec-dark-mode .lity-content .mec-events-meta-group-booking .mec-dark-mode .mec-single-event .mec-events-meta-group-booking, +.mec-dark-mode .mec-single-event .mec-frontbox, +.mec-dark-mode .mec-single-event .mec-events-meta-group-countdown, +.mec-dark-mode .mec-event-cost, +.mec-dark-mode .mec-event-more-info, +.mec-dark-mode .mec-event-website, +.mec-dark-mode .mec-events-meta-date, +.mec-dark-mode .mec-single-event-additional-organizers, +.mec-dark-mode .mec-single-event-category, +.mec-dark-mode .mec-single-event-sponsor, +.mec-dark-mode .mec-single-event-date, +.mec-dark-mode .mec-single-event-label, +.mec-dark-mode .mec-single-event-location, +.mec-dark-mode .mec-single-event-organizer, +.mec-dark-mode .mec-single-event-time, +.mec-dark-mode .mec-single-event .mec-speakers-details ul li, +.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a, +.mec-dark-mode .mec-single-modern .col-md-4 .mec-frontbox { + background-color: #282828; +} + +.mec-dark-mode .mec-fes-form input[type=email], +.mec-dark-mode .mec-fes-form input[type=number], +.mec-dark-mode .mec-fes-form input[type=password], +.mec-dark-mode .mec-fes-form input[type=tel], +.mec-dark-mode .mec-fes-form input[type=text], +.mec-dark-mode .mec-fes-form select, +.mec-dark-mode .mec-fes-form textarea, +.mec-dark-mode .mec-fes-form .mec-meta-box-fields, +.mec-dark-mode .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button, +.mec-dark-mode .event-carousel-type2-head, +.mec-dark-mode .mec-event-carousel-content, +.mec-dark-mode .mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-timetable-t2-wrap, +.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-table-head dt, +.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month, +.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec, +.mec-dark-mode .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt, +.mec-dark-mode .mec-box-calendar.mec-calendar dt, +.mec-dark-mode .mec-yearly-view-wrap, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev .mec-calendar.mec-calendar-daily .mec-calendar-a-month, +.mec-dark-mode .mec-events-agenda-wrap, +.mec-dark-mode .mec-wrap .mec-totalcal-box i, +.mec-dark-mode .mec-events-toggle .mec-toggle-content, +.mec-dark-mode .mec-events-toggle .mec-toggle-item, +.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner, +.mec-dark-mode .mec-event-footer .mec-booking-button, +.mec-dark-mode .mec-event-list-standard .mec-event-meta-wrap, +.mec-dark-mode .mec-event-list-standard .mec-event-article, +.mec-dark-mode .mec-event-footer, +.mec-dark-mode .mec-event-list-standard .mec-topsec, +.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button, +.mec-dark-mode .mec-event-list-modern .mec-event-article, +.mec-dark-mode .mec-event-list-minimal .mec-event-article, +.mec-dark-mode .mec-wrap .mec-totalcal-box i, +.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-dark-mode .mec-wrap .mec-totalcal-box input, +.mec-dark-mode .mec-wrap .mec-totalcal-box select, +.mec-dark-mode .mec-event-list-minimal a.mec-detail-button, +.mec-dark-mode .mec-load-more-button, +/*up shortcodes */ +.mec-dark-mode .mec-wrap .mec-totalcal-box, +.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details, +.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li, +.mec-dark-mode .mec-breadcrumbs, +.mec-dark-mode .mec-hourly-schedule-speaker-info, +.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a:hover, +.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title, +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .lity-content .mec-events-meta-group-booking select, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select, +.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea, +.mec-dark-mode .lity-content .mec-events-meta-group-booking .mec-dark-mode .mec-single-event .mec-events-meta-group-booking, +.mec-dark-mode .mec-single-event .mec-frontbox, +.mec-dark-mode .mec-single-event .mec-events-meta-group-countdown, +.mec-dark-mode .mec-next-event-details a, +.mec-dark-mode .lity-content .mec-events-meta-group-booking form>h4, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking form>h4, +.mec-dark-mode .mec-single-event .mec-frontbox-title, +.mec-dark-mode .mec-event-schedule-content, +.mec-dark-mode .mec-event-schedule-content dl:before, +.mec-dark-mode .mec-events-meta-group-tags a, +.mec-dark-mode .mec-breadcrumbs { + border-color: #353535; +} + +.mec-dark-mode .mec-fes-form input[type=email], +.mec-dark-mode .mec-fes-form input[type=number], +.mec-dark-mode .mec-fes-form input[type=password], +.mec-dark-mode .mec-fes-form input[type=tel], +.mec-dark-mode .mec-fes-form input[type=text], +.mec-dark-mode .mec-fes-form select, +.mec-dark-mode .mec-fes-form textarea, +.mec-dark-mode .mec-fes-form label, +.mec-dark-mode .mec-fes-form, +.mec-dark-mode .mec-fes-list, +/* FES */ +.mec-dark-mode .mec-timeline-main-content h4 a, +.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i, +.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-dark-mode .mec-event-carousel-content .mec-event-carousel-title a, +.mec-dark-mode .mec-ttt2-title, +.mec-dark-mode .mec-timetable-events-list .mec-timetable-event span a, +.mec-dark-mode .mec-timetable-event .mec-timetable-event-time, +.mec-dark-mode .mec-tooltip-event-title, +.mec-dark-mode .mec-calendar.mec-event-container-simple dl dt.mec-calendar-day, +.mec-dark-mode .mec-calendar dt, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event, +.mec-dark-mode .mec-calendar .mec-event-article .mec-event-title a, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month, +.mec-dark-mode .mec-event-grid-simple .mec-event-title a, +.mec-dark-mode .mec-event-grid-modern .mec-event-title a, +.mec-dark-mode .mec-event-grid-minimal .mec-event-date span, +.mec-dark-mode .mec-event-grid-minimal .mec-event-title a, +.mec-dark-mode .mec-event-grid-clean .mec-event-title a, +.mec-dark-mode .mec-event-grid-classic .mec-event-title a, +.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-dark-mode .mec-wrap .mec-totalcal-box input, +.mec-dark-mode .mec-wrap .mec-totalcal-box select, +.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner i, +.mec-dark-mode .mec-event-list-standard .mec-event-title a, +.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button, +.mec-dark-mode .mec-wrap .mec-event-list-modern .mec-event-title a, +.mec-dark-mode .mec-event-list-minimal .mec-event-title a, +.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li, +.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-amount, +.mec-dark-mode .mec-event-list-classic .mec-event-title a, +.mec-dark-mode .mec-event-list-minimal a.mec-detail-button, +.mec-dark-mode .mec-load-more-button, +/*up shortcodes */ +.mec-dark-mode .mec-wrap, +.mec-dark-mode .mec-wrap p, +.mec-dark-mode .lity-content .mec-events-meta-group-booking h5 span, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking h5 span, +.mec-dark-mode .lity-content .mec-events-meta-group-booking label, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking label, +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel], +.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text], +.mec-dark-mode .lity-content .mec-events-meta-group-booking select, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select, +.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea, +.mec-dark-mode .mec-wrap .mec-event-schedule-content a, +.mec-dark-mode .mec-hourly-schedule-speaker-description, +.mec-dark-mode .mec-hourly-schedule-speaker-name, +.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a i, +.mec-dark-mode .mec-organizer-social-information a i, +.mec-dark-mode .mec-related-event-content span, +.mec-dark-mode .mec-related-event-content h5 a, +.mec-dark-mode .mec-events-meta-group-tags a, +.mec-dark-mode .mec-single-event .mec-speakers-details ul li .mec-speaker-job-title, +.mec-dark-mode .mec-breadcrumbs a, +.mec-dark-mode .mec-single-event .mec-event-meta dt, +.mec-dark-mode .mec-single-event .mec-event-meta h3, +.mec-dark-mode .mec-single-modern .mec-single-event-bar>div h3, +.mec-dark-mode .entry-content .mec-wrap h1, +.mec-dark-mode .entry-content .mec-wrap h2, +.mec-dark-mode .entry-content .mec-wrap h3, +.mec-dark-mode .entry-content .mec-wrap h4, +.mec-dark-mode .entry-content .mec-wrap h5, +.mec-dark-mode .entry-content .mec-wrap h6, +.mec-dark-mode .mec-wrap h1, +.mec-dark-mode .mec-wrap h2, +.mec-dark-mode .mec-wrap h3, +.mec-dark-mode .mec-wrap h4, +.mec-dark-mode .mec-wrap h5, +.mec-dark-mode .mec-wrap h6, +.mec-dark-mode .mec-next-event-details abbr, +.mec-dark-mode .lity-content .mec-events-meta-group-booking form>h4, +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking form>h4, +.mec-dark-mode .mec-single-event .mec-frontbox-title, +.mec-dark-mode .mec-wrap .mec-single-title, +.mec-dark-mode .mec-event-content p { + color: #d2d2d2; +} + +.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event:hover, +.mec-dark-mode .mec-calendar .mec-event-article .mec-event-title a:hover, +.mec-dark-mode .mec-event-grid-minimal .mec-event-date:hover, +.mec-dark-mode .mec-event-grid-minimal .mec-event-title a:hover, +.mec-dark-mode .mec-event-grid-classic .mec-event-title a:hover, +.mec-dark-mode .mec-event-list-classic .mec-event-title a:hover, +.mec-dark-mode .mec-event-footer .mec-booking-button:hover, +.mec-dark-mode .mec-event-list-standard .mec-event-title a:hover, +.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover, +.mec-dark-mode .mec-wrap .mec-event-list-modern .mec-event-title a:hover, +.mec-dark-mode .mec-event-list-minimal a.mec-detail-button:hover, +.mec-dark-mode .mec-event-list-minimal .mec-event-title a:hover, +/* Up Shortcode */ +.mec-dark-mode .mec-wrap a:hover, +.mec-dark-mode .mec-single-event .mec-event-meta dd a:hover, +.mec-dark-mode .mec-breadcrumbs a:hover { + color: #fff; +} + +.mec-dark-mode + .mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:first-child { + border-color: #333 !important; +} + +.mec-dark-mode + .mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:nth-child(odd) { + background: #1f1f1f !important; +} + +.mec-dark-mode + .mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix { + background: #282828 !important; +} + +.mec-dark-mode + .lity-container + .mec-events-meta-group-booking + input[type="radio"]:before, +.mec-dark-mode + .mec-single-event + .mec-events-meta-group-booking + input[type="radio"]:before, +.mec-dark-mode + .mec-single-event + .mec-events-meta-group-booking + input[type="checkbox"], +.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title:before { + background-color: #c4cace; +} + +.mec-dark-mode .mec-month-divider span, +.mec-dark-mode + .lity-container + .mec-events-meta-group-booking + input[type="radio"]:before, +.mec-dark-mode + .mec-single-event + .mec-events-meta-group-booking + input[type="radio"]:before, +.mec-dark-mode + .mec-single-event + .mec-events-meta-group-booking + input[type="checkbox"], +.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title:before { + border-color: #313131; +} + +.mec-dark-mode .mec-timeline-month-divider, +.mec-dark-mode .mec-timeline-event-content, +.mec-dark-mode .mec-slider-t5-wrap, +.mec-dark-mode .mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-slider-t5 .mec-slider-t5-content, +.mec-dark-mode .mec-slider-t1 .mec-slider-t1-content, +.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3, +.mec-dark-mode .mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-av-spot .mec-av-spot-content, +.mec-dark-mode .mec-av-spot .mec-av-spot-head, +.mec-dark-mode .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3, +.mec-dark-mode .mec-event-cover-classic, +.mec-dark-mode .mec-masonry .mec-masonry-content, +.mec-dark-mode .mec-masonry .mec-masonry-head, +.mec-dark-mode .mec-timetable-events-list .mec-timetable-event:hover, +.mec-dark-mode .tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-content, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year, +.mec-dark-mode .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-calendar-sec, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month:hover, +.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month:hover, +.mec-dark-mode .mec-calendar dt, +.mec-dark-mode .mec-calendar .mec-calendar-topsec, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a:hover, +.mec-dark-mode .mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event:hover, +.mec-dark-mode .mec-calendar .mec-event-article:hover, +.mec-dark-mode .mec-wrap .mec-totalcal-box, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-top, +.mec-dark-mode .mec-agenda-events-wrap, +.mec-dark-mode .mec-event-grid-modern .mec-event-content, +.mec-dark-mode .mec-event-grid-modern .mec-event-article, +.mec-dark-mode .mec-event-grid-clean .mec-event-content, +.mec-dark-mode .mec-event-grid-clean .mec-event-article, +.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing, +.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner:hover, +.mec-dark-mode .mec-event-footer .mec-booking-button:hover, +.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover, +.mec-dark-mode .mec-event-list-minimal a.mec-detail-button:hover, +/* Up Shortcode */ +.mec-dark-mode .mec-organizer-social-information a:hover i, +.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a:hover i { + background: #191919; +} + +.mec-dark-mode .mec-fes-form .mec-meta-box-fields, +/* FES */ +.mec-dark-mode .mec-timeline-month-divider, +.mec-dark-mode .mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-event-sharing-wrap>li:first-of-type, +.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button, +.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3, +.mec-dark-mode .mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head, +.mec-dark-mode .mec-av-spot, +.mec-dark-mode .mec-event-cover-clean, +.mec-dark-mode .mec-event-cover-classic, +.mec-dark-mode .mec-masonry, +.mec-dark-mode .mec-calendar.mec-box-calendar .mec-table-nullday:last-child, +.mec-dark-mode .mec-calendar .mec-event-article, +.mec-dark-mode .mec-box-calendar.mec-calendar dl dt:last-child, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year, +.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month:hover, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table, +.mec-dark-mode .mec-calendar, +.mec-dark-mode .mec-wrap .mec-totalcal-box, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month, +.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month, +.mec-dark-mode .mec-events-agenda, +.mec-dark-mode .mec-event-grid-modern .mec-event-article, +.mec-dark-mode .mec-event-grid-clean .mec-event-article, +.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:after, +.mec-dark-mode .mec-event-grid-classic .mec-event-article, +.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing { + border-color: #353535; +} + +.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:after { + border-color: #191919 transparent transparent transparent; +} + +.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:before { + border-color: #353535 transparent transparent transparent; +} + +.mec-dark-mode + .mec-wrap + .mec-book-form-gateways + [id*="mec_book_form_gateway_checkout"] + input[type="text"], +.mec-dark-mode + .mec-wrap + .mec-book-form-gateways + [id*="mec_book_form_gateway_checkout"] + input[type="email"], +.mec-dark-mode .mec-events-meta-group-booking .StripeElement, +.mec-dark-mode + .mec-book-form-gateways + [id*="mec_book_form_gateway_checkout"] + input[type="text"] { + background: #999 !important; + border: 1px solid #353535 !important; + box-shadow: none !important; + color: #353535 !important; +} + +.mec-dark-mode + .CardField + CardField--ltr + .__PrivateStripeElement + .InputContainer + input { + color: #d2d2d2 !important; +} + +.mec-dark-mode .mec-events-toggle .mec-toggle-item { + border: 1px solid #e4e4e4; + box-shadow: 0 10px 15px #282828; +} + +.mec-dark-mode + .mec-agenda-events-wrap + .mec-event-grid-colorful + .mec-event-content { + background-color: transparent; +} + +.mec-dark-mode .mec-calendar .mec-calendar-side { + box-shadow: 0 1px 5px 6px rgba(255, 255, 255, 0.005) inset; +} + +.mec-dark-mode + .tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) + .tooltipster-box { + border: 1px solid #282828 !important; +} + +.mec-dark-mode .mec-timeline-event-content:after { + border-color: transparent #191919 transparent transparent; +} + +/* FES */ +.mec-dark-mode .mec-fes-form .mec-meta-box-fields { + box-shadow: 0 2px 6px -3px #353535; +} + +.mec-dark-mode .mec-fes-form .mec-meta-box-fields h4 { + color: #d2d2d2; + background: #000; +} + +.mec-dark-mode .mec-fes-form input[type="email"], +.mec-dark-mode .mec-fes-form input[type="number"], +.mec-dark-mode .mec-fes-form input[type="password"], +.mec-dark-mode .mec-fes-form input[type="tel"], +.mec-dark-mode .mec-fes-form input[type="text"], +.mec-dark-mode .mec-fes-form select, +.mec-dark-mode .mec-fes-form textarea { + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.38) inset; +} + +.mec-dark-mode .mec-fes-form input { + background: #353535 !important; + color: #d2d2d2 !important; +} + +.mec-dark-mode .mec-booking-tab-content .button:hover, +.mec-dark-mode .mec-booking-tab-content .mec-reg-field-add-option:hover, +.mec-dark-mode .mec-fes-form .mec-form-row .button:not(.wp-color-result):hover { + background: #353535; + color: #d2d2d2; + border-color: #353535; + box-shadow: 0 2px 6px -3px #353535; +} + +.mec-dark-mode .mec-booking-tab-content .button, +.mec-dark-mode .mec-booking-tab-content .mec-reg-field-add-option, +.mec-dark-mode .mec-fes-form .mec-form-row .button:not(.wp-color-result), +.mec-dark-mode .mec-fes-form input[type="file"], +.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove, +.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove { + color: #d2d2d2; + background: #282828; + border: 2px solid #353535; + box-shadow: 0 2px 6px -3px #353535; +} + +.mec-dark-mode #mec_reg_form_fields input[type="checkbox"], +.mec-dark-mode #mec_reg_form_fields input[type="radio"], +.mec-dark-mode .mec-form-row input[type="checkbox"], +.mec-dark-mode .mec-form-row input[type="radio"] { + background-color: #000; + border: 1px solid #353535; + box-shadow: 0 1px 3px -1px #353535; +} + +.mec-dark-mode .mec-fes-form .select2-container { + border: 1px solid #353535; + background-color: #282828; + color: #d2d2d2; +} + +.mec-dark-mode ul#mec_bfixed_form_fields li, +.mec-dark-mode ul#mec_orgz_form_row li, +.mec-dark-mode ul#mec_reg_form_fields li { + background: #000; + border-color: #000; +} + +.mec-dark-mode + #mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button { + background: #000; + border-color: #2d2d2d; + box-shadow: 0 2px 6px -3px #2d2d2d; +} + +.mec-dark-mode #mec_reg_form_field_types .button.red { + background: #2d2d2d; + border-color: #2d2d2d; + box-shadow: 0 2px 6px -3px #2d2d2d; +} + +.mec-dark-mode #mec_bfixed_form_field_types .button, +.mec-dark-mode #mec_reg_form_field_types .button { + color: #d2d2d2; + box-shadow: 0 2px 6px -3px #2d2d2d; + border-color: #2d2d2d; +} + +.mec-dark-mode + #mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button:hover, +.mec-dark-mode #mec_reg_form_field_types .button:hover { + background: #000; +} + +.mec-dark-mode ul#mec_bfixed_form_fields li .mec_bfixed_field_remove, +.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove, +.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove { + background: #282828; +} + +.mec-dark-mode ul#mec_bfixed_form_fields li .mec_bfixed_field_remove:hover, +.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove:hover, +.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove:hover, +.mec-dark-mode + #mec_taxes_fees_container_toggle + [id^="mec_remove_fee_button"]:hover, +.mec-dark-mode + #mec_ticket_variations_list + [id^="mec_remove_ticket_variation_button"]:hover { + color: #fff; + border: 2px solid #ea6485; + background: #ea6485; +} + +/* Booking Shortcode */ + +.mec-events-meta-group-booking-shortcode h4 { + margin-bottom: 20px; +} + +.mec-booking-shortcode .mec-event-tickets-list.mec-sell-all-occurrences { + width: 100%; +} + +.mec-booking-shortcode .mec-book-reg-field-mec_email { + width: 48%; + display: inline-block; + margin-right: 30px; +} + +.mec-booking-shortcode .mec-book-reg-field-name { + width: 48%; + display: inline-block; +} + +.mec-booking-shortcode + .mec-form-row.mec-paypal-credit-card-expiration-date-month { + width: 48%; + display: inline-block; + vertical-align: top; + margin-right: 30px; +} + +.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-cvv2 { + width: 48%; + display: inline-block; +} + +.mec-booking-shortcode + .mec-form-row.mec-paypal-credit-card-expiration-date-month + .nice-select { + width: 48%; + display: inline-block; +} + +.mec-booking-shortcode + .mec-form-row.mec-paypal-credit-card-expiration-date-month + label { + width: 100%; +} + +.mec-booking-shortcode + .mec-form-row.mec-paypal-credit-card-expiration-date-month + .nice-select:first-of-type { + margin-right: 10px; +} + +.mec-booking-shortcode .nice-select { + float: none; + border-radius: 3px; + background-color: #fff; + width: 258px; + height: 40px; + line-height: 39px; + padding-left: 15px; + padding-right: 15px; + margin: 0; + font-size: 14px; + font-weight: 400; + min-height: unset; + min-width: unset; + padding-top: 0; + padding-bottom: 0; +} + +.mec-booking-shortcode .mec-gateway-message.mec-success { + font-size: 14px; +} + +.mec-booking-shortcode .mec-form-row.mec-name-stripe { + margin-bottom: 0 !important; +} + +.mec-booking-shortcode + .mec-book-form-gateways + [id*="mec_book_form_gateway_checkout"] + input[type="text"], +.mec-events-meta-group-booking .mec-booking-shortcode .StripeElement { + box-shadow: none !important; +} + +.mec-booking-shortcode .nice-select ul { + width: 100%; +} + +.mec-booking-shortcode span.mec-event-ticket-available { + margin-top: -22px !important; + margin-bottom: 28px !important; + display: block; + font-size: 11px; + letter-spacing: 0.5px; + font-weight: 300; + color: #80abbf; +} + +.mec-booking-shortcode .mec-booking-form-container ul li { + list-style: none; +} + +.mec-booking-shortcode .mec-booking-form-container ul { + padding: 0; +} + +.mec-events-meta-group-booking-shortcode .info-msg { + margin: 24px 0 24px; +} + +@media (max-width: 980px) { + .mec-events-meta-group-booking-shortcode { + padding: 20px; + } + + .mec-booking-shortcode ul.mec-book-price-details li { + width: 100%; + border-right: 0 !important; + border-bottom: 1px solid; + } + + .mec-booking-shortcode ul.mec-book-price-details li:last-child { + width: 100%; + border-right: 0; + border-bottom: 0 solid; + } +} + +.mec-booking-shortcode span.mec-book-price-total { + font-size: 22px; + line-height: 22px; + font-weight: 700; + color: #2bbc10; + margin-top: 20px; + margin-bottom: 35px; + display: inline-block; +} + +.mec-booking-shortcode span.mec-book-price-total-description { + font-size: 18px; + line-height: 22px; + font-weight: 700; + color: #000; +} + +.mec-booking-shortcode span.mec-book-price-total-amount { + font-size: 22px; + line-height: 22px; + font-weight: 700; + color: #2bbc10; +} + +.mec-booking-shortcode .mec-book-form-price { + clear: both; + position: relative; +} + +.mec-booking-shortcode .mec-book-form-gateway-label input[type="radio"]:after { + content: ""; + display: inline-block; + width: 7px; + height: 7px; + background-color: #fff; + border-radius: 50%; + cursor: pointer; + position: absolute; + top: 4px; + left: 3px; +} + +.mec-booking-shortcode .mec-book-form-gateway-label input[type="radio"]:before { + box-shadow: none; + border: 2px solid #a8e4ff; + width: 17px; + height: 17px; + position: absolute; + top: -9px; + left: -2px; + margin: 0; + content: ""; + display: inline-block; + background: #fff; + border-radius: 18px; + cursor: pointer; + position: relative; +} + +.mec-booking-shortcode .mec-book-form-gateway-label label input { + position: relative; + cursor: pointer; + margin: 0 !important; + height: auto; + margin-right: 4px !important; +} + +.mec-booking-shortcode button#mec-book-form-btn-step-2 { + margin-left: 30px; +} + +.mec-booking-shortcode .mec-ticket-name { + display: inline-block; + background-color: #fff; + border-radius: 3px; + font-size: 12px; + line-height: 12px; + font-weight: 400; + color: #00acf8; + padding: 8px 13px; + letter-spacing: 0; +} + +.mec-booking-shortcode .mec_book_first_for_all { + display: none; +} + +.mec-booking-shortcode li.mec-first-for-all-wrapper { + margin-bottom: 20px; + clear: both; +} + +.mec-booking-shortcode label.wn-checkbox-label:before { + display: inline-block; + -moz-transform-origin: left top; + -ms-transform-origin: left top; + -o-transform-origin: left top; + -webkit-transform-origin: left top; + transform-origin: left top; + content: ""; + -webkit-transition: opacity ease 0.5; + -moz-transition: opacity ease 0.5; + transition: opacity ease 0.5; + position: absolute; + background-color: #00acf8; + width: 2px; + -webkit-transform: rotate(-138deg); + transform: rotate(-138deg); +} + +.mec-booking-shortcode label.wn-checkbox-label { + position: relative; + display: inline-block; + -moz-transition: border-color ease 0.2s; + -o-transition: border-color ease 0.2s; + -webkit-transition: border-color ease 0.2s; + transition: border-color ease 0.2s; + cursor: pointer; + vertical-align: middle; + font-size: 14px; + line-height: 19px; + font-weight: 400; + color: #00acf8; + margin: 0 0 4px !important; + padding: 0; + background-color: #fff; + border: 2px solid #a8e4ff; + width: 17px; + height: 17px; + border-radius: 3px; + margin-right: 9px !important; + box-shadow: none; +} + +.mec-booking-shortcode label.wn-checkbox-label:after { + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -moz-animation: dothabottomcheck 80ms ease 0s forwards; + -o-animation: dothabottomcheck 80ms ease 0s forwards; + -webkit-animation: dothabottomcheck 80ms ease 0s forwards; + animation: dothabottomcheck 80ms ease 0s forwards; + content: ""; + display: inline-block; + -moz-transform-origin: left top; + -ms-transform-origin: left top; + -o-transform-origin: left top; + -webkit-transform-origin: left top; + transform-origin: left top; + content: ""; + -webkit-transition: opacity ease 0.5; + -moz-transition: opacity ease 0.5; + transition: opacity ease 0.5; + position: absolute; + background-color: #00acf8; + width: 2px; +} + +.mec-booking-shortcode + input[type="checkbox"]:checked + + .wn-checkbox-label::after { + height: 5px; + left: 2px; + top: 7px; + -moz-animation: dothatopcheck 0.16s ease 0s forwards; + -o-animation: dothatopcheck 0.16s ease 0s forwards; + -webkit-animation: dothatopcheck 0.16s ease 0s forwards; + animation: dothatopcheck 0.16s ease 0s forwards; +} + +.mec-booking-shortcode + input[type="checkbox"]:checked + + .wn-checkbox-label::before { + height: 6px; + left: 7px; + top: 9px; + -moz-animation: dothatopcheck 0.16s ease 0s forwards; + -o-animation: dothatopcheck 0.16s ease 0s forwards; + -webkit-animation: dothatopcheck 0.16s ease 0s forwards; + animation: dothatopcheck 0.16s ease 0s forwards; +} + +.mec-booking-shortcode button.mec-book-form-back-button { + background-color: #afe6ff; + box-shadow: 0 2px 2px rgba(175, 230, 255, 0.27); +} + +.mec-booking-shortcode button[type="submit"]:hover, +.mec-booking-shortcode button[type="button"]:hover { + background-color: #000; + text-decoration: none; + box-shadow: 0 4px 10px rgba(1, 2, 4, 0.32); +} + +.mec-booking-shortcode a.button.loading:after, +.mec-booking-shortcode button[type="submit"].loading:after { + display: block; +} + +/* #Booking > Date Selection > Calendar + ================================================== */ +/* Date Selection */ +.mec-single-fluent-wrap .mec-booking-calendar-month-navigation, +.mec-booking-calendar-month-navigation { + position: relative; + text-align: center; + padding: 0; + max-width: 330px; +} + +.mec-single-fluent-wrap .mec-booking-calendar.mec-wrap, +.mec-booking-calendar.mec-wrap { + margin-bottom: 20px; + width: 100%; +} + +.mec-single-fluent-wrap .mec-booking-calendar.mec-wrap, +.mec-booking-calendar.mec-wrap { + max-width: 330px; + background: #ffffff; + box-shadow: 0 1px 5px 6px rgba(0, 0, 0, 0.005) inset; + border: 1px solid #efefef; + border-radius: 5px; +} + +/* Date Selection > Navigation */ +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-calendar-header + h2, +.mec-booking-calendar-month-navigation .mec-calendar-header h2 { + font-size: 13px; + font-weight: 600; + line-height: 40px; + margin: 0 auto; + color: #4d4d4d; +} + +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-previous-month, +.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month, +.mec-booking-calendar-month-navigation .mec-previous-month, +.mec-booking-calendar-month-navigation .mec-next-month { + cursor: pointer; + position: absolute; + top: 0; + min-width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + background: #fff; + color: #a9a9a9; + font-size: 10px; + letter-spacing: 1px; + text-transform: uppercase; + padding-left: 5px; + padding-right: 5px; + border-top: none; + transition: all 0.33s ease; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.015); + transition: all 0.33s ease; +} + +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-previous-month, +.mec-booking-calendar-month-navigation .mec-previous-month { + left: 0; +} + +.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month, +.mec-booking-calendar-month-navigation .mec-next-month { + right: 0; +} + +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-previous-month + a, +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-next-month + a, +.mec-booking-calendar-month-navigation .mec-previous-month a, +.mec-booking-calendar-month-navigation .mec-next-month a { + font-weight: 600; + text-decoration: none; +} + +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-previous-month:hover + a, +.mec-single-fluent-wrap + .mec-booking-calendar-month-navigation + .mec-next-month:hover + a, +.mec-booking-calendar-month-navigation .mec-previous-month:hover a, +.mec-booking-calendar-month-navigation .mec-next-month:hover a { + color: #40d9f1; +} + +/* Date Selection > Calendar */ +.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar { + margin-bottom: 15px; + width: 100%; +} + +.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar dl dt { + text-align: center; + padding: 0; + line-height: 40px; + height: 40px; + border: 0; + background: transparent; + cursor: pointer; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar + .mec-calendar-row + dt:hover { + background: transparent; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar + .mec-calendar-novel-selected-day, +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar + .mec-calendar-novel-selected-day + span { + width: 32px; + height: 32px; + margin: auto; + line-height: 30px; + border-radius: 50%; + font-size: 12px; + font-weight: 600; + padding: 0; +} + +/* Bordered Date */ +.mec-has-event-for-booking { + position: relative; +} + +.mec-has-event-for-booking .mec-calendar-novel-selected-day { + border: 1px solid #38d5ed; + border-radius: 50px; + cursor: pointer; +} + +.mec-has-event-for-booking.mec-active .mec-calendar-novel-selected-day { + background-color: #38d5ed; + color: #fff; +} + +/* Selected Date */ +.mec-has-event-for-booking .mec-booking-tooltip, +.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip, +.mec-has-event-for-booking .mec-booking-calendar-date { + opacity: 0; + visibility: hidden; + transition: all 0.4s ease; +} + +.mec-has-event-for-booking .mec-booking-tooltip, +.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip { + top: 60px; +} + +.mec-has-event-for-booking .mec-booking-tooltip, +.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip { + position: absolute; + z-index: 99; + width: 150px; + font-size: 9px; + left: calc(50% - 75px); + background: #535a61; + line-height: 29px; + border-radius: 4px; + color: #fff; + font-weight: 400; + letter-spacing: 1px; + text-transform: uppercase; + padding: 3px 5px; + box-shadow: 0 4px 15px -2px #444b50a3; +} + +.mec-has-event-for-booking:hover + .mec-booking-tooltip.multiple-time + .mec-booking-calendar-date, +.mec-has-event-for-booking:hover .mec-booking-tooltip, +.mec-has-event-for-booking:hover .mec-booking-calendar-date, +.mec-multiple-event .mec-has-event-for-booking:hover .mec-booking-tooltip, +.mec-multiple-event + .mec-has-event-for-booking:hover + .mec-booking-calendar-date { + opacity: 1; + visibility: visible; +} + +.mec-has-event-for-booking:hover .mec-booking-tooltip, +.mec-multiple-event .mec-has-event-for-booking:hover .mec-booking-tooltip { + top: 43px; +} + +.mec-has-event-for-booking .mec-booking-calendar-date:before, +.mec-multiple-event + .mec-has-event-for-booking + .mec-booking-calendar-date:before { + display: block; + content: "" !important; + position: absolute !important; + width: 12px; + height: 12px; + top: -6px; + left: calc(50% - 6px); + transform: rotate(-45deg) !important; + background-color: #535a61; + z-index: 0 !important; + box-shadow: 0 8px 9px -9px #535a61 !important; +} + +.mec-multiple-event + .mec-has-event-for-booking + .mec-booking-calendar-date-hover { + border-bottom: 1px solid #ffffff30; +} + +/* Multiple Day Events */ + +/* First Day */ +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .first-day { + position: relative; + padding-left: 7px; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .first-day + .mec-calendar-novel-selected-day { + border-radius: 47px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + width: 100%; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .first-day + .mec-calendar-novel-selected-day + span { + margin-left: -7px; +} + +/* Last Day */ +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .last-day { + position: relative; + padding-right: 7px; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .last-day + .mec-calendar-novel-selected-day { + border-radius: 47px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: 0; + width: 100%; +} + +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .last-day + .mec-calendar-novel-selected-day + span { + margin-right: -7px; +} + +/* Middle Day */ +.mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar.mec-multiple-event + .middle-day + .mec-calendar-novel-selected-day { + border-radius: 0; + border-right: 0; + border-left: 0; + width: 100%; +} + +/* Multiple Time in one Daye */ +.mec-booking-tooltip.multiple-time { + color: #fff; +} + +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:before { + display: none; +} + +.mec-booking-tooltip.multiple-time + .mec-booking-calendar-date:first-child:before { + display: block; +} + +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date { + border: 1px dashed #68717a; + line-height: 25px; + margin: 8px 0; + border-radius: 20px; + transition: all 0.17s ease; + -webkit-transition: all 0.17s ease; + -moz-transition: all 0.17s ease; + -ms-transition: all 0.17s ease; + -o-transition: all 0.17s ease; +} + +.mec-calendar-day.mec-active + .mec-booking-tooltip.multiple-time + .mec-booking-calendar-date.mec-active, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover { + background: #40d9f1; + border-color: #40d9f1; +} + +.mec-choosen-time-message { + max-width: 330px; + padding: 3px 14px; + border-radius: 4px; + background: rgb(64 217 241 / 24%); + color: #40d9f1; + transition: all 0.17s ease; + opacity: 1; + visibility: visible; + font-size: 12px; + margin-bottom: 20px; +} + +.mec-choosen-time-message .mec-choosen-time { + padding-left: 7px; +} + +.mec-choosen-time-message.disable .mec-choosen-time-message, +.mec-choosen-time-message.disable { + opacity: 0; + visibility: hidden; + padding: 0; + font-size: 0; + margin: 0; +} + +/* Booking Calendar Dark Mode */ + +.mec-dark-mode .mec-single-event .mec-events-meta-group-booking .mec-calendar, +.mec-dark-mode + .mec-single-event + .mec-events-meta-group-booking + .mec-booking-calendar-month-navigation { + background: #000; + border-color: #222; + color: #999; +} + +.mec-dark-mode .mec-booking-calendar-month-navigation .mec-next-month, +.mec-dark-mode .mec-booking-calendar-month-navigation .mec-previous-month { + background: #222; + border-color: #000; + color: #d2d2d2; +} + +.mec-dark-mode .mec-booking-calendar.mec-wrap { + border-color: #111; +} + +.mec-dark-mode + .mec-events-meta-group-booking + .mec-booking-calendar + .mec-calendar + .mec-calendar-row + dt:hover { + background: transparent !important; +} + +.mec-dark-mode .mec-calendar.mec-event-calendar-classic, +.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-side { + height: auto; +} + +/* Light Themes */ +.is-light-theme .mec-fes-form textarea { + border: 1px solid #cfeff5; + box-shadow: 0 2px 5px rgba(207, 239, 245, 0.38) inset; +} + +.is-light-theme .mec-fes-form .select2-selection { + height: auto; +} + +.is-light-theme .mec-fes-form input[type="checkbox"]:after { + border: unset !important; +} + +.is-light-theme .mec-fes-form input[type="radio"]:after { + background: unset !important; +} + +.is-light-theme .mec-fes-form input + label { + padding-top: 0; +} + +.is-light-theme .mec-events-event-image img { + height: auto; +} + +span.mec-booking-field-required { + color: red; + margin-left: 10px; +} + +/* General Calendar */ +.mec-gCalendar { + position: relative; +} + +.mec-gCalendar-filters { + display: none; + position: absolute; + width: 518px; + background: #fff; + right: calc(50% - 119px); + top: 60px; + z-index: 9999999; + border: 1px solid #e3e4e5; + border-radius: 7px; + box-shadow: 0 2px 7px rgb(0 0 0 / 5%); +} + +.mec-gCalendar-filters-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + padding: 30px; + gap: 20px 10px; + align-items: center; +} + +.mec-gCalendar-filters-wrap > div { + flex: 1 0 calc(43% - 10px); + display: inline-flex; +} + +.mec-gCalendar-filters .mec-gCalendar-filters-wrap .mec-search-reset-button { + display: block; + flex: 1 0 calc(100%); +} + +.mec-gCalendar-filters + .mec-gCalendar-filters-wrap + .mec-search-reset-button + button { + width: 100%; + border: 2px solid #e3e5e7; + border-radius: 7px; + color: #4c5765; +} + +.mec-gCalendar-filters + .mec-gCalendar-filters-wrap + .mec-search-reset-button + button:hover { + color: #e9526c; + border-color: #f37f9b; + background-color: transparent; +} + +.mec-gCalendar-filters-wrap .select2-container--default > ul { + margin-top: 2px; + width: 100%; +} + +.mec-gCalendar-filters-wrap span.select2.select2-container { + width: 100% !important; +} + +.mec-gCalendar-filters-wrap .select2-container--default > ul > li { + width: 100%; +} + +.mec-gCalendar-filters-wrap .select2-container--default { + height: 39px; +} + +.mec-gCalendar-filters-wrap span.select2-selection.select2-selection--multiple { + border: none !important; + height: 37px !important; +} + +.mec-gCalendar-filters-wrap + .select2-container--default + .select2-selection--multiple + .select2-selection__choice { + margin: 0; + background-color: #eeeeee; + font-size: 11px; +} + +.mec-gCalendar-filters-wrap + .select2-container--default + .select2-selection--multiple + .select2-selection__rendered + li { + line-height: 29px; + margin-top: 5px; + border: none; + margin-right: 5px; +} + +.mec-gCalendar-filters-wrap .mec-searchbar-category-wrap { + margin: 0 !important; + width: 182px !important; + padding: 0 !important; + height: 40px !important; + border-radius: 0 3px 3px 0; + border: 1px solid #e3e4e5 !important; +} + +.mec-gCalendar-filters-wrap .mec-dropdown-search i, +.mec-gCalendar-filters-wrap .mec-minmax-event-cost i, +.mec-gCalendar-filters-wrap .mec-checkboxes-search i, +.mec-gCalendar-filters-wrap .mec-text-address-search i { + color: #b7b7b7; + background-color: #fbfbfb; + border-radius: 3px 0 0 3px; + border: 1px solid #e3e4e5; + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + border-right: 0; + text-align: center; +} + +.mec-gCalendar-filters-wrap .mec-minmax-event-cost input, +.mec-gCalendar-filters-wrap .mec-minmax-event-cost input:focus, +.mec-gCalendar-filters-wrap .mec-text-address-search input, +.mec-gCalendar-filters-wrap .mec-text-address-search input:focus { + width: 208px; + height: 40px; + border-radius: 0; + border-right: 0; + border-color: #e3e4e5; + font-size: 12px; + border-style: solid; + border-width: 1px; + padding-left: 15px; +} + +.mec-gCalendar-filters-wrap .mec-text-address-search input:focus, +.mec-gCalendar-filters-wrap .mec-text-address-search input { + width: 415px; +} + +.mec-gCalendar-filters-wrap .mec-minmax-event-cost input:last-child, +.mec-gCalendar-filters-wrap .mec-text-address-search input:focus, +.mec-gCalendar-filters-wrap .mec-text-address-search input { + border-right: 1px solid #e3e4e5; + border-radius: 0 3px 3px 0; + border-left: none; +} + +.mec-gCalendar .mec-gCalendar-filters-wrap .mec-text-address-search i { + border-right: 1px solid #e3e4e5; +} + +.mec-gCalendar-filters-wrap ul.list li[data-value=""] { + display: none; +} + +.mec-gCalendar .fc-h-event .fc-event-title, +.mec-gCalendar .fc .fc-scroller-liquid-absolute, +.mec-gCalendar .fc .fc-scroller-harness { + overflow: visible !important; +} + +.mec-gCalendar-filters:before, +#MonthPicker_mec-gCalendar-month-filter:before, +.mec-gCalendar-filters:after, +#MonthPicker_mec-gCalendar-month-filter:after { + content: ""; + display: block; + position: absolute; + left: 50%; + margin-left: 77px; + width: 0; + height: 0; + border-style: solid; + border-width: 7px; +} + +#MonthPicker_mec-gCalendar-month-filter:before, +#MonthPicker_mec-gCalendar-month-filter:after { + margin-left: 68px; +} + +.mec-gCalendar-filters:before, +#MonthPicker_mec-gCalendar-month-filter:before { + top: -15px; + border-color: transparent transparent #e3e9f1 transparent; +} + +.mec-gCalendar-filters:after, +#MonthPicker_mec-gCalendar-month-filter:after { + top: -14px; + border-color: transparent transparent #fff transparent; +} + +.mec-gCalendar { + font-family: inherit; +} + +.mec-gCalendar-tooltip { + width: 290px; + height: auto; + position: absolute; + background: #fff; + left: calc(50% - 145px); + bottom: calc(100% - 1px); + border: 1px solid #e3e4e5; + border-radius: 7px; + opacity: 1; + box-shadow: 0 4px 13px rgb(0 0 0 / 7%); + z-index: 9997; +} + +@media (max-width: 991px) { + .mec-gCalendar-tooltip { + display: none; + } +} + +.mec-gCalendar-tooltip-image img { + width: 100%; + border-radius: 3px !important; +} + +.mec-gCalendar-tooltip-image { + padding: 10px; + padding-bottom: 8px; +} + +.mec-gCalendar a.fc-event:active { + opacity: 1; +} + +.mec-gCalendar #mec-gCalendar-wrap a.fc-event { + padding: 7px 3px; + font-size: 12px; + font-weight: 400; +} + +.mec-gCalendar-tooltip-title { + color: #000; + line-height: 24px; + font-size: 15px; + padding: 10px 25px; + font-weight: 500; +} + +.mec-gCalendar-tooltip-title span { + width: 12px; + height: 12px; + display: inline-block; + margin-left: 7px; + vertical-align: middle; + border-radius: 50px; +} + +.mec-gCalendar-tooltip-title a { + color: #000; +} + +.mec-gCalendar-tooltip-title a:hover { + text-decoration: underline; + color: #000; +} + +.mec-gCalendar-tooltip-location { + color: #707172; + font-size: 12px; + font-weight: normal; + line-height: 23px; + padding: 0 25px 15px; + margin-top: -2px; +} + +.mec-gCalendar-tooltip-location i { + margin-right: 6px; + color: #c1c7ce; +} + +.mec-gCalendar .fc-event-time { + display: none; +} + +.mec-gCalendar-tooltip-date { + background: #f7f8f9; + color: #898a8c; + font-weight: 400; + padding: 10px 24px; + display: flex; + justify-content: space-between; + font-size: 12px; +} + +.mec-gCalendar-tooltip-date-text > div > span, +.mec-gCalendar-tooltip-date-time > div > span { + display: block; + line-height: 23px; +} + +.mec-gCalendar-tooltip-date-text > div > span:last-child, +.mec-gCalendar-tooltip-date-time > div > span:last-child { + margin: 0; +} + +.mec-gCalendar-tooltip-date-text .mec-gCalendar-tooltip-date-day { + font-size: 14px; + color: #000; +} + +.mec-gCalendar-tooltip-date-text, +.mec-gCalendar-tooltip-date-time { + display: flex; + align-items: baseline; +} + +.mec-gCalendar-tooltip-date-text i, +.mec-gCalendar-tooltip-date-time i { + margin-right: 8px; + color: #c1c7ce; +} + +.mec-gCalendar-tooltip:after, +.mec-gCalendar-tooltip:before { + content: ""; + display: block; + position: absolute; + left: calc(50% - 8px); + width: 0; + height: 0; + border-style: solid; + border-width: 8px; +} + +.mec-gCalendar-tooltip:before { + bottom: -17px; + border-color: #e3e9f1 transparent transparent transparent; +} + +.mec-gCalendar-tooltip:after { + bottom: -16px; + border-color: #fff transparent transparent transparent; +} + +#mec-gCalendar-wrap .openMonthFilter i { + -moz-transition: all 0.27s ease; + -webkit-transition: all 0.27s ease; + -o-transition: all 0.27s ease; + transition: all 0.27s ease; +} + +#mec-gCalendar-wrap .openMonthFilter.open i { + transform: rotate(-180deg); +} + +.mec-gCalendar input#mec-gCalendar-month-filter { + display: none; +} + +.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk, +.mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk + > div:not(#MonthPicker_mec-gCalendar-month-filter) { + display: flex; + align-items: center; + justify-content: space-between; +} + +.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk { + margin-bottom: 8px; +} + +.mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar { + border: 1px solid #e3e4e5; + border-radius: 7px; + padding: 18px 30px 10px; + position: relative; + flex-wrap: wrap; +} + +.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + font-size: 22px; + font-weight: 600; + line-height: 20px; + margin-right: 20px; + position: relative; +} + +.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title > span { + font-weight: 100; +} + +.mec-gCalendar h2.fc-toolbar-title i { + color: #a1a2a3; + cursor: pointer; + margin-left: 2px; + font-size: 14px; + margin-right: 0; +} + +.mec-gCalendar h2.fc-toolbar-title button { + background: transparent; + border: none; + cursor: pointer; + padding: 0; + outline: none; +} + +.mec-gCalendar table.fc-scrollgrid-sync-table tbody td { + border: none; + border-bottom: 1px solid #eee; + border-right: 1px solid #eee; +} + +.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary, +.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary { + background: #fff; + color: #a1a2a3; + border-radius: 7px 0 0 7px; + border-color: #e3e4e5; + padding: 3px 2px; + box-shadow: none !important; +} + +.mec-gCalendar button.fc-button span.fc-icon { + font-size: 20px; + padding: 1px 0; + width: 30px; + height: 34px; + vertical-align: middle; + position: relative; +} + +.mec-gCalendar-filters-wrap .nice-select .list { + margin: 0; + box-shadow: 0 0 0 1px rgb(68 68 68 / 11%), 0 2px 4px rgb(0 0 0 / 5%); +} + +.mec-gCalendar button.fc-button span.fc-icon:before { + vertical-align: middle; + font-size: 18px; + position: absolute; + top: calc(50% - 9px); + left: calc(50% - 9px); +} + +.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary { + border-right: none; +} + +.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary { + border-left: none; + border-radius: 0 7px 7px 0; +} + +.mec-gCalendar button.fc-prev-button.fc-button.fc-button-primary, +.mec-gCalendar button.fc-prev-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-next-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-next-button.fc-button.fc-button-primary { + background: #fff; + color: #a1a2a3; + border-right: none; + border-left: none; + border-radius: 0; + border-color: #e3e4e5; + padding: 3px 2px; + box-shadow: none !important; +} + +.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary { + background: #fff; + color: #707070; + border-left: none; + border-right: none; + border-radius: 0; + border-color: #e3e4e5; + font-size: 13px; + text-transform: capitalize; + font-weight: 400; + opacity: 1; + padding: 9px 8px 12px; + box-shadow: none !important; + cursor: pointer; + height: 42px; +} + +.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:disabled { + cursor: auto; +} + +.mec-gCalendar button.fc-button.fc-button-primary:hover span, +.mec-gCalendar button.fc-button.fc-button-primary:hover span { + background: #f4f5f6; + color: #000; + border-radius: 7px; +} + +.mec-gCalendar + button.fc-today-button.fc-button.fc-button-primary:not(:disabled):hover { + background: #f4f5f6; + color: #000; + border-radius: 0; +} + +.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary, +.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary { + min-width: 100px; + border-radius: 7px !important; + margin-right: 0; + background: #00acf8; + border: none !important; + padding: 10px 15px 11px; + font-size: 13px; + font-weight: 500; + margin-left: 20px !important; + box-shadow: none !important; +} + +.mec-gCalendar + tr.fc-scrollgrid-section.fc-scrollgrid-section-header.fc-scrollgrid-section-sticky + > td { + border-radius: 7px 7px 0 0; + border: none; +} + +.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary { + position: relative; + text-align: right; + padding-right: 13px; + padding-left: 32px; + min-width: auto; + background: none; + font-size: 14px; + color: #969798; + font-weight: 400; +} + +.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary:active, +.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary:hover { + background: #f4f5f6; + color: #000000; +} + +.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary svg { + position: absolute; + left: 10px; + top: 14px; +} + +.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary:hover { + background: #444; +} + +.mec-gCalendar-tooltip-location, +.mec-gCalendar-tooltip-title { + white-space: normal; +} + +.mec-gCalendar + #mec-gCalendar-wrap + .mec-gCalendar-search-text-wrap + input[type="text"], +.mec-gCalendar + #mec-gCalendar-wrap + .mec-gCalendar-search-text-wrap + input[type="text"]:focus { + margin: 0; + border: none; + box-shadow: none !important; + font-size: 14px; + font-weight: 400; + line-height: 20px; + color: #949aa1; + padding-right: 5px; + padding-left: 8px; + background: #fff; + outline: none; + display: inline-block; +} + +.mec-gCalendar + .mec-gCalendar-search-text-wrap + input[type="text"]::-webkit-input-placeholder { + /* Chrome/Opera/Safari */ + color: #949aa1; +} + +.mec-gCalendar + .mec-gCalendar-search-text-wrap + input[type="text"]::-moz-placeholder { + /* Firefox 19+ */ + color: #949aa1; +} + +.mec-gCalendar + .mec-gCalendar-search-text-wrap + input[type="text"]:-ms-input-placeholder { + /* IE 10+ */ + color: #949aa1; +} + +.mec-gCalendar + .mec-gCalendar-search-text-wrap + input[type="text"]:-moz-placeholder { + /* Firefox 18- */ + color: #949aa1; +} + +.mec-gCalendar-search-text-wrap { + border-left: 1px solid #e3e4e5; + padding-left: 16px; +} + +.mec-gCalendar-search-text-wrap i { + margin-right: 0; + color: #bcc4ce; + font-size: 17px; +} + +.mec-gCalendar .fc-direction-ltr .fc-button-group > .fc-button:first-child { + margin-left: 7px !important; +} + +.mec-gCalendar .fc-direction-ltr .fc-toolbar > * > :not(:first-child) { + margin-left: 0; +} + +.mec-gCalendar .mec-localtime-wrap { + color: #000; + font-size: 11px; + margin-top: 2px; + margin-bottom: 2px; +} + +.mec-gCalendar .fc-theme-standard .fc-popover { + background: #fff; + border: 1px solid #e3e4e5; + border-radius: 7px; + box-shadow: 0 4px 13px rgb(0 0 0 / 7%); +} + +.mec-gCalendar .mec-localtime-wrap i { + display: none; +} + +.mec-gCalendar .datepicker.dropdown-menu { + top: 51px !important; + left: unset !important; + right: 0; +} + +.mec-month-picker.datepicker.dropdown-menu { + position: absolute; + min-width: 215px !important; + z-index: 999; + background: #fff; + padding: 4px 0 3px; + margin: 0; + color: #000; + border: 1px solid #e3e4e5; + border-radius: 7px; + box-shadow: 0 3px 5px rgb(0 0 0 / 3%); +} + +.mec-month-picker.datepicker.dropdown-menu *, +.mec-month-picker.datepicker.dropdown-menu * { + background: #fff; + border-radius: 7px; + border: none; + height: auto; +} + +.mec-month-picker.datepicker table caption + thead tr:first-child td, +.mec-month-picker.datepicker table caption + thead tr:first-child th, +.mec-month-picker.datepicker table colgroup + thead tr:first-child td, +.mec-month-picker.datepicker table colgroup + thead tr:first-child th, +.mec-month-picker.datepicker table thead:first-child tr:first-child td, +.mec-month-picker.datepicker table thead:first-child tr:first-child th { + border: none; +} + +.mec-month-picker.datepicker table thead:first-child tr:first-child th.switch { + font-weight: 500; +} + +.mec-month-picker.datepicker table thead:first-child tr:first-child th.next, +.mec-month-picker.datepicker table thead:first-child tr:first-child th.prev { + font-size: 0; + padding-top: 11px; +} + +.mec-month-picker.datepicker + table + thead:first-child + tr:first-child + th.next:before, +.mec-month-picker.datepicker + table + thead:first-child + tr:first-child + th.prev:before { + content: "\e606"; + font-family: simple-line-icons; + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-size: 12px; + color: #a1a2a3; +} + +.mec-month-picker.datepicker + table + thead:first-child + tr:first-child + th.prev:before { + content: "\e605"; +} + +.mec-month-picker.datepicker table.table-condensed thead tr { + display: flex; + padding: 6px 12px 10px; + justify-content: space-between; + align-items: center; +} + +.mec-month-picker.datepicker thead tr:first-child th { + width: auto; + height: auto; +} + +.mec-month-picker.datepicker thead tr:first-child th.prev, +.mec-month-picker.datepicker thead tr:first-child th.next { + width: 34px; + height: 34px; + padding: 0 12px; +} + +.mec-month-picker.datepicker thead tr:first-child th.switch { + padding: 5px 18px; +} + +.mec-month-picker.datepicker table.table-condensed tbody tr td { + justify-content: space-between; + align-items: center; + padding: 0 9px 7px; + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: auto; +} + +.mec-month-picker.datepicker td span.active:hover, +.mec-month-picker.datepicker td span.active:focus, +.mec-month-picker.datepicker td span.active:active, +.mec-month-picker.datepicker td span.active.active, +.mec-month-picker.datepicker td span.active.disabled, +.mec-month-picker.datepicker td span.active[disabled] { + background-color: #00acf8; + text-shadow: none; +} + +.mec-month-picker.datepicker td span { + width: 43px; + line-height: 41px; + font-size: 14px; +} + +.mec-month-picker.datepicker thead tr:first-child th:hover { + background: #f4f5f6; +} + +.mec-month-picker.datepicker thead tr:first-child th:hover:before { + color: #000 !important; +} + +.mec-month-picker.datepicker td span:hover { + background-color: #f4f5f6; +} + +.mec-month-picker.datepicker:after { + left: unset; + right: 11px; +} + +.mec-month-picker.datepicker:before { + left: unset; + right: 10px; +} + +#gCalendar-loading { + width: 100%; + height: 100%; + background: no-repeat rgba(255, 255, 255, 0.88) url("../img/ajax-loader.gif") + center; + border-style: none; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 9; +} + +#gCalendar-loading.mec-modal-preloader { + display: block !important; +} + +.fc-daygrid.fc-dayGridMonth-view.fc-view { + overflow: auto; + border: 1px solid #e3e4e5; + border-radius: 7px; +} + +#mec-gCalendar-wrap table.fc-scrollgrid { + min-width: 650px; + overflow: auto; + border: none; + border-radius: unset; +} + +@media (min-width: 992px) { + #mec-gCalendar-wrap table.fc-scrollgrid, + .fc-daygrid.fc-dayGridMonth-view.fc-view { + overflow: visible; + } +} + +#mec-gCalendar-wrap table.fc-scrollgrid thead tr td { + border: none !important; + background: transparent; +} + +#mec-gCalendar-wrap table.fc-scrollgrid table { + margin-bottom: 0; +} + +#mec-gCalendar-wrap table.fc-scrollgrid tr th { + background: transparent; + padding: 20px 0 3px 10px; + text-align: left; + border-right: none !important; + border-left: none !important; + border-bottom: 1px solid #e3e4e5; + border-top: none; +} + +#mec-gCalendar-wrap table.fc-scrollgrid tr th.fc-col-header-cell { + border: none; +} + +#mec-gCalendar-wrap table.fc-scrollgrid tr th a { + font-size: 15px !important; + font-weight: 500 !important; + color: #000; + text-decoration: none; +} + +#mec-gCalendar-wrap .openMonthFilter { + position: relative; + padding: 7px 10px 2px; + display: inline-block; +} + +#mec-gCalendar-wrap.fc .fc-daygrid-day-number { + font-size: 16px; + padding: 12px 10px 2px; + color: #000; + text-decoration: none; +} + +#mec-gCalendar-wrap table.fc-scrollgrid-sync-table { + margin: 0; + border-spacing: 0; + border-collapse: separate; +} + +.mec-gCalendar table.fc-scrollgrid-sync-table tbody tr td:last-child { + border-right: none; +} + +.mec-gCalendar table.fc-scrollgrid-sync-table tbody tr:last-child td { + border-bottom: none; +} + +#mec-gCalendar-wrap span.mec-general-calendar-label { + color: #fff; + padding: 1px 4px 3px; + font-size: 11px; + border-radius: 3px; + margin: 5px 3px 2px 0; + display: inline-block; +} + +.mec-gCalendar .fc .fc-scrollgrid-section-sticky > * { + position: relative; + z-index: 1; +} + +.mec-gCalendar .fc-direction-ltr .fc-daygrid-event.fc-event-end, +.mec-gCalendar .fc-direction-rtl .fc-daygrid-event.fc-event-start, +.mec-gCalendar .fc-direction-ltr .fc-daygrid-event.fc-event-start, +.mec-gCalendar .fc-direction-rtl .fc-daygrid-event.fc-event-end { + margin-right: 0 !important; + margin-left: 0 !important; +} + +#mec-gCalendar-wrap table.fc-scrollgrid-sync-table tr td { + text-align: left; + background: #fff !important; +} + +#mec-gCalendar-wrap table.fc-scrollgrid-sync-table .fc-daygrid-day-top { + display: flex; + flex-direction: row; + padding-left: 10px; +} + +#mec-gCalendar-wrap .fc-daygrid-day.fc-day-today { + background: #fff !important; +} + +#mec-gCalendar-wrap .fc-daygrid-day.fc-day-today .fc-daygrid-day-number { + color: #00acf8; + font-size: 17px; + font-weight: 500; +} + +#mec-gCalendar-wrap .fc-scrollgrid-section-body > td { + border: none !important; +} + +#mec-gCalendar-wrap + table.fc-scrollgrid-sync-table + tbody + tr:last-child + td:first-child { + border-radius: 0 0 0 7px; +} + +#mec-gCalendar-wrap + table.fc-scrollgrid-sync-table + tbody + tr:last-child + td:last-child { + border-radius: 0 0 7px 0; +} + +.select2-container { + z-index: 99999999; +} + +@media (max-width: 1200px) { + .mec-gCalendar-search-text-wrap { + padding-left: 10px; + } + + .mec-gCalendar .mec-gCalendar-search-text-wrap input[type="text"], + .mec-gCalendar .mec-gCalendar-search-text-wrap input[type="text"]:focus { + width: 100px; + } +} + +@media (max-width: 991px) { + .mec-gCalendar .mec-gCalendar-search-text-wrap input[type="text"], + .mec-gCalendar .mec-gCalendar-search-text-wrap input[type="text"]:focus { + width: auto; + } + + .mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar { + display: block; + } + + .mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child { + margin: 0; + } + + .mec-gCalendar-search-text-wrap { + border-left: none; + } +} + +@media (max-width: 990px) { + .mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:first-child > div { + width: 100%; + justify-content: flex-start !important; + position: relative; + } + + .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + position: relative; + } +} + +@media (max-width: 480px) { + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary, + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active { + padding: 6px 6px 9px; + } + + .mec-gCalendar button.fc-button span.fc-icon { + font-size: 12px; + width: 20px; + height: 27px; + } + + .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + font-size: 17px; + margin-right: 11px; + } + + .mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk, + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk + > div:not(#MonthPicker_mec-gCalendar-month-filter) { + flex-wrap: wrap; + } + + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk:last-child + > div:not(#MonthPicker_mec-gCalendar-month-filter) { + width: 100%; + display: block; + } + + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk:last-child + > div.fc-button-group { + text-align: right; + } + + .mec-gCalendar-filters-wrap .mec-text-address-search input, + .mec-gCalendar-filters-wrap .mec-text-address-search input:focus { + width: 100%; + } + + .mec-gCalendar-filters-wrap > div { + width: 100%; + } + + .mec-gCalendar-filters-wrap .nice-select { + width: 100%; + } + + .mec-gCalendar-filters { + width: 328px; + right: calc(50% - 165px); + top: 52px; + } + + .mec-gCalendar-filters:after, + .mec-gCalendar-filters:before { + margin-left: 30px; + } + + .mec-gCalendar-filters-wrap .mec-minmax-event-cost input, + .mec-gCalendar-filters-wrap .mec-minmax-event-cost input:focus { + width: 116px; + } + + .mec-month-picker.datepicker:after { + left: unset; + right: 55px; + } + + .mec-month-picker.datepicker:before { + left: unset; + right: 54px; + } + + .mec-month-picker.datepicker.dropdown-menu { + top: 40px !important; + right: -45px; + } + + .mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar { + padding: 18px 10px; + } + + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary, + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active { + height: 35.5px; + } + + .mec-gCalendar-search-text-wrap { + border-left: 0; + border-bottom: 1px solid #eee; + padding: 0; + margin-bottom: 10px; + } + + .mec-gCalendar-filters:after, + .mec-gCalendar-filters:before { + margin: 0; + } +} + +@media (max-width: 360px) { + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk:last-child + > div.fc-button-group { + text-align: left; + } + + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk:last-child + > div:not(#MonthPicker_mec-gCalendar-month-filter) { + margin-bottom: 8px; + } + + .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + position: relative; + width: 100%; + } + + .mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:first-child > div { + justify-content: left !important; + } + + .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + font-size: 22px; + } + + .mec-gCalendar button.fc-button span.fc-icon { + font-size: 20px; + width: 30px; + height: 34px; + } + + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary, + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active { + padding: 9px 8px 12px; + } + + .mec-gCalendar-filters:after, + .mec-gCalendar-filters:before { + margin-left: -100px; + } + + .mec-gCalendar-filters { + top: 60px; + } + + .mec-month-picker.datepicker.dropdown-menu { + width: 215px; + } + + .mec-month-picker.datepicker.dropdown-menu { + top: 37px !important; + right: 27px; + } + + .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + font-size: 12px; + display: inline-block; + width: auto; + } + + #mec-gCalendar-wrap .openMonthFilter { + padding-right: 0; + } + + .mec-gCalendar button.fc-button span.fc-icon { + width: 20px; + height: 27px; + } + + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary, + .mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active { + line-height: 1; + } + + .mec-month-picker.datepicker.dropdown-menu { + right: -80px; + } + + .mec-month-picker.datepicker:after { + right: calc(50% - 3px); + } + + .mec-month-picker.datepicker:before { + right: calc(50% - 4px); + } + + .mec-gCalendar + .fc-header-toolbar + .fc-toolbar-chunk:last-child + > div.fc-button-group { + text-align: right; + } + + .mec-gCalendar-filters { + width: 300px; + right: calc(50% - 150px); + } + + .mec-gCalendar-filters-wrap { + padding: 15px; + } + + .fc-h-event .fc-event-main { + font-size: 9px; + line-height: 11px; + } +} + +/* MEC Cart */ +@media (max-width: 768px) { + .mec-cart { + overflow-x: scroll; + } +} + +.mec-cart-coupon input[type="text"] { + min-height: 40px; + font-size: 13px; + line-height: 38px; + color: #606367; + border: 1px solid #e3e5e7; + border-radius: 3px; + padding: 0 12px; + margin-bottom: 0; + box-shadow: unset; + width: 330px; + vertical-align: top; +} + +.mec-cart ul { + padding: 0; + list-style: none; +} + +.mec-cart ul h5, +.mec-cart ul h6 { + margin: 0; + font-size: 14px; + color: #000; + font-weight: inherit; +} + +.mec-cart ul h6 { + padding-left: 0; +} + +.mec-cart ul h6:before { + content: "— "; +} + +.mec-cart ul h5 { + font-weight: 400; + margin: 0 0 3px 0; +} + +.mec-cart ul h6:last-child { + margin-bottom: 12px; +} + +.mec-cart table td:nth-child(4) ul li { + margin-bottom: 5px; +} + +.mec-cart table td:nth-child(4) ul li:last-child { + margin-bottom: 12px; +} + +.mec-cart table a { + font-size: 15px; + font-weight: 400; + line-height: 20px; + color: #474849; + fill: #474849; +} + +.mec-cart table a:hover { + color: #000; +} + +.mec-cart table #mec_cart_total_payable, +.mec-cart table .mec-transaction-price { + font-size: 20px; + font-weight: 700; + line-height: 26px; + letter-spacing: -0.8px; + text-align: right; + color: #060607; + fill: #060607; +} + +.mec-cart table .mec-line-through { + text-decoration: line-through; +} + +.mec-cart table .mec-cart-remove-transactions svg:hover, +.mec-cart table .mec-cart-remove-transactions svg:hover path { + color: red !important; + fill: red !important; + cursor: pointer; +} + +.mec-cart table tr { + text-align: left; +} + +.mec-cart table tr th { + margin-bottom: 27px; + margin-top: 0; + padding: 9px 12px 9px; + font-size: 14px; + line-height: 1.8; + letter-spacing: 0; + font-weight: 600; + position: relative; + color: #000; +} + +.mec-cart table tr td { + padding: 9px 12px 9px; + font-size: 14px; + color: #000; +} + +.mec-cart table tr td a:hover { + color: #000; + text-decoration: underline; +} + +.mec-cart table tr td, +.mec-cart table tr th { + background-color: #fff !important; + border: 0 !important; + vertical-align: middle; +} + +.mec-cart table tr { + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +.mec-cart table tr th:last-child { + text-align: right; +} + +.mec-cart table tr { + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +.mec-cart table td:nth-child(1) { + width: 35px; + max-width: 35px; +} + +.mec-cart table td:nth-child(2) { + width: 135px; + max-width: 135px; +} + +.mec-cart table td:nth-child(3), +.mec-cart table td:nth-child(4) { + min-width: 200px; + width: 200px; +} + +.mec-cart table td:nth-child(5) { + font-size: 12px; +} + +.mec-cart table td:nth-child(6) { + text-align: right; + vertical-align: middle; +} + +.mec-cart .mec-cart-coupon-code { + font-size: 12px; + color: #8d9599; +} + +.mec-cart table thead tr th { + border-bottom: 1px solid #a3a3a3 !important; +} + +.mec-cart table thead tr, +.mec-cart table thead tr th { + border-top: none !important; +} + +@media only screen and (max-width: 992px) { + .mec-cart table { + min-width: 780px; + overflow-x: scroll; + } +} + +.mec-cart table tfoot tr th:last-child { + display: none; +} + +/* MEC Checkout */ +.mec-checkout .mec-checkout-list { + list-style: none; + padding: 0; + margin: 40px 0; + display: grid; + grid-template-columns: auto auto; + column-gap: 25px; + row-gap: 25px; + padding-bottom: 40px; + border-bottom: 1px solid #e6e6e6; +} + +.mec-checkout .mec-checkout-list .mec-list-items { + padding: 20px 30px; + background: #fff; + border: 1px solid #e6e6e6; + box-shadow: 0 2px 0 0 rgb(0 0 0 / 2%); +} + +.mec-checkout .mec-checkout-list .mec-list-items h3 { + margin-top: 20px; + margin-bottom: 12px; + font-size: 22px; + line-height: 27px; + letter-spacing: -0.4px; + font-weight: 700; + position: relative; +} + +.mec-checkout .mec-checkout-list .mec-list-items h5 { + font-size: 18px; + font-weight: 500; + padding-bottom: 5px; + display: inline; + color: #000; + margin: 0 0 8px 0; +} + +.mec-checkout .mec-checkout-list .mec-list-items h6 { + margin: 0; + font-size: 16px; + line-height: 23px; + color: #8d9599; + font-weight: inherit; +} + +.mec-checkout .mec-checkout-list .mec-list-items h6 { + padding-left: 0; +} + +.mec-checkout .mec-checkout-list .mec-list-items h6:before { + content: "— "; +} + +.mec-checkout .mec-checkout-list .mec-list-items ul { + list-style: none; + padding: 15px 0 0 0; +} + +.mec-checkout .mec-checkout-list .mec-list-items .mec-checkout-price-details { + color: #000; + border: none; + border-radius: 2px; + background: #f7f7f7; + padding: 15px; + margin: 15px 0 0 0; + max-width: 100%; +} + +.mec-checkout + .mec-checkout-list + .mec-list-items + .mec-checkout-price-details + li { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; +} + +.mec-checkout #mec_cart_total_payable { + margin: 0 0 40px 0; + font-size: 29px; + line-height: 27px; + letter-spacing: -0.4px; + font-weight: 700; + position: relative; + color: #39c36e; +} + +.mec-checkout .mec-gateway-comment { + margin-top: 20px; + margin: 0 0 20px 0; + color: #616161; + font-size: 14px; + line-height: 1.8; +} + +.mec-checkout .mec-email-stripe input[type="email"], +.mec-checkout .mec-name-stripe input[type="text"] { + box-sizing: border-box; + height: 40px; + padding: 10px 12px; + border: 0 !important; + border-radius: 4px; + background-color: #fff; + box-shadow: 0 1px 3px 0 #e6ebf1 !important; + -webkit-transition: box-shadow 150ms ease; + transition: box-shadow 150ms ease; + margin-bottom: 20px; + background: #fff !important; + max-width: 330px; +} + +.mec-checkout label { + color: #424242; + font-weight: 700; + font-size: 13px; + letter-spacing: 0; + margin: 0 0 4px 0; + display: block; + clear: none; + padding: 7px 1em 3px 0; +} + +.mec-checkout input[type="radio"]:before { + content: ""; + display: inline-block; + background: #fff; + border-radius: 24px; + width: 13px; + height: 13px; + cursor: pointer; + margin: 1px 0 0 0; + border: 1px solid #d7d8d9; +} + +.mec-checkout input[type="radio"]:checked:before { + border: 0; + background: #000; +} + +.mec-checkout input[type="radio"] { + margin: 0 4px 0 0; + font-size: 0; +} + +.mec-checkout input[type="checkbox"] { + float: left; +} + +.mec-checkout-gateways-wrapper { + max-width: 54%; + margin-bottom: 20px; +} + +@media (max-width: 768px) { + .mec-checkout-gateways-wrapper { + max-width: 100%; + margin-bottom: 20px; + } +} + +.mec-checkout .mec-book-form-next-button { + float: right; + right: 30%; + width: 155px; + text-align: center; +} + +.mec-checkout .mec-checkout-actions .mec-checkout-cart-link.button { + background-color: #c4cace !important; + width: 155px; + text-align: center; +} + +.mec-checkout .mec-book-form-next-button:hover, +.mec-checkout .mec-checkout-actions .mec-checkout-cart-link.button:hover { + background: #000 !important; +} + +@media (max-width: 768px) { + .mec-checkout .mec-checkout-list { + display: block; + padding-bottom: 20px; + } + + .mec-checkout .mec-checkout-list .mec-list-items { + margin-bottom: 20px; + padding: 15px; + } + + .mec-checkout-gateways-wrapper { + max-width: 100%; + margin-bottom: 20px; + } + + .mec-checkout .mec-book-form-next-button { + right: 0; + } +} + +.mec-checkout-footer { + background: #f5f6f7; + padding: 30px 40px 15px; + border-radius: 5px; +} + +.mec-checkout #mec_cart_total_payable { + margin: 0 0 15px; + font-size: 26px; + line-height: 1; + letter-spacing: -0.4px; + font-weight: 700; + position: relative; + color: #000000; +} + +/* MEC Checkbox Filter */ + +.mec-wrap .mec-simple-checkboxes-search { + display: table-cell; + float: none; + padding: 0 10px; +} + +.mec-wrap .mec-simple-checkboxes-search i { + font-size: 18px; + width: unset; + height: unset; + background: none; + border: none; + display: inline-block; + padding: 0; + margin-right: 10px; +} + +.mec-wrap .mec-simple-checkboxes-search label:not(.selectit) { + font-size: 14px; + font-weight: 600; + line-height: 20px; + color: #313131; + display: inline-block; + margin-bottom: 15px; +} + +.mec-wrap .mec-simple-checkboxes-search ul { + list-style: none; + padding: 0; +} + +.mec-wrap .mec-simple-checkboxes-search ul li label { + line-height: 20px; + margin-bottom: 15px; +} + +.mec-load-more-wrap.mec-load-more-scroll-loading { + width: 100%; + height: 100%; + background: no-repeat rgba(255, 255, 255, 0.88) url("../img/ajax-loader.gif") + bottom; + border-style: none; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 9; +} + +.mec-nextprev-wrap { + margin-top: 30px; + overflow: hidden; + clear: both; +} + +.mec-nextprev-next-button, +.mec-nextprev-prev-button { + margin-right: 0; +} + +.mec-nextprev-next-button { + float: right; + clear: both; +} + +a.mec-nextprev-next-button { + text-decoration: none !important; +} + +a.mec-nextprev-next-button:hover { + color: var(--mec-color-skin); +} + +.mec-nextprev-prev-button svg { + transform: rotate(180deg); +} + +.mec-loading-events:after { + content: ""; + background: rgba(255, 255, 255, 0.88) url("../img/ajax-loader.gif") no-repeat + center calc(100% - 100px); + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + margin: 0 -10px; +} + +.mec-credit-url { + font-size: 11px; + text-align: center; + color: #919293; +} + +.mec-credit-url a { + text-decoration: none; + color: #919293; +} + +body[class*="mec-theme"] .mec-wrap a { + text-decoration: auto; +} + +.mec-ticket-name-description-wrapper h4 { + margin: 0 0 5px 0; +} + +.mec-ticket-name-description-wrapper h4 .mec-ticket-attendee-counter, +.mec-ticket-name-description-wrapper h4 .mec-ticket-name { + font-size: 16px; + font-weight: 500; +} + +.gm-style img { + max-width: unset !important; +} + +.gm-style .gm-style-mtc button { + border-radius: 0 !important; +} + +/* FAQ Styles */ + +.mec-faq-list { + list-style: none; + padding: 0; +} + +.mec-faq-list .mec-faq-item { + border-bottom: 1px solid #d4d4d4; + position: relative; +} + +.mec-faq-list .mec-faq-item .mec-faq-toggle-icon { + font-size: 12px; + position: absolute; + right: 15px; + top: 32px; + z-index: 1; + cursor: pointer; + transition: 0.3s; +} + +.mec-faq-list .mec-faq-item.close .mec-faq-toggle-icon { + transform: rotate(180deg); +} + +.mec-faq-list .mec-faq-item .mec-faq-title { + padding: 25px 15px; +} + +.mec-faq-list .mec-faq-item .mec-faq-title h4 { + font-size: 19px; + font-weight: 700; + margin: 0; + position: relative; + white-space: nowrap; +} + +.mec-faq-list .mec-faq-item .mec-faq-title h4:after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 30%; + height: 100%; + background: rgb(0, 0, 0); + background: linear-gradient( + 90deg, + rgba(0, 0, 0, 0) 0%, + rgba(255, 255, 255, 1) 95%, + rgba(255, 255, 255, 1) 100% + ); + pointer-events: none; +} + +.mec-faq-list .mec-faq-item .mec-faq-content { + padding: 0 15px 5px; + max-height: 500px; + overflow: hidden; + -webkit-transition: max-height 0.5s linear; + -moz-transition: max-height 0.5s linear; + -ms-transition: max-height 0.5s linear; + -o-transition: max-height 0.5s linear; + transition: max-height 0.5s linear; +} + +.mec-faq-list .mec-faq-item.close .mec-faq-content { + max-height: 0; + overflow: hidden; +} + +.mec-faq-list .mec-faq-item .mec-faq-content p { + color: #6d8193; + font-size: 14px; + font-weight: 400; + line-height: 1.7em; + letter-spacing: 0.2px; +} + +/* FAQ Styles End */ + +/* Trailer Styles */ + +.mec-trailer iframe { + width: 100%; +} + +/* Trailer Styles End */ + +/* Banner Styles */ + +.single-mec-events { + overflow-x: hidden; +} + +.mec-event-banner { + width: calc(100vw - 17px); + position: relative; + margin-left: calc(-50vw - 10px); + left: calc(50% + 18px); + min-height: 420px; + padding: 80px 0; + text-align: center; + margin-bottom: 30px; +} + +.mec-event-banner-inner { + max-width: 900px; + margin: 0 auto; + min-height: 260px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: relative; + z-index: 1; +} + +.mec-event-banner-title .mec-single-title { + font-size: 46px; + font-weight: 700; + line-height: 1.1; + color: #fff; +} + +.mec-event-banner-datetime { + display: flex; + justify-content: center; + gap: 20px; + margin-bottom: 20px; +} + +.mec-event-banner-datetime .mec-single-event-date, +.mec-event-banner-datetime .mec-single-event-time, +.mec-event-banner-location .mec-single-event-location { + display: flex; + align-items: baseline; + margin: 0; + padding: 0; + color: #fff; +} + +.mec-event-banner-location .mec-single-event-location { + justify-content: center; + align-items: center; + gap: 16px; +} + +.mec-event-banner-location > i { + display: none; +} + +.mec-event-banner-location img { + max-width: 90px; + margin: 0; +} + +.mec-event-banner-location .mec-single-event-location dl { + display: flex; + align-items: baseline; + gap: 7px; + flex-direction: row; +} + +.mec-event-banner-location .mec-single-event-location img + dl { + flex-direction: column; +} + +.mec-event-banner-location .mec-single-event-location dl dd { + display: flex; + align-items: baseline; + gap: 5px; +} + +.mec-event-banner-location .mec-single-event-location dl dd * { + color: #fff; +} + +.mec-event-banner-location + .mec-single-event-location + dl + dd + address.mec-events-address { + font-size: 16px; + line-height: 1.5; +} + +.mec-event-banner-datetime .mec-single-event-date h3.mec-date, +.mec-event-banner-datetime .mec-single-event-time h3.mec-time, +.mec-event-banner-location .mec-single-event-location .mec-location { + display: none; +} + +.mec-event-banner-datetime .mec-single-event-date i, +.mec-event-banner-datetime .mec-single-event-time i { + margin-right: 5px; +} + +.mec-event-banner-datetime .mec-single-event-date dl dd, +.mec-event-banner-datetime .mec-single-event-time dl dd, +.mec-event-banner-location .mec-single-event-location dl dd { + margin: 0; +} + +.mec-event-banner-datetime .mec-single-event-time .mec-time-comment { + position: absolute; + top: 15px; + left: 20px; +} + +.mec-event-banner-datetime .mec-single-event-date { + position: static; +} + +.mec-event-banner-datetime .mec-single-event-date .mec-holding-status { + position: absolute; + bottom: 0; + color: #fff; + width: 100px; + padding: 0 5px; + border: 1px solid #fff; + border-radius: 5px; + left: calc(50% - 50px); +} + +.mec-event-banner-color { + width: calc(100vw - 17px); + height: 100%; + position: absolute; + top: 0; + z-index: 0; +} + +@media only screen and (max-width: 768px) { + .mec-event-banner { + width: 100vw; + position: relative; + margin-left: -50vw; + left: 50%; + } + + .mec-event-banner-color { + width: 100vw; + } + + .mec-event-banner-inner { + min-height: 400px; + max-width: 90%; + } + + .mec-event-banner-title .mec-single-title { + font-size: 36px; + } + + .mec-event-banner-datetime { + flex-direction: column; + align-items: center; + } + + .mec-event-banner-location .mec-single-event-location { + flex-direction: column; + align-items: center; + } + + .mec-event-banner-location .mec-single-event-location dl { + flex-direction: column; + align-items: center; + } +} + +/* Banner Styles End*/ + +/* Fix Twitter icon style */ +.mec-wrap li.mec-event-social-icon a > svg { + width: 36px; + height: 36px; + border-radius: 50%; + padding: 7px; + fill: #767676; + margin-right: 3px; +} + +.mec-wrap .mec-event-list-standard li.mec-event-social-icon a.twitter svg, +.mec-wrap .mec-event-grid-classic li.mec-event-social-icon a.twitter svg, +.mec-wrap .mec-event-grid-modern li.mec-event-social-icon a.twitter svg, +.mec-wrap .mec-event-grid-clean li.mec-event-social-icon a.twitter svg { + margin: 0; + padding: 0; + height: 36px; + width: 16px; + margin-bottom: -7px; +} + +.mec-event-list-modern .mec-event-sharing > li a { + display: flex; + align-items: center; +} + +.mec-event-list-modern .mec-event-sharing > li a svg { + border: 1px solid #ddd; +} + +.mec-event-list-modern .mec-event-sharing { + display: flex; + align-items: center; + flex-wrap: wrap; +} + +/* Add to calendar Styles*/ + +.mec-subscribe-to-calendar-container { + display: flex; + flex-direction: column; + align-items: end; +} + +.mec-wrap button.mec-subscribe-to-calendar-btn { + margin-bottom: 10px !important; + margin-right: 0 !important; + width: 180px; +} + +.mec-subscribe-to-calendar-items { + width: 180px; + padding: 5px 20px; + background: #fff; + border: 1px solid #e6e7e8; + border-radius: 3px; +} + +.mec-subscribe-to-calendar-items a { + font-size: 14px; + color: #8d8d8d; + display: block; + margin: 10px 0; + transition: 0.2s; +} + +.mec-subscribe-to-calendar-items a:hover { + color: var(--mec-color-skin); +} + +/* Add to calendar Styles End*/ + +/* Ticket Variations Shortcode */ + +.mec-booking-ticket-variations ul { + list-style: none; + padding: 0; +} + +.mec-booking-ticket-variations ul li { + margin-bottom: 20px; +} + +.mec-booking-ticket-variations ul li h5 { + font-size: 16px; + margin: 0; +} + +.mec-booking-ticket-variations ul li p { + margin: 0; +} + +/* Ticket Variations Shortcode End*/ + +/* RTL General Calendar */ +.rtl .mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar { + flex-direction: row; +} + +.rtl .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title { + margin-right: 0; + margin-left: 20px; +} + +.rtl .mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary { + border-right: 1px solid #e3e4e5; + border-left: none; + border-radius: 0 7px 7px 0; +} + +.rtl .mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary { + border-left: 1px solid #e3e4e5; + border-right: none; + border-radius: 7px 0 0 7px; +} + +.rtl .mec-gCalendar-search-text-wrap { + border-left: none; + border-right: 1px solid #e3e4e5; + padding-left: 0; + padding-right: 16px; +} + +.rtl .mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary { + text-align: left; + padding-right: 32px; + padding-left: 13px; +} + +.rtl + .mec-gCalendar + button.fc-filterEvents-button.fc-button.fc-button-primary + svg { + left: unset; + right: 10px; +} + +.rtl .mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary, +.rtl + .mec-gCalendar + button.fc-findEvents-button.fc-button.fc-button-primary:active, +.rtl .mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary { + margin-left: 0 !important; + margin-right: 20px !important; +} + +.rtl .mec-gCalendar-filters { + right: unset; + left: calc(50% - 119px); +} + +.rtl .mec-gCalendar-filters:before, +.rtl #MonthPicker_mec-gCalendar-month-filter:before, +.rtl .mec-gCalendar-filters:after, +.rtl #MonthPicker_mec-gCalendar-month-filter:after { + left: unset; + right: 50%; + margin-left: unset; + margin-right: 77px; +} + +.rtl .mec-gCalendar-filters-wrap .mec-dropdown-search i, +.rtl .mec-gCalendar-filters-wrap .mec-minmax-event-cost i, +.rtl .mec-gCalendar-filters-wrap .mec-checkboxes-search i, +.rtl .mec-gCalendar-filters-wrap .mec-text-address-search i { + border-right: 1px solid #e3e4e5; + border-left: 0; + border-radius: 0 3px 3px 0; +} + +.rtl .mec-gCalendar-filters-wrap .mec-minmax-event-cost input:last-child, +.rtl .mec-gCalendar-filters-wrap .mec-text-address-search input:focus, +.rtl .mec-gCalendar-filters-wrap .mec-text-address-search input { + border-left: 1px solid #e3e4e5; + border-radius: 3px 0 0 3px; + border-right: 1px solid #e3e4e5; +} + +.rtl .nice-select { + padding-left: 30px; + padding-right: 18px; + text-align: right !important; + border-radius: 3px 0 0 3px; +} + +.rtl .nice-select:after { + right: unset; + left: 15px; +} + +.rtl #mec-gCalendar-wrap table.fc-scrollgrid tr th { + text-align: right; + padding: 20px 10px 3px 0; +} + +.rtl #mec-gCalendar-wrap table.fc-scrollgrid-sync-table tr td { + text-align: right; +} + +.rtl .mec-gCalendar table.fc-scrollgrid-sync-table tbody td { + border-left: 1px solid #eee; + border-right: none; +} + +.rtl .mec-gCalendar-tooltip-date-text i, +.rtl .mec-gCalendar-tooltip-date-time i { + margin-right: 0; + margin-left: 8px; +} + +.rtl + .mec-month-picker.datepicker + table + thead:first-child + tr:first-child + th.prev:before { + content: "\e606"; +} + +.rtl + .mec-month-picker.datepicker + table + thead:first-child + tr:first-child + th.next:before { + content: "\e605"; +} + +/* --------------------- */ + +/* Dynamic CSS Start */ + +/* == Custom Fonts For H Tag +---------------- */ +.mec-hourly-schedule-speaker-name, +.mec-events-meta-group-countdown .countdown-w span, +.mec-single-event .mec-event-meta dt, +.mec-hourly-schedule-speaker-job-title, +.post-type-archive-mec-events h1, +.mec-ticket-available-spots .mec-event-ticket-name, +.tax-mec_category h1, +.mec-wrap h1, +.mec-wrap h2, +.mec-wrap h3, +.mec-wrap h4, +.mec-wrap h5, +.mec-wrap h6, +.entry-content .mec-wrap h1, +.entry-content .mec-wrap h2, +.entry-content .mec-wrap h3, +.entry-content .mec-wrap h4, +.entry-content .mec-wrap h5, +.entry-content .mec-wrap h6 { + font-family: var(--mec-heading-font-family), Helvetica, Arial, sans-serif; +} + +/* == Custom Fonts For P Tag +---------------- */ +.mec-single-event .mec-event-meta .mec-events-event-cost, +.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-value, +.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-name, +.mec-wrap .info-msg div, +.mec-wrap .mec-error div, +.mec-wrap .mec-success div, +.mec-wrap .warning-msg div, +.mec-breadcrumbs .mec-current, +.mec-events-meta-group-tags, +.lity-content .mec-events-meta-group-booking .mec-event-ticket-available, +.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available, +.mec-single-modern .mec-single-event-bar > div dd, +.mec-single-event .mec-event-meta dd, +.mec-single-event .mec-event-meta dd a, +.mec-next-occ-booking span, +.mec-hourly-schedule-speaker-description, +.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title, +.mec-single-event .mec-speakers-details ul li .mec-speaker-name, +.mec-event-data-field-items, +.mec-load-more-button, +.mec-events-meta-group-tags a, +.mec-events-button, +.mec-wrap abbr, +.mec-event-schedule-content dl dt, +.mec-breadcrumbs a, +.mec-breadcrumbs span .mec-event-content p, +.mec-wrap p { + font-family: var(--mec-paragraph-font-family), sans-serif; + font-weight: 300; +} + +/* == TextColors +---------------- */ +.mec-event-grid-minimal .mec-modal-booking-button:hover, +.mec-events-timeline-wrap .mec-organizer-item a, +.mec-events-timeline-wrap .mec-organizer-item:after, +.mec-events-timeline-wrap .mec-shortcode-organizers i, +.mec-timeline-event .mec-modal-booking-button, +.mec-wrap .mec-map-lightbox-wp.mec-event-list-classic .mec-event-date, +.mec-timetable-t2-col .mec-modal-booking-button:hover, +.mec-event-container-classic .mec-modal-booking-button:hover, +.mec-calendar-events-side .mec-modal-booking-button:hover, +.mec-event-grid-yearly .mec-modal-booking-button, +.mec-events-agenda .mec-modal-booking-button, +.mec-event-grid-simple .mec-modal-booking-button, +.mec-event-list-minimal .mec-modal-booking-button:hover, +.mec-timeline-month-divider, +.mec-wrap.colorskin-custom .mec-totalcal-box .mec-totalcal-view span:hover, +.mec-wrap.colorskin-custom + .mec-calendar.mec-event-calendar-classic + .mec-selected-day, +.mec-wrap.colorskin-custom .mec-color, +.mec-wrap.colorskin-custom + .mec-event-sharing-wrap + .mec-event-sharing + > li:hover + a, +.mec-wrap.colorskin-custom .mec-color-hover:hover, +.mec-wrap.colorskin-custom .mec-color-before *:before, +.mec-wrap.colorskin-custom + .mec-widget + .mec-event-grid-classic.owl-carousel + .owl-nav + i, +.mec-wrap.colorskin-custom .mec-event-list-classic a.magicmore:hover, +.mec-wrap.colorskin-custom .mec-event-grid-simple .mec-event-title:hover, +.mec-wrap.colorskin-custom + .mec-single-event + .mec-event-meta + dd.mec-events-event-categories:before, +.mec-wrap.colorskin-custom .mec-single-event-date:before, +.mec-wrap.colorskin-custom .mec-single-event-time:before, +.mec-wrap.colorskin-custom + .mec-events-meta-group.mec-events-meta-group-venue:before, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-previous-month + i, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-next-month:hover, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-previous-month:hover, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-next-month:hover, +.mec-wrap.colorskin-custom + .mec-calendar.mec-event-calendar-classic + dt.mec-selected-day:hover, +.mec-wrap.colorskin-custom .mec-infowindow-wp h5 a:hover, +.colorskin-custom .mec-events-meta-group-countdown .mec-end-counts h3, +.mec-calendar .mec-calendar-side .mec-next-month i, +.mec-wrap .mec-totalcal-box i, +.mec-calendar .mec-event-article .mec-event-title a:hover, +.mec-attendees-list-details .mec-attendee-profile-link a:hover, +.mec-wrap.colorskin-custom .mec-next-event-details li i, +.mec-next-event-details i:before, +.mec-marker-infowindow-wp .mec-marker-infowindow-count, +.mec-next-event-details a, +.mec-wrap.colorskin-custom .mec-events-masonry-cats a.mec-masonry-cat-selected, +.lity .mec-color, +.lity .mec-color-before :before, +.lity .mec-color-hover:hover, +.lity .mec-wrap .mec-color, +.lity .mec-wrap .mec-color-before :before, +.lity .mec-wrap .mec-color-hover:hover, +.leaflet-popup-content .mec-color, +.leaflet-popup-content .mec-color-before :before, +.leaflet-popup-content .mec-color-hover:hover, +.leaflet-popup-content .mec-wrap .mec-color, +.leaflet-popup-content .mec-wrap .mec-color-before :before, +.leaflet-popup-content .mec-wrap .mec-color-hover:hover, +.mec-calendar.mec-calendar-daily + .mec-calendar-d-table + .mec-daily-view-day.mec-daily-view-day-active.mec-color, +.mec-map-boxshow div .mec-map-view-event-detail.mec-event-detail i, +.mec-map-boxshow div .mec-map-view-event-detail.mec-event-detail:hover, +.mec-map-boxshow .mec-color, +.mec-map-boxshow .mec-color-before :before, +.mec-map-boxshow .mec-color-hover:hover, +.mec-map-boxshow .mec-wrap .mec-color, +.mec-map-boxshow .mec-wrap .mec-color-before :before, +.mec-map-boxshow .mec-wrap .mec-color-hover:hover, +.mec-choosen-time-message, +.mec-booking-calendar-month-navigation .mec-next-month:hover, +.mec-booking-calendar-month-navigation .mec-previous-month:hover, +.mec-yearly-view-wrap .mec-agenda-event-title a:hover, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year i, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year i, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year:hover, +.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year:hover, +.mec-av-spot .mec-av-spot-head .mec-av-spot-box span, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-previous-month:hover + .mec-load-month-link, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-side + .mec-next-month:hover + .mec-load-month-link, +.mec-yearly-view-wrap + .mec-yearly-title-sec + .mec-previous-year:hover + .mec-load-month-link, +.mec-yearly-view-wrap + .mec-yearly-title-sec + .mec-next-year:hover + .mec-load-month-link, +.mec-skin-list-events-container + .mec-data-fields-tooltip + .mec-data-fields-tooltip-box + ul + .mec-event-data-field-item + a, +.mec-wrap.mec-cart table tr td a, +.mec-marker-infowindow-wp .mec-marker-infowindow-count, +.mec-single-event .mec-speakers-details ul li .mec-speaker-name { + color: var(--mec-color-skin); +} + +.mec-event-list-standard .mec-event-meta svg path, +.mec-wrap .mec-event-sharing-wrap .mec-event-sharing > li:hover a svg { + fill: var(--mec-color-skin); +} + +/* == Backgrounds +----------------- */ +.mec-skin-carousel-container + .mec-event-footer-carousel-type3 + .mec-modal-booking-button:hover, +.mec-wrap.colorskin-custom + .mec-event-sharing + .mec-event-share:hover + .event-sharing-icon, +.mec-wrap.colorskin-custom .mec-event-grid-clean .mec-event-date, +.mec-wrap.colorskin-custom + .mec-event-list-modern + .mec-event-sharing + > li:hover + a + i, +.mec-wrap.colorskin-custom + .mec-event-list-modern + .mec-event-sharing + .mec-event-share:hover + .mec-event-sharing-icon, +.mec-wrap.colorskin-custom + .mec-event-list-modern + .mec-event-sharing + li:hover + a + i, +.mec-wrap.colorskin-custom + .mec-calendar:not(.mec-event-calendar-classic) + .mec-selected-day, +.mec-wrap.colorskin-custom .mec-calendar .mec-selected-day:hover, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-row + dt.mec-has-event:hover, +.mec-wrap.colorskin-custom .mec-calendar .mec-has-event:after, +.mec-wrap.colorskin-custom .mec-bg-color, +.mec-wrap.colorskin-custom .mec-bg-color-hover:hover, +.colorskin-custom .mec-event-sharing-wrap:hover > li, +.mec-wrap.colorskin-custom + .mec-totalcal-box + .mec-totalcal-view + span.mec-totalcalview-selected, +.mec-wrap .flip-clock-wrapper ul li a div div.inn, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected, +.event-carousel-type1-head .mec-event-date-carousel, +.mec-event-countdown-style3 .mec-event-date, +#wrap .mec-wrap article.mec-event-countdown-style1, +.mec-event-countdown-style1 .mec-event-countdown-part3 a.mec-event-button, +.mec-wrap .mec-event-countdown-style2, +.mec-map-get-direction-btn-cnt input[type="submit"], +.mec-booking button, +span.mec-marker-wrap, +.mec-wrap.colorskin-custom + .mec-timeline-events-container + .mec-timeline-event-date:before, +.mec-has-event-for-booking.mec-active .mec-calendar-novel-selected-day, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover, +.mec-ongoing-normal-label, +.mec-calendar .mec-has-event:after, +.mec-events-progress-bar progress:after, +.mec-events-progress-bar progress::-webkit-progress-value { + background-color: var(--mec-color-skin); +} + +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover, +.mec-calendar-day.mec-active + .mec-booking-tooltip.multiple-time + .mec-booking-calendar-date.mec-active { + background-color: var(--mec-color-skin); +} + +/* == BorderColors +------------------ */ +.mec-skin-carousel-container + .mec-event-footer-carousel-type3 + .mec-modal-booking-button:hover, +.mec-timeline-month-divider, +.mec-wrap.colorskin-custom + .mec-single-event + .mec-speakers-details + ul + li + .mec-speaker-avatar + a:hover + img, +.mec-wrap.colorskin-custom + .mec-event-list-modern + .mec-event-sharing + > li:hover + a + i, +.mec-wrap.colorskin-custom + .mec-event-list-modern + .mec-event-sharing + .mec-event-share:hover + .mec-event-sharing-icon, +.mec-wrap.colorskin-custom + .mec-event-list-standard + .mec-month-divider + span:before, +.mec-wrap.colorskin-custom .mec-single-event .mec-social-single:before, +.mec-wrap.colorskin-custom .mec-single-event .mec-frontbox-title:before, +.mec-wrap.colorskin-custom + .mec-calendar + .mec-calendar-events-side + .mec-table-side-day, +.mec-wrap.colorskin-custom .mec-border-color, +.mec-wrap.colorskin-custom .mec-border-color-hover:hover, +.colorskin-custom .mec-single-event .mec-frontbox-title:before, +.colorskin-custom .mec-single-event .mec-wrap-checkout h4:before, +.colorskin-custom + .mec-single-event + .mec-events-meta-group-booking + form + > h4:before, +.mec-wrap.colorskin-custom + .mec-totalcal-box + .mec-totalcal-view + span.mec-totalcalview-selected, +.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected, +.event-carousel-type1-head .mec-event-date-carousel:after, +.mec-wrap.colorskin-custom .mec-events-masonry-cats a.mec-masonry-cat-selected, +.mec-marker-infowindow-wp .mec-marker-infowindow-count, +.mec-wrap.colorskin-custom .mec-events-masonry-cats a:hover, +.mec-has-event-for-booking .mec-calendar-novel-selected-day, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover, +.mec-virtual-event-history h3:before, +.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover, +.mec-calendar-day.mec-active + .mec-booking-tooltip.multiple-time + .mec-booking-calendar-date.mec-active, +.mec-rsvp-form-box form > h4:before, +.mec-wrap .mec-box-title::before, +.mec-box-title::before, +.lity-content .mec-booking-progress-bar li.mec-active:after, +.mec-single-event .mec-frontbox-title:before, +.mec-single-event .mec-wrap-checkout h4:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout + h4:before, +.lity-content .mec-events-meta-group-booking form > h4:before, +.mec-single-event .mec-events-meta-group-booking form > h4:before, +.mec-events-meta-group-booking .mec-booking-shortcode form > h4:before, +.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4:before, +.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout + h4:before { + border-color: var(--mec-color-skin); +} + +.mec-wrap.colorskin-custom .mec-event-countdown-style3 .mec-event-date:after, +.mec-wrap.colorskin-custom .mec-month-divider span:before, +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day, +.mec-calendar.mec-event-container-simple dl dt.mec-selected-day:hover { + border-bottom-color: var(--mec-color-skin); +} + +.mec-wrap.colorskin-custom + article.mec-event-countdown-style1 + .mec-event-countdown-part2:after { + border-color: transparent transparent transparent var(--mec-color-skin); +} + +.mec-wrap .button, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button), +.mec-wrap input[type="submit"], +.mec-wrap input[type="reset"], +.mec-wrap input[type="button"], +.lity-content .button, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button), +.lity-content input[type="submit"], +.lity-content input[type="reset"], +.lity-content input[type="button"], +.lity-content input[type="submit"], +.mec-nextprev-next-button, +.mec-nextprev-prev-button, +.mec-form-row .mec-book-form-next-button.mec-book-form-pay-button { + color: var(--mec-color-skin); + background: var(--mec-color-skin-rgba-1); + border-color: var(--mec-color-skin-rgba-1); +} + +.mec-wrap .button:hover, +.mec-wrap a.button:hover, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover, +.mec-wrap input[type="submit"]:hover, +.mec-wrap input[type="reset"]:hover, +.mec-wrap input[type="button"]:hover, +.lity-content .button:hover, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover, +.lity-content input[type="submit"]:hover, +.lity-content input[type="reset"]:hover, +.lity-content input[type="button"]:hover, +.lity-content input[type="submit"]:hover, +.mec-nextprev-next-button:hover, +.mec-nextprev-prev-button:hover { + border-color: var(--mec-color-skin); +} + +.mec-single-event + .mec-events-meta-group-booking + input[type="radio"]:checked:before, +.mec-events-meta-group-booking + .mec-booking-shortcode + input[type="radio"]:checked:before, +.lity-container + .mec-events-meta-group-booking + input[type="radio"]:checked:before { + background: var(--mec-color-skin); + box-shadow: 0 0 0 2px var(--mec-color-skin-rgba-1); +} + +.mec-wrap .button svg path, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ) + svg + path, +.mec-wrap input[type="submit"] svg path, +.mec-wrap input[type="reset"] svg path, +.mec-wrap input[type="button"] svg path, +.lity-content .button svg path, +.lity-content + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ) + svg + path, +.lity-content input[type="submit"] svg path, +.lity-content input[type="reset"] svg path, +.lity-content input[type="button"] svg path, +.mec-nextprev-next-button svg path, +.mec-nextprev-prev-button svg path { + fill: var(--mec-color-skin); +} + +.mec-wrap .button svg.back path, +.mec-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.et-fb-button) + svg.back + path { + fill: #636f72; +} + +.mec-booking-calendar-month-navigation .mec-previous-month:hover a, +.mec-booking-calendar-month-navigation .mec-next-month:hover a { + color: var(--mec-color-skin); +} + +/* == BoxShadow +------------------ */ +.mec-wrap.colorskin-custom .mec-box-shadow-color { + box-shadow: 0 4px 22px -7px var(--mec-color-skin); +} + +/* == Timeline View +------------------ */ +.mec-timeline-event .mec-modal-booking-button, +.mec-events-timeline-wrap:before, +.mec-wrap.colorskin-custom .mec-timeline-event-local-time, +.mec-wrap.colorskin-custom .mec-timeline-event-time, +.mec-wrap.colorskin-custom .mec-timeline-event-location, +.mec-wrap.colorskin-custom .mec-timeline-event-organizer, +.mec-wrap.colorskin-custom .mec-timeline-event-categories, +.mec-choosen-time-message { + background: var(--mec-color-skin-rgba-4); +} + +/* == Render Container Normal Width +------------------ */ +@media only screen and (min-width: 1200px) { + .mec-container, + body [id*="mec_skin_"].mec-fluent-wrap { + width: var(--mec-container-normal-width); + max-width: var(--mec-container-normal-width); + } +} + +/* == Render Container Large Width +------------------ */ +@media only screen and (min-width: 1921px) { + .mec-container, + body [id*="mec_skin_"].mec-fluent-wrap { + width: var(--mec-container-large-width); + max-width: var(--mec-container-large-width); + } +} + +/* == Advanced Color Options (shortcodes) +------------------ */ +.mec-wrap h1 a, +.mec-wrap h2 a, +.mec-wrap h3 a, +.mec-wrap h4 a, +.mec-wrap h5 a, +.mec-wrap h6 a, +.entry-content .mec-wrap h1 a, +.entry-content .mec-wrap h2 a, +.entry-content .mec-wrap h3 a, +.entry-content .mec-wrap h4 a, +.entry-content .mec-wrap h5 a, +.entry-content .mec-wrap h6 a, +.mec-wrap .mec-calendar .mec-event-article .mec-event-title a, +.mec-wrap .mec-event-grid-simple .mec-event-title a, +.mec-wrap .mec-event-grid-modern .mec-event-title a, +.mec-wrap .mec-event-grid-minimal .mec-event-title a, +.mec-wrap .mec-event-grid-clean .mec-event-title a, +.mec-wrap .mec-event-grid-classic .mec-event-title a, +.mec-wrap .mec-event-list-standard .mec-event-title a, +.mec-wrap .mec-wrap .mec-event-list-modern .mec-event-title a, +.mec-wrap .mec-event-list-minimal .mec-event-title a, +.mec-wrap .mec-event-list-classic .mec-event-title a { + color: var(--mec-title-color); +} + +.mec-wrap.colorskin-custom h1 a:hover, +.mec-wrap.colorskin-custom h2 a:hover, +.mec-wrap.colorskin-custom h3 a:hover, +.mec-wrap.colorskin-custom h4 a:hover, +.mec-wrap.colorskin-custom h5 a:hover, +.mec-wrap.colorskin-custom h6 a:hover, +.entry-content .mec-wrap.colorskin-custom h1 a:hover, +.entry-content .mec-wrap.colorskin-custom h2 a:hover, +.entry-content .mec-wrap.colorskin-custom h3 a:hover, +.entry-content .mec-wrap.colorskin-custom h4 a:hover, +.entry-content .mec-wrap.colorskin-custom h5 a:hover, +.entry-content .mec-wrap.colorskin-custom h6 a:hover, +.mec-wrap .mec-calendar .mec-event-article .mec-event-title a:hover, +.mec-wrap .mec-event-grid-simple .mec-event-title a:hover, +.mec-wrap .mec-event-grid-modern .mec-event-title a:hover, +.mec-wrap .mec-event-grid-minimal .mec-event-title a:hover, +.mec-wrap .mec-event-grid-clean .mec-event-title a:hover, +.mec-wrap .mec-event-grid-classic .mec-event-title a:hover, +.mec-wrap .mec-event-list-standard .mec-event-title a:hover, +.mec-wrap .mec-wrap .mec-event-list-modern .mec-event-title a:hover, +.mec-wrap .mec-event-list-minimal .mec-event-title a:hover, +.mec-wrap .mec-event-list-classic .mec-event-title a:hover { + color: var(--mec-title-color-hover); +} + +.mec-wrap.colorskin-custom .mec-event-description { + color: var(--mec-content-color); +} + +/* == FES Main Color +------------------ */ +.mec-fes-form #mec_bfixed_form_field_types .button:before, +.mec-fes-form #mec_reg_form_field_types .button:before, +.mec-fes-form #mec_bfixed_form_field_types .button, +.mec-fes-form #mec_reg_form_field_types .button, +.mec-fes-form + #mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button, +.mec-fes-form .mec-meta-box-fields h4, +.mec-fes-form .mec-meta-box-fields h4 label, +.mec-fes-form .html-active .switch-html, +.mec-fes-form .tmce-active .switch-tmce, +.mec-fes-form .wp-editor-tabs .wp-switch-editor:active, +.mec-fes-form .mec-form-row .button:not(.wp-color-result), +.mec-fes-form .mec-title span.mec-dashicons, +.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small, +.mec-fes-list ul li a:hover, +.mec-fes-form input[type="file"], +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .mec-booking-attendees-tooltip:before { + color: var(--mec-fes-main-color); +} + +.mec-fes-form #mec_reg_form_field_types .button.red:hover, +.mec-fes-form #mec_reg_form_field_types .button:hover, +.mec-fes-list ul li .mec-fes-event-export a:hover, +.mec-fes-list ul li .mec-fes-event-view a:hover, +.mec-fes-list ul li .mec-fes-event-edit a:hover, +.mec-fes-form button[type="submit"].mec-fes-sub-button, +.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover, +.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small:hover { + background: var(--mec-fes-main-color); + color: #fff; +} + +.mec-fes-form #mec_reg_form_field_types .button.red:hover, +.mec-fes-form #mec_bfixed_form_fields input[type="checkbox"]:hover, +.mec-fes-form #mec_bfixed_form_fields input[type="radio"]:hover, +.mec-fes-form #mec_reg_form_fields input[type="checkbox"]:hover, +.mec-fes-form #mec_reg_form_fields input[type="radio"]:hover, +.mec-fes-form input[type="checkbox"]:hover, +.mec-fes-form input[type="radio"]:hover, +.mec-fes-form #mec_reg_form_field_types .button:hover, +.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover, +.mec-fes-list ul li .mec-fes-event-export a:hover, +.mec-fes-list ul li .mec-fes-event-view a:hover, +.mec-fes-list ul li .mec-fes-event-edit a:hover, +.mec-fes-form input[type="file"], +.mec-fes-form + .mec-attendees-wrapper + .mec-attendees-list + .w-clearfix:first-child { + border-color: var(--mec-fes-main-color); +} + +.mec-fes-form button[type="submit"].mec-fes-sub-button { + box-shadow: 0 2px 8px -4px var(--mec-fes-main-color); +} + +.mec-fes-form button[type="submit"].mec-fes-sub-button:hover { + box-shadow: 0 2px 12px -2px var(--mec-fes-main-color); +} + +.mec-fes-form #mec_bfixed_form_fields input[type="checkbox"]:checked, +.mec-fes-form #mec_bfixed_form_fields input[type="radio"]:checked, +.mec-fes-form #mec_reg_form_fields input[type="checkbox"]:checked, +.mec-fes-form #mec_reg_form_fields input[type="radio"]:checked, +.mec-fes-form .mec-form-row input[type="checkbox"]:checked, +.mec-fes-form .mec-form-row input[type="radio"]:checked { + box-shadow: 0 1px 6px -2px var(--mec-fes-main-color) inset 0 0 0 3px #fff; + border-color: var(--mec-fes-main-color); + background: var(--mec-fes-main-color); +} + +.mec-fes-form .mec-available-color-row span.color-selected { + box-shadow: 0 0 0 2px var(--mec-fes-main-color), + 0 2px 8px -1px var(--mec-fes-main-color); +} + +.mec-fes-form + #mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button, +.mec-fes-form .mce-tinymce.mce-container.mce-panel, +.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover { + box-shadow: 0 2px 6px -3px var(--mec-fes-main-color); +} + +.mec-fes-form, +.mec-fes-list, +.mec-fes-form .html-active .switch-html, +.mec-fes-form .tmce-active .switch-tmce, +.mec-fes-form .wp-editor-tabs .wp-switch-editor:active, +.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix { + background: var(--mec-fes-main-color-rgba-1); +} + +.mec-fes-form .mec-meta-box-fields h4, +.mec-fes-form .quicktags-toolbar, +.mec-fes-form div.mce-toolbar-grp { + background: var(--mec-fes-main-color-rgba-2); +} + +.mec-fes-form ul#mec_bfixed_form_fields li, +.mec-fes-form ul#mec_reg_form_fields li, +.mec-fes-form ul#mec_bfixed_form_fields li, +.mec-fes-form ul#mec_reg_form_fields li { + background: var(--mec-fes-main-color-rgba-3); +} + +.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-listbox, +.mec-fes-form ul#mec_bfixed_form_fields li, +.mec-fes-form ul#mec_reg_form_fields li, +.mec-fes-form ul#mec_bfixed_form_fields li, +.mec-fes-form ul#mec_reg_form_fields li, +.mec-fes-form #mec_bfixed_form_fields input[type="checkbox"], +.mec-fes-form #mec_bfixed_form_fields input[type="radio"], +.mec-fes-form #mec_reg_form_fields input[type="checkbox"], +.mec-fes-form #mec_reg_form_fields input[type="radio"], +.mec-fes-form input[type="checkbox"], +.mec-fes-form input[type="radio"], +.mec-fes-form #mec-event-data input[type="date"], +.mec-fes-form input[type="email"], +.mec-fes-form input[type="number"], +.mec-fes-form input[type="password"], +.mec-fes-form input[type="tel"], +.mec-fes-form input[type="text"], +.mec-fes-form input[type="url"], +.mec-fes-form select, +.mec-fes-form textarea, +.mec-fes-list ul li, +.mec-fes-form .quicktags-toolbar, +.mec-fes-form div.mce-toolbar-grp, +.mec-fes-form .mce-tinymce.mce-container.mce-panel, +.mec-fes-form + #mec_meta_box_tickets_form + [id^="mec_ticket_row"] + .mec_add_price_date_button, +.mec-fes-form #mec_bfixed_form_field_types .button, +.mec-fes-form #mec_reg_form_field_types .button, +.mec-fes-form .mec-meta-box-fields, +.mec-fes-form .wp-editor-tabs .wp-switch-editor, +.mec-fes-form .mec-form-row .button:not(.wp-color-result) { + border-color: var(--mec-fes-main-color-rgba-4); +} + +.mec-fes-form #mec-event-data input[type="date"], +.mec-fes-form input[type="email"], +.mec-fes-form input[type="number"], +.mec-fes-form input[type="password"], +.mec-fes-form input[type="tel"], +.mec-fes-form input[type="text"], +.mec-fes-form input[type="url"], +.mec-fes-form select, +.mec-fes-form textarea { + box-shadow: 0 2px 5px var(--mec-fes-main-color-rgba-5) inset; +} + +.mec-fes-list ul li, +.mec-fes-form .mec-form-row .button:not(.wp-color-result) { + box-shadow: 0 2px 6px -4px var(--mec-fes-main-color-rgba-6); +} + +.mec-fes-form #mec_bfixed_form_field_types .button, +.mec-fes-form #mec_reg_form_field_types .button, +.mec-fes-form .mec-meta-box-fields { + box-shadow: 0 2px 6px -3px var(--mec-fes-main-color-rgba-6); +} + +.mec-fes-form .quicktags-toolbar, +.mec-fes-form div.mce-toolbar-grp { + box-shadow: 0 1px 0 1px var(--mec-fes-main-color-rgba-6); +} + +.mec-fes-form #mec_bfixed_form_fields input[type="checkbox"], +.mec-fes-form #mec_bfixed_form_fields input[type="radio"], +.mec-fes-form #mec_reg_form_fields input[type="checkbox"], +.mec-fes-form #mec_reg_form_fields input[type="radio"], +.mec-fes-form input[type="checkbox"], +.mec-fes-form input[type="radio"] { + box-shadow: 0 1px 3px -1px var(--mec-fes-main-color-rgba-6); +} + +/* == Fluent Colors +------------------ */ + +/* MAIN COLOR */ +.mec-fluent-wrap .mec-more-events-icon, +.mec-single-fluent-wrap .mec-next-event-details a, +.mec-fluent-wrap.colorskin-custom .mec-color-before *:before, +.mec-single-fluent-wrap .mec-marker-infowindow-wp .mec-marker-infowindow-count, +.mec-single-fluent-wrap .mec-single-event-organizer dd i, +.mec-single-fluent-wrap .mec-single-event-additional-organizers dd i, +.mec-single-fluent-wrap .mec-next-event-details i:before, +.mec-single-fluent-wrap .mec-next-event-details i:before, +.mec-single-fluent-wrap .mec-single-event-location i, +.mec-single-fluent-wrap + .mec-single-event-organizer + dd.mec-organizer-description:before, +.mec-single-fluent-wrap + .mec-single-event-additional-organizers + dd.mec-organizer-description:before, +.mec-single-fluent-wrap + .mec-event-schedule-content + dl + dt.mec-schedule-time:before, +.mec-single-fluent-wrap + .mec-event-schedule-content + dl + dt.mec-schedule-time:before, +.mec-single-fluent-wrap .mec-single-event-bar > div i, +.mec-single-fluent-wrap .mec-single-event-category a, +.mec-fluent-wrap + .mec-daily-view-events-left-side + .mec-daily-view-events-item + > span.mec-time, +.mec-fluent-wrap + .mec-daily-view-events-left-side + .mec-daily-view-events-item + > span.mec-time-end, +.mec-fluent-wrap + .mec-calendar.mec-calendar-daily + .mec-calendar-d-table.mec-date-labels-container + span, +.mec-fluent-wrap .mec-calendar .mec-week-events-container dl > span, +.mec-fluent-current-time-text, +.mec-fluent-wrap.mec-timetable-wrap .mec-cell .mec-time, +.mec-fluent-wrap.mec-skin-masonry-container .mec-events-masonry-cats a:hover, +.mec-fluent-wrap.mec-skin-masonry-container + .mec-events-masonry-cats + a.mec-masonry-cat-selected, +.mec-fluent-wrap .mec-date-details i:before, +.mec-fluent-wrap .mec-event-location i:before, +.mec-fluent-wrap .mec-event-carousel-type2 .owl-next i, +.mec-fluent-wrap .mec-event-carousel-type2 .owl-prev i, +.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i, +.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i, +.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next, +.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev, +.mec-fluent-wrap .mec-date-wrap i, +.mec-fluent-wrap + .mec-calendar.mec-yearly-calendar + .mec-calendar-table-head + dl + dt:first-letter, +.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing li:hover a, +.mec-fluent-wrap .mec-agenda-event > i, +.mec-fluent-wrap .mec-totalcal-box .nice-select:after, +.mec-fluent-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-fluent-wrap .mec-totalcal-box input, +.mec-fluent-wrap .mec-totalcal-box select, +.mec-fluent-wrap .mec-totalcal-box .nice-select, +.mec-fluent-wrap .mec-totalcal-box .nice-select .list li, +.mec-fluent-wrap .mec-text-input-search i, +.mec-fluent-wrap .mec-event-location i, +.mec-fluent-wrap .mec-event-article .mec-event-title a:hover, +.mec-fluent-wrap .mec-date-details:before, +.mec-fluent-wrap .mec-time-details:before, +.mec-fluent-wrap .mec-venue-details:before, +.mec-fluent-wrap .mec-price-details i:before, +.mec-fluent-wrap .mec-available-tickets-details i:before, +.mec-single-fluent-wrap .mec-local-time-details li:first-child:before, +.mec-single-fluent-wrap .mec-local-time-details li:nth-of-type(2):before, +.mec-single-fluent-wrap .mec-local-time-details li:last-child:before, +.mec-single-fluent-wrap .mec-events-meta-group-countdown .mec-end-counts h3 { + color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap + .mec-totalcal-box + input[type="search"]::-webkit-input-placeholder { + color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-totalcal-box input[type="search"]::-moz-placeholder { + color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-totalcal-box input[type="search"]:-ms-input-placeholder { + color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-totalcal-box input[type="search"]:-moz-placeholder { + color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap + .mec-calendar.mec-event-calendar-classic + dl + dt.mec-table-nullday, +.mec-single-fluent-body .lity-content input::-moz-placeholder, +.mec-single-fluent-body .lity-content textarea::-moz-placeholder, +.mec-single-fluent-wrap input::-moz-placeholder, +.mec-single-fluent-wrap textarea::-moz-placeholder { + color: var(--mec-fluent-main-color-rgba-1); +} + +.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-social-icon i, +.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:hover { + color: var(--mec-fluent-main-color-rgba-2); +} + +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type4 + .mec-booking-button:hover, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type3 + .mec-booking-button:hover, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type1 + .mec-booking-button:hover { + color: var(--mec-fluent-main-color); +} + +/* BORDER COLOR */ +/* list view */ +.mec-fluent-wrap.mec-skin-list-wrap .mec-event-article { + border-top-color: var(--mec-fluent-main-color); + border-left-color: var(--mec-fluent-main-color); + border-bottom-color: var(--mec-fluent-main-color); +} + +/* list view */ +.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article .mec-event-content { + border-right-color: var(--mec-fluent-main-color); + border-left-color: var(--mec-fluent-main-color); + border-bottom-color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article .mec-event-image { + border-right-color: var(--mec-fluent-main-color); + border-left-color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top, +.mec-single-fluent-wrap .mec-next-event-details a:hover, +.mec-single-fluent-wrap .mec-event-schedule-content dl:before, +.mec-single-fluent-wrap .mec-event-schedule-content dl:first-of-type:after, +.mec-single-fluent-wrap .mec-event-schedule-content dl, +.mec-single-fluent-wrap + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a:hover, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week, +.mec-fluent-wrap + .mec-calendar.mec-event-calendar-classic + .mec-calendar-table-head, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-year-container, +.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda-wrap, +.mec-fluent-wrap .mec-totalcal-box .mec-totalcal-view span, +.mec-fluent-wrap .mec-totalcal-box input, +.mec-fluent-wrap .mec-totalcal-box select, +.mec-fluent-wrap .mec-totalcal-box .nice-select, +.mec-fluent-wrap .mec-load-more-button:hover, +.mec-fluent-wrap .mec-skin-monthly-view-month-navigator-container, +.mec-fluent-wrap .mec-calendar-a-month, +.mec-fluent-wrap .mec-yearly-title-sec, +.mec-fluent-wrap .mec-filter-content, +.mec-fluent-wrap i.mec-filter-icon, +.mec-fluent-wrap .mec-text-input-search input[type="search"], +.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing, +.mec-fluent-wrap .mec-load-month, +.mec-fluent-wrap .mec-load-year { + border-color: var(--mec-fluent-main-color); +} + +.mec-fluent-current-time-first, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-load-week, +.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:first-of-type { + border-left-color: var(--mec-fluent-main-color); +} + +.mec-fluent-current-time-last, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week, +.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:last-of-type { + border-right-color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-more-events, +.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl:last-of-type dt, +.mec-fluent-wrap.mec-skin-full-calendar-container + > .mec-totalcal-box + .mec-totalcal-view + .mec-fluent-more-views-content:before, +.mec-fluent-wrap .mec-filter-content:before { + border-bottom-color: var(--mec-fluent-main-color); +} + +.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing:before { + border-color: var(--mec-fluent-main-color) transparent transparent transparent; +} + +.mec-fluent-wrap.mec-timetable-wrap .mec-cell, +.mec-fluent-wrap .mec-event-meta { + border-left-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap .mec-daily-view-events-left-side, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-calendar-sec { + border-right-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap.mec-events-agenda-container .mec-agenda-events-wrap { + border-left-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap dt .mec-more-events .simple-skin-ended:hover, +.mec-fluent-wrap .mec-more-events .simple-skin-ended:hover, +.mec-fluent-wrap.mec-skin-slider-container + .mec-slider-t1 + .mec-slider-t1-content, +.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda { + border-top-color: var(--mec-fluent-main-color-rgba-3); + border-bottom-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap .mec-calendar.mec-calendar-daily .mec-calendar-d-table, +.mec-fluent-wrap.mec-timetable-wrap .mec-ttt2-title, +.mec-fluent-wrap.mec-timetable-wrap .mec-cell, +.mec-fluent-wrap.mec-skin-countdown-container .mec-date-wrap { + border-bottom-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap .mec-skin-daily-view-events-container, +.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a, +.mec-single-fluent-wrap .mec-marker-infowindow-wp .mec-marker-infowindow-count, +.mec-single-fluent-wrap .mec-events-meta-group-countdown .countdown-w .block-w, +.mec-single-fluent-wrap .mec-events-meta-group-booking .nice-select, +.mec-single-fluent-wrap .mec-next-event-details a, +.mec-single-fluent-wrap .mec-events-meta-group, +.mec-single-fluent-wrap .mec-events-meta-group-tags a, +.mec-single-fluent-wrap + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a, +.mec-fluent-wrap .mec-skin-weekly-view-events-container, +.mec-fluent-wrap .mec-calendar .mec-week-events-container dt, +.mec-fluent-wrap.mec-timetable-wrap .mec-timetable-t2-wrap, +.mec-fluent-wrap .mec-event-countdown li, +.mec-fluent-wrap .mec-event-countdown-style3 .mec-event-countdown li, +.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-agenda-event, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar, +.mec-fluent-wrap .mec-load-more-button, +.mec-fluent-wrap .mec-totalcal-box .nice-select .list, +.mec-fluent-wrap .mec-filter-content i, +.mec-single-fluent-wrap .mec-event-schedule, +.mec-single-fluent-wrap + .mec-map-get-direction-address-cnt + input.mec-map-get-direction-address, +.mec-single-fluent-wrap .mec-single-links-wrap { + border-color: var(--mec-fluent-main-color-rgba-1); +} + +.mec-fluent-wrap .mec-totalcal-box .nice-select:after { + border-right-color: var(--mec-fluent-main-color); + border-bottom-color: var(--mec-fluent-main-color); +} + +/* BOXSHADOW */ +.mec-fluent-wrap .mec-totalcal-box .nice-select .list, +.mec-single-fluent-wrap .mec-booking-button, +.mec-single-fluent-wrap .mec-events-meta-group-tags a:hover { + box-shadow: 0 2px 5px var(--mec-fluent-main-color-rgba-4); +} + +.mec-fluent-wrap .mec-booking-button:hover, +.mec-fluent-wrap .mec-load-more-button:hover, +.mec-fluent-bg-wrap .mec-fluent-wrap article .mec-booking-button:hover { + box-shadow: 0 4px 10px var(--mec-fluent-main-color-rgba-4); +} + +.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article, +.mec-single-fluent-wrap .mec-next-event-details a:hover, +.mec-single-fluent-wrap + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a:hover { + box-shadow: 0 4px 10px var(--mec-fluent-main-color-rgba-5); +} + +.mec-single-fluent-wrap + .mec-events-meta-group-booking + input[type="radio"]:checked:before { + box-shadow: 0 0 0 2px var(--mec-fluent-main-color-rgba-4); +} + +.mec-fluent-wrap .mec-skin-daily-view-events-container, +.mec-fluent-wrap.mec-timetable-wrap .mec-timetable-t2-wrap, +.mec-fluent-wrap .mec-calendar-side .mec-calendar-table, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-year-container, +.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda-wrap { + box-shadow: 0 5px 33px var(--mec-fluent-main-color-rgba-1); +} + +.mec-fluent-wrap .mec-yearly-view-wrap .mec-agenda-event { + box-shadow: 0 1px 6px var(--mec-fluent-main-color-rgba-6); +} + +/* BACKGROUND */ +/* filter options */ +.mec-fluent-wrap .nicescroll-cursors, +.mec-single-fluent-wrap .mec-related-event-post .mec-date-wrap, +.mec-single-fluent-wrap .mec-next-event-details a:hover, +.mec-single-fluent-wrap .mec-events-meta-group-tags a:hover, +.mec-single-fluent-wrap + .mec-event-export-module.mec-frontbox + .mec-event-exporting + .mec-export-details + ul + li + a:hover, +.mec-fluent-wrap dt .mec-more-events .simple-skin-ended:hover, +.mec-fluent-wrap .mec-more-events .simple-skin-ended:hover, +.mec-fluent-wrap.mec-skin-countdown-container .mec-date-wrap, +.mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-agenda-sec, +.mec-fluent-wrap .mec-calendar-daily .mec-calendar-day-events, +.mec-fluent-wrap .mec-totalcal-box .nice-select .list li:hover, +.mec-fluent-wrap .mec-totalcal-box .nice-select .list li.focus, +.mec-single-fluent-wrap .mec-single-event-category a { + background-color: var(--mec-fluent-main-color-rgba-3); +} + +.mec-fluent-wrap h5.mec-more-events-header, +.mec-fluent-current-time, +.mec-single-fluent-wrap .flip-clock-wrapper ul li a div div.inn { + background-color: var(--mec-fluent-main-color); +} + +.mec-single-fluent-body .lity-content .mec-events-meta-group-booking, +.mec-fluent-wrap.mec-skin-cover-container .mec-date-wrap i, +.mec-fluent-wrap.mec-skin-carousel-container + .mec-event-carousel-type2 + .owl-next:hover, +.mec-fluent-wrap.mec-skin-carousel-container + .mec-event-carousel-type2 + .owl-prev:hover, +.mec-fluent-wrap.mec-skin-slider-container + .mec-slider-t1-wrap + .mec-owl-theme + .owl-nav + .owl-next:hover, +.mec-fluent-wrap.mec-skin-slider-container + .mec-slider-t1-wrap + .mec-owl-theme + .owl-nav + .owl-prev:hover, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top dt.active, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week, +.mec-fluent-wrap.mec-skin-full-calendar-container + > .mec-totalcal-box + .mec-totalcal-view + span.mec-fluent-more-views-icon.active, +.mec-fluent-wrap.mec-skin-full-calendar-container + > .mec-totalcal-box + .mec-totalcal-view + span.mec-totalcalview-selected, +.mec-fluent-wrap i.mec-filter-icon.active, +.mec-fluent-wrap .mec-filter-content i, +.mec-single-fluent-wrap .mec-events-meta-group-countdown, +.mec-single-event-bar-seperator { + background-color: var(--mec-fluent-main-color-rgba-1); +} + +/* MAIN BOLD COLOR - SECOND COLOR */ +.mec-fluent-wrap + .mec-daily-view-events-left-side + h5.mec-daily-today-title + span:first-child, +.mec-single-fluent-wrap .mec-events-meta-group-tags .mec-event-footer a:hover, +.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover, +.mec-single-fluent-wrap + .mec-related-event-post + .mec-date-wrap + span.mec-event-day-num, +.mec-single-fluent-wrap .mec-single-event-category a:hover, +.mec-fluent-wrap.mec-skin-available-spot-container + .mec-date-wrap + span.mec-event-day-num, +.mec-fluent-wrap.mec-skin-cover-container .mec-date-wrap span.mec-event-day-num, +.mec-fluent-wrap.mec-skin-countdown-container + .mec-date-wrap + span.mec-event-day-num, +.mec-fluent-wrap.mec-skin-carousel-container + .event-carousel-type2-head + .mec-date-wrap + span.mec-event-day-num, +.mec-fluent-wrap.mec-skin-slider-container + .mec-date-wrap + span.mec-event-day-num, +.mec-fluent-wrap.mec-skin-masonry-container + .mec-masonry + .mec-date-wrap + span.mec-event-day-num, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top dt.active, +.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week, +.mec-fluent-wrap + .mec-calendar.mec-event-calendar-classic + .mec-calendar-table-head + dt.active, +.mec-fluent-wrap .mec-color, +.mec-fluent-wrap a:hover, +.mec-wrap .mec-color-hover:hover, +.mec-fluent-wrap.mec-skin-full-calendar-container + > .mec-totalcal-box + .mec-totalcal-view + span.mec-totalcalview-selected, +.mec-fluent-wrap .mec-load-more-button, +.mec-fluent-wrap .mec-load-month i, +.mec-fluent-wrap .mec-load-year i, +.mec-fluent-wrap i.mec-filter-icon, +.mec-fluent-wrap .mec-filter-content i, +.mec-fluent-wrap .mec-event-sharing-wrap > li:first-of-type i, +.mec-fluent-wrap + .mec-available-tickets-details + span.mec-available-tickets-number { + color: var(--mec-fluent-bold-color); +} + +/* BORDER BOLD COLOR - SECOND COLOR */ +.mec-fluent-wrap.mec-skin-carousel-container + .mec-owl-theme + .owl-dots + .owl-dot.active + span, +.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover, +.mec-fluent-wrap .mec-load-month, +.mec-fluent-wrap .mec-load-year, +.mec-single-fluent-body + .lity-content + .mec-events-meta-group-booking + .mec-book-available-tickets-details + > .mec-book-available-tickets-details-header, +.mec-single-fluent-wrap + .mec-events-meta-group-booking + .mec-book-available-tickets-details + > .mec-book-available-tickets-details-header { + border-color: var(--mec-fluent-bold-color); +} + +.mec-fluent-wrap .mec-calendar .mec-daily-view-day.mec-has-event:after, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type4 + .mec-booking-button, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type3 + .mec-booking-button, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type1 + .mec-booking-button, +.mec-fluent-wrap + .mec-event-cover-fluent-type2 + .mec-event-sharing-wrap:hover + > li:first-child, +.mec-fluent-wrap.mec-skin-cover-container + .mec-event-cover-fluent-type2 + .mec-date-wrap, +.mec-fluent-wrap.mec-skin-carousel-container + .mec-owl-theme + .owl-dots + .owl-dot.active + span, +.mec-single-fluent-body .lity-content .mec-events-meta-group-booking button, +.mec-fluent-wrap.mec-single-fluent-wrap .mec-events-meta-group-booking button, +.mec-single-fluent-wrap + .mec-events-meta-group-booking + input[type="radio"]:checked:before { + background-color: var(--mec-fluent-bold-color); +} + +/* BACKGROUND HOVER COLOR */ +.mec-fluent-wrap + .mec-yearly-view-wrap + .mec-calendar.mec-yearly-calendar + .mec-has-event:after, +.mec-fluent-wrap .mec-load-more-button:hover, +.mec-fluent-wrap .mec-load-month:hover, +.mec-fluent-wrap .mec-load-year:hover, +.mec-fluent-wrap .mec-booking-button:hover, +.mec-wrap.mec-single-fluent-wrap .button:hover, +.mec-wrap.mec-single-fluent-wrap + button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( + .owl-next + ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover, +.mec-wrap.mec-single-fluent-wrap input[type="submit"]:hover, +.mec-wrap.mec-single-fluent-wrap input[type="reset"]:hover, +.mec-wrap.mec-single-fluent-wrap input[type="button"]:hover { + background-color: var(--mec-fluent-bg-hover-color); +} + +/* BACKGROUND COLOR */ +.mec-fluent-wrap { + background-color: var(--mec-fluent-bg-color); +} + +/* BACKGROUND SECOND BACKGROUND COLOR */ +.mec-fluent-wrap.mec-skin-masonry-container .mec-masonry .mec-date-wrap, +.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover, +.mec-fluent-wrap .mec-filter-content { + background-color: var(--mec-fluent-second-bg-color); +} + +.mec-fluent-wrap .mec-filter-content:after { + border-bottom-color: var(--mec-fluent-second-bg-color); +} + +/* Dynamic CSS End */ + +/* Saga theme compatibility */ + +@media only screen and (min-width: 1200px) { + .mec-theme-saga .mec-container, + body [id*="mec_skin_"].mec-fluent-wrap { + width: inherit; + max-width: inherit; + } +} + +.mec-theme-saga .mec-wrap h1, +.mec-theme-saga .mec-wrap h2, +.mec-theme-saga .mec-wrap h3, +.mec-theme-saga .mec-wrap h4, +.mec-theme-saga .mec-wrap h5, +.mec-theme-saga .mec-wrap h6 { + text-align: inherit; +} + +.mec-theme-saga .mec-wrap h1:after, +.mec-theme-saga .mec-wrap h2:after, +.mec-theme-saga .mec-wrap h3:after, +.mec-theme-saga .mec-wrap h4:after, +.mec-theme-saga .mec-wrap h5:after, +.mec-theme-saga .mec-wrap h6:after, +.mec-theme-saga .mec-gCalendar h1:after, +.mec-theme-saga .mec-gCalendar h2:after, +.mec-theme-saga .mec-gCalendar h3:after, +.mec-theme-saga .mec-gCalendar h4:after, +.mec-theme-saga .mec-gCalendar h5:after, +.mec-theme-saga .mec-gCalendar h6:after { + display: none; +} + +.mec-theme-saga .mec-wrap a img { + opacity: 1; + padding: 0; + border: none; + -webkit-transition: unset; + -moz-transition: unset; + -o-transition: unset; + transition: unset; + background: none; + border-color: unset; +} + +.mec-theme-saga .mec-wrap input[type="number"], +.mec-theme-saga .mec-wrap input[type="date"], +.mec-theme-saga .mec-wrap input[type="datetime"], +.mec-theme-saga .mec-wrap input[type="datetime-local"], +.mec-theme-saga .mec-wrap input[type="email"], +.mec-theme-saga .mec-wrap input[type="month"], +.mec-theme-saga .mec-wrap input[type="password"], +.mec-theme-saga .mec-wrap input[type="search"], +.mec-theme-saga .mec-wrap input[type="tel"], +.mec-theme-saga .mec-wrap input[type="text"], +.mec-theme-saga .mec-wrap input[type="time"], +.mec-theme-saga .mec-wrap input[type="url"], +.mec-theme-saga .mec-wrap input[type="week"], +.mec-theme-saga .mec-wrap textarea, +.mec-theme-saga .mec-wrap select { + opacity: 1; + -webkit-transition: unset; + -moz-transition: unset; + -o-transition: unset; + transition: unset; +} + +.mec-theme-saga .mec-wrap ul, +.mec-theme-saga .mec-wrap ol { + margin: 0; +} + +.mec-theme-saga .mec-wrap dl, +.mec-theme-saga .mec-wrap dt { + margin: 0; +} + +.mec-theme-saga .mec-single-event { + padding-top: 15px; +} + +.mec-theme-saga .mec-single-event .mec-frontbox-title, +.mec-theme-saga .mec-single-event .mec-wrap-checkout h4, +.mec-theme-saga + .lity-content + .mec-events-meta-group-booking + .mec-wrap-checkout + h4, +.mec-theme-saga + .mec-single-event + .mec-events-meta-group-booking + .mec-wrap-checkout + h4, +.mec-theme-saga + .mec-events-meta-group-booking + .mec-booking-shortcode + .mec-wrap-checkout + h4, +.mec-theme-saga .lity-content .mec-events-meta-group-booking form > h4, +.mec-single-event .mec-events-meta-group-booking form > h4, +.mec-theme-saga + .mec-events-meta-group-booking + .mec-booking-shortcode + form + > h4 { + text-align: center; +} + +/* Saga theme compatibility End*/ + +/* Fix banner */ +.mec-event-banner-inner .mec-single-event-location > i { + display: none; +} + +/* Single builder content load more */ + +span.load-more-text { + text-decoration: underline; + margin-left: 5px; + cursor: pointer; + position: relative; +} + +span.load-more-text:before { + content: ""; + width: 100px; + height: 24px; + position: absolute; + top: 0; + right: calc(100% + 5px); + background-image: linear-gradient(90deg, #0000 0%, #fff 100%); + z-index: 1; +} + +.mec-event-meta img.mec-custom-image-icon { + width: 20px; +} diff --git a/assets/css/frontend.min.css b/assets/css/frontend.min.css new file mode 100755 index 0000000..84b1567 --- /dev/null +++ b/assets/css/frontend.min.css @@ -0,0 +1 @@ +.mec-wrap{position:relative}.entry-content .mec-wrap h1,.entry-content .mec-wrap h2,.entry-content .mec-wrap h3,.entry-content .mec-wrap h4,.entry-content .mec-wrap h5,.entry-content .mec-wrap h6,.mec-wrap h1,.mec-wrap h2,.mec-wrap h3,.mec-wrap h4,.mec-wrap h5,.mec-wrap h6{color:#171c24;font-weight:300;font-style:inherit;letter-spacing:normal;clear:none}.mec-wrap h1{font-size:50px;line-height:1.16;margin-bottom:12px;letter-spacing:-1px}.mec-wrap h2{font-size:36px;line-height:1.14;margin-bottom:10px}.mec-wrap h3{font-size:28px;line-height:1.2;margin-bottom:8px}.mec-wrap h4{font-size:24px;line-height:1.2;margin-bottom:10px}.mec-wrap h5{font-size:18px;line-height:1.3;margin-bottom:7px}.mec-wrap h6{font-size:16px;line-height:1.3;margin-bottom:4px}.mec-wrap .subheader{color:#849098}.mec-wrap h1 strong{font-weight:700}.mec-wrap :not(.elementor-widget-container)>p{margin:0 0 20px 0;color:#616161;font-size:14px;line-height:1.8}.mec-wrap .read-more-text p span.more-text{display:none}.mec-wrap .mec-event-article .mec-color-hover{box-shadow:none;border:none}.mec-wrap abbr,.mec-wrap acronym{cursor:auto;border:none}.entry-content .mec-wrap a{box-shadow:none}.mec-single-event-description.mec-events-content ol li,.mec-single-event-description.mec-events-content ul li{color:#616161;font-size:14px;line-height:1.8;font-weight:300}.lity-content .button,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button),.lity-content input[type=button],.lity-content input[type=reset],.lity-content input[type=submit],.mec-nextprev-next-button,.mec-nextprev-prev-button,.mec-wrap .button,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button),.mec-wrap input[type=button],.mec-wrap input[type=reset],.mec-wrap input[type=submit]{position:relative;border:1px solid #ccecf4;border-radius:4px;box-shadow:0 1px 0 0 #fcfcfc;color:#07bbe9;display:inline-block;font-size:14px;line-height:18px;text-transform:capitalize;font-weight:600;text-decoration:none;cursor:pointer;margin-bottom:20px;margin-right:10px;padding:10px 24px 10px;background:#ecf9fd;-webkit-transition:all .21s ease;-moz-transition:all .21s ease;transition:all .21s ease}.lity-content .button:hover,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):hover,.lity-content input[type=button]:hover,.lity-content input[type=reset]:hover,.lity-content input[type=submit]:hover,.mec-wrap .button:hover,.mec-wrap a.button:hover,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):hover,.mec-wrap input[type=button]:hover,.mec-wrap input[type=reset]:hover,.mec-wrap input[type=submit]:hover{border:1px solid #38d5ed;box-shadow:0 1px 0 0 #fafafa}.lity-content .button svg,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.et-fb-button) svg,.lity-content input[type=button] svg,.lity-content input[type=reset] svg,.lity-content input[type=submit] svg,.mec-nextprev-next-button svg,.mec-nextprev-prev-button svg,.mec-wrap .button svg,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.et-fb-button) svg,.mec-wrap input[type=button] svg,.mec-wrap input[type=reset] svg,.mec-wrap input[type=submit] svg{margin-left:30px}.mec-wrap .button svg.back,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.et-fb-button) svg.back{margin-right:30px;margin-left:0}.mec-booking-form-container button{display:block}.vertical-space,.vertical-space1,.vertical-space2,.vertical-space3,.vertical-space4,.vertical-space5{display:block;width:100%;margin:0;clear:both;border:0 none;height:20px}.vertical-space2{height:40px}.vertical-space3{height:60px}.vertical-space4{height:80px}.vertical-space5{height:100px}@media only screen and (max-width:479px){.vertical-space,.vertical-space1{height:8px}.vertical-space2{height:14px}.vertical-space3{height:28px}.vertical-space4{height:40px}.vertical-space5{height:60px}}@media only screen and (max-width:960px){.vertical-space,.vertical-space1{height:12px}.vertical-space2{height:18px}.vertical-space3{height:36px}.vertical-space4{height:50px}.vertical-space5{height:80px}}.mec-wrap abbr{cursor:auto;border-bottom:0}@-webkit-keyframes rotating{from{-ms-transform:rotate(0);-moz-transform:rotate(0);-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}to{-ms-transform:rotate(360deg);-moz-transform:rotate(360deg);-webkit-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotating{from{-ms-transform:rotate(0);-moz-transform:rotate(0);-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}to{-ms-transform:rotate(360deg);-moz-transform:rotate(360deg);-webkit-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.mec-wrap{font:14px/25px;font-weight:400;color:#626262}.mec-wrap .mec-events a{border-bottom:none}.mec-wrap .mec-container a{box-shadow:none}.mec-event-content p{font-weight:300}.mec-wrap .mec-clear:after,.mec-wrap .mec-clear:before{content:" ";display:table}.mec-wrap .mec-clear:after{clear:both}.mec-events-button{background:#fff;padding:12px 28px;font-size:15px;font-weight:400;letter-spacing:0;border:1px solid #e3e3e3;border-radius:2px;text-shadow:none;margin-right:10px;box-shadow:0 2px 0 0 rgb(0 0 0 / 3%);transition:.3s}.mec-wrap .mec-events-button:hover{color:#fff}.mec-no-event{display:none}#mec-active-current{display:block}.current-hide #mec-active-current{display:none!important}.mec-event-grid-classic .mec-event-article{position:relative;border:2px solid #e3e3e3;box-shadow:0 2px 0 0 rgba(0,0,0,.016);margin-bottom:30px;max-width:none}.mec-event-grid-classic .mec-event-content{color:#767676;padding:0 20px 5px;text-align:center;min-height:125px}.mec-event-grid-classic .mec-event-title{color:#202020;margin:10px 0;font-weight:700;font-size:20px;letter-spacing:1px;text-transform:uppercase}.mec-event-grid-classic .mec-event-title a{color:#202020;transition:all .24s ease}.mec-event-grid-classic .mec-event-date{font-weight:400;font-size:11px;text-transform:uppercase;letter-spacing:1px;color:#fff;padding:3px 20px;margin:0 -20px 20px -20px;text-align:center}.widget_mec_mec_widget .mec-event-grid-classic .mec-event-date{margin:0}.mec-event-grid-classic .mec-event-content p{font-size:15px;color:#8a8a8a}.mec-event-grid-classic .mec-event-content .mec-grid-event-location{margin:0;font-size:12px;font-weight:400;line-height:16px}.mec-event-grid-classic .mec-event-detail{display:none}.mec-event-grid-classic .mec-price-details{font-size:12px;font-weight:400}.mec-event-grid-classic img{margin-bottom:0;width:100%}.mec-event-footer{position:relative;border-top:1px solid #efefef;padding:20px;min-height:80px;margin:0;background:#fafafa}.mec-event-sharing-wrap{left:15px;position:absolute;list-style:none;margin:0;padding-left:0}.mec-event-sharing-wrap .mec-event-sharing{position:absolute;padding:8px 0 2px;left:-6px;bottom:54px;margin:0;margin-top:6px;border-radius:5px;min-width:50px;visibility:hidden;opacity:0;border:1px solid #e2e2e2;background:#fff;box-shadow:0 0 9px 0 rgba(0,0,0,.06);z-index:99;-webkit-transition:all .18s ease;transition:all .18s ease}.mec-event-sharing-wrap .mec-event-sharing:after,.mec-event-sharing-wrap .mec-event-sharing:before{content:"";display:block;position:absolute;bottom:-10px;left:50%;margin-left:-10px;width:0;height:0;border-style:solid;border-width:10px}.mec-event-sharing-wrap .mec-event-sharing:before{bottom:-21px;border-color:#e2e2e2 transparent transparent transparent}.mec-event-sharing-wrap .mec-event-sharing:after{bottom:-19px;border-color:#fff transparent transparent transparent}.mec-event-sharing-wrap:hover .mec-event-sharing{opacity:1;visibility:visible}.mec-event-sharing-wrap li{text-align:center;border:0;display:block;margin-right:2px;overflow:hidden;margin:0 auto 6px;width:38px}.mec-event-sharing-wrap li.mec-event-share{height:38px}.mec-event-sharing-wrap:hover>li{cursor:pointer;background-color:#40d9f1}.mec-event-sharing-wrap:hover li a{color:#fff}.mec-event-sharing-wrap>li:first-of-type{border:1px solid #d9d9d9}.mec-event-sharing-wrap li a,.mec-event-sharing-wrap:hover li ul li a{border:none;color:#767676;display:block}.mec-event-sharing-wrap li a .mec-social-title{padding-right:10px;display:none}.mec-event-sharing-wrap li i{width:36px;height:36px;display:table-cell;vertical-align:middle}.mec-event-sharing-wrap li svg{height:16px}.mec-event-sharing-wrap .mec-event-sharing li a{display:block}.mec-event-sharing-wrap .mec-event-sharing li:hover a{color:#40d9f1}.mec-event-sharing .mec-event-share:hover .event-sharing-icon{background:#40d9f1;border-width:0 1px 0;cursor:pointer}.mec-event-sharing .mec-event-map{border-width:1px 0 1px}.mec-event-footer .mec-booking-button{box-shadow:none;transition:all .21s ease;font-size:11px;font-weight:500;letter-spacing:1px;text-transform:uppercase;background:#fff;color:#767676;border:1px solid #e8e8e8;position:absolute;top:20px;right:15px;padding:0 16px;line-height:37px;height:38px;border-radius:2px}.mec-event-footer .mec-booking-button:hover{background:#191919;color:#fff;border-color:#191919}@media only screen and (max-width:960px){.mec-event-grid-classic{margin-bottom:30px}}.mec-widget .mec-event-grid-classic.mec-owl-carousel{padding:36px 0 16px}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav{margin:5px 0;width:100%;position:absolute;top:15px;padding:0}.mec-skin-grid-container.mec-widget{padding-top:18px}.mec-widget .mec-event-grid-classic.mec-owl-carousel{padding:20px 0 16px}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav{margin:0;width:100%;position:absolute;top:0;padding:0}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav div{position:absolute;background:#fff;line-height:0;width:34px;height:26px;padding:6px;text-align:center;margin-top:-17px;border-radius:3px;border:1px solid #e2e2e2;text-align:center;box-shadow:0 2px 0 0 rgba(0,0,0,.028);transition:all .33s ease}.mec-skin-grid-container .mec-categories{padding:0}.mec-skin-grid-container .mec-categories li{list-style:none}.mec-skin-grid-container .mec-categories li a{color:#000;text-align:left;transition:all .23s ease;-webkit-transition:all .23s ease}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav i{font-size:12px;color:#40d9f1;cursor:pointer}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav .owl-next{right:0}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav .owl-prev{left:0}.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-event-sharing{display:none}.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-event-footer{text-align:center}.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-event-footer .mec-booking-button{position:static;padding:11px 16px}.widget .mec-event-footer ul.mec-event-sharing-wrap li a.mec-event-share-icon{padding:0}@media screen and (min-width:56.875em){.mec-widget .mec-month-container dl{margin-bottom:0}}.mec-widget .mec-event-grid-classic.owl-carousel .mec-event-footer{text-align:right}.mec-widget .mec-event-grid-classic.owl-carousel .mec-event-sharing-wrap{left:5px;padding-left:5px}.mec-widget .mec-event-grid-classic.owl-carousel .mec-event-sharing-wrap .mec-event-sharing{left:0}.mec-widget .mec-event-sharing-wrap .mec-event-sharing{position:absolute;top:auto;bottom:52px;margin:0;margin-top:0;border-radius:5px}.mec-widget .mec-event-sharing-wrap .mec-event-sharing:after{top:auto;bottom:-17px;border-color:#fff transparent transparent transparent}.mec-widget .mec-event-sharing-wrap .mec-event-sharing:before{top:auto;bottom:-18px;border-color:#e2e2e2 transparent transparent transparent}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button{position:absolute;background:#fff;padding:6px;margin-top:-17px;border-radius:3px;border:1px solid #e2e2e2;box-shadow:0 2px 0 0 rgba(0,0,0,.028)}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button:hover{background:#40d9f1;border-color:#40d9f1}.mec-widget .mec-event-grid-classic.mec-owl-carousel .owl-nav button:hover i{color:#fff}.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-booking-button{width:40%;float:right;color:#202020;height:36px;line-height:14px;font-size:12px;width:auto}.mec-widget .mec-event-grid-classic.mec-owl-carousel .mec-booking-button:hover{color:#fff}.mec-widget .mec-event-list-modern .col-md-2.col-sm-2,.mec-widget .mec-event-list-modern .col-md-6.col-sm-6{padding:0;width:100%;display:block;position:unset}.mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button{width:80%;height:46px;line-height:22px;padding:11px 20px;float:right}.mec-widget .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper{top:auto;bottom:5%}@media (max-width:480px){.mec-widget .mec-event-list-modern .col-md-4.col-sm-4{padding:0}.mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button{width:100%}}.mec-widget .mec-event-list-modern .mec-month-divider{margin:30px 0 10px 0}.mec-widget .mec-event-list-minimal .mec-event-date span{font-size:12px}.mec-widget .mec-event-list-minimal .mec-event-date:after{height:29px}.mec-widget .mec-event-list-minimal .col-md-3,.mec-widget .mec-event-list-minimal .col-md-9{display:block;width:100%;text-align:left}.mec-widget .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper{position:relative}.mec-widget .mec-event-list-modern .col-md-4.col-sm-4 .mec-booking-button{width:100%;text-align:center}.mec-widget .mec-event-list-minimal .mec-event-date:first-child{margin-right:24px}.mec-event-grid-clean{margin-bottom:10px;max-width:none}.mec-event-grid-clean .mec-event-article{margin-bottom:30px;position:relative;border:1px solid #e2e2e2;text-align:center;padding:15px 15px 0;background:#fff;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-grid-clean .mec-event-content{background:#fff;color:#767676;padding:25px 16px 0;text-align:left}.mec-event-grid-clean .mec-event-title{color:#202020;margin:0 0 10px 0;font-weight:700;font-size:21px;text-transform:capitalize}.mec-event-grid-clean .mec-event-title a{color:#202020;transition:all .24s ease}.mec-event-grid-clean .mec-event-date{font-weight:400;font-size:11px;text-transform:uppercase;letter-spacing:1px;background-color:#40d9f1;color:#fff;padding:3px 0;margin:0;text-align:center}.mec-event-grid-clean .mec-event-content p{font-size:15px;color:#9a9a9a;line-height:1.54}.mec-event-grid-clean img{margin-bottom:0;width:100%}.mec-event-grid-clean .event-grid-t2-head{margin-bottom:10px;color:#fff;padding:9px 14px 6px;text-align:left}.mec-event-grid-clean .event-grid-t2-head .mec-event-date{font-size:50px;line-height:50px;float:left;margin-right:11px}.mec-event-grid-clean .event-grid-t2-head .mec-event-month{text-transform:uppercase;font-size:17px;line-height:20px;padding-top:4px}.mec-event-grid-clean .event-grid-t2-head .mec-event-detail{font-size:12px}.mec-event-grid-clean .event-grid-t2-head .mec-categories li a{margin-bottom:10px;color:#fff}.mec-event-grid-clean .event-grid-t2-head .mec-categories li a:hover{color:#000}.mec-event-grid-clean .mec-event-sharing-wrap{left:0;padding-left:0}.mec-event-grid-clean .mec-event-footer{position:relative;border-top:2px solid;padding:20px 0;margin:0 14px;text-align:left;background:0 0}.mec-event-grid-clean .mec-event-footer .mec-booking-button{right:0}.mec-event-grid-clean .row{margin-bottom:30px}.mec-event-grid-modern{margin-bottom:10px;max-width:none}.mec-event-grid-modern .mec-event-article{position:relative;border:1px solid #e2e2e2;text-align:center;margin-bottom:30px;padding:45px 15px 10px;background:#fff;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-grid-modern .mec-event-content{color:#767676;padding:0 15px 10px;text-align:left}.mec-event-grid-modern .mec-event-title{color:#202020;margin:0 0 10px 0;font-weight:700;font-size:24px;text-transform:none;letter-spacing:-1px}.mec-event-grid-modern .mec-event-title a{color:#202020;transition:all .24s ease}.mec-event-grid-modern .mec-event-content .mec-categories-wrapper,.mec-event-grid-modern .mec-event-content .mec-shortcode-organizers{margin-bottom:10px}.mec-event-grid-modern .mec-event-content .mec-categories-wrapper,.mec-event-grid-modern .mec-event-content .mec-shortcode-organizers,.mec-event-grid-modern .mec-event-content p{font-size:15px;color:#9a9a9a;line-height:1.54}.mec-event-grid-modern img{margin-bottom:0;width:100%}.mec-event-grid-modern .event-grid-modern-head{margin-bottom:0;padding:9px 14px 6px;text-align:left}.mec-event-grid-modern .event-grid-modern-head .mec-event-date{font-size:50px;line-height:50px;float:left;margin-right:11px}.mec-event-grid-modern .event-grid-modern-head .mec-event-month{text-transform:uppercase;font-size:17px;line-height:20px;padding-top:4px;margin-bottom:5px}.mec-event-grid-modern .event-grid-modern-head .mec-event-detail{font-size:12px}.mec-event-grid-modern .event-grid-modern-head .mec-event-day{margin-top:9px;color:silver;font-size:35px;font-weight:100;text-transform:uppercase;letter-spacing:-1px}.mec-event-grid-modern .mec-event-footer{position:relative;height:90px;padding:20px 0;border:none;margin:0 14px;text-align:left;background:0 0}.mec-event-grid-modern .mec-event-footer .mec-booking-button{right:auto;left:0}.mec-event-grid-modern .mec-event-sharing-wrap{left:auto;right:0;padding-left:0}.mec-event-grid-modern .mec-event-sharing{left:auto;right:-6px}.mec-event-grid-modern .mec-event-sharing-wrap li{border-radius:55px}.mec-event-grid-modern .row{margin-bottom:0}@media only screen and (max-width:479px){.mec-event-grid-modern .mec-event-article{padding-bottom:30px}.mec-event-grid-modern .mec-event-sharing{top:60px;left:0;right:auto}.mec-event-grid-modern .mec-event-footer .mec-booking-button{top:0}}span.mec-event-title-soldout{font-size:8px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;background:#e63360;color:#fff;padding:3px 8px;line-height:1;border-radius:15px;white-space:nowrap;vertical-align:middle}.mec-repeating-label{background:#222;color:#fff;padding:3px 8px;font-size:8px;font-weight:700;letter-spacing:.5px;border-radius:40px;display:inline-block}.mec-event-grid-colorful .mec-event-article{min-height:400px;border:none;box-shadow:none;background:#40d9f1;padding-top:25px;margin:0;color:#fff}.mec-event-grid-colorful .mec-event-content{background:0 0}.mec-event-grid-colorful .event-grid-modern-head,.mec-event-grid-colorful .event-grid-modern-head .mec-event-date,.mec-event-grid-colorful .event-grid-modern-head .mec-event-day,.mec-event-grid-colorful .mec-event-content p,.mec-event-grid-colorful .mec-event-sharing-wrap>li>a,.mec-event-grid-colorful .mec-event-title a,.mec-event-grid-colorful ul.mec-categories li.mec-category a{color:#fff}.mec-event-grid-colorful .mec-event-footer .mec-booking-button,.mec-event-grid-colorful .mec-event-footer .mec-modal-booking-button{border:none}.mec-event-grid-colorful .mec-event-sharing-wrap>li{border-color:#fff}.mec-event-grid-colorful .mec-event-sharing-wrap:hover>li{background:#333;border-color:#333}.mec-event-grid-colorful .mec-event-title a.mec-color-hover:hover{color:#fff;text-decoration:underline}.mec-event-grid-colorful .mec-event-title .event-color{display:none}.mec-event-grid-colorful div[class^=col-md-]{padding:0 1px 1px 0;margin:0}.mec-event-grid-colorful .mec-event-article .mec-price-details,.mec-event-grid-colorful .mec-event-article .mec-time-details{color:#fff}@media only screen and (min-width:768px){.mec-wrap.mec-sm959.mec-event-grid-colorful .event-grid-modern-head .mec-event-day{font-size:26px}.mec-wrap.mec-sm959.mec-event-grid-colorful .event-grid-modern-head .mec-event-month{font-size:15px}.mec-wrap.mec-sm959.mec-event-grid-colorful .event-grid-modern-head .mec-event-date{font-size:50px}.mec-wrap.mec-sm959.mec-event-grid-colorful .mec-event-title{font-size:21px}.mec-wrap.mec-sm959.mec-event-grid-colorful .mec-event-content p{font-size:13px}.mec-wrap .mec-event-grid-colorful .col-md-3.col-sm-3 .mec-event-sharing-wrap{bottom:100px}}@media only screen and (min-width:768px) and (max-width:1200px){.mec-wrap.mec-sm959.mec-event-grid-colorful div[class^=col-md-]{width:50%}}.mec-event-list-minimal .mec-event-article{border-bottom:1px solid #efefef;padding:24px 0 16px}.mec-event-list-minimal .mec-wrap .col-md-9{padding:0}.mec-event-list-minimal .mec-event-date{position:relative;float:left;margin-right:30px;color:#fff;width:52px;padding:6px 4px 3px;text-align:center;text-transform:uppercase;border-radius:3px}.mec-event-list-minimal .mec-event-date{min-width:52px;width:fit-content}.mec-event-list-minimal .mec-event-date:nth-child(2){margin:0 30px 0 -20px}.mec-event-list-minimal .mec-event-date span{display:block;font-size:24px;font-weight:700;text-align:center;margin-bottom:4px}.mec-event-list-minimal .mec-event-date:after{display:block;content:"";position:absolute;width:50px;left:1px;top:1px;height:34px;background:rgba(255,255,255,.1);box-shadow:0 4px 4px rgba(0,0,0,.02)}.mec-event-list-minimal .mec-event-date:after{width:100%}.mec-event-list-minimal .mec-event-title{margin-top:0;margin-bottom:10px;font-weight:700;font-size:18px;text-transform:uppercase;letter-spacing:0;padding-top:10px}.mec-event-list-minimal .mec-categories-wrapper,.mec-event-list-minimal .mec-event-detail,.mec-event-list-minimal .mec-price-details,.mec-event-list-minimal .mec-shortcode-organizers,.mec-event-list-minimal .mec-time-details{font-size:15px;font-weight:300;line-height:1;letter-spacing:0;color:#9a9a9a;margin-bottom:10px}.mec-event-list-minimal .btn-wrapper{text-align:right;padding-right:0;padding-top:6px;text-align:center}.mec-event-list-minimal .btn-wrapper .mec-detail-button{border-bottom:0;margin-bottom:14px;margin-right:0;box-shadow:none}.mec-event-list-minimal a.mec-detail-button{text-align:center;display:inline-block;background:#ededed;color:#191919;padding:12px;border-radius:2px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:2px;transition:all .24s ease}.mec-event-list-minimal a.mec-detail-button:hover{background:#292929;color:#fff}.vc_col-sm-4 .mec-event-list-minimal .mec-event-date,.vc_col-sm-6 .mec-event-list-minimal .mec-event-date{margin-right:12px}.vc_col-sm-4 .mec-event-list-minimal .mec-event-title,.vc_col-sm-6 .mec-event-list-minimal .mec-event-title{font-size:15px;letter-spacing:2px}@media only screen and (min-width:480px) and (max-width:767px){.mec-event-list-minimal .btn-wrapper{padding-left:0}.mec-event-list-minimal .mec-event-date{margin-right:10px}}@media only screen and (max-width:767px){.mec-event-list-minimal .btn-wrapper .mec-detail-button{display:block;text-align:center;margin:0;margin-top:16px;padding:8px}.mec-event-list-minimal .btn-wrapper{margin:12px 0}}@media only screen and (max-width:479px){.mec-event-list-minimal .mec-event-date{float:none;width:160px;margin:8px auto}.mec-event-list-minimal .mec-event-date span{display:inline;padding-right:25px;margin-right:7px;font-size:inherit}.mec-event-list-minimal .mec-event-date:after{width:45%;box-shadow:4px 0 4px rgba(0,0,0,.02)}.mec-event-list-minimal .btn-wrapper{text-align:center;padding-left:0}.mec-event-list-minimal{text-align:center}.mec-event-list-minimal .mec-event-detail{margin-bottom:10px}}@media only screen and (min-width:479px){.mec-event-list-minimal .mec-event-article{display:flex;align-items:center;justify-content:space-between}}.mec-wrap .mec-event-list-modern .mec-event-title{margin-top:0;margin-bottom:10px}.mec-event-list-modern .mec-event-article{border-bottom:1px solid #efefef;padding:30px 0 10px}.mec-event-list-modern .mec-event-article:last-child{border-bottom:none}.mec-event-list-modern .mec-event-title a{color:#191919;transition:all .24s ease;box-shadow:none}.mec-event-list-modern .mec-event-date{text-transform:uppercase;padding:10px 0}.mec-event-list-modern .mec-event-date .event-d{font-size:48px;display:table-cell;padding:10px 0 0}.mec-event-list-modern .mec-event-date .event-d.mec-multiple-dates{font-size:20px;padding:0}.mec-event-list-modern .mec-event-date.mec-multiple-date-event:first-child{padding:10px 0 6px 0;position:relative;width:fit-content}.mec-event-list-modern .mec-event-date.mec-multiple-date-event:first-child:after{content:"";position:absolute;bottom:0;left:0;width:100%;height:1px;background:silver}.mec-event-list-modern .mec-event-date.mec-multiple-date-event:last-child{padding:5px 0 10px 0}.mec-event-list-modern .mec-event-date.mec-multiple-date-event .event-d{font-size:20px;padding:0}.mec-event-list-modern .mec-event-date.mec-multiple-date-event .event-da{font-size:20px;margin:0}.mec-event-list-modern .mec-event-date .event-f{font-size:13px;display:table-cell;vertical-align:middle;padding-left:7px;font-weight:500;letter-spacing:3px;color:#777}.mec-event-list-modern .mec-event-detail{font-weight:300;color:#8a8a8a}.mec-event-list-modern .mec-event-detail .mec-time-details{display:inline}.mec-event-list-modern .mec-event-date .event-da{margin-top:9px;color:silver;font-size:28px;font-weight:100;text-transform:uppercase;letter-spacing:-1px;text-align:left}.mec-event-list-modern .mec-btn-wrapper .mec-booking-button{border-radius:1px;letter-spacing:2px;border:1px solid #e6e6e6;color:#333;background-color:#fff;padding:13px 20px;font-weight:700;font-size:11px;box-shadow:0 2px 0 0 rgba(0,0,0,.016);transition:all .28s ease}.mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover{border-color:#222;background:#222;color:#fff}.mec-event-list-modern .mec-event-title{font-weight:700;font-size:20px;text-transform:uppercase;letter-spacing:1px}.mec-event-list-modern .mec-categories-wrapper,.mec-event-list-modern .mec-event-detail,.mec-event-list-modern .mec-price-details,.mec-event-list-modern .mec-shortcode-organizers{color:#9a9a9a;font-size:15px;font-weight:300;line-height:25px}.mec-event-list-modern .mec-btn-wrapper{text-align:right;padding:10px 0;text-transform:uppercase}.mec-event-list-modern .mec-event-sharing{position:relative;margin:10px 0;padding-left:0}.mec-event-list-modern .mec-event-sharing>li{display:inline-block;border:none;border-radius:50%;margin-right:10px;margin-bottom:5px}.mec-event-list-modern .mec-event-sharing>li:hover{display:inline-block}.mec-event-list-modern .mec-event-sharing>li:hover a i{color:#fff;background:#40d9f1;border-color:#40d9f1}.mec-event-list-modern .mec-event-sharing>li i{width:36px;display:inline-block;line-height:35px;color:#767676;text-align:center;border-radius:50%;border:1px solid #ddd;font-size:14px;margin-right:3px;transition:all ease .3s}.mec-event-list-modern .mec-event-sharing>li i svg{height:16px;vertical-align:middle}.mec-event-list-modern .mec-event-sharing>li .mec-social-title{color:#767676;font-size:14px}.mec-event-list-modern .mec-event-sharing .mec-event-share:hover .mec-event-sharing-icon{background:#40d9f1;border-color:#40d9f1;cursor:pointer;border-radius:50%}.mec-event-list-modern .mec-event-sharing li:hover a i{background:#40d9f1}@media only screen and (min-width:768px){.mec-event-list-modern .mec-event-article{position:relative;min-height:160px;overflow:visible}.mec-event-list-modern .col-md-2.col-sm-2{width:210px;position:absolute;left:0;top:20px;padding:0}.mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper{padding:0;position:absolute;right:0;top:30%}.mec-event-list-modern .col-md-6.col-sm-6{width:100%;padding-left:225px;padding-right:195px}}@media only screen and (max-width:767px){.mec-event-list-modern .mec-btn-wrapper .mec-booking-button{letter-spacing:1px;border:1px solid #e1e1e1}.mec-event-list-modern .mec-btn-wrapper{padding:0 0 12px}.mec-event-list-modern .mec-event-sharing{margin-bottom:0}.mec-event-list-modern .mec-event-sharing li{margin-bottom:7px}}.mec-event-grid-minimal .mec-event-article{margin:15px 0;min-height:80px;display:table}.mec-event-grid-minimal .event-detail-wrap{display:table-cell;vertical-align:middle}.mec-event-grid-minimal .mec-event-date{width:70px;float:left;margin-right:20px;padding:12px 16px 10px;text-align:center;text-transform:uppercase;border-radius:4px;border:1px solid #e6e6e6;transition:all .37s ease-in-out;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-grid-minimal .mec-event-date span{display:block;font-size:24px;font-weight:700;text-align:center;margin-bottom:4px;color:#2a2a2a;transition:color .3s ease}.mec-event-grid-minimal .mec-event-title{margin-top:0;margin-bottom:10px;font-weight:700;line-height:21px;font-size:16px;text-transform:uppercase;transition:color .3s ease}.mec-event-grid-minimal .mec-event-title a{color:#191919;transition:color .3s ease}.mec-event-grid-minimal .mec-event-detail .mec-categories-wrapper,.mec-event-grid-minimal .mec-event-detail .mec-categories-wrapper ul.mec-categories li.mec-category a,.mec-event-grid-minimal .mec-event-detail .mec-event-loc-place,.mec-event-grid-minimal .mec-event-detail .mec-price-details,.mec-event-grid-minimal .mec-event-detail .mec-shortcode-organizers,.mec-event-grid-minimal .mec-time-details{font-size:15px;font-weight:300;line-height:1;letter-spacing:0;color:#9a9a9a;margin-bottom:10px}.mec-event-grid-minimal .mec-event-date:hover{color:#fff}.mec-event-grid-minimal .mec-event-date:hover span{color:#fff}.mec-wrap .mec-event-grid-minimal .mec-event-date:hover{color:#fff}.mec-event-list-classic .mec-event-article{padding:12px 0;margin-bottom:20px}.mec-event-list-classic .mec-event-image{float:left;width:86px;margin-right:20px}.mec-event-list-classic .mec-event-date,.mec-event-list-classic .mec-event-time{font-weight:400;font-size:13px;letter-spacing:0;line-height:18px;text-align:left;display:initial;margin-right:12px}.mec-event-list-classic .mec-event-time .mec-time-details,.mec-event-list-classic .mec-event-time i{display:inline;margin-right:3px}.mec-event-list-classic .mec-event-date span{font-weight:500;margin-bottom:6px}.mec-event-list-classic .mec-event-title{font-size:15px;margin:10px 0 12px;font-weight:700;text-transform:uppercase}.mec-event-list-classic .mec-event-title a{color:#494949;transition:color .3s ease}.mec-event-list-classic .mec-event-detail,.mec-event-list-classic .mec-price-details{color:#777;font-weight:400;line-height:12px;font-size:12px;overflow:hidden}@media only screen and (max-width:480px){.mec-event-list-classic .mec-event-detail{float:right;width:calc(100% - 104px)}}.mec-event-list-classic a.magicmore{padding:10px 16px;color:#fff;background:#222;letter-spacing:2px;font-size:11px}.mec-event-list-classic a.magicmore:after{content:"";display:none}.mec-event-list-classic a.magicmore:hover{color:#40d9f1}.mec-event-grid-simple .mec-event-article{position:relative;margin-bottom:30px}.mec-event-grid-simple .mec-event-article:after{border-right:1px solid #e6e6e6;height:60px;position:absolute;top:50%;margin-top:-30px;right:-1px}.mec-event-grid-simple .row div:last-child .mec-event-article:after{border:none}.mec-event-grid-simple .row{margin:15px 0 30px;text-align:center}.mec-event-grid-simple .mec-event-date{padding:0;margin:0;text-transform:capitalize;font-size:12px;font-weight:700}.mec-event-grid-simple .mec-event-title{margin-top:0;margin-bottom:10px;font-weight:700;line-height:21px;font-size:15px;padding-top:5px;padding-left:5px;padding-right:5px;text-transform:uppercase;transition:color .37s ease}.mec-event-grid-simple .mec-event-title a{color:#494949;transition:color .3s ease}.mec-event-grid-simple .mec-event-detail{font-weight:400;line-height:1;letter-spacing:0;font-size:13px;color:#777}.mec-event-grid-simple .mec-event-detail .mec-time-details{margin-top:7px}.mec-event-grid-simple .mec-event-title:hover{color:#40d9f1}.mec-event-grid-simple .mec-event-date:hover{background:0 0}.event-last:after{display:none}@media only screen and (max-width:767px){.mec-event-grid-simple .mec-event-article{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #eee}.mec-event-grid-simple .mec-event-article:after{border:none}}.mec-event-grid-novel .mec-event-article{position:relative;margin-bottom:30px;padding:60px 5% 60px 7%;border:1px solid rgba(255,255,255,.12);border-radius:10px;background-color:#0050fd;-webkit-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease;z-index:1}.mec-event-grid-novel .mec-event-article .novel-grad-bg{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:10px;opacity:0;z-index:-1;-webkit-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}.mec-event-grid-novel .mec-event-article:hover{-webkit-box-shadow:0 13px 36px 0 rgba(0,0,0,.23);box-shadow:0 13px 36px 0 rgba(0,0,0,.23);border-color:transparent}.mec-event-grid-novel .mec-event-article:hover .novel-grad-bg{background-image:-webkit-gradient(linear,left top,right top,from(#262e32),to(#0e1015));background-image:-webkit-linear-gradient(left,#262e32 0,#0e1015 100%);background-image:-o-linear-gradient(left,#262e32 0,#0e1015 100%);background-image:linear-gradient(90deg,#262e32 0,#0e1015 100%);opacity:1}.mec-event-grid-novel .mec-event-image{float:left;width:150px;height:150px}.mec-event-grid-novel .mec-event-image img{width:150px;height:150px;border-radius:50%}.mec-event-grid-novel .mec-event-detail-wrap{margin-left:200px}.mec-event-grid-novel .mec-event-content h4{position:relative;margin-bottom:10px;display:inline-block}.mec-event-grid-novel .mec-event-content h4 a{font-size:24px;line-height:35px;color:#fafcff}.mec-event-grid-novel .mec-event-content h4.mec-gCalendar-search-text-wrap input[type=text]:before{content:"";position:absolute;top:8px;left:-30px;width:17px;height:17px;background:#5cd0ed;opacity:.4;border-radius:50%;padding-right:5px}.mec-skin-grid-container .mec-event-grid-novel .mec-categories li a{color:#fff}.mec-event-grid-novel .mec-event-address,.mec-event-grid-novel .mec-event-detail,.mec-event-grid-novel .mec-event-month,.mec-event-grid-novel .mec-local-time-details{position:relative;padding-left:35px;font-size:15px;line-height:30px;color:rgba(255,255,255,.4)}.mec-event-grid-novel .mec-price-details{position:relative;padding-left:7px;font-size:15px;line-height:30px;color:rgba(255,255,255,.4)}.mec-event-grid-novel .mec-price-details i{margin-right:8px}.mec-event-grid-novel .mec-categories-wrapper::before,.mec-event-grid-novel .mec-event-address::before,.mec-event-grid-novel .mec-event-detail::before,.mec-event-grid-novel .mec-event-month::before,.mec-event-grid-novel .mec-local-time-details:before{position:absolute;top:6px;left:6px;font-size:17px;font-family:simple-line-icons;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1}.mec-event-grid-novel .mec-local-time-details::before{content:"\e007"}.mec-event-grid-novel .mec-event-month::before{content:"\e075"}.mec-event-grid-novel .mec-event-detail::before{content:"\e081"}.mec-event-grid-novel .mec-event-address::before{content:"\e096"}.mec-event-grid-novel .mec-categories-wrapper::before{content:"\e089"}.mec-event-grid-novel .mec-event-footer{clear:both;padding:20px 0;border-top:none;background:0 0}.mec-event-grid-novel .mec-event-footer .mec-booking-button{right:0;left:auto;height:38px;width:148px;padding:0 20px;font-size:14px;font-weight:400;line-height:38px;text-align:center;color:#fff;background:0 0;border-color:rgba(255,255,255,.1);border-radius:50px}.mec-event-grid-novel .mec-event-footer .mec-booking-button:hover{background-color:rgba(255,255,255,.1)}.mec-event-grid-novel .mec-event-sharing-wrap{left:0;cursor:pointer;padding-left:0}.mec-event-grid-novel .mec-event-sharing-wrap>li{border-color:rgba(255,255,255,.1);border-radius:50%}.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-share{position:absolute;z-index:2}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing{top:-6px;left:0;padding:5px 10px 2px 50px;min-width:150px;width:inherit;height:38px;background-color:rgba(255,255,255,.1);-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:50px;backdrop-filter:blur(10px)}.mec-event-grid-novel .mec-event-sharing-wrap:hover>li{background-color:rgba(255,255,255,.1)}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing::after,.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing::before{display:none}.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon,.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon a,.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li i{display:inline}.mec-event-grid-novel .mec-event-sharing .mec-event-social-icon a{padding:0 10px}.mec-event-grid-novel .mec-event-sharing-wrap>li a{color:#fff}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a{color:rgba(255,255,255,.4)}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a:hover{color:#fff}.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon{margin:0;width:auto}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing{display:flex;align-items:center;padding-top:0}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing li a{display:flex;align-items:center;width:31px}.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon a i{width:auto;height:auto}.mec-event-grid-novel .mec-event-sharing-wrap li.mec-event-social-icon a svg{fill:rgba(255,255,255,0.4);padding:0;width:36px;height:36px;border-radius:0;margin:0}@media only screen and (max-width:1200px){.mec-event-grid-novel .row .col-md-6.col-sm-6{width:100%;float:none}.mec-event-grid-novel .mec-event-image{float:none;margin-top:-20px;margin-bottom:20px}.mec-event-grid-novel .mec-event-detail-wrap{margin-left:20px}.mec-event-grid-novel .mec-event-footer{margin-top:30px}}@media only screen and (max-width:767px){.mec-event-grid-novel .mec-event-footer{margin-top:0;padding-top:30px;margin-bottom:24px}.mec-event-grid-novel .mec-event-footer .mec-booking-button{display:block;position:relative}.mec-event-grid-novel .mec-event-sharing-wrap{left:0;bottom:-55px;padding-left:0}.mec-event-grid-novel .mec-event-content h4 a{font-size:20px;line-height:1.3}}.mec-event-grid-novel .mec-event-sharing-wrap{padding-left:0}.mec-event-grid-novel .mec-event-sharing-wrap .mec-event-sharing{width:fit-content;z-index:1}@media (min-width:1280px){.mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-article img{width:100px;height:100px}.mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-detail-wrap{margin-left:150px}.mec-event-grid-novel .col-md-3.col-sm-3 .mec-event-content .mec-event-detail-wrap,.mec-event-grid-novel .col-md-3.col-sm-3 .mec-event-content .mec-event-image{width:100%}.mec-event-grid-novel .col-md-3.col-sm-3 .mec-event-content .mec-event-detail-wrap{margin-left:20px}}@media (min-width:760px) and (max-width:1024px){.mec-event-grid-novel .col-md-4.col-sm-4{width:100%}.mec-event-grid-novel .mec-event-image{float:left}.mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-article img{width:100px;height:100px}}.mec-event-cover-modern{position:relative}.mec-event-cover-modern .mec-event-cover-a{background:0 0;position:absolute;color:#fff;bottom:0;left:0;text-decoration:none}.mec-event-cover-modern .mec-event-cover-a .mec-event-overlay{transition:all .5s;opacity:.8;width:100%;height:100%;position:absolute}.mec-event-cover-modern .mec-event-cover-a:hover .mec-event-overlay{opacity:1}.mec-event-cover-modern .mec-event-detail{padding:40px;position:relative}.mec-event-cover-modern .mec-event-cover-a:hover .mec-event-tag{color:#333;transition:all .5s}.mec-event-cover-modern .mec-event-cover-a .mec-event-title:hover{text-decoration:underline}.mec-event-cover-modern .mec-event-tag{background:#fff;display:inline-block;padding:5px 9px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:1px;margin-bottom:24px}.mec-event-cover-modern .mec-event-date{text-transform:uppercase;font-size:17px;font-weight:300}.mec-event-cover-modern .mec-event-title{color:#fff;text-transform:uppercase;font-size:40px;font-weight:700;margin:6px 0}.mec-event-cover-modern .mec-event-place{font-weight:400;font-size:18px}@media only screen and (max-width:767px){.mec-event-cover-modern .mec-event-cover-a{width:100%}}.mec-event-cover-classic{position:relative;overflow:hidden;background:#fff;padding:6px;border:1px solid #e8e8e8}.mec-event-cover-classic .mec-event-overlay{position:absolute;left:6px;right:6px;bottom:6px;top:6px;width:auto;height:auto;background-color:rgba(36,36,36,.4);transition:all .33s ease-in-out}.mec-event-cover-classic:hover .mec-event-overlay{background-color:rgba(36,36,36,.6)}.mec-event-cover-classic .mec-event-content{font-size:15px;color:#fff;position:absolute;bottom:0;padding:50px 35px;transition:all .33s ease-in-out}.mec-event-cover-classic .mec-event-date{font-size:14px;text-transform:uppercase;font-weight:400;line-height:1.6;text-align:left}.mec-event-cover-classic .mec-event-date span{display:block;font-weight:700;font-size:16px}.mec-event-cover-classic .mec-event-title{color:#fff;margin:20px 0 38px;font-size:24px;font-weight:700;text-transform:uppercase;font-style:normal}.mec-event-cover-classic .mec-btn-wrapper{text-align:left}.mec-event-cover-classic .mec-event-icon{font-size:18px;float:left;margin-right:14px;color:#fff;padding:13px}.mec-event-cover-classic .mec-event-button{color:#fff;background-color:#191919;border:2px #191919 solid;padding:12px 20px;letter-spacing:3px;font-size:12px;font-weight:700;font-style:normal;transition:all .22s ease;text-decoration:none}.mec-event-cover-classic .mec-event-button:hover{color:#191919;background-color:#fff;border-color:#fff;border-radius:1px}.mec-event-cover-classic .mec-event-image img{min-width:100%}@media only screen and (max-width:960px){.mec-event-cover-classic .mec-event-content{padding:20px}.mec-event-cover-classic .mec-event-button{font-size:11px;padding:7px 10px;letter-spacing:1px}.mec-event-cover-classic .mec-event-title{font-size:19px;margin:15px 0 25px}.mec-event-cover-classic .mec-event-date{font-size:12px}}@media only screen and (max-width:767px){.mec-event-cover-classic{margin-bottom:30px}}@media only screen and (max-width:479px){.mec-event-cover-classic .mec-event-content{padding:15px;font-size:15px}.mec-event-cover-classic .mec-event-title{font-size:15px;margin:10px 0}.mec-event-cover-classic .mec-event-button{font-size:10px;padding:6px;letter-spacing:1px}.mec-event-cover-classic .mec-event-icon{padding:10px}}.mec-load-more-wrap{text-align:center;display:block;width:100%;padding-top:20px;text-align:center;position:relative}.mec-load-more-button{box-shadow:none;transition:all .21s ease;font-size:12px;font-weight:500;letter-spacing:1px;text-transform:uppercase;background:#fff;color:#767676;border:2px solid #e8e8e8;border-radius:50px;padding:0 28px;margin-bottom:20px;cursor:pointer;line-height:40px;height:42px;display:inline-block}.mec-load-more-button:hover{background:#191919;color:#fff;border-color:#191919}.mec-load-more-loading{content:url("../img/ajax-loader.gif");cursor:wait;background:0 0;border-style:none}.mec-load-more-loading:hover{background:0 0}.mec-modal-preloader,.mec-month-navigator-loading{width:100%;height:100%;background:no-repeat rgba(255,255,255,.88) url("../img/ajax-loader.gif") center;border-style:none;position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}.mec-event-calendar-classic .mec-calendar-side .mec-calendar-table{min-height:1024px}.mec-calendar-side .mec-calendar-table{min-height:450px}.mec-skin-weekly-view-events-container.mec-month-navigator-loading{margin-top:0}.mec-calendar.mec-event-calendar-classic .mec-calendar-side{display:block}.mec-skin-daily-view-events-container.mec-month-navigator-loading{margin-top:0}@media only screen and (min-width:961px){.mec-wrap.mec-sm959 .mec-calendar-side .mec-calendar-table{min-height:1px}}@media only screen and (max-width:479px){.mec-calendar-side .mec-calendar-table{min-height:1px}}.mec-event-cover-clean{position:relative;border:1px solid #e6e6e6;padding:8px}.mec-event-cover-clean .mec-event-overlay{height:100%;background-color:rgba(36,36,36,.4);position:absolute;width:100%;left:0;border:8px solid #fff;top:0;transition:all .5s ease-in-out}.mec-event-cover-clean .mec-event-content{color:#fff;position:absolute;bottom:20px;padding:40px 60px;transition:all .5s ease-in-out}.mec-event-cover-clean .mec-event-title{color:#fff;font-weight:700;margin:46px 0 19px;font-size:29px;text-transform:uppercase;text-shadow:0 0 1px rgba(0,0,0,.5)}.mec-event-cover-clean .mec-event-title a{color:#fff;transition:all .5s;text-decoration:none;outline:0;border:none;box-shadow:none}.mec-event-cover-clean .mec-event-title a:hover{text-decoration:underline}.mec-event-cover-clean .mec-event-date{position:absolute;top:-20px;right:60px;color:#fff;width:60px;padding:14px 10px;z-index:1}.mec-event-cover-clean .mec-event-date div{text-align:center;text-transform:uppercase;letter-spacing:1px;line-height:16px}.mec-event-cover-clean .mec-event-date .dday{padding-bottom:15px;border-bottom:1px solid rgba(255,255,255,.5);margin-bottom:13px;font-size:24px}.mec-event-cover-clean .mec-event-date .dmonth{letter-spacing:2px}.mec-event-cover-clean .mec-event-place{font-size:18px}.mec-event-cover-clean .mec-event-image img{width:100%}@media only screen and (max-width:768px){.mec-event-cover-clean .mec-event-content{padding:20px;bottom:5px}.mec-event-cover-clean .mec-event-title{font-size:23px}.mec-event-cover-clean .mec-event-date{right:20px;padding:10px;width:50px}}@media only screen and (max-width:479px){.mec-event-cover-clean .mec-event-content{padding:10px}.mec-event-cover-clean .mec-event-title{font-size:19px;padding-right:25px}.mec-event-cover-clean .mec-event-date{right:-20px;top:-10px}.mec-event-cover-clean .mec-event-detail{font-size:12px}}.mec-month-divider{text-align:center;margin:60px 0 40px 0}.widget .mec-month-divider{margin:10px 0}.mec-month-divider span{text-transform:uppercase;font-size:22px;font-weight:700;padding-bottom:5px;color:#313131;border-bottom:4px solid #ebebeb;width:100%;display:block;padding-bottom:10px;position:relative}.mec-month-divider span:before{border-bottom:4px solid #40d9f1;font-size:6px;content:"";text-align:center;position:absolute;bottom:-4px;margin-left:-30px;left:50%;width:60px}.widget .mec-month-divider span{font-size:13px}.mec-event-list-standard .mec-events-pagination{margin-top:60px;border-top:4px solid #ebebeb;min-height:80px;padding-top:20px}.mec-event-list-standard .mec-events-pagination .mec-events-pag-previous{float:left;margin-left:0}.mec-event-list-standard .mec-events-pagination .mec-events-pag-next{float:right;margin-right:0}.mec-event-list-standard .mec-event-article{position:relative;display:block;margin-bottom:25px;background-color:#fff;border:1px solid #e9e9e9;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-list-standard .mec-topsec{display:table;width:100%}.mec-event-list-standard .col-md-3.mec-event-image-wrap{padding-left:0}.mec-event-list-standard .mec-event-content{padding-top:15px;padding-right:30px}.mec-event-list-standard ul.mec-event-status-icons{list-style:none;padding:0;margin-bottom:10px}.mec-event-list-standard ul.mec-event-status-icons li{display:inline-flex;align-items:inherit;justify-content:center;font-size:12px;font-weight:400;line-height:16px;border-radius:5px;padding:2px 5px;margin-right:10px}.mec-event-list-standard ul.mec-event-status-icons li img{margin-right:5px}.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-scheduled{color:#58aa22;background:#e9f8d7}.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-ongoing{color:#1aa82a;background:#e4f6df}.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-postponed{color:#a1830d;background:#fff3b7}.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-cancelled{color:#bb1313;background:#fed8d8}.mec-event-list-standard ul.mec-event-status-icons li.mec-event-status-movedonline{color:#f35e04;background:#feebd7}.mec-event-list-standard .mec-event-title{font-size:29px;font-weight:600;letter-spacing:-1px;margin:0 0 10px}.mec-event-list-standard .mec-event-title a{color:#292929;text-decoration:none;transition:color .3s ease}.mec-event-list-standard .mec-col-table-c{display:table-cell;height:100%;vertical-align:middle;float:none!important}.mec-event-list-standard .mec-col-table-c.mec-event-meta-wrap{padding:20px}.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap{vertical-align:top}.mec-topsec .mec-event-image{line-height:1px}.mec-topsec .mec-event-image a{display:block}.mec-event-list-standard .mec-event-meta-wrap{border-left:1px solid #eee}.mec-event-list-standard .mec-time-details{text-transform:uppercase;font-size:12px;font-weight:400;line-height:17px;color:#707070;padding-top:0;text-align:left}.mec-event-list-standard .mec-event-meta .mec-venue-details span{font-size:12px;font-weight:400;line-height:17px;color:#707070;padding-top:0;text-align:left}.mec-event-list-standard .mec-event-meta .mec-venue-details .mec-event-address span{font-style:normal;letter-spacing:0;font-size:12px;font-weight:400;color:#707172;margin-left:29px}.mec-event-list-standard .mec-event-meta span.mec-event-d,.mec-event-list-standard .mec-event-meta span.mec-event-m{font-size:13px;font-weight:600;line-height:17px;padding-right:6px;color:#414243;text-transform:uppercase}.mec-event-list-standard .mec-event-meta .mec-time-details .mec-end-time,.mec-event-list-standard .mec-event-meta .mec-time-details .mec-start-time,.mec-event-list-standard .mec-event-meta .mec-venue-details span,.mec-event-list-standard .mec-event-meta span.mec-event-d .mec-start-date-label{vertical-align:middle}.mec-event-list-standard .mec-event-meta svg{vertical-align:middle;margin-right:12px;width:20px;height:20px}.mec-event-list-standard .mec-categories-wrapper,.mec-event-list-standard .mec-date-details,.mec-event-list-standard .mec-local-time-details,.mec-event-list-standard .mec-shortcode-organizers,.mec-event-list-standard .mec-time-details,.mec-event-list-standard .mec-venue-details{position:relative;margin-bottom:10px}.mec-event-list-standard .mec-local-time-details .mec-local-title{font-size:13px;font-weight:400;line-height:17px;color:#414243;margin-left:-3px}.mec-event-list-standard .mec-local-time-details .mec-local-date,.mec-event-list-standard .mec-local-time-details .mec-local-time{font-style:normal;letter-spacing:0;font-size:11px;color:#8a8a8a;font-weight:300;line-height:1.6;margin-left:29px}.mec-event-list-standard .mec-categories-wrapper i,.mec-event-list-standard .mec-date-details i,.mec-event-list-standard .mec-shortcode-organizers i{margin-right:12px}.mec-event-list-standard .mec-categories-wrapper i:before,.mec-event-list-standard .mec-event-meta-wrap .mec-event-meta .mec-price-details i:before{font-size:16px}.mec-event-list-standard .mec-event-title .mec-labels-normal{line-height:18px;height:18px;display:inline-block;vertical-align:middle}.mec-event-list-standard .mec-event-title .mec-labels-normal .mec-label-normal{vertical-align:bottom}.mec-event-list-standard .mec-event-description{font-size:14px}.mec-event-list-minimal .mec-event-title a{color:#292929;transition:color .3s ease}.mec-event-meta-wrap .mec-price-details{margin-bottom:10px}.mec-price-details i{margin-right:4px;line-height:16px}.mec-event-meta-wrap .mec-event-meta .mec-price-details i:before{font-size:15px}.mec-event-list-standard .mec-price-details{font-size:12px;font-weight:400;line-height:17px;color:#707070;padding-top:0;text-align:left}.mec-event-list-standard .mec-price-details i{margin-right:10px}.mec-month-side .mec-price-details{margin-left:2px}.mec-month-side .mec-price-details i,.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-content .mec-price-details i{padding-top:4px;vertical-align:unset}.mec-event-list-standard ul.mec-categories{position:relative;margin-bottom:10px}@media only screen and (max-width:960px){.mec-event-list-standard .mec-topsec{display:block}.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap{display:block;width:40%}.mec-event-list-standard .mec-col-table-c.mec-event-content-wrap{display:block;min-height:230px}.mec-event-list-standard .mec-event-meta-wrap{display:block;border-left:none;border-top:1px solid #eee;width:100%;float:none;padding-top:20px}}@media only screen and (min-width:480px) and (max-width:960px){.mec-event-list-standard .mec-col-table-c.mec-event-content-wrap,.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap{display:table-cell}}@media only screen and (max-width:479px){.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap,.mec-event-list-standard .mec-col-table-c.mec-event-image-wrap img{float:none;width:100%;padding:0}.mec-event-list-standard .mec-col-table-c.mec-event-content-wrap{padding:10px 10px 10px 30px}}.mec-localtime-details{color:#777;font-weight:400;line-height:12px;font-size:12px}.mec-localtime-details .mec-localdate,.mec-localtime-details .mec-localtime,.mec-localtime-details .mec-localtitle{display:inline-block}.mec-localtime-details .mec-start-date-label{padding-right:5px}.mec-localtime-details .mec-localtime{padding-left:5px}.mec-event-list-minimal .mec-localtime-details{display:inline-flex;font-size:15px;font-weight:300;line-height:1;letter-spacing:0;color:#9a9a9a;padding-left:9px}.mec-event-grid-classic .mec-localtime-details,.mec-event-grid-clean .mec-localtime-details{color:#fff;font-weight:400;font-size:11px;text-transform:uppercase;letter-spacing:-.02em;color:#fff;padding:0 0;line-height:18px;margin-top:-3px}.mec-event-grid-clean .mec-localtime-details,.mec-event-grid-colorful .mec-localtime-details,.tooltipster-box .mec-localtime-details{line-height:22px;padding-top:10px}.mec-event-grid-colorful .mec-localtime-details{color:#fff}.mec-event-grid-classic .mec-localtime-details{text-align:center}.mec-event-grid-minimal .mec-localtime-details{line-height:22px}.mec-wrap .mec-yearly-view-wrap .mec-localtime-wrap i{display:inline-block;margin-left:-1px}.mec-timetable-t2-content .mec-local-time-details{padding-left:19px}.mec-timetable-t2-content .mec-local-time-details{position:relative}.mec-timetable-t2-content .mec-local-time-details:before{content:"\e007";font-family:simple-line-icons;position:absolute;font-size:12px;margin-right:4px;left:0}.mec-masonry .mec-masonry-col6 .mec-localtime-details{margin-top:10px;line-height:21px}.mec-masonry .mec-masonry-col6 .mec-localtime-details i{height:auto}.mec-event-cover-classic .mec-localtime-details{color:#fff;margin-top:12px}.mec-event-cover-classic .mec-localtime-details i{padding-right:8px}.mec-event-cover-clean .mec-localtime-details{color:#fff;margin-bottom:20px}.mec-event-cover-modern .mec-localtime-details{color:#fff;margin:10px 0;font-weight:400;font-size:18px}.mec-event-countdown-style1 .mec-localtime-details,.mec-event-countdown-style2 .mec-localtime-details,.mec-event-countdown-style3 .mec-localtime-details{color:#fff;padding:8px 5px 0;font-size:14px;line-height:25px}.mec-event-countdown-style1 .mec-localtime-details{text-align:center}.mec-event-hover-carousel-type4 .mec-localtime-details{display:block;color:#fff;font-size:11px}.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localdate,.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localtime,.mec-event-footer-carousel-type3 .mec-localtime-details .mec-localtitle,.mec-event-footer-carousel-type3 .mec-localtime-details span{display:inline-flex;line-height:20px;text-align:left;margin:0!important;font-size:12px;color:#777;line-height:28px}.mec-owl-crousel-skin-type1 .mec-localtime-details{margin-top:-7px;margin-bottom:12px}.mec-wrap .mec-slider-t5 .mec-localtime-details{margin-top:14px;line-height:20px}.mec-wrap .mec-slider-t5 .mec-localtime-details i{font-size:18px;height:20px}.mec-timeline-event-local-time .mec-localtime-details{font-size:13px;font-weight:500;vertical-align:middle;margin-left:6px;color:inherit;line-height:24px}.mec-timeline-event-local-time .mec-localtime-details i{font-size:17px;vertical-align:middle;margin-left:-7px;padding-right:3px}.mec-booking-modal{background-color:#e6f7ff}.mec-booking-modal .mec-booking-shortcode .mec-book-form-gateway-label input[type=radio]:before{top:-1px}.mec-modal-booking-button{box-shadow:none;transition:all .21s ease;font-size:11px;font-weight:500;letter-spacing:1px;text-transform:uppercase;background:#fff;color:#767676;border:1px solid #e8e8e8;padding:12px 16px;line-height:37px;height:38px;margin:12px 0}.mec-modal-booking-button:hover{background:#191919;color:#fff;border-color:#191919}.mec-modal-booking-button.mec-mb-icon i{font-size:14px}.mec-event-list-classic .mec-modal-booking-button{height:0;line-height:1;margin:7px 0 0;display:inline-table;letter-spacing:0;padding:12px 14px}.mec-event-grid-novel .mec-categories-wrapper{position:relative;color:rgba(255,255,255,.4);padding-left:35px}.mec-event-grid-novel ul.mec-categories{line-height:30px;font-size:15px}.mec-event-grid-novel .mec-categories-wrapper i{display:none}.mec-event-grid-novel ul.mec-categories li.mec-category a{color:rgba(255,255,255,.4);line-height:30px;font-size:15px}.mec-event-grid-novel ul.mec-organizers li.mec-organizer-item span{padding-left:35px;color:rgba(255,255,255,.4);line-height:30px;font-size:15px}.mec-calendar-events-side .mec-modal-booking-button,.mec-event-container-classic .mec-modal-booking-button,.mec-event-grid-minimal .mec-modal-booking-button,.mec-event-list-minimal .mec-modal-booking-button,.mec-timetable-t2-col .mec-modal-booking-button{margin:0;color:#282828;font-size:12px;transition:all .5s ease;-webkit-transition:all .5s ease;position:relative;padding:0 0 0 24px;background:0 0;text-align:left;display:inline;border:0;font-weight:700}.mec-timetable-t2-col .mec-modal-booking-button{color:#fff;padding-left:19px}.mec-timetable-t2-col .mec-modal-booking-button:hover{color:#282828}.mec-event-list-minimal .mec-modal-booking-button{margin:0 4px 0 84px}.mec-calendar-events-side .mec-modal-booking-button:before,.mec-event-container-classic .mec-modal-booking-button:before,.mec-event-grid-minimal .mec-modal-booking-button:before,.mec-event-list-minimal .mec-modal-booking-button:before{content:"";position:absolute;background:#7a7272;width:18px;height:1px;left:0;top:45%;transition:all .1s ease;-webkit-transition:all .1s ease}.mec-skin-carousel-container .mec-modal-booking-button{line-height:70px}.mec-event-list-modern .mec-modal-booking-button.mec-mb-icon{border-radius:1px;letter-spacing:2px;border:1px solid #e6e6e6;color:#333;background-color:#fff;padding:13px 12px 13px 14px;font-weight:700;box-shadow:0 2px 0 0 rgba(0,0,0,.016);transition:all .28s ease;line-height:unset}.mec-event-list-modern .mec-modal-booking-button.mec-mb-icon:hover{border-color:#222;background:#222;color:#fff}.mec-event-footer .mec-modal-booking-button{position:absolute;top:20px;right:125px;margin:0;padding:0 16px;line-height:37px;border-radius:2px;margin-right:5px}.mec-skin-carousel-container .mec-event-footer-carousel-type2 .mec-modal-booking-button{font-size:12px;line-height:17px;height:41px}.mec-skin-carousel-container .mec-event-footer-carousel-type3 .mec-modal-booking-button{line-height:36px;font-size:12px;padding:0 10px;letter-spacing:0;float:right;margin:0 5px 0 0;height:unset}.mec-skin-carousel-container .mec-owl-crousel-skin-type4 .mec-modal-booking-button{color:#fff;background-color:#191919;border:2px #191919 solid;padding:10px 14px;letter-spacing:1.5px;font-size:11px;font-weight:700;font-style:normal;transition:all .22s ease;text-decoration:none;margin:0 0 0 12px}.mec-skin-carousel-container .mec-owl-crousel-skin-type4 .mec-modal-booking-button:hover{color:#191919;background-color:#fff;border:2px #fff solid}.mec-event-grid-modern .mec-event-footer .mec-modal-booking-button{right:auto;left:110px}.mec-event-grid-simple .mec-modal-booking-button,.mec-events-agenda .mec-modal-booking-button{margin:0;font-size:12px;transition:all .5s ease;-webkit-transition:all .5s ease;position:relative;padding:0;background:0 0;text-align:left;display:inline;border:0;font-weight:700}.mec-events-agenda .mec-modal-booking-button{display:block;height:unset;padding-left:173px;line-height:14px;margin-bottom:7px}.mec-yearly-view-wrap .mec-modal-booking-button{margin:0;padding-left:14px;text-transform:capitalize}.mec-event-grid-novel .mec-event-footer .mec-modal-booking-button.mec-mb-icon{right:auto;left:50px;width:36px;height:36px;display:table-cell;vertical-align:middle;padding:0 10px;border-color:rgba(255,255,255,.1);background-color:rgba(0,0,0,0);color:#fff;border-radius:36px}.mec-event-grid-novel .mec-event-footer .mec-modal-booking-button.mec-mb-icon:hover{background-color:rgba(255,255,255,.1)}.mec-event-grid-simple .mec-modal-booking-button:hover,.mec-events-agenda .mec-modal-booking-button:hover,.mec-events-yearlu .mec-modal-booking-button:hover{color:#191919}.mec-event-masonry .mec-event-footer .mec-modal-booking-button{font-size:12px;padding:0 31px;line-height:49px;height:50px;top:0;box-shadow:0 5px 11px -3px rgba(0,0,0,.05);right:auto;left:155px}.mec-timeline-event .mec-modal-booking-button{position:absolute;top:0;right:0;display:inline-block;padding:7px 20px 7px;line-height:22px;height:unset;border:unset;text-transform:capitalize;font-weight:500;font-size:13px;letter-spacing:0;margin:0;border-radius:0 0 0 10px}.mec-timeline-event .mec-modal-booking-button:hover{background:#191919;color:#fff}.mec-skin-daily-view-events-container .mec-modal-booking-button,.mec-weekly-view-dates-events .mec-event-article .mec-modal-booking-button{position:absolute;top:50%;transform:translateY(-50%);right:15px;line-height:26px;height:49px;border:unset;text-align:center;display:inline-block;background:#ededed;color:#191919;padding:12px;border-radius:2px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:2px;transition:all .24s ease;margin:0}.mec-skin-daily-view-events-container .mec-modal-booking-button:hover,.mec-weekly-view-dates-events .mec-event-article .mec-modal-booking-button:hover{background:#292929;color:#fff}@media (max-width:1023px){.mec-skin-daily-view-events-container .mec-modal-booking-button,.mec-weekly-view-dates-events .mec-event-article .mec-modal-booking-button{position:relative;top:unset;transform:unset;margin:14px 16px 0;padding:8px;line-height:20px;height:35px}}@media (max-width:768px){.featherlight .featherlight-inner{width:100%}.mec-events-agenda .mec-modal-booking-button{padding:0}}@media (max-width:480px){.mec-booking-modal .mec-events-meta-group-booking-shortcode{padding:20px}.mec-booking-modal .mec-booking-shortcode .mec-book-reg-field-mec_email,.mec-booking-modal .mec-booking-shortcode .mec-book-reg-field-name{width:100%}.mec-booking-modal .mec-booking-shortcode button#mec-book-form-btn-step-2{margin-left:20px}.mec-booking-modal .mec-booking-shortcode .mec-click-pay button[type=submit]{bottom:22px}.mec-calendar-events-side .mec-modal-booking-button:before,.mec-event-container-classic .mec-modal-booking-button:before,.mec-event-grid-minimal .mec-modal-booking-button:before,.mec-event-list-minimal .mec-modal-booking-button:before{display:none}.mec-calendar-events-side .mec-modal-booking-button,.mec-event-container-classic .mec-modal-booking-button,.mec-event-grid-minimal .mec-modal-booking-button,.mec-event-list-minimal .mec-modal-booking-button,.mec-timetable-t2-col .mec-modal-booking-button{margin:0;padding:0}.mec-event-grid-modern .mec-event-footer .mec-booking-button{top:20px}}.mec-wrap .mec-events-cal-links{margin-bottom:0}.mec-single-event #mec-wrap{padding:0;margin-top:35px}.mec-wrap .mec-single-title,.single-mec-events .mec-wrap.mec-no-access-error h1{margin-top:0;margin-bottom:30px;font-weight:700;font-size:33px}.mec-single-event .mec-event-content{padding:40px 0 30px;margin-bottom:10px}.mec-events-meta-group-booking .mec-booking-shortcode,.mec-single-event .mec-events-meta-group-booking,.mec-single-event .mec-frontbox{margin-bottom:30px;padding:40px;background:#fff;border:1px solid #e6e7e8}.mec-events-meta-group.mec-events-meta-group-gmap{margin-bottom:30px}.lity-content .mec-events-meta-group-booking{padding:40px;background:#fff;border:1px solid #e6e7e8}.lity-content .mec-events-meta-group-booking,.mec-events-meta-group-booking .mec-booking-shortcode,.mec-single-event .mec-events-meta-group-booking,.mec-single-event .mec-events-meta-group-countdown,.mec-single-event .mec-events-meta-group-gmap,.mec-single-event .mec-frontbox,.mec-single-modern .mec-single-event-bar{border-radius:3px;overflow:hidden;margin-bottom:30px}.mec-wrap #main-content{overflow:hidden;padding-top:35px}.mec-single-event .mec-map-get-direction-address-cnt{position:relative}.mec-single-event .mec-map-get-direction-address-cnt input.mec-map-get-direction-address{width:100%;height:46px;padding:13px 10px;margin-bottom:0;background:#fcfcfc;border:1px solid #e0e0e0;border-radius:0;box-shadow:inset 0 2px 5px rgba(0,0,0,.081)}.mec-single-event .mec-map-get-direction-address-cnt input.mec-map-get-direction-address:focus{color:#444;background:#fff;border-color:#b0b0b0;box-shadow:0 0 3px rgba(0,0,0,.2)}.mec-single-event .mec-map-get-direction-btn-cnt input{width:100%}.mec-single-event .mec-map-get-direction-reset{position:absolute;z-index:2;top:5px;right:10px;font-size:11px;cursor:pointer}.mec-events-meta-group-tags{margin-top:20px}.mec-events-meta-group-tags a{display:inline-block;color:#444;font-size:11px;text-transform:uppercase;letter-spacing:1.5px;font-weight:500;padding:3px 7px;border:1px solid #ddd;border-radius:2px;background:#fff;margin:1px 3px}.mec-events-meta-group-tags a:hover{text-decoration:underline;background:#f9f9f9}.mec-local-time-details li{list-style:none;font-size:14px;font-weight:300}.mec-single-event:not(.mec-single-modern) .mec-local-time-details{padding:12px 14px 8px;margin-bottom:12px;vertical-align:baseline;position:relative;border:none}.mec-single-event:not(.mec-single-modern) .mec-local-time-details ul{margin:0;padding-left:35px}.mec-single-event:not(.mec-single-modern) .mec-local-time-details h3{border:none;padding-left:15px}.mec-single-event:not(.mec-single-modern) .mec-local-time-details h3:before{display:none}.mec-single-event.mec-single-modern i.mec-sl-speedometer{display:none}.mec-single-modern .mec-local-time-details.mec-frontbox i{display:none}.lity-content .mec-events-meta-group-booking,.mec-events-meta-group-booking .mec-booking-shortcode,.mec-single-event .mec-events-meta-group-booking{z-index:1;overflow:visible}.lity-content .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields,.lity-content .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container,.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container,.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields,.mec-single-event .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container{margin:0 -41.835px;overflow:hidden;clear:both}.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li,.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li{margin-left:41.835px;margin-right:41.835px}.lity-content .mec-events-meta-group-booking ul,.mec-events-meta-group-booking .mec-booking-shortcode ul,.mec-single-event .mec-events-meta-group-booking ul{list-style:none;padding-left:0;margin-left:0}.lity-content .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container{margin:0}.lity-content .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container .col-md-6{float:left}.lity-content .mec-events-meta-group-booking ul li,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-ticket-variation-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode ul li:not(.option),.mec-single-event .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper,.mec-single-event .mec-events-meta-group-booking ul li{padding:0;list-style:none;margin-top:0;margin-bottom:30px}.lity-content .mec-events-meta-group-booking ul li.col-md-6:first-child,.mec-single-event .mec-events-meta-group-booking ul li.col-md-6:first-child{width:calc(50% - 10px);margin-right:10px;margin-left:0}.lity-content .mec-events-meta-group-booking ul li.col-md-6:nth-child(2),.mec-single-event .mec-events-meta-group-booking ul li.col-md-6:nth-child(2){width:calc(50% - 10px);margin-right:0;margin-left:10px}.lity-content .mec-events-meta-group-booking .mec-booking-form-container>.col-md-12,.mec-events-meta-group-booking .mec-booking-shortcode .col-md-12,.mec-single-event .mec-events-meta-group-booking .mec-booking-form-container>.col-md-12{display:flex;align-items:center;padding:0 0 30px 0;margin-bottom:30px;border-bottom:1px solid #f0f1f2}.lity-content .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .col-md-12 .mec-ticket-icon-wrapper,.mec-single-event .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper{margin-right:25px}.lity-content .mec-events-meta-group-booking .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span,.mec-events-meta-group-booking .mec-booking-shortcode .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span,.mec-single-event .mec-events-meta-group-booking .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span{display:block;font-size:14px;font-weight:400;line-height:19px;color:#606367;margin-bottom:4px}.lity-content .mec-events-meta-group-booking .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span.mec-ticket-price,.mec-events-meta-group-booking .mec-booking-shortcode .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span.mec-ticket-price,.mec-single-event .mec-events-meta-group-booking .col-md-12 .mec-ticket-name-description-wrapper .mec-ticket-price-wrapper span.mec-ticket-price{font-size:18px;font-weight:600;line-height:24px;color:#212224;margin:0}.lity-content .mec-events-meta-group-booking [id*=mec_booking_quantity_wrapper_],.mec-events-meta-group-booking .mec-booking-shortcode [id*=mec_booking_quantity_wrapper_],.mec-single-event .mec-events-meta-group-booking [id*=mec_booking_quantity_wrapper_]{font-size:13px;font-weight:400;line-height:16px;color:#8e9195;display:block;margin-bottom:5px;text-align:end}.lity-content .mec-events-meta-group-booking .mec-first-for-all-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-first-for-all-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-first-for-all-wrapper{clear:both;margin-bottom:26px}.lity-content .mec-events-meta-group-booking li h4,.mec-events-meta-group-booking .mec-booking-shortcode li h4,.mec-single-event .mec-events-meta-group-booking li h4{font-size:19px}.lity-content .mec-events-meta-group-booking button,.lity-content .mec-events-meta-group-booking input,.mec-events-meta-group-booking .mec-booking-shortcode button,.mec-events-meta-group-booking .mec-booking-shortcode input,.mec-single-event .mec-events-meta-group-booking button,.mec-single-event .mec-events-meta-group-booking input{border-radius:0;margin-bottom:6px}.lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3,.mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3{color:#636f72;background:#f6f7f8;border:1px solid #e7e8e9;float:left;margin:0}.lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3:hover,.mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2:hover{border:1px solid #d9dadc}.lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon,.mec-nextprev-prev-button svg,.mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon{margin-left:unset;margin-right:30px}mec-book-form-pay-button button#mec-book-form-back-btn-step-3{float:none}.mec-next-occ-booking,.mec-next-occ-booking-p{padding-left:15px}.mec-events-meta-group-booking .mec-next-occ-booking,.mec-events-meta-group-booking .mec-next-occ-booking-p{padding:0;font-size:12px;letter-spacing:0;margin:3px 0;padding:5px 1em 3px 0}.mec-book-username-password-wrapper{padding:0 15px}.lity-container .mec-next-occ-booking,.lity-container .mec-next-occ-booking-p{padding-left:0}.mec-ssl-protection-message{display:none}.lity-content .mec-events-meta-group-booking .mec-click-pay,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay,.mec-single-event .mec-events-meta-group-booking .mec-click-pay{max-width:100%}.lity-content .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r,.lity-content .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay #mec_woo_add_to_cart_btn_r,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay button.mec-book-form-next-button,.mec-single-event .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r,.mec-single-event .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button{float:right;margin:30px 0 0 0!important;background:#47dc6e!important;border-color:#47dc6e!important;color:#fff!important;font-weight:700!important}.lity-content .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r:hover,.lity-content .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button:hover,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay #mec_woo_add_to_cart_btn_r:hover,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay button.mec-book-form-next-button:hover,.mec-single-event .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r:hover,.mec-single-event .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button:hover{background:#54d274}.lity-container .mec-click-pay{max-width:400px}.lity-container .mec-book-form-btn-wrap button.mec-book-form-next-button,.lity-container .mec-click-pay #mec_woo_add_to_cart_btn_r{float:right}.lity-container button.mec-book-form-next-button{float:right}.lity-container .mec-click-pay #mec_woo_add_to_cart_btn_r:hover,.lity-container .mec-click-pay button.mec-book-form-next-button:hover{background:#000}.lity-content .mec-events-meta-group-booking .mec-click-next,.mec-events-meta-group-booking .mec-booking-shortcode .mec-click-next,.mec-single-event .mec-events-meta-group-booking .mec-click-next{float:right;position:relative;width:calc(100% - 186px)}.lity-container .mec-click-next{float:right;position:relative;width:calc(100% - 186px)}.mec-single-event .mec-book-form-coupon button{margin-left:0}.mec-single-event .mec-book-form-gateway-checkout button{margin-left:0}.mec-single-event .mec-single-event .mec-book-form-gateway-checkout button{margin-right:20px}.lity-content .mec-booking-progress-bar,.mec-booking-progress-bar,.mec-booking-shortcode .mec-booking-progress-bar,.mec-single-event .mec-booking-progress-bar{display:flex;flex-wrap:wrap;margin:60px 0 25px;position:relative;padding:0}.lity-content .mec-booking-progress-bar li,.mec-booking-shortcode .mec-booking-progress-bar li,.mec-wrap .mec-booking-progress-bar li{margin:28px 0 15px!important;text-align:center;font-size:15px;font-weight:700;color:#000;position:relative;flex:1;align-items:center;justify-content:center;list-style:none;z-index:99999}.lity-content .mec-booking-progress-bar li .progress-index,.mec-booking-shortcode .mec-booking-progress-bar li .progress-index,.mec-wrap .mec-booking-progress-bar li .progress-index{font-size:14px;font-weight:600;line-height:24px;color:var(--mec-color-skin);position:absolute;width:24px;height:24px;background:var(--mec-color-skin-rgba-1);border-radius:50%;top:-39px;left:calc(50% - 12px);z-index:1}.lity-content .mec-booking-progress-bar li.mec-active .progress-index,.mec-booking-shortcode .mec-booking-progress-bar li.mec-active .progress-index,.mec-wrap .mec-booking-progress-bar li.mec-active .progress-index{background:#54d274;border-color:#54d274;color:#fff}.lity-content .mec-booking-progress-bar li:before,.mec-booking-shortcode .mec-booking-progress-bar li:before,.mec-wrap .mec-booking-progress-bar li:before{content:"";position:absolute;width:calc(50% - 12px);height:2px;background:var(--mec-color-skin-rgba-1);top:-28px;left:0}.lity-content .mec-booking-progress-bar li:after,.mec-booking-shortcode .mec-booking-progress-bar li:after,.mec-wrap .mec-booking-progress-bar li:after{content:"";position:absolute;width:calc(50% - 12px);height:2px;background:var(--mec-color-skin-rgba-1);top:-28px;left:calc(50% + 12px)}.lity-content .mec-booking-progress-bar li.mec-active,.mec-booking-shortcode .mec-booking-progress-bar li.mec-active,.mec-wrap .mec-booking-progress-bar li.mec-active{color:#54d274}.lity-content .mec-booking-progress-bar li.mec-active:after,.lity-content .mec-booking-progress-bar li.mec-active:before,.mec-booking-shortcode .mec-booking-progress-bar li.mec-active:after,.mec-booking-shortcode .mec-booking-progress-bar li.mec-active:before,.mec-wrap .mec-booking-progress-bar li.mec-active:after,.mec-wrap .mec-booking-progress-bar li.mec-active:before{background:#54d274}.mec-single-event .row-done .mec-booking-progress-bar:after{background:#54d274}@media (max-width:480px){.lity-content .mec-booking-progress-bar li,.mec-booking-shortcode .mec-booking-progress-bar li,.mec-wrap .mec-booking-progress-bar li{font-size:12px}}@media (max-width:390px){.lity-content .mec-booking-progress-bar li,.mec-booking-shortcode .mec-booking-progress-bar li,.mec-wrap .mec-booking-progress-bar li{font-size:8px}.lity-content .mec-booking-progress-bar li.mec-active:after,.mec-booking-shortcode .mec-booking-progress-bar li.mec-active:after,.mec-wrap .mec-booking-progress-bar li.mec-active:after{font-size:14px}}.mec-wrap .mec-booking-progress-bar li.mec-active:last-child:before{width:50%}.mec-booking .mec-event-tickets-list .mec-event-ticket-available{margin-top:12px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row input[type=number]{display:block;margin:0 0 10px auto;box-shadow:unset;border:1px solid #e3e5e7;border-radius:4px;background:#fff;min-width:80px;width:80px!important;min-height:40px;height:40px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row input::-webkit-inner-spin-button,.mec-booking .mec-event-tickets-list .mec-ticket-style-row input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-3{margin-left:auto}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-input-wrapper{position:relative}.mec-booking .mec-event-tickets-list .mec-ticket-style-row input[type=number]{-moz-appearance:textfield}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus,.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus{position:absolute;right:5px;line-height:1;height:14px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus{top:5px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus{top:auto;bottom:5px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus:hover,.mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus:hover{background:#dbdbdb}.mec-booking .mec-event-tickets-list .mec-ticket-style-row a{text-decoration:none}.mec-booking .mec-event-tickets-list .mec-ticket-style-row{margin-bottom:30px}.mec-ticket-style-row.mec-ticket-available-spots{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;align-content:stretch;flex-wrap:nowrap}.mec-booking .mec-event-tickets-list .mec-ticket-style-row>div{width:unset}@media (max-width:480px){.mec-ticket-style-row.mec-ticket-available-spots{max-width:100%;display:flex;flex-direction:unset;align-items:unset;justify-content:unset;align-content:unset;flex-wrap:unset}.mec-wrap .mec-booking .mec-event-tickets-list .mec-ticket-style-row>div{width:100%;margin-bottom:10px}}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-1{width:unset;margin:5px 25px 0 0}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-available,.mec-booking .mec-event-tickets-list .mec-ticket-style-row>div{border:0;display:block;box-shadow:unset;margin:0}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-available{font-size:13px;font-weight:400;line-height:16px;color:#8e9195;text-align:right}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-name{font-size:14px;font-weight:400;line-height:19px;color:#606367;margin-bottom:4px}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-price{font-size:18px;font-weight:600;line-height:24px;color:#212224}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-description,.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-event-ticket-price,.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-3 div{margin:0}.mec-single-event .mec-book-first,.mec-single-event .mec-book-form-gateways,.mec-single-event .mec-book-form-price,.mec-single-event .mec-event-tickets-list,.mec-single-event form.mec-click-next{padding-left:0;padding-right:0}.lity-content .mec-book-first .mec-booking-calendar-wrapper,.mec-booking-calendar-wrapper,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper,.mec-single-fluent-wrap .mec-booking-calendar-wrapper{display:flex;justify-content:space-between;align-items:center;padding-bottom:30px;margin-bottom:30px;border-bottom:1px solid #f0f1f2}@media only screen and (max-width:767px){.lity-content .mec-events-meta-group-booking select,.mec-events-meta-group-booking .mec-booking-shortcode select,.mec-single-event .mec-events-meta-group-booking select{width:unset!important}}@media only screen and (max-width:479px){.lity-content .mec-book-first .mec-booking-calendar-wrapper,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper{flex-direction:column;align-items:flex-start}.mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-1{display:none}}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label{font-size:14px;font-weight:400;color:#606367}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label span.mec-required,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label span.mec-required,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label span.mec-required,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-label span.mec-required{color:#ec3365}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown,.lity-content .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown,.mec-booking-shortcode .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown,.mec-single-event .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown{border:1px solid #e3e5e7;border-radius:3px;max-width:300px;width:auto;height:42px;display:flex;background-color:#fff}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.lity-content .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.mec-booking-shortcode .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.mec-single-event .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon{display:flex;justify-content:center;align-items:center;border-right:1px solid #e3e5e7;background:#fafafa;min-width:40px}.lity-content .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown .mec-custom-nice-select,.mec-booking-shortcode .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown .mec-custom-nice-select,.mec-single-event .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown .mec-custom-nice-select{margin:0;border:none}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown .mec-select-date-calendar-formatted-date,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown .mec-select-date-calendar-formatted-date,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown .mec-select-date-calendar-formatted-date,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown .mec-select-date-calendar-formatted-date{font-size:13px;line-height:40px;padding:0 12px;width:240px}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons{cursor:pointer;line-height:33px;position:relative;right:10px}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container{position:absolute;right:40px;z-index:99}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar.mec-wrap,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar.mec-wrap,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar.mec-wrap,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar.mec-wrap{border:1px solid #e3e5e7;border-radius:5px}.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-next-month,.lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-previous-month,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-next-month,.mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-previous-month,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-next-month,.mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-previous-month,.mec-single-event .mec-book-first .mec-select-date-express-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-next-month,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-next-month,.mec-single-fluent-wrap .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container .mec-booking-calendar-month-navigation .mec-previous-month{border:none;box-shadow:none;line-height:40px;margin:0;border-radius:5px;padding:0 20px}.mec-single-event label.mec-fill-attendees{margin-left:0}.lity-content .mec-booking .mec-book-form-btn-wrap,.mec-wrap .mec-booking .mec-book-form-btn-wrap{padding-top:30px;border-top:1px solid #f0f1f2}.lity-content .mec-booking .mec-book-form-btn-wrap:after,.mec-wrap .mec-booking .mec-book-form-btn-wrap:after{content:"";display:block;clear:both}.mec-events-meta-group-booking #mec-book-form-btn-step-1,.mec-events-meta-group-booking #mec-book-form-btn-step-2{margin:0;float:right}.mec-wrap .mec-booking-form-container .col-md-12{padding-left:0}.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row{margin:0}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-title,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-title,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-title{font-size:18px;font-weight:600;line-height:24px;color:#212224;margin-bottom:20px}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons{display:flex;flex-wrap:wrap;padding-bottom:20px}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option{flex:calc(50% - 20px);max-width:calc(50% - 10px);border:1px solid #e6e7e8;border-radius:3px;margin-bottom:20px;padding:14.5px 20px 14.5px 15px;display:flex;justify-content:flex-start;align-items:center;cursor:pointer}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:has(input:checked),.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:has(input:checked),.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:has(input:checked){border:1px solid var(--mec-color-skin-rgba-2)}@media only screen and (max-width:767px){.lity-content .mec-events-meta-group-booking .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option{flex:100%;max-width:100%}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd){margin-right:0!important}}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd){margin-right:20px}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg{display:flex;margin-right:10px}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-title,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-title,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-title{font-size:14px;font-weight:600;line-height:18px}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio{margin-left:auto}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio input,.mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio input{left:-2px}.lity-content .mec-wrap-checkout .mec-book-form-gateways .mec-book-form-gateway-label,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout .mec-book-form-gateways .mec-book-form-gateway-label,.mec-wrap .mec-wrap-checkout .mec-book-form-gateways .mec-book-form-gateway-label{padding-left:3px}.mec-events-progress-bar{display:flex;align-items:center;margin-top:40px}.mec-event-list-standard .mec-events-progress-bar{position:absolute;margin-top:15px;left:calc(50% - 210px)}.mec-single-modern .mec-events-progress-bar{justify-content:flex-end;padding:0 20px;margin-top:10px}.mec-events-progress-bar .mec-progress-bar-time-passed,.mec-events-progress-bar .mec-progress-bar-time-remained{font-size:10px;line-height:14px;margin:0 10px 0 0;color:#959ca7;width:50px;text-align:center}.mec-events-progress-bar .mec-progress-bar-time-remained{margin:0 0 0 10px}.mec-events-progress-bar progress{width:300px;height:4px;border-radius:3px;position:relative}.mec-events-progress-bar progress:after{content:"";width:12px;height:12px;display:block;border-radius:100%;background-color:#38d5ed;position:absolute;top:-4px}.mec-events-progress-bar progress::-webkit-progress-bar{background-color:#e6e7e8;border-radius:3px}.mec-events-progress-bar progress::-webkit-progress-value{background-color:#38d5ed;border-radius:3px}.lity-content .mec-events-meta-group-booking .mec-event-ticket-available,.mec-events-meta-group-booking .mec-booking-shortcode .mec-event-ticket-available,.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available{display:block;margin-bottom:20px;margin-top:-17px;font-size:11px;color:#8a8a8a}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper{display:flex;justify-content:space-between;margin:30px 0 40px}@media only screen and (max-width:767px){.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper{flex-direction:column}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input{width:100%}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button{left:unset!important;right:5px}}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul{display:flex;align-items:center}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li{margin-bottom:0;text-align:right}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li{padding-left:30px;margin-left:30px;border-left:1px dashed #e6e7e8}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child{padding-left:unset;margin-left:unset;border-left:none}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span{display:block;font-size:14px;font-weight:400;line-height:19px;color:#606367;margin-bottom:4px}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span:last-child,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span:last-child,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span:last-child{font-size:18px;font-weight:600;line-height:24px;color:#212224;margin:0}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span.mec-book-price-total,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span.mec-book-price-total,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li span.mec-book-price-total{font-weight:700}@media only screen and (max-width:767px){.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul{margin-top:30px}}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form{margin:0;position:relative}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-wrapper{width:330px}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper{display:flex;border:1px solid #e3e5e7;border-radius:3px;max-width:330px}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon{display:flex;justify-content:center;align-items:center;border-right:1px solid #e3e5e7;background:#fafafa;min-width:40px}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper input{border:none;line-height:48px;height:unset}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button{margin:0!important;position:absolute!important;top:6px;left:auto;right:6px;padding:9px 18px 10px!important}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button.loading,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button.loading,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button.loading{color:#ecf9fd!important}.lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button.loading:after,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button.loading:after,.mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button.loading:after{position:absolute;left:calc(50% - 10px)}.lity-content .mec-events-meta-group-booking h5,.lity-content .mec-events-meta-group-booking label,.mec-events-meta-group-booking .mec-booking-shortcode h5,.mec-events-meta-group-booking .mec-booking-shortcode label,.mec-single-event .mec-events-meta-group-booking h5,.mec-single-event .mec-events-meta-group-booking label{color:#606367;font-size:14px;font-weight:400;line-height:19px;letter-spacing:0;margin:0 0 4px 0;display:block;clear:none;padding:0 1em 5px 0}.lity-content .mec-events-meta-group-booking h5 span,.mec-events-meta-group-booking .mec-booking-shortcode h5 span,.mec-single-event .mec-events-meta-group-booking h5 span{display:inline-block}.lity-content .mec-events-meta-group-booking h5 span.mec-ticket-variation-name,.mec-events-meta-group-booking .mec-booking-shortcode h5 span.mec-ticket-variation-name,.mec-single-event .mec-events-meta-group-booking h5 span.mec-ticket-variation-name{padding-right:5px;text-transform:capitalize}.lity-content .mec-events-meta-group-booking input::-webkit-input-placeholder,.mec-events-meta-group-booking .mec-booking-shortcode input::-webkit-input-placeholder,.mec-single-event .mec-events-meta-group-booking input::-webkit-input-placeholder{color:#aaa}.lity-content .mec-events-meta-group-booking input:-moz-placeholder,.mec-events-meta-group-booking .mec-booking-shortcode input:-moz-placeholder,.mec-single-event .mec-events-meta-group-booking input:-moz-placeholder{color:#aaa}.lity-content .mec-events-meta-group-booking input[type=date],.lity-content .mec-events-meta-group-booking input[type=email],.lity-content .mec-events-meta-group-booking input[type=number],.lity-content .mec-events-meta-group-booking input[type=password],.lity-content .mec-events-meta-group-booking input[type=tel],.lity-content .mec-events-meta-group-booking input[type=text],.lity-content .mec-events-meta-group-booking select,.lity-content .mec-events-meta-group-booking textarea,.mec-events-meta-group-booking .mec-booking-shortcode input[type=date],.mec-events-meta-group-booking .mec-booking-shortcode input[type=email],.mec-events-meta-group-booking .mec-booking-shortcode input[type=number],.mec-events-meta-group-booking .mec-booking-shortcode input[type=password],.mec-events-meta-group-booking .mec-booking-shortcode input[type=tel],.mec-events-meta-group-booking .mec-booking-shortcode input[type=text],.mec-events-meta-group-booking .mec-booking-shortcode select,.mec-events-meta-group-booking .mec-booking-shortcode textarea,.mec-single-event .mec-events-meta-group-booking input[type=date],.mec-single-event .mec-events-meta-group-booking input[type=email],.mec-single-event .mec-events-meta-group-booking input[type=number],.mec-single-event .mec-events-meta-group-booking input[type=password],.mec-single-event .mec-events-meta-group-booking input[type=tel],.mec-single-event .mec-events-meta-group-booking input[type=text],.mec-single-event .mec-events-meta-group-booking select,.mec-single-event .mec-events-meta-group-booking textarea{display:block;background:#fff;min-height:40px;min-width:180px;font-size:13px;line-height:38px;color:#606367;border:1px solid #e3e5e7;border-radius:3px;padding:0 12px;width:100%;margin-bottom:0;box-shadow:unset;clear:both}.lity-content .mec-events-meta-group-booking select:not(#mec_paypal_credit_card_card_type),.mec-events-meta-group-booking .mec-booking-shortcode select:not(#mec_paypal_credit_card_card_type),.mec-single-event .mec-events-meta-group-booking select:not(#mec_paypal_credit_card_card_type){width:100%;-webkit-appearance:none;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMS40MjQiIGhlaWdodD0iNi40MiIgdmlld0JveD0iMCAwIDExLjQyNCA2LjQyIj4NCiAgPGcgaWQ9Ikdyb3VwXzY1NjI3IiBkYXRhLW5hbWU9Ikdyb3VwIDY1NjI3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjIxMiAwLjIxMikiPg0KICAgIDxwYXRoIGlkPSJhbmdsZS1sZWZ0IiBkPSJNLjk5LDUuNWw1LDUuMDA1LS41LjVMMCw1LjUsNS41LDAsNiwuNS45OSw1LjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDUuOTk1KSByb3RhdGUoLTkwKSIgZmlsbD0iIzYzNmY3MiIgc3Ryb2tlPSIjNjM2ZjcyIiBzdHJva2Utd2lkdGg9IjAuMyIvPg0KICA8L2c+DQo8L3N2Zz4NCg==");background-position:calc(100% - 12px) center;background-repeat:no-repeat}.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li{width:calc(100% - 83.665px);float:left}.lity-content .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-ticket-variation-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper{width:100%}.lity-content .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li,.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields li,.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li{width:50%;float:left}.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields li,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li:first-child,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li:nth-child(2),.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li{width:calc(50% - 83.665px)}.lity-content .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields,.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields,.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields{padding-top:20px}.lity-content .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li.mec-paypal-credit-card-expiration-date-month select,.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields li.mec-paypal-credit-card-expiration-date-month select,.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li.mec-paypal-credit-card-expiration-date-month select{width:calc(50% - 24px)!important;display:inline-block;min-width:unset}@media only screen and (max-width:768px){.lity-content .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li:nth-child(odd),.mec-events-meta-group-booking .mec-booking-shortcode .mec-paypal-credit-card-payment-fields li:nth-child(odd),.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li:first-child,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li:nth-child(2),.mec-single-event .mec-events-meta-group-booking .mec-paypal-credit-card-payment-fields li:nth-child(odd){width:calc(100% - 83.665px);max-width:unset}.lity-content .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper input,.lity-content .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container li input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-ticket-variation-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li input,.mec-single-event .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper input,.mec-single-event .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container li input{max-width:unset!important}.lity-content .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper:nth-child(2n) input,.lity-content .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container li:nth-child(2n) input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-book-ticket-variation-wrapper:nth-child(2n) input,.mec-events-meta-group-booking .mec-booking-shortcode ul.mec-book-tickets-reg-fields-container li:nth-child(2n) input,.mec-single-event .mec-events-meta-group-booking .mec-book-ticket-variation-wrapper:nth-child(2n) input,.mec-single-event .mec-events-meta-group-booking ul.mec-book-tickets-reg-fields-container li:nth-child(2n) input{margin-left:0}}.wbmec-mandatory{padding-left:5px;font-size:14px;color:red}.lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper,.lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper,.lity-content .mec-events-meta-group-booking .mec-field-wrapper,.lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper,.mec-events-meta-group-booking .mec-booking-shortcode .mec-stripe-name-and-email-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-field-wrapper,.mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper{display:flex;align-items:flex-start}.lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.lity-content .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon,.lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper span.mec-field-icon,.mec-events-meta-group-booking .mec-booking-shortcode .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon,.mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.mec-single-event .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon,.mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon{border:1px solid #e3e5e7;background:#fafafa;border-radius:3px 0 0 3px;min-width:40px;height:40px;display:flex;justify-content:center;align-items:center}.lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper input,.lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-stripe-name-and-email-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input{border-left:none;border-radius:0 3px 3px 0}.lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper input,.lity-content .mec-events-meta-group-booking .mec-field-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper input,.mec-single-event .mec-events-meta-group-booking .mec-field-wrapper input{border-left:none;border-radius:0 3px 3px 0}.lity-content .mec-events-meta-group-booking .mec-red-notification input,.lity-content .mec-events-meta-group-booking .mec-red-notification select,.lity-content .mec-events-meta-group-booking .mec-red-notification textarea,.mec-events-meta-group-booking .mec-booking-shortcode .mec-red-notification input,.mec-events-meta-group-booking .mec-booking-shortcode .mec-red-notification select,.mec-events-meta-group-booking .mec-booking-shortcode .mec-red-notification textarea,.mec-single-event .mec-events-meta-group-booking .mec-red-notification input,.mec-single-event .mec-events-meta-group-booking .mec-red-notification select,.mec-single-event .mec-events-meta-group-booking .mec-red-notification textarea{border:1px solid #ff3c3c!important}.lity-content .mec-events-meta-group-booking .mec-red-notification input[type=checkbox],.lity-content .mec-events-meta-group-booking .mec-red-notification input[type=radio],.mec-events-meta-group-booking .mec-booking-shortcode .mec-red-notification input[type=checkbox],.mec-events-meta-group-booking .mec-booking-shortcode .mec-red-notification input[type=radio],.mec-single-event .mec-events-meta-group-booking .mec-red-notification input[type=checkbox],.mec-single-event .mec-events-meta-group-booking .mec-red-notification input[type=radio]{outline:1px solid #ff3c3c!important}.lity-content .mec-book-ticket-container .mec-red-notification input,.lity-content .mec-book-ticket-container .mec-red-notification select,.lity-content .mec-book-ticket-container .mec-red-notification textarea{border:1px solid #ff3c3c!important}.mec-booking .woocommerce-notices-wrapper .woocommerce-message{color:#089740;background-color:#effdef;margin:0;line-height:40px;border:0;border-radius:5px}.mec-booking .woocommerce-notices-wrapper .woocommerce-message a{margin:0}@media only screen and (max-width:479px){.lity-content .mec-events-meta-group-booking input[type=date],.lity-content .mec-events-meta-group-booking input[type=email],.lity-content .mec-events-meta-group-booking input[type=number],.lity-content .mec-events-meta-group-booking input[type=password],.lity-content .mec-events-meta-group-booking input[type=tel],.lity-content .mec-events-meta-group-booking input[type=text],.lity-content .mec-events-meta-group-booking select,.lity-content .mec-events-meta-group-booking textarea,.mec-events-meta-group-booking .mec-booking-shortcode input[type=date],.mec-events-meta-group-booking .mec-booking-shortcode input[type=email],.mec-events-meta-group-booking .mec-booking-shortcode input[type=number],.mec-events-meta-group-booking .mec-booking-shortcode input[type=password],.mec-events-meta-group-booking .mec-booking-shortcode input[type=tel],.mec-events-meta-group-booking .mec-booking-shortcode input[type=text],.mec-events-meta-group-booking .mec-booking-shortcode select,.mec-events-meta-group-booking .mec-booking-shortcode textarea,.mec-single-event .mec-events-meta-group-booking input[type=date],.mec-single-event .mec-events-meta-group-booking input[type=email],.mec-single-event .mec-events-meta-group-booking input[type=number],.mec-single-event .mec-events-meta-group-booking input[type=password],.mec-single-event .mec-events-meta-group-booking input[type=tel],.mec-single-event .mec-events-meta-group-booking input[type=text],.mec-single-event .mec-events-meta-group-booking select,.mec-single-event .mec-events-meta-group-booking textarea{width:100%}.lity-content .mec-events-meta-group-booking,.mec-events-meta-group-booking .mec-booking-shortcode,.mec-single-event .mec-events-meta-group-booking{padding:20px 10px}}.lity-content .mec-events-meta-group-booking input[type=email]:focus,.lity-content .mec-events-meta-group-booking input[type=number]:focus,.lity-content .mec-events-meta-group-booking input[type=password]:focus,.lity-content .mec-events-meta-group-booking input[type=tel]:focus,.lity-content .mec-events-meta-group-booking input[type=text]:focus,.lity-content .mec-events-meta-group-booking select:focus,.lity-content .mec-events-meta-group-booking textarea:focus,.mec-events-meta-group-booking .mec-booking-shortcode input[type=email]:focus,.mec-events-meta-group-booking .mec-booking-shortcode input[type=number]:focus,.mec-events-meta-group-booking .mec-booking-shortcode input[type=password]:focus,.mec-events-meta-group-booking .mec-booking-shortcode input[type=tel]:focus,.mec-events-meta-group-booking .mec-booking-shortcode input[type=text]:focus,.mec-events-meta-group-booking .mec-booking-shortcode select:focus,.mec-events-meta-group-booking .mec-booking-shortcode textarea:focus,.mec-events-meta-group-booking .mec-booking-shortcodec,.mec-single-event .mec-events-meta-group-booking input[type=email]:focus,.mec-single-event .mec-events-meta-group-booking input[type=number]:focus,.mec-single-event .mec-events-meta-group-booking input[type=password]:focus,.mec-single-event .mec-events-meta-group-booking input[type=tel]:focus,.mec-single-event .mec-events-meta-group-booking input[type=text]:focus,.mec-single-event .mec-events-meta-group-booking select:focus,.mec-single-event .mec-events-meta-group-booking textarea:focus{outline:0}.lity-content .mec-events-meta-group-booking input[type=checkbox],.lity-content .mec-events-meta-group-booking input[type=radio],.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox],.mec-events-meta-group-booking .mec-booking-shortcode input[type=radio],.mec-single-event .mec-events-meta-group-booking input[type=checkbox],.mec-single-event .mec-events-meta-group-booking input[type=radio]{margin-right:6px;margin-top:5px;min-height:20px;clear:none;margin:0}.lity-container .mec-events-meta-group-booking input[type=radio]:before,.lity-content .mec-events-meta-group-booking input[type=radio]:before,.mec-events-meta-group-booking .mec-booking-shortcode input[type=radio]:before,.mec-single-event .mec-events-meta-group-booking input[type=radio]:before{content:"";display:inline-block;background:#fff;border-radius:50%;width:18px;height:18px;cursor:pointer;border:2px solid #e1e7ed;position:absolute;top:-2px;left:-2px}.lity-container .mec-events-meta-group-booking input[type=radio]:checked:before,.mec-events-meta-group-booking .mec-booking-shortcode input[type=radio]:checked:before,.mec-single-event .mec-events-meta-group-booking input[type=radio]:checked:before{background:#38d5ed;border:4px solid #fff;box-shadow:0 0 0 2px #afebf5;width:14px;height:14px;top:0;left:0}.lity-container .mec-events-meta-group-booking input[type=radio],.lity-content .mec-events-meta-group-booking input[type=radio],.mec-events-meta-group-booking .mec-booking-shortcode input[type=radio],.mec-single-event .mec-events-meta-group-booking input[type=radio]{min-height:0;margin:0;position:relative;top:3px;left:3px;width:14px;height:14px}.lity-content .mec-events-meta-group-booking input[type=checkbox],.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox],.mec-single-event .mec-events-meta-group-booking input[type=checkbox]{float:left}.mec-events-meta-group-booking ul.mec-book-price-details{list-style:none;padding:0;overflow:hidden;display:flex;align-items:center}.mec-events-meta-group-booking ul.mec-book-price-details li{list-style:none;margin:0;border-right:1px dashed #e6e7e8;padding-right:30px!important;margin-right:30px;text-align:center}.mec-events-meta-group-booking ul.mec-book-price-details li.mec-book-price-detail.mec-book-price-detail-type-tickets{display:flex;align-items:center}.mec-events-meta-group-booking ul.mec-book-price-details li span{display:block;font-size:14px;font-weight:400;line-height:19px;color:#606367;margin-bottom:4px}.mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-icon{margin:0 30px 0 0;width:48px}.mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-amount{font-size:18px;font-weight:600;line-height:24px;color:#212224;margin-bottom:0}.mec-events-meta-group-booking ul.mec-book-price-details li:last-child{border-right:none}@media only screen and (max-width:767px){.mec-events-meta-group-booking ul.mec-book-price-details{flex-direction:column}.mec-events-meta-group-booking ul.mec-book-price-details li{border-right:none;padding-right:0!important;margin-right:0;border-bottom:1px dashed #e6e7e8;padding-bottom:30px!important;margin-bottom:30px}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul{flex-direction:column}.lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li{padding-left:0;margin-left:0;border-left:none;padding-bottom:30px;margin-bottom:30px;border-bottom:1px dashed #e6e7e8}}.lity-container .mec-events-meta-group-booking .mec_book_first_for_all,.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox],.lity-content .mec-events-meta-group-booking .mec_book_first_for_all,.lity-content .mec-events-meta-group-booking input[type=checkbox],.mec-booking input[type=checkbox],.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox],.mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all,.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox],.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox],.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all,.mec-single-event .mec-events-meta-group-booking input[type=checkbox],.mec-wrap .mec-simple-checkboxes-search ul li label input[type=checkbox]{-webkit-appearance:none;appearance:none;font:inherit;width:20px;height:20px;min-height:unset;padding:0;border:1px solid #e3e5e7;border-radius:4px;display:flex;margin:0 10px 0 1px;overflow:hidden}.lity-container .mec-events-meta-group-booking .mec_book_first_for_all:before,.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:before,.lity-content .mec-events-meta-group-booking .mec_book_first_for_all:before,.lity-content .mec-events-meta-group-booking input[type=checkbox]:before,.mec-booking input[type=checkbox]:before,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox]:before,.mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all:before,.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox]:before,.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:before,.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all:before,.mec-single-event .mec-events-meta-group-booking input[type=checkbox]:before,.mec-wrap .mec-simple-checkboxes-search ul li label input[type=checkbox]:before{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTAgOCI+DQogIDxwYXRoIGlkPSJEb25lIiBkPSJNOS4xNzUsMGEuOC44LDAsMCwwLS42NjUuMzA2bC01LjIsNS42NDdMMS4zODgsMy44MzNhLjcuNywwLDAsMC0uNjczLS4yMTIsMS4zODIsMS4zODIsMCwwLDAtLjcuNy44NjIuODYyLDAsMCwwLC4yMjYuNzI0TDIuNzk1LDcuNzkxYS43OTIuNzkyLDAsMCwwLDEuMDYyLjAxTDkuNzY5LDEuMzI5QS44MzIuODMyLDAsMCwwLDkuOTYuNTIxLDEsMSwwLDAsMCw5LjE3NSwwWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo=");min-width:18px;height:auto;line-height:16px;border-radius:2px;transform:scale(0);transition:120ms transform ease-in-out;background-color:var(--mec-color-skin);display:flex;justify-content:center}.lity-container .mec-events-meta-group-booking .mec_book_first_for_all:checked,.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:checked,.lity-content .mec-events-meta-group-booking input[type=checkbox]:checked,.mec-booking input[type=checkbox]:checked,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox]:checked,.mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all:checked,.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox]:checked,.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:checked,.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all:checked,.mec-single-event .mec-events-meta-group-booking input[type=checkbox]:checked,.mec-wrap .mec-simple-checkboxes-search ul li label input[type=checkbox]:checked{border:1px solid var(--mec-color-skin)!important}.lity-container .mec-events-meta-group-booking .mec_book_first_for_all:checked:before,.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:checked:before,.mec-booking input[type=checkbox]:checked:before,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox]:checked:before,.mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all:checked:before,.mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox]:checked:before,.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]:checked:before,.mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all:checked:before,.mec-single-event .mec-events-meta-group-booking input[type=checkbox]:checked:before,.mec-wrap .mec-simple-checkboxes-search ul li label input[type=checkbox]:checked:before{transform:scale(1)}.lity-container .mec-events-meta-group-booking label.wn-checkbox-label,.lity-content .mec-events-meta-group-booking label.wn-checkbox-label,.mec-events-meta-group-booking .mec-booking-shortcode label.wn-checkbox-label,.mec-single-event .mec-events-meta-group-booking label.wn-checkbox-label{display:none}.lity-content .mec-events-meta-group-booking button[type=submit]:after,.mec-events-meta-group-booking .mec-booking-shortcode button[type=submit]:after,.mec-single-event .mec-events-meta-group-booking button[type=submit]:after,.mec-single-event a.button:after,.mec-wrap .mec-events-meta-group-booking button[type=submit]:after{display:none;font-family:simple-line-icons;content:"\e098";margin-left:4px;-webkit-animation:rotating 1.2s linear infinite;-moz-animation:rotating 1.2s linear infinite;-ms-animation:rotating 1.2s linear infinite;-o-animation:rotating 1.2s linear infinite;animation:rotating 1.2s linear infinite}.lity-content .mec-events-meta-group-booking button[type=submit].loading:after,.mec-events-meta-group-booking .mec-booking-shortcode button[type=submit].loading:after,.mec-single-event .mec-events-meta-group-booking button[type=submit].loading:after,.mec-single-event a.button.loading:after,.mec-wrap .mec-events-meta-group-booking button[type=submit].loading:after{display:inline-block}.mec-single-event .mec-event-export-module{display:block}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul{display:table;width:100%}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li{display:table-cell}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li:last-child{text-align:right}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a:hover{color:#fff}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul{padding-left:0;margin:15px 5px}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting{padding-left:0;margin:0}.mec-ticket-price{margin-left:10px;font-size:13px;font-weight:300}.mec-book-reg-field-checkbox label,.mec-book-reg-field-radio label{line-height:1.36}.mec-book-reg-field-checkbox input[type=checkbox]{float:left;margin-right:10px!important}.mec-book-reg-field-radio input[type=radio]{float:left;margin-right:12px!important}.mec-book-ticket-container .mec-reg-mandatory:nth-child(2) label:after,.mec-book-ticket-container .mec-reg-mandatory:nth-child(3) label:after,.mec-book-ticket-container .wbmec-mandatory{content:"";color:red;width:50px;height:50px;font-size:14px;padding-left:5px}@media only screen and (max-width:767px){.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li{width:100%;min-height:40px;margin-bottom:15px;text-align:center;float:none;display:block}.mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a{width:100%;padding-left:0;padding-right:0;text-align:center;display:block;font-size:12px}}@media only screen and (max-width:767px){.lity-content .mec-events-meta-group-booking .mec-single-event .mec-events-meta-group-booking,.mec-events-meta-group-booking .mec-booking-shortcode{margin-bottom:30px}}.mec-single-event .mec-event-meta dt,.mec-single-event .mec-event-meta h3,.mec-single-modern .col-md-4 .mec-sponsors-details h3,.mec-sponsors-details .mec-events-single-section-title{text-transform:uppercase;font-size:16px;font-weight:700;padding-bottom:5px;display:inline;color:#000;padding-left:10px}.mec-single-event .mec-event-meta h6,.mec-single-event-sponsor span{font-size:14px;padding-bottom:5px;display:inline-block;color:#8d8d8d;margin:0;padding:0}.mec-single-event .mec-event-meta .mec-events-event-categories a,.mec-single-event .mec-event-meta dd{font-size:14px;color:#8d8d8d}.mec-single-event .mec-event-meta .mec-location dd.author{color:#3c3b3b}.mec-single-event .mec-event-meta dd{margin:0;padding-left:35px}.mec-single-event .mec-event-meta dd.mec-events-event-categories{min-height:35px;line-height:35px}@media only screen and (max-width:480px){.single-mec-events .lity-container{width:100%}.single-mec-events .lity-content .mec-events-meta-group-booking{padding:20px;width:85%;margin:0 auto}}.mec-single-event .mec-event-meta dd.mec-events-event-categories:first-of-type{padding-top:5px}.mec-single-event .mec-event-meta dd.mec-events-event-categories:last-of-type{border-bottom:0}.mec-single-event .mec-event-meta dd a{color:#8d8d8d;transition:all .2s ease;-ms-word-wrap:break-word;word-wrap:break-word}.mec-single-event .mec-event-meta dd a i:before{font-size:16px!important}.mec-single-event .mec-event-meta dd a i{margin-right:8px}.mec-single-event .mec-event-meta dl{margin-bottom:0}.mec-single-event .mec-event-meta .mec-events-event-cost{font-size:14px;font-weight:300}.mec-single-event .mec-event-meta .mec-events-address .mec-address,.mec-single-event .mec-event-meta .mec-location-opening-hour span,.mec-single-event .mec-event-meta .mec-location-url span{font-size:12px;color:#a9a9a9;display:block}.mec-single-event .mec-event-meta .mec-location-opening-hour,.mec-single-event .mec-event-meta .mec-location-tel,.mec-single-event .mec-event-meta .mec-location-url{margin-top:10px}.mec-single-event .mec-event-meta .mec-location-description{margin-top:15px;padding:0}.mec-single-event .mec-event-meta .mec-events-meta-group-venue .author{margin-bottom:0;color:#8d8d8d;font-size:13px}.mec-single-event .mec-events-event-image{margin-bottom:0}.mec-single-event .mec-events-event-image img{border-radius:5px;max-width:100%;height:auto}.mec-event-gallery-wrapper{display:flex;flex-direction:row}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper{min-width:90px;margin-right:30px}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul{list-style:none;padding:0}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li{display:flex;margin-bottom:15px;cursor:pointer}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li img{width:90px;border-radius:5px}.mec-event-gallery-wrapper .mec-event-gallery-image img{border-radius:5px}@media (max-width:960px){.mec-event-gallery-wrapper{flex-direction:column-reverse}.mec-event-gallery-wrapper .mec-event-gallery-image{margin-bottom:10px}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper{margin-right:0}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul{display:flex;flex-flow:row wrap}.mec-event-gallery-wrapper .mec-event-gallery-image-list-wrapper ul li{margin-bottom:15px;margin-right:15px;flex:1 1 calc(15% - 20px)}}#mec-event-gallery ul#mec_meta_box_event_gallery{display:flex;flex-flow:row wrap;list-style:none;padding:0}#mec-event-gallery ul#mec_meta_box_event_gallery li{flex:0 1 calc(33.333333% - 10px);margin-right:10px;position:relative}#mec-event-gallery ul#mec_meta_box_event_gallery li img{width:100%!important;height:75px;object-fit:cover}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete{padding:0;min-height:20px;height:20px;width:20px;margin:0;border-radius:50%;position:absolute;top:2px;right:2px;box-shadow:none;background:#fff;border-color:#e3e4e5;font-size:0px;cursor:pointer;transition:.2s}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:before{content:"";width:20px;height:20px;display:block;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZWE2NDg1Ij48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg==");background-position:center}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover{color:#fff;border-color:#ea6485;background:#ea6485}#mec-event-gallery ul#mec_meta_box_event_gallery li span.mec-event-gallery-delete:hover:before{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgd2lkdGg9IjFlbSIgaGVpZ2h0PSIxZW0iIHN0eWxlPSItbXMtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSIjZmZmZmZmIj48cGF0aCBkPSJNMTQuOTUgNi40NkwxMS40MSAxMGwzLjU0IDMuNTRsLTEuNDEgMS40MUwxMCAxMS40MmwtMy41MyAzLjUzbC0xLjQyLTEuNDJMOC41OCAxMEw1LjA1IDYuNDdsMS40Mi0xLjQyTDEwIDguNThsMy41NC0zLjUzeiIvPjwvc3ZnPg==")}.mec-single-event h2.mec-single-event-title{margin-bottom:30px;font-weight:700;font-size:33px}.mec-single-event .mec-booking-button{border-bottom:none;letter-spacing:.5px;line-height:48px;height:76px;transition:all .5s ease;color:#fff;padding:16px;display:block;text-align:center;font-size:16px;border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.15)}.mec-single-event .mec-booking-button:hover{background-color:#101010!important}.mec-single-event .mec-event-tags a{display:inline-block;color:#444;font-size:11px;text-transform:uppercase;letter-spacing:1.5px;font-weight:500;padding:3px 7px;border:1px solid #ddd;border-radius:2px;background:#fff;margin:1px 3px}.mec-single-event .mec-event-tags:before{font-size:24px;color:#303030;margin-right:5px;content:"\f02c";font-family:fontawesome}.mec-single-event .mec-event-tags{padding-top:13px}.mec-single-event .mec-event-sharing{margin:30px 0 10px}.mec-region.mec-events-abbr,.mec-single-event .mec-street-address{font-style:normal;font-size:13px}.mec-events-meta-group.mec-events-meta-group-venue:before,.mec-single-event-date:before,.mec-single-event-time:before{color:#40d9f1}.mec-single-event .mec-event-social{text-align:center}.mec-single-event .mec-event-social h3{text-transform:uppercase;font-size:15px;font-weight:700;padding-bottom:5px;color:#313131;border-bottom:4px solid #ebebeb;width:100%;display:block;padding-bottom:10px;position:relative}.mec-single-event .mec-social-single:before{padding:13px 35px;border-bottom:4px solid #40d9f1;font-size:6px;content:"";text-align:center;position:absolute;bottom:-4px;margin-left:39px}.mec-single-event .mec-event-social .event-sharing{margin-top:30px}.mec-single-event .mec-event-social ul{list-style:none;margin-left:0;padding:0;display:flex;align-items:center;justify-content:center;flex-wrap:wrap}.mec-single-event .mec-event-social li.mec-event-social-icon{display:inline-block}.mec-single-event .mec-event-social li.mec-event-social-icon a{display:inline-block;color:#fff;width:40px;height:40px;padding:6px;font-size:18px;margin-right:5px;margin-bottom:5px;border-radius:2px}.mec-single-event .mec-event-social a.facebook{background:#3b5996}.mec-single-event .mec-event-social a.facebook:hover{background:#28385c}.mec-single-event .mec-event-social a.twitter svg{width:22px;height:22px;margin-top:0;padding:0}.mec-single-event .mec-event-social a.twitter{background:#e1e1e1;padding:9px!important}.mec-single-event .mec-event-social a.twitter:hover{background:#e1e1e1}.mec-single-event .mec-event-social a.twitter:hover{background:#373737}.mec-single-event .mec-event-social a.twitter:hover svg path{fill:#fff}.mec-single-event .mec-event-social a.vimeo{background:#0dadd6}.mec-single-event .mec-event-social a.vimeo:hover{background:#0a85a3}.mec-single-event .mec-event-social a.dribble{background:#d53e68}.mec-single-event .mec-event-social a.dribble:hover{background:#bf4c78}.mec-single-event .mec-event-social a.youtube{background:#cb322c}.mec-single-event .mec-event-social a.youtube:hover{background:#992622}.mec-single-event .mec-event-social a.pinterest{background:#cb2027}.mec-single-event .mec-event-social a.pinterest:hover{background:#99181d}.mec-single-event .mec-event-social a.google{background:#c3391c}.mec-single-event .mec-event-social a.google:hover{background:#99181f}.mec-single-event .mec-event-social a.linkedin{background:#0073b2}.mec-single-event .mec-event-social a.linkedin:hover{background:#005380}.mec-single-event .mec-event-social a.email{background:#ff5d5e}.mec-single-event .mec-event-social a.email:hover{background:#cc4949}.mec-single-event .mec-event-social a.vk{background:#5b88bd}.mec-single-event .mec-event-social a.vk:hover{background:#3d608a}.mec-single-event .mec-event-social a.tumblr{background:#34465d}.mec-single-event .mec-event-social a.tumblr:hover{background:#273649}.mec-single-event .mec-event-social a.telegram{background:#08c}.mec-single-event .mec-event-social a.telegram:hover{background:#1076be}.mec-single-event .mec-event-social a.whatsapp{background:#25d366}.mec-single-event .mec-event-social a.whatsapp:hover{background:#23ac55}.mec-single-event .mec-event-social a.flipboard{background:#e12828}.mec-single-event .mec-event-social a.flipboard:hover{background:#af1e1e}.mec-single-event .mec-event-social a.pocket{background:#ef4056}.mec-single-event .mec-event-social a.pocket:hover{background:#8d1717}.mec-single-event .mec-event-social a.reddit{background:#ff5700}.mec-single-event .mec-event-social a.reddit:hover{background:#c94909}.mec-single-event .mec-event-social a.flipboard svg,.mec-single-event .mec-event-social a.telegram svg{height:18px;margin-top:5px}.mec-single-event .mec-event-social li.mec-event-social-icon a svg{display:unset}.mec-single-event .mec-event-social a.rss{background:#f29a1d}.mec-single-event .mec-event-social a.rss:hover{background:#cc7400}.mec-single-event .mec-event-social a.instagram{background:#457399}.mec-single-event .mec-event-social a.instagram:hover{background:#2e4d66}.mec-single-event .mec-event-social a.linkedin{background:#457399}.mec-single-event .mec-event-social a.linkedin:hover{background:#2e4d66}.mec-single-event .mec-event-social a.other-social{background:#ff5d5e}.mec-single-event .mec-event-social a.other-social:hover{background:#cc4949}.mec-single-event .mec-event-social{text-align:center}.lity-content .mec-events-meta-group-booking form,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout,.mec-events-meta-group-booking .mec-booking-shortcode form,.mec-single-event .mec-events-meta-group-booking form{margin:0}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4,.lity-content .mec-events-meta-group-booking form>h4,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout h4,.mec-events-meta-group-booking .mec-booking-shortcode form>h4,.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4,.mec-single-event .mec-events-meta-group-booking form>h4,.mec-single-event .mec-frontbox-title,.mec-single-event .mec-wrap-checkout h4{text-transform:uppercase;font-size:15px;font-weight:700;color:#313131;border-bottom:4px solid #ebebeb;width:100%;display:block;padding-bottom:10px;position:relative;text-align:center;margin:0 0 40px 0}.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4:before,.lity-content .mec-events-meta-group-booking form>h4:before,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout h4:before,.mec-events-meta-group-booking .mec-booking-shortcode form>h4:before,.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4:before,.mec-single-event .mec-events-meta-group-booking form>h4:before,.mec-single-event .mec-frontbox-title:before,.mec-single-event .mec-wrap-checkout h4:before{padding:1px 35px;border-bottom:4px solid #40d9f1;font-size:6px;content:"";text-align:center;position:absolute;bottom:-4px;margin-left:-35px;left:50%}.lity-content .mec-events-meta-group-booking input[data-stripe=exp-month],.lity-content .mec-events-meta-group-booking input[data-stripe=exp-year],.mec-events-meta-group-booking .mec-booking-shortcode input[data-stripe=exp-month],.mec-events-meta-group-booking .mec-booking-shortcode input[data-stripe=exp-year],.mec-single-event .mec-events-meta-group-booking input[data-stripe=exp-month],.mec-single-event .mec-events-meta-group-booking input[data-stripe=exp-year]{width:47%!important;margin-right:12px;margin-top:5px;display:inline-block!important}@media (max-width:768px){.mec-events-meta-group-booking .mec-booking-shortcode input[data-stripe=exp-month],.mec-events-meta-group-booking .mec-booking-shortcode input[data-stripe=exp-year],.mec-single-event .mec-events-meta-group-booking input[data-stripe=exp-month],.mec-single-event .mec-events-meta-group-booking input[data-stripe=exp-year]{width:100%!important;margin-right:0;display:block!important}}.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes,.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes{margin-bottom:22px}.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes label,.mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes label,.mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes label{margin-bottom:3px;line-height:20px}.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes label{display:flex}.lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox]{margin-top:-1px}.mec-events-meta-group-booking-shortcode .mec-booking-dates-checkboxes label{display:flex;align-items:center}.mec-events-meta-group-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox]{margin-top:1px}.mec-event-meta i:before{font-size:20px!important;vertical-align:middle}.mec-event-meta .mec-single-event-additional-organizers dl dd i:before,.mec-event-meta .mec-single-event-location dl dd i:before,.mec-event-meta .mec-single-event-organizer dl dd i:before{font-size:14px!important}#mec-wrap .mec-events-day-time-slot .mec-events-content{float:left;width:33%;padding:0 15px}#mec-wrap .mec-events-day-time-slot .mec-events-event-image{padding-left:0}#mec-events-content .mec-events-abbr{color:#8d8d8d;font-size:14px}.mec-single-event .mec-events-content{margin-bottom:30px}.mec-single-event .mec-organizer-url a{word-wrap:break-word}.mec-single-event #headline{margin:0 0 10px}.mec-single-event #headline h2{padding:0}.mec-single-event .mec-events-meta-group.mec-events-meta-group-gmap .mec-events-venue-map{margin-top:0;padding:8px;border:1px solid #e5e5e5;border-radius:7px}#mec-events-gmap-0{height:325px!important}.mec-events-list .mec-events-day-time-slot .mec-events-event-meta{width:33%;float:left;padding:40px;height:auto;margin:0}.mec-events-day-time-slot .mec-events-content.description.entry-summary{font-size:15px;font-weight:300;color:#8d8d8d}.mec-events-day-time-slot .type-mec_events h2{font-size:28px;padding-bottom:20px}.mec-events-day .mec-events-day-time-slot .type-mec_events{margin:0}.mec-events-day .mec-events-day-time-slot h5{background-color:#8d8d8d}.mec-single-event .mec-event-meta .mec-single-event-additional-locations .mec-events-single-section-title,.mec-single-event .mec-event-meta .mec-single-event-additional-organizers .mec-events-single-section-title,.mec-single-event .mec-event-meta .mec-single-event-location .mec-events-single-section-title,.mec-single-event .mec-event-meta .mec-single-event-organizer .mec-events-single-section-title,.mec-single-event .mec-events-meta-date h3{padding:0 0 5px 10px;margin-top:0;display:inline-block}.mec-events-single-section-title a span{font-size:12px}.mec-single-event-additional-locations .mec-single-event-location{padding:0}.mec-single-event .mec-events-meta-date h3{width:100%}.mec-single-event .mec-events-event-image{border:0}.mec-single-event .mec-events-venue-map{padding:0}.mec-event-cost,.mec-event-more-info,.mec-event-website,.mec-events-meta-date,.mec-local-time-details,.mec-single-event-additional-locations,.mec-single-event-additional-organizers,.mec-single-event-category,.mec-single-event-date,.mec-single-event-label,.mec-single-event-location,.mec-single-event-organizer,.mec-single-event-sponsor,.mec-single-event-time{padding:12px 14px 8px;margin-bottom:12px;vertical-align:baseline;position:relative}.mec-single-event-sponsor ul{margin:0;padding:0;list-style:none}.mec-single-event-sponsor ul li{margin-bottom:35px}.mec-single-event-sponsor ul li:last-child{margin-bottom:0}.mec-wrap .mec-single-event-sponsor h3,.mec-wrap .mec-single-modern .col-md-4 .mec-sponsors-details h3{padding:0 0 20px 0;margin:0;display:block}.mec-single-event .mec-events-meta-date dd,.mec-single-event .mec-single-event-additional-organizers dd,.mec-single-event .mec-single-event-organizer dd{padding-left:0;margin-bottom:10px}.mec-single-event .mec-single-event-location dd{padding-left:0}.mec-single-event .mec-single-event-location dd.author>a{font-size:16px;font-weight:300}.mec-single-event .mec-event-meta dd.mec-organizer-email a,.mec-single-event .mec-events-meta-date dd span,.mec-single-event .mec-single-event-additional-organizers dd span,.mec-single-event .mec-single-event-location dd span,.mec-single-event .mec-single-event-organizer dd span{display:block;padding-left:0;color:#8d8d8d}.mec-single-event .mec-events-meta-date i,.mec-single-event .mec-single-event-additional-organizers i,.mec-single-event .mec-single-event-location dl dd i,.mec-single-event .mec-single-event-organizer dl dd i{margin-right:10px;margin-left:12px}.mec-events-meta-group.mec-events-meta-group-venue dl{margin-bottom:0}address.mec-events-address{line-height:19px;font-style:normal;font-size:12px}.mec-single-event .mec-event-content dt{margin-top:5px}.mec-single-event .mec-single-event-additional-organizers .mec-single-event-additional-organizer{margin-bottom:15px;padding-bottom:5px}.mec-single-event .mec-single-event-additional-organizers .mec-single-event-additional-organizer:last-child{margin-bottom:0;padding-bottom:0}.mec-event-category-color{width:9px;height:9px;display:inline-block;vertical-align:middle;margin:0 0 0 4px;border-radius:9px}.mec-event-schedule-content{border-left:4px solid #f0f0f0;padding-top:10px;margin-top:30px;margin-left:25px;margin-bottom:20px;color:#8a8a8a}.mec-event-schedule-content dl{padding-left:24px;font-size:12px;position:relative;margin-bottom:35px}.mec-event-schedule-content dl:before{content:"";display:block;position:absolute;left:0;top:4px;width:20px;height:0;border-top:4px solid #f0f0f0}.mec-event-schedule-content dl dt{margin:0 0 10px;line-height:1.16}.mec-event-schedule-content dl dt.mec-schedule-title{font-size:13px;color:#5a5a5a;font-weight:700}.mec-event-schedule-content dl dt.mec-schedule-description{font-weight:300}.mec-event-schedule-content .mec-schedule-speakers{padding:10px}.mec-wrap .mec-event-schedule-content h6{font-size:13px;color:#5a5a5a;font-weight:700;display:inline-block}.mec-wrap .mec-event-schedule-content a{font-weight:400;color:#5a5a5a;transition:all .1s ease}.single-mec-events .mec-speakers-details ul{padding:0;margin-left:0}.mec-single-event .mec-speakers-details ul li{list-style:none;padding:5px 5px 18px 5px;margin-top:14px}.mec-single-event .mec-speakers-details ul li a{-webkit-transition:.2s all ease;transition:.2s all ease}.mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a img{float:left;border-radius:50%;transition:.2s all ease;border:2px solid transparent;width:68px;height:68px;object-fit:cover}.mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a:hover img{border-color:#40d9f1}.mec-single-event .mec-speakers-details .speaker-details{display:inline-block}.mec-single-event .mec-speakers-details ul li .mec-speaker-name{display:inline-block;margin-top:10px;font-size:15px;line-height:1.8;text-transform:capitalize;font-weight:700!important;padding-left:8px}.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title{display:block;font-size:12px;margin-top:-1px;padding-left:8px;color:#888}.mec-single-event-additional-organizers img,.mec-single-event-location img,.mec-single-event-organizer img,.mec-sponsor img{margin-bottom:5px;width:100%}.mec-qrcode-details{text-align:center}.mec-time-comment{font-size:11px}.mec-wrap .mec-attendees-list-details p{font-weight:300;margin:20px 0 0 0;color:#8d8d8d}.mec-wrap .mec-attendees-list-details li{list-style:none;display:block;margin-top:15px}.mec-wrap .mec-attendees-list-details li .mec-attendee-avatar{display:inline-block}.mec-wrap .mec-attendees-list-details li .mec-attendee-profile-link{display:inline-block;vertical-align:top;margin-left:10px}.mec-attendees-list-details ul{margin-bottom:0}.mec-attendees-list-details .mec-attendee-profile-link a{color:#8d8d8d;display:block}.mec-attendees-list-details .mec-attendee-profile-link span{display:inline-block;color:#000;vertical-align:middle;cursor:pointer}.mec-attendees-list-details span.mec-attendee-profile-ticket-number{border-radius:50px;width:20px;height:20px;font-size:12px;text-align:center;color:#fff;margin-right:4px;line-height:20px}#wrap .mec-attendees-list-details span.mec-attendee-profile-ticket-number{line-height:19px}.mec-attendees-list-details .mec-attendee-profile-link span i{vertical-align:middle;font-size:9px;font-weight:700;margin-left:5px}.mec-attendees-list-details .mec-attendees-toggle{border:1px solid #e6e6e6;background:#fafafa;padding:15px 15px 0;border-radius:3px;margin:12px 0 20px 52px;position:relative;font-size:13px;box-shadow:0 3px 1px 0 rgba(0,0,0,.02)}.mec-attendees-list-details .mec-attendees-toggle:after,.mec-attendees-list-details .mec-attendees-toggle:before{content:"";display:block;position:absolute;left:50px;width:0;height:0;border-style:solid;border-width:10px}.mec-attendees-list-details .mec-attendees-toggle:after{top:-20px;border-color:transparent transparent #fafafa transparent}.mec-attendees-list-details .mec-attendees-toggle:before{top:-21px;border-color:transparent transparent #e1e1e1 transparent}.mec-attendees-list-details .mec-attendees-toggle .mec-attendees-item{padding-bottom:15px}.mec-attendees-list-details .mec-attendee-avatar img{border-radius:3px}.mec-attendee-avatar-sec{float:left;width:50px;margin-right:12px}.mec-attendee-profile-name-sec,.mec-attendee-profile-ticket-sec{float:left;width:calc(100% - 62px);margin-top:3px}.mec-calendar{margin-bottom:20px;border:1px solid #e8e8e8;width:100%;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-calendar .mec-calendar-topsec{display:table;background:#fff}.mec-calendar .mec-calendar-topsec .mec-calendar-side .mec-calendar-table{border-top:1px solid #eaeaea}.mec-calendar .mec-calendar-topsec .mec-calendar-events-sec{display:none}.mec-calendar .mec-calendar-side{width:590px;display:table-cell;padding:40px;position:relative;text-align:center;box-shadow:0 1px 5px 6px rgba(0,0,0,.005) inset}.mec-calendar .mec-calendar-events-side{display:table-cell;height:100%;border-left:1px solid #efefef;padding:40px;width:100%}.mec-calendar .mec-calendar-events-side .mec-table-side-day{width:46px;height:46px;margin:0 auto 20px;position:relative;text-align:center;line-height:44px;border:1px solid #40d9f1;border-radius:50%;font-size:14px;font-weight:600;padding:0}.mec-calendar .mec-calendar-events-side .mec-table-side-title{text-align:center;font-size:11px;text-transform:uppercase;letter-spacing:3px;margin-bottom:14px}.mec-calendar .mec-calendar-header{position:relative;width:560px;margin-top:8px;margin-bottom:16px}.mec-calendar.mec-event-calendar-classic .mec-calendar-header{width:unset}.mec-calendar .mec-calendar-header h2{text-transform:uppercase;font-size:22px;font-weight:700;color:#333}.mec-calendar .mec-event-footer{width:auto;min-height:60px}.mec-calendar dl{display:table;margin:0;border:none;padding:0;table-layout:fixed}.mec-calendar dt{display:table-cell;transition:all .66s ease;color:#a4aab1;background:#fff;border-radius:44px;font-size:14px;width:80px;height:80px;line-height:80px;text-align:center}.excerpt-wrap .mec-wrap dt,.nv-content-wrap .mec-wrap dt{display:table-cell}.mec-calendar .mec-calendar-table .mec-no-event{display:none}.mec-calendar .mec-calendar-table-head dt{font-weight:600;text-transform:uppercase;font-size:15px;color:#636f72}.mec-calendar .mec-calendar-row dt:hover{background:#f4f4f4}.mec-calendar .mec-table-nullday{color:#cacaca}.mec-calendar.mec-box-calendar .mec-table-nullday:last-child{border-right:1px solid #eaeaea}.mec-calendar .mec-next-month:hover,.mec-calendar .mec-prev-month:hover{background:#f4f4f4}.mec-calendar .mec-selected-day,.mec-calendar .mec-selected-day:hover{background:#40d9f1;color:#fff}.mec-calendar .mec-selected-day a{color:#fff}.mec-calendar .mec-has-event{position:relative}.mec-calendar .mec-calendar-row dt.mec-has-event:hover{background:#40d9f1}.mec-calendar .mec-has-event a{cursor:pointer;display:block;width:100%;height:100%;border-radius:50%;color:#4d4d4d;transition:all .25s ease;text-decoration:none;box-shadow:none}.mec-calendar .mec-calendar-row dt.mec-has-event.mec-selected-day a,.mec-calendar .mec-calendar-row dt.mec-has-event:hover a{color:#fff}.mec-calendar .mec-has-event:after{background-color:#40d9f1;border-radius:50%;display:block;content:"";width:8px;height:8px;bottom:10px;left:calc(50% - 4px);position:absolute;transition:all .25s ease}.mec-calendar .mec-calendar-row dt.mec-has-event:hover:after{background-color:#fff}.mec-calendar .mec-has-event.mec-selected-day:after{display:none}.mec-calendar .mec-event-article{display:flex;text-align:left;margin-bottom:0;padding-bottom:25px;padding-top:26px;border-top:1px solid #efefef;transition:all .33s ease}@media only screen and (max-width:479px){.mec-calendar.mec-calendar-daily .mec-event-artile,.mec-calendar.mec-calendar-weekly .mec-event-article{flex-direction:column;gap:15px}}.mec-daily-contents-wrapper,.mec-weekly-contents-wrapper{display:flex}.mec-calendar .mec-month-side .mec-event-article{padding-left:5px;padding-right:5px}.mec-calendar .mec-event-article:hover{background-color:#fafafa}.mec-calendar .mec-event-article .mec-event-time{font-size:11px;line-height:1.1;margin:0}.mec-calendar .mec-event-article .mec-event-title{font-size:13px;padding:0;margin:10px 0 8px;font-weight:700;text-transform:uppercase}.mec-calendar .mec-event-article .mec-event-title a{text-decoration:none;color:#494949;transition:color .3s ease}.mec-calendar .mec-event-article .mec-event-title a:hover{color:#40d9f1}.mec-calendar .mec-event-list-classic .mec-event-image img{width:65px;height:auto}.mec-calendar .mec-event-article .mec-event-image{max-width:70px;margin-right:15px;height:auto}.mec-calendar .mec-event-article .mec-categories-wrapper,.mec-calendar .mec-event-article .mec-categories-wrapper ul.mec-categories li.mec-category a,.mec-calendar .mec-event-article .mec-event-detail,.mec-calendar .mec-event-article .mec-localtime-details div,.mec-calendar .mec-event-article .mec-shortcode-organizers,.mec-calendar .mec-event-article .mec-shortcode-organizers .mec-organizer-item span{font-size:13px;line-height:1.3;color:#9a9a9a;margin-bottom:0}.mec-calendar .mec-calendar-side .mec-next-month,.mec-calendar .mec-calendar-side .mec-previous-month{cursor:pointer;position:absolute;top:0;min-width:50px;height:50px;line-height:50px;text-align:center;background:#fff;color:#a9a9a9;font-size:12px;letter-spacing:1px;text-transform:uppercase;padding-left:10px;padding-right:10px;border:1px solid #efefef;border-top:none;box-shadow:0 2px 0 0 rgba(0,0,0,.015);transition:all .33s ease}.mec-calendar .mec-calendar-side .mec-next-month i,.mec-calendar .mec-calendar-side .mec-previous-month i{font-size:12px;color:#40d9f1;cursor:pointer}.mec-calendar .mec-calendar-side .mec-next-month:hover,.mec-calendar .mec-calendar-side .mec-previous-month:hover{background-color:#f9f9f9;color:#40d9f1}.mec-calendar .mec-calendar-side .mec-previous-month{left:0;border-bottom-right-radius:6px;border-left:none}.mec-calendar .mec-calendar-side .mec-next-month{right:0;border-bottom-left-radius:6px;border-right:none}@media only screen and (min-width:961px){.mec-wrap.mec-sm959 .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) .mec-has-event:after{width:6px;height:6px;bottom:6px}.mec-wrap.mec-sm959 .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) .mec-calendar-side{width:370px}.mec-wrap.mec-sm959 .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) .mec-calendar-header{position:relative;width:350px;margin-top:30px;margin-bottom:20px;padding-top:20px}.mec-wrap.mec-sm959 .mec-calendar:not(.mec-event-calendar-classic):not(.mec-calendar-weekly) dt{width:50px;height:50px;line-height:50px}}@media only screen and (max-width:1200px){.mec-calendar .mec-has-event:after{width:6px;height:6px;bottom:6px}.mec-calendar .mec-calendar-side{width:370px}.mec-calendar .mec-calendar-header{position:relative;width:350px;margin-top:30px}.mec-calendar dt{width:50px;height:50px;line-height:50px}}@media only screen and (max-width:767px){.mec-calendar .mec-calendar-header h2{font-size:18px}.mec-calendar .mec-calendar-topsec{width:100%}.mec-calendar .mec-calendar-side{width:100%;display:block;padding:30px}.mec-calendar .mec-calendar-header{width:auto}.mec-calendar .mec-calendar-events-side{width:100%;display:block;height:100%;border-left:none;border-top:1px solid #efefef;padding:20px}.mec-calendar dl{width:100%}.mec-calendar dt{width:14%;height:60px;line-height:60px;border-radius:50px}}@media only screen and (max-width:479px){.mec-calendar .mec-has-event:after{width:4px;height:4px}.mec-calendar .mec-calendar-header h2{font-size:16px;margin-top:33px}.mec-calendar dt{height:38px;line-height:38px}.mec-calendar .mec-event-list-classic .mec-event-detail,.mec-calendar .mec-event-list-classic .mec-event-title{font-size:12px}.mec-calendar .mec-event-list-classic .mec-event-time{font-size:10px}}.mec-box-calendar.mec-calendar .mec-has-event a,.mec-box-calendar.mec-calendar dt{border-radius:0}.mec-box-calendar.mec-calendar .mec-calendar-header{margin-top:2px;margin-bottom:30px}.mec-box-calendar.mec-calendar dt{border-bottom:1px solid #eaeaea;border-left:1px solid #eaeaea}.mec-box-calendar.mec-calendar dl dt:last-child{border-right:1px solid #eaeaea}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month,.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{border-radius:2px;top:40px;border:1px solid #eee;height:30px;line-height:30px;z-index:1}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{left:40px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month{right:40px}.mec-box-calendar.mec-calendar .mec-calendar-side{box-shadow:none}.mec-box-calendar.mec-calendar .mec-calendar-events-side{border:none}.mec-box-calendar.mec-calendar .mec-calendar-events-side .mec-table-side-day{border-radius:2px}.mec-box-calendar.mec-calendar h4.mec-month-label{position:relative;width:560px;margin-top:2px;margin-bottom:30px;text-transform:uppercase;font-size:22px;font-weight:700;color:#333}.mec-widget .mec-box-calendar.mec-calendar h4.mec-month-label{width:100%;margin-top:8px;font-size:13px}@media only screen and (max-width:1200px){.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{left:42px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month{right:42px}.mec-calendar .mec-calendar-header h2{font-size:17px;margin-top:7px}}@media only screen and (max-width:767px){.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month,.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{top:28px;font-size:10px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{left:30px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month{right:30px}.mec-calendar .mec-calendar-header h2{font-size:15px}}@media only screen and (max-width:479px){.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month,.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{font-size:0;padding:4px 8px;text-align:center;min-width:33px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{left:10px}.mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month{right:10px}}.mec-calendar.mec-event-calendar-classic,.mec-calendar.mec-event-calendar-classic .mec-calendar-side{border:none;padding:0;width:100%;height:100%;box-shadow:none}.mec-calendar.mec-event-calendar-classic .mec-calendar-side{display:block}.mec-calendar.mec-event-calendar-classic dl.mec-calendar-row,.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head{width:100%}.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head{background:#f5f6f7}.mec-calendar.mec-event-calendar-classic dl.mec-calendar-table-head .mec-calendar-day-head{background:0 0;height:unset;line-height:36px;border-top-width:1px;border-top-style:solid;border-top-color:#eaeaea}.mec-calendar.mec-event-calendar-classic dl dt{width:15%;height:136px;line-height:1.2;text-align:left;padding:5px 7px;position:relative}.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month,.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-previous-month{top:0}.mec-calendar.mec-event-calendar-classic .mec-has-event:after{bottom:auto;top:24px;left:7px;margin:0}.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-previous-month{left:0}.mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month{right:0}.mec-next-month a,.mec-previous-month a{pointer-events:none;line-height:15px}.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec{text-align:left;background:#fafafa;border:1px solid #eaeaea;border-top:none;padding:10px 20px}.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec{display:none}.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-event-article:hover{background-color:#fcfcfc}.mec-calendar.mec-event-calendar-classic .mec-selected-day,.mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover{color:#40d9f1;font-weight:700;background:#fafafa;border-bottom:none}.mec-wrap .mec-calendar.mec-event-calendar-classic:not(.mec-event-container-simple) .mec-selected-day:hover{color:#fff!important}.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-table-side-day,.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-table-side-title{display:inline-block;margin:0;margin-bottom:15px;font-weight:700}.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-table-side-day{margin-left:4px}.mec-calendar.mec-event-calendar-classic .mec-calendar-row dt.mec-has-event a{color:#4d4d4d}.mec-calendar.mec-event-calendar-classic .mec-calendar-row dt.mec-has-event:not(.mec-selected-day):hover a{color:#fff}@media only screen and (max-width:1200px){.mec-calendar.mec-event-calendar-classic dl dt{height:100px}}@media only screen and (max-width:767px){.mec-calendar.mec-event-calendar-classic dl dt{height:40px}}@media only screen and (max-width:479px){.mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec{padding:10px}}.mec-calendar .mec-event-article.mec-single-event-novel{padding:4px 8px;min-height:25px;margin:0 -3px;border-radius:0;display:block}.mec-calendar .mec-event-article.mec-single-event-novel h4{margin:0;font-size:13px;line-height:1.5;font-weight:500;text-transform:capitalize;margin:0 0 2px 0}.mec-calendar .mec-event-article.mec-single-event-novel .mec-shortcode-organizers i,.mec-calendar .mec-event-article.mec-single-event-novel .mec-shortcode-organizers ul li span{color:#000}.mec-calendar.mec-event-container-novel dl dt{padding:3px}.mec-calendar.mec-event-calendar-classic .mec-calendar-novel-selected-day{display:inline-block;padding:4px;margin-left:1px}.mec-wrap .mec-calendar.mec-event-container-novel .mec-selected-day:hover{color:#fff!important}.mec-calendar.mec-event-calendar-classic .mec-selected-day .mec-calendar-novel-selected-day{color:#fff}.mec-calendar.mec-event-calendar-classic.mec-event-container-novel .mec-selected-day,.mec-calendar.mec-event-calendar-classic.mec-event-container-novel dt.mec-selected-day:hover{border-bottom:1px solid #eaeaea}.mec-calendar.mec-event-calendar-classic.mec-event-container-novel .mec-calendar-side .mec-calendar-table{min-height:auto}.mec-single-event-novel.light h4{color:#000!important}.mec-single-event-novel.dark h4{color:#fff!important}@media only screen and (max-width:768px){.mec-calendar .mec-event-article.mec-single-event-novel{padding:2px;min-height:5px}.mec-calendar .mec-event-article.mec-single-event-novel h4{display:block;font-size:13px}}@media only screen and (max-width:480px){.mec-calendar .mec-event-article.mec-single-event-novel h4{font-size:11px}}.mec-event-container-simple .event-single-content-simple{display:none}.mec-event-calendar-classic.mec-event-container-simple .mec-calendar-side .mec-calendar-table{min-height:unset}.mec-event-container-simple .mec-monthly-tooltip h4{font-size:13px;font-weight:500;margin:0;color:#444}.mec-event-container-simple .mec-monthly-tooltip h4:hover{text-decoration:underline;color:#111}.mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple{border-bottom:1px dashed #e3e3e3;padding:5px 2px;display:block}.mec-event-container-simple .simple-skin-ended:nth-last-of-type(2) .mec-monthly-tooltip.event-single-link-simple{border-bottom:none}.mec-event-container-simple .mec-calendar-day .ended-relative:nth-last-child(1of.ended-relative) .mec-monthly-tooltip.event-single-link-simple{border:none}.mec-calendar.mec-event-container-simple dl dt.mec-calendar-day{font-size:30px;color:#000}.mec-calendar.mec-event-container-simple .mec-calendar-row dt:hover{background:unset}.mec-calendar.mec-event-container-simple .mec-calendar-row dt,.mec-calendar.mec-event-container-simple .mec-calendar-row dt:last-child,.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt,.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt:last-child{border-width:2px}.mec-calendar.mec-event-container-simple dl dt.mec-selected-day,.mec-calendar.mec-event-container-simple dl dt.mec-selected-day:hover{border-bottom:2px solid #40d9f1;background:unset}.mec-calendar.mec-event-container-simple .mec-calendar-table-head dt{border-top-width:2px!important}@media (max-width:768px){.mec-calendar.mec-event-container-novel,.mec-calendar.mec-event-container-simple{overflow-x:scroll}.mec-calendar.mec-event-container-novel .mec-calendar-side,.mec-calendar.mec-event-container-simple .mec-calendar-side{min-width:100%}.mec-event-container-novel .mec-calendar-side,.mec-event-container-simple .mec-calendar-side{min-width:650px!important}}.mec-wrap.colorskin-custom .mec-calendar.mec-event-container-simple .mec-selected-day:hover{background:#f4f4f4}.mec-tooltip-event-title{font-size:16px;font-weight:700;color:#000;margin-bottom:2px}.mec-tooltip-event-time,.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-content .mec-price-details{font-size:12px;color:#888;margin-bottom:8px;margin-top:5px}.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-content{padding:17px}.mec-tooltip-event-content{clear:both}.mec-tooltip-event-featured{float:left;margin-right:13px;margin-bottom:1px}.mec-tooltip-event-featured img{max-width:120px}.mec-tooltip-event-desc{font-size:14px;color:#444;line-height:18px}.mec-tooltip-event-desc p{font-size:13px;line-height:1.4;margin-bottom:10px}.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-box{border-radius:3px!important;border:1px solid #e2e3e4!important;background:#fff!important;box-shadow:0 -1px 30px -2px rgba(0,0,0,.15)!important}.tooltipster-box .mec-tooltip-event-desc{margin-bottom:12px}.tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-arrow{overflow:visible!important}.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-arrow-border{border-width:12px!important}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right:not( .uael-tooltipster-active ) .tooltipster-arrow-border{border-right-color:#e2e3e4!important}.tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-arrow-border{left:-12px!important;z-index:9999999999!important}.tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-arrow-background{display:block!important}.tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-arrow-background{border-width:11px!important;z-index:99999999999!important}.tooltipster-sidetip.tooltipster-right:not(.uael-tooltipster-active) .tooltipster-arrow-background{left:-9px!important;top:1px!important;border-right-color:#fff!important}.tooltipster-sidetip.tooltipster-top:not(.uael-tooltipster-active) .tooltipster-arrow-background{border-top-color:#fff!important;left:0!important;top:-1px!important}.tooltipster-sidetip.tooltipster-top:not(.uael-tooltipster-active) .tooltipster-arrow-border{left:-1px!important}.tooltipster-sidetip.tooltipster-shadow.tooltipster-top:not( .uael-tooltipster-active ) .tooltipster-arrow-border{border-top-color:#e2e3e4!important}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom:not( .uael-tooltipster-active ) .tooltipster-arrow-border{left:-1px!important;top:-11px!important}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom:not( .uael-tooltipster-active ) .tooltipster-arrow-border{border-bottom-color:#e2e3e4!important}.tooltipster-sidetip.tooltipster-bottom:not(.uael-tooltipster-active) .tooltipster-arrow-background{top:-9px!important;border-bottom-color:#fff!important}.tooltipster-sidetip.tooltipster-left:not(.uael-tooltipster-active) .tooltipster-arrow-background{border-left-color:#fff!important;left:-2px!important;top:0!important}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left:not( .uael-tooltipster-active ) .tooltipster-arrow-border{border-left-color:#e2e3e4!important;left:-1px!important;top:-1px!important}@media (max-width:768px){.mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple h4{font-size:13px}}@media (max-width:480px){.mec-event-container-simple .mec-monthly-tooltip.event-single-link-simple h4{font-size:11px}}.mec-calendar.mec-calendar-daily .mec-calendar-day-events .mec-event-article{padding-left:15px;padding-right:15px;position:relative}.mec-calendar.mec-calendar-daily .mec-calendar-a-month{text-align:center;background-color:#fff;border-bottom:2px solid #f4f4f4;position:relative}.mec-calendar.mec-calendar-daily .mec-calendar-a-month h4{color:#444;font-size:18px;line-height:1.2;padding:15px 0 11px;margin:0;font-weight:700;letter-spacing:1px;text-transform:uppercase;border-bottom:1px solid #e6e6e6}.mec-calendar.mec-calendar-daily .mec-calendar-d-top{text-align:center;padding:10px 0;position:relative;background-color:#fafafa}.mec-calendar.mec-calendar-daily .mec-next-month,.mec-calendar.mec-calendar-daily .mec-previous-month{position:absolute;top:50%;left:50%;margin-top:-25px;min-width:50px;height:50px;line-height:50px;text-align:center;background:#fff;border:1px solid #e2e2e2;border-radius:50px;box-shadow:0 2px 0 0 rgba(0,0,0,.015);transition:all .33s ease;cursor:pointer}.mec-calendar.mec-calendar-daily .mec-next-month i,.mec-calendar.mec-calendar-daily .mec-previous-month i{font-size:14px;cursor:pointer}.mec-calendar.mec-calendar-daily .mec-next-month:hover,.mec-calendar.mec-calendar-daily .mec-previous-month:hover{border-color:#d0d0d0;color:#444;box-shadow:0 2px 5px 0 rgba(0,0,0,.075)}.mec-calendar.mec-calendar-daily .mec-previous-month{margin-left:-150px}.mec-calendar.mec-calendar-daily .mec-next-month{margin-left:100px}.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month,.mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month{min-height:28px;height:28px;line-height:28px;width:28px;margin-top:-14px;border-radius:3px}.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2,.mec-calendar.mec-calendar-daily .mec-calendar-d-top h3{margin-top:9px;color:#b9b9b9;font-size:30px;font-weight:100;text-transform:uppercase;margin-bottom:12px;line-height:1}.mec-calendar.mec-calendar-daily .mec-calendar-d-top h2{font-size:81px;color:#444;margin-bottom:10px;line-height:1.1}.mec-calendar.mec-calendar-daily .mec-calendar-d-table{overflow:hidden;background:#fff;min-height:60px;border-top:1px solid #e6e6e6;border-bottom:2px solid #f3f3f3;padding:0 50px;position:relative}@media only screen and (min-width:479px){.mec-calendar.mec-calendar-daily .mec-calendar-d-table{padding:0 55px}}.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl{width:1310px;display:block}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl{display:none}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl.mec-weekly-view-week-active{display:flex}.mec-calendar.mec-calendar-daily .mec-calendar-d-table a,.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt{display:block;background:#fff;width:42px;height:60px;line-height:60px;text-align:center;float:left;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;border-radius:0}.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day:hover,.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt:hover{background:#fafafa;box-shadow:0 2px 5px 0 rgba(0,0,0,.065) inset;cursor:pointer}.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day{cursor:default;background:#fff;color:#c1c1c1;line-height:59px;text-align:center;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6}.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event{cursor:pointer;font-weight:700;color:#4a4a4a}.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-daily-view-day-active,.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt.mec-table-d-current{font-weight:700;background:#fafafa;color:#40d9f1}.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next,.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev{float:none;font-size:14px;width:55px;position:absolute;top:0;left:0;cursor:pointer}.mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next{left:auto;right:0;border-left:1px solid #e6e6e6;border-right:none}.mec-calendar.mec-calendar-daily .mec-today-container .mec-today-count{font-size:12px;color:#888;text-align:center}@media only screen and (max-width:479px){.mec-calendar.mec-calendar-daily .mec-previous-month{margin-left:-130px}.mec-calendar.mec-calendar-daily .mec-next-month{margin-left:80px}.mec-calendar.mec-calendar-daily .mec-calendar-a-month h4{font-size:14px;letter-spacing:0}}.widget .mec-calendar.mec-calendar-daily .mec-calendar-a-month h4{font-size:14px;letter-spacing:0}.widget .mec-calendar.mec-calendar-daily .mec-previous-month{margin-left:-130px}.widget .mec-calendar.mec-calendar-daily .mec-next-month{margin-left:80px}.mec-util-hidden{display:none}.mec-frontbox.mec-util-hidden{display:none!important}.mec-daily-view-dates-events{padding:0;background-color:#fff}.mec-daily-view-date-events,.mec-weekly-view-date-events{list-style:none;margin:0}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table{padding:0}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl{width:calc(100% - 1px)}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt{width:100%;height:70px;line-height:normal;cursor:default}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:hover{background:#fff;cursor:default}.mec-calendar-weekly article:hover li{background:0 0}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:last-child{border-right:none}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span{font-size:12px;font-weight:700;text-transform:uppercase;display:block;margin:15px 0 6px}.mec-calendar.mec-calendar-weekly .mec-calendar-d-table a.mec-table-d-next,.mec-calendar.mec-calendar-weekly .mec-calendar-d-table a.mec-table-d-prev{display:none}ul.mec-weekly-view-dates-events,ul.mec-weekly-view-dates-events li{padding:0;margin:0;line-height:initial;background:#fff}.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date{width:64px;height:64px;margin-right:10px;font-size:11px;text-transform:uppercase;float:left;text-align:center;padding-top:2px}.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span{font-size:40px;line-height:30px;font-weight:700;display:block;margin-bottom:6px;letter-spacing:1px}.mec-calendar.mec-calendar-weekly .mec-calendar-a-month .mec-previous-month{margin-left:0;left:12px}.mec-calendar.mec-calendar-weekly .mec-calendar-a-month .mec-next-month{margin-left:0;left:auto;right:12px}@media only screen and (max-width:479px){.mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span{font-size:9px;letter-spacing:0}.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date{width:100%;height:36px;margin-bottom:12px;line-height:1;font-size:10px;margin-right:5px;text-align:left}.mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span{font-size:18px;margin-bottom:5px}}.widget .mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt span{font-size:9px;letter-spacing:0}.widget .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date{width:100%;height:36px;margin-bottom:12px;line-height:1;font-size:10px;margin-right:5px;text-align:left}.widget .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date span{font-size:18px;margin-bottom:5px}.mec-week-events-container .mec-weekly-view-dates-events li.mec-no-event-found{list-style:none!important}li.mec-no-event-found .mec-event-title{text-align:center}.mec-widget .mec-calendar{max-width:100%}.mec-widget .mec-calendar dl dt,.mec-wrap.mec-sm959.mec-widget .mec-calendar.mec-event-calendar-classic dl dt{height:40px}.mec-widget .mec-calendar .mec-calendar-events-sec{padding:10px}.mec-widget .mec-calendar .mec-calendar-header h2{font-size:13px;margin-top:8px}.mec-widget .mec-calendar .mec-event-list-classic .mec-event-image{margin-right:12px}.mec-widget .mec-calendar .mec-has-event:after{width:4px;height:4px}.mec-widget .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-table-side-title{font-size:14px}.mec-widget .mec-calendar .mec-event-article .mec-event-image{margin-right:11px}.mec-widget .mec-box-calendar.mec-calendar .mec-calendar-header{margin-bottom:20px}.mec-widget .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month,.mec-widget .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month{font-size:0;padding:4px;text-align:center;min-width:33px}.mec-widget .mec-event-calendar-classic .mec-calendar-side .mec-calendar-table{min-height:200px}.mec-widget .mec-event-list-classic{margin-bottom:8px;padding:8px 0}.mec-widget .mec-event-list-classic .mec-event-article{margin-bottom:0;padding:10px 0;position:relative;min-height:86px;padding-left:80px}.mec-widget .mec-event-list-classic .mec-event-date{font-size:10px;line-height:14px;text-transform:uppercase}.mec-widget .mec-event-list-classic .mec-event-title{font-size:13px}.mec-widget .mec-event-list-classic .mec-event-detail{font-size:11px}.mec-widget .mec-event-list-classic .mec-event-image{width:68px;position:absolute;left:0}.mec-event-list-classic .mec-event-image img{width:100%}.mec-widget .mec-event-list-classic .mec-event-detail{overflow:visible}.event-color{width:14px;display:inline-block;vertical-align:middle;height:14px;margin-left:5px;border-radius:50%}.mec-map-lightbox-wp{padding:15px 15px 0;background-color:#fff}.mec-map-view-event-detail.mec-event-detail{background-color:#e9e9e9;padding:8px 15px}.mec-map-lightbox-wp.mec-event-list-classic .mec-event-article{padding:0 0 15px;margin:0}.mec-map-lightbox-wp.mec-event-list-classic .mec-event-image{width:70px;margin-right:15px}.mec-marker-infowindow-wp{padding:10px}.mec-marker-infowindow-wp .mec-marker-infowindow-count{width:60px;height:60px;display:block;text-align:center;line-height:60px;border:1px solid #40d9f1;border-radius:50%;font-size:32px;color:#40d9f1;float:left;margin-right:11px}.mec-marker-infowindow-wp .mec-marker-infowindow-content{overflow:hidden;padding-top:6px}.mec-marker-infowindow-wp .mec-marker-infowindow-content span{display:block;color:#222}.mec-marker-infowindow-wp .mec-marker-infowindow-content span:first-child{font-size:15px;font-weight:700}.mec-marker-wrap{display:inline-block;width:35px;height:35px;margin:15px 0 0 4px;border-radius:50% 50% 50% 0;background:#00cae9;animation-name:mec-map-bounce;animation-fill-mode:both;animation-duration:1s;border:1px solid #fff;cursor:pointer}.mec-marker-wrap .mec-marker{margin-top:5px;display:block;-webkit-transform:rotate(45deg) translate(1px,0);transform:rotate(45deg) translate(1px,0);text-align:center;color:#fff;font-size:17px}.mec-marker-wrap .mec-marker-pulse-wrap{-webkit-transform:rotate(45deg);transform:rotate(45deg);display:inline-block;margin-left:-11px;margin-top:0}.mec-marker-wrap .mec-marker-pulse{display:inline-block;background:#01cae947;border-radius:50%;height:12px;width:14px;margin-left:3px;-webkit-transform:rotateX(55deg);transform:rotateX(55deg);z-index:-2}.mec-marker-wrap .mec-marker-pulse:after{content:"";border-radius:50%;height:40px;width:40px;position:absolute;margin:-13px 0 0 -13px;animation:pulsate 1s ease-out;animation-iteration-count:infinite;opacity:0;box-shadow:0 0 1px 2px #00cae9;animation-delay:1.1s}@keyframes pulsate{0%{transform:scale(.1,.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2,1.2);opacity:0}}@keyframes mec-map-bounce{0%{opacity:0;transform:translateY(-2000px) rotate(-45deg)}60%{opacity:1;transform:translateY(30px) rotate(-45deg)}80%{transform:translateY(-10px) rotate(-45deg)}100%{transform:translateY(0) rotate(-45deg)}}.mec-skin-grid-container .mec-skin-map-container,.mec-skin-list-container .mec-skin-map-container{margin-bottom:20px}.mec-single-event .mec-events-meta-group-countdown{color:#c9c9c9;text-align:center;margin-bottom:30px;padding:20px 30px;background:#fff;border:1px solid #e6e6e6;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-events-meta-group-countdown .countdown-w{text-align:center;font-size:36px;margin:0 auto;padding:40px 0 0;position:relative;display:table;table-layout:fixed}.mec-events-meta-group-countdown .countdown-w .icon-w{font-size:24px}.mec-events-meta-group-countdown .countdown-w .label-w{font-size:15px;font-weight:300;letter-spacing:1px;text-transform:uppercase;position:relative}.mec-events-meta-group-countdown .countdown-w .block-w{display:table-cell;margin:0 20px 10px;position:relative;height:70px;width:190px;font-size:72px;transition:all .3s ease-in-out;line-height:1.2}.mec-events-meta-group-countdown .countdown-w .block-w.done-w{border:0 none}.mec-events-meta-group-countdown .countdown-w .block-w li{font-size:50px}.mec-events-meta-group-countdown .countdown-w span{padding:24px 0 20px}.mec-events-meta-group-countdown .countdown-w .div-d{display:none}.mec-events-meta-group-countdown .countdown-w .countdown-message{display:none}.mec-events-meta-group-countdown .countdown-w .block-w i{display:none}#countdown{list-style:none;margin-bottom:0;margin-top:0;margin-left:0;padding-left:0}.mec-events-meta-group-countdown .mec-end-counts h3{display:inherit;text-align:center;font-size:16px;right:50%}.mec-countdown-details .countdown-w .clockdiv li p{margin-top:23px}@media (min-width:481px) and (max-width:768px){.mec-events-meta-group-countdown .countdown-w{padding:0}.mec-events-meta-group-countdown .countdown-w .label-w{font-size:12px;letter-spacing:0}.mec-events-meta-group-countdown .countdown-w span{font-size:34px}}@media (min-width:320px) and (max-width:480px){.mec-events-meta-group-countdown .countdown-w .label-w{font-size:10px}.mec-events-meta-group-countdown .countdown-w span{font-size:28px}.mec-countdown-details .countdown-w .clockdiv li p{margin-top:16px}}@media (max-width:320px){.mec-events-meta-group-countdown .countdown-w .label-w{font-size:9px;letter-spacing:0}.mec-events-meta-group-countdown .countdown-w span{font-size:22px}}.info-msg,.mec-error,.mec-success,.warning-msg{margin:30px 0 20px 0;padding:10px;border-radius:5px;font-size:13px;line-height:22px}.info-msg{color:#07bbe9;background-color:#ecf9fe}.mec-cart .mec-success,.mec-success{color:#2ca84c;background-color:#e8f9ed}.warning-msg{color:#cf7909;background-color:#fef7e7}.mec-error{color:#cb2916!important;background-color:#fef2f2}.mec-fes-form,.mec-fes-list{background:#f8feff;padding:30px 3%;color:#798f96}.mec-fes-list .mec-fes-list-top-actions,.mec-fes-list ul{margin:0 auto 15px;max-width:960px;list-style:none;padding-left:40px}.mec-fes-form-cntt .dashicons-editor-help{display:none}.mec-fes-list ul li *{text-decoration:none!important}.mec-fes-list ul li{padding:20px 15px;border-radius:3px;margin-bottom:15px;border:1px solid #cfeff5;box-shadow:0 2px 6px -4px #cfeff5;background:#fff;line-height:normal}.mec-fes-list ul li a{box-shadow:none;color:#181818}.mec-fes-list ul li a:hover{color:#40d9f1}.mec-fes-list ul li .mec-event-title{font-size:17px;font-weight:600;width:calc(100% - 250px);display:inline-block}@media (max-width:680px){.mec-fes-list ul li .mec-event-title{width:100%;font-size:13px;margin:0 0 20px 0;display:block}.mec-fes-list ul li{padding:10px 12px 40px}}@media (max-width:480px){.mec-fes-list .mec-fes-list-top-actions,.mec-fes-list ul{padding-left:0}}.mec-fes-form .mec-required{color:#ff3c3c}.mec-fes-list .mec-event-status{color:#fff!important;border-color:transparent!important}.mec-fes-form .mec-book-confirmed,.mec-fes-list .mec-book-confirmed{background:#50d477!important}.mec-fes-form .mec-book-pending,.mec-fes-list .mec-book-pending{background:#fcbe69!important}.mec-fes-form .mec-book-rejected,.mec-fes-list .mec-book-rejected{background:#fe686a!important}.mec-fes-form .mec-book-other,.mec-fes-list .mec-book-other{background:#40d9f1!important}.mec-fes-list ul li .mec-fes-event-edit,.mec-fes-list ul li .mec-fes-event-remove,.mec-fes-list ul li .mec-fes-event-view{font-size:11px;padding:0;border:0;background:#f7f8f9;float:right;margin-left:5px;border-radius:2px;transition:all .2s ease}.mec-fes-list ul li .mec-fes-event-edit a,.mec-fes-list ul li .mec-fes-event-export a,.mec-fes-list ul li .mec-fes-event-remove,.mec-fes-list ul li .mec-fes-event-view a{padding:4px 8px;display:inline-block;border:1px solid #e7e8e9;border-radius:2px;color:#789;position:relative}@media (max-width:600px){.mec-fes-list ul li .mec-fes-event-edit a,.mec-fes-list ul li .mec-fes-event-export a,.mec-fes-list ul li .mec-fes-event-remove,.mec-fes-list ul li .mec-fes-event-view a{font-size:10px}}.mec-fes-list ul li .mec-fes-event-remove:hover{cursor:pointer;background:#f96f8a;border-color:#f96f8a;color:#fff}.mec-fes-list ul li .mec-fes-event-edit a:hover,.mec-fes-list ul li .mec-fes-event-export a:hover,.mec-fes-list ul li .mec-fes-event-view a:hover{background:#40d9f1;color:#fff;border-color:#40d9f1}.mec-fes-form-top-actions a,.mec-fes-list-top-actions a,.single-mec-events .pmpro_content_message a,.single-mec-events .pmpro_content_message a:link{position:relative;border:none;border-radius:3px;color:#fff!important;display:inline-block;font-size:13px;line-height:1;text-transform:none;font-weight:400;text-decoration:none;cursor:pointer;margin-bottom:20px!important;margin-right:10px;line-height:1;letter-spacing:0;padding:15px 22px;background:#39c36e;box-shadow:0 1px 7px -3px #39c36e!important;-webkit-transition:all .21s ease;-moz-transition:all .21s ease;transition:all .21s ease;text-decoration:unset}.mec-fes-form-top-actions a:hover,.mec-fes-list-top-actions a:hover,.single-mec-events .pmpro_content_message a:hover,.single-mec-events .pmpro_content_message a:hover:link{background:#222;color:#fff}.mec-fes-list-top-actions a{font-weight:600;text-transform:capitalize}.mec-fes-form-top-actions a:before{content:"";border:solid #fff;border-width:0 2px 2px 0;display:inline-block;padding:6px;margin-right:5px;vertical-align:sub;transform:rotate(135deg);-webkit-transform:rotate(135deg)}.mec-fes-form .mec-form-row,.mec-fes-list .mec-form-row{margin-bottom:10px;clear:both}.mec-fes-form label{font-size:13px;display:block;color:#798f96;font-weight:400;padding:0 0 4px 2px}.mec-fes-form input+label{padding-top:8px;padding-left:3px;margin:0;display:inline-block;vertical-align:top}#wrap .mec-fes-form input+label{padding-top:0}.mec-fes-form .post-status{float:right!important;margin:0 5px;color:#fff;padding:0 10px;border-radius:12px;font-style:italic;font-size:18px}.mec-fes-form #mec-event-data input[type=date],.mec-fes-form input[type=email],.mec-fes-form input[type=number],.mec-fes-form input[type=password],.mec-fes-form input[type=tel],.mec-fes-form input[type=text],.mec-fes-form input[type=url],.mec-fes-form select,.mec-fes-form textarea{min-width:inherit;width:auto;display:inline;min-height:30px;font-size:13px;padding:10px;margin-bottom:20px;clear:both;background:#fff;border:1px solid #cfeff5;box-shadow:0 2px 5px rgba(207,239,245,.38) inset;border-radius:3px;height:40px;max-width:280px;color:#798f96;font-family:inherit}#mec_fes_form input[type=date]::-webkit-calendar-picker-indicator,.lity-content #mec_fes_form input[type=date]::-webkit-calendar-picker-indicator,.lity-content .mec-events-meta-group-booking input[type=date]::-webkit-calendar-picker-indicator,.mec-events-meta-group-booking .mec-booking-shortcode input[type=date]::-webkit-calendar-picker-indicator,.mec-single-event .mec-events-meta-group-booking input[type=date]::-webkit-calendar-picker-indicator{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA0QjQ2N0QwQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA0QjQ2N0QxQjQ4MzExRUE4RDdFREZDRTUxMUVERTM5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDRCNDY3Q0VCNDgzMTFFQThEN0VERkNFNTExRURFMzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDRCNDY3Q0ZCNDgzMTFFQThEN0VERkNFNTExRURFMzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6WW71PAAAGIklEQVR42qRX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");background-position:center;background-size:cover;width:10px;height:12px;display:block}.mec-fes-form input{background:#fff;border-radius:3px}.mec-fes-form textarea{height:80px}.mec-fes-form input::-webkit-input-placeholder{color:#798f96}.mec-fes-form input::-moz-placeholder{color:#798f96}.mec-fes-form input:-ms-input-placeholder{color:#798f96}.mec-fes-form input:-moz-placeholder{color:#798f96}#mec-excerpt .mec-form-row .widefat{max-width:100%}#mec_more_info_target{width:100%}@media only screen and (min-width:961px){.mec-fes-form #mec-event-data input[type=date],.mec-fes-form #mec-event-data select,.mec-fes-form input[type=email],.mec-fes-form input[type=password],.mec-fes-form input[type=tel],.mec-fes-form input[type=text],.mec-fes-form input[type=url],.mec-fes-form textarea{width:100%;display:inline-block}}@media only screen and (max-width:768px){.mec-fes-form #mec-event-data input[type=date],.mec-fes-form #mec-event-data select,.mec-fes-form input[type=email],.mec-fes-form input[type=password],.mec-fes-form input[type=text],.mec-fes-form input[type=url],.mec-fes-form textarea{width:100%}}.mec-fes-form input[type=text]#mec_fes_title{padding:5px 10px;min-height:32px;height:50px;background:#fff!important;max-width:100%;font-size:19px;font-weight:400}.mec-fes-form input[type=checkbox],.mec-fes-form input[type=radio]{display:inline!important;float:left;margin:5px 5px 0 0}.mec-fes-form input[type=email]:focus,.mec-fes-form input[type=number]:focus,.mec-fes-form input[type=password]:focus,.mec-fes-form input[type=tel]:focus,.mec-fes-form input[type=text]:focus,.mec-fes-form input[type=url]:focus,.mec-fes-form select:focus,.mec-fes-form textarea:focus{border:1px solid #aaa;color:#444;background:#fff;-moz-box-shadow:0 0 3px rgba(0,0,0,.2);-webkit-box-shadow:0 0 3px rgba(0,0,0,.2);box-shadow:0 0 3px rgba(0,0,0,.2);outline:0}.mec-form-row .mec-color{cursor:pointer}.mec-form-row.mec-available-color-row span{margin:10px;width:14px;height:14px;display:inline-block;margin-right:6px;border-radius:20px 20px 20px 20px;vertical-align:middle}.mec-form-row.mec-available-color-row span:first-of-type{margin-left:0}.mec-fes-form.mec-fes-form .mec-tooltip{display:inline}.mec-fes-form-cntt .dashicons-editor-help{display:block}.mec-fes-form .mec-tooltip:hover:after,.mec-fes-form .mec-tooltip:hover:before{display:none}.mec-fes-form.mec-fes-form .mec-tooltip{display:inline-flex;bottom:7px}.mec-fes-form .mec-tooltip .box{min-width:300px;max-width:600px;display:inline-block;left:26px;top:50%;transform:translateY(-50%);padding:0;margin-top:8px;background-color:#535a61;color:#fff;font-weight:300;font-size:14px;letter-spacing:.5px;line-height:1.3;position:absolute;z-index:9999999;box-sizing:border-box;border-radius:6px;box-shadow:0 4px 45px -8px #444b50;visibility:hidden;opacity:0;transition:opacity .23s}#webnus-dashboard .mec-fes-form .mec-tooltip .box p,.mec-fes-form .mec-tooltip .box p{color:#fff!important;font-size:14px;line-height:1.3;margin:0}.mec-fes-form .mec-tooltip:hover .box{visibility:visible;opacity:1}.mec-fes-form .mec-tooltip:hover .box{padding:20px;border-radius:8px}.mec-fes-form .mec-tooltip .box h5{color:#fff;font-size:17px;font-weight:600;margin:-30px -20px;padding:20px 0;text-align:center;margin-bottom:10px;background:#3a3f44;border-bottom:1px solid #32363a;border-radius:6px 6px 0 0;z-index:9999}#webnus-dashboard .mec-fes-form .mec-tooltip .box p a,.mec-fes-form .mec-tooltip .box p a{color:#40d9f1;margin-top:10px;margin-left:0;font-weight:400;position:relative;text-decoration:none;display:block;width:max-content}.mec-fes-form .mec-tooltip .box a:hover{color:#f90}.mec-fes-form .mec-tooltip .box:after{display:block;position:absolute!important;top:100%!important;right:50%!important;margin-top:-6px!important;margin-right:-6px!important;width:12px!important;height:24px!important;overflow:hidden!important;transform:rotate(-90deg)!important}.mec-fes-form .mec-tooltip .box:before{display:block;content:""!important;position:absolute!important;width:12px;height:12px;left:-10px!important;top:50%!important;transform:translate(50%,-50%) rotate(-45deg)!important;background-color:#535a61!important;box-shadow:0 8px 9px -4px #535a61!important;z-index:0!important}.mec-fes-form .mec-tooltip .box.top{left:50%;top:0;transform:translate(-50%,-100%);margin-top:0;margin-left:-10px}.mec-fes-form .mec-tooltip .box.top:after{top:50%!important;right:100%!important}.mec-fes-form .mec-tooltip .box.top:before{left:50%!important;top:100%!important}.mec-fes-form .mec-tooltip .box.bottom{left:50%;top:auto;bottom:0;transform:translate(-50%,100%);margin-bottom:-20px;margin-left:-10px}.mec-fes-form .mec-tooltip .box.bottom:after{top:0!important;right:50%!important;background-color:#3a3f44!important}.mec-fes-form .mec-tooltip .box.bottom:before{left:50%!important;top:-7px!important;transform:translateX(-50%);background-color:#3a3f44!important}.mec-fes-form .mec-tooltip .box.left{left:auto;right:26px;top:50%;transform:translateY(-50%)}.mec-fes-form .mec-tooltip .box.left:before{right:0!important;left:auto!important;top:50%!important}.mec-fes-form .mec-tooltip{display:inline-block;position:relative;margin-right:10px;cursor:help;bottom:5px;left:3px}.mec-fes-form .mec-tooltip:last-child{margin-right:0}.mec-fes-form .mec-tooltip:hover:after{background:#313130;border-radius:5px;bottom:24px;color:#fff;content:attr(title);left:-75px;padding:10px;position:absolute;z-index:98;width:240px}.mec-fes-form .mec-tooltip:hover:before{border:solid;border-color:#313130 transparent;border-width:6px 6px 0;bottom:18px;content:"";left:30%;position:absolute;z-index:99}.mec-fes-form .mec-tooltip .dashicons-before:before{font-size:24px;color:#008aff;line-height:37px}.mec-fes-form .mec-tooltip a:focus{box-shadow:none}.mec-form-row .bootstrap_unvalid{display:block;border:2px solid red;position:relative;display:inline-block;border-bottom:1px dotted #000}.mec-fes-form .mec-tooltiptext{visibility:hidden;width:120px;background-color:red;color:#fff;text-align:center;border-radius:6px;padding:5px 0;position:absolute;z-index:1}.mec-fes-form .mec-tooltip .content p a{display:none}@media only screen and (min-width:961px){.mec-fes-form .mec-fes-form-cntt,.mec-fes-form .mec-fes-form-sdbr{width:68%;float:left;padding-right:20px}.mec-fes-form .mec-fes-form-sdbr{width:32%;padding-right:0;padding-left:20px}.mec-fes-submit-mobile{display:none}}.mec-fes-form .mec-meta-box-fields{padding:0 20px 20px;border:1px solid #cfeff5;margin-bottom:20px!important;box-shadow:0 2px 6px -3px #cfeff5;border-radius:3px;background:#fff}.mec-fes-form .mec-meta-box-fields h4,.mec-fes-form .mec-meta-box-fields h4 label{margin:0 -20px;font-size:15px;font-weight:600;letter-spacing:0;color:#40d9f1;text-transform:capitalize;padding:15px 20px;margin-bottom:20px}.mec-fes-form .mec-meta-box-fields h4 label{padding:0;margin:0}.mec-fes-sub-button{width:100%}.mec-available-color-row span.color-selected{border:3px solid #fff;box-sizing:content-box;box-shadow:0 0 0 2px #40d9f1,0 2px 8px -1px #40d9f1}.mec-fes-loading:before{content:url("../img/ajax-loader.gif");background:0 0;border-style:none;display:block;margin-left:47%}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text]{width:190px;margin-right:1.4%}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text].mec-col-1,.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text].mec-col-2{width:120px;margin-right:10px}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text].widefat{width:100%}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row{border-bottom:none;padding-bottom:10px}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text].mec-col-6{width:39%}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row button{margin-right:0;padding:9px 26px}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row button.mec-add-hourly-schedule-button{font-size:12px;height:30px;line-height:25px}.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row .description{display:inline-block;border-left:1px dashed #bfcacc;margin-left:12px;line-height:28px;padding-left:12px;margin-top:5px;font-style:italic}@media only screen and (max-width:768px){.mec-fes-form #mec_meta_box_hourly_schedule_days .mec-form-row input[type=text]{width:100%!important}}#mec_fes_form_message{max-width:838px;margin:10px auto;display:block!important;text-align:center}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip{position:relative}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list strong,.post-type-mec-books .attendees strong{line-height:26px;padding-left:26px}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:before{position:absolute;content:"\e001";font-family:simple-line-icons;margin:12px 0;top:-30px;left:0;font-size:18px;line-height:12px;color:#40d9f1;padding:0 60px 5px 0}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul{position:absolute;min-width:300px;max-width:600px;display:inline-block;left:60px;top:50%;transform:translateY(-50%);background-color:#535a61;color:#fff;font-weight:300;font-size:14px;letter-spacing:.5px;line-height:1.3;z-index:9999999;box-sizing:border-box;box-shadow:0 4px 45px -8px #444b50;visibility:hidden;opacity:0;transition:opacity .23s;padding:23px 20px 20px 20px;border-radius:8px;margin-top:-13px}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul:before{display:block;content:""!important;position:absolute!important;width:12px;height:12px;left:-10px!important;top:50%!important;transform:translate(50%,-50%) rotate(-45deg)!important;background-color:#535a61!important;box-shadow:0 8px 9px -4px #535a61!important;z-index:0!important}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:hover ul{visibility:visible;opacity:1}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul li{list-style:none}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul a{color:#40d9f1;margin-bottom:14px;margin-left:0;font-weight:400;font-size:14px;letter-spacing:.5px;position:relative;text-decoration:none;display:block;width:max-content}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip ul li:last-child a{margin-bottom:0}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list{margin:0}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child{background:#fff;border-bottom:1px solid #cfeff5}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child div span{line-height:1;font-weight:600;font-size:13px}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix{display:flex;background:#f8feff;padding:10px;text-align:left}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3{width:25%;word-wrap:break-word}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:first-child{width:45%}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:nth-child(2){width:15%}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:nth-child(3){width:25%}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3:nth-child(4){width:20%}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:not(:first-child) .w-col-xs-3{font-size:13px;display:block;color:#798f96;font-weight:400;padding:0}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix .w-col-xs-3 a{text-decoration:unset}.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd){background:#fff}.mec-pagination{display:block;margin:40px 0 0 0}.mec-pagination ul.page-numbers{display:flex;justify-content:center;align-content:space-around;flex-wrap:nowrap;align-items:center;flex-direction:row}.mec-pagination .page-numbers li{margin:0 7px;padding:0;display:flex}.mec-pagination .page-numbers li .page-numbers{text-align:center;font-size:14px;line-height:3;width:42px}.mec-pagination .page-numbers li .page-numbers.next,.mec-pagination .page-numbers li .page-numbers.prev{width:110px}.mec-wrap .mec-totalcal-box{position:relative;border:1px solid #efefef;padding:20px 5px;margin:0 0 20px;background:#fafafa;overflow:hidden;box-shadow:0 3px 2px 0 rgba(0,0,0,.012);min-height:78px}.mec-wrap .mec-totalcal-box i{float:left;margin:0;width:36px;height:36px;background:#fff;border:1px solid #efefef;text-align:center;padding:10px 0;font-size:15px;color:#888}.mec-checkboxes-search .mec-searchbar-category-wrap,.mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-wrap .mec-totalcal-box input,.mec-wrap .mec-totalcal-box select{width:auto;min-height:36px;height:36px;line-height:36px;background:#fff;font-size:13px;color:#777;border:1px solid #efefef;margin:0 0 0 -1px;float:left;padding:0 5px;font-family:inherit}.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected{border-right-width:2px}.mec-there-labels .mec-totalcal-view{margin-top:28px}.mec-wrap .mec-totalcal-box input[type=submit]{cursor:pointer;padding:0 16px;text-transform:uppercase;font-size:11px;transition:all .21s ease}.mec-wrap .mec-totalcal-box input[type=submit]:hover{background:#222;color:#fff}.mec-wrap .mec-totalcal-box .mec-totalcal-view span{display:inline-block;text-transform:uppercase;font-size:11px;padding:0 12px;cursor:pointer}.mec-wrap .mec-totalcal-box .mec-totalcal-view span:hover{color:#40d9f1}.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected{color:#fff;background:#40d9f1;border-color:#40d9f1}.mec-wrap .mec-totalcal-box .mec-totalcal-view{text-align:right;float:right}.mec-wrap .mec-totalcal-box input[type=search]{width:calc(100% - 36px)}.mec-there-reset-button .mec-totalcal-box{padding-bottom:48px}.mec-wrap .mec-totalcal-box .mec-search-reset-button .mec-button{position:absolute!important;margin:0!important;bottom:0!important;right:0!important;padding:9px 25px!important;border-radius:2px 0 0 0!important;background:#fff!important;color:#767676!important;border-top:1px solid!important;border-left:1px solid!important;border-color:#e8e8e8!important;overflow:hidden!important}.mec-wrap .mec-totalcal-box .mec-search-reset-button .mec-button:hover{background:#000!important;color:#fff!important;border-color:#000!important}.mec-full-calendar-wrap .mec-search-form .col-md-7{padding:0}.mec-wrap .mec-date-search .mec-col-3,.mec-wrap .mec-minmax-event-cost .mec-minmax-price{width:calc(50% - 17px)}.mec-wrap .mec-text-address-search.with-mec-cost{width:calc(100% - 356px)}.mec-wrap .mec-minmax-event-cost{display:block;float:left;width:50%;margin-left:10px}.mec-wrap .mec-minmax-event-cost.with-mec-address{display:block;width:336px;max-width:50%;float:right;margin-left:0;margin-right:10px}.mec-wrap .mec-checkboxes-search{margin-left:10px;margin-right:10px;display:table-caption}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap{width:calc(100% - 36px)!important;max-width:calc(100% - 36px)!important;padding:0;position:relative;line-height:inherit;height:auto}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap select{line-height:20px}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container.select2-container--default{width:calc(100% - 36px)!important}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap input[type=search]{width:calc(100% - 36px)!important;min-height:30px;margin:0}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple ul,.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container.select2-container--default{height:auto;overflow:unset}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple ul{display:block}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple{border:unset;width:100%;height:0!important;border-radius:0}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple ul li{line-height:12px!important;max-height:20px!important;width:auto;margin-right:5px;margin-top:5px}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple .select2-selection__choice{letter-spacing:0;color:#777;text-transform:capitalize;padding:4px 6px;background-color:#efefef;border-radius:2px;border:0;cursor:default;float:left;margin-right:5px;margin-top:5px;margin-bottom:5px;font-size:11px;text-transform:uppercase}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple .select2-selection__choice__remove{color:#777}@media only screen and (min-width:961px) and (max-width:1200px){.mec-wrap .mec-totalcal-box{padding:37px 5px}}@media only screen and (max-width:960px){.mec-wrap .mec-totalcal-box .col-md-3,.mec-wrap .mec-totalcal-box .col-md-4,.mec-wrap .mec-totalcal-box .col-md-5{width:100%;float:none;clear:both;overflow:hidden}.mec-full-calendar-wrap .mec-search-form .col-md-3,.mec-full-calendar-wrap .mec-search-form .col-md-4,.mec-full-calendar-wrap .mec-search-form .col-md-5{display:block;max-width:100%;padding:0;margin:0 0 10px 0}.mec-full-calendar-wrap .mec-search-form .col-md-3{padding-bottom:10px!important}.mec-wrap .mec-search-form .mec-date-search select{width:calc(100% - 106px)}.mec-wrap .mec-search-form .mec-date-search select:last-child{width:70px}.mec-wrap .mec-totalcal-box .mec-totalcal-view{float:none}.mec-wrap .mec-checkboxes-search .mec-searchbar-category-wrap .select2-container .select2-selection--multiple .select2-selection__choice{display:block;max-width:100%;white-space:break-spaces;max-height:unset!important;height:auto!important}}@media only screen and (min-width:768px) and (max-width:960px){.mec-wrap .mec-totalcal-box .col-md-4{position:relative;width:initial}.mec-wrap .mec-totalcal-box .col-md-5{padding-bottom:0}.mec-full-calendar-wrap .mec-search-form .col-md-5{margin-top:20px}.mec-wrap .mec-totalcal-box{padding:37px 5px}}@media only screen and (max-width:767px){.mec-wrap .mec-totalcal-box .mec-totalcal-view{float:none}.mec-wrap .mec-totalcal-box .col-md-4{padding-bottom:0}.mec-wrap .mec-minmax-event-cost.with-mec-address,.mec-wrap .mec-text-address-search.with-mec-cost{width:100%;float:left}.mec-wrap .mec-minmax-event-cost.with-mec-address{max-width:calc(100% - 20px);margin:0 10px 20px 10px}.mec-wrap .mec-minmax-event-cost .mec-minmax-price{width:calc(50% - 17px)}}@media only screen and (max-width:479px){.mec-wrap .mec-totalcal-box .mec-totalcal-view span{padding:0 8px;font-size:10px}.mec-wrap .mec-totalcal-box input[type=submit]{padding:0 10px;font-size:10px}}@media only screen and (min-width:961px){.mec-wrap .mec-wrap.mec-sm959 .mec-totalcal-box .col-md-5,.mec-wrap.mec-sm959 .mec-totalcal-box .col-md-3{padding-bottom:20px;clear:both;overflow:hidden}.mec-wrap.mec-sm959 .mec-totalcal-box .col-md-5{right:10px;width:initial}.mec-wrap.mec-sm959 .mec-totalcal-box .col-md-4{padding-bottom:0;width:100%}}@media (min-width:961px) and (max-width:1200px){.mec-full-calendar-wrap .mec-totalcal-box{padding:15px 10px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2{width:50%}.mec-wrap .mec-totalcal-box .mec-totalcal-view span{padding:0 10px}.mec-search-form .mec-date-search,.mec-search-form .mec-dropdown-search,.mec-search-form .mec-text-address-search,.mec-search-form .mec-text-input-search{padding:0 4px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2,.mec-full-calendar-wrap .mec-totalcal-box .col-md-3,.mec-full-calendar-wrap .mec-totalcal-box .col-md-4,.mec-full-calendar-wrap .mec-totalcal-box .col-md-5{padding-bottom:20px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2 select{min-width:calc(100% - 36px)}.mec-full-calendar-wrap .mec-totalcal-box .col-md-3 select{min-width:calc(30% - 10px)}.mec-full-calendar-wrap .mec-totalcal-box .col-md-3:last-child select{min-width:calc(50% - 19px)}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{font-size:9px;text-align:center}}@media only screen and (max-width:1200px){.post-type-archive-mec-events .mec-totalcal-box .col-md-3,.post-type-archive-mec-events .mec-totalcal-box .col-md-4{width:100%;padding:0}.post-type-archive-mec-events .mec-totalcal-box select:last-child{min-width:auto}.post-type-archive-mec-events .mec-totalcal-box .col-md-5{position:relative;float:right;max-width:100%;left:0;top:20px;width:100%!important;display:block;clear:both}.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view{max-width:100%;width:100%}.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span{width:20.1%;font-size:10px}}@media only screen and (max-width:960px){.post-type-archive-mec-events .mec-totalcal-box .col-md-5{top:10px}}@media only screen and (max-width:760px){.post-type-archive-mec-events .mec-totalcal-box .col-md-5{top:0!important}}@media only screen and (max-width:480px){.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span{font-size:8px}}@media (min-width:1201px) and (max-width:1280px){.mec-full-calendar-wrap .mec-totalcal-view span{font-size:9px;padding:0 10px}}@media (min-width:761px) and (max-width:1200px){.mec-full-calendar-wrap .mec-search-form .mec-dropdown-wrap .mec-dropdown-search{width:33.3333%;display:block;float:left}.mec-full-calendar-wrap .mec-search-form .col-md-4 .mec-text-input-search{padding:0;margin-bottom:20px}.mec-full-calendar-wrap .mec-search-form .col-md-3{width:100%}.mec-full-calendar-wrap .mec-search-form .mec-date-search select:last-child{min-width:70px;width:70px}.mec-full-calendar-wrap .mec-search-form .col-md-5{float:right;padding:0 0 10px 0}.mec-full-calendar-wrap .mec-totalcal-view span{font-size:11px}}@media (max-width:760px){.mec-full-calendar-wrap .mec-search-form .col-md-3{width:100%}.mec-full-calendar-wrap .mec-search-form .mec-date-search select:last-child{min-width:70px;width:70px}.mec-full-calendar-wrap .mec-search-form .col-md-5{float:right;padding:0 0 10px 0}.mec-full-calendar-wrap .mec-totalcal-view span{font-size:11px}}@media (max-width:960px){.mec-full-calendar-wrap .mec-totalcal-box{padding:20px 20px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2{width:50%}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2,.mec-full-calendar-wrap .mec-totalcal-box .col-md-3,.mec-full-calendar-wrap .mec-totalcal-box .col-md-4{padding-bottom:10px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2 select{min-width:calc(100% - 36px);margin-bottom:10px}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view{margin-left:10px}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{font-size:10px;text-align:center}.mec-full-calendar-wrap .mec-totalcal-box .col-md-2{width:100%}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{min-width:14.3%;text-align:center;font-size:10px;margin-right:-1px}}@media (max-width:780px){.mec-full-calendar-wrap .mec-totalcal-box .col-md-3 select{width:calc(50% - 18px)!important}.mec-full-calendar-wrap .mec-totalcal-box .col-md-4{position:unset;padding-right:0}.mec-full-calendar-wrap .mec-search-form .col-md-3,.mec-full-calendar-wrap .mec-search-form .col-md-4,.mec-full-calendar-wrap .mec-search-form .col-md-5{margin:0;padding:0}.mec-wrap .mec-totalcal-box .mec-totalcal-view span{padding:0 7px;margin-top:20px}}@media (max-width:480px){.mec-full-calendar-wrap .mec-totalcal-box{padding:15px 10px}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{min-width:13.5%;text-align:center;font-size:11px}}@media (max-width:411px){.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{min-width:12%;font-size:10px}}@media (max-width:320px){.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{min-width:22.5%;font-size:11px}}.mec-totalcalview-selected:hover{color:#fff!important}.mec-search-form{padding:20px 10px}.mec-search-form .mec-dropdown-wrap{display:table;width:100%}.mec-search-form .mec-date-input-search,.mec-search-form .mec-date-search,.mec-search-form .mec-dropdown-search,.mec-search-form .mec-text-input-search,.mec-search-form .mec-time-input-search{padding:0 10px;float:left}.mec-search-form .mec-date-search,.mec-search-form .mec-time-picker-search,.mec-search-form .mec-totalcal-view{padding:0 10px}.mec-search-form .mec-text-input-search{width:100%}.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search{width:50%}.mec-search-form .mec-date-search,.mec-search-form .mec-time-picker-search{width:50%;float:left}.mec-search-form .mec-date-search.with-mec-time-picker,.mec-search-form .mec-time-picker-search.with-mec-date-search{width:25%;float:left}.mec-search-form .mec-tab-loader.col-md-6 .mec-totalcal-view{padding:0}.mec-wrap .mec-search-form .with-mec-date-search .mec-timepicker-end,.mec-wrap .mec-search-form .with-mec-date-search .mec-timepicker-start{width:calc(50% - 17px)}.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search.col-md-12,.mec-search-form .mec-minmax-event-cost,.mec-search-form .mec-text-address-search{min-height:55px}.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search.col-md-12,.mec-widget .mec-search-form .mec-date-search,.mec-widget .mec-search-form .mec-text-input-search{width:100%}.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search.col-md-12{padding:0 10px}.mec-there-labels .mec-search-form .mec-full-calendar-search-ends .mec-text-input-search.col-md-12{margin-top:20px}.mec-search-form .mec-minmax-event-cost,.mec-search-form .mec-text-address-search,.mec-widget .mec-search-form .mec-text-input-search{margin-top:10px}.mec-search-form .mec-date-search{clear:left}.mec-search-form .mec-dropdown-wrap .mec-dropdown-search{display:table-cell;float:none}.mec-widget .mec-search-form .mec-dropdown-wrap .mec-dropdown-search{display:block}.mec-checkboxes-search .mec-searchbar-category-wrap,.mec-wrap .mec-search-form .mec-dropdown-wrap .mec-dropdown-search select{width:calc(100% - 36px);margin-bottom:10px}.mec-wrap .mec-search-form .mec-minmax-price input,.mec-wrap .mec-search-form .mec-text-address-search input,.mec-wrap .mec-search-form .mec-text-input-search input{margin-bottom:10px}.mec-wrap .mec-totalcal-box label{display:block;line-height:1.8;margin-bottom:4px;font-size:13px;color:#9a9a9a}.mec-wrap .mec-search-form .mec-date-search select{width:calc(100% - 106px)}.mec-wrap .mec-search-form .mec-date-search select:last-child{width:70px}@media only screen and (max-width:781px){.mec-search-form .mec-date-search,.mec-search-form .mec-dropdown-search,.mec-search-form .mec-text-input-search{width:100%;float:none}.mec-search-form .mec-date-search{min-height:55px}.mec-search-form .mec-dropdown-wrap .mec-dropdown-search{display:block;width:50%;float:left}.mec-full-calendar-wrap .mec-totalcal-box .col-md-3{margin-bottom:0;padding-bottom:0!important}}@media only screen and (max-width:479px){.mec-search-form .mec-dropdown-wrap .mec-dropdown-search{display:block;width:100%;float:none}}@media only screen and (min-width:961px) and (max-width:1200px){.post-type-archive-mec-events .mec-totalcal-box .col-md-3,.post-type-archive-mec-events .mec-totalcal-box .col-md-4,.post-type-archive-mec-events .mec-totalcal-box .col-md-5{max-width:100%;width:100%}.post-type-archive-mec-events .mec-totalcal-box .col-md-4{padding:0 10px}.post-type-archive-mec-events .mec-totalcal-box .col-md-4 .mec-text-input-search{margin:0}.post-type-archive-mec-events .mec-totalcal-box .col-md-5{margin-bottom:20px;padding:0 10px 10px 10px}}@media only screen and (max-width:960px){.mec-full-calendar-wrap .mec-totalcal-box .col-md-4,.post-type-archive-mec-events .mec-totalcal-box .col-md-4{padding:0 10px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-4{margin-bottom:0}.post-type-archive-mec-events .mec-totalcal-box .col-md-4 .mec-text-input-search{margin:0}.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view{padding-right:15px}.mec-full-calendar-wrap .mec-search-form .col-md-5{margin-bottom:0}.post-type-archive-mec-events .mec-totalcal-box .col-md-5{padding:0}}@media only screen and (max-width:780px){.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span{margin-top:10px;margin-bottom:10px}.mec-wrap .mec-totalcal-box .mec-totalcal-view span{margin-top:0}}@media only screen and (max-width:760px){.post-type-archive-mec-events .mec-totalcal-box .mec-totalcal-view span{margin-top:20px;margin-bottom:0}.mec-wrap .mec-totalcal-box .mec-totalcal-view span{margin-top:20px}.mec-full-calendar-wrap .mec-totalcal-box .col-md-4,.post-type-archive-mec-events .mec-totalcal-box .col-md-4{padding:0}}@media only screen and (max-width:1200px){.post-type-archive-mec-events .mec-full-calendar-wrap .mec-totalcal-view span{width:14.333%;font-size:8px}}@media only screen and (min-width:320px) and (max-width:960px){.post-type-archive-mec-events .mec-search-form .col-md-5 span{width:20%!important}}.mec-search-form .mec-text-address-search{float:left;width:100%;padding:0 10px}@media (max-width:960px){.mec-search-form .mec-dropdown-search{margin-bottom:10px}.mec-wrap .mec-minmax-event-cost.with-mec-address,.mec-wrap .mec-text-address-search.with-mec-cost{margin-top:0}.mec-search-form .mec-date-search.with-mec-time-picker,.mec-search-form .mec-time-picker-search.with-mec-date-search{width:50%;margin-bottom:20px}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view{margin:0}.mec-full-calendar-wrap .mec-tab-loader{width:100%;display:block;float:unset;padding:0 0 0 10px}}@media (max-width:780px){.mec-full-calendar-wrap .mec-totalcal-box{padding:10px}.mec-search-form .mec-date-search.with-mec-time-picker,.mec-search-form .mec-time-picker-search.with-mec-date-search{margin:20px 0;height:auto}.mec-search-form .mec-date-search{min-height:unset}}@media (max-width:480px){.mec-search-form .mec-date-search.with-mec-time-picker,.mec-search-form .mec-time-picker-search.with-mec-date-search{width:100%}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span{min-width:12%;text-align:center;font-size:9px}.mec-full-calendar-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-search-form .mec-date-search.with-mec-time-picker,.mec-search-form .mec-full-calendar-search-ends .mec-text-input-search,.mec-search-form .mec-minmax-event-cost,.mec-search-form .mec-text-address-search,.mec-search-form .mec-time-picker-search.with-mec-date-search,.mec-wrap .mec-minmax-event-cost.with-mec-address{margin-bottom:0;margin-top:10px;min-height:auto}.mec-wrap .mec-minmax-event-cost.with-mec-address{margin-bottom:10px}.mec-wrap.mec-widget .mec-minmax-event-cost.with-mec-address,.mec-wrap.mec-widget .mec-search-form .mec-time-picker-search.with-mec-date-search,.mec-wrap.mec-widget .mec-text-address-search.with-mec-cost{display:block!important;width:100%!important;max-width:100%!important}.mec-wrap.mec-widget .mec-minmax-event-cost.with-mec-address{float:left!important;max-width:calc(100% - 20px)!important;margin:0 0 0 10px!important}.mec-wrap.mec-widget .mec-search-form .mec-time-picker-search.with-mec-date-search{margin-top:20px!important}.mec-wrap.mec-widget .mec-search-form .mec-text-input-search{padding:10px!important}}.ui-datepicker{background-color:#fff;border:1px solid #66afe9;border-radius:4px;box-shadow:0 0 8px rgba(102,175,233,.6);display:none;margin-top:4px;padding:10px;width:240px}.ui-datepicker a,.ui-datepicker a:hover{text-decoration:none;cursor:pointer}.ui-datepicker a:hover,.ui-datepicker td:hover a{color:#2c6396;-webkit-transition:color .1s ease-in-out;-moz-transition:color .1s ease-in-out;-o-transition:color .1s ease-in-out;transition:color .1s ease-in-out}.ui-datepicker .ui-datepicker-header{margin-bottom:4px;text-align:center}.ui-datepicker .ui-datepicker-title{font-weight:700}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{cursor:default;font-family:dashicons;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;height:20px;line-height:1.4;margin-top:2px;width:20px}.ui-datepicker .ui-datepicker-prev{float:left;text-align:left}.ui-datepicker .ui-datepicker-next{float:right;text-align:center}.ui-datepicker .ui-datepicker-prev:before{content:"\f341"}.ui-datepicker .ui-datepicker-next:before{content:"\f345"}.ui-datepicker .ui-icon{display:none}.ui-datepicker .ui-datepicker-calendar{table-layout:fixed;width:100%}.ui-datepicker .ui-datepicker-calendar td,.ui-datepicker .ui-datepicker-calendar th{text-align:center;padding:4px 0}.ui-datepicker .ui-datepicker-calendar td{border-radius:4px;-webkit-transition:background-color .1s ease-in-out,color .1s ease-in-out;-moz-transition:background-color .1s ease-in-out,color .1s ease-in-out;-o-transition:background-color .1s ease-in-out,color .1s ease-in-out;transition:background-color .1s ease-in-out,color .1s ease-in-out}.ui-datepicker .ui-datepicker-calendar td:hover{background-color:#eee;cursor:pointer}.ui-datepicker .ui-datepicker-calendar td a{text-decoration:none}.ui-datepicker .ui-datepicker-current-day{background-color:#4289cc}.ui-datepicker .ui-datepicker-current-day a{color:#fff}.ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover{background-color:#fff;cursor:default}@media only screen and (max-width:768px){.mec-owl-theme .owl-nav [class*=owl-]{display:none!important}}.mec-owl-theme .owl-dots .owl-dot{border:none}.event-carousel-type1-head .mec-event-image{position:relative;min-height:150px;overflow:hidden}.event-carousel-type1-head .mec-event-image img{width:100%}.mec-event-carousel-content .mec-event-carousel-title a{transition:all .2s ease}.event-carousel-type1-head .mec-event-date-carousel{position:absolute;top:25px;left:1px;font-size:41px;width:160px;color:#fff;font-weight:500;background-color:#40d9f1;padding-left:14px;height:97px;line-height:2.3;padding-right:85px}.event-carousel-type1-head .mec-event-date-carousel:after{content:"";position:absolute;display:inline-block;z-index:-1;bottom:-13px;left:5px;width:0;border-width:13px;border-style:solid;border-color:transparent transparent #40d9f1 transparent;transform:rotate(45deg)}.event-carousel-type1-head .mec-event-date-info{font-size:12px;font-weight:300;position:absolute;top:27px;left:75px}.event-carousel-type1-head .mec-event-date-info-year{font-size:12px;font-weight:300;position:absolute;top:45px;left:75px}.mec-event-carousel-content{border:1px solid #e8e8e8;border-top:none;margin-top:-5px;padding:34px 9px 11px 37px}.mec-event-carousel-content .mec-event-carousel-title a{font-size:23px;font-weight:500;color:#000;letter-spacing:-1px}.mec-event-carousel-content p{font-size:14px;color:#7a7272;font-weight:300}.mec-owl-crousel-skin-type1 .owl-item .mec-event-article{padding:0 19px}.mec-event-carousel-type1 .owl-page.active span{background-color:#00aeef;height:14px;width:14px}.mec-event-carousel-type1 .mec-event-carousel-content{margin-bottom:15px;box-shadow:0 1px 2px rgba(0,0,0,.04);transition:all .27s ease}.mec-skin-carousel-container .mec-owl-carousel button:focus{outline:0}.mec-event-carousel-type1 .mec-event-carousel-content:hover{box-shadow:0 0 35px rgba(0,0,0,.07)}.mec-skin-carousel-container .mec-multiple-event .mec-event-date-carousel{width:255px}.mec-skin-carousel-container .mec-multiple-event .event-carousel-type1-head .mec-event-date-info,.mec-skin-carousel-container .mec-multiple-event .event-carousel-type1-head .mec-event-date-info-year{left:175px}.mec-skin-carousel-container .mec-time-details,.mec-skin-carousel-container .mec-time-details span{font-size:11px;font-weight:400;line-height:1.9;letter-spacing:0;color:#000;border-radius:2px;white-space:nowrap}.mec-event-carousel-type4 .mec-time-details,.mec-event-carousel-type4 .mec-time-details span{color:#fff}.mec-skin-carousel-container .mec-time-details span{margin:0;display:inline-block}@media only screen and (min-width:768px) and (max-width:1000px),(min-width:270px) and (max-width:448px){.event-carousel-type1-head .mec-event-date-carousel{font-size:25px;line-height:2.5;padding-right:70px;height:64px;width:120px}.event-carousel-type1-head .mec-event-date-carousel:after{left:7px}.event-carousel-type1-head .mec-event-date-info{font-size:10px;top:13px;left:55px}.event-carousel-type1-head .mec-event-date-info-year{font-size:10px;top:25px;left:55px}.event-carousel-type1-head .mec-event-date-carousel:after{top:48px}}.event-carousel-type2-head{background:#fff;border:1px solid #e6e6e6}.event-carousel-type2-head .mec-event-carousel-content-type2{margin-top:15px;min-height:182px}.event-carousel-type2-head .mec-event-carousel-content-type2 .mec-event-date-info{font-size:15px;color:#9a9a9a;font-weight:300}.event-carousel-type2-head .mec-event-carousel-content-type2 .mec-event-carousel-title{font-size:26px;font-weight:700;color:#1c1d21;margin-top:15px;letter-spacing:-1px}.mec-event-carousel-content-type2 .mec-event-carousel-title a{color:inherit}.mec-event-carousel-type2 .event-carousel-type2-head .mec-event-carousel-content-type2 p{font-size:16px;font-weight:300;color:#444}.event-carousel-type2-head .mec-event-footer-carousel-type2{margin-top:33px;position:relative;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:flex-end}.mec-event-carousel-type2 .mec-event-footer-carousel-type2 .mec-event-sharing-wrap{padding-left:0;position:relative;left:0;margin-right:auto}.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-event-sharing-wrap>li{border:none;-webkit-transition:all .25s ease;transition:all .25s ease}.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button{border:1px solid #e4e4e4;padding:7px 23px 7px;font-size:12px;text-transform:uppercase;color:#707070;font-weight:500;-webkit-transition:all .25s ease;transition:all .25s ease}.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button:hover{color:#fff}.mec-event-article .event-carousel-type2-head{padding:10%;margin-right:-1px}.mec-event-carousel-type2 .mec-owl-carousel .owl-wrapper-outer{border-right:1px solid #e6e6e6}.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button{line-height:17px;height:41px;padding:12px 10px}.event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-modal-booking-button{margin:0;padding:12px 10px;margin-left:15px}.mec-wrap .mec-event-carousel-type2 .owl-next,.mec-wrap .mec-event-carousel-type2 .owl-prev,.mec-wrap .mec-event-carousel-type3 .owl-next,.mec-wrap .mec-event-carousel-type3 .owl-prev,.mec-wrap .mec-event-carousel-type4 .owl-next,.mec-wrap .mec-event-carousel-type4 .owl-prev{transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:47%;background-color:transparent!important;position:absolute!important}.mec-event-carousel-type2 .owl-next{right:-60px}.mec-event-carousel-type2 .owl-prev{left:-60px}.mec-event-carousel-type2 .owl-next,.mec-event-carousel-type2 .owl-prev,.mec-event-carousel-type3 .owl-next,.mec-event-carousel-type3 .owl-prev,.mec-event-carousel-type4 .owl-next,.mec-event-carousel-type4 .owl-prev{border:none}.mec-event-carousel-type2 .owl-next i,.mec-event-carousel-type2 .owl-prev i,.mec-event-carousel-type3 .owl-next i,.mec-event-carousel-type3 .owl-prev i,.mec-event-carousel-type4 .owl-next i,.mec-event-carousel-type4 .owl-prev i{font-size:40px;color:#282828}.mec-event-carousel-type2 .owl-next i:hover,.mec-event-carousel-type2 .owl-prev i:hover,.mec-event-carousel-type3 .owl-next i:hover,.mec-event-carousel-type3 .owl-prev i:hover{color:#000;cursor:pointer}.mec-event-footer-carousel-type2 .mec-event-sharing-wrap .mec-event-sharing{top:auto;bottom:60px}.mec-event-footer-carousel-type2 .mec-event-sharing-wrap .mec-event-sharing:after,.mec-event-footer-carousel-type2 .mec-event-sharing-wrap .mec-event-sharing:before{top:auto;bottom:-19px;border-color:#e2e2e2 transparent transparent transparent}.mec-event-footer-carousel-type2 .mec-event-sharing-wrap .mec-event-sharing:after{bottom:-18px;border-color:#fff transparent transparent transparent}@media only screen and (min-width:320px) and (max-width:768px){.mec-event-carousel-type2 .owl-next,.mec-event-carousel-type2 .owl-prev,.mec-event-carousel-type3 .owl-next,.mec-event-carousel-type3 .owl-prev,.mec-event-carousel-type4 .owl-next,.mec-event-carousel-type4 .owl-prev{position:initial;top:100%}}.mec-event-carousel-type3 .mec-event-article{margin:0 10px}.event-carousel-type3-head .mec-event-image,.event-carousel-type3-head .mec-event-image img{width:100%;height:auto}.event-carousel-type3-head .mec-event-footer-carousel-type3{background:#fff;display:inline-block;width:calc(100% - 40px);margin-top:-74px;position:relative;margin-left:20px;margin-right:20px;margin-bottom:6px;padding:8% 11%;box-shadow:0 2px 10px -2px rgba(0,0,0,.2)}.event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button{border:1px solid #e4e4e4;text-transform:uppercase;float:right;padding:0 10px;font-size:12px;line-height:36px;color:#707070;font-weight:500}.event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button:hover{color:#fff}.mec-event-footer-carousel-type3 span{font-size:15px;color:#9a9a9a;font-weight:300}.mec-event-footer-carousel-type3 .mec-event-carousel-title{font-size:29px;font-weight:700}.event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-event-carousel-title{font-size:26px;font-weight:700;color:#1c1d21;margin-top:15px;letter-spacing:-1px}.mec-event-footer-carousel-type3 .mec-event-carousel-title a{color:inherit}.event-carousel-type3-head .mec-event-footer-carousel-type3 p{font-size:16px;font-weight:300;color:#444!important;margin-bottom:36px}.mec-event-carousel-type3 .owl-next{right:-70px}.mec-event-carousel-type3 .owl-prev{left:-70px}.mec-event-footer-carousel-type3 .mec-event-sharing-wrap{position:static;float:left}.mec-event-footer-carousel-type3 .mec-event-sharing-wrap .mec-event-sharing{top:auto;bottom:60px}.mec-event-footer-carousel-type3 .mec-event-sharing-wrap .mec-event-sharing:after,.mec-event-footer-carousel-type3 .mec-event-sharing-wrap .mec-event-sharing:before{top:auto;bottom:-19px;border-color:#e2e2e2 transparent transparent transparent}.mec-event-footer-carousel-type3 .mec-event-sharing-wrap .mec-event-sharing:after{bottom:-18px;border-color:#fff transparent transparent transparent}.event-carousel-type3-head .mec-end-date-label{display:inline;margin-left:2px}.event-carousel-type4-head.clearfix{position:relative;overflow:hidden;background:#fff}.event-carousel-type4-head .mec-event-overlay{position:absolute;left:0;right:0;bottom:0;top:0;width:auto;height:auto;background-color:rgba(36,36,36,.4);transition:all .33s ease-in-out}.mec-event-hover-carousel-type4{font-size:15px;color:#fff;position:absolute;bottom:0;padding:50px 35px;transition:all .33s ease-in-out;opacity:0;visibility:hidden}.event-carousel-type4-head .mec-event-image img{min-height:360px;object-fit:cover}.mec-event-carousel-type4 .mec-event-article{margin:0 10px}.mec-event-carousel-type4 .mec-event-article:hover .mec-event-hover-carousel-type4{opacity:1;visibility:visible}.mec-event-hover-carousel-type4 .mec-event-icon{font-size:18px;float:left;margin-right:14px;color:#fff;padding:13px}.mec-event-hover-carousel-type4 .mec-event-date{font-size:11px;text-transform:uppercase;font-weight:400;line-height:1.6;text-align:left}.mec-event-hover-carousel-type4 .mec-event-date span{display:block;font-weight:700;font-size:14px}.mec-event-hover-carousel-type4 .mec-event-title{color:#fff;margin:20px 0 38px;font-size:16px;font-weight:700;text-transform:uppercase;font-style:normal}.mec-event-hover-carousel-type4 .mec-btn-wrapper{text-align:left}.mec-event-hover-carousel-type4 .mec-event-button{color:#fff;background-color:#191919;border:2px #191919 solid;padding:10px 14px;letter-spacing:1.5px;font-size:11px;font-weight:700;font-style:normal;transition:all .22s ease;text-decoration:none}.mec-event-hover-carousel-type4 .mec-event-button:hover{color:#191919;background-color:#fff;border-color:#fff;border-radius:1px}.mec-event-carousel-type4 .owl-next{right:-70px}.mec-event-carousel-type4 .owl-prev{left:-70px}.mec-carousel-type4-head{margin-bottom:25px}.mec-carousel-type4-head-title{padding:0 11px;text-align:left;font-weight:700;font-size:20px;color:#000}.mec-carousel-type4-head-link{text-align:right;padding:0 11px}.mec-carousel-type4-head-link a{background:#222;color:#fff;padding:10px 38px;transition:all .3s ease}.mec-carousel-type4-head-link a:hover,.mec-carousel-type4-head-link a:visited{color:#fff}@media (max-width:960px){.mec-event-carousel-type4 .owl-stage{left:-50px}}.mec-wrap .mec-event-countdown-style1{color:#fff;padding:0!important;display:table;background:#437df9}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1{z-index:5;padding:50px 1% 50px 4%;display:table-cell;float:none;vertical-align:middle}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2{background-color:rgba(0,0,0,.05);height:100%;padding-top:0;display:table-cell;float:none;position:relative;vertical-align:middle}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3{background-color:#f8f8f8;display:table-cell;float:none;text-align:center;vertical-align:middle}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1 .mec-event-title{color:#fff;font-size:15px;margin-top:30px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1 .mec-event-upcoming{font-size:36px;font-weight:700;line-height:1;margin-top:0}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-countdown>div{display:inline-block}.mec-event-countdown-style1 .mec-events-meta-group-countdown{color:#c9c9c9;margin-bottom:30px;padding:20px 30px;background:#fff;border:1px solid #e6e6e6;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-countdown-style1 .mec-event-countdown-part1 .mec-event-upcoming span{display:block}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2:after{content:"";position:absolute;display:inline-block;z-index:1;top:50%;margin-top:-11px;right:-24px;width:0;border-width:12px;border-style:solid;border-color:transparent transparent transparent #4077ed}.mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date-place{text-align:center;padding-bottom:8px}.mec-event-countdown-part2 .mec-event-place,.mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date{display:inline;font-size:14px;padding:0 5px;text-align:center}.mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button{display:inline-block;padding:14px 30px;vertical-align:middle;font-size:12px;letter-spacing:1px;text-transform:uppercase;color:#fff;background:#4077ed;transition:all .24s ease}.mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button:hover{background:#222}.mec-event-countdown-style1 .mec-event-countdown{text-align:center;display:table;table-layout:fixed;margin:0 auto}.mec-event-countdown-style1 .mec-event-countdown .label-w{letter-spacing:1px;text-transform:uppercase;position:relative}.mec-event-countdown-style1 .mec-event-countdown .block-w{display:table-cell;margin:0 20px 10px;position:relative;height:70px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li{background-color:rgba(0,0,0,.1);margin:5px;padding:20px 0;min-width:94px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li span{font-size:30px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li .label-w{font-size:12px;color:#fff;margin:8px 0 0;line-height:1}@media only screen and (min-width:1200px){.mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part1,.mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part2,.mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part3{width:100%;display:block;padding-top:50px;padding-bottom:50px}.mec-wrap.mec-sm959 .mec-event-countdown-style1 .mec-event-countdown-part2:after{border-color:#4077ed transparent transparent transparent;top:auto;margin-top:0;bottom:-24px;margin-left:-11px;left:50%}}@media (max-width:960px){.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1,.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2,.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3{width:100%;display:block;padding-top:50px;padding-bottom:50px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part2:after{border-color:#4077ed transparent transparent transparent;top:auto;margin-top:0;bottom:-24px;margin-left:-11px;left:50%;transform:rotate(90deg)}}@media (max-width:480px){.mec-event-countdown-style1 .mec-event-countdown .block-w{margin:3px;height:auto}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li{padding:10px 5px;min-width:50px;margin:3px 1px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li span{font-size:15px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown li .label-w{font-size:8px}.mec-event-countdown-style1 .mec-event-countdown-part2 .mec-event-date-place{display:inline}}.mec-wrap .mec-event-countdown-style2{color:#fff;padding:30px 0;background:#437df9;max-width:600px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part1,.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2,.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part3{width:100%;float:none;vertical-align:middle;padding:50px 10% 50px 10%}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2{padding-top:12%;padding-bottom:0}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part1 .mec-event-title{color:#fff;font-size:15px;margin-top:30px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part1 .mec-event-upcoming{font-size:36px;font-weight:700;line-height:1;margin-top:0}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-countdown>div{display:inline-block}.mec-event-countdown-style2 .mec-events-meta-group-countdown{color:#c9c9c9;margin-bottom:30px;padding:20px 30px;background:#fff;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-countdown-style2 .mec-event-countdown-part1 .mec-event-upcoming span{display:block}.mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date-place{text-align:left;padding-bottom:8px}.mec-event-countdown-part2 .mec-event-place,.mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date{display:inline;font-size:14px;padding:0 8px}.mec-event-countdown-style2 .mec-event-countdown-part3 .mec-event-button{display:inline-block;padding:14px 30px;vertical-align:middle;font-size:12px;letter-spacing:1px;text-transform:uppercase;color:#222;background:#fff;transition:all .24s ease}.mec-event-countdown-style2 .mec-event-countdown-part3 .mec-event-button:hover{background:#222;color:#fff}.mec-event-countdown-style2 .mec-event-countdown{text-align:center;display:table;table-layout:fixed;margin:0}.mec-event-countdown-style2 .mec-event-countdown .label-w{letter-spacing:1px;text-transform:uppercase;position:relative}.mec-event-countdown-style2 .mec-event-countdown .block-w{display:table-cell;margin:0 20px 10px;position:relative;height:70px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li{background-color:rgba(0,0,0,.1);margin:5px;padding:20px 0;min-width:94px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span{font-size:30px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w{font-size:12px;color:#fff;margin:8px 0 0;line-height:1}@media only screen and (max-width:767px){.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li{min-width:80px;padding:15px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span{font-size:26px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w{font-size:11px}}@media only screen and (max-width:479px){.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li{min-width:40px;padding:15px 10px;margin:2px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span{font-size:20px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w{font-size:9px}}@media (max-width:380px){.mec-event-countdown-style2 .mec-event-countdown .block-w{margin:3px;height:auto}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li{padding:10px 4px;margin:4px 1px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li span{font-size:15px}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown li .label-w{font-size:7px}}.mec-wrap .mec-event-countdown-style3{color:#fff;padding:0;background:#282828;display:table;width:100%}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1{width:68%;padding:50px 1% 50px 4%;vertical-align:middle;display:table-cell;position:relative}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2{width:32%;display:table-cell;position:relative;padding-bottom:0;padding-top:0}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2 img{width:100%;display:block}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 .mec-event-countdown-part-title span{font-weight:300;display:block}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 .mec-event-upcoming{color:#fff;font-size:36px;letter-spacing:-2px;font-weight:700;line-height:1;margin-top:-10px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2 .mec-event-countdown>div{display:inline-block}.mec-event-countdown-style3 .mec-events-meta-group-countdown{color:#c9c9c9;margin-bottom:30px;padding:20px 30px;background:#fff;border:1px solid #e6e6e6;box-shadow:0 2px 0 0 rgba(0,0,0,.016)}.mec-event-countdown-style3 .mec-event-countdown-part2 .mec-event-date-place{text-align:center;padding-bottom:8px}.mec-event-countdown-part2 .mec-event-place,.mec-event-countdown-style3 .mec-event-countdown-part2 .mec-event-date{display:inline;font-size:14px;padding:0 5px;text-align:center}.mec-event-countdown-style3 .mec-event-countdown-part3 .mec-event-button{display:inline-block;padding:14px 30px;vertical-align:middle;font-size:12px;letter-spacing:1px;text-transform:uppercase;color:#fff;background:#4077ed;transition:all .24s ease}.mec-event-countdown-style3 .mec-event-countdown-part3 .mec-event-button:hover{background:#222}.mec-event-countdown-style3 .mec-event-countdown{text-align:center;display:table;table-layout:fixed;margin:0 auto;position:absolute;top:40px;right:20px}.mec-event-countdown-style3 .mec-event-countdown .label-w{letter-spacing:1px;text-transform:uppercase;position:relative}.mec-event-countdown-style3 .mec-event-countdown .block-w{display:table-cell;margin:0 20px 10px;position:relative;height:70px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li{padding:15px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li span{font-size:30px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li .label-w{font-size:11px;color:#888;margin:8px 0 0;line-height:1}.mec-event-countdown-style3 .mec-event-date{width:176px;height:96px;background:#40d9f1;color:#fff;font-size:13px;position:absolute;left:-27px;top:146px}.mec-event-countdown-style3 .mec-event-date:after{content:"";position:absolute;display:inline-block;z-index:1;bottom:-18px;left:8px;width:0;border-width:19px;border-style:solid;border-color:transparent transparent #40d9f1 transparent;transform:rotate(45deg)}.mec-event-countdown-style3 .mec-event-date .mec-date1{font-size:50px;position:absolute;top:7px;left:12px;letter-spacing:-3px}.mec-event-countdown-style3 .mec-event-date .mec-date2{position:absolute;left:80px;top:26px}.mec-event-countdown-style3 .mec-event-date .mec-date3{position:absolute;left:80px;top:45px}.mec-event-countdown-style3 .mec-event-countdown-part-details{padding-top:35px;margin-bottom:50px;min-height:100px}.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-title{font-size:17px;color:#fff;line-height:1.4;padding-right:20px}.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link{color:#fff;font-size:12px;position:relative;padding-left:22px}.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link:before{content:"";display:inline-block;width:18px;border-top:1px solid #fff;position:absolute;left:0;top:8px}.mec-event-countdown-style3 .mec-event-title-link{position:absolute;left:190px;top:152px}.event-carousel-type1-head .mec-event-date-carousel:before,.mec-event-countdown-style3 .mec-event-date:before{content:"";position:absolute;left:0;bottom:0;z-index:2;width:100%;height:96px;display:inline-block;box-shadow:0 5px 5px rgba(0,0,0,.12);background:0 0}@media only screen and (min-width:960px){.mec-wrap.mec-sm959 .mec-event-countdown-style3 .mec-event-countdown li{padding:10px}.mec-wrap.mec-sm959 .mec-event-countdown-style3 .mec-event-countdown-part1 .mec-event-upcoming{font-size:31px}}@media (max-width:959px){.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1,.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part2{width:100%;display:block}.mec-event-countdown-style3 .mec-event-title-link{top:190px}.mec-event-countdown-style3 .mec-event-countdown{top:96px}.mec-event-countdown-style3 .mec-event-date{left:0;top:190px}.mec-event-countdown-style3 .mec-event-date:after{display:none}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 .mec-event-countdown-part-title span{display:inline}.mec-event-countdown-style3 .mec-event-countdown-part-details{min-height:150px}}@media (max-width:767px){.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 .mec-event-upcoming{font-size:26px;letter-spacing:-1px}.mec-event-countdown-style3 .mec-event-title-link{left:130px}.mec-event-countdown-style3 .mec-event-date{width:120px;font-size:10px;height:63px}.mec-event-countdown-style3 .mec-event-date .mec-date1{font-size:36px;top:3px;left:4px;letter-spacing:-2px}.mec-event-countdown-style3 .mec-event-date .mec-date2{position:absolute;left:52px;top:12px}.mec-event-countdown-style3 .mec-event-date .mec-date3{position:absolute;left:52px;top:28px}}@media (max-width:380px){.mec-event-countdown-style3 .mec-event-title-link{left:10px;top:260px}.mec-event-countdown-style3 .mec-event-countdown-part-details{min-height:300px}.mec-event-countdown-style3 .mec-event-countdown .block-w{margin:3px;height:auto}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li{padding:10px 5px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li span{font-size:15px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown li .label-w{font-size:8px}}.mec-slider-t1-wrap{width:100%;padding:60px 90px;background:#f7f7f7;min-height:560px;position:relative}.mec-slider-t1{height:500px;box-shadow:0 5px 35px 0 rgba(0,0,0,.13)}.mec-slider-t1 .mec-event-article{position:relative;height:500px}.mec-slider-t1 .mec-slider-t1-img{position:relative;background-size:cover!important;background-position:center!important;width:50%;height:100%;float:right;margin:0;overflow:hidden}.mec-slider-t1 .mec-slider-t1-content{width:50%;float:left;height:100%;background:#fff;padding:6%}.mec-slider-t1-content.mec-event-grid-modern .mec-event-article{border:none;padding:0;margin:0;box-shadow:none}.mec-slider-t1-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-slider-t1-content.mec-event-grid-modern .mec-event-title a:hover{text-decoration:underline}.mec-slider-t1-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:12px;padding:0 31px;line-height:49px;height:50px}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev{opacity:1;width:54px;height:54px;line-height:48px;border-radius:0;text-align:center;background:#fff;box-shadow:0 2px 11px 0 rgba(0,0,0,.045);transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:50%;margin-top:-27px;cursor:pointer}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev:hover{box-shadow:0 4px 29px 0 rgba(0,0,0,.095)}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next{left:auto;right:-100px}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev{right:auto;left:-100px}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i{font-size:12px;color:#282828;transition:all .21s ease}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next:hover i,.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev:hover i{font-size:13px;color:#000;cursor:pointer}@media only screen and (min-width:961px){.mec-slider-t1{margin:0 auto;max-width:900px}}@media only screen and (max-width:960px){.mec-slider-t1 .mec-slider-t1-content,.mec-slider-t1 .mec-slider-t1-img{width:100%;float:none}.mec-slider-t1 .mec-slider-t1-img{height:300px}.mec-slider-t1,.mec-slider-t1 .mec-event-article{height:auto}}@media only screen and (max-width:768px){.mec-slider-t1-wrap{padding:0}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev{top:40px;margin-top:0}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next{left:auto;right:10px}.mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev{right:auto;left:10px}}@media only screen and (max-width:479px){.mec-slider-t1-content.mec-event-grid-modern .mec-event-title{font-size:22px}.mec-slider-t1-content.mec-event-grid-modern .event-grid-modern-head .mec-event-day{font-size:25px}}.mec-slider-t2-wrap{width:100%;padding:0;background:#fff;min-height:600px;position:relative}.mec-slider-t2 .mec-event-article{height:600px;position:relative;border:none;padding:0;margin:0;box-shadow:none;background:0 0}.mec-slider-t2 .mec-slider-t2-img{position:absolute;left:0;top:0;background-size:cover!important;background-position:center!important;width:70%;height:100%;margin:0;overflow:hidden}.mec-slider-t2 .mec-slider-t2-content{width:50%;position:absolute;right:0;top:60px;bottom:60px;padding:3%}.mec-slider-t2 .mec-slider-t2-content.mec-event-grid-modern *{color:#fff}.mec-slider-t2 .mec-slider-t2-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-slider-t2-content.mec-event-grid-modern .mec-event-content,.mec-slider-t2-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{background:0 0}.mec-slider-t2-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:12px;padding:0 31px;line-height:49px;height:50px}.mec-slider-t2-content.mec-event-grid-modern .mec-event-footer .mec-booking-button:hover{background:#fff;color:#000;border-color:#fff}.mec-slider-t2-content.mec-event-grid-modern .mec-event-footer .mec-booking-button:hover,.mec-slider-t2-content.mec-event-grid-modern .mec-event-title a:hover{color:#111}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev{opacity:1;width:44px;height:44px;line-height:38px;border-radius:0;text-align:center;background:0 0;border:1px solid #fff;transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:84px;cursor:pointer}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev:hover{box-shadow:0 4px 16px 0 rgba(0,0,0,.075);background:#fff}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next{right:30px}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev{right:82px}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev i{font-size:14px;color:#fff;opacity:1;transition:all .25s ease}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next:hover i,.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev:hover i{color:#000;cursor:pointer}.mec-wrap.colorskin-custom .mec-slider-t2 .mec-event-article .mec-event-date.mec-color{color:#fff}@media only screen and (min-width:961px){.mec-slider-t2{margin:0 auto;max-width:1200px}}@media only screen and (max-width:960px){.mec-slider-t2 .mec-slider-t2-content,.mec-slider-t2 .mec-slider-t2-img{width:100%;float:none;position:static}.mec-slider-t2 .mec-slider-t2-img{height:300px}.mec-slider-t2 .mec-event-article{height:auto}.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t2-wrap .mec-owl-theme .owl-nav .owl-prev{top:40px}}@media only screen and (max-width:479px){.mec-slider-t2-content.mec-event-grid-modern .mec-event-title{font-size:22px}}.mec-slider-t3-wrap{width:100%;padding:0;background:#161616;min-height:700px;position:relative}.mec-slider-t3 .mec-event-article{height:700px;position:relative;border:none;padding:0;margin:0;box-shadow:none;background:0 0}.mec-slider-t3 .mec-slider-t3-img{position:absolute;left:0;top:0;background-size:cover!important;background-position:center!important;width:100%;height:100%;margin:0;overflow:hidden;opacity:.68;z-index:1}.mec-slider-t3 .mec-slider-t3-content{width:50%;height:auto;vertical-align:middle;display:table;position:absolute;left:0;top:50%;transform:translateY(-50%);bottom:0;padding:0 2% 0 7%;margin:auto 0;background:0 0;z-index:2}.mec-slider-t3 .mec-slider-t3-content.mec-event-grid-modern :not(.mec-color){color:#fff}.mec-slider-t3-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-slider-t3-content.mec-event-grid-modern .mec-event-content,.mec-slider-t3-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{background:0 0}.mec-slider-t3-content.mec-event-grid-modern .mec-booking-button{display:inline-block;border:1px solid;font-weight:500;letter-spacing:1px;text-transform:uppercase;font-size:13px;padding:0 42px;line-height:49px;height:50px;transition:all .21s ease}.mec-slider-t3-content.mec-event-grid-modern .mec-booking-button:hover{background:#fff;color:#000;border-color:#fff}.mec-slider-t3-content.mec-event-grid-modern .mec-slider-t3-footer{text-align:left;padding:15px 15px 10px}.mec-slider-t3-content.mec-event-grid-modern .mec-event-footer .mec-booking-button:hover,.mec-slider-t3-content.mec-event-grid-modern .mec-event-title a:hover{color:#40d9f1}.mec-slider-t3-content.mec-event-grid-modern .mec-event-footer .mec-booking-button:hover{border-color:#40d9f1}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev{opacity:1;width:44px;height:44px;line-height:38px;border-radius:0;text-align:center;background:0 0;border:1px solid #fff;transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:50%;margin-top:-22px;cursor:pointer}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev:hover{box-shadow:0 4px 16px 0 rgba(0,0,0,.075);background:#fff}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next{right:10px}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev{right:auto;left:10px}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev i{font-size:14px;color:#fff;opacity:1;transition:all .25s ease}.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next:hover i,.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev:hover i{color:#000;cursor:pointer}@media only screen and (min-width:961px){.mec-slider-t3-content.mec-event-grid-modern .mec-event-title{font-size:50px;font-weight:300}.mec-slider-t3-content.mec-event-grid-modern .mec-event-description{font-size:19px}}.mec-event-description{line-height:1.7}@media only screen and (max-width:767px){.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t3-wrap .mec-owl-theme .owl-nav .owl-prev{top:40px;margin-top:0}}@media only screen and (max-width:479px){.mec-slider-t3 .mec-slider-t3-content{width:100%}.mec-slider-t3-content.mec-event-grid-modern .mec-event-title{font-size:22px}.mec-slider-t1-content.mec-event-grid-modern .event-grid-modern-head .mec-event-day{font-size:25px}}.mec-slider-t4-wrap{width:100%;padding:0;background:#161616;min-height:700px;position:relative}.mec-slider-t4 .mec-event-article{height:700px;border:none;padding:0;margin:0;box-shadow:none;background:0 0}.mec-slider-t4 .mec-slider-t4-img{position:absolute;left:0;top:0;background-size:cover!important;background-position:center!important;width:100%;height:100%;margin:0;overflow:hidden;z-index:1}.mec-slider-t4 .mec-slider-t4-content{width:auto;max-width:700px;background:rgba(37,37,37,.94)!important;height:auto;vertical-align:middle;display:table;position:absolute;left:8%;top:19%;padding:3%;margin:auto 0;background:0 0;z-index:2}.mec-slider-t4 .mec-slider-t4-content.mec-event-grid-modern :not(.mec-color){color:#fff}.mec-slider-t4-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-slider-t4-content.mec-event-grid-modern .mec-event-content,.mec-slider-t4-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{background:0 0}.mec-slider-t4-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:13px;padding:0 42px;line-height:49px;height:50px}.mec-slider-t4-content.mec-event-grid-modern .mec-event-title a:hover{color:#40d9f1}.mec-slider-t4-content.mec-event-grid-modern .mec-slider-t4-footer{text-align:left;padding:15px 15px 10px}.mec-slider-t4-content.mec-event-grid-modern .mec-booking-button{display:inline-block;border:1px solid;font-weight:500;letter-spacing:1px;text-transform:uppercase;font-size:13px;padding:0 42px;line-height:49px;height:50px;transition:all .21s ease}.mec-slider-t4-content.mec-event-grid-modern .mec-booking-button:hover{background:#fff;color:#000;border-color:#fff}.mec-slider-t4-content.mec-event-grid-modern .mec-event-footer .mec-booking-button:hover,.mec-slider-t4-content.mec-event-grid-modern .mec-event-title a:hover{color:#111}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev{opacity:1;width:44px;height:44px;line-height:40px;border-radius:0;text-align:center;background:0 0;border:1px solid #fff;transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:34px;cursor:pointer}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev:hover{box-shadow:0 4px 16px 0 rgba(0,0,0,.075);background:#fff}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next{right:60px}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev{right:112px}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev i{font-size:14px;color:#fff;opacity:1;transition:all .25s ease}.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-next:hover i,.mec-slider-t4-wrap .mec-owl-theme .owl-nav .owl-prev:hover i{color:#000;cursor:pointer}@media only screen and (max-width:767px){.mec-slider-t4 .mec-slider-t4-content{width:100%;left:0;top:auto;bottom:0}.mec-slider-t4-content.mec-event-grid-modern .mec-event-title{font-size:22px}.mec-slider-t1-content.mec-event-grid-modern .event-grid-modern-head .mec-event-day{font-size:25px}}.mec-slider-t5-wrap{width:auto;max-width:570px;padding:0;margin:0 auto 25px;background:#f7f7f7;min-height:480px;position:relative}.mec-slider-t5{height:auto;box-shadow:0 5px 35px 0 rgba(0,0,0,.13)}.mec-slider-t5 .mec-event-article{position:relative;height:auto}.mec-slider-t5 .mec-slider-t5-img{position:relative;background-size:cover!important;background-position:center!important;width:100%;height:300px;float:none;margin:0;overflow:hidden}.mec-slider-t5 .mec-slider-t5-content{width:100%;float:none;height:100%;background:#fff;padding:0 20px 20px;margin-bottom:0}.mec-slider-t5 .mec-events-content p{margin-bottom:20px}.mec-slider-t5-content.mec-event-grid-modern .mec-event-article{border:none;padding:0;margin:0;box-shadow:none}.mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head{margin-bottom:10px;padding:14px 34px;margin-left:-20px;margin-right:-20px;text-align:left;background:#f9f9f9;border-bottom:1px solid #eee}.mec-slider-t5-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-slider-t5 .mec-slider-t5-col6{width:50%;float:left;height:100%}.mec-slider-t5 .mec-slider-t5-col6 i{font-size:42px;float:left;margin-right:7px;height:58px}.mec-slider-t5 .mec-slider-t5-col6 h6{text-transform:uppercase;font-size:17px;padding:4px 0;display:inline;color:#444}.mec-slider-t5 .mec-slider-t5-col6 address{font-size:12px;margin-bottom:0}.mec-slider-t5-content.mec-event-grid-modern .mec-event-title a:hover{text-decoration:underline}.mec-slider-t5-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:12px;padding:0 31px;line-height:49px;height:50px;top:0}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next,.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev{opacity:1;width:44px;height:44px;line-height:40px;border-radius:0;text-align:center;background:0 0;border:1px solid #fff;transition:all .25s ease;-webkit-transition:all .25s ease;position:absolute;top:34px;cursor:pointer}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev:hover{box-shadow:0 4px 16px 0 rgba(0,0,0,.075);background:#fff}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next{right:30px}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev{right:82px}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev i{font-size:14px;color:#fff;opacity:1;transition:all .25s ease}.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-next:hover i,.mec-slider-t5-wrap .mec-owl-theme .owl-nav .owl-prev:hover i{color:#000;cursor:pointer}@media only screen and (max-width:768px){.mec-slider-t5 .mec-slider-t5-col6{width:100%;margin:10px 0}}@media only screen and (max-width:479px){.mec-slider-t5-content.mec-event-grid-modern .mec-event-title{font-size:24px}}.mec-single-modern .mec-events-event-image{text-align:center}.mec-single-modern .mec-events-event-image img{width:100%}.mec-single-modern .mec-single-event-bar{margin:20px 0 0;padding:15px;display:table;width:100%;background:#fff;border:1px solid #e6e6e6}.mec-single-modern .mec-single-event-bar>div{display:table-cell}.mec-single-modern .mec-single-event-bar>div i{font-size:20px;vertical-align:middle}.mec-single-modern .mec-single-event-bar>div .mec-time-comment{font-size:12px;color:#999}.mec-single-modern .mec-single-event-bar>div h3{text-transform:uppercase;font-size:16px;font-weight:700;padding-bottom:5px;display:inline;color:#000;padding-left:10px}.mec-single-modern .mec-single-event-bar>div dd{font-size:14px;color:#8d8d8d;padding-left:34px;margin-bottom:0}.mec-single-modern .col-md-4 .mec-frontbox,.mec-single-modern .col-md-4 .mec-sponsors-details{margin-top:-50px;margin-bottom:70px;padding:20px;border:1px solid #e6e6e6;box-shadow:none}.mec-single-modern .col-md-4.mec-no-image .mec-frontbox{margin-top:20px}.mec-next-occurrence ul{padding-left:0;margin-left:0}.mec-next-occurrence li{list-style:none}@media only screen and (min-width:960px){.mec-single-modern .col-md-4 .mec-frontbox,.mec-single-modern .col-md-4 .mec-sponsors-details{margin-left:20px}.featherlight-content .col-md-4 .mec-sponsors-details{margin-left:0;margin-bottom:15px}}@media only screen and (max-width:960px){.mec-single-modern .mec-single-event-bar>div{display:block}}.lity-content>div{overflow:auto;max-height:80vh!important}.mec-next-event-details li{list-style:none;margin-top:20px}.mec-next-event-details h6{text-transform:uppercase;font-size:13px;padding-bottom:5px;display:inline;color:#222;padding-left:0}.mec-next-event-details abbr{display:block;padding-left:0;color:#8d8d8d}.mec-next-event-details i{margin-right:10px;margin-left:12px}.mec-next-event-details i:before{color:#40d9f1}.mec-next-event-details a{text-align:center;display:block;background:#fff;padding:6px 0;font-size:11px;font-weight:400;letter-spacing:0;border:1px solid #e3e3e3;transition:.3s}.mec-active-occurrence-button{margin-top:20px}.mec-single-modal.mec-single-modern .mec-single-title{text-align:center;padding:15px 10px 0}.admin-bar .mec-single-modal.mec-single-modern .mec-single-title{padding-top:40px}.mec-single-modal.mec-single-modern .mec-single-event-bar{width:calc(100% - 30px);margin:0 auto 15px;padding:5px}.mec-single-modal.mec-single-modern .mec-events-event-image{width:calc(100% - 30px);margin:0 auto}.mec-single-modal.mec-single-modern .mec-single-event-bar>div dd{font-size:13px}.mec-single-modal.mec-single-modern .mec-single-event-bar>div h3{font-size:15px}@media only screen and (min-width:960px){.mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox{margin-left:0}}.mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox{margin-top:10px;margin-bottom:10px}.mec-single-modal.mec-single-modern .col-md-4 .mec-frontbox.mec-event-meta{padding:0}@media (min-width:961px){.mec-single-event.mec-sticky{position:relative}.mec-single-event.mec-sticky .col-md-4{position:-webkit-sticky;position:sticky;top:120px}.mec-single-modern.mec-sticky .col-md-4{top:170px}.single-mec-events .mec-sticky .col-md-8>div:last-child{margin-bottom:30px}.single-mec-events .mec-single-modern.mec-sticky .col-md-8>div:last-child{margin-bottom:70px}}.mec-single-modal .mec-event-meta dd.mec-organizer-email a,.mec-single-modal .mec-event-meta dd.mec-organizer-url a{font-size:12px;display:block}.mec-organizer-description p{padding-left:12px}.mec-modal-wrap{max-width:90vw;max-height:90vh!important;background:#fff;box-shadow:0 1px 55px rgba(0,0,0,.5);overflow-x:hidden!important}@media (max-width:1023px){.mec-modal-wrap{max-width:80vw}}.mec-single-modal .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li,.mec-single-modal .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a.mec-events-button{display:block;text-align:center}.mec-single-modal .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li:first-child{margin-bottom:20px}.mec-holding-status-expired{color:#d8000c}.mec-holding-status-ongoing{color:#0dbf52}body .featherlight{z-index:999999!important}body .featherlight .featherlight-content{background:0 0;overflow:unset;z-index:9999}body .featherlight .featherlight-close-icon{position:fixed;top:40px;right:40px;background:0 0;color:#fff;border:1px solid #fff;border-radius:0}body .featherlight .featherlight-close-icon:hover{background:#fff;color:#000;border:1px solid #000}@media (max-width:320px){.mec-wrap span.flip-clock-divider{width:20px}.mec-single-event .mec-events-meta-group-countdown{padding:15px 12%}}@media only screen and (min-width:320px) and (max-width:767px){.mec-wrap .flip-clock-wrapper ul{padding:0}}@media (max-width:414px){.mec-wrap span.flip-clock-divider{width:30px}.mec-single-event .mec-events-meta-group-countdown{margin-left:0;padding:15px 7%}}@media (max-width:480px){body .featherlight .featherlight-content{width:95%}.mec-wrap span.flip-clock-divider{width:7px}.mec-single-event .mec-events-meta-group-countdown{margin-left:0;padding:15px 1%}body .featherlight .featherlight-close-icon{color:#000;border-color:#000}}@media (max-width:1366px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:20px!important}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:20px 15px}body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul{width:48px}}@media (max-width:1280px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:14px!important}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:15px 10px}body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul{width:38px}}@media (min-width:961px) and (max-width:1024px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:7px!important}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:15px 5px}body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul{width:14px}body .mec-modal-wrap .mec-single-modal .flip-clock-wrapper ul li a div{font-size:30px}}@media (max-width:640px){body .mec-modal-wrap .mec-single-modal.featherlight-close-icon{top:14px;right:14px}}@media (max-width:480px){.featherlight .featherlight-content,body .mec-modal-wrap{max-width:100%}body .mec-modal-wrap.flip-clock-divider .flip-clock-label{display:block}}@media (max-width:414px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:50px!important}.mec-wrap .flip-clock-divider .flip-clock-label{display:none}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:20px 5px 20px 65px}body .featherlight-content .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:20px 2px 20px 2px!important}body .featherlight-content .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:3px!important}}@media (max-width:375px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:50px!important}.mec-wrap .flip-clock-divider .flip-clock-label{display:none}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:20px 5px 20px 45px}}@media (max-width:320px){body .mec-modal-wrap .mec-single-modal .flip-clock-divider:not(:first-child){width:20px!important}body .mec-modal-wrap .mec-single-modal .mec-events-meta-group-countdown{padding:20px 5px 20px 40px}}.mec-single-event-bar dd{margin-left:0}.mec-events-toggle{max-width:960px;margin-left:auto;margin-right:auto}.mec-events-toggle .mec-toggle-item{border:1px solid #e4e4e4;margin-bottom:15px;box-shadow:0 10px 15px #f3f3f3}.mec-events-toggle .mec-toggle-item-inner{cursor:pointer;position:relative;padding:30px 60px 30px 15px;background:#fff;transition:all .3s ease;min-height:100px;display:table;width:100%;border-collapse:separate}.mec-events-toggle .mec-toggle-item-inner:hover{background:#fbfbfb}.mec-toggle-item-col{width:200px;border-right:1px solid #e3e3e3;margin-right:15px;display:table-cell;padding-right:5px}.mec-toggle-item-col .mec-event-date{font-size:38px;line-height:40px;float:left;margin-right:8px}.mec-toggle-item-col .mec-event-month,.mec-toggle-item-col .mec-time-details{text-transform:uppercase;font-size:12px;line-height:14px;padding-top:4px;font-weight:700}.mec-toggle-item-col .mec-event-detail{font-size:10px}.mec-toggle-item-col .mec-event-day{margin-top:9px;color:silver;font-size:35px;font-weight:100;text-transform:uppercase;letter-spacing:-1px}.mec-events-toggle .mec-toggle-title{color:#000;font-size:23px;font-weight:600;margin-bottom:0;transition:all .3s ease;display:table-cell;text-align:left;max-width:calc(100% - 200px);padding-left:15px;vertical-align:middle}.mec-events-toggle .mec-toggle-item-inner span.event-color{width:5px;height:100%;position:absolute;left:-1px;top:0;bottom:0;border-radius:0;margin:0}.mec-events-toggle .mec-toggle-item-inner i{position:absolute;font-size:30px;right:25px;top:50%;transform:translate(0,-50%);cursor:pointer}.mec-events-toggle .mec-toggle-item.is-open i.mec-sl-plus:before{content:"\e615"}.mec-events-toggle .mec-toggle-item.is-open .mec-toggle-title{background:#f8f8f8;cursor:pointer}.mec-events-toggle .mec-toggle-content{border-top:1px solid #e4e4e4}.mec-events-toggle .mec-toggle-content .mec-modal-wrap{margin:0;max-width:100%;box-shadow:none}.mec-events-toggle .mec-toggle-content .mec-modal-wrap .mec-single-event{margin:0}.mec-events-toggle .mec-toggle-content .mec-single-event-bar,.mec-events-toggle .mec-toggle-content h1.mec-single-title{display:none}.mec-events-toggle .media-links a{margin-bottom:0}.mec-events-toggle .mec-toggle-content .mec-toggle-meta{margin-bottom:14px}.mec-events-toggle .mec-toggle-content .mec-frontbox{padding:12px 14px 8px}.mec-events-toggle .mec-toggle-content .mec-frontbox .mec-speakers-details{border:none}.mec-events-toggle .mec-toggle-content .mec-frontbox .mec-speakers-details ul{padding-left:0}.mec-events-toggle #mec_speakers_details.mec-frontbox{padding:0;margin:0}.mec-events-toggle .mec-toggle-item h3.mec-speakers{border:none;text-align:left;margin-bottom:20px}.mec-events-toggle .mec-toggle-item h3.mec-speakers:before{content:"\e063";font-family:simple-line-icons;border:none;position:relative;display:inline-block;left:3px;bottom:unset;font-size:22px;font-weight:400;padding:0 11px 0 28px;vertical-align:middle}.mec-events-toggle .mec-event-data-fields.mec-frontbox{border:none;padding:0;overflow:visible}@media only screen and (max-width:767px){.mec-toggle-item-inner .mec-toggle-item-col{float:none;width:100%;border-right:none;margin-bottom:5px;display:block;max-width:100%;padding-left:15px}.mec-events-toggle .mec-toggle-title{display:block;width:100%;max-width:100%}}.mec-events-agenda-wrap{margin:10px 0;border:1px solid #e9e9e9;background:#fff;padding-left:20px;box-shadow:0 2px 2px rgba(0,0,0,.03)}.mec-events-agenda{padding:0;border-bottom:1px solid #e9e9e9}.mec-agenda-date-wrap{width:210px;padding-top:15px;float:left;font-size:13px}.mec-agenda-date-wrap i,.mec-agenda-event i{font-size:11px;color:#aaa;margin-right:4px;margin-left:1px}.mec-agenda-event i{vertical-align:middle;margin-right:1px}.mec-agenda-events-wrap{float:left;width:calc(100% - 210px);background:#f9f9f9;padding:15px}.mec-agenda-event{margin-bottom:10px}.mec-agenda-time{font-size:11px;color:#707070;padding-right:10px;width:138px;display:inline-block}.mec-agenda-event-title{position:relative;padding-left:14px}.mec-agenda-event-title a{font-size:14px;font-weight:600;color:#333}.mec-agenda-event-title span.event-color{width:9px;height:9px;position:absolute;left:0;top:6px;margin:0}.mec-agenda-date-wrap span.mec-agenda-day{color:#aaa;font-size:12px}@media only screen and (max-width:767px){.mec-agenda-date-wrap,.mec-agenda-events-wrap{float:none;width:100%}.mec-events-agenda-wrap{padding-left:0}.mec-events-agenda span.mec-agenda-event-title{display:block;width:100%}.mec-agenda-event-title span.event-color{top:7px}.mec-agenda-event-title a{font-size:13px}}.mec-yearly-view-wrap{margin:0 0 15px;border:1px solid #e6e6e6;background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.04);border-bottom-width:4px}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar{max-width:100%;width:232px;padding:10px;background:#fff;margin:10px;display:inline-block}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar dl dt{transition:none;height:30px;width:30px;line-height:30px;border-radius:0;font-size:12px}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar .mec-calendar-events-sec{padding:10px}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar .mec-has-event:after{width:4px;height:4px;bottom:3px;margin-left:-2px}.mec-yearly-view-wrap .mec-calendar-side .mec-calendar-table{min-height:200px}.mec-calendar.mec-yearly-calendar .mec-calendar-table-head dl dt{background:#f9f9f9;font-size:13px}.mec-calendar.mec-yearly-calendar .mec-calendar-table-title{text-align:center;font-size:15px;font-weight:700;color:#222;margin-top:-5px;padding-bottom:5px}.mec-yearly-view-wrap .mec-yearly-calendar-sec{min-height:200px;width:538px;overflow:hidden;float:left;background:#f8f8f8;padding:15px}.mec-yearly-view-wrap .mec-yearly-agenda-sec{min-height:200px;width:calc(100% - 538px);float:left;padding:0 0 0 20px;overflow:hidden}.mec-yearly-view-wrap .mec-yearly-title-sec{position:relative;padding:15px;text-align:center;border-bottom:1px solid #e6e6e6;box-shadow:0 1px 3px rgba(0,0,0,.02)}.mec-yearly-view-wrap .mec-yearly-title-sec h2{font-size:30px;line-height:40px;color:#333;margin:0;font-weight:700}.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year{position:absolute;top:50%;margin-top:-15px;min-width:30px;height:30px;line-height:30px;padding:0 8px;text-align:center;background:#fff;color:#666;font-size:14px;border:1px solid #eee;border-radius:2px;box-shadow:0 2px 0 0 rgba(0,0,0,.015);transition:all .33s ease;cursor:pointer}.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year{right:auto;left:20px;padding-right:14px}.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year{left:auto;right:20px;padding-left:14px}.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year i,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year i{font-size:12px;color:#40d9f1;cursor:pointer}.mec-yearly-view-wrap .mec-events-agenda.mec-selected{box-shadow:-10px 0 0 0 #fffcf2,0 -1px 0 #fbebb6;background:#fffcf2;border-color:#fbebb6;color:#f9af29}.mec-yearly-agenda-sec span.mec-event-label-captions.mec-fc-style{right:0;top:0}@media only screen and (max-width:959px){.mec-yearly-view-wrap .mec-yearly-calendar-sec{width:268px;padding:10px 5px}.mec-yearly-view-wrap .mec-yearly-agenda-sec{width:calc(100% - 268px);padding:0 0 0 10px}}@media only screen and (max-width:767px){.mec-yearly-view-wrap .mec-yearly-agenda-sec,.mec-yearly-view-wrap .mec-yearly-calendar-sec{width:100%;float:none}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar{width:auto}.mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar dl dt{width:14.2%}.mec-yearly-view-wrap .mec-yearly-title-sec h2{font-size:25px}}.mec-yearly-view-wrap .mec-agenda-event i,.mec-yearly-view-wrap .mec-agenda-time{display:none}@media only screen and (min-width:768px){.mec-yearly-view-wrap .mec-events-agenda-wrap{margin-top:0;border:none;padding-left:0;box-shadow:none}.mec-yearly-view-wrap .mec-agenda-date-wrap{width:174px;font-size:11px;padding-top:10px}.mec-yearly-view-wrap .mec-agenda-events-wrap{width:calc(100% - 174px);padding:10px}.mec-yearly-view-wrap .mec-agenda-event-title a{font-size:13px}.mec-yearly-view-wrap .mec-agenda-event-title span.event-color{width:8px;height:8px}.mec-yearly-view-wrap .mec-agenda-date-wrap span.mec-agenda-day{font-size:11px}.mec-yearly-view-wrap .mec-yearly-calendar-sec{box-shadow:-2px 0 5px rgba(0,0,0,.03) inset}}@media only screen and (max-width:1200px){.mec-yearly-view-wrap .mec-agenda-event-title a{font-size:12px;padding-right:6px}}.mec-calendar.mec-calendar-timetable .mec-calendar-d-table{padding-bottom:10px;border-bottom:none}.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt:hover{cursor:pointer}.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event,.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-has-no-event:hover{color:#bbb;cursor:default}.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-day-active{background:#40d9f1;color:#fff;position:relative}.mec-calendar.mec-calendar-timetable .mec-calendar-d-table dl dt.mec-timetable-day-active:after{content:"";position:absolute;display:block;bottom:-20px;left:50%;margin-left:-10px;width:0;border-width:10px;border-style:solid;border-color:#40d9f1 transparent transparent transparent}.mec-week-events-container{background:#fff}.mec-timetable-events-list{padding:10px 20px;border:none;margin:0}.mec-timetable-events-list .mec-timetable-event{padding:10px 0;border-bottom:1px dashed #ddd}.mec-timetable-events-list .mec-timetable-event:last-child{border:none}.mec-timetable-event .mec-timetable-event-span{font-size:12px;color:#444;padding-right:30px;line-height:22px}.mec-timetable-events-list .mec-timetable-event i{font-size:13px;color:#aaa;margin-right:3px;vertical-align:baseline}.mec-timetable-event .mec-timetable-event-span a{color:#333}.mec-timetable-event .mec-timetable-event-time{font-size:11px}.mec-timetable-event .mec-timetable-event-time i{vertical-align:text-bottom}.mec-timetable-event .mec-timetable-event-title{font-size:13px}.mec-timetable-event .mec-timetable-event-title .event-color{width:10px;height:10px}.mec-timetable-events-list .mec-timetable-event.mec-util-hidden{display:none}.mec-timetable-events-list.mec-util-hidden{display:none}@media only screen and (min-width:768px){.mec-timetable-events-list{display:table;width:100%;margin:10px 0 20px}.mec-timetable-events-list .mec-timetable-event{display:table-row;padding:0;border:none;background:#fff}.mec-timetable-events-list .mec-timetable-event:hover{background:#fafafa}.mec-timetable-event .mec-timetable-event-span{display:table-cell;padding:10px 15px;border-bottom:1px solid #ebebeb}.mec-timetable-events-list .mec-timetable-event:last-child .mec-timetable-event-span{border-bottom:none}}@media only screen and (max-width:767px){.mec-timetable-event .mec-timetable-event-title{display:block;width:100%;padding:5px 0 10px;font-weight:700}}.mec-timetable-t2-wrap{border:1px solid #e6e6e6;background:#fafafa;padding:0 15px 15px;overflow:hidden;box-shadow:0 3px 2px 0 rgba(0,0,0,.012)}.mec-timetable-t2-col{width:20%;float:left;min-height:20px;padding-right:1px;background:0 0}.mec-ttt2-title{background:#fafafa;color:#333;font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:1px;text-align:center;padding:25px 10px 10px;margin-bottom:1px}.mec-timetable-t2-col .mec-event-article{position:relative}.mec-timetable-t2-col .mec-event-article .event-color{position:absolute;width:auto;height:auto;left:0;right:0;top:0;bottom:0;margin:0;z-index:1;border-radius:2px}.mec-timetable-t2-content{position:relative;z-index:2;color:#fff;padding:15px 15px 20px;text-align:left;height:auto;margin-bottom:1px;overflow:hidden}.mec-timetable-t2-content .mec-event-title{line-height:22px;margin-bottom:13px;white-space:nowrap;padding-right:1px;overflow:hidden}.mec-timetable-t2-content .mec-event-title a{color:#fff;font-size:15px;font-weight:600;white-space:pre-line;overflow:hidden}.mec-timetable-t2-content div{color:#fff;font-size:11px;font-weight:400;line-height:19px;white-space:nowrap}.mec-timetable-t2-content div i{font-size:12px;margin-right:4px}@media only screen and (max-width:960px){.mec-timetable-t2-col{width:100%;float:none}}@media (min-width:961px){.mec-timetable-col-7{width:14.28%}.mec-timetable-col-6{width:16.6666%}}.mec-timetable-t3-wrap td{position:relative;padding:0}.mec-timetable-t3-wrap td a{width:100%;display:block;min-height:110px}.mec-weather-box{padding:15px 0}.mec-weather-head{min-height:90px;padding:5px 0;clear:both;overflow:hidden;margin-bottom:25px;border-radius:10px;background:#238af5;position:relative}.mec-weather-icon-box{float:left;width:80px;height:80px;border-radius:10px;overflow:hidden;background:#238af5}.mec-weather-icon{width:80px;height:80px;display:inline-block;border-radius:10px}.mec-weather-summary{float:left;width:calc(100% - 80px);padding-left:10px;margin:10px 0;height:60px}.mec-weather-summary-report{font-size:15px;color:rgba(255,255,255,.68);margin-bottom:6px}.mec-weather-summary-temp{font-weight:300;color:#fff;font-size:29px;line-height:1}.degrees-mode{background:rgba(0,0,0,.2);cursor:pointer;font-weight:300;font-size:18px;padding:4px 5px;line-height:1;color:#fff;position:absolute;border-radius:8px;bottom:16px;left:16px}.mec-weather-extras{width:auto;padding:10px 15px 0 15px;float:right;min-height:80px;color:#fff;font-size:13px;line-height:1}.mec-weather-extras{width:auto;padding:10px 15px 0 15px;float:right;min-height:80px;color:#fff;font-size:13px;line-height:1}.mec-weather-extras div{line-height:20px;height:20px}.mec-weather-extras span{color:rgba(255,255,255,.68);font-size:12px;text-transform:uppercase}.mec-weather-extras var{font-size:11px;letter-spacing:.4px}.mec-weather-icon.clear-day,.mec-weather-icon.clear-night{background-image:url(../img/mec-weather-icon-01.png)}.mec-weather-icon.partly-sunny-day,.mec-weather-icon.partly-sunny-night{background-image:url(../img/mec-weather-icon-02.png)}.mec-weather-icon.partly-cloudy-day,.mec-weather-icon.partly-cloudy-night{background-image:url(../img/mec-weather-icon-03.png)}.mec-weather-icon.cloudy,.mec-weather-icon.fog,.mec-weather-icon.wind{background-image:url(../img/mec-weather-icon-04.png)}.mec-weather-icon.thunderstorm{background-image:url(../img/mec-weather-icon-05.png)}.mec-weather-icon.rain{background-image:url(../img/mec-weather-icon-06.png)}.mec-weather-icon.hail,.mec-weather-icon.sleet,.mec-weather-icon.snow{background-image:url(../img/mec-weather-icon-07.png)}.mec-av-spot-wrap{width:auto;max-width:1200px;padding:0;margin:0 auto 25px;background:#f7f7f7;min-height:480px;position:relative}.mec-av-spot{height:auto;border:1px solid #eee;box-shadow:0 6px 12px -4px rgba(0,0,0,.05)}.mec-av-spot .mec-event-article{position:relative;height:auto}.mec-av-spot .mec-av-spot-img{position:relative;background-size:cover!important;background-position:center!important;width:100%;height:330px;float:none;margin:0;overflow:hidden}.mec-av-spot .mec-av-spot-content,.mec-av-spot .mec-av-spot-head{width:100%;float:none;height:100%;background:#fff;padding:0 20px 20px;margin-bottom:0}.mec-av-spot .mec-av-spot-head{background:#222;color:#fff;min-height:80px}.mec-av-spot .mec-av-spot-head .mec-av-spot-box{padding-top:25px;font-size:13px;color:#ddd}.mec-av-spot .mec-av-spot-head .mec-av-spot-box span{color:#40d9f1;font-size:40px;font-weight:700;font-style:italic}.mec-av-spot .mec-av-spot-head .mec-event-countdown{text-align:center;padding-top:10px;display:table;table-layout:fixed;margin:0 auto;float:right}.mec-av-spot .mec-av-spot-head .mec-event-countdown li{display:table-cell;padding:10px 20px;position:relative;height:60px}.mec-av-spot .mec-av-spot-head .mec-event-countdown p{margin-bottom:0}.mec-av-spot .mec-events-content p{margin-bottom:20px}.mec-av-spot-content.mec-event-grid-modern .mec-event-article{border:none;padding:0;margin:0;box-shadow:none}.mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head{margin-bottom:10px;padding:14px 34px;margin-left:-20px;margin-right:-20px;text-align:left;background:#f9f9f9;border-bottom:1px solid #eee}.mec-av-spot-content.mec-event-grid-modern .mec-event-title{font-size:29px}.mec-av-spot .mec-av-spot-col6{width:50%;float:left;height:100%}.mec-av-spot .mec-av-spot-col6 i{font-size:42px;float:left;margin-right:7px;height:58px}.mec-av-spot .mec-av-spot-col6 h6{text-transform:uppercase;font-size:17px;padding:4px 0;display:inline;color:#444}.mec-av-spot .mec-av-spot-col6 address{font-size:12px;margin-bottom:0}.mec-av-spot-content.mec-event-grid-modern .mec-event-title a:hover{text-decoration:underline}.mec-av-spot-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:12px;padding:0 31px;line-height:49px;height:50px;top:0;box-shadow:0 5px 11px -3px rgba(0,0,0,.05)}@media only screen and (max-width:768px){.mec-av-spot .mec-av-spot-col6{width:100%;margin:10px 0}}@media only screen and (max-width:479px){.mec-av-spot-content.mec-event-grid-modern .mec-event-title{font-size:24px}}.mec-events-masonry-wrap{display:block;width:auto}.mec-masonry-item-wrap{width:calc(33.33% - 30px);padding:0;margin:0 15px 30px;min-height:10px;position:relative;float:left}.mec-events-masonry-cats{padding:10px;margin-bottom:25px;text-align:center;clear:both;list-style:none outside none}.mec-events-masonry-cats a{border-radius:2px;padding:6px 12px;font-size:13px;line-height:1.2;color:#333;font-weight:400;margin-top:0!important;text-align:center;display:inline-block;width:auto;border:2px solid transparent;transition:all .2s ease}.mec-events-masonry-cats a:hover{border-color:#40d9f1;color:#333}.mec-events-masonry-cats a.mec-masonry-cat-selected{border:2px solid #40d9f1;color:#40d9f1}.mec-masonry{background:#f7f7f7;height:auto;border:1px solid #eee;box-shadow:0 6px 12px -4px rgba(0,0,0,.05)}.mec-masonry .mec-event-article{position:relative;height:auto}.mec-masonry .mec-masonry-img{position:relative;width:100%;height:auto;float:none;margin:0;overflow:hidden}.mec-masonry .mec-masonry-img img{width:100%}.mec-masonry .mec-masonry-content,.mec-masonry .mec-masonry-head{width:100%;float:none;height:100%;background:#fff;padding:0 20px 20px;margin-bottom:0}.mec-masonry .mec-events-content p{margin-bottom:20px}.mec-masonry-content.mec-event-grid-modern .mec-event-article{border:none;padding:0;margin:0;box-shadow:none}.mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head{min-height:79px;margin-bottom:10px;padding:14px 5%;margin-left:-20px;margin-right:-20px;text-align:left;background:#f9f9f9;border-bottom:1px solid #eee}.mec-masonry-content.mec-event-grid-modern .mec-event-title{font-size:22px}.mec-masonry-content.mec-event-grid-modern .mec-event-content{padding-top:20px}@media (max-width:480px){.mec-masonry-content.mec-event-grid-modern .mec-labels-normal{display:block}}.mec-masonry-content.mec-event-grid-modern .mec-event-footer{height:auto;display:flex;gap:10px}.mec-wrap .mec-event-masonry .mec-masonry-content.mec-event-grid-modern .mec-event-footer a{position:static;padding:0;flex:auto;text-align:center}.mec-masonry .mec-masonry-col6 .mec-event-date{font-size:52px;letter-spacing:-2px;line-height:41px;vertical-align:top}.mec-masonry .mec-masonry-col6{width:50%;float:left;height:100%}.mec-masonry .mec-masonry-col6 i{font-size:24px;float:left;margin-right:7px;height:50px}.mec-masonry .mec-masonry-col6 .mec-event-month,.mec-masonry .mec-masonry-col6 h6{text-transform:capitalize;font-size:15px;padding:4px 0;display:inline;color:#444}.mec-masonry .mec-masonry-col6 .mec-event-detail,.mec-masonry .mec-masonry-col6 address{font-size:11px;margin-bottom:0}.mec-masonry-content.mec-event-grid-modern .mec-event-title a:hover{text-decoration:underline}.mec-masonry-content.mec-event-grid-modern .mec-event-footer .mec-booking-button{font-size:12px;line-height:49px;height:50px;box-shadow:0 5px 11px -3px rgba(0,0,0,.05)}@media only screen and (max-width:960px){.mec-masonry-item-wrap{width:calc(50% - 30px)}}@media only screen and (max-width:768px){.mec-masonry .mec-masonry-col6{width:100%;margin:10px 0}.mec-masonry-item-wrap{width:calc(100% - 30px)}}@media only screen and (max-width:479px){.mec-masonry-content.mec-event-grid-modern .mec-event-title{font-size:24px}}.mec-wrap.mec-skin-masonry-container .mec-load-more-wrap{position:unset}.btn-wrapper{text-align:center}.countdown-wrapper .btn-wrapper{padding-top:10px;padding-right:0}.countdown-wrapper h5.countdown-message{letter-spacing:5px;font-weight:500;font-size:18px}.blox.dar .countdown-wrapper p,.countdown-wrapper p{color:#888}.countdown-wrapper a.button.black{float:right;margin-right:0}.mec-wrap .threedaydigits .days .flip-clock-label{right:-100px}@media only screen and (min-width:320px) and (max-width:767px){.mec-wrap .flip-clock-wrapper ul{width:29px!important}.mec-wrap .flip-clock-wrapper ul li a div div.inn{font-size:25px!important}.mec-wrap .flip-clock-divider .flip-clock-label{left:0;font-weight:300}.mec-wrap span.flip-clock-divider{width:12px}}@media only screen and (min-width:320px) and (max-width:480px){.mec-wrap .flip-clock-wrapper ul{width:29px!important}.mec-wrap .flip-clock-wrapper ul li a div div.inn{font-size:25px!important}.mec-wrap .flip-clock-divider .flip-clock-label{display:none}.mec-wrap span.flip-clock-divider:first-child{width:0}.mec-wrap span.flip-clock-divider{width:5px}.mec-single-event .mec-events-meta-group-countdown{margin-left:0;padding:15px 18%}}@media screen and (min-width:960px) and (max-width:1200px){.mec-wrap .threedaydigits ul{height:50px;width:47px}}@media screen and (min-width:480px) and (max-width:768px){.mec-wrap .threedaydigits ul{height:48px;width:26px!important}.mec-wrap .threedaydigits .flip-clock-label{font-size:8px;left:-8px}}@media screen and (min-width:320px) and (max-width:480px){.mec-wrap .threedaydigits ul{height:48px;width:22px!important}}.mec-wrap .flip-clock-wrapper *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden}.mec-wrap .flip-clock-wrapper a{cursor:pointer;text-decoration:none;color:#ccc}.mec-wrap .flip-clock-wrapper a:hover{color:#fff}.mec-wrap .flip-clock-wrapper ul{list-style:none}.flip-clock-wrapper.clearfix:after,.mec-wrap .flip-clock-wrapper.clearfix:before{content:" ";display:table}.mec-wrap .flip-clock-wrapper.clearfix:after{clear:both}.mec-wrap .flip-clock-wrapper{font:normal 11px "helvetica neue",helvetica,sans-serif;-webkit-user-select:none}.mec-wrap .flip-clock-meridium{background:0 0!important;box-shadow:0 0 0!important;font-size:36px!important}.mec-wrap .flip-clock-meridium a{color:#313333}.mec-wrap .flip-clock-wrapper{text-align:center;position:relative;display:inline-block;padding-bottom:10px}.flip-clock-wrapper:after,.mec-wrap .flip-clock-wrapper:before{content:" ";display:table}.mec-wrap .flip-clock-wrapper:after{clear:both}.mec-wrap .flip-clock-wrapper ul{position:relative;float:left;margin:2px;width:50px;height:50px;font-size:80px;font-weight:700;line-height:87px;border-radius:3px;background:rgba(0,0,0,.21)}.mec-wrap .flip-clock-wrapper ul li{z-index:1;position:absolute;left:0;top:0;width:100%;height:100%;line-height:54px;text-decoration:none!important}.mec-wrap .flip-clock-wrapper ul li:first-child{z-index:2}.mec-wrap .flip-clock-wrapper ul li a{display:block;height:100%;-webkit-perspective:200px;-moz-perspective:200px;perspective:200px;margin:0!important;overflow:visible!important;cursor:default!important}.mec-wrap .flip-clock-wrapper ul li a div{z-index:1;position:absolute;left:0;width:100%;height:50%;font-size:80px;overflow:hidden;outline:1px solid transparent}.mec-wrap .flip-clock-wrapper ul li a div .shadow{position:absolute;width:100%;height:100%;z-index:2}.mec-wrap .flip-clock-wrapper ul li a div.up{-webkit-transform-origin:50% 100%;-moz-transform-origin:50% 100%;-ms-transform-origin:50% 100%;-o-transform-origin:50% 100%;transform-origin:50% 100%;top:0}.mec-wrap .flip-clock-wrapper ul li a div.up:after{content:"";position:absolute;top:24px;left:0;z-index:5;width:100%;height:3px;background-color:rgba(0,0,0,.12)}.mec-wrap .flip-clock-wrapper ul li a div.down{-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;-o-transform-origin:50% 0;transform-origin:50% 0;bottom:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.mec-wrap .flip-clock-wrapper ul li a div div.inn{position:absolute;left:0;z-index:1;width:100%;height:200%;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.25);text-align:center;background-color:#40d9f1;border-radius:3px;font-size:48px}.mec-wrap .flip-clock-wrapper ul li a div.up div.inn{top:0}.mec-wrap .flip-clock-wrapper ul li a div.down div.inn{bottom:0}.mec-wrap .flip-clock-wrapper ul.play li.flip-clock-before{z-index:3}.mec-wrap .flip-clock-wrapper .flip{box-shadow:0 2px 5px rgba(0,0,0,.17)}.mec-wrap .flip-clock-wrapper ul.play li.flip-clock-active{-webkit-animation:asd .5s .5s linear both;-moz-animation:asd .5s .5s linear both;animation:asd .5s .5s linear both;z-index:5}.mec-wrap .flip-clock-divider{float:left;display:inline-block;position:relative;width:18px;height:62px}.mec-wrap .flip-clock-divider:first-child{width:0}.mec-wrap .flip-clock-dot{display:none;background:#323434;width:10px;height:10px;position:absolute;border-radius:50%;box-shadow:0 0 5px rgba(0,0,0,.5);left:5px}.mec-wrap .flip-clock-divider .flip-clock-label{position:absolute;bottom:-1.5em;right:-71px;color:#101010;font-weight:700;text-shadow:none;text-transform:uppercase}.mec-wrap .blox.dark .flip-clock-divider .flip-clock-label{color:#8a8a8a}.mec-wrap .flip-clock-divider.seconds .flip-clock-label{right:-82px}.mec-wrap .flip-clock-dot.top{top:30px}.mec-wrap .flip-clock-dot.bottom{bottom:30px}@-webkit-keyframes asd{0%{z-index:2}20%{z-index:4}100%{z-index:4}}@-moz-keyframes asd{0%{z-index:2}20%{z-index:4}100%{z-index:4}}@-o-keyframes asd{0%{z-index:2}20%{z-index:4}100%{z-index:4}}@keyframes asd{0%{z-index:2}20%{z-index:4}100%{z-index:4}}.flip-clock-wrapper ul.play li.flip-clock-active .down{z-index:2;-webkit-animation:turn .5s .5s linear both;-moz-animation:turn .5s .5s linear both;animation:turn .5s .5s linear both}@-webkit-keyframes turn{0%{-webkit-transform:rotatex(90deg)}100%{-webkit-transform:rotatex(0)}}@-moz-keyframes turn{0%{-moz-transform:rotatex(90deg)}100%{-moz-transform:rotatex(0)}}@-o-keyframes turn{0%{-o-transform:rotatex(90deg)}100%{-o-transform:rotatex(0)}}@keyframes turn{0%{transform:rotatex(90deg)}100%{transform:rotatex(0)}}.flip-clock-wrapper ul.play li.flip-clock-before .up{z-index:2;-webkit-animation:turn2 .5s linear both;-moz-animation:turn2 .5s linear both;animation:turn2 .5s linear both}@-webkit-keyframes turn2{0%{-webkit-transform:rotatex(0)}100%{-webkit-transform:rotatex(-90deg)}}@-moz-keyframes turn2{0%{-moz-transform:rotatex(0)}100%{-moz-transform:rotatex(-90deg)}}@-o-keyframes turn2{0%{-o-transform:rotatex(0)}100%{-o-transform:rotatex(-90deg)}}@keyframes turn2{0%{transform:rotatex(0)}100%{transform:rotatex(-90deg)}}.flip-clock-wrapper ul li.flip-clock-active{z-index:3}.flip-clock-wrapper ul.play li.flip-clock-before .up .shadow{background:-moz-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(0,0,0,.1)),color-stop(100%,rgba(64,64,64,.68)));background:linear,top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%;background:-o-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:-ms-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:linear,to bottom,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%;-webkit-animation:show .5s linear both;-moz-animation:show .5s linear both;animation:show .5s linear both}.flip-clock-wrapper ul.play li.flip-clock-active .up .shadow{background:-moz-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(0,0,0,.1)),color-stop(100%,rgba(64,64,64,.68)));background:linear,top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%;background:-o-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:-ms-linear-gradient(top,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%);background:linear,to bottom,rgba(0,0,0,.1) 0,rgba(64,64,64,.68) 100%;-webkit-animation:hide .5s .3s linear both;-moz-animation:hide .5s .3s linear both;animation:hide .5s .3s linear both}.flip-clock-wrapper ul.play li.flip-clock-before .down .shadow{background:-moz-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(64,64,64,.68)),color-stop(100%,rgba(0,0,0,.1)));background:linear,top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%;background:-o-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:-ms-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:linear,to bottom,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%;-webkit-animation:show .5s linear both;-moz-animation:show .5s linear both;animation:show .5s linear both}.flip-clock-wrapper ul.play li.flip-clock-active .down .shadow{background:-moz-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(64,64,64,.68)),color-stop(100%,rgba(0,0,0,.1)));background:linear,top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%;background:-o-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:-ms-linear-gradient(top,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%);background:linear,to bottom,rgba(64,64,64,.68) 0,rgba(0,0,0,.1) 100%;-webkit-animation:hide .5s .3s linear both;-moz-animation:hide .5s .3s linear both;animation:hide .5s .2s linear both}@-webkit-keyframes show{0%{opacity:0}100%{opacity:1}}@-moz-keyframes show{0%{opacity:0}100%{opacity:1}}@-o-keyframes show{0%{opacity:0}100%{opacity:1}}@keyframes show{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes hide{0%{opacity:1}100%{opacity:0}}@-moz-keyframes hide{0%{opacity:1}100%{opacity:0}}@-o-keyframes hide{0%{opacity:1}100%{opacity:0}}@keyframes hide{0%{opacity:1}100%{opacity:0}}@media only screen and (min-width:320px) and (max-width:480px){.single-mec-events .mec-wrap .flip-clock-wrapper{padding-bottom:0;max-width:218px}.single-mec-events .mec-wrap .mec-events-meta-group-countdown{padding:20px 10px 20px 10px}.mec-wrap .flip-clock-wrapper ul{width:25px!important;padding:0}.single-mec-events .mec-wrap .flip-clock-wrapper .flip{margin-bottom:40px}.single-mec-events .mec-wrap .flip-clock-divider .flip-clock-label{display:block}.single-mec-events .mec-wrap .flip-clock-divider.days .flip-clock-label{left:-15px}.single-mec-events .mec-wrap .flip-clock-divider.hours .flip-clock-label{left:0}.single-mec-events .mec-wrap .flip-clock-divider.minutes .flip-clock-label{left:0}.single-mec-events .mec-wrap .flip-clock-divider.seconds .flip-clock-label{left:-15px}.single-mec-events .mec-wrap .flip-clock-wrapper{max-width:unset}}@font-face{font-family:simple-line-icons;src:url("../fonts/Simple-Line-Icons.eot?v=2.3.1");src:url("../fonts/Simple-Line-Icons.eot?v=2.3.1#iefix") format("embedded-opentype"),url("../fonts/Simple-Line-Icons.woff2?v=2.3.1") format("woff2"),url("../fonts/Simple-Line-Icons.woff?v=2.3.1") format("woff"),url("../fonts/Simple-Line-Icons.ttf?v=2.3.1") format("truetype"),url("../fonts/Simple-Line-Icons.svg?v=2.3.1#simple-line-icons") format("svg");font-weight:400;font-style:normal}[class*=mec-sl-]{font-family:simple-line-icons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mec-sl-facebook:before{content:"\e00b"}.mec-sl-twitter:before{content:"\e009"}.mec-sl-google-plus:before{content:"\e60d"}.mec-sl-angle-left:before{content:"\e605"}.mec-sl-angle-right:before{content:"\e606"}.mec-sl-calendar:before{content:"\e075"}.mec-sl-clock-o:before{content:"\e081"}.mec-sl-home:before{content:"\e069"}.mec-sl-phone:before{content:"\e600"}.mec-sl-envelope:before{content:"\e086"}.mec-sl-sitemap:before{content:"\e037"}.mec-sl-map-marker:before{content:"\e096"}.mec-sl-floder:before{content:"\e089"}.mec-sl-wallet:before{content:"\e02a"}.mec-color,.mec-color-before :before,.mec-color-hover:hover,.mec-wrap .mec-color,.mec-wrap .mec-color-before :before,.mec-wrap .mec-color-hover:hover{color:#40d9f1}.mec-bg-color,.mec-bg-color-hover:hover,.mec-wrap .mec-bg-color,.mec-wrap .mec-bg-color-hover:hover{background-color:#40d9f1}.mec-box-marker,.mec-vip-content-notice{box-shadow:5px 0 0 #40d9f1 inset;padding:5px 10px}.mec-border-color,.mec-border-color-hover:hover,.mec-wrap .mec-border-color,.mec-wrap .mec-border-color-hover:hover{border-color:#40d9f1}.mec-toggle-month-divider.mec-skin-list-events-container{border:1px solid #e8e8e8;margin-bottom:30px;background:#f8f8f8;box-shadow:0 2px 18px -1px rgba(0,0,0,.1);border-radius:2px}.mec-toggle-month-divider .mec-month-divider{margin:0;text-align:left;background:#fff;position:relative;cursor:pointer;border-top:1px solid #e8e8e8}.mec-toggle-month-divider .mec-month-divider span{padding:20px;border-bottom:1px solid #e8e8e8}.mec-toggle-month-divider .mec-month-divider i{position:absolute;right:20px;top:24px;font-size:20px;cursor:pointer}.mec-toggle-month-divider .mec-month-divider span:before{display:none}.mec-toggle-month-divider .mec-month-divider+article{margin-top:20px}.mec-toggle-month-divider .mec-wrap .mec-month-divider:first-of-type{border-top:none}.mec-toggle-month-divider .mec-event-list-accordion .mec-month-divider:not(:first-of-type)~article{display:none}.mec-skin-list-events-container:not(.mec-toggle-month-divider) .mec-month-divider i{display:none}.mec-month-divider{display:flex;align-items:center}.mec-month-divider:after,.mec-month-divider:before{content:"";flex:1;height:4px;background:#ebebeb}.mec-month-divider h5{font-size:22px;font-weight:700;text-transform:uppercase;margin:0 20px}.mec-month-divider i{display:none}.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-month{display:inline-block;padding-top:0}.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-date{font-size:14px;line-height:14px;float:none;display:inline-block;margin-right:0;font-weight:700}.mec-events-toggle .mec-toogle-inner-month-divider.mec-toggle-item-inner{padding:20px 60px 30px 15px}.mec-toogle-inner-month-divider .mec-toggle-month-inner-image{float:left;clear:right;width:100px;margin-right:20px;margin-left:10px}.mec-toogle-inner-month-divider .mec-toggle-item-col .mec-event-detail{margin-top:-6px}.mec-toogle-inner-month-divider .mec-toggle-item-col{float:none;width:100%;margin-top:10px;display:block;border:none}.mec-events-toggle .mec-toogle-inner-month-divider .mec-toggle-title{font-size:19px;display:block;padding-top:10px}@media only screen and (max-width:768px){.mec-events-toggle .mec-toogle-inner-month-divider .mec-toggle-title{font-size:14px;padding-top:0}.mec-toogle-inner-month-divider .mec-toggle-item-col{margin-top:0}.mec-toogle-inner-month-divider .mec-toggle-month-inner-image{width:70px}}.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-label-canceled,.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-label-custom,.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-label-featured{overflow:hidden;position:relative}.mec-event-label-captions{z-index:1;position:absolute;top:30px;right:-37px;font-size:10px;letter-spacing:1px;text-transform:uppercase;background:#04de78;padding:2px 0;color:#fff;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:.5s cubic-bezier(.25, .5, .06, .85);transition:.5s cubic-bezier(.25, .5, .06, .85);list-style:none;text-align:center;width:150px;max-width:150px}.mec-event-agenda-clean .mec-event-label-captions{top:0}.mec-box-calendar.mec-event-calendar-classic.mec-event-container-novel .mec-event-label-captions{display:none}.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-label-canceled:before{background:#de0404}.mec-daily-view-date-events article:before,ul.mec-weekly-view-dates-events article:before{padding:7px 40px!important;top:27px!important}.mec-event-grid-classic article .mec-fc-style,.mec-event-grid-minimal article .mec-fc-style,.mec-event-grid-simple article .mec-fc-style,.mec-timeline-event .mec-fc-style,.mec-timetable-wrap article .mec-fc-style,.mec-wrap .mec-event-list-accordion article .mec-fc-style,.mec-wrap .mec-event-list-modern article .mec-fc-style,.mec-wrap .mec-events-agenda .mec-agenda-event .mec-fc-style,.mec-wrap article.mec-event-cover-classic .mec-fc-style,.mec-wrap article.mec-event-cover-clean .mec-fc-style,.mec-wrap article.mec-event-cover-modern .mec-fc-style,.mec-wrap article[class^=mec-event-countdown-] .mec-fc-style{font-size:9px;letter-spacing:.5px;text-transform:uppercase;background:#04de78;padding:2px 7px;color:#fff;position:relative;margin-left:5px;border-radius:2px}.mec-timeline-event.mec-label-canceled .mec-fc-style,.mec-wrap .mec-events-agenda .mec-agenda-event.mec-label-canceled .mec-fc-style,.mec-wrap article.mec-event-cover-modern.mec-label-canceled .mec-fc-style{background:#de0404}.mec-event-grid-minimal article .mec-fc-style:before,.mec-event-grid-simple article .mec-fc-style:before,.mec-timeline-event .mec-fc-style:before,.mec-timetable-wrap article .mec-fc-style:before,.mec-wrap .mec-event-list-accordion article .mec-fc-style:before,.mec-wrap .mec-event-list-modern article .mec-fc-style:before,.mec-wrap .mec-events-agenda .mec-agenda-event .mec-fc-style:before,.mec-wrap article.mec-event-cover-classic .mec-fc-style:before,.mec-wrap article.mec-event-cover-clean .mec-fc-style:before,.mec-wrap article[class^=mec-event-countdown-] .mec-fc-style:before{width:0;height:0;border-top:4px solid transparent!important;border-right:5px solid;border-bottom:4px solid transparent;margin:0;top:50%;left:-5px;transform:translateY(-4.5px);position:absolute;content:"";color:var(--background-color)}.mec-timeline-event.mec-label-canceled .mec-fc-style:before,.mec-wrap .mec-events-agenda .mec-agenda-event.mec-label-canceled .mec-fc-style:before{color:#de0404}.mec-event-grid-classic article.mec-label-canceled:before,.mec-event-grid-classic article.mec-label-featured:before,.mec-event-grid-minimal article.mec-label-canceled:before,.mec-event-grid-minimal article.mec-label-featured:before,.mec-event-grid-simple article.mec-label-canceled:before,.mec-event-grid-simple article.mec-label-featured:before,.mec-timetable-wrap article.mec-label-canceled:before,.mec-timetable-wrap article.mec-label-featured:before,.mec-wrap .mec-event-list-accordion article.mec-label-canceled:before,.mec-wrap .mec-event-list-accordion article.mec-label-featured:before,.mec-wrap .mec-event-list-modern article.mec-label-canceled:before,.mec-wrap .mec-event-list-modern article.mec-label-featured:before{display:none}.mec-wrap .mec-event-list-accordion article .mec-fc-style,.mec-wrap .mec-event-list-modern article .mec-fc-style,.mec-wrap article.mec-event-cover-classic .mec-fc-style,.mec-wrap article.mec-event-cover-clean .mec-fc-style,.mec-wrap article[class^=mec-event-countdown-] .mec-fc-style{top:-1px;right:-3px;font-size:11px;white-space:nowrap}.mec-event-grid-classic article.mec-label-canceled .mec-fc-style,.mec-event-grid-minimal article.mec-label-canceled .mec-fc-style,.mec-event-grid-simple article.mec-label-canceled .mec-fc-style,.mec-timetable-wrap article.mec-label-canceled .mec-fc-style,.mec-wrap .mec-event-list-accordion article.mec-label-canceled .mec-fc-style,.mec-wrap .mec-event-list-modern article.mec-label-canceled .mec-fc-style,.mec-wrap article.mec-event-cover-classic.mec-label-canceled .mec-fc-style,.mec-wrap article.mec-event-cover-clean.mec-label-canceled .mec-fc-style,.mec-wrap article[class^=mec-event-countdown-].mec-label-canceled .mec-fc-style{background:#de0404}.mec-event-grid-classic article.mec-label-canceled .mec-fc-style:before,.mec-event-grid-minimal article.mec-label-canceled .mec-fc-style:before,.mec-event-grid-simple article.mec-label-canceled .mec-fc-style:before,.mec-timetable-wrap article.mec-label-canceled .mec-fc-style:before,.mec-wrap .mec-event-list-accordion article.mec-label-canceled .mec-fc-style:before,.mec-wrap .mec-event-list-modern article.mec-label-canceled .mec-fc-style:before,.mec-wrap article.mec-event-cover-classic.mec-label-canceled .mec-fc-style:before,.mec-wrap article.mec-event-cover-clean.mec-label-canceled .mec-fc-style:before,.mec-wrap article[class^=mec-event-countdown-].mec-label-canceled .mec-fc-style:before{color:#de0404}.mec-wrap .mec-slider-t5 article:not([class^=mec-event-countdown]).mec-label-canceled:before,.mec-wrap .mec-slider-t5 article:not([class^=mec-event-countdown]).mec-label-featured:before{-ms-transform:none;-webkit-transform:none;transform:none;-webkit-transition:none;transition:none;top:271px;right:0}.mec-timetable-wrap article .mec-fc-style{top:-2px;font-size:10px;right:0}.mec-wrap article.mec-event-cover-modern .mec-fc-style{padding:5px 9px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:1px;margin-bottom:24px;display:inline-block;border-radius:2px;-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);right:0;top:0}.mec-skin-grid-events-container .mec-wrap .mec-event-grid-clean .mec-event-article:before{-ms-transform:none;-webkit-transform:none;transform:none!important;-webkit-transition:none;transition:none;top:22px!important;right:22px!important;padding:0 10px!important}.mec-event-grid-minimal article .mec-fc-style,.mec-event-grid-simple article .mec-fc-style{top:-4px;font-size:10px;margin-left:10px;right:0}.mec-event-grid-classic article .mec-fc-style{padding:5px 20px;font-size:12px;margin-top:8px;display:inline-block}.mec-load-month-link{color:#a9a9a9;font-size:12px;font-weight:400;letter-spacing:1px;text-transform:uppercase;text-decoration:unset;transition:all .33s ease}.mec-categories-wrapper{font-size:12px;font-weight:400;line-height:18px}.mec-categories-wrapper i{margin-right:4px;display:inline-block}ul.mec-categories{padding:0;display:inline;vertical-align:top}ul.mec-categories li.mec-category{list-style:none;display:inline-block;margin-right:3px;cursor:pointer}ul.mec-categories li.mec-category:not(:last-of-type):after{content:","}ul.mec-categories li.mec-category a{color:#777;text-align:left;transition:all .23s ease;-webkit-transition:all .23s ease}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields{display:inline-block;width:18px;height:18px;position:relative;vertical-align:middle;cursor:pointer;margin:0 0 0 4px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAD90lEQVRoge2ZzWscZRjAf8/OJpUkQrF6SJMcNB+zobVdk8WCWEwqBEou0kMKtkgPHoRUD54VFMQ/wJBYhJ6MoGvFg3rQQ7dQFJVN09RANl9UkrgRbVrFuDZpZh4PSWqYmd2Z2a8Ize+0+7zPO/N7dt7l/RjYY48HGynHRZKqRltm7mmBXo1It9jEEBqBhq2UVYSswrTYmraVVFdn248iYpd675IK+GluruXehg4KchZoCtl9SVRHJcrw0fb2pWIdiirg2uzsY2LLOyjngNpib77FOujFdd1481hn50rYzqELGJ+afxGxh0AeCdvXhxURBuNm2ydhOgUuIJ1O1xgN+0eAl0OrhUDgwp3lxVd7e3s3Aub7k05n64yG3CXgZEl2QVG+sv6uG0gkDub8UiN+CZu/fBXlAYR+oz6XTKVSUb9U3wK2hk315LcR+vc3Nr/nn1aA8cz8GdDR8lmFR9DT8Vh7Mn97Hn6YmjpQKzUZ4NGKmAVnxRIrljDNW16NeYdQbaTmXXZfHuCAYUffytfo+QQmZmebbUvmKX2SKhdrIlZr3DR/cTZ4PgHL4jz/H3mAfUp00KvBVYCqRgQ5U3mnkKi+lFQ1nGFXAeOZuWNAc1WkwtHUMXOz2xl0FSDQWx2f8NjoCWfM4z8giWrIFIMorifgnqojdKDeF7Asi69TVxm7MYkIdB85TF/PcQzDqGjeNoqa/gWoNuab3765cpUr331//3vq283PJ5/vqWjeNgKNzpjXEGpwxzZJT0zuSmwHDzsDvou5nYjHg4l4xMqdVwiPAnQ1X3L3kcOuWNfRJyuet4O/nAH3f0BkGcVzu9jXcxyAsRuT9wX6nnu24nnbKCy7dJ2Ba9Nzn4lyKu9VdhX59KlY68DOiHsis3WsekLhEHC5uQqwlcvV0QmPitvNNYRUNTI+Pf+zQEt1tAKzEDdbH3ee5rmHkIgdUf2oel4BEUa9jiI95wGJMgysV1wqOGuCNeLV4FnA5lmlXqysU3BE+MBrNwaF9sTWQ28Av1fMKjgra/a9t/M15i3g0KGW2yq8Vhmn4Cj6SqFD34JroS6z7WOBC+XXCoYIQ12x9kuFcnwXczNm63mUz8unFRDRL+9kF1/3TQtyrXQ6W2fU55II/aWb+aPIF3fra08/09Lyj19uoOV0InEw98eviy+Avl+6XmFEGPpzeeFUEHko4gXH9czsgCLDlP/U7jdFB/3GvJNQGxqAeKw9WWvtM1EZBtbC9ncicFeEIWO9JhZWfqt/8Vyfnm5SooOqeraItdMC8KGyMdIVi2WLdSjLa1ZVjUzM3EzY6AlRuhU1BW36b3+tqyBLIDMCaRUuxzueGCvHa9Y99njQ+RcbkGTacAW/agAAAABJRU5ErkJggg==");background-position:center center;background-size:cover;padding:0;border:none;background-color:transparent;overflow:visible}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip{position:absolute;width:160px;bottom:24px;left:calc(50% - 80px);background:#fff;border-radius:5px;border:1px solid #535a6121;box-shadow:0 4px 45px -8px #444b5061;visibility:hidden;opacity:0;transition:opacity .18s ease,transform .18s ease,visibility .25s ease;transform:scale(.9);z-index:99}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields:hover .mec-data-fields-tooltip{visibility:visible;opacity:1;transform:scale(1)}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip:before{display:block;content:"";position:absolute;width:12px;height:12px;left:calc(50% - 12px);top:100%;transform:translate(50%,-50%) rotate(-45deg);background-color:#fff;box-shadow:0 8px 9px -4px #535a61;z-index:0}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box{overflow:hidden;border-radius:11px;padding:12px 0}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul{width:100%;height:fit-content;overflow-y:scroll;padding:9px 15px;text-align:left}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul::-webkit-scrollbar-track{background-color:#fafafa}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul::-webkit-scrollbar{width:4px;background-color:#fafafa}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul::-webkit-scrollbar-thumb{background-color:#40d9f1;border-radius:4px}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul .mec-event-data-field-item{display:block;width:100%;text-transform:none;margin:0 0 8px 0;color:#616263;font-size:13px;line-height:1.5;font-weight:400;padding-bottom:8px;border-bottom:1px dashed #e1e2e3}.mec-wrap [id^=mec_skin_events_] .mec-event-data-fields .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul .mec-event-data-field-item:last-child{border-bottom:none}.mec-wrap [id^=mec_skin_events_] .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul .mec-event-data-field-item a{color:#40d9f1;font-size:13px;line-height:1.5;font-weight:400}.mec-wrap [id^=mec_skin_events_] .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul .mec-event-data-field-item a:hover{color:#000}.mec-wrap .mec-custom-data .mec-timetable-t2-content,.mec-wrap .mec-custom-data .mec-timetable-t2-content .mec-event-title,.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-custom-data.mec-label-canceled,.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-custom-data.mec-label-featured{overflow:visible!important}.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-custom-data.mec-label-canceled .mec-event-label-captions,.mec-wrap article:not([class^=mec-event-countdown]):not( [class^=mec-event-cover-] ).mec-custom-data.mec-label-featured .mec-event-label-captions{-ms-transform:rotate(0);-webkit-transform:rotate(0);transform:rotate(0);width:fit-content;top:7px;right:7px;padding:2px 5px;border-radius:4px}@media (min-width:769px){.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-canceled .mec-event-data-fields .mec-data-fields-tooltip,.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-custom .mec-event-data-fields .mec-data-fields-tooltip,.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-featured .mec-event-data-fields .mec-data-fields-tooltip{bottom:calc(50% - 110px);left:30px}.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-canceled .mec-event-data-fields .mec-data-fields-tooltip:before,.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-custom .mec-event-data-fields .mec-data-fields-tooltip:before,.mec-wrap [id^=mec_skin_events_] .mec-event-list-standard .mec-label-featured .mec-event-data-fields .mec-data-fields-tooltip:before{left:-10px;top:calc(100% - 110px);box-shadow:-8px -5px 9px -4px #535a61}}.mec-hourly-schedule-speaker-info{background:#fff;padding:30px;border:1px solid #e6e6e6}.mec-hourly-schedule-speaker-thumbnail{float:left;max-width:30%;width:30%}.mec-hourly-schedule-speaker-name{font-weight:700;font-size:26px;line-height:1.2;color:#333;text-transform:uppercase}.mec-hourly-schedule-speaker-details{float:left;width:69%;padding-left:25px}.mec-hourly-schedule-speaker-job-title{font-size:16px;line-height:1.3;margin-bottom:4px}.mec-hourly-schedule-speaker-description{font-size:14px;font-weight:400;color:#6d7683;line-height:1.7;text-align:left}.mec-hourly-schedule-speaker-contact-information a i,.mec-organizer-social-information a i{color:#6b6b6b;background:#ebebeb;line-height:29px;margin:9px 7px 9px 0;width:30px;height:30px;display:inline-block;text-align:center;transition:all .2s ease;font-size:15px;cursor:pointer;border-radius:3px}.mec-hourly-schedule-speaker-contact-information a i:hover,.mec-organizer-social-information a i:hover{background:#222;color:#fff}@media only screen and (max-width:479px){.mec-hourly-schedule-speaker-thumbnail{float:none;max-width:none;margin-right:0;margin-bottom:15px;width:100%}.mec-hourly-schedule-speaker-thumbnail img{width:100%}.mec-hourly-schedule-speaker-details{padding-left:0}.mec-hourly-schedule-speaker-info{width:90%;margin:0 auto}}.mec-profile{overflow-x:auto}.mec-profile .mec-profile-bookings{border:2px solid #e6e6e6;text-align:center;min-width:600px}.mec-profile .mec-profile-bookings tbody tr:first-child{background:#f7f7f7;font-weight:700;text-transform:capitalize}.mec-profile .mec-profile-bookings tbody tr{border-bottom:1px solid #e6e6e6;font-size:14px}.mec-profile .mec-profile-bookings tbody tr td{border:1px solid #e6e6e6;padding:10px;text-align:center;word-break:initial}.mec-profile .mec-profile-bookings tbody tr td a{text-decoration:none}.mec-profile .mec-profile-bookings tbody tr td:first-child{width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(2){width:30%;text-align:left}.mec-profile .mec-profile-bookings tbody tr td:nth-child(3){width:30%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(4){width:7%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(5){width:7%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(6){width:7%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(7){width:7%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(8){width:7%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(8) i{color:#fe686a}.mec-profile .mec-event-status{padding:5px 10px;color:#fff;border-radius:2px;font-size:12px;line-height:12px;letter-spacing:.4px}.mec-profile .mec-event-status.mec-book-confirmed{background:#50d477}.mec-profile .mec-event-status.mec-book-pending{background:#fcbe69}.mec-profile .mec-event-status.mec-book-rejected{background:#fe686a}.mec-profile .mec-event-date{font-size:12px;color:#888}.mec-event-date,.mec-event-status{text-align:center}.mec-event-date .mec-tooltip,.mec-event-status .mec-tooltip{position:relative;width:fit-content;margin:auto}.mec-profile i{font-size:15px;color:#008aff;vertical-align:text-bottom;margin-right:4px}.mec-event-date .mec-tooltip .box,.mec-event-status .mec-tooltip .box{min-width:250px;max-width:300px;display:inline-block;top:-8px;left:50%;margin-top:0;transform:translate(-50%,-100%);padding:0;background-color:#000;color:#fff;font-weight:400;font-size:14px;letter-spacing:.5px;line-height:1.5;position:absolute;z-index:99999999;box-sizing:border-box;border-radius:6px;box-shadow:0 4px 45px -8px #535a61;padding:5px 10px 6px;border-radius:8px;text-align:center;font-style:normal;opacity:0;visibility:hidden;display:none}.mec-event-date .mec-tooltip .box,.mec-event-status .mec-tooltip .box{font-size:13px;letter-spacing:1.1px;font-weight:500}.mec-event-date .mec-tooltip:hover .box:after,.mec-event-status .mec-tooltip:hover .box:after{content:"";position:absolute;width:12px;height:12px;left:calc(50% - 12px);bottom:-12px;transform:translate(50%,-50%) rotate(-45deg);background-color:#000;box-shadow:0 8px 9px -4px #535a61}.mec-event-status .mec-tooltip .box{min-width:100px}.mec-event-status.mec-book-confirmed .mec-tooltip .box,.mec-event-status.mec-book-confirmed .mec-tooltip:hover .box:after{background-color:#50d477}.mec-event-status.mec-book-rejected .mec-tooltip .box,.mec-event-status.mec-book-rejected .mec-tooltip:hover .box:after{background-color:#fe686a}.mec-event-status.mec-book-pending .mec-tooltip .box,.mec-event-status.mec-book-pending .mec-tooltip:hover .box:after{background-color:#fcbe69}.mec-event-date .mec-tooltip:hover .box,.mec-event-status .mec-tooltip:hover .box{opacity:1;visibility:visible;display:block}.mec-profile .mec-booking-number-of-attendees{font-size:13px;color:#888}.mec-profile .mec-booking-number-of-attendees i,.mec-profile .mec-profile-bookings-view-invoice i{font-size:15px;color:#008aff;vertical-align:text-bottom;margin-right:4px}.mec-booking-attendees{background:#fff;padding:10px}.mec-booking-attendees{width:850px;text-align:center}.mec-booking-attendees-wrapper{border:2px solid #e6e6e6;font-size:14px}.mec-booking-attendees-head{display:table;width:100%;background:#f7f7f7;border-bottom:1px solid #e6e6e6;font-weight:700}.mec-booking-attendees-head span,.mec-booking-attendees-head-content>span{vertical-align:middle;display:table-cell;padding:7px;border-right:1px solid #e6e6e6;font-size:12px}.mec-booking-attendees-head-content{display:table;width:100%;border-bottom:1px solid #e6e6e6}.mec-booking-attendees-wrapper .mec-booking-attendees-head-content:last-child{border:none}.mec-booking-attendees-head span:first-child,.mec-booking-attendees-head-content>span:first-child{width:4%}.mec-booking-attendees-head span:nth-child(2),.mec-booking-attendees-head-content>span:nth-child(2){width:20%}.mec-booking-attendees-head span:nth-child(3),.mec-booking-attendees-head-content>span:nth-child(3){width:24%}.mec-booking-attendees-head span:nth-child(4),.mec-booking-attendees-head-content>span:nth-child(4){width:26%}.mec-booking-attendees-head span:nth-child(5),.mec-booking-attendees-head-content>span:nth-child(5){width:26%}@media only screen and (max-width:759px){.mec-booking-attendees{width:470px}.mec-booking-attendees-head span,.mec-booking-attendees-head-content>span{word-break:break-all}}@media (max-width:1366px){.mec-profile .mec-profile-bookings tbody tr td:first-child{width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(2){width:30%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(3){width:30%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(4){width:10%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(5){width:10%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(6){width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(7){width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(8){width:5%}}@media (max-width:1024px){.mec-profile .mec-profile-bookings tbody tr td:first-child{width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(2){width:30%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(3){width:30%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(4){width:10%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(5){width:10%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(6){width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(7){width:5%}.mec-profile .mec-profile-bookings tbody tr td:nth-child(8){width:5%}}@media (max-width:780px){.mec-profile .mec-profile-bookings tbody tr,.mec-profile i{font-size:12px}.mec-event-date .mec-tooltip .box{min-width:200px}.mec-event-status .mec-tooltip .box{min-width:90px}.mec-event-date .mec-tooltip .box,.mec-event-status .mec-tooltip .box{padding:4px 5px!important}.mec-profile .mec-profile-bookings tbody tr{font-size:12px}}@media (max-width:480px){.mec-profile .mec-booking-number-of-attendees,.mec-profile .mec-event-date,.mec-profile .mec-profile-bookings tbody tr,.mec-profile i{font-size:10px!important}.mec-profile .mec-event-status{padding:2px 4px;font-size:10px;line-height:20px}.mec-profile .mec-profile-bookings tbody tr td{padding:3px}.mec-event-date .mec-tooltip .box,.mec-event-status .mec-tooltip .box{font-size:8px}.mec-event-date .mec-tooltip .box{min-width:75px}.mec-event-status .mec-tooltip .box{min-width:70px}.mec-event-date .mec-tooltip .box,.mec-event-status .mec-tooltip .box{padding:4px 5px!important}}.mec-woo-booking-checkout{position:relative;border:none;border-radius:0;color:#fff;display:inline-block;font-size:12px;letter-spacing:1px;line-height:1.5;text-transform:uppercase;font-weight:600;text-decoration:none;cursor:pointer;margin-bottom:21px;margin-right:10px;line-height:1;padding:18px 20px 16px;background:#39c36e;-webkit-transition:all .21s ease;-moz-transition:all .21s ease;transition:all .21s ease;border-radius:0;margin-bottom:6px;min-width:170px;margin-top:5px;text-align:center}.mec-woo-booking-checkout:hover{background:#222;color:#fff}.mec-woo-booking-checkout:focus,.mec-woo-booking-checkout:visited{color:#fff}.single-mec-events .lity-container{max-width:768px;width:768px}.lity-content .mec-events-meta-group-booking{width:100%;background:#fff;overflow-y:auto}@media only screen and (max-width:480px){.lity-content .mec-events-meta-group-booking{padding:20px;width:340px;margin:0 auto}}@media (max-width:480px){.single-mec-events .lity-container{max-width:440px;width:440px;margin:0 auto!important}}@media (max-width:411px){.single-mec-events .lity-container{max-width:380px;width:380px}}@media (max-width:375px){.single-mec-events .lity-container{max-width:350px;width:350px}}@media (max-width:320px){.single-mec-events .lity-container{max-width:300px;width:300px}}.mec-events-meta-group-booking{position:relative}.mec-cover-loader:after{content:"";position:absolute;top:0;right:0;left:0;bottom:0;background:rgba(255,255,255,.5);z-index:99999}.mec-loader{background:rgba(0,0,0,0);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:9}.mec-loader,.mec-loader:after{border-radius:50%;width:5em;height:5em;z-index:999999999999}.mec-loader{font-size:10px;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid #fff;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:mecloader 1.1s infinite linear;animation:mecloader 1.1s infinite linear}@-webkit-keyframes mecloader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mecloader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mec-google-recaptcha{margin:0 0 20px 16px}.mec-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mec-wrap :after,.mec-wrap :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lity .clearfix:after,.lity .clearfix:before,.mec-wrap .clearfix:after,.mec-wrap .clearfix:before{content:"\0020";display:block;overflow:hidden;visibility:hidden;width:0;height:0}.lity .clearfix:after,.mec-wrap .clearfix:after{clear:both}.lity .clearfix,.mec-wrap .clearfix{zoom:1}.lity .clear,.lity .clr,.mec-wrap .clear,.mec-wrap .clr{clear:both;display:block;overflow:hidden;visibility:hidden}.lity .clr,.mec-wrap .clr{visibility:visible;overflow:visible}.mec-container [class*=col-] img{max-width:100%}.mec-container{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.mec-container:after,.mec-container:before{content:" ";display:table}.mec-container:after{clear:both}@media only screen and (max-width:479px){.mec-container{width:300px}}@media only screen and (min-width:480px) and (max-width:767px){.mec-container{width:420px}}@media only screen and (min-width:768px) and (max-width:960px){.mec-container{width:768px}}@media only screen and (min-width:961px){.mec-container{width:960px}}@media only screen and (min-width:1200px){.mec-container{width:1196px;padding-left:15px;padding-right:15px}}@media only screen and (min-width:1921px){.mec-container{max-width:1690px}}.mec-wrap .row{margin-left:-10px;margin-right:-10px}.mec-wrap .row:after,.mec-wrap .row:before{content:" ";display:table}.mec-wrap .row:after{clear:both}.mec-wrap .col-lg-1,.mec-wrap .col-lg-10,.mec-wrap .col-lg-11,.mec-wrap .col-lg-12,.mec-wrap .col-lg-2,.mec-wrap .col-lg-3,.mec-wrap .col-lg-4,.mec-wrap .col-lg-5,.mec-wrap .col-lg-6,.mec-wrap .col-lg-7,.mec-wrap .col-lg-8,.mec-wrap .col-lg-9,.mec-wrap .col-md-1,.mec-wrap .col-md-10,.mec-wrap .col-md-11,.mec-wrap .col-md-12,.mec-wrap .col-md-2,.mec-wrap .col-md-3,.mec-wrap .col-md-4,.mec-wrap .col-md-5,.mec-wrap .col-md-6,.mec-wrap .col-md-7,.mec-wrap .col-md-8,.mec-wrap .col-md-9,.mec-wrap .col-sm-1,.mec-wrap .col-sm-10,.mec-wrap .col-sm-11,.mec-wrap .col-sm-12,.mec-wrap .col-sm-2,.mec-wrap .col-sm-3,.mec-wrap .col-sm-4,.mec-wrap .col-sm-5,.mec-wrap .col-sm-6,.mec-wrap .col-sm-7,.mec-wrap .col-sm-8,.mec-wrap .col-sm-9,.mec-wrap .col-xs-1,.mec-wrap .col-xs-10,.mec-wrap .col-xs-11,.mec-wrap .col-xs-12,.mec-wrap .col-xs-2,.mec-wrap .col-xs-3,.mec-wrap .col-xs-4,.mec-wrap .col-xs-5,.mec-wrap .col-xs-6,.mec-wrap .col-xs-7,.mec-wrap .col-xs-8,.mec-wrap .col-xs-9{position:relative;min-height:1px;padding-left:10px;padding-right:10px}@media only screen and (min-width:1200px){.mec-wrap .col-lg-1,.mec-wrap .col-lg-10,.mec-wrap .col-lg-11,.mec-wrap .col-lg-12,.mec-wrap .col-lg-2,.mec-wrap .col-lg-3,.mec-wrap .col-lg-4,.mec-wrap .col-lg-5,.mec-wrap .col-lg-6,.mec-wrap .col-lg-7,.mec-wrap .col-lg-8,.mec-wrap .col-lg-9,.mec-wrap .col-md-1,.mec-wrap .col-md-10,.mec-wrap .col-md-11,.mec-wrap .col-md-12,.mec-wrap .col-md-2,.mec-wrap .col-md-3,.mec-wrap .col-md-4,.mec-wrap .col-md-5,.mec-wrap .col-md-6,.mec-wrap .col-md-7,.mec-wrap .col-md-8,.mec-wrap .col-md-9,.mec-wrap .col-sm-1,.mec-wrap .col-sm-10,.mec-wrap .col-sm-11,.mec-wrap .col-sm-12,.mec-wrap .col-sm-2,.mec-wrap .col-sm-3,.mec-wrap .col-sm-4,.mec-wrap .col-sm-5,.mec-wrap .col-sm-6,.mec-wrap .col-sm-7,.mec-wrap .col-sm-8,.mec-wrap .col-sm-9,.mec-wrap .col-xs-1,.mec-wrap .col-xs-10,.mec-wrap .col-xs-11,.mec-wrap .col-xs-12,.mec-wrap .col-xs-2,.mec-wrap .col-xs-3,.mec-wrap .col-xs-4,.mec-wrap .col-xs-5,.mec-wrap .col-xs-6,.mec-wrap .col-xs-7,.mec-wrap .col-xs-8,.mec-wrap .col-xs-9{padding-left:15px;padding-right:15px}.mec-wrap .row{margin-left:-15px;margin-right:-15px}}.mec-container [class*=col-].alpha{padding-left:0}.mec-container [class*=col-].omega{padding-right:0}.mec-wrap .col-xs-1,.mec-wrap .col-xs-10,.mec-wrap .col-xs-11,.mec-wrap .col-xs-12,.mec-wrap .col-xs-2,.mec-wrap .col-xs-3,.mec-wrap .col-xs-4,.mec-wrap .col-xs-5,.mec-wrap .col-xs-6,.mec-wrap .col-xs-7,.mec-wrap .col-xs-8,.mec-wrap .col-xs-9{float:left}.mec-wrap .col-xs-12{width:100%}.mec-wrap .col-xs-11{width:91.66666666666666%}.mec-wrap .col-xs-10{width:83.33333333333334%}.mec-wrap .col-xs-9{width:75%}.mec-wrap .col-xs-8{width:66.66666666666666%}.mec-wrap .col-xs-7{width:58.333333333333336%}.mec-wrap .col-xs-6{width:50%}.mec-wrap .col-xs-5{width:41.66666666666667%}.mec-wrap .col-xs-4{width:33.33333333333333%}.mec-wrap .col-xs-3{width:25%}.mec-wrap .col-xs-2{width:16.666666666666664%}.mec-wrap .col-xs-1{width:8.333333333333332%}@media (min-width:769px){.mec-wrap .col-sm-1,.mec-wrap .col-sm-10,.mec-wrap .col-sm-11,.mec-wrap .col-sm-12,.mec-wrap .col-sm-2,.mec-wrap .col-sm-3,.mec-wrap .col-sm-4,.mec-wrap .col-sm-5,.mec-wrap .col-sm-6,.mec-wrap .col-sm-7,.mec-wrap .col-sm-8,.mec-wrap .col-sm-9{float:left}.mec-wrap .col-sm-12{width:100%}.mec-wrap .col-sm-11{width:91.66666666666666%}.mec-wrap .col-sm-10{width:83.33333333333334%}.mec-wrap .col-sm-9{width:75%}.mec-wrap .col-sm-8{width:66.66666666666666%}.mec-wrap .col-sm-7{width:58.333333333333336%}.mec-wrap .col-sm-6{width:50%}.mec-wrap .col-sm-5{width:41.66666666666667%}.mec-wrap .col-sm-4{width:33.33333333333333%}.mec-wrap .col-sm-3{width:25%}.mec-wrap .col-sm-2{width:16.666666666666664%}.mec-wrap .col-sm-1{width:8.333333333333332%}}@media (min-width:961px){.mec-wrap .col-md-1,.mec-wrap .col-md-10,.mec-wrap .col-md-11,.mec-wrap .col-md-12,.mec-wrap .col-md-2,.mec-wrap .col-md-3,.mec-wrap .col-md-4,.mec-wrap .col-md-5,.mec-wrap .col-md-6,.mec-wrap .col-md-7,.mec-wrap .col-md-8,.mec-wrap .col-md-9{float:left}.mec-wrap .col-md-12{width:100%}.mec-wrap .col-md-11{width:91.66666666666666%}.mec-wrap .col-md-10{width:83.33333333333334%}.mec-wrap .col-md-9{width:75%}.mec-wrap .col-md-8{width:66.66666666666666%}.mec-wrap .col-md-7{width:58.333333333333336%}.mec-wrap .col-md-6{width:50%}.mec-wrap .col-md-5{width:41.66666666666667%}.mec-wrap .col-md-4{width:33.33333333333333%}.mec-wrap .col-md-3{width:25%}.mec-wrap .col-md-2{width:16.666666666666664%}.mec-wrap .col-md-1{width:8.333333333333332%}}@media (min-width:1200px){.mec-wrap .col-lg-1,.mec-wrap .col-lg-10,.mec-wrap .col-lg-11,.mec-wrap .col-lg-12,.mec-wrap .col-lg-2,.mec-wrap .col-lg-3,.mec-wrap .col-lg-4,.mec-wrap .col-lg-5,.mec-wrap .col-lg-6,.mec-wrap .col-lg-7,.mec-wrap .col-lg-8,.mec-wrap .col-lg-9{float:left}.mec-wrap .col-lg-12{width:100%}.mec-wrap .col-lg-11{width:91.66666666666666%}.mec-wrap .col-lg-10{width:83.33333333333334%}.mec-wrap .col-lg-9{width:75%}.mec-wrap .col-lg-8{width:66.66666666666666%}.mec-wrap .col-lg-7{width:58.333333333333336%}.mec-wrap .col-lg-6{width:50%}.mec-wrap .col-lg-5{width:41.66666666666667%}.mec-wrap .col-lg-4{width:33.33333333333333%}.mec-wrap .col-lg-3{width:25%}.mec-wrap .col-lg-2{width:16.666666666666664%}.mec-wrap .col-lg-1{width:8.333333333333332%}}#mec_woo_add_to_cart_btn{min-width:170px;margin-top:5px;text-align:center}.mec-breadcrumbs{border-radius:2px;padding:9px 15px 6px;font-size:11px;color:#8d8d8d;letter-spacing:0;text-transform:none;font-weight:500;margin:auto 15px 33px 15px;border:1px solid #e6e6e6;box-shadow:0 2px 0 0 rgba(0,0,0,.025)}.mec-breadcrumbs-modern{margin:auto 0 33px 0}.mec-breadcrumbs a{color:#000;padding-left:4px}.mec-breadcrumbs a:hover{text-decoration:underline}.mec-breadcrumbs i{font-size:8px;margin:0 0 0 4px}.mec-breadcrumbs .container{padding-left:20px}.mec-content-notification a{margin-left:5px}.mec-content-notification{background:#f7f7f7;padding:10px 10px 10px;border:1px solid #e8e8e8}.mec-content-notification p{margin-bottom:0}.mec-fes-form #mec-advanced-wraper div:first-child>ul{border:1px solid #cfeff5;width:auto;box-shadow:0 1px 4px -2px #cfeff5;display:block;margin:5px 0 10px;padding:5px 0;border-radius:2px}.mec-fes-form #mec-advanced-wraper div:first-child>ul:last-of-type{margin-bottom:35px}#mec-advanced-wraper div:first-child>ul span{display:none}#mec-advanced-wraper div:first-child>ul *{display:inline-block;background:#fff;font-size:12px;color:#717273;text-align:center}#mec-advanced-wraper div:first-child>ul>li{width:60px;font-weight:700;margin:0 10px 0 0;padding:4px 0;border-right:1px solid #cfeff5}#mec-advanced-wraper div:first-child>ul>ul>li{margin:0;padding:2px 10px;cursor:pointer;border-radius:2px;transition:all .18s ease}.mec-fes-form #mec-advanced-wraper div:first-child>ul>ul>li.mec-active,.mec-fes-form #mec-advanced-wraper div:first-child>ul>ul>li:hover{background:#40d9f1!important;box-shadow:0 1px 9px -3px #40d9f1;color:#fff!important}.mec-search-bar-wrap .mec-search-form .mec-text-input-search{width:83%}.mec-search-bar-wrap .mec-search-form .mec-ajax-search-result .mec-text-input-search{width:100%;float:none}.mec-search-bar-wrap input#mec-search-bar-input{width:calc(100% - 84%);margin-left:11px;background:#40d9f1;color:#fff;font-weight:400}.mec-text-input-search+input#mec-search-bar-input{margin-left:-3px}.mec-search-bar-wrap input#mec-search-bar-input:hover{background:#000}.mec-wrap.mec-search-bar-wrap .mec-totalcal-box input{float:none}@media (max-width:768px){.mec-search-bar-wrap .mec-search-form .mec-text-input-search{display:inline-block}}@media (max-width:480px){.mec-search-bar-wrap .mec-search-form .mec-text-input-search{width:64%}.mec-search-bar-wrap input#mec-search-bar-input{width:calc(100% - 67%)}}.mec-wrap.mec-search-bar-wrap .mec-totalcal-box{overflow:visible}.mec-ajax-search-result{position:relative}.mec-search-bar-wrap.mec-wrap .mec-totalcal-box input[type=text]{width:calc(100% - 36px)}.mec-search-bar-wrap.mec-wrap .mec-totalcal-box input[type=text]:focus{border-color:#efefef}div#mec-ajax-search-result-wrap{position:absolute;top:100%;opacity:0;visibility:hidden;width:calc(100% - 2px);min-height:50px;left:0;right:0;padding:0 10px;z-index:9999;transition:all .3s ease}.mec-ajax-search-result-events{background:#fff;padding:10px 20px;border:1px solid #efefef;border-top:none}.mec-ajax-search-result-events article:first-of-type{border:none}article.mec-search-bar-result{text-align:left;margin-bottom:0;padding-bottom:25px;padding-top:26px;border-top:1px solid #efefef;transition:all .33s ease;clear:both}.mec-search-bar-result .mec-event-list-search-bar-date{width:64px;height:64px;margin-right:10px;font-size:11px;text-transform:uppercase;float:left;text-align:center;padding-top:2px}.mec-search-bar-result .mec-event-list-search-bar-date span{font-size:40px;line-height:30px;font-weight:700;display:block;margin-bottom:6px;letter-spacing:1px}.mec-search-bar-result .mec-event-image{float:left;margin-right:20px;width:65px;height:auto}.mec-search-bar-result .mec-event-time{font-size:11px;line-height:1.1;margin:0}.mec-search-bar-result .mec-event-time i{color:#40d9f1;float:none;width:unset;height:unset;font-size:inherit;margin-right:3px;border:none;padding:0}.mec-search-bar-result .mec-event-title{font-size:13px;padding:0;margin:10px 0 8px;font-weight:700;text-transform:uppercase}.mec-search-bar-result .mec-event-title a{text-decoration:none;color:#494949;transition:color .3s ease}.mec-search-bar-result .mec-event-detail{font-size:13px;line-height:1.3;color:#9a9a9a;margin-bottom:0}.mec-wrap.mec-modern-search-bar .mec-totalcal-box{background:rgba(255,255,255,.87);border:none;padding:35px;border-radius:3px;box-shadow:0 3px 13px rgba(0,0,0,.4);position:relative}.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type=search],.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type=text]{height:58px;background:rgba(255,255,255,.99);border-radius:2px;box-shadow:0 4px 8px rgba(0,0,0,.1) inset;border:1px solid #ccc;width:100%;padding-left:45px;padding-right:13px;font-size:16px}.mec-wrap.mec-modern-search-bar .mec-totalcal-box .mec-text-input-search i{position:absolute;background:0 0;border:none;font-size:21px;left:15px;top:calc(50% - 19px);color:#40d9f1}.mec-wrap.mec-modern-search-bar .mec-text-input-search{position:relative;height:58px}.mec-wrap.mec-modern-search-bar .mec-totalcal-box input[type=submit]{height:58px;border:none;border-radius:2px;background:#fc4a1a;font-size:17px;font-weight:700!important}.mec-wrap.mec-modern-search-bar .mec-text-input-search+input#mec-search-bar-input{margin-left:0}.mec-wrap.mec-modern-search-bar .mec-search-form .mec-dropdown-wrap .mec-dropdown-search select{height:45px;background:rgba(255,255,255,.99);border-radius:2px;box-shadow:0 4px 8px rgba(0,0,0,.1) inset;border:1px solid #ccc;padding-right:13px;font-size:16px;border-left:0}.mec-wrap.mec-modern-search-bar .mec-search-form .mec-dropdown-wrap i{height:45px;background:#ffff;border-radius:2px 0 0 2px;box-shadow:none;border:1px solid #ccc;font-size:15px;padding-top:14px;border-right:0;color:#40d9f1;margin-right:-1px}.mec-wrap.mec-modern-search-bar .mec-search-form .mec-dropdown-wrap{min-height:64px}@media (max-width:768px){.mec-wrap.mec-modern-search-bar .mec-search-form .mec-text-input-search{width:70%}.mec-wrap.mec-modern-search-bar input#mec-search-bar-input{width:calc(100% - 72%)}}@media (max-width:480px){.mec-wrap.mec-modern-search-bar input#mec-search-bar-input{width:92%;padding:0 10px;position:relative;display:block;margin-left:11px}.mec-wrap.mec-modern-search-bar .mec-search-form .mec-text-input-search{width:100%;margin-bottom:20px}.mec-wrap.mec-modern-search-bar .mec-text-input-search+input#mec-search-bar-input{margin-left:10px}}.mec-wrap .mec-related-events-wrap{margin-left:0;margin-right:0}.mec-related-events{margin-right:-15px;margin-left:-15px}@media (max-width:980px){.mec-related-events{margin-right:-10px;margin-left:-10px}}.mec-related-events-wrap{margin-top:50px}.mec-related-events-wrap h3.mec-rec-events-title:before{content:"";background:#2c2f34;width:46px;height:4px;position:absolute;top:59px;left:0}.mec-related-events-wrap h3.mec-rec-events-title{font-size:21px;font-weight:600;padding:17px 0;margin-bottom:28px;text-transform:uppercase;border-bottom:1px solid #e8e8e8;position:relative}.mec-related-event-post figure{margin:0}.mec-related-event-post figure img{width:100%;border-radius:3px;height:auto}.mec-related-event-content{background-color:#fff;margin:-40px 20px 15px;border-radius:2px;position:relative;max-width:90%;padding:10px 12px 16px 17px}.mec-related-event-content h5 a{font-size:16px;color:#121212;font-weight:600;transition:all .3s ease}@media (max-width:480px){.mec-wrap .mec-related-events .mec-related-event-post{padding-right:15px;padding-left:15px}}.mec-next-previous-events{width:100%;height:104px;display:block;padding:0;margin:0}.mec-next-previous-events li{list-style:none;width:50%;display:inline-block;margin:40px 0 40px}.mec-next-previous-events li:last-child{text-align:right;float:right}.mec-next-previous-events li a{padding:9px 14px 9px 14px;border:1px solid #000;transition:.3s}.mec-wrap .mec-next-previous-events li a:hover{color:#fff!important}.mec-previous-event{float:left;text-align:left}.mec-next-event ul{padding-left:0;margin:0}.mec-next-previous-events .mec-previous-event i{padding-right:20px}.mec-next-previous-events .mec-next-event i{padding-left:20px}.mec-next-multiple ul{padding:0;margin:0}.mec-next-multiple ul li a{display:block;position:relative;padding:11px 14px 9px;z-index:9}.mec-next-multiple ul .mec-date,.mec-next-multiple ul .mec-time{display:inline-block}.mec-next-multiple ul .mec-time{width:40%}.mec-next-multiple ul .mec-date{width:60%}.mec-next-multiple ul .mec-date{float:left;text-align:left}.mec-next-multiple ul .mec-time{text-align:right;position:relative;z-index:-1}.mec-next-multiple ul .mec-time dd{margin:0;padding:0}.mec-next-multiple ul .mec-date .mec-end-date-label,.mec-next-multiple ul .mec-date .mec-start-date-label,.mec-next-multiple ul .mec-time .mec-events-abbr{font-size:11px;line-height:24px}@media (max-width:1280px){.mec-next-multiple ul li a{padding:7px 9px 5px}.mec-next-multiple ul .mec-date .mec-start-date-label,.mec-next-multiple ul .mec-time .mec-events-abbr{font-size:12px}}@media (max-width:480px){.mec-next-previous-events li{list-style:none;width:100%;display:block;margin:10px 0;float:unset}.mec-next-previous-events li a{width:100%;max-width:100%;float:unset;display:block;text-align:center;font-size:16px}}.mec-fes-form-cntt #mec-organizer-payments ul{list-style:none;background:0 0;margin:0;padding-left:0}.mec-fes-form-cntt #mec-organizer-payments ul li h4{background:0 0;letter-spacing:.2px;display:inline-block;padding-left:0!important;padding-bottom:10px!important;margin:0;margin-bottom:1px;letter-spacing:1px;text-transform:capitalize;padding-top:1px}.mec-fes-form-cntt #mec-organizer-payments ul>li{width:100%;display:inline-block;vertical-align:top;padding:0;margin:0}.mec-fes-form #mec_gateway_options_form_stripe_connection_button{padding:9px 13px!important}#mec-login-form.mec-login-form{width:100%;background:#fff;padding:20px;margin:0 auto;text-align:center;position:relative}#mec-login-form.mec-login-form .mec-login-input{display:block;width:286px;margin:0 auto;margin-bottom:12px}#mec-login-form.mec-login-form .mec-login-forgotpassword{display:inline-block}.mec-login-forgotpassword a{color:#000}#mec-login-form.mec-login-form .mec-login-submit{float:right;text-align:right;width:49%;padding-right:2px}#mec-login-form.mec-login-form .mec-login-input input{border:none;box-shadow:none;background:#fff;color:#ccc;border-left:1px solid #e6e6e6;border-radius:0;padding:0;height:100%;background-image:none!important;padding-left:10px;padding-right:0;width:222px;margin-left:0;clear:none;float:left}#mec-login-form.mec-login-form .mec-login-input label{border:1px solid #e6e6e6;height:52px;display:inline-block;padding:0;border-radius:3px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.04)}#mec-login-form.mec-login-form .mec-login-input label i:not(.mec-sl-display-controller-password){padding:15px 13px 17px 16px;vertical-align:middle;font-size:20px;width:50px;color:#c5cad0;background:#fafafa;margin-right:0;float:left}#mec-login-form.mec-login-form .mec-login-forgotpassword{float:left;width:49%;text-align:left;padding-top:10px;font-size:13px;padding-left:2px}#mec-login-form.mec-login-form button{width:120px;height:44px;font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;transition:all .22s ease;margin:0;min-width:unset}.mec-login-form button{box-shadow:0 4px 22px -7px #40d9f1;background-color:#40d9f1}#mec-login-form.mec-login-form .mec-login-form-footer{width:286px;margin:0 auto;margin-top:20px;clear:both;position:relative;display:block;min-height:50px}#mec-login-form.mec-login-form .mec-ajax-login-loading{position:absolute;background:#ffffffc2;left:0;right:0;top:0;bottom:0}#mec-login-form.mec-login-form .lds-ripple{position:absolute;width:64px;height:64px;top:calc(50% - 23px);left:calc(50% - 23px)}#mec-login-form.mec-login-form .lds-ripple div{position:absolute;border:4px solid #40d9f1;opacity:1;border-radius:50%;animation:lds-ripple 1.2s cubic-bezier(0,.2,.1,.8) infinite}#mec-login-form.mec-login-form .lds-ripple div:nth-child(2){animation-delay:-.5s}#mec-login-form.mec-login-form .mec-ajax-login-loading-text{position:absolute;min-width:200px;top:calc(50% - 18px);left:calc(50% - 124px);color:#fff;padding:10px 22px;border-radius:3px;background:#fff;height:47px}#mec-login-form.mec-login-form .mec-ajax-login-loading-text strong{color:#3fcc60}#mec-login-form.mec-login-form .mec-ajax-login-loading-text strong:before{content:"";position:absolute;top:8px;left:1px;border-right:2px solid #3fcc60;border-bottom:2px solid #3acb5c;transform:rotate(45deg);transform-origin:0 100%;color:#000;animation:checkbox-check 130ms 140ms cubic-bezier(.4,0,.23,1) forwards;width:8px;height:14px}#mec-login-form.mec-login-form .mec-ajax-login-loading-text.error strong:after{content:"";position:absolute;top:14px;left:5px;border-bottom:2px solid #ff5d39;transform:rotate(45deg);transform-origin:0 100%;color:#000;animation:checkbox-check 130ms 140ms cubic-bezier(.4,0,.23,1) forwards;width:14px;height:4px}#mec-login-form.mec-login-form .mec-ajax-login-loading-text.error strong{color:#ff5d39}#mec-login-form.mec-login-form .mec-ajax-login-loading-text.error strong:before{border-color:#ff5d39;border-bottom:none}@keyframes lds-ripple{0%{top:28px;left:28px;width:0;height:0;opacity:1}100%{top:-1px;left:-1px;width:58px;height:58px;opacity:0}}.mec-card-element-stripe{margin-bottom:30px}.mec-book-form-gateway-checkout [id*=mec_do_transaction_stripe_] .mec-form-row.mec-stripe-name-and-email-wrapper{width:100%}.mec-book-form-gateway-checkout [id*=mec_do_transaction_stripe_] .mec-form-row.mec-stripe-name-and-email-wrapper .mec-form-row{width:50%}.mec-book-form-gateway-checkout [id*=mec_do_transaction_stripe_] .mec-form-row.mec-stripe-name-and-email-wrapper .mec-form-row:nth-child(2){margin-left:12px}.mec-book-form-gateway-checkout [id*=mec_do_transaction_stripe_] .mec-form-row.mec-stripe-name-and-email-wrapper .mec-form-row input{max-width:unset;margin-bottom:20px}.mec-events-meta-group-booking .StripeElement--invalid{border-color:#fa755a}.mec-events-meta-group-booking .StripeElement--webkit-autofill{background-color:#fefde5!important}#mec_occurrences_add{position:relative;top:-2px}.mec-occurrences-wrapper ul.mec-occurrences-list{list-style:none;padding:0}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item{border:2px dashed #eee}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item{border:2px dashed #eee;padding:20px}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3{font-size:1rem}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3{font-size:1rem;position:relative}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3 span.mec-occurrences-delete-button{position:absolute;right:10px;top:0;margin:0;padding:6px 8px!important;font-size:11px;line-height:12px!important;min-height:10px;height:auto;display:block;cursor:pointer;color:#ea6485;border:2px solid #ffd2dd;border-radius:3px;letter-spacing:.4px}.mec-occurrences-wrapper ul.mec-occurrences-list li.mec_occurrences_item h3 span.mec-occurrences-delete-button:hover{background:#ea6485;color:#fff;border-color:#ea6485;box-shadow:0 2px 6px -3px #ea6485}#mec_occurrences_add,.mec-booking-tab-content .button,.mec-booking-tab-content .mec-bfixed-field-add-option,.mec-booking-tab-content .mec-reg-field-add-option,.mec-fes-form .mec-form-row .button:not(.wp-color-result),.mec-fes-form input[type=file],ul#mec_bfixed_form_fields li .mec_bfixed_field_remove,ul#mec_orgz_form_row li .mec-additional-organizer-remove,ul#mec_reg_form_fields li .mec_reg_field_remove{height:40px;margin-top:1px;text-decoration:none;font-size:14px;line-height:34px!important;margin:0;padding:0 15px 1px!important;text-transform:none;letter-spacing:0;font-weight:600;color:#40d9f1;background:#fff;border-radius:3px;margin-right:8px;border:2px solid #cfeff5;box-shadow:0 2px 6px -3px #cfeff5}.mec-fes-form .mec-additional-organizers .select2-container{margin-bottom:0}.mec-booking-tab-content .button:hover,.mec-booking-tab-content .mec-bfixed-field-add-option:hover,.mec-booking-tab-content .mec-reg-field-add-option:hover,.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover{background:#40d9f1;color:#fff;border-color:#40d9f1;box-shadow:0 2px 6px -3px #40d9f1}.mec-fes-form .mec-form-row input+button.button{vertical-align:top}.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small{border-width:1px;padding:0 7px;color:#80c6d2;font-weight:400;margin:1px;transform:none}.mec-fes-form input[type=file]{max-width:166px;text-align:center;height:44px;transition:all .2s ease;border-radius:5px!important;border:2px dashed #b8e9f3}.mec-fes-form input[type=file]:hover{box-shadow:0 2px 16px -3px #cfeff5}.mec-fes-form input[type=file]::-webkit-file-upload-button{visibility:hidden;width:1px;height:38px}.mec-fes-form input[type=file]::-moz-file-upload-button{visibility:hidden;width:1px;height:38px}.mec-fes-form .mec-meta-box-fields>label{padding:0}#mec_bfixed_form_fields li,#mec_orgz_form_row li,#mec_reg_form_fields li{list-style:none}ul#mec_bfixed_form_fields,ul#mec_orgz_form_row,ul#mec_reg_form_fields{padding:0;margin:0}ul#mec_bfixed_form_fields li,ul#mec_orgz_form_row li,ul#mec_reg_form_fields li{background:#f8feff;margin:6px -20px;padding:15px 25px 10px;width:auto;font-size:13px;border-top:1px solid #e8fafd;border-bottom:1px solid #e8fafd;position:relative}ul#mec_bfixed_form_fields li .mec_bfixed_field_remove,ul#mec_orgz_form_row li .mec-additional-organizer-remove,ul#mec_reg_form_fields li .mec_reg_field_remove{position:absolute;right:10px;top:10px;margin:0;padding:6px 8px!important;font-size:11px;line-height:12px!important;min-height:10px;height:auto;display:block;cursor:pointer;color:#ea6485;border-color:#ffd2dd;letter-spacing:.4px}ul#mec_bfixed_form_fields li .mec_bfixed_field_remove:hover,ul#mec_orgz_form_row li .mec-additional-organizer-remove:hover,ul#mec_reg_form_fields li .mec_reg_field_remove:hover{background:#ea6485;color:#fff;border-color:#ea6485;box-shadow:0 2px 6px -3px #ea6485}#mec_bfixed_form_fields input[type=checkbox],#mec_bfixed_form_fields input[type=radio],#mec_reg_form_fields input[type=checkbox],#mec_reg_form_fields input[type=radio],.mec-form-row input[type=checkbox],.mec-form-row input[type=radio]{background-color:#fff;border:1px solid #cfeff5;box-shadow:0 1px 3px -1px #cfeff5;padding:9px;border-radius:3px;min-width:24px;min-height:24px;display:inline-block!important;vertical-align:middle;float:none;transition:all .18s ease;outline:0;margin:1px 4px 4px 0;text-align:left;cursor:pointer;-webkit-appearance:none;-moz-appearance:none}#mec_bfixed_form_fields input[type=checkbox]:focus,#mec_bfixed_form_fields input[type=radio]:focus,#mec_reg_form_fields input[type=checkbox]:focus,#mec_reg_form_fields input[type=radio]:focus,.mec-form-row input[type=checkbox]:focus,.mec-form-row input[type=radio]:focus{outline:0}#mec_bfixed_form_fields input[type=radio],#mec_reg_form_fields input[type=radio],.mec-form-row input[type=radio]{-webkit-appearance:none;border-radius:20px!important;min-width:20px;min-height:20px;margin:0 0 4px 0;vertical-align:middle}#mec_bfixed_form_fields input[type=checkbox]:hover,#mec_bfixed_form_fields input[type=radio]:hover,#mec_reg_form_fields input[type=checkbox]:hover,#mec_reg_form_fields input[type=radio]:hover,.mec-form-row input[type=checkbox]:hover,.mec-form-row input[type=radio]:hover{border-color:#40d9f1}#mec_bfixed_form_fields input[type=checkbox]:checked,#mec_bfixed_form_fields input[type=radio]:checked,#mec_reg_form_fields input[type=checkbox]:checked,#mec_reg_form_fields input[type=radio]:checked,.mec-fes-form .mec-form-row input[type=checkbox]:checked,.mec-fes-form .mec-form-row input[type=radio]:checked{box-shadow:0 1px 6px -2px #40d9f1;border-color:#40d9f1;background:#40d9f1;border-radius:2px;position:relative}.mec-form-row input[type=radio]:checked{box-shadow:0 1px 6px -2px #40d9f1,inset 0 0 0 3px #fff!important}#mec_bfixed_form_fields input[type=checkbox]:checked::before,#mec_reg_form_fields input[type=checkbox]:checked::before,.mec-form-row input[type=checkbox]:checked:before{content:"";font:normal;position:absolute;top:12px;left:5px;margin:0;vertical-align:middle;line-height:1;border-right:2px solid #fff!important;border-bottom:2px solid #fff!important;transform:rotate(45deg);transform-origin:0% 100%;color:#fff;transition:all .2s ease;animation:checkbox-check 130ms 140ms cubic-bezier(.4,0,.23,1) forwards}@keyframes checkbox-check{0%{width:0;height:0;border-color:#fff;transform:translate3d(0,0,0) rotate(45deg)}33%{width:6px;height:0;transform:translate3d(0,0,0) rotate(45deg)}100%{width:6px;height:12px;border-color:#fff;transform:translate3d(0,-12px,0) rotate(45deg)}}#wrap #mec-event-data input[type=radio]{position:relative}#wrap #mec-event-data input[type=radio]:empty::before{display:none}#mec_bfixed_form_field_types .button,#mec_reg_form_field_types .button{position:relative;outline:0;border-radius:50px;padding:2px 21px 2px 31px!important;line-height:1;font-size:11px;font-weight:600;color:#40d9f1;letter-spacing:2px;height:auto;cursor:pointer;margin-top:5px;text-transform:uppercase;box-shadow:0 2px 6px -3px #40d9f1;border:2px solid #cfeff5}#mec_fes_location_remove_image_button,#mec_fes_organizer_remove_image_button,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-col-1 .button,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-form-row.mec-box .button,#mec_meta_box_tickets_form [id^=mec_ticket_row] button,#mec_reg_form_field_types .button.red{color:#ea6485;box-shadow:0 2px 6px -3px #ea6485;background:#fff;border-color:#ffd2dd}#mec_fes_location_remove_image_button:hover,#mec_fes_organizer_remove_image_button:hover,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-col-1 .button:hover,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-form-row.mec-box .button:hover,#mec_meta_box_tickets_form [id^=mec_ticket_row] button:hover,#mec_reg_form_field_types .button.red:hover{background:#ea6485;color:#fff}#mec_bfixed_form_field_types .button:before,#mec_reg_form_field_types .button:before{position:absolute;left:12px;color:#40d9f1;content:"\e095";font-family:simple-line-icons;font-size:13px;display:inline-block}#mec_reg_form_field_types .button.red:before{color:#ea6485}#mec_bfixed_form_field_types .button:hover:before,#mec_reg_form_field_types .button.red:hover:before,#mec_reg_form_field_types .button:hover:before{color:#fff}#mec_fes_location_remove_image_button:hover,#mec_fes_organizer_remove_image_button:hover,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-col-1 .button:hover,#mec_meta_box_hourly_schedule_days [id^=mec_meta_box_hourly_schedule_day_] .mec-form-row.mec-box .button:hover,#mec_meta_box_tickets_form [id^=mec_ticket_row] button:hover,#mec_price_per_dates_container .button:hover,#mec_reg_form_field_types .button.red:hover{color:#fff;border:2px solid #ea6485}#mec_taxes_fees_container_toggle [id^=mec_remove_fee_button],#mec_ticket_variations_list [id^=mec_remove_ticket_variation_button]{color:#ea6485;border-color:#ffd2dd}#mec_taxes_fees_container_toggle [id^=mec_remove_fee_button]:hover,#mec_ticket_variations_list [id^=mec_remove_ticket_variation_button]:hover{color:#fff;border:2px solid #ea6485;background:#ea6485}#mec_fees_list [id^=mec_remove_fee_button],#mec_meta_box_ticket_variations_form .mec-form-row [id^=mec_remove_ticket_variation_button]{margin-left:14px!important}#mec_meta_box_hourly_schedule_days .mec-add-hourly-schedule-button{line-height:10px!important}#mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button{color:#40d9f1;box-shadow:0 2px 6px -3px #40d9f1;border:2px solid #cfeff5}#mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button:hover,#mec_reg_form_field_types .button:hover{color:#fff;border:2px solid #40d9f1;background:#40d9f1}.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_sort,.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_sort{font-size:0;color:#fff;padding-left:20px}.mec-fes-form #mec_bfixed_form_fields .mec_bfixed_field_option_sort,.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort,.mec-fes-form #mec_reg_form_fields .mec_reg_field_options,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort{font-size:0}.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before,.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_sort:before,.mec-fes-form #mec_orgz_form_row span.mec-additional-organizer-sort:before,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort:before,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_options:before,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_sort:before{position:absolute;left:px;top:12px;width:80px;height:20px;display:block;cursor:move;font-family:simple-line-icons;content:"\e023";font-size:18px;color:#888}.mec-fes-form #mec_bfixed_form_fields span.mec_bfixed_field_option_sort:before,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_option_sort:before,.mec-fes-form #mec_reg_form_fields span.mec_reg_field_options:before{font-size:13px;left:2px;top:26px;width:14px;height:14px}.mec-fes-form #mec_bfixed_form_fields .mec_bfixed_field_options,.mec-fes-form #mec_reg_form_fields .mec_reg_field_options{margin-top:20px}.mec-fes-form #mec_fes_form #mec_bfixed_form_fields .mec_bfixed_notification_placeholder{font-size:0}.mec-form-row input+span.mec-tooltip,.mec-form-row select+span.mec-tooltip{bottom:10px}.mec-form-row label+span.mec-tooltip{bottom:8px}.mec-form-row textarea+span.mec-tooltip{bottom:auto;vertical-align:top;top:12px}.mec-form-row span+span.mec-tooltip{bottom:0;vertical-align:middle}.mec-form-row .mec-col-8 input[type=text],.mec-form-row .mec-col-8 select,.mec-form-row .mec-col-8 span.mec-archive-skins{vertical-align:top}.mec-form-row input:disabled{opacity:.6;background:#f6f6f6}.mec-form-row p{font-size:12px!important;line-height:18px!important;color:#97b2bb!important}.mec-form-row p.description{font-style:italic}.ui-datepicker.ui-widget{border:1px solid #e8e8e8;box-shadow:0 1px 9px rgba(0,0,0,.12)}table.ui-datepicker-calendar{margin-bottom:0}.ui-datepicker-calendar th{font-weight:700;color:#4a4b4c}.ui-datepicker-calendar td,.ui-datepicker-calendar th,.ui-datepicker-calendar tr{border:none}.ui-datepicker.ui-widget select{font-weight:600;font-size:12px;display:inline-block;border-radius:2px;padding:2px 10px;margin:5px 3px;width:auto;min-height:20px;height:26px;border:1px solid #e3e3e3;box-shadow:inset 0 1px 3px rgba(0,0,0,.04)}.ui-datepicker.ui-widget table{border-spacing:2px;border:none}.ui-datepicker.ui-widget td,.ui-datepicker.ui-widget tr{padding:0;background:0 0!important}.ui-datepicker.ui-widget td a{color:#9a9b9c;font-weight:600;width:30px;height:30px;line-height:30px;display:inline-block;border-radius:33px;padding:0;background:#fff;transition:all .2s ease}.ui-datepicker.ui-widget td a.ui-state-active,.ui-datepicker.ui-widget td a:hover{background:#40d9f1;color:#fff}.ui-datepicker.ui-widget .ui-datepicker-next,.ui-datepicker.ui-widget .ui-datepicker-prev{color:#40d9f1;width:30px;height:30px;line-height:30px;display:inline-block;text-align:center;border-radius:33px;background:#ecfcff;transition:all .2s ease}.ui-datepicker.ui-widget .ui-datepicker-next:hover,.ui-datepicker.ui-widget .ui-datepicker-prev:hover{background:#fff;box-shadow:0 0 7px -3px rgba(0,0,0,.4)}.mec-fes-form .mec-tooltip .dashicons-before:before{color:#40d9f1}.mec-fes-form button[type=submit].mec-fes-sub-button{border-radius:3px;background:#40d9f1;color:#fff;height:54px;font-size:17px;font-weight:700;box-shadow:0 2px 8px -4px #40d9f1;display:block;transition:all .28s ease;text-transform:uppercase;margin:20px 0 0;padding:14px 20px;border:0;cursor:pointer;text-align:center;letter-spacing:.1em;line-height:1}.mec-fes-form button[type=submit].mec-fes-sub-button:hover{box-shadow:0 2px 12px -2px #40d9f1}.mec-fes-form button[type=submit].mec-fes-sub-button:focus{margin-bottom:-2px;background:#1dc2dc}.mec-fes-form .mec-title span.mec-dashicons{color:#40d9f1;float:left;margin-right:5px}.mec-fes-form .mec-tooltip .box h5{padding:14px 2px}#mec_fes_form,.mec-fes-form-top-actions{max-width:838px;margin:0 auto}@media only screen and (min-width:961px){.mec-fes-form .mec-fes-form-cntt{width:calc(100% - 300px);float:left;padding-right:20px;max-width:538px;display:block}.mec-fes-form .mec-fes-form-sdbr{width:300px}}.mec-fes-form .quicktags-toolbar,.mec-fes-form div.mce-toolbar-grp{background:#ecfcff;border-bottom:1px solid #cfeff5;box-shadow:0 1px 0 1px #cfeff5}.mec-fes-form .quicktags-toolbar{margin-right:-1px;border-top:1px solid #cfeff5}.mec-fes-form div.mce-statusbar{border-top-color:#cfeff5}.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-listbox{border:1px solid #cfeff5;border-radius:3px}.mec-fes-form .mce-tinymce.mce-container.mce-panel{border:1px solid #cfeff5;box-shadow:0 2px 6px -3px #cfeff5;border-radius:2px 0 2px 2px}.mec-fes-form .wp-editor-tools .wp-media-buttons{transform:translateY(-6px);margin-top:-6px}.mec-fes-form .wp-editor-tabs{padding-right:0;margin-right:-2px}.mec-fes-form .wp-editor-tabs .wp-switch-editor{border-radius:3px 3px 0 0;border-color:#cfeff5;background:#fff;color:#96b8bd;border-bottom:1px solid #ecfcff}.mec-fes-form .html-active .switch-html,.mec-fes-form .tmce-active .switch-tmce,.mec-fes-form .wp-editor-tabs .wp-switch-editor:active{background:#ecfcff;color:#40d9f1}.mec-fes-form .wp-editor-container,.mec-fes-form div.mce-edit-area.mce-panel{border:none;box-shadow:none}.mec-fes-form .wp-editor-container textarea.wp-editor-area{max-width:100%}.mec-fes-form .mce-toolbar .mce-listbox button{font-size:12px;line-height:22px;color:#798f96}.mec-fes-form .mce-toolbar .mce-ico{color:#627f88}.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-active,.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn:active,.mec-fes-form .qt-dfw.active{background:#fff;border-color:#40d9f1;box-shadow:inset 0 2px 6px -3px rgba(106,231,255,.7)}.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-active .mce-ico{color:#40d9f1}body .mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,body .mce-menu .mce-menu-item.mce-selected,body .mce-menu .mce-menu-item:focus,body .mce-menu .mce-menu-item:hover,body.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview{background:#40d9f1;color:#fff}.mec-fes-form .mec-not-in-days-day{display:inline-block;padding:4px 32px 4px 15px;border-radius:33px;border:1px solid #cfeff5;box-shadow:0 1px 3px -1px #cfeff5;background:#fbfeff;color:#40d9f1;vertical-align:top}.mec-fes-form .mec-not-in-days-remove{display:inline-block;padding:0 1px 0 0;margin-left:-30px;vertical-align:sub;background:#ff918a;color:#fff;font-family:cursive;width:21px;height:21px;line-height:17px;text-align:center;border-radius:20px;cursor:pointer}.mec-fes-list ul li .mec-event-status{float:left;margin-right:10px;margin-left:0;font-size:11px;font-weight:400;letter-spacing:.3px;border-radius:3px;padding:4px 8px}.mec-fes-form .post-status.mec-book-confirmed:before,.mec-fes-list ul li .mec-event-status.mec-book-confirmed:before{content:"";margin:0;vertical-align:middle;line-height:1;border-right:2px solid #fff!important;border-bottom:2px solid #fff!important;transform:rotate(45deg);color:#fff;width:6px;height:12px;float:left;margin-right:6px}.mec-fes-list ul li .mec-fes-event-edit a:before,.mec-fes-list ul li .mec-fes-event-export a:before,.mec-fes-list ul li .mec-fes-event-remove:before,.mec-fes-list ul li .mec-fes-event-view a:before,.mec-fes-list-top-actions a:before{content:"\e054";font-family:simple-line-icons;font-size:13px;vertical-align:middle}.mec-fes-list ul li .mec-fes-event-view a:before{content:"\e087"}.mec-fes-list ul li .mec-fes-event-edit a:before{content:"\e060"}.mec-fes-list-top-actions a:before{content:"\e095";font-weight:400;margin-right:6px}.mec-fes-list ul li .mec-fes-event-export a:before{content:"\e083"}.mec-fes-form .post-status{border-radius:20px}.mec-fes-form .post-status.mec-book-confirmed:before{height:20px;width:9px;margin:3px 10px}.ui-datepicker .ui-datepicker-calendar td,.ui-datepicker-calendar th{height:auto;padding:0}.ui-datepicker .ui-datepicker-calendar td a,.ui-datepicker-calendar th{font-size:14px;line-height:30px}.ui-datepicker.ui-widget .ui-state-disabled .ui-state-default{color:#ccc;width:30px;height:30px;line-height:30px;display:inline-block}.mec-fes-form .description{font-size:16px}.mec-fes-form input[type=file]{text-align:left}.mec-fes-export-wrapper{width:640px;background:#f8feff;padding:40px 25px}.mec-fes-export-wrapper .mec-fes-btn-date{font-size:16px;line-height:44px;overflow:hidden}.mec-fes-export-wrapper .date-messgae{font-family:sans-serif;padding:2px 18px}.mec-fes-list ul li .mec-event-export-csv,.mec-fes-list ul li .mec-event-export-excel{font-size:12px;border:1px solid #40d9f1;padding:1px 4px;background:rgba(141,229,243,.18);border-radius:4px;color:#40d9f1;font-family:sans-serif;cursor:pointer;display:inline-block;height:26px;line-height:22px}.mec-export-badge{font-size:11px;color:#40d9f1;width:auto;height:24px;line-height:25px;display:inline-block;padding:0 8px;text-align:center;border-radius:3px;background:#ecfcff;transition:all .2s ease}.mec-fes-list ul li .mec-fes-event-export{font-size:11px;background:#f7f7f7;float:right;margin-left:5px}.mec-fes-list ul li .mec-fes-event-export:hover{cursor:pointer;background:#90f0e0;border-color:#4dc8cc}.mec-fes-export-wrapper ul{padding:0;width:100%;text-align:center}.mec-fes-export-wrapper ul li{list-style:none;display:inline-block;width:30%;padding:10px 15px 10px 32px;border-radius:3px;margin-bottom:15px;border:1px solid #cfeff5;box-shadow:0 2px 6px -4px #cfeff5;background:#fff;line-height:normal;margin-right:10px;position:relative;cursor:pointer;font-size:13px;line-height:1;transition:all .2s ease}.mec-fes-export-wrapper ul li:nth-child(3n+0){margin-right:0}.mec-fes-export-wrapper ul li:hover{box-shadow:0 2px 16px -1px #c6e8ef}.mec-fes-export-wrapper ul li:before{content:"";position:absolute;display:inline-block;background:#fff;width:15px;height:15px;margin:-1px 0 0 5px;cursor:pointer;border:2px solid #e1e7ed;box-shadow:0 2px 15px -3px rgba(69,77,89,.32);border-radius:50%;left:9px;top:calc(50% - 7px)}.mec-fes-export-wrapper ul li.fes-export-date-active{color:#40d9f1}.mec-fes-export-wrapper ul li.fes-export-date-active:before{width:15px;height:15px;border:6px solid #40d9f1;background:#fff;box-shadow:0 3px 16px -3px #40d9f1}.mec-fes-btn-export{margin-left:15px;margin-top:12px}.mec-fes-btn-export span{position:relative;border:none;border-radius:3px;color:#fff!important;display:inline-block;font-size:13px;line-height:1;text-transform:none;font-weight:400;text-decoration:none;cursor:pointer;margin-right:4px;line-height:1;letter-spacing:0;padding:15px 22px;background:#39c36e;box-shadow:0 1px 7px -3px #39c36e!important;-webkit-transition:all .21s ease;-moz-transition:all .21s ease;transition:all .21s ease;cursor:pointer;margin-left:6px}.mec-fes-btn-export span:hover{background:#222}.mec-event-export-excel:before,span.mec-event-export-csv:before{content:"\e083";font-family:simple-line-icons;font-size:13px;vertical-align:middle;margin-right:7px;margin-top:-1px;display:inline-block}.mec-fes-list .wn-p-t-right{min-width:170px;max-width:200px;display:inline-block;top:-8px;left:50%;margin-top:0;transform:translate(-50%,-100%);padding:0;background-color:#000;color:#fff;font-weight:400;font-size:14px;letter-spacing:.5px;line-height:1.5;position:absolute;z-index:99999999;box-sizing:border-box;border-radius:6px;box-shadow:0 4px 45px -8px #535a61;visibility:hidden;opacity:0;transition:opacity .23s;padding:5px 10px 6px;border-radius:8px;text-align:center;font-style:normal}.mec-fes-list .mec-fes-event-edit:hover .wn-p-t-right,.mec-fes-list .mec-fes-event-export:hover .wn-p-t-right,.mec-fes-list .mec-fes-event-remove:hover .wn-p-t-right,.mec-fes-list .mec-fes-event-view:hover .wn-p-t-right{visibility:visible;opacity:1}.mec-fes-list .wn-p-t-right i{position:absolute!important;top:100%;right:50%;margin-top:-6px!important;margin-right:-6px!important;width:12px;height:24px;overflow:hidden;transform:rotate(-90deg)}.mec-fes-list .wn-p-t-right i:after{content:"";position:absolute;width:12px;height:12px;left:0;top:50%;transform:translate(50%,-50%) rotate(-45deg);background-color:#000;box-shadow:0 8px 9px -4px #535a61}.mec-fes-form .select2-container{min-height:38px;box-sizing:border-box;margin-bottom:8px;padding:0 6px;border-radius:2px;border:1px solid #ddd;box-shadow:inset 0 1px 6px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;transition:50ms border-color ease-in-out;min-width:200px;font-size:14px}.mec-fes-form .select2-selection{border:none;background:0 0;padding-top:2px;width:100%;height:100%}.mec-fes-form .select2-container--default.select2-container--focus .select2-selection{border:none!important;outline:0}.mec-fes-form .select2-container--default .select2-selection--single .select2-selection__arrow{top:5px;right:4px}.select2-results{font-size:14px}.mec-fes-category-children,.mec-fes-category-children .mec-fes-category-children{padding-left:24px}.mec-timeline-events-container{margin-left:19px;padding-top:20px;padding-bottom:9px}.mec-events-timeline-wrap{position:relative;display:block;overflow:visible;padding-left:95px}.mec-events-timeline-wrap:before{width:1px;content:"";height:100%;position:absolute;background:#b8f5ff;left:95px}.mec-timeline-month-divider+.mec-timeline-events-container{padding-top:110px}.mec-timeline-right-content{float:right;width:300px}.mec-timeline-left-content{float:left;width:calc(100% - 300px);padding-left:15px;padding-right:15px;position:relative}.mec-timeline-month-divider{position:absolute;display:block;background:#fff;right:calc(100% - 95px);left:0;width:190px;text-align:center;border:1px solid #b8f5ff;border-radius:50px;font-size:15px;padding:12px 27px;color:#40d9f1}.mec-timeline-event-date{position:relative}.mec-timeline-events-container .mec-timeline-event-date:before{content:"";width:11px;height:11px;position:absolute;background:#40d9f1;border-radius:50px;top:8px;left:-24px;z-index:9}.mec-timeline-events-container .mec-timeline-event-date:after{content:"";width:21px;height:21px;position:absolute;background:rgba(64,217,241,.3);border-radius:50px;top:3px;left:-29px}.mec-timeline-event-date{float:left;width:17%;margin-top:27px}.mec-timeline-event-content{float:left;width:82%;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.1);border-radius:10px;overflow:visible;position:relative}.mec-timeline-main-content{padding:23px 30px}.mec-timeline-main-content h4{margin-bottom:15px}.mec-timeline-main-content h4 a{font-size:25px;font-weight:700;color:#000;line-height:33px;text-decoration:none}.mec-timeline-main-content p{font-size:15px;color:#515151;line-height:24px;margin-bottom:36px}a.mec-timeline-readmore{width:100%;display:block;text-align:center;color:#fff;text-decoration:none;line-height:52px;font-size:17px;font-weight:700;-webkit-transition:all .2s ease;transition:all .2s ease;border-radius:0 0 10px 10px}a.mec-timeline-readmore:hover{background:#222;color:#fff}.mec-timeline-event-categories ul.mec-categories li.mec-category a,.mec-timeline-event-location address span,.mec-timeline-event-organizer .mec-organizer-item span,.mec-timeline-event-time .mec-time-details{display:inline-block;font-size:13px;font-weight:500;color:inherit}.mec-timeline-event-categories .mec-categories-wrapper,.mec-timeline-event-organizer .mec-shortcode-organizers{line-height:unset}.mec-timeline-event-categories,.mec-timeline-event-local-time,.mec-timeline-event-location,.mec-timeline-event-organizer,.mec-timeline-event-time{background:rgba(64,217,241,.11);display:inline-block;padding:0 20px;border-radius:50px;line-height:32px;vertical-align:middle}.mec-timeline-event-categories i,.mec-timeline-event-location i,.mec-timeline-event-organizer i,.mec-timeline-event-time i{font-size:16px;margin-right:6px;position:relative;top:2px}.mec-timeline-event-location address{font-style:normal;margin-bottom:0}.mec-timeline-event-details+.mec-timeline-event-details{margin-top:12px}.mec-timeline-event-content .col-md-4{padding:0}.mec-timeline-event-content:after{content:"";display:block;position:absolute;left:50%;margin-left:-10px;width:0;height:0;border-style:solid;border-width:10px}.mec-timeline-event-content:after{top:30px;border-color:transparent #fff transparent transparent;left:-10px}.mec-timeline-event-image img{border-radius:0 10px 0 0;width:100%}.mec-timeline-event-image a{display:block;line-height:0}a.mec-timeline-readmore i{vertical-align:middle;margin-left:10px;font-size:9px}.mec-wrap .mec-timeline-event-content a.mec-timeline-readmore:hover{background:#444}@media (min-width:1024px){.mec-timeline-event{margin:50px 0}}@media (max-width:1023px){.mec-timeline-event{margin:25px 0}.mec-events-timeline-wrap{padding-left:20px}.mec-events-timeline-wrap:before{left:20px}}@media (max-width:1200px) and (min-width:992px){.mec-timeline-event-content{width:81%}.mec-timeline-event-date{width:18%}}@media (max-width:992px){.mec-timeline-left-content,.mec-timeline-right-content{float:none;width:100%;text-align:center}.mec-timeline-right-content .mec-timeline-event-image{text-align:center}.mec-timeline-right-content .mec-timeline-event-image img{max-width:300px;border-radius:10px;margin-top:35px}}@media (max-width:440px){.mec-timeline-right-content .mec-timeline-event-image img{margin-top:0}}@media (max-width:320px){.mec-timeline-event-content,.mec-timeline-event-date{float:none;width:100%}.mec-timeline-event-date{margin-bottom:8px}.mec-timeline-event-content:after{display:none}.mec-timeline-main-content{padding:23px 0}.mec-timeline-main-content p{font-size:13px}.mec-timeline-main-content h4 a{font-size:23px;line-height:24px}.mec-time-details span{font-size:11px}.mec-timeline-event-location address span{font-size:12px}a.mec-timeline-readmore{line-height:44px;font-size:14px}}.mec-timeline-event-image img{margin-bottom:-7px;border-radius:0 10px 10px 0}.mec-timeline-event-image a img{margin-bottom:0;border-radius:0 10px 0 0}.mec-event-tile-view article.mec-tile-item{height:400px;margin:15px 0;border-radius:22px;padding:35px 25px;position:relative;color:#fff;background-size:cover!important;background-position:center!important;box-shadow:0 2px 9px rgba(0,0,0,.25);transition:all .22s ease}.mec-event-tile-view article.mec-tile-item:hover{cursor:pointer;box-shadow:0 4px 19px rgba(0,0,0,.5)}.mec-event-tile-view article.mec-tile-item div{position:relative;z-index:3;line-height:1.5}.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper{color:#fff}.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper i{font-size:16px}.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper ul.mec-categories li.mec-category a,.mec-event-tile-view article.mec-tile-item .mec-shortcode-organizers{color:#fff;font-size:15px}.mec-event-tile-view article.mec-tile-item .mec-categories-wrapper,.mec-event-tile-view article.mec-tile-item .mec-event-loc-place,.mec-event-tile-view article.mec-tile-item .mec-shortcode-organizers{margin-bottom:5px}.mec-event-tile-view article.mec-tile-item:after,.mec-event-tile-view article.mec-tile-item:before{position:absolute;background:-moz-linear-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);background:-webkit-gradient(left top,right top,color-stop(0,rgba(0,0,0,.35)),color-stop(65%,rgba(0,0,0,.48)),color-stop(100%,rgba(0,0,0,.72)));background:-webkit-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);background:linear-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);content:"";left:0;right:0;bottom:0;top:0;width:100%;height:100%;display:block;border-radius:22px;z-index:1}.mec-event-tile-view article.mec-tile-item:after{background-color:inherit;background-image:none;top:35px;bottom:auto;height:40px;border-radius:0 3px 3px 0;width:110px;z-index:2;box-shadow:2px 1px 7px rgba(0,0,0,.1)}.mec-event-tile-view article.mec-tile-item .event-tile-view-head{padding:8px 3px;font-size:16px;font-weight:700;margin-bottom:50px;text-transform:uppercase}.mec-event-tile-view article.mec-tile-item .event-tile-view-head>div{display:inline}.mec-event-tile-view article.mec-tile-item .mec-event-time{color:#d6d6d6;font-size:15px;font-weight:400;line-height:1;padding-top:4px;position:absolute;right:1px;top:10px}.mec-event-tile-view article.mec-tile-item .mec-event-time i{vertical-align:baseline;font-size:14px;float:left}.mec-event-tile-view article.mec-tile-item i{margin-right:5px}.mec-event-tile-view article.mec-tile-item .mec-event-title{color:#fff;font-weight:700;font-size:23px;padding-top:12px}.mec-event-tile-view article.mec-tile-item .mec-event-title a{color:#fff}.mec-event-tile-view article.mec-tile-item .mec-event-title a:hover{text-decoration:underline}.mec-event-tile-view article.mec-tile-item .mec-event-content{position:absolute;height:100%;bottom:0;left:0;right:0}.mec-event-tile-view article.mec-tile-item .mec-tile-into-content-link{position:absolute;content:"";top:0;right:0;left:0;bottom:0;background:0 0}.mec-tile-event-content{position:absolute!important;bottom:25px;left:25px;right:25px}.mec-event-tile-view article.mec-label-canceled:before,.mec-event-tile-view article.mec-label-featured:before{height:auto}.mec-skin-tile-month-navigator-container{position:relative;text-align:center;font-size:12px;height:80px;background:#f7f7f7;padding:28px;border-radius:11px;margin-bottom:20px}.mec-skin-tile-month-navigator-container:after,.mec-skin-tile-month-navigator-container:before{content:"";display:block;position:absolute;left:50%;margin-left:-10px;width:0;height:0;border-style:solid;border-width:10px}.mec-skin-tile-month-navigator-container:after{bottom:-20px;border-color:#f7f7f7 transparent transparent transparent}.mec-skin-tile-month-navigator-container:before{bottom:-21px;border-color:#fff transparent transparent transparent}@media only screen and (max-width:480px){.mec-skin-tile-month-navigator-container{height:110px;padding-top:68px}}.mec-skin-tile-month-navigator-container h2{font-size:23px;font-weight:700}.mec-skin-tile-month-navigator-container .mec-next-month,.mec-skin-tile-month-navigator-container .mec-previous-month{position:absolute;top:28px;left:20px;cursor:pointer;padding:3px 12px;line-height:23px;background:#fff;border-radius:32px;box-shadow:0 1px 3px rgba(0,0,0,.02);transition:all .22s ease}.mec-skin-tile-month-navigator-container .mec-next-month{left:auto;right:20px}.mec-skin-tile-month-navigator-container .mec-next-month:hover,.mec-skin-tile-month-navigator-container .mec-previous-month:hover{box-shadow:0 2px 5px rgba(0,0,0,.1);color:#000}.mec-wrap .mec-event-tile-view article.mec-label-canceled:before,.mec-wrap .mec-event-tile-view article.mec-label-featured:before{position:absolute;bottom:auto;text-align:center;right:auto;font-size:10px}.mec-event-tile-view article.mec-tile-item .mec-tile-overlay{position:absolute;background:-moz-linear-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);background:-webkit-gradient(left top,right top,color-stop(0,rgba(0,0,0,.35)),color-stop(65%,rgba(0,0,0,.48)),color-stop(100%,rgba(0,0,0,.72)));background:-webkit-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);background:linear-gradient(180deg,rgba(0,0,0,.35) 0,rgba(0,0,0,.48) 65%,rgba(0,0,0,.72) 100%);content:"";left:0;right:0;bottom:0;top:0;width:100%;height:100%;display:block;border-radius:22px;z-index:1}.mec-wrap .mec-event-tile-view .col-md-3 article.mec-label-canceled:before,.mec-wrap .mec-event-tile-view .col-md-3 article.mec-label-featured:before{top:12px;left:103px;z-index:9}.mec-wrap .mec-event-tile-view .col-md-4 article.mec-label-canceled:before,.mec-wrap .mec-event-tile-view .col-md-4 article.mec-label-featured:before{top:18px;left:125px}.mec-wrap .mec-event-tile-view .col-md-6 article.mec-label-canceled:before,.mec-wrap .mec-event-tile-view .col-md-6 article.mec-label-featured:before{top:20px;left:200px}@media (max-width:960px){.mec-wrap .mec-event-tile-view .col-sm-3{width:50%}}@media (max-width:480px){.mec-wrap .mec-event-tile-view .col-sm-3{width:100%}}.mec-event-tile-view article.mec-tile-item.tile-multipleday-event:after{width:185px}.mec-event-tile-view article.mec-tile-item.tile-multipleday-event .mec-event-time{right:auto;top:50px;left:0}.mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before{top:100px;left:140px}.mec-event-tile-view .col-md-4.col-sm-4 article.mec-label-canceled:before{top:20px;left:140px}@media (min-width:761px) and (max-width:1200px){.mec-event-tile-view .col-md-3.col-sm-3{width:50%}.mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before{top:80px;left:90px}.mec-event-tile-view .col-md-4.col-sm-4 article.mec-label-canceled:before{top:40px;left:70px}.mec-event-tile-view .col-md-3.col-sm-3 article.mec-label-canceled:before{top:90px;left:110px}}@media (min-width:761px) and (max-width:1024px){.mec-event-tile-view .col-md-4.col-sm-4{width:50%}.mec-event-tile-view .col-md-4.col-sm-4:nth-child(1n+3){width:100%}}@media (max-width:760px){.mec-event-tile-view .col-md-3.col-sm-3{width:100%}.mec-event-tile-view .col-md-4.col-sm-4{width:100%}}@media (max-width:480px){.mec-event-tile-view .col-md-6.col-sm-6 article.mec-label-canceled:before{top:100px;left:80px}}.mec-calendar .mec-event-article .mec-event-date{font-size:12px;text-align:left}.mec-event-detailed-time{display:flex}.mec-event-detailed-time i{width:15px;padding-top:7px}.mec-ongoing-normal-label{background-color:#40d9f1}.mec-expired-normal-label{background-color:#000}.mec-wrap .mec-cancellation-reason span,.mec-wrap .mec-labels-normal .mec-label-normal{position:relative;font-size:11px;font-weight:300;margin-left:10px;line-height:1.9;letter-spacing:1px;color:#fff;padding:2px 7px;border-radius:2px;white-space:nowrap}.mec-wrap .mec-cancellation-reason span,.mec-wrap .mec-labels-normal .mec-label-normal{white-space:normal;display:inline-block;line-height:14px}.mec-remaining-time-normal-label{background-color:var(--mec-color-skin)}.mec-agenda-event-title .mec-labels-normal .mec-label-normal,.mec-timetable-event .mec-labels-normal .mec-label-normal,.tooltipster-box .mec-labels-normal .mec-label-normal{font-size:9px;letter-spacing:.5px;text-transform:uppercase;padding:2px 7px;color:#fff;position:relative;margin-left:5px;border-radius:2px;top:0}.mec-av-spot .mec-labels-normal .mec-label-normal,.mec-event-countdown-part1 .mec-labels-normal .mec-label-normal,.mec-event-countdown-part2 .mec-labels-normal .mec-label-normal,.mec-event-cover-modern .mec-labels-normal .mec-label-normal,.mec-masonry-content .mec-labels-normal .mec-label-normal,.mec-owl-carousel:not(.mec-slider-t1) .mec-labels-normal .mec-label-normal,.mec-tile-item .mec-labels-normal .mec-label-normal,.mec-timeline-event .mec-labels-normal .mec-label-normal,.tooltipster-box .mec-labels-normal .mec-label-normal{margin:0 5px 0 0}.mec-event-countdown-style3 .mec-labels-normal .mec-label-normal{margin:0 0 0 5px}.mec-event-footer-carousel-type3 .mec-labels-normal .mec-label-normal{display:inline}.mec-event-carousel-type4 .mec-fc-style{display:none}.mec-event-carousel-type4 .mec-labels-normal{top:-20px;position:relative}.mec-wrap .mec-cancellation-reason{display:inline-block}.mec-wrap .mec-cancellation-reason span{line-height:1.3;background:#eb3450;text-transform:none;display:inline-block;white-space:nowrap}.mec-wrap .mec-event-list-accordion .mec-cancellation-reason span,.mec-wrap .mec-event-list-accordion .mec-labels-normal .mec-label-normal{top:7px}.mec-agenda-event-title .mec-cancellation-reason span,.mec-timetable-event .mec-cancellation-reason span,.tooltipster-box .mec-cancellation-reason span{font-size:9px;letter-spacing:.5px;text-transform:uppercase;padding:2px 7px;color:#fff;position:relative;margin-left:5px;border-radius:2px;top:0}.mec-wrap .mec-event-container-novel .mec-cancellation-reason span,.mec-wrap .mec-event-container-novel .mec-labels-normal .mec-label-normal{white-space:inherit;margin-left:0}.mec-wrap .mec-event-container-simple .mec-cancellation-reason span,.mec-wrap .mec-event-container-simple .mec-labels-normal .mec-label-normal{top:-5px;white-space:inherit;margin-left:0;margin-right:3px}.mec-av-spot .mec-cancellation-reason span,.mec-event-countdown-part1 .mec-cancellation-reason span,.mec-event-countdown-part2 .mec-cancellation-reason span,.mec-event-cover-modern .mec-cancellation-reason span,.mec-masonry-content .mec-cancellation-reason span,.mec-owl-carousel:not(.mec-slider-t1) .mec-cancellation-reason span,.mec-tile-item .mec-cancellation-reason span,.mec-timeline-event .mec-cancellation-reason span,.tooltipster-box .mec-cancellation-reason span{margin:0 5px 0 0}.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-event-title-soldout,.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-few-tickets{display:inline}.mec-owl-carousel .mec-event-footer-carousel-type3 span.mec-labels-normal,.mec-owl-carousel .mec-event-footer-carousel-type3 span.soldout{margin-top:0;color:#fff;display:unset}.mec-wrap .mec-single-event .mec-cancellation-reason span{margin:0;padding:6px 12px;font-size:14px;font-weight:700;white-space:normal;word-break:break-word}.featherlight-content .mec-cancellation-reason{display:block;width:100%;text-align:center;margin-top:20px;margin-bottom:-10px}.mec-event-data-fields{margin-bottom:30px}.mec-event-data-fields ul.mec-event-data-field-items{overflow:hidden;padding-top:10px;padding-left:0;margin-left:0}.mec-event-data-fields .mec-event-data-field-item{list-style:none;margin-bottom:10px;border-bottom:1px dashed #e1e2e3;padding-bottom:8px;width:100%;float:left}.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-value{margin:0 0 8px 0;color:#616263!important;font-size:13px;line-height:1.5;word-wrap:break-word;white-space:break-spaces}.mec-event-data-fields .mec-event-data-field-item:last-child{border:none;width:100%}.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-name{text-transform:none;font-size:13px;font-weight:600;padding-bottom:5px;color:#313131!important;width:100%;padding-bottom:10px;position:relative;letter-spacing:-.2px}@media (max-width:768px){.mec-event-data-fields .mec-event-data-field-item{width:100%}}.mec-wrap .col-md-4 .mec-event-data-fields .mec-event-data-field-item{width:100%;display:block}.mec-shortcode-organizers{overflow:hidden;font-weight:400;line-height:18px;font-size:12px}.mec-event-list-minimal .mec-shortcode-organizers{margin-top:6px}.mec-shortcode-organizers i{margin-right:4px;display:inline-block}.mec-shortcode-organizers .mec-organizers{display:inline-block;list-style:none;padding:0}.mec-organizer-item a{color:#777}.mec-event-list-standard .mec-shortcode-organizers .mec-sl-user:before{font-size:16px}.mec-shortcode-organizers{position:relative}.mec-skin-grid-container .mec-organizers,.mec-skin-grid-container .mec-shortcode-organizers{padding:0;margin:0}.mec-skin-grid-container .mec-event-grid-clean .mec-shortcode-organizers a,.mec-skin-grid-container .mec-event-grid-clean .mec-shortcode-organizers a:hover,.mec-skin-grid-container .mec-event-grid-colorful .mec-shortcode-organizers a,.mec-skin-grid-container .mec-event-grid-colorful .mec-shortcode-organizers a:hover{color:#fff;font-size:12px}.mec-skin-grid-container .mec-event-grid-clean .mec-shortcode-organizers a:hover,.mec-skin-grid-container .mec-event-grid-colorful .mec-shortcode-organizers a:hover{text-decoration:underline}.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers{position:relative}.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers i{display:block;color:rgba(255,255,255,.4)}.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers i:before{position:absolute;top:6px;left:6px;font-size:17px;font-family:simple-line-icons;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1}.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers a{padding-left:35px;font-size:15px;line-height:30px;color:rgba(255,255,255,.4)}.mec-skin-grid-container .mec-event-grid-novel .mec-shortcode-organizers a:hover{color:#fff}.mec-calendar-daily .mec-shortcode-organizers,.mec-calendar-daily .mec-shortcode-organizers .mec-organizers{padding:0}.mec-calendar-daily .mec-organizer-item a{font-size:13px;line-height:1.3;color:#9a9a9a;margin-bottom:0}.mec-events-masonry-wrap .mec-shortcode-organizers,.mec-events-masonry-wrap .mec-shortcode-organizers .mec-organizers{padding:0}.mec-events-timeline-wrap .mec-organizer-item,.mec-events-timeline-wrap .mec-shortcode-organizers .mec-organizers{margin:0;display:inline}.mec-events-timeline-wrap .mec-shortcode-organizers i{line-height:24px;margin-right:7px}.mec-events-timeline-wrap .mec-organizer-item:after{content:","}.mec-events-timeline-wrap .mec-organizer-item:last-child:after{content:"";padding:0}.mec-events-timeline-wrap .mec-organizer-item a,.mec-events-timeline-wrap .mec-organizer-item:after{font-weight:500}.mec-events-timeline-wrap .mec-organizer-item a:hover{text-decoration:underline}.mec-event-tile-view .mec-shortcode-organizers,.mec-event-tile-view .mec-shortcode-organizers .mec-organizers{padding:0}.mec-event-tile-view .mec-shortcode-organizers i{line-height:24px}.mec-event-tile-view .mec-shortcode-organizers .mec-organizers a,.mec-event-tile-view .mec-shortcode-organizers i{color:#fff}.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-modal-preloader,.mec-dark-mode .mec-month-navigator-loading{background-color:rgba(40,40,40,.88)}.mec-dark-mode .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button,.mec-dark-mode .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt,.mec-dark-mode .mec-calendar .mec-calendar-row dt:hover,.mec-dark-mode .mec-event-footer .mec-booking-button,.mec-dark-mode .mec-event-grid-classic .mec-event-content,.mec-dark-mode .mec-event-schedule-content .mec-schedule-speakers,.mec-dark-mode .mec-events-meta-group-tags a:hover,.mec-dark-mode .mec-events-toggle .mec-toggle-content .mec-modal-wrap,.mec-dark-mode .mec-fes-form .mec-meta-box-fields,.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a i,.mec-dark-mode .mec-map-view-event-detail.mec-event-detail,.mec-dark-mode .mec-modal-wrap,.mec-dark-mode .mec-next-event-details a,.mec-dark-mode .mec-organizer-social-information a i,.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a:hover,.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next,.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev,.mec-dark-mode .mec-timetable-events-list .mec-timetable-event,.mec-dark-mode .mec-wrap .button,.mec-dark-mode .mec-wrap a.button:not(.owl-dot):hover,.mec-dark-mode .mec-wrap button:not(.owl-dot):hover,.mec-dark-mode .mec-wrap input[type=button]:hover,.mec-dark-mode .mec-wrap input[type=reset]:hover,.mec-dark-mode .mec-wrap input[type=submit]:hover{background-color:#1f1f1f;color:#d2d2d2}.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar{width:12px}.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar-track{background:#000}.mec-dark-mode .mec-modal-wrap::-webkit-scrollbar-thumb{background-color:#333;border-radius:20px;border:2px solid #000}.mec-dark-mode .mec-modal-preloader,.mec-dark-mode .mec-month-navigator-loading{background-color:#1f1f1f}.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table,.mec-dark-mode .mec-skin-tile-month-navigator-container{background:#282828}.mec-dark-mode .mec-skin-tile-month-navigator-container:after{border-color:#282828 transparent transparent transparent}.mec-dark-mode .mec-event-grid-novel .mec-event-article,body.mec-dark-mode .mec-single-modern .mec-single-event-bar{background-color:#282828;color:#d2d2d2}.mec-dark-mode .event-carousel-type2-head,.mec-dark-mode .lity-content .mec-events-meta-group-booking .mec-dark-mode .mec-single-event .mec-events-meta-group-booking,.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text],.mec-dark-mode .lity-content .mec-events-meta-group-booking select,.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-table-head dt,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month,.mec-dark-mode .mec-calendar .mec-event-article:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month,.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec .mec-event-article:hover,.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-selected-day,.mec-dark-mode .mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover,.mec-dark-mode .mec-calendar.mec-yearly-calendar .mec-calendar-table-head dl dt,.mec-dark-mode .mec-event-carousel-content,.mec-dark-mode .mec-event-cost,.mec-dark-mode .mec-event-countdown-style1 .mec-event-countdown-part3 .mec-event-button,.mec-dark-mode .mec-event-footer,.mec-dark-mode .mec-event-grid-classic .mec-event-content .mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-dark-mode .mec-event-list-minimal a.mec-detail-button,.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button,.mec-dark-mode .mec-event-list-standard .mec-topsec,.mec-dark-mode .mec-event-more-info,.mec-dark-mode .mec-event-website,.mec-dark-mode .mec-events-agenda-wrap,.mec-dark-mode .mec-events-meta-date,.mec-dark-mode .mec-events-meta-group-tags a,.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner,.mec-dark-mode .mec-fes-form,.mec-dark-mode .mec-fes-form input[type=email],.mec-dark-mode .mec-fes-form input[type=number],.mec-dark-mode .mec-fes-form input[type=password],.mec-dark-mode .mec-fes-form input[type=tel],.mec-dark-mode .mec-fes-form input[type=text],.mec-dark-mode .mec-fes-form select,.mec-dark-mode .mec-fes-form textarea,.mec-dark-mode .mec-fes-list,.mec-dark-mode .mec-hourly-schedule-speaker-info,.mec-dark-mode .mec-load-more-button,.mec-dark-mode .mec-map-lightbox-wp,.mec-dark-mode .mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-related-event-content,.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-single-event .mec-events-meta-group-countdown,.mec-dark-mode .mec-single-event .mec-frontbox,.mec-dark-mode .mec-single-event .mec-speakers-details ul li,.mec-dark-mode .mec-single-event-additional-organizers,.mec-dark-mode .mec-single-event-category,.mec-dark-mode .mec-single-event-date,.mec-dark-mode .mec-single-event-label,.mec-dark-mode .mec-single-event-location,.mec-dark-mode .mec-single-event-organizer,.mec-dark-mode .mec-single-event-sponsor,.mec-dark-mode .mec-single-event-time,.mec-dark-mode .mec-single-modern .col-md-4 .mec-frontbox,.mec-dark-mode .mec-slider-t1-wrap,.mec-dark-mode .mec-timetable-events-list .mec-timetable-event,.mec-dark-mode .mec-timetable-t2-wrap,.mec-dark-mode .mec-ttt2-title,.mec-dark-mode .mec-wrap .mec-event-countdown-style1,.mec-dark-mode .mec-wrap .mec-event-countdown-style2,.mec-dark-mode .mec-wrap .mec-totalcal-box,.mec-dark-mode .mec-wrap .mec-totalcal-box i,.mec-dark-mode .mec-wrap .mec-totalcal-box input,.mec-dark-mode .mec-wrap .mec-totalcal-box select,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year:hover,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year:hover,.mec-dark-mode.mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-dark-mode.mec-wrap .mec-totalcal-box i,.mec-dark-mode.mec-wrap .mec-totalcal-box input,.mec-dark-mode.mec-wrap .mec-totalcal-box select{background-color:#282828}.mec-dark-mode .event-carousel-type2-head,.mec-dark-mode .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button,.mec-dark-mode .lity-content .mec-events-meta-group-booking .mec-dark-mode .mec-single-event .mec-events-meta-group-booking,.mec-dark-mode .lity-content .mec-events-meta-group-booking form>h4,.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text],.mec-dark-mode .lity-content .mec-events-meta-group-booking select,.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-side .mec-next-month,.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-side .mec-previous-month,.mec-dark-mode .mec-box-calendar.mec-calendar .mec-calendar-table-head dt,.mec-dark-mode .mec-box-calendar.mec-calendar dt,.mec-dark-mode .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt,.mec-dark-mode .mec-breadcrumbs,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-next,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a.mec-table-d-prev .mec-calendar.mec-calendar-daily .mec-calendar-a-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month,.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec,.mec-dark-mode .mec-event-carousel-content,.mec-dark-mode .mec-event-footer,.mec-dark-mode .mec-event-footer .mec-booking-button,.mec-dark-mode .mec-event-list-minimal .mec-event-article,.mec-dark-mode .mec-event-list-minimal a.mec-detail-button,.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button,.mec-dark-mode .mec-event-list-modern .mec-event-article,.mec-dark-mode .mec-event-list-standard .mec-event-article,.mec-dark-mode .mec-event-list-standard .mec-event-meta-wrap,.mec-dark-mode .mec-event-list-standard .mec-topsec,.mec-dark-mode .mec-event-schedule-content,.mec-dark-mode .mec-event-schedule-content dl:before,.mec-dark-mode .mec-events-agenda-wrap,.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details,.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li,.mec-dark-mode .mec-events-meta-group-tags a,.mec-dark-mode .mec-events-toggle .mec-toggle-content,.mec-dark-mode .mec-events-toggle .mec-toggle-item,.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner,.mec-dark-mode .mec-fes-form .mec-meta-box-fields,.mec-dark-mode .mec-fes-form input[type=email],.mec-dark-mode .mec-fes-form input[type=number],.mec-dark-mode .mec-fes-form input[type=password],.mec-dark-mode .mec-fes-form input[type=tel],.mec-dark-mode .mec-fes-form input[type=text],.mec-dark-mode .mec-fes-form select,.mec-dark-mode .mec-fes-form textarea,.mec-dark-mode .mec-hourly-schedule-speaker-info,.mec-dark-mode .mec-load-more-button,.mec-dark-mode .mec-masonry-item-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-next-event-details a,.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title,.mec-dark-mode .mec-single-event .mec-event-exporting .mec-export-details a:hover,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking form>h4,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-single-event .mec-events-meta-group-countdown,.mec-dark-mode .mec-single-event .mec-frontbox,.mec-dark-mode .mec-single-event .mec-frontbox-title,.mec-dark-mode .mec-timetable-t2-wrap,.mec-dark-mode .mec-wrap .mec-totalcal-box,.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-dark-mode .mec-wrap .mec-totalcal-box i,.mec-dark-mode .mec-wrap .mec-totalcal-box input,.mec-dark-mode .mec-wrap .mec-totalcal-box select,.mec-dark-mode .mec-yearly-view-wrap,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec{border-color:#353535}.mec-dark-mode .entry-content .mec-wrap h1,.mec-dark-mode .entry-content .mec-wrap h2,.mec-dark-mode .entry-content .mec-wrap h3,.mec-dark-mode .entry-content .mec-wrap h4,.mec-dark-mode .entry-content .mec-wrap h5,.mec-dark-mode .entry-content .mec-wrap h6,.mec-dark-mode .lity-content .mec-events-meta-group-booking form>h4,.mec-dark-mode .lity-content .mec-events-meta-group-booking h5 span,.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=date],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=email],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=number],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=password],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .lity-content .mec-events-meta-group-booking input[type=text],.mec-dark-mode .lity-content .mec-events-meta-group-booking label,.mec-dark-mode .lity-content .mec-events-meta-group-booking select,.mec-dark-mode .lity-content .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-breadcrumbs a,.mec-dark-mode .mec-calendar .mec-event-article .mec-event-title a,.mec-dark-mode .mec-calendar dt,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event,.mec-dark-mode .mec-calendar.mec-event-container-simple dl dt.mec-calendar-day,.mec-dark-mode .mec-event-carousel-content .mec-event-carousel-title a,.mec-dark-mode .mec-event-content p,.mec-dark-mode .mec-event-grid-classic .mec-event-title a,.mec-dark-mode .mec-event-grid-clean .mec-event-title a,.mec-dark-mode .mec-event-grid-minimal .mec-event-date span,.mec-dark-mode .mec-event-grid-minimal .mec-event-title a,.mec-dark-mode .mec-event-grid-modern .mec-event-title a,.mec-dark-mode .mec-event-grid-simple .mec-event-title a,.mec-dark-mode .mec-event-list-classic .mec-event-title a,.mec-dark-mode .mec-event-list-minimal .mec-event-title a,.mec-dark-mode .mec-event-list-minimal a.mec-detail-button,.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button,.mec-dark-mode .mec-event-list-standard .mec-event-title a,.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li,.mec-dark-mode .mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-amount,.mec-dark-mode .mec-events-meta-group-tags a,.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner i,.mec-dark-mode .mec-fes-form,.mec-dark-mode .mec-fes-form input[type=email],.mec-dark-mode .mec-fes-form input[type=number],.mec-dark-mode .mec-fes-form input[type=password],.mec-dark-mode .mec-fes-form input[type=tel],.mec-dark-mode .mec-fes-form input[type=text],.mec-dark-mode .mec-fes-form label,.mec-dark-mode .mec-fes-form select,.mec-dark-mode .mec-fes-form textarea,.mec-dark-mode .mec-fes-list,.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a i,.mec-dark-mode .mec-hourly-schedule-speaker-description,.mec-dark-mode .mec-hourly-schedule-speaker-name,.mec-dark-mode .mec-load-more-button,.mec-dark-mode .mec-next-event-details abbr,.mec-dark-mode .mec-organizer-social-information a i,.mec-dark-mode .mec-related-event-content h5 a,.mec-dark-mode .mec-related-event-content span,.mec-dark-mode .mec-single-event .mec-event-meta dt,.mec-dark-mode .mec-single-event .mec-event-meta h3,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking form>h4,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking h5 span,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=date],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=email],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=number],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=password],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=tel],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=text],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking label,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking select,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking textarea,.mec-dark-mode .mec-single-event .mec-frontbox-title,.mec-dark-mode .mec-single-event .mec-speakers-details ul li .mec-speaker-job-title,.mec-dark-mode .mec-single-modern .mec-single-event-bar>div h3,.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-dark-mode .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i,.mec-dark-mode .mec-timeline-main-content h4 a,.mec-dark-mode .mec-timetable-event .mec-timetable-event-time,.mec-dark-mode .mec-timetable-events-list .mec-timetable-event span a,.mec-dark-mode .mec-tooltip-event-title,.mec-dark-mode .mec-ttt2-title,.mec-dark-mode .mec-wrap,.mec-dark-mode .mec-wrap .mec-event-list-modern .mec-event-title a,.mec-dark-mode .mec-wrap .mec-event-schedule-content a,.mec-dark-mode .mec-wrap .mec-single-title,.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-dark-mode .mec-wrap .mec-totalcal-box input,.mec-dark-mode .mec-wrap .mec-totalcal-box select,.mec-dark-mode .mec-wrap h1,.mec-dark-mode .mec-wrap h2,.mec-dark-mode .mec-wrap h3,.mec-dark-mode .mec-wrap h4,.mec-dark-mode .mec-wrap h5,.mec-dark-mode .mec-wrap h6,.mec-dark-mode .mec-wrap p{color:#d2d2d2}.mec-dark-mode .mec-breadcrumbs a:hover,.mec-dark-mode .mec-calendar .mec-event-article .mec-event-title a:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event:hover,.mec-dark-mode .mec-event-footer .mec-booking-button:hover,.mec-dark-mode .mec-event-grid-classic .mec-event-title a:hover,.mec-dark-mode .mec-event-grid-minimal .mec-event-date:hover,.mec-dark-mode .mec-event-grid-minimal .mec-event-title a:hover,.mec-dark-mode .mec-event-list-classic .mec-event-title a:hover,.mec-dark-mode .mec-event-list-minimal .mec-event-title a:hover,.mec-dark-mode .mec-event-list-minimal a.mec-detail-button:hover,.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover,.mec-dark-mode .mec-event-list-standard .mec-event-title a:hover,.mec-dark-mode .mec-single-event .mec-event-meta dd a:hover,.mec-dark-mode .mec-wrap .mec-event-list-modern .mec-event-title a:hover,.mec-dark-mode .mec-wrap .mec-totalcal-box .mec-totalcal-view span:hover,.mec-dark-mode .mec-wrap a:hover{color:#fff}.mec-dark-mode .mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child{border-color:#333!important}.mec-dark-mode .mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:nth-child(odd){background:#1f1f1f!important}.mec-dark-mode .mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix{background:#282828!important}.mec-dark-mode .lity-container .mec-events-meta-group-booking input[type=radio]:before,.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title:before,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=checkbox],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=radio]:before{background-color:#c4cace}.mec-dark-mode .lity-container .mec-events-meta-group-booking input[type=radio]:before,.mec-dark-mode .mec-month-divider span,.mec-dark-mode .mec-related-events-wrap h3.mec-rec-events-title:before,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=checkbox],.mec-dark-mode .mec-single-event .mec-events-meta-group-booking input[type=radio]:before{border-color:#313131}.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3,.mec-dark-mode .mec-agenda-events-wrap,.mec-dark-mode .mec-av-spot .mec-av-spot-content,.mec-dark-mode .mec-av-spot .mec-av-spot-head,.mec-dark-mode .mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-next-month:hover,.mec-dark-mode .mec-calendar .mec-calendar-side .mec-previous-month:hover,.mec-dark-mode .mec-calendar .mec-calendar-topsec,.mec-dark-mode .mec-calendar .mec-event-article:hover,.mec-dark-mode .mec-calendar dt,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-has-event:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table a:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-top,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month:hover,.mec-dark-mode .mec-calendar.mec-calendar-weekly .mec-calendar-d-table dl dt:hover,.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec,.mec-dark-mode .mec-event-cover-classic,.mec-dark-mode .mec-event-footer .mec-booking-button:hover,.mec-dark-mode .mec-event-grid-clean .mec-event-article,.mec-dark-mode .mec-event-grid-clean .mec-event-content,.mec-dark-mode .mec-event-grid-modern .mec-event-article,.mec-dark-mode .mec-event-grid-modern .mec-event-content,.mec-dark-mode .mec-event-list-minimal a.mec-detail-button:hover,.mec-dark-mode .mec-event-list-modern .mec-btn-wrapper .mec-booking-button:hover,.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing,.mec-dark-mode .mec-events-toggle .mec-toggle-item-inner:hover,.mec-dark-mode .mec-hourly-schedule-speaker-contact-information a:hover i,.mec-dark-mode .mec-masonry .mec-masonry-content,.mec-dark-mode .mec-masonry .mec-masonry-head,.mec-dark-mode .mec-organizer-social-information a:hover i,.mec-dark-mode .mec-slider-t1 .mec-slider-t1-content,.mec-dark-mode .mec-slider-t5 .mec-slider-t5-content,.mec-dark-mode .mec-slider-t5-wrap,.mec-dark-mode .mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-timeline-event-content,.mec-dark-mode .mec-timeline-month-divider,.mec-dark-mode .mec-timetable-events-list .mec-timetable-event:hover,.mec-dark-mode .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part3,.mec-dark-mode .mec-wrap .mec-totalcal-box,.mec-dark-mode .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-calendar-sec,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year,.mec-dark-mode .tooltipster-sidetip:not(.uael-tooltipster-active) .tooltipster-content{background:#191919}.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3,.mec-dark-mode .event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button,.mec-dark-mode .mec-av-spot,.mec-dark-mode .mec-av-spot-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-box-calendar.mec-calendar dl dt:last-child,.mec-dark-mode .mec-calendar,.mec-dark-mode .mec-calendar .mec-event-article,.mec-dark-mode .mec-calendar.mec-box-calendar .mec-table-nullday:last-child,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-next-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-a-month .mec-previous-month,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-calendar-d-table,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-next-month:hover,.mec-dark-mode .mec-calendar.mec-calendar-daily .mec-previous-month:hover,.mec-dark-mode .mec-event-cover-classic,.mec-dark-mode .mec-event-cover-clean,.mec-dark-mode .mec-event-grid-classic .mec-event-article,.mec-dark-mode .mec-event-grid-clean .mec-event-article,.mec-dark-mode .mec-event-grid-modern .mec-event-article,.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing,.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:after,.mec-dark-mode .mec-event-sharing-wrap>li:first-of-type,.mec-dark-mode .mec-events-agenda,.mec-dark-mode .mec-fes-form .mec-meta-box-fields,.mec-dark-mode .mec-masonry,.mec-dark-mode .mec-slider-t5-wrap .mec-event-grid-modern .event-grid-modern-head,.mec-dark-mode .mec-timeline-month-divider,.mec-dark-mode .mec-wrap .mec-totalcal-box,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year,.mec-dark-mode .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year{border-color:#353535}.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:after{border-color:#191919 transparent transparent transparent}.mec-dark-mode .mec-event-sharing-wrap .mec-event-sharing:before{border-color:#353535 transparent transparent transparent}.mec-dark-mode .mec-book-form-gateways [id*=mec_book_form_gateway_checkout] input[type=text],.mec-dark-mode .mec-events-meta-group-booking .StripeElement,.mec-dark-mode .mec-wrap .mec-book-form-gateways [id*=mec_book_form_gateway_checkout] input[type=email],.mec-dark-mode .mec-wrap .mec-book-form-gateways [id*=mec_book_form_gateway_checkout] input[type=text]{background:#999!important;border:1px solid #353535!important;box-shadow:none!important;color:#353535!important}.mec-dark-mode .CardField CardField--ltr .__PrivateStripeElement .InputContainer input{color:#d2d2d2!important}.mec-dark-mode .mec-events-toggle .mec-toggle-item{border:1px solid #e4e4e4;box-shadow:0 10px 15px #282828}.mec-dark-mode .mec-agenda-events-wrap .mec-event-grid-colorful .mec-event-content{background-color:transparent}.mec-dark-mode .mec-calendar .mec-calendar-side{box-shadow:0 1px 5px 6px rgba(255,255,255,.005) inset}.mec-dark-mode .tooltipster-sidetip.tooltipster-shadow:not(.uael-tooltipster-active) .tooltipster-box{border:1px solid #282828!important}.mec-dark-mode .mec-timeline-event-content:after{border-color:transparent #191919 transparent transparent}.mec-dark-mode .mec-fes-form .mec-meta-box-fields{box-shadow:0 2px 6px -3px #353535}.mec-dark-mode .mec-fes-form .mec-meta-box-fields h4{color:#d2d2d2;background:#000}.mec-dark-mode .mec-fes-form input[type=email],.mec-dark-mode .mec-fes-form input[type=number],.mec-dark-mode .mec-fes-form input[type=password],.mec-dark-mode .mec-fes-form input[type=tel],.mec-dark-mode .mec-fes-form input[type=text],.mec-dark-mode .mec-fes-form select,.mec-dark-mode .mec-fes-form textarea{box-shadow:0 2px 5px rgba(0,0,0,.38) inset}.mec-dark-mode .mec-fes-form input{background:#353535!important;color:#d2d2d2!important}.mec-dark-mode .mec-booking-tab-content .button:hover,.mec-dark-mode .mec-booking-tab-content .mec-reg-field-add-option:hover,.mec-dark-mode .mec-fes-form .mec-form-row .button:not(.wp-color-result):hover{background:#353535;color:#d2d2d2;border-color:#353535;box-shadow:0 2px 6px -3px #353535}.mec-dark-mode .mec-booking-tab-content .button,.mec-dark-mode .mec-booking-tab-content .mec-reg-field-add-option,.mec-dark-mode .mec-fes-form .mec-form-row .button:not(.wp-color-result),.mec-dark-mode .mec-fes-form input[type=file],.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove,.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove{color:#d2d2d2;background:#282828;border:2px solid #353535;box-shadow:0 2px 6px -3px #353535}.mec-dark-mode #mec_reg_form_fields input[type=checkbox],.mec-dark-mode #mec_reg_form_fields input[type=radio],.mec-dark-mode .mec-form-row input[type=checkbox],.mec-dark-mode .mec-form-row input[type=radio]{background-color:#000;border:1px solid #353535;box-shadow:0 1px 3px -1px #353535}.mec-dark-mode .mec-fes-form .select2-container{border:1px solid #353535;background-color:#282828;color:#d2d2d2}.mec-dark-mode ul#mec_bfixed_form_fields li,.mec-dark-mode ul#mec_orgz_form_row li,.mec-dark-mode ul#mec_reg_form_fields li{background:#000;border-color:#000}.mec-dark-mode #mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button{background:#000;border-color:#2d2d2d;box-shadow:0 2px 6px -3px #2d2d2d}.mec-dark-mode #mec_reg_form_field_types .button.red{background:#2d2d2d;border-color:#2d2d2d;box-shadow:0 2px 6px -3px #2d2d2d}.mec-dark-mode #mec_bfixed_form_field_types .button,.mec-dark-mode #mec_reg_form_field_types .button{color:#d2d2d2;box-shadow:0 2px 6px -3px #2d2d2d;border-color:#2d2d2d}.mec-dark-mode #mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button:hover,.mec-dark-mode #mec_reg_form_field_types .button:hover{background:#000}.mec-dark-mode ul#mec_bfixed_form_fields li .mec_bfixed_field_remove,.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove,.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove{background:#282828}.mec-dark-mode #mec_taxes_fees_container_toggle [id^=mec_remove_fee_button]:hover,.mec-dark-mode #mec_ticket_variations_list [id^=mec_remove_ticket_variation_button]:hover,.mec-dark-mode ul#mec_bfixed_form_fields li .mec_bfixed_field_remove:hover,.mec-dark-mode ul#mec_orgz_form_row li .mec-additional-organizer-remove:hover,.mec-dark-mode ul#mec_reg_form_fields li .mec_reg_field_remove:hover{color:#fff;border:2px solid #ea6485;background:#ea6485}.mec-events-meta-group-booking-shortcode h4{margin-bottom:20px}.mec-booking-shortcode .mec-event-tickets-list.mec-sell-all-occurrences{width:100%}.mec-booking-shortcode .mec-book-reg-field-mec_email{width:48%;display:inline-block;margin-right:30px}.mec-booking-shortcode .mec-book-reg-field-name{width:48%;display:inline-block}.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-expiration-date-month{width:48%;display:inline-block;vertical-align:top;margin-right:30px}.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-cvv2{width:48%;display:inline-block}.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-expiration-date-month .nice-select{width:48%;display:inline-block}.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-expiration-date-month label{width:100%}.mec-booking-shortcode .mec-form-row.mec-paypal-credit-card-expiration-date-month .nice-select:first-of-type{margin-right:10px}.mec-booking-shortcode .nice-select{float:none;border-radius:3px;background-color:#fff;width:258px;height:40px;line-height:39px;padding-left:15px;padding-right:15px;margin:0;font-size:14px;font-weight:400;min-height:unset;min-width:unset;padding-top:0;padding-bottom:0}.mec-booking-shortcode .mec-gateway-message.mec-success{font-size:14px}.mec-booking-shortcode .mec-form-row.mec-name-stripe{margin-bottom:0!important}.mec-booking-shortcode .mec-book-form-gateways [id*=mec_book_form_gateway_checkout] input[type=text],.mec-events-meta-group-booking .mec-booking-shortcode .StripeElement{box-shadow:none!important}.mec-booking-shortcode .nice-select ul{width:100%}.mec-booking-shortcode span.mec-event-ticket-available{margin-top:-22px!important;margin-bottom:28px!important;display:block;font-size:11px;letter-spacing:.5px;font-weight:300;color:#80abbf}.mec-booking-shortcode .mec-booking-form-container ul li{list-style:none}.mec-booking-shortcode .mec-booking-form-container ul{padding:0}.mec-events-meta-group-booking-shortcode .info-msg{margin:24px 0 24px}@media (max-width:980px){.mec-events-meta-group-booking-shortcode{padding:20px}.mec-booking-shortcode ul.mec-book-price-details li{width:100%;border-right:0!important;border-bottom:1px solid}.mec-booking-shortcode ul.mec-book-price-details li:last-child{width:100%;border-right:0;border-bottom:0 solid}}.mec-booking-shortcode span.mec-book-price-total{font-size:22px;line-height:22px;font-weight:700;color:#2bbc10;margin-top:20px;margin-bottom:35px;display:inline-block}.mec-booking-shortcode span.mec-book-price-total-description{font-size:18px;line-height:22px;font-weight:700;color:#000}.mec-booking-shortcode span.mec-book-price-total-amount{font-size:22px;line-height:22px;font-weight:700;color:#2bbc10}.mec-booking-shortcode .mec-book-form-price{clear:both;position:relative}.mec-booking-shortcode .mec-book-form-gateway-label input[type=radio]:after{content:"";display:inline-block;width:7px;height:7px;background-color:#fff;border-radius:50%;cursor:pointer;position:absolute;top:4px;left:3px}.mec-booking-shortcode .mec-book-form-gateway-label input[type=radio]:before{box-shadow:none;border:2px solid #a8e4ff;width:17px;height:17px;position:absolute;top:-9px;left:-2px;margin:0;content:"";display:inline-block;background:#fff;border-radius:18px;cursor:pointer;position:relative}.mec-booking-shortcode .mec-book-form-gateway-label label input{position:relative;cursor:pointer;margin:0!important;height:auto;margin-right:4px!important}.mec-booking-shortcode button#mec-book-form-btn-step-2{margin-left:30px}.mec-booking-shortcode .mec-ticket-name{display:inline-block;background-color:#fff;border-radius:3px;font-size:12px;line-height:12px;font-weight:400;color:#00acf8;padding:8px 13px;letter-spacing:0}.mec-booking-shortcode .mec_book_first_for_all{display:none}.mec-booking-shortcode li.mec-first-for-all-wrapper{margin-bottom:20px;clear:both}.mec-booking-shortcode label.wn-checkbox-label:before{display:inline-block;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;-webkit-transform-origin:left top;transform-origin:left top;content:"";-webkit-transition:opacity ease .5;-moz-transition:opacity ease .5;transition:opacity ease .5;position:absolute;background-color:#00acf8;width:2px;-webkit-transform:rotate(-138deg);transform:rotate(-138deg)}.mec-booking-shortcode label.wn-checkbox-label{position:relative;display:inline-block;-moz-transition:border-color ease .2s;-o-transition:border-color ease .2s;-webkit-transition:border-color ease .2s;transition:border-color ease .2s;cursor:pointer;vertical-align:middle;font-size:14px;line-height:19px;font-weight:400;color:#00acf8;margin:0 0 4px!important;padding:0;background-color:#fff;border:2px solid #a8e4ff;width:17px;height:17px;border-radius:3px;margin-right:9px!important;box-shadow:none}.mec-booking-shortcode label.wn-checkbox-label:after{-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-moz-animation:dothabottomcheck 80ms ease 0s forwards;-o-animation:dothabottomcheck 80ms ease 0s forwards;-webkit-animation:dothabottomcheck 80ms ease 0s forwards;animation:dothabottomcheck 80ms ease 0s forwards;content:"";display:inline-block;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;-webkit-transform-origin:left top;transform-origin:left top;content:"";-webkit-transition:opacity ease .5;-moz-transition:opacity ease .5;transition:opacity ease .5;position:absolute;background-color:#00acf8;width:2px}.mec-booking-shortcode input[type=checkbox]:checked+.wn-checkbox-label::after{height:5px;left:2px;top:7px;-moz-animation:dothatopcheck .16s ease 0s forwards;-o-animation:dothatopcheck .16s ease 0s forwards;-webkit-animation:dothatopcheck .16s ease 0s forwards;animation:dothatopcheck .16s ease 0s forwards}.mec-booking-shortcode input[type=checkbox]:checked+.wn-checkbox-label::before{height:6px;left:7px;top:9px;-moz-animation:dothatopcheck .16s ease 0s forwards;-o-animation:dothatopcheck .16s ease 0s forwards;-webkit-animation:dothatopcheck .16s ease 0s forwards;animation:dothatopcheck .16s ease 0s forwards}.mec-booking-shortcode button.mec-book-form-back-button{background-color:#afe6ff;box-shadow:0 2px 2px rgba(175,230,255,.27)}.mec-booking-shortcode button[type=button]:hover,.mec-booking-shortcode button[type=submit]:hover{background-color:#000;text-decoration:none;box-shadow:0 4px 10px rgba(1,2,4,.32)}.mec-booking-shortcode a.button.loading:after,.mec-booking-shortcode button[type=submit].loading:after{display:block}.mec-booking-calendar-month-navigation,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation{position:relative;text-align:center;padding:0;max-width:330px}.mec-booking-calendar.mec-wrap,.mec-single-fluent-wrap .mec-booking-calendar.mec-wrap{margin-bottom:20px;width:100%}.mec-booking-calendar.mec-wrap,.mec-single-fluent-wrap .mec-booking-calendar.mec-wrap{max-width:330px;background:#fff;box-shadow:0 1px 5px 6px rgba(0,0,0,.005) inset;border:1px solid #efefef;border-radius:5px}.mec-booking-calendar-month-navigation .mec-calendar-header h2,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-calendar-header h2{font-size:13px;font-weight:600;line-height:40px;margin:0 auto;color:#4d4d4d}.mec-booking-calendar-month-navigation .mec-next-month,.mec-booking-calendar-month-navigation .mec-previous-month,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-previous-month{cursor:pointer;position:absolute;top:0;min-width:40px;height:40px;line-height:40px;text-align:center;background:#fff;color:#a9a9a9;font-size:10px;letter-spacing:1px;text-transform:uppercase;padding-left:5px;padding-right:5px;border-top:none;transition:all .33s ease;box-shadow:0 2px 0 0 rgba(0,0,0,.015);transition:all .33s ease}.mec-booking-calendar-month-navigation .mec-previous-month,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-previous-month{left:0}.mec-booking-calendar-month-navigation .mec-next-month,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month{right:0}.mec-booking-calendar-month-navigation .mec-next-month a,.mec-booking-calendar-month-navigation .mec-previous-month a,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month a,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-previous-month a{font-weight:600;text-decoration:none}.mec-booking-calendar-month-navigation .mec-next-month:hover a,.mec-booking-calendar-month-navigation .mec-previous-month:hover a,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-next-month:hover a,.mec-single-fluent-wrap .mec-booking-calendar-month-navigation .mec-previous-month:hover a{color:#40d9f1}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar{margin-bottom:15px;width:100%}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar dl dt{text-align:center;padding:0;line-height:40px;height:40px;border:0;background:0 0;cursor:pointer}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar .mec-calendar-row dt:hover{background:0 0}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar .mec-calendar-novel-selected-day,.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar .mec-calendar-novel-selected-day span{width:32px;height:32px;margin:auto;line-height:30px;border-radius:50%;font-size:12px;font-weight:600;padding:0}.mec-has-event-for-booking{position:relative}.mec-has-event-for-booking .mec-calendar-novel-selected-day{border:1px solid #38d5ed;border-radius:50px;cursor:pointer}.mec-has-event-for-booking.mec-active .mec-calendar-novel-selected-day{background-color:#38d5ed;color:#fff}.mec-has-event-for-booking .mec-booking-calendar-date,.mec-has-event-for-booking .mec-booking-tooltip,.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip{opacity:0;visibility:hidden;transition:all .4s ease}.mec-has-event-for-booking .mec-booking-tooltip,.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip{top:60px}.mec-has-event-for-booking .mec-booking-tooltip,.mec-multiple-event .mec-has-event-for-booking .mec-booking-tooltip{position:absolute;z-index:99;width:150px;font-size:9px;left:calc(50% - 75px);background:#535a61;line-height:29px;border-radius:4px;color:#fff;font-weight:400;letter-spacing:1px;text-transform:uppercase;padding:3px 5px;box-shadow:0 4px 15px -2px #444b50a3}.mec-has-event-for-booking:hover .mec-booking-calendar-date,.mec-has-event-for-booking:hover .mec-booking-tooltip,.mec-has-event-for-booking:hover .mec-booking-tooltip.multiple-time .mec-booking-calendar-date,.mec-multiple-event .mec-has-event-for-booking:hover .mec-booking-calendar-date,.mec-multiple-event .mec-has-event-for-booking:hover .mec-booking-tooltip{opacity:1;visibility:visible}.mec-has-event-for-booking:hover .mec-booking-tooltip,.mec-multiple-event .mec-has-event-for-booking:hover .mec-booking-tooltip{top:43px}.mec-has-event-for-booking .mec-booking-calendar-date:before,.mec-multiple-event .mec-has-event-for-booking .mec-booking-calendar-date:before{display:block;content:""!important;position:absolute!important;width:12px;height:12px;top:-6px;left:calc(50% - 6px);transform:rotate(-45deg)!important;background-color:#535a61;z-index:0!important;box-shadow:0 8px 9px -9px #535a61!important}.mec-multiple-event .mec-has-event-for-booking .mec-booking-calendar-date-hover{border-bottom:1px solid #ffffff30}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .first-day{position:relative;padding-left:7px}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .first-day .mec-calendar-novel-selected-day{border-radius:47px;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0;width:100%}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .first-day .mec-calendar-novel-selected-day span{margin-left:-7px}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .last-day{position:relative;padding-right:7px}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .last-day .mec-calendar-novel-selected-day{border-radius:47px;border-top-left-radius:0;border-bottom-left-radius:0;border-left:0;width:100%}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .last-day .mec-calendar-novel-selected-day span{margin-right:-7px}.mec-events-meta-group-booking .mec-booking-calendar .mec-calendar.mec-multiple-event .middle-day .mec-calendar-novel-selected-day{border-radius:0;border-right:0;border-left:0;width:100%}.mec-booking-tooltip.multiple-time{color:#fff}.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:before{display:none}.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:first-child:before{display:block}.mec-booking-tooltip.multiple-time .mec-booking-calendar-date{border:1px dashed #68717a;line-height:25px;margin:8px 0;border-radius:20px;transition:all .17s ease;-webkit-transition:all .17s ease;-moz-transition:all .17s ease;-ms-transition:all .17s ease;-o-transition:all .17s ease}.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover,.mec-calendar-day.mec-active .mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active{background:#40d9f1;border-color:#40d9f1}.mec-choosen-time-message{max-width:330px;padding:3px 14px;border-radius:4px;background:rgb(64 217 241 / 24%);color:#40d9f1;transition:all .17s ease;opacity:1;visibility:visible;font-size:12px;margin-bottom:20px}.mec-choosen-time-message .mec-choosen-time{padding-left:7px}.mec-choosen-time-message.disable,.mec-choosen-time-message.disable .mec-choosen-time-message{opacity:0;visibility:hidden;padding:0;font-size:0;margin:0}.mec-dark-mode .mec-single-event .mec-events-meta-group-booking .mec-booking-calendar-month-navigation,.mec-dark-mode .mec-single-event .mec-events-meta-group-booking .mec-calendar{background:#000;border-color:#222;color:#999}.mec-dark-mode .mec-booking-calendar-month-navigation .mec-next-month,.mec-dark-mode .mec-booking-calendar-month-navigation .mec-previous-month{background:#222;border-color:#000;color:#d2d2d2}.mec-dark-mode .mec-booking-calendar.mec-wrap{border-color:#111}.mec-dark-mode .mec-events-meta-group-booking .mec-booking-calendar .mec-calendar .mec-calendar-row dt:hover{background:0 0!important}.mec-dark-mode .mec-calendar.mec-event-calendar-classic,.mec-dark-mode .mec-calendar.mec-event-calendar-classic .mec-calendar-side{height:auto}.is-light-theme .mec-fes-form textarea{border:1px solid #cfeff5;box-shadow:0 2px 5px rgba(207,239,245,.38) inset}.is-light-theme .mec-fes-form .select2-selection{height:auto}.is-light-theme .mec-fes-form input[type=checkbox]:after{border:unset!important}.is-light-theme .mec-fes-form input[type=radio]:after{background:unset!important}.is-light-theme .mec-fes-form input+label{padding-top:0}.is-light-theme .mec-events-event-image img{height:auto}span.mec-booking-field-required{color:red;margin-left:10px}.mec-gCalendar{position:relative}.mec-gCalendar-filters{display:none;position:absolute;width:518px;background:#fff;right:calc(50% - 119px);top:60px;z-index:9999999;border:1px solid #e3e4e5;border-radius:7px;box-shadow:0 2px 7px rgb(0 0 0 / 5%)}.mec-gCalendar-filters-wrap{display:flex;flex-wrap:wrap;justify-content:space-between;padding:30px;gap:20px 10px;align-items:center}.mec-gCalendar-filters-wrap>div{flex:1 0 calc(43% - 10px);display:inline-flex}.mec-gCalendar-filters .mec-gCalendar-filters-wrap .mec-search-reset-button{display:block;flex:1 0 calc(100%)}.mec-gCalendar-filters .mec-gCalendar-filters-wrap .mec-search-reset-button button{width:100%;border:2px solid #e3e5e7;border-radius:7px;color:#4c5765}.mec-gCalendar-filters .mec-gCalendar-filters-wrap .mec-search-reset-button button:hover{color:#e9526c;border-color:#f37f9b;background-color:transparent}.mec-gCalendar-filters-wrap .select2-container--default>ul{margin-top:2px;width:100%}.mec-gCalendar-filters-wrap span.select2.select2-container{width:100%!important}.mec-gCalendar-filters-wrap .select2-container--default>ul>li{width:100%}.mec-gCalendar-filters-wrap .select2-container--default{height:39px}.mec-gCalendar-filters-wrap span.select2-selection.select2-selection--multiple{border:none!important;height:37px!important}.mec-gCalendar-filters-wrap .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:0;background-color:#eee;font-size:11px}.mec-gCalendar-filters-wrap .select2-container--default .select2-selection--multiple .select2-selection__rendered li{line-height:29px;margin-top:5px;border:none;margin-right:5px}.mec-gCalendar-filters-wrap .mec-searchbar-category-wrap{margin:0!important;width:182px!important;padding:0!important;height:40px!important;border-radius:0 3px 3px 0;border:1px solid #e3e4e5!important}.mec-gCalendar-filters-wrap .mec-checkboxes-search i,.mec-gCalendar-filters-wrap .mec-dropdown-search i,.mec-gCalendar-filters-wrap .mec-minmax-event-cost i,.mec-gCalendar-filters-wrap .mec-text-address-search i{color:#b7b7b7;background-color:#fbfbfb;border-radius:3px 0 0 3px;border:1px solid #e3e4e5;width:40px;height:40px;line-height:40px;padding:0;border-right:0;text-align:center}.mec-gCalendar-filters-wrap .mec-minmax-event-cost input,.mec-gCalendar-filters-wrap .mec-minmax-event-cost input:focus,.mec-gCalendar-filters-wrap .mec-text-address-search input,.mec-gCalendar-filters-wrap .mec-text-address-search input:focus{width:208px;height:40px;border-radius:0;border-right:0;border-color:#e3e4e5;font-size:12px;border-style:solid;border-width:1px;padding-left:15px}.mec-gCalendar-filters-wrap .mec-text-address-search input,.mec-gCalendar-filters-wrap .mec-text-address-search input:focus{width:415px}.mec-gCalendar-filters-wrap .mec-minmax-event-cost input:last-child,.mec-gCalendar-filters-wrap .mec-text-address-search input,.mec-gCalendar-filters-wrap .mec-text-address-search input:focus{border-right:1px solid #e3e4e5;border-radius:0 3px 3px 0;border-left:none}.mec-gCalendar .mec-gCalendar-filters-wrap .mec-text-address-search i{border-right:1px solid #e3e4e5}.mec-gCalendar-filters-wrap ul.list li[data-value=""]{display:none}.mec-gCalendar .fc .fc-scroller-harness,.mec-gCalendar .fc .fc-scroller-liquid-absolute,.mec-gCalendar .fc-h-event .fc-event-title{overflow:visible!important}#MonthPicker_mec-gCalendar-month-filter:after,#MonthPicker_mec-gCalendar-month-filter:before,.mec-gCalendar-filters:after,.mec-gCalendar-filters:before{content:"";display:block;position:absolute;left:50%;margin-left:77px;width:0;height:0;border-style:solid;border-width:7px}#MonthPicker_mec-gCalendar-month-filter:after,#MonthPicker_mec-gCalendar-month-filter:before{margin-left:68px}#MonthPicker_mec-gCalendar-month-filter:before,.mec-gCalendar-filters:before{top:-15px;border-color:transparent transparent #e3e9f1 transparent}#MonthPicker_mec-gCalendar-month-filter:after,.mec-gCalendar-filters:after{top:-14px;border-color:transparent transparent #fff transparent}.mec-gCalendar{font-family:inherit}.mec-gCalendar-tooltip{width:290px;height:auto;position:absolute;background:#fff;left:calc(50% - 145px);bottom:calc(100% - 1px);border:1px solid #e3e4e5;border-radius:7px;opacity:1;box-shadow:0 4px 13px rgb(0 0 0 / 7%);z-index:9997}@media (max-width:991px){.mec-gCalendar-tooltip{display:none}}.mec-gCalendar-tooltip-image img{width:100%;border-radius:3px!important}.mec-gCalendar-tooltip-image{padding:10px;padding-bottom:8px}.mec-gCalendar a.fc-event:active{opacity:1}.mec-gCalendar #mec-gCalendar-wrap a.fc-event{padding:7px 3px;font-size:12px;font-weight:400}.mec-gCalendar-tooltip-title{color:#000;line-height:24px;font-size:15px;padding:10px 25px;font-weight:500}.mec-gCalendar-tooltip-title span{width:12px;height:12px;display:inline-block;margin-left:7px;vertical-align:middle;border-radius:50px}.mec-gCalendar-tooltip-title a{color:#000}.mec-gCalendar-tooltip-title a:hover{text-decoration:underline;color:#000}.mec-gCalendar-tooltip-location{color:#707172;font-size:12px;font-weight:400;line-height:23px;padding:0 25px 15px;margin-top:-2px}.mec-gCalendar-tooltip-location i{margin-right:6px;color:#c1c7ce}.mec-gCalendar .fc-event-time{display:none}.mec-gCalendar-tooltip-date{background:#f7f8f9;color:#898a8c;font-weight:400;padding:10px 24px;display:flex;justify-content:space-between;font-size:12px}.mec-gCalendar-tooltip-date-text>div>span,.mec-gCalendar-tooltip-date-time>div>span{display:block;line-height:23px}.mec-gCalendar-tooltip-date-text>div>span:last-child,.mec-gCalendar-tooltip-date-time>div>span:last-child{margin:0}.mec-gCalendar-tooltip-date-text .mec-gCalendar-tooltip-date-day{font-size:14px;color:#000}.mec-gCalendar-tooltip-date-text,.mec-gCalendar-tooltip-date-time{display:flex;align-items:baseline}.mec-gCalendar-tooltip-date-text i,.mec-gCalendar-tooltip-date-time i{margin-right:8px;color:#c1c7ce}.mec-gCalendar-tooltip:after,.mec-gCalendar-tooltip:before{content:"";display:block;position:absolute;left:calc(50% - 8px);width:0;height:0;border-style:solid;border-width:8px}.mec-gCalendar-tooltip:before{bottom:-17px;border-color:#e3e9f1 transparent transparent transparent}.mec-gCalendar-tooltip:after{bottom:-16px;border-color:#fff transparent transparent transparent}#mec-gCalendar-wrap .openMonthFilter i{-moz-transition:all .27s ease;-webkit-transition:all .27s ease;-o-transition:all .27s ease;transition:all .27s ease}#mec-gCalendar-wrap .openMonthFilter.open i{transform:rotate(-180deg)}.mec-gCalendar input#mec-gCalendar-month-filter{display:none}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk,.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk>div:not(#MonthPicker_mec-gCalendar-month-filter){display:flex;align-items:center;justify-content:space-between}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk{margin-bottom:8px}.mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar{border:1px solid #e3e4e5;border-radius:7px;padding:18px 30px 10px;position:relative;flex-wrap:wrap}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{font-size:22px;font-weight:600;line-height:20px;margin-right:20px;position:relative}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title>span{font-weight:100}.mec-gCalendar h2.fc-toolbar-title i{color:#a1a2a3;cursor:pointer;margin-left:2px;font-size:14px;margin-right:0}.mec-gCalendar h2.fc-toolbar-title button{background:0 0;border:none;cursor:pointer;padding:0;outline:0}.mec-gCalendar table.fc-scrollgrid-sync-table tbody td{border:none;border-bottom:1px solid #eee;border-right:1px solid #eee}.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary:active,.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary:active{background:#fff;color:#a1a2a3;border-radius:7px 0 0 7px;border-color:#e3e4e5;padding:3px 2px;box-shadow:none!important}.mec-gCalendar button.fc-button span.fc-icon{font-size:20px;padding:1px 0;width:30px;height:34px;vertical-align:middle;position:relative}.mec-gCalendar-filters-wrap .nice-select .list{margin:0;box-shadow:0 0 0 1px rgb(68 68 68 / 11%),0 2px 4px rgb(0 0 0 / 5%)}.mec-gCalendar button.fc-button span.fc-icon:before{vertical-align:middle;font-size:18px;position:absolute;top:calc(50% - 9px);left:calc(50% - 9px)}.mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary{border-right:none}.mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary{border-left:none;border-radius:0 7px 7px 0}.mec-gCalendar button.fc-next-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-next-button.fc-button.fc-button-primary:active,.mec-gCalendar button.fc-prev-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-prev-button.fc-button.fc-button-primary:active{background:#fff;color:#a1a2a3;border-right:none;border-left:none;border-radius:0;border-color:#e3e4e5;padding:3px 2px;box-shadow:none!important}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active{background:#fff;color:#707070;border-left:none;border-right:none;border-radius:0;border-color:#e3e4e5;font-size:13px;text-transform:capitalize;font-weight:400;opacity:1;padding:9px 8px 12px;box-shadow:none!important;cursor:pointer;height:42px}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:disabled{cursor:auto}.mec-gCalendar button.fc-button.fc-button-primary:hover span{background:#f4f5f6;color:#000;border-radius:7px}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:not(:disabled):hover{background:#f4f5f6;color:#000;border-radius:0}.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary:active{min-width:100px;border-radius:7px!important;margin-right:0;background:#00acf8;border:none!important;padding:10px 15px 11px;font-size:13px;font-weight:500;margin-left:20px!important;box-shadow:none!important}.mec-gCalendar tr.fc-scrollgrid-section.fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>td{border-radius:7px 7px 0 0;border:none}.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary{position:relative;text-align:right;padding-right:13px;padding-left:32px;min-width:auto;background:0 0;font-size:14px;color:#969798;font-weight:400}.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary:active,.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary:hover{background:#f4f5f6;color:#000}.mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary svg{position:absolute;left:10px;top:14px}.mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary:hover{background:#444}.mec-gCalendar-tooltip-location,.mec-gCalendar-tooltip-title{white-space:normal}.mec-gCalendar #mec-gCalendar-wrap .mec-gCalendar-search-text-wrap input[type=text],.mec-gCalendar #mec-gCalendar-wrap .mec-gCalendar-search-text-wrap input[type=text]:focus{margin:0;border:none;box-shadow:none!important;font-size:14px;font-weight:400;line-height:20px;color:#949aa1;padding-right:5px;padding-left:8px;background:#fff;outline:0;display:inline-block}.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]::-webkit-input-placeholder{color:#949aa1}.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]::-moz-placeholder{color:#949aa1}.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]:-ms-input-placeholder{color:#949aa1}.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]:-moz-placeholder{color:#949aa1}.mec-gCalendar-search-text-wrap{border-left:1px solid #e3e4e5;padding-left:16px}.mec-gCalendar-search-text-wrap i{margin-right:0;color:#bcc4ce;font-size:17px}.mec-gCalendar .fc-direction-ltr .fc-button-group>.fc-button:first-child{margin-left:7px!important}.mec-gCalendar .fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:0}.mec-gCalendar .mec-localtime-wrap{color:#000;font-size:11px;margin-top:2px;margin-bottom:2px}.mec-gCalendar .fc-theme-standard .fc-popover{background:#fff;border:1px solid #e3e4e5;border-radius:7px;box-shadow:0 4px 13px rgb(0 0 0 / 7%)}.mec-gCalendar .mec-localtime-wrap i{display:none}.mec-gCalendar .datepicker.dropdown-menu{top:51px!important;left:unset!important;right:0}.mec-month-picker.datepicker.dropdown-menu{position:absolute;min-width:215px!important;z-index:999;background:#fff;padding:4px 0 3px;margin:0;color:#000;border:1px solid #e3e4e5;border-radius:7px;box-shadow:0 3px 5px rgb(0 0 0 / 3%)}.mec-month-picker.datepicker.dropdown-menu *{background:#fff;border-radius:7px;border:none;height:auto}.mec-month-picker.datepicker table caption+thead tr:first-child td,.mec-month-picker.datepicker table caption+thead tr:first-child th,.mec-month-picker.datepicker table colgroup+thead tr:first-child td,.mec-month-picker.datepicker table colgroup+thead tr:first-child th,.mec-month-picker.datepicker table thead:first-child tr:first-child td,.mec-month-picker.datepicker table thead:first-child tr:first-child th{border:none}.mec-month-picker.datepicker table thead:first-child tr:first-child th.switch{font-weight:500}.mec-month-picker.datepicker table thead:first-child tr:first-child th.next,.mec-month-picker.datepicker table thead:first-child tr:first-child th.prev{font-size:0;padding-top:11px}.mec-month-picker.datepicker table thead:first-child tr:first-child th.next:before,.mec-month-picker.datepicker table thead:first-child tr:first-child th.prev:before{content:"\e606";font-family:simple-line-icons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:12px;color:#a1a2a3}.mec-month-picker.datepicker table thead:first-child tr:first-child th.prev:before{content:"\e605"}.mec-month-picker.datepicker table.table-condensed thead tr{display:flex;padding:6px 12px 10px;justify-content:space-between;align-items:center}.mec-month-picker.datepicker thead tr:first-child th{width:auto;height:auto}.mec-month-picker.datepicker thead tr:first-child th.next,.mec-month-picker.datepicker thead tr:first-child th.prev{width:34px;height:34px;padding:0 12px}.mec-month-picker.datepicker thead tr:first-child th.switch{padding:5px 18px}.mec-month-picker.datepicker table.table-condensed tbody tr td{justify-content:space-between;align-items:center;padding:0 9px 7px;display:flex;flex-direction:row;flex-wrap:wrap;width:auto}.mec-month-picker.datepicker td span.active.active,.mec-month-picker.datepicker td span.active.disabled,.mec-month-picker.datepicker td span.active:active,.mec-month-picker.datepicker td span.active:focus,.mec-month-picker.datepicker td span.active:hover,.mec-month-picker.datepicker td span.active[disabled]{background-color:#00acf8;text-shadow:none}.mec-month-picker.datepicker td span{width:43px;line-height:41px;font-size:14px}.mec-month-picker.datepicker thead tr:first-child th:hover{background:#f4f5f6}.mec-month-picker.datepicker thead tr:first-child th:hover:before{color:#000!important}.mec-month-picker.datepicker td span:hover{background-color:#f4f5f6}.mec-month-picker.datepicker:after{left:unset;right:11px}.mec-month-picker.datepicker:before{left:unset;right:10px}#gCalendar-loading{width:100%;height:100%;background:no-repeat rgba(255,255,255,.88) url("../img/ajax-loader.gif") center;border-style:none;position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#gCalendar-loading.mec-modal-preloader{display:block!important}.fc-daygrid.fc-dayGridMonth-view.fc-view{overflow:auto;border:1px solid #e3e4e5;border-radius:7px}#mec-gCalendar-wrap table.fc-scrollgrid{min-width:650px;overflow:auto;border:none;border-radius:unset}@media (min-width:992px){#mec-gCalendar-wrap table.fc-scrollgrid,.fc-daygrid.fc-dayGridMonth-view.fc-view{overflow:visible}}#mec-gCalendar-wrap table.fc-scrollgrid thead tr td{border:none!important;background:0 0}#mec-gCalendar-wrap table.fc-scrollgrid table{margin-bottom:0}#mec-gCalendar-wrap table.fc-scrollgrid tr th{background:0 0;padding:20px 0 3px 10px;text-align:left;border-right:none!important;border-left:none!important;border-bottom:1px solid #e3e4e5;border-top:none}#mec-gCalendar-wrap table.fc-scrollgrid tr th.fc-col-header-cell{border:none}#mec-gCalendar-wrap table.fc-scrollgrid tr th a{font-size:15px!important;font-weight:500!important;color:#000;text-decoration:none}#mec-gCalendar-wrap .openMonthFilter{position:relative;padding:7px 10px 2px;display:inline-block}#mec-gCalendar-wrap.fc .fc-daygrid-day-number{font-size:16px;padding:12px 10px 2px;color:#000;text-decoration:none}#mec-gCalendar-wrap table.fc-scrollgrid-sync-table{margin:0;border-spacing:0;border-collapse:separate}.mec-gCalendar table.fc-scrollgrid-sync-table tbody tr td:last-child{border-right:none}.mec-gCalendar table.fc-scrollgrid-sync-table tbody tr:last-child td{border-bottom:none}#mec-gCalendar-wrap span.mec-general-calendar-label{color:#fff;padding:1px 4px 3px;font-size:11px;border-radius:3px;margin:5px 3px 2px 0;display:inline-block}.mec-gCalendar .fc .fc-scrollgrid-section-sticky>*{position:relative;z-index:1}.mec-gCalendar .fc-direction-ltr .fc-daygrid-event.fc-event-end,.mec-gCalendar .fc-direction-ltr .fc-daygrid-event.fc-event-start,.mec-gCalendar .fc-direction-rtl .fc-daygrid-event.fc-event-end,.mec-gCalendar .fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:0!important;margin-left:0!important}#mec-gCalendar-wrap table.fc-scrollgrid-sync-table tr td{text-align:left;background:#fff!important}#mec-gCalendar-wrap table.fc-scrollgrid-sync-table .fc-daygrid-day-top{display:flex;flex-direction:row;padding-left:10px}#mec-gCalendar-wrap .fc-daygrid-day.fc-day-today{background:#fff!important}#mec-gCalendar-wrap .fc-daygrid-day.fc-day-today .fc-daygrid-day-number{color:#00acf8;font-size:17px;font-weight:500}#mec-gCalendar-wrap .fc-scrollgrid-section-body>td{border:none!important}#mec-gCalendar-wrap table.fc-scrollgrid-sync-table tbody tr:last-child td:first-child{border-radius:0 0 0 7px}#mec-gCalendar-wrap table.fc-scrollgrid-sync-table tbody tr:last-child td:last-child{border-radius:0 0 7px 0}.select2-container{z-index:99999999}@media (max-width:1200px){.mec-gCalendar-search-text-wrap{padding-left:10px}.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text],.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]:focus{width:100px}}@media (max-width:991px){.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text],.mec-gCalendar .mec-gCalendar-search-text-wrap input[type=text]:focus{width:auto}.mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar{display:block}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child{margin:0}.mec-gCalendar-search-text-wrap{border-left:none}}@media (max-width:990px){.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:first-child>div{width:100%;justify-content:flex-start!important;position:relative}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{position:relative}}@media (max-width:480px){.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active{padding:6px 6px 9px}.mec-gCalendar button.fc-button span.fc-icon{font-size:12px;width:20px;height:27px}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{font-size:17px;margin-right:11px}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk,.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk>div:not(#MonthPicker_mec-gCalendar-month-filter){flex-wrap:wrap}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child>div:not(#MonthPicker_mec-gCalendar-month-filter){width:100%;display:block}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child>div.fc-button-group{text-align:right}.mec-gCalendar-filters-wrap .mec-text-address-search input,.mec-gCalendar-filters-wrap .mec-text-address-search input:focus{width:100%}.mec-gCalendar-filters-wrap>div{width:100%}.mec-gCalendar-filters-wrap .nice-select{width:100%}.mec-gCalendar-filters{width:328px;right:calc(50% - 165px);top:52px}.mec-gCalendar-filters:after,.mec-gCalendar-filters:before{margin-left:30px}.mec-gCalendar-filters-wrap .mec-minmax-event-cost input,.mec-gCalendar-filters-wrap .mec-minmax-event-cost input:focus{width:116px}.mec-month-picker.datepicker:after{left:unset;right:55px}.mec-month-picker.datepicker:before{left:unset;right:54px}.mec-month-picker.datepicker.dropdown-menu{top:40px!important;right:-45px}.mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar{padding:18px 10px}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active{height:35.5px}.mec-gCalendar-search-text-wrap{border-left:0;border-bottom:1px solid #eee;padding:0;margin-bottom:10px}.mec-gCalendar-filters:after,.mec-gCalendar-filters:before{margin:0}}@media (max-width:360px){.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child>div.fc-button-group{text-align:left}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child>div:not(#MonthPicker_mec-gCalendar-month-filter){margin-bottom:8px}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{position:relative;width:100%}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:first-child>div{justify-content:left!important}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{font-size:22px}.mec-gCalendar button.fc-button span.fc-icon{font-size:20px;width:30px;height:34px}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active{padding:9px 8px 12px}.mec-gCalendar-filters:after,.mec-gCalendar-filters:before{margin-left:-100px}.mec-gCalendar-filters{top:60px}.mec-month-picker.datepicker.dropdown-menu{width:215px}.mec-month-picker.datepicker.dropdown-menu{top:37px!important;right:27px}.mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{font-size:12px;display:inline-block;width:auto}#mec-gCalendar-wrap .openMonthFilter{padding-right:0}.mec-gCalendar button.fc-button span.fc-icon{width:20px;height:27px}.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary,.mec-gCalendar button.fc-today-button.fc-button.fc-button-primary:active{line-height:1}.mec-month-picker.datepicker.dropdown-menu{right:-80px}.mec-month-picker.datepicker:after{right:calc(50% - 3px)}.mec-month-picker.datepicker:before{right:calc(50% - 4px)}.mec-gCalendar .fc-header-toolbar .fc-toolbar-chunk:last-child>div.fc-button-group{text-align:right}.mec-gCalendar-filters{width:300px;right:calc(50% - 150px)}.mec-gCalendar-filters-wrap{padding:15px}.fc-h-event .fc-event-main{font-size:9px;line-height:11px}}@media (max-width:768px){.mec-cart{overflow-x:scroll}}.mec-cart-coupon input[type=text]{min-height:40px;font-size:13px;line-height:38px;color:#606367;border:1px solid #e3e5e7;border-radius:3px;padding:0 12px;margin-bottom:0;box-shadow:unset;width:330px;vertical-align:top}.mec-cart ul{padding:0;list-style:none}.mec-cart ul h5,.mec-cart ul h6{margin:0;font-size:14px;color:#000;font-weight:inherit}.mec-cart ul h6{padding-left:0}.mec-cart ul h6:before{content:"— "}.mec-cart ul h5{font-weight:400;margin:0 0 3px 0}.mec-cart ul h6:last-child{margin-bottom:12px}.mec-cart table td:nth-child(4) ul li{margin-bottom:5px}.mec-cart table td:nth-child(4) ul li:last-child{margin-bottom:12px}.mec-cart table a{font-size:15px;font-weight:400;line-height:20px;color:#474849;fill:#474849}.mec-cart table a:hover{color:#000}.mec-cart table #mec_cart_total_payable,.mec-cart table .mec-transaction-price{font-size:20px;font-weight:700;line-height:26px;letter-spacing:-.8px;text-align:right;color:#060607;fill:#060607}.mec-cart table .mec-line-through{text-decoration:line-through}.mec-cart table .mec-cart-remove-transactions svg:hover,.mec-cart table .mec-cart-remove-transactions svg:hover path{color:red!important;fill:red!important;cursor:pointer}.mec-cart table tr{text-align:left}.mec-cart table tr th{margin-bottom:27px;margin-top:0;padding:9px 12px 9px;font-size:14px;line-height:1.8;letter-spacing:0;font-weight:600;position:relative;color:#000}.mec-cart table tr td{padding:9px 12px 9px;font-size:14px;color:#000}.mec-cart table tr td a:hover{color:#000;text-decoration:underline}.mec-cart table tr td,.mec-cart table tr th{background-color:#fff!important;border:0!important;vertical-align:middle}.mec-cart table tr{border-top:1px solid rgba(0,0,0,.1)}.mec-cart table tr th:last-child{text-align:right}.mec-cart table tr{border-top:1px solid rgba(0,0,0,.1)}.mec-cart table td:first-child{width:35px;max-width:35px}.mec-cart table td:nth-child(2){width:135px;max-width:135px}.mec-cart table td:nth-child(3),.mec-cart table td:nth-child(4){min-width:200px;width:200px}.mec-cart table td:nth-child(5){font-size:12px}.mec-cart table td:nth-child(6){text-align:right;vertical-align:middle}.mec-cart .mec-cart-coupon-code{font-size:12px;color:#8d9599}.mec-cart table thead tr th{border-bottom:1px solid #a3a3a3!important}.mec-cart table thead tr,.mec-cart table thead tr th{border-top:none!important}@media only screen and (max-width:992px){.mec-cart table{min-width:780px;overflow-x:scroll}}.mec-cart table tfoot tr th:last-child{display:none}.mec-checkout .mec-checkout-list{list-style:none;padding:0;margin:40px 0;display:grid;grid-template-columns:auto auto;column-gap:25px;row-gap:25px;padding-bottom:40px;border-bottom:1px solid #e6e6e6}.mec-checkout .mec-checkout-list .mec-list-items{padding:20px 30px;background:#fff;border:1px solid #e6e6e6;box-shadow:0 2px 0 0 rgb(0 0 0 / 2%)}.mec-checkout .mec-checkout-list .mec-list-items h3{margin-top:20px;margin-bottom:12px;font-size:22px;line-height:27px;letter-spacing:-.4px;font-weight:700;position:relative}.mec-checkout .mec-checkout-list .mec-list-items h5{font-size:18px;font-weight:500;padding-bottom:5px;display:inline;color:#000;margin:0 0 8px 0}.mec-checkout .mec-checkout-list .mec-list-items h6{margin:0;font-size:16px;line-height:23px;color:#8d9599;font-weight:inherit}.mec-checkout .mec-checkout-list .mec-list-items h6{padding-left:0}.mec-checkout .mec-checkout-list .mec-list-items h6:before{content:"— "}.mec-checkout .mec-checkout-list .mec-list-items ul{list-style:none;padding:15px 0 0 0}.mec-checkout .mec-checkout-list .mec-list-items .mec-checkout-price-details{color:#000;border:none;border-radius:2px;background:#f7f7f7;padding:15px;margin:15px 0 0 0;max-width:100%}.mec-checkout .mec-checkout-list .mec-list-items .mec-checkout-price-details li{display:flex;flex-wrap:nowrap;justify-content:space-between}.mec-checkout #mec_cart_total_payable{margin:0 0 40px 0;font-size:29px;line-height:27px;letter-spacing:-.4px;font-weight:700;position:relative;color:#39c36e}.mec-checkout .mec-gateway-comment{margin-top:20px;margin:0 0 20px 0;color:#616161;font-size:14px;line-height:1.8}.mec-checkout .mec-email-stripe input[type=email],.mec-checkout .mec-name-stripe input[type=text]{box-sizing:border-box;height:40px;padding:10px 12px;border:0!important;border-radius:4px;background-color:#fff;box-shadow:0 1px 3px 0 #e6ebf1!important;-webkit-transition:box-shadow 150ms ease;transition:box-shadow 150ms ease;margin-bottom:20px;background:#fff!important;max-width:330px}.mec-checkout label{color:#424242;font-weight:700;font-size:13px;letter-spacing:0;margin:0 0 4px 0;display:block;clear:none;padding:7px 1em 3px 0}.mec-checkout input[type=radio]:before{content:"";display:inline-block;background:#fff;border-radius:24px;width:13px;height:13px;cursor:pointer;margin:1px 0 0 0;border:1px solid #d7d8d9}.mec-checkout input[type=radio]:checked:before{border:0;background:#000}.mec-checkout input[type=radio]{margin:0 4px 0 0;font-size:0}.mec-checkout input[type=checkbox]{float:left}.mec-checkout-gateways-wrapper{max-width:54%;margin-bottom:20px}@media (max-width:768px){.mec-checkout-gateways-wrapper{max-width:100%;margin-bottom:20px}}.mec-checkout .mec-book-form-next-button{float:right;right:30%;width:155px;text-align:center}.mec-checkout .mec-checkout-actions .mec-checkout-cart-link.button{background-color:#c4cace!important;width:155px;text-align:center}.mec-checkout .mec-book-form-next-button:hover,.mec-checkout .mec-checkout-actions .mec-checkout-cart-link.button:hover{background:#000!important}@media (max-width:768px){.mec-checkout .mec-checkout-list{display:block;padding-bottom:20px}.mec-checkout .mec-checkout-list .mec-list-items{margin-bottom:20px;padding:15px}.mec-checkout-gateways-wrapper{max-width:100%;margin-bottom:20px}.mec-checkout .mec-book-form-next-button{right:0}}.mec-checkout-footer{background:#f5f6f7;padding:30px 40px 15px;border-radius:5px}.mec-checkout #mec_cart_total_payable{margin:0 0 15px;font-size:26px;line-height:1;letter-spacing:-.4px;font-weight:700;position:relative;color:#000}.mec-wrap .mec-simple-checkboxes-search{display:table-cell;float:none;padding:0 10px}.mec-wrap .mec-simple-checkboxes-search i{font-size:18px;width:unset;height:unset;background:0 0;border:none;display:inline-block;padding:0;margin-right:10px}.mec-wrap .mec-simple-checkboxes-search label:not(.selectit){font-size:14px;font-weight:600;line-height:20px;color:#313131;display:inline-block;margin-bottom:15px}.mec-wrap .mec-simple-checkboxes-search ul{list-style:none;padding:0}.mec-wrap .mec-simple-checkboxes-search ul li label{line-height:20px;margin-bottom:15px}.mec-load-more-wrap.mec-load-more-scroll-loading{width:100%;height:100%;background:no-repeat rgba(255,255,255,.88) url("../img/ajax-loader.gif") bottom;border-style:none;position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}.mec-nextprev-wrap{margin-top:30px;overflow:hidden;clear:both}.mec-nextprev-next-button,.mec-nextprev-prev-button{margin-right:0}.mec-nextprev-next-button{float:right;clear:both}a.mec-nextprev-next-button{text-decoration:none!important}a.mec-nextprev-next-button:hover{color:var(--mec-color-skin)}.mec-nextprev-prev-button svg{transform:rotate(180deg)}.mec-loading-events:after{content:"";background:rgba(255,255,255,.88) url("../img/ajax-loader.gif") no-repeat center calc(100% - 100px);position:absolute;top:0;right:0;left:0;bottom:0;margin:0 -10px}.mec-credit-url{font-size:11px;text-align:center;color:#919293}.mec-credit-url a{text-decoration:none;color:#919293}body[class*=mec-theme] .mec-wrap a{text-decoration:auto}.mec-ticket-name-description-wrapper h4{margin:0 0 5px 0}.mec-ticket-name-description-wrapper h4 .mec-ticket-attendee-counter,.mec-ticket-name-description-wrapper h4 .mec-ticket-name{font-size:16px;font-weight:500}.gm-style img{max-width:unset!important}.gm-style .gm-style-mtc button{border-radius:0!important}.mec-faq-list{list-style:none;padding:0}.mec-faq-list .mec-faq-item{border-bottom:1px solid #d4d4d4;position:relative}.mec-faq-list .mec-faq-item .mec-faq-toggle-icon{font-size:12px;position:absolute;right:15px;top:32px;z-index:1;cursor:pointer;transition:.3s}.mec-faq-list .mec-faq-item.close .mec-faq-toggle-icon{transform:rotate(180deg)}.mec-faq-list .mec-faq-item .mec-faq-title{padding:25px 15px}.mec-faq-list .mec-faq-item .mec-faq-title h4{font-size:19px;font-weight:700;margin:0;position:relative;white-space:nowrap}.mec-faq-list .mec-faq-item .mec-faq-title h4:after{content:"";position:absolute;top:0;right:0;width:30%;height:100%;background:#000;background:linear-gradient(90deg,rgba(0,0,0,0) 0,#fff 95%,#fff 100%);pointer-events:none}.mec-faq-list .mec-faq-item .mec-faq-content{padding:0 15px 5px;max-height:500px;overflow:hidden;-webkit-transition:max-height .5s linear;-moz-transition:max-height .5s linear;-ms-transition:max-height .5s linear;-o-transition:max-height .5s linear;transition:max-height .5s linear}.mec-faq-list .mec-faq-item.close .mec-faq-content{max-height:0;overflow:hidden}.mec-faq-list .mec-faq-item .mec-faq-content p{color:#6d8193;font-size:14px;font-weight:400;line-height:1.7em;letter-spacing:.2px}.mec-trailer iframe{width:100%}.single-mec-events{overflow-x:hidden}.mec-event-banner{width:calc(100vw - 17px);position:relative;margin-left:calc(-50vw - 10px);left:calc(50% + 18px);min-height:420px;padding:80px 0;text-align:center;margin-bottom:30px}.mec-event-banner-inner{max-width:900px;margin:0 auto;min-height:260px;display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;z-index:1}.mec-event-banner-title .mec-single-title{font-size:46px;font-weight:700;line-height:1.1;color:#fff}.mec-event-banner-datetime{display:flex;justify-content:center;gap:20px;margin-bottom:20px}.mec-event-banner-datetime .mec-single-event-date,.mec-event-banner-datetime .mec-single-event-time,.mec-event-banner-location .mec-single-event-location{display:flex;align-items:baseline;margin:0;padding:0;color:#fff}.mec-event-banner-location .mec-single-event-location{justify-content:center;align-items:center;gap:16px}.mec-event-banner-location>i{display:none}.mec-event-banner-location img{max-width:90px;margin:0}.mec-event-banner-location .mec-single-event-location dl{display:flex;align-items:baseline;gap:7px;flex-direction:row}.mec-event-banner-location .mec-single-event-location img+dl{flex-direction:column}.mec-event-banner-location .mec-single-event-location dl dd{display:flex;align-items:baseline;gap:5px}.mec-event-banner-location .mec-single-event-location dl dd *{color:#fff}.mec-event-banner-location .mec-single-event-location dl dd address.mec-events-address{font-size:16px;line-height:1.5}.mec-event-banner-datetime .mec-single-event-date h3.mec-date,.mec-event-banner-datetime .mec-single-event-time h3.mec-time,.mec-event-banner-location .mec-single-event-location .mec-location{display:none}.mec-event-banner-datetime .mec-single-event-date i,.mec-event-banner-datetime .mec-single-event-time i{margin-right:5px}.mec-event-banner-datetime .mec-single-event-date dl dd,.mec-event-banner-datetime .mec-single-event-time dl dd,.mec-event-banner-location .mec-single-event-location dl dd{margin:0}.mec-event-banner-datetime .mec-single-event-time .mec-time-comment{position:absolute;top:15px;left:20px}.mec-event-banner-datetime .mec-single-event-date{position:static}.mec-event-banner-datetime .mec-single-event-date .mec-holding-status{position:absolute;bottom:0;color:#fff;width:100px;padding:0 5px;border:1px solid #fff;border-radius:5px;left:calc(50% - 50px)}.mec-event-banner-color{width:calc(100vw - 17px);height:100%;position:absolute;top:0;z-index:0}@media only screen and (max-width:768px){.mec-event-banner{width:100vw;position:relative;margin-left:-50vw;left:50%}.mec-event-banner-color{width:100vw}.mec-event-banner-inner{min-height:400px;max-width:90%}.mec-event-banner-title .mec-single-title{font-size:36px}.mec-event-banner-datetime{flex-direction:column;align-items:center}.mec-event-banner-location .mec-single-event-location{flex-direction:column;align-items:center}.mec-event-banner-location .mec-single-event-location dl{flex-direction:column;align-items:center}}.mec-wrap li.mec-event-social-icon a>svg{width:36px;height:36px;border-radius:50%;padding:7px;fill:#767676;margin-right:3px}.mec-wrap .mec-event-grid-classic li.mec-event-social-icon a.twitter svg,.mec-wrap .mec-event-grid-clean li.mec-event-social-icon a.twitter svg,.mec-wrap .mec-event-grid-modern li.mec-event-social-icon a.twitter svg,.mec-wrap .mec-event-list-standard li.mec-event-social-icon a.twitter svg{margin:0;padding:0;height:36px;width:16px;margin-bottom:-7px}.mec-event-list-modern .mec-event-sharing>li a{display:flex;align-items:center}.mec-event-list-modern .mec-event-sharing>li a svg{border:1px solid #ddd}.mec-event-list-modern .mec-event-sharing{display:flex;align-items:center;flex-wrap:wrap}.mec-subscribe-to-calendar-container{display:flex;flex-direction:column;align-items:end}.mec-wrap button.mec-subscribe-to-calendar-btn{margin-bottom:10px!important;margin-right:0!important;width:180px}.mec-subscribe-to-calendar-items{width:180px;padding:5px 20px;background:#fff;border:1px solid #e6e7e8;border-radius:3px}.mec-subscribe-to-calendar-items a{font-size:14px;color:#8d8d8d;display:block;margin:10px 0;transition:.2s}.mec-subscribe-to-calendar-items a:hover{color:var(--mec-color-skin)}.mec-booking-ticket-variations ul{list-style:none;padding:0}.mec-booking-ticket-variations ul li{margin-bottom:20px}.mec-booking-ticket-variations ul li h5{font-size:16px;margin:0}.mec-booking-ticket-variations ul li p{margin:0}.rtl .mec-gCalendar #mec-gCalendar-wrap .fc-header-toolbar.fc-toolbar{flex-direction:row}.rtl .mec-gCalendar #mec-gCalendar-wrap h2.fc-toolbar-title{margin-right:0;margin-left:20px}.rtl .mec-gCalendar button.fc-prevYear-button.fc-button.fc-button-primary{border-right:1px solid #e3e4e5;border-left:none;border-radius:0 7px 7px 0}.rtl .mec-gCalendar button.fc-nextYear-button.fc-button.fc-button-primary{border-left:1px solid #e3e4e5;border-right:none;border-radius:7px 0 0 7px}.rtl .mec-gCalendar-search-text-wrap{border-left:none;border-right:1px solid #e3e4e5;padding-left:0;padding-right:16px}.rtl .mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary{text-align:left;padding-right:32px;padding-left:13px}.rtl .mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary svg{left:unset;right:10px}.rtl .mec-gCalendar button.fc-filterEvents-button.fc-button.fc-button-primary,.rtl .mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary,.rtl .mec-gCalendar button.fc-findEvents-button.fc-button.fc-button-primary:active{margin-left:0!important;margin-right:20px!important}.rtl .mec-gCalendar-filters{right:unset;left:calc(50% - 119px)}.rtl #MonthPicker_mec-gCalendar-month-filter:after,.rtl #MonthPicker_mec-gCalendar-month-filter:before,.rtl .mec-gCalendar-filters:after,.rtl .mec-gCalendar-filters:before{left:unset;right:50%;margin-left:unset;margin-right:77px}.rtl .mec-gCalendar-filters-wrap .mec-checkboxes-search i,.rtl .mec-gCalendar-filters-wrap .mec-dropdown-search i,.rtl .mec-gCalendar-filters-wrap .mec-minmax-event-cost i,.rtl .mec-gCalendar-filters-wrap .mec-text-address-search i{border-right:1px solid #e3e4e5;border-left:0;border-radius:0 3px 3px 0}.rtl .mec-gCalendar-filters-wrap .mec-minmax-event-cost input:last-child,.rtl .mec-gCalendar-filters-wrap .mec-text-address-search input,.rtl .mec-gCalendar-filters-wrap .mec-text-address-search input:focus{border-left:1px solid #e3e4e5;border-radius:3px 0 0 3px;border-right:1px solid #e3e4e5}.rtl .nice-select{padding-left:30px;padding-right:18px;text-align:right!important;border-radius:3px 0 0 3px}.rtl .nice-select:after{right:unset;left:15px}.rtl #mec-gCalendar-wrap table.fc-scrollgrid tr th{text-align:right;padding:20px 10px 3px 0}.rtl #mec-gCalendar-wrap table.fc-scrollgrid-sync-table tr td{text-align:right}.rtl .mec-gCalendar table.fc-scrollgrid-sync-table tbody td{border-left:1px solid #eee;border-right:none}.rtl .mec-gCalendar-tooltip-date-text i,.rtl .mec-gCalendar-tooltip-date-time i{margin-right:0;margin-left:8px}.rtl .mec-month-picker.datepicker table thead:first-child tr:first-child th.prev:before{content:"\e606"}.rtl .mec-month-picker.datepicker table thead:first-child tr:first-child th.next:before{content:"\e605"}.entry-content .mec-wrap h1,.entry-content .mec-wrap h2,.entry-content .mec-wrap h3,.entry-content .mec-wrap h4,.entry-content .mec-wrap h5,.entry-content .mec-wrap h6,.mec-events-meta-group-countdown .countdown-w span,.mec-hourly-schedule-speaker-job-title,.mec-hourly-schedule-speaker-name,.mec-single-event .mec-event-meta dt,.mec-ticket-available-spots .mec-event-ticket-name,.mec-wrap h1,.mec-wrap h2,.mec-wrap h3,.mec-wrap h4,.mec-wrap h5,.mec-wrap h6,.post-type-archive-mec-events h1,.tax-mec_category h1{font-family:var(--mec-heading-font-family),Helvetica,Arial,sans-serif}.lity-content .mec-events-meta-group-booking .mec-event-ticket-available,.mec-breadcrumbs .mec-current,.mec-breadcrumbs a,.mec-breadcrumbs span .mec-event-content p,.mec-event-data-field-items,.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-name,.mec-event-data-fields .mec-event-data-field-item .mec-event-data-field-value,.mec-event-schedule-content dl dt,.mec-events-button,.mec-events-meta-group-tags,.mec-events-meta-group-tags a,.mec-hourly-schedule-speaker-description,.mec-load-more-button,.mec-next-occ-booking span,.mec-single-event .mec-event-meta .mec-events-event-cost,.mec-single-event .mec-event-meta dd,.mec-single-event .mec-event-meta dd a,.mec-single-event .mec-events-meta-group-booking .mec-event-ticket-available,.mec-single-event .mec-speakers-details ul li .mec-speaker-job-title,.mec-single-event .mec-speakers-details ul li .mec-speaker-name,.mec-single-modern .mec-single-event-bar>div dd,.mec-wrap .info-msg div,.mec-wrap .mec-error div,.mec-wrap .mec-success div,.mec-wrap .warning-msg div,.mec-wrap abbr,.mec-wrap p{font-family:var(--mec-paragraph-font-family),sans-serif;font-weight:300}.colorskin-custom .mec-events-meta-group-countdown .mec-end-counts h3,.leaflet-popup-content .mec-color,.leaflet-popup-content .mec-color-before :before,.leaflet-popup-content .mec-color-hover:hover,.leaflet-popup-content .mec-wrap .mec-color,.leaflet-popup-content .mec-wrap .mec-color-before :before,.leaflet-popup-content .mec-wrap .mec-color-hover:hover,.lity .mec-color,.lity .mec-color-before :before,.lity .mec-color-hover:hover,.lity .mec-wrap .mec-color,.lity .mec-wrap .mec-color-before :before,.lity .mec-wrap .mec-color-hover:hover,.mec-attendees-list-details .mec-attendee-profile-link a:hover,.mec-av-spot .mec-av-spot-head .mec-av-spot-box span,.mec-booking-calendar-month-navigation .mec-next-month:hover,.mec-booking-calendar-month-navigation .mec-previous-month:hover,.mec-calendar .mec-calendar-side .mec-next-month i,.mec-calendar .mec-event-article .mec-event-title a:hover,.mec-calendar-events-side .mec-modal-booking-button:hover,.mec-calendar.mec-calendar-daily .mec-calendar-d-table .mec-daily-view-day.mec-daily-view-day-active.mec-color,.mec-choosen-time-message,.mec-event-container-classic .mec-modal-booking-button:hover,.mec-event-grid-minimal .mec-modal-booking-button:hover,.mec-event-grid-simple .mec-modal-booking-button,.mec-event-grid-yearly .mec-modal-booking-button,.mec-event-list-minimal .mec-modal-booking-button:hover,.mec-events-agenda .mec-modal-booking-button,.mec-events-timeline-wrap .mec-organizer-item a,.mec-events-timeline-wrap .mec-organizer-item:after,.mec-events-timeline-wrap .mec-shortcode-organizers i,.mec-map-boxshow .mec-color,.mec-map-boxshow .mec-color-before :before,.mec-map-boxshow .mec-color-hover:hover,.mec-map-boxshow .mec-wrap .mec-color,.mec-map-boxshow .mec-wrap .mec-color-before :before,.mec-map-boxshow .mec-wrap .mec-color-hover:hover,.mec-map-boxshow div .mec-map-view-event-detail.mec-event-detail i,.mec-map-boxshow div .mec-map-view-event-detail.mec-event-detail:hover,.mec-marker-infowindow-wp .mec-marker-infowindow-count,.mec-next-event-details a,.mec-next-event-details i:before,.mec-single-event .mec-speakers-details ul li .mec-speaker-name,.mec-skin-list-events-container .mec-data-fields-tooltip .mec-data-fields-tooltip-box ul .mec-event-data-field-item a,.mec-timeline-event .mec-modal-booking-button,.mec-timeline-month-divider,.mec-timetable-t2-col .mec-modal-booking-button:hover,.mec-wrap .mec-map-lightbox-wp.mec-event-list-classic .mec-event-date,.mec-wrap .mec-totalcal-box i,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-side .mec-next-month:hover,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-side .mec-next-month:hover .mec-load-month-link,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-side .mec-previous-month i,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-side .mec-previous-month:hover,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-side .mec-previous-month:hover .mec-load-month-link,.mec-wrap.colorskin-custom .mec-calendar.mec-event-calendar-classic .mec-selected-day,.mec-wrap.colorskin-custom .mec-calendar.mec-event-calendar-classic dt.mec-selected-day:hover,.mec-wrap.colorskin-custom .mec-color,.mec-wrap.colorskin-custom .mec-color-before :before,.mec-wrap.colorskin-custom .mec-color-hover:hover,.mec-wrap.colorskin-custom .mec-event-grid-simple .mec-event-title:hover,.mec-wrap.colorskin-custom .mec-event-list-classic a.magicmore:hover,.mec-wrap.colorskin-custom .mec-event-sharing-wrap .mec-event-sharing>li:hover a,.mec-wrap.colorskin-custom .mec-events-masonry-cats a.mec-masonry-cat-selected,.mec-wrap.colorskin-custom .mec-events-meta-group.mec-events-meta-group-venue:before,.mec-wrap.colorskin-custom .mec-infowindow-wp h5 a:hover,.mec-wrap.colorskin-custom .mec-next-event-details li i,.mec-wrap.colorskin-custom .mec-single-event .mec-event-meta dd.mec-events-event-categories:before,.mec-wrap.colorskin-custom .mec-single-event-date:before,.mec-wrap.colorskin-custom .mec-single-event-time:before,.mec-wrap.colorskin-custom .mec-totalcal-box .mec-totalcal-view span:hover,.mec-wrap.colorskin-custom .mec-widget .mec-event-grid-classic.owl-carousel .owl-nav i,.mec-wrap.mec-cart table tr td a,.mec-yearly-view-wrap .mec-agenda-event-title a:hover,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year i,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year:hover,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year:hover .mec-load-month-link,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year i,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year:hover,.mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year:hover .mec-load-month-link{color:var(--mec-color-skin)}.mec-event-list-standard .mec-event-meta svg path,.mec-wrap .mec-event-sharing-wrap .mec-event-sharing>li:hover a svg{fill:var(--mec-color-skin)}#wrap .mec-wrap article.mec-event-countdown-style1,.colorskin-custom .mec-event-sharing-wrap:hover>li,.event-carousel-type1-head .mec-event-date-carousel,.mec-booking button,.mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active,.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover,.mec-calendar .mec-has-event:after,.mec-event-countdown-style1 .mec-event-countdown-part3 a.mec-event-button,.mec-event-countdown-style3 .mec-event-date,.mec-events-progress-bar progress::-webkit-progress-value,.mec-events-progress-bar progress:after,.mec-has-event-for-booking.mec-active .mec-calendar-novel-selected-day,.mec-map-get-direction-btn-cnt input[type=submit],.mec-ongoing-normal-label,.mec-skin-carousel-container .mec-event-footer-carousel-type3 .mec-modal-booking-button:hover,.mec-wrap .flip-clock-wrapper ul li a div div.inn,.mec-wrap .mec-event-countdown-style2,.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,.mec-wrap.colorskin-custom .mec-bg-color,.mec-wrap.colorskin-custom .mec-bg-color-hover:hover,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-row dt.mec-has-event:hover,.mec-wrap.colorskin-custom .mec-calendar .mec-has-event:after,.mec-wrap.colorskin-custom .mec-calendar .mec-selected-day:hover,.mec-wrap.colorskin-custom .mec-calendar:not(.mec-event-calendar-classic) .mec-selected-day,.mec-wrap.colorskin-custom .mec-event-grid-clean .mec-event-date,.mec-wrap.colorskin-custom .mec-event-list-modern .mec-event-sharing .mec-event-share:hover .mec-event-sharing-icon,.mec-wrap.colorskin-custom .mec-event-list-modern .mec-event-sharing li:hover a i,.mec-wrap.colorskin-custom .mec-event-list-modern .mec-event-sharing>li:hover a i,.mec-wrap.colorskin-custom .mec-event-sharing .mec-event-share:hover .event-sharing-icon,.mec-wrap.colorskin-custom .mec-timeline-events-container .mec-timeline-event-date:before,.mec-wrap.colorskin-custom .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,span.mec-marker-wrap{background-color:var(--mec-color-skin)}.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover,.mec-calendar-day.mec-active .mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active{background-color:var(--mec-color-skin)}.colorskin-custom .mec-single-event .mec-events-meta-group-booking form>h4:before,.colorskin-custom .mec-single-event .mec-frontbox-title:before,.colorskin-custom .mec-single-event .mec-wrap-checkout h4:before,.event-carousel-type1-head .mec-event-date-carousel:after,.lity-content .mec-booking-progress-bar li.mec-active:after,.lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4:before,.lity-content .mec-events-meta-group-booking form>h4:before,.mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active,.mec-booking-tooltip.multiple-time .mec-booking-calendar-date:hover,.mec-box-title::before,.mec-calendar-day.mec-active .mec-booking-tooltip.multiple-time .mec-booking-calendar-date.mec-active,.mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout h4:before,.mec-events-meta-group-booking .mec-booking-shortcode form>h4:before,.mec-has-event-for-booking .mec-calendar-novel-selected-day,.mec-marker-infowindow-wp .mec-marker-infowindow-count,.mec-rsvp-form-box form>h4:before,.mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4:before,.mec-single-event .mec-events-meta-group-booking form>h4:before,.mec-single-event .mec-frontbox-title:before,.mec-single-event .mec-wrap-checkout h4:before,.mec-skin-carousel-container .mec-event-footer-carousel-type3 .mec-modal-booking-button:hover,.mec-timeline-month-divider,.mec-virtual-event-history h3:before,.mec-wrap .mec-box-title::before,.mec-wrap .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,.mec-wrap.colorskin-custom .mec-border-color,.mec-wrap.colorskin-custom .mec-border-color-hover:hover,.mec-wrap.colorskin-custom .mec-calendar .mec-calendar-events-side .mec-table-side-day,.mec-wrap.colorskin-custom .mec-event-list-modern .mec-event-sharing .mec-event-share:hover .mec-event-sharing-icon,.mec-wrap.colorskin-custom .mec-event-list-modern .mec-event-sharing>li:hover a i,.mec-wrap.colorskin-custom .mec-event-list-standard .mec-month-divider span:before,.mec-wrap.colorskin-custom .mec-events-masonry-cats a.mec-masonry-cat-selected,.mec-wrap.colorskin-custom .mec-events-masonry-cats a:hover,.mec-wrap.colorskin-custom .mec-single-event .mec-frontbox-title:before,.mec-wrap.colorskin-custom .mec-single-event .mec-social-single:before,.mec-wrap.colorskin-custom .mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a:hover img,.mec-wrap.colorskin-custom .mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected{border-color:var(--mec-color-skin)}.mec-calendar.mec-event-container-simple dl dt.mec-selected-day,.mec-calendar.mec-event-container-simple dl dt.mec-selected-day:hover,.mec-wrap.colorskin-custom .mec-event-countdown-style3 .mec-event-date:after,.mec-wrap.colorskin-custom .mec-month-divider span:before{border-bottom-color:var(--mec-color-skin)}.mec-wrap.colorskin-custom article.mec-event-countdown-style1 .mec-event-countdown-part2:after{border-color:transparent transparent transparent var(--mec-color-skin)}.lity-content .button,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button),.lity-content input[type=button],.lity-content input[type=reset],.lity-content input[type=submit],.mec-form-row .mec-book-form-next-button.mec-book-form-pay-button,.mec-nextprev-next-button,.mec-nextprev-prev-button,.mec-wrap .button,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button),.mec-wrap input[type=button],.mec-wrap input[type=reset],.mec-wrap input[type=submit]{color:var(--mec-color-skin);background:var(--mec-color-skin-rgba-1);border-color:var(--mec-color-skin-rgba-1)}.lity-content .button:hover,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover,.lity-content input[type=button]:hover,.lity-content input[type=reset]:hover,.lity-content input[type=submit]:hover,.mec-nextprev-next-button:hover,.mec-nextprev-prev-button:hover,.mec-wrap .button:hover,.mec-wrap a.button:hover,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover,.mec-wrap input[type=button]:hover,.mec-wrap input[type=reset]:hover,.mec-wrap input[type=submit]:hover{border-color:var(--mec-color-skin)}.lity-container .mec-events-meta-group-booking input[type=radio]:checked:before,.mec-events-meta-group-booking .mec-booking-shortcode input[type=radio]:checked:before,.mec-single-event .mec-events-meta-group-booking input[type=radio]:checked:before{background:var(--mec-color-skin);box-shadow:0 0 0 2px var(--mec-color-skin-rgba-1)}.lity-content .button svg path,.lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ) svg path,.lity-content input[type=button] svg path,.lity-content input[type=reset] svg path,.lity-content input[type=submit] svg path,.mec-nextprev-next-button svg path,.mec-nextprev-prev-button svg path,.mec-wrap .button svg path,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ) svg path,.mec-wrap input[type=button] svg path,.mec-wrap input[type=reset] svg path,.mec-wrap input[type=submit] svg path{fill:var(--mec-color-skin)}.mec-wrap .button svg.back path,.mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.et-fb-button) svg.back path{fill:#636f72}.mec-booking-calendar-month-navigation .mec-next-month:hover a,.mec-booking-calendar-month-navigation .mec-previous-month:hover a{color:var(--mec-color-skin)}.mec-wrap.colorskin-custom .mec-box-shadow-color{box-shadow:0 4px 22px -7px var(--mec-color-skin)}.mec-choosen-time-message,.mec-events-timeline-wrap:before,.mec-timeline-event .mec-modal-booking-button,.mec-wrap.colorskin-custom .mec-timeline-event-categories,.mec-wrap.colorskin-custom .mec-timeline-event-local-time,.mec-wrap.colorskin-custom .mec-timeline-event-location,.mec-wrap.colorskin-custom .mec-timeline-event-organizer,.mec-wrap.colorskin-custom .mec-timeline-event-time{background:var(--mec-color-skin-rgba-4)}@media only screen and (min-width:1200px){.mec-container,body [id*=mec_skin_].mec-fluent-wrap{width:var(--mec-container-normal-width);max-width:var(--mec-container-normal-width)}}@media only screen and (min-width:1921px){.mec-container,body [id*=mec_skin_].mec-fluent-wrap{width:var(--mec-container-large-width);max-width:var(--mec-container-large-width)}}.entry-content .mec-wrap h1 a,.entry-content .mec-wrap h2 a,.entry-content .mec-wrap h3 a,.entry-content .mec-wrap h4 a,.entry-content .mec-wrap h5 a,.entry-content .mec-wrap h6 a,.mec-wrap .mec-calendar .mec-event-article .mec-event-title a,.mec-wrap .mec-event-grid-classic .mec-event-title a,.mec-wrap .mec-event-grid-clean .mec-event-title a,.mec-wrap .mec-event-grid-minimal .mec-event-title a,.mec-wrap .mec-event-grid-modern .mec-event-title a,.mec-wrap .mec-event-grid-simple .mec-event-title a,.mec-wrap .mec-event-list-classic .mec-event-title a,.mec-wrap .mec-event-list-minimal .mec-event-title a,.mec-wrap .mec-event-list-standard .mec-event-title a,.mec-wrap .mec-wrap .mec-event-list-modern .mec-event-title a,.mec-wrap h1 a,.mec-wrap h2 a,.mec-wrap h3 a,.mec-wrap h4 a,.mec-wrap h5 a,.mec-wrap h6 a{color:var(--mec-title-color)}.entry-content .mec-wrap.colorskin-custom h1 a:hover,.entry-content .mec-wrap.colorskin-custom h2 a:hover,.entry-content .mec-wrap.colorskin-custom h3 a:hover,.entry-content .mec-wrap.colorskin-custom h4 a:hover,.entry-content .mec-wrap.colorskin-custom h5 a:hover,.entry-content .mec-wrap.colorskin-custom h6 a:hover,.mec-wrap .mec-calendar .mec-event-article .mec-event-title a:hover,.mec-wrap .mec-event-grid-classic .mec-event-title a:hover,.mec-wrap .mec-event-grid-clean .mec-event-title a:hover,.mec-wrap .mec-event-grid-minimal .mec-event-title a:hover,.mec-wrap .mec-event-grid-modern .mec-event-title a:hover,.mec-wrap .mec-event-grid-simple .mec-event-title a:hover,.mec-wrap .mec-event-list-classic .mec-event-title a:hover,.mec-wrap .mec-event-list-minimal .mec-event-title a:hover,.mec-wrap .mec-event-list-standard .mec-event-title a:hover,.mec-wrap .mec-wrap .mec-event-list-modern .mec-event-title a:hover,.mec-wrap.colorskin-custom h1 a:hover,.mec-wrap.colorskin-custom h2 a:hover,.mec-wrap.colorskin-custom h3 a:hover,.mec-wrap.colorskin-custom h4 a:hover,.mec-wrap.colorskin-custom h5 a:hover,.mec-wrap.colorskin-custom h6 a:hover{color:var(--mec-title-color-hover)}.mec-wrap.colorskin-custom .mec-event-description{color:var(--mec-content-color)}.mec-fes-form #mec_bfixed_form_field_types .button,.mec-fes-form #mec_bfixed_form_field_types .button:before,.mec-fes-form #mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button,.mec-fes-form #mec_reg_form_field_types .button,.mec-fes-form #mec_reg_form_field_types .button:before,.mec-fes-form .html-active .switch-html,.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .mec-booking-attendees-tooltip:before,.mec-fes-form .mec-form-row .button:not(.wp-color-result),.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small,.mec-fes-form .mec-meta-box-fields h4,.mec-fes-form .mec-meta-box-fields h4 label,.mec-fes-form .mec-title span.mec-dashicons,.mec-fes-form .tmce-active .switch-tmce,.mec-fes-form .wp-editor-tabs .wp-switch-editor:active,.mec-fes-form input[type=file],.mec-fes-list ul li a:hover{color:var(--mec-fes-main-color)}.mec-fes-form #mec_reg_form_field_types .button.red:hover,.mec-fes-form #mec_reg_form_field_types .button:hover,.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover,.mec-fes-form .mec-form-row .quicktags-toolbar input.button.button-small:hover,.mec-fes-form button[type=submit].mec-fes-sub-button,.mec-fes-list ul li .mec-fes-event-edit a:hover,.mec-fes-list ul li .mec-fes-event-export a:hover,.mec-fes-list ul li .mec-fes-event-view a:hover{background:var(--mec-fes-main-color);color:#fff}.mec-fes-form #mec_bfixed_form_fields input[type=checkbox]:hover,.mec-fes-form #mec_bfixed_form_fields input[type=radio]:hover,.mec-fes-form #mec_reg_form_field_types .button.red:hover,.mec-fes-form #mec_reg_form_field_types .button:hover,.mec-fes-form #mec_reg_form_fields input[type=checkbox]:hover,.mec-fes-form #mec_reg_form_fields input[type=radio]:hover,.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix:first-child,.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover,.mec-fes-form input[type=checkbox]:hover,.mec-fes-form input[type=file],.mec-fes-form input[type=radio]:hover,.mec-fes-list ul li .mec-fes-event-edit a:hover,.mec-fes-list ul li .mec-fes-event-export a:hover,.mec-fes-list ul li .mec-fes-event-view a:hover{border-color:var(--mec-fes-main-color)}.mec-fes-form button[type=submit].mec-fes-sub-button{box-shadow:0 2px 8px -4px var(--mec-fes-main-color)}.mec-fes-form button[type=submit].mec-fes-sub-button:hover{box-shadow:0 2px 12px -2px var(--mec-fes-main-color)}.mec-fes-form #mec_bfixed_form_fields input[type=checkbox]:checked,.mec-fes-form #mec_bfixed_form_fields input[type=radio]:checked,.mec-fes-form #mec_reg_form_fields input[type=checkbox]:checked,.mec-fes-form #mec_reg_form_fields input[type=radio]:checked,.mec-fes-form .mec-form-row input[type=checkbox]:checked,.mec-fes-form .mec-form-row input[type=radio]:checked{box-shadow:0 1px 6px -2px var(--mec-fes-main-color) inset 0 0 0 3px #fff;border-color:var(--mec-fes-main-color);background:var(--mec-fes-main-color)}.mec-fes-form .mec-available-color-row span.color-selected{box-shadow:0 0 0 2px var(--mec-fes-main-color),0 2px 8px -1px var(--mec-fes-main-color)}.mec-fes-form #mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button,.mec-fes-form .mce-tinymce.mce-container.mce-panel,.mec-fes-form .mec-form-row .button:not(.wp-color-result):hover{box-shadow:0 2px 6px -3px var(--mec-fes-main-color)}.mec-fes-form,.mec-fes-form .html-active .switch-html,.mec-fes-form .mec-attendees-wrapper .mec-attendees-list .w-clearfix,.mec-fes-form .tmce-active .switch-tmce,.mec-fes-form .wp-editor-tabs .wp-switch-editor:active,.mec-fes-list{background:var(--mec-fes-main-color-rgba-1)}.mec-fes-form .mec-meta-box-fields h4,.mec-fes-form .quicktags-toolbar,.mec-fes-form div.mce-toolbar-grp{background:var(--mec-fes-main-color-rgba-2)}.mec-fes-form ul#mec_bfixed_form_fields li,.mec-fes-form ul#mec_reg_form_fields li{background:var(--mec-fes-main-color-rgba-3)}.mec-fes-form #mec-event-data input[type=date],.mec-fes-form #mec_bfixed_form_field_types .button,.mec-fes-form #mec_bfixed_form_fields input[type=checkbox],.mec-fes-form #mec_bfixed_form_fields input[type=radio],.mec-fes-form #mec_meta_box_tickets_form [id^=mec_ticket_row] .mec_add_price_date_button,.mec-fes-form #mec_reg_form_field_types .button,.mec-fes-form #mec_reg_form_fields input[type=checkbox],.mec-fes-form #mec_reg_form_fields input[type=radio],.mec-fes-form .mce-tinymce.mce-container.mce-panel,.mec-fes-form .mce-toolbar .mce-btn-group .mce-btn.mce-listbox,.mec-fes-form .mec-form-row .button:not(.wp-color-result),.mec-fes-form .mec-meta-box-fields,.mec-fes-form .quicktags-toolbar,.mec-fes-form .wp-editor-tabs .wp-switch-editor,.mec-fes-form div.mce-toolbar-grp,.mec-fes-form input[type=checkbox],.mec-fes-form input[type=email],.mec-fes-form input[type=number],.mec-fes-form input[type=password],.mec-fes-form input[type=radio],.mec-fes-form input[type=tel],.mec-fes-form input[type=text],.mec-fes-form input[type=url],.mec-fes-form select,.mec-fes-form textarea,.mec-fes-form ul#mec_bfixed_form_fields li,.mec-fes-form ul#mec_reg_form_fields li,.mec-fes-list ul li{border-color:var(--mec-fes-main-color-rgba-4)}.mec-fes-form #mec-event-data input[type=date],.mec-fes-form input[type=email],.mec-fes-form input[type=number],.mec-fes-form input[type=password],.mec-fes-form input[type=tel],.mec-fes-form input[type=text],.mec-fes-form input[type=url],.mec-fes-form select,.mec-fes-form textarea{box-shadow:0 2px 5px var(--mec-fes-main-color-rgba-5) inset}.mec-fes-form .mec-form-row .button:not(.wp-color-result),.mec-fes-list ul li{box-shadow:0 2px 6px -4px var(--mec-fes-main-color-rgba-6)}.mec-fes-form #mec_bfixed_form_field_types .button,.mec-fes-form #mec_reg_form_field_types .button,.mec-fes-form .mec-meta-box-fields{box-shadow:0 2px 6px -3px var(--mec-fes-main-color-rgba-6)}.mec-fes-form .quicktags-toolbar,.mec-fes-form div.mce-toolbar-grp{box-shadow:0 1px 0 1px var(--mec-fes-main-color-rgba-6)}.mec-fes-form #mec_bfixed_form_fields input[type=checkbox],.mec-fes-form #mec_bfixed_form_fields input[type=radio],.mec-fes-form #mec_reg_form_fields input[type=checkbox],.mec-fes-form #mec_reg_form_fields input[type=radio],.mec-fes-form input[type=checkbox],.mec-fes-form input[type=radio]{box-shadow:0 1px 3px -1px var(--mec-fes-main-color-rgba-6)}.mec-fluent-current-time-text,.mec-fluent-wrap .mec-agenda-event>i,.mec-fluent-wrap .mec-available-tickets-details i:before,.mec-fluent-wrap .mec-calendar .mec-week-events-container dl>span,.mec-fluent-wrap .mec-calendar.mec-calendar-daily .mec-calendar-d-table.mec-date-labels-container span,.mec-fluent-wrap .mec-calendar.mec-yearly-calendar .mec-calendar-table-head dl dt:first-letter,.mec-fluent-wrap .mec-daily-view-events-left-side .mec-daily-view-events-item>span.mec-time,.mec-fluent-wrap .mec-daily-view-events-left-side .mec-daily-view-events-item>span.mec-time-end,.mec-fluent-wrap .mec-date-details i:before,.mec-fluent-wrap .mec-date-details:before,.mec-fluent-wrap .mec-date-wrap i,.mec-fluent-wrap .mec-event-article .mec-event-title a:hover,.mec-fluent-wrap .mec-event-carousel-type2 .owl-next i,.mec-fluent-wrap .mec-event-carousel-type2 .owl-prev i,.mec-fluent-wrap .mec-event-location i,.mec-fluent-wrap .mec-event-location i:before,.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing li:hover a,.mec-fluent-wrap .mec-more-events-icon,.mec-fluent-wrap .mec-price-details i:before,.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next,.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next i,.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev,.mec-fluent-wrap .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev i,.mec-fluent-wrap .mec-text-input-search i,.mec-fluent-wrap .mec-time-details:before,.mec-fluent-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-fluent-wrap .mec-totalcal-box .nice-select,.mec-fluent-wrap .mec-totalcal-box .nice-select .list li,.mec-fluent-wrap .mec-totalcal-box .nice-select:after,.mec-fluent-wrap .mec-totalcal-box input,.mec-fluent-wrap .mec-totalcal-box select,.mec-fluent-wrap .mec-venue-details:before,.mec-fluent-wrap.colorskin-custom .mec-color-before :before,.mec-fluent-wrap.mec-skin-masonry-container .mec-events-masonry-cats a.mec-masonry-cat-selected,.mec-fluent-wrap.mec-skin-masonry-container .mec-events-masonry-cats a:hover,.mec-fluent-wrap.mec-timetable-wrap .mec-cell .mec-time,.mec-single-fluent-wrap .mec-event-schedule-content dl dt.mec-schedule-time:before,.mec-single-fluent-wrap .mec-events-meta-group-countdown .mec-end-counts h3,.mec-single-fluent-wrap .mec-local-time-details li:first-child:before,.mec-single-fluent-wrap .mec-local-time-details li:last-child:before,.mec-single-fluent-wrap .mec-local-time-details li:nth-of-type(2):before,.mec-single-fluent-wrap .mec-marker-infowindow-wp .mec-marker-infowindow-count,.mec-single-fluent-wrap .mec-next-event-details a,.mec-single-fluent-wrap .mec-next-event-details i:before,.mec-single-fluent-wrap .mec-single-event-additional-organizers dd i,.mec-single-fluent-wrap .mec-single-event-additional-organizers dd.mec-organizer-description:before,.mec-single-fluent-wrap .mec-single-event-bar>div i,.mec-single-fluent-wrap .mec-single-event-category a,.mec-single-fluent-wrap .mec-single-event-location i,.mec-single-fluent-wrap .mec-single-event-organizer dd i,.mec-single-fluent-wrap .mec-single-event-organizer dd.mec-organizer-description:before{color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-totalcal-box input[type=search]::-webkit-input-placeholder{color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-totalcal-box input[type=search]::-moz-placeholder{color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-totalcal-box input[type=search]:-ms-input-placeholder{color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-totalcal-box input[type=search]:-moz-placeholder{color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt.mec-table-nullday,.mec-single-fluent-body .lity-content input::-moz-placeholder,.mec-single-fluent-body .lity-content textarea::-moz-placeholder,.mec-single-fluent-wrap input::-moz-placeholder,.mec-single-fluent-wrap textarea::-moz-placeholder{color:var(--mec-fluent-main-color-rgba-1)}.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:hover,.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-social-icon i{color:var(--mec-fluent-main-color-rgba-2)}.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type1 .mec-booking-button:hover,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type3 .mec-booking-button:hover,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type4 .mec-booking-button:hover{color:var(--mec-fluent-main-color)}.mec-fluent-wrap.mec-skin-list-wrap .mec-event-article{border-top-color:var(--mec-fluent-main-color);border-left-color:var(--mec-fluent-main-color);border-bottom-color:var(--mec-fluent-main-color)}.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article .mec-event-content{border-right-color:var(--mec-fluent-main-color);border-left-color:var(--mec-fluent-main-color);border-bottom-color:var(--mec-fluent-main-color)}.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article .mec-event-image{border-right-color:var(--mec-fluent-main-color);border-left-color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-calendar-a-month,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week,.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic .mec-calendar-table-head,.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing,.mec-fluent-wrap .mec-filter-content,.mec-fluent-wrap .mec-load-month,.mec-fluent-wrap .mec-load-more-button:hover,.mec-fluent-wrap .mec-load-year,.mec-fluent-wrap .mec-skin-monthly-view-month-navigator-container,.mec-fluent-wrap .mec-text-input-search input[type=search],.mec-fluent-wrap .mec-totalcal-box .mec-totalcal-view span,.mec-fluent-wrap .mec-totalcal-box .nice-select,.mec-fluent-wrap .mec-totalcal-box input,.mec-fluent-wrap .mec-totalcal-box select,.mec-fluent-wrap .mec-yearly-title-sec,.mec-fluent-wrap .mec-yearly-view-wrap .mec-year-container,.mec-fluent-wrap i.mec-filter-icon,.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda-wrap,.mec-single-fluent-wrap .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a:hover,.mec-single-fluent-wrap .mec-event-schedule-content dl,.mec-single-fluent-wrap .mec-event-schedule-content dl:before,.mec-single-fluent-wrap .mec-event-schedule-content dl:first-of-type:after,.mec-single-fluent-wrap .mec-next-event-details a:hover{border-color:var(--mec-fluent-main-color)}.mec-fluent-current-time-first,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-load-week,.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:first-of-type{border-left-color:var(--mec-fluent-main-color)}.mec-fluent-current-time-last,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week,.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt:last-of-type{border-right-color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl:last-of-type dt,.mec-fluent-wrap .mec-filter-content:before,.mec-fluent-wrap .mec-more-events,.mec-fluent-wrap.mec-skin-full-calendar-container>.mec-totalcal-box .mec-totalcal-view .mec-fluent-more-views-content:before{border-bottom-color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-event-sharing-wrap .mec-event-sharing:before{border-color:var(--mec-fluent-main-color) transparent transparent transparent}.mec-fluent-wrap .mec-event-meta,.mec-fluent-wrap.mec-timetable-wrap .mec-cell{border-left-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-wrap .mec-daily-view-events-left-side,.mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-calendar-sec{border-right-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-wrap.mec-events-agenda-container .mec-agenda-events-wrap{border-left-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-wrap .mec-more-events .simple-skin-ended:hover,.mec-fluent-wrap dt .mec-more-events .simple-skin-ended:hover,.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda,.mec-fluent-wrap.mec-skin-slider-container .mec-slider-t1 .mec-slider-t1-content{border-top-color:var(--mec-fluent-main-color-rgba-3);border-bottom-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-wrap .mec-calendar.mec-calendar-daily .mec-calendar-d-table,.mec-fluent-wrap.mec-skin-countdown-container .mec-date-wrap,.mec-fluent-wrap.mec-timetable-wrap .mec-cell,.mec-fluent-wrap.mec-timetable-wrap .mec-ttt2-title{border-bottom-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-wrap .mec-calendar .mec-week-events-container dt,.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic dl dt,.mec-fluent-wrap .mec-event-countdown li,.mec-fluent-wrap .mec-event-countdown-style3 .mec-event-countdown li,.mec-fluent-wrap .mec-filter-content i,.mec-fluent-wrap .mec-load-more-button,.mec-fluent-wrap .mec-skin-daily-view-events-container,.mec-fluent-wrap .mec-skin-weekly-view-events-container,.mec-fluent-wrap .mec-totalcal-box .nice-select .list,.mec-fluent-wrap .mec-yearly-view-wrap .mec-agenda-event,.mec-fluent-wrap .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar,.mec-fluent-wrap.mec-timetable-wrap .mec-timetable-t2-wrap,.mec-single-fluent-wrap .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a,.mec-single-fluent-wrap .mec-event-schedule,.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a,.mec-single-fluent-wrap .mec-events-meta-group,.mec-single-fluent-wrap .mec-events-meta-group-booking .nice-select,.mec-single-fluent-wrap .mec-events-meta-group-countdown .countdown-w .block-w,.mec-single-fluent-wrap .mec-events-meta-group-tags a,.mec-single-fluent-wrap .mec-map-get-direction-address-cnt input.mec-map-get-direction-address,.mec-single-fluent-wrap .mec-marker-infowindow-wp .mec-marker-infowindow-count,.mec-single-fluent-wrap .mec-next-event-details a,.mec-single-fluent-wrap .mec-single-links-wrap{border-color:var(--mec-fluent-main-color-rgba-1)}.mec-fluent-wrap .mec-totalcal-box .nice-select:after{border-right-color:var(--mec-fluent-main-color);border-bottom-color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-totalcal-box .nice-select .list,.mec-single-fluent-wrap .mec-booking-button,.mec-single-fluent-wrap .mec-events-meta-group-tags a:hover{box-shadow:0 2px 5px var(--mec-fluent-main-color-rgba-4)}.mec-fluent-bg-wrap .mec-fluent-wrap article .mec-booking-button:hover,.mec-fluent-wrap .mec-booking-button:hover,.mec-fluent-wrap .mec-load-more-button:hover{box-shadow:0 4px 10px var(--mec-fluent-main-color-rgba-4)}.mec-fluent-wrap.mec-skin-grid-wrap .mec-event-article,.mec-single-fluent-wrap .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a:hover,.mec-single-fluent-wrap .mec-next-event-details a:hover{box-shadow:0 4px 10px var(--mec-fluent-main-color-rgba-5)}.mec-single-fluent-wrap .mec-events-meta-group-booking input[type=radio]:checked:before{box-shadow:0 0 0 2px var(--mec-fluent-main-color-rgba-4)}.mec-fluent-wrap .mec-calendar-side .mec-calendar-table,.mec-fluent-wrap .mec-skin-daily-view-events-container,.mec-fluent-wrap .mec-yearly-view-wrap .mec-year-container,.mec-fluent-wrap.mec-events-agenda-container .mec-events-agenda-wrap,.mec-fluent-wrap.mec-timetable-wrap .mec-timetable-t2-wrap{box-shadow:0 5px 33px var(--mec-fluent-main-color-rgba-1)}.mec-fluent-wrap .mec-yearly-view-wrap .mec-agenda-event{box-shadow:0 1px 6px var(--mec-fluent-main-color-rgba-6)}.mec-fluent-wrap .mec-calendar-daily .mec-calendar-day-events,.mec-fluent-wrap .mec-more-events .simple-skin-ended:hover,.mec-fluent-wrap .mec-totalcal-box .nice-select .list li.focus,.mec-fluent-wrap .mec-totalcal-box .nice-select .list li:hover,.mec-fluent-wrap .mec-yearly-view-wrap .mec-yearly-agenda-sec,.mec-fluent-wrap .nicescroll-cursors,.mec-fluent-wrap dt .mec-more-events .simple-skin-ended:hover,.mec-fluent-wrap.mec-skin-countdown-container .mec-date-wrap,.mec-single-fluent-wrap .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li a:hover,.mec-single-fluent-wrap .mec-events-meta-group-tags a:hover,.mec-single-fluent-wrap .mec-next-event-details a:hover,.mec-single-fluent-wrap .mec-related-event-post .mec-date-wrap,.mec-single-fluent-wrap .mec-single-event-category a{background-color:var(--mec-fluent-main-color-rgba-3)}.mec-fluent-current-time,.mec-fluent-wrap h5.mec-more-events-header,.mec-single-fluent-wrap .flip-clock-wrapper ul li a div div.inn{background-color:var(--mec-fluent-main-color)}.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top dt.active,.mec-fluent-wrap .mec-filter-content i,.mec-fluent-wrap i.mec-filter-icon.active,.mec-fluent-wrap.mec-skin-carousel-container .mec-event-carousel-type2 .owl-next:hover,.mec-fluent-wrap.mec-skin-carousel-container .mec-event-carousel-type2 .owl-prev:hover,.mec-fluent-wrap.mec-skin-cover-container .mec-date-wrap i,.mec-fluent-wrap.mec-skin-full-calendar-container>.mec-totalcal-box .mec-totalcal-view span.mec-fluent-more-views-icon.active,.mec-fluent-wrap.mec-skin-full-calendar-container>.mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,.mec-fluent-wrap.mec-skin-slider-container .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-next:hover,.mec-fluent-wrap.mec-skin-slider-container .mec-slider-t1-wrap .mec-owl-theme .owl-nav .owl-prev:hover,.mec-single-event-bar-seperator,.mec-single-fluent-body .lity-content .mec-events-meta-group-booking,.mec-single-fluent-wrap .mec-events-meta-group-countdown{background-color:var(--mec-fluent-main-color-rgba-1)}.mec-fluent-wrap .mec-available-tickets-details span.mec-available-tickets-number,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top .mec-current-week,.mec-fluent-wrap .mec-calendar-weekly .mec-calendar-d-top dt.active,.mec-fluent-wrap .mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt.active,.mec-fluent-wrap .mec-color,.mec-fluent-wrap .mec-daily-view-events-left-side h5.mec-daily-today-title span:first-child,.mec-fluent-wrap .mec-event-sharing-wrap>li:first-of-type i,.mec-fluent-wrap .mec-filter-content i,.mec-fluent-wrap .mec-load-month i,.mec-fluent-wrap .mec-load-more-button,.mec-fluent-wrap .mec-load-year i,.mec-fluent-wrap a:hover,.mec-fluent-wrap i.mec-filter-icon,.mec-fluent-wrap.mec-skin-available-spot-container .mec-date-wrap span.mec-event-day-num,.mec-fluent-wrap.mec-skin-carousel-container .event-carousel-type2-head .mec-date-wrap span.mec-event-day-num,.mec-fluent-wrap.mec-skin-countdown-container .mec-date-wrap span.mec-event-day-num,.mec-fluent-wrap.mec-skin-cover-container .mec-date-wrap span.mec-event-day-num,.mec-fluent-wrap.mec-skin-full-calendar-container>.mec-totalcal-box .mec-totalcal-view span.mec-totalcalview-selected,.mec-fluent-wrap.mec-skin-masonry-container .mec-masonry .mec-date-wrap span.mec-event-day-num,.mec-fluent-wrap.mec-skin-slider-container .mec-date-wrap span.mec-event-day-num,.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover,.mec-single-fluent-wrap .mec-events-meta-group-tags .mec-event-footer a:hover,.mec-single-fluent-wrap .mec-related-event-post .mec-date-wrap span.mec-event-day-num,.mec-single-fluent-wrap .mec-single-event-category a:hover,.mec-wrap .mec-color-hover:hover{color:var(--mec-fluent-bold-color)}.mec-fluent-wrap .mec-load-month,.mec-fluent-wrap .mec-load-year,.mec-fluent-wrap.mec-skin-carousel-container .mec-owl-theme .owl-dots .owl-dot.active span,.mec-single-fluent-body .lity-content .mec-events-meta-group-booking .mec-book-available-tickets-details>.mec-book-available-tickets-details-header,.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover,.mec-single-fluent-wrap .mec-events-meta-group-booking .mec-book-available-tickets-details>.mec-book-available-tickets-details-header{border-color:var(--mec-fluent-bold-color)}.mec-fluent-wrap .mec-calendar .mec-daily-view-day.mec-has-event:after,.mec-fluent-wrap .mec-event-cover-fluent-type2 .mec-event-sharing-wrap:hover>li:first-child,.mec-fluent-wrap.mec-single-fluent-wrap .mec-events-meta-group-booking button,.mec-fluent-wrap.mec-skin-carousel-container .mec-owl-theme .owl-dots .owl-dot.active span,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type1 .mec-booking-button,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type2 .mec-date-wrap,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type3 .mec-booking-button,.mec-fluent-wrap.mec-skin-cover-container .mec-event-cover-fluent-type4 .mec-booking-button,.mec-single-fluent-body .lity-content .mec-events-meta-group-booking button,.mec-single-fluent-wrap .mec-events-meta-group-booking input[type=radio]:checked:before{background-color:var(--mec-fluent-bold-color)}.mec-fluent-wrap .mec-booking-button:hover,.mec-fluent-wrap .mec-load-month:hover,.mec-fluent-wrap .mec-load-more-button:hover,.mec-fluent-wrap .mec-load-year:hover,.mec-fluent-wrap .mec-yearly-view-wrap .mec-calendar.mec-yearly-calendar .mec-has-event:after,.mec-wrap.mec-single-fluent-wrap .button:hover,.mec-wrap.mec-single-fluent-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not( .owl-next ):not(.mec-googlemap-details button):not(.mec-googlemap-skin button):hover,.mec-wrap.mec-single-fluent-wrap input[type=button]:hover,.mec-wrap.mec-single-fluent-wrap input[type=reset]:hover,.mec-wrap.mec-single-fluent-wrap input[type=submit]:hover{background-color:var(--mec-fluent-bg-hover-color)}.mec-fluent-wrap{background-color:var(--mec-fluent-bg-color)}.mec-fluent-wrap .mec-filter-content,.mec-fluent-wrap.mec-skin-masonry-container .mec-masonry .mec-date-wrap,.mec-single-fluent-wrap .mec-event-social li.mec-event-social-icon a:hover{background-color:var(--mec-fluent-second-bg-color)}.mec-fluent-wrap .mec-filter-content:after{border-bottom-color:var(--mec-fluent-second-bg-color)}@media only screen and (min-width:1200px){.mec-theme-saga .mec-container,body [id*=mec_skin_].mec-fluent-wrap{width:inherit;max-width:inherit}}.mec-theme-saga .mec-wrap h1,.mec-theme-saga .mec-wrap h2,.mec-theme-saga .mec-wrap h3,.mec-theme-saga .mec-wrap h4,.mec-theme-saga .mec-wrap h5,.mec-theme-saga .mec-wrap h6{text-align:inherit}.mec-theme-saga .mec-gCalendar h1:after,.mec-theme-saga .mec-gCalendar h2:after,.mec-theme-saga .mec-gCalendar h3:after,.mec-theme-saga .mec-gCalendar h4:after,.mec-theme-saga .mec-gCalendar h5:after,.mec-theme-saga .mec-gCalendar h6:after,.mec-theme-saga .mec-wrap h1:after,.mec-theme-saga .mec-wrap h2:after,.mec-theme-saga .mec-wrap h3:after,.mec-theme-saga .mec-wrap h4:after,.mec-theme-saga .mec-wrap h5:after,.mec-theme-saga .mec-wrap h6:after{display:none}.mec-theme-saga .mec-wrap a img{opacity:1;padding:0;border:none;-webkit-transition:unset;-moz-transition:unset;-o-transition:unset;transition:unset;background:0 0;border-color:unset}.mec-theme-saga .mec-wrap input[type=date],.mec-theme-saga .mec-wrap input[type=datetime-local],.mec-theme-saga .mec-wrap input[type=datetime],.mec-theme-saga .mec-wrap input[type=email],.mec-theme-saga .mec-wrap input[type=month],.mec-theme-saga .mec-wrap input[type=number],.mec-theme-saga .mec-wrap input[type=password],.mec-theme-saga .mec-wrap input[type=search],.mec-theme-saga .mec-wrap input[type=tel],.mec-theme-saga .mec-wrap input[type=text],.mec-theme-saga .mec-wrap input[type=time],.mec-theme-saga .mec-wrap input[type=url],.mec-theme-saga .mec-wrap input[type=week],.mec-theme-saga .mec-wrap select,.mec-theme-saga .mec-wrap textarea{opacity:1;-webkit-transition:unset;-moz-transition:unset;-o-transition:unset;transition:unset}.mec-theme-saga .mec-wrap ol,.mec-theme-saga .mec-wrap ul{margin:0}.mec-theme-saga .mec-wrap dl,.mec-theme-saga .mec-wrap dt{margin:0}.mec-theme-saga .mec-single-event{padding-top:15px}.mec-single-event .mec-events-meta-group-booking form>h4,.mec-theme-saga .lity-content .mec-events-meta-group-booking .mec-wrap-checkout h4,.mec-theme-saga .lity-content .mec-events-meta-group-booking form>h4,.mec-theme-saga .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout h4,.mec-theme-saga .mec-events-meta-group-booking .mec-booking-shortcode form>h4,.mec-theme-saga .mec-single-event .mec-events-meta-group-booking .mec-wrap-checkout h4,.mec-theme-saga .mec-single-event .mec-frontbox-title,.mec-theme-saga .mec-single-event .mec-wrap-checkout h4{text-align:center}.mec-event-banner-inner .mec-single-event-location>i{display:none}span.load-more-text{text-decoration:underline;margin-left:5px;cursor:pointer;position:relative}span.load-more-text:before{content:"";width:100px;height:24px;position:absolute;top:0;right:calc(100% + 5px);background-image:linear-gradient(90deg,#0000 0,#fff 100%);z-index:1}.mec-event-meta img.mec-custom-image-icon{width:20px} \ No newline at end of file diff --git a/assets/css/iconfonts.css b/assets/css/iconfonts.css new file mode 100755 index 0000000..86a0983 --- /dev/null +++ b/assets/css/iconfonts.css @@ -0,0 +1,3431 @@ +/* FONTS PATH */ + +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), + url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), + url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), + url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); +} + +@font-face { + font-family: 'simple-line-icons'; + src: url('../fonts/Simple-Line-Icons.eot'); + src: url('../fonts/Simple-Line-Icons.eot?#iefix') format('embedded-opentype'), + url('../fonts/Simple-Line-Icons.ttf') format('truetype'), + url('../fonts/Simple-Line-Icons.woff2') format('woff2'), + url('../fonts/Simple-Line-Icons.woff') format('woff'), + url('../fonts/Simple-Line-Icons.svg?#simple-line-icons') format('svg'); +} + + +[class*="mec-fa-"], +[class*="mec-li_"], +[class*="mec-sl-"] { + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class*="mec-fa-"] { + font-family: FontAwesome; +} + +[class*="mec-sl-"] { + font-family: 'simple-line-icons'; +} + + +/* Font Awesome icons */ +.mec-fa-glass:before { + content: "\f000"; +} + +.mec-fa-music:before { + content: "\f001"; +} + +.mec-fa-search:before { + content: "\f002"; +} + +.mec-fa-envelope-o:before { + content: "\f003"; +} + +.mec-fa-heart:before { + content: "\f004"; +} + +.mec-fa-star:before { + content: "\f005"; +} + +.mec-fa-star-o:before { + content: "\f006"; +} + +.mec-fa-user:before { + content: "\f007"; +} + +.mec-fa-film:before { + content: "\f008"; +} + +.mec-fa-th-large:before { + content: "\f009"; +} + +.mec-fa-th:before { + content: "\f00a"; +} + +.mec-fa-th-list:before { + content: "\f00b"; +} + +.mec-fa-check:before { + content: "\f00c"; +} + +.mec-fa-close:before, +.mec-fa-remove:before, +.mec-fa-times:before { + content: "\f00d"; +} + +.mec-fa-search-plus:before { + content: "\f00e"; +} + +.mec-fa-search-minus:before { + content: "\f010"; +} + +.mec-fa-power-off:before { + content: "\f011"; +} + +.mec-fa-signal:before { + content: "\f012"; +} + +.mec-fa-cog:before, +.mec-fa-gear:before { + content: "\f013"; +} + +.mec-fa-trash-o:before { + content: "\f014"; +} + +.mec-fa-home:before { + content: "\f015"; +} + +.mec-fa-file-o:before { + content: "\f016"; +} + +.mec-fa-clock-o:before { + content: "\f017"; +} + +.mec-fa-road:before { + content: "\f018"; +} + +.mec-fa-download:before { + content: "\f019"; +} + +.mec-fa-arrow-circle-o-down:before { + content: "\f01a"; +} + +.mec-fa-arrow-circle-o-up:before { + content: "\f01b"; +} + +.mec-fa-inbox:before { + content: "\f01c"; +} + +.mec-fa-play-circle-o:before { + content: "\f01d"; +} + +.mec-fa-repeat:before, +.mec-fa-rotate-right:before { + content: "\f01e"; +} + +.mec-fa-refresh:before { + content: "\f021"; +} + +.mec-fa-list-alt:before { + content: "\f022"; +} + +.mec-fa-lock:before { + content: "\f023"; +} + +.mec-fa-flag:before { + content: "\f024"; +} + +.mec-fa-headphones:before { + content: "\f025"; +} + +.mec-fa-volume-off:before { + content: "\f026"; +} + +.mec-fa-volume-down:before { + content: "\f027"; +} + +.mec-fa-volume-up:before { + content: "\f028"; +} + +.mec-fa-qrcode:before { + content: "\f029"; +} + +.mec-fa-barcode:before { + content: "\f02a"; +} + +.mec-fa-tag:before { + content: "\f02b"; +} + +.mec-fa-tags:before { + content: "\f02c"; +} + +.mec-fa-book:before { + content: "\f02d"; +} + +.mec-fa-bookmark:before { + content: "\f02e"; +} + +.mec-fa-print:before { + content: "\f02f"; +} + +.mec-fa-camera:before { + content: "\f030"; +} + +.mec-fa-font:before { + content: "\f031"; +} + +.mec-fa-bold:before { + content: "\f032"; +} + +.mec-fa-italic:before { + content: "\f033"; +} + +.mec-fa-text-height:before { + content: "\f034"; +} + +.mec-fa-text-width:before { + content: "\f035"; +} + +.mec-fa-align-left:before { + content: "\f036"; +} + +.mec-fa-align-center:before { + content: "\f037"; +} + +.mec-fa-align-right:before { + content: "\f038"; +} + +.mec-fa-align-justify:before { + content: "\f039"; +} + +.mec-fa-list:before { + content: "\f03a"; +} + +.mec-fa-dedent:before, +.mec-fa-outdent:before { + content: "\f03b"; +} + +.mec-fa-indent:before { + content: "\f03c"; +} + +.mec-fa-video-camera:before { + content: "\f03d"; +} + +.mec-fa-image:before, +.mec-fa-photo:before, +.mec-fa-picture-o:before { + content: "\f03e"; +} + +.mec-fa-pencil:before { + content: "\f040"; +} + +.mec-fa-map-marker:before { + content: "\f041"; +} + +.mec-fa-adjust:before { + content: "\f042"; +} + +.mec-fa-tint:before { + content: "\f043"; +} + +.mec-fa-edit:before, +.mec-fa-pencil-square-o:before { + content: "\f044"; +} + +.mec-fa-share-square-o:before { + content: "\f045"; +} + +.mec-fa-check-square-o:before { + content: "\f046"; +} + +.mec-fa-arrows:before { + content: "\f047"; +} + +.mec-fa-step-backward:before { + content: "\f048"; +} + +.mec-fa-fast-backward:before { + content: "\f049"; +} + +.mec-fa-backward:before { + content: "\f04a"; +} + +.mec-fa-play:before { + content: "\f04b"; +} + +.mec-fa-pause:before { + content: "\f04c"; +} + +.mec-fa-stop:before { + content: "\f04d"; +} + +.mec-fa-forward:before { + content: "\f04e"; +} + +.mec-fa-fast-forward:before { + content: "\f050"; +} + +.mec-fa-step-forward:before { + content: "\f051"; +} + +.mec-fa-eject:before { + content: "\f052"; +} + +.mec-fa-chevron-left:before { + content: "\f053"; +} + +.mec-fa-chevron-right:before { + content: "\f054"; +} + +.mec-fa-plus-circle:before { + content: "\f055"; +} + +.mec-fa-minus-circle:before { + content: "\f056"; +} + +.mec-fa-times-circle:before { + content: "\f057"; +} + +.mec-fa-check-circle:before { + content: "\f058"; +} + +.mec-fa-question-circle:before { + content: "\f059"; +} + +.mec-fa-info-circle:before { + content: "\f05a"; +} + +.mec-fa-crosshairs:before { + content: "\f05b"; +} + +.mec-fa-times-circle-o:before { + content: "\f05c"; +} + +.mec-fa-check-circle-o:before { + content: "\f05d"; +} + +.mec-fa-ban:before { + content: "\f05e"; +} + +.mec-fa-arrow-left:before { + content: "\f060"; +} + +.mec-fa-arrow-right:before { + content: "\f061"; +} + +.mec-fa-arrow-up:before { + content: "\f062"; +} + +.mec-fa-arrow-down:before { + content: "\f063"; +} + +.mec-fa-mail-forward:before, +.mec-fa-share:before { + content: "\f064"; +} + +.mec-fa-expand:before { + content: "\f065"; +} + +.mec-fa-compress:before { + content: "\f066"; +} + +.mec-fa-plus:before { + content: "\f067"; +} + +.mec-fa-minus:before { + content: "\f068"; +} + +.mec-fa-asterisk:before { + content: "\f069"; +} + +.mec-fa-exclamation-circle:before { + content: "\f06a"; +} + +.mec-fa-gift:before { + content: "\f06b"; +} + +.mec-fa-leaf:before { + content: "\f06c"; +} + +.mec-fa-fire:before { + content: "\f06d"; +} + +.mec-fa-eye:before { + content: "\f06e"; +} + +.mec-fa-eye-slash:before { + content: "\f070"; +} + +.mec-fa-exclamation-triangle:before, +.mec-fa-warning:before { + content: "\f071"; +} + +.mec-fa-plane:before { + content: "\f072"; +} + +.mec-fa-calendar:before { + content: "\f073"; +} + +.mec-fa-random:before { + content: "\f074"; +} + +.mec-fa-comment:before { + content: "\f075"; +} + +.mec-fa-magnet:before { + content: "\f076"; +} + +.mec-fa-chevron-up:before { + content: "\f077"; +} + +.mec-fa-chevron-down:before { + content: "\f078"; +} + +.mec-fa-retweet:before { + content: "\f079"; +} + +.mec-fa-shopping-cart:before { + content: "\f07a"; +} + +.mec-fa-folder:before { + content: "\f07b"; +} + +.mec-fa-folder-open:before { + content: "\f07c"; +} + +.mec-fa-arrows-v:before { + content: "\f07d"; +} + +.mec-fa-arrows-h:before { + content: "\f07e"; +} + +.mec-fa-bar-chart-o:before, +.mec-fa-bar-chart:before { + content: "\f080"; +} + +.mec-fa-twitter-square:before { + content: "\f081"; +} + +.mec-fa-facebook-square:before { + content: "\f082"; +} + +.mec-fa-camera-retro:before { + content: "\f083"; +} + +.mec-fa-key:before { + content: "\f084"; +} + +.mec-fa-cogs:before, +.mec-fa-gears:before { + content: "\f085"; +} + +.mec-fa-comments:before { + content: "\f086"; +} + +.mec-fa-thumbs-o-up:before { + content: "\f087"; +} + +.mec-fa-thumbs-o-down:before { + content: "\f088"; +} + +.mec-fa-star-half:before { + content: "\f089"; +} + +.mec-fa-heart-o:before { + content: "\f08a"; +} + +.mec-fa-sign-out:before { + content: "\f08b"; +} + +.mec-fa-linkedin-square:before { + content: "\f08c"; +} + +.mec-fa-thumb-tack:before { + content: "\f08d"; +} + +.mec-fa-external-link:before { + content: "\f08e"; +} + +.mec-fa-sign-in:before { + content: "\f090"; +} + +.mec-fa-trophy:before { + content: "\f091"; +} + +.mec-fa-github-square:before { + content: "\f092"; +} + +.mec-fa-upload:before { + content: "\f093"; +} + +.mec-fa-lemon-o:before { + content: "\f094"; +} + +.mec-fa-phone:before { + content: "\f095"; +} + +.mec-fa-square-o:before { + content: "\f096"; +} + +.mec-fa-bookmark-o:before { + content: "\f097"; +} + +.mec-fa-phone-square:before { + content: "\f098"; +} + +.mec-fa-twitter:before { + content: "\f099"; +} + +.mec-fa-facebook-f:before, +.mec-fa-facebook:before { + content: "\f09a"; +} + +.mec-fa-github:before { + content: "\f09b"; +} + +.mec-fa-unlock:before { + content: "\f09c"; +} + +.mec-fa-credit-card:before { + content: "\f09d"; +} + +.mec-fa-feed:before, +.mec-fa-rss:before { + content: "\f09e"; +} + +.mec-fa-hdd-o:before { + content: "\f0a0"; +} + +.mec-fa-bullhorn:before { + content: "\f0a1"; +} + +.mec-fa-bell:before { + content: "\f0f3"; +} + +.mec-fa-certificate:before { + content: "\f0a3"; +} + +.mec-fa-hand-o-right:before { + content: "\f0a4"; +} + +.mec-fa-hand-o-left:before { + content: "\f0a5"; +} + +.mec-fa-hand-o-up:before { + content: "\f0a6"; +} + +.mec-fa-hand-o-down:before { + content: "\f0a7"; +} + +.mec-fa-arrow-circle-left:before { + content: "\f0a8"; +} + +.mec-fa-arrow-circle-right:before { + content: "\f0a9"; +} + +.mec-fa-arrow-circle-up:before { + content: "\f0aa"; +} + +.mec-fa-arrow-circle-down:before { + content: "\f0ab"; +} + +.mec-fa-globe:before { + content: "\f0ac"; +} + +.mec-fa-wrench:before { + content: "\f0ad"; +} + +.mec-fa-tasks:before { + content: "\f0ae"; +} + +.mec-fa-filter:before { + content: "\f0b0"; +} + +.mec-fa-briefcase:before { + content: "\f0b1"; +} + +.mec-fa-arrows-alt:before { + content: "\f0b2"; +} + +.mec-fa-group:before, +.mec-fa-users:before { + content: "\f0c0"; +} + +.mec-fa-chain:before, +.mec-fa-link:before { + content: "\f0c1"; +} + +.mec-fa-cloud:before { + content: "\f0c2"; +} + +.mec-fa-flask:before { + content: "\f0c3"; +} + +.mec-fa-cut:before, +.mec-fa-scissors:before { + content: "\f0c4"; +} + +.mec-fa-copy:before, +.mec-fa-files-o:before { + content: "\f0c5"; +} + +.mec-fa-paperclip:before { + content: "\f0c6"; +} + +.mec-fa-floppy-o:before, +.mec-fa-save:before { + content: "\f0c7"; +} + +.mec-fa-square:before { + content: "\f0c8"; +} + +.mec-fa-bars:before, +.mec-fa-navicon:before, +.mec-fa-reorder:before { + content: "\f0c9"; +} + +.mec-fa-list-ul:before { + content: "\f0ca"; +} + +.mec-fa-list-ol:before { + content: "\f0cb"; +} + +.mec-fa-strikethrough:before { + content: "\f0cc"; +} + +.mec-fa-underline:before { + content: "\f0cd"; +} + +.mec-fa-table:before { + content: "\f0ce"; +} + +.mec-fa-magic:before { + content: "\f0d0"; +} + +.mec-fa-truck:before { + content: "\f0d1"; +} + +.mec-fa-pinterest:before { + content: "\f0d2"; +} + +.mec-fa-pinterest-square:before { + content: "\f0d3"; +} + +.mec-fa-google-plus-square:before { + content: "\f0d4"; +} + +.mec-fa-google-plus:before { + content: "\f0d5"; +} + +.mec-fa-money:before { + content: "\f0d6"; +} + +.mec-fa-caret-down:before { + content: "\f0d7"; +} + +.mec-fa-caret-up:before { + content: "\f0d8"; +} + +.mec-fa-caret-left:before { + content: "\f0d9"; +} + +.mec-fa-caret-right:before { + content: "\f0da"; +} + +.mec-fa-columns:before { + content: "\f0db"; +} + +.mec-fa-sort:before, +.mec-fa-unsorted:before { + content: "\f0dc"; +} + +.mec-fa-sort-desc:before, +.mec-fa-sort-down:before { + content: "\f0dd"; +} + +.mec-fa-sort-asc:before, +.mec-fa-sort-up:before { + content: "\f0de"; +} + +.mec-fa-envelope:before { + content: "\f0e0"; +} + +.mec-fa-linkedin:before { + content: "\f0e1"; +} + +.mec-fa-rotate-left:before, +.mec-fa-undo:before { + content: "\f0e2"; +} + +.mec-fa-gavel:before, +.mec-fa-legal:before { + content: "\f0e3"; +} + +.mec-fa-dashboard:before, +.mec-fa-tachometer:before { + content: "\f0e4"; +} + +.mec-fa-comment-o:before { + content: "\f0e5"; +} + +.mec-fa-comments-o:before { + content: "\f0e6"; +} + +.mec-fa-bolt:before, +.mec-fa-flash:before { + content: "\f0e7"; +} + +.mec-fa-sitemap:before { + content: "\f0e8"; +} + +.mec-fa-umbrella:before { + content: "\f0e9"; +} + +.mec-fa-clipboard:before, +.mec-fa-paste:before { + content: "\f0ea"; +} + +.mec-fa-lightbulb-o:before { + content: "\f0eb"; +} + +.mec-fa-exchange:before { + content: "\f0ec"; +} + +.mec-fa-cloud-download:before { + content: "\f0ed"; +} + +.mec-fa-cloud-upload:before { + content: "\f0ee"; +} + +.mec-fa-user-md:before { + content: "\f0f0"; +} + +.mec-fa-stethoscope:before { + content: "\f0f1"; +} + +.mec-fa-suitcase:before { + content: "\f0f2"; +} + +.mec-fa-bell-o:before { + content: "\f0a2"; +} + +.mec-fa-coffee:before { + content: "\f0f4"; +} + +.mec-fa-cutlery:before { + content: "\f0f5"; +} + +.mec-fa-file-text-o:before { + content: "\f0f6"; +} + +.mec-fa-building-o:before { + content: "\f0f7"; +} + +.mec-fa-hospital-o:before { + content: "\f0f8"; +} + +.mec-fa-ambulance:before { + content: "\f0f9"; +} + +.mec-fa-medkit:before { + content: "\f0fa"; +} + +.mec-fa-fighter-jet:before { + content: "\f0fb"; +} + +.mec-fa-beer:before { + content: "\f0fc"; +} + +.mec-fa-h-square:before { + content: "\f0fd"; +} + +.mec-fa-plus-square:before { + content: "\f0fe"; +} + +.mec-fa-angle-double-left:before { + content: "\f100"; +} + +.mec-fa-angle-double-right:before { + content: "\f101"; +} + +.mec-fa-angle-double-up:before { + content: "\f102"; +} + +.mec-fa-angle-double-down:before { + content: "\f103"; +} + +.mec-fa-angle-left:before { + content: "\f104"; +} + +.mec-fa-angle-right:before { + content: "\f105"; +} + +.mec-fa-angle-up:before { + content: "\f106"; +} + +.mec-fa-angle-down:before { + content: "\f107"; +} + +.mec-fa-desktop:before { + content: "\f108"; +} + +.mec-fa-laptop:before { + content: "\f109"; +} + +.mec-fa-tablet:before { + content: "\f10a"; +} + +.mec-fa-mobile-phone:before, +.mec-fa-mobile:before { + content: "\f10b"; +} + +.mec-fa-circle-o:before { + content: "\f10c"; +} + +.mec-fa-quote-left:before { + content: "\f10d"; +} + +.mec-fa-quote-right:before { + content: "\f10e"; +} + +.mec-fa-spinner:before { + content: "\f110"; +} + +.mec-fa-circle:before { + content: "\f111"; +} + +.mec-fa-mail-reply:before, +.mec-fa-reply:before { + content: "\f112"; +} + +.mec-fa-github-alt:before { + content: "\f113"; +} + +.mec-fa-folder-o:before { + content: "\f114"; +} + +.mec-fa-folder-open-o:before { + content: "\f115"; +} + +.mec-fa-smile-o:before { + content: "\f118"; +} + +.mec-fa-frown-o:before { + content: "\f119"; +} + +.mec-fa-meh-o:before { + content: "\f11a"; +} + +.mec-fa-gamepad:before { + content: "\f11b"; +} + +.mec-fa-keyboard-o:before { + content: "\f11c"; +} + +.mec-fa-flag-o:before { + content: "\f11d"; +} + +.mec-fa-flag-checkered:before { + content: "\f11e"; +} + +.mec-fa-terminal:before { + content: "\f120"; +} + +.mec-fa-code:before { + content: "\f121"; +} + +.mec-fa-mail-reply-all:before, +.mec-fa-reply-all:before { + content: "\f122"; +} + +.mec-fa-star-half-empty:before, +.mec-fa-star-half-full:before, +.mec-fa-star-half-o:before { + content: "\f123"; +} + +.mec-fa-location-arrow:before { + content: "\f124"; +} + +.mec-fa-crop:before { + content: "\f125"; +} + +.mec-fa-code-fork:before { + content: "\f126"; +} + +.mec-fa-chain-broken:before, +.mec-fa-unlink:before { + content: "\f127"; +} + +.mec-fa-question:before { + content: "\f128"; +} + +.mec-fa-info:before { + content: "\f129"; +} + +.mec-fa-exclamation:before { + content: "\f12a"; +} + +.mec-fa-superscript:before { + content: "\f12b"; +} + +.mec-fa-subscript:before { + content: "\f12c"; +} + +.mec-fa-eraser:before { + content: "\f12d"; +} + +.mec-fa-puzzle-piece:before { + content: "\f12e"; +} + +.mec-fa-microphone:before { + content: "\f130"; +} + +.mec-fa-microphone-slash:before { + content: "\f131"; +} + +.mec-fa-shield:before { + content: "\f132"; +} + +.mec-fa-calendar-o:before { + content: "\f133"; +} + +.mec-fa-fire-extinguisher:before { + content: "\f134"; +} + +.mec-fa-rocket:before { + content: "\f135"; +} + +.mec-fa-maxcdn:before { + content: "\f136"; +} + +.mec-fa-chevron-circle-left:before { + content: "\f137"; +} + +.mec-fa-chevron-circle-right:before { + content: "\f138"; +} + +.mec-fa-chevron-circle-up:before { + content: "\f139"; +} + +.mec-fa-chevron-circle-down:before { + content: "\f13a"; +} + +.mec-fa-html5:before { + content: "\f13b"; +} + +.mec-fa-css3:before { + content: "\f13c"; +} + +.mec-fa-anchor:before { + content: "\f13d"; +} + +.mec-fa-unlock-alt:before { + content: "\f13e"; +} + +.mec-fa-bullseye:before { + content: "\f140"; +} + +.mec-fa-ellipsis-h:before { + content: "\f141"; +} + +.mec-fa-ellipsis-v:before { + content: "\f142"; +} + +.mec-fa-rss-square:before { + content: "\f143"; +} + +.mec-fa-play-circle:before { + content: "\f144"; +} + +.mec-fa-ticket:before { + content: "\f145"; +} + +.mec-fa-minus-square:before { + content: "\f146"; +} + +.mec-fa-minus-square-o:before { + content: "\f147"; +} + +.mec-fa-level-up:before { + content: "\f148"; +} + +.mec-fa-level-down:before { + content: "\f149"; +} + +.mec-fa-check-square:before { + content: "\f14a"; +} + +.mec-fa-pencil-square:before { + content: "\f14b"; +} + +.mec-fa-external-link-square:before { + content: "\f14c"; +} + +.mec-fa-share-square:before { + content: "\f14d"; +} + +.mec-fa-compass:before { + content: "\f14e"; +} + +.mec-fa-caret-square-o-down:before, +.mec-fa-toggle-down:before { + content: "\f150"; +} + +.mec-fa-caret-square-o-up:before, +.mec-fa-toggle-up:before { + content: "\f151"; +} + +.mec-fa-caret-square-o-right:before, +.mec-fa-toggle-right:before { + content: "\f152"; +} + +.mec-fa-eur:before, +.mec-fa-euro:before { + content: "\f153"; +} + +.mec-fa-gbp:before { + content: "\f154"; +} + +.mec-fa-dollar:before, +.mec-fa-usd:before { + content: "\f155"; +} + +.mec-fa-inr:before, +.mec-fa-rupee:before { + content: "\f156"; +} + +.mec-fa-cny:before, +.mec-fa-jpy:before, +.mec-fa-rmb:before, +.mec-fa-yen:before { + content: "\f157"; +} + +.mec-fa-rouble:before, +.mec-fa-rub:before, +.mec-fa-ruble:before { + content: "\f158"; +} + +.mec-fa-krw:before, +.mec-fa-won:before { + content: "\f159"; +} + +.mec-fa-bitcoin:before, +.mec-fa-btc:before { + content: "\f15a"; +} + +.mec-fa-file:before { + content: "\f15b"; +} + +.mec-fa-file-text:before { + content: "\f15c"; +} + +.mec-fa-sort-alpha-asc:before { + content: "\f15d"; +} + +.mec-fa-sort-alpha-desc:before { + content: "\f15e"; +} + +.mec-fa-sort-amount-asc:before { + content: "\f160"; +} + +.mec-fa-sort-amount-desc:before { + content: "\f161"; +} + +.mec-fa-sort-numeric-asc:before { + content: "\f162"; +} + +.mec-fa-sort-numeric-desc:before { + content: "\f163"; +} + +.mec-fa-thumbs-up:before { + content: "\f164"; +} + +.mec-fa-thumbs-down:before { + content: "\f165"; +} + +.mec-fa-youtube-square:before { + content: "\f166"; +} + +.mec-fa-youtube:before { + content: "\f167"; +} + +.mec-fa-xing:before { + content: "\f168"; +} + +.mec-fa-xing-square:before { + content: "\f169"; +} + +.mec-fa-youtube-play:before { + content: "\f16a"; +} + +.mec-fa-dropbox:before { + content: "\f16b"; +} + +.mec-fa-stack-overflow:before { + content: "\f16c"; +} + +.mec-fa-instagram:before { + content: "\f16d"; +} + +.mec-fa-flickr:before { + content: "\f16e"; +} + +.mec-fa-adn:before { + content: "\f170"; +} + +.mec-fa-bitbucket:before { + content: "\f171"; +} + +.mec-fa-bitbucket-square:before { + content: "\f172"; +} + +.mec-fa-tumblr:before { + content: "\f173"; +} + +.mec-fa-tumblr-square:before { + content: "\f174"; +} + +.mec-fa-long-arrow-down:before { + content: "\f175"; +} + +.mec-fa-long-arrow-up:before { + content: "\f176"; +} + +.mec-fa-long-arrow-left:before { + content: "\f177"; +} + +.mec-fa-long-arrow-right:before { + content: "\f178"; +} + +.mec-fa-apple:before { + content: "\f179"; +} + +.mec-fa-windows:before { + content: "\f17a"; +} + +.mec-fa-android:before { + content: "\f17b"; +} + +.mec-fa-linux:before { + content: "\f17c"; +} + +.mec-fa-dribbble:before { + content: "\f17d"; +} + +.mec-fa-skype:before { + content: "\f17e"; +} + +.mec-fa-foursquare:before { + content: "\f180"; +} + +.mec-fa-trello:before { + content: "\f181"; +} + +.mec-fa-female:before { + content: "\f182"; +} + +.mec-fa-male:before { + content: "\f183"; +} + +.mec-fa-gittip:before, +.mec-fa-gratipay:before { + content: "\f184"; +} + +.mec-fa-sun-o:before { + content: "\f185"; +} + +.mec-fa-moon-o:before { + content: "\f186"; +} + +.mec-fa-archive:before { + content: "\f187"; +} + +.mec-fa-bug:before { + content: "\f188"; +} + +.mec-fa-vk:before { + content: "\f189"; +} + +.mec-fa-weibo:before { + content: "\f18a"; +} + +.mec-fa-renren:before { + content: "\f18b"; +} + +.mec-fa-pagelines:before { + content: "\f18c"; +} + +.mec-fa-stack-exchange:before { + content: "\f18d"; +} + +.mec-fa-arrow-circle-o-right:before { + content: "\f18e"; +} + +.mec-fa-arrow-circle-o-left:before { + content: "\f190"; +} + +.mec-fa-caret-square-o-left:before, +.mec-fa-toggle-left:before { + content: "\f191"; +} + +.mec-fa-dot-circle-o:before { + content: "\f192"; +} + +.mec-fa-wheelchair:before { + content: "\f193"; +} + +.mec-fa-vimeo-square:before { + content: "\f194"; +} + +.mec-fa-try:before, +.mec-fa-turkish-lira:before { + content: "\f195"; +} + +.mec-fa-plus-square-o:before { + content: "\f196"; +} + +.mec-fa-space-shuttle:before { + content: "\f197"; +} + +.mec-fa-slack:before { + content: "\f198"; +} + +.mec-fa-envelope-square:before { + content: "\f199"; +} + +.mec-fa-wordpress:before { + content: "\f19a"; +} + +.mec-fa-openid:before { + content: "\f19b"; +} + +.mec-fa-bank:before, +.mec-fa-institution:before, +.mec-fa-university:before { + content: "\f19c"; +} + +.mec-fa-graduation-cap:before, +.mec-fa-mortar-board:before { + content: "\f19d"; +} + +.mec-fa-yahoo:before { + content: "\f19e"; +} + +.mec-fa-google:before { + content: "\f1a0"; +} + +.mec-fa-reddit:before { + content: "\f1a1"; +} + +.mec-fa-reddit-square:before { + content: "\f1a2"; +} + +.mec-fa-stumbleupon-circle:before { + content: "\f1a3"; +} + +.mec-fa-stumbleupon:before { + content: "\f1a4"; +} + +.mec-fa-delicious:before { + content: "\f1a5"; +} + +.mec-fa-digg:before { + content: "\f1a6"; +} + +.mec-fa-pied-piper:before { + content: "\f1a7"; +} + +.mec-fa-pied-piper-alt:before { + content: "\f1a8"; +} + +.mec-fa-drupal:before { + content: "\f1a9"; +} + +.mec-fa-joomla:before { + content: "\f1aa"; +} + +.mec-fa-language:before { + content: "\f1ab"; +} + +.mec-fa-fax:before { + content: "\f1ac"; +} + +.mec-fa-building:before { + content: "\f1ad"; +} + +.mec-fa-child:before { + content: "\f1ae"; +} + +.mec-fa-paw:before { + content: "\f1b0"; +} + +.mec-fa-spoon:before { + content: "\f1b1"; +} + +.mec-fa-cube:before { + content: "\f1b2"; +} + +.mec-fa-cubes:before { + content: "\f1b3"; +} + +.mec-fa-behance:before { + content: "\f1b4"; +} + +.mec-fa-behance-square:before { + content: "\f1b5"; +} + +.mec-fa-steam:before { + content: "\f1b6"; +} + +.mec-fa-steam-square:before { + content: "\f1b7"; +} + +.mec-fa-recycle:before { + content: "\f1b8"; +} + +.mec-fa-automobile:before, +.mec-fa-car:before { + content: "\f1b9"; +} + +.mec-fa-cab:before, +.mec-fa-taxi:before { + content: "\f1ba"; +} + +.mec-fa-tree:before { + content: "\f1bb"; +} + +.mec-fa-spotify:before { + content: "\f1bc"; +} + +.mec-fa-deviantart:before { + content: "\f1bd"; +} + +.mec-fa-soundcloud:before { + content: "\f1be"; +} + +.mec-fa-database:before { + content: "\f1c0"; +} + +.mec-fa-file-pdf-o:before { + content: "\f1c1"; +} + +.mec-fa-file-word-o:before { + content: "\f1c2"; +} + +.mec-fa-file-excel-o:before { + content: "\f1c3"; +} + +.mec-fa-file-powerpoint-o:before { + content: "\f1c4"; +} + +.mec-fa-file-image-o:before, +.mec-fa-file-photo-o:before, +.mec-fa-file-picture-o:before { + content: "\f1c5"; +} + +.mec-fa-file-archive-o:before, +.mec-fa-file-zip-o:before { + content: "\f1c6"; +} + +.mec-fa-file-audio-o:before, +.mec-fa-file-sound-o:before { + content: "\f1c7"; +} + +.mec-fa-file-movie-o:before, +.mec-fa-file-video-o:before { + content: "\f1c8"; +} + +.mec-fa-file-code-o:before { + content: "\f1c9"; +} + +.mec-fa-vine:before { + content: "\f1ca"; +} + +.mec-fa-codepen:before { + content: "\f1cb"; +} + +.mec-fa-jsfiddle:before { + content: "\f1cc"; +} + +.mec-fa-life-bouy:before, +.mec-fa-life-buoy:before, +.mec-fa-life-ring:before, +.mec-fa-life-saver:before, +.mec-fa-support:before { + content: "\f1cd"; +} + +.mec-fa-circle-o-notch:before { + content: "\f1ce"; +} + +.mec-fa-ra:before, +.mec-fa-rebel:before { + content: "\f1d0"; +} + +.mec-fa-empire:before, +.mec-fa-ge:before { + content: "\f1d1"; +} + +.mec-fa-git-square:before { + content: "\f1d2"; +} + +.mec-fa-git:before { + content: "\f1d3"; +} + +.mec-fa-hacker-news:before, +.mec-fa-y-combinator-square:before, +.mec-fa-yc-square:before { + content: "\f1d4"; +} + +.mec-fa-tencent-weibo:before { + content: "\f1d5"; +} + +.mec-fa-qq:before { + content: "\f1d6"; +} + +.mec-fa-wechat:before, +.mec-fa-weixin:before { + content: "\f1d7"; +} + +.mec-fa-paper-plane:before, +.mec-fa-send:before { + content: "\f1d8"; +} + +.mec-fa-paper-plane-o:before, +.mec-fa-send-o:before { + content: "\f1d9"; +} + +.mec-fa-history:before { + content: "\f1da"; +} + +.mec-fa-circle-thin:before { + content: "\f1db"; +} + +.mec-fa-header:before { + content: "\f1dc"; +} + +.mec-fa-paragraph:before { + content: "\f1dd"; +} + +.mec-fa-sliders:before { + content: "\f1de"; +} + +.mec-fa-share-alt:before { + content: "\f1e0"; +} + +.mec-fa-share-alt-square:before { + content: "\f1e1"; +} + +.mec-fa-bomb:before { + content: "\f1e2"; +} + +.mec-fa-futbol-o:before, +.mec-fa-soccer-ball-o:before { + content: "\f1e3"; +} + +.mec-fa-tty:before { + content: "\f1e4"; +} + +.mec-fa-binoculars:before { + content: "\f1e5"; +} + +.mec-fa-plug:before { + content: "\f1e6"; +} + +.mec-fa-slideshare:before { + content: "\f1e7"; +} + +.mec-fa-twitch:before { + content: "\f1e8"; +} + +.mec-fa-yelp:before { + content: "\f1e9"; +} + +.mec-fa-newspaper-o:before { + content: "\f1ea"; +} + +.mec-fa-wifi:before { + content: "\f1eb"; +} + +.mec-fa-calculator:before { + content: "\f1ec"; +} + +.mec-fa-paypal:before { + content: "\f1ed"; +} + +.mec-fa-google-wallet:before { + content: "\f1ee"; +} + +.mec-fa-cc-visa:before { + content: "\f1f0"; +} + +.mec-fa-cc-mastercard:before { + content: "\f1f1"; +} + +.mec-fa-cc-discover:before { + content: "\f1f2"; +} + +.mec-fa-cc-amex:before { + content: "\f1f3"; +} + +.mec-fa-cc-paypal:before { + content: "\f1f4"; +} + +.mec-fa-cc-stripe:before { + content: "\f1f5"; +} + +.mec-fa-bell-slash:before { + content: "\f1f6"; +} + +.mec-fa-bell-slash-o:before { + content: "\f1f7"; +} + +.mec-fa-trash:before { + content: "\f1f8"; +} + +.mec-fa-copyright:before { + content: "\f1f9"; +} + +.mec-fa-at:before { + content: "\f1fa"; +} + +.mec-fa-eyedropper:before { + content: "\f1fb"; +} + +.mec-fa-paint-brush:before { + content: "\f1fc"; +} + +.mec-fa-birthday-cake:before { + content: "\f1fd"; +} + +.mec-fa-area-chart:before { + content: "\f1fe"; +} + +.mec-fa-pie-chart:before { + content: "\f200"; +} + +.mec-fa-line-chart:before { + content: "\f201"; +} + +.mec-fa-lastfm:before { + content: "\f202"; +} + +.mec-fa-lastfm-square:before { + content: "\f203"; +} + +.mec-fa-toggle-off:before { + content: "\f204"; +} + +.mec-fa-toggle-on:before { + content: "\f205"; +} + +.mec-fa-bicycle:before { + content: "\f206"; +} + +.mec-fa-bus:before { + content: "\f207"; +} + +.mec-fa-ioxhost:before { + content: "\f208"; +} + +.mec-fa-angellist:before { + content: "\f209"; +} + +.mec-fa-cc:before { + content: "\f20a"; +} + +.mec-fa-ils:before, +.mec-fa-shekel:before, +.mec-fa-sheqel:before { + content: "\f20b"; +} + +.mec-fa-meanpath:before { + content: "\f20c"; +} + +.mec-fa-buysellads:before { + content: "\f20d"; +} + +.mec-fa-connectdevelop:before { + content: "\f20e"; +} + +.mec-fa-dashcube:before { + content: "\f210"; +} + +.mec-fa-forumbee:before { + content: "\f211"; +} + +.mec-fa-leanpub:before { + content: "\f212"; +} + +.mec-fa-sellsy:before { + content: "\f213"; +} + +.mec-fa-shirtsinbulk:before { + content: "\f214"; +} + +.mec-fa-simplybuilt:before { + content: "\f215"; +} + +.mec-fa-skyatlas:before { + content: "\f216"; +} + +.mec-fa-cart-plus:before { + content: "\f217"; +} + +.mec-fa-cart-arrow-down:before { + content: "\f218"; +} + +.mec-fa-diamond:before { + content: "\f219"; +} + +.mec-fa-ship:before { + content: "\f21a"; +} + +.mec-fa-user-secret:before { + content: "\f21b"; +} + +.mec-fa-motorcycle:before { + content: "\f21c"; +} + +.mec-fa-street-view:before { + content: "\f21d"; +} + +.mec-fa-heartbeat:before { + content: "\f21e"; +} + +.mec-fa-venus:before { + content: "\f221"; +} + +.mec-fa-mars:before { + content: "\f222"; +} + +.mec-fa-mercury:before { + content: "\f223"; +} + +.mec-fa-intersex:before, +.mec-fa-transgender:before { + content: "\f224"; +} + +.mec-fa-transgender-alt:before { + content: "\f225"; +} + +.mec-fa-venus-double:before { + content: "\f226"; +} + +.mec-fa-mars-double:before { + content: "\f227"; +} + +.mec-fa-venus-mars:before { + content: "\f228"; +} + +.mec-fa-mars-stroke:before { + content: "\f229"; +} + +.mec-fa-mars-stroke-v:before { + content: "\f22a"; +} + +.mec-fa-mars-stroke-h:before { + content: "\f22b"; +} + +.mec-fa-neuter:before { + content: "\f22c"; +} + +.mec-fa-genderless:before { + content: "\f22d"; +} + +.mec-fa-facebook-official:before { + content: "\f230"; +} + +.mec-fa-pinterest-p:before { + content: "\f231"; +} + +.mec-fa-whatsapp:before { + content: "\f232"; +} + +.mec-fa-server:before { + content: "\f233"; +} + +.mec-fa-user-plus:before { + content: "\f234"; +} + +.mec-fa-user-times:before { + content: "\f235"; +} + +.mec-fa-bed:before, +.mec-fa-hotel:before { + content: "\f236"; +} + +.mec-fa-viacoin:before { + content: "\f237"; +} + +.mec-fa-train:before { + content: "\f238"; +} + +.mec-fa-subway:before { + content: "\f239"; +} + +.mec-fa-medium:before { + content: "\f23a"; +} + +.mec-fa-y-combinator:before, +.mec-fa-yc:before { + content: "\f23b"; +} + +.mec-fa-optin-monster:before { + content: "\f23c"; +} + +.mec-fa-opencart:before { + content: "\f23d"; +} + +.mec-fa-expeditedssl:before { + content: "\f23e"; +} + +.mec-fa-battery-4:before, +.mec-fa-battery-full:before { + content: "\f240"; +} + +.mec-fa-battery-3:before, +.mec-fa-battery-three-quarters:before { + content: "\f241"; +} + +.mec-fa-battery-2:before, +.mec-fa-battery-half:before { + content: "\f242"; +} + +.mec-fa-battery-1:before, +.mec-fa-battery-quarter:before { + content: "\f243"; +} + +.mec-fa-battery-0:before, +.mec-fa-battery-empty:before { + content: "\f244"; +} + +.mec-fa-mouse-pointer:before { + content: "\f245"; +} + +.mec-fa-i-cursor:before { + content: "\f246"; +} + +.mec-fa-object-group:before { + content: "\f247"; +} + +.mec-fa-object-ungroup:before { + content: "\f248"; +} + +.mec-fa-sticky-note:before { + content: "\f249"; +} + +.mec-fa-sticky-note-o:before { + content: "\f24a"; +} + +.mec-fa-cc-jcb:before { + content: "\f24b"; +} + +.mec-fa-cc-diners-club:before { + content: "\f24c"; +} + +.mec-fa-clone:before { + content: "\f24d"; +} + +.mec-fa-balance-scale:before { + content: "\f24e"; +} + +.mec-fa-hourglass-o:before { + content: "\f250"; +} + +.mec-fa-hourglass-1:before, +.mec-fa-hourglass-start:before { + content: "\f251"; +} + +.mec-fa-hourglass-2:before, +.mec-fa-hourglass-half:before { + content: "\f252"; +} + +.mec-fa-hourglass-3:before, +.mec-fa-hourglass-end:before { + content: "\f253"; +} + +.mec-fa-hourglass:before { + content: "\f254"; +} + +.mec-fa-hand-grab-o:before, +.mec-fa-hand-rock-o:before { + content: "\f255"; +} + +.mec-fa-hand-paper-o:before, +.mec-fa-hand-stop-o:before { + content: "\f256"; +} + +.mec-fa-hand-scissors-o:before { + content: "\f257"; +} + +.mec-fa-hand-lizard-o:before { + content: "\f258"; +} + +.mec-fa-hand-spock-o:before { + content: "\f259"; +} + +.mec-fa-hand-pointer-o:before { + content: "\f25a"; +} + +.mec-fa-hand-peace-o:before { + content: "\f25b"; +} + +.mec-fa-trademark:before { + content: "\f25c"; +} + +.mec-fa-registered:before { + content: "\f25d"; +} + +.mec-fa-creative-commons:before { + content: "\f25e"; +} + +.mec-fa-gg:before { + content: "\f260"; +} + +.mec-fa-gg-circle:before { + content: "\f261"; +} + +.mec-fa-tripadvisor:before { + content: "\f262"; +} + +.mec-fa-odnoklassniki:before { + content: "\f263"; +} + +.mec-fa-odnoklassniki-square:before { + content: "\f264"; +} + +.mec-fa-get-pocket:before { + content: "\f265"; +} + +.mec-fa-wikipedia-w:before { + content: "\f266"; +} + +.mec-fa-safari:before { + content: "\f267"; +} + +.mec-fa-chrome:before { + content: "\f268"; +} + +.mec-fa-firefox:before { + content: "\f269"; +} + +.mec-fa-opera:before { + content: "\f26a"; +} + +.mec-fa-internet-explorer:before { + content: "\f26b"; +} + +.mec-fa-television:before, +.mec-fa-tv:before { + content: "\f26c"; +} + +.mec-fa-contao:before { + content: "\f26d"; +} + +.mec-fa-500px:before { + content: "\f26e"; +} + +.mec-fa-amazon:before { + content: "\f270"; +} + +.mec-fa-calendar-plus-o:before { + content: "\f271"; +} + +.mec-fa-calendar-minus-o:before { + content: "\f272"; +} + +.mec-fa-calendar-times-o:before { + content: "\f273"; +} + +.mec-fa-calendar-check-o:before { + content: "\f274"; +} + +.mec-fa-industry:before { + content: "\f275"; +} + +.mec-fa-map-pin:before { + content: "\f276"; +} + +.mec-fa-map-signs:before { + content: "\f277"; +} + +.mec-fa-map-o:before { + content: "\f278"; +} + +.mec-fa-map:before { + content: "\f279"; +} + +.mec-fa-commenting:before { + content: "\f27a"; +} + +.mec-fa-commenting-o:before { + content: "\f27b"; +} + +.mec-fa-houzz:before { + content: "\f27c"; +} + +.mec-fa-vimeo:before { + content: "\f27d"; +} + +.mec-fa-black-tie:before { + content: "\f27e"; +} + +.mec-fa-fonticons:before { + content: "\f280"; +} + +.mec-fa-reddit-alien:before { + content: "\f281"; +} + +.mec-fa-edge:before { + content: "\f282"; +} + +.mec-fa-credit-card-alt:before { + content: "\f283"; +} + +.mec-fa-codiepie:before { + content: "\f284"; +} + +.mec-fa-modx:before { + content: "\f285"; +} + +.mec-fa-fort-awesome:before { + content: "\f286"; +} + +.mec-fa-usb:before { + content: "\f287"; +} + +.mec-fa-product-hunt:before { + content: "\f288"; +} + +.mec-fa-mixcloud:before { + content: "\f289"; +} + +.mec-fa-scribd:before { + content: "\f28a"; +} + +.mec-fa-pause-circle:before { + content: "\f28b"; +} + +.mec-fa-pause-circle-o:before { + content: "\f28c"; +} + +.mec-fa-stop-circle:before { + content: "\f28d"; +} + +.mec-fa-stop-circle-o:before { + content: "\f28e"; +} + +.mec-fa-shopping-bag:before { + content: "\f290"; +} + +.mec-fa-shopping-basket:before { + content: "\f291"; +} + +.mec-fa-hashtag:before { + content: "\f292"; +} + +.mec-fa-bluetooth:before { + content: "\f293"; +} + +.mec-fa-bluetooth-b:before { + content: "\f294"; +} + +.mec-fa-percent:before { + content: "\f295"; +} + +.mec-fa-gitlab:before { + content: "\f296"; +} + +.mec-fa-wpbeginner:before { + content: "\f297"; +} + +.mec-fa-wpforms:before { + content: "\f298"; +} + +.mec-fa-envira:before { + content: "\f299"; +} + +.mec-fa-universal-access:before { + content: "\f29a"; +} + +.mec-fa-wheelchair-alt:before { + content: "\f29b"; +} + +.mec-fa-question-circle-o:before { + content: "\f29c"; +} + +.mec-fa-blind:before { + content: "\f29d"; +} + +.mec-fa-audio-description:before { + content: "\f29e"; +} + +.mec-fa-volume-control-phone:before { + content: "\f2a0"; +} + +.mec-fa-braille:before { + content: "\f2a1"; +} + +.mec-fa-assistive-listening-systems:before { + content: "\f2a2"; +} + +.mec-fa-american-sign-language-interpreting:before, +.mec-fa-asl-interpreting:before { + content: "\f2a3"; +} + +.mec-fa-deaf:before, +.mec-fa-deafness:before, +.mec-fa-hard-of-hearing:before { + content: "\f2a4"; +} + +.mec-fa-glide:before { + content: "\f2a5"; +} + +.mec-fa-glide-g:before { + content: "\f2a6"; +} + +.mec-fa-sign-language:before, +.mec-fa-signing:before { + content: "\f2a7"; +} + +.mec-fa-low-vision:before { + content: "\f2a8"; +} + +.mec-fa-viadeo:before { + content: "\f2a9"; +} + +.mec-fa-viadeo-square:before { + content: "\f2aa"; +} + +.mec-fa-snapchat:before { + content: "\f2ab"; +} + +.mec-fa-snapchat-ghost:before { + content: "\f2ac"; +} + +.mec-fa-snapchat-square:before { + content: "\f2ad"; +} + +.mec-fa-long-arrow-alt-left:before { + content: "\f060"; +} + +.mec-fa-window-minimize:before { + content: "\f068"; +} + +.mec-fa-long-arrow-alt-right:before { + content: "\f061"; +} + + +/* Simple Line Icons */ +.mec-sl-user:before { + content: "\e005"; +} + +.mec-sl-people:before { + content: "\e001"; +} + +.mec-sl-user-female:before { + content: "\e000"; +} + +.mec-sl-user-follow:before { + content: "\e002"; +} + +.mec-sl-user-following:before { + content: "\e003"; +} + +.mec-sl-user-unfollow:before { + content: "\e004"; +} + +.mec-sl-login:before { + content: "\e066"; +} + +.mec-sl-logout:before { + content: "\e065"; +} + +.mec-sl-emotsmile:before { + content: "\e021"; +} + +.mec-sl-phone:before { + content: "\e600"; +} + +.mec-sl-call-end:before { + content: "\e048"; +} + +.mec-sl-call-in:before { + content: "\e047"; +} + +.mec-sl-call-out:before { + content: "\e046"; +} + +.mec-sl-map:before { + content: "\e033"; +} + +.mec-sl-location-pin:before { + content: "\e096"; +} + +.mec-sl-direction:before { + content: "\e042"; +} + +.mec-sl-directions:before { + content: "\e041"; +} + +.mec-sl-compass:before { + content: "\e045"; +} + +.mec-sl-layers:before { + content: "\e034"; +} + +.mec-sl-menu:before { + content: "\e601"; +} + +.mec-sl-list:before { + content: "\e067"; +} + +.mec-sl-options-vertical:before { + content: "\e602"; +} + +.mec-sl-options:before { + content: "\e603"; +} + +.mec-sl-arrow-down:before { + content: "\e604"; +} + +.mec-sl-arrow-left:before { + content: "\e605"; +} + +.mec-sl-arrow-right:before { + content: "\e606"; +} + +.mec-sl-arrow-up:before { + content: "\e607"; +} + +.mec-sl-arrow-up-circle:before { + content: "\e078"; +} + +.mec-sl-arrow-left-circle:before { + content: "\e07a"; +} + +.mec-sl-arrow-right-circle:before { + content: "\e079"; +} + +.mec-sl-arrow-down-circle:before { + content: "\e07b"; +} + +.mec-sl-check:before { + content: "\e080"; +} + +.mec-sl-clock:before { + content: "\e081"; +} + +.mec-sl-plus:before { + content: "\e095"; +} + +.mec-sl-minus:before { + content: "\e615"; +} + +.mec-sl-close:before { + content: "\e082"; +} + +.mec-sl-event:before { + content: "\e619"; +} + +.mec-sl-exclamation:before { + content: "\e617"; +} + +.mec-sl-organization:before { + content: "\e616"; +} + +.mec-sl-trophy:before { + content: "\e006"; +} + +.mec-sl-screen-smartphone:before { + content: "\e010"; +} + +.mec-sl-screen-desktop:before { + content: "\e011"; +} + +.mec-sl-plane:before { + content: "\e012"; +} + +.mec-sl-notebook:before { + content: "\e013"; +} + +.mec-sl-mustache:before { + content: "\e014"; +} + +.mec-sl-mouse:before { + content: "\e015"; +} + +.mec-sl-magnet:before { + content: "\e016"; +} + +.mec-sl-energy:before { + content: "\e020"; +} + +.mec-sl-disc:before { + content: "\e022"; +} + +.mec-sl-cursor:before { + content: "\e06e"; +} + +.mec-sl-cursor-move:before { + content: "\e023"; +} + +.mec-sl-crop:before { + content: "\e024"; +} + +.mec-sl-chemistry:before { + content: "\e026"; +} + +.mec-sl-speedometer:before { + content: "\e007"; +} + +.mec-sl-shield:before { + content: "\e00e"; +} + +.mec-sl-screen-tablet:before { + content: "\e00f"; +} + +.mec-sl-magic-wand:before { + content: "\e017"; +} + +.mec-sl-hourglass:before { + content: "\e018"; +} + +.mec-sl-graduation:before { + content: "\e019"; +} + +.mec-sl-ghost:before { + content: "\e01a"; +} + +.mec-sl-game-controller:before { + content: "\e01b"; +} + +.mec-sl-fire:before { + content: "\e01c"; +} + +.mec-sl-eyeglass:before { + content: "\e01d"; +} + +.mec-sl-envelope-open:before { + content: "\e01e"; +} + +.mec-sl-envelope-letter:before { + content: "\e01f"; +} + +.mec-sl-bell:before { + content: "\e027"; +} + +.mec-sl-badge:before { + content: "\e028"; +} + +.mec-sl-anchor:before { + content: "\e029"; +} + +.mec-sl-wallet:before { + content: "\e02a"; +} + +.mec-sl-vector:before { + content: "\e02b"; +} + +.mec-sl-speech:before { + content: "\e02c"; +} + +.mec-sl-puzzle:before { + content: "\e02d"; +} + +.mec-sl-printer:before { + content: "\e02e"; +} + +.mec-sl-present:before { + content: "\e02f"; +} + +.mec-sl-playlist:before { + content: "\e030"; +} + +.mec-sl-pin:before { + content: "\e031"; +} + +.mec-sl-picture:before { + content: "\e032"; +} + +.mec-sl-handbag:before { + content: "\e035"; +} + +.mec-sl-globe-alt:before { + content: "\e036"; +} + +.mec-sl-globe:before { + content: "\e037"; +} + +.mec-sl-folder-alt:before { + content: "\e039"; +} + +.mec-sl-folder:before { + content: "\e089"; +} + +.mec-sl-film:before { + content: "\e03a"; +} + +.mec-sl-feed:before { + content: "\e03b"; +} + +.mec-sl-drop:before { + content: "\e03e"; +} + +.mec-sl-drawer:before { + content: "\e03f"; +} + +.mec-sl-docs:before { + content: "\e040"; +} + +.mec-sl-doc:before { + content: "\e085"; +} + +.mec-sl-diamond:before { + content: "\e043"; +} + +.mec-sl-cup:before { + content: "\e044"; +} + +.mec-sl-calculator:before { + content: "\e049"; +} + +.mec-sl-bubbles:before { + content: "\e04a"; +} + +.mec-sl-briefcase:before { + content: "\e04b"; +} + +.mec-sl-book-open:before { + content: "\e04c"; +} + +.mec-sl-basket-loaded:before { + content: "\e04d"; +} + +.mec-sl-basket:before { + content: "\e04e"; +} + +.mec-sl-bag:before { + content: "\e04f"; +} + +.mec-sl-action-undo:before { + content: "\e050"; +} + +.mec-sl-action-redo:before { + content: "\e051"; +} + +.mec-sl-wrench:before { + content: "\e052"; +} + +.mec-sl-umbrella:before { + content: "\e053"; +} + +.mec-sl-trash:before { + content: "\e054"; +} + +.mec-sl-tag:before { + content: "\e055"; +} + +.mec-sl-support:before { + content: "\e056"; +} + +.mec-sl-frame:before { + content: "\e038"; +} + +.mec-sl-size-fullscreen:before { + content: "\e057"; +} + +.mec-sl-size-actual:before { + content: "\e058"; +} + +.mec-sl-shuffle:before { + content: "\e059"; +} + +.mec-sl-share-alt:before { + content: "\e05a"; +} + +.mec-sl-share:before { + content: "\e05b"; +} + +.mec-sl-rocket:before { + content: "\e05c"; +} + +.mec-sl-question:before { + content: "\e05d"; +} + +.mec-sl-pie-chart:before { + content: "\e05e"; +} + +.mec-sl-pencil:before { + content: "\e05f"; +} + +.mec-sl-note:before { + content: "\e060"; +} + +.mec-sl-loop:before { + content: "\e064"; +} + +.mec-sl-home:before { + content: "\e069"; +} + +.mec-sl-grid:before { + content: "\e06a"; +} + +.mec-sl-graph:before { + content: "\e06b"; +} + +.mec-sl-microphone:before { + content: "\e063"; +} + +.mec-sl-music-tone-alt:before { + content: "\e061"; +} + +.mec-sl-music-tone:before { + content: "\e062"; +} + +.mec-sl-earphones-alt:before { + content: "\e03c"; +} + +.mec-sl-earphones:before { + content: "\e03d"; +} + +.mec-sl-equalizer:before { + content: "\e06c"; +} + +.mec-sl-like:before { + content: "\e068"; +} + +.mec-sl-dislike:before { + content: "\e06d"; +} + +.mec-sl-control-start:before { + content: "\e06f"; +} + +.mec-sl-control-rewind:before { + content: "\e070"; +} + +.mec-sl-control-play:before { + content: "\e071"; +} + +.mec-sl-control-pause:before { + content: "\e072"; +} + +.mec-sl-control-forward:before { + content: "\e073"; +} + +.mec-sl-control-end:before { + content: "\e074"; +} + +.mec-sl-volume-1:before { + content: "\e09f"; +} + +.mec-sl-volume-2:before { + content: "\e0a0"; +} + +.mec-sl-volume-off:before { + content: "\e0a1"; +} + +.mec-sl-calendar:before { + content: "\e075"; +} + +.mec-sl-bulb:before { + content: "\e076"; +} + +.mec-sl-chart:before { + content: "\e077"; +} + +.mec-sl-ban:before { + content: "\e07c"; +} + +.mec-sl-bubble:before { + content: "\e07d"; +} + +.mec-sl-camrecorder:before { + content: "\e07e"; +} + +.mec-sl-camera:before { + content: "\e07f"; +} + +.mec-sl-cloud-download:before { + content: "\e083"; +} + +.mec-sl-cloud-upload:before { + content: "\e084"; +} + +.mec-sl-envelope:before { + content: "\e086"; +} + +.mec-sl-eye:before { + content: "\e087"; +} + +.mec-sl-flag:before { + content: "\e088"; +} + +.mec-sl-heart:before { + content: "\e08a"; +} + +.mec-sl-info:before { + content: "\e08b"; +} + +.mec-sl-key:before { + content: "\e08c"; +} + +.mec-sl-link:before { + content: "\e08d"; +} + +.mec-sl-lock:before { + content: "\e08e"; +} + +.mec-sl-lock-open:before { + content: "\e08f"; +} + +.mec-sl-magnifier:before { + content: "\e090"; +} + +.mec-sl-magnifier-add:before { + content: "\e091"; +} + +.mec-sl-magnifier-remove:before { + content: "\e092"; +} + +.mec-sl-paper-clip:before { + content: "\e093"; +} + +.mec-sl-paper-plane:before { + content: "\e094"; +} + +.mec-sl-power:before { + content: "\e097"; +} + +.mec-sl-refresh:before { + content: "\e098"; +} + +.mec-sl-reload:before { + content: "\e099"; +} + +.mec-sl-settings:before { + content: "\e09a"; +} + +.mec-sl-star:before { + content: "\e09b"; +} + +.mec-sl-symbol-female:before { + content: "\e09c"; +} + +.mec-sl-symbol-male:before { + content: "\e09d"; +} + +.mec-sl-target:before { + content: "\e09e"; +} + +.mec-sl-credit-card:before { + content: "\e025"; +} + +.mec-sl-paypal:before { + content: "\e608"; +} + +.mec-sl-social-tumblr:before { + content: "\e00a"; +} + +.mec-sl-social-twitter:before { + content: "\e009"; +} + +.mec-sl-social-facebook:before { + content: "\e00b"; +} + +.mec-sl-social-instagram:before { + content: "\e609"; +} + +.mec-sl-social-linkedin:before { + content: "\e60a"; +} + +.mec-sl-social-pinterest:before { + content: "\e60b"; +} + +.mec-sl-social-github:before { + content: "\e60c"; +} + +.mec-sl-social-google:before { + content: "\e60d"; +} + +.mec-sl-social-reddit:before { + content: "\e60e"; +} + +.mec-sl-social-skype:before { + content: "\e60f"; +} + +.mec-sl-social-dribbble:before { + content: "\e00d"; +} + +.mec-sl-social-behance:before { + content: "\e610"; +} + +.mec-sl-social-foursqare:before { + content: "\e611"; +} + +.mec-sl-social-soundcloud:before { + content: "\e612"; +} + +.mec-sl-social-spotify:before { + content: "\e613"; +} + +.mec-sl-social-stumbleupon:before { + content: "\e614"; +} + +.mec-sl-social-youtube:before { + content: "\e008"; +} + +.mec-sl-social-dropbox:before { + content: "\e00c"; +} + +.mec-sl-social-vkontakte:before { + content: "\e618"; +} + +.mec-sl-social-steam:before { + content: "\e620"; +} + +.mec-sl-sitemap:before { + content: "\e037"; +} + +.mec-sl-map-marker:before { + content: "\e096"; +} + +.mec-sl-clock-o:before { + content: "\e081"; +} \ No newline at end of file diff --git a/assets/css/index.html b/assets/css/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/css/mec-general-calendar.css b/assets/css/mec-general-calendar.css new file mode 100755 index 0000000..eff0f4f --- /dev/null +++ b/assets/css/mec-general-calendar.css @@ -0,0 +1 @@ +.fc-icon,.fc-unselectable{-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;font-weight:400}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;text-align:center}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc .fc-button:hover,.fc .fc-list-event-title a,a.fc-event,a.fc-event:hover{text-decoration:none}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,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") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;-webkit-user-select:none;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event,.fc-v-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after,.fc-event:focus:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden;word-break:break-word;}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc .fc-popover{position:absolute;z-index:9999;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{content:"";clear:both;display:table}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{position:absolute;top:0;bottom:0;left:0;right:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event,.fc-timegrid-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-short .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timegrid-more-link{position:absolute;z-index:9999;color:inherit;color:var(--fc-more-link-text-color,inherit);background:var(--fc-more-link-bg-color,#d0d0d0);cursor:pointer;margin-bottom:1px}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table thead{position:absolute;left:-10000px}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.fc-theme-bootstrap5 .fc-list,.fc-theme-bootstrap5 .fc-scrollgrid,.fc-theme-bootstrap5 td,.fc-theme-bootstrap5 th{border:1px solid var(--bs-gray-400)}.fc-theme-bootstrap5 .fc-scrollgrid{border-right-width:0;border-bottom-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)} \ No newline at end of file diff --git a/assets/css/mecrtl.css b/assets/css/mecrtl.css new file mode 100755 index 0000000..5d6e719 --- /dev/null +++ b/assets/css/mecrtl.css @@ -0,0 +1,926 @@ +/** +* Plugin Name: Modern Events Calendar +* Plugin URI: http://webnus.net/modern-events-calendar/ +* Description: An awesome plugin for events calendar +* Author: Webnus Team +* Author URI: http://webnus.net +**/ + + /* Base + ====================================================*/ + .mec-single-event .mec-single-event-organizer i, .mec-single-event .mec-events-meta-date i { margin-left: 10px; margin-right: 12px; } + + /* margin-left 0 + ====================================================*/ + .mec-single-event .mec-frontbox-title:before, .mec-event-schedule-content, .event-color + { margin-left: 0; } + + /* custom-margin-left 0 + ====================================================*/ + .mec-event-cover-classic .mec-event-icon { margin-left: 14px; } + .event-color { margin-right: 5px; } + .mec-event-list-classic .mec-event-image { margin-left: 20px } + .mec-event-article i { margin-left: 10px;} + + /* margin-right 0 + ====================================================*/ + .mec-event-list-classic .mec-event-image, .mec-event-cover-classic .mec-event-icon { margin-right: 0; } + + /* custom-margin-right 0 + ====================================================*/ + .mec-single-event .mec-frontbox-title:before { margin-right: 39px; } + .mec-event-schedule-content { margin-right: 25px; } + + /* padding-left 0 + ====================================================*/ + .mec-single-event .mec-event-meta h3, .mec-single-event .mec-event-meta dt, .mec-event-schedule-content dl + { padding-left: 0; } + + /* custom-padding-right 0 + ====================================================*/ + .mec-single-event .mec-event-meta h3, .mec-single-event .mec-event-meta dt { padding-right: 10px; } + .mec-event-schedule-content dl { padding-right: 24px; } + + /* border-left 0 + ====================================================*/ + .mec-event-schedule-content { border: 0; } + + /* custom-border-right + ====================================================*/ + .mec-event-schedule-content { border-right: 4px solid #f0f0f0; } + + /* left auto + ====================================================*/ + .mec-event-schedule-content dl:before, .mec-event-cover-modern .mec-event-cover-a + { left: auto; } + + /* right 0 + ====================================================*/ + .mec-event-schedule-content dl:before, .mec-event-cover-modern .mec-event-cover-a { right: 0; } + + /* float right + ====================================================*/ + .mec-event-cover-classic .mec-event-icon, .mec-event-list-classic .mec-event-image { float: right; } + + /* Text align right + ====================================================*/ + .mec-event-cover-classic .mec-btn-wrapper { text-align: right; } + + /* #General + ================================================== */ + .mec-wrap .mec-calendar-topsec .mec-calendar-events-sec .mec-table-side-day { padding: 0;} + .mec-wrap article.mec-event-article.mec-clear { text-align: right;} + .mec-wrap .mec-event-article .mec-event-content p { text-align:right;} + + /* buttons */ + .mec-wrap .button, .mec-wrap button, .mec-wrap input[type=button], .mec-wrap input[type=reset], .mec-wrap input[type=submit] { margin:0;} + + /* Booking Form*/ + .mec-wrap .mec-events-meta-group-booking .mec-book-price-details li { float:right;} + .mec-wrap .mec-events-meta-group-booking .mec-book-price-details { width:330px;} + + /* map marker plus */ + .mec-wrap .mec-marker-wrap .mec-marker-pulse { margin:-15px 28px 1px 40px;} + .mec-wrap .mec-marker-wrap .mec-marker-pulse:after{ margin:-13px -13px 0 0;} + + /* #Front-End Submission + ================================================== */ + .mec-fes-list ul li .mec-fes-event-remove, .mec-fes-list ul li .mec-fes-event-view { float: left;} + .mec-fes-form input[type=checkbox], .mec-fes-form input[type=radio] { float: right; margin: 5px;} + .mec-fes-form #mec_fes_form .mec-form-row #mec_cost { float:none;} + /* .mec-meta-box-fields .mec-form-row { overflow: hidden;} */ + .mec-fes-form label {padding-right: 0;} + + /* #Search Form (top bar skin's) + ================================================== */ + /* Top Head bar */ + .mec-wrap .mec-totalcal-box i { float:right; text-align:center;} + .mec-totalcal-box .mec-date-search { float:left;} + + /* #Single Events + ================================================== */ + /* Single Event modern */ + .mec-wrap .mec-single-modern .mec-single-event-bar>div i { float:right; padding-left: 10px;} + .mec-wrap .mec-single-modern .mec-single-event-bar dd { margin: 0 30px 0 0; padding: 0;} + .mec-wrap .mec-event-meta.mec-color-before.mec-frontbox { width: 100%;} + .mec-wrap .mec-single-modern .mec-event-meta .mec-single-event-organizer dd a { float: left; position: absolute; margin-right: 5px;} + .mec-wrap .mec-single-event .mec-single-event-organizer i{ margin-top: 5px;} + + /* Side Bar Singele Page*/ + .mec-wrap .mec-single-event .mec-event-meta i { float:right; padding-left:5px;} + .mec-wrap .mec-single-event .mec-event-meta dt, .mec-wrap .mec-single-event .mec-event-meta h3 { padding-right:5px;} + .mec-wrap .mec-single-event .mec-event-meta dd { padding-right: 35px; padding-left: 0;} + .mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd { padding: 0;} + .mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd a { float: left; position: absolute; margin-right: 5px;} + /* Category singel event*/ + .mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:after { font-family: FontAwesome; color: #40d9f1; font-size: 16px; content: "\f104"; padding-left: 10px;} + .mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:before { content: ""; padding: 0;} + .mec-wrap .mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li:last-child { text-align: left; padding-left:0;} + .mec-wrap .mec-single-event .mec-events-button { margin: 0;} + /* Events in full calendar */ + .mec-wrap .mec-calendar .mec-event-article .mec-event-image { float:right; margin-left: 20px; } + .mec-wrap .mec-calendar .mec-event-article .mec-event-title { text-align:right; padding: 5px; } + .mec-wrap .mec-calendar .mec-event-article .mec-event-time i { float: right;} + .mec-wrap .mec-calendar .mec-event-article .mec-event-time.mec-color { float:right;} + .mec-wrap .mec-calendar .mec-event-article .mec-event-detail { float: right;} + /*Events in weekly */ + .mec-wrap .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date { float:right;} + /* Events in listly */ + .mec-wrap .mec-event-meta-wrap { border-right: 1px solid #eee; border-left: 0;} + .mec-event-meta { float: right;} + /* Footer event list*/ + .mec-event-sharing-wrap { right: 20px; left:auto;} + .mec-event-footer .mec-booking-button { right:auto; left: 20px;} + /* Orginizer Single event */ + .mec-wrap .mec-single-event .mec-events-meta-date dd span, .mec-single-event .mec-single-event-organizer dd span { padding-bottom:20px;} + /* Single Events Sidebar */ + .single-mec-events .mec-wrap .col-md-4 {direction: rtl;float: right;} + /* Single Events */ + .single-mec-events .mec-wrap .mec-single-modern .col-md-4 {margin-top: -50px;} + .mec-events-template-default .mec-wrap .col-md-4 {margin-top: 0; float: left;} + .mec-events-template-default .mec-wrap .col-md-8 {margin-top: 0; float: right;} + .single-mec-events .mec-single-modern .mec-single-event-bar {padding: 14px 0;} + .single-mec-events .mec-single-modern .col-md-4 .mec-frontbox {margin: 0;} + .single-mec-events .mec-single-event .mec-events-meta-group-booking form>h4:before, .mec-single-event .mec-frontbox-title:before {transform: translate(-50%); margin: 0;} + .single-mec-events .mec-single-event-location,.single-mec-events .mec-single-event-organizer,.single-mec-events .mec-single-event-category {z-index: 1;} + .single-mec-events .mec-single-event .mec-booking-button {position: relative; z-index: 2;} + .single-mec-events .mec-wrap .mec-single-event .mec-event-meta dd a i:before {content: '\f104'; line-height: 32px; } + .single-mec-events .mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:after {display: none;} + /* #List View + ================================================== */ + /* List View Standard */ + .mec-wrap .mec-event-list-standard .mec-event-meta-wrap { display:table-cell;} + /* List View Classic */ + .mec-wrap .mec-totalcal-box i { float: right;} + .mec-wrap i.mec-sl-map-marker { float: right; margin-left:3px;} + /* List View Minimal */ + .mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button { float: left;} + .mec-wrap .mec-event-list-minimal .mec-event-article .col-md-9.col-sm-9 { float: right; width: 100%;} + .mec-wrap .mec-event-list-minimal .mec-event-article .mec-event-date.mec-bg-color { float: right; margin-right: 0; margin-left: 10px;} + .mec-wrap .mec-event-list-minimal .mec-event-date span { padding-left: 25px; margin-left: 7px; padding-right: 0; margin-right: 0 } + + /* #Grid View + ================================================== */ + /*Grid View Clean */ + .mec-event-grid-clean .mec-event-footer .mec-booking-button { left:0; right:auto;} + .mec-event-grid-clean .mec-event-sharing-wrap { left:auto; right:0;} + .mec-event-grid-clean .event-grid-t2-head .mec-event-date { float:right; margin-right:0; margin-left: 11px;} + .mec-event-grid-clean .event-grid-t2-head { text-align: right;} + .mec-event-grid-clean .event-grid-t2-head .mec-event-month { text-align: right;} + .mec-event-grid-clean .event-grid-t2-head .mec-event-detail { text-align: right;} + /*Grid View Minimal*/ + .mec-event-grid-minimal .mec-event-date { margin-right:0; margin-left:20px;} + /* Grid View Modern*/ + .mec-wrap .mec-event-grid-modern .mec-event-article .event-grid-modern-head .mec-event-date.mec-color { margin-left: 11px;margin-right: 0;} + .mec-wrap .mec-event-grid-modern .mec-event-content .mec-event-title .event-color { float: right; margin: 7px; } + .mec-wrap .mec-event-grid-modern .mec-event-article h4.mec-event-title { overflow: hidden; } + /* Grid View Simple */ + .mec-wrap .mec-event-grid-simple article.mec-event-article.mec-clear { text-align:center;} + .mec-wrap .mec-event-grid-simple article.mec-event-article h4.mec-event-title { text-align: center;} + /* Grid View Colorfull*/ + .mec-wrap .mec-event-grid-modern .event-grid-modern-head .mec-event-date { float:right;} + .mec-wrap .mec-event-article h4.mec-event-title { text-align: right;} + .mec-wrap .event-grid-modern-head.clearfix { text-align:right;} + + /* #Carousel + ================================================== */ + /* Carousel Type>1 */ + .mec-wrap .event-carousel-type1-head .mec-event-date-carousel { left:auto; right: 1px;padding-left: 21px;padding-right: 25px;} + .mec-wrap .event-carousel-type1-head .mec-event-date-info-year { right:auto; left: 60px;} + .mec-wrap .event-carousel-type1-head .mec-event-date-info { right:auto; left: 60px;} + .mec-wrap .event-carousel-type1-head .mec-event-date-carousel:after { left:auto; bottom:-13px; right: 5px; transform: rotate(-45deg);} + /* Carousel Type 2 */ + .mec-wrap .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button { float:left;} + .mec-wrap .mec-event-carousel-type2 .mec-event-footer-carousel-type2 .mec-event-sharing-wrap { left:auto; right: -11px;} + /* Carousel Type>3 */ + .mec-wrap .event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button { float:left;} + .mec-wrap .mec-event-footer-carousel-type3 .mec-event-sharing-wrap { left:auto; right:11%;} + + /* #Full Calendar View + ================================================== */ + /* Full Calendar View > List View */ + .mec-wrap .mec-event-list-standard .mec-date-details:before, .mec-event-list-standard .mec-time-details:before, .mec-event-list-standard .mec-venue-details:before { right:0; text-align:right;} + .mec-wrap .mec-event-meta.mec-color-before span { margin-right: 28px;} + /* Full Calendar View > Yearly View */ + .mec-wrap .mec-timetable-t2-col {float: right;} + .mec-wrap .mec-agenda-date-wrap {float: right;} + .mec-wrap .mec-agenda-events-wrap {float: left;} + .mec-wrap .mec-yearly-view-wrap .mec-yearly-calendar-sec {float: right;} + .mec-wrap .mec-yearly-agenda-sec {float: left; padding: 0 20px 0 0;} + .rtl .mec-yearly-view-wrap .mec-yearly-title-sec { direction: rtl;} + .rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year {right: 20px;left: auto;} + .rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year {left: 20px;right: auto;direction: ltr;} + .rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year .mec-sl-angle-right:before { content: "\e605";} + .rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year .mec-sl-angle-left:before { content: "\e606";} + + /* #Calendar/Monthly View + ================================================== */ + /* Calendar/Monthly View > Classic */ + .mec-wrap .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec { text-align:right;} + .mec-wrap .mec-skin-monthly-view-month-navigator-container .mec-calendar-events-sec h3.mec-color.mec-table-side-day { float: right;} + .rtl .mec-calendar.mec-event-calendar-classic dl dt {text-align: right;} + .rtl .mec-calendar.mec-event-calendar-classic .mec-has-event:after {left: auto;right: 7px;} + .rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month {right: auto;} + .rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-previous-month {left: auto;} + .rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-title {direction: rtl;} + + /* Calendar/Monthly View > Clean */ + .rtl .mec-calendar .mec-calendar-events-side { border-right: 1px solid #efefef;} + .rtl .mec-calendar .mec-event-article, + .rtl .mec-month-navigator { direction: ltr;} + .rtl .mec-calendar .mec-calendar-side .mec-previous-month { border-bottom-left-radius: 6px; border-bottom-right-radius: 0; border-left: 1px solid #efefef; border-right: 0; left: auto; right: 0; direction: rtl;} + .rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-image { float: right; margin-left: 20px; margin-right: 0;} + .rtl .mec-wrap article:not([class^=mec-event-countdown]):not([class^=mec-event-cover-]).mec-label-canceled:before, + .rtl .mec-wrap article:not([class^=mec-event-countdown]):not([class^=mec-event-cover-]).mec-label-featured:before { z-index: 1; position: absolute; top: 25px; right: auto; left: -37px; font-size: 11px; letter-spacing: 1px; text-transform: uppercase; background: #04de78; padding: 2px 40px; color: #fff; -ms-transform: rotate(-45deg); -webkit-transform: rotate(-45deg); transform: rotate(-45deg);} + .rtl .mec-calendar .mec-calendar-side .mec-next-month { border-bottom-right-radius: 6px; border-bottom-left-radius: 0; border-right: 1px solid #efefef; border-left: 0; left: 0; right: auto; direction: rtl;} + .rtl .mec-calendar .mec-calendar-side .mec-next-month .mec-sl-angle-right:before { content: "\e605";} + .rtl .mec-calendar .mec-calendar-side .mec-previous-month .mec-sl-angle-left:before { content: "\e606";} + .rtl .event-color, + .rtl .mec-event-article i { margin-right: 0; margin-right: 10px;} + + + /* #Slider View + ================================================== */ + .mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt { float:right; border-left: 1px solid #e6e6e6} + + /* #Map View + ================================================== */ + /* Map View */ + .mec-event-detail.mec-map-view-event-detail { text-align: right;} + .mec-event-article i { margin-left: 0; } + + /* #Cover View + ================================================== */ + .mec-wrap .mec-event-cover-clean .mec-event-date { right:auto; left:60px;} + + /* #Countdown View + ================================================== */ + /* Countdown View > Style1 */ + .mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1 { padding: 50px 4% 50px 1%;} + /* Countdown View > Style2 */ + .mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date-place { text-align: right;} + /* Countdown View > Style3 */ + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1 { padding: 50px 4% 50px 1%;} + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown { left:20px; right:auto;} + .mec-wrap .mec-event-countdown-style3 .mec-event-title-link { left:auto; right:190px;} + .mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-title { padding-right:0;} + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link { padding-left:0; padding-right:22px; margin-left:22px;} + .mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link:before { right:0; left:auto;} + .mec-wrap .mec-event-countdown-style3 .mec-event-date { left: auto; right: -27px;} + .mec-wrap .mec-event-countdown-style3 .mec-event-date:after { left:auto; right:8px; transform: rotate(-45deg);} + + /* #Masonry View + ================================================== */ + .mec-wrap .mec-masonry .mec-event-content .mec-event-description {display: block; direction: rtl; text-align: right;} + .mec-wrap .mec-masonry .mec-event-grid-modern .mec-event-content .mec-event-title .event-color { float: left;} + .mec-wrap .mec-masonry .event-grid-modern-head .mec-event-date {margin: 0 0 0 11px;} + .mec-wrap .mec-masonry .mec-masonry-col6 i {float: right; margin: 0 0 0 7px;} + + /* #Tile View + ================================================== */ + .mec-event-tile-view article.mec-tile-item .mec-event-time {right: auto; left: 4px;} + + /* #Timetable + ================================================== */ + .mec-wrap .mec-timetable-t2-content { direction: rtl; text-align: right;} + .mec-wrap .mec-timetable-t2-content div {text-align: right;} + .mec-wrap .mec-timetable-t2-content div i {margin-right: 0;margin-left: 5px;} + .mec-wrap .mec-timetable-t2-content div span {float: left;text-align: right;width: calc( 100% - 22px);} + + /* #Slider View + ================================================== */ + .mec-wrap .mec-event-content .mec-event-title a.mec-color-hover { float: right;} + .mec-wrap .mec-event-content .mec-event-title .event-color { float: left;} + + /* Slider View > Type1 */ + .mec-wrap .mec-slider-t1 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{ float: right; margin:0 0 0 11px;} + .mec-wrap .mec-slider-t1 .mec-event-grid-modern .event-grid-modern-head.clearfix { text-align: right;} + .mec-wrap .mec-slider-t1 .mec-event-content h4.mec-event-title { overflow: hidden; text-align: right;} + .mec-wrap .mec-slider-t1 .mec-event-content span.event-color { float: right; margin: 10px;} + .mec-wrap .mec-slider-t1 .mec-event-content .mec-event-detail { display:block; text-align:right;} + .mec-wrap .mec-event-grid-modern .mec-event-footer .mec-booking-button { left:auto; right:0;} + .mec-wrap .mec-slider-t1 .mec-slider-t1-img { float:left;} + /* Slider View > Type2 */ + .mec-wrap .mec-slider-t2 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{ float: right; margin:0 0 0 11px;} + .mec-wrap .mec-slider-t2 .mec-event-grid-modern .event-grid-modern-head.clearfix { text-align: right;} + .mec-wrap .mec-slider-t2 .mec-event-content h4.mec-event-title { overflow: hidden; text-align: right;} + .mec-wrap .mec-slider-t2 .mec-event-content span.event-color { float: right; margin: 10px;} + .mec-wrap .mec-slider-t2 .mec-event-content .mec-event-detail { display:block; text-align:right;} + .mec-wrap .mec-event-grid-modern .mec-event-footer .mec-booking-button { left:auto; right:0;} + .mec-wrap .mec-event-grid-modern .mec-event-sharing-wrap { left:0; right: auto;} + .mec-wrap .mec-slider-t2-wrap .mec-owl-theme .owl-nav div.owl-prev { left:30px; right:auto;} + .mec-wrap .mec-slider-t2-wrap .mec-owl-theme .owl-nav div.owl-next { left:82px; right:auto;} + .mec-wrap .mec-slider-t2-content.mec-event-grid-modern.mec-bg-color { left:0;} + .mec-wrap .mec-slider-t2 .mec-slider-t2-img { left:auto; right:0;} + /* Slider View > Type3 */ + .mec-wrap .mec-slider-t3 .mec-slider-t3-content { width:95%;} + .mec-wrap .mec-slider-t3 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{ float: right; margin:0 0 0 11px;} + .mec-wrap .mec-slider-t3 .mec-event-grid-modern .event-grid-modern-head.clearfix { text-align: right;} + .mec-wrap .mec-slider-t3 .mec-event-content h4.mec-event-title { overflow: hidden; text-align: right;} + .mec-wrap .mec-slider-t3 .mec-event-content span.event-color { float: right; margin: 10px;} + .mec-wrap .mec-slider-t3 .mec-event-content .mec-event-detail { display:block; text-align:right;} + .mec-wrap .mec-slider-t3 .mec-slider-t3-footer a.mec-booking-button { float: right; margin-bottom:11px;} + /* Slider View > Type4 */ + .mec-wrap .mec-slider-t4 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{ float: right; margin:0 0 0 11px;} + .mec-wrap .mec-slider-t4 .mec-event-grid-modern .event-grid-modern-head.clearfix { text-align: right;} + .mec-wrap .mec-slider-t4 .mec-event-content h4.mec-event-title { overflow: hidden; text-align: right;} + .mec-wrap .mec-slider-t4 .mec-event-content span.event-color { float: right; margin: 10px;} + .mec-wrap .mec-slider-t4 .mec-event-content .mec-event-detail { display:block; text-align:right;} + .mec-wrap .mec-slider-t4 .mec-slider-t4-footer a.mec-booking-button { float: right; margin-bottom:11px;} + .mec-slider-t4-content.mec-event-grid-modern { left:auto; right:8%;} + .mec-wrap .mec-slider-t4-wrap .mec-owl-theme .owl-nav div.owl-prev { left:30px; right:auto;} + .mec-wrap .mec-slider-t4-wrap .mec-owl-theme .owl-nav div.owl-next { left:82px; right:auto;} + + /* #FES Form + ================================================== */ + .mec-fes-form .mec-fes-form-cntt, .mec-fes-form .mec-fes-form-sdbr {direction: rtl;text-align: right;} + .mec-fes-form .mec-fes-form-cntt { float: right; padding-right: 0; padding-left: 20px;} + .mec-fes-form .mec-fes-form-sdbr { padding-right: 20px; padding-left: 0;} + .mec-fes-form .mec-fes-form-cntt .mec-col-4, .mec-fes-form .mec-fes-form-sdbr .mec-col-4 {float: unset;} + + /* #Responsive + ================================================== */ + @media only screen and (max-width: 768px) { + + /* LIST VIEW MODERN */ + .mec-event-list-modern .col-md-2.col-sm-2 { left: auto; right:0; } + .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper { right:auto; left:0;} + + /* LIST VIEW MINIMAL */ + .mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button { display: block; width: 100%;} + + /* COUNTDOWN VIEW */ + .mec-wrap .mec-event-countdown-style3 .mec-event-date { right:0;} + .mec-wrap .mec-event-countdown-style3 .mec-event-title-link { right:130px;} + + } + + @media only screen and (min-width: 480px) { + /* LIST VIEW MODERN */ + .mec-event-list-modern .mec-btn-wrapper .mec-booking-button { float:left;} + } + + /* Archive Page */ + .mec-wrap .mec-event-content .mec-event-title .event-color {float: right; margin-top: 10px;} + .mec-event-list-standard .mec-event-title, + .mec-wrap .mec-event-content .mec-event-title a.mec-color-hover , + .mec-wrap .mec-event-content .mec-event-description {display: flex;} + .mec-event-description { + line-height: 1.7; + } + .mec-event-list-standard .mec-date-details, + .mec-event-list-standard .mec-time-details, + .mec-event-list-standard .mec-venue-details {text-align: right; padding-right: 28px; direction: rtl;} + .mec-wrap .mec-event-meta.mec-color-before, + .mec-wrap .mec-event-meta.mec-color-before span {margin: 0; marign-left: 28px; direction: rtl; text-align: right;} + .mec-skin-daily-view-events-container .mec-owl-carousel .owl-wrapper { display: inline-flex !important;width: 100% !important; } + +/* --------------------- */ + +/** + * RTL + * * * * */ + body.rtl .mec-wrap .col-md-1, body.rtl .mec-wrap .col-md-10, body.rtl .mec-wrap .col-md-11, body.rtl .mec-wrap .col-md-12, body.rtl .mec-wrap .col-md-2, body.rtl .mec-wrap .col-md-3, body.rtl .mec-wrap .col-md-4, body.rtl .mec-wrap .col-md-5, body.rtl .mec-wrap .col-md-6, body.rtl .mec-wrap .col-md-7, body.rtl .mec-wrap .col-md-8, body.rtl .mec-wrap .col-md-9 { + float: right !important; +} + +body.rtl .ui-datepicker.ui-widget select { + width: 32%; +} + +/** SHORTCODE RTL **/ +body.rtl .mec-wrap .mec-cancellation-reason span, body.rtl .mec-wrap .mec-labels-normal .mec-label-normal { + margin-left: 0px; + margin-right: 10px; +} + +body.rtl .mec-calendar .mec-calendar-events-side .mec-table-side-title, +body.rtl .mec-event-footer .mec-booking-button, +body.rtl .mec-wrap .mec-load-more-button { + letter-spacing: 0; +} + +body.rtl .mec-wrap .mec-time-details { + direction: ltr; +} + +/* full calendar search box*/ +body.rtl .mec-wrap .mec-search-form.mec-totalcal-box .col-md-6 { + float: left !important; +} + +/* list view classic */ +body.rtl .mec-wrap .mec-event-list-classic .mec-event-date, body.rtl .mec-wrap .mec-event-list-classic .mec-event-time { + margin-right: 0; + margin-left: 5px; + padding-right: 20px; + position: relative; +} + +body.rtl .mec-wrap .mec-event-list-classic .mec-event-article i { + position: absolute; + left: auto; + right: 0; + top: 2px; + margin: 0; +} + +/* list view minimal */ +body.rtl .mec-wrap .mec-event-list-minimal .mec-event-article .col-md-9.col-sm-9 { + width: 75%; +} + +body.rtl .mec-wrap .mec-event-list-minimal .event-color, body.rtl .mec-wrap .mec-event-list-minimal .mec-event-article i { + margin: 0 0 0 10px; +} + +body.rtl .mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button { + letter-spacing: 0; +} + +/* list view modern */ +@media only screen and (min-width: 768px) { + body.rtl .mec-event-list-modern .col-md-2.col-sm-2 { + left: auto; + right: 0; + top: 20px; + } + + .mec-event-list-modern .col-md-6.col-sm-6 { + padding-right: 225px; + padding-left: 195px; + } + + .mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper { + right: auto; + left: 0; + top: 30%; + } +} + +body.rtl .mec-event-list-modern .mec-event-detail .mec-time-details, body.rtl .mec-event-list-modern .mec-event-detail { + direction: ltr; + text-align: right; +} + +body.rtl .mec-event-list-modern .mec-event-article { + direction: rtl; + text-align: right; +} + +body.rtl .mec-event-list-modern .mec-event-date .event-f, body.rtl .mec-event-list-modern .mec-btn-wrapper .mec-booking-button { + letter-spacing: 0; +} + +body.rtl .mec-event-list-modern .mec-event-sharing { + padding: 0 0 0 0; +} + +body.rtl .mec-event-list-modern .mec-event-sharing>li { + margin: 0 0 0 0; +} + +body.rtl .mec-event-list-modern .mec-event-sharing>li i { + margin: 0 0 0 10px; +} + +/* list view standard */ +body.rtl .mec-event-list-standard .mec-event-footer .mec-booking-button { + letter-spacing: 0; +} + +body.rtl .mec-event-list-standard .mec-shortcode-organizers { + padding: 0 20px 0 0; +} + +body.rtl .mec-event-list-standard .mec-shortcode-organizers .mec-sl-user:before { + left: auto; + right: 0; +} + +/* list view toggle */ +body.rtl .mec-events-toggle .mec-toggle-item-inner i { + right: auto; + left: 25px; + top: 50%; +} + +body.rtl .mec-events-toggle .mec-toggle-title { + text-align: right; + padding-left: 0; + padding-right: 15px; + float: right; +} + +/* grid view minimal */ +body.rtl .mec-event-grid-minimal .mec-event-title { + direction: rtl; +} + +body.rtl .mec-event-grid-minimal .mec-event-title a { + float: right; +} + +body.rtl .mec-event-grid-modern .mec-event-sharing { + right: auto; + left: -5px; +} + +/* grid view minimal */ +body.rtl .mec-event-grid-simple .mec-event-article:after { + right: auto; + left: -1px; +} + +body.rtl .mec-event-grid-simple .event-color { + margin: 0 10px; +} + +body.rtl .mec-event-grid-simple .mec-time-details { + text-align: center; +} + +/* grid view nover */ +body.rtl .mec-event-grid-novel .mec-event-address::before, body.rtl .mec-event-grid-novel .mec-event-detail::before, body.rtl .mec-event-grid-novel .mec-event-month::before, body.rtl .mec-event-grid-novel .mec-local-time-details:before { + left: auto; + right: 0; +} + +body.rtl .mec-event-grid-novel .mec-event-address, body.rtl .mec-event-grid-novel .mec-event-detail, body.rtl .mec-event-grid-novel .mec-event-month, body.rtl .mec-event-grid-novel .mec-local-time-details { + padding-right: 35px; + padding-left: 35px; +} + +body.rtl .mec-event-grid-novel .mec-event-image { + float: right; +} + +body.rtl .mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-detail-wrap { + margin-left: 0; + margin-right: 150px; +} + +body.rtl .mec-event-grid-novel .mec-event-content h4::after, body.rtl .mec-event-grid-novel .mec-event-content h4::before { + left: auto; + right: -30px; +} + +body.rtl .mec-event-grid-novel .mec-event-content h4::after { + right: -26px; +} + +/* daily view */ +body.rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-time i { + margin: 0 0 0 7px; +} + +body.rtl .mec-calendar .mec-event-article .mec-event-title a { + float: right; +} + +/* agenda view */ +body.rtl .mec-agenda-time { + margin: 0 0 0 0; + direction: ltr; + padding: 0; + text-align: right; +} + +body.rtl .mec-agenda-event-title { + float: left; + width: calc(100% - 170px); + padding: 0 20px 0 0; +} + +body.rtl .mec-agenda-event-title span.event-color { + left: auto; + right: -0; + top: 8px; +} + +/* single event */ +body.rtl .mec-hourly-schedule-speaker-thumbnail, body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a img { + float: right; +} + +body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-name { + padding: 0 10px 0 0; +} + +body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-job-title { + padding: 0 80px 0 0; +} + +body.rtl .mec-hourly-schedule-speaker-details { + padding: 0 20px 0 0; +} + +body.rtl .mec-hourly-schedule-speaker-name, body.rtl .mec-hourly-schedule-speaker-job-title, body.rtl .mec-hourly-schedule-speaker-contact-information, body.rtl .mec-organizer-social-information, body.rtl .mec-hourly-schedule-speaker-description { + text-align: right; +} + +body.rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt { + font-size: 10px !important; +} + +body.rtl .mec-wrap .mec-events-meta-group-booking .mec-booking-calendar .mec-calendar dl dt { + text-align: center !important; +} + +body.rtl .mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd a { + direction: ltr; +} + +body.rtl .mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul { + padding: 0; +} + +/* Booking module */ +.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon, +.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon, +.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon, +.rtl .lity-content .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon, +.rtl .mec-single-event .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon, +.rtl .mec-booking-shortcode .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon { + border-right: none; + border-left: 1px solid #e3e5e7; +} + +.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-1 { + margin: 5px 0 0 25px; +} + +.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-3 { + margin-left: unset; + margin-right: auto; +} + +.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row input[type="number"] { + margin: 0 auto 10px 0; +} + +.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus, +.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus { + right: unset; + left: 5px; +} + +.rtl .mec-events-meta-group-booking #mec-book-form-btn-step-1, +.rtl .mec-events-meta-group-booking #mec-book-form-btn-step-2 { + float: left; +} + +.rtl .mec-wrap .button svg, +.rtl .mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not(.owl-next):not(.et-fb-button) svg, +.rtl .mec-wrap input[type="submit"] svg, +.rtl .mec-wrap input[type="reset"] svg, +.rtl .mec-wrap input[type="button"] svg, +.rtl .lity-content .button svg, +.rtl .lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not(.owl-next) svg, +.rtl .lity-content input[type="submit"] svg, +.rtl .lity-content input[type="reset"] svg, +.rtl .lity-content input[type="button"] svg { + margin-left: unset; + margin-right: 30px; + transform: rotate(180deg); +} + +.mec-booking-shortcode button#mec-book-form-btn-step-2 { + margin-left: unset; + margin-right: 30px; +} + +.rtl .mec-single-event a.button:after, +.rtl .lity-content .mec-events-meta-group-booking button[type="submit"]:after, +.rtl .mec-single-event .mec-events-meta-group-booking button[type="submit"]:after, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode button[type="submit"]:after, +.rtl .mec-wrap .mec-events-meta-group-booking button[type="submit"]:after { + margin-left: unset; + margin-right: 4px; +} + +.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2, +.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3, +.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3 { + float: right; +} + +.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon, +.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon, +.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon, +.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon { + margin-right: unset; + margin-left: 30px; + transform: rotate(180deg); +} + +.rtl .lity-content .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper, +.rtl .mec-single-event .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .col-md-12 .mec-ticket-icon-wrapper { + margin-right: unset; + margin-left: 25px; +} + +.rtl .lity-content .mec-events-meta-group-booking label, +.rtl .mec-single-event .mec-events-meta-group-booking label, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode label, +.rtl .lity-content .mec-events-meta-group-booking h5, +.rtl .mec-single-event .mec-events-meta-group-booking h5, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode h5 { + padding: 0 0 5px 1em; + text-align: right; +} + +.rtl .lity-content .mec-events-meta-group-booking p { + text-align: right; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper span.mec-booking-email-field-icon, +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper span.mec-booking-name-field-icon, +.rtl .lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode ..mec-stripe-name-and-email-wrapper span.mec-field-icon, +.rtl .lity-content .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper span.mec-field-icon { + border-radius: 0 3px 3px 0; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper input, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper input, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper input, +.rtl .lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-stripe-name-and-email-wrapper input, +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper input, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper input, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper input, +.rtl .lity-content .mec-events-meta-group-booking .mec-field-wrapper input, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-field-wrapper input, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper input { + border-left: 1px solid #e3e5e7; + border-right: none; + border-radius: 3px 0 0 3px; +} + +.rtl .lity-content .mec-events-meta-group-booking input[type="checkbox"], +.rtl .mec-single-event .mec-events-meta-group-booking input[type="checkbox"], +.rtl .mec-events-meta-group-booking .mec-booking-shortcode input[type="checkbox"] { + float: right; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec_book_first_for_all, +.rtl .mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all, +.rtl .lity-container .mec-events-meta-group-booking .mec_book_first_for_all, +.rtl .lity-content .mec-events-meta-group-booking input[type="checkbox"], +.rtl .mec-single-event .mec-events-meta-group-booking input[type="checkbox"], +.rtl .mec-events-meta-group-booking .mec-booking-shortcode input[type="checkbox"], +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type="checkbox"], +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type="checkbox"], +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type="checkbox"], +.rtl .mec-booking input[type="checkbox"] { + margin: 0 0 0 10px; +} + +.rtl .mec-book-reg-field-checkbox input[type="checkbox"], +.rtl .mec-book-reg-field-radio input[type="radio"] { + float: right; + margin-right: unset !important; + margin-left: 10px !important; + top: 3px; + right: 3px; +} + +.rtl .mec-events-meta-group-booking ul.mec-book-price-details li { + border-right: none; + border-left: 1px dashed #e6e7e8; + margin-right: unset; + margin-left: 30px; + padding-right: unset !important; + padding-left: 30px !important; +} + +.rtl .mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-icon { + margin: 0 0 0 30px; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button { + left: 6px; + right: auto; +} + +.rtl .lity-content .mec-events-meta-group-booking ul, +.rtl .mec-single-event .mec-events-meta-group-booking ul, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode ul { + padding-left: unset; + padding-right: 0; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon { + border-right: none; + border-left: 1px solid #e3e5e7; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child { + padding-right: unset; + margin-right: unset; + border-right: unset; + padding-left: 30px; + margin-left: 30px; + border-left: 1px dashed #e6e7e8; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li { + text-align: left; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(2n + 1), +.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(2n + 1), +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(2n + 1) { + margin-right: unset; + margin-left: 20px; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio, +.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio { + margin-left: unset; + margin-right: auto; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg, +.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg { + margin-right: unset; + margin-left: 10px; +} + +.rtl .lity-content .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay #mec_woo_add_to_cart_btn_r, +.rtl .lity-content .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button, +.rtl .mec-single-event .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button, +.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay button.mec-book-form-next-button { + float: left; +} + +.rtl .mec-book-form-gateway-checkout [id*="mec_do_transaction_stripe_"] .mec-form-row.mec-stripe-name-and-email-wrapper .mec-form-row:nth-child(2) { + margin-left: unset; + margin-right: 12px; +} + +.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons, +.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons, +.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons { + right: unset; + left: 10px; +} + +.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container, +.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container, +.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container { + right: unset; + left: 40px; +} + +.rtl .mec-booking-calendar-month-navigation .mec-previous-month { + left: unset; + right: 0; +} + +.rtl .mec-booking-calendar-month-navigation .mec-next-month { + right: unset; + left: 0; +} + +.rtl .mec-select-date-calendar-container .mec-calendar.mec-event-calendar-classic dl dt { + text-align: center; +} + +.rtl .mec-booking-calendar-month-navigation .mec-previous-month a i:before { + content: "\e606"; +} + +.rtl .mec-booking-calendar-month-navigation .mec-next-month a i:before { + content: "\e605"; +} + +/* --------------------- */ diff --git a/assets/css/mecrtl.min.css b/assets/css/mecrtl.min.css new file mode 100755 index 0000000..60ab88e --- /dev/null +++ b/assets/css/mecrtl.min.css @@ -0,0 +1 @@ +.mec-single-event .mec-events-meta-date i,.mec-single-event .mec-single-event-organizer i{margin-left:10px;margin-right:12px}.event-color,.mec-event-schedule-content,.mec-single-event .mec-frontbox-title:before{margin-left:0}.mec-event-cover-classic .mec-event-icon{margin-left:14px}.event-color{margin-right:5px}.mec-event-list-classic .mec-event-image{margin-left:20px}.mec-event-article i{margin-left:10px}.mec-event-cover-classic .mec-event-icon,.mec-event-list-classic .mec-event-image{margin-right:0}.mec-single-event .mec-frontbox-title:before{margin-right:39px}.mec-event-schedule-content{margin-right:25px}.mec-event-schedule-content dl,.mec-single-event .mec-event-meta dt,.mec-single-event .mec-event-meta h3{padding-left:0}.mec-single-event .mec-event-meta dt,.mec-single-event .mec-event-meta h3{padding-right:10px}.mec-event-schedule-content dl{padding-right:24px}.mec-event-schedule-content{border:0}.mec-event-schedule-content{border-right:4px solid #f0f0f0}.mec-event-cover-modern .mec-event-cover-a,.mec-event-schedule-content dl:before{left:auto}.mec-event-cover-modern .mec-event-cover-a,.mec-event-schedule-content dl:before{right:0}.mec-event-cover-classic .mec-event-icon,.mec-event-list-classic .mec-event-image{float:right}.mec-event-cover-classic .mec-btn-wrapper{text-align:right}.mec-wrap .mec-calendar-topsec .mec-calendar-events-sec .mec-table-side-day{padding:0}.mec-wrap article.mec-event-article.mec-clear{text-align:right}.mec-wrap .mec-event-article .mec-event-content p{text-align:right}.mec-wrap .button,.mec-wrap button,.mec-wrap input[type=button],.mec-wrap input[type=reset],.mec-wrap input[type=submit]{margin:0}.mec-wrap .mec-events-meta-group-booking .mec-book-price-details li{float:right}.mec-wrap .mec-events-meta-group-booking .mec-book-price-details{width:330px}.mec-wrap .mec-marker-wrap .mec-marker-pulse{margin:-15px 28px 1px 40px}.mec-wrap .mec-marker-wrap .mec-marker-pulse:after{margin:-13px -13px 0 0}.mec-fes-list ul li .mec-fes-event-remove,.mec-fes-list ul li .mec-fes-event-view{float:left}.mec-fes-form input[type=checkbox],.mec-fes-form input[type=radio]{float:right;margin:5px}.mec-fes-form #mec_fes_form .mec-form-row #mec_cost{float:none}.mec-fes-form label{padding-right:0}.mec-wrap .mec-totalcal-box i{float:right;text-align:center}.mec-totalcal-box .mec-date-search{float:left}.mec-wrap .mec-single-modern .mec-single-event-bar>div i{float:right;padding-left:10px}.mec-wrap .mec-single-modern .mec-single-event-bar dd{margin:0 30px 0 0;padding:0}.mec-wrap .mec-event-meta.mec-color-before.mec-frontbox{width:100%}.mec-wrap .mec-single-modern .mec-event-meta .mec-single-event-organizer dd a{float:left;position:absolute;margin-right:5px}.mec-wrap .mec-single-event .mec-single-event-organizer i{margin-top:5px}.mec-wrap .mec-single-event .mec-event-meta i{float:right;padding-left:5px}.mec-wrap .mec-single-event .mec-event-meta dt,.mec-wrap .mec-single-event .mec-event-meta h3{padding-right:5px}.mec-wrap .mec-single-event .mec-event-meta dd{padding-right:35px;padding-left:0}.mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd{padding:0}.mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd a{float:left;position:absolute;margin-right:5px}.mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:after{font-family:FontAwesome;color:#40d9f1;font-size:16px;content:"\f104";padding-left:10px}.mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:before{content:"";padding:0}.mec-wrap .mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul li:last-child{text-align:left;padding-left:0}.mec-wrap .mec-single-event .mec-events-button{margin:0}.mec-wrap .mec-calendar .mec-event-article .mec-event-image{float:right;margin-left:20px}.mec-wrap .mec-calendar .mec-event-article .mec-event-title{text-align:right;padding:5px}.mec-wrap .mec-calendar .mec-event-article .mec-event-time i{float:right}.mec-wrap .mec-calendar .mec-event-article .mec-event-time.mec-color{float:right}.mec-wrap .mec-calendar .mec-event-article .mec-event-detail{float:right}.mec-wrap .mec-calendar.mec-calendar-weekly .mec-event-list-weekly-date{float:right}.mec-wrap .mec-event-meta-wrap{border-right:1px solid #eee;border-left:0}.mec-event-meta{float:right}.mec-event-sharing-wrap{right:20px;left:auto}.mec-event-footer .mec-booking-button{right:auto;left:20px}.mec-single-event .mec-single-event-organizer dd span,.mec-wrap .mec-single-event .mec-events-meta-date dd span{padding-bottom:20px}.single-mec-events .mec-wrap .col-md-4{direction:rtl;float:right}.single-mec-events .mec-wrap .mec-single-modern .col-md-4{margin-top:-50px}.mec-events-template-default .mec-wrap .col-md-4{margin-top:0;float:left}.mec-events-template-default .mec-wrap .col-md-8{margin-top:0;float:right}.single-mec-events .mec-single-modern .mec-single-event-bar{padding:14px 0}.single-mec-events .mec-single-modern .col-md-4 .mec-frontbox{margin:0}.mec-single-event .mec-frontbox-title:before,.single-mec-events .mec-single-event .mec-events-meta-group-booking form>h4:before{transform:translate(-50%);margin:0}.single-mec-events .mec-single-event-category,.single-mec-events .mec-single-event-location,.single-mec-events .mec-single-event-organizer{z-index:1}.single-mec-events .mec-single-event .mec-booking-button{position:relative;z-index:2}.single-mec-events .mec-wrap .mec-single-event .mec-event-meta dd a i:before{content:'\f104';line-height:32px}.single-mec-events .mec-wrap .mec-single-event .mec-event-meta dd.mec-events-event-categories:after{display:none}.mec-wrap .mec-event-list-standard .mec-event-meta-wrap{display:table-cell}.mec-wrap .mec-totalcal-box i{float:right}.mec-wrap i.mec-sl-map-marker{float:right;margin-left:3px}.mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button{float:left}.mec-wrap .mec-event-list-minimal .mec-event-article .col-md-9.col-sm-9{float:right;width:100%}.mec-wrap .mec-event-list-minimal .mec-event-article .mec-event-date.mec-bg-color{float:right;margin-right:0;margin-left:10px}.mec-wrap .mec-event-list-minimal .mec-event-date span{padding-left:25px;margin-left:7px;padding-right:0;margin-right:0}.mec-event-grid-clean .mec-event-footer .mec-booking-button{left:0;right:auto}.mec-event-grid-clean .mec-event-sharing-wrap{left:auto;right:0}.mec-event-grid-clean .event-grid-t2-head .mec-event-date{float:right;margin-right:0;margin-left:11px}.mec-event-grid-clean .event-grid-t2-head{text-align:right}.mec-event-grid-clean .event-grid-t2-head .mec-event-month{text-align:right}.mec-event-grid-clean .event-grid-t2-head .mec-event-detail{text-align:right}.mec-event-grid-minimal .mec-event-date{margin-right:0;margin-left:20px}.mec-wrap .mec-event-grid-modern .mec-event-article .event-grid-modern-head .mec-event-date.mec-color{margin-left:11px;margin-right:0}.mec-wrap .mec-event-grid-modern .mec-event-content .mec-event-title .event-color{float:right;margin:7px}.mec-wrap .mec-event-grid-modern .mec-event-article h4.mec-event-title{overflow:hidden}.mec-wrap .mec-event-grid-simple article.mec-event-article.mec-clear{text-align:center}.mec-wrap .mec-event-grid-simple article.mec-event-article h4.mec-event-title{text-align:center}.mec-wrap .mec-event-grid-modern .event-grid-modern-head .mec-event-date{float:right}.mec-wrap .mec-event-article h4.mec-event-title{text-align:right}.mec-wrap .event-grid-modern-head.clearfix{text-align:right}.mec-wrap .event-carousel-type1-head .mec-event-date-carousel{left:auto;right:1px;padding-left:21px;padding-right:25px}.mec-wrap .event-carousel-type1-head .mec-event-date-info-year{right:auto;left:60px}.mec-wrap .event-carousel-type1-head .mec-event-date-info{right:auto;left:60px}.mec-wrap .event-carousel-type1-head .mec-event-date-carousel:after{left:auto;bottom:-13px;right:5px;transform:rotate(-45deg)}.mec-wrap .event-carousel-type2-head .mec-event-footer-carousel-type2 .mec-booking-button{float:left}.mec-wrap .mec-event-carousel-type2 .mec-event-footer-carousel-type2 .mec-event-sharing-wrap{left:auto;right:-11px}.mec-wrap .event-carousel-type3-head .mec-event-footer-carousel-type3 .mec-booking-button{float:left}.mec-wrap .mec-event-footer-carousel-type3 .mec-event-sharing-wrap{left:auto;right:11%}.mec-event-list-standard .mec-time-details:before,.mec-event-list-standard .mec-venue-details:before,.mec-wrap .mec-event-list-standard .mec-date-details:before{right:0;text-align:right}.mec-wrap .mec-event-meta.mec-color-before span{margin-right:28px}.mec-wrap .mec-timetable-t2-col{float:right}.mec-wrap .mec-agenda-date-wrap{float:right}.mec-wrap .mec-agenda-events-wrap{float:left}.mec-wrap .mec-yearly-view-wrap .mec-yearly-calendar-sec{float:right}.mec-wrap .mec-yearly-agenda-sec{float:left;padding:0 20px 0 0}.rtl .mec-yearly-view-wrap .mec-yearly-title-sec{direction:rtl}.rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year{right:20px;left:auto}.rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year{left:20px;right:auto;direction:ltr}.rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-next-year .mec-sl-angle-right:before{content:"\e605"}.rtl .mec-yearly-view-wrap .mec-yearly-title-sec .mec-previous-year .mec-sl-angle-left:before{content:"\e606"}.mec-wrap .mec-calendar.mec-event-calendar-classic .mec-calendar-events-sec{text-align:right}.mec-wrap .mec-skin-monthly-view-month-navigator-container .mec-calendar-events-sec h3.mec-color.mec-table-side-day{float:right}.rtl .mec-calendar.mec-event-calendar-classic dl dt{text-align:right}.rtl .mec-calendar.mec-event-calendar-classic .mec-has-event:after{left:auto;right:7px}.rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-next-month{right:auto}.rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-side .mec-previous-month{left:auto}.rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-title{direction:rtl}.rtl .mec-calendar .mec-calendar-events-side{border-right:1px solid #efefef}.rtl .mec-calendar .mec-event-article,.rtl .mec-month-navigator{direction:ltr}.rtl .mec-calendar .mec-calendar-side .mec-previous-month{border-bottom-left-radius:6px;border-bottom-right-radius:0;border-left:1px solid #efefef;border-right:0;left:auto;right:0;direction:rtl}.rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-image{float:right;margin-left:20px;margin-right:0}.rtl .mec-wrap article:not([class^=mec-event-countdown]):not([class^=mec-event-cover-]).mec-label-canceled:before,.rtl .mec-wrap article:not([class^=mec-event-countdown]):not([class^=mec-event-cover-]).mec-label-featured:before{z-index:1;position:absolute;top:25px;right:auto;left:-37px;font-size:11px;letter-spacing:1px;text-transform:uppercase;background:#04de78;padding:2px 40px;color:#fff;-ms-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.rtl .mec-calendar .mec-calendar-side .mec-next-month{border-bottom-right-radius:6px;border-bottom-left-radius:0;border-right:1px solid #efefef;border-left:0;left:0;right:auto;direction:rtl}.rtl .mec-calendar .mec-calendar-side .mec-next-month .mec-sl-angle-right:before{content:"\e605"}.rtl .mec-calendar .mec-calendar-side .mec-previous-month .mec-sl-angle-left:before{content:"\e606"}.rtl .event-color,.rtl .mec-event-article i{margin-right:0;margin-right:10px}.mec-calendar.mec-calendar-daily .mec-calendar-d-table dl dt{float:right;border-left:1px solid #e6e6e6}.mec-event-detail.mec-map-view-event-detail{text-align:right}.mec-event-article i{margin-left:0}.mec-wrap .mec-event-cover-clean .mec-event-date{right:auto;left:60px}.mec-wrap .mec-event-countdown-style1 .mec-event-countdown-part1{padding:50px 4% 50px 1%}.mec-wrap .mec-event-countdown-style2 .mec-event-countdown-part2 .mec-event-date-place{text-align:right}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part1{padding:50px 4% 50px 1%}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown{left:20px;right:auto}.mec-wrap .mec-event-countdown-style3 .mec-event-title-link{left:auto;right:190px}.mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-title{padding-right:0}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link{padding-left:0;padding-right:22px;margin-left:22px}.mec-wrap .mec-event-countdown-style3 .mec-event-countdown-part-details .mec-event-link:before{right:0;left:auto}.mec-wrap .mec-event-countdown-style3 .mec-event-date{left:auto;right:-27px}.mec-wrap .mec-event-countdown-style3 .mec-event-date:after{left:auto;right:8px;transform:rotate(-45deg)}.mec-wrap .mec-masonry .mec-event-content .mec-event-description{display:block;direction:rtl;text-align:right}.mec-wrap .mec-masonry .mec-event-grid-modern .mec-event-content .mec-event-title .event-color{float:left}.mec-wrap .mec-masonry .event-grid-modern-head .mec-event-date{margin:0 0 0 11px}.mec-wrap .mec-masonry .mec-masonry-col6 i{float:right;margin:0 0 0 7px}.mec-event-tile-view article.mec-tile-item .mec-event-time{right:auto;left:4px}.mec-wrap .mec-timetable-t2-content{direction:rtl;text-align:right}.mec-wrap .mec-timetable-t2-content div{text-align:right}.mec-wrap .mec-timetable-t2-content div i{margin-right:0;margin-left:5px}.mec-wrap .mec-timetable-t2-content div span{float:left;text-align:right;width:calc(100% - 22px)}.mec-wrap .mec-event-content .mec-event-title a.mec-color-hover{float:right}.mec-wrap .mec-event-content .mec-event-title .event-color{float:left}.mec-wrap .mec-slider-t1 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{float:right;margin:0 0 0 11px}.mec-wrap .mec-slider-t1 .mec-event-grid-modern .event-grid-modern-head.clearfix{text-align:right}.mec-wrap .mec-slider-t1 .mec-event-content h4.mec-event-title{overflow:hidden;text-align:right}.mec-wrap .mec-slider-t1 .mec-event-content span.event-color{float:right;margin:10px}.mec-wrap .mec-slider-t1 .mec-event-content .mec-event-detail{display:block;text-align:right}.mec-wrap .mec-event-grid-modern .mec-event-footer .mec-booking-button{left:auto;right:0}.mec-wrap .mec-slider-t1 .mec-slider-t1-img{float:left}.mec-wrap .mec-slider-t2 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{float:right;margin:0 0 0 11px}.mec-wrap .mec-slider-t2 .mec-event-grid-modern .event-grid-modern-head.clearfix{text-align:right}.mec-wrap .mec-slider-t2 .mec-event-content h4.mec-event-title{overflow:hidden;text-align:right}.mec-wrap .mec-slider-t2 .mec-event-content span.event-color{float:right;margin:10px}.mec-wrap .mec-slider-t2 .mec-event-content .mec-event-detail{display:block;text-align:right}.mec-wrap .mec-event-grid-modern .mec-event-footer .mec-booking-button{left:auto;right:0}.mec-wrap .mec-event-grid-modern .mec-event-sharing-wrap{left:0;right:auto}.mec-wrap .mec-slider-t2-wrap .mec-owl-theme .owl-nav div.owl-prev{left:30px;right:auto}.mec-wrap .mec-slider-t2-wrap .mec-owl-theme .owl-nav div.owl-next{left:82px;right:auto}.mec-wrap .mec-slider-t2-content.mec-event-grid-modern.mec-bg-color{left:0}.mec-wrap .mec-slider-t2 .mec-slider-t2-img{left:auto;right:0}.mec-wrap .mec-slider-t3 .mec-slider-t3-content{width:95%}.mec-wrap .mec-slider-t3 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{float:right;margin:0 0 0 11px}.mec-wrap .mec-slider-t3 .mec-event-grid-modern .event-grid-modern-head.clearfix{text-align:right}.mec-wrap .mec-slider-t3 .mec-event-content h4.mec-event-title{overflow:hidden;text-align:right}.mec-wrap .mec-slider-t3 .mec-event-content span.event-color{float:right;margin:10px}.mec-wrap .mec-slider-t3 .mec-event-content .mec-event-detail{display:block;text-align:right}.mec-wrap .mec-slider-t3 .mec-slider-t3-footer a.mec-booking-button{float:right;margin-bottom:11px}.mec-wrap .mec-slider-t4 .mec-event-grid-modern .event-grid-modern-head .mec-event-date{float:right;margin:0 0 0 11px}.mec-wrap .mec-slider-t4 .mec-event-grid-modern .event-grid-modern-head.clearfix{text-align:right}.mec-wrap .mec-slider-t4 .mec-event-content h4.mec-event-title{overflow:hidden;text-align:right}.mec-wrap .mec-slider-t4 .mec-event-content span.event-color{float:right;margin:10px}.mec-wrap .mec-slider-t4 .mec-event-content .mec-event-detail{display:block;text-align:right}.mec-wrap .mec-slider-t4 .mec-slider-t4-footer a.mec-booking-button{float:right;margin-bottom:11px}.mec-slider-t4-content.mec-event-grid-modern{left:auto;right:8%}.mec-wrap .mec-slider-t4-wrap .mec-owl-theme .owl-nav div.owl-prev{left:30px;right:auto}.mec-wrap .mec-slider-t4-wrap .mec-owl-theme .owl-nav div.owl-next{left:82px;right:auto}.mec-fes-form .mec-fes-form-cntt,.mec-fes-form .mec-fes-form-sdbr{direction:rtl;text-align:right}.mec-fes-form .mec-fes-form-cntt{float:right;padding-right:0;padding-left:20px}.mec-fes-form .mec-fes-form-sdbr{padding-right:20px;padding-left:0}.mec-fes-form .mec-fes-form-cntt .mec-col-4,.mec-fes-form .mec-fes-form-sdbr .mec-col-4{float:unset}@media only screen and (max-width:768px){.mec-event-list-modern .col-md-2.col-sm-2{left:auto;right:0}.mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper{right:auto;left:0}.mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button{display:block;width:100%}.mec-wrap .mec-event-countdown-style3 .mec-event-date{right:0}.mec-wrap .mec-event-countdown-style3 .mec-event-title-link{right:130px}}@media only screen and (min-width:480px){.mec-event-list-modern .mec-btn-wrapper .mec-booking-button{float:left}}.mec-wrap .mec-event-content .mec-event-title .event-color{float:right;margin-top:10px}.mec-event-list-standard .mec-event-title,.mec-wrap .mec-event-content .mec-event-description,.mec-wrap .mec-event-content .mec-event-title a.mec-color-hover{display:flex}.mec-event-description{line-height:1.7}.mec-event-list-standard .mec-date-details,.mec-event-list-standard .mec-time-details,.mec-event-list-standard .mec-venue-details{text-align:right;padding-right:28px;direction:rtl}.mec-wrap .mec-event-meta.mec-color-before,.mec-wrap .mec-event-meta.mec-color-before span{margin:0;marign-left:28px;direction:rtl;text-align:right}.mec-skin-daily-view-events-container .mec-owl-carousel .owl-wrapper{display:inline-flex!important;width:100%!important}body.rtl .mec-wrap .col-md-1,body.rtl .mec-wrap .col-md-10,body.rtl .mec-wrap .col-md-11,body.rtl .mec-wrap .col-md-12,body.rtl .mec-wrap .col-md-2,body.rtl .mec-wrap .col-md-3,body.rtl .mec-wrap .col-md-4,body.rtl .mec-wrap .col-md-5,body.rtl .mec-wrap .col-md-6,body.rtl .mec-wrap .col-md-7,body.rtl .mec-wrap .col-md-8,body.rtl .mec-wrap .col-md-9{float:right!important}body.rtl .ui-datepicker.ui-widget select{width:32%}body.rtl .mec-wrap .mec-cancellation-reason span,body.rtl .mec-wrap .mec-labels-normal .mec-label-normal{margin-left:0;margin-right:10px}body.rtl .mec-calendar .mec-calendar-events-side .mec-table-side-title,body.rtl .mec-event-footer .mec-booking-button,body.rtl .mec-wrap .mec-load-more-button{letter-spacing:0}body.rtl .mec-wrap .mec-time-details{direction:ltr}body.rtl .mec-wrap .mec-search-form.mec-totalcal-box .col-md-6{float:left!important}body.rtl .mec-wrap .mec-event-list-classic .mec-event-date,body.rtl .mec-wrap .mec-event-list-classic .mec-event-time{margin-right:0;margin-left:5px;padding-right:20px;position:relative}body.rtl .mec-wrap .mec-event-list-classic .mec-event-article i{position:absolute;left:auto;right:0;top:2px;margin:0}body.rtl .mec-wrap .mec-event-list-minimal .mec-event-article .col-md-9.col-sm-9{width:75%}body.rtl .mec-wrap .mec-event-list-minimal .event-color,body.rtl .mec-wrap .mec-event-list-minimal .mec-event-article i{margin:0 0 0 10px}body.rtl .mec-wrap .mec-event-list-minimal .btn-wrapper .mec-detail-button{letter-spacing:0}@media only screen and (min-width:768px){body.rtl .mec-event-list-modern .col-md-2.col-sm-2{left:auto;right:0;top:20px}.mec-event-list-modern .col-md-6.col-sm-6{padding-right:225px;padding-left:195px}.mec-event-list-modern .col-md-4.col-sm-4.mec-btn-wrapper{right:auto;left:0;top:30%}}body.rtl .mec-event-list-modern .mec-event-detail,body.rtl .mec-event-list-modern .mec-event-detail .mec-time-details{direction:ltr;text-align:right}body.rtl .mec-event-list-modern .mec-event-article{direction:rtl;text-align:right}body.rtl .mec-event-list-modern .mec-btn-wrapper .mec-booking-button,body.rtl .mec-event-list-modern .mec-event-date .event-f{letter-spacing:0}body.rtl .mec-event-list-modern .mec-event-sharing{padding:0}body.rtl .mec-event-list-modern .mec-event-sharing>li{margin:0}body.rtl .mec-event-list-modern .mec-event-sharing>li i{margin:0 0 0 10px}body.rtl .mec-event-list-standard .mec-event-footer .mec-booking-button{letter-spacing:0}body.rtl .mec-event-list-standard .mec-shortcode-organizers{padding:0 20px 0 0}body.rtl .mec-event-list-standard .mec-shortcode-organizers .mec-sl-user:before{left:auto;right:0}body.rtl .mec-events-toggle .mec-toggle-item-inner i{right:auto;left:25px;top:50%}body.rtl .mec-events-toggle .mec-toggle-title{text-align:right;padding-left:0;padding-right:15px;float:right}body.rtl .mec-event-grid-minimal .mec-event-title{direction:rtl}body.rtl .mec-event-grid-minimal .mec-event-title a{float:right}body.rtl .mec-event-grid-modern .mec-event-sharing{right:auto;left:-5px}body.rtl .mec-event-grid-simple .mec-event-article:after{right:auto;left:-1px}body.rtl .mec-event-grid-simple .event-color{margin:0 10px}body.rtl .mec-event-grid-simple .mec-time-details{text-align:center}body.rtl .mec-event-grid-novel .mec-event-address::before,body.rtl .mec-event-grid-novel .mec-event-detail::before,body.rtl .mec-event-grid-novel .mec-event-month::before,body.rtl .mec-event-grid-novel .mec-local-time-details:before{left:auto;right:0}body.rtl .mec-event-grid-novel .mec-event-address,body.rtl .mec-event-grid-novel .mec-event-detail,body.rtl .mec-event-grid-novel .mec-event-month,body.rtl .mec-event-grid-novel .mec-local-time-details{padding-right:35px;padding-left:35px}body.rtl .mec-event-grid-novel .mec-event-image{float:right}body.rtl .mec-event-grid-novel .col-md-4.col-sm-4 .mec-event-detail-wrap{margin-left:0;margin-right:150px}body.rtl .mec-event-grid-novel .mec-event-content h4::after,body.rtl .mec-event-grid-novel .mec-event-content h4::before{left:auto;right:-30px}body.rtl .mec-event-grid-novel .mec-event-content h4::after{right:-26px}body.rtl .mec-wrap .mec-calendar .mec-event-article .mec-event-time i{margin:0 0 0 7px}body.rtl .mec-calendar .mec-event-article .mec-event-title a{float:right}body.rtl .mec-agenda-time{margin:0;direction:ltr;padding:0;text-align:right}body.rtl .mec-agenda-event-title{float:left;width:calc(100% - 170px);padding:0 20px 0 0}body.rtl .mec-agenda-event-title span.event-color{left:auto;right:0;top:8px}body.rtl .mec-hourly-schedule-speaker-thumbnail,body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-avatar a img{float:right}body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-name{padding:0 10px 0 0}body.rtl .mec-single-event .mec-speakers-details ul li .mec-speaker-job-title{padding:0 80px 0 0}body.rtl .mec-hourly-schedule-speaker-details{padding:0 20px 0 0}body.rtl .mec-hourly-schedule-speaker-contact-information,body.rtl .mec-hourly-schedule-speaker-description,body.rtl .mec-hourly-schedule-speaker-job-title,body.rtl .mec-hourly-schedule-speaker-name,body.rtl .mec-organizer-social-information{text-align:right}body.rtl .mec-box-calendar.mec-calendar.mec-event-calendar-classic .mec-calendar-table-head dt{font-size:10px!important}body.rtl .mec-wrap .mec-events-meta-group-booking .mec-booking-calendar .mec-calendar dl dt{text-align:center!important}body.rtl .mec-wrap .mec-single-event .mec-event-meta .mec-single-event-organizer dd a{direction:ltr}body.rtl .mec-single-event .mec-event-export-module.mec-frontbox .mec-event-exporting .mec-export-details ul{padding:0}.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.rtl .lity-content .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon,.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.rtl .mec-booking-shortcode .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon,.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icon,.rtl .mec-single-event .mec-book-first .mec-select-date-dropdown-wrapper .mec-select-date-dropdown span.mec-select-date-calendar-icon{border-right:none;border-left:1px solid #e3e5e7}.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-1{margin:5px 0 0 25px}.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .mec-ticket-style-row-section-3{margin-left:unset;margin-right:auto}.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row input[type=number]{margin:0 auto 10px 0}.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .minus,.rtl .mec-booking .mec-event-tickets-list .mec-ticket-style-row .plus{right:unset;left:5px}.rtl .mec-events-meta-group-booking #mec-book-form-btn-step-1,.rtl .mec-events-meta-group-booking #mec-book-form-btn-step-2{float:left}.rtl .lity-content .button svg,.rtl .lity-content button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not(.owl-next) svg,.rtl .lity-content input[type=button] svg,.rtl .lity-content input[type=reset] svg,.rtl .lity-content input[type=submit] svg,.rtl .mec-wrap .button svg,.rtl .mec-wrap button:not(.owl-dot):not(.gm-control-active):not(.mejs):not(.owl-prev):not(.owl-next):not(.et-fb-button) svg,.rtl .mec-wrap input[type=button] svg,.rtl .mec-wrap input[type=reset] svg,.rtl .mec-wrap input[type=submit] svg{margin-left:unset;margin-right:30px;transform:rotate(180deg)}.mec-booking-shortcode button#mec-book-form-btn-step-2{margin-left:unset;margin-right:30px}.rtl .lity-content .mec-events-meta-group-booking button[type=submit]:after,.rtl .mec-events-meta-group-booking .mec-booking-shortcode button[type=submit]:after,.rtl .mec-single-event .mec-events-meta-group-booking button[type=submit]:after,.rtl .mec-single-event a.button:after,.rtl .mec-wrap .mec-events-meta-group-booking button[type=submit]:after{margin-left:unset;margin-right:4px}.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3,.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3,.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2,.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3{float:right}.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.rtl .lity-content .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon,.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-2 img.mec-svg-icon,.rtl .mec-wrap .mec-single-event .mec-events-meta-group-booking button.mec-book-form-back-button#mec-book-form-back-btn-step-3 img.mec-svg-icon{margin-right:unset;margin-left:30px;transform:rotate(180deg)}.rtl .lity-content .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .col-md-12 .mec-ticket-icon-wrapper,.rtl .mec-single-event .mec-events-meta-group-booking .col-md-12 .mec-ticket-icon-wrapper{margin-right:unset;margin-left:25px}.rtl .lity-content .mec-events-meta-group-booking h5,.rtl .lity-content .mec-events-meta-group-booking label,.rtl .mec-events-meta-group-booking .mec-booking-shortcode h5,.rtl .mec-events-meta-group-booking .mec-booking-shortcode label,.rtl .mec-single-event .mec-events-meta-group-booking h5,.rtl .mec-single-event .mec-events-meta-group-booking label{padding:0 0 5px 1em;text-align:right}.rtl .lity-content .mec-events-meta-group-booking p{text-align:right}.rtl .lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.rtl .lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.rtl .lity-content .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon,.rtl .lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode ..mec-stripe-name-and-email-wrapper span.mec-field-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper span.mec-field-icon,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper span.mec-booking-email-field-icon,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper span.mec-booking-name-field-icon,.rtl .mec-single-event .mec-events-meta-group-booking .mec-field-wrapper span.mec-field-icon,.rtl .mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper span.mec-booking-email-field-icon{border-radius:0 3px 3px 0}.rtl .lity-content .mec-events-meta-group-booking .mec-booking-email-field-wrapper input,.rtl .lity-content .mec-events-meta-group-booking .mec-booking-name-field-wrapper input,.rtl .lity-content .mec-events-meta-group-booking .mec-field-wrapper input,.rtl .lity-content .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-email-field-wrapper input,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-name-field-wrapper input,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-field-wrapper input,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-stripe-name-and-email-wrapper input,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-email-field-wrapper input,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-name-field-wrapper input,.rtl .mec-single-event .mec-events-meta-group-booking .mec-field-wrapper input,.rtl .mec-single-event .mec-events-meta-group-booking .mec-stripe-name-and-email-wrapper input{border-left:1px solid #e3e5e7;border-right:none;border-radius:3px 0 0 3px}.rtl .lity-content .mec-events-meta-group-booking input[type=checkbox],.rtl .mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox],.rtl .mec-single-event .mec-events-meta-group-booking input[type=checkbox]{float:right}.rtl .lity-container .mec-events-meta-group-booking .mec_book_first_for_all,.rtl .lity-content .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox],.rtl .lity-content .mec-events-meta-group-booking .mec_book_first_for_all,.rtl .lity-content .mec-events-meta-group-booking input[type=checkbox],.rtl .mec-booking input[type=checkbox],.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-dates-checkboxes input[type=checkbox],.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec_book_first_for_all,.rtl .mec-events-meta-group-booking .mec-booking-shortcode input[type=checkbox],.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-dates-checkboxes input[type=checkbox],.rtl .mec-single-event .mec-events-meta-group-booking .mec_book_first_for_all,.rtl .mec-single-event .mec-events-meta-group-booking input[type=checkbox]{margin:0 0 0 10px}.rtl .mec-book-reg-field-checkbox input[type=checkbox],.rtl .mec-book-reg-field-radio input[type=radio]{float:right;margin-right:unset!important;margin-left:10px!important;top:3px;right:3px}.rtl .mec-events-meta-group-booking ul.mec-book-price-details li{border-right:none;border-left:1px dashed #e6e7e8;margin-right:unset;margin-left:30px;padding-right:unset!important;padding-left:30px!important}.rtl .mec-events-meta-group-booking ul.mec-book-price-details li span.mec-book-price-detail-icon{margin:0 0 0 30px}.rtl .lity-content .mec-events-meta-group-booking .mec-book-form-coupon form button,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form button,.rtl .mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form button{left:6px;right:auto}.rtl .lity-content .mec-events-meta-group-booking ul,.rtl .mec-events-meta-group-booking .mec-booking-shortcode ul,.rtl .mec-single-event .mec-events-meta-group-booking ul{padding-left:unset;padding-right:0}.rtl .lity-content .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon,.rtl .mec-single-event .mec-events-meta-group-booking .mec-book-form-coupon form span.mec-booking-coupon-field-wrapper .mec-booking-coupon-field-icon{border-right:none;border-left:1px solid #e3e5e7}.rtl .lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li:first-child{padding-right:unset;margin-right:unset;border-right:unset;padding-left:30px;margin-left:30px;border-left:1px dashed #e6e7e8}.rtl .lity-content .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li,.rtl .mec-single-event .mec-events-meta-group-booking .mec-booking-checkout-coupon-total-wrapper .mec-booking-checkout-total-wrapper ul li{text-align:left}.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd),.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option:nth-child(odd){margin-right:unset;margin-left:20px}.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio,.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-radio{margin-left:unset;margin-right:auto}.rtl .lity-content .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg,.rtl .mec-wrap .mec-events-meta-group-booking .mec-wrap-checkout.row .mec-book-form-gateways .mec-book-form-gateways-radio-buttons .mec-book-form-gateway-option .mec-book-form-gateway-option-svg{margin-right:unset;margin-left:10px}.rtl .lity-content .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r,.rtl .lity-content .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay #mec_woo_add_to_cart_btn_r,.rtl .mec-events-meta-group-booking .mec-booking-shortcode .mec-click-pay button.mec-book-form-next-button,.rtl .mec-single-event .mec-events-meta-group-booking .mec-click-pay #mec_woo_add_to_cart_btn_r,.rtl .mec-single-event .mec-events-meta-group-booking .mec-click-pay button.mec-book-form-next-button{float:left}.rtl .mec-book-form-gateway-checkout [id*=mec_do_transaction_stripe_] .mec-form-row.mec-stripe-name-and-email-wrapper .mec-form-row:nth-child(2){margin-left:unset;margin-right:12px}.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons,.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons,.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-dropdown span.mec-select-date-calendar-icons{right:unset;left:10px}.rtl .lity-content .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container,.rtl .mec-booking-shortcode .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container,.rtl .mec-single-event .mec-book-first .mec-booking-calendar-wrapper .mec-select-date-calendar-container{right:unset;left:40px}.rtl .mec-booking-calendar-month-navigation .mec-previous-month{left:unset;right:0}.rtl .mec-booking-calendar-month-navigation .mec-next-month{right:unset;left:0}.rtl .mec-select-date-calendar-container .mec-calendar.mec-event-calendar-classic dl dt{text-align:center}.rtl .mec-booking-calendar-month-navigation .mec-previous-month a i:before{content:"\e606"}.rtl .mec-booking-calendar-month-navigation .mec-next-month a i:before{content:"\e605"}.mec-col-1,.mec-col-10,.mec-col-11,.mec-col-12,.mec-col-2,.mec-col-3,.mec-col-4,.mec-col-5,.mec-col-6,.mec-col-7,.mec-col-8,.mec-col-9{float:right;margin:0 0 0 1%} \ No newline at end of file diff --git a/assets/css/nice-select.min.css b/assets/css/nice-select.min.css new file mode 100755 index 0000000..af48bd8 --- /dev/null +++ b/assets/css/nice-select.min.css @@ -0,0 +1 @@ +.nice-select{-webkit-tap-highlight-color:transparent;background-color:#fff;border-radius:5px;border:solid 1px #e8e8e8;box-sizing:border-box;clear:both;cursor:pointer;display:block;float:left;font-family:inherit;font-size:14px;font-weight:400;height:42px;line-height:40px;outline:0;padding-left:18px;padding-right:30px;position:relative;text-align:left!important;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;width:auto}.nice-select:hover{border-color:#dbdbdb}.nice-select.open,.nice-select:active,.nice-select:focus{border-color:#999}.nice-select:after{border-bottom:2px solid #999;border-right:2px solid #999;content:'';display:block;height:5px;margin-top:-4px;pointer-events:none;position:absolute;right:12px;top:50%;-webkit-transform-origin:66% 66%;-ms-transform-origin:66% 66%;transform-origin:66% 66%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;width:5px}.nice-select.open:after{-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.nice-select.open .list{opacity:1;pointer-events:auto;-webkit-transform:scale(1) translateY(0);-ms-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}.nice-select.disabled{border-color:#ededed;color:#999;pointer-events:none}.nice-select.disabled:after{border-color:#ccc}.nice-select.wide{width:100%}.nice-select.wide .list{left:0!important;right:0!important}.nice-select.right{float:right}.nice-select.right .list{left:auto;right:0}.nice-select.small{font-size:12px;height:36px;line-height:34px}.nice-select.small:after{height:4px;width:4px}.nice-select.small .option{line-height:34px;min-height:34px}.nice-select .list{background-color:#fff;border-radius:5px;box-shadow:0 0 0 1px rgba(68,68,68,.11);box-sizing:border-box;margin-top:4px;opacity:0;overflow:hidden;padding:0;pointer-events:none;position:absolute;top:100%;left:0;-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.75) translateY(-21px);-ms-transform:scale(.75) translateY(-21px);transform:scale(.75) translateY(-21px);-webkit-transition:all .2s cubic-bezier(.5,0,0,1.25),opacity .15s ease-out;transition:all .2s cubic-bezier(.5,0,0,1.25),opacity .15s ease-out;z-index:9}.nice-select .list:hover .option:not(:hover){background-color:transparent!important}.nice-select .option{cursor:pointer;font-weight:400;line-height:40px;list-style:none;min-height:40px;outline:0;padding-left:18px;padding-right:29px;text-align:left;-webkit-transition:all .2s;transition:all .2s}.nice-select .option.focus,.nice-select .option.selected.focus,.nice-select .option:hover{background-color:#f6f6f6}.nice-select .option.selected{font-weight:700}.nice-select .option.disabled{background-color:transparent;color:#999;cursor:default}.no-csspointerevents .nice-select .list{display:none}.no-csspointerevents .nice-select.open .list{display:block} \ No newline at end of file diff --git a/assets/css/rtlbackend.css b/assets/css/rtlbackend.css new file mode 100755 index 0000000..5faffa5 --- /dev/null +++ b/assets/css/rtlbackend.css @@ -0,0 +1,123 @@ +/** +* Plugin Name: Modern Events Calendar +* Plugin URI: http://webnus.net/modern-events-calendar/ +* Description: An awesome plugin for events calendar +* Author: Webnus Team +* Author URI: http://webnus.net +**/ + + /* Base + ====================================================*/ + .mec-col-1, .mec-col-2, .mec-col-3, .mec-col-4, .mec-col-5, .mec-col-6, .mec-col-7, .mec-col-8, .mec-col-9, .mec-col-10, .mec-col-11, .mec-col-12 { float: right; margin: 0 0 0 1%;} + + + /* margin-left 0 + ====================================================*/ + + + + /* custom-margin-left 0 + ====================================================*/ + + + + /* margin-right 0 + ====================================================*/ + + + + /* custom-margin-right 0 + ====================================================*/ + + + + /* padding-left 0 + ====================================================*/ + + + + /* custom-padding-left 0 + ====================================================*/ + + + + /* padding-right 0 + ====================================================*/ + + + + /* custom-padding-right 0 + ====================================================*/ + + + /* border-left 0 + ====================================================*/ + + + /* custom-border-left + ====================================================*/ + + + + /* border-right 0 + ====================================================*/ + + + + /* custom-border-right + ====================================================*/ + + + + /* custom-border-right + ====================================================*/ + + + + /* left 0 + ====================================================*/ + + + + /* left auto + ====================================================*/ + + + + /* custom left + ====================================================*/ + + + + /* right 0 + ====================================================*/ + + + + /* right auto + ====================================================*/ + + + + /* custom right + ====================================================*/ + + + + /* float left + ====================================================*/ + + + + /* float right + ====================================================*/ + + + + /* Text align right + ====================================================*/ + + + + /* Text align left + ====================================================*/ \ No newline at end of file diff --git a/assets/files/sample.csv b/assets/files/sample.csv new file mode 100755 index 0000000..ff10ed1 --- /dev/null +++ b/assets/files/sample.csv @@ -0,0 +1,2 @@ +ID Event "Start Date & Time" "End Date & Time" Location "Order Time" Ticket "Transaction ID" "Total Price" Gateway Name Email "Ticket Variation" Confirmation Verification +11 "Sample Event" "November 11, 2028 8:00 am" "November 11, 2028 6:00 pm" "September 28, 2022 8:17 pm" Standard MEC10000 $100.00 "Pay Locally" "John Smith" john.smith@yahoo.com Confirmed Verified \ No newline at end of file diff --git a/assets/fonts/FontAwesome.otf b/assets/fonts/FontAwesome.otf new file mode 100755 index 0000000000000000000000000000000000000000..59853bcda7308254f58c2d74053f3ba55c21b9fb GIT binary patch literal 123112 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 vN!Fg- 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 E0dl-`Gynhq literal 0 HcmV?d00001 diff --git a/assets/fonts/Simple-Line-Icons.svg b/assets/fonts/Simple-Line-Icons.svg new file mode 100755 index 0000000..45217ee --- /dev/null +++ b/assets/fonts/Simple-Line-Icons.svg @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/Simple-Line-Icons.ttf b/assets/fonts/Simple-Line-Icons.ttf new file mode 100755 index 0000000000000000000000000000000000000000..6ecb68683477ecc5aed38ec3fc8910d9bb66276c GIT binary patch literal 54056 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 Kj_>Q2Zu>vsTUp2e literal 0 HcmV?d00001 diff --git a/assets/fonts/Simple-Line-Icons.woff b/assets/fonts/Simple-Line-Icons.woff new file mode 100755 index 0000000000000000000000000000000000000000..b17d69491bf374d36e07339bedd3349caaa30d65 GIT binary patch literal 81332 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Simple-Line-Icons.woff2 b/assets/fonts/Simple-Line-Icons.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..c49fccf510eb41b4aac2bfa21b3b87c254083bf8 GIT binary patch literal 30064 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

    `i;W%DyRrxz&7=UY}f`DBwGN z^QCTGvyO~ey9-qw{@>K>*0ETVw6;Tilw(vetE!&HNSMvhCH4F|*L8W}J3TzIc5B!6 zX)TxLl{nFlFOSxB;2j)0hQZWfaCN|UD9kj_4@^De_#GQExLdpTyP#guE1OrO0fIS| zxSjBT(4D`0xgb6tBvdU<@K5*iOZQ*gSnDtyG3`*QWVP4SM&u7H&+jH&BW}m8EyH$^ zUXgJZm*E1jHtHi|Q5+XpdAO{^QB6mi?5b-JhnrSmxJ4K7BtY^5#({pvti`&@%0$Q2 zKS#P!{jl~ina%4b51z(3Ogng;jb=%q_{C)j33V+fF3{na1B>a)ssN0$vnHYY`KUED zSe%EkO*W05q|)u^)KjR<0`U9WGWZDyF78Jp?^|C;Z}dM?>i0LH*9cr>jv)Z zSG1v}2sOq?`&!|ERTez5|9SB5@8{1*IPxf3lJPZBH8|{t4*+#hIC2(Sb7kNbm z6L5j(={Se#lB)h)Z?$zT0;E07Zx+*lLpRocoYh0AW*YZ5e6RhG{FC6)EM*2&gS+2P=%z&>^(%zh`5z zgLD>8h=AJsbh+L}Rk}(EwwcJU$b;mCJY+Qk$h!y0R{kui%>TS2Y!d*nLks~4SNQ9) z_@oNH+XOzHqpn7mu?M>aX&%m)WOJ+5=CV`a#nsBSbb@Y4ZbER5|JF=n1T$aEvFF`% z8-85%3PC9P)l8!7DVWL9QIgqfw=i(zIglaV5Vzget2Hg3NE%x zMG{$n|nzfja!?p&3@OfNyE-nV9cbL$uVF_@@Ds2+#l8y|A%B{HUFYqllW(p zR@x8$6r9+@rTr0m3^WYA`nTXc-kTv?Ib*YdF^i)3iLZ!|?oauLC$Dw!FFrCq4)8^! z9f<$tq_#6A88-l*U5|6*8w z|2^F2HHfH+?GtdU=N<(1>)-kQxf;lef=?{q8^q}c;{U10NISx~>9|oRe%wJ6~J1Z65;d z=(Y!*>j%xC0;v553fqq6@+UKCkStbAzXT54{~JJX=;}#UR82R`|FxQ>ko#b@nkxiFP5uzZGB^NYkOyRZ~x%%==cN-fx_SjBnpke;_w6_ ziA2iC#K0ki|gkS{4 zU~zZ?kwm6YX>!>rAn>Q>huPq$!xLO><*_Z{#x>QeSTHQ zl@QmFh+!S&U=+V!GMCTwn2mY6+$U=%%-sDF*c0X0e{(tzN`gYJNgs*bmrdIOXr4D} zL+k<;Ra#hX@kL!cmQr3VX=8Y1Dc@Thj|+n^Y>o&HmsA0=J3^=QLAY~~=&_f~k5Jn; z)R&f{^GO-Qrm_z@tg1?WN4MB2?2;`*r_J6)?_SAa9Bi^N)jHilp^?UtyL*(Xw_6gN zVq2BM3^CmV1HNeMalw9r%K?`w`9_Qsb;9USryfMcm>WM(=LR ztbq{KsYn=gAjPWkGZ&b#+wVo}E6h;)z$*mnxA(jC`u}J29x*FqJ18o$4nFC} zvFgb!_ikRB;I!nhReeHgKO~2Rw(*{2fs?7--oNWX2~#Hr$OAGp&S@3{;Q|p$vsyJV z63qCm2it-^B&N~VshPmr?_?bhuVLSeQpw?@b@a+~P_2Usvtwz$OWH0x3p-3czA_cDba!pl*@^f+grlr^GBA&$-&697h8;)xLr3_o3DzV5aT_ z)%|p2>$8rdh~Cov;d(KTCq9$cBdU$K&(YSEG3Fq#7~Y#U=(*ZPH#jZytJaZyWV5Nb zuBy?y!`!)UdeWz5z6T3xW^!Sl+)C4KqsMGKhgKis1v8jlct;GKn~r_NUn5qCiaS|t zlpiO^fiDsu_NYOKPbvJX(^=L}s<sX%kAfVQ|%HgqUl`-14}f>Sf7oy0?Y+D3*=!i31@-J)gq_dxNCf6tVT XVaD<2gWrVGOVQy$mL_vR2><{9vXVmp literal 0 HcmV?d00001 diff --git a/assets/fonts/fontawesome-webfont.eot b/assets/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..96f92f9b83bfd1008a197f059e4806ae25327125 GIT binary patch literal 75220 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/fonts/fontawesome-webfont.ttf b/assets/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..86784df961f954a23a3a5afa57f07ebee0396192 GIT binary patch literal 150920 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%0DR0p(Cdp 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ò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

    *z>DrjADqxXS}JFOTA?xX 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/index.html b/assets/fonts/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/icon.html b/assets/icon.html new file mode 100755 index 0000000..37abb76 --- /dev/null +++ b/assets/icon.html @@ -0,0 +1,837 @@ +

    + +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    \ No newline at end of file diff --git a/assets/img/ajax-loader.gif b/assets/img/ajax-loader.gif new file mode 100755 index 0000000000000000000000000000000000000000..03f629a046c63780c8a7450fd21149cefe8779fd GIT binary patch literal 25243 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 literal 0 HcmV?d00001 diff --git a/assets/img/cluster1/index.html b/assets/img/cluster1/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/cluster1/m1.png b/assets/img/cluster1/m1.png new file mode 100755 index 0000000000000000000000000000000000000000..329ff524c59e4ac6ba91db135e2257106253d7b9 GIT binary patch literal 3003 zcmV;s3qPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ| z2r3bh0E3kP01G=wL_t(&-o2Vzj9q7S$AABQX2xTW$M(c=Vw^w|nxv@{1u$6Lp-Ky> z+Heu!fwodn5%56Z1ca1j>?!8rnn2T)Z6sCkHxDm5yJkb+93CZRwCC@~?$Zb;HN z#N*iG8IR|F&i?bT*WTxwiOs&+2FL&b4WNMy(g=2e z)B%iLzLtLldDgqXsSQnG{dczt>WP%^M}bkKp)e#v%EEwnng|2I7E*!TMe1U&AT7|; z%0|~!>+(cXrBNWHF<@sH0k)CKac$Snh>vOm;ljUz72qteR4-cp0&c2NJ%ci&o!C3V z8w^8GT>98JxyH7vE}aBCIYk#+-Fgi;k=l}C&{2h1aN zE;^C6!QO_n1ABXKMu~CdSOwB)n(7Q{nAYSS*aK__iu(T2J00u=qie}4FNogkQ4Ay z?5luB!h8GTc~dmi*=YC?n{x;DB5*5kT_0E!VZ zM}Q}>hk=`ru8y&tB+K9Uhx8EkKBRvNuZ$%7r%B_!>|ozS zo;|asXjw&*%DQHEpjekyu@qEigr*iRTE3S99svGj)Anb%D8opf2i`x>qPmW>k>IH- zqU|hrRU>{h7Z3OgU@p+?ccCS?_GGyjpFnDFx_DFZ#gb>PHmnkMN@9C0O+7{1`+{bH zv?$tcMERgdelG^)c}+0#A*B0(_eA0MH1H(SaqK6M4sNnRRT$q(Q-2>`7z6$^82?O^ zI=iC2dmswS9g!xAO3KQTO}>nDRr3BUO|4+x2D}F8y-0tFy&E{V>0av9Vt*F~eF69? z(no>6#$Jl@zl*ejeHC`6mKGq(fZ?P7>xQdGlE+lxcufMoPXm9;R$W#8Y8AI2HKKkh zkZwUbSM$r#kg;I>bsEVM$%>?q8w)fmnL^uR*bVH84xL5%GbFauuyU_YMKz#!{&*5a z4z1DYT(XM{=)~AAupg<2SYHB8VNdie2wN12lYPiKbV2k>=8|0&h01}?B?Auw<55Sk z#g~KCyASp+=Gic6wQ{Np6mi?gv&ke>GhkaNJ6mj$3*Z`{sOzt$POnmZtNpjiQ{|1T zJy*h}!c#lqyE8F}frHrh#)5cDJXB8d2-3FjPKGp1+oQ?iE5w}!eMWSV6q6OLVhET? z+&LbvM`I8p-3T0uB2io5AtC)XRI1Tf=mzju%%@uX4Cz#Ci3&)_!nK{4oFkE)NhIYF zTEztR(OL?I8-ab;-`+yx`v~@-$Vm>B_h-P~B$pX`7HPQF@ulS~;INwvxgC2x#7f0? zHvmu6pOq5x`+@HQOSPoDd7e5#Q$I%fo205fL7qJaT%8y`MV=Mmsp{V4jHZm;tt~HO zxPyYsmV531(&>P5qMvjFFpd2{qS|i8Ug{z>X%%k+u8eUr;77EIUBKQX(H^H&4A(id zG<30o^rZwYjlB(fvWE0BM6U(zLmEwx<{yB&fS+u5Z}nKs*Rg+tbXREXAkASvn#gmC z*GZ)Dh&Bb&=u}3{C%|A}2XHKuoyvnRBhMbg{&k|sT^D-9U&ZI?1lNXi$x%afY(paq-bt&t75HbQ*}8=zy&CvO z;CAf)NSJ^J@J`we`YiA@?2pwvv*dlhqp5qbZ>!Uf)WCiU7_Zq+Io2Y1MwZkn(@6pr za0T!T(%E=lAiX>k)bA&BWf?dW8pZpt?+hT(MU!){R|W7Z-~je_kvRy4&XgVO9?P6V1Fx`a<5Gk-VV}(*gI>juw0|Fl`O5k z@_Yn)Z}RY}ZF30wn!3YLhU$MJ9mf7p7*naU0!{(X0{eL0qn$ZZg1APjVv7ZIL5#fI*SVgrMFOX-C()LUG_~{w)Z1H@S-mHo3 zR2<-_XvZjR@4|j45^c3t3gFGy+mSwveIIZR7>$j4GL88Xip1}D<|KLcD6Qhk1YCr@lp1t?=}{?0_L;uTyfZl1kC7H?gUe948T(DZ!$^6^ z$aBE|)70`MsL*f2+b;ku^6WDq^4y7ZZD03f8tLb>y)RDA5Mka0ruubDT|&WXB}MC0u+($&#Ss~+44#&IkNi&sdbt z=>X4>XFrHA-k&tatNmOW)FTe-I2=-f!4*`ezRFN^Alyu7a4(JK+bH%=$+P1Fj6DI| z9(!X6I10QFIcZP5e|il$M^btxgXrsnJ-IpxmuKDB2UEcXRr4;#0V)_7SY;}`xf6RFdpKDr z)m?de5@~i&gErRlEhjY=q;j~9`M&HvfMM0)tn?Jx64HF#by;IaaqYdwvWZ=Ja4z=R xi_!k+Bn*4dYdJi$9NNgq0E6-n$U0i2e*pgzX-8pBlM(;`002ovPDHLkV1iGktbG6g literal 0 HcmV?d00001 diff --git a/assets/img/cluster1/m2.png b/assets/img/cluster1/m2.png new file mode 100755 index 0000000000000000000000000000000000000000..b999cbcf69441f194768157d79a113b0fae03e3c GIT binary patch literal 3259 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 O0000KLZ*U+=)p!fv7f#TG` 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 literal 0 HcmV?d00001 diff --git a/assets/img/cluster1/m5.png b/assets/img/cluster1/m5.png new file mode 100755 index 0000000000000000000000000000000000000000..61387d2ab5c8d22efef4846617567a3b1ae6d72e GIT binary patch literal 6839 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 literal 0 HcmV?d00001 diff --git a/assets/img/document.png b/assets/img/document.png new file mode 100755 index 0000000000000000000000000000000000000000..b20c38251325dceb28be38d07b7ec68d0ff7dbb8 GIT binary patch literal 6774 zcmV-+8j0nJP)Fw0o-RbP`M^9Pt^Y!B9>i)#G-E>>_x2f*&^5p02^`@2b>+8+d z*jr&(*C(bw7kfn~VA!n3xxB`Y%dF($1@7}w#-O;KN$lE?fP)AT(_4fDt zl6vIk=#=O0%hT2UjC1w)_{8Js{qO3})7RnU=hw)@{)lY*{Qbww&)fI<$*nh0L(t%Ld49q1_Wk|* z`uh8vprpmr*w*3Z|N8jj=j-q3?PgV5+~@1q*4TiAh~w||!YwMG}ZsYfbS2QX(aFDa9=xt$=QguB$6W zTUXOp-RSPx$M@pBib?+UJCmf}lXQ|cQ1o;k1X-lNo{u@_%$aFG_frUcbS2<3IYHRa z6U28-ZZcLXi@8Wsa@9(O7y*0mS?9;O2$NBiv@AzWNyuqM6vC0ne&zcmCl(`NflaWi z2L6*YQ4@h^P*_$@2m%w?Kg(F)1G(YBl^jE}QC71R0G|-Txhi4&|HOAdZZK3M<+Kd( zG)Ixxguvv8@5kB~nL7zKElSShzy;Eh0^mi{>d!y<*Dzqxpl3U)oNas;D*pJKlLNb5 z470MNxfCfOL@KB4>%-OgF~cS__X2G`1N@yhujE8dNNAFxC@#Sb=U@}z{d1{vpss3| zl{7D6IlL@HPBYmbp3ZZMtPLhC%k0}H`Xj4zhLuHaQ1k@7sGl?P{qUd)x1xNCIW6?z zkXJJ-%MQ*hYC@C`pPL8=H1t&%j>aK;Y$bg<#rrVGx6^59XyipTf9F(I_90mNHYiRc zaY*EXSjw*yiF0A?i!#d&iyI0>lAq*}CkOtxn3lDnip;BOzU=?H9vCpVRm(#LXEUX| zN|IrHl*z$!t7K$l$mC*5RRMZLCq~-O!wF3sGC7;zAUeM|(taLENSZcmaxFxvq?(T% z`)lw6kuM6YHgsXd7^$iSZsm@@QEm|O3Z2mWAWs36Lsw_?QPnx)2RNwKW$5T?As?!a zq@NS|S61^!Bp&KqRac6m8R3Yq>=U^dGRald&!x>fc`oV`xR!}o#{>RCxE8a+q9d9plqbQE8YA03S?@4TUFN?J+_tkcUT%6voTFuadcgd;Njd|ZOs zuDw|vTmKdW@(l?55FdN;dyUr8j)pJFA+;&_$VicY?Yoa8vh>`}Slohc3ivX<{ANyY z^b|4O(z&`)A1QLiu{xC?SnbW&dKb0@57?zz+6ld#oaFaMDZ+`4#-2_qbnQtT$!)S9 z?bJj?NZYsKn&cd}5*{J)ob2r8Qtfc;n;o~ozP?}LO6}p1 z6SpB_Akf)H$2M|R<*TE!stK%pnI=e5Z71Fr{M)x9nPxR~q?5UppMy1>85#2Jw4~UX zJNOR$5C3(FeuE}8z zm)+R9Ved7^KAb7nsRrcn;^N|Qd$D}Fq)8;GDcb zhiO4bgO6n<0*9paks%iZf$mj#@Y~qW_wL<$@$(UieR-}YRA_azOSm$fkY!e4B`Dxe zI3G_l+r%l8hwY0jgqH{7FRY*2|G75=1dr&>K83)t0;Q5&=ylYNM3kkOMej!Mo}8dr z+cwPHaxeJ3){kCBxWZ0N61w(SVq`aZ3OzW~lON#= zV{@JDYZkb9x5`yYv>6fyc5ko~r$KJtXjf`GJ@$MAf8<4ceSPdBTIq37=)jW1BBx@I zH=2E{EQhP7qw|U_xd5`5Zk7HFe&U|dqA)+}Azy#kmCcl?9+i_Z!FkI)LYyr*J=bf^ zFsvKS9~^^LkBD)dOFAnlp>A@Hj5!WwNLti`+P(O>WEO_)_HKbE18M* z*t(jJ^=Servask6c`J7$syTa||K3}kwpx%c3_nMOxb`BQReFuRpS5d}Bx>oL%e)Sg z9A?QxWjjKLm8k8m68$D_-+H?Y|D7XLt=h5oA}FCe!q4fxd+th+ahJ&<*gPkyXoKyAz8k5^3#yccjwkP)7HG{5TT66P1iLH0_?;()eXmS2B2{ z2oBYXsdGx~yL+jWsl2OdHh|;gL_|!m5^yJ=Z$)t;M_aqGwgHVJ+wVsT?Hu16*7J_h zcv*EdJ{Z8@&H*#W*#fom^PrK={2a9T=3HC;mWh!hiadjH3P>pB`E4D0LcG7uj~U?I zSUbk_W19$PE@(l!_OsA>`cV$4^Ay&gB}L{-``B9VOTH+`vW9mYOQ4U?#=Z=l+y*?j zJl7)6#PUe;BF-=wY+S-V?U2YLFsey-;}OCfx*=n@xh?sVxz@{CFZ7gYMiPfNg$3us zuQS83c7ky;5u(gJL6eVNzI=Jiz6;rmQe{+N2NII8&IiGDAs^ZwhRz8l>S_Rr-a#*G z!JvIVHlA)~G8qaDPL^;_|Bxz|zk{jtfcMQ}1i28mA^&E#!3dI9vE5oxf|JNJ=IBV0 z%MGq`IKwTtv38-iCu5c^m+!r>*?0-=)T{vtL4@HA72C;F#t1h3o{PCdfxGt_uwTa` zuBST%8nz~SYILJm`G_`$xMbyoX)#q$ZG=xLFpcU^{Az|{)I(uN9b1@KDFWvvX{w(glcCwn|;nx<`%cXZ1ByI`oi$f+0t%5X0EB-Gx-v1caC^i7QNWPhET=vd?{l;;SyEqfi?mjnTCKnOVhW5_K5jq^CzP?u_5 zbntYMvX%!DCwWJchdrOU6tpr#$C(=Vy=M71pT{IuNiM2s3H$7|xiD^fB(J6uY0rnQ z(x7I;(R%#xp$X2x=!FLk)@oL=jlHcN9?l>ck~|Xierp79T}7kc9QB=+F}D~%JjPYH z8Q@EQJDm1vn=kQ1PJ|y1dd!xtE%%w134;9XP|;$l8*pQ76YQEY#a2KldLuthO9LNK zp=&$n(br%{0tZu8j&niI0aq7oPV%{phIa1;OC*Tld^R>nT)1 z11Aoe)jjEr9HcRrdX3e~f_=3Zw_6hXjOX zSgn0uDpYY#PUscfJ`9MZG3VluRYZ7ViG2v<4PC3%Xho~l9*(UymCmUi&?ywTQfeCw z=Z{^JgDU43mpsa;Bu_mSMThNOK>^WHpbdc+?g+}ELeD)k^&X5Lcp~Rn)bs$~wgB)I zFXUCsCC%LS1nhF-8dsF_Ns3@}SK)1!njjsP%c2~6`}wyqBLF~8FSut%)aqheSdrOwtMdqs z&LzR>oRMu|B^0YijoX{WrtSs7_*#mlVj*DVWYe}!xB^-D{Q0-v_!AF0=jF~GbY~ln zg9lpkD?G)x(|Hc7Hb-`e^CTAv#i&#<%EG3O$R^lmF-65fJeMbt`5IsFqH+-9+Wbn= z6y)wRpf5#SMK~OCsf^qNgWEeKuxK7gC=>!8IrDEw)yw*2-=pZ56SLWh?qk|giYf&UIEhhLmj?=e>x=Dg}2T|J-HHF#3rvOSW6noIoqS@aGdp$4EY6s z6-* z^2WLbA|0r89iPpoB3{Kp=#hRm#h4quXDg*?gq0V+X?;XD`ArVF|QDLXm2NDZ)7 zkygleB?Xo2q34R`jTAV&dJa{)p}Wpb@2Q~yA14Qh?4)af=)J!%1-GR_m?=^rf=9kD zu&9C)RH8zr7%~*@S?T!@kANfnTwhF!U0RpmS|+4I0|#}Rrm=(kIg^}4 z_pFsJ~mtru)#7ZTe8&>Y(jU1qJYlQ)RE1ZlZ zFmz7nRS-6==bkzH8OT%~ zvlC9*W|%`HH_%T!qvvB4eDZ2&rJs$HMjn0w+le5fDELZl7`(ZzyM^bB4fXCBIfseg z94z!uTCX_7$5dFZ+`}QFZf07-Pb=wdylL-pJNG= zw#zv1Zf@=NX3~hedwb?nOK#o1zQ*}R-ZXfZzK%TS;CzlnXE?hgkvv&@znYxdo9d8c za`mn=`e5Xqe4WcjU7z3~^azOXNR@MIcQ=!Jo#5chz2xTIHC*xxO2QdOau2?az7D+) zIY{QHp00-x!q@I@CHJ~j4h=uKb$9Iqi#!oS3gtvTWhJsM$n$&zx9i;9o8r6GULXr= zpMl2Pti0Xg0lIy=twkO#y}XH%f4Yi9SgUo)?0ftip3AF@=Tq2UQ{*S^q!qNe6R?o4 zwt;VLZEkM0p|2L~SGN{T#os{O`YRcguSYADj!LuOjGw78&L~IZDm9NBNVr z+c2g#NN09;ciT-eIrGN}hPAWxda+pVl48Bs-3R;o)moQu*o}gfP{igc0t|BF1 zyyfsDQ2G0<7B~O}|HE_}`Ij%B*D%Nh(R#Dw4k?#=I)LRE_`x->iUKh*M@(BM^JJW?7Yf%4m~t>aK7P>Jq+VIM?kFoH7oy5Jr@Kb* z$t`aos<{ZW@MX%09LP1sPQvNtRN15(nV+9*u2U(7i7<{5$yIgd_vUj$-ujn1Fu?)~ z{;EC21b;Pc`|q@d&V;ZVq1KwCe%H(RPkD%U2tk=`U(1146CLEnUsddWZ?18HftVV1 zB|z__?Y_Zj+#3aDwUd0c0$+>{Yu|h@baKFc=H#z8J9E~p*E-SpVoYs4urswLxh9mw zGH!G)mz8q4aq-C6kw4h#B7de=Ham5`wX63d7pZYqA#U3uWbe-^-94K_Qt>N55o}7KHV_174R4SE1_!6@Y21>1- zWE(kPU-(E6L%bgjT?6g5`mTG)&4t&%+S}K62cK(^vnh8%QD&KEM-J4!kADlMNAe0W z-QH{m5w64f2^@0Q);>R(Fb14$$xU=${k+mFOZU3E&U>&?QE~e9Z91>JRl4~;e)i-5 z-Ct`rT>bS-61B$yocw{~PquU(<=sh0bM|x7*Kw~t_52Q!mCEbsF7!RP0RlCSNls19 zPr5Vq{^S#ZIo)5K>&GB&LU{ z&9=lfncSRtMpP=8*RD-ZUt4&FS2eV(T?}W!?!+XQ`;g-Wxq-St5HXy&SapBR$Ej0PWPn8iT*P^(RFx#+f%i1phx%J;Yq@Pa&zUrfG z?G)S}#mQRd=VKjhIg9+lh5vl{$VCcdGoWDWS2(V&*597$*f!HA_wffvd1P#8^ey*a*= z={pzGH1x?vI||3zFXenDC+au6$Uj$`a??p({$$DB+n*cDIu?2Mrq6x22*YRp<)i%n zhlvkBCO&L#%~CP=NLd$>_0##=0q^X0lq!=+NZ~8l4UclG@rT`GW8=|>03;85m|b19 zvRE0uXF)&m>^t2Ta@c!_+_=HWtdhlyWSXAjNO`i+b0oydWg`_pxX_e9b!Z@wx~b)R+q z{KE&++BdgW4;3SQ!_awlDdN{ogZY9ol)A#dy0UT0H`(})8Q}sSk{7?+F_U(d?GxKU z@mBJCUro;yL*qWjc1tc^ym%rXmeQL?f z%(bvJ59g%w4GY|Fa^3q|&PN);)a$9bofN6kD>xkXD)j2r8Xtm>lI9%YvX2TbMx+KH zCkWS*SZ3bdd}}S3l{!AG#MS(2{y;OeE}_Ubve|cn?)S9Fuqu{}O9^Y{d&ERuX1md| z*-P{8p2u0%=k@z;#mw79A$;Tcg*NzXc4O&=+c!c#Pdg2hljiOcn~3N{;p+288yB+R zvGM5n%eTj_BhT6HE{T74v>-*%u`SnJ&=W?sLPXxeN_M=&G}7wxqw|B#g8Vw}8(Ybd zAv}*WCBJ`g|KQ-h^*A`-e-!ebLyDq?_hu;H0XeJnUd494$&FxB&E>wLB2SL>`kqeb zfn2W~++13^v~*>@_h{&MO|F-oXR~mr&1RP-omRE)j(qY~wv}F8{ZYt)Tfe`M-DvH1 zW&i0k`0th6=+l`RzxBwX4|Sk_$JTz;0*~dEtTr(5V~|&&%0Vr$r0egj(T3EIK_1(% z>gCrujPT&A?2Yz1>iZ?1G~y_g?d1O`I=`?q zc~GbjZ^y?io&ONzB`bqjs=^4@@blL9j~54)ulplO{?%O0vr7adhv9C6(nnB+p2;-V z^G7M;HQ3n5zB?ZNFBw5{LT4^n=t~>sz*=FDeTj2J4rSc%?hB2NS9SeIuy#Y{H%teI zrVa!9k3+5(mSBAj0=(;;kMmBhSLUx=dUWg3yBo}qyz<CO>fZ*;4Ft`MF4>E%f?m>eS+$98ecZUH6cb5d$kl^k*0fK7?AMbn4 z{hjZg`_HYlrdLnZ>guZ9_3V1K)brx=7JyXN%f<=-0D)KluK@p3o{s@|@7>Mqya5OR zJ4lWM%YXSm7LIMIx3JMBJn*S68G&D4<*I1;uxTNGnctqs?Y54zp^ZXTn z_X>d@fdUBu4}ge=fP{zeJOJo?86OG)0>b}H2nm3QjDm`W@am-!>HpONKtM!#X~G2{ zAR!?lp&+57pdz86ymatV4ZuTri_b-XDy44fO#7LeFtM;+8WK!Lg!awMg@^uUl7{&g z;w>58^P&b7NlGAmY8{LXuK<#-}|q{ru9!Pj2LI z(hxJ3;Pa%S27;|Vo@qLB8P_j_+Zz2S&&z<jce01u@>nrJCV%7DSM0whTm zgw}2V33fAbA-_8x)0Y`Z-XB=JFO4&j-Y;!x7(r*{*t}>>hy_G|a+Lq7(frS!nzpoM z{V4#}E61UaE?!<6D?<$%+_0al8m4O0YA@Z8^aWudY;8$;FG*r~l+&BJX}uC-D4`}t zC=IeHAh*V0LXl+sfe~cZ%!`&4hZ=OncJl)VnVRrF{lC2a-12W=}Oad*ql zu>%n)#2;ekE8~zlU<|HSR)?~T2l~zrtvBn9g~~e(+6N!XahOoE5TdsvQG<+90IOP| z2&8RA6)?IV=(Dp0qO%GAPSW~SJ7pd#>68GFE5lk8vl5U`f6j*uA|P%3oR#>{_~6yo zQpuz(7jACL$1D(R*&F-I=wsF2%7A>~g2a@1Q5?3!lU589u<2g6UDeN>2Cu3jfgLLz zHvK*Jaz|<#em)F^%4ppp5QrSl93t8OuRKRj3dH`mBp0%<8(OC3k=4Q~;>c#>#v@bx z)79!q)6}4zEDxG}{Gu1CeY^a|%YP&UR(j^E#((C&*ZRKoKLQ4n14PjYku6r4)(cX| zP(R11H-nHcLJ_v!AVP6d;#kxHI5tqJ5co4-&QSbqD``+6gMtY0g}cnhruZhw8%_E> z3+qC~#)H-Mz_%$m$FO(~nHr|tQ+!PVe>8U=GH({9l1qb@;C608H+mc_&dd2GX0>#M z+XNhkV_7Nsh#4)aS;3X>gZj!pE?Lx;eNWj6^;9{!_I6mPoQit2IzHzaDpf{K4%DH$ zEwz6LfIkh#pJubPS+yz$#`08|H+cOic|S4SMQy52g`pkl0ksx}%CyZgYLLm6$$?;R zG|^!HUy%uM>qmX_UpZF(yv*T#R*03cIxDCr8VpSvIw=6Y*Uk2fN*P&G#g)KVt2RA# z=}zxfYk><7>S6?4ysSIY9zwuB>!aL8QeIycj!s}UD|xL&kLN;QwzJtQuHPaT6WmI) z_Z5dnZ4Dh-q*5(-D1sQ-{-zhNug~;3c6H2&M2b9HgDZbh z5veI(g92S^WU^L=Fe5+?15~vQwcePg=Tt+rWLlI-v7{et2XK@TPW~5WUwJ3`nfFkr zPDztx(Z(cbFRVPWK;xj=EG$T4FPJnt{0H#1<*&wsvw~ICn52$~-t6XAQ$dz#`OUE@}IFvfQNQp#`=h66k3Vw4in(>v7?U7e`Men%C4Nd>pAHlM0=_k%m$ z)}beHXw>Cfms@9yxU4cN5|3^YvIjayIRjg#0N`G?_@Zka+EHreR!6x)nR*bjL_@Kc z+Bpo<<^#+U8Vf0QzQB_w-z4Do=gCC(M>In;^ccmV(o2Xxo7X6P1~gO?vWAOrs?Vjf zf3!dPlU)6_%+V0xEwj3Cb!}bmx_qF6^N^-x8F{hU@`^LMb7MOu38*Fo?!qS-`JY9F zwEQyne-sU}VL^}3`D5$-p$re0Ts;YOLs>Jqd@h0rVeds7a``bKs9`p|NC&_gD@Cge z0=N)Re2GsM>cfwiWbRYNQE1yy8&$YBDR!M@&6iIu5&fw?xCxe3h><5fMAGP4PAGho)h>krI2*($qMWYLF{sCSzRlYoi_`F5X$)gG-*PoDX$PGnuksD(J*jESm=E7g#w9KB z!6Hu(4#DvVK1g$KN{qA>eybxL6_oQy5Q$pwia!LlglHjo7^*<}fP7sgA$m5q5i>2H z8}iT|6VvcI%<<=(H0<8W{lz4DU!sZ~?86;j4Ei+x^U>j9=BZg^c@UjlIpVhMuy;wP zM&z|VbN|yA{l18ZxRjUKvRZ3|qr1<^H(qq-rsq^&GDMm`?3!36?B&JMAMVABe~&sBk#NK80Q9Sgl*@ z$4||Kw0ugnlDJ=ZS91c1K0JeL^otK#s|wv<+9okh6ik)@F9a|aJhC|jx1|*bnq|hQ zC$wz~W%*!IzaYdXh5PXfSE*JHeKQfQl6xG6OyqohKptO3eeGpy$F{ej%#;P&ETDJA-8jLWYZV^s*yt{iWLU6)o-m$ z3tgMefO4Zm9M%VGRvspBY$+W)Ivz5yD5Eu#(IVR#rPQ>mh9XtXj~0Raz6CTDOIT&Q z3gs}T9a-O`lAI9gftK(jU*`=+FZeQ3qWt}@(-!QW& zRjEa9weo(>Qem^NM_uc$rjB<|Vv_q!+L-=Qn{Ijbk$hIfI!k^Wx!h$r5i1|JX9P{g z&{JwPp2)CPMcV&`%70WA0!smwvVu_lFWv-`p&???(j0f0CL&z4ah&&0pEOEMY3uMZEkW)#$J;S$#S}edl ziq$1q2j~N~3L;YE8}0;O-V#@GRwf45)6yf);;Od(x1f_($bK73#$od1ssvM0R}V4X z2C>4DAnBPwdfkn&&Z;S)GGYZY7tI1n;)M;BC?b%Iy4QYLq_ujnQ$e@^c{23(HY@p| zFmuV8o1=%>UR_G}M|>fb2Gs(=N?2;?AFQu6Y=1ha+FdI|FxKo~!qVcPl#{e&O)wf^ z*AlaL@@-Op?S9{ogW(9806=O7f`f60Bk+SdoUZ^QRTD5`ga9mKLPtl?zqyU$L&m2a z_27XSUG=oUV#>$H`1rm(ohhXa^VoW(ltD`Fv>Lf9-CRf23aFgEr~x?<%lf?pzK#;gc8TOIO6$igram&n^I&i1tI(GDPF2kLo+96h2p`?wM!D<} zj}Uy6py~d;u6-XO`U`o7SLMUm%GGiNZ^S6=pjufBI=wVDThem?ed)021m9C8Ww3GK z;U7n%U`p$^n_?U#0H>vZhYe0~H7l}A^{n>Mh9|m|Vew6nVm18|m;^-qVWBb|PDk%e z){~^}LAPU>aexDv9Jx(EI*vA6oeKDbE|3c!&>p1lAJsujN)BZ z>KB^q3_08zMT%ffSzg8m_7zw5fAJYgdF~im3o@5?3`zH>MwG(#-`7b(PBn_-=M$W5Uc0cmDWS2j%P-N=R4^q~6R?p8A08MlQmf_=5HfjfH5Gw(RFs=jn zcz;R}M?2X}gM=+v>6xdzY~O=>U)VFCZuqRYcj0Z_f7tZPE{UYo7lg2*rm#PZBb*|2 zc?+-n><>zq-|di302typxcQj%6pux1%y`aBByG$i`=wG>e=zwW!t3S{wq?lZWyah6 z3b~{_8=IjZnRPbTIk>O$Y+Nt--682mqq27S-miB0^33Cip0G&$iN9?l1>);mITpZN zdQ~8D$qlsgw*-*#L%sW=vcWfkrG$c})``1tUQCEav%pDR)uaFjPArdQ+srBhoJ*ka zhYIq#zlrBsW;KNUjO;7l)nm%G;Iy@`cX9Y8^C;_cmK#qaz!9_lH^;L5q!VF79|{FK z{vlxC_PTSW__06&3#IZlgpZ`EvzF}t)p;nQvPj|Hb)#>ot&?rZ-{Q;jyi1!=s@&(B zaI2|`e$p?Yi%?h<0gK=?v=@ELgH&vqz8E_g1*X~B&B*xKe8@?-)>8aJTWXld@GM;L z0INl#_Gi8Hb`k{dxNCl?8$114u4JL#+RuQCvu8kD2i@nKSoW)DfXvOjWn8@`+kZ2( zJGFm|qq$E7hy^SNzr-Kpy$i(MpJYTjg7wIa2J;_>I{f*OX4zhE$W3ahKou>PaG)Ta zEPv^yYp$x-{**9bI}u7VFk+R1gWb58Gh90bM)=OiF69@x1}ZDY7kuI2Yl7OQlw3Aq z|BcRSht#%Ojw1TJR|P{7Gu@;O8f2>nnr%r1C49Z<%ibUzD7md>wVix-cKBiaU%qOlDJtN|$8)Li^N=i4;5)7$A8K*m+mV5l{G|dy)$ow%RRgF(K*rB<`WL!`Oki$ni(v7^R2s)zY~0h+A8cAQF~+HA^X4%^;ATFtliPN{ zhIFJdaC_Zea62%K=&RQZ4`1b5%8qT39i!%!()p!+_<2=enq2-+T%{2MZGq^E6^zOe z^kQ41R)zvlSoMS7e=!d@2>|2zT`r7DoRYQ9j|o581*-0`=N6kz0c(@lIOi<#wbzIo zSG*Q%J4A18Eg|<^^TfOs8EcA3j(>MQg`^?|z}jisjSaIe2Cj;;(^5T`N{)Kk6CN>~ z4VTn1^!1&GlPHqFaX%m-k8_jRN2|&gjXMIe8b(QBE7gTxD+|qb#@dq$XGjVvJ}$2mY+B zLThhg!6u}QTIOstf$-FIAuoa za1F43x5bVoVLs)n;I{Ce1HLDMAhlEkDOzf&DcR2=`l;}ugdXRMu^>=60;*Zi3nfrI z^POk)Xvd~4KhR}#!*JFHFr85w$^meRn5QSdW3*8tIyDiw09URE*24uw(Yx_sI)KK^_ zGrw63#}}agvf-@tJz3p>`0SU+`pXYTUKmOs#-ZM8EMJS#_zhzV%jjN0*wYeU~j5 zekG2)-VWV66yDiC61IZa>J8v~wT!JYk>~dd(CyYxHoF!JmdL3G=YIQI@&-}rjUEdL z2_tyJIp-uvKV^I}oYa}4#fzODFW^K(mfQ{>4LWIy@U}S$(VVp+NySDB&=9Wnjcf2v zjkXIU5~zP(Qy684aNy=xh4_D$uwqof31QyQ_Q zOogSHHd_lkFuxb}M)a6_d#oiirEWVkIyMfYnTh_eU!u)gS&BI!&rUHbcpYoe)_4>T7jf_wAPH>jhaWLOerYr?GAY~=HD;GJ6;3G^hD#M zVxFZ;2Jm+Tb_@J&p7S?398*1Oo zsXi=MjItLq0R_ZT)x-{}vZ)z0)byy$DU>38SO3b0LpMH)1(%Pj<@0;FoybLy14Jqi zh&Z$owZ)$SvIxt+s`mby__+b%F%U2iDz+q1q`74i|=NesDhD5^SHU=IBhMSJV$uZaGBPS)yc9hCpD|WHzh<5plt-AKwLuC`N9I!sH7= zQ`u!@sFW#yy!G)mqwG+ToD72c&zppmL^N+9o73$ay!5>sqbn<#g|7-HEXgDBj&NA* z97@WQS6O~WJ4Q6xurx+1=KcN1aU->c@JH}aLW_l;hHtdim`g1dhgicq*#*vK3S%8* zR`}UM4pBo(HJ4!inZCamnPGlcze@XPtSA1Srsz7&DmN@spGL@YmeU?Di(xMlftju~ zBRb_#uBdTT+bZ+>FPqdc?q;j|pW)m}(}}o94oO5ukg2oJM(wI$@hGdGtZIa-j46~& zl*j$q>mq=nXW{SGL?v%?5(6g~%k!&33=L;n12`)TNYdy9wLTrkt+Az&@}>$#NY)@~ zZ#(anGcV9J)#y5dZo9!C=Cc~V)t20w9@|5K@m%d;<))cwu;r#Z>UN#=kF5RyJS~(a zc_-US`X)!op6>&;y*yvF$jo@}Pa1-uRfx7sdel-QFneUW={&}PIYULw#<H4A&KVOJ1mW}|kvU=7-pxVWrrdvd&=z>P;#Mj-O!lc4;(W}a=wP(N{tid5*4-3ot zJKngT!h>JVLM}!hSd4@{>*$XoUm#hgmrB;s-;6fLY4q)aFTYtkU~Kaz6m*s;#U3j@ z8}%d^OErR_#1NG&Q)m!TNX!BI=4o)B<_;XOZ@)sFGQQTQz@mf{Ps?kv;y2SLNI3F6 z##J|m%5Q>!%O@*$FLhaD)FcsmjPBBw-0$|y(jLI6zNAj9u{vs!XFyO@BQM2nm*Q(k zsx>k3J_@@riJC%HS;-3L8s;nyQnkV-D*dD-q`@NfK{az~D1=HJG0QDp#8hw$vs8hVc5=jN3W6%p*L z`=PjI|FBXmr!`yJJ3Rnv7nZ=GOy`VknsV6h+v&B;V!bd$kwzMJb#Xr_z?8;5GGcu9-)2z(vX|y(j37QkCIFt9EjkJD z0`!Xa&1N_F$1FC&0zqK6QkwgIB^_Q4GPF!&#`U1DW7By*ldNTN^K{GT)lS~)k_6WG zu1(q!15pi3gV+{_oPXXkE|8s||tD3iS8ExF@Ygl%8D z7S- z5hpuJ%_OQ}Dn@wmEu~~DS5E6O<}=JDDj}Vb8hg@)OL$s@LUflyb!-#Xf4JxFd^en> zD3YXcI>hx4(v&Px^1tqF#*KXZjs=w;DqM&J;S}qQK}Sh}%o_Nq3ci#Nt-={_X9df? zt>)Q7xszt4)pR2JcSkeIVeR5D(9fEHsOdk)bh^i-B6Iw#F(_2Tg-7>tsl!Z-4Lqu- zx|h<+tAcUjTDh3BE>`&X+0TF_4QUoV`GEQP3Xn+dm2m;pc87}kf5(|5U!B1ai2$~3 zY6zmX2%ED^o?ouiD0yH_HrF)eTe@P)zqCdNjwinM?ax@Jk)zJacAs(Q=bksY7|L*M~BC3_*-&9&H!n#TOa94Pyy0`W-R~G|HYn1t@rRY6A{?c18%F5d&8p8E50S+>iJa2b;%j8V9 zk>4Dzu3PMNsA=)T{=S9e|73Q29My^Krft{zk^Oq*;w|&5glV;r+mu*`z$THdijZwQ zhyL;5bVP`B(xYNrv;Jd-JCL6GskN=TVQ)Uh^{sNuz4IY=y(`0ZNpR*n;$u(FWi@-8 zbz;6>b0Eg53#RR5-n-Ts-DN@Er#}z~2a3z2`47);TlJYw@Vk$%ghT1?PxvMH+>QjF zW=1P0Z)OJH*2$m23l%oytXNG82at$hQ&0*m64dQ!U+>EliuL^8S_=e1fi} z)Q@g!e9w=?U_#eMD{T@+CXB=n&|;`YH|4Ae7;v5Z)YhAXS^B#f0nR^vj9rj3nIw)E zU1D8EKDv7k>rHkjS|_rHf@GXd;v= zQ!7PV6=dOK`QG+-(=G=S!B2y>yS%#$4V++2{+W6F@hKR8otGXM`6&$ID_GGILVa_> z`giR3-S-JF2WaN$*VP@#6z_!n?!sIPT^a3PIy&a;LQuR|Q!N?o?GIkH1XlX>ZRnk5 z+T#5J$OhQU@<)a9C~4Dgwy?1OAU!cIgRDhf%*KUx>KVWy0KLN7X!%|e*XLWwHqkUw zN=E*A4^|4m!YmVy#*sabD| zp>n}ejh|_A4!W<_q<t2Njmf~0#?Z7AYA$GSmZ25{80y|BdDJhoR$vI>489eH4fk0kT(ppd^zL@I~vt> z%#4f{9sWvro9%kGqF56IWpwJ2_A=pA(OBQnzRRkWhx$F-55%+UVgQO%5`AZ zG+le7jnLLhz5yCN%~NFb(G(#^zah{->cshI34^g%A{XBMs*jd?tUc3pg`UtPS>hM7I8jqh{Ts6eymxI&B+* z)gCKnJ4QDi-qLW8!z$HA=e*YWp2cDS~<3JyWyNZ4xs?!}VaMTBsT(72-+Z?p&U zMQr@2fl37=#_wl{%~YpHrwV;B6HJ0Nr?tH`?Zk)alq$?9sjcoJ2zu1@JrRz~8ktH; zw6phRqoBTGOtUgB{+6!(K9MU7!{lb~sW#u~onRw_f)a@3YHCCt2iK`a1G{16NNmhU z?DvK|VYczH$x;3nmem}M+pMQg=ka#DOY=h-&^0EJ^&vJGhNy>)@6#YdTlah3+@5&u znlP!v_Uc~7T<5&VWB0UN3Hew+V6@m%3lv4Qyix|?KlC{7AA0-}9wA2>IMYci_=p3? z>&7=E4<&Ip?yh8Ob?s0L8BkQY!=!@QeY&92|D~H#{i!>Q+L~YOyr#+fg2gKFgYV~N zV+QX~#qC`jEWcke#8~tcalEgZhNSW7zno(Yx`?nQk~uyD*xIIQ=hgxMdCOhA9h#jw z;HEu|P7C2-0UE@K!!rRT_a^A!DUEKTX*)k)!xPW3-{*`Ptl{i*CZ2`A5qF_8YjhQ; zL0A4(7@lQF86tbJFXcL0IywhrrA~!PTFbW->G{^`fy8V>L+;9Ts&I5{wgSmVi_B^3 z_nX$y%AL=NAcw<$%ePZg4i9qdi4+E_lx^sm(NQ?*{rfwYi~`c!k`C&p;1{h0_cbnm zC?1RW#rw3KmK;hud9=QZhWBZNVngK3;NlpRlv?)IZjcjS8U+f$@?sSS!yz7 z?jiRZ7TBUMxfcY1jL(3wrX}HJpnG9=40A37so)D-j+zv8xSd6>#*e$j^6$R=;ibnu z@LmER72VDZC(K;Tg`23^xcPWKhS)0&LAvq>9qL^CWYgH^X9t)!kZ%q4-dzpue%W3(I z4TX;B4{4P~WjsBTC|&w0lB0@;xRREOfvb^jsdFh%GW(R|W8Pf0aIKjcLw9-(i%$nY zeP#~+AC_17*A!Jxa)fgxgkqdo9Y^zRCbnGmtkWXDCd3MVuXwdm*h%uF_2$jd(`e64 z$Vz%y|C7K|fNG6OV2cp-NexjWIEc*u4a*<4fT%ER_EeEA@Cr<^67;wn^_{f1dvn5* z(`Ci}v1S;8lW}tY3)*v;%dvwZ1O!T+BY!!b?!?<4C7e--tfn>3(CV<)TK2+dPbeI4 zkvXzKVFEA@6K^%(ub9CZV$(w?-1r1bF>&e^VL?xz8)GI8kP5MHn*tU0yqgcMrR-+!?siR^bJ zO&9hA3Q#-)-k?#3^)^#|vk3HD6W4Ru=QdXbBMR031;M zw5}wIYRCT&PwjTAIY#K`YiBd)1Y)DyqOQzYa+qenPjLk<=-wf_Yn&(0e-Fy;oH3G! zu+$+(`~}N+kpFF8?%QC?eR~O9Y*hIRmWQ7VVRbK6@R^ zKLg%*vSR_!#TKf0a)AGQG6-h7DULK8bb~l_ujdAEzOdiShW9+PiJ(%i#EV zO#eB@$GJF{LHnoj9GJ~PV0(s#0?E^~Y*(!J$2PuJaLF@ZyZBAr9!}QZv1&!Nhu~(R z!I#uA-XBOt03Jy!O+Y#Xz;T7_Sv#(G3hs%jssoxikEXNl;yFOzI5T?HXdaDBd(&;> zZEfHg*Z#F`H@kPUrk9d_irHRFr!>C$$6;vs*^yGbxCy=vWw|y4`R^)qNoF8|+F>Bg zrlb8HIv`aFf2!b$1$St^OnmiM3XTA{rgZ9N7LQ+-hetPMd#qoZGwr*EW>>TBy8&@c z$`L(ZEeYDDhpg}kV$;uXS4q@nmgX|xMEi9&%55r3O}>-J9Q8uWZo@>4dAWBx<##&= z@lA!hWLgM+2(V<;&%Ej{r3XQY$0($#au#O0_r%xD;1bGJ+gfQHF)Ss&&~{UQ@+}tw zB3;_Hqsl`X2gaTJ0P0xFlI+$`_J%6%keMeIrER&!vCSD*LctQh+EdVE~%F72zW zty6^&z;3q?PPDb(@1iLljHSY-n-vlw9E&x#p~tIagb{g6n0!-FTK@HK@rTsJe&&7D zqq^X<> z4K+x|DcM&^@C~42IY&<3=`t8=UQpB$zM4;djD#~hOCW!4HQ1J zSkBGAyp;mv0aiXnqF<`PLMpbe_g{j?w%kdL`r3v%Zuy_~+-c3bW7F{pGknZS`oHgx zsx_2aEK0K#6*spm0bB6=#aLP$U9)JIX&Ojw)hF$C#t&QO zgMuzkhHVwMm<|1`kX#$mND9D|0Y@OQ;N)C^lKPjdtrP0LQ}k&Z)LS1q??C0xZ}zN4 zNbe6-X8VPxtHu>r8lp;>8c_;w6kAk&{?<%S?_^fHCgQj9V0NNjEcJx_F0IK8A4pB(DypuS^D zZ&%+|J{*w^f48!vMgNf2^zOd`JO~^?rUj%G09F_vRZ`x~2$SlFZoi@nQE;X2aKr<@ zB*9OLFRi%ShMOlPZE3CFj8fpSg+|$3?)V_Nh)bwik@Zml>9Hj0*XM891qCDJC-UCa zX0BFUuMp~C!Uz@d9~5S@8U`XN2{s3v%YtQpJOk*mRBf@M)5Sr}#;v?D*6j|$X~65f zqNYpP78k!+=JzFpwEEGXOxsEl;YxClU)5znM%o~a?4{^mZgQZuvDI8nvz|F^ITbQT z9&%p#o^3-GO=9iSx%^mg+LHgQPeQAnjf+*c|7v$NeUPm|sVHnLQU6q*J0>@uFub9X;cLZUFx(ci3>D1T zDR&Tg(I-D2gS8zsZnd0^hs!3`of{*zYG4YPujnwzf!9Pu@q5PS)_{M59d)zD5 zm6m0lgxyQxYcZz>KMK93 zHXjb!(oUH(TWL0Uw2_}bW2v}JGKQPDx@#`hvzvd7owYkcJ%HMT3zgl+I0ETN&}Ek} zob{bt48B(Te-=;F+ZRB~_)8w}(ehs1FTMM9bJ(@hL@h_Aa8liAE4$a|Z{9G2@5-sO zJS&pu($05oiC97TXSWzuj6_VeE-aYvJWd;2Tg_zcoSb}K)8M7}53kLr0{BH0o&hi) z{JexMiqvzxBZFB5iAU|x3s@?FTfa{(ncb6|Lo1P?zGE-HdD#h{-VzjvCSH=+ee+N1 zN(2_K=5mh?ish^A8;OSzj(X^scz8cQnZ{&Y74Suf2ZRa3Z`zy0cT0`X=Mm5&xj+@FL%YL#3MB~codNDil zo@LG25Pu@J3k}0zH)H3!fy>p3{Af}Gb~>}uE=koq>a~hz$s6*xh?ERd2VbGJ(KqRR%Gvett5es?sGu8wiIr<-6j*3rP+g1MQNu3~S%|3(u&Rpz3ntA~82 zDQ8eqTCL^yi~q>47pD@aD%!|RYtfSAzQ1Pzrcli?<8!j9b~(%u*HInoQff4Wv6!=7 zcY2Ub*d_aXsX|lVeM=ToP`9gqq3eL*poq84-CI50q0z<&L9A3LDU79ISPEHj)!y1o z+ACN#%h$AQO=%t2EA1O;qefg^(u+i;XPC}=)j`3EPNSwdsuM2l43An*51SF&ZEKoV zE!B$gaXV(CF&$BNso!SJxI!&*b0iudaEb`jtEKx*q@_a;9dPNLwAfYNln1x*t-M>9 z;}mGEO5~?C@@0%4t~4`D#4J8nq)J?BOis(+UU1hYC_RQ&=+!>H-`bA}Ff8v~8_&r^ z83Ilj4jr$4+;G2vpajJ%T)l&cRE2aDurO_xpDQ+>D=vOy0nG~vI7A22ta8Ej9i7{w zIt<=5U|2H33pr4y#Xb{(K7Bihcm9bCWqMjiwL;2XgUpp{r=8Ub%a=!T^3?yR?>{2a zR7QU=coN$X(@chge|**a_gKaY1)Q@5*rJ~nAeYd!X(pg6x2`fVp)2#PN%9uBR_d?6DSF9_ZfYJF&W}!#Z%9X* z$1gaYgetzon#y+BsVwsj_tJ+m?Bc}-^+ru7GyXY{QhscLt=mO|w~sucxN&4vz2(&#CutL&`ia;Sc&+CyIB^~GN88U`QTB<)vY30~-X=0)rl;v88f|7Pra%yi)6W-jGRJ3(@H z%?3}jG4GL1P0ZL5G|pwrsO9{$*+PpI&X9$DQx^sQwbeUQ$84YWg!!=Smr&lgeymN> z9RBR%#N|w-&(13NkTE%XWKgLzDFx=x@HhfQVSAT5rqEn%WdK1S4=OgW(#NV%Jr`=& z>!#1kwl@hDpyGdIuPvkRtS{A7k*_Q(r2Daqi}`N3)l4k~xxm9i+Z)!*+hf?gLA&Ip z!q;~n>&nS4+$m#9iMw(%H-YBCf_z#t8f|yZ4Z^$i%4OHcX>C3F4HmL98z@yQ-E*?B z5)TY-M~Xgw_n}XoZ1Ion9+hKp+7zdqVL$`904x{CSOFQ!WyV2Dsz5e#*>SyC{hUGf9v6KBCe2mR*5Xv%6q0Q8Ppke8 zS{L(KI`ZathU~WMPm1T<+_MP@%Wjf&3Ksw!pp!<2hbC~_d(vVXtbqRBlfrvAM+7$o zs{eTzN<9$OF}faVqdy-iktxr`0__CP9@pznS-J*CDy(+pNtqFZbin%z68F%J)Pl~B)6bN{d&w!f~ z&IPW48{^KmM>}apZtJ0b!^csg$5T3@Ys&6Yz83dt%t_ir`LaBB*wr&)d20N2lKH<70-vnILp%W`!u>SC9+Bb^!#L( zCDEABhg6XScbPXn_$}*G454P=$wOT8?^XYVc?-b0h+f<46&3pzxJz8h&8c1jP zW4;U1Dt;$EenOnGAIuk2+J=y!Y}*QJZsaIw#k55s37dOPGqR%5lJX2#X^Ci_VU)=in5cx-l(RHXTTNe$+=Vp=tnqUIk1I3eQ-JTa^1jKI^>kSUjtFU*$15mn&cFqQ;d$s>*+Zgvkb#T^*9L9oZ$U z9)jCqNPl6hLlm`BU}Tz!Q`|D-I!a5XTpUy$OH?)JJd8b>wMiHmrQd%oBy_6Q`&d>* zc_(Th=~0id+OEb#=}dsS~{g9xNgl+5y480v>1ZhkXzuUug=u?a$sOK^3#u+2G!@P-LK=q_r8CLiphuT(+m0YcLkR;Aw2DJ{5m5l zHMH>zubUF~1eu=*=<3jYlOdBuEMFWM`;J_03mJJ=H%W0*-PhXk_gZgotbT^Eb74?? z+>KO=1+>}L%lVq$*`%bwDKo?dI5X*6@`1y?8Q<|%%_=Z0dA+nRd{i#Yisl+9dnH5N zAkfNj9=sl?Sy$6x01JJu=XI+${GM+6A%H+|@su@u|310>R`oaklFq2wE>usHk>T%% z>AZFvq2lDL+9`4W+~MpGs2HT5n&XvBzSwM3t+S_lv~5z=sswD&b(CKBW;H+NVOpqT zq%>|pSuf@KZ<^x;M`ljad3L#4T;tkN>WT`1C7TT3EgvqxIz^T zbE2o(9F5i0#jV;(e10~6d7Bj8*LgR`YBtN3*8S~`w-zSa?$K?agQR#-^=p(DKjCX$ zB%*)zxj9L6tvC4p>~k-h9ZLujFJMxE^mm&zw#LGr(vBTuL+apph|KVxCMjk$anz0{ zv5UQ%+l-IAP>es%fTli>%J=L~f?LvAM}izx8^%5#9V0}K?OE%^CH}9S?#a|r)zE%tQjfE zE86+vI=R%z(_D^AfoDKz`yLP3-6;on0l8{8G{ET|aK^EXw}Hrx3|Ctd)`*qMyUc!Ik`r`EvwU^3urXHkg!H&_+j1X*x!_oPK4X zbI#`8!1l)cVY*yRgEhou*P?G&n}Z=g&vI(-i3j=R#NpNX_w|4c1n}vLzIjQ~AIxO0 zm6B^cy*sK6`v+g91`;`)_g`Loavr?|&w$^S;a}ZmF$0fwa=X@YbFVJgH_jK<;)yL< zx{%MJR9gZlueUNEgC`Wx#l*)vihe-m=4u>3+egW@;3Hb7lpXb0_tErHZ4J*vS2&00%}TF%HjI-r(p<5ev&Xmpo=qJ$#m z2lHJkNJ_6W+9}d`{OKch^C+C^-koYaiLWP4hl}m#jgH9I6Ww$v0c)o7DrLlB&^l*- zLkw}YhEwNDDu8jzi~s!}RQ(rwe4&v4qKYNR>|a!ADWFy$M9(nLQd@ zQ~E!YVZCAf{*?{sWuoc(T0&X^w#gTRf8{$>ZCvr3hNs>UYc$f#3V~3@5jE+*-KFIT zoJh-B{HCglg1hmT9#>wD-Z12weu1a7W%%=vGAg_y#;7)HXIWw2!+Y$SEm@Em>~?Cz zF&#$>29J8&cbAuEEX!0vKv^5EQ~np*vXBX~6a z{l6?5wq~rJl;LJaXHR1=vVHCU6K5Nkac+>Ha_XtM_J0z%{@B03|vhAH%h42!$&#C_KuW>im=qQ#H}>eJhCx?LrRJyix7F z9|HdX>x=2kmw_H{ovj#U$H&^X7|+yvQ<=OB%*HwQb8;dmt1s13FCH|FqyC2)(XcHv z5?6b6RQYKZw{=4o^-1d|8oxHVX!=(#U@Tcn-7-~=JDP)yPCw!Yy!J~t;sTm){{St4 zx7k--WnD6_+YLQsU83oI*!IsyM@!lR8zA>3V2x!=04zk-A6~lfcztTdBYbQad!PjSCi7yI_i~Ne^Xw)~F=< zX0|znKs3+;RRG0M162SePyYCttm4Lm3gQTp6vH6IY{bna7+ z^4mSqSx}J}f2gL^-w?|$FK4JDJE0GyPlPS!+Rzc8)a*=*6 zC?o#>H40Dh16_Dyqj&VWGoJEx!;AGsvF#C@f0g6aH-^}1cJ#0BoYn5zY(oWZGlO;v$XW0Fu4TA zeiPU}oqAkRCM+ClNt=*J`p!vyQe4p8y-1s33_`0>k9k~=P)d#YnK9u)U}T(wzr$cd*b(aWB0k?PgT zfzaz&@|2H@>$S$!EjFLZdS)$;)+c8%BCSv3)sn<<=L zQTBR^D$)bk-j9N>%W#Q6^?DSbpN&#L_fvb-V)s_`YY6F^;-CKj63u(BiRgrEy7cpO zk(DxLS(vjF`eijaKM#rvZ4laKKm{_eG8#!OuvP$6btr0~snpb{C^o5wn@ej(V%PH` zl9Z&CDXKaW*AATx_?hfuP4xarwpwR)2N&`EM~`Jm<*8EJZ7ilUiC4O)?)^ik)OS?4 z)iv)*k?41H+KVY*^hUCKQnyoA=_eSoG0~(!Wo3C*F_AFAz;zi6>*hp~586v)in^3! z(|%VcFSZJcw9VEjuX#Z#KZ)kTE%QnxZpV=Os}kI~o-r-N+(sm~9d=BWqea_7yL z_M-D%WgQgDkM~!{obk~XYTrX=WGtJa6m<;(F!*petJC~f1wyK)#T)(e!>BZ!mzD6Z zrZ~QnY|Mt)!o87na+2g=y_`0Ks#EQ~VVT2iMY4G4{v(yR>YQ=MRqrg4eYM7ViBSTI zcDPqb5Q))2b?f#Dt1M_CSdF!lE{S}D-Bl#|GP({?Pz^Ky)j$nY0M$SZQ~;D}Ks6cw zN}vX#Kn+wN5~@Ho8UxGF9NYD#I^OBVP}wPUPOp%p>O_W{G8ng-+O==#A0I7@u4k3< zy1B?)ZEJB-VkrsUxNpZGfwbh0#6}~tYw*q0YBT5*t&_D$9tw&zs(z1EPmY~!U_ zMLI3r=Yp%@T?JKBs%kpz#QAMCk#RU>CI*HY~Ym4ggq{76~7awr35#O zoVLkkc0ZDkl(iuQZe;fxaj5<{!O1m)^Di>f8CO=aUSpJE)~r3(p{jQf(lEc1FqOR| zbZ5i{;mdH7lId)qIyAHId_MmGo5r-Hx9X|qwFK_#*4x^=&_RaGdc=?d^mOeOHko0mA1U23?!<)TaC zT>5)e9b!byLvJIDd66+wQ$8xB#L52v>teP7M5QEa@i9sg+}4JxK<05ywu7U>jXXXV ztLc_7dL6WxO!frlX>{Dg+2fWumNxCk|wl9Z1OM9tld1 z?UV7yF|aEgBnT)JfK*wHaCni3qwvaQV_O<-b>bu7jl`Oba!H1^a+ zP0~-EeRhf_YL$xmJ+dx8Q1T_1kugYBoLW-kgpS04WTw3Q$!I(MJT#b9Xo7qzBdB9y z`U;j*v4D0PE3&hZWLvQ*DEDRWrT(H!k#B^7t`+>idMzC+@FOCjjmaFr4M z+awDVU?Hyk%0^R4^%tM-f3)*v-|_vQ-dW0o!`X+UtpK*>Yb?P}XD#?aY9HSLUUiC< zBVU$1=U(b^Yv-S8GplKprY~_q3t2gsHqeI2 zxkgu}9|hL`0F1KT)7}kfZ?#YK<}Vgz;L@VA-Ra(k^p9vf=jFpMCGkXxDk?r7c3%tlWy_sbHK7cY2IR_p zwPD+CVnS?~dA!U<8geM&n0MEF-$P z+?~s`-5jkcG~G2u<>yC4Wr<3C^=@Ym7`FT8RH|IR>Ln`w0J;iORn3)~*83Ha8EMrl zY2PmdWir_}GMPyeoc{otqstx08YFy`=QmT;ilU(sN2Qzh)FN2MmO&O4@uNf{V*uXd z-l)qK3<7OcB%8}WH9;rSwW-c30g9jmssKu$2BSa?Mt~BH03{lb4MuUzXD1_ZAu~+KHtx>&<(5X21 zlOr%AWQ&@C(S3p_PnM(4Kb1+P3&N!TR>Q)`EahI2Gh0I1s;0nD&r}osvH@cwf?`6LD zK3&98m2zCuUD91Wzg0u2+@wiQ8A(n@sQP*!Yb4P1H`E<8=+V)~dyO`4em^Bb-D=!0 zo45RVpVWs{&nU0W4qcksp-Da-Br@DRKF^ z7Z9i8MgvW(w4Ti>Tcb_dD(WjlW2Nn6;aXA2+EV$YP8HBw^;SYWOh`sL?8nO_Brrvl zwWSd2s_}HCKFZ?GZizoOp981T#Wvi0ip#{vHlb?eXL1E0?dk~}2MUykY$G&auwgta zHdwWY*9xm7vE>h%s!8;XY;%f$VyFQsfC{JqD9{5@paP>n44ME+RY(M-Pyakc^g^t^}6x*m}e&dd`2vcXl z)>gKUe(KT*J3d^j%-v&kqnGqLCO#w?AvhjkIQ)xl^zt5Ax`G`anBboz_M|CIcv{sm zlU#aNA6E?5w6ddgt~@<=hi_olWyF;cSuE3Pauk+vQ+k1vk6Kj?*Ku=Qw|FHgCa)CY z=^Rs%k4jTUGNkdX_gnj3>*@Bgb4#C&edk|q^Bmt!#`t`^a(5>=((ez$eLQzK!(?my zm71iN!yLy|@@8u3H6NV=u0^1 zMLfKWDGEFrAxgRj9RM2Cy8G9X;F9>4yCu)gS9Mh=*?E^UUTEz8n!^5^MrLCe{Be2k zA;fUvBdxN~ZZXnML08l&OP6h{>JxfqRVLpxcIb~rEHE9h{^KTn@{fYl3R$Ze0?hD*4tH2UAp`rADP&m4A|^gjAgwB-*IUqSh;XD>hiU zir#{#$tUd7*;FL@BDxN7Pyn2}XbtjQ}MofC`mT0Vz}fl&Sz~RRF?h z2HvECE?vHEHd|bIj5?cnpw%8Ilzi77H}s*kdRB!H4{<_$C)lB0s>J8a?Wi`8BFIAB zNmBp-@FMnYNOY|E@>;b^RaWJPwV6grF8F>v#6xAdNK-M}P!f=V1rF(NjDk#@d%hv| zJpk2RIx*;Wms7c_O>M)aUN5Ct5Hld0f5pO0nur>k6TC&1=JMZl?HR znH?v*CBs_f`x!~D^lTzKCQDKw$5~76JRr6-1-VgPQ?MN#PlYx74tQ0Sns0AMz1e-J zJJo%?Iy^c{wzC3Umom86;rSt_vX0?h7exF{K_l}x$nRWfEv-Ots!9|}Ezx;v@X9_{ z(x_ezwUXOSY5A8!uYQ6{0z^?2j2p&G%rgtk^epE+Ms^)y^6`%MmXo+`J~cH?yVg?S zn$;~5TS#`n-CjKFO6b4pR!nGR5)~gG)63<HMA{smL3p;);(8kVfAw`nL8i ze(wfnI?*CGXt;FoLz(Gb%~eXco;@=WAh#|f%}2y!B!nxmDJWb3Yy(``K3DMDr=Fw$3LY`9{UiaT^`=VUqG7g}J~R>ZGG;AZo45ONA(7TF%j z7V%0=bLL&08A^zRAGzblhm~hTN|NJxh^n$ta}~V>WhQEic#UwXGR3@fTGd8LGhz9v zq@O`oLCh)uYM=tT01GrE3XK3Inh*s>fC|+@KrK`t5|uy+N}vW;QU(>!2rF6vuMNoB zHQWkq<|>m2`Oo4a7vJ4|%|7xZmE%72u<;aZ0Zmu1V9)q0H6z4iNjj*sqTQ|vUTVNMej3T7+H+i+M z4LPsj_=JfqcLHlEG?i?le#;wwudg(6PqdDs^%V@ftOAg3bA6+q4TUEV+^;u`179`!sup_z5p7|1#sTPt>A=Exymh|(Ka3M~)v z)>XLor8O-ot&}snQns4%<*3oZRQDwEO8Ph(&RvK zYKt;KR^>kO*-GAZI-4P&hKG8M>aoh+qDy)!TDt4EUCT~;wUc|BH1$`rtTcZ_b}?y? ziETuT!~E9T5!+Jct;K>6Jzk`wD{`)*rRdh0Qx&fR8MgG*Iz3psb{VdukMP+gycc%g zaYD!5PS6Rzv%0aG(sV`WE7^N`uk%$Jp>)fr1Zi1F)+T}?MTKI`ONfZ!RAiQ{r$JRD zmAB}slT*IeLCh)uYoGwS01KfY7H9yd&;ePX0JTs6TBrc6Q~*@E07_i|(z+0M7p(yG zE8QosimZu8%w0s8F?x?N9U%H;KAqOr*K`6cr=hi}2pkh~c-Nr}>mxkOl=*VQKm(V1 zb(Y1OQB~55k4ujw#ex2sIb-FktnOU8%-^S7AJ@Xb)t5?>X$-Bxq`a3k_k^aDhtscO zoaMMXlnL#te=6n8hk;dvd&|xJ67RWQ&QBiRMGqhr+G8y0+De9}A1Ng=0k;H>Hu0-DCcfU( zO0)aB9z40l0z@MkG-W=WqaT#VuX(rNf?SGKf3$tdmnByD;`~ahB)O!$tF$ZA8C)q+ z66!CwB2&`&sGiHQ+=a}L+?=ck$=^2*nP3a#Be0!Z zjQy^?o&Hrs=+!T4Jrjq*-n4AhQ?F0UEqgg=L2^MRy-gfdFT$+snqLicnYN{SZnxI;)5M&{PJ3@9_HrAcKOz)_ATWsb zg!GlflO14%IcA*NlXXPW9MoDbR78O!S7y2ro@3qi# zihvU604{`pT>%|;paQGV0CM`&5=UL=055d_1@7*k0qdz^Y>jQFzXz#Wob8jm4Xh7+BXerr!JeSq`mD00=D+s=d02>%I`~16>=}z?A`s8 zqSi+9)H2NLd;56&;-Z}5yu?MK8NcFN+5Z3vn~MTlaV&1~ZKo9Wc6LusOROC)=* zZTx;v966~1-L|OSl_f>PrwV>M3+}4M{8}~g)y>RU1||F>!bFr7{uN>J60p8Om@U8+ zZW8Uv`q%evDipISsI>EH@WhEMo9{gw_*cgQ!N%Nh%R=2lE~&}9*HAZYR`x`_iCEjW zoDh3QFrB*G1ZA6QEneDk)K@k+7v68)*UeoVo(4-bhUw#yck^zbnld+5?}?1!zOmi6 z(2;G|_jIUJ%=mjmvhuzs)K@19fDR9b>Le4d^CC#$_eD$0mYDXUiz*r?*vTzpBcOuT zVl%!RnJD^DYP;{@eTCE)#Jfv4Z9IhyuC(Xy^9TMU3Z$AeNYTJk_7_jcYY7`fzJy-W X)AUwsxpKi?(Q#BHlXdrYR0IFn=R0}W literal 0 HcmV?d00001 diff --git a/assets/img/dp-dsb-support2.png b/assets/img/dp-dsb-support2.png new file mode 100755 index 0000000000000000000000000000000000000000..95957491b5591f5c9189d603e811b55ca5a97f96 GIT binary patch literal 115857 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

    4KqyLaX(wdSBv` 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 literal 0 HcmV?d00001 diff --git a/assets/img/mec-addons-teaser1.png b/assets/img/mec-addons-teaser1.png new file mode 100755 index 0000000000000000000000000000000000000000..f9b7b07dd85b10d7655df1d2babf6b73a6e1e13f GIT binary patch literal 42569 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

    GoS|s;>n*|NcJ@ic z^fqdJbPzV^yd0ZeTXW9x@!(hBtRGWgnzUL`;Zrl^m(_EoDD1A3x;gGZu%w$D>>knt z2<+%seS$IdmvCH9>A~${o{PF3Ko6_FAxBQ__jyGSZq%5y;56?F#!#$Xdaek`qU?Su0_ILBYu z{)7+7T9oOR$mA|dGL0XXK6?~jk|fcPKHJ^+dO##QGp(=CPT;NokXnuNlr-P6d3hV+ zh8I@qn*NG@<2WJ_xPq!u`{=$;eurY%8lRE1am-c#KCu&E+%`uiLO(3MSRB=S@!@XF zJ5Q1+*RR|yW4o7fb(ns;FIio4EZ422*XRphw%?)zOO%qgPX+tc07Y>7JA(EHp-mtn zfOY@*+y7^7X`||Wf((wxvQtIgmpzA{li(zs zh1zfaf)YPs5fS@|9Df(X%lGS!1^+|4gs_cbOBYKLh1he~#bKH@X@B2|K!FF;0UW`2 zctQPzYK;8(+r2SQd)=~nJ#jJ#hvkihyPt6Z(3831^lr7Sqa*gO_r)utb{1?*hyd3Q zJ9R(R#Rpa6tG{Qhqc@w=mDu-rH#N#xsn$N8dG&GKM0XJH-uaB&AOlI34og{R;AN;9 zH8^M&KL;YqK<>AHn9N2T5k!0lh=bXh}<`SAI-79;2+gAONjY%RP`~EbpttZIt zcU~y%VlSxt%7Za}qr%TliIA51&_D}6gPr-|kaiSV;D|36?`VNGompebHr#qHG4Pm& zLi*rFD+cmRxKMAg?_Ywr`AlX)Ri+JymKC&6dYQ>j%2MvH4cD3JViMokch6`|xi1FB z>?d74;=7H#v94}^K(lkEjzQQWybsu?|0u|i0!1<~|GOAL;>(H~#2RKorL@hogD!9q znE2OUY}x3V5)lrNADh0I#@0-@ASd=NM*yW~h(Awq1qPNHc%(I^20*B#v(aIAi1gW; zF_Pa2pq!lz(9WXc$|EOB?K*h*#9ThgoGPnjZF-;Q^2tr-C6&(Qo4)s648(}}S;EV2 z95c$;7o9{DGWaWSgOp=)qvO44)3hIiF)nDq?*%cC(%S{4j!%jPh)a?QudPdQL7`qV zmWkE#T*`Tu^TM5)f2H^y@V1*p#|A=s$wR#u!48?C`xs;S_N5JMCP-mTaYTJ3idau=Wtilc*SJdrDDkks9QZ{0l;Q(siw z^^|5r`Lbz_)P@(uCJPFHc(r_ov<(XgMA52gM`{oAd$>&$_!YsC>c+T(J_-!XlbF48bUC--L z5+BsrFGRX*&%1XnOCSL)V(^{SXOBBF4*=Q#aM?u3d(E@dm?UUwOMBPESv|;T@Q`Kd zHg_-h52Em67*&IyLdA@eYtPFy-ro}SIWh8UVVnx6LRbsv1b5)upD#$l4P1O>#8;Qq zu~%MbjnF%xsVx+ZzpaWchwP7K2aP8B{uo#24K&X18i0CM3?soIL>K%gFaP@pdhp5U zh>sh=H_uh#9Gs{4HSJaRNhOcns3)C{m9ubO`(1X16*sc3&db-08NbLAzrW{%(OA`M zEjpiezE$dfUrmd?mt&Jm&}4de9}!Kr)YfQEDe^tGkL@N+b^U6^%4+k{PSAhPdlCLs zRwl{we2qNv=WlZk%2v*Wc`j=?%AWW=+rHnA zoAo%++m$wMs#_-UJZWR|vLI)jq9PnT1jue;PnW!V^EW%EeVnos8lG!Rfnoj7rO261 z$p^%Z)pJtWLWwKFk7u(J8Z*JP05x%xL=XOelom5$fA6D7yNqqOjOZ$4A;L|Nc*|>3 z7OB*Fr+elkCo{HjdHYmZ6pbODn%V@ek~6gvN|f|@cnPZB)yG7Nyfy_h zVcYu2cXO2xXlh-379M&*-TBI#2*gOIslwElk}WGzH5Adz3t#V09Mk9Dj>*Uk%5IL6 zc=!qp1&r7EM1gPaW?o$q3~erLpY$KU3kR@8tguWuA`I?RO0UY-#|@<%h!?&iC2I0| z&~(;OMp}xxS$anBI}4R46T_y*8mD~4gk8LB*qjgaI|1}7o)_w2^Ij9o@IHE>Mit1mnj zyDG(!HDBcj6JFL-ZLf`O^^C5g6 zO{C`p{*SOtB(6Fy9UYpidj&h^(PT?a<=wTmH4!MlF0a>*`SU!((JU13Mos9vPxx)0 z6_k3yNw&9xq1|EQ36N%bOq&W!rZAH?UfCWuTcG;?p4-;b3iy#!=W z8a1eSeDB%egW8ErL~k3~yCe-pahI9le}~fW#UvK;bHU5VDcnua~Y}p`*l`f9!J?GSRm>NLga8r z^qLm#0s_3O-l$~Q3e1)UIn++fupH#3%PNrT5SuRKhy{qYQl{an%PNi}zJordv0vAx zy!%kz&q&m2Dk8O&UUcAPG=GWC++3=g>+TO)!$czE1t2X3KM#l4lT~5!EN!o0o0w#m zs{L_z6v=2vEIbBDxZm*tFuf##aG~fqZ-9CMX+ySPj#LQDvU6n*E6m!Omv17OfsqVw zlFNquawsmxdjXqQ&-p?lY~d7np~3rMplJ%zK@jG8S5DLBx0PWd$TjqL=H${g@9BN1 zC&A*>3!on(FVGul+aCTUxx&?gZ3AMP)JVQ^+D}yGX44Y4xozla138E(k1w5Ft+Fe` z!58rcWQ!dL$x7koi;bmC1plT(j(>eq-HRl6qfCn<*ogpC@soHCcTAHAiU`9iuwQte zMAN$wjJJCs6dk#|_y02@(>>ImxkjrGDRv2$_OKR<%_d$1Qj>ay&KHw3zWn#x4lpeL{GOb{D6%-8IB+U zoIKm`iBwQWr}109SSwiK2hBI`7qu3qZXzkgIS?+g4sZKfr}`0bB!f(p>ckS?e73`P zaga08J)7L;^5F025pJzKSgh&4tUZ$dlsDNrunWL|N=cQu?5thT@6D6 zq16n|uUN`BBD6wG8zn|1wQCA!I`MAW4cqHztaaB#-=0 zzNj=*bijh%u@G@9;$>*@#d9w;ab4Aorye_lS1&`~OMn~;r8vH%b7uhouz|S*g zoKH3O53|g_u!`hDYBDw1(`~(~J)Mzk8Ntv@RZIQefXQq$3h#4;A5{=b9tygjXwD0E zNjO%FwE0bD?|Dm=cHK%%xhAy}aD?Whf>WIyP3E=tg0QjY zgCv8iL^-7WAnMPU|N0ltk@lAF{eNFNIl=aSuLF9q7hQ&u^o23p%&nUir~=A>{kEA9 z^fXzc82dvo_NPQUB;>U|&##k8L;BvwtfR1xxu}S?l0OO{5H)b;u)N@3 zNJE>&q%z+oPu7os$pgH|`z2YKOE|8aj4fFuBxT`E%4k_?8Gf^Rq-@sUnjZL*aI60k zeaG!@)$*|Uxy>P>xal=!`Y^$__rI&%Cx#@c`O%|c8(9i~H>4p4)?HnZRa%o$u@zOy@twn z8na9_%%&}-IMT?S!UBby8dw2^kTf$nloc$~&vSgfFTD8ScA0lb-*6D$8ILo{>GfAR z$;B!OjkPhkki15s`nws6BBsNnlzc~W&mMy}f+{LgX|}wla>29t{T;U&EI*7^Rz?}Y z32G_7cL|+)t}{PMDU3@CIaCZ-m9DIfE65OnShG68N38|Y1~UJ>_fu`PT?_Y|66$l) zO5W^ZQQxCc=^v8CsZMle829(Cx`7zeSD?fDX*RG$F;7)qhKFoCJM;G9N3%gLI{~=9 zgzDAf=YVx(i)I4}&@+|h*w$8&#>OZ<(XL4LE zIVP76wdV~1)Cr|H`9sI{62eflyJdc53*H0~G@oyKID)Q999;PxOI39V*}~~{skBzT zV~aRHfTHt1Tn;S~mMD^qkn)j#kY64b8z!)s$Zh9|tMLsF_l8dG_##f|zB7eW{s3)5U^(jh@#@y{ztg4D#;+IdJb%o^$sHuCW` z!m&3FjR2)mncy&Bat{wNf^+f6k_~5ACxJBqyasI{gnIShd7>an{hJs>iwCXUhK59- zvEc5d8t)!p)5YkB7AT^8k^690RYpM6b1+u8@s5vvv?V8Kxz~mcLyqoP2o@wsjsAiL zJkzPxl-Jm+$(I@{uR*tT?2QZcI^>>iro=1z3PF#lxq$e{<@m6WXIWgpAqt|JHq`4; zz;^uYJX-jiKd(p!zF+hj75K9%Ycv@vDF^40IVtA}Q+@@4`!i^jH5FvugB;z%eEBA0 zi4IVZ!BW67@hL&|WF=SC_#~X4inX%eL4;*A&9~LlwDwLiG6i?yn z8j$2|qf1kMoCaa5Hb;Wtkt8vrq5q|$j*UbowWH%-sMm=BR~x@yasKd1oIGn_U_Ycg z=m#KK4T%h?hG@$<`~G#H{~&D6JM?zTT0mWmsI%sCsra7>?>%4?a~|V$1xa2cLkLGW zHW+xzfCCVqofHb2mW?z8B5^$@m(}`K77<@$LG-gS|H@^}XVW>!SzLM~&c>^=@DBAz z;{fH8mk?X%*)U*<^li-K=o!E%H8+>6=Z^EMr4qumVOFYBmZMd3CM3A ztt>x!Wx<)U8e{+T;f?GJ;(`U?5aY`!|2;j%QrmWISkB!AHTmyj#_38`y!9C8Kl}8c z^kMD6KN(~gZ)FYQ3!B|+%H|24%9x|~$-0Ms{=FjH`Nd$km|)Ya8iiI)Ne8^7iY%*W z)d4uT{Tv1ksIBO{3cWJ%WK8632obXDKe3^uz0ML=X?aD2p{0JwvL5xbJu#Na++A^Kv3SO=+O6C2C&!A}NRzBbQ){lHH@vXyWeH|N_2cSF6J?dz`FY{5Y{`%AF~K!e6fIZ*3hy(%!|uWm9UD4|dOuMRdB%$@6s6WwV<`7{O0xMqBm!T;`nd(?kE?l*PWk+of3x2beB$(a< z+8fq^=3Dsv3Ks3!C9AKowH&t>aADo2Qn8lk8(f05x_PR9KC;KmV)bmfdoqLrqh(yT zI>7qP3aX7WCqVYXD`VA=XYF&ve8hO=cC*lIXXlgBs`n&F|4Lf5?Uj%J>UhCbG`ktc z_AGRMz)+po(ojKYvCm_8y^O%fO+z_4t@mvTepar~+O%wU4KH=wyMmoHjiO$zGVM)0 z8LeB5@ruECVj9+TWlMb`?!23Wpl{!T8#RnMe@lj(|E(ys@kFUOjbK-45v3BLXPA(-rKtA;;PssWsfij67tbyKVecu&oOlIZ$nN?4;G{Lu``@iLF6!L52H==_U9<|3I7m>c^B!^T1QC z;uKZ?I#n+A9`ox84qCx?MDLfRk>!SBvP(DAJ}g_F~-3 zIecMuW&P7B{;5g%tDRVz9qJ=Wsce>MW@I!Km$oh2X33LAJGBO~t})8FAi39nrF1c) zl*k>OELFD;a$z6KV)7T&h^N)1y6&ZN<~_d}w?C3daJua&OwuKb$8Gy2HG?gCNj@R` zPYW>a{w+sxcFVD;Y(aeVXv~u^6}Kwy2%+tziYPieg+&e~Z@==^*;3t2 zrj`Rl;cA`zYM(Cs-B`af#oys^t$E3&bL}y|@o?+DV58c-C+N!mauA72tjWiI-t>gI zF6eje_SVKI8uyX1a)ahhw9Sfw#LEPZ4;1KDQc8FEdu z@HTlV_=U&&xi%n2_A71#>^?w*xm#r&bDiu>SA60P8s7FkJQup_s`(q8u7mKpRAbV4%+DQsD!GG(v~##QS6oQmiek`JhuhkFo3Ni$CX$uc>ptwx>%bv{)doFLMFsE z-ZFkY1Ev&5onC=L<{oq3RwDsZ_v(f=bq?KBK{2x&CuDu1_Y#i7r!n)p_Vdae#1;8U zJvgIW+sq?raH)6~w_x}1U-vos;;ccq2fj5-a>+$Y^zmAsIn3`l!mFL zEc6QmXJ~!19osNixSClPlsK*0XB&=s+C7jH?isw}ABv3w9mHjfC^R`oT4VFL5`B{h zwo*MH*{@Z1 z3KL0JX7YlAjVgz;ZHT{ES?rhC7g3u;KwV9%nVLYJluc^O{7sM2$~>ka4eUZ|e~*PXv2_KU2gDSb?{NYOH9rp8Wb`i`qKKaKi)bvA zxn=WxL#OqW+KrviRL;dOr25?u0DYkF>@B*%zD+WZ)X$2|V|J|kyD%K-XX5ja86P$* z`a#Up>rbVn_Z|Oofspf5cbJ`N0LM^pg}KQZk%X z?!vG_Sz=6LnnzUoc{+NU@HyY`Z)Yizn#R)y3bfa%H+$RB6nmu-*0G?=0^$$wmFCPf z@v5%bMaHozyoMc~*5gKcASV$yO8%6Jr$rZZIw4)ODa@qkFLXfuVzB(!7n@}}t93G2 zGMDscfxc^Vs_2%NC1!&DknxLG$>q0qeF1}-sj%+dq|W!cU&(}$q$GoX>X@>9C{Rx$ z8uu(kD$}82GuPy4l=5X~tTmfwZ`^(pJns(ht2wm3_kPuX)|*w=5< zd)4KBhfQDXFkKuSL0T2+T(deW<;=hk-fLxvQq3dRRw>AM*P z;0a+Rw?;^@mUm51*wG)|ng(ypx)4n|p%l+=8{aXxyq|VMg=wa9F z$TJB05yUq2$XnUmJY0utITei{(Z{Jy;K-pXO}!Eqw^q57IW+S1;xGeMvj|w3vE%Ze z>k4e>rq{BL&$L!TsuzME0(jcBoto|Tx#((vp zN9zm)zWrv-2&vQjHZI@dx`;X)8Px^RdA?^cIZ-A=V#@T5a6SG8g zn!&_aRsnQQ1H0OzOJ+hZjF*b5`aym13EXCf-ELK3cKXIVbs$Zut-f%ss1rIl= zwqKQ}eD#x^N{{%E?}48Th?@+xGp6M*`SZB^sM37m)6(stV+l<&1v^^-i=p4eaCKED zwzp?Hw=e~b>Q+;15O<&=`xk?kC|GW1_DyvgR;sm8ws8QL_Nrhl11JJ%Tex^m-!D2L@!Ei6M+fs(Dos|pz0ASuT7vbA=_ELF z!OyRUJ9N?>S^hzXm@xCG%Z6^u-vSj4QmNlNV-HJ&!e`c)=q9)E^Bokg@Wu%`SD!U0 zR?8WA?cHLi*DJU^XA;;pmD^?3r3)syn$5rSOW#b1*&wCEwgVZI^9WNT{uRR}mFc82% zsR55Kv#JX8WHc!t|GE@?Z$})^lj3%Qg^vjB8-0gx!qI>Z!BZrw0gGk~N61uEx zh`Xf=X@y9bMMgWZlr!yS0^M*#F8lCTD}6G{4lgZ-x;jnU9R3juv4w{6v#<*@uD z8@U8$=eF_4V-0ILuh~IE6hU5sbEC&Aw{gkof1ojA1;<#c`!s@s_@og8SGw z#Oh{~%NjQ>XJ*fcFyCQ%FxkSPtoEy+NHukCc?4T&`z3|ZJt$SJjFMX_XG;#~c__Us;}>6_k#YQXNy*}5BJ_Wlo>8=ZGyAel4sFY@QLwDe_r@z$tp%BDBKotue- zkqk*2X7%W^+ZL4nB1D_|$N2qAi{zAXYug$on_F3w49~2idibpDRx8}~KW7jfQ7>hx zA_3sidGPi5I4p+p?Y(B&0&H{OKtog%OiSzRYxnUwGt}m_Y9O=?;YHBuGY^l{TeQ1L z0x0YaT?0S-@8uaOCD(j{Cg21OK|>5C1v3d(`2* zKL*`PzoA8Y!!@u|40_TIjIRSe|WavibIM_ z69<){x5%;b3Lt(yRCH}zTsb;O#dZFgr-~FGS5JtfFrJ32g>_eslJ*E=;^0T(y3>|w zO)J2vEsO@T11LE;NkZrkF>G39av+C#jaiL`IP|YCtJ4x9MOxEUg&(|Ls_6stSE5Q@ zp*Hn|8?p)vUU7iOm>^I3uQ@v_v6u)i)c?`yQvvwq&V*~0CIGz$R1Rv8%$NDcrUA&0 z8cZpyKT+AFAgRZPSg3litihE+_A~5L2&CchOd2U9L=d3$Xl(e(9SBQtS7Xmnktd@= zn88x?bc6;FF0h>XMX3-dfNxUJ(x?cb;`U;*02Lh;Gl zIjcxeqC;usXe!QT!iIPp%lOxS0;H=+7vQO#7-|kLk=qHO@~KchHn7C9ki4EVxbc3s z;;r?R_+x9+KASc^I$vxEE%=otQ)hgE>e)g~Dj@fPdO1JLg+clfYz5QG*uW-kwqnEb znM9x*OZVXaREYZ{0fJs)i^~z{^Rey~~i*`{;xEL|wVCQRs7> zTeK4exS4!dnVRh*ATkxC&SwK_jxed7|06^fX?*@=9T#a)N6Rp}HqNtN#g8cf6M=e% zcHcXYGpvCbTzMC0zk(j<2}rbVW|i*xG67FVZy=U6=|j!?^TF9E-y zMhka+FOX!c&|GkE5tEymUMINo@XvzFk^B0FA|@4-IG#tB2m9_avSe-@NOvi-bi)_W zGh_j(Tq^bJkBS-dROmZpnA+;q731A;lhOy;4LL5mKSzQ793iLjHaL&f4ms&CJh=sQ z+Lw2ynwJ3O*5IOe&`DZfk6N{Vs#GaZ!4!MdQ$z;EpXuhSRW4YU1sKE9Y__r$ibuv6 z#pJiZ!{_;YewG)s)rOVp33{|}_5Vw*PQ73B`!|UrkQA7}MU_d4Cp| zkUA4A3c#3w2|>+Mr41Ga;&1m(xRTR|MqJL~X5%ORWR6E>H*1N%y*cfW{7M6Kaw#=1 z%k*AB)7Z$#OO$6KM+Kyw#+QBqtnXQTlC3>)wEUu9QT;(78~A!#=Av4Q(fA3g!U51# zyKwq`p`=>36)oA-(?!hLx#&0tOgAj1zMW*-aeaC~w%|a&(I5P@11I&(^N6+Ns=l~7F{aAb% zL4C+Udh9M6xdtDtmvwe2uohw%hu!G%qva*1m9(wsIAp`A{~j_Ye!jh}7V zqV_R40v>?11y>*jnbiO_*JXfB!vUp-t4v3nywX7>9W+d4g$RdixX4T^z3e{yXcPzA zXtipH5`E(nfUTvACJR{e(jY_%y9Jc7`Hg}nF}Po-kWezQ^&TMc zNw`|Dw31Q$srVI0RcuS~B^_LG0Y;i|DU7}8I0SW3hM~fOYde9#)g1UcKG>Z@krdoa z)GOGdBZq{MRb1&Pw5NnZ*MR=9>${qUChQu2EFm@|9R|m;>c#7qw#sBD5NmY&`12RT zqI-V2^f_SS?D>MR}G=Z!*m4-JtZ+-L1l z<|Br7ea+uB=$=20iE2Bo(OqE1~lQ z2@-1eRX)(iTfmGINsBsX;ttC3x=^|ravv)g4|;mJ{WOAN^0)CDoJqn}AaE<`bmIPb z$JFk6QY8LOrc=kQb=%?U{eB1%PEkUhCu88@X55hR8nKt>TPKd#NQs!}llnwP*am8& z&Qf33;lk+EOAaJk-{)hUnNMh}zTzGi$>Ffcq!*D{C73|IN8gvPp`CbCL!e15{rA^I z*8_f@hWnBByTkcw1YbTwLETM8Fb-4=9yc4r==^2ntr&NPng`5vlcjXxpWF{sWiTWF zj|txL`zQJDhs#dMJkh;+Y`3i$BU7Q9`l~Y;9Jue^Gs*GefnFFypE?GH$MER#xh~Nf z*8PN+ouP)U7BYaxtVD$-UK{#~GK&$|xwF39v{TwJSw(~$_GYyK4sBODV2NLZivMXj zRG1t_wU5SeBrAMUk!K-mRbeR7Rm3KQw)l%k`vNt;44bRxJYWQ%*U#MwR9bOwveO;(_m1i+>{sheu0KUNT9)S6{c@|vsE*!O zEd$VPly_%EtbY6D-z^HO-+%u0KHf|frw16Np3gRSK%ahJ@ggdzgrBIae2s;;yn;#& zjGqAqZj5||uq02)EG_s*!n4InnQUoXTNFs+2mz^H&^MJ_C06po(pWyu^kNEy=J`%D z>xQghZA>}3vFdnTT@gHxNe$KA7FERv<%L*t`zu(j&pEcoFV!xM5*(8U?^P?3yFml0 z3R-Z~QCD8u^Q~!zWN5&OdUY`%+fU)?*e^*E33mV9mNssMV(sGcxzlSy&ST)Xc}i2E zQ*&jjtT3VW)b|$WTM2=hD7WE2R;B>c{ze()*N#3nFdDplcsiW zw7PZ`Hs-SBi9jan3pO7U0IBEiZGzRR!O*8bG1*=qC9fx?-->IB+j;Zj2SRNRT!Jf~ zLUKi%%tRdQB!O+5n8;%!M2O$oSPk(>`cw{@{g?`}a|f#V79{|a@F0e^7U?TReSPGx zFE?9OjDu5Xf;??6Nrb$tBq2zB2R0;5uCqiU36Gx7;?8{~%Qxm{{xZPL84D z0!ZR?#ua+ZspJns()hD33D_m%h_7&DJ4?a`Dxx? z9KWfJD3;WZIGxW@XwT2rov3z6<)W9zd8gi;Uv8~4%p-}&$gs?GsSml!YVzOwjDgi~ zCqnqb`-x~7TMl1|#*i;K%s$X;*ZllJdWDSlDV7`tD+^OXj^}2+C8HnC|A93)h;=zS zF1TiTGbiz8yyK7VT6w3=jjpGsx93e&;fRX2=S)@e$+&yojqloxs42Z2a5*u9jgy4V z193H#IABslJ*Qx&0-(<|TDXih9<6$3b*2K6A&8=KXx;t&D`dkw>E*Tyx zgM!_%r|`U{8tO93b*8aGZ)b@mj^+cN?X}_aano!T!uujUlQemN{qs3Mk`z=!`fbf! zaeHxalZ(irH}Es=ky>#`mY-<|mTY&+9jie*$QzV{((_54GXu1Qe-#hkx5(pv0cFoh zBbxZzXZnC*?EdF_%tH7XtjqS&S^|vH^9#z9jT=n}Z&lVWi`naUKKXmJx1Y-y(48P` z4n=+Wh9sVf#1BvW<|gPS7$pQXY6TH1)b+(-_wi2~z4k+8^Tj3cbJufkt=xF_H5txt z{huN||HzY%{zO24R!X6E)f<`ey;Wp*<()q}lv7~H)U|7ub5*yLaMYnKFGJ#q-|tYC zcUa!}dgh>E-eGdrEe5|;efqYK8~k{f9)`}h-Xmo7E2guW28-|WP_nz(kNy{ubxx0W z`tnF4J$XTY{amqsAYGUP66TYpB9pZi=X4xH7h~Dd^&oRp8Bjz-?iQWk8g0f)giQ6d za~4++0=8_GOSHqYpVZCC$S3)wqA84eZUjj>3Y4Vc2%ReJv^mc?H{$(iMAB2vO;PZM zFjCb!g<4;M9!LFh!F{wiq8DT)OhS6t&%&W4IK=j9LcBk;_4*k;l{Y=}H2$6;mV3fia zgc=MB1ApmcG86u8;NRkDi@(CAs-u#4Zr=LkapG`8yyqmLrC+sr ze1HB&^=a3nv3I5PJMoV`EtzQy5&Jj3YG@3Fm)Lwg1tp9x^O~(cKAG2k5FUMg1%5e= z=N45jxyqi;16HQ&HydeVsCR`ls;R%$k!u=HA5qc3AnjFWeMJeyFJ5qwq=Pk6R0!G< zIkR<#k_I$>C?8e-u5@{Dk`VABA*Z81X41iAEF`ax2VC-5*WQ|L?~{De#d)b}itSz# z^r|-OrN<3i_rPt+UIFvmq)0%pu{ZFPJ>M{d3}j3eNqMiy^&YGe`6(Z@x0VGWyQStq}Ay?HGJFJ zGz_6vlAu6S#w2?IxOzNOI_on;kFHQG814?pcmlM&U4&hxj1UG}HX_I&Ki_(JZ@FJK z*qi9)@=?Afi5!wXxew9@+T+*|0|Ra&ZD{E*Ie$FHwRIe+I;)3Pq)EKnA|FP=0#EO%Qpy!+OV2&MGj-IwB&BGHfY&TG-FA^z(> zxz%czgIy`G-)ZsdMH3PjG=Rz2SR&H3MEt{Ntt3Vm!x9~8E)dk9T>#p$TIAEkS8eX$MFy3&{q%Z`o(+Mw=I@W)Bt;dp z)>#i~Q$rl)EPHjk}P-)G_KJG%i!Pm=wQDBAM9 zMXk!Pg~5-&6tn;;oNO2-cLr4|?;yg9$wwR9N$wiHZzBN124#OMZ!-izfVBGsvhlKI zd}0%5IJkZo4WRqsF^>S^=U$n~ve_Rc7fw+2hrKJTxS=F=e)!n9)xaiC$Ahra!|$rd z0W5?zKy_f<+a#d;dEf^-!Ki~!K6i-Z7E=YN?NUPy0ea&I9oL@!osk*)6>F&iOp{HB zrPS2Mm|oaj$ceC@0gLI+!yQwE_kPX;x>@eeqU{sPyyge?19R8Cl0x*qvFuj<|isE!Y;u8{KE~R|FZtmP6 zF+C)rK4_!CUqv7oFMpjNj~0WM)~<{pNr(UlFf~n-rjMI^yz?<3?QIJ-u4{+7^E!;T}#+ z>^XFT?j4TK?WC$M&B(z=SCZv%CW+_4j}q9RA#LZRlE!N&ER71`HLum&qD7ptac^b_i|wJzo>%$qCT%ah&24BYd$J^Y2sQ9$*ZPh z-IszA)-Vcv#(ZoJz6pD(zj4s5ZAl!4>`#6s_ZH8@f*J6D5m3JAi>TV@*I@gnl{fgi zerZaHtCd9RAAP#K!NG7uMM7y2M<67%tog0qdtMcR`S|o?;Yi%iFC>g2x!noO-C2*A z>V?S_=>V*g-pBXpCu=Zr50BXD3-0-z=y-v7R?n%n^0Pwl$;276rdUVN=twl7~=w1)2_}w_xO;eRWy4FsYGHZonqS-GN>w?Nhw# zS&aIs)1`jxo=`r#79)lX)R|O1BxGX$u5lrsV3*qY3yFhQViIs`dKPr=+Mv-LEd}yfHx3*EtMEwYK8vHd>0yI>tz^T z_e#HN>Nk&kQj2O`Xr*XVEjFU}jXrc==?+?BRV zV(wLh{59VlovV_!uki$TDBmFT4Ka0n7JqIXZ?esY=@Y)cnfc~d+=89pIIHA(E>oQ{ zGLty78H4q1)pg-p+&RI3!_yPhQzEIUo&UMNgQ80U&ik9LN1L8K(&XUVbE816@N>VN z8NGW8LV^2XG1ChJr4e2;F<-3u$69#nVSV1YV~Gig`>(gAeraX2IqA?y1aPJ(7>$kJ z&$?Kdx0p7Eo0lxhrgzRwj*Il*CME+Iko{6jG`^3LGNthKgRgtfN53MzBb_AY1V3qR z(6-)mI!9xKcOlWa9b6x8!fpbO?LUNk_=qUeEg2S(Ypy(r3R!PEV!gfVxVgK-3K)A$ zp+cAr+;oL^k}TM@!{M=et<}HneU41ypDm6@G^w?6pa_Gglt+ON)DV`D|I>8 zkRMhbW#1bOGYAJ;e_Thsjf%j`5#W~JQ-R(-i`&?}Z!uc8>%RGBB%x$fi=-Vd`U1rF zGBAVW>hV60$Rc4u0rhczi=^ZChqjwvH_`p+17Qbgmc%$G%73EW=guNS~F`yX7 zja2;xDKwgF`~_egiYCx5uS8)a!MfmFzSpU(h_#UAlGH2_W6Q_OrFI6wrC=sBu5N}C zUy{hC3nvvc>z)uBu26aA1Nz|`yCDb5eh3iTthcS@e$#5kzsnOdF8Wh$TJjR-!!L;B zSwO#47qN?Ji0wLa1y@+9T{$+TDXymB!+pYXKwMgC91?irRKRgnCHQXRFi;SNDY|a5 zvG+kE%X|q)i(3R$1Oc85i{bN;>PfrvC4b4`lQZkQ^c?NJ$L_d?ZJWkd~H? zFDEaN`6Wh~qWJicd zQhXTh4|$lIoDN6119?Z`2diZ-4$wT6X{m17fkxqZTC)<83qYuDdQtCHoZtj4wh`3R z6wGFQ=2Pzg)xF_W|6Ax>I-Sj|vh7D6A>4|6OCv>M#vQVux;e0V1IR3%A*S(yNfkbWtjMa%%O#$=86`nb~>cj?de50L7pdZ5wk+BueA6Qd>vZ)qJ9TV2v0Aa zM1EQBD+iOsrk**#-fv~$1^=G^4x-7V;qghz4H&&o#>gCMlo^MWyH%%4x zv*|_C-8q^jidJ*W?uh*{CzFt-?VOW~nj10}2En(-$dNXoy$YKzW-iT_{~-Ao0^=B@ z@E8s*?A5(@P&1A1Q@&scwr^0*7ml*I@a|_dMG8OOY*v;f$MYzjrt2Rb$T%OXjP4DG z0zkIEr+_wj{*u1ss{?y31EFKJ)S~e^9iM$)oIdo8?zKOqcUVsdTGCIsTD}PF61Sz! z*X6;z2e&tofkX1ai}4G*0`C<)WIK?i4{qGK`Y2wg48j>#R=b#(igm9rKCK9|8%Uly zoy}s_545~<$8+);7%}DM=m;G|VliiW@Q_$p8k?mN@)*aL;siDA z7$x@Cev2G)+za>geFU)!Tg$VE1r{7V5?~i;$~hyLjz|f!sev zpmtYo9fO=XUt9?XbO7l;h@xl4?yu`c3&{237fd?ef2UyoHp9SDdO^wyMTG7BQj<846GAD*_1*S zBVGU!{IPcIm#$p<+UIKiD69RTTh}*P{F6-l?BvTPa-Yk=Z=q)Vl7&S!eRPt9WN{44f}S!$U|4kJ>=LA%^k|Aw{9uufqH4 z+W3b$G07?lwJ@I0$Evx3zdr;-u=E+X+q%or&{Hr(Pgf6xhXy2~H}yB$-8|TDbWgPh z=!@f?mOhuddXFLCUsjd6%2LJ=!p)A&z=!^KmEP5rY9H2TE!J^bwS@&$6Y9emkPY+v zgkkiqxtSChRi(UJs;a+BMBfsR{o5G!bYSO|!_(KwPl6!OcKQwb<+2@9}~R)v-%9AKcRoz|t40q*Dk1D*5c~ zXWyjd2v4Q+v?@uW(QiHJ)EyHnvQnOr$}8#)9pse)Z&2DRe^Ar1i2IO~)4x>rEbj+b zz_YbqB|h(3x~&`-|6z)o_!`e373jZ5A6HFoKG1Uc9JTbHZ~C;Ao{*tA_;4oX-m2VR zuiyM$4Fim)BWEI?SN8Ak=Y(Buj`)xI|7@1KiRXxRT>2|}o`_x*fCzk-lH~eMM(X2N zwOH~zxdxxf@E(7Sj=@<8TU)hx$U`3)-QfxL}PYkfT|fv^k(vt=aQ2EWZ+Qv^F)=dmfrmobQu z^iq(|LWY>Lrm^y^Mt!3-ej@Dq*914g&2&(Pf9KqOm0d<_G7cs{5`0k-h>W_2RJ!#8 zIHpkEe&l~}z6=ARc)ALmB({joOMeKpohhQ$N?H`O#E7E3brZ zMxT0b#YXhQn-++Lj< zDU6^8QHL3X0qKEdxyUo;8P1$spUIkp7MxT=_#pE1-23~vl{8n;rn;1H^?6c+M;#v! z+6HOY{aeo=ar&(L-1k`p^Y(eziNv_+?OTj`Y}x)J)9!y?|0!@wnK)8OvgGl+CqvC)DU3Gs~kzUIft$t zaVTRuqv4dpeU=3WNSlj8#oOa9MhridIbX@iDDJqx`K&WoL#FNi!6;IayTa*C)FCH1 zE;gxo1BN3=z@7W^@2ia_s>;8y4;|-~nQ08@5aSI;TL>sOlp)_4Jf`3zSw5LSeJox^ z;MgPl$liTKvc(_RTP^J5iogiGor5$QoBlwy*d{>V1>JusaE-$l72@j$oT^&UsZf!q za&d4k1bp8S$_Tv(w^$#67FOyPH(O`KzZCc!uok`Pe{vOT4FiDmC*$n3#ek$#9CR_d z&H;M!Wah@BQat7y_z1(e~(5&lVpj%K?kQKE8 zPjUBCAW5BT=5b_!^dlPgmA?~wYBE-SVTl#>IDjNpPp^>V%up{%~(+O9}M_7`a?9;kghxtE;>+Ku?1!wujKzL{j!Vd$G@mL z>u&Qd7bxHOZ|K9CJukifxw-s{d&HAb@`XB*Z-n932?N*uNiE{1CqZUz5p9oPW6xjy|PxhQp zGJ#`!boG|!vKWbDF*PQgfBA<2_ZEhf!g1k?l=nK_5I)60KMrDKn*8<-p(kjAN(uHaKI)*oK5JFkBEjL%UZHJY^ zfLKQ&8YKP2q2v*#Mt5l-%y~ee;Q1%QzoFjQif)1~7Px1T?34I7%+E02n~u7WDN~ED z5^pVmNm4~XLqC30D|??+SYZNLQtBY}87u5(v#gQZAiSg%W9wIERF^lN?6&-D?5JM0 zWpSM%) z=&}_cV|4MY$cPNBsYJ4lKBcF$yo;>vi2Mi}*ng{m>q$-beY*8d(gKO0ghhpw5Memj z%7s#fM&)_+EC;eMB9p$>*QF8ux>MgLJEm=GPEvyn=2yciV)D6MPo9&_TtvNyDTciV_R#{fMKX~H`W#vwXaBre?ex)*`<+3^c{B6{`4s-V=sep9GNE2KI{id4g zp_jk)rIirNRWaqCdi#!ulb8ApS_5tQbKW&94V4@;dFEYNWi5@h7Jev2 z{|EqI1-(fre$Ftw(ul~|0^L7ZTgar-Skru-`RvCrMDaRN5RFE9-@DZ)^v8}D5*SNu z82(e(F_%5t^k7+?z-0`)gfS@GKlYa~DE26bRz7)Ir29=jFwVafJqLlpq9URwz`#lw zz`gaMSIgvoGaaI4ga8ctZ`S|z&;_(YhnSZ7Cjd}}sq?SliQWs@ZZ3a+{{V;WvjWug zX#I2^$A^jtvXaThYn~~DBwr6c*fepx8yYgt10#2!26cWCkI)!`y+m{yhKUPm0?MX) zguZcm8%?;dA8j|Z!hgWPVHRDoYr2Gd-VX2MfAMiuo3r(Tmh=%qA z3eL_$z@WIPdalOlK!8GD!!^O3-?M)WnnE-lvbwXcK-(4U-Ze%f)We#q#aiao~+7Dq>>cid} z?vn(7IKWS8{KK?+5_D1sH9qfxA2WwA@Qz2P%szjr%vH?$tKmlYh3$!$kr%U4tGvy5 zcn5s^i9YqQnqCF3(PwFj90KE2Rwsnb3*cEw*_ENwqzg~rG?<_1mR&r}h>o{W3ki(M z0(qASz)WJl)Y?_pqjS1a7!Yo$2()wsaCloGVb)X)}Z#29Ft>)D9r-|4Vv zXzf3wj~=z<0N&Dj4ELnui`dJ~qCHc*Rk)Y`ej`GNOqL=_xF9Ej##{T4I39wOrOYQ# z*Mb*SC^91QUKP&(L@4%_fA3r54=6Ei>SIP@ zN&QV01uW$C*ENJ*fp4*jQTT&44fezN{t}88(hvQD9@~ooX1?5*YMXDlkUOGC-(oNb z=2qMRdh%-U9P?vLT=)ffy_3fuAJ)6bay)8ixMPC7O-N>m(9NstN1gsk)Fu59gB%po z^|hq*Jyt!KvkC)?8)1-pOvU}@1CXm&VtrTNA&`1@%mtC9FiPfLgzatp? zhEea((|d$jf!j6k7bUKfd=jostL!?dlQ6p+_Cc-15?>h^xm@XFovXL>O;pxA0k;Ay z%Z~15rW#Qi7q2(hi-$Wo`pq=VWuOA4BSbY`^2(Q(cvA;*a#5m()_NlW;D>M1r@5W{ z+)8$q+&QH^OGRB|mliLHK=V|BYumOuW3W(4@-*kDbCVonh(K8OV6N)H%i*R zMm;80yd|?|m$kt7$BQAx%NKlWVBi^z@66B~IknZFrq?Uu$XJ@D-pFT#e3pQbpt9gJ z!PQ48U-sNkcfoJ(4mU7HTm8a!B^0_?uy|45D>>EhzP;~X5YJ#prlsaxOnt_Jc^$Yf zNkgW;q}5A3*PzuOT;gmZ8nVr%@VDdZcIvEABePBi7}jg!DkC{TZmP$UKoM?iK2K?^ zu=Qc=8gs#Nl+`zdXtswCBW{S#c)Tj1>89aL@=*snW(-i|Sq>=KAcN*N+=QEUWw@IxpcBos)PB|Ilslb>`2S{GA@T$telXr=4nRHciG*#KX z7^iDBBz|@(bA5qw6dM;~DD#?n5U()vR04hdXb7PZdjoOJ>GEs}oRq2PaQi%xeX!ai zzRQ>|PeXsxDdhEb{}1~(q!#KAr zO4wnhK>CA#6w9cW3J8L_LZz(}pdfn2Wes$W- ziA!96DR`k_j>n6SWoVr8@_{v6#!w9qO1uYbpzrp3C&D2nNi7XLx%V4DEteY1X2|Ff zAG*neb1caen`hN2hK)K)@}~RoRSBZx%l| zFefG?Bk0^F^7)71D5(k`@Mf&eB1?5q@*5#MS?7;54>M}HGe#>pI-eITFX`#|-z`yj64VO&6L5)*(K6Xum@6jgL&- zMewCPitH{dhIz4Pff`jRh{iRMw|{NA4j&y6^4WCtH^<^yFd@5^8CYyzixHRWMmUl=SVwIAa!0;`4R!04#9Ku zSEs*2t3^X|=Z8|Vzd&$ItS_Ag#~jDslspmSOYJcR0DwI@8mgump0XybjxGGi5%A4k zDW6aO1rDHUJ-Y<*o>mpg2!QWWCznWCr(?#QR-fN3fd5C^>xM=(+`Ugg(Tm}c&f=f^ z*RFkTY3aLQ`})WW|7VH-rKS__op=-(cbw<%hv1X-f7st01I#bwc1HRc6d#-jdeh0p z#l10j{Yz+)RiC`y4#M>n@_urQRIHM4$;u_zr)lYKV+0Qoa^F+^J%F-&$#J5CW9miq zM3nnLt+Ll0;rJO>gfoA5A5vVa`)cySBBy~}(-3|tX>d!g>``QzfecsQF^3>-dD^Jm97wIyb?PT$}}>Mq7A*tShHN@_;>P0EhJV`f{JjDZl>^ z-PfCmN;pD(s6BAZm_DJd0M5UYKrCB`gZsjqquDD}Lk~&R;n)<;j?|#ps@iZh;KY8s z_g}k@M+Bc%QV+g))-ZlQ19x;)jCms~$s|pqrHOSZoW&|JOvx9U>cz&h?*iNv9D zTn(GudrK(JV|X?kve*=31uiOPIb;#tLVE@`vPYdpV)bN^!v$3FvUte6=@rU5&@XwS7z#eiFOjnw+CsuvNmI`< zepIrOf5eDny4Ty3)MsK+1Kd|0v(9?o#1SAkLLbb^Qx=^;;vDcUorS#o>vX*Cc=ZR^ zA>?UfZ7ecsT_KI=A*<)!-nc|s-*o(0^FdpGIRt$ue!|5#`jdX2i433HC=fpEQ; zK=IQE8%`QlV~s^CsUMX{2f_H{hN3*RP3ROKdW}oJGbk&X8-Z|9p2WQbOmgU!qd2Qo zZOfl*W1_7;>pVCDn{6>GMSZc9mW4b2XQdN3EsSGA#uHm~X|3J2i(Hl~Pf|J+0z1uXU1g?8kh)2& zm3Qmjb0TvVdXeLb+3aWv!gaHmo5GV+72`gURaQxPvs0)+Fu^lL&3#DwTSn@^=s*0T zhikl0ZelBkW*-_3B@=3kJ7pARw3k{1#^7#K_gHV2zAY3FJV<7mv?>D{ehlu{!dmKe zF=Z#6d6=2PHPysEY6}eAHLjC0o=h#h_BDLi(M48jyR3*kRm5XZf)`1~)*usdr?O3; zTC-Tl&+A;XDqK$NUuleAYjO+P%5u4=m-2oV{8LetAbUTG;?$l?pmPAqaey-A3NYRb zthan6Bko_6O)Dg|_+ISHQdx$}eEF+_a5~e_{0^VQ28Q%QchqhQTcI`fAI|G_`eE?p zJ+Q5Pyb#OauF+OlCBv1q!@-SX;%AX!v?;ayG$F;6_VUcHaCV@oK%SHvleVlG!zo80 z;4@nd+o55$uOym{^{K`t(vA3tkNNeuHqu|0j^Us7yyG&NqS%HoPD31g + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/mec-lite-backend-go-pro.png b/assets/img/mec-lite-backend-go-pro.png new file mode 100755 index 0000000000000000000000000000000000000000..db13c1fd1654e47ed63ca33eb073e9ca9f658eef GIT binary patch literal 57249 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 literal 0 HcmV?d00001 diff --git a/assets/img/mec-logo-icon.png b/assets/img/mec-logo-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..b0a462db778eae25ad1d86b852eb4f381553212c GIT binary patch literal 46996 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%0D})dght-7! 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 a_r{}nn44&bj|K|?f4W)*w<|QBy#7Bq{Y`!V literal 0 HcmV?d00001 diff --git a/assets/img/mec-logo-icon.svg b/assets/img/mec-logo-icon.svg new file mode 100755 index 0000000..14914a2 --- /dev/null +++ b/assets/img/mec-logo-icon.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/mec-logo-w.png b/assets/img/mec-logo-w.png new file mode 100755 index 0000000000000000000000000000000000000000..b8667f55dc7b4e7f178e829c073b8da56fb4b15a GIT binary patch literal 29718 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

    h=wIS~x*(c*NzY7U5^3+(KzT*l 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 CZTn3C literal 0 HcmV?d00001 diff --git a/assets/img/mec-weather-icon-02.png b/assets/img/mec-weather-icon-02.png new file mode 100755 index 0000000000000000000000000000000000000000..d086e0390dcef105572f9870e88feee12e82cf56 GIT binary patch literal 2459 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 literal 0 HcmV?d00001 diff --git a/assets/img/mec-weather-icon-04.png b/assets/img/mec-weather-icon-04.png new file mode 100755 index 0000000000000000000000000000000000000000..952fa705d02465aecc9fd979288a4c41babc0302 GIT binary patch literal 2189 zcmbVOc~nz(77kKdk5*6X)D}G*niHVPNXSk|1Q7|03&v_#IP-_6f6P1Yz2EZg_uc!u_q*r3 zQ;`vW+`MteMi>mXIrIP}3K}CF&jx4cUDvg)2pYBvgJXqXaubCjDj$FaGPpDV9?GUB z0Z{;zk@{^1;0J>_A7e(x3S+~+Ak(>QZ>qz_Tg>J`Xc){dK+L1kQve~H1|%^#{)mP8 z#|Su+;g5(RgrmcGK|nI|KpG$TGA$ySo|Zx?<@j9s3@JM(Nmk+=R-abe=+J^`ylDshlA`wsYf@9Gb0t$^o;m}Ad zj*Lf>@mTokg@C;A8Hwa5O311&XyuPc77BS}6iOr#d5dt~Tz(P?Ln4t-Xe1U|AfWS^JRy_IfjbzfH11KMKLU#M^%2;-@bEXp9KmX$pp>D+R2~ZB zjYhHAj&rS83xrX?f5UjIwIDi`2cV(=0rx1M4%H*kZ4C_N?zbH|454Vq2l-5>C{z}O zOFzm6IKohhKLYyV&0sRfG=NSb0dxkE>Psacu|9YoBn?gVMbc?FG=TTT`4XsvHJ-QO zeJR0cTregu5Q7PZZXyXELJ0}MVKI0#At;1|U&DrS1VSo@4y^fRLcUkAq~FAngZKbd z$mK_KxvVu6L?&~ETtPCI2M-EbsXBaD43op)iUgjHGQB=E1>iG}0gMnnmknRZGnx68 z81Q&Boj@bdktB2?fFx4!XrwO|mxv_N0UsQVM5HrlG{h>N@&D!z1qFq2h~$hi zqxZ_u`{iry_F8UsSqw&#`)U30>e*$B{n@Y#m1{7V?W9YF(zdDMP77$alP_t=7qzoG zaPXyqly6A7qc)l>lhf+OWw3ovexq60HXwg7Idi<;6j-2X>YKEI_P*!x0;y_f#%2S- zBPD8!&HjC(Y2=l%v1gKBZR!}3cMQsJw<-PeHN`E;x>4)CLW9N#HjP_{CzPlh-IN9- zUeI=q$ZkBdH1*3LJW~W+H57K39}Zh*)EZ&=+|xaZIL4ubP!9=N6Vhjc)mceEQJ~>(5<^$r<&?tS#eb)9{SVGh6@F zjm4G;Yp>E4cYAq3qu+f_KfkC=t2F_oYSKmRu^N-4W=5q2M`fz~$Eq0}c(~Nax;HQF zojiPVA+y0W@IryVV905ht{Sqo49HK`&g{`azWJoR@GpY?>Ub9(i z0+kxDyx&swRMG!@(lcAYwZxmD%lfx6}H)hszouQN@N*0;9#FbHj?5j}Ey=Ur|MIJ{vsT-EZBB zW_{Q~sjR5jQ?VxxU9oN3ruqu!di^61a7A}E;+8wFT@h_5np(~%s;U>r8;Y&}BDFaE zzS{|zB`KD*=AKX%xz?s^axu;zzWa6YWwXSSyJ0{N`}m$atFDiikQcW8Jm`j*Xv0zZ z{NERUJ)4*NQ)|rCr0b*GnNBQE4_S$O;XA);kYG>6*O3yXhko3D@?PcmS;-mf%}?tp zWxY9L-PfZD;K<(XwY?sS=Q*2Reb;ombtbFrW;{q)UvNKhe5*u%1zYa54WE7TqUUqHE-wKm)!RBCw!JI>aG|XF)x1W zW&E?&ek-d^leLqHKGayzCl!Vk>1yJ?PyN7e z++5q>z5_@8^o`Rq`_~Wu%Jqw#-;)ulu*PLGf5$vPcnQvC9+hn z*!PB~unDYPJKo18psL@iXYvNp{lr(^4VduXRr2pXpG?;s>B-Io5t17|nd|YYN~gb5 zmx+E6k})>y$DRp7gXje5(;bTw&hMU8pU~HshvolVH{G&uX!G8%+^*CIiRaB(8nv;y zc>7fIONH`jTHatz^Tax^p#j;tRaE%SI!ovcmd;G(LL?TTO`a%>zjN#5_iVN|sY?@p^40B*{6ub_KffJ=#kR((ss)sh z>KY1JsSr>i*`YwFCIH;3{32Nku1gM+$dk9pc?!yk(-ed;g!=?jFIuoEW zn0yw%XEDfcFA5P&tBB!8h*rIgMXUsrtuU#6JSESzYgRyB-rrRXq7}#q;Voh z9QQN(EmA%6U9cuAoY}QZ|+0%krhl04bL$moWj5#bt8YQuc(O_u+YL z2Ad=F1%y66V&diqxjd0r$Y28gVt=mh0E1*Q(5@(v;oLU5Gl?k9?l@?NwU+c_QzJ~*g z1<2Vlww%fXVn8ZK$^xid1~Z1rk%PWW8IL1Z$Yhkac*Xy#ADtjYcNWY46wkyKQIXE+ zyH+3;@0tlz6CI=_TIFW{%TGw8$s5B%Bx2)P4T?Lw(qE2R@XyjscFaLNX!6PEH`^V> zP4-jw?OLPNT*LI*Z{lSmh|S@Bz=S&-yu-+{gHJY}vUu(tU$pnt$~@%7IL%Caa^O9erLEfcKr#U9c|MZwkmq zURm)!s{GSxZMipXW%uoee%jyk9K#3e^p~uC)&9>%@w^7x#@xDL1m96<{XD}YKW%Bd zxb}`Qnt!mzRtq##e7QdRH*1ZL12svq8;bARcU4(?D+7y8{mX%lZ!EDaN;j21us<5a znl42C+=l)!hV!$LbFFrtOoV+1dGIHO)&VtLC|XN%I2;T2nl9~MD<;ZJ7bFr&^qqqp zVB}ok$L>9zqLi6+C&RC-{H|(lYf1Ho@v}>+??rG1hKGm43vM@k-f*m?qT)zUg1MV6 zSUl41+4OMGGcjg!F!O8gwJ#lRv#X!9O6ofI*{Tm@&rEsPzT+kRg>BISVPEQ|9_^Bm zkKFwZyDZ>sikm;LdA{qCu{^hmOWy$B?b01L%=9c}e-P%be7t8RbSup4AFHbhn4vbk za2Hs2&T{#*;f%#astu-JF5>jBJ{eZ7n%jKj?@yP1^}{sUgCREtV_4?eoaIsM~O9ESM3pSGaq0UWdm}oe$gclr{g#Id{(Q0!>LB)AjiJ>AMz? zZntikHYuvu{fujm=fKj&$lXh)*1~MdCnH@wd#+FQ<7T>~%g=Y~m#w&#u;A*A%Dgn} zqsqJ61AI$gd7aA_!0lOU28WrHq%tgZXXOU|EQnFRYxc*D=dv=|zW+VzdU$~a3ycPe zHm7Yq))kZ-#mA$^3-I#jNr6)UD$Jy>7LV2=#gji>+GD&%%SoTyDBE#XUYB*n{CJOR3r*MkL&#v{{KllI z+nUYgg!+N>)dN5RINPD1uG35N42oi^h&iZdj{SW-NAzJ_d literal 0 HcmV?d00001 diff --git a/assets/img/mec-weather-icon-06.png b/assets/img/mec-weather-icon-06.png new file mode 100755 index 0000000000000000000000000000000000000000..169897e24711bf666e71ab1f5e6deaea7e6c07ab GIT binary patch literal 2333 zcmbVOX;>3?9u6pr)uPq5t|!JI3e}JyA%vuW2O)whhzJX=Rmm}6#2h380X(DiK%|0* zia_x|LB$&pL@*%U2M8)r3j{&&KtX9Hnaq(6DDHmn>4%+XX8zav{_fvAlM)g<*J0?m zp%e`(#vPPzcpep#rIFH&414@Z?ZATsL<%hvUJSL1hB&YzDw$umC!f#q$7o9!%=z zi$-cwNuqh7e8Fd3~7`I!O)*6X|lb z(|`m%s1~cFN=T}ZQ~M+eMT&UHhelfZ$px7*DCmn|x%zXU$dEA-g-V9I8^Dms`uyrg ztD#Wvzh-xY|D3;KLUP3mV>FMD~7Xd;qx>&>lKo2jL7hA|4kn=S@SHR-40RWio z?(R?CoH=~9yC0Xu0sOiCEWnF1zzvkEA)#Ch4(OJWy8E~u0)gOfxja7=D1;QMFoj~( zKox|nP(TXx3WbvD=hvTgs!N1aE>URIu6=3xnf17myip3 zZ0Zi93AO%Oi5$L<-f733Q;inPdZGcn+KSz7$7@8M#^T?(3G{@1TvZ@Q-HVUI%{eG4}RPLf3-Ty}<8w;2xQ9&TUJVkw~qvJm|z9 zy~dB$qx)}JX6=XP}$$~dmA<1P(-W~K+ zFR|x_MSB@}`H@hbH_yz5mmV|E%QvOhT9V3;b(avo9Qe(j#O(d>kvcU0E}Bq^9J+^Y zy<*9}W!YYBx%>=UQe>`f!Mb7Mosme%-RJnJY=f;0~4Mw|EJLW zYZY?w3D%1c-g{v|u1QjC?)*q>(^+mk$JG}Q=mN5)9C_A-W4N{A8FuzDYDBE!V)OHE zBCW=<^QtBBBC_k6<;4dg^ss4hq3Pf~l(z?#pEIwoK#Crq%Z{1jOOZ{L$g~~CkVB?| z`{;pt=rsdowOXCF8`G**Tp_>F;{*A#!xEo%?K3TU2K;bibKWf5$=Wlfmfg%@cJr3} zdn_H??a;isySbs#)UtZPhe`0*?Aq%I>CVf$%i7V#rrV93x#wF}@2W4jHm6rtKI~hV zaGaT%|FFcf(&Yk0zw4dOH#~lCoNe=_#gRvHQnI~u&)!8I&b3J}yk|wubskx)+w+g& z6Cqj$mo1_}o6p-s2>p_RY@7s+$*0Sw<@Ba$mkeHcU`)6)^QgpU>9#?y9OykC=gmLD zn`g+g+ZUQQu}~0WPaJv~sB-Sgw{s~KtH+f#*$?)uIU3FyHKgnh@9%#8K219w$ZYsl z+p6Di^`8zKEH8?$cN$>UxV+U!q-+t`ODC3R+8TC=vJc6n73YL|_Ax770U)+zSizn@jm7A=k0hvcr~v<)xGOASbE4X&IrQL`G=97K9Q zT5Xe=zeJoIoIDhd;V#%BPCkg2RIJHq-Cb6!S{XGXcZ@7!UH-HiTf~?uxuqV8DWojh zm{vhgF~_$XH0kw{_2IK+hUqR^yDXiV*1B|uwpBpO4_rK+zh;cNi^_}YVMbv+tCP0w zEGTW9TeEP2*^6&lxG{FJ`BK-CYDMn3?6px>1EA>A*1DlPmJP1HAz5xuI3ANFoOyJ! zJ9T99xwx2FJ>NXv{7cWjzG**ElCmeM;g)#FgOgWXuTMuNkHBJUyrwj}7o@kf8x#fg z^i^%PgEcot7!9dIx{ILUBVWXMq16%{xv-T36kNj|NDPT!t<${>oK XlD1&RPcNSK{jdc32lG$OiQ4!V>TqA0 literal 0 HcmV?d00001 diff --git a/assets/img/mec-weather-icon-07.png b/assets/img/mec-weather-icon-07.png new file mode 100755 index 0000000000000000000000000000000000000000..6e94f2948e20350866836f8a57e74a4e081b211d GIT binary patch literal 1882 zcmbVNdr%a09ACY(L`laKUyZJ(HB#;EJy~w!(&G+<6eC2@NMdhqPj29DuiI5l6a;j} z5+Q*y!beCFVQNt#8fug;bP63bJW=s6nlBJVZ|}9c*B*lPhvOgpW_N$D@8|P<&wiRX zZ+2+N#1H@gLgVA~Ny3~Md|wg?-vg%ye=STC=$J+He9}Z`V|D`28c72I##^wZL=u4+ zSA2Yuhyno7a&z(`dQrk$6elebEGQ#!SZo3s0HS6(Y#5$N(4c`>YPM>`Jx#xgL9|&VE+&c z+U!OXnxv2I*Cp&U;tZO$p)j1Coh`{$NJ#rqSf*C1VW}LJ%OODmqE=XG%mG=cX#)&; zg2L@)8*L`7V2}|rkjrR|Sg`bo3l>{K!c$@^)gLG!WUvFX!7_;ywpfCG^+{8767jDY z&y=Q;SJ((RiJ-`3c3jAZY1#l-h~4uQ1qB6b(D&?SAt_jvp2U|~2rC`0*NBB1iP3CC z4Fs-M6Sxt=A~6*tk5EQH1}PQ^;Rc12P(~^uRhVjk=UMn@WrS9(&?~euS&Z-?kvgp+ zTCI;zX|-y(7C{EE@m7k)tT-{C+brnr$I73JMRj%pqe*)*NoEaHL1G3;lT-$219iH- ztb;RB%vK|rO@#;3^u%jDVK*-)jInmo0`|ojH9x}!rBaHk3@RK_OHBlXU`iv z1ScXC1~q~k4F+*P-uQpx2Mb2Q!D9JO@eCXZ6&YMUZ3SWTw3!I2&_Q;gRd(-OJO%&; zZAhG(9Mf@+^RWR-y~p~K=TaBv=K@*vp3Hg=%Lg8M_}7bEGm2f%Mi=7?y!DxD$7#RY zAK2OEx9|0;H!=AKy=xD7AGrC;-P|{={`NcE`MaF@3x?wZ_a5^ef8e8?9zGDrYw|{K zW@c3~@J6Qcq;JK3Z+Nlm*i}|p&Mc|(Z2!|AyT$#;%l~nMt7!3k-{#+cf&HnSU3I{# zC}*5^xr<$#ahK^>xJ^bOzY!Ab~ zR^Tm93Z$IL{Z1Lsn_qN{TT;4$LFW%$VSgOJMX|r$nKJObPuFa=>EEl-> zkZ*9Z-=6W${EFFf$~S$z>-}nXAP|_g-ZjNpStsP>dc0nn?C9un666u-sG(Q)E@_gN zOh8RfMyGZ4s_6;yCL#6kP9@aSSY9@J)0VfJ#&#|!sVZ1KuIs_%J>-$x-o@?dO(E&A zb)r0ls`8T;x?yxw&5YbIQP}b5#CDdw%8rPe{@aP+rVaVV>swb z=#p1KVa~D}Cx;JP2vBA7bp^UEu;T2Ubj0>rWr+1*L44>K8(BVbZG|M~4-LJoHAs zY4omzgEman7KNk_9#**kNIjQ^jTyGE4ltFaL!GH(L)T4;`fgl79@3s#zy3tZptd=w zFIPB4ExCt>qdWE_c9yC<=Z?(n`mpxs0ru3)(VE6KWZm!=$06qGv`yP4U0CV6)-m}m zdaG#L{rPM>x?D1+cXvk*5z1~zJ2Nb&Wc|?Cva@B|s|$a3 + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/newsletter-document.png b/assets/img/newsletter-document.png new file mode 100755 index 0000000000000000000000000000000000000000..e725085b84a0b790c39a172a6b864e94fcf373b3 GIT binary patch literal 2767 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 aAcmp)fr9%87YzA}7?zh-k*bz34f#KtuudKT literal 0 HcmV?d00001 diff --git a/assets/img/popup/add-event-first-step.png b/assets/img/popup/add-event-first-step.png new file mode 100755 index 0000000000000000000000000000000000000000..766baaf4344372182af8f21e1b21964354cd8fc6 GIT binary patch literal 10148 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 E51Y!m)&Kwi literal 0 HcmV?d00001 diff --git a/assets/img/popup/add-organizer.png b/assets/img/popup/add-organizer.png new file mode 100755 index 0000000000000000000000000000000000000000..0e29921d507bdcd1115a5cc6c02139addb34e6fb GIT binary patch literal 23598 zcmYg&1yq|svo_iyEw06#;!-SF3&GurySoL~Qrs!-#ogWAHO1W_xNDI={l0tub2%r6 zygAv~-I;l2$2MV#@)93WKB2(CzaH|g*n>}GpT1`a(E7rkcz({@DJSI{J6kS&0oBz6DDGq zy7Feo{o~CL-a$@I`TeU>EK3JA`B(CTiA{WZ$HWGIKu2a9|n9ds+0?$$@4@SdI9g)>t>h+=SCOTiDBTvlH=g_wRqkJ z>iFF%`-u2cdM>95l4{B4 zsBJWvFcEq8W4Edn9Sp04ZI#wqqoDl3h<@`T+P%whwMIYC zrFRazK*zmimR|8JPb-sanO&Azl~!V1J<7RZuV0v7*GUMiv?-C`(xihh6hojq1!OQ$ z-M-?rRFLFjiWBW7?Dir5vK{%@5h&uf(yN&v*fsme0~@I7=Th?|>FSl+dlGRoEe1Gx z2j%iN?nyFR<~A(qnj%6onE(wY>1rF0n_>3+-J)_s^&+1*UJ!K!Kwz#eZ2KIOqSs2$ z9%o>@K2CA!@r4Wa=a=^@~M~af*>{)X347pj|~D z2vWzjbAz|@6=`xV5_D)S({Cw80ZtvxR>SI z=A|O3t#gD{iW%OL`)n=q^Jo7cw;Sw9&pN6q;2F99m)Q^e zc_ITm7dZ3hqS%}^1>A5@E!8z}SXez8(%yyTkbL1{oG#0Skx!S?;ku$U?4V0*33Ad; zmuuCj+V?)hM7T^YR-AH80Sh%4`XGct%7w+%n7q9zGO!3)q8h`Yt0hZ3TEUC4)!;(F zc^Y?l7hB2ICr{nVMBVB(VG*&6Bo7@F;IJyR&Y+M$BQ+!DOV!FarU;j_jcyFkMS25C zC*@Je6tqQJOvTIVbWZl|SvP8)D)ILOL6_+el{~hLxUyH7E84njRk(v&+hHEFlCG%?i}O<4QB0n2SLIMrD? z@-L{)G5ah7w}w0&?w>*#T;8|c+H()b@#V0IB;@0CB@*WUHaEUhl+Kv#CBHqG1DIS! zJUDFq2A{^hZi+&+;$d(+Z{XZE;cxJ=A&lMY4qoc5^o;wZ?0v9*(?UK%UO6@~L;+vy z6(qhzH0~J&3GlcnU3$HI$2UR<*T=3DeduO5*9}3SKTV*1ont|E7+`L=ren!0y344o zr(qEYto&I*7zv;i1*(s|%Rt<>X&H&54PNv@{$(<9nMm#7XXLi>#~S1Bs!r&Ku%Aeg z{e*G4FmZ-C7-vkbs(c2RBINxn%S8M=_g6Zu;UUJ9K?>GOvC3|suid}&5lEiY4%FIT zk~6UOV}mtsf5Y{`<1d?B672`)x>ncL?LAaW5-|NZXzO$rr6jVK99Joe**!vo0=B`u zyy!Gml%F>vkGOVvx^%5y!!14Cq>mN;JqlU_Hy&=H?mo_dOzBu%wOrg*@3GZwtj-$L zPF5zx+#XRmRsG_yoGyWD_c-FLR^If-_&Q!A(bJp0f~09xLC=)%SBBg2tIH#VZAHe) z<^K=lq5^zNddL22i~){*I~vml?JL2PR4<_UbSBre=VY)!cm0Wh)1QI_@q3~y{6phDyMBTHh zJ=XfcGfc200*gke8Xdr_3EqPRJGmBZuFYuw?mJu!Q$L!pad}%;f))#NqF2)BpF}%8 z3RN8p8l<7bBk*E^t86E`C!&n<2XTS#&BI5N_XDU&N2G#+7EtyK^NMG6q2RK5Tx7(|Z2M~- zdve9(sko(O7jZSet-PXu?S*Wb7;+Nx!6Wu0!PBL?jXZ|}hVB|jeTM24%e%9}Lq6A8 zorKQmq5um^*{by#UQE+!kg}FDrE918nd#Gp_OQvF9e{!kKT*1=W`jsPY?@qLB$qKe z=Q|5#&UTyNrxG{alD#Tm<_YOPR=ASp8Y@=QoDhO0>8l|pX!gRA1@c4LJFP2z+I~2I zt#AD<<7aIAU$s{Y##jb@0Mu=xVtD=8@4sMk&tByeo;`m3r!-xp?ZAUzs;M9EaXs9Z zMoS-tw@1v7Cv`rA{F%2kvXXtYKb#9iBfh$OtvK1xYG5=;zJzj;Fvjt#_OvwUY$-D_ zGjfMY?6Z(8)*8%EARM(3)6UK6C(c$~-aKur=^wub;lrVl`?|%`>F5_aX`89Grl`}8 zr-s{ylQE~J--?pk+^DZ&n0RTSg8E&|KXkH`DlcBw6N7|vV9z8{M&xdWfd(avrR5Vi zjJK=ojDdMPJ(Xuq(r7$4jcH97b*Txa#7N#qg;$~vLUt?RWw zoPS5z+P!V>e(Z@&!nw#GKL`W`cL_BV{u2OaLKeRf0=PvRr9Pe=%27WL7bs^lqYbo_ z661hFPuh{{!*ICA^332wz5+Q*W>Mez?T1*oeW<}SN1KGT9p&~#p~-h<@ZL5oN*g;x#FbJ>r|sop zut0>FSp6N#Q=(gjk=fR!$=f!=IG>sIZ*G(B6{BtY9WNAXxlg24gVfNC$ie{>Cp4lU z1ZbXogvWBAGxpw};l}0>wlZg@Wf@NFiaXM$S5WU_C`5f)N;?jsQ%6UFWkn#;MMl@vDe?eC7B!9IF*RVUX0twB#f#ZI)eTj>capBLB}Z+RTLZF4x&@*hfvq z_WcAUz$^yFC>7#AK-ICEtY*zQg7^-qN!^=vT4g;z&<7k+9vsfFNiG98-b`{||G%z9 zvP564B=MoU1pNTFN(V$iRwYZrT+9LB8q>xP9++$WEj*}jS?Y?&c+l?znC5?3CM*XQ znYrR494Q)08(HUkAQsh{{Lea_s^E-XXgbh2Bh|XSq@CPM;u)mjmEs$rNSi)*d z7)s!|Z|bTcinaEa= zlmpXO60ON;7}}gmwdp~v!C_Fo*e!t=C{iPBfNr`N=eknjQ=nfq{KEIybP7>FkF(NHV%698Kt-3=5(AD38n+)TD^Y=4<{E51)aOa8Ry$nurdR~u8^n|B5TSxCMcnOb# z;Kf190)^Vc=$?mEf`gRg0+)H$uf=Tc4NCPel1@qV@<|2-821|C`Bm9%e|+<3B2kp7 zj^My8A>vaSZqj|sA)yAFBCG`}P55h}KodJbRAkJ{9@+2DMbPNyAA_e-H6iD;+C-QYyOK zsYMM7R;Jf(q-61F+JtGSyZ6~xh8PKBOMBym`4)wK_R^&JFYa5ZV%gM#ZsA{BxMqyE+Y~B3CYG)k=;U%Za-GO0j214CV>-Odfn%o`# z$o~>jqi&_B5R(k!JYzVK(9TfYrV^zk5r4QB!2~;QN&tsozdM96V683MQP#_UiH7Js z&mjj11+4vJ+W-9u7MPGzk4gHv;(;)l?9L0#7jNs}C43{wa_;AM=!%M=YxvKK0Jb{= z!^fQ{l*ix0hO=qOOW)6FUu+Dj&&rj>N)2T*UOIPSQcD7d*t>xsVgtlvdQ6fx zclKW^CqcuD<54~WaT&@osCy}JBN!2CVXf68y6dV83QAuHEw1s zjw9~0cB^WG15S$$O0+8foBx zPy1qd_{9D=OS$fT@UKdVKImTQvA~Z0xH`E&(E3os=|BNA@;)$L@ome%06RvK|95C< z7-SL;)&zIB8I$>IU&<94zo~y-3kNT|fJ+_$ET!n^TV{}$a2%Z|ft^MjQtwG^A+-b_ z4b(@z;6lZ|_& zW&PrTB1N<#l>q)|)1DSe-D{GrXsaS8LRG00DC_wC7jKnE?h`|Aw;q2!ks5_;*IuRX zf4()^Y+x7tt)HI2pyg^}(zC+I(}(YO_UG7EavD$u1t9_4{~2AAI%B;ae31&f)yz}sK(LS(Kj*@>F}~v= zZgH0zA36!Fp0EuMtz=j~>E|L5cAN{zaVs0VcogIj37vQ+F_qzrsauqAwO3kobr(Lt zX1i4-Z6rO#ECFHys;p4c)V=umQsYnlHGHa)`v#AhxrOn*6xJ@6|A(KUkLl_5X((cy ze+~9RV&X`pqsRv)KMQK=LEx1ux)Z9*@AG=MvXd1WV34Tmw;Cs>mAp@*H?ZgV-9hdF<1CP*JDL7q4JLIEJ)Ll|FN@bav)*S*v%#oc99b< z@4FPpHX>}TTRU&bXbwETi_guq@YX>3Ul{%%HHJut(3^A7P+vqe`qU4d)$?m5t<5@6 z0e8C~UGC1;{{fwv7zmRBZe05u;o1_7yc_sl9VGo?(UWi3q)Iy9Jqs8;X*VcOSRTU$1|0j|eF=l2d1p_|x82D$)al`CD>X=EVi8uPvzyW}_r&H+Viy8AHj-Gf_6aC%($B_$>z0)kSwXyY`l_OsQVG53Hn4_o6W z6gBxroUqE;i4tTBQeW^)*;>17I2QTmU)d0Oqldy1N^7WB>^DesUoo(L>u7v=J^5kL zfgUwE@8f3oh;t>4jaBUv)o_#VD$Eq?qwWNLZ`HAWIV|+7{gK)+Zv+Vw;Z@OMC?S({ zDU}*EL7@J|gomgh*cwp{UaM!wC0bMt{K1Ss-_4j&(7Y;(^!{OwJPSa|K=--PMh;ku z+E7B*rYtZh_;YJ9F{$cD7PuwUZr{iGLea=*@AAoM4VD)KK>tJs?49V)-l^5~F`6OL zd;Gv%V9xMSI6`y?&d#cHS^-#u;P~jQ8PIHmoVJG}>M2E-;(;%k`GdLu8McVYj%Yi=VH%ehv`bd#dDFUs=r~VP>9VGP-<41^K(3;$wnKJlcNB1T!1g#qyC1q8KrxXvpF)&b^#P5Z?kLTblO&Bwksdb?m}{xL+5`O$nH*_fKG7COmQmhPy} zk739@d9tiVDkTm&lX)GF>Yp)vbABwSHhNJ?sdXr6O75oPMPv~4PaThC~T@BI`p%i$uB~9MTGMX$(c(z|eA!J=>qykH#P+uW|SYFaq(qa8L z-3(;44lzi;OuUEmg4IrvD);_^5+l604_=-0Kb$DP^Yguz^uB@I6O8qsLW$;zmIhib1=&I=U$4ukXe-xA zn3sMd{Zz*RW_NDtau}ljhT#*8ImxRBBN2NcA}Yq62R$_1OCqBs)OYs4=8sSR^Nq35tK-(u6pYGcC#m`F*^Vo^$( z;YVNJynA*sK{{WHR!-TwX3N~hay_oo?8+)rLgkTd+fP-tWF&w^k!oyGztPv?{9JK` z47stvk9ozBp`)9{6=Mb-KJSNm)o-z_qqP~q`H8_HL}_rgw6ksB&`_-fOz%z- z_!4ii!JpCDu8SC*BqyeD`Yc-sb0XE*Bom~zgPl{WpVqAr)vF~a0m2e;s9<&{c!%ox z@V*8tZI?PKO4fkp=GWnZt8PB$v`UaLU9O67Hy_P*T3yiOcS@w&xdlq8GV<=+WL^>n zX_PwKj*2>m`dX+5>>G`R4mQOLwO(IL!pXsJQR5b5Xr=4#zcF&NxSvRkcM>||$0Qko zQ4g26e-z^5>mp$DM%+LD7;;7+*$N**i*@_MpM*L?^e=iG{U~AbmxjOXR=al4phuzI zBh+pob$T`Cjt256WX#sryB7lq-8|=52m7|C&Yb5l>_z;ad#?v)pR3}XMlE&F2XeHa zR)UAtpExmAM@#qWNh=iUWjwyLiS@0_eIayv{_thVwRkf*HsNM3M=k<=Y5NlZF}>CO zMCcO|s`d9I#q%_bCL|X9je)(gG1|OPmUkp0+G(*1i3JP5E^B8L%uGJs<5?6|a7}|v zxV-Ig<)B$zLn^o8VpW?_6v|$fpeQ+>T`$+RDhQ`@@rP0{`mH6pX`B!xuM`$Ad*tUX z{162ter71Us)`k`T6|VkYB2P5ZG<9pS5MN%!9IXPwU0=UZqP zQOJ)gsyb-6ESiT>*dOGBdtVl1l^3o@2~aVZFT-TX_1dO8(1jbeKbmXK@|^bBt~*p; zmN+VzA=7oz!himWaYdr%-)teHN70_;h>|65i%=rzgqX71%FB(F&j8D7ieDqPkK-ST z&v=l{`*A8i+kb4w*uXbrmZ9(jYllZ6;!H({c9BKN+Snba9U65S@|T25YW@(1e>{D` zy$PB#Jc;a1B{Bc%p|)n6yg!|~uqpyHXIb}c925hUSJ3(WVogG{M3VgTxEJ&5BSBy- z?x?C`VzDaS`(y>C56$}lbo$5HBsOo~>)t_d9_+rG8oU_7CUiS2JqRicb<^(?{=-MM4yK?uWqUG!sN|U;LD;zS*jnL8z<#J8Be;~Gp@rqlRJ}48EdK^ zTL(!;FZP{(p59x4tp@;CdutL~^&>l6tm5vB&R4o7jfnB<<-Hqgdshz@p-n5lwL#R8 z)+z43Ev2(Vw|DuEtiW5dn#0!bNu~(+Br`Ihk>yx4qp0SiF%;kqNnlZ+Yr(;PA|Ab2 zoLu8I@9m=6x8G&`qH}F0^-BO@VZ}vKclzhL&1ilOZO~`U``N&qw@344)&96~aF?s* zDKUk~p>2(NLw~z5iKr+MymnzJ1+Uv!v%)>#Y(@?mjT4~$3k%>_tv-R}v?+>sGbX9r zxemR(X$f~-W~x3QKjl40#d8!Ii)0KfIq3O3p%QpLiOz^~bACabA1Lg(M_vGonT!Oh zw|}W;?&9)tooRyx+`s=5^k3u_LW>AT(A-GUW(?7!o3=ml)W_O4)(bX^CWEWp$f+9c zv-rg1=GvKyURX6!>SdyVG`iljol)t-^geDo~+RGdV1ymokb;+u8iA| zMDq%tM7yCZ^-J!Tqi^JIBLez`b8j(Uys$G%C=+J?6Ee0JmjH)a|Mn|HzdSV91Z|8o z6`?m$DIu7*Tu<)A<&}Wlk+6`^J*h_&I$=JLYnNX7w>zvb~uC9NfK>LOtT&HP95WZIlN7t}h&{>M#rSDFd4 zTh`*6Pd#|pYU!cyf#2{s#Ulrk^emIY8?QSYi8k+_;4detmuWJIcaKfz1z>MY;JT3V zUND=O+6HZJ*KIoBh>D01SuEdh6zgwz0gHb9s$O*4kej5+RSCQg@SgP;Iw1 zHeEV*i-CvtUP=m|Vkxsn0qta^2_r8t|7$Xf+t7 z${--!ZUtlqxw$Wx8gy5N%l;<$1-o3@EZlzo1^ReulqA!_v%Vnpy*XT6=Uw%|hxd5j z$UkA^qQdETr}0|;0XI2HxrgxNyev1`mwH=w6pNAwelJzgGeTB>&cV0g^xbTzuK=!f0j%dlzK>U!pX4M6fPv@pwm1L8u zs2XgtVr<0&ZKX%Dz+Xh0kGLh2!$^N_tX(ohyQ$=XLqER5OF03m6+*P_WIx-P<-{gZJ=$#h^rW7Hcg|=Xpn?|3}Dx zm>fl`$Mt@VJ-tlx$*5F#`mQ!m$;3@(>P=fxa#(+7C}u(MbKUxbLP{)n-Y!J2^Tu^T z8y-8R1L8K5J)4ctHP<#+mPIA;y?1}YzNgyI`|l6!#_^xEwcZ&^FB{|;6E8-1V4BTj z4%ra$@HtpRLdt6g{gICHYa(|p6cBYQu%AYZ;_5eD?r{hwr~a5CWh*MYB?@>Vliy8< z<<{w<4~xxM0A?hyAMq`_pw;#C7uBH)>c@|A4S=OB3ItSZp^XK%9F^C1&5S#IT>AJ` z95&qd8pm!vM;fi5FCPdw-m6euZ3HiN{Jjp)ZR>3P%z1r(?G+_H30WjnZ9Zbdc%C+# zR8vo(of(G4$$qhL8htpq>4ILa43nFUvKhQ_nCU~x-+~#>+pp!bsj&R_zU0y)_ z>BpNlYyAuSRj-@RU9vAim-f}X9_8vJZEk+==;X_P{(#p9ucDzAut*sRe*g#aa||-; zF3DD=Qq=q^a~0HpxBn90uTpe8zT$M%l|~p7kmez}SX@~u02i4nI$GNk!D&Y0=4UsDB-2&deszOZCij<%bjo^h#D5GXg1t&4 zIRP7?fBvYQ^HdfJsf3}K+w4pSYOeuZpQF4EWNO(ybd6s=Wa<&_VTgNU&N-s~T5Cqe zrY--{`PZ8ndLFdXkrvR)=V{@b{s=)69xrPDbt5zJh8l7yRMy0(W4+Lcba~1A+vl&J zgI6m48*L~AS~BvBc%Cs}0JE#ao&32Ra-eQwt|ZJP&+ZcG9=6le zD7x>{h83FM|%A&*%v&wDm!O&!6X5cfF}NlcKvK;!qAe7PB^@I zbULH?FPCRkM_9;8S3ic3ch)P&wzAH7c-kF%=^581eU7IiYeRLLz=?BN8$0a7Q4xlS93P6d`Y1&kf&(G zxSA{2lzsPOR*4Dj#`Q44$`;Xisc?E#k~#DgrvwPDQ~7}q0wJqt{U@~jb9{aS>iV6n z{DHvaFyO*)HrkOUe%P5db*ptE=t&ebRqu_;A(~bkPE}+Q(lvEl6j)BeK`Z5`pj<-o zk6M9SKjZ+GqBUG|&HFhu+RJ5z!)(0`%iKNL>!_Su=ANhXK8jErK1W*&P*o|qT?3ctb%#c~{JxSy(ys$(;tdw9^8cKGf!B(KTuu91&`{O4 zCZ9w@;5gI&;(z!$!p%I@N7-L)82?Kj{UbK}E0Z5ZF4S}Lv%aaoRLphONA26&^pcaV zb8}0K_Bkr?dK7_#ySjCqga;5cQ=&rjlrcBvnsBwk>_o>4F6`ppm(i=I-}hMPeENd= zVtm0I#-vN*_8*GAmY_-u#av^bl8Z89iu6Cr0Qtgt$1EW-q*^QeJxjT>)Wek?S#t-5 zvbLAIyju}bL^asL20d8qR0k68_1|U&IAu)6ZFezG)z<|zD;|cl|CZ@vev^dG3syVF zXu}I`DbpBlVklT7M6;f{S?xN|S>cm#O7G(I^9?9@b&03Twn0{O{W<|tPrv#Ron))) zxb=%A4wKBMlEN_m;Z4)1+A;e`Kh6S|ekoG;e|UFa$EPxZCaRaJe;iQmuSN`cgQbf&{tJXjc0F_l zG$RS06N!1IJRWcwOqA0&TsivSH1CmL;0Mj;pjg!I~m1C zG@&*8OdqSG!8J{qkIR=JAx`J(OB$J1y(u$PeJ!oDF=fY!-I8-D*VX2ehl`7VHOYJ? ztU@EOG{~7q7{za(RvWW30{8CZNr!}|NUmuZM5Ddr{0|0P=V5UiNwlq>RXAFaYj@C* zPjs3VWTc(8rgP2>PnQo+$3{`ENuotuC2oD5EtVHVCAKUH2+u5WrOtJY3vOp!#Agl+ z>{aophO~LsxZ4zY-9a4-@t=Z>I_WopLZd_F4@uacS_+^>fwW53ke+Tjh;3TI`552EX3oEWsZC;wOzxszbYElfyZSMVda5a~#o{UxNFN zi*X%2rck)sI7`OW^XS+?Kp?SAkDM{zHB>{$K;v0jpBv*J)hiNH+xLjj^jF-Lj|MN< zq!gn=A~LIhz+-ekKx9n&;UA84<5uNxwB9bXjVar0PUiK1c*D=Dx1)@+vUU|pm~IVc z>iwN7C2q5N_PGB{L9;$XCL;nOxJF1J4Fp#NK*KZBP44%wk@~x0ACtWOy0+im{$am8 zNsnY@w2m(e-hXi5@B;YcvnqP4I>zS!nC0lvQeCk}|G8@D#_di+Da~}NDkVqjIT!Va zksULv+($N=pqxgM6Sp&|YmEeUn0;G1Vof-`sdc`0fsyo(+xi-Z98z?sr1P2;g zi`S{U{L-BMO#<{GW+XnQvR_3p=JL3Hd*F)g`D*NCI(LApjK{`(PnmiaSF+gB&PPCI zA-`7E{jM8mr;=sEhadl)XScFQ^+$ok`0&HW%I0k~8l|qRBG*VAZUc+eD&Nn@NuvNP z5^W-k#RGtq`BBqq2=3`T6n(UZdFflPt--J$OwW@PP-+6Z|JfR&{rN z|MqFohGIJJ{o6>jk#+$2$2Lw&PuYMDMJ4VO#D5WmK(Q3qMR!}cTH?YX&~gCv3iv+92S<=vAnC2V`CpdoqTdewboyAcR@-(AH{s#kKY0=x9?!qO}bM+aBpc! zuwdh%SD5`=c8ATe(i*?b3*+fhiy|uz+6Vc(_XftRraCUqxa&99`2oeW$;l1Y!qP6& za9pD5p)Z70Rj@gpo!AGwQ1(L9g17{#Nv3I!E^3vy$vq*Dh<>h--{LIFZaG1MPZ&urybe{4R z+?$in6qi4qxBb<1G`SEHT}MVN#OIM^hf+}(8aio3wLO!iB>}Rl6%E-Yd}!0p$y^=I z6zagXmy-=jw}1V1yBR&60iV3*-u`r`Hsp3|7hr!BqqG)G8bILxdw1mioz63{*txQsgAPw(@6-k?Pj`rcIu-Uf-nLIa0 z;k0x(w3G15r|`yEt6bxb1uWh=fK^M&;l**4Lia}=?_#84?aiZ^?7rz4J<&Cf**c+p z4)-c#zi#MCwTp! zeI$<&ze{ed1;L5&x`VtQ>I0P&>UHsrdjQEyEreA;6-t7C62${E>yaCj`lD8@sT>QQzZ8QF$5`?7OavTRi4hyoh{w#;eTSJ$UtRJ<=tVUc#R zKF7j5;>Sx*)nOx3^P}3(>Xv6GZSZj^C-6XAc}%&n`U1!Ma$wHkxT5q*y)Es?cDh?MfY$EUwL)#3T_73Npn<81imlKMjwl+d9ZT4?3>Y{*9taJ4<8FEDIPUtFe&& zJ5ahZEyG6h=5R2Cf3qQU2tK3|%DkRD$P<4lTsgGvo2}lcB-T9F?yzZyB&7t5eF*v_ zdPEIYOIs`0I#)@wQ>hlHA@f~Cx9iewET8Ep~#U0EeBD^Kr8(! zJj8L_+U~EJZfELppbFH+zBdvdoyb;y^8 z=;IJsixiM<+1;uAoy6&5tEFGny|nakHIr_FrWi72rkc1&BDAbnY7j6T{LyPailByo z#Ck3fFQ{!Rhw8b9S=h#%=NVI2LzfC5HNYpo@vyzJ*7#qJk^1y;EdC}{s>D_&X@KZp-17N$+4zdBNYrZTNUrVg z*)ivg%=-@nn_c?)@!z+)KD2-S_VU8l5d2tIoOBi=L?rFZoSw*N=9+bXtVs~|zuD?Fla($XB{6v*EkjJyWw#n=V(x_m;)SbW# z>xs(bT|F`Iu)1Y3O&P9Sq!4ipL!kMDoq!E4A&M)`&!0T7Ydz$j(|4~3!IbFJ>P2PN zQ!!7pQ@#pZs!M;Z0)W|X{g@`s{2aV4KfZo3MgP$rhyLZMNf=Q6Jvp@UC=^K1(jd>_ znt(C}bC(I8e+Ruuwfd{K@7Oeotjbro!?x#pisy}#%QBgZ6Fo$m&P;N;bmt zwn=CcxvV!>o9=9M3f}LEZ8VS6=AwCmrIxy`Ar~SAGK)oEg?K3#qliZ@si4rd%lCf? z6UWzUTfKwcGayQ(RZ{xMIT*dRsrEFUs*6FI1w()E>oBDY^K8=nd*+>$@_pkA9C7Xu zyq=t`Y6bNwG%*+7)Q+h;U-RdIOjzJ0mKrt9=U7~D5u(rC#+dF}LGOu00-sM)NEHU& zi(K(@caDJh^LPbFHS3x`F@dV_dc;N2MEbq3!)e30SHgO`2VO$L?$?dZH^5u_N{jI3 zp1|lZT{F?wiro?;-u;8iy%f0Omc`v!SiWd;DTdHBN*a@VV>qe%qiC-2m~>R({eXT zZA?!Ga`CLyw+DkfpU|tV7m6GvxX!Z3=rfsmmg*942>Rnxf&VC8A6v?g+0~+o&=BCo!^vmw)$3#+*%=kOGw#J zQJ~(TgQB}!Z-PG$P<&pW0|YrxE8X8E4lo@X>}76x{w})rn=@k5UUQi;j>*Cuy*#X| zHhA*!y3LUHKAW6F`CM0j%TTAavm6K-|7~wxw2_%f6x^~pmrO*|i5}JgV5M(`0B)0m z=E~4RsWElc7Q-NLSD%hnEZSU~Zmm{aho2G>VAXJ@QfG+I+ONrJhbmfJTtw$3941mr z`-|sG3&N-jHER#lwpUx2x1#x7e@+x0kY+v8XSH_b2SZS<3aa;@$!iI&B2pm00 z?CUfOm=mh=+ih_<{xtZO=OsAr!W+KXaS!MVL_V^&q$i{pyE1m(|Kg+c5zMZeDj|LJ z^11|mAD*EkghppVpkel4y9E-(b_v@QB@8W8s<&+IY@ORPV<%@sZF;ZXZy|*&RjeT>52p* zvAZJoK0C0vZ_k~5o-AyO4GobWuU|E4 zS!fqp;GE^2+x_0KctI9?A4toIC9d{5@+hQ77gou*;(|FjdAifMW(@m7#nM(viXW&a zA%)jiBxTyIcYlT2c<`bicy(w-qOq3VI1)eax(@UmH+W?8bt%6#k0pw9IdPyT&mle? zUKfNxlLwO-JQMxjX%&RHXAhb5p7)X$`l5JPf@5PPvnxWR#4eWC<9szAG|Jp4co3Gp z<`4@#bDk_-!n$8ys+3M;S!aSd8HY= zg%-9Ur48TyWkM>>qfL(ujSkp@f;3TQX@@QK>hVeWo@4c2JX)4y9O(bxvP;#RthHf8 z6Kie(h`}1o_mI*i?CVp`rsYXfPodNjYVWhbn%7&)k>;7a7n^hHtzI$b=B@k#p{e@X?MTL_%jdxCk&#BZmWod1x6fTd*sFn zJA2IJ7xq1wEn$vLx+5DPT?1X&5~OsfDorML=k986h4d4(fNWNIv5BLNATuGXXrxdT z4LGBDyNrNLE7wp9Q(HZvHm#sc6?$^E=MT_q;M|h@h4ySLOl#?-gicFNLM^VzpfKd6{3xptYOkKqf@%B{Uj@_yAPNI!A z<01CgG_7l^?|aMc092Lj&X8!oNyKkvdV0&Fcg1>aWuN_0iptAvtDW}x{A;e=Kl#EW zS5_T;1C@iPjkSq@#oJ2yG^ATv>?I2!I)ppqkXiSAg3bW6V)*t_B`BNW zuIM7D)4CoavykeEnHh27`n<^EbliKH6*)|FH63xf(m0;ehcqW@;sMpLG4!}UHfO+6 za$a;(lk(srH(kLw8!+Xk<))z&E?gRpdx9@3odn9RtUp7YQ%k}0IJuiWuFHRzyq_-% zAa=R3qluA@i0iYz76;TrC>xnh@EVUL(0#cBIP;apqHf=P&?e0KvtMqdh=VX8;L;Ej zzHwtqozca-!!2k3;kI|s0(wA+Q`uDe?u&+GnMKTT&y=ZCQqy^Lp6i`I;91lk&`B=U z5sO4P;i#=I+&R-@KjyKs=nKIvH+EoFmFVUzinsVX5Q(#T*vkR-U2v&&otece|28W? zer$-lvjb7&>{^*$e_5*o>yHXwtNigz&9F!yDGO?Q2T^IA1 zG+Ee9B&i~qa)~Jfj~QWLh$jC1E&ykAoSxC3nIvxwE~RsfsQbDU(&q}#`0bJ;=S`3W zRfAl1vauaou0@DmM`39>V|12a+vSir^rjrS(Ny?+&PsALhBRu2=hu*V>w3;o+o`CU zWDE2?Ah5`(`6C8ZE+>p?otk`x`;Cwijv0MJdJ4h24lnB%TzqA3v@m<3e$!LL9wn6Q zJ#>FrXv?ikb|EouHO`{>FviBc>6$dcx7U?&O*#BeVxTkET;EJC>fOagMsGsaK=G`o zQ$7nz?+t5fCe*|WsJ|{U+zjpQ7&NplHPh*B?34RD;$FIpO;q_QrLy-I8p-yBDz_F- z8@CPbM@>zd)u-CJ`=0xa4P+{bN<}sNHJRXCuMr+`=zYDxtQLND?;ZSwVL*5oYM_kQfmdX$2e_327vxJER5a zkQ_oO=^+If8pc6M5$Wz0kRc=_1%&VN-tT??-?LBcv+r4F@3kiAv^5+xR2|L!oJ;`y zy3P&h1o`d#=p48NLULp$D5rzV%~$uuz(_lEU2f@3pJo> z^nQ}-%x)HAApklGZ4=2rc@I$pnl2;xGs|8l7YY8!1T_+l?(5juI^S-8IpRcBk3G5FD82Uh$J;4-m$3t^7#D>rG+ za0wO{gE2ZyNT&Ir#b#l`OyqYEOPU#yKc=YwTGcl2c1QqLPV*4>$^7_hnH)PDN>*LM z@tBkIY*6NanYOt2@6zJ{8S9O4nn<_&?-SEizlL1u``qY&Vi2O#Zcmz8S&;cd-tK9c zcyXTEUjZsj@fJS1^Nkf1sB*T@#e>n!N=?bv^+b={#(&4?Z$2`T$@__Ueay)A@j4l} z8OM~G0dF&cW9gio|H3^C-S4BRiVogv#b6CV7UMUtK9})>@+=QOR^_IRKepMMrTcL5 zdv|_ZwA6L^4XvnH)90)J5zi{_PH*q6vVcTZb)d?w1m$0I^v#-CulE|v{xNUr&%gNz11L65WP=Lq zys(_QWAX4Hj@5mbj%N9}S_Cq>sU!EQy7ObTShPNret_7;uQUL$i;feFjd9faA5eJy{N|PQ$Sq%k_dYR#QG)i3^d@NRev=%$|7`$kVgcHaf<^wSHtj{+B6P9K6*yYxq@5SNAatw(--q zkr$~FaOnBP#i-~y^bIwqG*474<_m}ZKaq%3bKbIo#Ey*(*HDOlIZRc&cs)P`8hfwz z-)C+6q4`azn>2!GWy83x_QJj_t=i`%Q>6(hWs|&jo&y}6I5@5vK&6s~pe~}u(l-(o zJVJjTL=q&eSJ7iRk=@5nVzSwfQBOs9DxcpQ#_a2e@}VYiKCwu zWm782G}p9&P8jeMtf_XVae`1oCYBcX{|% zU-&xNFNY-lG^kQ*n~oXMXc)H4`L8GL3qyn15qgneAdSw_8w4gppq`vl%}f1oZm!px zeox)QQ#Ihqz2oAk++y~O4ahSV!T>bTdz6nC$qz9<_S~-A`8GayBkmlf6)f=e@=)D) z0nQQ~?7Rn*di~F+weMJ|#%2b63HaY>wZTsjFibHbFvoMQQaS`6eFvJ|@A5SGgb|5Y zU#d$3=KZ!v?$qq!rUFN{5qy((dpt6bE;bcXXL5KcLxy*4bK;|p=#OZq#d?gPnr@eo7 zSBLxe^aH*2rtnMpeM{UW_vW#}hQ20U&P81!5~2>Krh$1UQ2%E!TdnPM&CvaZwIeSQ zrJ&6mx)R+COS;f{&6xj=52)fhh&NEm6n^)P<(>|iOUd_}>uctVlL?2_7^eO1fL9-# zD|0ig+Pqx*Dofd)(fy1Qv`^Nt1ops2sT^rghv+5()<6Iea9Sk??t#edS;5YSB*a#? z3bwin71qt8%6YkE7LsksKbdBH8gy^G_2))o%L2Q-E}yWd@js7LqCVf6=NQ|Yp2&a4 zH?j6kyR5Sy6cW)Etb!sMG1`IA2F5KpOqm8~o0-S}BX+z4WUszJGN^kP%&BrgcJx*N ziCxGo#v@oaDC!WE=M|yA_H&c z{SH@Y18)9;P){VZUWLN@Vxl)Y#)@T%N=k^_zn)@;=8UM|-@%X!bpJ1p@`}eCFS&7i zlQ54sv*b>&-h*b-c*KSeMy6^Cc1)4=T^XNTrE=1JXQ8bFgNr!3Gc{r1xNo~pwvSI8 z^I0@yBMGS{d~}u7iNa0c@_C%nW^Isfk`G? z=_PhyVe-IJ^~hP{rFV9rNm7;`PGgGv(+%1s36vFXM3YcN5PsbL?I1HO^!k_n{AcXV znAPWxUX;qlfpC29g`<^y`~je2^^5;XU9q~D#r0`M>XHJBZ<>H&;WWF>OzgfiH@egw zZb7|lqpJ0&w5MUVB|JdRwd#JgE?1O1C5KKqzzJReIrmCFqD_AN@9~zw3?r+~M&Sm# zY{_g1l0XgU1~*(<$w$!e$J*=HkWiM1OP1sLUfnz0&JLIN7@b9 zxR2z`+iGUtwIopF&$Wq+!Qs*>K9a?|Nn*KAh8W2+8q#^X>QrBo_YF_xaL{f`Wb5{V zD!gG1hA7_ipi(F?T=#${?V1pk_;rf^Ur8oqEhmmI95c&am_VH15pxuh^k7H?%*;w; zT>SYzKv@ZQaLy|=c+ z;V+d6k>I5u$(QSc^x})fq&;%z&$H73V)N^+>kGqqRw#C&d&7a;T10p>IKJr^)?QuF zb-a2{%;=w!s245$=j+Kv)n|UIgZp%iPW;3BB%kb==AIH^qUH0rrDb3LlL_f;A0>sc z1rBqL@t_NCPcvnyGwTZ0Z*BaHcB#Kvi%CN*r^=FEs=E{Hp5zLB6eOBdL%e8I-A^RM zvyT#!j)7%9|7$nj{A`~`t(Kmcf<^n2UdrD1!y_%zUU-+)uCY=ECC(+g4qx2<@yMpm zmuejZMbzUaW@Us%H6+}2rZ8gfGV3L-HWi<)B)PV&?@;J~4OSl*NBOP^96JueyM0mo z8B~b&{VC*hTWh7rr0w>j-gN~{bCV#}dX?B1ZX_|E8{M#^aTxNcQrzpyrCL5E5gv|j z24?hCfK=L`0YPLNlYk(~y?#$h~(zsI?7!}4qH0gw}!D0&j z6aQ>6;>rgQFvvoAI4m@i-y})1eb<)nt&P}2%GZktuchQ0rywf9a0AY@vm|PFmzcDAQPY;1zp7F=OqDmrSEGsrJX|d~ZB#|v_|;)N&Y`UO zW>&T`>S(tf{NW5S_lD>K9i}xkd$oAlNIg^Xc6XD62gN0m1af?Mjex*M%Ph_En>yM< z{b`e^ARjLM{!5;i*Y_(>2*%K9o(;Lr=5Sa z9NckYMg<6^Y{DEi`gWbn(7Y~;EKdZiL`HOEO9EIN{N7#bbelJgAsA8`e?DCfbcm*5 z8gbBAuh#q%6$S5kYG3GVu6?)o8AEZ^So6RK)ERwb3+lgPgC9fdPFX74R{+?3_uAQ z`6fk(Rh2M#P!Bs!9eBubw?c$AsLsYlZRKC(gi21i-n1K+*tT(YwnrH-S*}*W#-qXl z0d{wPoV!R`2gQz6mB8QC$Y86kD27p_xn;6|r}7jl1vd_3uiLS`6sxzqkRtAbnR)Hf zK)3vM;x290=isWpW*G#ef)Y$Dzq3~$mAWo~E?9Sw8A=D~(Snrq;-2v1eJV_8Fc&JM~br?m}SRy9VxTUdegSP0&fs=1cQt-JT|;p?lxh0`K^L z1r)2~aVWTF$Dixzr|@Xl%PW6(&l0tRw=gV;R4KKj`U;ro+-!MF*AWc-lK*!w*NKebR68fBdemN2#B0ETrw=Gr z8DZ0uJz-9MOYp(L+@|+Y)Qsf{4lyy*d#-T#b~SMyG*xU}&%Ruim1rxW;nKj8Pmgo< zrNOl7T!~GZd+d%-WYon`T*M1!6$~oaV&b!sg$GHSowE0DmyvDE-}L6Y7b7TywvE z0;NteAoyf}Sctn_P>_2=$K8JAes6ECfwoL5&$3v07<1FXU>+(Qh^tGeZP#nl8b5Gx zSR7P16smG%g}DAuYdvxMwONt!C%?+_I9tbF=}l@*jZBWem8i zK^&TeOKh2cgkGi0V0w~h+v=Ycx?>Z&;WdRab-xXpX1sySJ%Gl0!Ut%ow|B?W`2f+$Ts z+C1>fAK!dJ3H}g$Yrp*Z2vgr3b+B95#G~{oh{Oy8=xmXsJsjqg9AJpts zk0ffZJ{79J+H*q?P`+iJ4HDZkP(ssYVndSY5SoG<6~{8gQc zJ>7h1f+tr4X`H(_n8hDUI;E8FRj51K;8NLd(j8baXYi8OHK%2%-E8Q;Q@xAh5v9Y? zrv-tP`7y8-^#lvSnbe8r-PquUhb1C68~m|#hXcw(AR9?jPF=;YCqI4NddY&fExtW= zM)!CEpe0d50&G9B{F}I}oolSFwX_NO12?FCvA!53ZJ5Qxcm4U6*@y+qizm)0FNXdg zhEA0%zJihF?``-_Rs_uSxty}+R(OlXIR9Z@hH2Q)Rz|{lwd^vzvKr}Xg7MQ^$yHWV zCnJDg*AzF}PgR|@+}8QK$DfTeWU0$Q#!_X%6QIN*v}z3GDoTISM_?jX?^!ckHDccM zI5-UEpo+PC*$v-=5(0$aa45z(!`8+C&@6JMD1cdk4Q@Q-oI>?U3Wd;(lIk1Id zep>}v0t21zO7NEZ?h-_}HT;>;goKqmd(}m^s-M9_tSHZR*LnoA-w_(}g7lkEi8Sfl zNhe|UR8`IQ(%n*1AA+YWf8+C?%EuhgxTRa+FUO)3b>VnK*erm@9AohktnI~X3<;Zh zW*qWf|46Mn+;3%|WC`v(pg;Znje*7JlZ5bZ!bz7_GCNUbyGR2|k;$isAcluQ zqvh42w(R$wMHW4=wfPN*(IUqK`kmy);tcY`EsdXLUM^K;6!b;YCEIrO@2BV9+BuMF zj^|pmS`?6eRY2s#qW-r1e{BQl_ zcYC)By_Y4l$s302$P8Al!~M7k5u_F8<*1>&P`9;Nv&mxxczbZ>1o|9D;R|8rE*IrO zmcXSgiu$4PZx1H@0wB5eocyl8W<12_j095Q0qP1lhQjGcmSe2O*AcEG96qd+5(O z&e>hL5m}&f7G;G7OoBXae>;p^3S{0r_HEp3T!hxyYScoZQ ziF7PxgDn98a4auSG3C{-cIv{c9kFtC-R;%KSQaNWAhy}Xx9fPf zc9`3G@n$tH0gcbr|7VW^78Hk_990rn@;65=VfzXUkGqTsd25US0000U_nmEE^5@AmB?oJ3JRZ;ilyo+KNFbXCQ|z-*W$-Q!lAl+_r4 zu6~NxBY=&oeR7Qe+XxW5uhpT49A1p9JT&A4|9?wqX)V|G&+wPt(8-My5pLBQDkh9Z$r4!m*1HKJ91EiTx&zp#U= z++;!Y1lScn+Z~4D+AvKNKQCZm*9YRiW^^YuLPCEz=Yo)8cY72`!-q2uMdjMOt75#D;=EZbKbe4Z+aS+|Gmzi7pT2`^vpAvOz}Fm?Q719C1B#d6U1|! z5F2SI3^Vu3mwXa%D*=;pCEnyVr)M$@^R3LD5xlpx${_Pk_)vp(d^3T}DvvMuBv7ja z802iq;VGTi-Sk`_ki*?&@_p}<0D~+TSqucSLyz|*p9E@?fDdFJA9X?kK9K9gH2MbN z1KGzwosfWLARj46#p?7enBV?xMS}9_$cn^QZwhMyGDG}u;&SBKiZH+3T^Q4(ziff} zK$b1KdR0($kSjyXk{s5!8QzD2K&}jNY;Y8&wj6~S$5;74u2(pDZm_C=Tpi*SU8dp_deM6? zbt5J;8;qygjFCM;--;|-boHvBVvt=y9A*i|?S~fQXyI8z2ZSR!Fv20!E)Am5xj{>e ziR>p@$Ucxoi>h8{6a_Lv=_;iZXW^o~h`ur*ih%v9+e|RT4ELbDFVrYlhWjmg0c5b< zB_GJ{B;@;^B_Imqp1Wq%C@pr?=uAMq+z${O{?+)7~Z&ht>t_m zixz9W&M0X`KG5%t3Sr&$`|CJSlr9V8kLgA5_0#Kc3+c))yV?2kfn2Zo6g_y4fXwQ} z!-?;TGR^rw7Co2sI-^HGuKY4sd6joH6F!jZHJ_pf?-7u>cjYgTK9EJvl`ms067UGf zDJ5ALePDsZWVgQObH0~7AEJsS;1Q60I&e$qy``V`?`-w`O1Ab-;GE4Ft zJ9T0czvQjxG6gLI%AASHlQkm=CW}8Tk(Ychd?1UJYW>b93S_Y&VrxWdaT(C;S5ZAN zxa|E_lR9BNdjhtMWCUDs4NL)Lt9e}ldC;IK;eucqOOZNK5)zjGBv!7zeC{QnD#-4e zt38JU*K}psC|cFnwAs0g8&VCLv+jSfw)al`oTkp+L6hXQTA! zE=R}w+IDlO7Ufde1wM&Xin(n?(ArGa3cPB6digHgEz3`K4ccH#wTbsj=6lgg#40H%N09zEIp%qD(iO*#sHZB27$||`1h?q2|Mf4Uq!{h zKf0q=gG>LoNQZ7qWn<_cLRCAZqe3BHfcfTxgm>b_*I##Y8Ya*;18iyB z47SWv2!(l7ByKjNPe7lMe7A^KrNP%uoei^Tkyf3iy{M#wZOhteRlhgY%OJ;5hdqAv z0t0MKI^PsxASIDjYE2;RruVP^L!JyQo$uBAt41X{qHkGUw&$ z*RC;IGMs6vaQB8&)G2<+xhx4@WWg9T=x@DDuu<`7@G_YooHKngxQ1*p6n#8&dbQEG0l^G(5r33fy@Ih+`WD-y(IB z7=EQ0a_wV71T!|PJ&|R1aPj|bRC(3~^6I{l!h$Ix*?3V6z-9#r!6e6UhdX~an>sQf) z-S4VmQZK@du3qrAvdwC$y0hbAFai-tyLb*RD~P54aJSl)U5_YsRTh3C|L4)FPm+Nu zG%m<{H^!Olg3FB>Z?P%Y?Dgg(fLL^Z?2g(RfDyeYJCqS~?}UV0g7p1`YhZM?tRLr=oVLk&di;-wEJY>eYkv+(Sj zI*Za%m%x)+-c|mG7yN?c^fG_?RnPqeEt`cn{+wS>idpX@;6%zL*W}pP*7(?@j)%^IG987sVzM@S3{#~&6A1JMcv%kY9mXqgRT{)jyPJGMQ9erk__a!|-298^f5&v}{AvlpLZmPH z`;VW;tfku=bza@IIbNQ0O_ln;p%=b)zbVtn0|NZ;-S>+S92_WhL>H;R3VIe3&`DAY z>y=+ukRARL_EPpUmaS5h3q~!Fofe4qsa|=%?ILGNxR`^I#Q#;v&1%IvtJmS<*Jg{X zrE0b%U+%~E+fF(D@}`09G5wC76+X)AcO>JDPg#2_OCv}2$MY|^^okYRHmeyNaB;p7 zUkr5xxi%kTvC>ovWCEC@iO;9!0eUpqajQHgj;2)ddsR1wRckil$cbbuob|BO;XAAn zcfGhCeijqP4vE3IVI5IQCcT$G+J*GYi&ac-yb6E%*^7vbRON6ys~peMv(iW}g}Q-U z+o=!9vq%NxuE+#1hZ}f?o+s#OAg67)Ws3LyT;_Y}OuQn$`oS0YcG(=sRsOQ;4AQbL z;x>Y~L6E_$hPg#vsXtnY#1cIL+a<`H`?(8v$R1f?1$zc)497EBL^wzdu<>S zz&w*|tDdZ+4Nb~gODHNo&9%MeMe9OdK0f(=Blt5ZH62@a?Z@j+)C{qi!twgYsQxmi zWca*rJxDNL+E!Fjn~1WSgIu(0{kP;>$Sb3&siv68POHS%)R?c?9!Zt$U{_$VxrjY8!lY zkO^XTX6IOI?Bwnh$)25t(&WRJITDHLd}%RE=g-0~_DYyLDRRma)ttgiyv5C{vt405 zH5S(tWO~Wt7;V$l?tJwVA_OtdB(KD^8)DV&h#K|TN@1l-GHn^BsWy>6UU}It<*+}z z0RLWbFtxoxjh<*-2hR_i=&E}AtJJEtAgkcz=4zY-Zp8&T^ylj-59`Fb?$W6w|B7k^ zg434x8|3f0f3azGb)Nkl$5$&(4MvMXr7U~iO!g897K^3xV%jr3!B z#c@RBB#7A-#XC!7$0EEr^7ynXN!e@?-AU07K-;n%mSgyfN-3T)454xwzKAD!CqW;)-T|e zDeg)b@q3=Pk!m{bYX-7rFM0xU0{f0&pJDRAadrQk5$8=rpVG*?wWeFGToh-R1#+zS zAEn4OQ$)u!%fcT2W7UFLGmw=WEUi^^7XSFbUUB4jTZbU#0n?5js`+8KL&#<=g=OGv z?y?#AdxrTIHMX?116c$A3Z4=F_C52=;mvh*BG82dI+%*{5_fgO=q2xpt99v~hK+nd zbx%+VvvwfY5E53AK>P!W0(%Vgs3U=*{?}HRor!42Pg05|lX+{eFul1O7H?;-a+j&L z@4X6SOH>T}qU7&)+pN^(I_?_m{e$SBRF|E6O|LfPqNt6;}@`n&U`c__4# z$xCDkH2I@}B>)Z0f%F-OVEPR63r3`WD4P3+A>2O%k$$0QLjUbD@d;}-tw~93DNam_ z_EJh1H7`494<(q{JSQu870CWHai%~z;6Z)`rr=9JFmz^$CAB~Q6f7nSjuxciL{U1D zi_Rm!?1x-yAySI7P+&L4>GlXef|`J4s2!jOG{V$WJN%{Yd(kEI2zTvdFN+4x7CJ@E z_a>Ng%Ct)v9mlcC;zE&UTgbMtlE-0>-(%@mP9ghAHuP zf?4wQb6yYfVdUUGyLaDK+fQhW6?SRyYHYM^y(Xp!hDCID=-zcGvHsVSVCINNqLX$Y z@7i#ohTBU;cTP;ktvH97b`d*bVk+}co-y|3m@i1PK4elft6}D{E$yxiT47{FPuvpO zzvh=o4~aDT(zxWN(8R4lh*kDbbXV zJIqyI^7(3q{-GUkQ)FL^Ah6kj;>AglNzUs*{+B>8f`#K=JYT?Udq>>sI3p`QZKJTp zQ_KfyED&h&!-VF8@le!ogju{&k0$RZ#L~(v%DC?JATJOOVT~YhM@&2~y5t-sG{qu& zR|4yv2wtz6kKr>@is*)U zRh|?*0u!4X`dE~!@x&3#Zp~5}g1mk%>1@(tL5ZH4vW)lHf5l;3ipnmrxJR-x%t=qK zMM&S)h?*G(3*8Y?o@lEFu|f#ilS!@>f?%dVp%L&$TZ;6>-<>y=ViWnL|7hY6Y|>MY zhHdbAhlz*|@EZH`UIN)|EL_b%Rx5n0yQ#X-9*+zdW5>>2Un_ra%PT_q2frfw`$LYE zx!EHF5D+ab$Y4oo4st1UEZ5QG?mh^=xx1(?1d#qbqt%VLmvm?^Nw*Qq-`3Vw%|O=D zvA*(v`r8c=Lr*pj4D|WW_Bb8}xnbW{j+NR>w>WVMxw5t6Gk-Uo>7&`YNS~#txhOn( z4h(YmP2C(%aOY-{`*3AQdo1pFpEuZ{IX-Ux+C1bm1KAl1S<^`8*(kwCyC#QFBtxM_ z0aiIK?m6v%)s|QGD|2yA*^6w$E6c1J4GHpqs4(~w^bEYx#C{&jJ3WF& z8OSVP^0&}*oB9~?aF1PHEH$M7)TQ#l<^a6e@qSzz*4fCzVjF9hnpR~^LDt%Gu|qhI zX+q5rdyG6QM(Z1Iro7nhc8qIcXh;1TS7l8>F4?=GH(l7Wij+G|0+an9q+*V6&}d9} zb$@2Gx&aTh7;e-t)VL~Z3UawL9Ow50(+stJFFvuK!V-8izO+#%Tv5La4s#z;FX&uY z)uao^+$0D4hTXD?8l;GO>ZG@XBUmjYsZ*J+mMRi>tmXBX6m^{urLu%TrklY$1af(^ z945d{{-y*pU&yE^J!d~a!QRd)s>4^fW(iCqm>)GB%zVvjG{Icu=1tvJie%HJ%Vmrv?Yht(_M%(ebvj~$ql`41%Z@~O66CognKEAtx}Vv0 zAp;Z0D$1zNCi)t_kae4`L}`qH)p`(v#mS?~X@6Cbc4rI&gs= zQSCc`E-r+fKMUxgTSQX|&tZ(c>=q+m(nkW5$qjUB^eBBAbKgo8^+FU#?(3A6gFwEU zO7N9ovQwrt4~zc%8e4OZ;-Vlvkc#XEeFYs7_`fdG&^x4^5v0KjVRKrQ9h2`VkXKRL zs)dnEE*(U*r2$nl;8`4ly-*p6J= zL~*#Q-!GoVX#)FnaVB=>oy0zhMC41#C2(DM5B#HpYU_}a4$UKw=XwNWQY*Sp!xTf+ zGwBS4&SJQC=AFRa{68J5cb3)l3#Dgz=pC&tjG2HNBKml`vpWdnYdi%qUydU=l8lxT zyGSwNSS>kLcou0Tta#ifyima-BtQ81D z_sv1JRbq5ZtvX}Sdiki-?AEH^1uAv44n5fuAiK67OYOdf`AaF>Y~S5aY1l&DsG7qU zeB1p=v>Z?xxL z{MHl5*Xs>(98HnoPm8{qyau0TY*UXW57u<<1|>+COhJB2T@uUjeYoh=U4qUrrIu6PhB3O~}3|J&0y$z#cZ3bO6wX%dHuz}N#$GSzy(&MWH^^xu zxaMjLPp$e+6=mR--(OR!I>XhI6Mq~R{&NUzU)Oe9nNMEx32YtHJiS3S^se4F=XYT4 zsjqaDzy3`nj{OiFKAHf(N->$$?ga-G-_(1qo_6I$dV^d*9fv!b4$w=K@9PFKZBO$N+_KGogQlAgE_9qQsmm#EM-tA{ZeRO% zZr5~}tpX$PLyu=QZKG1ga(qHT8GA?x}eeUSWUab5sElckq&8z z-Yc?UtriQDzs08+2|CE!^G#%}J&2;?=MnwHFiktdF_$;fOP>xKB)Y%s8P<+`*B@`< zaDn*izBDC3e85N%#9{ zm~{8G;Jeba-BywzEp`%OXQBF(hMGI#zxjV?z9O?s?`nE2o@+Z+OY!RN{l;McI2?eX zQeAVT7b9Gb5)E&eH7P(X=3i<6A+<#o8RK7QA3^C+n$?<$w&XG$6Ok!4ZdK#z*dZp)AfmHdVAAr z@M2p{b`w2vX3ub^sNXvC16HK{*HDn@(HZtoYZufM&;F?>D5~hL@)4-by*1f6)&CSV zkD9ir4YesU;qcoyc#*DtsAq}q(z_wDkFN1MR(76>zM(N{OL`HVqJCOe)xrsKJbkKm zMVS(*6j01JwjbBW^gxR^%xrZN`t5#Nw-|R5n-9U0t#46V+>YB&Jpr;|PEyxb{g_EA zhw7fgOB^qKTBI%rK`Tobng)d7jKzwuz%abpUiG6^0|?~bJOT0pB(#-U2u^C9OUZux z&w6G*E|<|gbmIAGI`Pc!2mgBcP2BkKO=uJxf*xp$V4*4&{$>lB*!|GR#@-WElf`C3 zgQ8;hqHo&`Xwlw%K503);V_O`?+K9GQR9C~>#sJsA52{C2moFm)1Bn>{yaIqbLt$^ z9!EZX8w7-Qq6m!ux~d*mV>9(RjytVk&uf+mz3_S5d8jT1Vv$1O*d|wFZo519-m7ntSFYw#&k)E9JqfbMclhdRAQrKtjEU@r`R(s^fP7W&p4j=pt741F z&vykKeF}?|U;grv6&I{~YDMO7G;7oxk<_~CY9JP|a=0n7FBY^P@5tW1bt@eEd>Q=w zw2MOIXefrx2{vslwu|oaU7*!CygZYqK;{nc;W+JLow^ajBZ==}N8WLF!m6|1kBaDp z*JCC+#uweZ8FsID15r&#kJU1@q%G=Js%=wy{+>OS75${`qYrJ5^42gZtRG*s`x$U# z`udtGA49rh%*}ZGhCvwIn=A`jCbn9z^+KKG`I}FjAkU!BH`N)Fv|4u2jZP0G8a}$M zv_Xl;U7AyfqQmJZO3Xm>yg-B=D?lIxHO$VwfW?!?Bksx`B5F~PMLo*}-$floszqjb zZ#<$}I6-bgpQ-ftD-eyWqRUg)3Hwd8(8%Tpq%iQXK%tiuME38HW+0Ut7G}TgmmFqr0o^JP&$6H-W3~=$ke@Fi| z?XY0{o#@rc!z*u1!c_-k$1P6PoABt0>{Ksw-5mKOeJfr&y|zwpA!pCD000Y;Nkl3Ip^=L>H8s-+rgn*rjR3<14Zg=6L$l#Yg$-JX%VKj-$?LewOc0!D)>DV~OhXqgRE)(FC(? z9S{xeZZg$$EXrIt+04|5Kz4cEmLWiPuF9GRZ}C?Bn8BTI?~MLJV@)~JymDnuL*ofz zz7@=6G7`wWsfT;$(X3CiPJE0F+50u0FEtyOBDBN3_Ld0Mf8R*WVU*R?n=X_Ll=W+} zpCD#FYD}6zBS#A4f1&9H$zS%rgmb02a=NB_8D4##w08s_7pfDa!Xk~%2g^yYRo=6)CoWT&pYiau434*j3Z zJ$UBNPbJA-&&=i4h&rQ2R2QCni^UL9E4I3u3nPNePO(SnQS~Un{G_k()wy5Y$-^Vx z-+~r+imVZJLJzJpmB(FE8 zi4|p&RzN%QL$*kAbYvIJSOPgqOf!ZA*$Fe-mE*(=!d;$RTOkJReZgHe-M+80dT@0K z29SlK1HJahJEvFU=7+0^GBU_~CguP=imx8pbm0)DA6IpOmkm8b{GqLP-LXd0Bnj4u zqsVzl+A3UL+ZI}hCGGSY7G&qDJeNM_$fm|w&?tcl*_8H{t(*7m%!!!@RwG)`b>s5v z#oPk>4|F4tB^{_VI>_wi$)V(jh>>AUd5mz-lp+4m)~oKm&?yJFeEO=K#S=U4h6dTW zDzmRLd&kMXgrYwM>MIti_+g8ck1F}ZLj0Qf1VRN1CX!Q72&o{3PrS*&mI!4laOGi& zwo+7=jp0Fd!rX^G`I2Z!uf1HBujJ*cc|DcHLcH2^28+y>eoe;+Eihbtg(GY8^D z)F7-Zj#~slEKdh^)fT%a3?h|6)-}&w0kRWjS=ToFl(i4DPkthPl2pto7UFeC!}Au` zS0J#%&~Tv%hT9|14;Ar9RP3e5su*4luEHy@eEqkk#xm%Oegv`Xu%KQ8vJ>W2^eJiA z@12yN@WI)iMb4Ib*~D5WYJ<3XZ@A9>6fLvAy)pWcFGgoA{V>>c#%43eLkHf~hqruq z?3NiPX7{eP+3_}z`6MO3{9Pj!xhGG4jP+Uid%S&U@9oy@a+B#Crkf9m9g53*>|E5D zULjex?k_ZQYA2G{XtSzc;##`1T9n2)kM>lK;|;f zCC9Z1YBcY4AUk1Z*D$^T-R*@Gd@6)vApe|w5c~2^sUfpk>);iVS7ReU>~651T=6%$ zk+iM5Y+8N)9zi@st;)R;WGBpg=AB`VmLiOkMd>(@pNvfxe#de0y*OQ55p_vQH8tk_ z$#!+E8y@+z0`p3IgjQrvr&V1Z!<8W(2_3*!NlhS-RlEG#Ye9Cx+?780qV`ZFQ1Goz zKWF@jlLhCHZOcK1EfZ-revy`z*km@}-lf(;cUpEC0%Gpuhn=UOe`p73gH)b7o~pQx zAXYVkq*sINgn1Z!uA@iMQHrDI1!PsSU>2bm$t7oyE#xBCnuknV7EW2u;EeSw-Gb!$ z6t=t7_yzM3tTh?O15d--NNd8Ke?e~`i1U>Hd#GB2*MsbYnPX%8NRRB@gTv+;Tbt*2<3Z7@rNA8jR_@>Qpmld!&!J8dMf|xt{ZtNo%7)E{(`Xrv8adJ02 z+;y=|fb4{sU;H-EBkQ;FP`ZFT1>r7M&zpp$k5s)wt`GutSPJl=ITgo*EEEW`Hm%&v zq3rLMb$S?s8|f0JQA2LPj4?NP$Ur-i-Tj^^lRce(b$cn!Nuw$XBi7)JXm>_1DbxU;`WGBq*fWY@(-(8zje><&!Vybw}C-33d9|tgd!E#+D zkAeQ>`!BI|!#Z5Nn1}3h=?DvtM0jLVB%eHrsMhU~dm$6uuN;6=M-O7j8w)XfxNED5 zN*(4Mo|y#jKUJzvQZ;oR0@R_ z8gd9+yVZuqkxdZVI1)iYL5}K|%zYd~`**|S$?OTMN!m`e-b)aB>}uwE1F~~)MGN>R2V@7=KlAH4A*-u)_G6H=5^`rYR%5LlRk7hil)Nj0v@vOVzy0(i07 z6-%wJUV&U`b-s}oDta6?=Ms9!+e0sVN)rE^Kl#ut_#)o5gS?Wum6rWA{wHkzZY93@ z@=K*vRW8q!%~IkFuV!cJCCJXznZpb`OV3ksiH6l1BE3#J{&5M_6MI z9!YXB0Jf&gnlK!{ZFd_&t+wG8(3czqaxpup-LVdyvazlwBxHOwJMBE-0b1 zL^9LUkBr5mv*shFvnZc`nXSkxcI#Cwv3JjIL`6xC@_CV3m4*{Gl zu{qtd`#^Rf@~ufic#uVSpHz)Iq|C^>3!g>9urS;=Rh82_Qkr&~ciyx+@bJXDar^DJ zyUWYx!u~Oeyd+s$c*>%nH z@!NCgBFR>G^wCFMwaX5y?9s_Wg>c@Jj)mFzlK2Cx?Z@jB3KQZY4{K?2mSa$3ukxby%t}C4`lJO!p;<-GdULB z2|>7?puW~s(b<2!4KwF0L5r5MBYa8dk@&1X{d*;n4<=y6iWNJl6mLI%ZWJ4^_)*lH z(+9FlDQ-V4M3CS7C==|rm|%*d<;@X}egDn`EL-ptK3KC&X3g3Z+xOdl56u1BghlD; z>BhZ(Lc!2|AS)1F<)Yitgl3i!3=jnSfL}NLXXv`mR`hxGpWjHfe5lbK`n4#snDB?q zF02qSp0_Z^OAXETWV5oqA zLBq`0&YJcLSe?|CG$`%|;T~y!OMM)d{$~yZh{yz$5@{A7j{qLHMmd%1+|_SF;br7mv}zL&6KS9e`M#*n z-s1C0`yop;fZC2CZ1huoet7~ z6_iE+UE7kivMn@_PfC}Y_4?;zu_&Qdi304&G$Wp^J&j^gN;QoS7V{Y|8L@qHEFMGG zuJPJDU~lOa!+D%=Lcy^xU-mRY*R!oFX%w%x*{&7Az-d?_EVg{P2pSdf(6p<`p*fLc zIfoGk*_I8dkS|M+$BYnKS=!Ti%uR5w6m*>1TCh*{r^h8v*42e`-&{az7&2+>HfrtT zo!OW8d18@((;w{$`Dr$Zg>sv%s|k91dl7p!7LVl2Uv@U#Kb+}OFnKKa#rF<1sJ>V; o_&>4%jnJ9G;;*LklyKVf2Vhv|m37gG>Hq)$07*qoM6N<$g74SbQvd(} literal 0 HcmV?d00001 diff --git a/assets/img/popup/fifth-step.png b/assets/img/popup/fifth-step.png new file mode 100755 index 0000000000000000000000000000000000000000..7e8fc6539c8c94434c42220c63d39687b459e7a3 GIT binary patch literal 29113 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/img/popup/first-step.png b/assets/img/popup/first-step.png new file mode 100755 index 0000000000000000000000000000000000000000..9402f1d2ed4a6db54d6358ba6c7530a4cb8d463d GIT binary patch literal 29846 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 IM6N<$f`Nsu+W-In literal 0 HcmV?d00001 diff --git a/assets/img/popup/popup-new-shortcode-plus.svg b/assets/img/popup/popup-new-shortcode-plus.svg new file mode 100755 index 0000000..35e044b --- /dev/null +++ b/assets/img/popup/popup-new-shortcode-plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/popup/popup-next-icon.svg b/assets/img/popup/popup-next-icon.svg new file mode 100755 index 0000000..57433bc --- /dev/null +++ b/assets/img/popup/popup-next-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/popup/popup-prev-icon.svg b/assets/img/popup/popup-prev-icon.svg new file mode 100755 index 0000000..15457b2 --- /dev/null +++ b/assets/img/popup/popup-prev-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/popup/save.svg b/assets/img/popup/save.svg new file mode 100755 index 0000000..f4ffac4 --- /dev/null +++ b/assets/img/popup/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/popup/sixth-step.png b/assets/img/popup/sixth-step.png new file mode 100755 index 0000000000000000000000000000000000000000..c1f6f0f7dd28258dfa56408283040cdab668ec97 GIT binary patch literal 57709 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

    &Dx&-f!t;_+Uqhu_lZw1) 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 P00000NkvXXu0mjfDNSRy literal 0 HcmV?d00001 diff --git a/assets/img/skins/agenda.svg b/assets/img/skins/agenda.svg new file mode 100755 index 0000000..19fff57 --- /dev/null +++ b/assets/img/skins/agenda.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/agenda/agenda-clean.png b/assets/img/skins/agenda/agenda-clean.png new file mode 100755 index 0000000000000000000000000000000000000000..58bc0359d5cb66d80e78a2aea28a18372fbd74ab GIT binary patch literal 7097 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ξ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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/available_spot.svg b/assets/img/skins/available_spot.svg new file mode 100755 index 0000000..dc5bb53 --- /dev/null +++ b/assets/img/skins/available_spot.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/carousel.svg b/assets/img/skins/carousel.svg new file mode 100755 index 0000000..bc14656 --- /dev/null +++ b/assets/img/skins/carousel.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/carousel/carousel-type-1.png b/assets/img/skins/carousel/carousel-type-1.png new file mode 100755 index 0000000000000000000000000000000000000000..342aaa2b39fd31a1c28c04ce67f85830a9aea364 GIT binary patch literal 18418 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 Z0RSxbXtpj22kQU;002ovPDHLkV1hY6dDZ{` literal 0 HcmV?d00001 diff --git a/assets/img/skins/carousel/carousel-type-2.png b/assets/img/skins/carousel/carousel-type-2.png new file mode 100755 index 0000000000000000000000000000000000000000..e2e3dbb5b804117a65efd70efa1ce27ca9172ff1 GIT binary patch literal 15714 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𝔄GlQ7evq< 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 FV1oVnEt3EM literal 0 HcmV?d00001 diff --git a/assets/img/skins/carousel/carousel-type-4.png b/assets/img/skins/carousel/carousel-type-4.png new file mode 100755 index 0000000000000000000000000000000000000000..ed989923304b4558c9d8c1bed85842b6f9c08f48 GIT binary patch literal 10993 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 + + + + + + + + + + + + + + + + + + + + + 02 + H + + + + 15 + M + + + + 32 + S + + + + + diff --git a/assets/img/skins/countdown/countdown-type-1.png b/assets/img/skins/countdown/countdown-type-1.png new file mode 100755 index 0000000000000000000000000000000000000000..822f8f80ab11ca7e8e2e5cadd4c8d8e0b62dedf8 GIT binary patch literal 2066 zcmV+t2<`WYP)jOISnRY%M{-tK0Bg(kL%;!M5(yAR^HU%vNacZ;#Z z4m<3y!@oki?YIv*+|A|3!@O=@0g$EslB#R;?RAYDrlBvf>=LJv=k2iBuEm*(uAd# z4ETUNF-vSaVJl-qiBcA4m1|vHUY+*3!>+Zzu^91*X<4@A`xbZ@vA_g!er$oc%C#i& zhM~xbo?GQw(ZPwIOjG-6Z`l3kb);R?z!eAHFY(kBIl2nc!>ef0xd##Onet^d^na#e z1f>wyG76&TM3Tgr96EMq)M`c@Q4DfHQj!Du6+{NcWF9=*8?_oyM@q4PhjzcRApSU= z5%=K7$<%m2jJ!18y@V4lV8L|>u<$8@e^Y+BF4#4h> z$K#xBdSH6OpkOJ`irKHMA=w8G6hv4`rR^0&3h=x!rEq+K!D64ognnkhi572pQ@dt& zjVd6~+B(vMPaZ?rn!~kYL@7eY9w?Ik*)v)ND~B4_g5J?W$B#no*NCw0BwyM49hn3c zQ+bc9R>br8uMSKyMZn+(I+GA6yO^)U6EyWYA_IEAr(-0Zy45j~_|YZ&_~x)@X20?< zHnH2Cx%}gSB$~Wl)W(QasR*YrMgr@{h>URK)PQ7al9944dmz@By&#P4)YoV}~j>pIs`TrdlTVVI3w278ECp-32_Vj@OD z0O|wqvjcDpbHil~=R}6`vz8*!eD?fxbaFfGyttJ_I?uqhh#$3{_War1M3f>P4bP~D zir`?+X-<(a4wWJv9kXj%Qsh-6$0-%*Py3|H`cuNXBu@m{>O`I!Pi%-0qZJueMx+B0 zM8>r17>}N|Mn-EkYDN3�ZThZzvW-E=Zets0ik+ugNc&wSeErHAyqGK;!}>k-!)U zf`lE$qrrTdFis@D6`|J=b7+4zdDa^CdP5T$9~8-w7u*|~aBH|u9iaia27k%27S{6j zQjv_+Bz#PTBA{7vbFM2A&Rn(p<3wV{;?aCQP19Sch$LINX1C|vB4&G~8*62)c-4YWl?zU3Apgi`nNf6^cL}xM8%ej^H?J z>xk0i;Y8}^T3$$HLCl7W(Jf}bp|{LhBKzu<-O0^SYKXX7+KsoAB3LDW2hUoiIs(sB z9RUW}H#2@^A`-Pk)RJpkuB8e)W-W}4tU(QM*a)=bbc^bhU7|KdwzwPb=jK|=DGGKm zcX36~*#JTjc%~HbRg7S5uV0YhH{>j3Ycawd38yHW68ezRK&?)MrA_1WThvDNVmF7a zWi1S0K1IQ}&mdw13*6Ik(w=&lO&=3x4 zh5+b>aDe4OgC;)98XDra!%~cBNh?<&%YRWVZc^t zR~0>#tF);~6aUWcE7y_~5JH5qcexv1AzJ1Jp*FFNf(k{?+FGz%8zmz1)-q#BmGm;Q zjbQg5OfHaIhY> wd52d=I7K7+#jMqKn+3<%VTT=d*x`S{Zx>ezXGo8F&Hw-a07*qoM6N<$f;BwcO#lD@ literal 0 HcmV?d00001 diff --git a/assets/img/skins/countdown/countdown-type-2.png b/assets/img/skins/countdown/countdown-type-2.png new file mode 100755 index 0000000000000000000000000000000000000000..0195a1bf7fabe0525dfad0908c99384628e3cbdb GIT binary patch literal 3105 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 HIY$2jtDu?) literal 0 HcmV?d00001 diff --git a/assets/img/skins/countdown/countdown-type-3.png b/assets/img/skins/countdown/countdown-type-3.png new file mode 100755 index 0000000000000000000000000000000000000000..1e21c317021f43baea2171776cec0221e929278e GIT binary patch literal 8505 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/cover/cover-classic.png b/assets/img/skins/cover/cover-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..50cc07fd5d3bc366f7c9de7ac4f1653bcca32763 GIT binary patch literal 22337 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/cover/cover-clean.png b/assets/img/skins/cover/cover-clean.png new file mode 100755 index 0000000000000000000000000000000000000000..641a8cb6049e5b8fd6b9928635ca38b0418fbb62 GIT binary patch literal 26633 zcmV(@K-RyBP) zkY(~J4!h;LcnV-}Fh&{!=A{ zk6%9W{!NB_{I9>Dgz)9_M--?N&a=J)dGlX?Uf+P=@0S_!AIM+R^O5y?AZM+R);6x| z6yx}CRVhWZDk~a~DOGDJs#U786g1zzA4(|$Rcf`~qqz&J>>W{ua;N2;!>i&qAE$VU zaE~#Rs%3aD^%Hcz-C$d2Sl(k`+Sen`P*rpPbDRVovKG)O!7t520eIH zHg^pJYGR8EiskLQw{K5oHpkdx>D>m*#epd_%BLaMaA=Ulmt~&&Y$mc8)+L3z)|PV! zmY&M@6nm$4=*Z#ov(hEC9=1L7t2=-)3xjMa-FW%sVO{yBFnZ@ zL6O2~FXG?e)gaFk}>PgG1p% za^MG8(8*IGF&W^)#Ve%Y=!BSAd!OB{LIjs;RjI~;fl__$9c`GNh=a{=_a2rJw)?TT z48`u4A5DtusB>S}bz5iizIK=!=Q4e~n7O;DU<89*`h{1%FyoHOGmjN(<_~G4Hs+Ti;hj7CK)rXvC564R9q$t^m4h8B0;f<$(|d4%c@KtLquio4zPrY(8meu)QE*EAzaVycx1w8rU_g)Ibn@8oBOb5C4~fJglX!~{htd9#-1@wPENj5ub}165Vm+YZE3 zpo#}(C6L1tIeqyx5Z;mz`TPx;RtE39Ws0m#`gXj81K z42NUi>59i|jfokO(GMV$CP~LLQAZlT9*L3XaK+w_EtUI?;is7&E!V@?Pp&S5oJ4jY zpfzn50Lj?(Bg+yh?T-~@t`V@dz8&f=-~kw7EKsHY0R%TH)bSKw$pa=lDWF3)5cF#a+o+hyZ$hMt>lk==jFF@MHF%xWmv&S1h z)Fzb-*{j!FRVG6EQ%mt64}VoR<)NW$ECaMrJEnv0r( zHV}oYBD9ULusc)7ST25F`~I)kb50_**5MXdB`|;Hl38yEyu?5u7pa*SisPtgC1a2X zCA&McU$jwzaeUzhcYN_qw-XV)aPhHWB{YJh6bO6XK6Oe}%6p~zjXJ+0kWK8e#Ii^K z;LRI+P9UEW85Y9mJkRSI@>N=&Hd%@Af*S+DwvvZNyaqeXCv|*)5<}9g+}M##+NoKML^UsR+-43AA&l*R1<*r81h%spq#TFGT}XW!A!bP;J9z^_1Nm8r!Evh_<3mZ`%Z+PLSKQxz7Y1s+ z2+YFWvu9l`c4BxYXXGBS@aq$m--r7RkB8VEg%7SUj1Srs8NK0%B#=~cPq~|$Qff3c zh$Z5|oy6vhd(JjXM?f$6c9I@zEHk;rYXopmROn&EVi?IZn@a^^Cfk5uC;Z7+H(888 z=w@(A55|;ja=s%yRDcMc5!u=+mnc0CrMOsd>=r^Xw-0IW=osTU@Q{wbO75c?0#d^| z{Lz~**L0(S#O}6o&TZG^RZ)iuDBtb@B?2k1T8t@$NGUOp2=*r%pYHo^&#d!EttW0H zfz;_*ISxz!(4IaFRdx8jx1VBm* zX_S^Fhyz6!fm}5kH&Y(Qjb9u3A&T_bkhu5n)9)R-a|` zlAMaM1f}4A1IZd>;o)0>BjYIb2P0VLcRWHTg!mm0!okH?nU z@|uK`UQgc&b`PJy4!NFGbNjYB5=@#x6S8+#idbIeFdO~zulWSM3&r_2>{=~qXkq84 zgFtlx@*YDE7u1`YMl9lP^y=PF%o z9Vu~U-^brRR(n}Mm4&=#S-3_WLCY)ObFYC{Ahp<@_e?hi*es$3M+>9?5sVG%f|0H> ze4wPyqpFmXjVpD00xpgp;#r$m! z7Y=$7`4Bby!5(QT0r}zl1|2fTFg_IPSQ2xhcb&F1ty7~lWBE#o$PMl&)a~)SvnYq( zC?s?|FXB>xyjOcm)t@?g59%XBb6~$2G(%{VXQ~x-3i65|!{Ey0rFKmZvl?)!D}905 zko8&oekjpmTo2!YGn`@z$1(-5w>%(Ix`<_v8Q@bK;gOt)xde0D;>V zzg*-gWFc+Y^ZeYvh)R)dw1)}+54;8_xh|KU08+9UIi_W?*1_~tbW`HQ4g@dIN{B{Ul7*b1mzGtw z{z?hoaU9i$n&XF2Y0g(1kaa12pmqiGaL9??KR&>@66L6z0 zX?lY`YVfE?0HQ1v$%09NG6lo51;#RSYHy5VW?ZqA=p?^Ycn}MY)n(;etOF~S;;`hR zD95r;1SMtvji;?$-4PfdW`m{{BUZPOkNiI%MazsK!AfkM<65{v2&TG_9mop`w^fRN zMiM|$tIFnO#-D2O0wc2Tzda03%O}?E&@@6KbtfCI4$sx#Vs+e|^w-5t2wJ(AG=QP* zbK6M~Egd0JhKKDqw38?s#ZGRke;8HV_?6{ZG8ovqxmnCLwT9dYWFIQ2P+C0Zrs61l z>;@qbiv#6J zuZamMWgG5>B@N=C}RY!Mmj z26_FRAI?teyqOh`<=A>Z?53^v=!itWkUDYpl7SJ@EOS$4<5jwt3~8t|Q${PAQgj1_ zrjwb)@0mD+spBFo?QA6SFqbTML<%Nj|07O3?0j%{(8mwIZL&~|RDQW~!_(KuG zAaTI1&jtjX_kYQpbE?FNySZ#qO3S!A1NKi{yU>z(K|FKW4zEN)Fa8chR%%LHSh4+G zrt%}#(_PbO`hY`1?a)T6B_!v>>0JR7hd>syq&jL^J}Ist+|`>=5{D#q_>||Wwe$Cx z4_l5SaRy@^eFAwf)x|XFr5Ps-r5l*6^IlB8J2M?Hj+@q^TwUmIRE-A${Y{d`$Mo zgY<NSEOsUk0y&sS;5>E0UL^v5xpuq#r4N~s zu5DA|fRPI2DivudJIUeTsg%9t7jqKHt#ujdj6qz7Pus$#mA6YJNw_K#t+f`@kZ zHOhq*BKV)g$}k7TQ@etMz4BcrwQem$0h_S6hobL< zv{jT96j5F9e5!Qs9Ck1A4D+-l( zj{N}$ruxHsN8LIpZ=lKYY+vtrXX7t1@wSYcm0_ovngg~FcOk(fLatig{ZR9)^`Qj> zJGrZBg^f?Qa+K38k4nPn9E!j}AdUmFo=GKaND!${>lCr@@lew>sCNNCuqPTXQA*-k zNgx)@R2V63I1ozch#q|EJ>JD4_Yn)tS|?2EF4d&s&&sK)u?BF06 z4D?^1_Ddp*Wk~lAPab&eb1x$wH3p|d6?wXnqSPtq{GUX2U#^lOe^80)J^2$4r-3ab zn1D#5%9mZE-h>6Dx<&1bwZ#P|{GG=gTPS68XeILC6%P@ReKFm+1QUNlvMy_xaT_U*c7jj0mte)XpQst(Dk_h}XsKBlywXRL~4&>2MH>c>6#h z4Qx*!EqOSQN{(Qpc`*@@h`Hjywx z!z`CwT^h>z$fuW~OA8K>ZQ;ULq#k?{2rHv^F9*}gnEHEH-2=x?EYM7RP{zz@bQm2s zE;TI6vG`Q0l-;;g%z7qM!vy*QGV?Br{zsD)JmP+kNCI(C0Ez0<_KP?+JdTa~4~L-_ zH&!u65tmBA8%gAeJ`h1k%WhT6U1rnI>TBVCy)H@^>Giu0DbB~HCNw4^K}2Z$fI6G= zW=;Hm{2c*F%rUrZA3RhZn4uwU%R&9UT4RPNL{=)&^^&Wkcj;X6C0kyQBB|Sa%ADTc z0YuJ3Z$SLEo69>8u)E$qiBSIo!q$qc{^nTV`1o~;_1jv|i|!gC^Q|;WM4ZHviMv}7 zp^^XzAs~wekgNdQ@0eo#escR>mW*1-TDo?Id?97NDvW|JPaeMl|{PwBIzxhddqt^ z`SYg(p(4BkxqUqza3T5)wFxO66B%;#n&PkVKz&dbc_E|4RXsh!S_O~TaqE6^9g>P* z*29l7i8f0N!hJ#6&3i#0spP!lFC?@|x!nSff<%?&G~@y=Pdr6ji3&1a=DZxsY=*y+=yF_W zhLjSziqMC=hrOI~*9Q_*k2MXQ>l4JA-2Xj}Z7qs0JVmvyHM5ws^Vmh+HZEOf!U*^| z?T0i?^n5B>DannFtpkZ*pI)Rb77$ra?m-S-l4+z$b2ZvrmqQ6EzpL)kwsa)m;V#5mfVN?@&F1lv-}U1vCqaFh6>Gc$RLXz7?`g7dCjSn}q*8|Sz-C4yk%NfGcNNha#DVSExKT?Y z0ZedxYL%f-MZ6azl@(NjiV}Lnwl$wr>IYc3BcO5+48w&8z;Gr6a#F)WrZ=$s@IE1m zptzAsxf@0}b>wcd@(~70rm88d)eJ*+A1~xV23Ks7P21EBd7N!6$~=yiJb30v526fF zqkioAulGi|3HKZScIE$a#gb|JjxzUB+=xcI!1b z5OC82@rk}%elS@#{4Y%UW_!JYn4y5kgZHohy^3sFlaMH(IC#W#gLku5hN}o1 zAOS-#<4iA?VYm!qTl3mIP(5I7qv%a_sNz=L*A1=ibk)JNmhOXFgEO8U6ZssZ8~1Up z?su_kH9qV9)u9A;HW7p3qVI1=kWjAZhLGr|f=t%rC1y3FS%xq%%QoNJnfJ$D@SvUq zi($m)8f-8qQJM-HE@OBCFZ;?DsH0UtIL+Pg?nCeo9cNn|`zV?)InGKF@&1)}>n{Lu zz5b08UqK^yh=p4%2&-AS%RthUlHxFr1BEy)8LzOn^QnM}q*UeTQ1ezKhz3lEN^Et= zd74&CRS6&pTbH!J7w|_Mv6?}N^YUERAfkK4#1v{$g5bIkNQU)E0D?^@b`rZd6f%*X zESrF+ubJhK`#kgXMc_gz9e)@?;MNh4FJm4*_X0e2cu zw)h5ztTrEYFiqg`@fThLhRQYG+gt+&g*NNvjd8g>dGX>t;D2VkLy$>pg}|8fQZp*xQmzq0uFa~u!C*l8%mb`GyGLqYmXC`Sgj zEza3SumFb(ACAP@`h+uO7h(E-1L3D*kxQV*hz@A5rP*57mhrDrwv9j-@N%MP$1zj) z`YuI;jCcGhc~xr(Ajvqb8@EM3-f5h^?U$bSQ$y@_g>OZukvaF^FpPBk^DxkQjf9V= z3>O_go1KeozFg>oBHfn>rmy})&L<#Lk#``_1y;Fi(h`>1N^d!T^slyskB^`6fSm%1 z7mc^FdPp{NXSXu6ty|!bUT0oZc;Ljr%#vVBqzuUGB^z!e?2*shbSXf{iua!!9*8{{(t*Hkq#ltrx5Zf-`nOb?_XynaX|cNe}=N0QQp>Uv809tA)5N~aHD zutX7&qoJxTy;#-?>BL$wgvGOAKqVfO{x$M2aP+l^odkp$vbDC!X1#zohJ7(J*810G zFYT{%AbA21d;|;bzyKh<+=-azO6$tgV)&3oAQJQ#xE+4ph6oM8@D3#F3qp8^$8T9c zUJ@)qLtchzH&eU!c4uDmS;wadn*|!!u1EbN4HoOAGQZg17X5z7mhsW)O84MA6xrBE|6K8bp2Z zv8D;HyOa~IR=8Qi2M}zz5d!J>%EK!&%zat##!AacKtk)q122lTcx(92*3=&xT-L`1 zzupnZy9mg8cpF4ss-fMG+SdoUHCY;Rz497w?&FxW`r5#>xNQf$ni(Kf#HMAl0OI`( zzQYnp!B;#`DWQI*L?EezH$USYc7!Mk83*x@;MIu?O7a{>QyrIuOA@ALj*N(HH&;)s zP-b{897!`xC;`3tgij@aFjLc!WEin03D{S+ zSPw@9>xAd@GaPUt4&<>O{iK{lAmCmMFD84{J#}6Xm4eJn5oX0Ae8EmtVV^m91t1&z zEz%9$n%JrWj>q1Oqxh>_bbqO*BJ0AtG5HR5mxBZOUe1uKZILo0lZvoEi>kGH+hc;N zk}Ksqem_c@t&EAhhf z9!B{`0^w7Q)9*ky*`FBxNSJRe52}xcr5%yYpwL_D^z3UV-=Bt0wrH^6S=N;2XmEZ>%MS=J!;?{cHONwkc{7B zmrA4{NG)9C8Udo~s32cI0?}M!_!}b6?X-tgyDQhONQec5!-47^x7%3;kM2&3l}5v!r{o)#gwZWEF_k^z_JdLP0CCIs%= z8C;DSnt5lSJ=PE?4>W{D6OXa7Wtw5}C<6$d*rLS_|1wQn)7%~B2{XZ(?(JDL2_6I? z)%4)en$7OnbW1m6{?yI?QN8uL)E9;yf&BLG#ZIE(Frsgo!ZR0$5L{em7N-i^vgHea zKoRi2sTxuV$v9-F$Vi!IOQ$+7Qz>)h1yQ|JuRH(X3(VSNtn6XrN+;agrq_=?d2EbK z3_hubO(YOzZ`2JX&x2Bt%cX?-nbhYrQNgC8TJ(a4nBYky0)mgZEk}&6-qhdd)VnV> z%SF(jh|5#<2!wN&&RfoEbQh4P_h_pfNPqiZK%^p(J4wJL4Al<8H}5Str`+XhHse(U zLyju=oYE}EA&X^5pup!YHfE=4KpeY&$%?=*OK$=QR0O~OY>%>z80g{L#r3&WUH9IN ztYi^`G(<%+-{eHbOFjb#?cKEMrWY-ToC3#70K|zjaQmymfmkLk@mu;Df>!GxQV5_R zc*XM64;=A`BRnkndL!y}4RIboijl*A2O<@D2DYIefkPCuxfJ+Jx9j?mlkuDx@3L@` zMx$9*gvIK0p7ojmq)7l$?f3s`@Gk)JTXZzuX|_;kF;x~qvt`QN*X~jfjzqQ{DR0wutwEURa)@{N{_A#aC z@S4FSYA1B&6#De9|EeJp_ib_ODILhGXYUOO+CS{NUO(pJ^+ZcI`fQ`Fn|bt z)(V@Q<^jd2+YSUf08+c`%~Ir|8cXgw87r7Ay!6VxhOvdO%l$QK`#k^%|`bg$8;xF^iEWl`fm8<$g^xf-7Lnr$5bp3-wigVnH&}vIE z#Q>t`?SBG+>kS+ny~N`p2;Z7}s3M(iHsbk?Og5U93gRDP3_H^0k%@G+;WT&anw~)X zj??@Z>3O1tNJuB;Y{0DihI-O>NwNOe&$eH!Ll;1ljbNtC%Z}SRmF8cB03a|cYy%U4 zf)_FkC`{uqkT7M>>vR$jg)_~B-?FTx@BOS4Tx7<9lF>Uv_PsMP_< z-1?F~3>xY=1&O%PYBumN`QzS?#h_Zka=`uKYGUUJKolWkovYL;6`=?R2BPQz45jQ1pV^Eq6K&&u}FM-~YAthvce5+Misgu_H zaE_iEo+@+-oI*!XO5ysHaY`XN%5ZO>j*tsJk1R3s^a-JZ->-ix6}d4bi4anwLahG{ zdPL{5y%HqIwhB|CP;i5Gn`9UjAQ*wXQ;4z)=$;-P{&5N{Ij(E00s z_z=k-oSlnuqec)#i?^4O}#9s<#Y#l zin7K*X$cEP)`H{HM#QV&e1ChT8A>jJVGz4ioWg~ur6*UxbK3#+!=(2V29)!hK%NJV zq5P|=9vjoqxw}3p()KE&ip$7C=IJKphgD(7g90EOU|4etVEG?FZnrlT;a-_Kqa+21 z+EEaR?Vsnwp81g5Ku@@OBd{7FQ_;HzGTDj^v@% zjS#vJ@S>5j;n!P3%+)F*0noMuKmsAsWmTaPK=6^k41YJm+ zN9;gIuXw8`i-i^_#ta^vc(@bUA$$!USg#DHt}dSR=H#Ica7Cpp9}PyZ6A%g45$YQ; zG~FVr)d`id0YP|3e)$1@3_uW}-2sH}u%2KtKtrG({46q9LZU%cxV5teSFX=8uC25= zyt5ze89E{i9&3RQ=}#paVS@*1JHL!k85ZW_%JaTe|CXuW421yb=s;ffGW@KRP#RLy zxVab!#_^mcLm>V_Ot|^Dj z3M(ty#YW-fdyW~$E38hBW+KtJoMMwb6v@|ir&fwje{LjKQd zh|?~C zM3sooPQ?+3M^u|zw_+-*;`@8#ix(J&B)yItg{gf_x{77D=E;F<0P-+vv*Wi|TpUiU z|GFdQoqbIhbEwcv#QP_LyY0Ue5Ut_7>8-gpfXy|vYEwA&Ptels!8IWUee0+i({beZ z-E};<-yF=h8bInTSuBsVVB&UDk>z+60)oRT4ub( z4-dK|%LR~#A&DbNnjsu6X2vu*BI3FBl$%{hOx#L*wHi6`xCzL<%Z1=vcRo;jQZbgl z#e@w!aFwZ1ye*ij0Yoa2;UOkgh@TgGTV^8t+-b4Vtg;b?1~F(oD{cJTnCmHboAKY4 zXFX5PDPJJtIY6c6yoM%pn^~+R$|UQC?jF$_>XCpU;WE$H(hCRQq9|t-9}*AN{D<}H zl!6=q2#=0N&eqGy&p&?q2?TOML_8eI#cwpUBHHsJAa1gW!g(maLK4yU)DaHPtSw2Z z?^=kp(0wRPRLk}|G-RQl{!>7RfZ~&oE*Y4pw}jqQL>6%D`}v`@xHKWskw(5spR1RG z0LY0d)U*~Em*3)_&mDTvF}>a*5LrOE1$vRDM$HGZmd~*3XuPG)-sgA}2<}-fi9Fm$ zejzR<5%F*!-*@zdnsRvsB+2+nNSw$UDTg(*MQ*J_bKEQpcN)av!Ohk-2uxi^1Z3Yk zd35QN7k;;ChWvgn=if1~V8VrD(SJ}ybj$E?CMaH*y*e3d&1y$A{l2Nci%&@?dh1PX z#RCs|VNTj|@NYK*vKhLso-AnN_RX}tm(e1T<}9CJA&ER*=eTBa2?bQrML2Y7iiW-^ zhy$UJhlrp=Z~^3lAl``h;Jd-P5L8j>9XAy;bPl>nqMj^|wyAAdj!ah45P@(WrXb57 zu&Hye7QBcCQ?I_X3db4AcHJ?eFc~bO_&hmp>As~>yzc@gA(ds`agj~3i2I@AKi~w5}myR zae1*2kx+bh^8z;7i!r=Ff<_=j0z*wnL|jFdg{8sXtv$zWH-l{;bepLl3$M=dKFH%N z(;q`79CoPmq`Ulzq{zz?Ef2WePe6bJN}?}}^JR8*K*Mjda z6A)<#|8H;zn;F zSpq;JBW`bAMihP_6B*^kZGGOoiC4* z&m&r|m>oenvXSl9KG08sBlMDd}kud9) zp=ugc?-lw&>iU_j2BaJRe3=8mV0)LD{J5o%Mo;}q>D!qH1xY|Wn^q2;1ImSlygT(V zX+~5NsgRD2WSDBoZWha~429qn^C+xYea>8?03ySHpw@wCdx*=7=m$VBJnOAERH1^C z&LRy>iIGSn3=(xPF8NbaWdNXcZ{VU-glmbH#6pR?csvHCa|Yx$`(7+2mH`MqK65B8 z3$2wWDfA@}L|bcq8jxxHv*!SJvt$ZjNi18Ls-Bj1;Hnhs|1h*1A@8?_s4=ifYe_E zq9xN-eBZ=IHDaFTwzqS3mI5-JSI&iQ#05#fjq1U}|1#&Qu58oR0}E`bO~ zcwCAri5+Ep*@co9dsGluuu>rj0=Ae!+x!)xoE$AN8)aSSHi7(_k@v$ezbA ztm7@&t0uVgDvBd%?(X6BTg9aOMUzp|-iJ>W;%EvY9`BajA13(P1Ew+}$- z=CFx%R8A)CiUf)TBr7rgga2#rFl+L3mvOBiRREG-00|tD(UOBtL{cRMGJr?z8d5h> z5YIfmnznA&dH)id4Knw(t87@R5in;Frix?BBV(en z>o|*?Ye~gbDE#2eOM0w0ALDjEd9>&RKbAP9nF9#Q(2bJ6T}D?nE(viqbn7*p$c&0e z*;e`#@mhDAHH*POB?|+{{rZ;*BF6!)7H^f+1(1|(yz5ECp}!V23$Qv~#)S&r0SM$_ zDVV(J;uVEfDpD4AE^?+g5S=J_OjC7VM+{ZA9%hFc5z$j9$Az|F0zwgxxZ0R2x^3Ou zLg~tJdjuhms30%#py0ah=(}pKu}DL#N*H)J5E_E1JdfY|gWAbka@QPoycOP=_XYal z8e%Z~cixDUTnpyf(q3uEbvizZN%S7UqjQGa!==4}_})_wF;#R3L})X7BD^R?gePaB zFm3M$q(wq8ejwH_#DEVXBGjwhWh0OcrELN!?}eklorf$IM)hzkBtjsFdZbF# z^f5*r=lFsK-|x?lasQO}Adjg3XI3U55jL2kt}0FEszY2vepNXT*;e+1TJJ}dfQU%c z5FFTjWSZ-96?^7{gz=LH6{D<*RDv7`@apU?AFK#$FX=w3x2PQ!VK2oRnXh>!=(=x8{Ygs_ZXu26|AI~PUcTRmbc^N>tW;uEEORB2hu2OT1SQ(PlZ;jpy7l9AgKDyGlMLqjDfL_98-{rXMB6aU;iq||OYJ+Dyiu?zVR7H%Eu!vBaEF_Rl zjw60yTKnB*S(q6LhZ_r803w9m#n`NtaL8nJB?>A}aMDTY;AE15=sEGwSpo=U83AM+ z*KL~44>2wi1RoK!{JAvR?x;terD*&=Hh0#x&eVq_jOfEI^B#&ofL%G zdJP=lF=6#D6~t5dp8`$GEv>u;66{i~T`6Q;?<15D=1tB9*Od0x__o zR%p2I2h6yLNJHdA$m8xP;HhvR88^ zvZ9+L0}-ABCw@Iz>=C&DkbrDE1!utT0xZiax{>^wia<&LQTyom91nrG=D{qatqd1{ zSHfahMXih8)TD55xACL_kJp$(o7k8xwczE%#P&<{fN@2P+K( zqPYDWl`ZbX6)k6~&X5Rh#Na>Ms zF^Q;xf+);t_oyMGCt!fI^}? zjYPVdu#kr^y3%)n4+3&4$|&dZWk5c?40mR-bqPo6ifTk^MI@TclylbwfS)0}@FwUn zoXDZgW4>F&kmP>LrjFmSKp;@$$m4A$L_k1~JRteChDhaqWa)1_7*!I;R9D(&=II@Q z_>3WiiqZF65TZ>WZR14th8p7CL^3GK9n;v{>`D_{9uDLXATF zKJPCA;k5c-J?UH-Ias91|k}q;`oReiJag!B%_JSyxi~V)9LKPZZ^w^ zSRhXY!AWs?7O-LuMSNuMj#*fEN3I-Fc}Prw-(vEa<8Xn>GR3! zaGoPSGs>_jF1ruLW1n=T70%;bLA>R)jOl|!C>onh%+;ND39x)2$lcuIJ*O2QdtMA#$?-s?0@a}SsxCw|g#1{^{5D>ZbxcCPW z0^im(q$WOw-gXLy#(pA@l7Ds-BqBLXQP@$XGgIy`V*T~Or7QXTEPQTXC3mJBG6S)Z z;Oam&UU3#&y~FT6wKg(U-adMtW^^8|Alxy;1}#&A;!aCN7Z4J0Abwh$N1n<_7E8nb z-GLYn`@70b+LeZo$DjNJ@PBmYQ74ig5gB!Fo-wwWrRjv>UfoqBt#k0b0F8iDp4w+g zhYwq|ckr1L{Q}}doJqbrkZ(A&gOvVjerAeAbWogC>Y59B5P>|PJ=6DKcZygb{w?$b z(mn_z`YbLAz)j0C8vm--xz%-*vO|$@6}cD7ig#T&>OVuQLV{cGOLx04Ulh6)8@E(x#u=105L38 zSn{L;TC@U(vcuVUylaQdm8@GS4N+a+ioUW}+a7jK)HurOf`VDztcuxTB*FsYSxw92 zMfbP(DkLU4R+T&X>dIs#6)}UXn^Xf_?18(0c#}$16?JdL#plTbk+6%2ET|+(Br^fY zoJwKp@#IZL+=nPi3F41AR$d2t(orh1V93AiDOw4{h=@tndz7_i@9|YCA5%M|Rd{7- z^B%4yl^HZS<&Ff#3lQomlP`{5BuQ4RCvuV5hW@*rq_9h;FCchz3B*-|S|T9EL#7$x zKE+t|^`shBZa`F9loPRP;ja@TR#x;zhb$LH?KQcR#33EY(s(5;DVRK4&o+t_7qt`ZU66-536knvX)d6C6A;4oTH89j;qpi>K5)zbw8gB_-1y;$gm zOFTRRrpJ79qW#4qVIUSa~))+A$A{5CKm)$;cJ!HQoy7e!tFI?*{}SQ77~ zA=#UDOzu2fKXgEn;>xRj&b6IHNJ2RA-!wSvEnT6{TBc+~FkC}GgeEQM!W)xFsnti7 zPyY!-L`DMw5f8Uj0R?}C{7u-|a3^a-LHMw+P=cORqo*2-Y5e~`vNLmMch#EqCL(X% zM3Be1ANz&Y1n&DZDUPsZ(QGn-cs^&eG@uS8V1IVS=>Mk{|CDrw{ zy3hAvl&yYJ$f8iD$+WG(>W;QlhG%YFpJ?rMMA62u!ryi_B}98i!gYHJ0BjE4mx zB@l>+%rJ3~fdwA;5(Ze!H&AK|2vgMR_^Y?)YvS66;*^PcyfAj{@vVn$b>sV;xg&&FIs*|Ae2C^SVK5N`sR2FGpiL;m=c`S# z4%(v_#6Up2j9!`kckS47xdRY?ow9)x7rvK3db4;kOQPeGn;gB3vtI)U7z7pPT6jyn z0pKSe*yR-qm$v$lV6Fgi5Q2x8VdM1=5UIGV{2GW%0@20)gKuR=m*sRz&nGmRto(2h z$Rr>$fLyGQF@TJ-%?Xx)C>Hw7({wfLu`C)tnGIMANMLvu25ev;1J^CD{k9IgIWKy&A2parGei9W^AZ>Bo%~=3K0{U*|e>&I@ z%xo?H3d9l#P5hx|YrC&Vupl0;iZ^Tw1Qce6kYuNIkv;Q}Mug64WsEfwxvatBE=X*A zL9h7wVO@~OM+Jha7%zMz5P#(|*2&*%6-Z;!tlPL=p`Q{c5~@)Ioo`CL0Wb7%| z0uT}vlBbHDQ61}%>phr|T~v_otdI&sWk~lc5KF`!OGRR&TOcBVpp~ZF?TkQTnP}3G z24-oSy*G`C!H9{|#W+>x>ELm-uG=OIFS!Va8x{4~Z%JfJAY*@}Le?l-C6T$y4QK%A zUyyJohyZXaAooKkX4yz04|Zaj2dq<3=+t)I-#Yo|to z*hpAFGzF8(YiWiD{g;aMC4DOWHV}U2lKX@(e_6NBu#ZxyCIH;)N0 zkZMgJ4G8&rGMO$_69|6b!O!+tqgrT2mm*Tgv`phe8;=~Ek-(6#eHw_+Cdnfl!axQk z?Z6+X2jYK#d~8W%2Zg}?e!HCCq!4Lj9K}O4tX8@zn(9Ls%owUXuOhD4TLT+nA(bMjLBxPC3djm-6E#hw( z$Vw6xh%#R(ggk7Dr*v8-g1?@xeKSkntt2Vyo%MEETrBBp_zegi+?24cp3jfV{!MY6 z|9hIm!xkf&q9?a0L}Xq>5V#-upp;a7DBG%5u9RtnL zG?1P^)HzDQcuDgw{Np8%VB#o(858hWe{d+KOA$ORZiKbNl0;M*HifvIakjNo3&!J) z;hIhdovqJz<9+yayEF5Uc@C}S$VKxQXD=(NC&lz}U9=3QfN(nEa0et6eMB}f+yT-5 zr3WDLB=|v9h-hdII}XHMLLm@cfu@n}e&`%8zUkJF*z6<*&q+YApA%kz&8ojB9rk(?i4isRp6YT=1mcdG;?@{G@cRUUi}|}k)bYkF69Nf3gdwkWB9FmH_-^#7 zA|eb#Cld|QT<@kj+o+Bv~?mYb4<;tmYQ5IN*{VK4d#4%pGkea?F?Sg=j!1|56I z41qX_t9JzG>p0KkMrQ201jL1MFbE!{8Ty2y?9Q`jQ1y!J3|DerWA3exK+?-!xc|^I zT5R_~`T|5V3k77rz&pIiD}@k=&3y>bmm3e5S=ew2%%e#p=U6M$=bqA~WWFv#o`4)p z`dDvo-&WBKAg~Ne5t+_jfU5KrdW8iDw?&o`KrSq~nX#)tNH zh%&1>xOWv03{nmn+O}@hau!+snd4$z8!BQTY~#GS7bZ-!lmf^=_VkJ6q^S^niAcSg z;OrL5y12UQ4>kK@eCH7gS&KvUiY%u&8%UU7XnrL&S)L|EMkkFJh#5vbt6p0U<#!!HKUGpzMYRve#-S#L8NyI!(Wgti^ zLv;FhX&i*1ymYJM3Ij+p#q^vDkmSKDTc0sV1Q1(9VGSjnY>UajC7~Fw~2JTV?lgfZ)oP4h% zSX@^EQOMkiI0J|wbWzEfiP9p6kXqgBLn7FyGAvWad#tiFFEJm4n^-RjN9q@kv~l54 zh6T+G;L=J1Qko13k6sOpTK{g#PHB+1A=w%k)ipcXH>mDIS@%E~*9|1qd4v{A0n%F` z=)KMX1hacK{|2Jo!DhSjJ0x;jNkpR@zBcz3=OW+VF+6n>!^pz?cVz!R&b|SeWI0FL zdo_>RPX)VINLLl|L_|#3TZ3(Mtd7@Du64Z)iMT!Mg9>pD=w!xDi%J#=Yy(Kg5}V|z zKw|g_ObY|PN2Pwtv4B~$!GqB}WdflI2{uh4y5OY>dIr)HNRA-#$!aof0OY%WsgO36 zaChP$Wj1DU(m#E|_wb|+?xg70VPwy>8y8z#(#vQdv@CtdXXV}jyp!GE|9y($EZy5JyzG$3?YXXRJx zM1f4O1v}A$o2#z4!=y9BW9&$HWM4j|v(-7hZ7w)MKkdlI>DA^o?8 z!&^Qlw@a+f++4oaK)M1XMZAdNX*o$J+FBtwDH*#HNCWb*Mg>BZC`PVqYE%zyG7#6X zWs!}c0BN0;61;-?T_M89fa#IhK=O;U*Abm|)BsS_Vwq=%7fO>ncmFfs?Bksj=`ERY!B zUKCPmby>gp1V3=WFs@fX-kJ%=%Gs+R!ZR3@zBh$9mU%uu-qS`OX$nD`u2T>p69Y-h zsAgE=P(ZI$V2vTwW!Y!3p3t9$M9NHuHsWjHB!1=FXJvxBJe)9{jX>N5k?gZ-zC$1k zA$Uq&8i~;=;CUd7pdFPs^%!f^@||#QEMWN)UBusd*G2^1;gCh8oqcSLMC9 z4SdcofV3sccI>uZ?& z2%mEJtn6{z^F`wvVz$nYIz!OaNP$q6J0*h$yv*jB=q%$kL_|O$LGL5)jB=+c1iqvR zWKhu!AUhbEfy85E6q#l<#T$r15G=X%%MxK&e+I%Wj!Hiko-Q{aO0)jHz6R3l5Tq26QUTItE1Z-)Tr^G_1lZ0C zIs~Fm9f}uwLN~|^u<%g-0^&{{{xpDGORcV(S|N!1J^Tiw89g;0((9pX0x4v)O-YG0 z4x~AHYMjlZB(j`ix@|2D@qLK4+GFx`6hyshQQ|^4!8bbOl6|$$=fkZ=OtM^hj1ODCzGI9ce zInOF##94eO#OH!=oUM?rOd!|q?gfz2KV>Hm8WGvqsFq0LTHKYe#8bq>oKpbF(R;XX z99cSFG;z%?3sxM~PmVUD7YY%QJB5g6xrz40Be-qn`S`WOpqCpgQs2H1(LkOQR)Dy@ zB!^OB6n+KLJeC6fu4KJ4R5Gbak#5WLlOPb`l?W>k2k&|I4-1g4Dg^r)tXUP30Av7{ z{{*5*Ypb%E7!x{CAmmZpm7k*O%MUgfEm%c`QK{;B=3MsUbd*Lkup*0{bSOnyQFKnl^ zY6(M!kZB&Qx2^#x5{a?C1<7FLIk%#7=K%A}eKho{L4}HW4aDUxf&58vOp$F(y#!(+ z<{|6lE3-di29gs4NlNFrv(Hkb&v<+C^QmT5)d0ju9)a8|B&BsP906p1(G@TNa>U z_~8w4x>T$CWrUw+kKwa)HG%X0!Nt`1>7@z5;0q$srLDa8<l1o)ED-oot zo+=7jJcxqdQMXTtKyKC1v3vCF6q7CbuNx~2!pu=94iWJ|+9T9(!3;I%A^`pR{*zktZfveR@U zDhzoJHyC&j$jWZvA!%%tSK{mIh(toNAn_bP#{Nzq`2ZhLD9GbNF!F{-WUk%5y;!P=r(}ss`b-XM9lLVJeDR9$B_nvAAkm= zOH^NsFVX%bR`)ZK{ceA`jruR8Heu3zv@$k@_`OaJAt_lQAo9Z^#2#y2l!aPt`x{Ls z2dv7f__tZ^L7tXJ5T9^SdUxAccJ1Gntgo7EZc~m5ghsZY|I%Za%h>pH+IZ0}x+#?Or zzum@CA2iD@Nw8^!Ax#d;K*nQHh-QY!)WTHe$sON4H%DckRG|~dhb%(u&JuQFr~5;TwQk42hFl9rlpGLZC?W-$xqI~5Q|P67c5JkfVa|El7jfPlk- zudtqm|y`LOHT#wOZ51VXz!D?|nCL#6J*@UBbL zF=P+A76^<@8$6oh&&@VeAbpX@ti}eSauhB_n-$UoqT#3S%(C``V2c98>-^OWEmjw7 z3h9eNED-|9dKL=%EYAh!RzUdMuYfEvV(CY!1wc5XwgT}JAP7g;2GOYk(J@sYY9x&Y zi70;zF1$^`O{P4c;^`9)h|3f&_lj&#fs}(3SsPl4K(W$$)K*Ylcv}GyuV^5t0qINV#J47aV}3IQRxG(f$Nn6_#u)17 zRuc+xE+uUP(iw^o+|3iVy&`ao65fgpXU*mdfrv=HU#2@yMBW?!k<6o7m$?9N6zb>E%Md65a?==| z*sX*Vi3f@D*qy5R9!LipdrQPX+-D_$j5nnsKj6<}0p`r2&;#XgU?(3nzwHD>X+x@c zZ}E)S=X0Ra2HCEOY%~TXh&}u){ga9CjqZim*olBO} z@63jEe)S=Bu}A|FSNBgAvupu`J?mz%VAm0m5+^HTvHp}V?}W&SK&p!LnuRw#_Fwjy z=J|ITHn4lCv1Gp)tStPULi4ik-Ft57?hG^C|C zkkAjqvJo2Ov0xSf0%v<>ZK#GM4%#OXOR>|(LKKM3)z8!tP0(wUN`Zr>!J1ohjIF4R zu+}~q?Gnw#qf`x<=upYQ8zTHg3$OJV?yLeyBZwS@h>d&4-u(n*CPWfg;GS^2m{x~M zr{7Q-F$mC-*q06o4$UtU2p-f%>AVIW9v9B)btur`uTwg!nb-Ssl-18XRxuEM5+Z7Y zFptHv7C_D#bE4J+$aW3C4rwj>3X8+q)^FFyLvc)8LkPrH>_f9~MIP()cL z!G)+g8%f_q9qXVP@(}m>C1W+(ogT(c-)xfy{t}6i8-hb{}oC5NC7ju8nN9V{^YW z^ZxJY?Ot-Z$>&b}u91J-c73|Y<~?V;a332CX_GHqPUY40T^?4=vctd3q$csk}iG`}2&nJpiAA%z9?pJvn8+>p7_ih+~P1K{g-xs_4YCV?_ z?r>^Wf8YBw%_V(l3+e1Yyd6R$8(q1e&==>YmD)l@^!iC$kqE5v$5QdQ(Q6ax84LpBs)L058VKJUBI9CFvp({0x^Vz90P zq!$|mAjhV^-0y$i+wSkX=t(~|BL)rc?&IZp0g&D9-mK*`+ubGK(JY$NZr%6W@+CmN z2!#3(`CW_dw@M@{4?kM(p+2CZkcBl3>FLl72{vf-F`~|M=unldg*~NeNUYz(#;qnH zGm|g9m_$XP4~tD)m_Btw=^sS%CQ0uEl1)RrrJfxK+veO-lZ7}7GW3x2?n6Fi)DVrc z((Gd=eTdCo%+6ITRkLiHzFFPGJM=?Clhyw%FMo<_*)^A2bKhMW!6C@;0v@LFQDK75 z;-!z~Fi3fqlK?@OXcND9!*I@6P65(N<1c8j*e`XOiHD8J)!G%fii?*> zanB+@(pwLtB|}v-#WQef2Lusw#u`xGeUHx@4T9&aCmp(?L`*Eq3Lr*Awi%IufvHH= zxL1e($#tZ$6s>s&QYB&izUyW(Iqr|k>t(py#y%g**bm#Z7hTv4+g@b6VpY-WRlfap zyN*+uM3gU=>HR*PVn*O$JT6X$_4?c&C-NP<=-^ipu|s&yWl>I4kxzMhsXR!8>|nDd z{Q+ZgW`d;z51pfQ@byGP_N>_nf096GsZ6A5+qxRRXw_Nv!z`A1kkuhYvx_4j5)h)! zHT7A7h|bW+)`a(&gbHLp+uQ>!*)SEk4&<8JAEPXWyREj>xh+qvwn7qniXNq~WfHSM z<;xX2!0;@WSOp_|rNLjaecGy*C#jn(DnP6elvgCO1P~D;LLjCh{p6q{rPxS|Ip}O& zouU)VxaiZ8``KB0*@(dFcw#ZJ2~rZYY-z$}_+tr2d>S+mZfQOhM2N(_I?tWQC`(5T zI|J<&%iJIj2hxqh5ABeSDJ&>R4U6w0I{^LwQiF){3HR!(??)%?aKwz3lohRVtoU! zBLkSbWXGj86+ps=n8_NL!0yzKXI;318gdmL*G_?4-ho)a3k=Mh%re$o0ub)698IgK zs$qoa;l)Hd!NAx-WsfvivBnc|_>KpWx@wkr2o=;TllJR93>@$Jr|&`J%N6X9=qpMi zfTVU&Wxga1y~#$ku6(l!d`M0tgpijF@SJ`94lIIsP6TEs_@KT!14tK1EdmJ*DFI|K zuMQvHB@!9kVjWuokr#${4YB0=gkBxjfI@zv8+~@r;3SjG?}e0n1cdaZ zpIEyk743P3oX!ydhKA?~LLhVz9xHT%D!*$;OCV#H;MIxXqBd*Ls&XLm+M5qy_EeBK z4!`180KuLRNAyfq(f3_se;WQ%xi?UorO404?lM{Wt zSDGw8)B+$pk6YR->V)=;bX7xWvUqB|X$XC~y7Y-Z%p6GPt4@bfP<;CW9%?2j#ewu5 zh3K|x2vxo{A*Pr?CGeK&*W=yMcXC>7*@uTd5uf>?>law~Xls_@?m{Mq!3`~uD34^> zaTNtpm|fzPlh0>AcEe#n*dy#fK*2|hq8J+DKt}kDfe7f3`I-hoiyKEzT% zO%fi5k%lpRr)J+3L;x}#N(9a;fP{uTIg#=RqzxiyVxMQ`*BwPXi_Mxam4#W1=4*$N ztp^V|bzN~@-Nz%46=_6ps01E|RhdVClxzi44u3;uK#I+0cOfVMb`2pBon?yNTKtA8 zg&xc3K#tT9{O-HS;v%RJPV~6wTo{~3x9J|q7E*}Q#EliPjJRD$g!g1ND>~0~8%OUN z;$GbQC`d$Tu$z}EvZ@$@$ZRV-c+pV7FlfNRJ_@$_V6#YsP{1XI4s~j>UM{PXivo#j zx;PM&5@7@oWs`gTP>SopfO1{M$Tg(n0!(Nx4`?@D;9v(HjMSCj0FXi-BJu_#os)GK z(uLf%x8-%Zx=qLS-b(_dn@;0wh|Ad7kr@w1a%s!Z8W5FY5>}{qL*4sNCm{|(l|)!)v7Pw#{oe;uIuG}nx}VBGRag; zyZiJS*B4;(!-`bZK^=$-GHG2;ASHq&O6q(zCZ#Ttp!k%KLvc6JutEpnWBZ@L0u z1u2khxbrEHgsiqWZ8pQ^u?~~jEC@COh?b2)Xh;CT&OEZRo?X`v+=fyt-j(Wr?Se{> zT1$&{J01a~fb1I(cHxFh@B8(1y;(y;rroDJO>h3&9{F|@HCZArKt}R#Ao&L%#Gyvx zVU2z$29EAS_q^uMNxP;8x=iR1n@Xjxf_}pgMc#AF+#&V zQI9Gzs`$vN5*k7xZJ4Z>q=yYxkuwg7qoA7-#UX|fSe3SCJ@x65|MkE5lFZa zJ}gmvA#P+G2=TlCF%B+X`N_liM_R$dc@+Xl0)%;`k*#wfgQLfbH_?~QW)ufj=uEzXA~+Uw;S?xo-pv)I_*!2qdf|svfVYhESj-EQW5V z_Ot-c7NIJ?+6lON>oJpHGKyC&g{FDRf3<#^Fv{<2>99&Hf zvgXa`K|pu~^TW;~fapGUW&rHDR(|m%P5f1UV+9f#g6GykD$Rt`dI8h%26ZWPAtL1! z$REOk`mvGQ_ItYplP`v~aS#uSagG%VEtUaci8ulXBq@+kkxU@I^tqsL`KuHKQfAs! zwVF#JUwaN6$b{qL?8G(=Nd|;STA@DUgd@Am<$NjAt8BP};y?irod zO+!kyHz?>ZS;~VxL{-FtTnIgiR1<-Wy#wiAfPC-2x8L7<+=^-}_S?;NzTYyOiqpyV zDy|XrWU}O@pe(p_AkP}&Ip1D2qBS7t4MRt5Jaz0#Vw^-=?eK z4J_r^cD_sz#FC4Z+=n<22vr3ym~QxE+c^+6cO8=f$}1 zXvkgS{y+B%85Snpo}}^xAm26{Bs2s<0vqyxKZ(TS!zg*W+eeedLbOFPfrxm+uxbc~ zwJE<3?-BfM^{j3>|t(T%`>KD~W^)sT$IvVC$*&GKFOMN-9fW{dhk6EaD<1@ZJ5k0XjA&Le<;h*vYk&cgr#Q6nDTraJ3B zf5h8pv%HJY)8Q?dJ9)fiMRW*bv z5+;j#i89@-n=H?4X@HDuF~>R|NMeD0a-SQwpXrjc*<7)nGhXExH{%ntFYD+;i0eqO zs5F2M(n4}*N7%QTg3P{NUF9+GTL%LY8j_jnb2-NIvE^>+u$wm^bfCn-OsfEyFGd5x zKa;RZ42h#RA#z*3c2iaj$u*G8l?X~T&dhbt9DsYY*WeNS zt+N_+R1XqB*n%AO6h#lZMOgrn90(DND#l}og?t5i?(|-O@P9spbL^gggcDJ3P9CNtt@8L8h!7Cr6lUlMd3+)H5NCJni0yWC zK&KaJ>CsF7uTtLs|M<$;J2fD47Pv{tKg#2GQ>+-TKV+RLZ~G7*jydx2Wp7eXw;q9v zj@s&7MlYai-F1XHK&96|$P18P`47l1kpGxG0Qr^wgfzeME5Gt9zw#@;@+-gcEB_Dq Y2YI<`v(m<>M*si-07*qoM6N<$g2(+=Q~&?~ literal 0 HcmV?d00001 diff --git a/assets/img/skins/cover/cover-modern.png b/assets/img/skins/cover/cover-modern.png new file mode 100755 index 0000000000000000000000000000000000000000..5b18841d18bc1361e20ec78d6ff67556eddafac8 GIT binary patch literal 35046 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 S>&sRE0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/daily.svg b/assets/img/skins/daily.svg new file mode 100755 index 0000000..b1e8a49 --- /dev/null +++ b/assets/img/skins/daily.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 21 + + + diff --git a/assets/img/skins/daily/daily-classic.png b/assets/img/skins/daily/daily-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..74b0df1ad8736e71aa0e6bf8d11ce99152ea8551 GIT binary patch literal 5950 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-agenda-view.png b/assets/img/skins/fluent/fluent-agenda-view.png new file mode 100755 index 0000000000000000000000000000000000000000..9b7d8c99652708bdae4d4f7e6800c7be5eea7242 GIT binary patch literal 14352 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 IM6N<$f|qznoB#j- literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-available-spot-view-type2.png b/assets/img/skins/fluent/fluent-available-spot-view-type2.png new file mode 100755 index 0000000000000000000000000000000000000000..d6025ea3744c291ea7c590f04411a921e53cd1e1 GIT binary patch literal 21884 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%0A})jS0fURG5m&PKxv7ywvXDo3eQ<*wuHs+*mI@ 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≫lCBvFuCM4lty&|D$0;8}1NX(p2wLdt0OC1$ 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 W0T%)CFe=&qW6)ODS8IgW$Nmp5H&lfH literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-carousel-view.png b/assets/img/skins/fluent/fluent-carousel-view.png new file mode 100755 index 0000000000000000000000000000000000000000..b70b69aa478ff50494a87411f5ef222786aaa426 GIT binary patch literal 17575 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-cover-view-type1.png b/assets/img/skins/fluent/fluent-cover-view-type1.png new file mode 100755 index 0000000000000000000000000000000000000000..49b28d89b51658f567515d9c8097659a5d8e5d41 GIT binary patch literal 28652 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

    #c4``@lN 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 P00000NkvXXu0mjf?kDEU literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-cover-view-type2.png b/assets/img/skins/fluent/fluent-cover-view-type2.png new file mode 100755 index 0000000000000000000000000000000000000000..65391442eaa594bfe4612b30096223611ba00653 GIT binary patch literal 24218 zcmV)fK&8KlP)Fn9%>C)fh*5TyOyM zlB1oOWn^mp|NlK+af5nz8W$KJ9UQW(rmm@^Hd<}1rl2!bYL$(MMPYP6V|Or7WD^n? zdvqK8xjyBK~$B!vL!r7j=#8Xh?Q7iX)QEGR&;}CfsmZPv`bfR6EZ+3M_O)YYE)x- zOK(Vb!%&@rnGBdVD!NI=G&dYs$fF2|l01^v0~wsh8)(t}D0mR8eGvY;A&KUo0CT zorizGjeL@$t&Uw(O))l#iJ7~{)1sWPk&>l)c#D96ls7ZTWgA#yY1=bYcf153=pH;@1;sx zh&@aR5La=8vB6$$|Mua->GMrloGUbe19GPsj;ukSv(E%&wld}f003K6Nklv)(1hVvM9Y4= z7&26}V~QR|?Bw1vXIAagE&AWhXtdpPXdrKqIG%d!!?$kBF7&IPqCJB3&!V zYwBWn3j}yKZjVgX;@gMW=qWXe-M3l1Xc+%~B)$o=mmUQKC7b44;&J756w(MzTx*x< ze|Mb^%D5&PfsL6;{CQs)jFd zcGKEK5XJ$#^#xBd1fyOgifqG>upwwDV(iA~1_?q`)OhkHh=L7-97BYN7764gD1wT| zUc3k%e7TDv=vVM0_!-3iGxOw`%xJaZivR4)&Tb^q{PN69(}kO>i1%z5x$XAIn~eE6 zcu$Rv`#%j{;6EgI16Eh*CTnEB>y`Rgz0n%9{2VYj!Z}b+k~AIE4_vx@Y30b}>2!Mb z?&VgR){h*yeE06z4T5K;YisN4YY5I8h}mtGU;Q82>w@dwAp5r!M)II@3#vx&Be z;AQcDY$D?@xd#i2td#9GD_GEX-{0}&n&iT@3qQ%VYhUnh_^D&m>qlBAI_>!VCJ%``1p}v~l2_#KX%)1OjYZSngnuqtV{i2^n(V+ znc!d#^nNPVxq_E<83y5dLX@AGi~v%yAS{yYpV>**135ESAt4GV=s-LY0O9V8qgX)4 z72=r`8>o^*NCd@CwK~V49-&Au#d#A}KvM1G zmC{P(=rcSQ3$njyK&S-#sR|Zo9H|isqY#_XP>L}`$>}l>ZfmWjaEL^CBvc_=wmFf1 zv*#s{`vAFZ3dC99kcb9`5SoQ9jfDj%;LJthhdk1>m)@COHL-T#n1bHbh&H z9)m<$vxbqtiCP(*6OoAv&2Zp#RVB7kQ8A8+T^58%7BgGa zr9c>jJ%WWChcANAX*QJlKtN(KfD)P*k#sO$AyOQz&SYXV2t-k|A`1i3a~0B!Vy)xY zO;UTk)Lclz4k{+Nc>3$SG5zbOuaP&i$msd==OfzkJ*hEBrW>tAZVqG>Ann_0(m692mNxH4$fPU8Ao0?-~kYYXw4-;n=A&2@`pw> z$05~G-k?fo-9TyBdF|u){q`(!;^o6_h=63e&2k`H0YVd3n}tD-bIM5{4@EE$mghzr5C52lrc#NL+L zPzoA+|HJs}_H6R`;kK;|LdkRmS@1!ys*{C@R~=jsJVV*BfS^K5InaYZj0J=E^??I1 zB51%M4oZHWgLXr+;?OasE`TgqkQ{*si7SwDx$LpjVoj@tXyEye-?G5q3UMF{Tq7BO zu?P_SrVfvHyhH>d;(^FeLl;9m@{!iV6?k1dG15`YxW?SZhZYs)>f*J_B%6~q$x<)!}6dL5X24XEFOfA>_g1V zWo?Ln64nTU@3YbY6$fi@6lG{JjE4fqk^yOsyI4b*gWqg(%!kS&4m6NYy-Y#2dQ;Y7 zR#TP_a^_wOi|b^vGDsgaysfTqgd(!pE(RouX1VN-g zvRpzKWZ{`^F74X2bBTWL4oK3XXapc(3cQq)!X5^pF(xoVupae z0bIow)P`!TQEPNljY&16DW(KTbWPXfAVM!<(SsKe10o7xlY@$4K`(mqB%-&_BK-z? z>BWme5B&;zSvCbBx8D3eGf!rAH^w*G{`W2I&Hi}inc0aupBDF@I(hQoe(Ii+7`Sf2 zB3?`Sx#MOCwI?V;u1r!Ejk`t6*Z z;VBg)BnOfSX|M+mS!d296Dd_Ea7aL;f+SHM$(kt^>Cqmd!_5N@0gxD?K+3@;9@3!9 zDuTZRc_~0#cf+-u4YIHZfFCZ4SVKWJbD@qi0+Q`?)@Wsg;Ges&kRHXL1q|r{5JA9; za_yleR-i~?EB@-~{?G-YN(HBgnY3*TUA0FxP-JYb5Ono1EZLa@5gvT2o{JqpAo3(F zL7*WyxLZ&~aEz#gQ8Xwk)uA9l!S7klPT#V+s1$b{!v_Io4Ff?oiDR&b zEZtk|tgNl_9^52lRF(*W{-F$XH|HdHUPT~cBk|T5GLb0oU=SR(X`3|$Q9XnM4tTIg z8kwOZzfg@G*?;ih{v#+60s+TDdgjuR(Hee zb$#FOdK;L4Ier)Mfirx_+Ok;|K;jG{U(bmSJ6AV_i1uI+it>;osD}vxVUuJEArK}p z<-@K;DugwdgNH1Y{F8H-j*nwP4v~ei=5uc7nnTxzF)W2B$c6_H|D^nlX}5Dk*;tjKvhZZiNu=IRvz0uEgud~wv` zLxbotF)M;Zrj8RNhys}d2sji8flLJ}*NaRm=&JEpzS9 z3Iq;xBJzu*8516WkQ#U>kTIHIMMwaWS01^shu~;6K9$}erB96)MHY$9q>#RW^5EZ| zi^Uf|Xb{R{`~hC7X|LC%uHm>oZtG|#uH!pS7fM#xVhg9ex`$|x^UF)|4oL9kr-%}n zWRSWkHetbGs`n#$q>>;Li3F~R2?7a@Spkz&>WV<&3b7@~C_HeDDihjCXAsK5d<*3v zG@8hp#tXv;QNUtFl?SKO*O)b`g*b&lhA#}!Q=rksg(o#~&xcVE#2PYWZBY+lkZfN> zbP*P@fnll+BIZp9!>~kxo*G1p+>nQ8C-vKP3iT2j5g=S5x=P?N2@M<~$DTJYmM~y7 zUo^#;3xF7O$Z%DhD}-wU9DfGEZ#@Txi{9?KUf1n<4nS}*g34CC%Zm084YCxEqmQhJ zQQ_F+=wS(h@-R)YABblH(W4YX5YQ003lJ@GUEc7(c0F2rtybxi*c9v-f+Dg^*Dal% zxuTJ7?cLjMG+OPE){AmBZcwxcbKopg2L>umHVESV3dGu@R_62+kM*vrs^T{wTel8b zzJr%1i;M9NMAir-jV>ZUM2VOt7f3~bz<>h_{6rj=Chnew2a_lh6bR?~Rr;RX6_DH% zB6TrV1wG`ZRDb51GjdbYt&x$D)`do!ntN$7mMsv7G2p?e(ti<=7%}YukfCpT_vnN_ zE067em!(0L2t;_~qvz5he(OT*fglY;kUVh6zQ85C})@ zflP@H)Iy5IG0dwj(6qPJc+o61+Q*N#o*c{?;cyQpmMWshDdx!H29ST=53wT6W82?l z-8oMniv&VF1grIVfJ{$gY!M;?1bw`M0}3>3$&)BjvO>31FtoOR9RiR$3_>ESt26oM0^}l%S!RaoL)?fVg^&wi2!lKVAke@G23*=ho8a4v zH*W&uFhGKPAqZUZ^y+Z-@W|fA{Cugs_xC7DE%GK6*88SJ(ZLe{MNwRK4;Wl1h6{ss9y@B5s6k3|v2cg~z$x72)m z-)H8XGltWe#T99@fLx(nT6z(}92DijGo3uF4IvVsfTB{?1QWzcQb$(-t(n_byg$W} zdnob(^bylbZ2Gpr3qna(#;3%)WoWhlgpGwQ-nCUA%Aeu z$tOM)buVjOCy=oOBG)Wa1W_O~*SQ+tkRVIP52{?INWg(JNLWE}%)y6)B6X=MzUTxY z7co5GK?N!6oAJQoN-W{X=*h9GVfK5?+CXY5S{UVpc6p2AzTpw0}`+(3>>5} zBUn)}SB9qugN($>kC10=D73mFxGm{03g`0MlA#1fx-LX?eRic z99Q5WLC_KgksFIBNFSS#NMf%9Bg8Q3^SRgCVlE>C55zG1oxhi0TJSXw6y*5D~K^OoCg4j&vj~ zmnv{v3C;)xuYe>_Vg-Q*P4t-GwH6o&SD|q8LhfbDwqOzyM1ttYb&soTC}A)MuU8Q1 z6eVKM=g&U;J2}v!7<*Y=np;lf$wPryDiQ?9RIUdOo*6`9&h_y-@L{8Q+lN$wgH2S@ zm66IhX$0*M9F#Qx5glO=_107^CWx^%;Y!33Z|jd z^~qn*{}8c!G^X*+O}!PT(Xs2g7~XZIa$Zf-t&{nV@n zf`kK-WtC~%Fg*mvp(PnKYR`0wBfM%UZcFwV>@p zj)MA*F2h^vWANA0<#NONRs?6voXH#SK;frYYO?p=kzKxi%a+^g*Eh$rr)JHuaD0qS zuRT;LI1Z&K!oymS5(;~aB#;5Cg1XJP`J%mP|MTbj5rAAicIMHGSM>#e$gG{%*`uH2 z5V7O1OAz!xQpmu9VyDoeMjjGGqHwUFK||iafr_w*04c)j5P(D~Mz%sEpT|EYyBn(| zee@M1=tw|xR%AyRRNJvCH{0Kzod9T*78c7Qk0b)kum>e88 zP*g+cCL2{JGR#5JvBDnP^8IRqiUK!&)4hzfbg2oe!)ND=n30J1ezvGFP9 zx))c$d%aFgtFErb1)L<(CqS=6CYd7RDVQSWeD5zngooF?YOb{)b>;DRZA5^iWZ;2x zc%UK-LL8LZ+N8(OFElj(+@f*6)GvuX4bSj9Qf`-r%B`s7pM0HA? zrATKP@<0TNMFclqx58YKFoP6fFAE@bGXi5<0TQQpeYjk3lh4T_C3AVIn+h!tL@ilrf^b22#p2YiO7zqVuO2@p5ODBNhX(TE0^X$Z z_-!`bGqMqLTeXDF0>p{C^k58xJP=3_2M#h(E_RM;N#~M4gex+!Xfp&0eQ@K%(NS-F z$&$DkU$xy`4iS9taMC39;C>9GLuTNqa-aB9KKI}m5mgX>B7UI9io21FXov!l8Ulnz zx{TOY98ebP>A%@TAjI*w0lD1NbnF<3T)T0w01@5h=$R~y@=giDAR0fW@(d5e3IYk7 zIK;vrtm6F9y2T|y2xR&yfD~gdi$LnC0)xvm-{K`pmekbH<4Z8&qT1;YSu|;?Sr9t0 z25j)dU180K(PP)9m(+1V=*!2!d%AU7ace7qq|6c0v0x!)LCjC-jD^RDvVgzmIi+z? z1m9q=x4$}i;iir~#*ED`K@c7x2zNpl$X}2kPD&|TC=PK}k=^3yt_cpga3TC^1X+~@ zND=n30FsWRX1salE{(&ZBSd0%lgL7VKtzRVGG2o0xEI#!S-=geiaBo`kbFK%3@FZA+f zGJe}wELk!nK_5a4i|Ngw&3EEqkW#vRAGw5mFQVp%IoENBH47k!0{M3{#F0)XQdb7Q zcMe}tv(5~fLhF`0yz11>DYR%&Gpr^Eeq!ONaJD*&-?SzI)~dR+Q2DreU5{=n?mQrn z6q67LZS+zY#PX>r^1utA)xGK)o*_4u9{^V)5z^ z51z!pLskv|>o_102C*3UN_~ix#L|%;P7*c|f6a7&6k{(7AYXYq+n6@1D2}T$n~Y5q z&?$sqLJ4aTia>~BW*}(h7l%gEjrtOUgkmFM)|F+hRG?B>+6}QGj!C638Dv5hlD*M>r z^q3fsCTSGH{egGzkj8|>g9C{#v}p_)jTH#Gy>oNkI}Vf8s>ia$+BBP0tJUX}q&@kq zQ4SzP10ohYkL(y*;Cl(|YbjnO;{p*b35(zXAVPwO#Dvp;b_4nU#vx<1wN`BtERs|& zfItFBOgdQvc^woYaU6p|@K3LuEJEv~zN+%NRi6r+>h=>>8WhI1?rUgo`_yIyjmVrn z!iy|v2*QEnGa!Y9C#)uGiO;vK(A(^b{TV)Isa3z-v)Da4s!#j+oROW0uT@>t=K3^ZaLc!22xKz zcowl7dxL;T76A?*fk9ro)ZU4ax;m+`G+W);+Ilvru?av5)Ya8rUN5x?Ai^NfnOtTM zp3eo3EN&3W>A!!fwf1@M_2jK$DVle`Je2EVsCexJM$#CB%a{BfW?Z+u4@@5|v(-0Ag)g+N43=Suo)S zQF9>aRA>nxkpTs3xJI^#=fvA!gZR4Xq8APnc|<5)i4g_o^gTKB%%H8-F*=iYLRV{ZYV7_A6ux862WDag5E2D1QREU3i3kId z66S#`q`f`~4Hd;8znu&iR=DKKOV|fRqnCAv0kPh)1S@IS9R|XQ(D2Z6@{Lzdfqt)KO)EI;_y~kL{iu56BlQ@ zM;8}|#@`%%I8bXFUA(v0?R0kg&5jkfJMjEZcLOrybebfTf)?Hx05G8|fhm#)BO+cq zh)7XOkfdaSTXI@Bn0_>xzB!;m@;cV}}O41CUqc zSa!RefxGsx{dscmfIY(HX*@0f;SLd>rZ7m@9)d?C5`qy*G~v=~XOn9ukQg#ZG;#<5 zu>#1grK$835aC$_Vq?SDcqL*M4Gswif43B&qDd{3CB_vcBVx5*e|;q8Y%2^>bE3kE z8mpn9%3?Jg0uYIZ@S=(KC~!QpnP)IFK9wX{b6Z%S9^B#_z5iF&zXD zEr5il3in1Vai+c?0?BH!aCThY5%ZrDXul7v&ClCw?RK->y^IVp;kF09{kGPSO2ZBS z5eoNq%Q**<03s4dgxKfKP(-Hrq+JOmOm(+IqSDI(5U2@i+o(xTE)!{;gft>g!BB)O z@&*S2J$tG#{cz8WL8a5l5>S^_wOd|aiUklvtcoUE?O{Z$X%?{#YDIyy(;yJz0SO*h z-ymzmjL6aK)Pb&U$Nl>&g8(wOQnWZ$Jw*L;dQp713*O6 zHv-6O$7+g{c?N8xDah*UI9p#B})7fl8A(Atz8a@PA|)ZC53GxBO`4UBiVTgNmOWc{PtT11R!OM z2-5nAGyGr%0I}2*=jE#u1$vFIZ?!{RR{X|~OUVp~<(w%kyP>+eZpnJ^&>;XRAR?e4 zfb28~9kMG;;Ubx2Wn~`i^Lpp54S47L{(JZTynBE7&YeNb;1ZB|$D4<=V`G1sl@RjC z;o$UCBZv?Tfdg0g?>PM;dL|(bLXtuDx+gNR?+sbe>1COkZncdpEiHjaVxcmnOx;1| z2m_(fp%RBnzj5YOAxmS;5rZ+eKwseNU0p5fZ+!R1wss8IJA)^hYzI>tsv9QTO#3;I zf)J409Y8cR%0xHv33eO)^sQ!mJeBj9 z29b3B!IR2Ew={Fka<+W8I1Nd=^16gX%IX|Qbb46?WXZCzu{2UaF{?@q5|Ts8$RmeS zaX==3u;WWk#bFs8*3fA*PFEMUGQ@ipjq2F%IWC9U!8>*kooRzv%;*e9ebjnECrD%0sfc*k(vZPxsgm_SV9Sa zCvN#3N$!wD-1ZQWh9VqDw0c=C zm%ppOKeqU2T;hl)I2p85G?@-;)Hj^3JZ436Fbo7lc8&`nF%}VPfCLgs>;?C{0P^!S z@9Zqh;a{0>xCUnZ%dYu(XF;B!c1+9q@8t=>;9JL!Uk8!m@+97yqHg*V{h;*!ywGvoDwz{-O) z|Gj(j_wW80SjGb1HP^h$u8+^s+Q;ttGUCf)5U<`j{`T8Mq$o+gvw{-pPufMJ3@<@L z-0YYC@`x~+1SCqmEC7K;7?6<>#H@0;8bC-=9*OOl*;b64;Y2JR*-=Gqf!48nXK1xQ z<#4ggV9fShICjfq`t*Rl`Qz#@r<-iTA&kckBnrrAls4efc3cIM5f40)WyNI;(q!S< z%IY5vuXG`o`v(W^tgX3Ru3CLOwt#*cD9k92FPeU<@u=nPOP=cpT|w zvD`JZDz8kh$ua`S$l)r>mtB6W0RoUk=Tn+Ovtew^tc;IspMK{ZPj~)>OV=$FD~qIb zvF9T%!^L@sH~QXgD0E4QJ$Ww?k<_Ep%hF?CrCGPW4It(Moo~Fif0c*~uX5pkp}%*b z+qs_e?z`ZDh}GB_H*!vEb*yx)mL*jdHD>E{s;A$*Rf^qb`?ss=TP8m#=&<;m&kU@%xjjq?PS${7eIb=iMO&h9FC)y_mOnIy8( zifRt&tfk|qblW7eU9;|6?Cl2!EQcC``bm8~1Vlkkh&*))MQ`KNC3>sXKHpWQ#uCy- z4B3r2KbB&Tf3A5`USH=awPE*w4boOb`a=hUa2x=_m6-Lzqc?7}Ff}(fcUHAlf1Q{$ zG%zrHwF{-yUlS89zuylY-EIdqtsC@N=KRAo(;h{l<Xcv@7K=BX*`~23YsPX z4cLGTfgvVg?Z#6T8N(uKU@F_+2St>>G2UVm_TwGsX_QV-j8i6tVe)3em7EMjzi8}_%g%b+n z)+3L8%z;Rf=zt9t2njOkNJT;sE|IWAbmpbedK7zECM;&t6mTE`ZNUEEufP3wNXyI1 ze=jdCF7}KAh#~RByRW^5j9!BUrn!2wBLky->iQd(i?iujv3ipUKzxgcVq0xw5HKMi zqzVCq^H3NC4|+^qPUHC&f)T<|SNG-34OycHFyFMx+Z$9R^#hOC+l)?oEa9=BZHfb z-6*{JibiZi0}4AtL@Z7O0uKSi*KxM4uCtDiRN>dUx|X_)?3xm%7fY_^&_ua9OFSkV z4yW@?mC>wB$;($31*hVC-AAt#lW#>vE5RaCC;8i@3n#g79;%1f z)D%m$k?bN75lDy#E@frZdRf2$ASFb^9?)t5Qi$WUhKSk~F@ zUHuJHQSC=Hdb`A z$3j}-aIOnBDa3}0K}nIyEaZ^NsP(c+8IcNR5sh9S5JVmT2NDQryzoet%BV8Z4(b$T zzL|LFe0?3iwKmlMaT3R zNL9;}*@QLl-m61hU0wGU*XAeO(8TCy03&r{enz=6B_(}&>ZmHKusg4M-}%nTcQ_CU z$#L9~M)~kVh9L~%6x~ekhIMLbiP#9=B%u2OB4YOse-svgM5&i$|Nd zzWV|6mus=Nj~#86T9~E4^XPMDa12LMypP#IH`Av+i$-F*tibN1rMGsw8*%OdR_>Vh z9}o_qkcFG`2m=wL!bIKB!=IP$Cr(xhB@>aBDXV>O&U=m4_WFTiVuE;dk2>u-d6pqB zqd!BLTwXL?xUeujy0vfL`O7a#Kp+kTmq5ay5RsQ9ZwMHI#}{0meeoI77hk-)M06}Q zF|okG1tOJE>tz855uwtT`X?HV-R^Jz$vk*q6oOSZJ(-4_igV|3XK+vr0}=p`g}$=0 z4fUPvGP7fJetyDX4?IBL0gzFREd->bL>Po50pU8~yK>vRa$nXS0#Zk>swt-zJh1+K zc-GH|5RZ8$7C9uxAIVdu;O8kvuQzXeVf5y{eP3PB9= z2Y_^->@7OFK05E3cLLI10CL|kYSd!)8T1q!!X$tQ9$_H4Jy`1Vz#im4ZVD)!Q(af) zuF(z=@6|4N#04bu=Q~Fo=EBUpjFj?ZtbR`q1{Y=wRr{*H{AHTsz$KU*kH{q#q-+8r zOcD{MS9ckN(|~T3#wF3hlu-LUHcGuL2}s4r#^&axXTwZHkQZF=1C<_0^&(t*)yq&Nj>}EMPxPVB3G^?*{;)t4-tDuVFYC5S=iHm+Wg&nRl&CV}6yf1VboEp$?Wa=`$0hG)EsD{?wRLBcz? z2!L>1Vni;yEwa17A-P0~TpUT*B%hH-nvTi=B$P%{qnAS%58Ss12#9QqP-YJ}kiyk! zYQOi#7iKGP21DXz41nYr2#DP|4j@&PMfn88<-~fO%-&v?!|pKaZ5+q}0NGh%iP?1i zB+uOOhqnj(&PF^1;U+~a=9I0ep%xB#c84 z3Gu)MAV3n%>>SG8)D9rRCeZ8LB26{&6rMvMI3y~)EUC)E)fNFntF@2fBWDeGc}89q z0f|#$r*2H9QHR6W?S>vitg09+Kk+Rr%)607e2cDayPdYza3D_sNQKnM5{upqsyLO- zY&Je^y!!CUfM0i{t{nmnLP84Wd%=T%cnOG~8fz}MlN_?uf-g45n{sfdQ(mc z0U;t$?_~+y!Zs?%L(M5_RvE`>vI<1x@tFpNLZ(crS0|+!a5g?>K=R4~Bq?2Hbav0s z;LSO)f|}Qk!xC*FAO|%iP(;&&h98)X2ai9;v^}?xLVBw|YTue{Z^vl`n91m;CWhSe z{xg4EVW&7?TEy=k8XO*QIlA5VeJ$r(n(_MhqmRyi^vU_lH*Zv*zVXW|fDoo3h#bd7 z2Kj~&As!(h5g}`59+6Ue2uNuhQpnDb6{TJlyumIJvo>Xzr~(mK1TMf_)!B}+a>Oh} zCK)8AkPMgw?DwJTQ^PCrBX31txhgv1GT&${jIFAQg+a`ajscO!t^H z=%7wI`_Ts%FSg)1e;PnO|KRgyP7{#M$w(mFAwsP51r)*|i0rC-rJyANIU_Oj!I@2ral1-acd6ndt=9S~MN=w@?NlY|_*Q(R zWU4U_qfQ$%i&|>Z3bkTu)2c+QU`uO#AZmxAw1ZTk6r>}FqWA(IQ)T=hg;6Vm&glQ# zdy`Fzel-5G*`y285Bux?oO93Ky?Y{vu)IG1qPy<+u(h>r!R<$1Gvb+XA8R;FMfvsU1^_{KgA8(@@5F@xNl7{+4M-}36c$AWrR#7_(YpE2>K(nE?r3e< zv9G)i8f<|R8i4HGqb8sziN3hKUU$OnYlb(fYigRSD=XXyuP5rRZ9@tvCJGaw@Bup} z2{Dgc&tuj+Z1af8q?pAXrE!xPv&9bBU*307lz`LpG;m_*Ja2GIw7G3f% z0vDWl$AVT6iA~Kr`@|V}Q}WK9%iI%zd8Q(T9DC8Z3*X&IK>8Svg)`0#JPjc1r2xpJ zk{2nYJcOG;o1T`N5{Fjzc6ElMjiZ4r5SKG69OP2#K;fCo;()B4_~zkfif~z~kBL zvJtT;hY*s?&dX}z83aHcyAHP`k}f^=lU$=dKhWFNn~1i&(zAQ_AqHe! z@7}LA^+kRJ5W&MoVg~V4R9E-_q^7#k6OOt)Zg=G{Qpj||LApjT5iJx^W+g+G+0dG3 zk;|d<@%s7))+bX)eURmJ4kRyQ^RlAP{d6;KMHpEOVKs*J+x#!S=`Ve!92aSUc~K#EW(Lya_l;RSeH)!g~c z2C!1_w8gUk8r+6TT6grL3L5st!MzO5Px}Jft-5-5~ zRQ~+H-ml*NHv4;AlF0r+I3(<4_Hg5y$L9tZ*rc)&^M*WOHG$f9nCJ8oQ)CjtVFD33 z1mZlzwGlIBA&Zz6G0Wb?<;NhWC#S$?a9-A@pMUX}Y|3i2K-S3z5QCCOty~r+e8Ev{ z;tTuW(q&m=hZH?jkd+!077~#`d9zADdRFaTMaz`+Jiq!&RL)sgN*V3V`VSInGG2L+ zJ|J&}mw<#l5O{ce3ALhmc=(a$1Q3(QkxArwhGgFLqU>dtMkWnKz$67^y#SJZ)>NL< zIgpIy5CHi)?er?}g(NxfRc5DM(IuOmWRrBwrKIG-aT|`|ASv$Buv0Wh;Zzg}KpYAL zkeU;ZeglsJTxfI_7Df~!N9cuX(ZJRKiI#|&9`@j8nO1|iLy$%vRZD64ZETmne$?KwHz zBAK0+WdebcKr{ga*3bYXMFeMe5)f@N5QhMwJuS0}1;od=QGP<~Ay_xIgeAcnBh*(n?Dr90gf~bjc;@ zEqIg2dXd#f%8#aqm2wE(r=FQ!)?^?KI@4qkagcr{BK+(V5z=HJf(Hj;VL(v!D!L*B z--MP^2P+aVjF2Uu0!ZuXRlAWw)_r+kbpD2wYxkjv*h79n6hqJC%a;>w!Gq@!0mSXA z^x?z9bGiUBeF76RiI^6dhqp-S^JcP;C4gL#Byu@$m_x&nYp1etdODCy^s*)cu~;c- zkVSYZPgz8qeH`I(={9yK-5?qV;$T1&%LE|6GYTLFL!m(<;#vkCDo#A?(S>SxbZBLN z4{Mto0+3Z7q5ggUbzg$xKq>(bq<9GK2zx6%UdE$&_z_gS+#o=b;;{rgmIBFykR{T3 zs^*19%$zR7Eb<__CjhcIKS(J(IRPF(GS$mE5(o?di#QY^SOka!5FAYhf+MCwfDS)f zl&2{H$ppk9rFbB-9|VuVK*Vk|8D0R1?tY$K6WqI_tG^3n??)e@=7MF=aon`_4o@PQ z#6bZoA-)1g7>ON>d^K%UWC)#z>(J4T&Q_aplw+JMmq@qKdh^8NrLR9cz?)XO>&h{k|On%2#UC@v652Ld7@_wyry z2Y|4mSF>AX$ciAP>y}hjN7ZH^fea3YB9>(g$d1)LtB}@rLsV{I!u$JQZTPmKeEsFm zeh}sU@R~fx72!kzd#{IzVNVMIDQ5oQqHn?@CXoqs775SG65>Qoz3tQqd7bAFq>!`V z5Rw4G7N5!ZI0S#y90)9;cM}l>N&=A>5D*bS2$A5?4ImDNOV$B|1O&R41i~l=vWr5v zFxAvFrbYpzvlm5{;IXQwxAU8~ha!vbraQFPe-KS@cR;2=$Rc2Y1Og=0E!4?6htrsB zk|h8_N|jkAjua1Cr;sAnB>*yu@tB1dh%g}exYZRG`?u+Uu35ByfAKh}WV{4V5h^}sV}^QJCJ?K9<)43^?$GV!Xd&t@ zT-HY2EUjC zkxd{?_I3uOwZE%t0P6jQX190rZTNWCzI`u~-rKN!WiSB(Y(xlg8rXXT5RVr?r~yD8 zzv0MYH27;$)G~o^A`@}&WmN?b&VJL0|w$Afp6H*urPp-^>n$)fPC1G8x96gXZ2$i1Cl#t#tjgnUaX(Ia#saQ8(?DQ z5(Xp;G-Q#QT9(s=LBPW_iHKQCNhS_Ru)yO4@Se#*U_BjdvnYc=$%ysf2p}9z0r}~t zpXOZ!AQ|sv$v0nl<;}8Y6gdkc*&!nmDl80z6uUD}ltmMI@(Uu7f~-hDlS0ly;4w7J z@rgJKB;6UZ7X|`$ixM9+j6s)0w%VI8nsFHs$s!__B7h89s~C^y3%vtf{R2oN1FP53 zL`Bfpiz$k9htPYq-UN8y{KFo^gQtxO9>nNJUrX&H9EiXH2_mA>ngE335JcEh1VBZI z7Mv0}efF&6;r0a;OeL-BvU_WO}lmVEJ*vPIX85KcKV1XZhc#2p->mZObw zdv{#2(GeRC=`KlffkC_*H81KjCGHx;ay@YrYf_Wlup#Q{42W>Z-AxDMgO(Q=ki?!Y zIE2y&Zn+)6y@Xis=hsaewohrP@gH`K_dwy#e*%%hWU%L$Ril0v(_SE_yb}%Aj{R~lmJNPds(uKZWf(;{d<5|E( zKtxRyx5h0z&FkGRmxhFnLm0a=9V8$it2No}NJED1vRDWRImABy-5)-4*rN=HyPq-$ zg{&Pr2D;wgxpMmtCpT8(%9DzcmvB^q2V9c0hme=c1j1oVw8$G&_`)L`NP4isi)fIL z)5#vRfdy&y><4DgrbgBZEH!f5XUBc8t-gN!&A%=fa`UP<;1Aw|d> ztrGzB7Bv7OJX~=IFraQ!zyw4A5UJa+A9RTkr^AkCgB()tZ^~AAk;QK>@mPGx zb66;EDjsz;k_O)$WsQivhJo(>{hA(K=$wmpKJPC!f@ zQE4rmb3KD`0%SgvKMlwUr{X~z6s$-Of(YX=GP3dh`|saBJ`N5|D3PR$iDmJ%;d2@U}cY_oa#Ab(s2AlF^~VslM31G2yE zaTHtQAACFX4uE95mnB!l;1OA(hLkSFH94rpt+}oFc3Fu_hGZyuD9@%usw}`{2diVp za$UL{*X8zrQae_tz$vkUNFBz7(IUM`le+c6gD?ma0a^X)!j6S12l63+z#n`1U+Np` zsC3tOy)|xRkYtaSN2|(eyiz_P(_jx;RQ0kH!XOmmH93pWYw5h%bMQX>($i0$HcdQ) z+=Rk#5DkJs5&;W9-f5|Asa`Zbz6L-(xMBbJ;ltmLW{>aBd@oBbt&@*y&o8XYicJaD zoh?gs>Z5Z0Sfr{dD|km59>ORLiKp>J288>g7`voD($mPCTjt&S>J`&dOoUHNQ3fFtvltTK;1TP(ZOyeU z!)wOJ7ZH#@4nrNIPmcc|y{x=;O>On(sEOF4t+95ww0%LltmUd>v7j1s*5#<}MXj;K z0)K0cU(Jc-%7Fzrb){-7Z>+9d&W?dWOm3Z0-#*svkB#|TYh@RJ=p2Y<2avr7HjOrN zAmRQlXb&^U@|v)3%MS=;ysZl$%nO8r00;)g>HA4b$_+jh;G@xxCX79Vqgk*f2`EP3Y{Qx#`ft`m=$DlAf$%`FR+<@@srstU5J{OVlUD7Ba7 zMBtCyh&51VTjsZ0OP!&rg0etX-B?~kLkCPaM4@r}SHE{`8uFSseNSiS%OCeGAN?Uw zT~WI&8V&PCqMHoDfYgA5fI(1rW~bcVvW0*Y6ORigW|8TF2L-H)=Y0nt_uhEpRaabC zGH2!qjLC$2G8RcT7#jUn6+qB68R*=#vSayZhtFN%*-{(zxD%=Qqm({qs(Vd!QXGl!Nn>qW5{PgJ z<09;V4c+oNr(gLA19I=ZH(qtsRd-&vWX`-3rtx&bsXziodcYdF?#brb=i1ta?;jpU zv99;0*S%1Q4;e4h~BE3KR+_Yd4=FN0qN4vx->OL-^TY;nzZ3G}WD7 zwN>y1wX&|Us?8MnPqRyo9|1&#+Iy+3xDP;vTA~%WL2XNQB1$~?V37O)AVh>gF|ERZ zYypss90&v|7ZMS?A;x3LoYO8o^;Hh!Mgnrh6<6H($s0?rKkcMxU;-$>!iXfPh!P7x zN{)JSO&f>|FT%&7jqu5qAGdDawl&keESxr-UCRhbN+7Ov^RWne@FCrb(~LJd@6LJ* zLS(JpK*qLMPGz%9vSLd~cG#W{g;glwZQawgYJl3h9Ya63 zG3fJb{hn$pUh={q0*H{vB4APh!6&t>$SURr!E1t8yqYufmW$sY9saLURS$QVUr#r#L3O2t?^6p?eHMhrfY4M|4J z(Vt&$*ep4@^}1our6}ES4H~#8CCQFxm7E(4VyV{!xfm8YERw8QXw0&V* z3LaawU|GJuwLn(w4pq%r)>>9DHZ@inj0uC7KVXV^LJf%j&A+Rxpg^`Ip5KV>xQ1R4oh1Oer8ucZUW8fx-B}ovXWg zy7sNa&2SyN`uAZO!R1>h+k=SL!$;`w2fwEfZ@2_MkvNyeEu!ib9^pv9gBxVY(s?J{ za`6(8Kv>8kBElphpTHeg8)d<8v+Zr$uo#uunB1e$AJ`bU9kYt zjLKKg;6O6m%d%q6|DKV+jIu8_OEal93W=n{ro+iyyA#HHDMF%XUF%cn8juo$*JlP!=+4R%5M=4P5Wf_xpLC z@4=mD>+Y(>`+4rU2T)q~^8I;#zu)Kkd>_O%zRP3qkQj-FL{m(k^NSgA$?}3Ncxh4& znZIi2!LqG}r8TC5pTi+zV`CUu{6Z|tTQ>SK)hkL50I3jg;18g{i;`XOFjshXQKmBs z!T|wE8>$ux77Vg%^}`N79@NYdyX3K4sUSbUgW?2(E61f)KMNEJ2pfcfL~bmLfk0yZ zJ5Wd*5(&;3h7u9cl}s2Ih><7rPO}IDsWD`fmA&=gal_uv_8z1q`~akT4C^X(myNza z{lb^cr6llRAjCsvh~z;ptG9_WokLylz$SU1g_XXd;jAAHL4?be0wPYcvhvG2sC3=- zDC~iXwfdc7en12f2J$BHh}>9~s8QJX7M(ybhxv+#5OV<$29hjxV^AR5>rA*ur0~O} z0|W#_XzcxT7l8DP=8;9{rnU95TtQX~@gUi>B*FJ9EChrjgn2L%3J?^mWvjDgq5}s5 z5xEX&{gHy@1$fKP$|53=VDiL=h>%AB4B;HbLm>fy ztJopQBnF~HK&m$xFuOO|e*TruK0iQ21duLdNq0|wskml~yA7yXl?rnJh!jPM&ZffS zZEtU4AgW@~i$+Y4=;_M}IMF%MSy~$lJMsgs{H#oDS@{tAE2;103Zym!1B4>zp7s`(TFIjDeimW@`JsZUsn1(-ax zJgY}=U?NH)O+2111|z1Eh1`{3U#I|LS_E;npI+vg80Ex2lfgeU7gLH zgM))(hfuPRA-F7JK}&0+WxxViZ8kOu&Mm|TI55iS4+Jo#0lIJb`9_wb06=nbm zQjgey zmwE;~R?lV&K7E_Tg9_#$x714vV&tT19XE_K;A3!pThX z1rdmdq^0?ekWCbjBLEVyu`C6o{l-hkbd`*dlw>_ZW+0(h7pX39SePaP5>G&k1mx}W z-KP$~Ap~R))2zQ}9X$O(;kkGxwxRHm~< zRKdFa*7P+##Y45RNGd(w$+0XF19@XSY9cCX zqGaAg$@s)X)OeH*1UwoWljAPo5Xf#%CL}5L6nnA~pcpA(2nb|9U)J)O%=BIXiU_X5f<0!Rd&V;CC*NXgF=W8$ zCqGYUKvFPvxK(x7{{@#-Z#S@i!ySkfkX9$248qe4^ zzW;(1*X2;2;D;@#rRI9#LH@8256m_(Z~Ol6;o(+~p6Lonn^v$W(RCauNMHvk8t3)- z@G3_yM0P@m1~veJltqXKO@Dm)k^6~>bVzJ?`XRFd`H46H$M{6a#822XAaU~-7?KPC z!U_fiH3~ogLjyn_2h$_L?ddZ4UyzB9lxZpTA z*eNgkh>%0@Jsg0$8r={)^M3o*3{%%hn$$Zs*ojMquXN+tAZ6C|=UiSJjl5G_RNj(m zv*1=s;<1+=d$eyqrVO1t3|Ac;ZQ@MVa5PYY)M{N2zKqU6&b<#tffu`gfC%YO0E0sW zM06m;L{fR?A^N!3AYmBG0*^o-O|yl10)+Xa!CP4=+H81CIu)1W{krg2OCZjU)^LsM zla*LtF5|(a?$*NuWLN-s>q7UTp1018jMTrp5wTr?=5NK~eTyyLfj$p<=HJt^aKHVI z)Qir`4@XC*M~FCZqNlHE;6A!+R1pz}2Bd&CAzyiULAhW7v*3+I-;q3YAk2i2WZ$oV zgkda;fy62xG*RKz*@3W_NB|QEQ&2Du#b0P&q4Q7PNqo@j?Wbi)m%1}rThPX$OcxL4 z>1^&Pbh~W3cVqCqstU_oR_@=Idal3E0v@INzlA^pxAU~npnYqfh!82QiG_lN>l#|Y z(t(H}_o5=a^H>Q-I*Ea>Q&6jI`AnIPWdT1p(|KXkQdwm-S8W4~ZFow|Eg$c@$z!DpAT)1uwD~vE zkG~y8%dG2y%=Bpn;exe{yM$__q$p=a`jby)W;WzsoGQTV9XBA1(DnhA8$yl7uN^TIiI)D>cY}aJw0bypra!MWV%7xM53=qua!8s zzd?n{;kzSy-6KU)lNTE%r}8r;5S8SrgU%ko2C+i~583vm7cvCW8(AR=biWV@0D_r` zv*4IX1X}0X4Y=wS7>3+Kb@z>-jn##FJon|EII)8TAh}xr zq;m11>lbaY!5uNTh!_Y4 zlEjS0{-Gg*2|Vf^0FbW1(^$)I$8JdQphf0$L1a(v{zca>NyT+49>_vhQB1pD3xj-n zXh4sUG*z*(aoP5E>Y@XOK6EI+IF_enPE9u8N0U=<2qb_I43g8yL+@k@Fi}8A(@NI8 zvC#@hC~5fDECzD*$M=I06DC7P^vF8VpO_1{Z+fNk$*%o&XLK z;efQqg>Sfi$%ZYJTW%Qb@AHbGEf3@!_^1W_^iE{Dg&m?tIu)!t%FnVt)RZ{9Q%?jy z_B33aoI-z{B7;j7^8gSg0x=N)kxJ7%f~uINfP^?funAo$kl+`m5`t%lV4#UHF^~k4 z!H~4TJ!CK#UK<`B!($MYJp>Nc;_H_zS`09^Jl5}Wjo{IO^oA$deceKtex$w0O&U!cbqWfKNT!pzA{~=c9aEE&7vUOw{=fkOT&^S#Vp1SH;t#~fNCXc6!N(Oi z)*I?rmp~E;2rAZ<8br7Qhd_rQ!{G^i01{F_>={EzNhWt)o!k9-*VumW*Z~?OYU`3W zKm%abE?Tl-El$^7eb3Nwy2427ZXe(D-i6+iKODWVtI5JZmwMA@qHH-y%!G$}3jju_0h=0T1QuVkl=KICBt#X9Euw%V zUM@oLv&%b#`sLVCv?*NzjJ%jgmvrshO-Y7Lo8GB&58e6k+C9u-2lqWH>49+K(fWH* z7wyM8p=s=|!}3}0ZLgt~=?f1XJ@nNG9-6z^-y!!R(jQ&16Ffk~3Gslg7+%lJbQU?C zMLATk9QeV*FTJ!7e_0Eo~-{kk%|kgn>ZuJW3l}Nai3)h99K(l*Sf~MuNh0pr`Z+55^jI zox8?8(74%B4<5Ux;iv}>JP;U2gih@K7217b?dTaS9*-ay0G7wkjSlsbLA-ufr*Ko} znsrWvL!~sB$SEZ_I;N)Z8i>uz)AHfJE{Ue@%P`x=sN}a*d2y>g%^vu{{J1QLl&x3D0^ZmjDO} z&(?X|gy%GDebKbw&VkKU#TZawAS~QHc6(6Htf!DEOd=Vfl$zP0bUrzj2V`GmM#~y2HKUVyg6+6u!${!&Lc17fy zZ%W>HqhuCEVV7^S|EbGL{wHH&0z`vEO8iZH%;IPKKTdx&CPs8-qp?Bq5RLy68W+D( zMdNQ{9?g~fL6(-{I13zD3~6VbkwD^em{U+`6lV-8hMtI?BaCDYN^lyG<`f1JhLXiy zn;=N$z>qFgx>Tny#PV-x2_Vd5PO~S8igX-92t&m>LkUo9h&TOh#ujwH^q)}&wO@V< z_;Qv_`#DSD2(v#_;bP6e@xPb)2!hhUF+5bTDMim|hPa`th=hlQ@&|C>?Z2jIwT10B z2Pn)2Q7yM1M56!Yn^M?*b#yQoY7djxC3N@?`Xn-99FbtbyCU-6tY6^~W8gQnL1E^i z48r@|rfm$v-yLCPp-3}%wPX9=@2W*b=i$Z?NCj^S$J{P=g(5;YSaVQjA)i&wmpCnxi`XXQWboP9gai{siq9DFM&C!6X0x002ovPDHLkV1nl; Bbi4on literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-cover-view-type3.png b/assets/img/skins/fluent/fluent-cover-view-type3.png new file mode 100755 index 0000000000000000000000000000000000000000..ecc916e69a74022df65c30db703d84dbaf5293e7 GIT binary patch literal 28785 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 VPY0jbpNH$n+CiyZCOq29I)C&+7po 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 QsQ>@~07*qoM6N<$f_W+m&Hw-a literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-daily-view.png b/assets/img/skins/fluent/fluent-daily-view.png new file mode 100755 index 0000000000000000000000000000000000000000..08232252e3c60e0534e47601185d076295a45c21 GIT binary patch literal 10355 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 Rn(F`n002ovPDHLkV1hK&%zpp? literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-full-calendar-view.png b/assets/img/skins/fluent/fluent-full-calendar-view.png new file mode 100755 index 0000000000000000000000000000000000000000..c5ae7f1ba45abbe5302d384926f536a3a524e5c9 GIT binary patch literal 9123 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 IM6N<$f@l2V$N&HU literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-list-view.png b/assets/img/skins/fluent/fluent-list-view.png new file mode 100755 index 0000000000000000000000000000000000000000..8b27224f5408ddefc5c1971d7c2cc84951e25022 GIT binary patch literal 15353 zcmV+<^k-0AP{`1{-H z?Az(?>-hZS@AS;v;|dlP0s#T!@A1yvF9%cc=P}N8W$7&ybOVWf${P2*Vx$Z?(Vs}yW`^G&Cbs2 z?CkaS_8%M=-rnB7zrV-F$ldh%6A}-#wYcu}_tDYO1{ogo^z>t6XIoiY8aqZvMo1Sn zJ`pfEb82bP;pb{)Wno`o5GyjYvazVBs4P)fAVW^CuC6>eJEEbYR8v+>Oi?8xApr;u zr=6BJS6u}V6a4q+o0^-Tn39#0l#Py%Mq_9!K1K}Trjv??jD&$9+^w3Biz-S`)$#a1 zKSDGyG8_>Kh=_=Ka&YhV@yg1|Kv82TC@kvi`AS)BFHT}tU}`ZcDl$`NtfQW2F&+Ek z^Rug@@dbVV0Ci1maywpdK3rpEeu*kaTUZnVMGXRNh?FWdI$L#md_pa~=JaTActm4& z=kfJ4SZ&Ja^1s5!HcnIRrBTc7`BWnlEf5G085@T~9k{y1>BWgwafESBNT}lUd6byD zn}}9RO68L%=iSD_xUGGjqs^|7H9u6QthP^CVL2TWeJTjt#-&tadF!@rvEc5<$JdLP zpoVK?`N&!LwL;T{G`;4+CXdVQdzqOR6tetLP8XYO$^Wga5wa>w@ zripxXTv+y{Bh`Bp_3`ET%y&~dI!7!aqSot%w6D{takh3f-{J6$ySDGqrjdAX)YRna zxHSS`StB-#^llN)2qJ8(#*ogj9Kk} z2d(0wX{@@fL=K1+fEB z&@0};kR~jM6^Qmq2j0T;SE{feHXsNCFIEB)=3@_%+5%pzwo<}e>_IRGi4TH>x!8lq z93(D?%s~W)bG7@HD z4}vkC1+nrbcyHEVQhiScQt!Zr`auA_eGiHU-q<560*G12gy9l|ml^oq)5$|x0D|#! zNZ5nWz0ZOSbE`1OH5?1TZh=&>3Kbh*dpOKlyZak%|9zpgx8E!RNfhDy97H$@Atd*6 zc*x9_4Pb!Nx^+y=2DrvH7{*$wR9%OgN_O#sqmymbDBgN|xl^u5Mym$WZ$X5JggHpG zV~pe(kiy5t@#mKRZfC7<&>0*DdwUyokia_Wp1@!gyg~Q$dP~Z}(YF=QrOP8}^ZQZy z5*{+AQ|Z<%w-S`gHHa$rTixQQ;aip;Snh{9MCqemw-LCW*ZJVLOdXy0H&+U#zWvdaGohnT7d^hNMaId->||U_d`xCJWMvl!cWGaYcfQO?c1@!*R-vVYqdeR4W-^7maPhwvDQ3 z!A&KjrrU;N!+ON3Alj|=idL!{`u#S#Qh=L4xvI7n;| zH3Ff>k0}Tt9)oBc*XcAZ-n)h(<&(i4DkjMIU=;9ONz_ z3ev_R5e6d=!ZGnsloSVv50X+eZMu%Invm)Gp=pZ7LGA*g5fP1gFj&;*u0Rxp>|Sn{ zfEOoet1W99IcPUmBbe0iN5EVs`x&v`M*oV8{7Cy+lrWuaRWLYH(3 zvc!wg7=*-jLWIeLXk(D&*Bs;rJ7HTq+Xtc#7GGdM#vI;q#+^W z6OyL=oCOaMRxG3*0z!%)WV#TD2naz*2nZP(I*eFp8kVdnOI9BdF*J6R9uoILY9Ry& zNrI5^LJ|-ngs6KV#t6bbWDrsqekGQW3=@7?kvI%rnS>-TXNej+A#pAG7Lp`St4~7O zoZ%rWXdujWArO(Jh--n9 zkoY)dT@!)`zYs#5Pe?BWbIMvAgcO62br3RDNC85y6H?qLAw*ZUkml8(d=!G!Lk1z~ zwS>@@G6KqGx(}tPB_#iNeg5b?5t3R7K^2l*5u!BRNu_e8I$cJSkUCP#Ub3F|`puIi zD@l)Dp6J z|D(JVa)*SVP})G}q++bWgUQTP zJiF6+CgjEmAz9Vp(X_o$Ed%FteR{ASA>gLJyf4 zUne988I2POiGz^2C1mlHU%SWDvp3?Qa#$;Y>Yn6cQ3LCqRflXX@?)Li{;X|Igmp$Fxz#ar|*ALf|w; zj6~Yn^Uhm~ORw*?Wwo}Y6I)y98{jOh1VoC(f`ArLCR2O?83tbnxGpkY)J5PAjD{B- zBnCw{!DU3^)M1Rq8MmqNEozLvYb&DjrD#}>r61Pb^{yj~&%V#^dHP)YYh*prZ8QBhG= zR#DORYp&mxw=FNPw6t_!;K2rw!{i1`Mi*@NL@`D2I~>uVV5>W11xLly&I;qeUlQOr>+fYIf0xoZO`L0}oH_Ai7h#WBQzuNX8J zDQS*gujJCKN=UpyIxpL{EwA9#f^8s#F;WLKGz<+jfDnMl0Top;sO*WVRY z0)P>7zKF=L&c~~x{2mmZ*V<7|lU|N)r3aocIy~LMl@b zsnrOyI)P3=as+au5c5f$Sj^Y6DIsUYn~>`Z3U-2yg8H5HcLDYFH`Xu_X=pI;@O<1? zZ3YuLIXTq;&QOi#=i_j5J5dyo2K@oQ6(OfcidN9TGwoIsC1`ZX5rf@@=pbSUP!bVr zObP^e_;81r_!dSq+IhAxu+M54XD_)YR8A zMhpfX2q8Q~eolmHhMd?w0b-2532|64pNQ*|1_>wb;~+tn2%#-5u3as)iEOwnNO%Mu zr`GPoDFM%eltwe3XIJpNPB-#yAw>j@TtgiwS`k1ni>x z-(8denlfalr^+#+JGeng@M*dESN`(L=iPnQti+WmacJ?O3*9diDNS#kss19NjhZe}hQk6hQOYCxuRL+Kk ztU*Y%r6%fQq7`03xgK83a=V5MJc1~kdH&>`Sz9VXv2=t&p;$(|6%{$Z32|%<;9{d( zYOs@LDPHK**+qh_UV+@KmK&S`T#SHq6M}Lxvnx}POf2M6Vy;BRm#HL}5>vuJL;*)Q z3YAL6*Rvxb@r^^M;t~&0)6w4E-qG@o=GvkM3C4%fV&IAVy&TTFCtuI1ZYnM*4#5qK zI76@(agrlNQE=jN+*D|BiToy?#T^j2eV5}rr^(^t)f#!`s~{@tDI_C1J7q)kvd)S( zA=aS4))o=cBgG#q@(oT6xQC1|OfPqj?msy_-J50ZV+sgZ2*q$R4_3zF7TVzQ7<3+< z%W3eciGTt3+XFaAm%tRA~pQ|fG}b-Rrg9$sB; zHulb#OndIkX^IGelr#Y$fDuxzMp3v-r-tM@3q6R8yl6#JNC}mlWKPLc2si_ToVFUG z(CDs{V{!Kx-i_;mmDWO(serpW>u5g)cDTPS2>oRoo()d&RW zZ#e^moVH$8w_B}S?(@~%Ma)clN7@MAc2h(MZZ=z{-wsc{Iaz459`;6}(X;~85)hIA zP8D)NHuF%)WqU&69f#=rCGWhrT_S2=MX-gZ=(I=Xk2~9Bx0Ux-!b9iL_?f%JGOGN|G-O|(2a`^CJpBHA}o2-36 z1v?UwS(yz&bV#VxiIqBmT%dt{sUR5C$Tb2|qmk-@LA7K9B}8MIZJZ33yNdJoEC*&6 zm!^u`E|&#wm=1deebcXg+S{8GsxCPSK6-lgwbw=1x38_Otz3f=z$rpfv$Hc1WP(zW za-^V14WBRJl6;|tl&B=6Tt@MOd`iNKgv43YhkUi8?^L*(@@K5&GmE{KJP9op&tU1V z81XuvdG*t!-W;vRHrUeI3QEAqzPh@an)-o(JVK5Vz^OGPB{$a9qa=T|jx>g`q=v*R zMEao5?O*Q8ahh`Mql=4orZ!;C}X9jU9gdw50ppES)@75DW%JUTSxH(F+&btrB+xfI@il7HTT0|yok zbhqvXA%94Ss41C{^_f#I@;)=VC$!&OThX+*nBOo}>vC0H-iBU%zCS!ucEV%8f)cj0()7V+fAVy~7`L(U5kWHD{xiB9>3Unk%sfCK5Ospe= zK|cC$Z0xI#zklVk@4x@-_O%Jg=*qr2f#Z*ef5uGWOxeAAa`n#~*XnCM2~h`_TlB)YaG2&hHP6=JyqQ zdtWjQ5aoA1dFNHG(8d-i@$vB!<8#NF2L_G~PsD_zFy9GFLFp(Xoq3eLDJ7Nj z2O*DKynaG}fA`Lkgv2>8%sNa{DzUs%qqSR!TBAQJtJXhddOO@Zy09>))edThJ13Zc z?C2RA2M!(_KXK@I>%pUgtA%vE*Y(0#FPxwK#;#p&yzs~)?`5tC*>v$EAM9F3A=tlO zTa2w)NaocE>}A=ehJ}<$r|Fj3ZA~Fw-M*H6ZKYXzUR~;)8SWnJc4`-NO%vdwr5?fo z%*`DxErUe~`W+3C*5_2hbE_sm&xUjv)ePXGryywVVYx{{4b93W|em>R$4Hl#1i(|hxS%1x{fyg=vN$uL4n~rEX zhAC*3OwXr;LIoDoDHURxR`F>)_Q88=7SbuRb)S{6>$0F|cM3YScCFQFx0Z-HFAX`S z4$CQ0pmm0xzv+FE-#0kX+H>NULm&cx){9ZHN=RDDUz2t^y1koVSeUyRiLC;iT1)Dr zYE4k9MnaWF#=JQ-7}RlheUQ0UAs*Yvx#uUUmqlqiySt@QtsQ)Tkg~r0;j(UtP^Y#w zIg9&WeCNg4t#{rzFuv==2{7`*4~I@1IyQIc;N0<*CJVdzZ%9Gw#Ok-SWmINYW+IHD zNJ>TuWnz^|D3&2wArs0}e1(KB!*)HLy2f$HBe}A{^AmS%?_jqUun*dsn(WrH^8Wt* z{lR6JId6jNOs1!2M(1aG^F5tMAr;4u|M11JW5<8^;fpVhA3OHt97+@zT5V)gd{2(Q z+nar5`uT|)sY_s}VYg~+Ht6))Lgi(B{o&rK*_ra1bgPxldx<~JqgQZ43n^IPCZF7A#5aBLs&+_ds)ekiT#t1 zZ@$S*+_k;H=Ct$+ldObz1{n^{LY}vY~nVRBC#fVFi zq)JYb`i+^Y*!x1}l$jevi5yCBM#6d{LMce?bq!81{{7)gU zV1GK#(q7iD?A=dj(@+=y@Q4=$ix(jUyQW)hT%|PY zpSZSK%yYAoHLh;!Rukrypcwi`qz4r*U3yqsDuY0q3A1__*m|lrE9yb;Fc8GcM8Si1 z^|Z4GzZd_22+|(ZRQ(R2yz7rI-~00D_jYy(LO}rm3MDZf0}!x)P!g)aVTf$K?$qkF z2eqxYTbo((2arW;)Vh$K85}*~9ZKe`lNs-l)ob?>$E>q6_IS?eaUM7dmyyg3&N<^r z0ww1&8Se}+Yn}31$I#LAU^;#HkN;2IM4h@{q1%h_ z-?Sgb>-Eu5kC@VR1Ej~8c6RYv=^4b*Cw&Nzb`1g|xbskA28bdkQhNnJBy6&5?{qqq zwQK7e8%r3Z)yiJUh@{>#2*j@$&jfP=2*ypg8QAI}#1OcaGswphG;-Tu1ra`TWJtF~ zo#Fw+5cyox6-l~$r)`uFoFXqfkRO%FH|?#hMiM+)LoW}dQf2|!vwz>--7q*H4F5z8 z28c)~=oq#jOCUl+FLEj9CL#`4F++yz>>)$22Y?8QQAC79Q(1*~mY`yhi}yR&W24<@ z6pLvLQh$^?T@p(#6sH+2Sdm3B}m8(D}IMLGGs^ZAVwpi z#xz+hHxjt6mzyu&Ro2$4E5&jFbV}JefV^9j~|lHXoj{Sb@?Fo^Xrwm!=c{0$2{FbGZ%bv#zGYAXtOEXOxJoyzU&67-3hP}ryfNWJ!Yj4x?s z0U=;aY@h71y00N1f^$Pizym-uo=@>bL6EM_R5n{fCzb`ZP;9gxE}R?lWLx#h6G>Id zvROd-r4Q+?r~`-s6ySkHc#ae$0WMj8^t6_JTwYm%a1I`qS3jhOM(Z7?D#T=|mye5o z0myIbL%xAv5k)aXcu`Nq%0lA&v-|Jg-B~;|nM}({%(eaTX4#spy(lD<5~Ya$GvwEF z>KMcjfjuvvz-9L_UL;elJ8dP?+FW}T$dqJFDhQOgy}hapWjnW2*p6{LS0#Q`^nUf~ zVZz3Iy_*8rPyi9%!iGm(_gjYG))0%}U$RivL{ikXv{j_?>#xrU5*!bn=2D(*iW)zf z?VN{9n&9-5IY15?R~`+AV6Zjq3psqOV=9D#2Sym02{~Arw)jFs#AkvG>8+?w@H_>d z;pOIKuea($lb-#aTo(+>GT9-W}b(x~jG7=pQMlKEe z!^a|#Fio&@I2sO51rJ1{7G{K=9W%(Cs> z^Yf941LoOfb$h0sD%tIGGkIMUbB3(#-GGsnK4;B!l5h8%VQ<3ngAvTeD7ik2?&s}UU$8ds}rc>{qKBQ|9k_3wH!blNW zQZ-G0&}7%wbxzE#uTtRg&w+em?|fbw2ckGWR;Uym+(HGxgz2GmlT*z$>86IYElA5k zL_8I}<+Rz0;6Jg@MT(R?ZSQ;X*0c8<_Ae0Z#fw*2*t6f621%QML5Zf)Pw8(8g%5Au zyd;kYAFn1P%p^kKL*UqW@6-JCd!Mls36aG3?w02F-)MLe$XAq?C$c1+rX@m_V+uJ5 z3*jGio#Sr;r(F(w_1S@sX(5!vBB2ZATx%;sOr@%76|JTzhE_8Sqe4a)=Q6q_xA%9q zaw;MON}er5#7MV&>^Khh!I}Y83H5(F@%*Z3RkRzo=Nmq7`s#?k1-PP-g zPBC5Q{_cJ(Mjp+7gm5EW`*7j|86)7Mdek3LY(`|&X=B=4@dbi*R68&-egJm=DYkoD{I&kspg9TMWCiA(0-0@yqv zgbe6_50TIXn?D0WE^m5X-}~xbW8{%{IlL)63bDMNXT1X<2~_Iwg)~{4FI9knGF*T% z6K_}g%B>w~Spk~R3B?2?sz`UmNVkmm}4j}EZ83jt3k2o2HC(-A_rBM6C^)C<`p zg?w}^N@RloO(y(CXtBzR!U-S#&f6|4c z)~p;lQ!1^Zxnov!%x);sMng69ZBuWk8eRFfo{}80`~o42`8ME#>p*k}AjF;#lF8*G z*?XOlM{Wi!ZFEPe>-D2j;|prSgE}!x#Z>B_l!l^9o|ldsvJ|_=aK;B0!pajJ9AQJ8 zb>~9tkPsr*BH0V2-b7m3EDLoZtw?ICV$?L%P-U&c{}S)nkz1-t`%7urWyOn-gUuPx zlPg*Xy8_Xm3j==Y04JaeHvf<}f>IJ7N9SXg6?-Vy_p={UIMZB!;|rV@xe)M!jT6oe z$onBhyQ~E%t3wu~tWsaFh>!>N&MkClFbv}#K~dDGplH#wxvixg=K6b>nI$GhWJ;+S zlqeAdnq<-eq>Csmq`Ogx1+}6mYfw(Igd$3_KO_`kSw=UB71UkOMcve=o$My;B3iK@ zUdT3fv4`hWUz8$`4T-B0GmDg2>7tiXgIc$S>!R@na?{ z3^ITIUruS8s4&2^MaBAGb;$S$Q-Q(&8y7Czru^C~ACR6P%KZ@e&=*9xV<;c`f++XY z<%8l7nW6L$nSsb@m1SDgM{gRt48xvpykpkip{LAr0Oa|dJF4f;O*)m?VKTi`O~N*+ zo-firzw;abbMMLH|A@XI^0=pt2W<-=T<|Dyce5y#g>tFY%^p5-WHGq%s++so=-xfM zD-s-K0%N9v=XI3uNH?q`7l{uD%%D|1UdaDY}5OL6e}n z?@8@io)`1^k|2~?twQd^sh3w?H4Yy*Fnje;*Q2x1?Pt^JboSQL2dP{JC1jGYv!oyB zLg@`UsD<8uAQTSFxCPf)a2%17Lxv9pOZpZNuE2~GUlwY-DCT)swfJ(QTc{k)KE8gO z*sx|bfpV9~t(#VirqYKWXS3PD5tNX}TS;N$(GnPWWL<1E8d;-dF$*j-Fk4s(XIWe? zFNX{#hzGTCgw5weQ)TE5u`G)G{hRF)FE(Ids-!cSyHONf53j!sR;kO^Q`ze<{HU;X zK#;}2VC}^jv2pN~IQ?x`7>wvBqi!+i!GJzm#`0ws#ER1+phtuSJ?Ka{6dF>H!3?TJ zM%J!1;FQ4tXp_ofr`ZIKYprTYxv=jRJRk zc{IXky-)#{-A-wNCmMHA9;-h_0XuMpJuaOW9?Dsa2Gv?x=L~vcUIdD4Pk_bP5P~d$ zuNt2WAQ(K_0U!(<$#CxgC|m(G;=>V0I=1-{d%@uhaVEC|pj zQu#&e&2<=In7a1%_3KHbHr7N0YKQLa)$!}sNOnX)I0Qx1CW1V4jJ~bXd<|qOCG#@ z<$_d|#Qe*-hLTWk7K^oJyC&4{7kR$gY!;h&F+crO16n1W%5o?{*iiMiM&ZD%b~Zrx zaibB8c=aK#ouc%N5yY437x%*PEK5NsqS7wH6Ctk_9?zI{M%+V%q5!}hAVE=h#EY#p zQbqu9EdoyltC*kC`AxqP@0d?YgXt~rD{j0 z)fZOzQt4s-MJjXRDvYDLi*f||-60qg0bd!3uZ3s)g;)MS!p`_H)20DdYh^z}O}$i^otuR#T>H-+pm7jbYsnkh7dPWyGS zxUedg?!7FxQg3dhVMOt$&Gw^YVNUm2B!mO62aF`$Bcv;2$3uYi(~Fjx!B6~=45}rQ z#w{5K*aSWxDbD=WKCT%YXSgfJxlyV}?m!Z?1B7@`-J z2#>6#ds=LqtyA?(9mNds7Rqj77$LIWd24Xd_{NC$1l7#TtW%*ysOd_W4(*UGnKW1t zZ^OKPLPUJ?Z!wela9`+E_FH$?yWEnczx-c*_kVgn$%L?lM+(NTE4D|gxAVn*$Wwtk zH3xZI8Q4?P*cgWPs^-1p<;!5R{0D^mvj}iihMz+cD%cvqRTa}$VP7VnIJlS!x6XPNZF)o}M&y~?PPM}$bzA*zToj+*9E*RPj^T#XNc z!R8k4xdym@)l_l4D)=78B5ubfo8RBq9Bi?%#h8dJTf`y_l>{UZ0>-PL)V0QuBeQ0y zb;ec3Jf+?+e3o(8Xp?$amNFNtaMiM?AySoketoMmJ5u?|v9AJTdZ$ppd#<9%=Q`)T z(*RL&YEScfw|$@goxd?0ZfS8<+weS$SyAMR@Kh=ZNFW441SY!Rb2Khjm7AAGtCX~g zrolCOM6MFD73dHZEt47|@m>};`09f7XAg3y(d#`IprQf2!Rhil{9&&*ddFM!+ASd7 z1(o0BseksYdMiShC1x`_6=zb(Kw_7rNR2K_Y7H5VFoU=q8;Q6nIP`h*yLYbY%F7Oi zW1nDypr{Et>JYjKlf+ZcvLn7~zYPH+gkcLAnWU@~(jn3aF=CcuCw=<7rO>|V{lOI{ z>@lTL?!IWNoV~$SdEZt%fGID(>Zz@$ue^E>x?hYi22Mm)E^Y7srb9+zK@_(f*t~f$ z-cq-^_a%gcB9X=R4JA>h&lhnKBy745Qa+^GfY7Fk_QiD=5h7wNmy|_!N|gwarqoxl z498fG)tS-6uhtV&w%gHx!)5`MQchlTbyj&LkO@*pH_ z)Tr(hWyt?N#T}uCT^v`QTmjJV`y{m@WHjQ>LQD;StMYzafov`EN=Z$syQJ>94!juxHuOe6j zn@Ih;)+SF=?W?9x$+UULJ~GWmJ#u?NU~+znro%6e$rQ(mkjMe7*vJ0btQ=<~b{| z78aC_KfVafnOgUG8bSg{MFe>bV<3bu4BT(8u*nD(tivg_PG`t6fxnJguiX8KPO%7KztbTQ zjxQ7$0rC=oFc33EB657c0?rCGg9olS5oq`Y^ivpi8}mnWOaDifM=-*r)ut@1X_!uz zwaTOgLJa!h15HMwPCr~rZ`++(HDo#v5(jV)`_u)_j9Exw1PBrZBJx%%3j>fNg%)1q zNIOc}mXgxSKZ8oZ-x=Zdf-}_j6>%U5$5FH@b|ROiMkrO|RFqOCHAH%s^$QpasQn=V zaD05r0Xyh703ot~B4xTPi8J*jnHr5|FhG;DBqz3uzX0+5ikyX-<%5?l89aN&(xppt za=xFBLrwiZkdadFfXpJK12U^29gta<)d895kPgU9sdu0wLga{~*N{Qo(>m}AJwii= zj!CY=POokq_=Sv}fz}?KlIlU#wQFnxub&59<40W+juI}C@Fx;4YCB5yzXBLCifR(b5tslPUcTS-_zr&Kb zOa6R9EFr%k#F{^37Guq@Gt02%pqgd$XO^}F79A`mq`wJSuw>Cni_a`uv~>eEP9I0= z^R&;bGnUaM+${TY56k#&++z=S`5}{j1-E_vQ`}pRe3)nNV=rs*LTg{vS1fw}ehsnS zF`PZDIdU9A`ZrQvywaK!tc#Gpm=N1H39*FyLXSfF_8v_7R?AQ#U2u3;*>|HPHnxtfv9pIin-+E@OGCkMBJDS zK*rVGixBvL5WJwx9*01P-ex(w3R#=aqor!K^24nLn66VJ07itgvN1i87AF|Y2qTvo zBR|Cb-KN+se_3{UjMuW;)%%o3Y!0fJ>e~|c#eIRu77qz}Jl;5_Jlftvlf?o8A!d)% zA%q&?xE~1FmCv`JBj0E>rl+U(HyZovOh`fy(_(cZ3llg5ff^A-F+Cxs(;}|rQNqY7 zB+2ANLxfQgh)$$dqbs8wc}i4BB`Kn{6a;V2LT)1=E6HF;_INi(qMJ9nLxI5%rUVPf zp-?Y1gyX0W2r(}qa||JD=LzS$(KR9Pfo$M9O{q5;ni0eULZmS%4I73KV^M;cq#hG&+0D3`y>w+K=aXVx2NmVT4`?zKok@z z#NZf%9mXp<;4VDpejSpWY*;Qufi3 zQY^&?Dfxs=2}N2Rn;plge=8)z8J%8M(@hb=%K8d~gl9rB-GqdsYxUMNqkRcnzI<61 zf*8~aO8Se7qeqV(Gf=VxLx_~D3ep)#5XK}W8Iv|=tJNfQGoRE@3 z!WmaQmmL*DTC-Kgk=M#pbyf@E5swwr2O1m`#vynXfRNCBR`-Mi(i@wNM!O9g?Msb( zXXJ_jP5dqnFELnVb^u#e;#32S#a#Y++%%E2x_BC7Q(mC_o#AW}omaTF3Dg^NW zW+%iLiga(XUT;iLA@Fe#LO}jjy)FQ8qgXsse5h@HYGa=UQ-X}l4k7l1m_KALau0Mge(Cz~ z`r+Xn!#j42*U{+}l;q2E5AUu%y$?E=4W^`0(GnuXNT28wGItG`r%idJ`aEhlvb_+V z9GbMtuAnaz*b?={gPRLsb<1xHS(RZW-Ao~fNJm1J^T6hqYZzJlB_S_frAtq=K31ds z{K~ey+t#k#b#**dF6D&mrdRJC-&wtSBaA=^E=Gd|j-_{#ezCZ7OKw<+(?5j*eni2A z5n(8bsdb3kAM!*za=;$(L{Y4MO9(cSgYC!aNXQ&h28Li@K2699o*LnoEzsFu2=QMS z8L3{of91-R`w!$m^J-n0X$sdwNvVw`ULAD3eVm#)@#w;Z3%hq;C=_;63I+Vm`HGM9 z2_qrKSup3CQPi~$IV@nz`5c3!YGm2sSA7z-0`aI`j@_1Dp*DJclkg?gFgU9_Aca-xcRSL?#%? zI5P|?nZEi43?aabgbWyk9X9k`T7a{CMaK4DWBmJUtFX+l`T-?+{TMJUA;$Z-Xta2} zj<87EEIKfZzy{#Ka;=H(7!?kfAq3CTF*syz9U374mX;1W3JTAJARttSi3wp5F?w2f z>x(G?4hm<{fnMBo9Vj10K3G7^5kh?!LbM(dY84L*DV7)}qEiOlL`$_7FYWUFVm`np X^J~V0u&PPt00000NkvXXu0mjf(VQMs literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-masonry-view.png b/assets/img/skins/fluent/fluent-masonry-view.png new file mode 100755 index 0000000000000000000000000000000000000000..579a9d761ae454254d85a6268de5420cd0c34456 GIT binary patch literal 32219 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

  • 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 S^~PcV0000+r literal 0 HcmV?d00001 diff --git a/assets/img/skins/grid/index.html b/assets/img/skins/grid/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/index.html b/assets/img/skins/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/liquid/liquid-available-spot.jpg b/assets/img/skins/liquid/liquid-available-spot.jpg new file mode 100755 index 0000000000000000000000000000000000000000..620bdb6f7694693b96e1e5f5351950807d7f0e48 GIT binary patch literal 20805 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 X0sPmSetq%$9?Jag;(R>@oT}p=B-~eP literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-carousel.jpg b/assets/img/skins/liquid/liquid-carousel.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9c730675b21f3f6285b2fe7dc6af3f347641751d GIT binary patch literal 22841 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-cover.jpg b/assets/img/skins/liquid/liquid-cover.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b80919033329e14231d8d2dbb18d2df13b9d77b2 GIT binary patch literal 19565 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-daily.jpg b/assets/img/skins/liquid/liquid-daily.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0abeee0cf620e98bc1cfda98aa12941717b2ae9 GIT binary patch literal 11712 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

    iWHA9)`=iJ|#F<=0P#Hdj!|eQdtW} zFfRNcB@YMh{t|IyT_91X1DELeE!NoE_=Xt6lT~jb2KPD*bl@+jte1U%+Iaq>#PfebCOdP= mjDoKVG;<2L_*NSF#0uCT0~kzE;P>YNj|Ygqj|h7B@xK626v0ve literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-full-calendar.jpg b/assets/img/skins/liquid/liquid-full-calendar.jpg new file mode 100755 index 0000000000000000000000000000000000000000..655314a6c0f04c991305cb42734421866983d052 GIT binary patch literal 21993 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-grid-large.jpg b/assets/img/skins/liquid/liquid-grid-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e531a3dd0542cc1b46ea04806e797b081b50c378 GIT binary patch literal 34382 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-grid-medium.jpg b/assets/img/skins/liquid/liquid-grid-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c7e611bb6d4c6cda498865974426b07b64d9929e GIT binary patch literal 38143 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-grid-small.jpg b/assets/img/skins/liquid/liquid-grid-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..81a548e7a2ba34ece12cc1af4db1afb09982757e GIT binary patch literal 35545 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 T;y)?>0C>_7Vvxds3IPAv$U|By literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-list-large.jpg b/assets/img/skins/liquid/liquid-list-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..62dcb6419a0d39f7c65aefeb45d9c491efa793ab GIT binary patch literal 22756 zcmdqI1y~%-)-KwEL-61dNFc$26M{<;Jh%oA5+H=ZT?Tj8K+xd9LU0`j1a}A!oZ#*< zFwETfwtf5V|J?uF{onha=Q*c`qIxs9)q2-@*Fw%BR{&x~Sp``Dga!gkQ6B(_ z07zfUNWaojRei0==*Gvx#RDMcfnWd=6B7p$2Ok?7A0HPN7oPwhwGsRq8we8z2M-(X zj|&jsH|R3}fG|OS*?_-oAT)FgOe}01T)cZA0R69ZsQ-Vh{ijM|01bqW zj)sAbiHU)Mx{NQX4!|J6Bz?#$jdfrBE%qZvGQNO>JRGJM)t%%Tf@6?r2dQ0|LyU$=#T!_9S#FzfEq{& z^N$@m8NM2NeVig7_-_V_k#4zB`Q0t`z`fnl!=E(E!7n7Qc2yBi;`SF*Pr2cElA8>3LiU@G zYkX+mwjI|hGyu%`QOtheE7i7x2P3gG2C?mMsfw1x&Xi8#BBbjD}kWd`+wBLVMB9qlP)J2^(KBJwXD(-9pqW6kC(R=X<@4=ef9cKbB6mVBUbFvoK5a{hZz+ zYyr@F*M#`+a9yEJv9*M3iS*t!z^WQ*X!^==rczaClm-2EIaD|od-HaJZtD)(iv%hT zMvYm~_R*w*hC6+HW_L1x3ZZ7g*P=LUpjd$Z27gO<%Z)ddUy8W@@|34t?F!Z=E3{QI z;w$Pkh8bmFyZ$N0-_-Pp*I9P!jT-u4s#*U2hIY-!;m6JgVVNs&MIvgLruP1HFMR#3 z&exE@%!EI2#Wp%7f31}`f2?Cb=2p97?5|whhqro`q%cd*1=)i|pmil~40H_~!Z@FLoR_=sN zSR&Kq1_^L^0D~tGcpzAE(d3T6c5)C2EZKNL?;dA^MepW{KO=#Ogx{%9i`nm6L(4hI zy|Gv##2)Kg4T`tvw+6*Zsnb7|po4waCElXXbTjVgAS+SMmpmWq&y?1kt^sagD*78I z-)pj$bIVtmUj!ipN4}iUA?Hh-yX9v`mlgF5^XuM3L6Ykvl+&trG(S(?q}>kPF(HA1 z{Cy`RaAoa<5=YU>z*u_sAH$hf4-|wNtE+obSpP=BaeHp4hVE8e2heKH`IBK7%VGke z4i~xT|4jvFE0!bKx)5)B4ZoZZM?AbNx)7@vYbvSPRyLh9`d#Leq^R-Y8XhFDN;v`9 zn&a+60x|Bs-uID!q=loe5)l%R_{?w|wIg|UK)DX-iK{Y$Z0!f_>Oo)^_ut_>s*5lU z&?dnm*D@vamDGe~tY&U#s5sm8A1-Zucu3=@7O2Q!Q7e-X`2Fv?g0^LhVZxu1WekzC zCWWP%cPH87kDv4M1`-2MON5;x0UChMmuLqe09f2GOv0^!{&UIV>oI`ngPA|Y-!Jn2 zQT=cXZ^GpI=ArfbYgOW+YsFA~AW`|2C@toCO7@@78R5Qg-gghdSaoR<{q8>f`$LR4E#>sRQ-jG)-& z)J=Bt`J`IM_$HzLIa&GMNv6ulMs&T1S9(-uZn2OsH(@ycjT%Vu(?$-U>A$#J04+1b08|f(&vMbxrw}fHsaMX3KR%HrYz!2z z3lRZ$#8tPXu&_(v+Wje8&*vPb zEyV0No2glI8#2_AGXJAl#CPvw*cO5eX7bjVYn@=t4p(IHyQC!INv!Uy@Y+J~^=;SS z^d$%h_(Dzu{%F+Obl*qzcpzr3XG*j~VI( zNn4^bA7gon5n6B98laU@ezrbv5XY1*CCZ{KfyZ5IIm~kQwaII69G$==HEDJ3Pty{0r;9gEjuMwl;GjCLM=OgRO18GWWdcoa2z^zcT$wmgG;v!v)V={@l+ObcxjX` z5#Mofk2tzsjPiQ^>rWfXX)Nz~&E%~&dcGIuJyk1RxxmU#y(L=xx!p_&Cj~W3r4Z^4 zf1+Y6#Z;or=qnzTt{qvp0f{to z>pLgF?zwtEIL7s`CWN>|el@+5mmfc$J>N8E6@UIR)VED*tyEbl#l+}hsW)>+VC%EG zj^g6Y-J(kVs&2Twmk0P0=uL&i?}zTP%$OiRM+3wd?V#|ht|Ggc4j!Yw zJ7_?80U_O^c)+A2{Nl;S$;Zty8(82ggvrk`Y;%9E306R!PCihj6v zqb*!gX;n>9u&b0Pnr&3{>%IPAoClYrud~^bSqSL$IN)B^$WFN2Mg^o3l82E;eo2N^ z!u0EJSbPbrLesd}za_R@C_!Ej1!ok7{M?`RO5#hed}&+T`$`<=QT-57s)V|Zj*AS{^a;eF+tR$M^0fC{A9i&Y9SSGwU8m-L7dCW;k?j(F zYQXd@Je`qqY&ZUUN56Kyj+NIYlnvZh!TI^6DUAx^rHN`-O}6Gm$Xk6 z#{|vmBa9w5pP`q?@Xmdl;bb*ehPh47XeGf!8y30tl}4efGpFA!EMth2P7F2l2TK;i z^agN0Kakdy^{#sE{S=fwu3VKmUTeDAz{Z&BWip6Bhuho2`w>v`YkibakWzLndnSA9 zR-E@e!sUuj6*q1xZBWD}{Hg7uzAu{>>6amlVef?T)xI~w{WjO^zav79+}GRh>~CoG z3F0Dir#RQAtQ4MN@Z;ul-xsM)lnrv0v!hJs%Zo6Y91IWfd2(ocd&3Py(B2$KWFdj7 zUUO`PWBYJ1aa(YP&q+jKa=#~{!eM@@=*rr{_M;}Q z({H|9vm||ib`u|{ib>XY5rJh{sOt1q&Ko%2&v&syD#~ALXPF}&2U&z22!87uqF4xB ziqA}Z*%ZsO9_Xy-dm~*&&jaHgg?t>axgx$1^ z^#;q3IY)$ca!-Q4PMWuUMZ3-XnTcpy(6@8wQq@hYGIkH8V4&!yHM$sd*-jdA(Slpk zrxTp*M|_Oap~6h8eC3LyxNk2S>?F3Xm-^v7ttd6Fy94R?WOxkD^Gl_y|1No8z(LK# zulmr9@)0XM)U1RlxnRi_mqt8qRx(wZLu;-zW3K^$QMGfp=+j-RfI>nmlG8(GJM98C z59OL-9^JARe8UQcW>_rfJ#66E>}BY0y-)UWaU)RvUS*5TjR_I}!zJY44E^&b4Zl?# zSF<1*<5dC`FSbV?k2R1e8ZmjCu$~={$q@3AG8JQ_-;4HlAl>oXL6F!ZfhTRP+#gfkqsj7tUP{!aKXp*^ZIFKbNs- zT^@3YEw^ke%8ec$&8P|Nef`5XQ^DB(=wl=$NiE6qUre$-rL$e2ud?3J#Qe2M{*F>q z6YpsvMixbdZd;0?HceEp2f7`E86PxltDOtl@jDVHTEF5_7~s)i!lq_HujCW2el61h ztT~=DRb_UL46KV%d8k}G$`_nG$;%gr}` z)|;+mB1(mCdNZk8aaVm}4vqx+j>SbLmTxsxk`4!j&&u!wz`yNq719_@q{@HvK`)B-Df-NBA4f zCDKPt-UAYolnf$13q&8Ce4Dn8bFuC!=@Q!b2#JP-nBWK>*IaDh&x}$_O&`n?Mx3L4 z9US+9qzIln5c+hlSRHYzj`%+SKQgY&XMCVXNc3{14G>s-f%Q5fV04KdN&`^rQZjSo z_3($%U(?@aCj+!4(sM?9l5=#ZcZ+K`;%1WNhj`tMo$PA zAzX;8ZQxeRpdL)k#55Ld6*P7-0vZwCLG=mu$M#w|hlPo)&CJAAkpau~Qj!~=U9gYv zohLKbG60jhm+>u=%qs+4!dtQJJ^n;>FJtB>fi=-k{+-MV6qG*TIbTXg0v_JCw+ww_ z=&jcsBNrXLCq%z*+iou}4x~Vh;Z|Jv_9h=4FHoK;+r^g;+(o!VHvD_{qzEZVEVwQP zU1&p9$E-4dRDTYIPJwP+N|KbtMobL+Y+*6N#$7M3F`$7&(5*Ss6&6O{=39cMZQ8{y zjom2B@G%$jPmjw}h8CCx)jt9G#FL4`L%BVgeon8fKfP$U zHC!JN>+4fTO?{yKxU8DjZ}(gzIdQ-a)2@<+vpPc40$kn~`Ub63>v8e{;|iMA1$qN> zR?g5lV`ZW&IH90htMkK~ci|Kb5lf~+fxL|gG#lpNPksH&CHPqElJu z3SNJq?M|`s<(SsC2yg9NGx%~wch-e6>HW!QG1X#lACr?VJE?{=^Hy_c=SAni8(G6d zWh9_;rxMYrB31@&d(OAN*h)>_la)U=koP8O*o4oWq`FHr8chL~a_Qfh{0Lr-dk`YS z<~%Umc7JY3j$Vvu zp)IBH{V~3RnNf8u-bz(?bOoN*Vi`2M@38A_A??WfX_Y~h`I{Wu>CdcfF(ueuPjEUH zcd|3Hg?qQf+59)ZHE;w*k`XUB@L?PC&L-@{5|IIqLu!4#up$AJQHL0!+OUA?=BLp6F3FYF*=GfG7r+!j9<`I%yo6hQp|0Om17&PzCpEOyl zIl6YR%?ip_sn=|j&5QGKM);P1NPDJ9@gA{ZM|)ks?^r=OrZxDQ@3AC>ft75}4_0E? zxJP3rKLGi9oiFz=qzIjN78vZ+&wu;VG`rTC68Ilrpex2rhT))w5tz&B@#_LX&%A}&gMADklf9N)Y_ED`&4HlNqAIBO%3h;KFRYui9F zlKr4{hGSxnTpVZ(C#7hD{0E0#rfrb;h-%YT1tpq!@qG2;1O*mHmTXUW7z^Mik4ZtX z>qH_gw(hz%cEJ#KQH0qnr4w%vZxcS;qIZzTxse{aK7gMpYzm@R9n8FO?5BR>&+9jj zHFNg#9Ui?D=pN;Vdc0T>)2qE+slv32Yy72Z*F@reT7&4E#YViY94Yy&62{C)5~n}i zR$u*&HssB>|G}LQn)k4P14=RjqG&7iEQl8R`{{d2jwUK4NiSrbuPwJx7VX)Y)K7aB zkJ?FIo>wuCO5a5U#-i2aI*-B2V#+4RCcB-!vpa!j>NCJk83fi>$+FXCv?|)-UQZT% zi(FNdH#g;ZrCw^j3p10CUq{ln z?4MqK<#;G$l5$m|9!=`_!;3Un-?4uF0Vn&Zrt)BA@uWydR^7g1T{rkwS6QA<+#!6x zVV3zoGhUU^y-I{r#;I*I7jgQ2*a}N;p3cf z#N*-CGsfl&wmj`btA`D^0fxEkVYXi_F;(?@cKM9U&bXHneaW+nzuNJI0xn z5if0$M(gJn?1g`Ap(g)ZsMoRrmDD%{rtFjb@Fn|0l?FXQnz ze5yWsenOXxfTpRB3K(K>#k@}ksd6+N@vfbSTQ>sZ2ffO0;;t<)P7jf>e6MDX7Z>{a zL~e4b=`Zs}_z;$_0}(@5X}&3$jYF9|Z37yP@U~PhJ@n3s>hlWYgk1nL7w+ST{t<;y z!}C#avLQBCI{1^nF%=JEqAcx^sT)hvo)k%a0(c?5H&Ei_XxHmlh;D^&$`ETXe}3S0 z-d*hLf+r)uzhFw(ZPjkwNZOu;5n0laqC&aJgf5I8?I1#U-8cFq%0FK@KxKu>K@NWw z6iSHYad9(-M!*FObP)HwM59_ySU4M9+x4|>BoI-q;WaB}5r%y#b5b=fI7=Au+>?vH zN0DSt=vKOJo@yQt*lKaod2okG2_X9GcXe47a?UQ`&5kl1HWQq2#|h`=af6borz%PT zY?G$Uq(oF}EZEk7h5NRUc<*$Se}YYX$IB-xTEr6XRvzS6sUQJ;F3e-zAB-H(C4p{P z9C2Y3?a`Erk&8|SnEB(YfhPW#m1v!}(3FR9e`-@+*ISa(9bLB%^O!$sPbknIze@O) z6nl*=klEyWICs}MIDBa5D{;0ZF1eB#_TJ~*JADwJhi|`+s&6h&W#JO56*iUPT3)-< z&po~6DdS{>=*v&sj0m4RKOWSneWl`xAh}P>-cc{vg6y~!l;NR z)(|(eFMZ^fYeMW{?!%*o6cV*C&M)wn8M|}vTHaRa!m6llo^<9I&F7En6I$#K#|7I3 zOSy*Qu{oB)l_%1kB|*YgUhjNKSpWIt&g8e#%o0&UC?RWTV0f9QITXw1{H5Ai=>c8d{9{2o|AN&@AYPq%1v0}BH>8!Q; z*i$;sTiA&0M*+<*+)Nv$oeG!Ozy;FcI8giWj1#k!1zw>v@IO$Rjg$U7RFRUlg|tF>d9TZ?P+xJu~9)q`x`JbbLzwO zzW#$~fXq$3dX9o?+Fs%+kZe+Q%@EC;R+-TzuYXIl`DhH^!d#h#him5n?fk1acB@^AU2n z(s=W-@x_ZV+LU6Mtbo-q`PsLm%*>6}Pxe1svf*ZVA=1qAiziEuSlCL%M)haK%Po34SFd-7y~jy4T%;+nzQxn{_iKC4}jfKu9FK z74W_qz19hdS8{x+PVG>Pf$zL{d2wfrCYvhbki*TGeOHa5je8msv`70-t!6S=?e`*I zP}8rqI`*H&J-4SjX>#`yD&3T>7E#=|%xdfqraqKMq)6$DX;KF{R&`o$Jb6nEQWfqU z&NK(kIx9_V?Wl)#OSaEBkid6!YyLAAjJugFddD7x2jAoD?%s2MfR+V$eCda5d^V>Z zp`~}cTUu0Y5NGqYTz~M(lO~lW(F8tD+=pw_#gq`e#%SR@T^9_4GIUJb-^XdL7TQaMn_%JBR@q1Z(Y)bGqjGnUN0J)T_KdN~A>g~H zs7NAqdUQ-sw(4t_tvW7umn5?6>AKljzOOQk&;d;bK|;YyIxmumug=Ma$+i31S5PN= zfi98N%uvAG5rI-I50ck(P*jxrO%`!6TQTcg->&UX=C!;N*)U6PwJC;&sSI;vkIibi`|J2Ij9x{Da-&jZDtBG zC%J~=Mabkiq0GGf-UY>cx4vXN7%^#&#v0wfIglVAYq>}>6x;EGsp=s!-kmHTfktHP zQjSE~OyiWsPl&PQU=^{RewTP>IW5$KR?ci@GXHM7y_gu(Lw(PSGU?~V) z7+5W=$Lm%30GRaQ{nxRlIqc7@S#CwqPVEe9TV+O%v?!DZ_~qb4JxE}^>jn-Trs$2R zUGu!luIZV?bo(Get|KQu1nz8q<1XJA4ez#Cixj(sbi&JzX5IGgTu>U@@&xPS@m(R; zK?WVg8HM#P2dcb>DdCbr9K9!KZ61XUTc=Y>xj>D90HS`9?R8wm^M1% z?dIJDfqel%6r$25Sx&7J`*#vsc92sGacJcXiX(8jZ#&H+hp}m4ZO?qVnu6mo3v*J+ z;Z>0O^vKCDE1zmqz%CzA3ti{lJNe2IF3?Y{&UNsnAbP-Gm4uV@aPg7UKoC>NmLn_aT_Zy1aLIa0agp=-(_=gQ zJFsl*<3_t&bpJwV)CjfkeDvjd+>Vi5nW2VKmO}dt;gqpK2y0IB5-mMmwkBgtX3zp0 zs%|K#a?{qATJ7crqfVVDP57zD6N5%v=sA$px|-Il6eTEz95IHPzUo;kJA(LaK5JOYD00l^k7YsQ}C*$-jmj_u3q~ruwUJ zaB#w;vRH=ATc}ZH`>0vu=0ZV;T7uU4;H)POqq8t+H2m|BMd}V1-s2lKWRW5jH$?a) zxNVi8HzED|VxU5s=GV<+?3)uC4GK*G&i;}4ZcA?E>Yo#F=kl4eZI}DJu!BA+8LrG%J z&tzTQK2%>Jyt`=i-c#IGrLzEn*3?$gf_K)I@hXam`(EF{7c znZj1v)9?LYP29<5Ar-cfyOGwBi&jCyd`lhk0t2@L)po~OJ#l#qfT-ACJ1^%!f?b%WB@Dk)4$od{;IO< zJ22rRGEtzd@eV|O|IQSaz!N5q}hv6 zntR&Q=XtJ$VmGHyu!%vJj9{J1>@776IowHs+1AIu#3BEy@mTC`cUdxIu=F(E{b3jWgWl!5o0~COs(h(rQolvd#B!8B zYk+DimdEYfFgnf{i!c=~x6V3N{Dwju;-Yvg%@JzUy&5Wt_97urh=mcr%#Drw6NCJ# z35ZX0-+*@U!R4aYpp8S2IN!JsqK>pBO37Q4^wKZ-)IQWL=a-0(kLa)y^{i~ikGjy8 z%$EL|v3j8Bbqn3(ZchIS;7H~l^>`!$9A*U~pyfiFU+0;TWv z&rmj&BAeiakuEF)>iT^8hY|asZK=-;DIXUWpyt6HZ4nTincb1ysx4H;si}kj1#{=O zM|`9AHZ;nyVmp)lWw+>-F8x%PagB=E&(w9N**4`F62PtoyC)h!`*Ji+@ZH=-OBZn; z)-}AC;EiryJq5medCs$-8_+*0_O7vf&duiFCIyqdS?;Dq~ToOk-uA*=4fQ&w~X)@4m51zZF=kzjt_Y58>6e!!#-_a}Hu^5e@_Y~(% zGo`aH&|Y}!;Es8(Q;4aGA>oQC(^<)TM7J-$UTrmy>EUKy z%+S7d>%)%4QgISSFZNm6nSAUYb^F3Fh2nJGDk-Mvysv+2hU#;N2rbOQt^y+>5n$O1 zR5is`A5kr&0EKD9-@lCjFrpJ?GSP&@9<;aT5?X&HGT2dpI5INLpo@FbLycQqHvMUy zvA7b@am@!YND0>Sc&}gV#8ptB$+o6Y`R$}D26YHy#5rK`pRSeMc7tU63C<&PVSE-_ zOmxwLlIndsQ*QkL!L7@$j)3c4$CuA!R zY#K{1193nK)Qmx+tI;G!Qp8V64u8BN4a{dI35t#<6u%{G^H{O?O8V&vPc?z9BYF*; z1)_eT`ulT-++E2skKSXmk1K>KevQ3!cjDKdJ0z4~WMAc(eT%`e01I4P9)nOM8$b^^ zO9i?Zjib9=ZV1aoPvEDl=(6$T1uKcdz4qTfM&5Hm7)T8Nkf$;{+lvl#5NM57_k%! z!VfyrDNT)lK6zbl+n>#}0&5+9EEY)CNs3Rr*XU`wO5}4O46L7e5v%5~E-CCmO!(96 zNFKD54THnOvu(o5KWXKBBH@`&R3V%kkrXM!+1)5Sx<2fOcGuNGwX6)4OZ4ZFfb|=x ziI{*TV5sKcsT407j#(~0*+3cwDCtd!tcH49zS}3kVyc1URgR)LM|Z_h^N%ej?>@Qd zYI^zyBY|>H>a@Ymg|{S`@x2KR=mbW_KPouSjC8#-2MAQH?wBU(Vl-y-$9{Vh#Z+wJ zT~<-qJa6tRPl%W2?3-tOdm6LYQN>#+KSJAL)!(qM5974)RZ6xjXD>k6}|;RXh_36I)pg0Khob`_E>+#zATVpn`aqrVR(qRAC$ARH|G3<0!`rO znyI{kEY_h~tR%w*DmuT@lOTf!vm$VXZcd=<5;xNy0W zozXT5Dgq6@RWzs?ZU3rp&%7LgR*I@Vmf6rc7eTOk(-Iy_<2cKkHOJ3z&`=S6H)WJdvnf zm}(EEZc6;#@lczCap^@VtAq3MtaqmC&B|AN#7`NskjH(T9!{;M2m0^Ds}2=_VtbbxFX(U7O$9)s zkK)Ofk7&%;jpUwIrv!9sSjwBVG~(aGxA0xT+p2dClA>lXn;H|GFL<2ppwIJyORpYF zn1v%Y6OE4t_vP43U94XIJ%`_Ku$)$3SXjj+JK)gKx$eD|iTr<_?!rjme)(v=31|K5 zo{1H?hM?B&TL*8tHF7@XA0LTTHd;bpSg4Buk%Ep3@&ipHLiyDAhkEI=ie>y%nqF(~mg znL&+K7*-W_{m;rA;VKf=ZV)Gi(raC{#)x$V!B=12(1R=8VdhT>yW{YGICo&I!&`rU z*4p4I8`QDE?V*>@iCCq92G^$BJwg0P#b{T1ce>u#>dD3D8UDi+FU*tLpQ;PH$79%* zx)H7-xCh-Z^W-kjY?-(9!{2nt;hSR>5M|5i&HQ~}=8TAW8jQ=-pwpw!(~rZH`6XMS zJcWA3?`O#`NjK7o9oMv-+1<J7CqXC%$NecM-x3YyF!41?cv*4cwu7(99E%2j`)!qHP1dB3=H15!_mWeXqf<a<$80FLRN}G6kc1ufJHa}iA7op-xMIoP#2O>$qiBDsf z?iT`hOmS8Ma%>4=V}u5h+bMCGkwDwPe#Nh=ZL13#4ri1_YvOqo<5Rs)C)O@G`P)sZ zMsPy*1s5S9AK%K_B%^K{-IvzHl$FY)8t^V6LF{?@c$8!9Vpe71&KWflxOYz#m8Rv4 z1eV#5KrcJ=n=KM}CfSArP9Gtr^5HeNX()`yaQw9v2^^wY`k>eXy8PQG&@;{3WmN7N z!(1{X6@p4yS&vbr*^Be~vQwTgJs-$TX|M(^^@x$~*%wZ_)+e*PgWv`nsz&${6wd zP@+U?#Y$Mr+iTOGd+eX!>%WGIVG>A3{u+{FmU-B*_dUZ_HuzF(OJQne0Nd5|(7BCB z=sK!!H=`%Nc-cmlmox7Xi`n4U8Uloku|>qp#w>5Fs&J{7z(jjdbxm|Wiv@};5#^uy z9bI6%C9ggOs;7*X<(;%cb>eR=DjFkYLBrXTykxpjQE%ox;C|y zXorBo#MHd6_%bvC9 z)Lm8P&EmPK(AH|W+=a)pfnrgv>?4@rrTtg^-S=FEZ0_nwJ&rrsjhB@rI?39JCXRzo z#SHw;X9~)niAlcC;=iG3FgD7+qViSAn8|QQ0<=$j1<4b|So>Uhfc}SJZw)z34D>Ec z7qlyvKGjT?k>m*W3aF`Ux}52932uQ2525O#YbM1)18R}QT)NgRb2kPTlFv1w-!07W zwWd_r+22sgEM-LUqSxHdq!yyu=FfIs!1og~C$b8+UsG^bU%K6ySR`oLetax=RFk?a z(Xe-CAaZEy-ur8;8xUT&jgV;XLWN!J6jS$JCvLh=3{1<3D@Y>&0;e)tckgT@@b;c~ zN;@GhhNotSeS!zGljJCU*;ynK_)&^LtztW`@9@HoOOZgJ0FG{--un*Jd(V757-1^t$b$qLUde!9_+{s(ju}%0()xc z)eO0R?biWB)A{p>LvN=1{Z0_lxp?;G*6TGd@AC>X_Y@@UDi|w+%d{fDWlk78X0ado zF;TR*@Mzgj8}SlSQx4q8g<)U1q7G6?Aj^eF z;J1zUd+6CI`J_O-PVAp!Mrf-Vmvz&HkKg~VF}OOky8fIY)H4e&hf zlmMXZg<<&KGZ{lDH4Y=XMn6BLF(-KhzJy2)Qo(5C%y>Hp*`phpq_|Nk!` z>F)^)|FlH>jWZRnILlN+Te(33>;R81Bn6<7fDZWMGni~hVG&iG=AvWIz|=rNd+-vV z^8&@mnEvnA^5MW)2H^VlC|WX*zWeElTfcHiuLF?a?+F|`&SbOyu6j&=IMFaPVxP*F zI<0*5%T2hy@>LaO>R}hYa|<;yz6JWI^EO8_&&KAaf{XmBlamXKw(f9gQ6y70_z=vJ zrfrofcdxWBoJQ^;`CETG!<-c7q*_ypr09&)l%=TRbvuf=1xN%-W2`qX-M6C690y%f z9Fo}F2acK1=VDWe)4#wP&E6jsZ=x1jdYO;V$`yZD`t}`c60a(mQ&F+x6gk-Hi`Dz| z8{er1&o`^v+a6lBLo034CiE7KhNfruJ_Opw3#h2S@w}H67Qb>!5^JlgLZnw%!q#s+ zKjv(*tC5(rut51T^nqw-Wh%xZTQ`7b78+4 z%9SNHy_aL?PUo_6HY!ymu^e@8>fpM@T-i2tbK`}e0Z74ezDHR6=8{2iF6Y_Zk>oYj z*e0~~gRa8Z|B&?m^CYG_GmRM)tvI1ym;j1NJO?ap$3RI^Sjqr3D%bHZhpH8T%D)7N z;rlwyiSzADrW$yLV;8;PC9mV~mNx-gBdiCCJDH&=2sx5sIq~!QZ?f2FRF97xuaf++ z{UGcYR;-=M&&%eI#D3r^e4m#+xSNLeT)$Mz80IcWW~CHK8R|bPg%Nfeo^=j9AQI{= zsib`DjzIaTG#i#2kN`!iGD~nw^l>lQe$QH%c{I6dXnKx$X2*=Cl7vHlUvwnb0djhmcj3mNbp5zTyBKY&(Pt@<+uxI z?%loKnx#?9tRD>@zxA0t{~8}JPowm+A%it5<0aYNyMy?{vNpHY@Rt;IlXjA_NZ_&S zDaG<5!K<0hw$uof4JIV4~N6}_8bHM!nI0$ph{j=PUITCBkoI673(M4|Pud+CoG6CQsu zhw&KnL|*Z+v1_Ja)*mi!44{%E8miWl%)M+k5Ri?lTI=@+(WddELp#j87I}T*Y=iRG zCF8F~Ml3}2j#6HH2@x9cdKdMfd9mv5A$O07gE%?73JDbYMIEs!oM=CC3;rcSU2(E2|fuC5*}gZm8WS0v-T#_vmskL(cYs+siLt=%pltaZ|>fc@#XrgF8k3_6f)nddOLQ# zxn?l=OsPWfzNJLc=D~A?&4N(k{Q>h>y(~kRrD7^3I*NjmaGPqdKC60uZE|sY7&v$O zal%Iz(I2@hdh4FCrmEM_=Pyk*%BnLLe#Fr&DEO9ZsAk`ZT0+fk2l8YlJFNxI4IajI zIfpLWpDniy+h4yS71(60-N}BMK$qu+ptL_2_pytXS>1c zkDC3`_PHfdrhC=3(?wd`yXK#Hwcb{t)7wgPA7)|39O)~|Owqw-t%+Y>$Xj%eSP&)FK^E`norCtNK1=Db*n)4^@#{|F#J^JgD;PAV=d$@^MXtbS~^W64%B ztqGUCAYK}9$cx2gVxeY!e-+II- z?NCMvJ(+eOf}$Q!aXP1${B8r5KIImigR(`KdR=I5>)L9(`zQxP45>M1`@5bzr|KgG zB%`c-@GhTx&Sx!Z%I-~~c2*=c;L1ARcX@#JQOU}aMN*>FN7ff3G9RXku5vVWp!1Ed zoq2xerY-GPM5s-YkQo1yeG7snj!gVJj&IS)Of2dg;-rxDVGX|I{6UvAGor9b8RiFy zA1CA=>b+J7ftj0W{}hQ16}|3R&H4STpPD&S?67^!owgmq;rCpGb~bh}+Ld1p3FOM? zE9{(->OlC1jxO#5_tb*qZ?$YnUKE-cJJXHkB)1E0(ItaL+{(hh+>d1O2i-oYaT^BS>m5Vp=rt4|H({_>d z%W|;XP@r;4hj_yWLnP45I(tuuo)zdI13uDAjtT&cx#(#A_^4zj@?>Hq=9ACmH3w%@ zgeGPOM!oGnSG?6X?jZV%Pf;1scz|;LBs>x@!~=L(L8w3Le;QtRKqV@bW0HhgO%?~k ziw3Cta4;_%$&{4zacn)nUzIM?F-L_JbUgpVK8KA$yqjV!&q?m}3LcR0r$zH02ozsC z^qmGpc{RIDjCgq<-$|-p=p3D;&Q^KO5wc{Go+9I+;2s5!dv?5$iR+CKD9t2;A3*sb zBCEq9rUN}-Z!hC~SD~@Cwng_Re_uY~o1VM-^)Y^-VIdj|dh+BL(uZ8sFz!@O183iT z`o)eFmyRD!yLCp(2}>2=o|J?2%fwfV>C=31$#c1Mn6$YV=IZb|j`&$B_ZIeAm; zRJmvE^6kWjR``%l5ATUw$U=yoDqM7%#bZO8yn8UU%sl|SGPv%7y!FljG~}s``gGm8 zJ0|9#)Q8-RjAX3VCeRvK`|Rx3?A7;DpSS{(VV(NxYoFIX7lJRSJkqshc#&XQB(rr6 znW5$SbNS6Bg8cpvk{>Sr+0Oeyek4J0-CvJYgmkslO1Hp|k>oI3(Xwn(!EG6@3@A}F zZNWe$AQ*N8T0%#936ipT?4 zoGuZ#+H*oa?gNS?Y~IU&Y!vQ0);Xg=4fy09#~~3x%`bum8kc%)z@5aP68@pXasX4( zcN@>9++9%SQmb*6Y8@5f6FXsMP79M_yL21V6^aX21ZV7K`R3$ zd@NX%cl8-_MjeprYb31ALGVZmUbL*Lg{Fn%{jI=n&ro=D;p4?j(^ZvGYnb??$K!3P z#?N3vp}^oX zH<^yRHlMkLCwF^O(wiq*np?E=bAEvn*yag8?H7HX|5SiIQf7MYA7xDj@ZQ6}Q5~zW z{N=!h^oFAGf#;bMPeyA;YgijA=6xcMUHqynAPml_!1<68zkg-lD(VYA8K2Z_LoprX zHQNMhdECQm!d?dEcO?Js5i`E z1x~1wz&2v^Q`_5uGezYkzAZADZUbfWM0M2erb4L4%>q}GcQ_Vr(aX+;l;h4+7x_Eq zCgqjg54|#bWUO9If!UrX80)&Z*g26aj=wal?ps=&uS#3EoT)y@uY)EO?* z*rolIr`GP2C==mSqM3S20(5m0gceygw1|t_G2|Ypk0g-lg^mNmH(J!T8|4Hd9TsW( zQK7!M^t9y7S+i)XWfxzYbXm9d!;RE9GRj>}PmD(Ad-MBxhm7YBmh;J|$$Kwus@rJ4;q+=M&>Dum90oY~7|C!1Lc zZDOSoX-%lKt=N4=4-T4wYVs)xNsB@Pc{7)5ow7VAS9hoa%ku=NC1Gm!?hZcaYbhF+ zUwXzJag~-@45X^_|LEX4^JhK!*a7NJ#s0`YD=-NY{5VpnbC)Qx+i}ESMn^6$9qINFkp^bFO0@bri4WCWIm^{9L5UcrNozz7_lmTC`LyQ^(BYBJl{9GxXB|$sl4HFJe+i>C5O%Me8w44B~5GY+Xs# zfYsvn&~A*&xsps4Z5eDzXLQ(Zy59k*AFQ@4dy=Q<@@l&N{-G- zNl2rw7O4GHHSxZ{d>eZ)y%hfaGIk1C<+8x2wAY@VE6ZZOh)k*TDarWsyrZe-6EW4Y z@7V)H@A!Fqs1o2_p@^Hku3nA$3%$>KO5rzhMm^@!?tKvzZT`@3W&E!NIq%gH-Z8dc zGg6HQF<16DTulJF)yqOCG`aqi;OHwc?iwkcdjM-6N1Bn>4Ex|1ztrVmi0+dm8kK7r zW%+;}JZ%T>Dk*KHE)SJ2sfM?yu0fylFZDDeI%?n$X)OKpE`Eysy7scjjUwBCCQXkZSIa{Q6jHVU=8O4~YoKYV#@sTG_m*xGt&>gb|FfZr~kHDqgmYghJ+@t=wgj5O=wn5HSoJEGW1+^SgwIz=0sKTTwZgI z4#ErXgY>+xBT&DsJA6bn)*|D}mpJ*ux*~+xnEdEmhiXis&4%AmC$^6x+a%=F*blQ1 z*SCZFf(Axq+>DIVzX{Gq(y)9B-g`g@HG?+cINYow5V0|J&2e~BDnXVO$rEhfPOiFj zx$GNdriEL@&HIA$*=FXJBoFyx%AxKbw&dl4J>VVraQ7T$gA=}fawi{uF@sx4&SRN$ z1blb0#EntJ7TwbAFK}c#2g#Tr->VV?8yFvu5ep+!xeJ+vNZ@*WD#+GJN!FH#ZB49P z^Rg%Fw;F$~W`W{qUydm{)d|Wn3!{-oPqzyyD-Zg6giKKLDrX{`T5q^1(w;2#SgMwF z^R=^2oDwY*pR~%>V=vD|V)?8{^N6EMdqBNa7xgJz3;vRR$A1^6yP2iLdejhdKHDT! zUC=6?dv!M7=Qf>{xfbW;Um~7a4Qbr*GPqr(T{OS(Bvv)7D1+w(`bfaK9gqbzKZ!f_ zI+LMSS*oJFdZ)n6`s_iJ^l~D6GX2bpd)}h*^u|fHc3Sz|A1e1hJ+S_+_;88-Vr{A+ zv_gqKaHbsicb%e~V4}%Cd}`MP2WTV$M*bYs!2dy0hx3X3qnU<3)u0#jK0Fc7J#d*r z3!GC1MxmyFM11-0*uSHIpY)4pq4q(W|II1pm46~Xjsk;{9MKHMs|<7iVt;rk69J9? P@(}1X@7{k1 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 Sxd|fy_9o_EtP29&&;1`E5dU)k literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-list-minimal.jpg b/assets/img/skins/liquid/liquid-list-minimal.jpg new file mode 100755 index 0000000000000000000000000000000000000000..deedcb9124e21f699ab1ccc4163109eb4725aff1 GIT binary patch literal 12062 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 XW1_c4o8C<2pC*ik{i*e%xSaS8fngd$ literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-list-small.jpg b/assets/img/skins/liquid/liquid-list-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..53460bb68ad3ee91bf1f43ae89646b212a39c35b GIT binary patch literal 13225 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-slider.jpg b/assets/img/skins/liquid/liquid-slider.jpg new file mode 100755 index 0000000000000000000000000000000000000000..776d94a7123c14df0876a2ecd36c81473230dcad GIT binary patch literal 18691 zcmd?RWn3J=vNt?OQBly) zP*D-h_#kKiDghedb53z|B9%`VFC2)u{9|&S&`VTxk*JQHGH@F^24G^5l95w9V|>Z< ziupAUFW*~!0YS-kQqnTAa`I~G8k$-kwRKEP%|4r3SXwzbySTc!dw2$Z4f+=RJtQSx3+h7 z_x8`uFD|dHZ*HM?1PGRqQBhG)G5*3b60#fOKp{Xyd(MeYD6WF>$${tvm;V!DiI|+K zE=+oE)l(8<$1yBY2A(y>v%hftSEm1;@f`5~is^sw{12AlodCfTpdTq31qs1D0TK!U z5_}%OMnOW{pb!8c;GWG73wQ-&Bme*Egnq6}W$Z_WF>?tA4n~mz5AMKMyGR1W!2bWo z?*gg4t>aO`k40PT`s^_J*hop2A*uhqR|NAoZwn&`YX1so^FPLaV{U@3*1^OQnUD0F z%Au}ZEv|(=0LiSyM+y-9cm0C8$fZS3PeHM1UMSOHIbu$hJ zA~?v7KEMIUJ2=pu^k9J`I)nFcseHc&?(w6(P7XdRdb|Yn_>mnEfPKIxIf$wrXK>(e zmp-}dCzXGt6aACkVG(wJfGC1@mW^^mfVW|IzYC54X#bgudjHOFMftC}?DH>RcLFA3XMpf6g0FvbZI?l&|M#a1hutIU(r$=h?ntHE>18hT-j1T? zSqf9doTLIi05R|ZNeu13ooKArNLkm}@ogE_z38}SpPKlId{ZX5{5bW626^5qAqz53 z6XEk}^fC(;@2TOvxAWg?|Lu-y`)Bsje3S?Hl0fbfC1lj*Q=->WU)iwp0Hy}(jd&*m zQTRn<#_%UQS4BJD8P2k!fh5~tn=J`{xzHEsDCaL_jQI_e+&31^h84_aAt?pE-+U8@ zS3ujAA;$1i@dmtg(_Pv1Y_)IZ-`(}+BHqCRNda|A}HCT zI`|i;jj0Zq?J<-6nEmk_^vgf~%TewMs4wfFqZzc5?mPKJUwZkuH6H`*S$(1P)|Y9!ZUp9O^U$prC$z0WJlv86wy!_*@ZKFnVD9 z(L1?6LUbJtAj1J?FExsO_nvvw(4`mx<;=k6>QuH$tDocRq1np%LR^<9wmCHX8x8k` zk$JnWyb}LLkmB*2f*-;Sp2LBPYr{K5Lzzf8;M55YXn>`QyoLi^zu~|)@SVz@%SCW1 z1xhG@gc0+9jZ4JHLK@j$G|=%eg9D>dY@PPcH1lv0rsn(8)9SxGS%Mj)lV}1v^^P)M zG!-nZrW=lKlBblHtS=vxGK8fpsG<#xe?I;GQaCPF_Pp^B!|7IC%Eo7As8{`@pxG+i zMo7PbwCdZ1G^*b^1sn*K?v*{2=1!*y4|htf(7ZA{T~Bq}yQ#?gJo$<9edqguPcgn0 zFJWt&-pK|Y2Y#4)!=g&+Cs1yFsSCrR5<#BH^+aOwWE*vaSRwN7qzPGB0Y#X+GPr?K zBF<8EdqUiCvC`$+`R&)z8Rw#IWEtZLPa+FEFu#Ze+$kcNTw z;yWIstbM$LeS<(p{3gxbCqOSb9ME98$v>(QxfQv0=2@s;t8%yc5EHX)0&7x$1Aji$ z&6?@zOE6l3r=8fqQ*w`gXcsq%Bq2NRB@FjD(kx|81R{Fxie(sO4{A{M-Klpe)Rd=; zLPv;2KTEvg4^`zS=YRf0_y#p_zVMo8;!{I&K6Y`yg95=ea|=Hcg_2LOp}bz7oUc^< z)F-9@gdD2i2A>h9M_Xw$P3CZmi91BSjUx_(X>a5xf$@4G%^H^u59MeoZ5NT};DDnt z>}64!8bj9QkS?nHz%~7brHW;fDYKJ%=q<>Xp8Ngq*5w+ zkLH$L9uCh2-+6Xyk2nADyT~r4k*zi zfLGVxz;DpwtIKBS?_rJ?{@SFHl(JnU4IashdTYUNIQ_We{5)~3u190tKk0hJsJu7g z3A-6YM{>mFa)6lhb+ey8%D_xDUpl!7*zrqq5tvd)KX1RILeuD)FX57pICiwIuY6sA zYoKJa5P6`O-(Xj2_iiaKr&l>`e&k_ah>LZ`&%dUyUUV}fcEkR4wprZmxrW3umijq!zgFz(ibF3`UpNSr&? z?(i)s4V<8M>b&o*S5{VnW-42eL!;{WdPOWSQEQ!g&{7_4ho* z#`elgS+A};&hicBb&ZX9e5z9RYj>UsYFf&Pf*Ek!;lk~?r)w~ z6ocK*VeHX|wv^$3_<*Ar3h|cLQd_edXOYEusmp!FT}DK%ZJ@2IDZS|q!zxkC%H_rc z$!}(6zNM*VaOXqB_*i+uvC(or({)5rN~7bL49=Raj;pCkOKQ#A4u9k_A&I97cyC#2PTdCS zux(F(Fxi9`LQSuiW@Eu3d0`$@g9I2^ClRf#8?hqR{7$;dp8GI;>d=6My2D}QYNr4s zh}tMNIPT=Kc&f$Hw>?PvP`&v(bToYD(M~9myQV>aHppTkT)#|68+1XRd1TYIEP?A3 z?cl#i17&dOovu1inJFK^4MFb5F9Ug>|3dT)G)WG z1zxxcmTEhMqoYvtKX8b^0lev^Pkfa&q!n-=>1uS$vOP$VPs2SR<{KLHu5X9>ZbnKv zy==N(%HVi8D~1s=jGg`Ii6)gJuK1>>Ie)h~p4Z3wde4Q52D?E;^n^>@1RFLTI=@6Z zIrX$`Ssr!Spw0fmv>P1XtZ|Y8f-^`dI2)7{iQa z=95bi4n7pua9~c+<%)22|Mk~@rx#hS!T~6Gt0WxIKkT?nZI7ac?fAg~G`mNBPYpN_ z7z_un;lO3y_`wbyPoDyr`fUHxhm!o*Iin($nA%I>4H2sf79yE1>nhJbjv^1a#wu_F zT#k7Y<#b$(W9$t{0axpkgGddpDRu15BJxPd~-^bQ3LSC1aPj9|l=bt%%|;&<7s z_u);SDN*d@__6P!mW`D>!*P-QW!|+(!jK5YT-@P+d(uKa7Sg~cy^{9DfRC>hJF7GX zkzyU~0m0kJ+#r)iKO~dMXaOdgHVgc_e`xtA8B>w$WgW{&a6pXMm7uHF{S6It?rm|4 zk$XSIp8rW7#1=;)G-1MZ8V)!Nes>Lb?$|Y{C^xsUXJh+}U-C+mP_#2en1jJQfGjYu z@vPgNN|Pqnp@_eM6q;CEw4JI1Y41&=WO75iBegWc&{yj}KZ6A|u!XDA*|r(#`Gx%X zF$7j=a9J?de@ql(b0?iJRo9IlR*to2<YE185D7vi*zg+6&RR z=-h$5%hx0|5nE0lD>P$|-3Y9tC*Q?YzDdUyA0eVMsp1!43SYBMDEBC@hh-2#_w7d3 z52tUq>cSG<&ik&)5)P+tMAK7HJKSp4j)zt+7z!aeH$qLXxWNu>lY?O4{cx)FD zAsFu%CJQ4gymtwY{-lDwrxh` zWy)mJ$W@2HxbY0F6PA^C^_1hv1?5oEXGe_E5g%m_TfzWzvAt*z8;I63a9Yl~uxvU! zE>*!XfDp&bN7*?{BfQ^Y7DgJ;agss|2j0x+vxiVk@tKQ-z>+Avz=wrxT1`8wk)g@| znHE5ibV-|n(8B>PSl|U{O$^;|)Ytss6)<>*Hv|WQ01B`;H0v}Qg?$&q4I>839x=AT zzx=Q}vL7I~ACUg9%2;pR06Y^oFrAI@0fV=U%5XMH>#uXyMM8M_I76bL8e5R$EVS@2``&8ha#Hg$^bwW@9uvom6m}rxHYCq1wlLsBOk< z_S;C${=f*u39oGJZUrU_ZPJc`Y|BsVf*TL{PEyP$wilj+ICe_UoL+S+R)%y77*5X{ zp1xF(KRUU6fG9>O)rF3)dpRY2OtaJ+NS^1CWaeLLQ_}PAr=$VfdedGdWeAFH_ z3x~cRR_Qev3Ab|CrO5Vvm=%(x@^2*C3mtH*cF?rhtsI@#Ef!$~XAC`RD=%CwroX9H z4vfn*-k0{(JC(f>DV2AtR@&RQ#xVi$bZ{39K`nj-%H*A!v2*lsaVoT6 z=_?(p4ieaB{D|6t6j^*I_WP?+x)fS*#50NhmssqWcwrYpmo>W%FL#7uT;@h z)u`lG$on{mxR#QprtR^48;)iWmuuKJAeOwDuy5(YX z{u_cwNA37nV$(GdL4wh9W_~se^Qzx6>)Ua*(+X3tV98t#KGIFLlckql*S(Sx4=kYu z@^Bzzg>^YYn|kwjtY;wNPjOJEsuB!<&`OTpl$i`&dRiRiq`FP9MfGi+R8|n~*;LMH zXb=23`_YMtZL1ecWq$ipFeW`zFH%9qhgX-1J5E(4qwKoMG_fv(J^|(XV1hRPO8N#v z(U_kGH)m&hUH%8eTxi*9t{V77lbK157)e< zEy)@hr#PTAT}?VYthkx8SR3 z#1dwby1n4V-j`=-#@iYzJQn{dNYVux7gwChnJP+8HAqxjLH{9hP3Fc)HFiO{wc(AU z7(xB<1%()rUnh87=qLX%5>qA%vrNoA#5EC8eE9k-VLh%{@gZ@2f27%)WjkQq^}J{K zPc)ZPB$7xQOMAx4a+W=(OpW-dSkFQ`iKZ01qT6RDUg?7-pOb(6Pjm`pSeOs4r`@FPCwx1CY4&3Lg| z3%SuJp8*e*+N|~_L4B|e6O?m)9;_dxx%_hc1goHJk+8K)g@jRJWS}MV2L@w6w1Ze^ zB8+>SjUfO2y~9`380PbZ0FrjCE+|#fI2HJ|-Bi#;172l$D13eW{`MmACRHcW!Te3Cs7Yc04hOX=)$QpwQtbWQ0%=*J?u=(2%(NA$<=uY5!P zT_aC;TH5Es`kX~s#y?|8En*o0EV3n?@!EXVRcIgSnV#oUZ*ibXjh+Lnx~;HBoq1Cx1(qP(CkQYTH6PILRHuUc z*!dn+G5q1@xZNKwM%-xR7L`05^iN$itsxLE{p-<|S31)=SJPW_@%x>tFfZA0XKi!b=q5Oz)1`|gUy6+GGy{;( zhhMxaupv6XA2D4o%#Br6N`$4*1mk}B1QuN-jli9Z4x-Ro^==b#L-9}DbgF}D6+0&6 zPp4h8EiFXjw@z$~e0O5zM{5GPQBX&fzc=@4u&!(+ZfL8OV6CgqUS+5rjH~-imC%I| z*MQ|Pu=(&iW`e}CSDzK;`OMG`;zCmjK#LPV^W z(aGX47HX@IsuCwJBIt3&N9HYLI21EfMl9-j_V5v^Bylb`g17dOnYSd=kcBi&(~_md z+L}T|hRcfUg%DJ{h9O*fRTc^`Ek>i`*bG656ttEs$~Uc<26A%imJiN_P$SHsZ%34n zy1v+ZJuVVFAi&}TmACza^D~+Tg`slyEfm*PkEx7q9uf$WQzi=SwGx*n?oOLcZJQc8 zRDWLA^-XfhdK}jP?(}mv?1XuH*@Ygbz9WqSs2$Y0pbNyyW?dz9*Njkc?|{QryZoa?<_ZQ={6YjRl}}b zE0Sn;+)ef2RBs(%B;(T!%r?f4&x8IO6#Z9y>wkf>2!mB(r;g41o$s|Z=jI98rByW) z1W@e@++-oOv2WM>-uPAaX$)Jdm8vGZR-Z3=i}QJXDR#!%#d&`{_CdyN(&&3wDYa2Y%Oi(I(|(xf|p`gV!r^!WJA&d z)`|T1(XqeB@y2+|oYJOpTVqmnLL+3Uoc?>G-Le$7%xl-Mz}oHDSRVr^I0U~fvo`H+E} z7~TMi)OjPyj-KrsF&?m`F=^&NW(fi$gf7@7wsj1Fb&4Ml#*fa9%3G7du~vb6E6p(j z-gMdSK)J9a>&dgj0RytAUXAi6B+?}FaszivK54oSmHTdEKlZy6OAYSW zUyilHs3uI$Zx(u%C1j|~s^#+)n|V=V?IZd|JSt8OPOZ=FP6R=f{jl${t-OVua*=2f zUEkDy(s6O|jZ?BDxY4q4HpcW1)6OhY+B|+N$;27UTO=KSBg@elAPy8S1jsHVsMTVd zno}?_B@Ib$CBzFlGh2TN;5R1Mpy;H4sLCc%Ee?ugvTJ|8H*$X*P`?p?1Z*WhTLLcXM3?}?Hh)n z`~~y8kk#_QH8fq2)mhLGx4&3-KBU~1lrl`$@405syUw0$LE&WV=SKI>-eN}t;CU`< zaPh8#Aj0E*trO0LSe6~a3I&#;(57MjX==PZW!dZQqgnE#aHg?7{pv_`zleb@mV~Mhg|7axA5v0zXc!SZV1*}V=q_4Y@lV^mNW-pC&aqhJE zBo`LEXAtkE&(qYADj?!0V3*gNavszB^l;#)|H+@DzCk?S<@8Xej)8+a8A2rufz19= z=Qr-EB;R^al8jIDfIof(@wQm*XfmiMoja+U@og}zP3QS>-?A1D(Jg5$&5+OEO|J&p zF_%Vv+?hn;zBXYQkUO&L$CSUREB`F9R!8DK8uvtxoB5R?3X($5UglR?gPsDuI^D}d z#{-rHv)hLenjJ;!ZE$IO(ay*)OOkzyZ+j^GhMt;itX60Uvdr zmJY@~9C4mXb4grvZF*i+6j(~&9X*#mT>z#8G znorv6(NGgoNhb-Ak0|a}?kFCuWey5DP!up$_9ndbvdg=G16-~g zF276y-Z@A~Z#jHhg6a#N z^=qUH7dFpI;zFzAV-M5d0EZ&m2p0uikbHUoy_onFDm%tPTy_A`duauTyS3(+5+{%*#i@!GKHZ>mc8^j4ZLqqX4R zxw@u0#m2T7N@`MWTcvHr&{oyC&vI6=!E$>JWAemdK{7OikodgEaje9C3u4@*{??wq z5?P67r7qrsZmCw^%QGG4ht~j~@}T5PAKd-rYsLm57U8p6S?~;}&z6^o^&6SQ`voO+ zC+$6!NryPS*e$(^Bb&mg_EZ!rg*08qK?RZPN979d7sWJLPh38lnlkxLu@|B4;E)8*)(;%zLS473;mE!6pZ{9 zHQb(i^ortc#yGU&wdR&}TbYiVtDDZrVvSM3D#2iYaBYul4<9m8SMNFh0fcv0lhCHr zvU$(9!}I=*IL=KK>PgiRW{YthnXGop#vt1ClFRUA}GYPk{D$sga$_l>APNk~&URL_1 za$B4im^V?m9a-F<$ubsp!d`&faOG&1dR57(X1)-~$uF@Q7qBUKdZrhB=M~^|9A`FR zu+3tziy$KZAcX9Daqj6bALm$HJ*EIw>J_w^RJ^io|Mo4&w`yKj=A|oZGjg|kzgo|# zBe3TuG()^5YRS{Qw>a&%6{l=nz0^IkKxXc}fiYI2v2mufpbpxU|7o>c#qeIM(7cO1jAanv%f@06AU~U1svFuDVQ0du{00@ zv-@H~5k|g_N>Fw-R*`aa*46pO1bxn-63Czyso?L^{U2DN5yC#k27xup{l!3Lk!WAt zZOeQT;x1Ad-`Y1Ciw^P?cWjlE#!vQco*B#^_}KWi z2Q#mSvFQ4!DM!9C!5XjOQ2#*5N%b6X>Vx>UaqDv=Eas+-vEGO1JMCZJhg%-yBw6ge{tW>yC>_lYhRIMqt;| z-X4QDF4b`&OYy2cBQPz&b_ucNq0gFrvx>ZKVG@ZJvT`EbLi|SM)b*jO!5QG#jDzS? z8)(ZUtyyV9PA{)*3Az?7H7)D*~f$i??NAN#fx*!3weR#^l%`8ZSBH>p;4 zXQ;Jl1>I8BwC%5HjrxtRErS&IW!xi%g@_zT{FMIVL7F?+80o~mXa4!#cpO^v`L#43gRWCk{o^#W{Q_UNiNBMuXke15GArdsBJkS#%ya&5 zPZa;7+3%dQuM)WN0Po(oSbT1)TUmuVZpEjCmHL@2aP-O0oSlF9VpD= z&ZmrZ(gE9C1RdS;+@V)obxF2VA1bnv(p|VsnuXS^uP?LpL&IgZan+P?mgcs<#ds=!Pz z6K_dE-P-3S;WY}ioO;a>{iA0Ao|k)}C)rysp{cGj%98`OO9Tt^;q2?yxw?@;q$LXf zp?;%|&yW4qhQWn`NwgIXuscEIfe@R|*yKa@81!}+l^quka-DR@AD^d!uBxHIQL7qz zGewnq^M21s<4VylLV9hoQD!Re+6BSy0c9KFv5PmEpJfzt#6)LzF0!Ah|BK%ixnME! zF{IGDxA*Z}Q0-mYSg)QU@!JN==Y|={YyNcpwV8e!>DZ?p>pzQ~YdL`z(*`}3!^K-8!22n-~n<(^$W=Fa@slN-;bUw`TwtUSTxx10J#XV8v zt@2+N(J*hV;uxa(bKF&PqdP$7J-ce2v&$@jqd(|c-c+kz4m#c2XE@h|;K$@Eb9OBj zRBMUc8O25YZqNymmOGC5wZ;lXSfzxMsw@!FJ16>RzQ8GCtdByOe3b=_!8}K_jwtM_ zW^=KKkFqs;nBHUwyQ}4rr|!eBJNwvsWrEov?EIflkDb?YUn0Z0FaiWq>G7=#lZF1VEpkxACi60wY(>S(tVA+7i%jjPoObgsM;PtIQzck@-2 zPe;{dNizR(+;VkOxcZDSm-`cUbOj5SoyK;3m~(2HVu5L+~=->cvH!Qt*xc?M8^ZS5H()`b5Z$1 z!|uqyiC(p7ct{R^Dk)Tt5U};(S6Qz8YWQcmwW8m)H8R2X$Em*N$68i{>wRZ39hXr$ z!B>{#1BiiYgr6SF6okT5!4jHp8k>-Dab662gY*B+4*#zqR=FQ6F7N{sMmZ_XR&9=s{Hv1V_w@FbX|Lp7E? zi^W_N;lg#a=bq{CY>>BH9$E6bYFNLc@rpe*>T+-QnfilQ2QK*H!Q95{hJ1VpyN%#RQyqN7a%F6sSax^9ljq^T?HYMbzGl|Bf#Gw56@Xbz|LPauT2*4KWQ4-)k ziW?F7@ci;0q6~v}U0-QMv325MRY$JKV)O;65jij%&G93@;#^iZ93}9(W4Mm8TYVOI z&_qCp$E3CtH^;R+wwf>)1?0}8vMZSStF4LpE@jeH=W6u4l4`lT==R&V$Czn^^Fd$V zr!E)wQ6ubx=k*C@UHz(0cp>D=T%pJ9(n3-TUIlmD<)^+sXOO<^T!fE#!yMCdGYUo? zu5i2k8Sr&2yF{oq28C=~T+Tq4J`Yky(4n+O;m->P~DeMm=&?e#wh z?9Y)NS5lrR>Jw0_iEOZfHE`8&jOyfcvcD*n({8};1kgv4sig&};?$E`@AVf`V-*zK zX1489`g?8?Au>0{sWY)`Pi9;+mn zBmx{=xEMD|0tQ8a%QdC^AP-RDio;04Wqok5fyK3FZOptOr-i9Mtre+cbeR^V7=3^o z`KE9B@N%jxVrDFQCR(Ik zw8;+P>lyDwHVfrCRPU;}@2u+rp#*Hpf^6M3*`DF6zI8{c;Z_r2 zL9w1fEUYxm&P|)^xODAE>(?U-RqIk&PvPmCTcbGK?f43J(JqT4Z~I*BC&Af#JJG0T9GlRt*2FX zhtdTD2d}l-EWol4-?(hww6QlykBhnnNYq*xBxPmk6uCNuGjv@E{GUu zI};C~*N6Q9T`eOD%9ZY(tsJ}Kood2?iQodmTYm5<1P;iHu(jJ?yszOMj9TKspmH4Y zp!RgVK6Dq^1!Cnkgca}rQ-L1bQ7@zLa}Nmlx*tiz9KDHT9|eYp!^o(>!M-x8^D!XY z@H8qD=={{h1ndL|K(f2CG3h;00?EQGRes%=WCmAopFkSyf%28%Z%Q5PKbKabj_)t_ z1*0(*%KPkANLT`IeB66Kon(~*dVdcG!Q(n>dmz?s{8)SlNRtO~wfO6`n!P1o`E~5xK8t&e^106Q?N9Nm@A@3}6N=Q7B-@&q>~=+pOe zdV4_(SMg0CvRkUcf-|zi>+!@YycV}XdQr^RfF{QFd?z5bkGYZBrLJPdMmhsc8N2#; zE~+hLcVXazmr@Q}VjYB-nK+;-Z6z{Bs>W>YSP9|GQa8As82pM2=`wMJJ*+g$)ybxq z&!d}aM%oME|3Rm79oah4S(4SP52gec4d(YXkXD>a6v!s|?LJWPtDQ%$I5czg3iOrf zRLS0j4z6oGF!<7Z!!&+*ZuG+2PXCA!(Bo5jm!bD#<4yJs`MFiIyXD1%!M)as^;^ML6?wFFUhL>B`2c`i_2zRed5bFaJ{R?ks#K^iFm>l3F^P zPod)YzTrYtwN6_rz69cW_oaowzWH(2^2y=rlwRV`^NRses_$yuo_#rp(fQap+tPea zZ!7{TP*>sdq-DANb=5w4EZ1-HaIpAGX!iWS>@Wd_23VNYxzk&3US%mbQ1Idv%ep1#EgZR`ps|#feIMCO0q^}DuY8~a-I^mBqDeC3_b3qH zx%ZGWkB}3QL+tD`0G3&?%|tP|9?xrX>U$%wXf43{6$@r0-XZ`2D-Tkc6aWH;Inl8L zxDJ_(8w&{ho1iNj9c-?9jQxQS0MgS<3I!fLGcS=G|HY#NWzd(wYGRMbvPSn$5_zNJ zSqr|a%?EvHjs>Sa1{d<{Bo|u^AMlVRQ{LFe^Cepw@E;ooY{y^q4NnHfIC=+UDt?K> z0e^=X-n1gkT&sOZkz_7ckz9|?l8Z3YuW@jJhj~DG;4RfN=zfglA*3>ocZogaQgHsZ zmP)(rrysaftu{KN+LbEZW%I(|NRT(@NjI-)%=uKwc(JOJ3)|@AoQGwtDI_9_cHL)j z7vNMzya6R(P71@)QO_Ns3J<5wr?&PW;Dm5E;5KaIVRO+G-9W>R@hDZfE^|BSI0HLb zw7kzcp>Pv4|8C1pq!K$Yb!-BlFP*3RjQ6)#bD3`%bG1dG;O|X!aH}-)s1=bnTd8jO zJRNph-+%*b*Na{Vo^mwKXO4(Ki#O&-8ceKsR1| zPkIH$v8sLVG!Kjos~eh^?)0E1zw6(6cHh>`4^(B;1PERP5~vE8(^JZB#LZ`TE)Rf~ zJsIyFBJ3~QYRj(?Ys{vnayT1kjVwq_K|S`IHg;_^HgPN(2vG-mFSj;dg|KP@6Y3NH^(+ zM)(+q;%_*^wJN1as#vG2n6)i^ch~MpQtb;^8rzn${D+tKrjsD?ZBHA|nwJgWfTVuZ zQ?2UzF%~pc5tTll?75LsQtVGLc?`~s!egttkFC7|ZC)=k; za_!RUR6i@yJb%o*yDq1$HL8aK{1mI1VENr3rFVmycJEZr?1D{Chx?mrEea8&jC8k=!wc;{M(D7Uz@W)(UR=&!Dy~sgp${xo#H^V-c1mECdje14Dx! zYY9R$gQv|@X zC=k&{#%FksZq*3;g4La{+kGa=14+l_+MX5+m-c}hksGB@nJzr~Z=}U5ltCDM=g_p% zm&KS`zXpJXZ#XaWsCHx5GAA#xF8By(gIt+YJ{Ff>m>^wCVoF!-ZC+a_{_V?wY4NQR zn90Lyk*}nM?aMNymMZ0CEQCS7!g0ZOQ+4IJ0=g|tm8~YZe<>redOS$MSyB@uq{WXt zyGj)3r-bfh&hyQKH0CT=dWvmAxiwN>^mK5OeEY-T_VHZJkWv^hthm(5NvHm_5y`QJ<2pV)u<4|a`{r}*c|C%L^JOmd)=oapa#=#~B{7nvdyUZd zUiQfU!i?z}d|eV6qV%EdvcV8E1%37_{k3D`@f};~r2*Js*nRMKbHmq5^r_ly9N}ux zmUQo#C)GaCF4|X?R0(broNS|wv>ZJd7@AWh2Sv@Tts|kyLDILLf}q-md;0ELoDc7# zP%c_Y=rWZ&ulAJx-2OIo*P@c6F+>9y@35qDP$d=W7lS z*^b-Li^oiQDDA3ab0Y`}rEP-)(beuRuXl;>ZN~cU^NcoN$k~(qT7{LbYTIy_TY0qx zl~f#$99db`wvMA*lYS1qO`$X;b;Rp9bEBdWbkOc`R65*u&a;;8+rP?svPVegW%I1x z*4>28JVMfi>5Ec^*9J*-NnEqe&0J;U;A}%)VwT6&4IFsN`}96e7|+hQa-2V5$Yifs zhJFQu=2x5SwuW)p)fL&)RJqf*DER|_+i2Z_!a-VH$|rLn628ske1rVV6o`E4>|MfM zvkgN=<;`MHaQL&-C0YZm&@cZnx&Yn2&}y^Xe7SCS71bHjNp1`P_yCF@P&u}@w);cs zwf(Khwc2iTt*?h_n}G+&5)^7^Sy7p5HXZy?`swzNQ_s6Y8Gz_Pvd~BH>?89hoel=F za$a!XT$#MkZd4eOG>rTgui?>km|x5E$U~txgJ9d>^ms`zw^oY^-NJ zRiqJSyq7EcN25(o`}tQ9RySGHOB9AvW*mk~ncpz_+Ayt_G#w8Ue}*NV2r@>qr4C1< zBa|vCDnH+|;m_-t4b_4hOw^!KTJZ=fPhoF)oX zomC^qD~=k@gtQG6>)OH<+Dyz+f~`;7uSwnn0rZyo`7sUk9MU4zc4cZ2dF8RYkxXC9 zUv4&eq}geUcF_N}X{X93Oj)zkN@1M~0s<0{+GJiL;1cFzhv*um_Twh0+PU37-Pj&GZPOet8$ zyx~qV5xFdX#Lv1V1fOY)R$;mcWMa1e$iG8!x*_+Wz<>>FR>_eIH?^0ZAWU-dsYFba zcP31bYEhfIpT?esueKvbd0Hu` z*KorpGH+|is5*1pjEIcoDxByQCr7x71R0MD#(z&7x}3$>QZqH=Y|B~jaEl>C7Z(l( zyOb;s_1BDB6H5Gx+WNOYGx%RPB4=tionEiY>2G9;lpX$dtQRv@!o}s{o^P+GsHG?G zQQvZob+wvjvG6WCZ)%e3$^WuowYQ?>5ONB;=8kWQkVCbnviFQ^yPp!C4qJ|IIiX2& zCLGxBwW=~?cA-Q#TAZK2eCZKE>xK^qkNUrKNR}faJRK2UZ-&5GvSRM@>294I-L1d- zoqYYW(JpWxbKS;UCtx^*ajmFSM{g(X`NwkWhxo`S#wMrXixqCWmZqx^$NUx+tiH;K zPAaPKYtcG->VIMn9(dhvv8D~L7iM57p6b;b1rXut=GX3hcjgZ)QaRWQk(-GWkWKKf z2I=>EN45djGCChqWGF`QlADQ`!_;BgMWabA4y5{Hbr3%e~igj)}y&gPTI# z(XB1XEN79SANgzei`U_3daqDMkveHQKbUI8-b~nSGk-L*YcNfZfkwgVSgPpwWlpjnvYA@&l)XuYNp@?43XizysB%-^or9d!}Fhi*oej zJ5U7a8P|@6L4MT5WiikDf_U2QsF^#}H?w2%J|)65j$S6W%5`tO@FC)5@BYogKtZZQ zU7zLQ0tU>|K5+6pY$-?t5&r-=C-8r?-HrJ|OkN7e152m-A;kt8 znJemU?gH)^+PDALm14sQ^LcK`eX74-|2He<%<5@tO}wi$SvJ1c*?H{Q2}y~U$Fual b39b)9KP&>i$^lD)7?nemL?i}}{QsK($Dp@_ literal 0 HcmV?d00001 diff --git a/assets/img/skins/liquid/liquid-weekly.jpg b/assets/img/skins/liquid/liquid-weekly.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9d3e3c509d1e1a05cadf4aba3d5a21266f72d65d GIT binary patch literal 16697 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/list.svg b/assets/img/skins/list.svg new file mode 100755 index 0000000..d41f4bc --- /dev/null +++ b/assets/img/skins/list.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/list/index.html b/assets/img/skins/list/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/list/list-accordion.png b/assets/img/skins/list/list-accordion.png new file mode 100755 index 0000000000000000000000000000000000000000..16c8a0f1e39baf96d3ceb9ed4092640798b24ecd GIT binary patch literal 2444 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 WfIP=ygYxR<4WOo^i7Hbt!~Fw-adlJx literal 0 HcmV?d00001 diff --git a/assets/img/skins/list/list-modern.png b/assets/img/skins/list/list-modern.png new file mode 100755 index 0000000000000000000000000000000000000000..5d2398d14c13c1377e718c95d0b0aa4b4a64c65b GIT binary patch literal 1375 zcmV-l1)%zgP)D3K{9SHqsim8WjE4B_;Vn{GFmZ;#>iDv~$XAP^E7I<1-}8pG z$eP~pMd4b9000EuNklvEeg5C!0~ySgE;xV`_oc13CIwvMNrDQPD?A7;Hs z;ZM#8g@A~Nh=_=Yh=_=Yh=_=Yh=_=Yh=~4ovM$RCU|-#i-;l={6Hvwp!!+KIXAC!> zmonufJ~aB+=mQyJDtjHr29!LD-;u@*qZb)d_K6vorwxQ<2iDck{pRrN$_B-RI>F|$ z4ZF``Wt>-mjoJ$X6ihCAGK;BaAf#f-kXF;8TZJMS8>SO`dZ()cb_z}HS2@w|G z3nY&BK+0aGyq6=8)aNj69!B0|ilYZInO7Mm0AZ8~Ips19XOYhyh^V~yD1MZVK+>Mz zVnaiWNu^ne1~EK0^ykrd>yIoCC8iidZ3V3%lvE>rk$~Rudx5O0mn1zIffN3Q@i$k< zvOX>qa@Pb>2P;j6Q0gE0)j+Uwb)w)oq@cd z_#+}01V6YAW zJ`jU>Ai+8Y@)(G`Pw}7zFJcCmAbJ~m8xjzYujt1M^|Su7;}4UU@F-Y7NHxI{BA~%k z%`ahMFi1;$H~(NEME{(D)Lzkjo@^qfhx2qkgsodLh^f=E9jFA(}SfQX2Q zh=_=Yh=_=YzOZx0I0(Zq07c_;%l!|`21SJksx-Bt_a@I?EH57b004kLiSe&Vj6WkW z{%b|;wD`sNZ!k2*FJU$z6WfpRD=I#T@h_<#;}0?Z>BRVR2{Ha$KE?QBbo;%D@ee!d zLu~sP|0c#i>JK>`4l#Z!pRMg<{8fzqUQLWYnQt-vaz4iY znu-|zOd-afiWq+~V*I&?@h2n3pUiuVzx87LRg8av8l{97e0E z1poj5000000DvQ@@kL3EClpfS*XoAGrN-xr$*FNA>;cWiUTWNiAMM?-4uUWghEZ-K zi|_xyIw^)gA}RHcoHI1tJG5QC`yw^|m-bWRO=^6!k{S;qHJ)Xa8b9NzZc^jj2D)@H zFH_^Q)Oe>?Rvk`_m(=(-2U1(Qrp70!@v~FoZJiqTHy`Y_OpV{A#(%3xjfdGvjo0zi zc)fR0<0Cbx@hDQ`VWh^hNR5Y)8V~cC8n3<7cu9>9Q1x7-#)C+WhmjhOBQ*{HK)xcw h1ONa400017-2=}8On?AwR-*s_002ovPDHLkV1kxTi5CC> literal 0 HcmV?d00001 diff --git a/assets/img/skins/list/list-standard.png b/assets/img/skins/list/list-standard.png new file mode 100755 index 0000000000000000000000000000000000000000..94ab1c242d578750ab088fd3b8f5d9f770bccd62 GIT binary patch literal 9863 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/map.svg b/assets/img/skins/map.svg new file mode 100755 index 0000000..f0de136 --- /dev/null +++ b/assets/img/skins/map.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/map/map-classic.jpg b/assets/img/skins/map/map-classic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1ce1c693ea00b8bc3a9a4676f7ffa703bb1d027d GIT binary patch literal 37146 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%0A_mrhaJ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/masonry/masonry-classic.png b/assets/img/skins/masonry/masonry-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..4a0a8de595eedc97a233817f5b2179d9e8d0a9c9 GIT binary patch literal 25017 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/monthly.svg b/assets/img/skins/monthly.svg new file mode 100755 index 0000000..096cdea --- /dev/null +++ b/assets/img/skins/monthly.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/monthly/index.html b/assets/img/skins/monthly/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/monthly/monthly-classic.png b/assets/img/skins/monthly/monthly-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..37d307b7289af1ddb1f6e77cb89a6548477812c5 GIT binary patch literal 3348 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 Msgac-8SNSWANfs9Pyhe` literal 0 HcmV?d00001 diff --git a/assets/img/skins/monthly/monthly-clean.png b/assets/img/skins/monthly/monthly-clean.png new file mode 100755 index 0000000000000000000000000000000000000000..b5f6ab7ee413c0c268e8c9823aef20e5a18d6f90 GIT binary patch literal 3039 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/monthly/monthly-modern.png b/assets/img/skins/monthly/monthly-modern.png new file mode 100755 index 0000000000000000000000000000000000000000..688725c14b3da14115cbfb9135269fb278983e59 GIT binary patch literal 4881 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 BnW+E( literal 0 HcmV?d00001 diff --git a/assets/img/skins/monthly/monthly-simple.png b/assets/img/skins/monthly/monthly-simple.png new file mode 100755 index 0000000000000000000000000000000000000000..d5e6889ec34bab58ea1e0c9c4461e3e1a67639e9 GIT binary patch literal 10899 zcmV;EDs0t>P) z_4V-a@$2mDwzs+8;^V5Vu)@a5)zi_To}R_NxVf&Ph>euT)#2F6yy@J{%k23H2n(o} zgO8%K`tRI?dT~8GGpN7RTV`=;ZZ}2P@l^l$e*gd}{YgYYRCwC#)zNN)FboCIYiAiz zA&>zv$^ZZ80uPm{?qM)3qs%9?=>u1dY%HLZQc5YMlu}A5rIb=isb4`~ELEY*J4&uC z*>6WhFIN0^LhCUGj48|=h6yoJjA=pn0gPSwaGyL*g}#3Sp$M&!r%?Yvd{<*Dm9N>;-XcNS_7~iyTnIsqBL2 z2?5TsC+AFKJlG{rD9eIY5^j>rHX*G@LKYx~c(MTj z0mhOgQ}%T;##*+-1_*dW7kJTMfR?;2+Hva_v|T&wudM{s~z_pkv1*{9r;LAvZBLpX`@`j+-zLM7>MNnc$EZ zSZx0PN9(%Oa$2SJPE_em$to9dNRQdsiNP4kUK_s?CvgbpU=$E>;#N0bL|jjZ-V~bK zJSIzP97Gmno6KgC)4Cbb+B36!IC46@`#^Sy5==B&RsIw zrp2fh2z3cFGA>5hCY!U9I7XwkH^@okq~h)aq2uV+1-R)ub3Z=0TG4~cpjwYw+pHG| zAJ0fto0&7Y)b;@G@h*!=@rx}`E1C<|Q)(5fK%0ro+hxceq*n*>`?iFe%vKw21)4rx zB?stH6UJpi<$a>D&2okEkIEi4mcPD-aB1n$@o|aDKpXn!dkCxa@|jkw-iNZrAs_j3 zNmXaBOhqx#2XE>n*nj*Lqg0S4v~ZP{O7GBUz^aSqBZb3M3~-gbazZiDI*@mLhBBqt zXzJ^6gko4Rh<&}mz61GWg9SNy2l5}eF+!8Q?%M?kWZdEnvNvy+mk4C^9$FzjioXFl z`eFBoz192h5`k>9NAEp8AlO+p#GVgN24ZbzNrM-TEQ1_&%ktneWZR$|H@^UF&fXLb zTp`x>7eJY;H5TGJJP=^AtB(*C5{WEipX$jK!nOyLd)tGY!2+4VXGp3=AIOxjh~1H& zyk!xx%fq=$L7eHJ71DKG4`5ji3#5OMZSQyX%Wk)A7>2@>bVQ2OUtl}P`@iXEuN}5! zXxBS8urFjr7QZOxfL3_*A?FeH>eSCB>{TJ>685T)vk7}u$hm~w^F|UA4?tCXB6v8v z&o8ux12GYmkSP77Y*8GO^%jCyqI|5F?75&4J@)`knzu-y_4H;4s1RA$={P2Y%r<{K zyAw7BMNcCm@iZLf@2pKICxVCZSQtsR&cmM?g-C_FM=xQ>*0?g8DlL7i3e{G$5wU1( zx5-)6Ry7^{uL^+~>w_4|?1ucjK+0Kb4C)M^*oHBi4Pn;>xQCMrXy zRONi1Jbmh~cMog=G`PWxr+{<6(-2`(u7Uy53Rd$W5(?+{G*pEZ<{|)$ozdH@$clQK z%qZ(z32eQxBIC`F-2)W}!!onqKucadeXuk#h?y+6S1{y{tI+dxG=RZAKSM(QzcZwK zwyykpo0dMwlUI0UQK9s%)+G9~mqz$d*_6M2sGIzTPw$xg*)~H=zqV$0LPSTr$e~V4 zR}@IT-#oNF1g*f7F-R%dP!^Tve_2Be;2}c`hc6g1Z^{Meg&m(EjM1bWF!T?Ox<0s; z%2xD1OrQ_!JA~ACgt5uDH)O62;Ms}>51CXSycjT~k|x3?%^Z4& zVRRx;Nil31o-1Te2r=e)C;3tz;z>@;meY|Albi z)?;!+45@#6L#|H!Ou}BB`niO?D&%a!UKMgKVXq1~o3K}f{9xx?bl3)AC~ENa1M^7K zrt1Iy=~5-zvZ>RuNt^b_H30;qv_3LaRL!5|*f;mdUh@!cDB$ zgp4uQc$N^rk(YZI#(kM9X_z-L@B3*lPfvK05M7=Gh9JypA4*MpF~AjG=C6-VN>)MD zjM0M@FeZbCGK?C#1Z)7_{skZ

    YySdl1zorCSAt6)Rn7(Ycr^O@;KhWa)Irq!Um` zL#IYA5s1cu*w;bhIe61DR@DxofB{eE?B9pjbuerlY{`(Qlf*K2WfF z*QHTGnS)B8=+x`2-)1Fg`zs99zaPk=VjP}C7G8KlhHw)R@6K{-lsMQ$h;!s)gb4TX z5O!k|5hHLScM4{46B?GY%biGBWCEM)Kp4W2!O?|Og2P!}s*Q#*T(}Fn$k!jwP1pns z&lAKLlG#1;<4)1tWRs`A9>}$+|3Qu=CYo{(k1XWtRoR#*GdVFarwq?IjO1kpkFMot zki9)A5+|VnbrM>y3&_vkH}0+6RL2Z0L=TMnDD$GF6|EX2tZjRM;k4`DpoP-Oq32#(gozCn0CnVIx%*$J-dLM{A<8j7C-+;!9$e1il%drNx4(Fn6Z&YX3sQSm|gnF z)15}PJhlG{$Q~hSQ$A;V%6x9{rhWC>Go{B|pad$YickWy-j!6b%5R;fxyG%Rr~Y3+ z(nlcqCH@g($^2E*yK!sUs2n4tYEth;AnRsfO74*%~fWctnd+g!;Uvxv$uCnS%4JN%ai3Cmt2u9=bJd*7Fqz9F#GEdSl5S#9MTh4A*+x|M15h$lF~|^Oy6Hkr6g(VSPD;wn}K zh&4yggu>Y@8xUPN%2Gi-_K66*8f^fZTsohQ(@@C&*F!!7$oF}m%Vqx2by8xJDfeSs z>pUy+G3mU-1X?D*E_nb|jY0S1;kf2ym{9QnmC7yzIJ5&)$97 z16@vlXn1|7-p1uBsm~K`mJxg8!T}H;Y?kj9vaZYC>BYoW0uJ|;ZG%64pt_023y@VR zM=%Da46#fguSw|PoJNYAZsY4HW)UCwtL`(O|LOzSx%ajiIO>ee(Ci1&@$Qo)6A=JH= z4FNXr5g;r?%T6zxoAdx1T0&NnwC9i*!czEr*lU&&5XuoCbYQ2OCLn>o=q&5s91?s; zuzP_Z2Vmu6Nj-)ZAPKrf4{nE+Xa;gThXmi^A#g{5P~fJWZqIt$0;H7YDoZJa25Iz= z>bBs~0;C-B5KSYRb~@E2J@Ty{B033$9@az6(vG805Mw91?mhYt@^G}jT*?gS`b+u{ z1=+cAv|i;NPM!1_i5&Z7{7HStR|f(Cya0icPk;akpnEzR%kl+f~+Mmi337YtfF>hM_W+B};z500!p&f3z|)*_};tw%Ih@rfn`@EQ9A}=0<*k z|Fa%4bV2@c5Am=9xW^ZPeSi?2%z(GjdUf4&?jhg(c0~&ipOb`#b;G>b4}9(!pMT(6 z@fKT$lkd#-BuL1#?0K;xTe#%QwjKG{E_q+}ZXf%;{}n-^1@WZqWZLaZm?QHl`&JA?)fI7ijrZ)olFoSqXDXd@C%!~CzVf{ek<9s6@{)7j_jbKb`C@)?bS3t(m$FPd81R(^2HgDu-px3? zSUAxwBum2k&En>QZJvN|+I_MAwqNj7WNbXe}7=G+s-4vI5^iYKh89UGX}l~ z)U=Q9ip(K6h=^bmT=neSg#ssGSZzh*(sr3*s6 zuqyjk$W-P1qp-+Yb+xZcS#69Ny~~<*v!gLM8l_ew%0dZpn3%z zK+v;CP!cTaFsS?4Td~0h%jb3Az;CDatuC(fRsX<8H@@NLJ$02lOUp~)ydRg%oZ?uz z8n%_L$F!Gs%&QNt&xgPfLXFE9YGCT2y0=Ud9ph3xr&0$TBUP_~e@zg;vB-j$2-h8C z%^|xavBAuV!cRUzsm%L0DIzkxT@ax4nFEFp z@h5_e7*f&D^JzqQ10MPM_MMO8jZec*i!3kNVm#%LW7~@9(P80D53{Ea>#4^WlsR$@ zamA<>(>DncVno(h(1*&FPZ|G99YfcTZywS{6vo`TgIwA)mA#k-7VH+c-R!TP`fnWV z^%qel+_vr@SK6m8Nj@&tLA)GzwzHPk6!maN^xgO|#eI!sy}Om=FGxX~EPFEzD7RxX z9DDbaWjji*+rgmWY(168fwgdyIAQ^fk)kqdh%q8Yog7C^``2ji`-?1W7%8)u5Z6Lk6-xYulbO_>LJ5b3Z3qevEjZf<`<=_F}VqH3c-{7`)3U6 z1O+05c+Sly^e}|z0(&1Li~-VOCxi%~H{AH#oiE(@UbM2V*Xvn( z(6sYTdEa+$Vw@x6e9R(3@x%Hd3C9vwf)Q{nw?BFGaU9lQmz?v#lEO&g;{|adEE1VO z1V&0hcu$0>%=^p&D@`*K*%eP8BS<>=@Ec#+kvgC3a`F{<>lITTfb*CB!(D^9iOU|RVi0OB2W?-GZI!R zs~~c+AZwr*l}Ly`Y%$A|&pqR#Z+!B|_e>CF3Lq2)O@P}5GDKXc!UAvF;@~ZFV8YV@%E294m5BbD`JoAt_ zooy*iZ9e6wHFY6OkZV7u^z`;U1ZNT319%S@EO)TLSr7oxlI`qp@Rsh~XR1R!w;=9O z5O2OwPoL1LwL8QeU5;jos5US#G2=)eNI4XljnBr?7>V@SaQ z;MZs9r#5P8TbpkVVGh&P=%zuF0Sw5BF|omeFb_ParSLeisSuPSYpGKN zMCFmu7k+I{9RyKGFpmwH=bu(Q?Z3 zHRZPTF|LjZcLaXrU)lZASQg77lrxfY-K zS_JcRy@mT3T3LUvcO{B#qd;_kIXP`huCxFDqdSt_Tusu*>85GdU=SdlfO#GvWNADm z0K@Hvm=_#hhl6^0FB`w@J#~wRTCHuCYz4>`uP0>Q@5Aya2W)WhCs|Fic^*zY#B?6`~Vo9(#1Kfafc z@R$(QT!d7MLKZM0QBjou(iD>_!W>lzJt%<=Q6X&r9YH87Nz7j2X$NId5%Q#Y@v~be zo2j6L_0(#d{3LyK5$O)2uQ<&JrwwNaqoYXq#DO zu=WN}q_Jelgn+(#SA-o`Sh{3W924N&=GL(*52{|jBjCdva<3sSRu6Y@g#okSDgqxP z#1C*4A>Mr0j_Z4O(-pSg6UCH*QX(Y)B~1fk(g+%dfr2(5`2L6qcoafX$3{r%$f%Bm z1iq6zM=^K_DF{5*kP9JWf0cc<{mvETLxeb^-*(#tJFb~S90!#C`Sw08?pNwRdty4J zUwzr@gnavU6(KIpkDRjl6so(px#bDw$^cj305WcvL*i!}pIK#b*uimk#YJQVC^g;I zA-`xHa$6XF$Qn=#k1Emw;pQ7*R$94I{-8hiHh2NI9jD z2!MgbYX((Hkq9E?9Z2+oE(*zuZ?{f9_KP7PU`A2|78twIaz(sehsOJVwc00mt!&+c^m z%1M2W@0~+(#I>)FZm$fv9~aUH3iQ%NWW1CHKux|)!0jFsSD7lkK}g;KXEY{8V8}?! z#l(u>X`X^)Gc@B|0pR_(_&TohRLmOBRa-$Z%+**5=R=&2h&WoWV2CV+zw`FH@q8LM zan@xRhG<}|Eh{BxlMM63r z*QeX9PGF&;RqSJ`qY?%(He6gmelFN?kK+rD`>kNnJ-oRN zS@#<9B|Y2jp?Ie6Z5*L`(JYVVxN(8F|EY$o@_u~?;qST1I__$lh2micn2<0N5^1H@ zW6=hqLf`d-FReo`bMPRH04A8VpmaoJV205$BNj0zYlVZb43<+yK+ki=z(^Jct`Pjm z9Kxn1%$`s>TWV5F2t_%mE?Ls{R}eDSDw#(e2F3lc%VAdpb7h7s2=%b*yKH&)(mJGI zH#L%+009SQDI&z#@w;&n=`s+dw55WW^p3=WfReqoWJa$S3d&e&{A><^0>(~k#cU2l z?$g*ISVcx;$(8>KLKHO1j5BLnHH0WnDL2ukFjSyHn^_XR_>jX0@Twc>m(C$NSTSV* z?H-eofAqK;m_}QY+B*FegnaFri$7VZ$JeY*2h!A$rAVgCf(YY;l!c);rdM!f!SyFN zUU2PT7K4pJDp0Y4!mn*0>U&v93<@n>ns+&boB4SBg<45Ky^%u^R;M9ctuD%_{l z#?H%x%$Otyg_vdtVHU_K)|8SG#dMgwtb-d-dxjg1i;(}MN&Ulf2$FzM zOa$%&dOBE3ky=WzRDd*SZprKR^hZwWPww^#$SOFEYv$s_bLmMdQQ=(SPyEHO2L#G1 ztqp7l#f4n~1*bBZBoCp@9^ff1KEYvoz_sr#kEN&ig`A5A%eQvR6p!ZiWakgsU`!v8)484kr`#6qHhVu5_mi2D$bL4H%Xw zvzXZ#H&?6KES^Rk4UQa+>97MX)i_UM>S9G|IFjLOgeZtMH3ks@kdEC1X37|`u3t9J z*ilB~r-B{f66wxeEGi4<(B2iUQ0YM_A3c#YIsFLV`5D1Xm$0bAv z@&507f{Xomg|Jl6t%Tfbh=}B>s+e_AwvLN#*kB>S5@$vkI8M;ncOzyJ_^u%$!#E9` z8+aY%vICJ!xhg9nFL6#%;+qS@mnKbpq4484MU0XdA34qs$u-i%{7|wG0-xa4Q`X}- zM1R(-ZV?N$uenlBrr~}-c~QcCon`qiq&rM=G`UV8GIR=CE;Ps5#~6jlo)X{)1m);n7_3HK}YaNYQ> z6U(1>%KHAr+3aF^cU3rhci}dNykib|bU7Nr`#;IUf(UQn+&_H2!lW($nzkPz;F8Mm zIvj3#s5Cv`-g`E=U*fBHG$Xu@yH7l6RA?QaY?W+YLPoikkg(c<*#3t6KMvY0$mtr~ zHxC72eN37ed6xc1lZU-@vWm=|*8*#8Nj7Z{Dph{zLkR;edI6 zx6NA0it`TdTtrUgX57ic22^;!z2Dl!!-B#ogyWmGD#A;7S1b57ZT-H%LgK2HA0Pzg zW7@Z^gk)FE<2RVM_P9H48zBJc9(Um*yd%CW^^R*(t|33vdX<;30`}gTySi<7YY)Ss zmLDMG+i|;jCWjoSu)p*6x8qhquE6#E{wk@P$R8lsD{DvLn}&Qf+#g9uZwVm564J8= zz4Cnl{dfqy)Cv$$!0DaF6ITMf`iq^bm#Y3V;!%uQQ zo*d`kd;beUdIQd4_}xUtK+G&$6x*1hbYm%uz5ZybuNf-JsJq?! zmJ<{x6>>!s#rDeysl0S)vg!P!v+>!q24F~r1y{%T!asJNpQbi<V@$oe->ff(nL9 z6pX9*I41dx8p313&O>+t&fM!7DGr0;;}&nr5M*A)b#lwyoM4uEKvNe;0SZe z34FUo0?EU%jrbciB!x7NF)Ra&F?f8onAyS0JUtqC1y5v1aaON%hOJ$9F!Z$kSQ&DK zSzsK`upAONfP$pkq<*`~`t5@Kh=%lP0unsHY?vAe6t0pax_^TZE@+7Ci4jNYDoPSE z6vWtuEZOltH5~9!4M7|g4GXpcuuOW>Y?IcxlHnVK7(<4oMycG5A53d_eqkz0wHqPV zoO@K0BDn`(?4m_;>t3pWD@FW`x1g*^)?Ui1kLumzqPA zZiM{H&Kd1E2m(=bP}WvO<=Tqi|9|L0yK$c{O=?ZiM4ygBIF6$+OnJ-tP9Z5n#!IJl z+vxQ3wwZLd79q!GNGnZu)0cKKb<-Q&+al!P8gf-X@vH~AroB9}q|}fiqMPO`a*1&--;a=J%PsUe>>vEL=6<}X(L4_nb(y&rNo zz5`YUw-c3myO0GyB?0X6X1i^hY-!`T6wlrP_)LymPU`^31c1YyBOGyiyO6FD=X=nX zu$4SqY?k9j`)tWEA%hD}MsOL@iNL}{n9GnsCQLX$NZhanN8ho3F6_pK#!VbB@Z371 z4N%<7Iv9bK85|~$5%NOR%R(j?2~O@%WMno$_IO@qs2P&cv!eGMnIQ?ZSY>gf5Y;0? z$aQ#C$PCx6QAz+^L#!neWRJH%2V`*K8!D4kv|$$51ua%eNRKw;2vIK!3C=kqqw~TS z^(e%$p_fOz+4-91d^{Qtp(I8xrf7D=MFtV0r{XC3k^3_tSA#dk8X&kXtBCia;j|JTHR zt_&G;sH)|=TQuEhZTy)_f9BGSlHMW2dvx`?m2SCwyjUW+9PdWZ!@kcD%`blDS3l{1 z?)^L*8#jNZ+q;PVT|oL7SjDg)0)xsBcUDBYN^7VxN=5lmT4NlX{}tD_9*CwBG^Bad z^N?0O>ZA!QGipmR7IY*N9Q?w`R-1HfU`Z8mNOwbk(^3^-je?TcQJL-viURD~WC(+S zM~~_#j>DkFD9)(!SGW6s7+kz_Vr|+LFFk63#Nh$0;Kc)P!rI8Aiprw`;$h7Fkk&wd zmDYf9NNXS-%sp56%Hf5x3&+3ZI$488<_&l>IHh%#d&pR5#oG->+Hcx$c&B0*hXU3MCft0*R56Rl5KK<oOMSzU@sc-be%!8jG=O?5#nus|?vH72W6r49+u96#;oazw3Z}W#Cee*>Tky)V(MIB$=KrGcOA*>{1YA73Lfkmi%dqPyURgjF5%^QeP zEhrHyC=?2$xVC3QH1sV85x}kWiU383AuGA`s*orx2Qs8LDg~5GKq!$EiIO8eUKp|k zij*?eB`AYHN)WJh*0(2wMzxTPpxr)#AzE~?Q-neygTTB!8xj%`LM3mtXqFm4AgYy> z>jvLSThWeV$UAi2zNm({{Yg%H`Vh|tts$q-{iMe547wlHsh>i38FDP$m5`(9E<=u` zyApCV-DSwJbXP)-raPS>duNEGWgp`;>*V#UlVKmW>}2>_Y&Zw@28LbV#l^4o;D7`G p002PH|JUsZQ~&?~0001hfdG@xFawY2UHJ*fQlz^iMH-}$&M#depu`=& zzq{^x*Sp?--skMS*V*UU`K-^``-zA7hcy7Ms;Hs}fIt8MLOsC44?rFOgZ|Rr68x9Y zAb(4AG&Ber208}DzZnw-#lVDNVqicYL19>b3H65k2n+jf=?X@NK+v%;F);sa z^8Zyl^Z@u!AO+}vfban@J_v#jdgueFQR_tiyE@>12n2?pp<`e|VJJ5FUlxk~hly(b zm;JB^U_(Fv7!HA>Sa-Moix046hFc@q7m}&o8^r9~q>j&wz8)PbYJ<5Rl#Om(=6UER z3d`6A186MHSai5VfOcV2AI&RJuCB?A;HMAjMNvCye`tB4Urw#9-`+3zd{!>A;`knu zvM_zgu+^Gxz(DtArdv5K1TzKhf8QY0p1%lvTcD0U3D7u%7=F}=oKr?q0$L6`S8|o_ zXeD-6c_*qq3G2k&_`TN*Ob2|*!8iawFW3(Pl4KPV;c;lFZZcyWU-jN|9N|-Cbu$sS z+Wb2AnWI&U1;H28pDwiczHeC`E{C8|AY}VkY|qd*U&meVa|Gjp0G~>9M#-_5%c*zY z5`>VZO`C#=*}E@(+uG}Wnn`@`mvGTUeVc!wixC9?a@H{bTNl+6dPFc})LC%kpAimw z_mrb#st+?y^=jb$l`D2XeO&)!i7mD53cs^%bt?z$l%j+R&&f22S}xC(ewpocQKDu* zZIv0|E`#C`#a$Z@GK;%JiXlKD|NL%$hnFci$P-vs_+H6v)_zZQWx(i|831&2 zp^;IFk{RK{MCgp0t#{RD+t1|Y*FZbX#8_5jBcJ=0^fQ=s?e~gSo?pCB^^Frs#p*yT zXrXicZzRy75F`&rAqItXOf*akbo9Sm6o3FUd;)X~dO{)wemJp!tTr+PlhGxagj7)O znRx*nlTK*LB%h3H%_*~xeC;|4YfuydLDJv{K;TbN64bW5Ps5YD8)S{rX9AzKi#Lb4V z9CD&aXM8eXRH5IjJDZo9Be3q1zmfUe<4^1kBXLHbmGeNcbDWTdS^=@OZad{7?W06C zH>y6e+$V)C)^^IzQbZ0XRn&dvzA1fg*WyCAj8je9U|5!J4`9pHq0~Q*q*HwXbEzeC zM$-%;<&>d-AuV#|vQ5Xk$$o_uCux=e9+yJ16{ozBa&ojE6>VVp8# zPesE(F;=IV>7;U)8ACrntXW3{Idj|oo;#=6gD8yon+m+1Q)&1AO{Vw*R4#f0RC?bw zV_HzPe%R;UVq{Z}GLDpWYj50Wdb+TftyDj87<)83Gb>SX13I@%$^ZmO?VdFk{k%C^ z(fUVuadBfhL?%lIB`BA&q8D}9buSPOIK$>4c0A@~?9>I-M{-4HoI}}tsp_^V(@#bD ze&~;?9qE}ar$yiBNHJ|?SudM4XJKXvJqv{Y!p{`#`I+m)X88cDyJ~YZ^&0N0?N;Mp zA98-)7hvd2Iws7T#jhRh#(Juvny>}cJ`t+$;BhpmUGx(>OQ$RNx)thJA{~!Bq?L>* zHxLuj3w;!x zd61rm-qzYb-J8lI(o*<9l57{7McgvMK2{#P@VU)$?#?+SVm~76lwaBShZXvq!IK2b z?(AeuCy#r+d)%zsB&5G*s7qhRPrB}|o zhQykE{cZmJmimjoP^9(89sS0l;-ro2;t6_>Ms}hYIVJd>OY!n#pMKI-T;XCHPwL*I z9_Kmev#sY$UTM9CiWEI3_Uf?5@jN-aJ?wf(1 z(LNOn3ikHK+Fy?is4KGU2=5F3s zSBGu&mck!JS9u&hz0I8}?~|;q&a;O(9;uQoaXiy0(0mu}v7_c}=vuK1U+J2|)sGJu zULV4bu{6@hDsqkO&uk1)%}OeD=WP2KJ(v?ba#XdInH`#bLimQ-0yN;-URRpZBXGM^ zmSsr$i<#j|#(j_9%bKcihjof;#ZLUHaGu8Vn2Z)}Jq0xf(n@gpGHE4&szMnN4Vc%& zw0W*a_%z<1UbwC3^akQ(h|xMr#4lB_&^-En4uYk~SDXepWDatkw>yBn76=E*GUWo# zs{20Jgc#+xVANOBxlWlz{6elr9ke!2%&F%eM@I7ddL9oy*AS(4KW_lX;V8eLfp5L_Ue2}4@qKD%yS%L1 z6yVYJoy=lUJgs9Fzh}}BtZJnFrSC=&ch<_$;oxRa^qCgdau)lCa)`xsU z#-ns%Gs5c#;;V+B9*u9WV~lXHkx-$VYLY7^at@S1y)&))D5U%Ew% zReBFfR4IywVlE&58`L^%IV8Uf4FcW>h|kB)e)V1&R2ulWW5{5 zCiRh&T=f(>`_74-oz|=$=ld*|k~3QebQBEBX>&BTMOpG(b_BV8Hakxj6y1J!$)Q#o zx_A-DR8w2+*WFt>_wx=(uIhv3p(Ji@-$BykntFV>BNVaCUYo@zZeBK*I~`=3K1_H% zWt*Yz(nqaIf;%{a#pbOLgp~Yk>QgMk%aJYwFWbYIeQweN(&STnJs;3bIprbQT!7fY zD)E%K@G_`1vp|U1c4p2FDG9tcLrd18w<9?ZFKb{cVAZ{df#%0R`(4OQXmP!Wavm)R zWK~(mCJxbz8L1le^9v{N4Nd-dx+HYd+fv0-P0OqKytU1;U*}h#&F~n-=z`w4JYuW0 zbis(;*jVfUHg+Ry*C7^Z8tl+dDAvR|NRK;e!PWSN-8{_}N0#vc(81d|tl|7L|G}sa}vk&Bc&?Si4wk-QAt+bnU_NJ?yIS6W5arKMP=AnCOZ5%|2>smdaoYh%Y1n}h?On580T*eRK4YJvgk9%qrKYTQLd zU$+6aLx&+;%!u?OQCZ{JhG;vOk;pHB&xUy*^fWf(0xiEd&8?izF>2%$@=*D5$zzts zAy$09Upl~4v7G)0C^!)bN1kKoII_v~L{O^Ze|4X&K2{w{3};@#Nv)I9iWdV7J+5>` z8ZY^w%a^2Jk z{nwRs{Pg}CB-4J`2vfF0Gb@N7%+v5~zDi_Ro~vq+ zoB2ST7gP=Nf-eKfPIcCbL&}m!#tDtI-HjS>k)W{*0RJ7`I(ILKkMh%w!=pczU?thr z3+R(XGKq5&cbZ+<3y zHMa|sxM5(xm9cch?2FUQsFkfSl~Jn&=TBdatBv4G?Gt&6m<+zV#3nZP zUEFAx;ye5hkndkhx1_0Rpg`t-0;Typh|JA%ezR9#6TauZ;{(!x`LTzFrmR6yvcZ?M zTDX!)ei6M$BEvU2ZF*<~+~-vUnJMJ`5$j$cH9JOap?$NHZv5g%eJ zv;cxG=LaBj`Pjb7c_*rr{gRvtP5Wk}pRD3g{Z4rn!_{IN3Rf33?-O7!?ny=OUeP8^ zf>z@pYL2DIO?AQ4hfhjJQbvTMYRtR+bLE4>GknQxQ&R@T*Tk&AKOcb57m}>bS&vs%^l&^l`9pD77V}R_E+{&qmIx49+p!+jseie>U$?|6ix{N#dV%>6#(*vP1;A8bM#goQFn zZ>=IsNcPAj9ijv$_Rn%&Jo^(7K`$rKeJcw%T=2>am|~5G+!hBNStXH@+h!TlsVGZZ z12t+*AIx24E$^|P8W3`anR$ERB8pnA^@6SB(JUa&pX#RD6`kwoRgKhd{JcV^i)UYaUa8*&HAz{#+%uyPy9~NtEn*ebxcbV@e@(@e+*iZov9+3IyiE%b7?Ix9g%#2K( zy|z;LsBSR=A=03{;PEb-I}$9W2v%0_5kc%O^pHogI|`}o_Q)F8KO5C)0+07)qgBA zr$c=v%$u8yUCtn1TI~hd#SB^>rs~8J7w@1;-$&hZC--R z(Gz6Sk$x7XD#Qem5uEIgwPxgMOz`N@{k|R+$fe=(eiSjqP+&^^M5ofgot|8DG^+=HT_$p>3 z(H+{CXwPHujY>ENtLFvlmJY8Zq(;qlhe8c$PIHD++nWwjWUqvpA8E%qIQu%WUwc=} z_5)>9!gp&F&sb*F{lfbl9avfUbvrIj@Geh*Fx;3yra|WV+1FcL?B2>)+mONMa`H)n zxld#r>weM=dEzvReTQi1xGJ+4B!8Fz~B$Sp3${9A$7aM#T$#HABVoI{wkxv<5Jva!>>?BhXJBj%TT~EYQqjkVHvQqn z^5T-nEOLea0k~-IR+SGC+FwH$QcDq|3Be}1DdxvD`|p15O}rEfY8}3teR*8_0C>Fn zQ{f+&Tjh^PO#VIo`}Hi_B`v))#_)LMo{3Vt{WdBLZDkYzaUDw;nP?SA&NBne+bPgu zEXAPaLSW!O&??D%1vDwsQELip20rwxEx%ZGVU+iTYx31+&zW(QD3bL)9xwLctw#MK zxJZ(nlmkWE_66nO@ja)wS;4}JeqywJBY0i+sgt%aN>&ob$Jw;?9b|#UVe3 zL%^-#`%tz}|2X4CuF|e#;@BgLfvP;C`vhNDASrVKxXNvpetwLxWqWqFCag+oUC3{$ z6M+Bx{Q!6y3SR3n!J4vzH7?twIqnImhJ5VGy>V&|+(I{@mv*&EIlF?s)n1it|5%cF z*}eV#iYv-_WhM0OR1!F*#%T(7Fagj^pmL%-jo-4+n;1K@ddBzBVRdjeuJFj2bBBPW z6}sJ5VpFwoe`h3I_0}fw{?GrNt&hb6eFh5We1;4CN9><4j-9n?b^>>Z=?rQ#ZtG90 z32qi?x?E%lHG;D9cD9d@9GO!7zaxUN@`npG4tsy7Tl=SB-!8$tM46YM zF7*i2I+yiOtPUe=lH#}6p_RRMol=j#tl;~2lM<+UQAQ7b$?fUCWUDMI293Xf{Z@Sbm*t1s0z_k?0iUJ=!^F3 zlmdx)6O*=u3V1h0->lNWY^J7>R#kd$J|9Sqqk(~E(Zcgy^H+{LOw6OAvOfqx-D`Si zaTXN#QS2YAh_m*$qg02pBK*#*2|Piq$U|eW*vl0Qzn~Q?tr8{&boSsw^8SXz_Mc>0bId|^t7C{| zWk`8ylWbiw3kq2i+LQ3q!960tU$7oA<@;x*&GEJUpGuyx-Mn*~f0Ol4^WE=@4%&4Q zpE?X5`HI{S?nwTzcQRlOk%3+IYP9-%CK~$|l9y^z9X`IOonxJoxxOx2=QY6YBor^e z*qKVeeniqov5Zb}^D~5e^8HGMfF-qL)5c_L6uG;vW2a5Tyi%tesi~_kP#2=XMceSt z7C0)ak52}X!a<0!3!$%LytlJd<*I=6wwrn9+o+I+c>mq=0}x{+kf~NInAf!Og4R(M zx5nVqJkE2RGruzAmVa-Jk*h!qgI5hc6pNES4>1HeGFEshOx6L;VVP-Ip$S}gWG%Lr z${;(rcJfXy#T05UL1XV4`Z<~7EO)<=G{2*8<}j6fLJp7r%u#YOZI37GG(PzTw@7<| z){R;Ox$E#CPaaCG~wX+bWfXkFG?WYd(^uf#-M7d zpl?E)h;zxLLHWqKU33asU2;luEhO>Msz3&W>BUgQIxQj|01$xLlmp^}>5?(3EXU;H zeX{^6Tmml}ZV}?}P$qtBPUwgAvQ@cmyy`y>z}eqZu_3z~d=72p_BOHj@ra`t`XoE8 z(D>VL#YYWT22rWspFg%bp(A92A}*u&%_tNN@U*Ke*>KoGz|L#W24iTPl3zkIbkQe| zXO&HyXFhDSf4ODKc^UiXlBFCtlB!`c9JW|xEyn@*xy3^=LOzK#hcnQ-tf1m2ukn8P z{#k>k6vvss<#I^=n8RCT)OAw9l@fCRON~uyD>m&E`oh__Ew>o9BMMBG7IJ@L9M`DV zPC1W?2TGhUQfF(9*y+|~%7Uxx;w0t9%`y=sL>rJAAOGKP=;N8fTd!Q8r5$7&13_aL zBVV^D_?cNH*BJOjx}UjAE+y>=J?+rRt^G|YNHc%!puvu&e6k(>a((KUVsRMq1V{Lt z+*V+kB0tA$Z;rJ28%#^(Ekl8NDrN01k(^3`+vk=5ml%5Mu*bnUg2J^tIK_;#Ll(hC z7MAO~8MFIt%n~b@sp}Kz1~KeIH7+pz+d61U@IEtQw9n@O*heWxLihj(0*0VtphNzR z8~%-`gYhBsX#BG1Z~{Igos70i$SGj~%GzfTSeMfZO`iN$Q9{MprGb;A;1vntM+<6i zVdAi8wdPbyR=wNXw55cUNL$)6+VNy{0*gOV@8h-8Sww*%YhHtAJ)+Vnf?WwZ7N&9!a^qBc9f3JO z_6$v#afEADK9f3$1wLxm_9(df$VA@RyQv{9&xSPGjP$PO9KMF+c1pq2f&qzu&ga=6 zTB}?e>8ACUyuL)zcF$aowZ}P@gBv7HPl`0EJrvJ`tXWv6c?s`ZVT062?7=0Li?-j6 zhn%wdyWflSJ7hIdpXRs%DvxDem?-arP!>yo-DG500~zi0=F_MXO9uKiHrGR6-qV@- zr&6C~(fWvXdbQ-%Iu-ZBkWwrGIQKD+5?@*zW+%rZ2@VtTB3Kx|L@zODt-iBxT5tTy zYhh4W`zeO(4b)0WG)`#Ds+eUcs(ca0QJxnJi+ZOpVhd}xB^0lk!`uqT#23l-VL3fG z5k5H>BRRA<6%u)iRZLQU+AbR^`;%c^Aj1Lzs>c6i5K6RDAO6E8(1bvYOp;s8iN2n_ zFXv;|6X)jo9T-i1&%xgQN7=_Og+LK>65+cK01@0`d^>A6M|3?~cBZRB+3BOnCzV9n zw-J_DaMcuiu&M}#s7$NX#qLoK2Cv;=*1Vbs{k(4?d@&AaiF5;XCA`CmrPfF_ymEm9 zOgqZc{U3MC!2;I!Xkl309aDtSy=JB2o%HK*wkf-CfQBg>?faaNSQDmc*IWvh=wRom zrg;MeB8I2Ps9;otE?D*gqo2Q^#WstqbV z)kXpKU%Yl>Fq{dPC)fPPKZR2KrGbkGkFzy9q{Ak;CZW#W6w7hwG5#$2kiYPj(6@<8 z!n|!YIxD*q+DlvApfVlE_}Kc!oac1c7rR&c&H8#C3};lY=n!6Zbj5-pA*p;oYG%Bq zTc*+WDLt)}miqAaglVZIGYpLPI09=vt0$f1Ol%gg)|F+{evO^r8U7h7_IUA!JZY`x z3lnRSuur;XZ)+l{Hu-^c_3<)=D(7e*$(>1!W|JW^?UB;?o1;PX=$ldnX!N;}+vjFi z{-6AYafExw@;i=jqb2$Y-|iYUJ8U464ko2hlAp>#DBWVp-8KnRud7OF|8#Li7AJxm z_Q}B8g3{GQ2Jm2-_sf?h;1T>K=5}$qM|tM0#v+Y%`5*$9B< zL1xlDQH(Y6S9sM|_qxH%&dIsaH3Y)0SjU$m{j4nV3?W?S=0*7kT`!@~=;v~_3I-3CGM_8MEN7{l z=9hIaEF8qOLGBMFw|kuDpY%mS{tL~a1D~cRPQi@Q&rmZ$@w74NVnoE6@=2*2vxzDo zE6*n1N*Q1Kg}0pIvlp^lAl`G@57IS49yZ@U^D*g-`}~Zle-VcVN4r1!0>%}5C=>#N<0Ig3d^j9IaETB>KtuqC6Os@TT_PqXAx03Al93XV;c(&$ zCLkQ)1r-E>PmF*gaJ~P>a^3}y!GScO0}LVq@W?=5GSGPsKo8)g1A{K){j)$p5Iisp zACABcU&amm`zU}D1OkPf&j3VV5P(MtCdJX6mhDMOY6$f7q~IZbu>m_aBk_*Kd4F^{ z^Z&`W$e~7T3xl}2?;8Bvp18^ODQ{+3T8y$PGZTmtgDKKzSQQr&n?twj!>jiL#h+Gd z$rbuH2B4UJ(G&c%?)G(OZZ>oZqnNLXHWcY!moDGRUV$`a#WzV#O&`$MhPo-le6o%V z(3F(HtIl$t%MYNn^(`Ya-+1pMy0Vuj2oJy9kVv0LHF(M~S1vrbYBwWV+dC+=rO|-` zDoW`@?DM0h&7VLF13IN|Cb_AuQZERU?66rZKXF^#G}Bivg*EP7s|FdW`v(s~uD$)L z&C)(myV0LH+HBhFq5Cu|zE<>>;i{`%5z4iyX(m(P^M-%NhpE4E)^&9~wYO&>WK!6E zQu9f|&jKCUDNp-6i3tFis{6bC3+JZ(b+ZaS!QO_USDuNt@})x*@}IR)IMX*j47mB# zW5=aehQhl$YGZeJJ$>epf?tK@_)5W3Jf?J7$BLpiQs+RXW7J{4vu452LA8AYT^VpO zdvkYqmZwQ3ZrkwFhR2(A0BT_CY%elZy3u>h-Z<8+SfncyWT+X;*bsK9{tr8xL?n-V zj9OC~k@;l@s5$>qyX4*<`hVLH3*u4ew-+)nv6>=wu2J)G&Kj(m5bh1fb`}0*rE2=u zZ&A-mI_Z&P%tt;lM32|kaQNOS5#I`-uhs|t!#W*`ACVDam2Pb=QEf2mQzW= z(MJG^$?6_$7te6_U-yL_Vw|1nq z(-*mxT7OWs_Wp1_@zBTAe42gox2nR5-hD5=L*+AhI=T?9B&2l8YXoDTbwu(Lu1ABKOpjDAE5gf&ZAO>C$WDebqXvPNpa;^f~bOeSj1B9wqHWINJ5~HG`zD3w6EJ zuuM|pmfDWE=FN$w`UJMI^mc}6DJc!i<%fBeZ_AqQ@lH2gWwo0xfan>{*a;pdoUKSd z9oqUk!hXWH6Mx+d!|LeEkb^meVw_)6W>CMQp4S)m(G`QG?9kM)i^jI?J%taXHL$XX zAuF|)ehBhtNA}loA=or3K7_9%P1LW{2plKeGG!P;Z$f5jXW5-&M_v5J94<9ip=En? zIs{^)M?@&akI3D|@g#koW3R2p@)IKco~*q>uy3jzTCY$Bw!#%hH>HFTKMCPe5u5kk z5wfrd-iQ7$XXkj*EZZBt(m?99{v}t9PpHSHzFXP0sO#JOtEX+wdsRbhO989BLK$S0 zY#FrS>1FpZ6)_4G239|u%dmo~1Hqdt69a8-`1 zv7JOiE;zhPm?_pMlSH=mKGJ88TEN-GX^WZeNiOGs$M=1HW6GnPgxG$kUZOYaoAvfC zMw!TTBmPLGpjh|W`!vfzNkJyLJk&KRoL@dQ9%XweFV;9dNL-y!(p5dk`+n7?H}HFr zN4Es$5z9fgnh?h*S5*^p@2*O|aX?o8c&|k%d*(;C;{mIoOlJ6ud30%^w5;XjZ}R(O zw$pU6ruF2MM4X&H{8;oQrUoJ2c-}d?f$6@$Dg6it6<}p(gHf7$bzVtq62n9>x z3JC}W+q8}cLL zu7asVF*fonG^Bl)&dBFz`~DP+%hm2N?Se1kE5kkP zoyfHr+8!dqYzYo8Ox%eQ?K4LnbsP5A5>r%z%Pu4iX-3bZb*C6zv20C=TxLG4Q*j(4 zD>+KH;(EC<`bl2)d}Dv**+T25tCA-R4$2t_))mR`Np}?{BW|I&v5}}W``c1-g7NoN zW?Hq{z40rbd08z;>dt{^sa4sjRjitdtB;q)R4dmT+l5Yx4Y21b&ee~}N@UckmFwhG z*6b{cb4raK^yJtqC9P!5){d3Nn@PT@a|1PJlwac|Rmj8F$<@vE?}!Z{3jB9d*G4G{ zpi{$tn^&~>_!6_Sx{^v`n$Q(ZZ`aHs(6vk0)kvcC^uejKr@7|k?sY|#;;0At)ZLHi zH9SSlM=WQM9?snUxu2qHk6v>mWiWbO&UnIc4j?QBbg~BQ1d(Ty|K{f10kw+kZaefO zcSP#lt>0hXhRjGEz6!yg#y*F=U7UU1`3f~a<2^g_je>7&a50$Oct%4aSEaqHo`2~0 zuOZVN@GYXH@s4IXrNV&d_uKDZ*2OOv4qDy2eh#3+r9apev6y|B(%4&LZfJM~HG$XG= z-FCzJH$9q*K4J@+-M%&>Ou1a<%Y3a28R0G?KLl|uc)#QFO3P5bu6URKk9y? ze>vC7r)OGwOv#E~$_&C2R-H^Zllkp+FYl2jX=2I6UVIL$h>{vtlQz8;6^~oi2ZLSP@AS)S0LuBP>| z=HA6-VF_a*lsTE>wR^*adks@Hc4>D5^2cO( zToccj!KSs`#6vE}GoMx2htL%9rh1~~85OjNCi_vt$9F*jbgc|>bgiAG@|moCfB%W> z^?9zHWfPkvGZULFj4}7;{b9Q3eQ=fyvnpZ4sxWiS9iVRQ zcmAGofWWwa1aK%GF6X#NM{pSj8GvMlpmn^Uz(JAS>qI+aKFa?fQ){qjYfj--DOYPD-ev!jnKM^ zkuSpQmJV01nahA|pvW*^4k#?+vnjn~cch98yDgXM8-5T!sEQUIa{m<(5m1DxpXHvJ<+5l7Pm;9sZc*^NSLuMRA$+L7cOZ6lSuj zu?agsGFJ(Q{#x!&r(I1=>40Hpp-bzzlU=3`qObZ@H4)rmNKJ>zl2^<>kdF{Ys`ii_ zm4&Xz7qEGg5%>4V+sXXbu<$zQE8wX_J~;!ej@Db;szlQ6CM_d0EUvr!w_;v zK>0fuuTABYCtkC%UyCxQ78MSMvLsN5aDAXT2YQKR9@Q?sbXA)}lus0vuqeDp!SX9Q zBiAyuGm%8fkmAMO+b1v$Q*XXuG*s_2Oz07uz#C5%Dj&>5u7-?!)Th17BiB6qbDkOA z>e#`=nI&2sU>&owl+!j%!WO%zzBuxpDwKnbk&#uIzcq+uVfRKTl2P-M8zaNNXs-=8 z&Pg~ir0IFz)ex=7BN8H|^u14;1!#3iJ0X;rC-v3WJc$%Xl7y3*jm(SRWF0-egD5+d zd#kE*T_(+Xe6swMyHVcE)upE}_a?KLO1qUqk4b;j7(Tz>K=8OKs3|?P7L>jFw6DU| z(Kel{r`m(nAr_J_I;`7R)j|OOmW>P|=Hk-Q_r8;w+QTVB*61?#=gNE!;(7qBYI4jM z6@!qbQ6vNEdi`~Ugdo){1dL@_8Bi~X+PCecG43H3C95ql1()4AeNpD`jz89$!44@d zPW|l3qu$7@$%#bW%qFA3Dg$7)I5v%o zApp!+OFEExUJ;BqX2iH1yD5a1=^=E}UutW15wpZ2kx`^eeW9!7XtAXwStc$IDhBkD zrc)!U;<9Fk;|DwEy=eA55Y9Hg3Rcbm){Y{1t>F= zMLL#_&~Qs6exdhp=VarUdkJ&5yW*Y0jp0nk2llh_V!(+^)Krylg5)esNEX{22gK87 zSq!xAtoc%^P9>U8zcdANJo3A)_1K$@jZY(7W`O9>W+Duv(FkgJ5pXw9T*IZtgdsgL zW5f!M4`5cvv=xd}V&ATe%{F%v4&b-MuJbf2LO zunX*=?ak8h^ymlLg$bd`EYkmQGQ`iDc}X3QeK_TEAADdVkA(&CAUh=9cw9H8lPw4> z;aH7q1F@_7 zWq#3Z6-dD{c_&Cd5T6WI__LyUOCz*R{Lr5ydJN$*U zHpbD#>qst%Dj`l6be5AK_K7Qv4K4sL;UU-M-$_6JDT~|~QLS!-Z#tRiMVaUFtSw*LdZ$ZyE z@yA#$ZFdp^e5xwQP!$x4cPB+QMUh{2U`o_bO!$Q)PaaPm*D_(n7g-)wAn$DAorag5 z@al$L)I#OO(C?M=kSYw;t}vV)ejChD)Vgkw{*_{r;_E-^=C9VD@M7#UPp|aHa{zbj zi;w{zFn|w*L14HWv|qwu;|(CHnT#-&nHg2OM+-6|CiqFn3ZR71$NkvJMvXZ3rhz#oy;dY zQe719nk2JR&`MeKpODOLmP_ykmhYZDb!fm0yrN%$j&6}B9ZVkdI~znrsa-bpi?E^W zKib`xxI918;Pg2Nmksl`+kN=-J^FNIuREjd%4GA1`;i7~=kg2Z==$d~*r~T}W6KBK z3y`9+`D-)Qt3jYq?-7HF zMvCU>;cR^H>wkVXb?6?a)4;V^MLxP7V%H=&tw3VccVw?3DM$QOjfybzOC%O6=C=L%H4b5_8=I zrAw6V*;y9`GC#y?F+$zB9SBnoVtez$ytHBEdPUPskLDmlhf4qCCtnQ;X!aHJ)8A(= z{bRv8+5ai%QfIy1Tyq+mxOLx4^ZWu@{1IQLzR%a=8^#V*h4d5YdOURO5!rDPy@Vwn zpnlt5VH=5&y|ki!Di65&zIb-}CC-C^4rgK(`Jgm@j5$2;E zFsBUHL@qffrMb>byE(X*kcMD<2j9Wol-wzG5r4?KiC%2i+?z7FvxECqRxAAym~e3< z@G_TcoGCWrb4fl0@3+zkCv5s2Ho?T(1f2jUKcGvWxV85h+gfp!wPz?CGR6=CgS{Xy zUeX;R$ne*1=)w{4jp(c`r86t*q9XqW^p1YzM;9WQvEIBn##*|Ym-nAiPx^?I&Rmz*ClSud(ww?s9a zTmO&Oljp`-OVmo#U1NL<9NosvP6qJ;Wpp>}#Y;&>2@b9N&~I1Hpk_@~nRuPxwZy67 zrK*ppGct@v0x!P4R&2`zrKuFN?$z#I)82;1ZHGU{&MfE70iT_wkZ0SU=B~FpC-;ol(wgZt6VoJo?#2R_>=ex0T?SqXu z);rg+!8`XcLyta0Jv_@sGc?f3hxA|dBq%KQ7B0>25Vr{jLFk?b=cd$PSDkhJhS0No zpQlF9=~uK)qi07X8{2vRkP97|2kvn=_HQ-8n| z%;w&25u+wYdL@kVT+J@LgCO;wyz=^*pOY1}li%Y);9a70+#0Bu+U4Fq zdD{^pkf`+V(CNrl8e_?D`y}0s^YOO?)&xsOi1H3<0oXNkTdjWL$-VKIC7w>?Pzm!7 z%_Fg}VD_0Si6GJAJg@hs@lIJ^J_)WwG)l zuH}K=p(4&JIdvA{EOL=><0l)!D^iY|mbC1T+#GKa-YPDVt1!Jv!+Ej7+E0?ZxK3Cp z7Yu!V`(hfTH0QF<=+iRPHoLLa{IebV^HpI>6m0VcpHqkZoQ6fwR%wmS4^#7tX?~_b c=94(GmWf{tixTN*6ci+*{Wk#KEjXY4FQ4j=umAu6 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/available-spot-classic.jpg b/assets/img/skins/popup/available-spot-classic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..343dbb627123c6fea61b404906003f0266910b18 GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/available-spot-fluent-type1.jpg b/assets/img/skins/popup/available-spot-fluent-type1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1e588dca9f27c131f0a8e947351b004043e8b687 GIT binary patch literal 8071 zcmb7p1yo$ivi2Tk2A9DlI0Sch_Yj<52|%ITg?zOwRdUdr_*SEWC-_PE!05BB=Wd#5P0ss)=0qz$7SpbZL^hW|C z5`rKoPzZw1kWrv0=x7)i=xFHZm{_>jn3yn3baZS292hPhK0ZDMHUSX<9ub1a`$Gxn zkCqS!Din%}hl!4f_kX7QZU7e*cn`FJLAU@CE(nYZy6*)j{}?6|gdpH=LIFdd$f#&Y zAaq3i14IQ9_+M%f^MW9Op~xur^8h9oQ3(UX5G_v}zH$An0DSP916^sdZyfzDun?|N z&7K~si+=I{O9CZNON`L0&vu_6ujDK_X_`r|bGY%70>B2tRQ!9^8LT@4JN3EqKk$ zmo(huQR?&FWk#h8Z}V;Kq}p!Cs^QkVrn60L1svbf^po{m)FTHMPKJ|(TD?M|+GzXZ z`~`{Q0uN*3>6k7By^uI9V&(EoDmL%9ZTJv(fcNQg3B0z|%d-|YlR?rZ=9j}d`i$3@ zkFuWw?r6KKm({Xs4D0Zk%VcPen+vr!sS_5F^C4rty6Z3|F;$s>?ZQGPnK1d&{pVJ4 zbKRiLQ{mxkuUyXK>$7hn|21hZgYF65OP+@&pxlu+VdEv7RxyHyB1aPCS3fqyk9ZaZ z%%g;~GHv0gKX^?KFXCLGi2BX?T>@TJBumD^q|d|XKO zRVXrNZp03)Y!+VlXkOV7UvB+*Es2p$+;IyYU2$Bubl2y&dHHRC-d`CKi$;wnO^>AX zP{CZiTIDCv(Z%nLd5hSYIyb)yfbZ|!`F9zSQz86-69)X@fe0T&0zv<*0|Q795EKs? zmjH&(Ps78DLP*U`D^359Pe8*2;Txz3p8=sF-2+uiFKP_RXYBaXMlEaqm3hRGoZrsh zRDeSADC%J!-Wr;7a8vhFQx2}=|3Q!eg4fU0pBM&xeo#=Bq0gEBFz^&z*^tXukFn{= zwmM~E$Kr-9diP*Z|XbZyb0iW*{a_a8} zvkQy8HJfdRcpBd<{d$b@Xq|Gfds8PRYSen6jkQg%$fzSCr7q@X1mkDr-bj1uoAki4 z`3y@<_t3_olbRwGuj03dpLpl%aUukj8!oi66~AEBERc*+vp7$lf1}D?_j1T5>8BO~)>LE9U0=RV1R)a-m2(vT1tBcCcRa#W||!P>?gUE4ACE z!Ap>_Z+*;mN`h&Lv7g5FD@rZ%l*37|>g!6>rHYiT36_~+O=k;R=U&w8l*IiWbwm3T z%Hq&XyRp+anQQyz6>FjrF?->Xd2|8tQqA5%+tF=B-TH5i%ewPT&-XXj+Qn&~SR~&> z*w~H4tJ%H4UwdU$Z%aks5X@*3Kes3O=w0EjZ)aAGycQ4AH*$~_syB4nof5lS^ zqT}v=omwSYjlF{8?Vx&AA^ZIueCnI)%-ZAPRSUx>C4sv$_4#w@uPa21Z}?70cf7Vl z2AiD0ttzRVLd#2}gq?BpF<3rCI)&oarX35<5(l_dXOh0#Md>NifeE-DvsuVpET--n zhJAjJe-G3zI@|>%h-iO})zm2}9?Ha93LE2OI zE4u2M`~>={Z4`q&c42f?!;i%Nm}8i86mQ3X=@<v3#V%z|c2hb?p! z0Ld;*SwcGZn!*NBHJRn~VC)j>OB_cU$amhRACB$WW#9Y)mi|&n$+RS3)Zj4! zJDDC6pSp%lciMq*)Ssr3B(m=4F@wzs%GmmOO$>YJqGnh_lb9W-R~2e!Fszx@s|KA* zBMTYb1*rMT$5lbN5`qlAi3gnGb>%43cCq{eWb0V3kUxQ+27HwI`acLVEOis->Q0Q< zo?t)&yG*L|*@*s)F>AO7dhY=Qyokd9BoGqf!;6ZF4E_^dKu7=>7lOwPqmkCcr{&Qy zg;MJ{2UOS863}Uzy^722qL(oVTs@G5AN~d#G)bhpaIe!d`oDe2lfB&6 zzKpDC)-vM&rKCCR=Ab+mOSH)A#qDwJ|86_Z;ad^C%fQm`ps@IsL3Vz^tW3|fkEg^J zNykRBP%+V1$9k8dP+{iP+;Y(|vFT77cKaj=|KOC35P zN{i4D&)uX)+FHDkrMa)8ho5P~HwC{?5mv+Nm0$SD1vd8j{5M9YiTvJqDdT>bN#H(l zhEpz4vMHxV-&zBL^BCa`7DBt`Ndj(gDTd`Qilz7jv@o3#X-D;dA|EUE%%6VTuem9V z@mlt;JHG3(|I+tU`c{;>H7!B9g!>9t1CN0Ua{7qdaJqQY6VWTa)<-*9DDn5#ywK7@ zhvv7Dg}OG(06Tg4`TonNQ}fyFIz=bm{583G4XgtT`d!Ul)I$xFgMV2vbfM7b_~$Q{ zYn~pLvC$LTY_v=`aY2cW0e*5+L&bhVT9xIJWnGURhIt21_A>9s^rJn&iAiEvDKD*h zUUP@9BaCMS6RI@D&YM=fZc^$0K zdJ^G#`PYaWkEdGNDY}cN($yK(Kw_TE>x<61z68~)95kPkMJqVyoi=UO7avbFbCXJ(3lEzmzZ$flic-}7 zMPXj<7F|6f(*GZ96yIGQ0(O`Xu!F!IDCD0LKH_db!!4~zZR(tR2n&cikgD#2|8ty? zq`4^~ckcg}bd}v_0zmkXvC}^RcrExBle~Wuk2`8$^yy3cw^(tlc@LMJYvcLD$+(D5 zXxc92BQTWZpTF^w(WWE8>)*@X;i3s!Ch;qn@jf)H#+eP0);4ze)O{L-9`Zr@9m+l$ zlnbdVTtvhOfOW3GoZF;*%v4j+8Bq1vgqY7Ov0Uzf)-P#~wsj0flg?JTwNUO-`tAWH zR1M}|TYebl2u}fc!GWd*&p(yZhjT1VS?MO>dSQIHt0pp&8w5D1xSt&&VbIaCS8&zz z=hFJj<89v#5o5oNjiOmMsgg#~uu2M3Z$?(ql@bi4*6LDG__!=XyG5X(Om@PRi^fIq zDDxihC%Gd>!*p|r0QBb!V_EjZmQ3h5J|}BLa+oA)G8NBa7 z=g%Bo3={V9e`!R`6(z{$yH(Fb#z(K}{<_YoNAPm*E? z8J8P_e;RJh!^DXk+DBG-xpb}A2U`%964??wxypp|>2XL_U%KVB+>Q-0%V|`fk(p&=DN}j|6XIvpPESD@&vOaL(W;<^{c`Cz0Ao=+mR=^D zBm(RDg~wRE_luJkrSZq^#Wul9ckDV}$h)&ZFJro*uza#ak~c3Bh&|z>04kB;qs+^F zLqFq&U(DU+mX|N13eNWr)%z+W<@T^#Unr2sSJkFUMKlLR`j1`0MVOlVnB-L~pMFhm zU7A0=3|xYl7*->X*1aCm{7l6*%OeS_vQ}=iJjE^?B`%|(0DGAp`dJ1AYfTADXjeRT zZKO3+KN=oMCN4)K@QXz49_YlRDdT~Bsit;gV5-TvxWVk^*C(_^?)!G-4}n#1(u;<= zG@v6dRoG4F81Kze5D~unsWVG2q-O65+B54bSX$M3LmZ(-NjrWdJ(>e{)PCGwD;;2_ zNJk}I7s&7ljq`*19oV8V(~k)WBV7M7Ni&BA2n156Py;3nZfMrdW{_Zzc(b;(0X<%7 zSsCH3&T+_(_U>6Y(&r;23}yJ66wz^}%-Ekq{W6Bf)-L6Wq;Vkm1iO(Vr!`M^EdN;s z+hf?tf$%3(J1VCk9wcI8J<$v_jtuFV2rne7q%2Plo6VxEEJKg&4Mg_el#+tp53-w4 zcird%03_({Ap&n0VSfY~5Re1@8*zT)%>m5RnK~e@S}GUbrSbReNfLGsu<%*K^A+Ba z{a1GSZh-R0eSLrMTYLwj!cFF-=zo;9`jQi;`F3NA^9*09Uh*Gj{(n6g9qaf#6j&Y_ zR|Bo0Hx+cds)@G-Qu@wYe$RcsUdCRBTjA-MYJ^gScnn(hmlc#39x^lsoF)o)pxjyM zoncYl12}iKlBM@RitB6JursTnd^x^%M_C#1IAy(=Z;I9EX2k8Kh*z8pQVMob_{dXC zQF^#to9Zb!3X0&$?c&%;i3S3!TY!>45_?4Ep_QV&$79(&>)2wKI zZZ0f_I33QQ_-9`>c3-*cO>gMh_&1Oz)HhWrr5}7cAKvZDL+=V$Sbj=E>x>J1Ky}O8 zEkEn-=9%ZUEFYUl?J}g0etm5m?0MxAG4HxSw`kOGP9iR*G3w+b5U!YT*W2TH4~T!| z+=$0H{*=p>z!DncsKtY>k3nL?RZEBmZ0|65ugyr%>;|dTJfG+9Tt)anjmz+C7^8@R9v2}(to8F&HKYPaBIV}l7Z_niisv#e}B}MzwFMIr==GI3}~VrQz)>~p^$HSKz6*; z7ou``^l?$nd|^)Ov%}CYq$5?@si89t8%FQ{%9PzM{e=1vlaMLA4ePIQtvTK4y9-lc zCxf1!=?bN#!=5cmM?a!bEI*_UIXhu^q4T48b9U|>5X}1MH1f?ysH8u6`%II`Yi@R( z&0tE3^Pu*{7I$owf;i~Mtgqr?@O3T#KQ*4h+TTmBug2Xi?8r%8N@5|BT+MB4rBioV z)$#mezWYG-oKyOndP-#|%t+((FH>S|1>0nwCJNFpF?;ynpSkhOqN+Ed&@Xtiu?wB1 z9Cy0MW_qcQ{|ITBG8k}q?UGUQ{3jrbZBF_k0fa7yeKb7WyF#|4>k@xVA1=CXR7Qm@ z4Uy;_DcK_Z&?Hm5E~L(jO%;dx@$HGk%NWLquX1@(gq9c2)qY;J3N%r5Xn*m7zRP+^Oy`|au(Xz~Lyn^_v!^X% z91@!LtkrJx8L8w$_4%V0p?xD^BtC!kKhv$7d&aZXsaO5u*iVO5ZpG~AWBRTa@@uMN zxdKn?8=gp3VX12?qEiaK++5Yi10vQ%JFTwNsq@ z$FgU7y1!o~yW!X)E~HcZ4$xo!2Du0TCLuYnnj!m7qPmqt;5t7pB02_wB14g&(7yu7 z2$aVKL-1+1HKBOYrUBJ3Y93zaxC3MYTCQAK4U?|l*H$DDND{bPLnmO;$dw8Cmn^?~ zWTrU>h0Tk#-?oyXwDooA;e6TujSW%!Vl!99*(`D==dYffnu5a9B?fU`IG_h`giB;EbQe%`#e7UU%-k z1qS702nqLQ)KUjTN8|@BZ-RjL=4#Kx>e|dVBq#PmtVT+MaHkz4WkSfp0%Rilq0KUZ zjcQrA0gp!*Ez8@te$8I!3oMUUX}hr1KO$3&o)IdAiKy+gT9UrKvIYJGZJI04JvXL-Wb=vldc;ia6+`Zlh3G965k&&2L)<(rR+kQOJ69sRmRxx}i{p9V4&`qaHhLvee zObhxSKFh5OAqvO!f3F;E+od+vv>=L4RSSOly zO{%YLg9PAVs`;!%u}7~Orj+ygM-0;2^?#u5Vgqp%ZG&a9yoy0 zXJTRrw1BY{@IjPTO6B0)D_}=)=O>LFAnPW$6 zfq8;67r&>C;ZcjDN`nc!$upBxZ=$Rwc70*qgO20i`=c@`D32T8P@Q%D?$Q_z;JMLb`T6)HA0*;LG2O%q;l62hwKh-Vo>eQx z^}|{%^cJlB_ik-oyIbrE1+uLJ=OC%at__OII@vE8*fK2p1K7yUw&Y)3UOTQbHPz{$ z$EFj}U4-D5M^nUC!Fy`T*h=7cgYXD3I)+}#YGih6yFQ!sXwWWrF2lGX z8C(i?#3En-YuQN4^8y)tpJ>9blHL&!$R;8=vGLKMM0+w}!alp8tXPL*qe!&gQE7cJ zxG?$Zs^h!)Z7k0n?J?Zl^!Iv`!w0d5`D92x`r@pzx<8E7x`C=na{`XqKij_?bdIm8 zy`6~rBEvZp{&F@y<+8G>kLaQp_M;SBOW`8d@#fQ9eD*=s?8k@xNIWA8&m;a#HR&{2 z0!!_*Wr)mJ*F3?B&3nvde;&r=yt*LyqR^ipfdYqsOt;M&Mwy6laKJs#%#yH&m!7xR zGg^~Ldxa||S;{M7Gkipm`!vw*v9gf_5Z;gPmzQq23V#2Jl&naM0*0=J%Es~I)opBY zFz-@PtB$5x*OKq)WRr?RWDAbKkZa_Y+(B-IUGh2wu3<$s{=tBtHoZJ;MqHp>S~n}! zRYkWjvr>ZPb~8@SpqfMhJ+I+a@YMzGrtB?d~^GQ!L_2C zVI3d3ZVq_bI2=%6qpdTlCp^!Y*t04BU@hJw!YI@Sst`JVCo>uFOGvS2dD?hX`C=V;PZk}l2CGJc~HBB8lp}yP9&vI-?+`d{*E{$mL zhpm>5?8Mkz`nukQULkv2mbF;I;IoKRdZ60CEn>L*$uqN>Uxdl}<;|ZhW>`7?ccB6+ MhMHe-$Nk*@17dBkZU6uP literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/available-spot-fluent-type2.jpg b/assets/img/skins/popup/available-spot-fluent-type2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..dfdcb7c078ec2bda2ff4317de911f7fc35cdc234 GIT binary patch literal 10317 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 WvOH|R7!@Q@8M^;;+Bx#N_`d*$08pI( literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/carousel-fluent.jpg b/assets/img/skins/popup/carousel-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a83bf64dca81a6385bf538c2039156ba8e9ad97a GIT binary patch literal 7608 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

    )qK|vL} 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 w>i{8sBAxemvL>EDHtCtW- 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 E0Ov%pOaK4? literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/carousel-type3.jpg b/assets/img/skins/popup/carousel-type3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6346b4695a968ab0363bf37f2b36dc486bbb65de GIT binary patch literal 6016 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 (CUUsG?e53hqx6 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 Bt|tHh literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/carousel-type4.jpg b/assets/img/skins/popup/carousel-type4.jpg new file mode 100755 index 0000000000000000000000000000000000000000..6568e5bae21a20403e8504e23d3cf4c85fd2ede0 GIT binary patch literal 2945 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 T_m&5j2K>&(rStgE`DFSJ!7a~g literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/countdown-fluent.jpg b/assets/img/skins/popup/countdown-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c21582f4be0e9a497f60118c0bfb6340adcfdc0d GIT binary patch literal 9450 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/countdown-type1.jpg b/assets/img/skins/popup/countdown-type1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..be15b5ac79de53848959098f6821ed5762c7716e GIT binary patch literal 2803 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 ds9>iv1Q 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 VH7=sDsfhi!tNFY7zW_!xnj`=K literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/cover-clean.jpg b/assets/img/skins/popup/cover-clean.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4d16b04600949e7040f44252b7da473d398769d1 GIT binary patch literal 8547 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 bZdft$+`DP(^F0Nj7gvh=?IA4K-f literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/cover-fluent-type1.jpg b/assets/img/skins/popup/cover-fluent-type1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9cccb4a2b075d1ee6532ab4c46a80079fa250b0a GIT binary patch literal 11684 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 M!#BW`_uKOS0dqc@!2kdN literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/cover-fluent-type2.jpg b/assets/img/skins/popup/cover-fluent-type2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..519cef43d71cb6d3e0059f9428600344ba66d504 GIT binary patch literal 10871 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 BW5NIc literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/cover-fluent-type3.jpg b/assets/img/skins/popup/cover-fluent-type3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5f0c885424110116ee8f2db2038cba36c7ab4416 GIT binary patch literal 11651 zcmb7qWmqQ7lI4rLySux)ySqCy?hcK+Yvb+?4UN0gxVyW%HqgMpH+SyL?Czh9%%`5n z%1W<15qYXUmOr)uh|=Ox;s78Z008JS06x|LA^_ko0s6Xtd`1v(P>@f700RRBhlGHF zgoJ>Ego1{Hfr5sGhJ=JcfPsaBhev>if}1bwd~^b-R=kC!LmT#>)GvD(epVl`^=0UX4eEQ< z+8u7w)PIi{#jXi;nRaC^GO`_i=e*#JNKP#|mRw$+9BOh6x83h^UxLR!8|Q<6vQPQj z_iS((a~p#q0vlH=x5d?;!5=mt$DtZ}knDEFNi>^L zHf@Y=2k0wSUBMcdg$&g`PYnIqv0)>=EHkW2c`2zp60!H4wY79`Q1cvFlxp zFYpE-u6!8Dyb?vNjE}O>Rd!*sE__6Cse~#8NsLW+0W;4-?JA3P&zk{95t*zn3Q^Bq zGoDNQM&}2-biW0zxG0YpluV^h)RGdlXP_SPr=8aIicY=9@3z!dSEqX2aI(B}h6h%k zr$8W~VmY#!aYK@-lS4;Y^stJn8&2Q! zU3jZ_g0=?M^{>ovCeAbIWxXTNHx*dz|D5(S@bfRwox#C{2~Zq+LEbhM@Y&1!?nKBD z@x;!~HXKS`AEhdGCL!A!>2zC~XOJ5wZ9PSqjEZR+lJ*ook#3CnRhv_5d+9=}Umw!N z2Gt&MKSlGm|Ck?W-SMw^_x7Vh+eWsMIyA6i`VAS@hL5t#dRNm`Ny|NMmL9eE;WJ$Y zU2^&#p<{i8v97th#N`RLzx?aZXJ>IN9nL2yybK->OP=D>%d>RlYBrWdop5iI{x2QJ zo;J+)tw&-L`UO^lt~41X7w5WaI#>*ii8YP-+Rgh27^myGUI+@)b^#W3xV>aSYrp~CE@b@s zriC?A$k^big+?#0&U+mj=OL-1IZaI0YPLM7Z9sL`?JvdA-hV!x_+-vNw~D2_X)Byg zQzRrmz1-yl<`z157f;imj*uOoS5WJH4!x(IWga>38@K*%2lt+OZgPaK{&M-~0eY$h zt*|D|I+Fg3Cchh)TV(HDEv2kfK9efpi5#0vOg=`hpi(!rm4g_UrL>}GbVM<8X4CVr zGB-ByJd{5={v}5X{jvyx_W#QOT+07Np90$o1{@JFrjvcDv$vt@c-9~$Iy)&Rk zOGtT|qJWZWnpZN*njf7c)>ZFR*nb$l*FA^)WNDFiMQ4tu@*sgb5&KPO7|22|=QWBz z!{N5?!Q&ks|JY|iY*aEYFm8??yJ~?u7Y{FZ>Ij}{Cb}}50o-lp3toNX0fW7S3Y98` zTveBm+$1ZJxXL}zZ)U4>j=&$UJq9bN!<{}n$5qr3|3nS^|2swrY-Jav} zB00;0V*a7NLN?*6MH(5ls*n8ZQm04@mt8w-im23*+tA^? zgqC_CVY6e#JY(#70lM;)1BPo+&TUG8T8VGSOT&xwoF2t@@x=y{Qe}-scAOCy*`}CZ zfjJfvQMOO5uu7=C48*=x-3^KQ1|%oAtSH_oxDy+Jo;({6W+?FFiHp@+*|0z-bLb}w z@=ujzwe`BfV(7_>mp?^)ty-$kZ7&29959biI^CKc0HL?!DYJF@n^4lZtKEYHb6o1V zQmfWQ9rPn>NY>&dD6Ar3=!H(U8k;0MzsFNEPy>v{sfqZ|b`>ckE4+oMLQRs&q2?En z30!qC)+00fH)z<)N?icog~n-RqQDGxB+!z&xB;MK`8Qqbrd-eJF|$NqNp>=RWQ)-v zqU5ubn|K)P)F7bT-)5DU8og$Gc#^H|vnxKApt>NaLptfsd%C3VFkHpmi%s2RM@&t-Gjre3X7!A6yK1Z=*fqUh2b&frxE^i@#Xre!EW8*FRa z&V-O|vN)Wa>GOm44IA614T$Osv3ULA1?K4f1PqD2R#&)%PSs?|a+*P!zRnZh?9ql7 z`2{`7@7ya&zg7K9Gd=)))-n~z-~3$pG#Thdk!73H?#^IAq6?!sD6pHXaN13=Mb4Gw z?La!!p`p85lJ3@iM+9*xZiP;1%`=FHkt)senu_07%WiPbIi{^9*H>?pp5Kbyo3YFl z<*}8|MFBk;I2OZ!xnwTYNalqzeEFercgo~nQC zQec7RcV3J%a(%j|<(0Z!Og%hWvhPY?_4ETqxkMre3qR@bq-$2&uSWZVtn_8|0x#R! zTvZBICU`wgiW=5QiTISr3n>5syN~l=+-E0^iZ^i`3QI1-$kAl8m!f z+E@MzezO|GJJ#XArVXCGTMSHZ=CDLw7d5fSG_xC#4mKt<)_q&b^|{+HY}cj(Va| z_m*KBdsj{nLm5vB6&O#BSG_AH52np8Q0sk`wT+%EwD)uLO6KidzOi-2bG3C>h|H9- zX)7?LbG9_nTZrMMw{>W59+a!Wa8Y{4U~l1DkocoJy5nvDkHX#}HlHrApklQO&BJDk zEJqeOqfH}bQH@s6p#G%_s|VLS@{VaaKac)8TBjb%b*QBG>8omeg8m=LYI#2{b%7Is zPs1+yY1n~*!NDM)LBJvYG3=jiJ_r&r5tERTBPc4d%P&L}5@sXk8A4%YW2bzF{dS?F(Vk8(Lqx+DslFJk z`k=BKrioK$PW^tNlg(aE?~hKuhA)OUI)s$fW=3;KDO6)$AI1g9vnkK7eQ>B@tzp}8 zl&}ernJk=(_@9_g`@ghk6Oc70Ok}B6WN9WCJptND^nk{_9>qF2=s+0c3_6Z7+F}Wm z!$!_IC$H9J{jth@C*HJMISl?Ej%9^FlcvaKbK=$+&Osp6EGx(21oosB!1YSK7H z@m?A$R*EgaOL0IdDk=xyQ<8a>3>DKAE*;0_y)dm1q;35vIMG3aQs;EcM%|lfW{caM z0V9w9>VS8cX1l$H8+lhaCMyMdHnyJbkGzzKO}VUG)(^k~yKg0?Lv-8&7K2D`>W~np z%_vO-jg)l})okrpD!n$@SG(Mn+thu?hIlWYs?ziM z4q!iXfWvc%>Qo@p>!FO*IjA(mibmLzGU4$!OKWlBj6+AoamA;Pm@+JWh=?YMr*xRG zQ7J|n6iM!rW)or|-neuSKau)6+*+5jm^BM&T$S@Z)P#nKLZP!MVIZxIi#=|UB%T$E#`;6(-ME`s*8+S3lc{QL_Pgfi4D2|7Rg3;DD5wp^!-pe0!8s&Fr4nZ>uxQY?U`>S0q`n@K z77a(3ZqtJCUU{AIptsS3Y>~t-RbNY$)G9ok;x7lCDOTc08UmV%!FRI!X;tW|Sz?QE zf(Xl@jr4XhpsdSqu>qfMKuCGt zHdLF;Saj9#=!98S)|vk7V`{^{oOs`)8+=9BEFY%b9Lg@j83VDvXEm!0g6(FBKXeQ4 zFfM+9UkQyrbTjYJ1{Va|p%Ji%wm2X+|Kkks=_z!7q7WtGCvgG<3=Rwe^e=wmleqYT zAS1_5$hk)Bt=qYo5mfxI!-N3Q2O$3gFb)7f+*HvGIib{4=$*MIb59~%`VR>8EIr9m z(7C7m62iioy~An8^16g41`|kc2qIbOI*L|!%Cej8c4QTrdLwo|cFY-h!aMcM(eiy> z@L{3T{{V1eqm8}oOm7i|-|_vpL{R_RTPPH&76_l$6W0Q$>p1@ah!f`%cK3kd>B)O^ zFuJK5irt{c6GIEGvz-nQZa!8m&6nX=&J)T?S_m}@6@mBzEdnV98!7h)LIH?D_NjtZ zb%OH(pcL{oWAWFiY33eR+2-|;N-aX+qdF7s`+J??q+=YdmiSa?WhAl7=!PcWX zS-O^R(>I98LF^eyy)2Xn2%ecHq28J*Lw^w1pugKzVG_-AJ)B~>=60ovLRNrvY^)uuZ+{rYc#1S(T&J2`%^!Wt%Jico0 z4yZREfc85_Ai*37?LgNLpm0PBgtS^+2RDqlWkz2ZWyO?kJ2IZ`JZry0Y?~aI4hh=TMh@ zrUp`XX_kl!_+IvLUmoCo2}q0^2_r}yPErABSK-|h>3JI+UEN|hNMI21G9ocZGy*vQ zpYc{+zkHAJgrH*{aZ%2M$}ZXmAf72IMQ_F%fGY`9L?qd*-6c(}yilry6?L32&KW5X zU3pqBXJCO?Kcs~q?$uj0T{@VCjyMOCZ<@n~TWBTVObP!12<0(j_1`pD*6@henB@n~+==Uo&-}e8{>?(DFMk}CIg>WHM-H*YznHXxK&;ELDp8YdfKREO zs%_U>$g(5zAU)$56-y9o)*KPJOmxdWppR*|j|5A(v!JbJuX4mCs3lifTS^)@e-`Zl z$OV1dFzjL1IgSNdYHbiZmib9Rv2*N4QnRp5Flxrt{{^p3w4*(_$fUhA2f*A|dVo+=y5;D++g$s|K zy)8HpsR$!74_uW9t8$aD)@#TFaP#Q|AeK~176*oh%p_~~M+!fv3WsVb;T^HiCW{Vt zDs+$#j}MT}sSxG2XYvZyN`m)nTaY`?l&R?g9`o0gVh?VRJn&h}M&U z@|1pxw4HqrgNn>?flVPA5_}fo0cWu=S0tm24#r)zD4NPou6CbDg$Q*9*cikkQW3ih zdCrgsjubZUGO)?5tpx}`Ihm+?UEj;@C7~@y1*RPH3sLPrkW{%K0x+~a2OlnsVORSC z7=0cGX2^?GjHBPtL|0@-t9@4g98SDh-~na?Y&=lqMZ4gqz%Ksg5d1J?)_ub5= zNb0`=zb9TA231BQ=ZU3IKlVRs!DolA(!5spk(gVf2_W2E!fEECKSmB4{e-s?`RkGtjhIW` z?@d{0oeR#UF+>TWc}N7rMwag>Cf%Y8Tlk`}9XG0|1IBbwx|W5(t>#q3c5S zgrE!EuNnKWa2U}UDWOaoeTJKaFooC(Rh82)C-o5D4;@+aQk}5}u@LcDcjhjTJiYp} z#$Mn+0w8l*-!YvpVA@3;{iNWLEgbHV-&&$>5GHwq^&BN$T6zcsYvc|5W7zNDRc6AP ztL%m6l51h*i5n~lUz8wHF}QHo&M7FQqG;W2s^#}LfA9p6G{dIRO(I}P;~Zs?B%M1n zau>c)o%bJrrsEcYi2NWmJd%eF1-PV3WTlX8F<062f_nW#khIYOP%0O|M}`H?K}O7D z@oyR!g{V8)iIz>K z=(Fv~X0~q^W+IR?DYfIsGxULXVplh!#x^@LCnyg1>80BQFFBE`b#^{?>x`mE<>$#8 zGyZT%0N3N3ndOS0oG7dP$Eq7E=9i6XFU@GWM2QQ0y^2o zX&O3R5lCDU%Pf_`YT;Ga03!eTR$G)@gT<0$6We4x--<{&b`DyJ6UW_Y( zc=V;WE21H?GO$RDvB^!i8i1>_D5=u&QXwwurph%ln$PyTbpfkg9%!+=)3740g*nwK zHuPblWd!_Imeo)RAK;=BGxik|pI!JBMpw6nlM5(?^dy!!C3b&DhM@5Z2ch`ElNin# zvt!bWOK`>(k{)ONF}XkX_3W=P_B%K^`Iau2pLv!b5P)c`_k|XhA-zU%NyOlgtK6sX z+~)a+!zM7MCV+qKVgQlZ5or1`|0g}Da3<$6Cocl`%mfjme&*Uz#^DxR8GnB&C>fK8 z>n$-*926xY52yv7f=BI~G%8__CGqg|FE~g#eTO_#EhkFk0MTUZgH^O0CyQKe%=%nh zow^;pz`tpiYBQ*U@VyEJL!i>rYgu4Axc++>9=Jw`-dIPGg;Q6IN7f4;0IwcsW?$^L zSkE8$m4*aaw5$UbDnaK=1tgHrPaa|cN4Ov-N=e{718^<%HF6XE_}ssdhmjBn8Su{F zb&lNjjX)QVb@}=o@q$)QHhz)fy}JU|t5dz(e}}RuvTYG>@N?ZnvJg=+snW61TE0~B zlgx|+qm$Z(pHS%P#vr!|Ccp!ybQq7W-&v3#8<^1$gmIdWA-*9Vd;9J^s4JzfAYL9T z=={!ui-Q2(lBa|T)152&;{Y07(nI83vn^FUt@6C*7AtY`^`L(WRZtZ9KHsajYx=8rPH89Kw-;r~25kHR~&F2{_4I;Psk zEb$t>{}d+w0my{SbpHUjV0zb3TTKG%z;eM0a0*(C)Y1Cb)5=}@*W#B~_IdTJ&MeV- zS}X}guben`1QUm*VTLkW2sqgQfhGI=WK~*^Gt|x1jR|v%=4mI>NYYf@$5iUYR~G35 zLyU^3+CS7yfMuXgA!Xo<6^%)c-NOsuD6+7d?)NeR!h*Dh$Uu2Uc9-bE0|o8SUVhBe z;@|M*d4SCYUgAz13}=QMH0zpJMwY`5ESGW?k`>O(#s;e0au3|Cr&6k}Nv39|EbNdS zK(1eY3-`oKo6g`+%med~OC#l{;QZU&=$!Y!BM?0+g^`>D8lK5?p~i~VpatfToRH?w zDmtAWtI!cjx-d|7hk}={0MD#CtYnR2c#N=|MltOFpy?xWf6s&c%w5gqFH**o0`Y`Y zb?OF)We=;IxR3$k6+*`nW0uw^U^ku%2FEb8i$ELK#sI$&;CX?P+9jzpO4pROTCqlM z4@8U;WI{ua2FwR37}X`<%cevT?rXx70Bdll`qmyh(?-i>us6JlubGN-h~7O3 zj|3Ky=^WD8bhThBeCho!&^*bs@-~Rz!48F=Gv5`4zEAb$K8Jp1c?%WiquAr4eeeVS z-W>!4EeQ#d*I|f=X@PL~`9Tv00P*tlG<9!(^#YJcJ$kOKn9caLL=->r|B&Ht0xw^* zm>|+8Ed~k#3IPHQ`rot|=oc@h1coA%0FFq^{OORO*3F<3lCZD}D}TBrs!j#h5NM>I zteD|H2UTDoAOXOqt3=AejQ#?#hr9TQu!lPn1?h7$fms`B|CvTF%wXDv-Gr!MQ8sxS zx`SCG?Y^*Q{ApI0u_-+7tTU_~YxQWwRk>1j_;s%fKi{6{Ka*3G)YwuB}Q5T%Fmx}EbFx**$CKG>`#WN5OgSFNV4giTW!Agd}k z{eW04Okj1;exZw&rB)V#(87m4_fmKCf+pW%xcf_vHRLD~Jf>A5cG_0K=RhR%_$T6T z0w-UyEYu>s^Lho`WN1t@r^*D*hkI#h4U3CE%y)FHv2BGTMR60d=kQU3$r*^Iwl3uD zxXx$;CS}iIY+nt`zT_Xhpicg|)kQ?JP(i9v@QN8IP-T2A<5S7w#z76%fs4G2%8Kwb zkQpd58f<+yuP!9`HpT1)0Gp_$2_HaoDg~)X|8%FD=I1*k>BC?lfZ;$YV+o?Fg1tsM zH)Sk+6!8V}WqmBZ7YMjR@zdYzX9beY;HFnt>%b$l#~XX;hBnDB8WBkRxa%pz%VK1t`tPlTTokQ;jv!nWO!jOsj;dxMXMGum;@V3 z5NaUMv%cGdaX-fydRy9!^^~=k$a7lDRup#e_Fsj|#1<_`i+HA4;zII9;)wDsHlXaI zlDE`*i74Q{spRxTMV;m$JYaqU`g?mSz?l3s{nM8S0+H#iM9J_Jt&qv~8ChXoBEMmw z{hwe_Eyg27aC=orv<9GOgDGD{+$A*=ne#9;cok4;d|8#q$%(nE4IkK4l;us_vrc*i z!bb;vnbGg3$ zCr*HLrV(?ikj~*+s9h|s47g1xU-!wU2F|-YF*n(zq5qQ$4ok`X6(2*eoX`E24w_W* z>h=B_niK;Y*1D8nMQXUopy~aoRjHC>UXHt7jx1L0GER(--0Wb=E@khiSKu4h75t{@ zc5dDJ;hbk!A`eTQ+1;(d{^jozmTM7Xw}?$&X?eBT>nie=#FBj+7U4MwSel(z+$6r7 zLss^`9jH(kLaz(=I)xS4%h#p&N2$trL183^0&G$Lc5A1*x*P2lr8u|WPsNw=9;4XrOQHTQY;PvlrEb~O*-+LqTTn>LOwCgj z`vEwlG2PJUzC1Xqpv+U#uBF;oNTfY4^XWZ~TOoc%_)Z{@uVXA?bm2ZenTTnWvJF#5 z>VPlJAlF8OPJc6pB<2CQW<(wFu0QsK!=J&Z-~Ma;r%{pHb%x5jP?S>zy`?6}7D}(O zd2doWQS;0~vP2HB?JXPy{9NXLrUp#^Nt>EZIEdyQK7hihWU7K;=RZLd2$+VmfoxX$ zhG@S*H@=`*-%~;yE1EQ@XCqlRi2dY+Za7ve6%I1USD{Tu+WN+l6Cx!k5q^VB0ttdh z74epGNgks4hCtTt>cpFzz)Jl)79tVoVfa>EKsZV-U-lAA&8bWcI$xDKM6m)*_)FD2 z5NxOU^%-kV&nwtW7F0d}VV?jm`3dkKz#yRDpioc{|NPPL_1yy$2@IJDg-A&03*Q|R zl#S|oAy7$Jg#+?ucF-_HR8);`8F`C{fQe0^DsWbdC<_rbiDU$}G&vcp3X!S{Nz`vx1s}h|k>-GY4IBsc78S>O8 z^~K!XX-Un?NEWUXK-t$7>SS%sJAPaa1F(}|jBVHY70^)aysFA}opFo?Svjd-ib|3| zIs*9zt=ZU?>@=>RZqBpavPYjZocP4b3eK7)L^o2XVx4*DwdUkaDZHyNj*$HjI%pop zCIj#{%c7>XX@4F0gn`LP@2-{Ytu+5CNv~xc_HcM8a|(^Rfk7+%)94)(z=02Oqw&jE z%cF8llvHTK>-&pWgvJgYQbl#%4|5tPQ-?YdmLBeP3)_OC6MOlc>O3~g056IJ|E7t{ z)`=Frgfb^S8;Pzf zcUq@hYy7p;`tYYx(dl{YsUj6$dIYOu{u(a7CHh+hjfS0f*stZR?GTO zWn4N3@xsKSKSak1c)Dt|8OFvA4qy|Ft9A@#Cyt9KNLTFxRVYUY0_|7wrWxCzk(f~7SQn33gQX!rzu^D8KO6Mj3qQa$C;|JQoQye)#m>~B=@aBy) z-y_&n{WI8-g1JfTq7*cw?fuAQnnnMGYVrIX5x$~!o@Bwo>sN*ZWNXi7`C4AysT`> ze=fkQI?P>!K-gw^rl)Fx!33twLD)n+Ifdh9v58F3A4gTzpQYjRVnoeIZQE3qI7;_2 zRq%#3oVrM-8-1?}_@FD=FF9k{mk%SGI3soLI)!vaWf`UX zm(d`|iiDv@Yn{s2p#F>j^T_YfwV&kb#>B&&fHt4(jP~eADK+1dN3y>}LuI`0Rj1PL zwecXkYt&Xbb+v@v9aFc-qqtTR%qB84!4hPxm^y&nI2%?Rn$Rrv@OF5LZNU$DcnIOO zWBJs!~_+abs-4%N++*cDdJI?+iR{(pJGVM6~7VJbiu9FmaTF9y%8g}T%5v~ zBV~?TQY#52ALv2K<4H1s5!jWOD=&lG?eg+t%_D7^gn>+;9lur)6;wC|pI>)7+fYl( zb4qSBw&2CI3*u*;73-C&U#OFn9*c%5&N!QZ+PHPCbau{WZ@TtVgL zic_7}IoK%?>F~=K$W)X(`(#DJ6i(@DL=hi=1d|WIvB(F2Dm?wMx)#fQE4N~p*nYuf z&v_x*#6urQoVt#R-G+V?E~;G=#hU#{Q1Oq#vA~7Iv;Ax8kwD&7Bf&xUr9swv(EFla zD#d#x^q_@f7GGn7`~=FCi7_i#sUzSNx)4X3GP``3VZTjW>sHB!$$1+-XzTQJbm5yb zQ99_m1>VWVlSi)Aaqcs?z{^l9{X zU|J+#FFIixLj=)+6nK|fQ_^Bra8pog?-1RhH6(-H$Sf*NbU>#}Yh|4F<_?mpG+gK$ zS9n!o+_SpK`*#LIT-u!~ieg(VT~T#s*erqH2Y{nW1FIwwVpi~aS1h9IFjge}75MA< zs`D}Ly$M^aFYS literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/cover-fluent-type4.jpg b/assets/img/skins/popup/cover-fluent-type4.jpg new file mode 100755 index 0000000000000000000000000000000000000000..fc4139fd360d87a344a649cdc8e158e8f7ad82eb GIT binary patch literal 12165 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/daily-classic.jpg b/assets/img/skins/popup/daily-classic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f4d19de1da4ecde5d6c57be7d5629a55df55eec9 GIT binary patch literal 3188 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 JH&00|F_hnRSkcPz+7-CLToQh%%)V>>}7gJ4#h z#5PqdyLyg40q8v4zv~Ez(8whX3}q6PV%M|)JlIg~ST5bjJM_-`>v}#ZIlvb)m$Oga zbEJR{4^fpUV56J5y(!2~Iqhg~|5x(YJw3*B5|b zNcMWShj00e)_}+dKe7Gm!j0_fl%2JW+B;dVFPenDPvm&H)t2R}k$FnUR|^e1Vv_Ep z6#TKhv%h#%3L9D4U(c8IlMe`&X_o$4&sU-({dyDtAjD~7l?5|fJxCmi>?);1H9RdH zbcSh%BXw`xhQ|N^^I0>h&$q?}zYtQz-MfK_ZY-5iBO!0L+t~V_bIFo!lAZ2<8`F3J zfXpVo2lX5akDmBkA6j*4x63CdbA9*qFt00tFwEbaMiKT-NqS|vf0R{!1|TSmDQgIz0Uer zs*it?Vmo=B%n<+p#yzg@+f$F6PJ^LsmeE7e|FxYBK^{4a86O0yAC~}tlvP`I)l$Ox zFZ)J4wc>g|jF@}4$@5_l0FmY5GE4;PB`=!9atwM{$1Z(brA<@fc0pf{ir4&62B7sn z^yK~YN7Ywt`q9{~l^{}dS%AH`wD`rpeEZn;g3fun&WJV)4NYqUdB@b0B#lbQ?Ldy)rIidKYzypvsJth}QQ;E+dP97mcruF7kwCi2E# z#^1lBW@4|5`cuPHRupoY@qa#Lpr_6qA?sC)SWnL>lnv4e?}ahD$Z#i1l%=cX9c;!v zb$i6d`T0SLW2->iM|K;*&<^D8-jQ_Kh*vSkKP97OVm1kcn6XKkcO=9zRAM$Nxpm3e zut|bnOFT}yIG!w&qc>2qw{+LD8{9q#%$+-)cJUEwzZ7T<*MMe+KFN7hZ)1mf1F&)i zDsdmVSC-rR?O42FzdsE%e`a|ie>dM~eoI%~nYK#!Eel;N4b9JUjpAgKUR8L%-&-e% zLanXJALc4Xdv%prrYA>!!*f|PQFaF`!M)VhOT z%IEMIAOMwp=GTcmo=%5mOWop+TB4(({gkF%~Boe7_MLv@29|mizthYN

    eFHerel}cSF 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 c+xu`zky?>FDfteJo2RIOXJ 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 krveBzAlxnsm2$3J*9E}YB= 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 XAE>5ARaE=l@UUdjJah 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 Id|m$k0HeU9)Bpeg literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/grid-minimal.jpg b/assets/img/skins/popup/grid-minimal.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9454cd3f1db31d9976cd71d7532c0a3bd1c2f2d5 GIT binary patch literal 12806 zcmb7qWmp}t*6wWBxNY3s-QC?CTHM`=7I$}dcP~yU6pCwUvEs$8xEJTrbH3-h_wQZv zOfoZ>WF?to-es?guNweFK}KE%0D%Ai^mYKRD}W>b1^P$-QmB6fhW?krfWgpUSQuE? z|D13L@UUI09C=fitTQR}EqJQ+ir2y!y|1hwx%K$Po z2!Mh>L*9y>ANWCHZ#jr^wq@!q=Mxe!7I0I+o> z2g%p!OMiiiZ3GL8t_QDC^Hl&Z5&R?kjU50M)A^U}?A#0T9vZ8PrhR=TYxhr6kYWBC z;1ehdJ3Db5%9_#jRq6i2o@#)04+%wM;vNj|#nLV~lAn}bxtRI}=> zNiXeAGO);f?!)DK<3>%PD-lxWq0|}x7qjFz}B}59$|E zl@kq8`z!zo&TmR&wZS`}oM!LiP(?X~z+j8@{R30C!Eq#Qkc?~wuRc5gzy}roIe259 zgg=)<-553h?xSb|_7>N;=bpRp!y5LYxyA9jc`<84%53BF3g6y2XDjxKd1=Z+dxf1I z_qBl^2d@BWh3uK@kkvc-<2GW;x&<6x)rpa@cGem&Oz*#8{SUpZW?9I8RxdOh0xUEP z!oTMrC};o-gN{MYj!7X73&FzXP&Xx`WYcg7PHvjUq2iQ~JTLCsq~;Pc3z60|cMVNR zZN7M0`tWZX0wf9@JM@gb^^#Jn_DS)3JqAZn5jhpcc>0LY2no*Let8Xza!Q07RrspT zwci`Ry!SkV)Rt0`&o(ht!<4GJ$7wN^)|kulF)Qr^KF$fU);5-aL1Z3>k+=e+_-l4;8|YkJeV^a>|QALN`;MIfzR@10l6 ziV`QBNbXWCm%QCuuU4c{v?n!voQ%X(#%PWvt}hmi4JdU=lz&yUcRSJ$&>L;MP18z+ zi>@C#(-Jo(v&SMGZ_H!m-_wK~K;4)j|H=;Da5suxeFk|C3*0sSYfn%{E7q(3P~%W+ z=`w!q6l};uuRs5MH=wVZz1CpXb2L3( z{DE!Sq!CfcbaNgp;2~jTA@r=RQt9)De*Sh(3(o~nz0;U7dwzL2rPD-Lv=IIWIwJ!r zYPAE>z6HD_GLN_UoP5gd6N8*Uy@g+2Bg9Y@=l8)F!d7TE;**zjFJxSYegtoK6qvOq! zFh&B6TD@&a%+xCsl`fwn6l#VR8@l7&VFCB$PuSzIQ2jDQ2pt{s;N$)#+Ji72}Iw~D%D}E*EvUV$<8F0RxlhPeA)J83%s>=lzTDGi;1|GhRHOcYv_%9v49;Pof z$;AF?q_?DuWvkH616#))nB?lGcHTz`aZRQo4CZCn0b$n|W);`c_CKyL@j1sL$y)l8 z%`@5gj)?+Lv3VZ`wrw)2v}i=((p+o!SeO#6FTV{_z1PlGbaU0_G0qhD&0ov6_3D>xuQbu)C=6tA?FEijoI&IfoQ(&D5#RArNVH;LI zZMmXs=t*z%PAY{)KV5>BXn2G0@GRVoFEjeeDfo0xAA?Z)#3Fc^_$pFIDV|+n(Zh!H zU>sehyp&3=U3d-WUiO`4Q~EW{X}t;_mVz9B=<7`wzj$b;ec|D&Ykc{4L~GWS80Kr< zFt7XjK>jb%DYbYGe4^+kgWDWGn=!c=+f+Ro97-+88mmutTbh!Np}(U#0{B!`-KL(Kp%x=hPbSsP_TA-mF5y@KU1&7qSgFILojt&c-2Nv59`G6}Cn2hx+17 zZ?T(kAD%Jgl$FdMPeROyLM4m8L3O5jKK&Ry>gi{kEWF+34!p0x%AL$Ynk1f53mkh; zwGsa-AcwfCE3X+pj&@nH^VoptQV9x7>lVJ&g*e$!vKd&Nxk-4~@!?4RtWz*ZECf0Y5Io_gk%)nStD2 zLt|lg8@5p#VQzy(4hrnl?t?{J+-dC3okO4KXHAWFxzoNYurOMnV*BI zY&DOW-j~aaUZ#THLsy{F(4fFHGuGm7R$+jXk-j}W3$c(yrbE}}VYmyKLp8mK(<=}i zAS(CgW@rncH284K)9|c}TU4hr?U`{hh)JV<%RhNusD#Y4xKwGpu$89Nh|0WpQ=U?| zZ8VYrd+-IDlEgpncWFgIU)D zf3YuAvmL(F<|>xtjrY!@RJph3`$P^FuzC=%yS!qc#|L3gGKC3hom7?}-*Z{%bh5Gu ziow-W>7XfZR9Zr5JgA0bg;usvUUjCh)qN*+wam1<6s@we%?>6;=Jm}_LTZA!{+ZAL{4w zFDURjaV!Yx@eSNWSG?Q8l=BcrYE;|aMyS=&e(86&9x`XoW9a4!?H0?1?jf#MYTiof zlxzntCWwfV<_YTO*#6?3YtW&K^AqkF#a^n<$=F4-R}{%dpxx!Rj+9LkJKRp7+p*XgAJIN%FRdQm>8Rbh2zrOrL#>Z53Lv~ z*4Fu(U+CfV5e~?xVgDe?#&2rnn4Kg@mzukL8O9~2IcZNBeMihfuGQ(99W7DyeIdqV)TvW9zd!j6vux(TwnD`v0 z^Y?+#ObrjnUPX>)?KrgpXPjAC>ztR#z_6w>M0a3Eh9KKs$nFUzrXVEVPNF=%aG-I5_>7?M@U%Nf%aTYdh8zt_b5J!8NVv5C}>ExK33VPq& z$5unl>_$xQ+L4Dih*gg1aCVhYQSn>hV5v$UhtmH;@+MTY3L>K-1Ng{V`{sEKuSAo& z026s)NnQo(ET6nRX`GEG7u8x<@_Th8r$VZwR5*`D)^cu|bjU*Vd)^;3JC?LL$UiuU za%-ZRulrLD8}i$+rQ?VLViq1VCwqCn=v$en~AQSz%>Mr^rtYmX>KzjK$-Y zZW}|?w4>kTOJe0)9SrI`KVAVoD-FX)oFis%^?*n6NM7vQkLgVqrH26j)Ibn482W$o zt2e!joLyYq)CCfpOvYB+*ED@Dw)ua>O%6NSKy;Crz%Z2;k!doEf#f}bhiD$hgIU+& zUI<6zOtEZEa=kAOTMJVpjNX_x$}8ZS2wevUy%T8;PM}Yc(!=OW695qzDWPU7&-Gn| z%yW$-;-x7x{*-rCIW@%E;%{zRc?e^H>AJtx!P>A)>Sf?UhEWg3f-^r;LBa2$!t0kM zjQL4LNi2kegpIlt&y^myGaJ6$<3w~82#4&n)IZi4pZOUyW^(MO?Fsy}WQ3I)SDH9)`dCMIZi1Qmmdlg8gzI-OcO4 zUDe(aOg`cq9+u0HM`GGu2bHsZnEp+QSakOtFRE-74=e9SIiyQ332Z_5CUr@Z!E3jP zP~PKk9KYqtIS98nnOd*|HB4rGJE7IlDvo~yJ<>rT+-^TKocqXmd+6o%b=$?EL;?AyL;h{=o+7%@{qqr2xJVO1Zc%*#iyiQ51a%MC=DRUFFUoIcqV~fFd?{Hn@jB zKxlJmW8&shuT(ezkyI2g6=`M3#qhHZE^CPRrb;{q;X_9UM;w=y>Wduawb(a(K8=n} z@!RkjmckFJoSk|yaA@Wx6;>&cJOCS)HLbE>6lXj8&J^=g8ZN;62=b$WYen(61>^Cv zj>6xv)4O3RUK)v&s+;tw~4K`=V66JEW3x!eXEDf)B5EI z<5);!kr$9a#8ZqkHocz78AQUG@N_izam`IG>!hBNCnO0hj@z;V{h$ zB-dBIHz=d4fh4#*wvT>5P^}-F;a0xQK1xAn7oFnwW8Q}eaJ5tg!65F`&6Tlk3Qg{| z4w-k*D_~>6jgq^;L3#-U5O#|46DKa-hxo6`m`m0?z$nuIM11N9GI#)!hclgk3@217 z8&}1T-WihLV!uq@)j{2K#;7^98M75lnB~f%@x# z!yWO9l##D~IR{>UKeR(&KOi)D&vH0C#Zbu31u4i3r*1H8x&~OdAQCIeqE7o3lYWE& zy>Kl8rjf|X&Kp&W)3P3v{t43wqq&~@}r=v%tHnXS|gShV5k`m`Q!}#|?CZ8KP zg{ILj!Q3b8 z+#?GgwUCtW1NbY7H&QR4)N4%;mJa#7YSIf<$)DVq>ldBOYBT4=p~!YeD!DJEC7#<; z%uDUflbva+AbtGj$oyc!(G+OLLe5=d=X19Uq>TV8OPRjN5Cjc;4hIE|?|sT&0m&^& zOwd*o>6l`CsRqw}-`zFGzn$g<%!}D%$d0PeOhVL3oxWM=)`Ss=5;dU**wl)T4s0Q- z&v^Tb@hxnmnH+^%L%s#UwXztr&StNj%OI5ux}te!(`=M56|(rQ6HC2dPit zN}vnDeuk@XjzmwkGC7zQijocsr>ok@2>2#{+zTQ}t z7%UF4$jW}Ga3Z%j{w*LI#d_#5$0Fc3x(g`}Nf zVw3Qv)OPHnJNc-vHE6M;Q{rH)yE-7k(Xj0{YISUUX$)r7AW)omBP<1*IqEbOnu{ol zWyF&gdnnGTURY1++it6|#N_G3)vk{_d<4qRdRv_)jtSTynTM3a1NcnJItLcAH+-Uxt&dNWh}$6SF<4*VA( z$k>9D&x@P-HpQm@FG7&ZENwk?P#do%mM@4}7O+l)P!-BXa^8OB!^CnRpu2`sn?(%! zC6`N2bzUJuNSLD`3)G=plATCJ5Xg6@?1;zbn9xzUV_0h-qlmJ*l?6ouE$wQ&ls`ly z#8F@{DPzQ!?RG3B4ACf&R#?dScI(;{T}rUCxxKxa2-^Ifh?mrrfg}qv7D*=?#uEj} zUM*S1t8dsYrSD(1dFg#uXS!#zlc&F#}ixB#b zm5jOQ^Wb+`n)7l(S_Ou~YSA+&%8>nTuT#H9QvQ)|4v8P&!+$=jc#am!K~y2jb#^4JXgr$CcvKqQsA!dq#5TGHXU0hI)g zj~Rwf2q7!gLHwR?<{*zxo8K}%y{t%=U__~3zA39@mCDzgJ%gY>D7FKRKquGm0E~b& zHx$Z!T;B(O!g9DKmw;!k*5a>&`O$;{Ut4bLn6vio=L;JIMTeu`*$uXts+!!L2N{LW zM2;O+^V@H7{&7bf+W@=6O(F5T;}@GmC2{K2ZMIw)z3F?EFO83Q2s-fI@5W~K9*5dY z(GeNHUqq<(aGLO=cQxqh#WBh&Qm4k6nax7=_hGj330cLhU(Y7m(en^~J7Q7D%(_Xg z0&A573?q{dnpR^_>j+J!u;rt)8EGEu+sMam9jckTo{SnB&OoUjuzl$amlH|1f46A~ zB@PbCV>iY-ugzgOpBS_sGQP^2=CD8)3}-lFY&(ylHW+=Pq&7;5&u$15i9@RV*_ZO? zcJzTM^FzhPJ`ZV)^Q8S^bHYcmzb;|$s4nrLgH@%{@nAWAJnx_qch=D|^=PbK{$}p- zl#+R$EQ_P>P6O^Rt!|n{DM{8R zpvIn`S!di3PYin=sPVECF}j4xg<|g&)Gs-$PWbm&}4Bh zslk#)g_na+l6wkv5&_g3!z}S_Rr1?$16C$g{EAgx)%6{m`SVpC*snXH49@unc;2k) z>3ucmEp%24Uuam;^yTc>nZ#(0W{KXPxrU*$(pmWRcvIDgC&RGjA0Zjk&Y8#!S+c_M z&1Wdngt9fZaK}vC4+(LX;NrwF`OP^69U+R_&M6ERSaO50P{W6#Q3Dnt1!2-0vq*3_ z{*v!JTIe`*71K~x2wUJJN6<|>Y(80LU^dX|wLM|SlUnc)(TMuST$Jg)>m*-u$qwrC3h|-EYR-!2B z(zQo4@3Wf3+(G4XsWh%o=hE9V3_n{f?zZf{<$wsk(m%5)I#1)Keia0Bg1O)*%+ce+ zPSXV_KYS{sm@z+T1qm3f!!nY#ZH{3W#8bV07ci{wiEIeB7FJ44?yi}jDnJb^A!iZNuijB-S4x;e~ffhqW)8o@2>a~rcrWfO1 z?78AfSeo&oZP-_!=G>g6f)thZc-Wi>@9$u~fRuYw+9ukPwVW!ePIgsD_DHkLS4-?L z`KMPPqcI$!z}5a>Nu};B4ri0%zn}Xcmg*j*8QhoN3-62)SlJNUx=rQdLNHtfgyRy< zCarNGAHn5Pp6cKs>TlwG_gLkyfD+&2xE#OzY)_x%Md1P1Q|*TTexm4)hOdA%5O(<% z6cqv=#dZ%LZI^7KV^eAC?+;RKM`&nZ98)>|y5khkQ!;OEeBoV~&r*CGs3rKif9 zS<|d)<&)?p4KRXEBv3p5)HV)JHZYJQS^^Y@$RV4&Bed@`cgAq~u^^~q(j0;eOHMXq zVxBO56v%jDWE?m43Z%SA2Xv4(C&Zin2n7rE=7{^RbnqYj5n@Wl=8{}|9{i?2UWom# zw*tcQ%?$hJFVVUH@`J!j5$!JjIsXAst(V5s>CJlqjcZ$)wx}HZVqd<3{7U&>Gck+^ z<-Aevkc7sONEPi9jdFj$@~h%+EOb#Ln$#kLLt#+E&|6F ztneF1nQSdn;e$iy%LV=Ys~yz#rUnpJ*o9KCP-CYDKTT$&`R~Zjby3ZfgbX=JVKC9e zhjJSn=U$Oj@F}NuTbw8cdax3XchKVy6k{|}Dj!&<%&S2(sd;hCAX@P*+zdt=XFHPT zM+ENHa^?|34!fUFYX?wxOx7FbD6mJt?4$OmrDJI41JN6#Dz3EvEk6izNKaBR=%x!S z2U;~m%)?~!wHIrKMMST@(}bi$2|y)GDSNGv-2J4bKj7ZH4XNC1zn3JewN@tom(h zfh-3!RvVhTQ&Fg`q47}5Lpi@gEpq8_0odjotj*)|n_59l9Mu^Mymbp25l%Z?wVjrq zL7egKoD~V!m|HJZ?-I4bIo$?i)MWs3St|kd0*Q@JboG%ohPir{i1xkq30S5dPmnDf zN@4d+D#f%HaKQw6yUV3%sm@ZCTK$7fCp$nfW^vsUvdN)|ycptKXIpJ$JF*4y#}#63 zY8hb)oS0`Co^#YzH@}YvBpQceuG80koH9%1}j)eK(>0oyl{C&h3y12#L;KriUyV5}nk1xcM z95`rQJGpxWpa~$iBTawtE^yZ%Pf7e&T0gB%*?`C~yrG6ar4yPp zWpx#N2Bo&yxa1tsV&6v^qRp4sLkrZqs~Rg*`B#9-GG?STV<{eT!Icq(#+C(tJ+AU; zA|Mu8Jl31=R;@Iq)K=r$Xh+A&c;<3J^wB4h?{>0!|X;*QRfk+TKz&<+!y-0PD7aB)58s#d}Pd zkCMe0%!pqR&ykB79AxOg_#NXo!tRho08>U3dRDwWnv0?O7ZqnMqThRH#-Y+6d?s6o)N9R5u#MT~x7>GR^<%FO3o zZk<*QRq$}Zo9AfBNCc)}q^9Bl z$>1?eZF{vw7%EI+FJIYx~SepkZw1`CzmH`x*KTa&bgRD2vr=Z2r;19 znE^MhPW9#R}C$;(`NAJ6i8dF0dFSbeyx%M0=c zXJa3ya7F#HZOS?6C@$o4n>$3obMib20SV_`qXmcMpy;ZhUO2p=j<18VzEcVu4uJ_&ik^v<*b=E_FHUM#U+f%DU2NnVqs2{*`3GdJ z)T+l3$@wx!suHv+5UP#?FE+ay2kVu(uv~h_`>OVH}7*th@<$h|yEH4{{-lSFdVTXA3(?E_P#IP)h z3htPB-x(@V7&T>~B5awckxS>D-=?ZcnlgOSb~tu0zr z%~RH-piuLYISx0C<46c(Th;0M38M9hbT7`NJ@|8-Oun`}6@l1^dPD)#UR`DZ=b8Bp zsx$nfNz6GO?tMxf0iAk33kjEN(C_&ji6TDqQ-g87`b6PK#<>nl_Igi$_pF3+M2-Fo zf!i=N{;aBzZ+s<8Y+CL!*GK{}MaIAZ_W4|z)gBZ%KnFm9x%xZcxg(z9;#waUKG*-Y za!*Z;q=2sLZo%)^e|#qfmRy1{@ZW0})T^oKIV;M}%3hLEE1^}#SOH zp@6rsBphv7P3ZS=HON-M|2Uu##FZ!0fsE|Z6BPTfp-D4ttHQaD$e;~>Yc?fE5@WLy z2Aye!B8}%{hQ^dw#teA{X5XY40rY>N8Bp+GFc=2rztRj8Isi@14i<;OP&W;JlV>0< zO?|Lr6w{a-Vw;o_YRwmLSZuB-|B-LrLaRi9X9b0vAi45pVhqHv)o$XBH=UdiNvS*L$G6DISI$&V)T?Z0>F1?kZf`mKlN_@EMQ zBx&e(uk!ENgF}Rf)997%arShaJjX@iWha07t$wh^GLtu76DzcV;Ucu*Lp-g*Uej91 zUPUTgXTBv7uh-T|&i7sAbqOuHIG8$^8KfFxr0+Job(o0cn)3X%c#UrG+4rGiXPynd zp5w3Qu4*bubUHPNF%4_z@2)C?_?IAP&pabM%(@R(V>)TwW=XYE%hOSX3~qL0G`Bw* zV4}#DS>1r)MNX?UJ8WV#!-B-NZ$?O=N-vX>6M=I*YK@RKDqM4fnva=I?N^a7bIj{! z;Glgn`3=DNQD#w8j9M4*>RX1I0pj0)%v~(h#|QRnXHWJx9ysh+28@(rqPva-U~&KZ zjTPZ&yjGatuh9*HuWw^c+ymXd0=C!RlA<{(e&$e*D^?`|%ko%<{ag|8!!~(#=N*Gs z_5A9$p^Y;DlPMFc@fBz>QS{@^#yO#qKeyw{F&_?LZ;U;0!Oz=0J^IW90w)A`+vYJ= zXT7w_2EKAV*wL;~+^=l(^gL|4Yaq%>MX5X$3JJN4W+HZnk+^b2sS!N`htFwdxDomR zh;m(D{Qit;Fe7NpbUW+BlJqpi4sA6phN})T)m!ak(mo)FTou%sKf57q)dsFn~(`bZ792eRIhRIBc0+9C3_GLEl9JHRWE(8?Xv^e*_;}r@x zQMguoXDKnbe+48YtChdPT?NWC6h^F_>cN;K342Sgc)r+ddeC$ueew)G`08*~w){WX<`HH4@NAikBUk@zBV z(rr7Bp-kl9zYxe%sUy(G^_6D#@wA(qqKIVuM8lM|hUDcHur8hq-6Lz{s`q)TgJQ3u ztl8Par>jE^STU8WwlEqyDrwXMNMbF0(7h6Di{5Sv!tfw_M@s;t2}>}%8xGy&ml9Ua zdKVsXIH%=dGpIPAXiBZO;KO4*&z4o)!6cSXpC>#J!9{i-BSYi2YH;(zaL%9&4(&i= zWQ$Ro*FEuB&>2~t9}Q$3#4}iiUxqveo$Zvq3IC8s`1jDkyZ5uN>alFWHh=-T+89`! zlBuT;SWl|M2?ROwB=Khi-$S)Wh7=|1fN`A`Ki2^}i7f45{*JZp(fXD)2Snb7z|X@m zo=*H4$sJxh!Q`5cOD!)y`1KviXSObFzKH*_k-9`6&?ko~L& z&H=VXCcnNg7yvy}ZEh9y_sM@dv4A1ydhX>Xk>;pgICRe&1z)C*iqxB*5_q z2VAhUJ~cR0qJY(wfdEdi0dQ$e@Ux~m-6Wr+gYhQuqon>wCD(;u5gG9P9AM)~;!7FG zW`mnST?eUMeD-+4>pcsnL@I0j$m6$!=RKyki=zX^NNp0+nYt828!s%^>%V@B%nJlR z^F&gi?@o2>!mEpe3H{d>#mdOxCAcx@RWc%64CDK zk-k0oCJPOp*Sc<_xUX)lt{TQZbTNPYQtn#Mkg=Hs$UeT0O$t0D2g2A{Q9mAFS|P}& zssEy0I=HDdxf$7S9W|^F&qz<}(lVFWaRYrBS}|+W2?_hNXWqhRWisMKB?R>=4$jZt z#2nRS387_FYMYM?CJCeoM`nUB6s{BS+_?Vt+T<~fLNBH~q*#M2h`|~3@sNoJwETu0i#>VooZ}Cud1V z&-7;(4C9}7$Rg#fOoGdU{Y4x368Q<;rggMg_m_Zch+2?B^eCL$SOH7z+F8#r#e&(p zW&}#MLA8iM_DIF}WR*KS7_QyFS5B2C!I7D(SJe*DVN>s5bNw^!a=B{8gvdDA6`L-! z@6u*nRuKFZw!wKO0a;Z+B}k#6?h(jSd(0n^h`-2bm*}XABPzzh_r~*7yX}qAr*up6 z)d~|~O15gSEaB!QHT+OQqRtNG#=CIS8SO7u%%<0vC#HosQzD+)bbWe6`DLM;F~X#n zk%s{ddP0y#fVqGpK*ZW|#U2q?^!YnNr#1(3dDi`_pK#?9Bn3;1%m0f@5UTs_cJG}^ zKUoCxTEJ$Z17j}&_GV$gun75`_j{-^XkpAiY)}ByLqqZuer#ST2SuOfN`t-`QwG06 zHn(L;TBN#QP@PK4GE+vld@EV8EfqZ#L_->$Yz|^G46w)?x;%&>%nNcn_WhdZd`#$s z_VIz+J6*|v49Aqi7_6@RGF@FOgaQ2Q3e+W*ceHsP_mhoIZi$kSn#!LQ_xnl&7>#6}36 zhBz1lo`O|y{I}m4r{nxk`eaT?Io+O?JWU!AG(bm&`vRV3;l2Lwz9J+AV8c*s1(apI z`ijY>ddV`jXIa>7IvwBHw<~{TM)NJYu@)4APREMV^ z@B;`m9RNEsl0qZ4Xsl#UwSOqWav3{-91oUq54OzdSv7_^uy@%w|DdPI1bF zgGfYCqnyRpLn!x@ z&0b1VFi{j0j=3Jh?6Lc#5MqoI`(u7Rmfub%~~*lv%SJOI2}&2r2gIOc6&_?XDz=E%0+ zWTc)>bz4axWWP4KTm^kdg*NVfKNgdO4N>aq?dmSne#@rn^%R^aV0kIN>qig=n<2%I yIOsdhcMVTjFTc}j$)1{{;G_Xj02YVGl|{D@#r88l6B&AQWW0o1pMbxwOaBM%U*;hI literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/grid-modern.jpg b/assets/img/skins/popup/grid-modern.jpg new file mode 100755 index 0000000000000000000000000000000000000000..756b366d43562d464f51b26e2af81ae1d394850d GIT binary patch literal 8570 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/grid-novel.jpg b/assets/img/skins/popup/grid-novel.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ff22ce2e2961d48fb28bb29b7bf4037c3b8b7ad5 GIT binary patch literal 13969 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

    W|mw-LB!UgRUm$4@-y}4aSyaWyb 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 D!&Yt| literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/tile-fluent.jpg b/assets/img/skins/popup/tile-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..338afbe8b30645c95c7990e6b3d3061aa081ed1f GIT binary patch literal 19251 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 nP?PS|?nkXqu2%>{7JR! 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

    jseob)WeKN3iEXc^uYWVcK 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/weekly-classic.jpg b/assets/img/skins/popup/weekly-classic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..82b25827f26209c45c435a9a36d6e50c03070c35 GIT binary patch literal 6383 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/weekly-fluent.jpg b/assets/img/skins/popup/weekly-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..25547093bce8399da9cee3026161b734ef30cccb GIT binary patch literal 5887 zcmbVQ2Ut_fw%#E?LJ>k!KuSoc(!tO{nxTsHF1;58qzDMo1%%LxpdbR$K|oN7G%2B| zbPS*?;6MN2{R$5C{N3_zav) z0ZIVDc>j$fD3pwnjQj!x1tkRu8H@@> zL4}to&Xs`h6VGQ65<)0Qpd|R#|6@Aq0H~lqGVm4*q5=r0Kwv7+Stq~@;H?9L&h7mx zfe48Rz{C(J3BH>N-*Mji-}*rWgkT~Fl=y5CAP0j00vH&EpLtTeBO~;gX2@~;Pcej=b*7P8rL%SheylW@5<>Kq^lSNvwAJ ze_xt_8&f}PBO-F}$wi%Jx7YWVj&$#Owz8PLaMlJo!<~1om}XdJj~)acRVlhsA3JOh zu~r6+u5e1Z8bUO;c!MERn~ha8gQ1mjmwxsvvDTk{JVb{{d<-FGzkKt>67FVy<(7$s zH-y|zWZrs$j#1d`$CLrZ?KgssRT<6`Qe(93eXazbHpB^Y)bBkuTkz%uS9V59Kr&>|?^zux`PtR07GTbk=#Sy}!*W20!h z^3@;ls9E2GCksD+Ybjd7IcEgII?IfyD{gCa>~io}uPmihWhuW|#LzrQ8Zb-!tUE)4#+6_Lnh_pN z#~7RGqF-=^B>d{$x7-NGN78xW-{!(^;d|g({&{hSy28#Q`|okX+iNxNYrVa@U7ihhm4w;zbm#N20&wTYTkOAJ~xGRk~p2KWkAr~xfv{C z1yH$#J3RZ7fgFk*acy`G^W*tR3<5z2@kIX@Il+WPRK(PD7vXH8Vh|V&t*{6bh2T`c zlNyTWItU8vS?344>WsYOWfH0WUllYf69k}^`*oEMYK;m49=(u7w+1BNEb{QC+@ha} zJ&AWLYH6r0s4AR2RKK6sdB=2}wJk;};&6Nh6oRX6B&yx4K;L63Q6x=P`bsA9U; z)#cf~Zj)t2MHQb!zM06P)7k1+Or55z*Odbq4NTN)v5pa$Va=NmBj$?g4b0l|I}c|!1Yhdf74~*aBx8(fVq(7fL_Hgt+s6}8 z!mBQ4%g$DRY8m6;;yrF@&vui2Ant|eK3vNxn?31O>V%G>&8*z(VDi!_7n_=j3WK|G z0&dc*CRQq^4pqkTO^+GNiu;abXtBFEOhgOT9SCSft+5 zG$Q83TXJ>!=+Q0Nz!!D)nvV}{S70R*r#WBN_IE18huOr9ol4*Pj;GfgD)W^)m$W=K z3qo9?S=srLmEjje+N!n|M0HClizPdrAl_$l&2(qUQc^5IVKhLLAWL*zC~Md7kdA=y z+g^WCP%TVmqd+8IxtCP=5SxLDuePP2HT`*=ktV{$U6sy9yOh`9B88?>URk);ZaA}Y zR`Fc{#QUUCjfltPd1R|x9SM#%t`K5{8AEkDxw{>Bok~{=WOi8cwe$FwA+YG6nt4mN zPD<$#s@A¨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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/yearly-fluent.jpg b/assets/img/skins/popup/yearly-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..18272b92bbafec117b81ca2e8a7e5a0fca984687 GIT binary patch literal 7772 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/yearly-modern.jpg b/assets/img/skins/popup/yearly-modern.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b7204e8be32872eb28749cba9cc69cb9cfc2394d GIT binary patch literal 10836 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 V8P7>0#Y@6H^8N7+^bPq~{STFR0}22D literal 0 HcmV?d00001 diff --git a/assets/img/skins/shortcode-designer.svg b/assets/img/skins/shortcode-designer.svg new file mode 100755 index 0000000..cece276 --- /dev/null +++ b/assets/img/skins/shortcode-designer.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/slider.svg b/assets/img/skins/slider.svg new file mode 100755 index 0000000..296dab9 --- /dev/null +++ b/assets/img/skins/slider.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/slider/index.html b/assets/img/skins/slider/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/slider/slider-type-1.png b/assets/img/skins/slider/slider-type-1.png new file mode 100755 index 0000000000000000000000000000000000000000..461a23cfd0e703aa077c77a00b098c2dce385dec GIT binary patch literal 11856 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δ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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/slider/slider-type-3.png b/assets/img/skins/slider/slider-type-3.png new file mode 100755 index 0000000000000000000000000000000000000000..fc4692f73819a31fd5c23d3f6be1b82500da9207 GIT binary patch literal 26606 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/slider/slider-type-4.png b/assets/img/skins/slider/slider-type-4.png new file mode 100755 index 0000000000000000000000000000000000000000..ab60149cb9801be16ced87e91f4dc8db86376413 GIT binary patch literal 25852 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 z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/tile/tile-classic.png b/assets/img/skins/tile/tile-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..c2b0a0cc404c80390534317470ec88773abc6f69 GIT binary patch literal 30717 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/time-table/time-table-modern.png b/assets/img/skins/time-table/time-table-modern.png new file mode 100755 index 0000000000000000000000000000000000000000..93dd210de6c57cd3b5d2f0acbba1dbf4c21c0f9b GIT binary patch literal 1868 zcmV-S2ebHzP)8sn0000aP)t-s|NsB` z`ug_v_CeY4;Ns%T$;Yv=vNhN7n3a~3?|OWNF)-8L?SsL_AvlC7^)8{BrK>ta}j$+6@?Ug z2L2(U%-`U32<%@(AqN+MderNW zKB)KW_1^7X{qi`1gNPh_XlWlWe>ivYw*IAmyMDWVKl;F6#sP-bVUt}A71Gc^L&P_H z)7OXt1qV!a3_Sp8p1~;Kg_K+IlKs7gCP(S=fKC>@i7DVD8L7mid^N=-cXSFu-aO<)Qr<{S=eO zk00h56}gT)yG?krR{I6L$h(f9+xOpcMfz(VyEJ{r6*=?iEnnm;UN3So^?9?_)koJ} zb91EDA9D{@kKb`4qD^n{Bl2O5h*l!-hT1wAvYrT;{jLXcEpuLm)MvqqCXw; zMbr`z^jnTBl6#&btK9!RM-bjAM+`vxh@dq&g8s7BT7;;2v(_rtt6cs5I{mfhhj{_~6CGP1O4l^vpLpH2&V_AH6kVMlYV<%pmO-KH>ulo|wXhx<&q-7b4a*@HFhE_)l)A4Z17g30-jXq9mY~-&U zT7WQyANarlBeZye6C&6v3I?o_wFymKG;5L2$$m7mmJ~To5!?I)qgg5JBaBGp5l94K zC_~vq#34|Q^5e?Y%D>u0wdI4-wG;(m71YIE2oyb?-umpcZa^6>*+7JmBxDH-6Q*^$p&r$`A)`!7!$=>7NgTvs6p`&KFzTvFYGnZp))kG3*QyQI z)mn<{=vfriZr>PX{NhRP#S?Zi?lIQ$G8SpWNvgBjB{oSCi!r9hEbc`qW65B9kw!;% z(sA6IM!*4eTqXOMos`sCuA*A5Y7*Duj|z=8ns(Em&Y4cbZ8Aku6~$4MPN>+}c3q`O z#~s&oZO2k!TNDd!wunV+o4W;dHPvn?PQ%(H+0h0sHlk%_F5CGhDjEzs@S`3q{auVi zpS6x=`jsNT)moM22qRK?j!>jQU;~st|D;%p|A)7V?;O~HRtL(Uq+A5Kj*|G@3j^Z0 z{0Nv8|Gem_Y+4902pb}*TYn08^rM!|E&k|bs9#!ey* z(a*AO##rrRc0c63KsQN0T{zbt@ + + + + + + + + + + + + + + + + + + + + + + + + 21 + + + + + + + + + + + + + + + + + + + + + + + + + 22 + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/timetable.svg b/assets/img/skins/timetable.svg new file mode 100755 index 0000000..a15adea --- /dev/null +++ b/assets/img/skins/timetable.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/weekly.svg b/assets/img/skins/weekly.svg new file mode 100755 index 0000000..e343173 --- /dev/null +++ b/assets/img/skins/weekly.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/weekly/weekly-classic.png b/assets/img/skins/weekly/weekly-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..84d674702c6bfd4aaaaa5c80854d3f828b6bfbb1 GIT binary patch literal 6528 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/yearly/index.html b/assets/img/skins/yearly/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/yearly/yearly-modern.png b/assets/img/skins/yearly/yearly-modern.png new file mode 100755 index 0000000000000000000000000000000000000000..da83f2a80d5dba422e935a2c2505db0d49e20da9 GIT binary patch literal 18581 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 literal 0 HcmV?d00001 diff --git a/assets/img/support.png b/assets/img/support.png new file mode 100755 index 0000000000000000000000000000000000000000..89052756f3ba69918bdb6cd55a1d51827991a3d7 GIT binary patch literal 154040 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 z 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

    1`F>vouF9>BN|$nbZ)EenqKE` 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ⅈNru6AFA$#vevC;Q}vu*<8m$ zt?7v1M*K!glM-)Kj0uyUdf%iZO?CPCUzo>X`_*| zX*q`Nll&*lq1_umw>!`=A?J8p>djV}r&1wut|H0ta@u)Ofsl80=pb2YAkjQc%pZcJ zVg^dAOt{`9A&f2^=5n!RT-o4zSEiPR?O_Z4H{O2GbA7V|+51zzj>A zgn_gxXfa;O^GKdH42D4$<&hos8yK)?YGq-Luchs>Gw5OYMbrd5kQXToN#6$lj^sbD zu6JMupI5KbfH!Vz!GHQM-hod)c@BUX4wgZJCl8xGTM3h}g+Zp#E1VoXWjndzVVG~E zfh7+8noKq_ABLtp;%PI6UJaFGd0sSu3-m5~d*`}jv@hc{z}QmYidE?NwTj)rz{_Qv zNJv)r2xV`?6#0X)vaJey^H|@>#M8M_3fl-~Ml`-sTkxvp6L|1w342%u*9Jq}>p9$v zrmzkRrVFjKwWl(lQoRS|8|p(TN0kGTn)?YX&k_a*-=Nlpd~gl&Mu#~@d7hF73*j{* z3Ib&RnI%|Wti9&5dXJ}b)Wxrf%$HeZxmn_kShY8-v|H@w3 z;I33lt0Hbo!Dn9xjTP!>RFP5nMKoZ`m>QaJ2x2dmYjFZDb0V;;IwLGQNgOUl23t%m zBNoS?^f-|%;p>Jt%XQy_&ic@A?p(KTzws9Q+kblm&yM%ulP{jZk3aaBN65!VhvwR~ zYfx*pLdF(_26x3`rr@#(+(v#z&Y(oISlhY+zq&but^4<3`}%!MlLf;$#}s_;(MRy& z!Dn!Me9FdjbRP-lvw^=)*0m!Nu{s;EuM+yW-VQ|v^|~9 zWrO0vovuhabcq>G&XS&6>jT*6w_$vWM}l?C&7XNct+$uvmA=?V(5xG)siVN1GaGa5GQt%e+$8{Lu0duF7!Jw9kSzrc*#}tI?@f9UNMcM}V9QSNe(hebp z>e^NAKdeZlj!PVIPY@f;*h3403N`&a#M{>I-nPj;WNo5O5AH;rBf8ev}2DGE*Rmohb8 z{8$oGpvV`{JUfN8wTWnZ5FQ2t!fa_c17UVBZrsIU$sXFLCnw^-itpR&_g%l==M~CU zySHz{`1ly=xX?GxPq_iSB!>k&WKOX(+CMoH3Imo;*VlW@0v~jn7-SZ(-m2j>^fAln zLK91_|N75A0+?ZN*=&g2irTL5#@oCtBI8^}XkUd+n5707y0>w}Dwy8+q6Z--crf<} zs9!a}=I7#yhAC$vI=w2^nGchus$zmu1sahYWekk~yL4o(JrF)vQvr*5b3wGO;3&~+ zsUoh~QZ%NNpM;V;tbduif}16ZgsxBqS`C({>R8zm9M45E`i}}{OU^Kz z7n8FHl%DN5j#%afFk9QzFcihHEjr6Yk~GR4HC#^u6AhXoX{CKF(TJeUUZehnU_gwh z^ohQU?soCAii|R(sI%adOe*_TvZI=fj0j+OVbZhQ0`(%CMgqFNjIJn?Ay`tcJ3JIE zjRl>N(6_){v{)`IJ5tj3@P(D>E1EYYcPwb1vGy0ZnB7i|xJSf1#h~*c$Bd5*CL$)l z#>BZHIa3l#kNB>{VijUk<%0q$Rlm8wxFxrC!EuY#Dd}J%LpXeH-L30z_2zvTV}Mv- zDMPk37XAj``AdD90yyej7-=%xiY|l*l9@J==`qw|*)(psQc8_bOIW7Wi_?H(4u&h$ z0I-y8udVZeG(A3m`pG_QFx-ENr7#ARYg_ECO+E9BN^iU`4I?k3DQ6>A5-{iyLjLd9e@;$XO+1N;PT<;+ieRp1pQ# zq!$|-QNhnOM2qY~wQ_chrxphZ8BJ$ojlqhIQUXO<)6(9p)myA&?^8AX!az#R;RT6% z^MMu$W*Kdh7EVD>Fl8Bap?O9j%Nb^%Iq7Y2W7NumH%>%hdGp13;t4K_PQJ(y{MuMn znqX2CE!Q{+=Fbc;vpO=-MFcF{Nzi?IP9%&)`orU-=2!E%eYJ7kOIk&x@0ttxv($Je zo8F8V*c>}^l}k>`r7NSDLP!82?`v91crw?ATM!cf@9;Th zFe|VFl9iY<^q}AEz;J-2B2_z-sB8~0NcF(YmkcHN-{1KVFe>2>`l8#@TnE!$6AKo$ zz8#mRz0qkA4?G2%Ns}mP16UEaXXLNi>4yLIzN{m1g?wi+u4Y_k?n-_XaiMs?5H`0C z1479pi>}1%6jQDs9iY}R#D{VkBtoEpiyqvC?;Cxeq$$_JUSld20H&19;OCl&8)j76 zUWW{bJFzr%rRFpVghkpz%D^3*dN??p+WS{JaC@T;bx$z3+-mYx*v=K*1jo)0hE?iv z&S0$YP+4KlSyznHnQI`PG9pLL+mf!G(ge%#g}4t4qL00)7&BC+WG*ORg|0Sh2s0Bf z2vA5G$*feT*krB*y;7!lK&gY%EzAX>;K9%pM6A{)P-mwV zkMK6}Ji*kp)ohU+FZjjMa~}!6>0+5j1ndj*%b=62pC4To^{Ng5mENb+Fb&4)Ba|(3 zwz$hFlqnJX@ao51>IvZ{VD2pLneb`@1oSca*%7>4$QAmsRZ1$VB8FuB>3)tfJS?9vQnu{-aYc7Li8LDx&^bpdc-jay;BMF~)>b@UqAlO{SchN`=&s>N`c!Q0AHYAfIl6 ztYIidz4A1fMNXSqfmjhFgg4^mx${D}q6k|f|LaKXJH28PNE?P4m03z65E*G#SxoH< zon=$1KHytK>Z4i=!?|JMLwu@Y>Zm?sbuCA%XsQ*A%>2mV!zkb@=IareT&i*-G99*T zeaZpMGMPStK;jTUyiKi1v~)fjz;89&T;uzJ1rKy_lU&E(^WXl#N4OdBd))mBz}gjQdh)^G zB)D;tIAyqp)O9r}Z-{

    U5(l{j5=3L6CW6TeNf9?M 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

    -_aEFTo}0f&S9f-4 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 + + diff --git a/assets/img/svg/camrecorder.svg b/assets/img/svg/camrecorder.svg new file mode 100755 index 0000000..a85d3d8 --- /dev/null +++ b/assets/img/svg/camrecorder.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/svg/cancel.svg b/assets/img/svg/cancel.svg new file mode 100755 index 0000000..4d67707 --- /dev/null +++ b/assets/img/svg/cancel.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/svg/clock.svg b/assets/img/svg/clock.svg new file mode 100755 index 0000000..fc2ddbd --- /dev/null +++ b/assets/img/svg/clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/delay.svg b/assets/img/svg/delay.svg new file mode 100755 index 0000000..5303d8d --- /dev/null +++ b/assets/img/svg/delay.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/svg/form/back-icon.svg b/assets/img/svg/form/back-icon.svg new file mode 100755 index 0000000..899467c --- /dev/null +++ b/assets/img/svg/form/back-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/calendar-icon.svg b/assets/img/svg/form/calendar-icon.svg new file mode 100755 index 0000000..b2e8557 --- /dev/null +++ b/assets/img/svg/form/calendar-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/close-icon.svg b/assets/img/svg/form/close-icon.svg new file mode 100755 index 0000000..868287e --- /dev/null +++ b/assets/img/svg/form/close-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/credit-card-icon.svg b/assets/img/svg/form/credit-card-icon.svg new file mode 100755 index 0000000..e0255ab --- /dev/null +++ b/assets/img/svg/form/credit-card-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/img/svg/form/discount-icon.svg b/assets/img/svg/form/discount-icon.svg new file mode 100755 index 0000000..bf7d184 --- /dev/null +++ b/assets/img/svg/form/discount-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/img/svg/form/done-icon.svg b/assets/img/svg/form/done-icon.svg new file mode 100755 index 0000000..1b6177b --- /dev/null +++ b/assets/img/svg/form/done-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/down-icon.svg b/assets/img/svg/form/down-icon.svg new file mode 100755 index 0000000..b91efbc --- /dev/null +++ b/assets/img/svg/form/down-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/down-small-icon.svg b/assets/img/svg/form/down-small-icon.svg new file mode 100755 index 0000000..5f1e00e --- /dev/null +++ b/assets/img/svg/form/down-small-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/img/svg/form/email-icon.svg b/assets/img/svg/form/email-icon.svg new file mode 100755 index 0000000..a92f5a9 --- /dev/null +++ b/assets/img/svg/form/email-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/i-icon.svg b/assets/img/svg/form/i-icon.svg new file mode 100755 index 0000000..8b5ffdc --- /dev/null +++ b/assets/img/svg/form/i-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/img/svg/form/left-icon.svg b/assets/img/svg/form/left-icon.svg new file mode 100755 index 0000000..5415efc --- /dev/null +++ b/assets/img/svg/form/left-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/lock-icon.svg b/assets/img/svg/form/lock-icon.svg new file mode 100755 index 0000000..9376a9a --- /dev/null +++ b/assets/img/svg/form/lock-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/minus-icon.svg b/assets/img/svg/form/minus-icon.svg new file mode 100755 index 0000000..67079c2 --- /dev/null +++ b/assets/img/svg/form/minus-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/next-icon.svg b/assets/img/svg/form/next-icon.svg new file mode 100755 index 0000000..c87c933 --- /dev/null +++ b/assets/img/svg/form/next-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/pay-locally-icon.svg b/assets/img/svg/form/pay-locally-icon.svg new file mode 100755 index 0000000..9a996a8 --- /dev/null +++ b/assets/img/svg/form/pay-locally-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/paypal-icon.svg b/assets/img/svg/form/paypal-icon.svg new file mode 100755 index 0000000..8bcafe0 --- /dev/null +++ b/assets/img/svg/form/paypal-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/plus-icon.svg b/assets/img/svg/form/plus-icon.svg new file mode 100755 index 0000000..b24cc16 --- /dev/null +++ b/assets/img/svg/form/plus-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/img/svg/form/right-icon.svg b/assets/img/svg/form/right-icon.svg new file mode 100755 index 0000000..56a3388 --- /dev/null +++ b/assets/img/svg/form/right-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/search-icon.svg b/assets/img/svg/form/search-icon.svg new file mode 100755 index 0000000..5775750 --- /dev/null +++ b/assets/img/svg/form/search-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/stripe-card-icon.svg b/assets/img/svg/form/stripe-card-icon.svg new file mode 100755 index 0000000..047f859 --- /dev/null +++ b/assets/img/svg/form/stripe-card-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/img/svg/form/stripe-icon.svg b/assets/img/svg/form/stripe-icon.svg new file mode 100755 index 0000000..729114d --- /dev/null +++ b/assets/img/svg/form/stripe-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/subtotal-icon.svg b/assets/img/svg/form/subtotal-icon.svg new file mode 100755 index 0000000..1be5c6c --- /dev/null +++ b/assets/img/svg/form/subtotal-icon.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/svg/form/ticket-icon.svg b/assets/img/svg/form/ticket-icon.svg new file mode 100755 index 0000000..12b6134 --- /dev/null +++ b/assets/img/svg/form/ticket-icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/svg/form/up-icon.svg b/assets/img/svg/form/up-icon.svg new file mode 100755 index 0000000..ff29504 --- /dev/null +++ b/assets/img/svg/form/up-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/form/up-small-icon.svg b/assets/img/svg/form/up-small-icon.svg new file mode 100755 index 0000000..83cdb0b --- /dev/null +++ b/assets/img/svg/form/up-small-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/img/svg/form/user-icon.svg b/assets/img/svg/form/user-icon.svg new file mode 100755 index 0000000..a2dff0a --- /dev/null +++ b/assets/img/svg/form/user-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/img/svg/local-time.svg b/assets/img/svg/local-time.svg new file mode 100755 index 0000000..0cdf58c --- /dev/null +++ b/assets/img/svg/local-time.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/location.svg b/assets/img/svg/location.svg new file mode 100755 index 0000000..166ab03 --- /dev/null +++ b/assets/img/svg/location.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/svg/mec-live-now.svg b/assets/img/svg/mec-live-now.svg new file mode 100755 index 0000000..9cb3503 --- /dev/null +++ b/assets/img/svg/mec-live-now.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/svg/ontime.svg b/assets/img/svg/ontime.svg new file mode 100755 index 0000000..06fba3e --- /dev/null +++ b/assets/img/svg/ontime.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/img/svg/share.svg b/assets/img/svg/share.svg new file mode 100755 index 0000000..4685360 --- /dev/null +++ b/assets/img/svg/share.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/img/webnus-logo.png b/assets/img/webnus-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..6da77bff7f7fa268c978ac9910fd08d87c4b5cdf GIT binary patch literal 14602 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 DjS@Jq literal 0 HcmV?d00001 diff --git a/assets/img/webnus-logo2.png b/assets/img/webnus-logo2.png new file mode 100755 index 0000000000000000000000000000000000000000..646ee3dd28318f19adcad029f0c1bddbfda06f14 GIT binary patch literal 14082 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 BRAm4F literal 0 HcmV?d00001 diff --git a/assets/img/wn-ms-icon-17-n.svg b/assets/img/wn-ms-icon-17-n.svg new file mode 100755 index 0000000..7c0b38d --- /dev/null +++ b/assets/img/wn-ms-icon-17-n.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/x-social-media-black-icon.svg b/assets/img/x-social-media-black-icon.svg new file mode 100755 index 0000000..729eab6 --- /dev/null +++ b/assets/img/x-social-media-black-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/x-social-media-logo-icon.svg b/assets/img/x-social-media-logo-icon.svg new file mode 100755 index 0000000..0c03780 --- /dev/null +++ b/assets/img/x-social-media-logo-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/x.png b/assets/img/x.png new file mode 100755 index 0000000000000000000000000000000000000000..f67e320435f30367f3a19303882b89c747e57869 GIT binary patch literal 452 zcmV;#0XzPQP)6tCZ61cKZNGVXdtIH?-Cd$K&yf{eFKYrA*7RJaJw3 zTMz`#JmUeTE2VUnWe>tId;?VfzM-{#WQ@62 ztJPM$UhllwY!18K?zvKGYm5nIvsoJu!dhDe{P}$T%=i68y'); + + active_month = settings.active_month.month; + active_year = settings.active_month.year; + + setTimeout(initMonthNavigator, 1000); + } + + function initMonthNavigator() + { + // Remove the onclick event + $("#mec_skin_" + settings.id + ' .mec-load-month').off('click'); + + // Add onclick event + $("#mec_skin_" + settings.id + ' .mec-load-month').on('click', function() + { + var year = $(this).data('mec-year'); + var month = $(this).data('mec-month'); + + setMonth(year, month); + }); + } + + function setMonth(year, month) + { + var month_id = year + "" + month; + active_month = month; + active_year = year; + + // Month exists so we just show it + if($("#mec_monthly_view_month_" + settings.id + "_" + month_id).length) + { + // Toggle Month + toggleMonth(month_id); + } + else + { + var $modalResult = $('.mec-modal-result'); + + // Add Loading Class + $modalResult.addClass('mec-month-navigator-loading'); + + $.ajax( + { + url: settings.ajax_url, + data: "action=mec_monthly_view_load_month&mec_year=" + year + "&mec_month=" + month + "&" + settings.atts, + dataType: "json", + type: "post", + success: function(response) + { + // Append Month + $("#mec_skin_events_" + settings.id).append('

    ' + response.month + '
    '); + + // Append Month Navigator + $("#mec_skin_" + settings.id + " .mec-skin-monthly-view-month-navigator-container").append('
    ' + response.navigator + '
    '); + + // Re-initialize Month Navigator + initMonthNavigator(); + + // Toggle Month + toggleMonth(response.current_month.id); + + // Remove loading Class + $modalResult.removeClass("mec-month-navigator-loading"); + + jQuery(document).trigger('load_calendar_data'); + }, + error: function(){} + }); + } + } + + function toggleMonth(month_id) + { + var $monthContainer = $("#mec_skin_" + settings.id + " .mec-month-container"); + var $currentMonth = $("#mec_monthly_view_month_" + settings.id + "_" + month_id); + + // Toggle Month Navigator + $("#mec_skin_" + settings.id + " .mec-month-navigator").hide(); + $("#mec_month_navigator_" + settings.id + "_" + month_id).show(); + + // Toggle Month + $monthContainer.hide(); + $currentMonth.show(); + + // Add selected class + $monthContainer.removeClass("mec-month-container-selected"); + $currentMonth.addClass("mec-month-container-selected"); + + // Toggle Events Side + $("#mec_skin_" + settings.id + " .mec-month-side").hide(); + $("#mec_month_side_" + settings.id + "_" + month_id).show(); + + jQuery(document).trigger('mec_toggle_month', settings, month_id); + } + }; +}(jQuery)); \ No newline at end of file diff --git a/assets/js/admin-upcoming.js b/assets/js/admin-upcoming.js new file mode 100755 index 0000000..1e8a188 --- /dev/null +++ b/assets/js/admin-upcoming.js @@ -0,0 +1,73 @@ +// MEC LIST VIEW PLUGIN +(function ($) { + $.fn.mecListView = function (options) { + // Default Options + var settings = $.extend({ + // These are the defaults. + id: 0, + atts: '', + ajax_url: '', + sf: {}, + current_month_divider: '', + end_date: '', + offset: 0, + limit: 0, + pagination: '0', + infinite_locked: false, + }, options); + + // Set onclick Listeners + setListeners(); + + function setListeners() { + // Load More + $("#mec_skin_" + settings.id + " .mec-load-more-button").on("click", function () { + loadMore(); + }); + } + + function loadMore(callback) { + // Add loading Class + $("#mec_skin_" + settings.id + " .mec-load-more-button").addClass("mec-load-more-loading"); + + $.ajax({ + url: settings.ajax_url, + data: "action=mec_list_load_more&mec_start_date=" + settings.end_date + "&mec_offset=" + settings.offset + "&" + settings.atts + "¤t_month_divider=" + settings.current_month_divider + "&apply_sf_date=0", + dataType: "json", + type: "post", + success: function (response) { + if (response.count === 0) { + // Remove loading Class + $("#mec_skin_" + settings.id + " .mec-load-more-button").removeClass("mec-load-more-loading"); + + // Release Lock of Infinite Scroll + settings.infinite_locked = false; + $("#mec_skin_" + settings.id + " .mec-load-more-wrap").removeClass('mec-load-more-scroll-loading'); + + // Hide Pagination + jQuery("#mec_skin_" + settings.id + " .mec-load-more-button").addClass("mec-util-hidden"); + + // Run Callback + if(typeof callback === 'function') callback(response); + } else { + // Show load more button + if (typeof response.has_more_event === 'undefined' || (typeof response.has_more_event !== 'undefined' && response.has_more_event)) jQuery("#mec_skin_" + settings.id + " .mec-load-more-button").removeClass("mec-util-hidden"); + else jQuery("#mec_skin_" + settings.id + " .mec-load-more-button").addClass("mec-util-hidden"); + + // Append Items + $("#mec_skin_events_" + settings.id).append(response.html); + + // Remove loading Class + $("#mec_skin_" + settings.id + " .mec-load-more-button").removeClass("mec-load-more-loading"); + + // Update the variables + settings.end_date = response.end_date; + settings.offset = response.offset; + settings.current_month_divider = response.current_month_divider; + } + }, + error: function() {} + }); + } + }; +}(jQuery)); \ No newline at end of file diff --git a/assets/js/backend.js b/assets/js/backend.js new file mode 100755 index 0000000..9488de1 --- /dev/null +++ b/assets/js/backend.js @@ -0,0 +1,1196 @@ +jQuery(document).ready(function ($) { + // Check validation of grid skin event count + $("#mec_skin_grid_count").keyup(function () { + var valid = false; + if ( + $(this).val() == "1" || + $(this).val() == "2" || + $(this).val() == "3" || + $(this).val() == "4" || + $(this).val() == "6" || + $(this).val() == "12" + ) { + valid = true; + } + + if (valid === false) { + $(this).addClass("bootstrap_unvalid"); + $(".mec-tooltiptext").css("visibility", "visible"); + } else { + $(this).removeClass("bootstrap_unvalid"); + $(".mec-tooltiptext").css("visibility", "hidden"); + } + }); + + // MEC Accordion + $(".mec-accordion .mec-acc-label .mec-acc-cat-name").on("click", function () { + var key = $(this).parent().attr("data-key"); + var status = $(this).parent().attr("data-status"); + + // Open the accordion + if (status === "close") { + $(".mec-accordion .mec-acc-label ul").hide(); + $(".mec-accordion .mec-acc-label").attr("data-status", "close"); + $(this).parent().attr("data-status", "open"); + $("#mec-acc-" + key).show(); + } else { + $(".mec-accordion .mec-acc-label ul").hide(); + $(".mec-accordion .mec-acc-label").attr("data-status", "close"); + $("#mec-acc-" + key).hide(); + } + }); + + // MEC Select, Deselect, Toggle + $(".mec-select-deselect-actions li").on("click", function () { + var target = $(this).parent().data("for"); + var action = $(this).data("action"); + + if (action === "select-all") { + $(target + " input[type=checkbox]").each(function () { + this.checked = true; + }); + } else if (action === "deselect-all") { + $(target + " input[type=checkbox]").each(function () { + this.checked = false; + }); + } else if (action === "toggle") { + $(target + " input[type=checkbox]").each(function () { + this.checked = !this.checked; + }); + } + }); + + // MEC image popup switcher + if ($(".mec-sed-method-wrap").length > 0) { + $(".mec-sed-method-wrap").each(function () { + var sed_value = $(this).find('[id*="_sed_method_field"]').val(); + if (sed_value == "m1") { + $(this).siblings(".mec-image-popup-wrap").show(); + } + }); + } + + // MEC Single Event Display Method Switcher + $(".mec-sed-methods li").on("click", function () { + var target = $(this).parent().data("for"); + var method = $(this).data("method"); + + // Set the Method + $(target).val(method); + + // Set the active method + $(this).parent().find("li").removeClass("active"); + $(this).addClass("active"); + + // Display Image popup section + if (method == "m1") { + $(".mec-image-popup-wrap").show(); + } else { + $(".mec-image-popup-wrap").hide(); + } + }); + + // Initialize WP Color Picker + if ($.fn.wpColorPicker) jQuery(".mec-color-picker").wpColorPicker(); + + // Initialize MEC Skin Switcher + $("#mec_skin").on("change", function () { + mec_skin_toggle(); + }); + + mec_skin_toggle(); + + $(".mec-switcher").on( + "click", + 'label[for*="mec[settings]"]', + function (event) { + var id = $(this).closest(".mec-switcher").data("id"); + var status = $("#mec_sn_" + id + " .mec-status").val(); + + if (status === "1") { + $("#mec_sn_" + id + " .mec-status").val(0); + $("#mec_sn_" + id) + .removeClass("mec-enabled") + .addClass("mec-disabled"); + } else { + $("#mec_sn_" + id + " .mec-status").val(1); + $("#mec_sn_" + id) + .removeClass("mec-disabled") + .addClass("mec-enabled"); + } + } + ); + + // MEC Checkbox Toggle (Used in Date Filter Options) + $(".mec-checkbox-toggle").on("change", function () { + var id = $(this).attr("id"); + $(".mec-checkbox-toggle:not(#" + id + ")").prop("checked", false); + }); + + // MEC Setting Sticky + if ($(".wns-be-container-sticky").length > 0) { + var stickyNav = function () { + var stickyNavTop = $(".wns-be-container-sticky").offset().top; + var scrollTop = $(window).scrollTop(); + var width = $(".wns-be-container-sticky").width(); + if (scrollTop > stickyNavTop) { + $("#wns-be-infobar").addClass("sticky"); + $("#wns-be-infobar").css({ + width: width, + }); + } else { + $("#wns-be-infobar").removeClass("sticky"); + } + }; + stickyNav(); + $(window).scroll(function () { + stickyNav(); + }); + + $("#mec-search-settings").typeWatch({ + wait: 400, // 750ms + callback: function (value) { + var elements = []; + if (!value || value == "") { + $(".mec-options-fields").hide(); + $(".mec-options-fields").removeClass("active"); + $( + ".wns-be-group-tab form .mec-options-fields:first-of-type" + ).addClass("active"); + $(".subsection li").removeClass("active"); + $( + ".wns-be-sidebar .wns-be-group-menu .subsection li:first-of-type" + ).addClass("active"); + } else { + $(".mec-options-fields").filter(function () { + var search_label = $(this) + .find("label.mec-col-3") + .text() + .toLowerCase(); + var search_title = $(this) + .find("h4.mec-form-subtitle") + .text() + .toLowerCase(); + var search_title = $(this) + .find(".mec-form-row") + .text() + .toLowerCase(); + if ( + (!search_label || search_label == "") && + (!search_title || search_title == "") + ) { + return false; + } + if ( + $(this) + .find("label.mec-col-3") + .text() + .toLowerCase() + .indexOf(value) > -1 || + $(this) + .find("h4.mec-form-subtitle") + .text() + .toLowerCase() + .indexOf(value) > -1 || + $(this) + .find(".mec-form-row") + .text() + .toLowerCase() + .indexOf(value) > -1 + ) { + $(".mec-options-fields").hide(); + $(".mec-options-fields").removeClass("active"); + $( + ".wns-be-group-menu .subsection .mec-settings-menu li" + ).removeClass("active"); + elements.push($(this)); + } + }); + + $(".mec-settings-menu li").filter(function () { + var search_label = $(this).find("a").text().toLowerCase(); + var search_title = $(this).find("a span").text().toLowerCase(); + if ( + (!search_label || search_label == "") && + (!search_title || search_title == "") + ) { + return false; + } + if ( + $(this).find("a span").text().toLowerCase().indexOf(value) > -1 || + $(this).find("a span").text().toLowerCase().indexOf(value) > -1 + ) { + $(".mec-settings-menu li").removeClass("active"); + $( + ".wns-be-group-menu .subsection .mec-settings-menu li" + ).removeClass("active"); + elements.push($(this)); + } + }); + + $.each(elements, function (i, searchStr) { + searchStr.show(); + searchStr.addClass("active"); + }); + + jQuery("#wns-be-content .mec-form-row").each(function () { + if ( + value != "" && + $(this).text().search(new RegExp(value, "gi")) != -1 + ) { + jQuery(this).addClass("results"); + } else if (value != "" && $(this).text().search(value) != 1) { + jQuery(this).addClass("noresults"); + } + }); + + jQuery("#wns-be-content ul li").each(function () { + if ( + value != "" && + $(this).text().search(new RegExp(value, "gi")) != -1 + ) { + jQuery(this).addClass("enable"); + } else if (value != "" && $(this).text().search(value) != 1) { + jQuery(this).addClass("disable"); + } + }); + } + if (!value || value == "") { + jQuery(".results").removeClass("results"); + jQuery(".noresults").removeClass("noresults"); + jQuery(".enable").removeClass("enable"); + jQuery(".disable").removeClass("disable"); + } + }, + }); + } + + // Import Settings + function CheckJSON(text) { + if (typeof text != "string") text = JSON.stringify(text); + try { + JSON.parse(text); + return true; + } catch (e) { + return false; + } + } + + // Location select2 + jQuery(".mec-additional-locations select").select2(); + jQuery("#mec_location_id").select2(); + + // Organizer Select2 + jQuery(".mec-additional-organizers select").select2(); + jQuery("#mec_organizer_id").select2(); + + // Related Events Select2 + jQuery(".mec-related_events-dropdown-select2").select2({ + closeOnSelect: false, + }); + + // Add shortcode select2 + jQuery(".mec-create-shortcode-tab-content select").select2(); + + // General Calendar + jQuery("#mec_skin_general_calendar_skins").select2(); + + // Add Notification DropDown Select2 + jQuery(".mec-notification-dropdown-select2").select2({ + closeOnSelect: false, + width: "33%", + }); + + $(".mec-import-settings").on("click", function (e) { + e.preventDefault(); + var value = $(".mec-import-settings-content").val(); + if (CheckJSON(value) || value == "") { + value = jQuery.parseJSON($(".mec-import-settings-content").val()); + } else { + value = "No-JSON"; + } + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "import_settings", + nonce: mec_admin_localize.ajax_nonce, + content: value, + }, + beforeSend: function () { + $(".mec-import-settings-wrap").append( + '
    ' + ); + $(".mec-import-options-notification") + .find(".mec-message-import-error") + .remove(); + $(".mec-import-options-notification") + .find(".mec-message-import-success") + .remove(); + }, + success: function (response) { + $(".mec-import-options-notification").append(response); + $(".mec-loarder-wrap").remove(); + $(".mec-import-settings-content").val(""); + }, + }); + }); + + /* MEC activation */ + if ($("#MECActivation").length > 0) { + $("#MECActivation input[type=submit]").on("click", function (e) { + e.preventDefault(); + + // Define DOM + var Spinner = $(".wna-spinner-wrap"); + var LicenseField = $("#MECActivation .LicenseField"); + var PurchaseStatus = $("#MECActivation").find(".MECPurchaseStatus"); + var LicenseMessage = $("#MECActivation").find(".MECLicenseMessage"); + + // Global Actions + Spinner.remove(); + LicenseMessage.addClass("mec-message-hidden"); + PurchaseStatus.removeClass("PurchaseError"); + PurchaseStatus.removeClass("PurchaseSuccess"); + + // Basic Information + var PurchaseCode = $( + "#MECActivation input[type=password][name=MECPurchaseCode]" + ).val(); + var information = { LicenseTypeJson: "", PurchaseCodeJson: PurchaseCode }; + var ajaxAction = "activate_license"; + + if ($(this).hasClass("mec_revoke")) { + ajaxAction = "revoke_license"; + information = ""; + } + + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: ajaxAction, + nonce: mec_admin_localize.ajax_nonce, + content: information, + }, + beforeSend: function () { + LicenseField.append( + '
    ' + ); + }, + success: function (response) { + const res = JSON.parse(response); + $(".wna-spinner-wrap").remove(); + + if (res.status === true) { + if (res.message == "success") { + PurchaseStatus.addClass("PurchaseSuccess"); + $("#MECActivation input[type=submit]") + .removeClass("mec_activate") + .addClass("mec_revoke") + .val(res.button_text); + } + + if (res.message == "revoked") { + PurchaseStatus.removeClass("PurchaseError").removeClass( + "PurchaseSuccess" + ); + $("#MECActivation input[type=submit]") + .removeClass("mec_revoke") + .addClass("mec_activate") + .val(res.button_text); + $( + "#MECActivation input[type=password][name=MECPurchaseCode]" + ).val(""); + } + } else { + $("#MECActivation input[type=submit]").text(res.button_text); + PurchaseStatus.removeClass("PurchaseSuccess").addClass( + "PurchaseError" + ); + LicenseMessage.removeClass("mec-message-hidden"); + } + }, + }); + }); + } + + /* Addons Activation */ + if ($(".box-addon-activation-toggle-head").length > 0) { + $(".box-addon-activation-toggle-head").on("click", function () { + $(".box-addon-activation-toggle-content").slideToggle("slow"); + if ($(this).find("i").hasClass("mec-sl-plus")) { + $(this).find("i").removeClass("mec-sl-plus").addClass("mec-sl-minus"); + } else if ($(this).find("i").hasClass("mec-sl-minus")) { + $(this).find("i").removeClass("mec-sl-minus").addClass("mec-sl-plus"); + } + }); + } + + /* Addons Notification */ + $(".mec-addons-notification-box-wrap span").on("click", function (e) { + e.preventDefault(); + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "close_notification", + nonce: mec_admin_localize.ajax_nonce, + }, + success: function (response) { + $(".mec-addons-notification-set-box").fadeOut(100, function () { + $(this).remove(); + }); + $(".mec-addons-notification-wrap").fadeOut(100, function () { + $(this).remove(); + }); + }, + }); + }); + + /* Custom msg Notification */ + $(".mec-cmsg-notification-box-wrap span").on("click", function (e) { + e.preventDefault(); + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "close_cmsg_notification", + nonce: mec_admin_localize.ajax_nonce, + }, + success: function (response) { + $(".mec-custom-msg-notification-set-box").fadeOut(100, function () { + $(this).remove(); + }); + $(".mec-custom-msg-notification-wrap").fadeOut(100, function () { + $(this).remove(); + }); + }, + }); + }); + + $(".mec-cmsg-2-notification-box-wrap span").on("click", function (e) { + e.preventDefault(); + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "close_cmsg_2_notification", + nonce: mec_admin_localize.ajax_nonce, + }, + success: function (response) { + $(".mec-custom-msg-2-notification-set-box").fadeOut(100, function () { + $(this).remove(); + }); + $(".mec-custom-msg-2-notification-wrap").fadeOut(100, function () { + $(this).remove(); + }); + }, + }); + }); + + let $event_selectbox = $(".mec-reports-selectbox-event"); + + /* Load event dates in Report page */ + if ($event_selectbox.length > 0) { + $event_selectbox.select2(); + $event_selectbox.on("change", function (e) { + e.preventDefault(); + var id = $event_selectbox.val(); + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "report_event_dates", + nonce: mec_admin_localize.ajax_nonce, + event_id: id, + }, + success: function (response) { + $(".mec-report-selected-event-attendees-wrap").hide(); + $(".mec-reports-selectbox-dates").remove(); + $( + ".mec-report-selected-event-attendees-wrap .w-row .w-col-sm-12" + ).html(""); + $(".mec-report-select-event-wrap .w-row .w-col-sm-12").append( + response + ); + $(".mec-report-sendmail-wrap").hide(); + $(".mec-report-backtoselect-wrap").hide(); + + $(window).trigger("mec_booking_report_change_event", response); + }, + }); + }); + + $event_selectbox.trigger("change"); + } + + $(".mec-report-backtoselect-wrap button").on("click", function (e) { + e.preventDefault(); + $(".mec-report-backtoselect-wrap").hide(); + $(".mec-report-sendmail-wrap").show(); + $(".mec-report-selected-event-attendees-wrap").show(); + $(".mec-report-sendmail-form-wrap").hide(); + }); + + // MEC Mass Action + $('#mec_report_mass_action_form').on('submit', function(e) + { + e.preventDefault(); + + const $form = $(this); + const $message = $('#mec_report_mass_message'); + + // Clear Message + $message.html(''); + + $.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: $form.serialize(), + success: function (response) { + if(response.success) { + $message.html(`

    ${response.message}

    `); + } + }, + error: function () {}, + }); + }); + + // MEC fast copy by one click + $("#MECCopyCode").on("click", function () { + $(this).parent().find(".mec-copied").addClass("mec-copied-done"); + $(this).on("mouseleave", function () { + $(this).parent().find(".mec-copied").removeClass("mec-copied-done"); + }); + }); + + // Basic / Advanced Toggle + $(".mec-basvanced-toggle").each(function () { + const wrapper = $(this).data("for"); + const method = $(this).data("method"); + + $(this) + .find($(".mec-backend-tab-item")) + .on("click", function () { + // Already Active + if ($(this).hasClass("mec-b-active-tab")) return; + + $(this) + .parent() + .find($(".mec-b-active-tab")) + .removeClass("mec-b-active-tab"); + $(this).addClass("mec-b-active-tab"); + + if (method === "addition") { + $(wrapper).find($(".mec-basvanced-advanced")).toggleClass("w-hidden"); + } else { + $(wrapper).find($(".mec-basvanced-basic")).toggleClass("w-hidden"); + $(wrapper).find($(".mec-basvanced-advanced")).toggleClass("w-hidden"); + } + }); + }); + + // General Image picker + $(".mec-image-picker-wrapper").each(function () { + let $wrapper = $(this); + let $button = $wrapper.find($(".mec-image-picker-upload")); + let $preview = $wrapper.find($(".mec-image-picker-preview")); + let $previewWrapper = $wrapper.find($(".mec-image-picker-preview-wrapper")); + let $input = $wrapper.find($(".mec-image-picker-input")); + let $remove = $wrapper.find($(".mec-image-picker-remove")); + + $button.on("click", function () { + var frame; + if (frame) { + frame.open(); + return; + } + + frame = wp.media(); + frame.on("select", function () { + // Grab the selected attachment. + let attachment = frame.state().get("selection").first(); + + $preview.html(''); + $input.val(attachment.attributes.url); + + $button.toggleClass("w-hidden"); + $remove.toggleClass("w-hidden"); + $preview.toggleClass("w-hidden"); + + frame.close(); + }); + + frame.open(); + }); + + // General Image Remover + $remove.on("click", function (event) { + event.preventDefault(); + + $preview.html(""); + $input.val(""); + + $button.toggleClass("w-hidden"); + $remove.toggleClass("w-hidden"); + $preview.toggleClass("w-hidden"); + }); + }); + + // API Key + $('#mec_add_new_api_key').on('click', function() + { + const $wrapper = $('.mec-api-key-wrapper'); + const $new_id = $('#mec_next_api_key_id'); + const id = $new_id.val(); + + let key = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let counter = 0; + while (counter < 40) { + key += characters.charAt(Math.floor(Math.random() * characters.length)); + counter += 1; + } + + const html = $('#mec_api_key_template').html().replace(/:i:/g, id).replace(/:k:/g, key); + + $wrapper.append(html); + $new_id.val(parseInt(id) + 1); + }); +}); + +function mec_skin_full_calendar_skin_toggled(Context) { + var id = jQuery(Context).attr("id"); + var checked = jQuery(Context).is(":checked"); + var default_view = "list"; + + if (id === "mec_skin_full_calendar_list") { + jQuery(Context) + .parent() + .parent() + .parent() + .find(".mec-date-format") + .toggle(); + } else if (id === "mec_skin_full_calendar_grid") { + jQuery(Context) + .parent() + .parent() + .parent() + .find(".mec-date-format") + .toggle(); + default_view = "grid"; + } else if (id === "mec_skin_full_calendar_tile") { + default_view = "tile"; + } else if (id === "mec_skin_full_calendar_yearly") { + jQuery(Context) + .parent() + .parent() + .parent() + .find(".mec-date-format") + .toggle(); + default_view = "yearly"; + } else if (id === "mec_skin_full_calendar_monthly") { + jQuery("#mec_full_calendar_monthly_style").toggle(); + jQuery("#mec_full_calendar_monthly_view_options").toggle(); + default_view = "monthly"; + } else if (id === "mec_skin_full_calendar_weekly") { + default_view = "weekly"; + } else if (id === "mec_skin_full_calendar_daily") { + default_view = "daily"; + } + + var $dropdown = jQuery("#mec_skin_full_calendar_default_view"); + var current_value = $dropdown.find("option:selected").prop("value"); + var $option = $dropdown.find('option[value="' + default_view + '"]'); + + if (checked) $option.removeAttr("disabled"); + else $option.attr("disabled", "disabled"); + + if (current_value === default_view) + $dropdown.children("option:enabled").eq(0).prop("selected", true); + $dropdown.niceSelect("update"); +} + +function mec_event_attendees(ID, occurrence) { + // Set Occurrence + if (typeof occurrence === "undefined") occurrence = ""; + + jQuery.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + dataType: "JSON", + data: { + action: "mec_attendees", + id: ID, + occurrence: occurrence, + }, + success: function (response) { + if (response.email_button != "") { + jQuery(".mec-report-selected-event-attendees-wrap").show(); + jQuery( + ".mec-report-selected-event-attendees-wrap .w-row .w-col-sm-12" + ).html(response.html); + jQuery(".mec-report-sendmail-wrap").show(); + jQuery(".mec-report-sendmail-wrap .w-row .w-col-sm-12").html( + response.email_button + ); + } else { + jQuery(".mec-report-selected-event-attendees-wrap").show(); + jQuery(".mec-report-sendmail-wrap").hide(); + jQuery( + ".mec-report-selected-event-attendees-wrap .w-row .w-col-sm-12" + ).html(response.html); + jQuery(".mec-report-sendmail-wrap .w-row .w-col-sm-12").html(""); + } + + jQuery(window).trigger("mec_booking_report_change_occurrence"); + }, + error: function () {}, + }); +} + +function mec_submit_event_email(ID) { + // Set Occurrence + if (typeof ID === "undefined") ID = ""; + + if (jQuery(".mec-send-email-count > span").text() == 0) { + alert("Please choose attendees first"); + return; + } + jQuery( + ".mec-report-sendmail-form-wrap .w-row .w-col-sm-12 #mec-send-email-editor-wrap" + ).attr("id", "mec-send-email-editor" + ID + "-wrap"); + jQuery(".mec-report-selected-event-attendees-wrap").hide(); + jQuery(".mec-report-sendmail-form-wrap").show(); + jQuery("#mec-send-email-editor" + ID + "-wrap").html( + '' + ); + jQuery("#mec-send-email-editor" + ID + "-wrap") + .parent() + .find(".mec-send-email-button") + .data("id", ID); + jQuery(".mec-report-sendmail-wrap").hide(); + jQuery(".mec-report-backtoselect-wrap").show(); + + wp.editor.initialize("editor" + ID, { + tinymce: { + wpautop: true, + toolbar1: + "formatselect bold italic | bullist numlist | blockquote | alignleft aligncenter alignright | link unlink | wp_more | spellchecker", + }, + quicktags: true, + mediaButtons: true, + }); +} + +function mec_certificate_send() { + const $checkboxes = jQuery( + ".mec-attendees-content input[type=checkbox]:checked" + ); + if ($checkboxes.length === 0) { + alert("Please choose attendees first."); + return; + } + + let template = jQuery("#certificate_select").val(); + if (!template) { + alert("Please choose a template."); + return; + } + + let attendee_ids = ""; + $checkboxes.each(function () { + attendee_ids += jQuery(this).data("attendee-id") + ","; + }); + + jQuery.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + dataType: "JSON", + data: { + action: "mec_send_certificates", + template, + attendee_ids, + }, + success: function (response) { + $checkboxes.each(function () { + jQuery(this).removeAttr("checked"); + }); + + jQuery("#mec-certificate-message").html( + `
    ${response.message}
    ` + ); + }, + error: function () {}, + }); + + return true; +} + +function initSlider() { + jQuery(".mec-attendees-list-left-menu").owlCarousel({ + autoplay: false, + autoWidth: true, + items: 12, + responsiveClass: true, + responsive: { + 0: { + items: 1, + }, + 979: { + items: 2, + }, + 1199: { + items: 12, + }, + }, + dots: false, + nav: true, + }); +} + +function mec_skin_toggle() { + var skin = jQuery("#mec_skin").val(); + + jQuery(".mec-skin-options-container").hide(); + jQuery("#mec_" + skin + "_skin_options_container").show(); + + jQuery(".mec-search-form-options-container").hide(); + jQuery("#mec_" + skin + "_search_form_options_container").show(); + + // Show/Hide Filter Options + if (skin === "countdown" || skin === "cover" || skin === "available_spot") { + jQuery("#mec_meta_box_calendar_filter").hide(); + jQuery("#mec_meta_box_calendar_no_filter").show(); + } else { + jQuery("#mec_meta_box_calendar_no_filter").hide(); + jQuery("#mec_meta_box_calendar_filter").show(); + } + + // Show/Hide Search Widget Options + if ( + skin === "countdown" || + skin === "cover" || + skin === "available_spot" || + skin === "masonry" || + skin === "carousel" || + skin === "slider" || + skin === "timeline" + ) { + jQuery("#mec_calendar_search_form").hide(); + } else { + jQuery("#mec_calendar_search_form").show(); + } + + // Show/Hide Ongoing Events + if ( + skin === "list" || + skin === "weekly_view" || + skin === "agenda" || + skin === "timeline" || + skin === "monthly_view" || + skin === "timetable" || + skin === "slider" || + skin === "carousel" || + skin === "masonry" || + skin === "daily_view" || + skin === "tile" || + skin === "grid" || + skin === "yearly_view" || + skin === "custom" || + skin === "full_calendar" + ) { + jQuery("#mec_date_ongoing_filter").show(); + } else { + jQuery("#mec_show_only_ongoing_events").prop("checked", false); + jQuery("#mec_date_ongoing_filter").hide(); + } + + // Show/Hide Expired Events + if (skin === "map") { + jQuery("#mec_show_only_past_events").prop("checked", false); + jQuery("#mec_date_only_past_filter").hide(); + } else jQuery("#mec_date_only_past_filter").show(); + + // Trigger change event of skin style in order to show/hide related fields + jQuery("#mec_skin_" + skin + "_style").trigger("change"); +} + +function mec_skin_style_changed(skin, style, context) { + if (style.includes("fluent")) { + jQuery(".mec-" + skin + "-fluent").removeClass("mec-fluent-hidden"); + jQuery(".mec-not-" + skin + "-fluent").addClass("mec-fluent-hidden"); + } else { + jQuery(".mec-" + skin + "-fluent").addClass("mec-fluent-hidden"); + jQuery(".mec-not-" + skin + "-fluent").removeClass("mec-fluent-hidden"); + } + + jQuery(".mec-skin-" + skin + "-date-format-container").hide(); + jQuery("#mec_skin_" + skin + "_date_format_" + style + "_container").show(); + + // List Standard Progress Bar + if (skin === "list" && style === "standard") + jQuery(".mec-progress-bar-display-wrapper").removeClass("mec-util-hidden"); + else jQuery(".mec-progress-bar-display-wrapper").addClass("mec-util-hidden"); + + // List Standard Status Bar + if (skin === "list" && style === "standard") + jQuery(".mec-status-bar-display-wrapper").removeClass("mec-util-hidden"); + else jQuery(".mec-status-bar-display-wrapper").addClass("mec-util-hidden"); + + // Show Or Hide Include Events Time Switcher + if (style === "classic" || style === "minimal" || style === "modern") + jQuery(context).parent().parent().find(".mec-include-events-times").show(); + else + jQuery(context).parent().parent().find(".mec-include-events-times").hide(); + + if (style === "accordion") { + jQuery(context).parent().parent().find("#mec_skin_list_localtime").hide(); + jQuery(context).parent().parent().find(".mec-event-price-container").hide(); + } else { + jQuery(context).parent().parent().find("#mec_skin_list_localtime").show(); + jQuery(context).parent().parent().find(".mec-event-price-container").show(); + } + + let $mobile_clean_style; + if (skin === 'monthly_view') { + const $right_section = jQuery('.mec-display-events-right-section'); + $mobile_clean_style = jQuery('#mec_skin_monthly_view_mobile_clean_style_wrapper'); + + if(style === 'clean' || style === 'modern') + { + $right_section.show(); + $mobile_clean_style.hide(); + } + else + { + $right_section.hide(); + $mobile_clean_style.show(); + } + } + + if(skin === 'full_calendar') + { + $mobile_clean_style = jQuery("#mec_skin_full_calendar_mobile_clean_style_wrapper"); + const monthly_style = jQuery('#mec_skin_full_calendar_monthly_style').val(); + + if(monthly_style === 'clean' || monthly_style === 'modern') $mobile_clean_style.hide(); + else $mobile_clean_style.show(); + } + + jQuery(document).trigger("mec_skin_style_changed", [skin, style, context]); +} + +function mec_skin_map_toggle(context) { + jQuery(context) + .parent() + .parent() + .parent() + .find(".mec-set-geolocation") + .toggle(); +} + +function mec_skin_geolocation_toggle(context) { + jQuery(context) + .parent() + .parent() + .parent() + .parent() + .find(".mec-set-geolocation-focus") + .toggle(); +} + +function mec_show_widget_options(context) { + var skin = jQuery(context).find(jQuery(":selected")).data("skin"); + if (skin === "monthly_view") { + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-current-check-wrap")) + .show(); + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-grid-options-wrap")) + .hide(); + } else if (skin === "grid") { + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-current-check-wrap")) + .hide(); + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-grid-options-wrap")) + .show(); + } else { + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-current-check-wrap")) + .hide(); + jQuery(context) + .parent() + .parent() + .find(jQuery(".mec-grid-options-wrap")) + .hide(); + } +} + +// Niceselect +jQuery(document).ready(function () { + if (jQuery(".wn-mec-select").length > 0) + jQuery(".wn-mec-select").niceSelect(); + + // Send Custom Email To Attendees Button + jQuery(".mec-send-email-button").click(function () { + var $this = this; + var data_send = jQuery(".mec-attendees-content") + .find('input[type="checkbox"]:checked') + .parent() + .find(".mec-send-email-attendee-info") + .text(); + var mail_subject = jQuery("#mec-send-email-subject").val(); + var mail_content = wp.editor.getContent("editor" + jQuery(this).data("id")); + var mail_message = jQuery("#mec-send-email-message"); + var mail_copy = jQuery("#mec-send-admin-copy").is(":checked") ? 1 : 0; + + if (data_send.length == 0) + mail_message + .attr("class", "mec-util-hidden mec-error") + .html(jQuery("#mec-send-email-no-user-selected").val()) + .show(); + else if (mail_subject.length == 0) + mail_message + .attr("class", "mec-util-hidden mec-error") + .html(jQuery("#mec-send-email-empty-subject").val()) + .show(); + else if (mail_content.length == 0) + mail_message + .attr("class", "mec-util-hidden mec-error") + .html(jQuery("#mec-send-email-empty-content").val()) + .show(); + else { + mail_message.hide(); + jQuery($this).html(jQuery("#mec-send-email-label-loading").val()); + jQuery.ajax({ + url: mec_admin_localize.ajax_url, + type: "POST", + data: { + action: "mec_mass_email", + nonce: mec_admin_localize.ajax_nonce, + mail_recipients_info: data_send, + mail_subject: mail_subject, + mail_content: mail_content, + mail_copy: mail_copy, + }, + success: function (response) { + jQuery($this).html(jQuery("#mec-send-email-label").val()); + if (response == true) + mail_message + .attr("class", "mec-util-hidden mec-success") + .html(jQuery("#mec-send-email-success").val()) + .show(); + else + mail_message + .attr("class", "mec-util-hidden mec-error") + .html(jQuery("#mec-send-email-error").val()) + .show(); + }, + error: function () { + jQuery($this).html(jQuery("#mec-send-email-label").val()); + mail_message + .attr("class", "mec-util-hidden mec-error") + .html(jQuery("#mec-send-email-error").val()) + .show(); + }, + }); + } + }); + + jQuery(".mec-attendees-list-left-menu .owl-item").click(function () { + jQuery(this) + .parent() + .parent() + .parent() + .parent() + .parent() + .find(".mec-send-email-count > span") + .html(0); + }); +}); + +// MEC fast copy by one click +function mec_copy_code() { + var range = document.createRange(); + range.selectNode(document.getElementById("MECCopyCode")); + window.getSelection().removeAllRanges(); // clear current selection + window.getSelection().addRange(range); // to select text + document.execCommand("copy"); + window.getSelection().removeAllRanges(); // to deselect +} + +// Check All Send Custom Email To Attendees +function mec_send_email_check(Context) { + var all_item = jQuery(Context) + .parent() + .parent() + .parent() + .find(".mec-attendees-content"); + var item_len = all_item.find('input[type="checkbox"]').length; + var check_len = all_item.find('input[type="checkbox"]:checked').length; + var all_check = jQuery(Context) + .parent() + .parent() + .parent() + .find("#mec-send-email-check-all"); + + jQuery(".mec-send-email-count > span").html(check_len); + if (item_len === check_len) all_check.prop("checked", true); + else all_check.prop("checked", false); +} + +function mec_send_email_check_all(Context) { + var all_item = jQuery(Context) + .parent() + .parent() + .parent() + .parent() + .find(".mec-attendees-content"); + + if (jQuery(Context).is(":checked")) + all_item.find('input[type="checkbox"]').prop("checked", true); + else all_item.find('input[type="checkbox"]').prop("checked", false); + + var check_len = all_item.find('input[type="checkbox"]:checked').length; + jQuery(".mec-send-email-count > span").html(check_len); +} + +(function (wp, $) { + var items = ""; + if (typeof mec_admin_localize !== "undefined") + items = JSON.parse(mec_admin_localize.mce_items); + + // Block Editor + if (items && wp && wp.blocks) { + items.shortcodes.forEach(function (e, i) { + wp.blocks.registerBlockType(`mec/blockeditor-${i}`, { + title: items.shortcodes[i]["PN"] + .toLowerCase() + .replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g, function (s) { + return s.toUpperCase().replace(/-/g, " "); + }), + icon: "calendar-alt", + category: "mec.block.category", + edit: function () { + return `[MEC id="${items.shortcodes[i]["ID"]}"]`; + }, + save: function () { + return `[MEC id="${items.shortcodes[i]["ID"]}"]`; + }, + }); + }); + } +})(window.wp, jQuery); diff --git a/assets/js/chartjs.min.js b/assets/js/chartjs.min.js new file mode 100755 index 0000000..9ffb538 --- /dev/null +++ b/assets/js/chartjs.min.js @@ -0,0 +1,13 @@ +/*! + * Chart.js v3.7.1 + * https://www.chartjs.org + * (c) 2022 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";const t="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function e(e,i,s){const n=s||(t=>Array.prototype.slice.call(t));let o=!1,a=[];return function(...s){a=n(s),o||(o=!0,t.call(window,(()=>{o=!1,e.apply(i,a)})))}}function i(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const s=t=>"start"===t?"left":"end"===t?"right":"center",n=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,o=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;var a=new class{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=t.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}; +/*! + * @kurkle/color v0.1.9 + * https://github.com/kurkle/color#readme + * (c) 2020 Jukka Kurkela + * Released under the MIT License + */const r={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},l="0123456789ABCDEF",h=t=>l[15&t],c=t=>l[(240&t)>>4]+l[15&t],d=t=>(240&t)>>4==(15&t);function u(t){var e=function(t){return d(t.r)&&d(t.g)&&d(t.b)&&d(t.a)}(t)?h:c;return t?"#"+e(t.r)+e(t.g)+e(t.b)+(t.a<255?e(t.a):""):t}function f(t){return t+.5|0}const g=(t,e,i)=>Math.max(Math.min(t,i),e);function p(t){return g(f(2.55*t),0,255)}function m(t){return g(f(255*t),0,255)}function x(t){return g(f(t/2.55)/100,0,1)}function b(t){return g(f(100*t),0,100)}const _=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const y=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function v(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function w(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function M(t,e,i){const s=v(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function k(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=n===e?(i-s)/h+(i>16&255,o>>8&255,255&o]}return t}(),T.transparent=[0,0,0,0]);const e=T[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}function R(t,e,i){if(t){let s=k(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=P(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function E(t,e){return t?Object.assign(e||{},t):t}function I(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=m(t[3]))):(e=E(t,{r:0,g:0,b:0,a:1})).a=m(e.a),e}function z(t){return"r"===t.charAt(0)?function(t){const e=_.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=255&(e[8]?p(t):255*t)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?p(i):i),s=255&(e[4]?p(s):s),n=255&(e[6]?p(n):n),{r:i,g:s,b:n,a:o}}}(t):C(t)}class F{constructor(t){if(t instanceof F)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=I(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*r[s[1]],g:255&17*r[s[2]],b:255&17*r[s[3]],a:5===o?17*r[s[4]]:255}:7!==o&&9!==o||(n={r:r[s[1]]<<4|r[s[2]],g:r[s[3]]<<4|r[s[4]],b:r[s[5]]<<4|r[s[6]],a:9===o?r[s[7]]<<4|r[s[8]]:255})),i=n||L(t)||z(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=E(this._rgb);return t&&(t.a=x(t.a)),t}set rgb(t){this._rgb=I(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${x(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):this._rgb;var t}hexString(){return this._valid?u(this._rgb):this._rgb}hslString(){return this._valid?function(t){if(!t)return;const e=k(t),i=e[0],s=b(e[1]),n=b(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${x(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):this._rgb}mix(t,e){const i=this;if(t){const s=i.rgb,n=t.rgb;let o;const a=e===o?.5:e,r=2*a-1,l=s.a-n.a,h=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;o=1-h,s.r=255&h*s.r+o*n.r+.5,s.g=255&h*s.g+o*n.g+.5,s.b=255&h*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,i.rgb=s}return i}clone(){return new F(this.rgb)}alpha(t){return this._rgb.a=m(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=f(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return R(this._rgb,2,t),this}darken(t){return R(this._rgb,2,-t),this}saturate(t){return R(this._rgb,1,t),this}desaturate(t){return R(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=k(t);i[0]=D(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function B(t){return new F(t)}const V=t=>t instanceof CanvasGradient||t instanceof CanvasPattern;function W(t){return V(t)?t:B(t)}function N(t){return V(t)?t:B(t).saturate(.5).darken(.1).hexString()}function H(){}const j=function(){let t=0;return function(){return t++}}();function $(t){return null==t}function Y(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)}function U(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}const X=t=>("number"==typeof t||t instanceof Number)&&isFinite(+t);function q(t,e){return X(t)?t:e}function K(t,e){return void 0===t?e:t}const G=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:t/e,Z=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function J(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function Q(t,e,i,s){let n,o,a;if(Y(t))if(o=t.length,s)for(n=o-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;ni;)t=t[e.substr(i,s-i)],i=s+1,s=rt(e,i);return t}function ht(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ct=t=>void 0!==t,dt=t=>"function"==typeof t,ut=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function ft(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const gt=Object.create(null),pt=Object.create(null);function mt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>N(e.backgroundColor),this.hoverBorderColor=(t,e)=>N(e.borderColor),this.hoverColor=(t,e)=>N(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t)}set(t,e){return xt(this,t,e)}get(t){return mt(this,t)}describe(t,e){return xt(pt,t,e)}override(t,e){return xt(gt,t,e)}route(t,e,i,s){const n=mt(this,t),o=mt(this,i),a="_"+e;Object.defineProperties(n,{[a]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=o[s];return U(t)?Object.assign({},e,t):K(t,e)},set(t){this[a]=t}}})}}({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}});const _t=Math.PI,yt=2*_t,vt=yt+_t,wt=Number.POSITIVE_INFINITY,Mt=_t/180,kt=_t/2,St=_t/4,Pt=2*_t/3,Dt=Math.log10,Ct=Math.sign;function Ot(t){const e=Math.round(t);t=Lt(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(Dt(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function At(t){const e=[],i=Math.sqrt(t);let s;for(s=1;st-e)).pop(),e}function Tt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function Lt(t,e,i){return Math.abs(t-e)=t}function Et(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Ut(t){return!t||$(t.size)||$(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Xt(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function qt(t,e,i,s){let n=(s=s||{}).data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(n=s.data={},o=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,h,c,d,u;for(l=0;li.length){for(l=0;l0&&t.stroke()}}function Jt(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==o.strokeColor;let l,h;for(t.save(),t.font=n.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);$(e.rotation)||t.rotate(e.rotation);e.color&&(t.fillStyle=e.color);e.textAlign&&(t.textAlign=e.textAlign);e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;lt[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const re=(t,e,i)=>ae(t,i,(s=>t[s][e]ae(t,i,(s=>t[s][e]>=i));function he(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+ht(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function ue(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ce.forEach((e=>{delete t[e]})),delete t._chartjs)}function fe(t){const e=new Set;let i,s;for(i=0,s=t.length;iwindow.getComputedStyle(t,null);function be(t,e){return xe(t).getPropertyValue(e)}const _e=["top","right","bottom","left"];function ye(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=_e[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ve(t,e){const{canvas:i,currentDevicePixelRatio:s}=e,n=xe(i),o="border-box"===n.boxSizing,a=ye(n,"padding"),r=ye(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.native||t,s=i.touches,n=s&&s.length?s[0]:i,{offsetX:o,offsetY:a}=n;let r,l,h=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(o,a,i.target))r=o,l=a;else{const t=e.getBoundingClientRect();r=n.clientX-t.left,l=n.clientY-t.top,h=!0}return{x:r,y:l,box:h}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const we=t=>Math.round(10*t)/10;function Me(t,e,i,s){const n=xe(t),o=ye(n,"margin"),a=me(n.maxWidth,t,"clientWidth")||wt,r=me(n.maxHeight,t,"clientHeight")||wt,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=pe(t);if(o){const t=o.getBoundingClientRect(),a=xe(o),r=ye(a,"border","width"),l=ye(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=me(a.maxWidth,o,"clientWidth"),n=me(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||wt,maxHeight:n||wt}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=ye(n,"border","width"),e=ye(n,"padding");h-=e.width+t.width,c-=e.height+t.height}return h=Math.max(0,h-o.width),c=Math.max(0,s?Math.floor(h/s):c-o.height),h=we(Math.min(h,a,l.maxWidth)),c=we(Math.min(c,r,l.maxHeight)),h&&!c&&(c=we(h/2)),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=n/s,t.width=o/s;const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t,e){return"native"in t?{x:t.x,y:t.y}:ve(t,e)}function Ce(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&"r"!==e&&a&&o.length){const t=r._reversePixels?le:re;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n="function"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function Oe(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t{t[r](n[a],s)&&o.push({element:t,datasetIndex:e,index:i}),t.inRange(n.x,n.y,s)&&(l=!0)})),i.intersect&&!l?[]:o}var Ee={modes:{index(t,e,i,s){const n=De(e,t),o=i.axis||"x",a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s),r=[];return a.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=a[0].index,i=t.data[e];i&&!i.skip&&r.push({element:i,datasetIndex:t.index,index:e})})),r):[]},dataset(t,e,i,s){const n=De(e,t),o=i.axis||"xy";let a=i.intersect?Ae(t,n,o,s):Le(t,n,o,!1,s);if(a.length>0){const e=a[0].datasetIndex,i=t.getDatasetMeta(e).data;a=[];for(let t=0;tAe(t,De(e,t),i.axis||"xy",s),nearest:(t,e,i,s)=>Le(t,De(e,t),i.axis||"xy",i.intersect,s),x:(t,e,i,s)=>Re(t,e,{axis:"x",intersect:i.intersect},s),y:(t,e,i,s)=>Re(t,e,{axis:"y",intersect:i.intersect},s)}};const Ie=new RegExp(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/),ze=new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);function Fe(t,e){const i=(""+t).match(Ie);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function Be(t,e){const i={},s=U(e),n=s?Object.keys(e):e,o=U(t)?s?i=>K(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=+o(t)||0;return i}function Ve(t){return Be(t,{top:"y",right:"x",bottom:"y",left:"x"})}function We(t){return Be(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Ne(t){const e=Ve(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function He(t,e){t=t||{},e=e||bt.font;let i=K(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=K(t.style,e.style);s&&!(""+s).match(ze)&&(console.warn('Invalid font style specified: "'+s+'"'),s="");const n={family:K(t.family,e.family),lineHeight:Fe(K(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:K(t.weight,e.weight),string:""};return n.string=Ut(n),n}function je(t,e,i,s){let n,o,a,r=!0;for(n=0,o=t.length;ni&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ye(t,e){return Object.assign(Object.create(t),e)}const Ue=["left","top","right","bottom"];function Xe(t,e){return t.filter((t=>t.pos===e))}function qe(t,e){return t.filter((t=>-1===Ue.indexOf(t.pos)&&t.box.axis===e))}function Ke(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ge(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Ue.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ei(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Ke(Xe(e,"left"),!0),n=Ke(Xe(e,"right")),o=Ke(Xe(e,"top"),!0),a=Ke(Xe(e,"bottom")),r=qe(e,"x"),l=qe(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Xe(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;Q(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),u=Object.assign({},n);Je(u,Ne(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=Ge(l.concat(h),d);ei(r.fullSize,f,d,g),ei(l,f,d,g),ei(h,f,d,g)&&ei(l,f,d,g),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),si(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,si(r.rightAndBottom,f,d,g),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},Q(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};function oi(t,e=[""],i=t,s,n=(()=>t[0])){ct(s)||(s=mi("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>oi([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>ci(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=mi(li(o,t),i),ct(n))return hi(t,n)?gi(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>xi(t).includes(e),ownKeys:t=>xi(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function ai(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:ri(t,s),setContext:e=>ai(t,e,i,s),override:n=>ai(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>ci(t,e,(()=>function(t,e,i){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=t;let r=s[e];dt(r)&&a.isScriptable(e)&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(o,a||s),r.delete(t),hi(t,e)&&(e=gi(n._scopes,n,t,e));return e}(e,r,t,i));Y(r)&&r.length&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=i;if(ct(o.index)&&s(t))e=e[o.index%e.length];else if(U(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=gi(s,n,t,l);e.push(ai(i,o,a&&a[t],r))}}return e}(e,r,t,a.isIndexable));hi(e,r)&&(r=ai(r,n,o&&o[e],a));return r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function ri(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:dt(i)?i:()=>i,isIndexable:dt(s)?s:()=>s}}const li=(t,e)=>t?t+ht(e):e,hi=(t,e)=>U(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function ci(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function di(t,e,i){return dt(t)?t(e,i):t}const ui=(t,e)=>!0===t?e:"string"==typeof t?lt(e,t):void 0;function fi(t,e,i,s,n){for(const o of e){const e=ui(i,o);if(e){t.add(e);const o=di(e._fallback,i,n);if(ct(o)&&o!==i&&o!==s)return o}else if(!1===e&&ct(s)&&i!==s)return null}return!1}function gi(t,e,i,s){const n=e._rootScopes,o=di(e._fallback,i,s),a=[...t,...n],r=new Set;r.add(s);let l=pi(r,a,i,o||i,s);return null!==l&&((!ct(o)||o===i||(l=pi(r,a,o,l,s),null!==l))&&oi(Array.from(r),[""],n,o,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];if(Y(n)&&U(i))return i;return n}(e,i,s))))}function pi(t,e,i,s,n){for(;i;)i=fi(t,e,i,s,n);return i}function mi(t,e){for(const i of e){if(!i)continue;const e=i[t];if(ct(e))return e}}function xi(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}const bi=Number.EPSILON||1e-14,_i=(t,e)=>e"x"===t?"y":"x";function vi(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=Vt(o,n),l=Vt(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function wi(t,e="x"){const i=yi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=_i(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)wi(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,Pi=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*yt/i),Di=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*yt/i)+1,Ci={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*kt),easeOutSine:t=>Math.sin(t*kt),easeInOutSine:t=>-.5*(Math.cos(_t*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Si(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Si(t)?t:Pi(t,.075,.3),easeOutElastic:t=>Si(t)?t:Di(t,.075,.3),easeInOutElastic(t){const e=.1125;return Si(t)?t:t<.5?.5*Pi(2*t,e,.45):.5+.5*Di(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-Ci.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*Ci.easeInBounce(2*t):.5*Ci.easeOutBounce(2*t-1)+.5};function Oi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Ai(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function Ti(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=Oi(t,n,i),r=Oi(n,o,i),l=Oi(o,e,i),h=Oi(a,r,i),c=Oi(r,l,i);return Oi(h,c,i)}const Li=new Map;function Ri(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=Li.get(i);return s||(s=new Intl.NumberFormat(t,e),Li.set(i,s)),s}(e,i).format(t)}function Ei(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ii(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function zi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Fi(t){return"angle"===t?{between:Ht,compare:Wt,normalize:Nt}:{between:Yt,compare:(t,e)=>t-e,normalize:t=>t}}function Bi({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Vi(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Fi(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Fi(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hb||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Bi({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Bi({start:_,end:d,loop:u,count:a,style:f})),g}function Wi(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Hi(t,[{start:a,end:r,loop:o}],i,e);return Hi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,rnull===t||""===t;const Gi=!!Se&&{passive:!0};function Zi(t,e,i){t.canvas.removeEventListener(e,i,Gi)}function Ji(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Qi(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.addedNodes,s),e=e&&!Ji(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ts(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Ji(i.removedNodes,s),e=e&&!Ji(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const es=new Map;let is=0;function ss(){const t=window.devicePixelRatio;t!==is&&(is=t,es.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ns(t,i,s){const n=t.canvas,o=n&&pe(n);if(!o)return;const a=e(((t,e)=>{const i=o.clientWidth;s(t,e),i{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)}));return r.observe(o),function(t,e){es.size||window.addEventListener("resize",ss),es.set(t,e)}(t,a),r}function os(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){es.delete(t),es.size||window.removeEventListener("resize",ss)}(t)}function as(t,i,s){const n=t.canvas,o=e((e=>{null!==t.ctx&&s(function(t,e){const i=qi[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t,(t=>{const e=t[0];return[e,e.offsetX,e.offsetY]}));return function(t,e,i){t.addEventListener(e,i,Gi)}(n,i,o),o}class rs extends Ui{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Ki(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(Ki(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const s=i[t];$(s)?e.removeAttribute(t):e.setAttribute(t,s)}));const s=i.style||{};return Object.keys(s).forEach((t=>{e.style[t]=s[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Qi,detach:ts,resize:ns}[e]||as;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:os,detach:os,resize:os}[e]||Zi)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Me(t,e,i,s)}isAttached(t){const e=pe(t);return!(!e||!e.isConnected)}}function ls(t){return!ge()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Xi:rs}var hs=Object.freeze({__proto__:null,_detectPlatform:ls,BasePlatform:Ui,BasicPlatform:Xi,DomPlatform:rs});const cs="transparent",ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=W(t||cs),n=s.valid&&W(e||cs);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class us{constructor(t,e,i,s){const n=e[i];s=je([t.to,s,n,t.from]);const o=je([t.from,n,s]);this._active=!0,this._fn=t.fn||ds[t.type||typeof o],this._easing=Ci[t.easing]||Ci.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=je([t.to,e,s,t.from]),this._from=je([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),bt.set("animations",{colors:{type:"color",properties:["color","borderColor","backgroundColor"]},numbers:{type:"number",properties:["x","y","borderWidth","radius","tension"]}}),bt.describe("animations",{_fallback:"animation"}),bt.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}});class gs{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!U(t))return;const e=this._properties;Object.getOwnPropertyNames(t).forEach((i=>{const s=t[i];if(!U(s))return;const n={};for(const t of fs)n[t]=s[t];(Y(s.properties)&&s.properties||[i]).forEach((t=>{t!==i&&e.has(t)||e.set(t,n)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new us(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(a.add(this._chart,i),!0):void 0}}function ps(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function ms(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function vs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Ms(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i]}}}const ks=t=>"reset"===t||"none"===t,Ss=(t,e)=>e?t:Object.assign({},t);class Ps{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.$context=void 0,this._syncList=[],this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=bs(t.vScale,t),this.addElements()}updateIndex(t){this.index!==t&&Ms(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=K(i.xAxisID,ws(t,"x")),o=e.yAxisID=K(i.yAxisID,ws(t,"y")),a=e.rAxisID=K(i.rAxisID,ws(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,o,a),h=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&ue(this._data,this),t._stacked&&Ms(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(U(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=Y(s[t])?this.parseArrayData(i,s,t,e):U(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[a]||d&&l[a]t&&!e.hidden&&e._stacked&&{keys:ms(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:h,max:c}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(a);let d,u;function f(){u=s[d];const e=u[a.axis];return!X(u[t.axis])||h>e||c=0;--d)if(!f()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ss(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new gs(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||ks(t)||this.chart._animationsDisabled}updateElement(t,e,i,s){ks(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!ks(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}Ds.defaults={},Ds.defaultRoutes=void 0;const Cs={values:t=>Y(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=Dt(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Ri(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=t/Math.pow(10,Math.floor(Dt(t)));return 1===s||2===s||5===s?Cs.numeric.call(this,t,e,i):""}};var Os={formatters:Cs};function As(t,e){const i=t.options.ticks,s=i.maxTicksLimit||function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),n=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;is)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(n,e,s);if(o>0){let t,i;const s=o>1?Math.round((r-a)/(o-1)):null;for(Ts(e,l,h,$(s)?0:a-s,a),t=0,i=o-1;te.lineWidth,tickColor:(t,e)=>e.color,offset:!1,borderDash:[],borderDashOffset:0,borderWidth:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Os.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),bt.route("scale.ticks","color","","color"),bt.route("scale.grid","color","","borderColor"),bt.route("scale.grid","borderColor","","borderColor"),bt.route("scale.title","color","","color"),bt.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t}),bt.describe("scales",{_fallback:"scale"}),bt.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t});const Ls=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i;function Rs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Is(t){return t.drawTicks?t.tickLength:0}function zs(t,e){if(!t.display)return 0;const i=He(t.font,e),s=Ne(t.padding);return(Y(t.text)?t.text.length:1)*i.lineHeight+s.height}function Fs(t,e,i){let n=s(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=(t=>"left"===t?"right":"right"===t?"left":t)(n)),n}class Bs extends Ds{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=q(t,Number.POSITIVE_INFINITY),e=q(e,Number.NEGATIVE_INFINITY),i=q(i,Number.POSITIVE_INFINITY),s=q(s,Number.NEGATIVE_INFINITY),{min:q(t,i),max:q(e,s),minDefined:X(t),maxDefined:X(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:q(i,q(s,i)),max:q(s,q(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){J(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=$e(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=jt(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Is(t.grid)-e.padding-zs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=zt(Math.min(Math.asin(jt((h.highest.height+6)/o,-1,1)),Math.asin(jt(a/r,-1,1))-Math.asin(jt(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){J(this.options.afterCalculateLabelRotation,[this])}beforeFit(){J(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=zs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Is(n)+o):(t.height=this.maxHeight,t.width=Is(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=It(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){J(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:n[t]||0,height:o[t]||0});return{first:v(0),last:v(e-1),widest:v(_),highest:v(y),widths:n,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return $t(this._alignToPixels?Kt(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:o}=s,a=n.offset,r=this.isHorizontal(),l=this.ticks.length+(a?1:0),h=Is(n),c=[],d=n.setContext(this.getContext()),u=d.drawBorder?d.borderWidth:0,f=u/2,g=function(t){return Kt(i,t,u)};let p,m,x,b,_,y,v,w,M,k,S,P;if("top"===o)p=g(this.bottom),y=this.bottom-h,w=p-f,k=g(t.top)+f,P=t.bottom;else if("bottom"===o)p=g(this.top),k=t.top,P=g(t.bottom)-f,y=p+f,w=this.top+h;else if("left"===o)p=g(this.right),_=this.right-h,v=p-f,M=g(t.left)+f,S=t.right;else if("right"===o)p=g(this.left),M=t.left,S=g(t.right)-f,_=p+f,v=this.left+h;else if("x"===e){if("center"===o)p=g((t.top+t.bottom)/2+.5);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}k=t.top,P=t.bottom,y=p+f,w=y+h}else if("y"===e){if("center"===o)p=g((t.left+t.right)/2);else if(U(o)){const t=Object.keys(o)[0],e=o[t];p=g(this.chart.scales[t].getPixelForValue(e))}_=p-f,v=_-h,M=t.left,S=t.right}const D=K(s.ticks.maxTicksLimit,l),C=Math.max(1,Math.ceil(l/D));for(m=0;me.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i+1,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");bt.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&bt.describe(e,t.descriptors)}(t,o,i),this.override&&bt.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in bt[s]&&(delete bt[s][i],this.override&&delete gt[i])}}var Ws=new class{constructor(){this.controllers=new Vs(Ps,"datasets",!0),this.elements=new Vs(Ds,"elements"),this.plugins=new Vs(Object,"plugins"),this.scales=new Vs(Bs,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):Q(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=ht(t);J(i["before"+s],[],i),e[t](i),J(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Hs(t,e){return e||!1!==t?!0===t?{}:t:null}function js(t,e,i,s){const n=t.pluginScopeKeys(e),o=t.getOptionScopes(i,n);return t.createResolver(o,s,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function $s(t,e){const i=bt.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function Ys(t,e){return"x"===t||"y"===t?t:e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.charAt(0).toLowerCase();var i}function Us(t){const e=t.options||(t.options={});e.plugins=K(e.plugins,{}),e.scales=function(t,e){const i=gt[t.type]||{scales:{}},s=e.scales||{},n=$s(t.type,e),o=Object.create(null),a=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!U(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=Ys(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,n),h=i.scales||{};o[r]=o[r]||t,a[t]=ot(Object.create(null),[{axis:r},e,h[r],h[l]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,r=i.indexAxis||$s(n,e),l=(gt[n]||{}).scales||{};Object.keys(l).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,r),n=i[e+"AxisID"]||o[e]||e;a[n]=a[n]||Object.create(null),ot(a[n],[{axis:e},s[n],l[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];ot(e,[bt.scales[e.type],bt.scale])})),a}(t,e)}function Xs(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const qs=new Map,Ks=new Set;function Gs(t,e){let i=qs.get(t);return i||(i=e(),qs.set(t,i),Ks.add(i)),i}const Zs=(t,e,i)=>{const s=lt(e,i);void 0!==s&&t.add(s)};class Js{constructor(t){this._config=function(t){return(t=t||{}).data=Xs(t.data),Us(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Xs(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Us(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Gs(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return Gs(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return Gs(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return Gs(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>Zs(r,t,e)))),e.forEach((t=>Zs(r,s,t))),e.forEach((t=>Zs(r,gt[n]||{},t))),e.forEach((t=>Zs(r,bt,t))),e.forEach((t=>Zs(r,pt,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Ks.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,gt[e]||{},bt.datasets[e]||{},{type:e},bt,pt]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:o,subPrefixes:a}=Qs(this._resolverCache,t,s);let r=o;if(function(t,e){const{isScriptable:i,isIndexable:s}=ri(t);for(const n of e){const e=i(n),o=s(n),a=(o||e)&&t[n];if(e&&(dt(a)||tn(a))||o&&Y(a))return!0}return!1}(o,e)){n.$shared=!1;r=ai(o,i=dt(i)?i():i,this.createResolver(t,i,a))}for(const t of e)n[t]=r[t];return n}createResolver(t,e,i=[""],s){const{resolver:n}=Qs(this._resolverCache,t,i);return U(e)?ai(n,e,void 0,s):n}}function Qs(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:oi(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const tn=t=>U(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||dt(t[i])),!1);const en=["top","bottom","left","right","chartArea"];function sn(t,e){return"top"===t||"bottom"===t||-1===en.indexOf(t)&&"x"===e}function nn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function on(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),J(i&&i.onComplete,[t],e)}function an(t){const e=t.chart,i=e.options.animation;J(i&&i.onProgress,[t],e)}function rn(t){return ge()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const ln={},hn=t=>{const e=rn(t);return Object.values(ln).filter((t=>t.canvas===e)).pop()};function cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class dn{constructor(t,e){const s=this.config=new Js(e),n=rn(t),o=hn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas can be reused.");const r=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ls(n)),this.platform.updateConfig(s);const l=this.platform.acquireContext(n,r.aspectRatio),h=l&&l.canvas,c=h&&h.height,d=h&&h.width;this.id=j(),this.ctx=l,this.canvas=h,this.width=d,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ns,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=i((t=>this.update(t)),r.resizeDelay||0),this._dataChanges=[],ln[this.id]=this,l&&h?(a.listen(this,"complete",on),a.listen(this,"progress",an),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return $(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Gt(this.canvas,this.ctx),this}stop(){return a.stop(this),this}resize(t,e){a.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),J(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){Q(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=Ys(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),Q(n,(e=>{const n=e.options,o=n.id,a=Ys(o,n),r=K(n.type,e.dtype);void 0!==n.position&&sn(n.position,a)===sn(e.dposition)||(n.position=e.dposition),s[o]=!0;let l=null;if(o in i&&i[o].type===r)l=i[o];else{l=new(Ws.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)})),Q(s,((t,e)=>{t||delete i[e]})),Q(i,(t=>{ni.configure(this,t,t.options),ni.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(nn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){Q(this.scales,(t=>{ni.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);ut(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ni.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Q(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Qt(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&te(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}getElementsAtEventForMode(t,e,i,s){const n=Ee.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ye(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);ct(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),a.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Q(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){Q(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},Q(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!tt(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:Jt(t,this.chartArea,this._minPadding)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=ft(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,J(n.onHover,[t,a,this],this),r&&J(n.onClick,[t,a,this],this));const h=!tt(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}const un=()=>Q(dn.instances,(t=>t._plugins.invalidate())),fn=!0;function gn(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}Object.defineProperties(dn,{defaults:{enumerable:fn,value:bt},instances:{enumerable:fn,value:ln},overrides:{enumerable:fn,value:gt},registry:{enumerable:fn,value:Ws},version:{enumerable:fn,value:"3.7.1"},getChart:{enumerable:fn,value:hn},register:{enumerable:fn,value:(...t)=>{Ws.add(...t),un()}},unregister:{enumerable:fn,value:(...t)=>{Ws.remove(...t),un()}}});class pn{constructor(t){this.options=t||{}}formats(){return gn()}parse(t,e){return gn()}format(t,e){return gn()}add(t,e,i){return gn()}diff(t,e,i){return gn()}startOf(t,e,i){return gn()}endOf(t,e){return gn()}}pn.override=function(t){Object.assign(pn.prototype,t)};var mn={_date:pn};function xn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(ct(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function _n(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base=i?1:-1)}(c,e,o)*n,d===o&&(p-=c/2),h=p+c),p===e.getPixelForValue(o)){const t=Ct(c)*e.getLineWidthForValue(o)/2;p+=t,c-=t}return{size:c,base:p,head:h,center:h+c/2}}_calculateBarIndexPixels(t,e){const i=e.scale,s=this.options,n=s.skipNull,o=K(s.maxBarThickness,1/0);let a,r;if(e.grouped){const i=n?this._getStackCount(t):e.stackCount,l="flex"===s.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,{xScale:i,yScale:s}=e,n=this.getParsed(t),o=i.getLabelForValue(n.x),a=s.getLabelForValue(n.y),r=n._custom;return{label:e.label,value:"("+o+", "+a+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,r=this.resolveDataElementOptions(e,s),l=this.getSharedOptions(r),h=this.includeOptions(s,l),c=o.axis,d=a.axis;for(let r=e;r""}}}};class Dn extends Ps{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,o,a=t=>+i[t];if(U(i[t])){const{key:t="value"}=this._parsing;a=e=>+lt(i[e],t)}for(n=t,o=t+e;nHt(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Ht(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(kt,c,u),x=g(_t,h,d),b=g(_t+kt,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(c,h,r),p=(i.width-o)/d,m=(i.height-o)/u,x=Math.max(Math.min(p,m)/2,0),b=Z(this.options.radius,x),_=(b-Math.max(b*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=f*b,this.offsetY=g*b,s.total=this.calculateTotal(),this.outerRadius=b-_*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-_*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/yt)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,f=this.resolveDataElementOptions(e,s),g=this.getSharedOptions(f),p=this.includeOptions(s,g);let m,x=this._getRotation();for(m=0;m0&&!isNaN(t)?yt*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s"spacing"!==t,_indexable:t=>"spacing"!==t},Dn.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label(t){let e=t.label;const i=": "+t.formattedValue;return Y(e)?(e=e.slice(),e[0]+=i):e+=i,e}}}}};class Cn extends Ps{initialize(){this.enableOptionSharing=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=function(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=jt(Math.min(re(r,a.axis,h).lo,i?s:re(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?jt(Math.max(re(r,a.axis,c).hi+1,i?0:re(e,l,a.getPixelForValue(c)).hi+1),n,s)-n:s-n}return{start:n,count:o}}(e,s,o);this._drawStart=a,this._drawCount=r,function(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,h=this.resolveDataElementOptions(e,s),c=this.getSharedOptions(h),d=this.includeOptions(s,c),u=o.axis,f=a.axis,{spanGaps:g,segment:p}=this.options,m=Tt(g)?g:Number.POSITIVE_INFINITY,x=this.chart._animationsDisabled||n||"none"===s;let b=e>0&&this.getParsed(e-1);for(let h=e;h0&&i[u]-b[u]>m,p&&(g.parsed=i,g.raw=l.data[h]),d&&(g.options=c||this.resolveDataElementOptions(h,e.active?"active":s)),x||this.updateElement(e,h,g,s),b=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}Cn.id="line",Cn.defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1},Cn.overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};class On extends Ps{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=Ri(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=this.getDataset(),r=o.options.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*_t;let u,f=d;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(t.data[s])&&this.chart.getDataVisibility(s)&&i++})),i}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?It(this.resolveDataElementOptions(t,e).angle||i):0}}On.id="polarArea",On.defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0},On.overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i}}=t.legend.options;return e.labels.map(((e,s)=>{const n=t.getDatasetMeta(0).controller.getStyle(s);return{text:e,fillStyle:n.backgroundColor,strokeStyle:n.borderColor,lineWidth:n.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(s),index:s}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}},tooltip:{callbacks:{title:()=>"",label:t=>t.chart.data.labels[t.dataIndex]+": "+t.formattedValue}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};class An extends Dn{}An.id="pie",An.defaults={cutout:0,rotation:0,circumference:360,radius:"100%"};class Tn extends Ps{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this.getDataset(),o=this._cachedMeta.rScale,a="reset"===s;for(let r=e;r"",label:t=>"("+t.label+", "+t.formattedValue+")"}}},scales:{x:{type:"linear"},y:{type:"linear"}}};var Rn=Object.freeze({__proto__:null,BarController:Sn,BubbleController:Pn,DoughnutController:Dn,LineController:Cn,PolarAreaController:On,PieController:An,RadarController:Tn,ScatterController:Ln});function En(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+kt,s-kt),t.closePath(),t.clip()}function In(t,e,i,s){const n=Be(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return jt(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:jt(n.innerStart,0,a),innerEnd:jt(n.innerEnd,0,a)}}function zn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Fn(t,e,i,s,n){const{x:o,y:a,startAngle:r,pixelMargin:l,innerRadius:h}=e,c=Math.max(e.outerRadius+s+i-l,0),d=h>0?h+s+i+l:0;let u=0;const f=n-r;if(s){const t=((h>0?h-s:0)+(c>0?c-s:0))/2;u=(f-(0!==t?f*t/(t+s):f))/2}const g=(f-Math.max(.001,f*c-i/_t)/c)/2,p=r+g+u,m=n-g-u,{outerStart:x,outerEnd:b,innerStart:_,innerEnd:y}=In(e,d,c,m-p),v=c-x,w=c-b,M=p+x/v,k=m-b/w,S=d+_,P=d+y,D=p+_/S,C=m-y/P;if(t.beginPath(),t.arc(o,a,c,M,k),b>0){const e=zn(w,k,o,a);t.arc(e.x,e.y,b,k,m+kt)}const O=zn(P,m,o,a);if(t.lineTo(O.x,O.y),y>0){const e=zn(P,C,o,a);t.arc(e.x,e.y,y,m+kt,C+Math.PI)}if(t.arc(o,a,d,m-y/d,p+_/d,!0),_>0){const e=zn(S,D,o,a);t.arc(e.x,e.y,_,D+Math.PI,p-kt)}const A=zn(v,p,o,a);if(t.lineTo(A.x,A.y),x>0){const e=zn(v,M,o,a);t.arc(e.x,e.y,x,p-kt,M)}t.closePath()}function Bn(t,e,i,s,n){const{options:o}=e,{borderWidth:a,borderJoinStyle:r}=o,l="inner"===o.borderAlign;a&&(l?(t.lineWidth=2*a,t.lineJoin=r||"round"):(t.lineWidth=a,t.lineJoin=r||"bevel"),e.fullCircles&&function(t,e,i){const{x:s,y:n,startAngle:o,pixelMargin:a,fullCircles:r}=e,l=Math.max(e.outerRadius-a,0),h=e.innerRadius+a;let c;for(i&&En(t,e,o+yt),t.beginPath(),t.arc(s,n,h,o+yt,o,!0),c=0;c=yt||Ht(n,a,r),f=Yt(o,l+d,h+d);return u&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius","circumference"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/2,n=(e.spacing||0)/2;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>yt?Math.floor(i/yt):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();let o=0;if(s){o=s/2;const e=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(e)*o,Math.sin(e)*o),this.circumference>=_t&&(o=s)}t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor;const a=function(t,e,i,s){const{fullCircles:n,startAngle:o,circumference:a}=e;let r=e.endAngle;if(n){Fn(t,e,i,s,o+yt);for(let e=0;er&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function Yn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?$n:jn}Vn.id="arc",Vn.defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0},Vn.defaultRoutes={backgroundColor:"backgroundColor"};const Un="function"==typeof Path2D;function Xn(t,e,i,s){Un&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Wn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=Yn(e);for(const r of n)Wn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class qn extends Ds{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;ki(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Ni(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Wi(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?Ai:t.tension||"monotone"===t.cubicInterpolationMode?Ti:Oi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t&&"fill"!==t};class Gn extends Ds{constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-o,2){oo(t)}))}var ro={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void ao(t);const s=t.width;t.data.datasets.forEach(((e,n)=>{const{_data:o,indexAxis:a}=e,r=t.getDatasetMeta(n),l=o||e.data;if("y"===je([a,t.options.indexAxis]))return;if("line"!==r.type)return;const h=t.scales[r.xAxisID];if("linear"!==h.type&&"time"!==h.type)return;if(t.options.parsing)return;let{start:c,count:d}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=jt(re(e,o.axis,a).lo,0,i-1)),s=h?jt(re(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(r,l);if(d<=(i.threshold||4*s))return void oo(e);let u;switch($(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":u=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(l,c,d,s,i);break;case"min-max":u=function(t,e,i,s){let n,o,a,r,l,h,c,d,u,f,g=0,p=0;const m=[],x=e+i-1,b=t[e].x,_=t[x].x-b;for(n=e;nf&&(f=r,c=n),g=(p*g+o.x)/++p;else{const i=n-1;if(!$(h)&&!$(c)){const e=Math.min(h,c),s=Math.max(h,c);e!==d&&e!==i&&m.push({...t[e],x:g}),s!==d&&s!==i&&m.push({...t[s],x:g})}n>0&&i!==d&&m.push(t[i]),m.push(o),l=e,p=0,u=f=r,h=c=d=n}}return m}(l,c,d,s);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=u}))},destroy(t){ao(t)}};function lo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=K(i&&i.target,i);return void 0===s&&(s=!!e.backgroundColor),!1!==s&&null!==s&&(!0===s?"origin":s)}(t);if(U(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return X(n)&&Math.floor(n)===n?("-"!==s[0]&&"+"!==s[0]||(n=e+n),!(n===e||n<0||n>=i)&&n):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}class ho{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:yt},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function co(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,o=[],a=s.reverse?e.max:e.min,r=s.reverse?e.min:e.max;let l,h,c;if(c="start"===i?a:"end"===i?r:U(i)?i.value:e.getBaseValue(),s.grid.circular)return h=e.getPointPositionForValue(0,a),new ho({x:h.x,y:h.y,radius:e.getDistanceFromCenterForValue(c)});for(l=0;lt;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function fo(t,e,i){const s=[];for(let n=0;n{e=uo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new qn({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function xo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!X(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function bo(t,e,i){const{segments:s,points:n}=e;let o=!0,a=!1;t.beginPath();for(const r of s){const{start:s,end:l}=r,h=n[s],c=n[uo(s,l,n)];o?(t.moveTo(h.x,h.y),o=!1):(t.lineTo(h.x,i),t.lineTo(h.x,h.y)),a=!!e.pathSegment(t,r,{move:a}),a?t.closePath():t.lineTo(c.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function _o(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=Nt(n),o=Nt(o)),{property:t,start:n,end:o}}function yo(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function vo(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};"x"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function wo(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}function Mo(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=uo(s,r,n);const l=_o(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=Wi(e,l);for(const e of h){const s=_o(i,o[e.start],o[e.end],e.loop),r=Vi(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:yo(l,s,"start",Math.max)},end:{[i]:yo(l,s,"end",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,vo(t,a,d&&_o(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():wo(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||wo(t,s,h,n)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function ko(t,e,i){const s=po(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(Qt(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==n&&(bo(t,s,a.top),Mo(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),bo(t,s,a.bottom)),Mo(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),te(t))}var So={id:"filler",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&ko(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;i&&ko(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;s&&!1!==s.fill&&"beforeDatasetDraw"===i.drawTime&&ko(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const Po=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class Do extends Ds{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=J(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=He(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=Po(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,n,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const p=i+e/2+n.measureText(t.text).width;o>0&&u+s+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:s},d=Math.max(d,p),u+=s+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:o}}=this,a=Ei(o,this.left,this.width);if(this.isHorizontal()){let o=0,r=n(i,this.left+s,this.right-this.lineWidths[o]);for(const l of e)o!==l.row&&(o=l.row,r=n(i,this.left+s,this.right-this.lineWidths[o])),l.top+=this.top+t+s,l.left=a.leftForLtr(a.x(r),l.width),r+=l.width+s}else{let o=0,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height);for(const l of e)l.col!==o&&(o=l.col,r=n(i,this.top+t+s,this.bottom-this.columnSizes[o].height)),l.top=r,l.left+=this.left+s,l.left=a.leftForLtr(a.x(l.left),l.width),r+=l.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Qt(t,this),this._draw(),te(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:a,labels:r}=t,l=bt.color,h=Ei(t.rtl,this.left,this.width),c=He(r.font),{color:d,padding:u}=r,f=c.size,g=f/2;let p;this.drawTitle(),s.textAlign=h.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=c.string;const{boxWidth:m,boxHeight:x,itemHeight:b}=Po(r,f),_=this.isHorizontal(),y=this._computeTitleHeight();p=_?{x:n(a,this.left+u,this.right-i[0]),y:this.top+u+y,line:0}:{x:this.left+u,y:n(a,this.top+y+u,this.bottom-e[0].height),line:0},Ii(this.ctx,t.textDirection);const v=b+u;this.legendItems.forEach(((w,M)=>{s.strokeStyle=w.fontColor||d,s.fillStyle=w.fontColor||d;const k=s.measureText(w.text).width,S=h.textAlign(w.textAlign||(w.textAlign=r.textAlign)),P=m+g+k;let D=p.x,C=p.y;h.setWidth(this.width),_?M>0&&D+P+u>this.right&&(C=p.y+=v,p.line++,D=p.x=n(a,this.left+u,this.right-i[p.line])):M>0&&C+v>this.bottom&&(D=p.x=D+e[p.line].width+u,p.line++,C=p.y=n(a,this.top+y+u,this.bottom-e[p.line].height));!function(t,e,i){if(isNaN(m)||m<=0||isNaN(x)||x<0)return;s.save();const n=K(i.lineWidth,1);if(s.fillStyle=K(i.fillStyle,l),s.lineCap=K(i.lineCap,"butt"),s.lineDashOffset=K(i.lineDashOffset,0),s.lineJoin=K(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=K(i.strokeStyle,l),s.setLineDash(K(i.lineDash,[])),r.usePointStyle){const o={radius:m*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},a=h.xPlus(t,m/2);Zt(s,o,a,e+g)}else{const o=e+Math.max((f-x)/2,0),a=h.leftForLtr(t,m),r=We(i.borderRadius);s.beginPath(),Object.values(r).some((t=>0!==t))?oe(s,{x:a,y:o,w:m,h:x,radius:r}):s.rect(a,o,m,x),s.fill(),0!==n&&s.stroke()}s.restore()}(h.x(D),C,w),D=o(S,D+m+g,_?D+P:this.right,t.rtl),function(t,e,i){se(s,i.text,t,e+b/2,c,{strikethrough:i.hidden,textAlign:h.textAlign(i.textAlign)})}(h.x(D),C,w),_?p.x+=P+u:p.y+=v})),zi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=He(e.font),o=Ne(e.padding);if(!e.display)return;const a=Ei(t.rtl,this.left,this.width),r=this.ctx,l=e.position,h=i.size/2,c=o.top+h;let d,u=this.left,f=this.width;if(this.isHorizontal())f=Math.max(...this.lineWidths),d=this.top+c,u=n(t.align,u,this.right-f);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);d=c+n(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const g=n(l,u,u+f);r.textAlign=a.textAlign(s(l)),r.textBaseline="middle",r.strokeStyle=e.color,r.fillStyle=e.color,r.font=i.string,se(r,e.text,g,d,i)}_computeTitleHeight(){const t=this.options.title,e=He(t.font),i=Ne(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Yt(t,this.left,this.right)&&Yt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const a=t.controller.getStyle(i?0:void 0),r=Ne(a.borderWidth);return{text:e[t.index].label,fillStyle:a.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:(r.width+r.height)/4,strokeStyle:a.borderColor,pointStyle:s||a.pointStyle,rotation:a.rotation,textAlign:n||a.textAlign,borderRadius:0,datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class Oo extends Ds{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=Y(i.text)?i.text.length:1;this._padding=Ne(i.padding);const n=s*He(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=n:this.width=n}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:o,options:a}=this,r=a.align;let l,h,c,d=0;return this.isHorizontal()?(h=n(r,i,o),c=e+t,l=o-i):("left"===a.position?(h=i+t,c=n(r,s,e),d=-.5*_t):(h=o-t,c=n(r,e,s),d=.5*_t),l=s-e),{titleX:h,titleY:c,maxWidth:l,rotation:d}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=He(e.font),n=i.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:r,rotation:l}=this._drawArgs(n);se(t,e.text,0,0,i,{color:e.color,maxWidth:r,rotation:l,textAlign:s(e.align),textBaseline:"middle",translation:[o,a]})}}var Ao={id:"title",_element:Oo,start(t,e,i){!function(t,e){const i=new Oo({ctx:t.ctx,options:e,chart:t});ni.configure(t,i,e),ni.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ni.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const To=new WeakMap;var Lo={id:"subtitle",start(t,e,i){const s=new Oo({ctx:t.ctx,options:i,chart:t});ni.configure(t,s,i),ni.addBox(t,s),To.set(t,s)},stop(t){ni.removeBox(t,To.get(t)),To.delete(t)},beforeUpdate(t,e,i){const s=To.get(t);ni.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Ro={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function zo(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Fo(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=He(e.bodyFont),h=He(e.titleFont),c=He(e.footerFont),d=o.length,u=n.length,f=s.length,g=Ne(e.padding);let p=g.height,m=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-f)*l.lineHeight+(x-1)*e.bodySpacing}u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let b=0;const _=function(t){m=Math.max(m,i.measureText(t).width+b)};return i.save(),i.font=h.string,Q(t.title,_),i.font=l.string,Q(t.beforeBody.concat(t.afterBody),_),b=e.displayColors?a+2+e.boxPadding:0,Q(s,(t=>{Q(t.before,_),Q(t.lines,_),Q(t.after,_)})),b=0,i.font=c.string,Q(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function Bo(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Vo(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Bo(t,e,i,s),yAlign:s}}function Wo(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=We(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:jt(g,0,s.width-e.width),y:jt(p,0,s.height-e.height)}}function No(t,e,i){const s=Ne(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ho(t){return Eo([],Io(t))}function jo(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}class $o extends Ds{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart||t._chart,this._chart=this.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new gs(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,Ye(t,{tooltip:e,tooltipItems:i,type:"tooltip"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=i.beforeTitle.apply(this,[t]),n=i.title.apply(this,[t]),o=i.afterTitle.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}getBeforeBody(t,e){return Ho(e.callbacks.beforeBody.apply(this,[t]))}getBody(t,e){const{callbacks:i}=e,s=[];return Q(t,(t=>{const e={before:[],lines:[],after:[]},n=jo(i,t);Eo(e.before,Io(n.beforeLabel.call(this,t))),Eo(e.lines,n.label.call(this,t)),Eo(e.after,Io(n.afterLabel.call(this,t))),s.push(e)})),s}getAfterBody(t,e){return Ho(e.callbacks.afterBody.apply(this,[t]))}getFooter(t,e){const{callbacks:i}=e,s=i.beforeFooter.apply(this,[t]),n=i.footer.apply(this,[t]),o=i.afterFooter.apply(this,[t]);let a=[];return a=Eo(a,Io(s)),a=Eo(a,Io(n)),a=Eo(a,Io(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),Q(l,(e=>{const i=jo(t.callbacks,e);s.push(i.labelColor.call(this,e)),n.push(i.labelPointStyle.call(this,e)),o.push(i.labelTextColor.call(this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Ro[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Fo(this,i),a=Object.assign({},t,e),r=Vo(this.chart,i,a),l=Wo(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=We(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Ei(i.rtl,this.x,this.width);for(t.x=No(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=He(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,oe(t,{x:e,y:g,w:l,h:r,radius:a}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),oe(t,{x:i,y:g+1,w:l-2,h:r-2,radius:a}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=o.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=He(i.bodyFont);let d=c.lineHeight,u=0;const f=Ei(i.rtl,this.x,this.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+n},p=f.textAlign(o);let m,x,b,_,y,v,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=No(this,p,i),e.fillStyle=i.bodyColor,Q(this.beforeBody,g),u=a&&"right"!==p?"center"===o?l/2+h:l+2+h:0,_=0,v=s.length;_0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Ro[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Fo(this,t),a=Object.assign({},i,this._size),r=Vo(e,t,a),l=Wo(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Ne(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ii(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),zi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!tt(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!tt(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Ro[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}$o.positioners=Ro;var Yo={id:"tooltip",_element:$o,positioners:Ro,afterInit(t,e,i){i&&(t.tooltip=new $o({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip,i={tooltip:e};!1!==t.notifyPlugins("beforeTooltipDraw",i)&&(e&&e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i))},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:{beforeTitle:H,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Uo=Object.freeze({__proto__:null,Decimation:ro,Filler:So,Legend:Co,SubTitle:Lo,Title:Ao,Tooltip:Yo});function Xo(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}class qo extends Bs{constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if($(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:jt(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:Xo(i,t,K(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Ko(t,e,{horizontal:i,minRotation:s}){const n=It(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}qo.id="category",qo.defaults={ticks:{callback:qo.prototype.getLabelForValue}};class Go extends Bs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return $(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=Ct(s),e=Ct(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=1;(n>=Number.MAX_SAFE_INTEGER||s<=Number.MIN_SAFE_INTEGER)&&(e=Math.abs(.05*n)),a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s=function(t,e){const i=[],{bounds:s,step:n,min:o,max:a,precision:r,count:l,maxTicks:h,maxDigits:c,includeBounds:d}=t,u=n||1,f=h-1,{min:g,max:p}=e,m=!$(o),x=!$(a),b=!$(l),_=(p-g)/(c+1);let y,v,w,M,k=Ot((p-g)/f/u)*u;if(k<1e-14&&!m&&!x)return[{value:g},{value:p}];M=Math.ceil(p/k)-Math.floor(g/k),M>f&&(k=Ot(M*k/f/u)*u),$(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===s?(v=Math.floor(g/k)*k,w=Math.ceil(p/k)*k):(v=g,w=p),m&&x&&n&&Rt((a-o)/n,k/1e3)?(M=Math.round(Math.min((a-o)/k,h)),k=(a-o)/M,v=o,w=a):b?(v=m?o:v,w=x?a:w,M=l-1,k=(w-v)/M):(M=(w-v)/k,M=Lt(M,Math.round(M),k/1e3)?Math.round(M):Math.ceil(M));const S=Math.max(Ft(k),Ft(v));y=Math.pow(10,$(r)?S:r),v=Math.round(v*y)/y,w=Math.round(w*y)/y;let P=0;for(m&&(d&&v!==o?(i.push({value:o}),v0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=X(t)?Math.max(0,t):null,this.max=X(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t,a=(t,e)=>Math.pow(10,Math.floor(Dt(t))+e);i===s&&(i<=0?(n(1),o(10)):(n(a(i,-1)),o(a(s,1)))),i<=0&&n(a(s,-1)),s<=0&&o(a(i,1)),this._zero&&this.min!==this._suggestedMin&&i===a(this.min,0)&&n(a(i,-1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=function(t,e){const i=Math.floor(Dt(e.max)),s=Math.ceil(e.max/Math.pow(10,i)),n=[];let o=q(t.min,Math.pow(10,Math.floor(Dt(e.min)))),a=Math.floor(Dt(o)),r=Math.floor(o/Math.pow(10,a)),l=a<0?Math.pow(10,Math.abs(a)):1;do{n.push({value:o,major:Jo(o)}),++r,10===r&&(r=1,++a,l=a>=0?1:l),o=Math.round(r*Math.pow(10,a)*l)/l}while(an?{start:e-i,end:e}:{start:e,end:e+i}}function ia(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],o=t._pointLabels.length,a=t.options.pointLabels,r=a.centerPointLabels?_t/o:0;for(let d=0;de.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function na(t){return 0===t||180===t?"center":t<180?"left":"right"}function oa(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function aa(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function ra(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,yt);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o{const i=J(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?ia(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return Nt(t*(yt/(this._pointLabels.length||1))+It(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if($(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if($(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=s.setContext(t.getPointLabelContext(n)),o=He(e.font),{x:a,y:r,textAlign:l,left:h,top:c,right:d,bottom:u}=t._pointLabelItems[n],{backdropColor:f}=e;if(!$(f)){const t=Ne(e.backdropPadding);i.fillStyle=f,i.fillRect(h-t.left,c-t.top,d-h+t.width,u-c+t.height)}se(i,t._pointLabels[n],a,r+o.lineHeight/2,o,{color:e.color,textAlign:l,textBaseline:"middle"})}}(this,n),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){a=this.getDistanceFromCenterForValue(t.value);!function(t,e,i,s){const n=t.ctx,o=e.circular,{color:a,lineWidth:r}=e;!o&&!s||!a||!r||i<0||(n.save(),n.strokeStyle=a,n.lineWidth=r,n.setLineDash(e.borderDash),n.lineDashOffset=e.borderDashOffset,n.beginPath(),ra(t,i,o,s),n.closePath(),n.stroke(),n.restore())}(this,s.setContext(this.getContext(e-1)),a,n)}})),i.display){for(t.save(),o=n-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:l}=s;l&&n&&(t.lineWidth=l,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,a=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),r=this.getPointPosition(o,a),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=He(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Ne(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}se(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}la.id="radialLinear",la.defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Os.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}},la.defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"},la.descriptors={angleLines:{_fallback:"grid"}};const ha={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ca=Object.keys(ha);function da(t,e){return t-e}function ua(t,e){if($(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:o}=t._parseOpts;let a=e;return"function"==typeof s&&(a=s(a)),X(a)||(a="string"==typeof s?i.parse(a,s):i.parse(a)),null===a?null:(n&&(a="week"!==n||!Tt(o)&&!0!==o?i.startOf(a,n):i.startOf(a,"isoWeek",o)),+a)}function fa(t,e,i,s){const n=ca.length;for(let o=ca.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function pa(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class ma extends Bs{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e){const i=t.time||(t.time={}),s=this._adapter=new mn._date(t.adapters.date);ot(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:ua(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:a}=this.getUserBounds();function r(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),a||isNaN(t.max)||(n=Math.max(n,t.max))}o&&a||(r(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||r(this.getMinMax(!1))),s=X(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=X(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=he(s,n,this.max);return this._unit=e.unit||(i.autoSkip?fa(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=ca.length-1;o>=ca.indexOf(i);o--){const i=ca[o];if(ha[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return ca[i?ca.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=ca.indexOf(t)+1,i=ca.length;e1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const f="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;ct-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.time.displayFormats,a=this._unit,r=this._majorUnit,l=a&&o[a],h=r&&o[r],c=i[e],d=r&&h&&c&&c.major,u=this._adapter.format(t,s||(d?h:l)),f=n.ticks.callback;return f?J(f,[u,e,i],this):u}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=re(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=re(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}ma.id="time",ma.defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",major:{enabled:!1}}};class ba extends ma{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=xa(e,this.min),this._tableRange=xa(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o99?Math.round(L/10):L),t:H<12?"a":"p",tt:H<12?"am":"pm",T:H<12?"A":"P",TT:H<12?"AM":"PM",Z:utc?"UTC":(String(date).match(timezone)||[""]).pop().replace(timezoneClip,""),o:(o>0?"-":"+")+pad(100*Math.floor(Math.abs(o)/60)+Math.abs(o)%60,4),S:["th","st","nd","rd"][d%10>3?0:(d%100-d%10!=10)*d%10]};return mask.replace(token,(function($0){return $0 in flags?flags[$0]:$0.slice(1,$0.length-1)}))}}();dateFormat.masks={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"},dateFormat.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]},Date.prototype.format=function(mask,utc){return dateFormat(this,mask,utc)}; \ No newline at end of file diff --git a/assets/js/events.js b/assets/js/events.js new file mode 100755 index 0000000..c00aeeb --- /dev/null +++ b/assets/js/events.js @@ -0,0 +1,1078 @@ +// Set datepicker default value. +var datepicker_format = 'yy-mm-dd'; + +jQuery(document).ready(function($) +{ + // Image picker on terms menu + $('.mec_upload_image_button').click(function(event) + { + event.preventDefault(); + + var real_ajax_url = wp.ajax.settings.url; + wp.ajax.settings.url = real_ajax_url + '?mec_fes=1'; + + var post_id = $(this).data('post-id'); + if(post_id && post_id !== -1) wp.media.model.settings.post.id = post_id; + if(post_id === -1) wp.media.model.settings.post.id = null; + + var preview_id = 'mec_thumbnail_img'; + var input_id = 'mec_thumbnail'; + + if($(this).data('preview-id')) preview_id = $(this).data('preview-id'); + if($(this).data('input-id')) input_id = $(this).data('input-id'); + + var frame; + if(frame) + { + frame.open(); + return; + } + + frame = wp.media(); + frame.on('select', function() + { + // Grab the selected attachment. + var attachment = frame.state().get('selection').first(); + + $('#'+preview_id).html(''); + $('#'+input_id).val(attachment.attributes.url); + + $('.mec_remove_image_button').toggleClass('mec-util-hidden'); + + frame.close(); + }); + + frame.open(); + }); + + // Image remover on terms menu + $('.mec_remove_image_button').click(function(event) + { + event.preventDefault(); + + var preview_id = 'mec_thumbnail_img'; + var input_id = 'mec_thumbnail'; + + if($(this).data('preview-id')) preview_id = $(this).data('preview-id'); + if($(this).data('input-id')) input_id = $(this).data('input-id'); + + $('#'+preview_id).html(''); + $('#'+input_id).val(''); + + $('.mec_remove_image_button').toggleClass('mec-util-hidden'); + }); + + // Image picker on add event menu for location + $('.mec_location_upload_image_button').click(function(event) + { + event.preventDefault(); + + var frame; + if(frame) + { + frame.open(); + return; + } + + frame = wp.media(); + frame.on('select', function() + { + // Grab the selected attachment. + var attachment = frame.state().get('selection').first(); + + $('#mec_location_thumbnail_img').html(''); + $('#mec_location_thumbnail').val(attachment.attributes.url); + + $('.mec_location_remove_image_button').toggleClass('mec-util-hidden'); + + frame.close(); + }); + + frame.open(); + }); + + // Image remover on add event menu for location + $('.mec_location_remove_image_button').click(function(event) + { + event.preventDefault(); + + $('#mec_location_thumbnail_img').html(''); + $('#mec_location_thumbnail').val(''); + + $('.mec_location_remove_image_button').toggleClass('mec-util-hidden'); + }); + + // Image picker on add event menu for organizer + $('.mec_organizer_upload_image_button').click(function(event) + { + event.preventDefault(); + + var frame; + if(frame) + { + frame.open(); + return; + } + + frame = wp.media(); + frame.on('select', function() + { + // Grab the selected attachment. + var attachment = frame.state().get('selection').first(); + + $('#mec_organizer_thumbnail_img').html(''); + $('#mec_organizer_thumbnail').val(attachment.attributes.url); + + $('.mec_organizer_remove_image_button').toggleClass('mec-util-hidden'); + + frame.close(); + }); + + frame.open(); + }); + + // Image remover on add event menu for organizer + $('.mec_organizer_remove_image_button').click(function(event) + { + event.preventDefault(); + + $('#mec_organizer_thumbnail_img').html(''); + $('#mec_organizer_thumbnail').val(''); + + $('.mec_organizer_remove_image_button').toggleClass('mec-util-hidden'); + }); + + // Image remover on frontend event submission menu + $('#mec_fes_remove_image_button').click(function(event) + { + event.preventDefault(); + + $('#mec_fes_thumbnail_img').html(''); + $('#mec_fes_thumbnail').val(''); + $('#mec_featured_image_file').val(''); + + $('#mec_fes_remove_image_button').addClass('mec-util-hidden'); + }); + + // Location Image remover on frontend event submission menu + $('#mec_fes_location_remove_image_button').click(function(event) + { + event.preventDefault(); + + $('#mec_fes_location_thumbnail_img').html(''); + $('#mec_fes_location_thumbnail').val(''); + $('#mec_fes_location_thumbnail_file').val(''); + + $('#mec_fes_location_remove_image_button').addClass('mec-util-hidden'); + }); + + // Organizer Image remover on frontend event submission menu + $('#mec_fes_organizer_remove_image_button').click(function(event) + { + event.preventDefault(); + + $('#mec_fes_organizer_thumbnail_img').html(''); + $('#mec_fes_organizer_thumbnail').val(''); + $('#mec_fes_organizer_thumbnail_file').val(''); + + $('#mec_fes_organizer_remove_image_button').addClass('mec-util-hidden'); + }); + + var date_splite; + if(typeof mec_admin_localize !== 'undefined') + { + date_splite = mec_admin_localize.datepicker_format.split('&'); + if(date_splite[0] !== undefined && date_splite.length == 2) datepicker_format = date_splite[0]; + } + else if(typeof mecdata !== 'undefined') + { + date_splite = mecdata.datepicker_format.split( '&' ); + if(date_splite[0] !== undefined && date_splite.length == 2) datepicker_format = date_splite[0]; + } + + $('[id^="mec-book-form-btn-step"]').on('click',function() + { + setTimeout(function() + { + if($.fn.datepicker) + { + if('date' !== $('.mec-date-picker').prop('type')) + { + $('.mec-date-picker').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); + } + + } + }, 1000); + }); + + if($.fn.datepicker) + { + $('.mec-date-picker').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); + + $('#mec_start_date').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + onSelect: function(value, i) + { + const end = $("#mec_end_date"); + if(value !== i.lastVal) + { + end.datepicker("option", "minDate", value); + } + + if(end.val() === '') + { + end.val(value); + } + } + }); + + $('#mec_end_date').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + onSelect: function(value, i) + { + const start = $("#mec_start_date"); + if(value !== i.lastVal) + { + start.datepicker("option", "maxDate", value); + } + + if(start.val() === '') + { + start.val(value); + } + } + }); + + $('#mec_date_repeat_end_at_date').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); + + $('.mec_date_picker_dynamic_format').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); + + $('.mec_date_picker').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: 'yy-mm-dd', + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); + + $('.mec_date_picker_dynamic_format_start').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-1:c+5', + onSelect: function(date) + { + var selectedDate = new Date(date); + var endDate = new Date(selectedDate.getTime()); + + var $end_picker = $(this).next(); + $end_picker.datepicker("option", "minDate", endDate); + $end_picker.datepicker("option", "maxDate", '+5y'); + } + }); + + $('.mec_date_picker_dynamic_format_end').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-1:c+5', + }); + + trigger_period_picker(); + } + + // Initialize WP Color Picker + if($.fn.wpColorPicker) jQuery('.mec-color-picker').wpColorPicker(); + + $('#mec_location_id').on('change', function() + { + mec_location_toggle(); + }); + + $('#mec_organizer_id').on('change', function() + { + mec_organizer_toggle(); + var mec_organizer_val = parseInt($(this).val()); + var mec_additional_organizer = $(this).parent().parent().find('#mec-additional-organizer-wrap'); + + if(mec_organizer_val != 1) mec_additional_organizer.show(); + else mec_additional_organizer.hide(); + }); + + mec_location_toggle(); + mec_organizer_toggle(); + + $('#mec_repeat').on('change', function() + { + mec_repeat_toggle(); + }); + + mec_repeat_toggle(); + + $('#mec_repeat_type').on('change', function() + { + mec_repeat_type_toggle(); + }); + + mec_repeat_type_toggle(); + + $('#mec_bookings_limit_unlimited').on('change', function() + { + mec_bookings_unlimited_toggle(); + }); + + $('#mec_add_in_days').on('click', function() + { + var allday = $(this).data('allday'); + + var start = $('#mec_exceptions_in_days_start_date').val(); + if(start === '') return false; + + var end = $('#mec_exceptions_in_days_end_date').val(); + if(end === '') return false; + + var start_hour = $('#mec_exceptions_in_days_start_hour').val(); + if(start_hour.length === 1) start_hour = '0'+start_hour; + + var start_minutes = $('#mec_exceptions_in_days_start_minutes').val(); + if(start_minutes.length === 1) start_minutes = '0'+start_minutes; + + var start_ampm = $('#mec_exceptions_in_days_start_ampm').val(); + if(typeof start_ampm === 'undefined') start_ampm = ''; + + var end_hour = $('#mec_exceptions_in_days_end_hour').val(); + if(end_hour.length === 1) end_hour = '0'+end_hour; + + var end_minutes = $('#mec_exceptions_in_days_end_minutes').val(); + if(end_minutes.length === 1) end_minutes = '0'+end_minutes; + + var end_ampm = $('#mec_exceptions_in_days_end_ampm').val(); + if(typeof end_ampm === 'undefined') end_ampm = ''; + + var value = start + ':' + end + ':' + start_hour + '-' + start_minutes + '-' + start_ampm + ':' + end_hour + '-' + end_minutes + '-' + end_ampm; + var label = start + ' ' + start_hour + ':' + start_minutes + ' ' + start_ampm + ' - ' + end + ' ' + end_hour + ':' + end_minutes + ' ' + end_ampm + ''; + + // Don't add exactly same occurrences + if($('#mec_in_days input[value="'+value+'"]').length > 0) return false; + + var $key = $('#mec_new_in_days_key'); + + var key = $key.val(); + var html = $('#mec_new_in_days_raw').html().replace(/:i:/g, key).replace(/:val:/g, value).replace(/:label:/g, label); + + $('#mec_in_days').append(html); + $key.val(parseInt(key)+1); + }); + + $('#mec_edit_in_days').on('click', function() + { + // Form + const $form = $('#mec-in-days-form'); + + const modify_id = $form.data('modify'); + const $row = $('#mec_in_days_row'+modify_id); + + var allday = $(this).data('allday'); + + var start = $('#mec_exceptions_in_days_start_date').val(); + if(start === '') return false; + + var end = $('#mec_exceptions_in_days_end_date').val(); + if(end === '') return false; + + var start_hour = $('#mec_exceptions_in_days_start_hour').val(); + if(start_hour.length === 1) start_hour = '0'+start_hour; + + var start_minutes = $('#mec_exceptions_in_days_start_minutes').val(); + if(start_minutes.length === 1) start_minutes = '0'+start_minutes; + + var start_ampm = $('#mec_exceptions_in_days_start_ampm').val(); + if(typeof start_ampm === 'undefined') start_ampm = ''; + + var end_hour = $('#mec_exceptions_in_days_end_hour').val(); + if(end_hour.length === 1) end_hour = '0'+end_hour; + + var end_minutes = $('#mec_exceptions_in_days_end_minutes').val(); + if(end_minutes.length === 1) end_minutes = '0'+end_minutes; + + var end_ampm = $('#mec_exceptions_in_days_end_ampm').val(); + if(typeof end_ampm === 'undefined') end_ampm = ''; + + var value = start + ':' + end + ':' + start_hour + '-' + start_minutes + '-' + start_ampm + ':' + end_hour + '-' + end_minutes + '-' + end_ampm; + var label = start + ' ' + start_hour + ':' + start_minutes + ' ' + start_ampm + ' - ' + end + ' ' + end_hour + ':' + end_minutes + ' ' + end_ampm + ''; + + $row.find($('input[type=hidden]')).val(value); + $row.find($('.mec-in-days-day')).html(label); + + // Reset Dates + $form.parent().find($('input[type=text]')).val(''); + + // Modification Mode + $form.removeClass('mec-in-days-edit-mode').addClass('mec-in-days-add-mode').removeData('modify'); + }); + + $('#mec_cancel_in_days').on('click', function() + { + // Form + let $form = $('#mec-in-days-form'); + + // Reset Dates + $form.parent().find($('input[type=text]')).val(''); + + // Modification Mode + $form.removeClass('mec-in-days-edit-mode').addClass('mec-in-days-add-mode').removeData('modify'); + }); + + $('#mec_add_not_in_days').on('click', function() + { + let date = $('#mec_exceptions_not_in_days_date').val(); + if(date === '') return false; + + let d = date.replaceAll('-', ''); + d = d.replaceAll('/', ''); + d = d.replaceAll('.', ''); + + + let $wrapper = $('#mec_not_in_days'); + let $key = $('#mec_new_not_in_days_key'); + + let c = 'mec-date-'+d; + if($wrapper.find($('.'+c)).length) return; + + let key = $key.val(); + let html = $('#mec_new_not_in_days_raw').html().replace(/:i:/g, key).replace(/:d:/g, d).replace(/:val:/g, date); + + $wrapper.append(html); + $key.val(parseInt(key)+1); + }); + + $('#mec_add_ticket_button').on('click', function() + { + let $key = $('#mec_new_ticket_key'); + let key = $key.val(); + let html = $('#mec_new_ticket_raw').html().replace(/:i:/g, key); + + $('#mec_tickets').append(html); + $key.val(parseInt(key)+1); + + $('.mec_add_price_date_button').off('click').on('click', function() + { + mec_handle_add_price_date_button(this); + }); + + $.each($(".mec-select2"), function(i,v) + { + if($(v).attr('name').search(":i:") > 0) + { + return; + } + + if(typeof $(v).data('select2-id') == 'undefined') + { + $(v).select2(); + } + }); + + trigger_period_picker(); + }); + + $('.mec_add_price_date_button').off('click').on('click', function() + { + mec_handle_add_price_date_button(this); + }); + + mec_hourly_schedule_add_day_listener(); + + $('#mec_add_fee_button').on('click', function() + { + var key = $('#mec_new_fee_key').val(); + var html = $('#mec_new_fee_raw').html().replace(/:i:/g, key); + + $('#mec_fees_list').append(html); + $('#mec_new_fee_key').val(parseInt(key)+1); + }); + + $('#mec_add_ticket_variation_button').on('click', function() + { + var key = $('#mec_new_ticket_variation_key').val(); + var html = $('#mec_new_ticket_variation_raw').html().replace(/:i:/g, key); + + $('#mec_ticket_variations_list').append(html); + $('#mec_new_ticket_variation_key').val(parseInt(key)+1); + }); + + $('.mec-form-row.mec-available-color-row span').on('click', function() + { + $('.mec-form-row.mec-available-color-row span').removeClass('color-selected'); + $(this).addClass('color-selected'); + }); + + $('#mec_reg_form_field_types button').on('click', function() + { + var type = $(this).data('type'); + + if (type == 'mec_email') { + if ($('#mec_reg_form_fields').find('input[value="mec_email"][type="hidden"]').length) { + return false; + } + } + + if (type == 'name') { + if ($('#mec_reg_form_fields').find('input[value="name"][type="hidden"]').length) { + return false; + } + } + + var key = $('#mec_new_reg_field_key').val(); + var html = $('#mec_reg_field_'+type).html().replace(/:i:/g, key); + + $('#mec_reg_form_fields').append(html); + $('#mec_new_reg_field_key').val(parseInt(key)+1); + + // Set onclick listener for add option fields + mec_reg_fields_option_listeners(); + }); + + // Set onclick listener for add option fields + mec_reg_fields_option_listeners(); + + // Advanced Repeating + $('#mec-advanced-wraper ul > ul > li').click(function() + { + if($(this).attr('class') == '') $(this).attr('class', 'mec-active'); + else $(this).attr('class', ''); + + $('#mec_date_repeat_advanced').val($('#mec-advanced-wraper div:first-child > ul').find('.mec-active').find('span').text().slice(0, -1)); + }); + + $('#mec_event_form_field_types button').on('click', function() + { + var type = $(this).data('type'); + + var key = $('#mec_new_event_field_key').val(); + var html = $('#mec_event_field_'+type).html().replace(/:i:/g, key); + + $('#mec_event_form_fields').append(html); + $('#mec_new_event_field_key').val(parseInt(key)+1); + + // Set onclick listener for add option fields + mec_event_fields_option_listeners(); + }); + + // Set onclick listener for add option fields + mec_event_fields_option_listeners(); + + $('#mec_bfixed_form_field_types button').on('click', function() + { + var type = $(this).data('type'); + + var key = $('#mec_new_bfixed_field_key').val(); + var html = $('#mec_bfixed_field_'+type).html().replace(/:i:/g, key); + + $('#mec_bfixed_form_fields').append(html); + $('#mec_new_bfixed_field_key').val(parseInt(key)+1); + + // Set onclick listener for add option fields + mec_bfixed_fields_option_listeners(); + }); + + // Set onclick listener for add option fields + mec_bfixed_fields_option_listeners(); + + // Additional Organizers + mec_additional_organizers_listeners(); + + // Show / Hide Password + $('.mec-show-hide-password').on('click', function() + { + var $input = $(this).siblings("input"); + var current = $input.attr('type'); + + if(current === 'password') $input.attr('type', 'text'); + else $input.attr('type', 'password'); + }); + + // FAQ + $('#mec_add_faq_button').on('click', function() + { + var key = $('#mec_new_faq_key').val(); + var html = $('#mec_new_faq_raw').html().replace(/:i:/g, key); + + $('#mec_faq_list').append(html); + $('#mec_new_faq_key').val(parseInt(key)+1); + }); +}); + +function trigger_period_picker() +{ + jQuery('.mec-date-picker-start').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: 'yy-mm-dd', + gotoCurrent: true, + yearRange: 'c-1:c+5', + onSelect: function(date) + { + const selectedDate = new Date(date); + const endDate = new Date(selectedDate.getTime()); + + const $end_picker = jQuery(this).next(); + $end_picker.datepicker("option", "minDate", endDate); + $end_picker.datepicker("option", "maxDate", '+5y'); + } + }); + + jQuery('.mec-date-picker-end').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: 'yy-mm-dd', + gotoCurrent: true, + yearRange: 'c-1:c+5', + }); +} + +function mec_location_toggle() +{ + if(jQuery('#mec_location_id').val() != '0') jQuery('#mec_location_new_container').hide(); + else jQuery('#mec_location_new_container').show(); +} + +function mec_organizer_toggle() +{ + if(jQuery('#mec_organizer_id').val() != '0') jQuery('#mec_organizer_new_container').hide(); + else jQuery('#mec_organizer_new_container').show(); +} + +function mec_repeat_toggle() +{ + if(jQuery('#mec_repeat').is(':checked')) jQuery('.mec-form-repeating-event-row').show(); + else jQuery('.mec-form-repeating-event-row').hide(); +} + +function mec_repeat_type_toggle() +{ + var repeat_type = jQuery('#mec_repeat_type').val(); + + if(repeat_type == 'certain_weekdays') + { + jQuery('#mec_repeat_interval_container').hide(); + jQuery('#mec_repeat_certain_weekdays_container').show(); + jQuery('#mec_exceptions_in_days_container').hide(); + jQuery('#mec_end_wrapper').show(); + jQuery('#mec-advanced-wraper').hide(); + } + else if(repeat_type == 'custom_days') + { + jQuery('#mec_repeat_interval_container').hide(); + jQuery('#mec_repeat_certain_weekdays_container').hide(); + jQuery('#mec_exceptions_in_days_container').show(); + jQuery('#mec_end_wrapper').hide(); + jQuery('#mec-advanced-wraper').hide(); + } + else if(repeat_type == 'advanced') + { + jQuery('#mec_repeat_interval_container').hide(); + jQuery('#mec_repeat_certain_weekdays_container').hide(); + jQuery('#mec_exceptions_in_days_container').hide(); + jQuery('#mec_end_wrapper').show(); + jQuery('#mec-advanced-wraper').show(); + } + else if(repeat_type != 'daily' && repeat_type != 'weekly' && repeat_type != 'monthly') + { + jQuery('#mec_repeat_interval_container').hide(); + jQuery('#mec_repeat_certain_weekdays_container').hide(); + jQuery('#mec_exceptions_in_days_container').hide(); + jQuery('#mec_end_wrapper').show(); + jQuery('#mec-advanced-wraper').hide(); + } + else + { + jQuery('#mec_repeat_interval_container').show(); + jQuery('#mec_repeat_certain_weekdays_container').hide(); + jQuery('#mec_exceptions_in_days_container').hide(); + jQuery('#mec_end_wrapper').show(); + jQuery('#mec-advanced-wraper').hide(); + } +} + +function mec_in_days_remove(i) +{ + jQuery('#mec_in_days_row'+i).remove(); +} + +function mec_in_days_edit(i) +{ + // Date + let $row = jQuery('#mec_in_days_row'+i); + let value = $row.find(jQuery('input[type=hidden]')).val(); + + const values = value.split(':'); + const start_times = values[2].split('-') + const end_times = values[3].split('-') + + // Form + let $form = jQuery('#mec-in-days-form'); + + // Set Dates + jQuery('#mec_exceptions_in_days_start_date').val(values[0]); + jQuery('#mec_exceptions_in_days_end_date').val(values[1]); + + // Set Times + jQuery('#mec_exceptions_in_days_start_hour').val(parseInt(start_times[0])); + jQuery('#mec_exceptions_in_days_start_minutes').val(parseInt(start_times[1])); + jQuery('#mec_exceptions_in_days_start_ampm').val(start_times[2]); + + jQuery('#mec_exceptions_in_days_end_hour').val(parseInt(end_times[0])); + jQuery('#mec_exceptions_in_days_end_minutes').val(parseInt(end_times[1])); + jQuery('#mec_exceptions_in_days_end_ampm').val(end_times[2]); + + // Modification Mode + $form.removeClass('mec-in-days-add-mode').addClass('mec-in-days-edit-mode').data('modify', i); +} + +function mec_not_in_days_remove(i) +{ + jQuery('#mec_not_in_days_row'+i).remove(); +} + +function mec_bookings_unlimited_toggle() +{ + jQuery('#mec_bookings_limit').toggleClass('mec-util-hidden'); +} + +function mec_hourly_schedule_add_day_listener() +{ + jQuery('.mec-add-hourly-schedule-day-button').each(function() + { + jQuery(this).off('click').on('click', function() + { + var k = jQuery(this).data('key'); + var raw = jQuery(this).data('raw'); + var append = jQuery(this).data('append'); + + var key = jQuery(k).val(); + var html = jQuery(raw).html().replace(/:d:/g, key).replace(/:dd:/g, parseInt(key)+1); + + jQuery(append).append(html); + jQuery(k).val(parseInt(key)+1); + + mec_hourly_schedule_listeners(); + }); + + mec_hourly_schedule_listeners(); + }); +} + +function mec_bookings_after_occurrence_cancel_listener() +{ + jQuery('.mec-occurrences-bookings-after-occurrences-cancel').off('change').on('change', function() + { + const $dropdown = jQuery(this); + const value = $dropdown.val(); + const $moveWrapper = $dropdown.next(); + + if(value === 'move' || value === 'move_notify') + { + $moveWrapper.removeClass('w-hidden'); + } + else + { + $moveWrapper.addClass('w-hidden'); + } + }); +} + +function mec_hourly_schedule_listeners() +{ + jQuery('.mec-add-hourly-schedule-button').off('click').on('click', function() + { + var prefix = jQuery(this).data('prefix'); + var day = jQuery(this).data('day'); + var $key = jQuery('#'+prefix+'mec_new_hourly_schedule_key'+day); + + var key = $key.val(); + var html = jQuery('#'+prefix+'mec_new_hourly_schedule_raw'+day).html().replace(/:i:/g, key).replace(/:d:/g, day).replace(); + var g_field_id = prefix+"-hourly_schedules-"+day+"-schedules-:i:-description"; + var field_id = prefix+"-hourly_schedules-"+day+"-schedules-"+key+"-description"; + html = html.replace(g_field_id,field_id); + html = html.replace(':k:',key); + jQuery('#'+prefix+'mec_hourly_schedules'+day).append(html); + $key.val(parseInt(key)+1); + + wp.editor.initialize("mec"+field_id,{ + tinymce: { + wpautop: true, + plugins : 'charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview', + toolbar1: 'bold italic underline strikethrough | bullist numlist | blockquote hr wp_more | alignleft aligncenter alignright | link unlink | fullscreen | wp_adv', + toolbar2: 'formatselect alignjustify forecolor | pastetext removeformat charmap | outdent indent | undo redo | wp_help' + }, + quicktags: true, + mediaButtons: false, + }); + }); +} + +function mec_hourly_schedule_remove(day, i, prefix) +{ + jQuery("#"+prefix+"mec_hourly_schedule_row"+day+'_'+i).remove(); +} + +function mec_hourly_schedule_day_remove(day, prefix) +{ + jQuery("#"+prefix+"mec_meta_box_hourly_schedule_day_"+day).remove(); +} + +function mec_ticket_remove(i) +{ + jQuery("#mec_ticket_row"+i).remove(); +} + +function mec_set_event_color(color) +{ + try + { + jQuery("#mec_event_color").wpColorPicker('color', '#'+color); + } + catch(e) + { + jQuery("#mec_event_color").val(color); + } +} + +function mec_remove_fee(key) +{ + jQuery("#mec_fee_row"+key).remove(); +} + +function mec_remove_ticket_variation(key, id_prefix) +{ + jQuery("#mec_"+id_prefix+"_row"+key).remove(); +} + +function add_variation_per_ticket(ticket_id) +{ + var $input = jQuery('#mec_new_variation_per_ticket_key'); + + var key = $input.val(); + var html = jQuery('#mec_new_variation_per_ticket_raw'+ticket_id).html().replace(/:v:/g, key); + + jQuery('#mec_ticket_variations_list'+ticket_id).append(html); + $input.val(parseInt(key)+1); +} + +function mec_reg_fields_option_listeners() +{ + jQuery('button.mec-reg-field-add-option').off('click').on('click', function() + { + var field_id = jQuery(this).data('field-id'); + var key = jQuery('#mec_new_reg_field_option_key_'+field_id).val(); + var html = jQuery('#mec_reg_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id); + + jQuery('#mec_reg_fields_'+field_id+'_options_container').append(html); + jQuery('#mec_new_reg_field_option_key_'+field_id).val(parseInt(key)+1); + }); + + if(typeof jQuery.fn.sortable !== 'undefined') + { + jQuery("#mec_reg_form_fields").sortable( + { + handle: '.mec_reg_field_sort' + }); + + jQuery(".mec_reg_fields_options_container").sortable( + { + handle: '.mec_reg_field_option_sort' + }); + + jQuery(".mec-hourly-schedule-days").sortable( + { + handle: 'h4' + }); + + jQuery(".mec-hourly-schedule-schedules").sortable({}); + } +} + +function mec_reg_fields_option_remove(field_key, key) +{ + jQuery("#mec_reg_fields_option_"+field_key+"_"+key).remove(); +} + +function mec_reg_fields_remove(key) +{ + jQuery("#mec_reg_fields_"+key).remove(); +} + +function mec_handle_add_price_date_button(e) +{ + var key = jQuery(e).data('key'); + var p = jQuery('#mec_new_ticket_price_key_'+key).val(); + var html = jQuery('#mec_new_ticket_price_raw_'+key).html().replace(/:i:/g, key).replace(/:j:/g, p); + + jQuery('#mec-ticket-price-dates-'+key).append(html); + jQuery('#mec_new_ticket_price_key_'+key).val(parseInt(p)+1); + jQuery('#mec-ticket-price-dates-'+key+' .new_added').datepicker( + { + changeYear: true, + changeMonth: true, + dateFormat: datepicker_format, + gotoCurrent: true, + yearRange: 'c-3:c+5', + }); +} + +function mec_ticket_price_remove(ticket_key, price_key) +{ + jQuery("#mec_ticket_price_raw_"+ticket_key+"_"+price_key).remove(); +} + +function mec_event_fields_option_listeners() +{ + jQuery('button.mec-event-field-add-option').off('click').on('click', function() + { + var field_id = jQuery(this).data('field-id'); + var key = jQuery('#mec_new_event_field_option_key_'+field_id).val(); + var html = jQuery('#mec_event_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id); + + jQuery('#mec_event_fields_'+field_id+'_options_container').append(html); + jQuery('#mec_new_event_field_option_key_'+field_id).val(parseInt(key)+1); + }); + + if(typeof jQuery.fn.sortable !== 'undefined') + { + jQuery("#mec_event_form_fields").sortable( + { + handle: '.mec_event_field_sort' + }); + + jQuery(".mec_event_fields_options_container").sortable( + { + handle: '.mec_event_field_option_sort' + }); + } +} + +function mec_event_fields_option_remove(field_key, key) +{ + jQuery("#mec_event_fields_option_"+field_key+"_"+key).remove(); +} + +function mec_event_fields_remove(key) +{ + jQuery("#mec_event_fields_"+key).remove(); +} + +function mec_bfixed_fields_option_listeners() +{ + jQuery('button.mec-bfixed-field-add-option').off('click').on('click', function() + { + var field_id = jQuery(this).data('field-id'); + var key = jQuery('#mec_new_bfixed_field_option_key_'+field_id).val(); + var html = jQuery('#mec_bfixed_field_option').html().replace(/:i:/g, key).replace(/:fi:/g, field_id); + + jQuery('#mec_bfixed_fields_'+field_id+'_options_container').append(html); + jQuery('#mec_new_bfixed_field_option_key_'+field_id).val(parseInt(key)+1); + }); + + if(typeof jQuery.fn.sortable !== 'undefined') + { + jQuery("#mec_bfixed_form_fields").sortable( + { + handle: '.mec_bfixed_field_sort' + }); + + jQuery(".mec_bfixed_fields_options_container").sortable( + { + handle: '.mec_bfixed_field_option_sort' + }); + } +} + +function mec_bfixed_fields_option_remove(field_key, key) +{ + jQuery("#mec_bfixed_fields_option_"+field_key+"_"+key).remove(); +} + +function mec_bfixed_fields_remove(key) +{ + jQuery("#mec_bfixed_fields_"+key).remove(); +} + +function mec_additional_organizers_listeners() +{ + jQuery('#mec_additional_organizers_add').off('click').on('click', function() + { + var value = jQuery('.mec-additional-organizers select').val(); + var text = jQuery('.mec-additional-organizers select option:selected').text(); + + var sortLabel = jQuery(this).data('sort-label'); + var removeLabel = jQuery(this).data('remove-label'); + + jQuery('.mec-additional-organizers-list').append('
  • '+sortLabel+' '+removeLabel+''+text+'
  • '); + + mec_additional_organizers_listeners(); + }); + + if(typeof jQuery.fn.sortable !== 'undefined') + { + jQuery(".mec-additional-organizers-list").sortable( + { + handle: '.mec-additional-organizer-sort' + }); + } +} + +function mec_additional_organizers_remove(element) +{ + jQuery(element).parent().remove(); +} + +function mec_faq_remove(key) +{ + jQuery("#mec_faq_row"+key).remove(); +} \ No newline at end of file diff --git a/assets/js/flipcount-divi.js b/assets/js/flipcount-divi.js new file mode 100755 index 0000000..2d18f23 --- /dev/null +++ b/assets/js/flipcount-divi.js @@ -0,0 +1,1954 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function (e, t) { "use strict"; "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function (C, e) { "use strict"; var t = [], r = Object.getPrototypeOf, s = t.slice, g = t.flat ? function (e) { return t.flat.call(e) } : function (e) { return t.concat.apply([], e) }, u = t.push, i = t.indexOf, n = {}, o = n.toString, v = n.hasOwnProperty, a = v.toString, l = a.call(Object), y = {}, m = function (e) { return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item }, x = function (e) { return null != e && e === e.window }, E = C.document, c = { type: !0, src: !0, nonce: !0, noModule: !0 }; function b(e, t, n) { var r, i, o = (n = n || E).createElement("script"); if (o.text = e, t) for (r in c) (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); n.head.appendChild(o).parentNode.removeChild(o) } function w(e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[o.call(e)] || "object" : typeof e } var f = "3.6.0", S = function (e, t) { return new S.fn.init(e, t) }; function p(e) { var t = !!e && "length" in e && e.length, n = w(e); return !m(e) && !x(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) } S.fn = S.prototype = { jquery: f, constructor: S, length: 0, toArray: function () { return s.call(this) }, get: function (e) { return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e] }, pushStack: function (e) { var t = S.merge(this.constructor(), e); return t.prevObject = this, t }, each: function (e) { return S.each(this, e) }, map: function (n) { return this.pushStack(S.map(this, function (e, t) { return n.call(e, t, e) })) }, slice: function () { return this.pushStack(s.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, even: function () { return this.pushStack(S.grep(this, function (e, t) { return (t + 1) % 2 })) }, odd: function () { return this.pushStack(S.grep(this, function (e, t) { return t % 2 })) }, eq: function (e) { var t = this.length, n = +e + (e < 0 ? t : 0); return this.pushStack(0 <= n && n < t ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: u, sort: t.sort, splice: t.splice }, S.extend = S.fn.extend = function () { var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || m(a) || (a = {}), s === u && (a = this, s--); s < u; s++)if (null != (e = arguments[s])) for (t in e) r = e[t], "__proto__" !== t && a !== r && (l && r && (S.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || S.isPlainObject(n) ? n : {}, i = !1, a[t] = S.extend(l, o, r)) : void 0 !== r && (a[t] = r)); return a }, S.extend({ expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { throw new Error(e) }, noop: function () { }, isPlainObject: function (e) { var t, n; return !(!e || "[object Object]" !== o.call(e)) && (!(t = r(e)) || "function" == typeof (n = v.call(t, "constructor") && t.constructor) && a.call(n) === l) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, globalEval: function (e, t, n) { b(e, { nonce: t && t.nonce }, n) }, each: function (e, t) { var n, r = 0; if (p(e)) { for (n = e.length; r < n; r++)if (!1 === t.call(e[r], r, e[r])) break } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; return e }, makeArray: function (e, t) { var n = t || []; return null != e && (p(Object(e)) ? S.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : i.call(t, e, n) }, merge: function (e, t) { for (var n = +t.length, r = 0, i = e.length; r < n; r++)e[i++] = t[r]; return e.length = i, e }, grep: function (e, t, n) { for (var r = [], i = 0, o = e.length, a = !n; i < o; i++)!t(e[i], i) !== a && r.push(e[i]); return r }, map: function (e, t, n) { var r, i, o = 0, a = []; if (p(e)) for (r = e.length; o < r; o++)null != (i = t(e[o], o, n)) && a.push(i); else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); return g(a) }, guid: 1, support: y }), "function" == typeof Symbol && (S.fn[Symbol.iterator] = t[Symbol.iterator]), S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { n["[object " + t + "]"] = t.toLowerCase() }); var d = function (n) { var e, d, b, o, i, h, f, g, w, u, l, T, C, a, E, v, s, c, y, S = "sizzle" + 1 * new Date, p = n.document, k = 0, r = 0, m = ue(), x = ue(), A = ue(), N = ue(), j = function (e, t) { return e === t && (l = !0), 0 }, D = {}.hasOwnProperty, t = [], q = t.pop, L = t.push, H = t.push, O = t.slice, P = function (e, t) { for (var n = 0, r = e.length; n < r; n++)if (e[n] === t) return n; return -1 }, R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", M = "[\\x20\\t\\r\\n\\f]", I = "(?:\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", W = "\\[" + M + "*(" + I + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + I + "))|)" + M + "*\\]", F = ":(" + I + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + W + ")*)|.*)\\)|)", B = new RegExp(M + "+", "g"), $ = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), _ = new RegExp("^" + M + "*," + M + "*"), z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), U = new RegExp(M + "|>"), X = new RegExp(F), V = new RegExp("^" + I + "$"), G = { ID: new RegExp("^#(" + I + ")"), CLASS: new RegExp("^\\.(" + I + ")"), TAG: new RegExp("^(" + I + "|[*])"), ATTR: new RegExp("^" + W), PSEUDO: new RegExp("^" + F), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), bool: new RegExp("^(?:" + R + ")$", "i"), needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") }, Y = /HTML$/i, Q = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, ee = /[+~]/, te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), ne = function (e, t) { var n = "0x" + e.slice(1) - 65536; return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) }, re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ie = function (e, t) { return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e }, oe = function () { T() }, ae = be(function (e) { return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase() }, { dir: "parentNode", next: "legend" }); try { H.apply(t = O.call(p.childNodes), p.childNodes), t[p.childNodes.length].nodeType } catch (e) { H = { apply: t.length ? function (e, t) { L.apply(e, O.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function se(t, e, n, r) { var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; if (!r && (T(e), e = e || C, E)) { if (11 !== p && (u = Z.exec(t))) if (i = u[1]) { if (9 === p) { if (!(a = e.getElementById(i))) return n; if (a.id === i) return n.push(a), n } else if (f && (a = f.getElementById(i)) && y(e, a) && a.id === i) return n.push(a), n } else { if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; if ((i = u[3]) && d.getElementsByClassName && e.getElementsByClassName) return H.apply(n, e.getElementsByClassName(i)), n } if (d.qsa && !N[t + " "] && (!v || !v.test(t)) && (1 !== p || "object" !== e.nodeName.toLowerCase())) { if (c = t, f = e, 1 === p && (U.test(t) || z.test(t))) { (f = ee.test(t) && ye(e.parentNode) || e) === e && d.scope || ((s = e.getAttribute("id")) ? s = s.replace(re, ie) : e.setAttribute("id", s = S)), o = (l = h(t)).length; while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); c = l.join(",") } try { return H.apply(n, f.querySelectorAll(c)), n } catch (e) { N(t, !0) } finally { s === S && e.removeAttribute("id") } } } return g(t.replace($, "$1"), e, n, r) } function ue() { var r = []; return function e(t, n) { return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n } } function le(e) { return e[S] = !0, e } function ce(e) { var t = C.createElement("fieldset"); try { return !!e(t) } catch (e) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function fe(e, t) { var n = e.split("|"), r = n.length; while (r--) b.attrHandle[n[r]] = t } function pe(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function de(t) { return function (e) { return "input" === e.nodeName.toLowerCase() && e.type === t } } function he(n) { return function (e) { var t = e.nodeName.toLowerCase(); return ("input" === t || "button" === t) && e.type === n } } function ge(t) { return function (e) { return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && ae(e) === t : e.disabled === t : "label" in e && e.disabled === t } } function ve(a) { return le(function (o) { return o = +o, le(function (e, t) { var n, r = a([], e.length, o), i = r.length; while (i--) e[n = r[i]] && (e[n] = !(t[n] = e[n])) }) }) } function ye(e) { return e && "undefined" != typeof e.getElementsByTagName && e } for (e in d = se.support = {}, i = se.isXML = function (e) { var t = e && e.namespaceURI, n = e && (e.ownerDocument || e).documentElement; return !Y.test(t || n && n.nodeName || "HTML") }, T = se.setDocument = function (e) { var t, n, r = e ? e.ownerDocument || e : p; return r != C && 9 === r.nodeType && r.documentElement && (a = (C = r).documentElement, E = !i(C), p != C && (n = C.defaultView) && n.top !== n && (n.addEventListener ? n.addEventListener("unload", oe, !1) : n.attachEvent && n.attachEvent("onunload", oe)), d.scope = ce(function (e) { return a.appendChild(e).appendChild(C.createElement("div")), "undefined" != typeof e.querySelectorAll && !e.querySelectorAll(":scope fieldset div").length }), d.attributes = ce(function (e) { return e.className = "i", !e.getAttribute("className") }), d.getElementsByTagName = ce(function (e) { return e.appendChild(C.createComment("")), !e.getElementsByTagName("*").length }), d.getElementsByClassName = K.test(C.getElementsByClassName), d.getById = ce(function (e) { return a.appendChild(e).id = S, !C.getElementsByName || !C.getElementsByName(S).length }), d.getById ? (b.filter.ID = function (e) { var t = e.replace(te, ne); return function (e) { return e.getAttribute("id") === t } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && E) { var n = t.getElementById(e); return n ? [n] : [] } }) : (b.filter.ID = function (e) { var n = e.replace(te, ne); return function (e) { var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); return t && t.value === n } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && E) { var n, r, i, o = t.getElementById(e); if (o) { if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; i = t.getElementsByName(e), r = 0; while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] } return [] } }), b.find.TAG = d.getElementsByTagName ? function (e, t) { return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : d.qsa ? t.querySelectorAll(e) : void 0 } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, b.find.CLASS = d.getElementsByClassName && function (e, t) { if ("undefined" != typeof t.getElementsByClassName && E) return t.getElementsByClassName(e) }, s = [], v = [], (d.qsa = K.test(C.querySelectorAll)) && (ce(function (e) { var t; a.appendChild(e).innerHTML = "
    ", e.querySelectorAll("[msallowcapture^='']").length && v.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || v.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll("[id~=" + S + "-]").length || v.push("~="), (t = C.createElement("input")).setAttribute("name", ""), e.appendChild(t), e.querySelectorAll("[name='']").length || v.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), e.querySelectorAll(":checked").length || v.push(":checked"), e.querySelectorAll("a#" + S + "+*").length || v.push(".#.+[+~]"), e.querySelectorAll("\\\f"), v.push("[\\r\\n\\f]") }), ce(function (e) { e.innerHTML = ""; var t = C.createElement("input"); t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && v.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && v.push(":enabled", ":disabled"), a.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && v.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), v.push(",.*:") })), (d.matchesSelector = K.test(c = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.oMatchesSelector || a.msMatchesSelector)) && ce(function (e) { d.disconnectedMatch = c.call(e, "*"), c.call(e, "[s!='']:x"), s.push("!=", F) }), v = v.length && new RegExp(v.join("|")), s = s.length && new RegExp(s.join("|")), t = K.test(a.compareDocumentPosition), y = t || K.test(a.contains) ? function (e, t) { var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, j = t ? function (e, t) { if (e === t) return l = !0, 0; var n = !e.compareDocumentPosition - !t.compareDocumentPosition; return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !d.sortDetached && t.compareDocumentPosition(e) === n ? e == C || e.ownerDocument == p && y(p, e) ? -1 : t == C || t.ownerDocument == p && y(p, t) ? 1 : u ? P(u, e) - P(u, t) : 0 : 4 & n ? -1 : 1) } : function (e, t) { if (e === t) return l = !0, 0; var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], s = [t]; if (!i || !o) return e == C ? -1 : t == C ? 1 : i ? -1 : o ? 1 : u ? P(u, e) - P(u, t) : 0; if (i === o) return pe(e, t); n = e; while (n = n.parentNode) a.unshift(n); n = t; while (n = n.parentNode) s.unshift(n); while (a[r] === s[r]) r++; return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0 }), C }, se.matches = function (e, t) { return se(e, null, null, t) }, se.matchesSelector = function (e, t) { if (T(e), d.matchesSelector && E && !N[t + " "] && (!s || !s.test(t)) && (!v || !v.test(t))) try { var n = c.call(e, t); if (n || d.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n } catch (e) { N(t, !0) } return 0 < se(t, C, null, [e]).length }, se.contains = function (e, t) { return (e.ownerDocument || e) != C && T(e), y(e, t) }, se.attr = function (e, t) { (e.ownerDocument || e) != C && T(e); var n = b.attrHandle[t.toLowerCase()], r = n && D.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !E) : void 0; return void 0 !== r ? r : d.attributes || !E ? e.getAttribute(t) : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }, se.escape = function (e) { return (e + "").replace(re, ie) }, se.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, se.uniqueSort = function (e) { var t, n = [], r = 0, i = 0; if (l = !d.detectDuplicates, u = !d.sortStable && e.slice(0), e.sort(j), l) { while (t = e[i++]) t === e[i] && (r = n.push(i)); while (r--) e.splice(n[r], 1) } return u = null, e }, o = se.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += o(e) } else if (3 === i || 4 === i) return e.nodeValue } else while (t = e[r++]) n += o(t); return n }, (b = se.selectors = { cacheLength: 50, createPseudo: le, match: G, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(te, ne), e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || se.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && se.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[6] && e[2]; return G.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = h(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(te, ne).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = m[e + " "]; return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && m(e, function (e) { return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") }) }, ATTR: function (n, r, i) { return function (e) { var t = se.attr(e, n); return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace(B, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) } }, CHILD: function (h, e, t, g, v) { var y = "nth" !== h.slice(0, 3), m = "last" !== h.slice(-4), x = "of-type" === e; return 1 === g && 0 === v ? function (e) { return !!e.parentNode } : function (e, t, n) { var r, i, o, a, s, u, l = y !== m ? "nextSibling" : "previousSibling", c = e.parentNode, f = x && e.nodeName.toLowerCase(), p = !n && !x, d = !1; if (c) { if (y) { while (l) { a = e; while (a = a[l]) if (x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) return !1; u = l = "only" === h && !u && "nextSibling" } return !0 } if (u = [m ? c.firstChild : c.lastChild], m && p) { d = (s = (r = (i = (o = (a = c)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && r[2], a = s && c.childNodes[s]; while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if (1 === a.nodeType && ++d && a === e) { i[h] = [k, s, d]; break } } else if (p && (d = s = (r = (i = (o = (a = e)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), !1 === d) while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if ((x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) && ++d && (p && ((i = (o = a[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] = [k, d]), a === e)) break; return (d -= v) === g || d % g == 0 && 0 <= d / g } } }, PSEUDO: function (e, o) { var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || se.error("unsupported pseudo: " + e); return a[S] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? le(function (e, t) { var n, r = a(e, o), i = r.length; while (i--) e[n = P(e, r[i])] = !(t[n] = r[i]) }) : function (e) { return a(e, 0, t) }) : a } }, pseudos: { not: le(function (e) { var r = [], i = [], s = f(e.replace($, "$1")); return s[S] ? le(function (e, t, n, r) { var i, o = s(e, null, r, []), a = e.length; while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) }) : function (e, t, n) { return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop() } }), has: le(function (t) { return function (e) { return 0 < se(t, e).length } }), contains: le(function (t) { return t = t.replace(te, ne), function (e) { return -1 < (e.textContent || o(e)).indexOf(t) } }), lang: le(function (n) { return V.test(n || "") || se.error("unsupported lang: " + n), n = n.replace(te, ne).toLowerCase(), function (e) { var t; do { if (t = E ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") } while ((e = e.parentNode) && 1 === e.nodeType); return !1 } }), target: function (e) { var t = n.location && n.location.hash; return t && t.slice(1) === e.id }, root: function (e) { return e === a }, focus: function (e) { return e === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: ge(!1), disabled: ge(!0), checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeType < 6) return !1; return !0 }, parent: function (e) { return !b.pseudos.empty(e) }, header: function (e) { return J.test(e.nodeName) }, input: function (e) { return Q.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) }, first: ve(function () { return [0] }), last: ve(function (e, t) { return [t - 1] }), eq: ve(function (e, t, n) { return [n < 0 ? n + t : n] }), even: ve(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: ve(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: ve(function (e, t, n) { for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;)e.push(r); return e }), gt: ve(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }).pseudos.nth = b.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) b.pseudos[e] = de(e); for (e in { submit: !0, reset: !0 }) b.pseudos[e] = he(e); function me() { } function xe(e) { for (var t = 0, n = e.length, r = ""; t < n; t++)r += e[t].value; return r } function be(s, e, t) { var u = e.dir, l = e.next, c = l || u, f = t && "parentNode" === c, p = r++; return e.first ? function (e, t, n) { while (e = e[u]) if (1 === e.nodeType || f) return s(e, t, n); return !1 } : function (e, t, n) { var r, i, o, a = [k, p]; if (n) { while (e = e[u]) if ((1 === e.nodeType || f) && s(e, t, n)) return !0 } else while (e = e[u]) if (1 === e.nodeType || f) if (i = (o = e[S] || (e[S] = {}))[e.uniqueID] || (o[e.uniqueID] = {}), l && l === e.nodeName.toLowerCase()) e = e[u] || e; else { if ((r = i[c]) && r[0] === k && r[1] === p) return a[2] = r[2]; if ((i[c] = a)[2] = s(e, t, n)) return !0 } return !1 } } function we(i) { return 1 < i.length ? function (e, t, n) { var r = i.length; while (r--) if (!i[r](e, t, n)) return !1; return !0 } : i[0] } function Te(e, t, n, r, i) { for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)(o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); return a } function Ce(d, h, g, v, y, e) { return v && !v[S] && (v = Ce(v)), y && !y[S] && (y = Ce(y, e)), le(function (e, t, n, r) { var i, o, a, s = [], u = [], l = t.length, c = e || function (e, t, n) { for (var r = 0, i = t.length; r < i; r++)se(e, t[r], n); return n }(h || "*", n.nodeType ? [n] : n, []), f = !d || !e && h ? c : Te(c, s, d, n, r), p = g ? y || (e ? d : l || v) ? [] : t : f; if (g && g(f, p, n, r), v) { i = Te(p, u), v(i, [], n, r), o = i.length; while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)) } if (e) { if (y || d) { if (y) { i = [], o = p.length; while (o--) (a = p[o]) && i.push(f[o] = a); y(null, p = [], i, r) } o = p.length; while (o--) (a = p[o]) && -1 < (i = y ? P(e, a) : s[o]) && (e[i] = !(t[i] = a)) } } else p = Te(p === t ? p.splice(l, p.length) : p), y ? y(null, t, p, r) : H.apply(t, p) }) } function Ee(e) { for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = be(function (e) { return e === i }, a, !0), l = be(function (e) { return -1 < P(i, e) }, a, !0), c = [function (e, t, n) { var r = !o && (n || t !== w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); return i = null, r }]; s < r; s++)if (t = b.relative[e[s].type]) c = [be(we(c), t)]; else { if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { for (n = ++s; n < r; n++)if (b.relative[e[n].type]) break; return Ce(1 < s && we(c), 1 < s && xe(e.slice(0, s - 1).concat({ value: " " === e[s - 2].type ? "*" : "" })).replace($, "$1"), t, s < n && Ee(e.slice(s, n)), n < r && Ee(e = e.slice(n)), n < r && xe(e)) } c.push(t) } return we(c) } return me.prototype = b.filters = b.pseudos, b.setFilters = new me, h = se.tokenize = function (e, t) { var n, r, i, o, a, s, u, l = x[e + " "]; if (l) return t ? 0 : l.slice(0); a = e, s = [], u = b.preFilter; while (a) { for (o in n && !(r = _.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = z.exec(a)) && (n = r.shift(), i.push({ value: n, type: r[0].replace($, " ") }), a = a.slice(n.length)), b.filter) !(r = G[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ value: n, type: o, matches: r }), a = a.slice(n.length)); if (!n) break } return t ? a.length : a ? se.error(e) : x(e, s).slice(0) }, f = se.compile = function (e, t) { var n, v, y, m, x, r, i = [], o = [], a = A[e + " "]; if (!a) { t || (t = h(e)), n = t.length; while (n--) (a = Ee(t[n]))[S] ? i.push(a) : o.push(a); (a = A(e, (v = o, m = 0 < (y = i).length, x = 0 < v.length, r = function (e, t, n, r, i) { var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), h = k += null == p ? 1 : Math.random() || .1, g = d.length; for (i && (w = t == C || t || i); l !== g && null != (o = d[l]); l++) { if (x && o) { a = 0, t || o.ownerDocument == C || (T(o), n = !E); while (s = v[a++]) if (s(o, t || C, n)) { r.push(o); break } i && (k = h) } m && ((o = !s && o) && u--, e && c.push(o)) } if (u += l, m && l !== u) { a = 0; while (s = y[a++]) s(c, f, t, n); if (e) { if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); f = Te(f) } H.apply(r, f), i && !e && 0 < f.length && 1 < u + y.length && se.uniqueSort(r) } return i && (k = h, w = p), c }, m ? le(r) : r))).selector = e } return a }, g = se.select = function (e, t, n, r) { var i, o, a, s, u, l = "function" == typeof e && e, c = !r && h(e = l.selector || e); if (n = n || [], 1 === c.length) { if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && E && b.relative[o[1].type]) { if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) return n; l && (t = t.parentNode), e = e.slice(o.shift().value.length) } i = G.needsContext.test(e) ? 0 : o.length; while (i--) { if (a = o[i], b.relative[s = a.type]) break; if ((u = b.find[s]) && (r = u(a.matches[0].replace(te, ne), ee.test(o[0].type) && ye(t.parentNode) || t))) { if (o.splice(i, 1), !(e = r.length && xe(o))) return H.apply(n, r), n; break } } } return (l || f(e, c))(r, t, !E, n, !t || ee.test(e) && ye(t.parentNode) || t), n }, d.sortStable = S.split("").sort(j).join("") === S, d.detectDuplicates = !!l, T(), d.sortDetached = ce(function (e) { return 1 & e.compareDocumentPosition(C.createElement("fieldset")) }), ce(function (e) { return e.innerHTML = "", "#" === e.firstChild.getAttribute("href") }) || fe("type|href|height|width", function (e, t, n) { if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), d.attributes && ce(function (e) { return e.innerHTML = "", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || fe("value", function (e, t, n) { if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue }), ce(function (e) { return null == e.getAttribute("disabled") }) || fe(R, function (e, t, n) { var r; if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }), se }(C); S.find = d, S.expr = d.selectors, S.expr[":"] = S.expr.pseudos, S.uniqueSort = S.unique = d.uniqueSort, S.text = d.getText, S.isXMLDoc = d.isXML, S.contains = d.contains, S.escapeSelector = d.escape; var h = function (e, t, n) { var r = [], i = void 0 !== n; while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { if (i && S(e).is(n)) break; r.push(e) } return r }, T = function (e, t) { for (var n = []; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e); return n }, k = S.expr.match.needsContext; function A(e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() } var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function j(e, n, r) { return m(n) ? S.grep(e, function (e, t) { return !!n.call(e, t, e) !== r }) : n.nodeType ? S.grep(e, function (e) { return e === n !== r }) : "string" != typeof n ? S.grep(e, function (e) { return -1 < i.call(n, e) !== r }) : S.filter(n, e, r) } S.filter = function (e, t, n) { var r = t[0]; return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? S.find.matchesSelector(r, e) ? [r] : [] : S.find.matches(e, S.grep(t, function (e) { return 1 === e.nodeType })) }, S.fn.extend({ find: function (e) { var t, n, r = this.length, i = this; if ("string" != typeof e) return this.pushStack(S(e).filter(function () { for (t = 0; t < r; t++)if (S.contains(i[t], this)) return !0 })); for (n = this.pushStack([]), t = 0; t < r; t++)S.find(e, i[t], n); return 1 < r ? S.uniqueSort(n) : n }, filter: function (e) { return this.pushStack(j(this, e || [], !1)) }, not: function (e) { return this.pushStack(j(this, e || [], !0)) }, is: function (e) { return !!j(this, "string" == typeof e && k.test(e) ? S(e) : e || [], !1).length } }); var D, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; (S.fn.init = function (e, t, n) { var r, i; if (!e) return this; if (n = n || D, "string" == typeof e) { if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : q.exec(e)) || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (r[1]) { if (t = t instanceof S ? t[0] : t, S.merge(this, S.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : E, !0)), N.test(r[1]) && S.isPlainObject(t)) for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); return this } return (i = E.getElementById(r[2])) && (this[0] = i, this.length = 1), this } return e.nodeType ? (this[0] = e, this.length = 1, this) : m(e) ? void 0 !== n.ready ? n.ready(e) : e(S) : S.makeArray(e, this) }).prototype = S.fn, D = S(E); var L = /^(?:parents|prev(?:Until|All))/, H = { children: !0, contents: !0, next: !0, prev: !0 }; function O(e, t) { while ((e = e[t]) && 1 !== e.nodeType); return e } S.fn.extend({ has: function (e) { var t = S(e, this), n = t.length; return this.filter(function () { for (var e = 0; e < n; e++)if (S.contains(this, t[e])) return !0 }) }, closest: function (e, t) { var n, r = 0, i = this.length, o = [], a = "string" != typeof e && S(e); if (!k.test(e)) for (; r < i; r++)for (n = this[r]; n && n !== t; n = n.parentNode)if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && S.find.matchesSelector(n, e))) { o.push(n); break } return this.pushStack(1 < o.length ? S.uniqueSort(o) : o) }, index: function (e) { return e ? "string" == typeof e ? i.call(S(e), this[0]) : i.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (e, t) { return this.pushStack(S.uniqueSort(S.merge(this.get(), S(e, t)))) }, addBack: function (e) { return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) } }), S.each({ parent: function (e) { var t = e.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (e) { return h(e, "parentNode") }, parentsUntil: function (e, t, n) { return h(e, "parentNode", n) }, next: function (e) { return O(e, "nextSibling") }, prev: function (e) { return O(e, "previousSibling") }, nextAll: function (e) { return h(e, "nextSibling") }, prevAll: function (e) { return h(e, "previousSibling") }, nextUntil: function (e, t, n) { return h(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return h(e, "previousSibling", n) }, siblings: function (e) { return T((e.parentNode || {}).firstChild, e) }, children: function (e) { return T(e.firstChild) }, contents: function (e) { return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (A(e, "template") && (e = e.content || e), S.merge([], e.childNodes)) } }, function (r, i) { S.fn[r] = function (e, t) { var n = S.map(this, i, e); return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = S.filter(t, n)), 1 < this.length && (H[r] || S.uniqueSort(n), L.test(r) && n.reverse()), this.pushStack(n) } }); var P = /[^\x20\t\r\n\f]+/g; function R(e) { return e } function M(e) { throw e } function I(e, t, n, r) { var i; try { e && m(i = e.promise) ? i.call(e).done(t).fail(n) : e && m(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) } catch (e) { n.apply(void 0, [e]) } } S.Callbacks = function (r) { var e, n; r = "string" == typeof r ? (e = r, n = {}, S.each(e.match(P) || [], function (e, t) { n[t] = !0 }), n) : S.extend({}, r); var i, t, o, a, s = [], u = [], l = -1, c = function () { for (a = a || r.once, o = i = !0; u.length; l = -1) { t = u.shift(); while (++l < s.length) !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1) } r.memory || (t = !1), i = !1, a && (s = t ? [] : "") }, f = { add: function () { return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) { S.each(e, function (e, t) { m(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== w(t) && n(t) }) }(arguments), t && !i && c()), this }, remove: function () { return S.each(arguments, function (e, t) { var n; while (-1 < (n = S.inArray(t, s, n))) s.splice(n, 1), n <= l && l-- }), this }, has: function (e) { return e ? -1 < S.inArray(e, s) : 0 < s.length }, empty: function () { return s && (s = []), this }, disable: function () { return a = u = [], s = t = "", this }, disabled: function () { return !s }, lock: function () { return a = u = [], t || i || (s = t = ""), this }, locked: function () { return !!a }, fireWith: function (e, t) { return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this }, fire: function () { return f.fireWith(this, arguments), this }, fired: function () { return !!o } }; return f }, S.extend({ Deferred: function (e) { var o = [["notify", "progress", S.Callbacks("memory"), S.Callbacks("memory"), 2], ["resolve", "done", S.Callbacks("once memory"), S.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", S.Callbacks("once memory"), S.Callbacks("once memory"), 1, "rejected"]], i = "pending", a = { state: function () { return i }, always: function () { return s.done(arguments).fail(arguments), this }, "catch": function (e) { return a.then(null, e) }, pipe: function () { var i = arguments; return S.Deferred(function (r) { S.each(o, function (e, t) { var n = m(i[t[4]]) && i[t[4]]; s[t[1]](function () { var e = n && n.apply(this, arguments); e && m(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) }) }), i = null }).promise() }, then: function (t, n, r) { var u = 0; function l(i, o, a, s) { return function () { var n = this, r = arguments, e = function () { var e, t; if (!(i < u)) { if ((e = a.apply(n, r)) === o.promise()) throw new TypeError("Thenable self-resolution"); t = e && ("object" == typeof e || "function" == typeof e) && e.then, m(t) ? s ? t.call(e, l(u, o, R, s), l(u, o, M, s)) : (u++, t.call(e, l(u, o, R, s), l(u, o, M, s), l(u, o, R, o.notifyWith))) : (a !== R && (n = void 0, r = [e]), (s || o.resolveWith)(n, r)) } }, t = s ? e : function () { try { e() } catch (e) { S.Deferred.exceptionHook && S.Deferred.exceptionHook(e, t.stackTrace), u <= i + 1 && (a !== M && (n = void 0, r = [e]), o.rejectWith(n, r)) } }; i ? t() : (S.Deferred.getStackHook && (t.stackTrace = S.Deferred.getStackHook()), C.setTimeout(t)) } } return S.Deferred(function (e) { o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), o[1][3].add(l(0, e, m(t) ? t : R)), o[2][3].add(l(0, e, m(n) ? n : M)) }).promise() }, promise: function (e) { return null != e ? S.extend(e, a) : a } }, s = {}; return S.each(o, function (e, t) { var n = t[2], r = t[5]; a[t[1]] = n.add, r && n.add(function () { i = r }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), n.add(t[3].fire), s[t[0]] = function () { return s[t[0] + "With"](this === s ? void 0 : this, arguments), this }, s[t[0] + "With"] = n.fireWith }), a.promise(s), e && e.call(s, s), s }, when: function (e) { var n = arguments.length, t = n, r = Array(t), i = s.call(arguments), o = S.Deferred(), a = function (t) { return function (e) { r[t] = this, i[t] = 1 < arguments.length ? s.call(arguments) : e, --n || o.resolveWith(r, i) } }; if (n <= 1 && (I(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || m(i[t] && i[t].then))) return o.then(); while (t--) I(i[t], a(t), o.reject); return o.promise() } }); var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; S.Deferred.exceptionHook = function (e, t) { C.console && C.console.warn && e && W.test(e.name) && C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) }, S.readyException = function (e) { C.setTimeout(function () { throw e }) }; var F = S.Deferred(); function B() { E.removeEventListener("DOMContentLoaded", B), C.removeEventListener("load", B), S.ready() } S.fn.ready = function (e) { return F.then(e)["catch"](function (e) { S.readyException(e) }), this }, S.extend({ isReady: !1, readyWait: 1, ready: function (e) { (!0 === e ? --S.readyWait : S.isReady) || (S.isReady = !0) !== e && 0 < --S.readyWait || F.resolveWith(E, [S]) } }), S.ready.then = F.then, "complete" === E.readyState || "loading" !== E.readyState && !E.documentElement.doScroll ? C.setTimeout(S.ready) : (E.addEventListener("DOMContentLoaded", B), C.addEventListener("load", B)); var $ = function (e, t, n, r, i, o, a) { var s = 0, u = e.length, l = null == n; if ("object" === w(n)) for (s in i = !0, n) $(e, t, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, m(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(S(e), n) })), t)) for (; s < u; s++)t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); return i ? e : l ? t.call(e) : u ? t(e[0], n) : o }, _ = /^-ms-/, z = /-([a-z])/g; function U(e, t) { return t.toUpperCase() } function X(e) { return e.replace(_, "ms-").replace(z, U) } var V = function (e) { return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType }; function G() { this.expando = S.expando + G.uid++ } G.uid = 1, G.prototype = { cache: function (e) { var t = e[this.expando]; return t || (t = {}, V(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), t }, set: function (e, t, n) { var r, i = this.cache(e); if ("string" == typeof t) i[X(t)] = n; else for (r in t) i[X(r)] = t[r]; return i }, get: function (e, t) { return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][X(t)] }, access: function (e, t, n) { return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) }, remove: function (e, t) { var n, r = e[this.expando]; if (void 0 !== r) { if (void 0 !== t) { n = (t = Array.isArray(t) ? t.map(X) : (t = X(t)) in r ? [t] : t.match(P) || []).length; while (n--) delete r[t[n]] } (void 0 === t || S.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) } }, hasData: function (e) { var t = e[this.expando]; return void 0 !== t && !S.isEmptyObject(t) } }; var Y = new G, Q = new G, J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, K = /[A-Z]/g; function Z(e, t, n) { var r, i; if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(K, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { try { n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : J.test(i) ? JSON.parse(i) : i) } catch (e) { } Q.set(e, t, n) } else n = void 0; return n } S.extend({ hasData: function (e) { return Q.hasData(e) || Y.hasData(e) }, data: function (e, t, n) { return Q.access(e, t, n) }, removeData: function (e, t) { Q.remove(e, t) }, _data: function (e, t, n) { return Y.access(e, t, n) }, _removeData: function (e, t) { Y.remove(e, t) } }), S.fn.extend({ data: function (n, e) { var t, r, i, o = this[0], a = o && o.attributes; if (void 0 === n) { if (this.length && (i = Q.get(o), 1 === o.nodeType && !Y.get(o, "hasDataAttrs"))) { t = a.length; while (t--) a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = X(r.slice(5)), Z(o, r, i[r])); Y.set(o, "hasDataAttrs", !0) } return i } return "object" == typeof n ? this.each(function () { Q.set(this, n) }) : $(this, function (e) { var t; if (o && void 0 === e) return void 0 !== (t = Q.get(o, n)) ? t : void 0 !== (t = Z(o, n)) ? t : void 0; this.each(function () { Q.set(this, n, e) }) }, null, e, 1 < arguments.length, null, !0) }, removeData: function (e) { return this.each(function () { Q.remove(this, e) }) } }), S.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = Y.get(e, t), n && (!r || Array.isArray(n) ? r = Y.access(e, t, S.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = S.queue(e, t), r = n.length, i = n.shift(), o = S._queueHooks(e, t); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function () { S.dequeue(e, t) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return Y.get(e, n) || Y.access(e, n, { empty: S.Callbacks("once memory").add(function () { Y.remove(e, [t + "queue", n]) }) }) } }), S.fn.extend({ queue: function (t, n) { var e = 2; return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? S.queue(this[0], t) : void 0 === n ? this : this.each(function () { var e = S.queue(this, t, n); S._queueHooks(this, t), "fx" === t && "inprogress" !== e[0] && S.dequeue(this, t) }) }, dequeue: function (e) { return this.each(function () { S.dequeue(this, e) }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, t) { var n, r = 1, i = S.Deferred(), o = this, a = this.length, s = function () { --r || i.resolveWith(o, [o]) }; "string" != typeof e && (t = e, e = void 0), e = e || "fx"; while (a--) (n = Y.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); return s(), i.promise(t) } }); var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), ne = ["Top", "Right", "Bottom", "Left"], re = E.documentElement, ie = function (e) { return S.contains(e.ownerDocument, e) }, oe = { composed: !0 }; re.getRootNode && (ie = function (e) { return S.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument }); var ae = function (e, t) { return "none" === (e = t || e).style.display || "" === e.style.display && ie(e) && "none" === S.css(e, "display") }; function se(e, t, n, r) { var i, o, a = 20, s = r ? function () { return r.cur() } : function () { return S.css(e, t, "") }, u = s(), l = n && n[3] || (S.cssNumber[t] ? "" : "px"), c = e.nodeType && (S.cssNumber[t] || "px" !== l && +u) && te.exec(S.css(e, t)); if (c && c[3] !== l) { u /= 2, l = l || c[3], c = +u || 1; while (a--) S.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; c *= 2, S.style(e, t, c + l), n = n || [] } return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i } var ue = {}; function le(e, t) { for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++)(r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = Y.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ae(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ue[s]) || (o = a.body.appendChild(a.createElement(s)), u = S.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ue[s] = u)))) : "none" !== n && (l[c] = "none", Y.set(r, "display", n))); for (c = 0; c < f; c++)null != l[c] && (e[c].style.display = l[c]); return e } S.fn.extend({ show: function () { return le(this, !0) }, hide: function () { return le(this) }, toggle: function (e) { return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { ae(this) ? S(this).show() : S(this).hide() }) } }); var ce, fe, pe = /^(?:checkbox|radio)$/i, de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, he = /^$|^module$|\/(?:java|ecma)script/i; ce = E.createDocumentFragment().appendChild(E.createElement("div")), (fe = E.createElement("input")).setAttribute("type", "radio"), fe.setAttribute("checked", "checked"), fe.setAttribute("name", "t"), ce.appendChild(fe), y.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked, ce.innerHTML = "", y.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue, ce.innerHTML = "", y.option = !!ce.lastChild; var ge = { thead: [1, "", "
    "], col: [2, "", "
    "], tr: [2, "", "
    "], td: [3, "", "
    "], _default: [0, "", ""] }; function ve(e, t) { var n; return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && A(e, t) ? S.merge([e], n) : n } function ye(e, t) { for (var n = 0, r = e.length; n < r; n++)Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")) } ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td, y.option || (ge.optgroup = ge.option = [1, ""]); var me = /<|&#?\w+;/; function xe(e, t, n, r, i) { for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++)if ((o = e[d]) || 0 === o) if ("object" === w(o)) S.merge(p, o.nodeType ? [o] : o); else if (me.test(o)) { a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + S.htmlPrefilter(o) + u[2], c = u[0]; while (c--) a = a.lastChild; S.merge(p, a.childNodes), (a = f.firstChild).textContent = "" } else p.push(t.createTextNode(o)); f.textContent = "", d = 0; while (o = p[d++]) if (r && -1 < S.inArray(o, r)) i && i.push(o); else if (l = ie(o), a = ve(f.appendChild(o), "script"), l && ye(a), n) { c = 0; while (o = a[c++]) he.test(o.type || "") && n.push(o) } return f } var be = /^([^.]*)(?:\.(.+)|)/; function we() { return !0 } function Te() { return !1 } function Ce(e, t) { return e === function () { try { return E.activeElement } catch (e) { } }() == ("focus" === t) } function Ee(e, t, n, r, i, o) { var a, s; if ("object" == typeof t) { for (s in "string" != typeof n && (r = r || n, n = void 0), t) Ee(e, s, n, r, t[s], o); return e } if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = Te; else if (!i) return e; return 1 === o && (a = i, (i = function (e) { return S().off(e), a.apply(this, arguments) }).guid = a.guid || (a.guid = S.guid++)), e.each(function () { S.event.add(this, t, i, r, n) }) } function Se(e, i, o) { o ? (Y.set(e, i, !1), S.event.add(e, i, { namespace: !1, handler: function (e) { var t, n, r = Y.get(this, i); if (1 & e.isTrigger && this[i]) { if (r.length) (S.event.special[i] || {}).delegateType && e.stopPropagation(); else if (r = s.call(arguments), Y.set(this, i, r), t = o(this, i), this[i](), r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : n = {}, r !== n) return e.stopImmediatePropagation(), e.preventDefault(), n && n.value } else r.length && (Y.set(this, i, { value: S.event.trigger(S.extend(r[0], S.Event.prototype), r.slice(1), this) }), e.stopImmediatePropagation()) } })) : void 0 === Y.get(e, i) && S.event.add(e, i, we) } S.event = { global: {}, add: function (t, e, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, v = Y.get(t); if (V(t)) { n.handler && (n = (o = n).handler, i = o.selector), i && S.find.matchesSelector(re, i), n.guid || (n.guid = S.guid++), (u = v.events) || (u = v.events = Object.create(null)), (a = v.handle) || (a = v.handle = function (e) { return "undefined" != typeof S && S.event.triggered !== e.type ? S.event.dispatch.apply(t, arguments) : void 0 }), l = (e = (e || "").match(P) || [""]).length; while (l--) d = g = (s = be.exec(e[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = S.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = S.event.special[d] || {}, c = S.extend({ type: d, origType: g, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && S.expr.match.needsContext.test(i), namespace: h.join(".") }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), S.event.global[d] = !0) } }, remove: function (e, t, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, v = Y.hasData(e) && Y.get(e); if (v && (u = v.events)) { l = (t = (t || "").match(P) || [""]).length; while (l--) if (d = g = (s = be.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) { f = S.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, v.handle) || S.removeEvent(e, d, v.handle), delete u[d]) } else for (d in u) S.event.remove(e, d + t[l], n, r, !0); S.isEmptyObject(u) && Y.remove(e, "handle events") } }, dispatch: function (e) { var t, n, r, i, o, a, s = new Array(arguments.length), u = S.event.fix(e), l = (Y.get(this, "events") || Object.create(null))[u.type] || [], c = S.event.special[u.type] || {}; for (s[0] = u, t = 1; t < arguments.length; t++)s[t] = arguments[t]; if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { a = S.event.handlers.call(this, u, l), t = 0; while ((i = a[t++]) && !u.isPropagationStopped()) { u.currentTarget = i.elem, n = 0; while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((S.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation())) } return c.postDispatch && c.postDispatch.call(this, u), u.result } }, handlers: function (e, t) { var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) for (; l !== this; l = l.parentNode || this)if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { for (o = [], a = {}, n = 0; n < u; n++)void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < S(i, this).index(l) : S.find(i, this, null, [l]).length), a[i] && o.push(r); o.length && s.push({ elem: l, handlers: o }) } return l = this, u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s }, addProp: function (t, e) { Object.defineProperty(S.Event.prototype, t, { enumerable: !0, configurable: !0, get: m(e) ? function () { if (this.originalEvent) return e(this.originalEvent) } : function () { if (this.originalEvent) return this.originalEvent[t] }, set: function (e) { Object.defineProperty(this, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) } }) }, fix: function (e) { return e[S.expando] ? e : new S.Event(e) }, special: { load: { noBubble: !0 }, click: { setup: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click", we), !1 }, trigger: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click"), !0 }, _default: function (e) { var t = e.target; return pe.test(t.type) && t.click && A(t, "input") && Y.get(t, "click") || A(t, "a") } }, beforeunload: { postDispatch: function (e) { void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) } } } }, S.removeEvent = function (e, t, n) { e.removeEventListener && e.removeEventListener(t, n) }, S.Event = function (e, t) { if (!(this instanceof S.Event)) return new S.Event(e, t); e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? we : Te, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && S.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[S.expando] = !0 }, S.Event.prototype = { constructor: S.Event, isDefaultPrevented: Te, isPropagationStopped: Te, isImmediatePropagationStopped: Te, isSimulated: !1, preventDefault: function () { var e = this.originalEvent; this.isDefaultPrevented = we, e && !this.isSimulated && e.preventDefault() }, stopPropagation: function () { var e = this.originalEvent; this.isPropagationStopped = we, e && !this.isSimulated && e.stopPropagation() }, stopImmediatePropagation: function () { var e = this.originalEvent; this.isImmediatePropagationStopped = we, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() } }, S.each({ altKey: !0, bubbles: !0, cancelable: !0, changedTouches: !0, ctrlKey: !0, detail: !0, eventPhase: !0, metaKey: !0, pageX: !0, pageY: !0, shiftKey: !0, view: !0, "char": !0, code: !0, charCode: !0, key: !0, keyCode: !0, button: !0, buttons: !0, clientX: !0, clientY: !0, offsetX: !0, offsetY: !0, pointerId: !0, pointerType: !0, screenX: !0, screenY: !0, targetTouches: !0, toElement: !0, touches: !0, which: !0 }, S.event.addProp), S.each({ focus: "focusin", blur: "focusout" }, function (e, t) { S.event.special[e] = { setup: function () { return Se(this, e, Ce), !1 }, trigger: function () { return Se(this, e), !0 }, _default: function () { return !0 }, delegateType: t } }), S.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (e, i) { S.event.special[e] = { delegateType: i, bindType: i, handle: function (e) { var t, n = e.relatedTarget, r = e.handleObj; return n && (n === this || S.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t } } }), S.fn.extend({ on: function (e, t, n, r) { return Ee(this, e, t, n, r) }, one: function (e, t, n, r) { return Ee(this, e, t, n, r, 1) }, off: function (e, t, n) { var r, i; if (e && e.preventDefault && e.handleObj) return r = e.handleObj, S(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" == typeof e) { for (i in e) this.off(i, t, e[i]); return this } return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = Te), this.each(function () { S.event.remove(this, e, n, t) }) } }); var ke = /\s*$/g; function je(e, t) { return A(e, "table") && A(11 !== t.nodeType ? t : t.firstChild, "tr") && S(e).children("tbody")[0] || e } function De(e) { return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e } function qe(e) { return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e } function Le(e, t) { var n, r, i, o, a, s; if (1 === t.nodeType) { if (Y.hasData(e) && (s = Y.get(e).events)) for (i in Y.remove(t, "handle events"), s) for (n = 0, r = s[i].length; n < r; n++)S.event.add(t, i, s[i][n]); Q.hasData(e) && (o = Q.access(e), a = S.extend({}, o), Q.set(t, a)) } } function He(n, r, i, o) { r = g(r); var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = m(d); if (h || 1 < f && "string" == typeof d && !y.checkClone && Ae.test(d)) return n.each(function (e) { var t = n.eq(e); h && (r[0] = d.call(this, e, t.html())), He(t, r, i, o) }); if (f && (t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === e.childNodes.length && (e = t), t || o)) { for (s = (a = S.map(ve(e, "script"), De)).length; c < f; c++)u = e, c !== p && (u = S.clone(u, !0, !0), s && S.merge(a, ve(u, "script"))), i.call(n[c], u, c); if (s) for (l = a[a.length - 1].ownerDocument, S.map(a, qe), c = 0; c < s; c++)u = a[c], he.test(u.type || "") && !Y.access(u, "globalEval") && S.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? S._evalUrl && !u.noModule && S._evalUrl(u.src, { nonce: u.nonce || u.getAttribute("nonce") }, l) : b(u.textContent.replace(Ne, ""), u, l)) } return n } function Oe(e, t, n) { for (var r, i = t ? S.filter(t, e) : e, o = 0; null != (r = i[o]); o++)n || 1 !== r.nodeType || S.cleanData(ve(r)), r.parentNode && (n && ie(r) && ye(ve(r, "script")), r.parentNode.removeChild(r)); return e } S.extend({ htmlPrefilter: function (e) { return e }, clone: function (e, t, n) { var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = ie(e); if (!(y.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || S.isXMLDoc(e))) for (a = ve(c), r = 0, i = (o = ve(e)).length; r < i; r++)s = o[r], u = a[r], void 0, "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); if (t) if (n) for (o = o || ve(e), a = a || ve(c), r = 0, i = o.length; r < i; r++)Le(o[r], a[r]); else Le(e, c); return 0 < (a = ve(c, "script")).length && ye(a, !f && ve(e, "script")), c }, cleanData: function (e) { for (var t, n, r, i = S.event.special, o = 0; void 0 !== (n = e[o]); o++)if (V(n)) { if (t = n[Y.expando]) { if (t.events) for (r in t.events) i[r] ? S.event.remove(n, r) : S.removeEvent(n, r, t.handle); n[Y.expando] = void 0 } n[Q.expando] && (n[Q.expando] = void 0) } } }), S.fn.extend({ detach: function (e) { return Oe(this, e, !0) }, remove: function (e) { return Oe(this, e) }, text: function (e) { return $(this, function (e) { return void 0 === e ? S.text(this) : this.empty().each(function () { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) }) }, null, e, arguments.length) }, append: function () { return He(this, arguments, function (e) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || je(this, e).appendChild(e) }) }, prepend: function () { return He(this, arguments, function (e) { if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { var t = je(this, e); t.insertBefore(e, t.firstChild) } }) }, before: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this) }) }, after: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) }) }, empty: function () { for (var e, t = 0; null != (e = this[t]); t++)1 === e.nodeType && (S.cleanData(ve(e, !1)), e.textContent = ""); return this }, clone: function (e, t) { return e = null != e && e, t = null == t ? e : t, this.map(function () { return S.clone(this, e, t) }) }, html: function (e) { return $(this, function (e) { var t = this[0] || {}, n = 0, r = this.length; if (void 0 === e && 1 === t.nodeType) return t.innerHTML; if ("string" == typeof e && !ke.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { e = S.htmlPrefilter(e); try { for (; n < r; n++)1 === (t = this[n] || {}).nodeType && (S.cleanData(ve(t, !1)), t.innerHTML = e); t = 0 } catch (e) { } } t && this.empty().append(e) }, null, e, arguments.length) }, replaceWith: function () { var n = []; return He(this, arguments, function (e) { var t = this.parentNode; S.inArray(this, n) < 0 && (S.cleanData(ve(this)), t && t.replaceChild(e, this)) }, n) } }), S.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (e, a) { S.fn[e] = function (e) { for (var t, n = [], r = S(e), i = r.length - 1, o = 0; o <= i; o++)t = o === i ? this : this.clone(!0), S(r[o])[a](t), u.apply(n, t.get()); return this.pushStack(n) } }); var Pe = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), Re = function (e) { var t = e.ownerDocument.defaultView; return t && t.opener || (t = C), t.getComputedStyle(e) }, Me = function (e, t, n) { var r, i, o = {}; for (i in t) o[i] = e.style[i], e.style[i] = t[i]; for (i in r = n.call(e), t) e.style[i] = o[i]; return r }, Ie = new RegExp(ne.join("|"), "i"); function We(e, t, n) { var r, i, o, a, s = e.style; return (n = n || Re(e)) && ("" !== (a = n.getPropertyValue(t) || n[t]) || ie(e) || (a = S.style(e, t)), !y.pixelBoxStyles() && Pe.test(a) && Ie.test(t) && (r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o)), void 0 !== a ? a + "" : a } function Fe(e, t) { return { get: function () { if (!e()) return (this.get = t).apply(this, arguments); delete this.get } } } !function () { function e() { if (l) { u.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", re.appendChild(u).appendChild(l); var e = C.getComputedStyle(l); n = "1%" !== e.top, s = 12 === t(e.marginLeft), l.style.right = "60%", o = 36 === t(e.right), r = 36 === t(e.width), l.style.position = "absolute", i = 12 === t(l.offsetWidth / 3), re.removeChild(u), l = null } } function t(e) { return Math.round(parseFloat(e)) } var n, r, i, o, a, s, u = E.createElement("div"), l = E.createElement("div"); l.style && (l.style.backgroundClip = "content-box", l.cloneNode(!0).style.backgroundClip = "", y.clearCloneStyle = "content-box" === l.style.backgroundClip, S.extend(y, { boxSizingReliable: function () { return e(), r }, pixelBoxStyles: function () { return e(), o }, pixelPosition: function () { return e(), n }, reliableMarginLeft: function () { return e(), s }, scrollboxSize: function () { return e(), i }, reliableTrDimensions: function () { var e, t, n, r; return null == a && (e = E.createElement("table"), t = E.createElement("tr"), n = E.createElement("div"), e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", t.style.cssText = "border:1px solid", t.style.height = "1px", n.style.height = "9px", n.style.display = "block", re.appendChild(e).appendChild(t).appendChild(n), r = C.getComputedStyle(t), a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, re.removeChild(e)), a } })) }(); var Be = ["Webkit", "Moz", "ms"], $e = E.createElement("div").style, _e = {}; function ze(e) { var t = S.cssProps[e] || _e[e]; return t || (e in $e ? e : _e[e] = function (e) { var t = e[0].toUpperCase() + e.slice(1), n = Be.length; while (n--) if ((e = Be[n] + t) in $e) return e }(e) || e) } var Ue = /^(none|table(?!-c[ea]).+)/, Xe = /^--/, Ve = { position: "absolute", visibility: "hidden", display: "block" }, Ge = { letterSpacing: "0", fontWeight: "400" }; function Ye(e, t, n) { var r = te.exec(t); return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t } function Qe(e, t, n, r, i, o) { var a = "width" === t ? 1 : 0, s = 0, u = 0; if (n === (r ? "border" : "content")) return 0; for (; a < 4; a += 2)"margin" === n && (u += S.css(e, n + ne[a], !0, i)), r ? ("content" === n && (u -= S.css(e, "padding" + ne[a], !0, i)), "margin" !== n && (u -= S.css(e, "border" + ne[a] + "Width", !0, i))) : (u += S.css(e, "padding" + ne[a], !0, i), "padding" !== n ? u += S.css(e, "border" + ne[a] + "Width", !0, i) : s += S.css(e, "border" + ne[a] + "Width", !0, i)); return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), u } function Je(e, t, n) { var r = Re(e), i = (!y.boxSizingReliable() || n) && "border-box" === S.css(e, "boxSizing", !1, r), o = i, a = We(e, t, r), s = "offset" + t[0].toUpperCase() + t.slice(1); if (Pe.test(a)) { if (!n) return a; a = "auto" } return (!y.boxSizingReliable() && i || !y.reliableTrDimensions() && A(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === S.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === S.css(e, "boxSizing", !1, r), (o = s in e) && (a = e[s])), (a = parseFloat(a) || 0) + Qe(e, t, n || (i ? "border" : "content"), o, r, a) + "px" } function Ke(e, t, n, r, i) { return new Ke.prototype.init(e, t, n, r, i) } S.extend({ cssHooks: { opacity: { get: function (e, t) { if (t) { var n = We(e, "opacity"); return "" === n ? "1" : n } } } }, cssNumber: { animationIterationCount: !0, columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, gridArea: !0, gridColumn: !0, gridColumnEnd: !0, gridColumnStart: !0, gridRow: !0, gridRowEnd: !0, gridRowStart: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: {}, style: function (e, t, n, r) { if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { var i, o, a, s = X(t), u = Xe.test(t), l = e.style; if (u || (t = ze(s)), a = S.cssHooks[t] || S.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; "string" === (o = typeof n) && (i = te.exec(n)) && i[1] && (n = se(e, t, i), o = "number"), null != n && n == n && ("number" !== o || u || (n += i && i[3] || (S.cssNumber[s] ? "" : "px")), y.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) } }, css: function (e, t, n, r) { var i, o, a, s = X(t); return Xe.test(t) || (t = ze(s)), (a = S.cssHooks[t] || S.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = We(e, t, r)), "normal" === i && t in Ge && (i = Ge[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i } }), S.each(["height", "width"], function (e, u) { S.cssHooks[u] = { get: function (e, t, n) { if (t) return !Ue.test(S.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? Je(e, u, n) : Me(e, Ve, function () { return Je(e, u, n) }) }, set: function (e, t, n) { var r, i = Re(e), o = !y.scrollboxSize() && "absolute" === i.position, a = (o || n) && "border-box" === S.css(e, "boxSizing", !1, i), s = n ? Qe(e, u, n, a, i) : 0; return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - Qe(e, u, "border", !1, i) - .5)), s && (r = te.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, t = S.css(e, u)), Ye(0, t, s) } } }), S.cssHooks.marginLeft = Fe(y.reliableMarginLeft, function (e, t) { if (t) return (parseFloat(We(e, "marginLeft")) || e.getBoundingClientRect().left - Me(e, { marginLeft: 0 }, function () { return e.getBoundingClientRect().left })) + "px" }), S.each({ margin: "", padding: "", border: "Width" }, function (i, o) { S.cssHooks[i + o] = { expand: function (e) { for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++)n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; return n } }, "margin" !== i && (S.cssHooks[i + o].set = Ye) }), S.fn.extend({ css: function (e, t) { return $(this, function (e, t, n) { var r, i, o = {}, a = 0; if (Array.isArray(t)) { for (r = Re(e), i = t.length; a < i; a++)o[t[a]] = S.css(e, t[a], !1, r); return o } return void 0 !== n ? S.style(e, t, n) : S.css(e, t) }, e, t, 1 < arguments.length) } }), ((S.Tween = Ke).prototype = { constructor: Ke, init: function (e, t, n, r, i, o) { this.elem = e, this.prop = n, this.easing = i || S.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (S.cssNumber[n] ? "" : "px") }, cur: function () { var e = Ke.propHooks[this.prop]; return e && e.get ? e.get(this) : Ke.propHooks._default.get(this) }, run: function (e) { var t, n = Ke.propHooks[this.prop]; return this.options.duration ? this.pos = t = S.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : Ke.propHooks._default.set(this), this } }).init.prototype = Ke.prototype, (Ke.propHooks = { _default: { get: function (e) { var t; return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = S.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 }, set: function (e) { S.fx.step[e.prop] ? S.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !S.cssHooks[e.prop] && null == e.elem.style[ze(e.prop)] ? e.elem[e.prop] = e.now : S.style(e.elem, e.prop, e.now + e.unit) } } }).scrollTop = Ke.propHooks.scrollLeft = { set: function (e) { e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) } }, S.easing = { linear: function (e) { return e }, swing: function (e) { return .5 - Math.cos(e * Math.PI) / 2 }, _default: "swing" }, S.fx = Ke.prototype.init, S.fx.step = {}; var Ze, et, tt, nt, rt = /^(?:toggle|show|hide)$/, it = /queueHooks$/; function ot() { et && (!1 === E.hidden && C.requestAnimationFrame ? C.requestAnimationFrame(ot) : C.setTimeout(ot, S.fx.interval), S.fx.tick()) } function at() { return C.setTimeout(function () { Ze = void 0 }), Ze = Date.now() } function st(e, t) { var n, r = 0, i = { height: e }; for (t = t ? 1 : 0; r < 4; r += 2 - t)i["margin" + (n = ne[r])] = i["padding" + n] = e; return t && (i.opacity = i.width = e), i } function ut(e, t, n) { for (var r, i = (lt.tweeners[t] || []).concat(lt.tweeners["*"]), o = 0, a = i.length; o < a; o++)if (r = i[o].call(n, t, e)) return r } function lt(o, e, t) { var n, a, r = 0, i = lt.prefilters.length, s = S.Deferred().always(function () { delete u.elem }), u = function () { if (a) return !1; for (var e = Ze || at(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++)l.tweens[r].run(n); return s.notifyWith(o, [l, n, t]), n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) }, l = s.promise({ elem: o, props: S.extend({}, e), opts: S.extend(!0, { specialEasing: {}, easing: S.easing._default }, t), originalProperties: e, originalOptions: t, startTime: Ze || at(), duration: t.duration, tweens: [], createTween: function (e, t) { var n = S.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); return l.tweens.push(n), n }, stop: function (e) { var t = 0, n = e ? l.tweens.length : 0; if (a) return this; for (a = !0; t < n; t++)l.tweens[t].run(1); return e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), this } }), c = l.props; for (!function (e, t) { var n, r, i, o, a; for (n in e) if (i = t[r = X(n)], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = S.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete e[r], o) n in e || (e[n] = o[n], t[n] = i); else t[r] = i }(c, l.opts.specialEasing); r < i; r++)if (n = lt.prefilters[r].call(l, o, c, l.opts)) return m(n.stop) && (S._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n; return S.map(c, ut, l), m(l.opts.start) && l.opts.start.call(o, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), S.fx.timer(S.extend(u, { elem: o, anim: l, queue: l.opts.queue })), l } S.Animation = S.extend(lt, { tweeners: { "*": [function (e, t) { var n = this.createTween(e, t); return se(n.elem, e, te.exec(t), n), n }] }, tweener: function (e, t) { m(e) ? (t = e, e = ["*"]) : e = e.match(P); for (var n, r = 0, i = e.length; r < i; r++)n = e[r], lt.tweeners[n] = lt.tweeners[n] || [], lt.tweeners[n].unshift(t) }, prefilters: [function (e, t, n) { var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, p = this, d = {}, h = e.style, g = e.nodeType && ae(e), v = Y.get(e, "fxshow"); for (r in n.queue || (null == (a = S._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { a.unqueued || s() }), a.unqueued++, p.always(function () { p.always(function () { a.unqueued--, S.queue(e, "fx").length || a.empty.fire() }) })), t) if (i = t[r], rt.test(i)) { if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { if ("show" !== i || !v || void 0 === v[r]) continue; g = !0 } d[r] = v && v[r] || S.style(e, r) } if ((u = !S.isEmptyObject(t)) || !S.isEmptyObject(d)) for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = v && v.display) && (l = Y.get(e, "display")), "none" === (c = S.css(e, "display")) && (l ? c = l : (le([e], !0), l = e.style.display || l, c = S.css(e, "display"), le([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === S.css(e, "float") && (u || (p.done(function () { h.display = l }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] })), u = !1, d) u || (v ? "hidden" in v && (g = v.hidden) : v = Y.access(e, "fxshow", { display: l }), o && (v.hidden = !g), g && le([e], !0), p.done(function () { for (r in g || le([e]), Y.remove(e, "fxshow"), d) S.style(e, r, d[r]) })), u = ut(g ? v[r] : 0, r, p), r in v || (v[r] = u.start, g && (u.end = u.start, u.start = 0)) }], prefilter: function (e, t) { t ? lt.prefilters.unshift(e) : lt.prefilters.push(e) } }), S.speed = function (e, t, n) { var r = e && "object" == typeof e ? S.extend({}, e) : { complete: n || !n && t || m(e) && e, duration: e, easing: n && t || t && !m(t) && t }; return S.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in S.fx.speeds ? r.duration = S.fx.speeds[r.duration] : r.duration = S.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { m(r.old) && r.old.call(this), r.queue && S.dequeue(this, r.queue) }, r }, S.fn.extend({ fadeTo: function (e, t, n, r) { return this.filter(ae).css("opacity", 0).show().end().animate({ opacity: t }, e, n, r) }, animate: function (t, e, n, r) { var i = S.isEmptyObject(t), o = S.speed(e, n, r), a = function () { var e = lt(this, S.extend({}, t), o); (i || Y.get(this, "finish")) && e.stop(!0) }; return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) }, stop: function (i, e, o) { var a = function (e) { var t = e.stop; delete e.stop, t(o) }; return "string" != typeof i && (o = e, e = i, i = void 0), e && this.queue(i || "fx", []), this.each(function () { var e = !0, t = null != i && i + "queueHooks", n = S.timers, r = Y.get(this); if (t) r[t] && r[t].stop && a(r[t]); else for (t in r) r[t] && r[t].stop && it.test(t) && a(r[t]); for (t = n.length; t--;)n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), e = !1, n.splice(t, 1)); !e && o || S.dequeue(this, i) }) }, finish: function (a) { return !1 !== a && (a = a || "fx"), this.each(function () { var e, t = Y.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = S.timers, o = n ? n.length : 0; for (t.finish = !0, S.queue(this, a, []), r && r.stop && r.stop.call(this, !0), e = i.length; e--;)i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)); for (e = 0; e < o; e++)n[e] && n[e].finish && n[e].finish.call(this); delete t.finish }) } }), S.each(["toggle", "show", "hide"], function (e, r) { var i = S.fn[r]; S.fn[r] = function (e, t, n) { return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(st(r, !0), e, t, n) } }), S.each({ slideDown: st("show"), slideUp: st("hide"), slideToggle: st("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (e, r) { S.fn[e] = function (e, t, n) { return this.animate(r, e, t, n) } }), S.timers = [], S.fx.tick = function () { var e, t = 0, n = S.timers; for (Ze = Date.now(); t < n.length; t++)(e = n[t])() || n[t] !== e || n.splice(t--, 1); n.length || S.fx.stop(), Ze = void 0 }, S.fx.timer = function (e) { S.timers.push(e), S.fx.start() }, S.fx.interval = 13, S.fx.start = function () { et || (et = !0, ot()) }, S.fx.stop = function () { et = null }, S.fx.speeds = { slow: 600, fast: 200, _default: 400 }, S.fn.delay = function (r, e) { return r = S.fx && S.fx.speeds[r] || r, e = e || "fx", this.queue(e, function (e, t) { var n = C.setTimeout(e, r); t.stop = function () { C.clearTimeout(n) } }) }, tt = E.createElement("input"), nt = E.createElement("select").appendChild(E.createElement("option")), tt.type = "checkbox", y.checkOn = "" !== tt.value, y.optSelected = nt.selected, (tt = E.createElement("input")).value = "t", tt.type = "radio", y.radioValue = "t" === tt.value; var ct, ft = S.expr.attrHandle; S.fn.extend({ attr: function (e, t) { return $(this, S.attr, e, t, 1 < arguments.length) }, removeAttr: function (e) { return this.each(function () { S.removeAttr(this, e) }) } }), S.extend({ attr: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? S.prop(e, t, n) : (1 === o && S.isXMLDoc(e) || (i = S.attrHooks[t.toLowerCase()] || (S.expr.match.bool.test(t) ? ct : void 0)), void 0 !== n ? null === n ? void S.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = S.find.attr(e, t)) ? void 0 : r) }, attrHooks: { type: { set: function (e, t) { if (!y.radioValue && "radio" === t && A(e, "input")) { var n = e.value; return e.setAttribute("type", t), n && (e.value = n), t } } } }, removeAttr: function (e, t) { var n, r = 0, i = t && t.match(P); if (i && 1 === e.nodeType) while (n = i[r++]) e.removeAttribute(n) } }), ct = { set: function (e, t, n) { return !1 === t ? S.removeAttr(e, n) : e.setAttribute(n, n), n } }, S.each(S.expr.match.bool.source.match(/\w+/g), function (e, t) { var a = ft[t] || S.find.attr; ft[t] = function (e, t, n) { var r, i, o = t.toLowerCase(); return n || (i = ft[o], ft[o] = r, r = null != a(e, t, n) ? o : null, ft[o] = i), r } }); var pt = /^(?:input|select|textarea|button)$/i, dt = /^(?:a|area)$/i; function ht(e) { return (e.match(P) || []).join(" ") } function gt(e) { return e.getAttribute && e.getAttribute("class") || "" } function vt(e) { return Array.isArray(e) ? e : "string" == typeof e && e.match(P) || [] } S.fn.extend({ prop: function (e, t) { return $(this, S.prop, e, t, 1 < arguments.length) }, removeProp: function (e) { return this.each(function () { delete this[S.propFix[e] || e] }) } }), S.extend({ prop: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return 1 === o && S.isXMLDoc(e) || (t = S.propFix[t] || t, i = S.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] }, propHooks: { tabIndex: { get: function (e) { var t = S.find.attr(e, "tabindex"); return t ? parseInt(t, 10) : pt.test(e.nodeName) || dt.test(e.nodeName) && e.href ? 0 : -1 } } }, propFix: { "for": "htmlFor", "class": "className" } }), y.optSelected || (S.propHooks.selected = { get: function (e) { var t = e.parentNode; return t && t.parentNode && t.parentNode.selectedIndex, null }, set: function (e) { var t = e.parentNode; t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) } }), S.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { S.propFix[this.toLowerCase()] = this }), S.fn.extend({ addClass: function (t) { var e, n, r, i, o, a, s, u = 0; if (m(t)) return this.each(function (e) { S(this).addClass(t.call(this, e, gt(this))) }); if ((e = vt(t)).length) while (n = this[u++]) if (i = gt(n), r = 1 === n.nodeType && " " + ht(i) + " ") { a = 0; while (o = e[a++]) r.indexOf(" " + o + " ") < 0 && (r += o + " "); i !== (s = ht(r)) && n.setAttribute("class", s) } return this }, removeClass: function (t) { var e, n, r, i, o, a, s, u = 0; if (m(t)) return this.each(function (e) { S(this).removeClass(t.call(this, e, gt(this))) }); if (!arguments.length) return this.attr("class", ""); if ((e = vt(t)).length) while (n = this[u++]) if (i = gt(n), r = 1 === n.nodeType && " " + ht(i) + " ") { a = 0; while (o = e[a++]) while (-1 < r.indexOf(" " + o + " ")) r = r.replace(" " + o + " ", " "); i !== (s = ht(r)) && n.setAttribute("class", s) } return this }, toggleClass: function (i, t) { var o = typeof i, a = "string" === o || Array.isArray(i); return "boolean" == typeof t && a ? t ? this.addClass(i) : this.removeClass(i) : m(i) ? this.each(function (e) { S(this).toggleClass(i.call(this, e, gt(this), t), t) }) : this.each(function () { var e, t, n, r; if (a) { t = 0, n = S(this), r = vt(i); while (e = r[t++]) n.hasClass(e) ? n.removeClass(e) : n.addClass(e) } else void 0 !== i && "boolean" !== o || ((e = gt(this)) && Y.set(this, "__className__", e), this.setAttribute && this.setAttribute("class", e || !1 === i ? "" : Y.get(this, "__className__") || "")) }) }, hasClass: function (e) { var t, n, r = 0; t = " " + e + " "; while (n = this[r++]) if (1 === n.nodeType && -1 < (" " + ht(gt(n)) + " ").indexOf(t)) return !0; return !1 } }); var yt = /\r/g; S.fn.extend({ val: function (n) { var r, e, i, t = this[0]; return arguments.length ? (i = m(n), this.each(function (e) { var t; 1 === this.nodeType && (null == (t = i ? n.call(this, e, S(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = S.map(t, function (e) { return null == e ? "" : e + "" })), (r = S.valHooks[this.type] || S.valHooks[this.nodeName.toLowerCase()]) && "set" in r && void 0 !== r.set(this, t, "value") || (this.value = t)) })) : t ? (r = S.valHooks[t.type] || S.valHooks[t.nodeName.toLowerCase()]) && "get" in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(yt, "") : null == e ? "" : e : void 0 } }), S.extend({ valHooks: { option: { get: function (e) { var t = S.find.attr(e, "value"); return null != t ? t : ht(S.text(e)) } }, select: { get: function (e) { var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], u = a ? o + 1 : i.length; for (r = o < 0 ? u : a ? o : 0; r < u; r++)if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !A(n.parentNode, "optgroup"))) { if (t = S(n).val(), a) return t; s.push(t) } return s }, set: function (e, t) { var n, r, i = e.options, o = S.makeArray(t), a = i.length; while (a--) ((r = i[a]).selected = -1 < S.inArray(S.valHooks.option.get(r), o)) && (n = !0); return n || (e.selectedIndex = -1), o } } } }), S.each(["radio", "checkbox"], function () { S.valHooks[this] = { set: function (e, t) { if (Array.isArray(t)) return e.checked = -1 < S.inArray(S(e).val(), t) } }, y.checkOn || (S.valHooks[this].get = function (e) { return null === e.getAttribute("value") ? "on" : e.value }) }), y.focusin = "onfocusin" in C; var mt = /^(?:focusinfocus|focusoutblur)$/, xt = function (e) { e.stopPropagation() }; S.extend(S.event, { trigger: function (e, t, n, r) { var i, o, a, s, u, l, c, f, p = [n || E], d = v.call(e, "type") ? e.type : e, h = v.call(e, "namespace") ? e.namespace.split(".") : []; if (o = f = a = n = n || E, 3 !== n.nodeType && 8 !== n.nodeType && !mt.test(d + S.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), h.sort()), u = d.indexOf(":") < 0 && "on" + d, (e = e[S.expando] ? e : new S.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3, e.namespace = h.join("."), e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = n), t = null == t ? [e] : S.makeArray(t, [e]), c = S.event.special[d] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, t))) { if (!r && !c.noBubble && !x(n)) { for (s = c.delegateType || d, mt.test(s + d) || (o = o.parentNode); o; o = o.parentNode)p.push(o), a = o; a === (n.ownerDocument || E) && p.push(a.defaultView || a.parentWindow || C) } i = 0; while ((o = p[i++]) && !e.isPropagationStopped()) f = o, e.type = 1 < i ? s : c.bindType || d, (l = (Y.get(o, "events") || Object.create(null))[e.type] && Y.get(o, "handle")) && l.apply(o, t), (l = u && o[u]) && l.apply && V(o) && (e.result = l.apply(o, t), !1 === e.result && e.preventDefault()); return e.type = d, r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !V(n) || u && m(n[d]) && !x(n) && ((a = n[u]) && (n[u] = null), S.event.triggered = d, e.isPropagationStopped() && f.addEventListener(d, xt), n[d](), e.isPropagationStopped() && f.removeEventListener(d, xt), S.event.triggered = void 0, a && (n[u] = a)), e.result } }, simulate: function (e, t, n) { var r = S.extend(new S.Event, n, { type: e, isSimulated: !0 }); S.event.trigger(r, null, t) } }), S.fn.extend({ trigger: function (e, t) { return this.each(function () { S.event.trigger(e, t, this) }) }, triggerHandler: function (e, t) { var n = this[0]; if (n) return S.event.trigger(e, t, n, !0) } }), y.focusin || S.each({ focus: "focusin", blur: "focusout" }, function (n, r) { var i = function (e) { S.event.simulate(r, e.target, S.event.fix(e)) }; S.event.special[r] = { setup: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r); t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1) }, teardown: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r) - 1; t ? Y.access(e, r, t) : (e.removeEventListener(n, i, !0), Y.remove(e, r)) } } }); var bt = C.location, wt = { guid: Date.now() }, Tt = /\?/; S.parseXML = function (e) { var t, n; if (!e || "string" != typeof e) return null; try { t = (new C.DOMParser).parseFromString(e, "text/xml") } catch (e) { } return n = t && t.getElementsByTagName("parsererror")[0], t && !n || S.error("Invalid XML: " + (n ? S.map(n.childNodes, function (e) { return e.textContent }).join("\n") : e)), t }; var Ct = /\[\]$/, Et = /\r?\n/g, St = /^(?:submit|button|image|reset|file)$/i, kt = /^(?:input|select|textarea|keygen)/i; function At(n, e, r, i) { var t; if (Array.isArray(e)) S.each(e, function (e, t) { r || Ct.test(n) ? i(n, t) : At(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) }); else if (r || "object" !== w(e)) i(n, e); else for (t in e) At(n + "[" + t + "]", e[t], r, i) } S.param = function (e, t) { var n, r = [], i = function (e, t) { var n = m(t) ? t() : t; r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) }; if (null == e) return ""; if (Array.isArray(e) || e.jquery && !S.isPlainObject(e)) S.each(e, function () { i(this.name, this.value) }); else for (n in e) At(n, e[n], t, i); return r.join("&") }, S.fn.extend({ serialize: function () { return S.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var e = S.prop(this, "elements"); return e ? S.makeArray(e) : this }).filter(function () { var e = this.type; return this.name && !S(this).is(":disabled") && kt.test(this.nodeName) && !St.test(e) && (this.checked || !pe.test(e)) }).map(function (e, t) { var n = S(this).val(); return null == n ? null : Array.isArray(n) ? S.map(n, function (e) { return { name: t.name, value: e.replace(Et, "\r\n") } }) : { name: t.name, value: n.replace(Et, "\r\n") } }).get() } }); var Nt = /%20/g, jt = /#.*$/, Dt = /([?&])_=[^&]*/, qt = /^(.*?):[ \t]*([^\r\n]*)$/gm, Lt = /^(?:GET|HEAD)$/, Ht = /^\/\//, Ot = {}, Pt = {}, Rt = "*/".concat("*"), Mt = E.createElement("a"); function It(o) { return function (e, t) { "string" != typeof e && (t = e, e = "*"); var n, r = 0, i = e.toLowerCase().match(P) || []; if (m(t)) while (n = i[r++]) "+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) } } function Wt(t, i, o, a) { var s = {}, u = t === Pt; function l(e) { var r; return s[e] = !0, S.each(t[e] || [], function (e, t) { var n = t(i, o, a); return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), l(n), !1) }), r } return l(i.dataTypes[0]) || !s["*"] && l("*") } function Ft(e, t) { var n, r, i = S.ajaxSettings.flatOptions || {}; for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); return r && S.extend(!0, e, r), e } Mt.href = bt.href, S.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: bt.href, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": Rt, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": JSON.parse, "text xml": S.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (e, t) { return t ? Ft(Ft(e, S.ajaxSettings), t) : Ft(S.ajaxSettings, e) }, ajaxPrefilter: It(Ot), ajaxTransport: It(Pt), ajax: function (e, t) { "object" == typeof e && (t = e, e = void 0), t = t || {}; var c, f, p, n, d, r, h, g, i, o, v = S.ajaxSetup({}, t), y = v.context || v, m = v.context && (y.nodeType || y.jquery) ? S(y) : S.event, x = S.Deferred(), b = S.Callbacks("once memory"), w = v.statusCode || {}, a = {}, s = {}, u = "canceled", T = { readyState: 0, getResponseHeader: function (e) { var t; if (h) { if (!n) { n = {}; while (t = qt.exec(p)) n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) } t = n[e.toLowerCase() + " "] } return null == t ? null : t.join(", ") }, getAllResponseHeaders: function () { return h ? p : null }, setRequestHeader: function (e, t) { return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, a[e] = t), this }, overrideMimeType: function (e) { return null == h && (v.mimeType = e), this }, statusCode: function (e) { var t; if (e) if (h) T.always(e[T.status]); else for (t in e) w[t] = [w[t], e[t]]; return this }, abort: function (e) { var t = e || u; return c && c.abort(t), l(0, t), this } }; if (x.promise(T), v.url = ((e || v.url || bt.href) + "").replace(Ht, bt.protocol + "//"), v.type = t.method || t.type || v.method || v.type, v.dataTypes = (v.dataType || "*").toLowerCase().match(P) || [""], null == v.crossDomain) { r = E.createElement("a"); try { r.href = v.url, r.href = r.href, v.crossDomain = Mt.protocol + "//" + Mt.host != r.protocol + "//" + r.host } catch (e) { v.crossDomain = !0 } } if (v.data && v.processData && "string" != typeof v.data && (v.data = S.param(v.data, v.traditional)), Wt(Ot, v, t, T), h) return T; for (i in (g = S.event && v.global) && 0 == S.active++ && S.event.trigger("ajaxStart"), v.type = v.type.toUpperCase(), v.hasContent = !Lt.test(v.type), f = v.url.replace(jt, ""), v.hasContent ? v.data && v.processData && 0 === (v.contentType || "").indexOf("application/x-www-form-urlencoded") && (v.data = v.data.replace(Nt, "+")) : (o = v.url.slice(f.length), v.data && (v.processData || "string" == typeof v.data) && (f += (Tt.test(f) ? "&" : "?") + v.data, delete v.data), !1 === v.cache && (f = f.replace(Dt, "$1"), o = (Tt.test(f) ? "&" : "?") + "_=" + wt.guid++ + o), v.url = f + o), v.ifModified && (S.lastModified[f] && T.setRequestHeader("If-Modified-Since", S.lastModified[f]), S.etag[f] && T.setRequestHeader("If-None-Match", S.etag[f])), (v.data && v.hasContent && !1 !== v.contentType || t.contentType) && T.setRequestHeader("Content-Type", v.contentType), T.setRequestHeader("Accept", v.dataTypes[0] && v.accepts[v.dataTypes[0]] ? v.accepts[v.dataTypes[0]] + ("*" !== v.dataTypes[0] ? ", " + Rt + "; q=0.01" : "") : v.accepts["*"]), v.headers) T.setRequestHeader(i, v.headers[i]); if (v.beforeSend && (!1 === v.beforeSend.call(y, T, v) || h)) return T.abort(); if (u = "abort", b.add(v.complete), T.done(v.success), T.fail(v.error), c = Wt(Pt, v, t, T)) { if (T.readyState = 1, g && m.trigger("ajaxSend", [T, v]), h) return T; v.async && 0 < v.timeout && (d = C.setTimeout(function () { T.abort("timeout") }, v.timeout)); try { h = !1, c.send(a, l) } catch (e) { if (h) throw e; l(-1, e) } } else l(-1, "No Transport"); function l(e, t, n, r) { var i, o, a, s, u, l = t; h || (h = !0, d && C.clearTimeout(d), c = void 0, p = r || "", T.readyState = 0 < e ? 4 : 0, i = 200 <= e && e < 300 || 304 === e, n && (s = function (e, t, n) { var r, i, o, a, s = e.contents, u = e.dataTypes; while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); if (r) for (i in s) if (s[i] && s[i].test(r)) { u.unshift(i); break } if (u[0] in n) o = u[0]; else { for (i in n) { if (!u[0] || e.converters[i + " " + u[0]]) { o = i; break } a || (a = i) } o = o || a } if (o) return o !== u[0] && u.unshift(o), n[o] }(v, T, n)), !i && -1 < S.inArray("script", v.dataTypes) && S.inArray("json", v.dataTypes) < 0 && (v.converters["text script"] = function () { }), s = function (e, t, n, r) { var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; o = c.shift(); while (o) if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { if (!(a = l[u + " " + o] || l["* " + o])) for (i in l) if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); break } if (!0 !== a) if (a && e["throws"]) t = a(t); else try { t = a(t) } catch (e) { return { state: "parsererror", error: a ? e : "No conversion from " + u + " to " + o } } } return { state: "success", data: t } }(v, s, T, i), i ? (v.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (S.lastModified[f] = u), (u = T.getResponseHeader("etag")) && (S.etag[f] = u)), 204 === e || "HEAD" === v.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, o = s.data, i = !(a = s.error))) : (a = l, !e && l || (l = "error", e < 0 && (e = 0))), T.status = e, T.statusText = (t || l) + "", i ? x.resolveWith(y, [o, l, T]) : x.rejectWith(y, [T, l, a]), T.statusCode(w), w = void 0, g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, v, i ? o : a]), b.fireWith(y, [T, l]), g && (m.trigger("ajaxComplete", [T, v]), --S.active || S.event.trigger("ajaxStop"))) } return T }, getJSON: function (e, t, n) { return S.get(e, t, n, "json") }, getScript: function (e, t) { return S.get(e, void 0, t, "script") } }), S.each(["get", "post"], function (e, i) { S[i] = function (e, t, n, r) { return m(t) && (r = r || n, n = t, t = void 0), S.ajax(S.extend({ url: e, type: i, dataType: r, data: t, success: n }, S.isPlainObject(e) && e)) } }), S.ajaxPrefilter(function (e) { var t; for (t in e.headers) "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") }), S._evalUrl = function (e, t, n) { return S.ajax({ url: e, type: "GET", dataType: "script", cache: !0, async: !1, global: !1, converters: { "text script": function () { } }, dataFilter: function (e) { S.globalEval(e, t, n) } }) }, S.fn.extend({ wrapAll: function (e) { var t; return this[0] && (m(e) && (e = e.call(this[0])), t = S(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { var e = this; while (e.firstElementChild) e = e.firstElementChild; return e }).append(this)), this }, wrapInner: function (n) { return m(n) ? this.each(function (e) { S(this).wrapInner(n.call(this, e)) }) : this.each(function () { var e = S(this), t = e.contents(); t.length ? t.wrapAll(n) : e.append(n) }) }, wrap: function (t) { var n = m(t); return this.each(function (e) { S(this).wrapAll(n ? t.call(this, e) : t) }) }, unwrap: function (e) { return this.parent(e).not("body").each(function () { S(this).replaceWith(this.childNodes) }), this } }), S.expr.pseudos.hidden = function (e) { return !S.expr.pseudos.visible(e) }, S.expr.pseudos.visible = function (e) { return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) }, S.ajaxSettings.xhr = function () { try { return new C.XMLHttpRequest } catch (e) { } }; var Bt = { 0: 200, 1223: 204 }, $t = S.ajaxSettings.xhr(); y.cors = !!$t && "withCredentials" in $t, y.ajax = $t = !!$t, S.ajaxTransport(function (i) { var o, a; if (y.cors || $t && !i.crossDomain) return { send: function (e, t) { var n, r = i.xhr(); if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), e) r.setRequestHeader(n, e[n]); o = function (e) { return function () { o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(Bt[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { binary: r.response } : { text: r.responseText }, r.getAllResponseHeaders())) } }, r.onload = o(), a = r.onerror = r.ontimeout = o("error"), void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function () { 4 === r.readyState && C.setTimeout(function () { o && a() }) }, o = o("abort"); try { r.send(i.hasContent && i.data || null) } catch (e) { if (o) throw e } }, abort: function () { o && o() } } }), S.ajaxPrefilter(function (e) { e.crossDomain && (e.contents.script = !1) }), S.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function (e) { return S.globalEval(e), e } } }), S.ajaxPrefilter("script", function (e) { void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") }), S.ajaxTransport("script", function (n) { var r, i; if (n.crossDomain || n.scriptAttrs) return { send: function (e, t) { r = S("

    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 px!KR@k4)f0e8_#0i4_b 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 Fe*y4f`|JP! literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/list-modern.jpg b/assets/img/skins/popup/list-modern.jpg new file mode 100755 index 0000000000000000000000000000000000000000..28896d9d3f65042ad1c78f0860d197232204c5e6 GIT binary patch literal 9440 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/list-toggle.jpg b/assets/img/skins/popup/list-toggle.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e8dee672935212953271080478e6532dabf16e4d GIT binary patch literal 6664 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/masonry-classic.jpg b/assets/img/skins/popup/masonry-classic.jpg new file mode 100755 index 0000000000000000000000000000000000000000..06fbbbfe49ceaaa75ed1d90f75b08fe98197a89b GIT binary patch literal 12799 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 W842~a26O2BhRa!5IR5#%^nU;qJXXs9 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/masonry-fluent.jpg b/assets/img/skins/popup/masonry-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..129ca0670fa1e03aa2cc290e3846269a3996ba12 GIT binary patch literal 15671 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 S`~OgaYuM%A#_b6n4*v^db;L~o literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/monthly-clean.jpg b/assets/img/skins/popup/monthly-clean.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2350f23d6305ebc72e4a3e5fbacbd439459c6cc7 GIT binary patch literal 5734 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 AQvd(} literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/monthly-fluent.jpg b/assets/img/skins/popup/monthly-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4a8140d6c565ec3a3f4465cef32e9726820bf08e GIT binary patch literal 7573 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/monthly-novel.jpg b/assets/img/skins/popup/monthly-novel.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7bcac16e8615449872da257d469e66152665819e GIT binary patch literal 12438 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ΠE3VoSR&+eg=m?@40LfzJRQ9J$HivdpM1r@HtD3Q z^LY|6;5Om>I$BDfZ)5K33fW9r8F_@5l()g_UM)HMGR;A(C?c`%G4f4HhdN}&`jdY8 zugu~$A-W3^$Su}cICy!CB!ysGigZVpeJ3iR&RgjOO!I{uGca4Zz3O5;aMPo4&_S>1 zd$RqL&4D`OI7_$2dOO{1ax&Oo`v!0kjN2K^^-~Mi*56w2);QE$pPu#oY+g>%+E^Gb+P(VL!V>&et#PqwGDRmlscjQloXD zV3Bowq)yOh(cFf0u z*O-B(gUGH2gQx*-0v+D;{LzOs=eJq*;bFz0eCp9VI81?Zhvb9>cg$fU=|b=f z@-)AzfwwWs-<1&O%c$C%e;^M!8D!@g!ilVy2oQ$gh*u2FOWBYiU=J+k5+eqI_nL*4XKskp=oDRO7NjqoHO7<_#UXeElGKo6F?f|z;NTR|XKjuS}y z5>4EZ9rOYWmX`S$fYpSoF^^*k!H^X6_lm+^t+(hV8ki)vbT1ftE(`;55BaT#<8Mw% z<#M&lV(|nB#5cJuNKqVfhQYnxJ$N zzlORgp(gkwW&rsDFWAd_0c_-Pt}{~)9~{ehKY>Yalt>lSkrN=JH<4A&n04cd-M&yF6j@Np!z@zdS6P5 zp=suVEGestR#3-P@%be~08Rt)y5HJ3`XrQVns+OtsS|F2(=mB24Uz9vRm`486U^Wy*j literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/slider-fluent.jpg b/assets/img/skins/popup/slider-fluent.jpg new file mode 100755 index 0000000000000000000000000000000000000000..eb95d71d173e31344201531db75c1865ee3675d4 GIT binary patch literal 9177 zcmb7p1yEegv+pj8>%!s|Tm!*9xVzgzg1c)1LBrw%5AH1PvJfCxa1HM6kYGU)Lg4br z|Gj&wUfrtKeQKu9nbT7Z)6@S?dh7+@qXUuvpFu!;01`eBgb#e|15iH=@@ZJWzXtp-p`aq8A%QS} z=$KFKXMZfD=?<{GHad z&p!150AgRGM~_rq&Gt=PyvuoA*7|^GTF5Oj>iPC-9=FEHZ_J6Nk}IXFp#8^u>G=1D z7q+k#0o069j{wS|bhICyPPGA)=NXP@xk-l3M-kb#B593#Q@)dm*Z1}h514zFt&3D- z$0n|)r5aQo@7C9MZ}8VlG);1ru9v@h03JNf!XLixM|^?GZC8Hms=bfzocZmc==K{s zPh*Sw_q+Yn8uw-uM>PW#|MHoBla}liG4b`*_!8Q6-z58NiQLg2ubZplTnU-_;E z`Yw1L?o{|a6E&;3zUPU_oSibP+8hrkKHRN^j(V$a-+c1+^I-qClM~DShA2qK7+OS- z!u~Sd#jjV#c`3^)2Y+1Fmh(Pzwxs4vY-r6|jp-!*P`eZ9Ipw+J6OKIS<1p5>rjRJiCpy#8Z9VhYRp>5%6uu{hX)iMZw0qxuV#xc(+5)D zIWCb*mTcl7-3bf$tE|FjCYX)(W2##M6PY1O=|@d+?3yr#`fvL8ZXbVS#Ye21Xa0%W zPXL_zw!g1^DKzcmXeB#Ba1&c@;7DpS+SDVXug|;xGGZkQ(KM9R>vRA8^@$iq-p(CG zSI%`Xj;X_CxcPjpKFl_emGgZ@iuVXBS)yQTY{i6}GtNSf)K#F$i`_pfwIz@~7XJ6**^`m;f&oBeBp?V0go=Xl_v;`a5;6(^6@pJdh(?6YtxHTpOGnQOCgI_; zl9JWbHhZ#u^e4{%Vgnxm38xeHyA!Ja%cXGOqnc8mU`nx;JNy7`TueS*%k9h4|8~Q0 z*J4}GJlFm*O1ygM+v~mdmofK)=7DV0XbjzIm`HoC`>x78zCx}Rxsmh0@%Ixqn0rne zkx<25dAVszMMVkxg-dH>f&kGtvQ(&&Gu!D@Ar(y*C%L)HwE9K(Es1&z z(YNa}OCDBOzKk2m{1FGa_X42UwfZLD>|ib*z!UJc4Y?FR?rrsP;%7V}m^tIl+MIMU z+A&ZQ;~`JlMYM==-}~fa%%5ERLniix-Qifz%sDcO)Z0{qxqDGwp@@lokZwo`T~YF< z$~lSHvtFlFfhNN$pl-lUV;R3$A6d2jF!{^)!|LOD>O%w)TYFK{iJl?$Np7neC4X##$%GdJ zA76xd^_?{J*D4F%>d%BJFjSdhV1Z8_O(P!e^s=Zao;-vowmE&E%YNaQzF^5WSH zE`fE8#Ft`lAMRi`z8QT>m&&&ZH(?kT6Fu8P?^3B#NKX0Nm$A?do zYF)azbS1+^AJ&@&1ayX*=6M-h{8HqOn5}B4Nu1|`D<|s~@YqhvPkVNCmgO>^iy=M# zgp7e&94G3O^iWiTHQS~>;}Yb?7Z{c!*E|6>B}Sk#Lhb!$d!I+42G3rpo97QD*9`Mw zo|&@jzn%ldT-g@o+n|tsBv(T;G>B5k|-sSdpeGS+3v>2ntqD_ z!nK~eCP$0@7O1Tuh%wZ6O_cdiCbK zj0U*8dy0fUx1W>AP;BKq*PWI93jx{gw4>gH5vmDXWC^+B(Ht*>W7wK%Z2YWvwbvQa z*RsVCl0RH&y(V#uEQh1UJXq~ZR5ExwmGBccDXFHx5vTEn+U^SPQubT6621uVFcgZJ zG=_Iaxu^1DFmY#>_Wv2&E1jT*+)@3kFfZ=63gw=!wah-}lBV0Bss=&nlZ0w;F9o>U z6W8t2=waO!^@FrQag>(P=AX3I)QHUo9FhwoQ)!M_%%qW3Z!!pIhr+JiG5~X4u9>z8 z9>60+v|qOg_2JOeT?}vmd67x``xJ$p8C zc*Y)6yPDYW;uAG}2RM4cHG;Kx8}=%GzQxq0j74USXnN)NH( z*^*oFo~_ws>@9i=C$eozzq)dYl66hf=M-pjf@@_#69fZ0VBlxci3>?i1$&*<#YT!= z$;;wm>Exa733rmu&PT@{H{kSQDI!-48q94^a^C8d&yk}t&F3dn}0$SX5xR;=>^ZCI^SL<6-BO+Z# zq&~>BCJdR-W2?}I;rqYx8|mpu;2BIo8Yyz<7EFKG9xZeI=%&h^d3>09culcfGgx{o zK|o>sxxj&EtesOr-Vc3~X>Vw37#1Y@ajO$?SsmmfmH0sC|D1bN8m9c&`t<>vm=+6i3+bUNNx{PWJcs1uq`62v^ z=za5LS%3JZxH3CC%$t}BLoZ4~ifK)}W-5ebitT&+z{YSWWt@p+wxDmEpXf;P&j+8q z4w_dz0nQbyQum0NhiC(34rPJQuAF+l{+2#WPkdlu>tO5hxA@oXf9C_&hnOcgApHaf zp0EHi3OXt}+TU>C3G(6t2#{&HA#_q&ggoZ%A@tJP79NQOjVNFm-q3R*8MCDNo~;W8 zMlMgU!l{4J0geRlPoyt+hH9aL>2v0d<5I27zg4EUvxbJJsICGV{h6P`TwXg{cI3eG zy)^<>X{jT}N5F`;If^ZLN7sqT`>-i5nwA!0kL@a$pddZGs)w3L_{CKyT>9|1Z`Kvg z_GU52S40-$73<2ZKg5~FRVc4`Hs$xw?W~K@Rp|J^t^I=Lbk~@{0UOU+zC~Lg#Xcrw zxk*3cT!T#L7Z2~DpIX~n|tFe90IHRY2zq`?>!0SLwE`I52CWNT-V z`0MU7IAh8tB$gx9(?C7(Jvf3>-meJ%K7tz)HKI8T4>6m{``t;`RnWWuCnPnJ1*5g) zTxw6-@NS4My>TxrigGUH-JsGeJ1-eZ|K0HuQ1!bcJD|EkzfSpG9ZiWSe`ed?3umYD zp|w&waoNs%;`xW9>TVtP~)sV6bo%EW%c|xyZly+J|^_Z z*uGtl1$rq8C4EL3D1>I>t-f{%6;>1h6W?9dKnGj^sQXqS?27%PGKxg4!>BTYV z&Z4bH83Z$5RxxERiR&{lqXjWo(^WT~*&w}pqfh0FQs9e(=gdQRjL4SH&{jr_b4_7$ zCHa+!c}!G27Y!dYo7Se(4rzDE)^b9;IT)%$B?cY(!_~c8?(bSvwge=Ta|Tpv#2yjlC~;FIQXvRWc?%G-AYj)q)&{CSr?M zB)jBs7nkpy_%ZCVwghBK1o!?LCQ7T&5!+sAwM>>E^@&MQV=Hs{n>%q9K-a2u-@f03 zpiq~DOvhOo$f313bR)%wcU_EsBumPWMcr&d8STeFVvLh`<7c}L z>39m8!r}4^ zWp|o%S#&hy0M!FbUbhqLLGO+8`HFonT8}d>FGqq7~k^UNSxx1 z9K~TLBYhgDF1)-Zh2k@BKb8STVl9mECYdcAaWxoOUXvI8D>Tlprd*rGB3!ztoBD=4HGWwCP#F)WsCN)$ikKJw+vmG z)EODaq$dUOMDEm5xu~rD1vQ&-BxmSL$pNq69MHkG>Wx+k%i!-tg>Y^Ke{b&g4O8bW z?$LpGQ-Iuk4LS7>Q`+j;q6Nx-Y~n7-j1yx2bFR;L6S9%YsLA=GJ#f^pwD-HJ(H?GL zro7|QHI0&b2Tx&4G=&)(8ZRoVf;W`N?b}vvqoUTZkQ~J$fT_zkg$vG7nMg>Cq*bq( znghsmGHzaK%l?6CALIk)^B;4IpTvCieY~DdzH1~sYknE1?EFE{uQ#@EbHpTl)~YNM zM)ch<6nz%dH@^h`)7wB2nVEU?(=}aUO6V5KiPpgEP(vOT+tRAUA8Bo9OFRd6p`z1E zY&{`zS6yFxoEx)goX zEl9ab`Sat=v_KqK-dtIZq6QwcA>-0fFpur<`|Xihn=e5j6oZ+C{LKeGRWiGZVLFTt z5}4lhY$`0s?3HGMb_^`@{3Lw&2`NnLwDg=tI+iwDpLtSaCtms9z%3S)si>?Np3A?U zui+yk&e$wS7bhfXWT=$$C?-5blnJNrY^cyM8kAtC6TMe$r8c}OsF|%L9T0pN?|yiICn{It#tedh?tJgtrE*FQvwzJ;0ffLu9fy7V|Z|#x>4R3b6D|ea%E_^msc!_kqc>@Gt+8c(!nymYm=UC6{0AEWZEUlu8}nX{PhC7KX{SzF__ z`FcliWu$?ovgyxGYuKG&x4r-CupZ>i!pQfcF6QR|*)8#Ct@uEgo7d`b`4VBj;1aqi z2AmnI3SgC8ukqTuY$xT^CNmKC&0sIvI)kXc_;EFUq({zHG<@2FwhGi3p0)$1(`qtGx3Rfqm8W|*et8ibA-p;kUEx_ zWxnw9uz3|xJlDtE89qK4Sm4=K1kgN_aieZ${)LAwW;R&r{!NX>K)!!K#|}6J^n!%M z&+cu5`DiU0uZLLXB!_Roex6cJtlhxA-?j%iSUf_>^fdXJrPd}QEhhB5fFlek_N=L{ z=ah2j5lqVXNtSk-G6`Fv;h7b()9W0}FSRY=&(-uCLXIf6SRMiX>#tbzRZLM`pS^Cs z;L15nwbzl-alvAN`$+*(!!teux~pD(JQOW)bL+kf2WvDU@mN=K^BL=VA& zf89+1;hlk$NC!7Zew!I_;=e)T_#Q@!ZXQgii=9(rtWEq%8gn!PYY~|w1DoIvW$i=Mkl7DQpb z;VU*|H~H7aV}5X)|ZURZ1^fnM4B5ukHbML{x;N@gB>I0!@iW zB`O#17N55a?aQT5(uAlW7HD0M$L++3SUzkMY}UqsH0!lA%eIf#x#9UK$SRGQCWwRG zG#y1+UFwuCbV+tDWpBxSE=IO9QS2~d)OM6l1PwO&dR;jD$ePK~g9-WNUH#sD@s@^A z)CLZTn`s>7pNjPit+{h)B*--?91D{=@4O%BXo4pf2ZCh(+@aWwf%IA_|aR)8BV%$ z<#A)i)=il>yn>dncqpq(+ax>6;!+kGVPTd7P3^xdoEDqbtXCIxp{V{2>A_|(74B*{ zCrwiZX)gmHC$;8q z;W+~XC5qXps)O7l`rHI$ue~{0Tvf9j%Iy5 zNmCY)c~yKjn^BTDaAm3B9ayDB=HoZ3?nas|vb)qmQMd0jn3()SSzqC^qs`&?3U4wR zbt;*T+?N_PjRzHZ~DB=#V2^h3fT(H~|S8OB)<3HsHAK(f#24)wLtZP&Vh5__6(Vuywo`I)^MoTgbL>}-cT zzPK?E7i4cfJ&;P9a8<@(PVwq0sl}bq*{+Ki90x0$E$xOl3%jM>k$djEsD{Y zS~cv*@f2;DnOd z6*3>1-D9?8dE!V87c?LNwk z(i?y+^>JFUEO~2vic4jWQGAmlgPl$gbmI{WqsGP1&@SJ=Ff+>#H4+-Yhyk)N2d=G z9b94xX+*E2E$5s>8RFw!?BWE(V2cD9SZ+mD%sI4*YraQQ&oMJ5S`iHLC6Z&X0}9|{ z(@H?70_S%N*-rD-bg2W80+oZl000=>q`-%Qr=4CH|F7^L83hRm6%+JN`2UnI192mx z5YR%Tw9MVXG}0lc#B_=EJ%scOTs)d)Nd@OqTNi(C{768c1mM9ElaNKTKpOVns-mwb z1K(QL(kL2sd`w(M_qxCh4 zNVk%mTPQlsiu)BU02Uqyd;f0X>Cg_LlI{PT^iNJv14j%CBOs8F z6)alHh2@9!3^S%*FoMt>=Q(}ABVZjaQhA)C!H^zz=Ru9u>e^7zD=DA7TA)!;F^|`f zrOqbgWhkYU%0@12LT*M?e3=Rx`+=F!tlEeHbG9I7))E!X8U}-u>ez8)Affa)adt$2 zB&e;c`{m*-#$cof6BRlE73*BKlex0@*ZPYiHr?_YDXbXHdzPk-$^9IrDb_L1U$7Wk z5XqkPRrB_1%HVtbXW)AX7E3oL&kjZMhz1wRN3Phu`fDZB3>iOA1xPEa=%y1M1siHb+2Lq*Gyf-x4P2Ya1+ z56;YJmqEZQcdyG`EeZN%bW6XHYM*$s-x%?d6Zu4%le`#E`3S+MQBzd3hEGN|pvw`L#p zcOLQ>(!_-UpwL--zinj8ihn*$z@QQp$U`6pI zlkcwd^m>enAII~%C8z?kDdZT5gy9*7m%LB8Ey?H7asj zNFXq?_i}CF<7r2W_g;G~$J$$$lTqJS(6&uqbvTl|BZgY3NUF09CmSNsOS!WBd$GcP z-eM5jnI)F8iRPu}VKsuClNB>to4M{mZ@jFf;@Gf+1iOYzI#D`tzm>i={OV36C>`-T zM7NBUtK(AljQkdL%PqI-4&gG3Sf0(%UrZw3o}qb){iNP+ETii(A7=iVQq-^Q(W^Zr z(sw7tT&|8$y@NHpCO&^lP}@VI@v~5OKMIT5K0bx`KV2J?I7~k$PgNftD_hu0Jb462 zX%#51niYQiswC_!k{7ifP-vmY1NO43XClbbcV2$T=P2r_7*YG=?##0l8Nwi#0m_IY zdN^}Zra=0*TI*+5f6CYjAQ-1me#FJSY;XQ*e#fov@KxtkE)nm|OBpAP?ZVRoyk(-9|g?gr+ zWBCOzc8x&;dLAO*GV(7fGYYP&K?y%lWNqBTngjU7`|>@t;Y8!A$VyVK8pSQYVq9Ax zj{v0!h`P)QgR;eba9DrCbIv!-EL>`mUoY3qY#}0$DN|$9*`;eo{lb0z8W$J*4DR2y zkV0V^MsrLaBa~rzMUJDZkB?+DF%}dU*D%q0HCcCjGdt7lZOqUFZ1^S{}jU9yI{hw#@PMBG^i>(1T);G-cb5wAu zdg8`?NS;k^lPe-qhH$6RrB6%d#;nQcoz{B$S3ta=Ge;Z`7AvR7HxaRnKqN5=wQBb_ zvnN-hOX!k1TlU_sM#^d(E(fC`1hqu^Cd#%M+B`*)Gb9K+C3L@C3d3r{3Uy(9DatM} z|1Mj1^bd^zqh6o3J+#g?HliFul}u;`*dkCEl2o8KhXse%S&9ezNziiVW(0_oQE57a z%qe&$7||8A!KiVj{Nq9qTA3XbP{zwFIsd5|Ut2m`HXzNNPoOQq=#wPh?IPl6b*|n$G4~0FqIwMV zu6@2N=x9EHYL(o%6f-Uko#1~ABZ~W@Jn#Uw4AQReD%aM{t)sQmE+rpGESV z(z#=dDy%=qb;(%;%emR%gkpcYhA1#FLryZ}Bsu3eM9EPyNR}iZC`u3{Nk#-=kepEv5CoK*gOVhR zq#;O)`<)m^)H*H^vvSM^n0&0H-5Hr7?03h52T+IV2 z00a#FQ*efdD^LO`6b}zdgpUs+AR!_lAtoXwzD7zxevK4PN=!^nMGmJ#AdyHCGHMzs z1PuiOiTLvo5Cj*42PK3;2@%(buOa^5cGU^M34m0f4FZA#U^oZ@2VHdojDKK4L4WZ6 zV^A;zhEIS8BE-4raSkx#e|iBZ3De?KyXfS2stkB(&(S)|Exhu*uNVgTibjo z%SBZHfC@P8`YFD7f0EJn^8R!=Dw-~>a4d4(X=hCJuKOt#nd+P>TU3_ru=HTAucdgI zfZt;Jfqawnrww`PmiL9t$FSipkOxjJCnr<^Lm7W{kSy!mwE(bQyk>CO5TS?PD4$uE zB#ha&d8Ak)<{eapZ3)n>wcxOj1%6nHF(lWZPRIHz@o@?%gsOl?w2=WQX<7od2JGrwZ@v2kikS=*=Q zaYTz<4e=c5=TF97m;b@a3NBY!fj`3!xu%oYZK!7`P3+^64IrS+;j#{^75Ur1alE(}`F z;7(F7tDd@BG3-5s`)Q~SEMFJ^yppVxL^$%@F5K`v{*W+js)=j+KaCledi=P&f`LI` z7#K&Le?@@6IP$;%d;|eGoB}B|qF zs4n-;YE<~?KDqV_Y4dI?lP0Day&23p*xPXLmc}}#i^8qTr1O4e|5i$n7AxyIMev1T zrbE*Yj>vjOP!!YIV<|CB#GwEI#tuaP8#AG|q<^Mz*)x%wv)SqKB$+u1VI*Om?A2B3 z@m8o`eR?X>k?Omay|tR0_xOn^|Hc(iCdq!QAV);>7wRzWO6 z@Z=GTpQDv@kplWDf$(Y+1!69!f%4D{lS$9Y9qoB(WHaY!m2IYT++p)sqGz}A71pe~ zw{gCLvd9Kz=ur}C>+7?jG@PmVZqBQa<3_+2T~YqKTh!zx-{E#iiT|rVDfbuk?Q!Rn zKITXiI(j$*O7Z)d5uqK1z@G|WCJkAaf9RNUP@b#p)v)>cKq&UsTVyR^S|j8Add~p* za}7Od`}!(>&Vk5DO3p;H1bn;LNcd09*|E>^^ zQ|YNBrMBF3?$T;SliiGncz)hu8D3bI6chNqg_rI@VdQM%8q}mkDa)n0m=XyS?7!-8hJjaMJQ}0egPucsu5iToOv_tu7pVb__6Kt^O>;E`V0oNntUai1EAG-aiV*aS;{MnUw}HN;6MR+3Y6&5C<$v+2FO85`Ba5)OlH;iLB zTrnYyGX4w6w%Mn01vOSx;%vE`<}A->^IrUwtqK8IaPOd^LQHC6h?dkA7xwR4NjN(5 z7`_Jj-hP{guU$n>GHWY#xt42LkOhcFh7(C<+bMoa8oYUW12+xIkON>41cV18z=J~n zwMyfrK>!a9C8xM91fx_kv@gI%unHUarqr@1r{<&V9Q?wOf+7(epZ=Z{2^E0fXxbjm zea&Cv505eKH^n%!(?&EmijE9}%Vj73qam*i_v-K}W{m9pXOjgzYcfa3RF$447Nh+$|NU!B89BD zpDvDyd>bsi0^D6UhU4+~Y3KHODFK-Z~n_76-*W3bu`d ze}AQ}yi@$HsM4d!PcOh93`>JP zc_*W5yB)ZB8cS_dKEo#>#VJtL(&x|6v0K@UI&ob!jaV8q-dWqtNJwbk!`S(Mt4Z#@ z(_5uu8Dzk961C{$usuw zQ9_2W1EfoV=AHJ~!nm1}r<^VnebEX6JafEGveRrtWD^I0WxwLwYoku$$yVIvGL4^# zy-7qt!=e5^&EYr2+r~#!_pNs%Hfz(3Y0L{^!3CrcPFgX}ShmT5M_%$&&aMNGNe=k# z!|r<&ybG-M^POHq>m)v;b?pAE?vOp&jcACh@|scFpsH7L|8#Q)9d*{8PJ&Ncb3fAM zp69`@-F+hZK^k#+NzrlDWq3O3t<(lL+D=f||3`2XbBH%T=(kaCZ4Ne*R5S@RU6ai% zP_0N(7Acb@w`w`==Hbt5*x2|Y6;0WKLQ0MO_&Ht9-cwnWDZt^|OlCI15Qa?o>BvCF zFrA6#768^GPs>;WR&y=7KX8f)(t>(N4`#of<)>+fe;)~oay#5syTfYn@@+zEu7Mq6 zh6aV=D^==7{RrY)HtzkE&F?h;l$57$PY7?OS)K6>FZO3eF^6FbG4@dp?DoeubK;bTJ`Lf$S5wEhzqHwN2eku8>c~(put#9;_%hhH zF`8HLL7T!y| zjPmO#{2|0b5|>rIf0k90dV7_NNCS|^PZ}*1m-eo_QEk%_meTtqUg#U2RWdfgOjp17 zX;t9Yk*Zah3jDx^f^*MPKifXRs2}Z^U&{&0MzLP6s#!7A3|Z#Rx*WiYp4uOBwE5^0 zl+&p%jn&I~wDOweDW$~KTV_;3Qx`k>?J@Xke!LUn4X}JZt#VL{hF&?0@;-Z3M7it_ zN}J4pYwBIv{`~KAeFLNUzX>j}=cM{97ENw!-XYOL%Ul6dDP2j+))(rf%x6eGgZWL% zoRGFUO`3&N*QsZsjx!QDbY56RL}M^!LYGy;E_yWtAU?nkV{9&9m(bFe#5QRl6;PV- z9k``Wdp@3)?aQBUjt6|ku>Z6D>v0r$ky#s zOp~J_cj4rCWKrf;8LRD`O{-&dVMH(h0+4m2(Wvz^Tz<8*$*t%hZFa~!oy#q)N-__z{R z{p?Rw-qk@wNY@BqZW@`YCe#JprnhQ?$F7V?{e-t(LrIUX%q+AMiqT^!k=qd4{PmJ! z@Mv=5@%A}m{aJA?;R`?6+p1#{->QYjwBCQ*({l51J-3`~rzTQFx1*#S4W0*Z9rKF5 zi*LDM+|u+-a{_*+5I8Uu9VHaDXt zNWvXV?3|^nLYsdsz(gpmFRpfV{M6&AsaSMAA9y;qeZPT zvOdfFE3ZNGRN?#DG>w+nOjg2KNIo7$HA2YL67Q1sb-+kXxt((`yQc`X&&tc_>3z#j zUSfnV-{NV|570PNVkBpm=w;=9-S4`La)GfKQoj-A8tZrAXtTPsA$E>l|5mbN@7D~< zcuh(GtTIUHyQxd8n8@$o7XOLcxArN5)6|MTOcoKOX!OKzLcni>?(T3^>tR_5*Xld)ME~M_M(IK?x=S{>u7YbrlePYNo;CV0#6SpB|H^Hk-}XGr)iH*lV&33G z>lRhnxOs9n|6{6EUq`!kD5(-ls=sLvmw6Vu^=CZcq@X8|zTW(Ig7LRio@=gR7}E*l z3=dHBGF>iDzPLxCxuGmYh=^oEB1HuPdiAA)-wrsfAc5Q1gCJlC6bgg=_m&B#6)1$D z*Oe$)4eWgpEP~#wcqySu)?$4IHpLU$-GJhRP0iM4e zpzYhT9TWglvAJ}%y$+pFKGB8}xjEgQ^)O00IscTCu*nR+p~^3|0y`A!B>SX4 z^6FY|aGNTPzbfJo`*wQAWjvSAuPgUDJe-x0PrknGm@IcEFKI@AhE1opigvHa*|sHZ zJ<<3zrlf{-ZzaZ;#$+@2+;~k{igZ6ibpP(g5|r;-Fd+L#$-rkm#?id~3UCEu%vY1U zv8|*+*sofCA_pZ2LzKNZd@S&$ejMofsNL#u>f~m9kYn?ao zV#*=*x#hbnzR?D1-3G~oOf+)tbBBwx&ufW4Gl}_l2~^K34(1-6lp)x-3STlat(Zh} zr1UD5-%p?obteoc$)A4ZvKJT-;K#bg)9ENzVro7hM;>K&_n zPDfoeFbxSz%gHcZd_y17DCl48d-Zc zcC+^&bapwBk^Re9d`w^e)RWtfh*>h)`)`pv(B!-X9WeH^b%ehezDM^=M}sYXcsYb( z^foQMaXcR<1&Qgq(a?66VwhOjRFj1RmwPAqxCCYP<<7a8uWl?Xnilrl)uCx!g^B5_ zd+~+|@;)_K@Ft7z$x=dOXLV7(D3u~2mKyelzQn{^;X9dD!&{J ztdyMN*72U$H<;_<8qDQrxmm9}?^8G@wzcv=R}<3N;Y2ewSFKHmLE0IY0S}sg(q-K3 zA4;&p{GOPv4$LH<56LC{ZSo5Piuz|7za+ejhnucdx2?Zf z@_~R;!d;H4f5Xwv6+oy9sD(|hOx(i*7-BeF0W7pHx2Nhh$ zA@PINce|s$B$wwbXdN;SYt{@Y*6d<3m{g1cJ^cocMEti5IZ4%Zu=tFZ`Q1C(!m(Kv zA42rt7hT)Dx2W2OP)TK#FMgJ?TeR5{u{h;SwGJULwR45{j#C*7`?IySkvAG1DfqNk Qv)0G;l_JB>Gp}a<3xxh1761SM literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/slider-type2.jpg b/assets/img/skins/popup/slider-type2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e26e29c707928203d533ff4f1ed1827764f1dc72 GIT binary patch literal 11660 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/slider-type3.jpg b/assets/img/skins/popup/slider-type3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c7e73c0b44343f582062fb73e9d66894ff98a9a2 GIT binary patch literal 14895 zcmb7rWl&u~x8=QXad&rjcXxMp_uv}b-QAr)a0wbnaCi6M5ZqmceDA%gnIAJ%vyay4 z?o;Q->9tp{z4yoR#})utR#HY100aU6z|Rfvu?7$Wfc-PzzZ3Z94h{(d|1>BF2oNMR z6bv*p6f`spECL)1EIceUG#nBfJOUyj5+V#7G72&x%I7`ezn1_%2mTuc0zo0dK*M}K z{r|L&UH}R-AQ{jF4nzTfp#Z^AfFJz;!q4vnfdl`2@BbJCBos6lI0y#zUppQU0QP@2 z1Hi#R5I{(%k5vFX_-89JIP&Mnhs*yN{{Of_QmgN`Z&0`HaPMPZ)F(2`Z)X6OCa=pH z!r&%PnvqLJ1mEcQLDmXR$6Vs?G9%P~Bby=hWIgTJuy**OJn}{xB-e^nrUw+(u*a+1 zc~{fgC7YfcMgK013~m_iYv;M$5S>eH5liar5API>iVtXmyr~Px%pkhU^w4riQIggv}uHNp&dtcI_g+I zeOst-62mO-^1+CaeR%%&T#SNiWix@rsdMps6W*|Y9l7SWb?*cwtO>vReC01)I31Wr zWfjXYEDHqGcbKlVD?s~aSkp@VqAffOvOhO14D(e(sSi%`Pd6FZN5mxUT7wyFd7kpOhFszPT zR_bJY7bE0wm``RJd9yCQ-mBSCI1JV0NkhliWSU@_hzqKiV`!eHt_bBmv@CcRws^s5 zscs+ds=WRk{GQvDeBZA*(WzgPJBC*!66);Wl%;0%GZ;1tVR}CHuVK=m&R>UY0|Oev z_W*JW9GYMI&Fa_HuV}+F9;*!md@NkN);2j)rfId)CGfL;IX(tV)eCy_iIZMBCLa1S zO=AYLsGIYqkKRHxYDYgsMfC)-+`Y+vy$+ih_?I^#lu@z5#3mH4dxVu`MitGiC9zlD zB)c|q4^&{B6Zda#&kr+eV9}K{>O0;vB~5+xaIy(5zkW;c7aMmix^n1<%d9gMNjsIb zz7D2a;m~$G)vxX!u&JL`|8Xw>rO#p(HxjkouRbEHoRj;z2%*zN!)`t5ZDf5fR%?BmF)i#sR z_msw_GM3+Vf0pCT=;pBQ^Z2J|$IaN z`)={OK-8yi<~#1M-X(J{q%ubv)5^V@{W>VMt9wGfw7AP(W{5-TUQ3H7bc$c>{nwPT z`v{rPqilC5hOY*7NFivBGSKdgzpK>!LlcXfg_T`QLxhb(R8m<*&Di`C7@$A#1PBlI z0jMyqE5{0TKa9%GI7URt@tz%|lbab9oc?i|CKvYx&gcB z7<~Q<`r^L5PctyT-0fB$q$RO-DBv80jKh0BC|A=UMzPt|#a358!V^wr?Cy?)9y_bU@kuMH8hCR3@dlgMR|vD<@Ij<3R#^A!bTgvK`~y)1-Xj+5 z^&Mufdx0Axi^Anij!9d!r^{MNT({zIy6Ay0OgXkE4>78Y8<)xu9vL&orP@9JzvIm9 z7S8drO)ihIq#Q8Ho~UtiI&>1VKqK7cnyGWwG0tPq^a_zoVO-k2GBSCKx`N*@Q+`3Y zGVge1$e%}dmx0Z^Jxym2T*p!CZu&hRRW7_BH@wGclNemm_qj6DS$qk1{tY5W3u}(s zJ3CHq-JexLHZ>2aXl>eZH=?W&%QDyQBY*Vh86X)olxbRAi1Ax*{(uu7Kkn`Rl|8A& zDodFh*G?NA@A*+S2#!nJ$@SCm1w%So(BIAM>I!9Z77HUq;2Sh@AyO%vYn=NIU%zn7 zyeF=#;v0$%<-Lf4y~%dUQd>&^DaT^<&g~SXk9qU$f~=BxTn@BW7t5(aybi3>^oFU$ z#jt5qTa|nz%D$W0xbsAH?d(9ggGi9$9%E@(;2kLl&{Khiv*@xupi^0hi6y(3u@aLG zNzCYi>i@?khPvVDt9@P{U1V*sE2Ju2pvR=aDncO|%c@oD&}8+vpc=tmST5YEvK2)D z#cemEXLJUYVt)jV-SGj8Y}P=G7+lTOqOLhngucYcZ7U5r-&cPmRV**^vZlGmr@h7# zfM4mB>+DeY4(HU`0qo8j{h0k||`>7tI1VqG_&Reo6*qtHC;%{#-&n4fl+(__?Joz-eT(d=FV~%dy8q_ zLzX7^BPQkgV+el&LmvU25iBCcO4@-8`*t5&n<8{h2{)vKg{;5_UKG0ITumdq*uUDp zjpyT}w8k36kFjr>YUQ6D)|&|hdFYx`o9*g3g)RR$Bbw4-(VE(?zW;bNhJ{gZN$Odw z-P3Bq(`KdD!g~mH2%dgeS&nG=X`S96g2y+!I=JidU7`=6nqE_hz_gFf5Ms_KZx5jW z(^KO{mKYhTh4$xBysKn^;pLBmKLqdSr{{V){9inGU)w^xb3W(d`w*i-Wv6NKLt28X7C26KTb9Khry97h1G? zP2n)I(n#w!oOiM1Lz;||nN&?t;KQyNglTIKA>TUoAo)Z+tuqVXJtB{4mr$|ehIsU( zZ0lzMJ0LXWB2mH1D)))R!}NQs=%C12s7lGUW-D)Q4pz1+I+}T6NgQM$SuKq&`}ixH z!h+ha1`YwrF+pNkI}0pd2@&<8iuy-Z3z>*kyn<0P*K5vnK8(z<-FuJKj;Y@nLuNE% z$eEhF2c8@q>KrFaP5$R#d0$0)7o3mbDEtma`>H*>CyJ`!G2-LLHqr$GX#`J0SrorG z4Hvl>o&wTNYb#ohYzpiIxS`6RqnFEOM-P7*QypDYc)n91+y+5&f8dMkPd{I z`~tHi)>n2&!3kW?I!9Y>1s69yZ}hVI5=)^eZxToR*yNho z*2FQ6gR7e2-q`9z9JKXpPCIiEyopnt)8%3u!_bUzvERu;Tcl7A!Q^PLI*_yJ9{_~B zZQpHn+^PGNrwH9VaBiY=ZQS%vW&BNqqpFjXssm$Yere&gc41ixy}@7zpb@7XffLvQrvSm4x8SeW16rK2mkKHHYep@nM#SsR<8U`%e&O6 ziaYV;9UaNFD)AS#EHzV=T^_`3vP3c??|rE$#JAR^eZ;QuSMv%cx1~ zz0|T~&W`1kH?89>SNBbR1F0NSln+W3Tin~zRwzOh-|jvj;7;UZnFnbBqR!O(b8ae@ z6g4`30N6a28d;4h2Hj6{6ONJde5gp?{k-oLE^eZi8tnrz6}#du?ncQB2biv@ml}j# zW-9ZLJKAj*JDc%80Dpx(nVl>$0Qkx3Kp+?x5Y&H|-RDXU1ss)xMFd2uVuD7->Wqvo zs_GV$G`j=ACT8m5UbKDbTHMe>t{mLhJF}~%Zfs^AlH7Fl-((L#2<*MS3=8(_j+wge z0dqhU{6x(|hLjg+j&Z_k3XU@;*QR=bS`Amkrs_eYtCAQ6Zw0iMkw53RIfS!Y2`Oe)FT*gOJvG;nM4>%*Dq$QD9?}|>B!`JQ zbMnuG{J40`nBVpWH|(@WJU#AdzXNz@z`S<1DDy1^ld48p0Qssl{jrny$OPC_;kw=n zNo}Y2mKa)Cyc5pgi!~9kQI6~qjhjG^Rja1W&IpwW<#MDDW=jndS595{6nXDPCD50j z$Zj0LlIB$N{cXOBIMUpOr(E&AD5y7e-%(lm=JOd#;aqqVme9|JNu`b`e>y#_iShQx#GS$?Kg&;3wtrXFPSz3>VTj z!5^-~bwy4ymqQ8?wXyBM#FN%xg8|gPl>@dm>fGPCQ#MTyh!*_U9s%6IS;M2l>E8UI zdHqMo)^R`5DhCP%;i26jiA5Jv^3xl}{(J?}rDT@f-zGP$UV*9>;GBeJkt===LOzJr zP%QkUK4D1Q*)HDZqb|fq)6YQXmi|)ek%BEF^J2R zy2s%z~&_3Phbg+uobwio-L`zyImy=q_~=BGd;IE`oGQgPa7|4kaYnfNj($YK}-yc^%H zei$O3qhEmp<(rA`CKBWW*&UgM0S|RN)vhV==05^h%V}|lbo7}ZP>}4Mh!o3x&0DO} z=PjhLeSEiSH^Sw)GQ3X@_a*D|-q)}V*s`zTGr?EuTp4@X6qY?l9cDKUe)-n;8A4nB zW!Vo!gkLc-5nAQ0vWIv5$^QXJXjUogwQ(!t(nmsx)Hu#ao}A$#G)ivc$k>C_cFMo) zBeNvF{X(!y4j<$TP`e>0R=P2$Lx0vn+Cw>Qi~4~OK>o_}oKdY5R_siZ7o9p{H}uuE zMwHHLZEOtw<^#YkiBZvbHe_kfV|S{#F(+hAoNtLC^+&Z%hM|MoT*Xn!`U}qoKrghY zWyV4~JPQ%mi?{3IrACZp5TnsZc^e?3q0b-yWMIDx;U^BAXc}m7ULBHlu(}Zz7mTS* zvQAGp3$wVK$PL`?znal~XuoUKk>}z$SKPo;%XUR*3*QdjcdCClq|J)>@uT^&ym}B^ z&6Tc;j~b_ZS7p-IJdX|PiUO%57cbmylx<8y6A@C*Ny(y6)IWW{vg|qxT(iQG{b7iH zDyRz+Y3xupY!ZM{F#wCy-U$+Ur%CwLj0I=lqYYS+19M_5m+5nx5IuQ0$GKMC4F6`{ z+~UOJu3*4syHKm`y&4mNKeu~K*fhG^&=G;}4m{gE%H?Lqx9K5qVu*cTyR58|SB?TF!|u0Ox^1SSzYd9{ z+Ojy3Z|&G+$PElE!Mg(ZfCC&`P?)>fZXwD)*&;<&wjnTcuf!*>1ri4-5Ac`OoblD% zzfN$pV)x2cFoWgOdQON1zRnT++S>fX+G(F<^NSw?0eObyc3kOm0W}^$3~>InqIhax z)Tk!y^Jfm8jJzB8o=oX#fY(v=!kCH+70VxdXi`owv;DK3U+v!1Hk%(j6yGn>LSY$# zmF1MFDLH?B=)3ccti5FH*QzyUQxLHy!m?+T$(f15w?n8OBlu}u#TV2&xh!^}CCw@} z49tj^yIUsZ1aD*-WTXd@$T30vXan+tGfil(Nyh^@I1GD=MAc{!roH6XJC$*piT!cR zTEGrV3XKW|3w&Ne37*Dx{u;?F&J&j8Z#ZpdbFQ7ae%}jY60m!qeOtXHU3ty(I=A*- zY<0!E=N6*dyIM@99xLyFW$kzo6v`$)^RLTvSF0_Fn^!Bf7g@e9T}fdHwG*XMKLzM} z5gs!Tc8p6Y0u?FOQ*?Px)I214>RbcchtN(8`0}S8jA!B{c-q>V`S>HqSGQ&nM`A}Y zU~8^gFr}+D2p4AY@CibKa(q&1HvDh5iLzZ+co7z4x(swPf3dMl1>40H{+iWxNmN_5 z`!ZGP^w$dIT|{%G#`Oe-?5@Wi9;|t}`Io|YY&|$?i??MSm%g{;lUNrPXCXzKsbq)0 zob_^D^p{uI+R3Olok?bzT82M1+_`Y#)}7ulHORyfkvv|!ZQ%Dc3T}8!3X`u<%8TK# z!Eo)KRGL_ba-|e?H-)RU2<4l&zsBq8wN6K0D7Y9uSqp`{7;p|+Y%*n=zNvXqYgKEL z>rQdahJ82x@lvC;y74Fi%Hmk*15o_91b*!~*oF|XYZ&i$cXas2F!uBE8+X6a*KS6T z<0t_2mgIs-nDF|g(`W4b0}$u>#J6kY>1+3Se}}d40XSy*`Oa}fgnLUAr&_(5$jP0_ zb{NoO^hqeF|4BvvWuJ2KKdId;q3PeUK@$ z>v8ydj${g1AaE!*^8v12@{*qFh>d>K!gek}LXReLOXl&gWEffUyy4{ut6qeTPEZDg zaKKt(z%nKc)oZG}TIbh7;dde@0|mL_A?5Yu7YPGuGH}>*?^fWDzL5Nlvc)+=Ha^d` z_Kw+W2ZSQanSKB=A-|tmpp0W(O5|ar_dxd3p{HGo|AhK`V>{juhfxtB~eA z0N(jypVZzp?*?4{{Ty|oeO4WkawI_(rp(ey5)-!Ap3G3?szDcNuI4Ktj*FKeB#i3)MjWI9UB8psY*?22>&L6q;tAf*C__YG+#k~G3xyau^?(O0aSu`|dO+$4F|)^g zSl8>d=wlWLRHnzwyNmP~oV$)2-WOA7Qh>fsJ5SV_2L^_2pcr^yo>~N}>b(Q_et$$cawON&LU&q2ZbsMc? z*^v~q-`5d^31@=^OP{{=?#>giB~xCa6Wcb9Lqgz@4r~;|Q@in?Do=r-GR7PN07GOr zZ1isXkxf=r}YQGV1+?$nsWlsm@+P5{o2nU6#f# z`Oz{)mwBK`$;5mm`Y}{7Iy@mfC>Ub@M#m7+Oc;~YHJ?Oe8AVbpc`N2Ij5@gzZbWs@ zKB!yEl@h4iE7W}G46l!#*o=@n6VuGCPLiQOT}g=Oyl`4R<^iPmR%SXZ zM#9Xo6P9b?HIk}lsbxAlmQXHz#)a$?w1F@RqL%WC+F3UvXV={(k>aLP!p#@6Qgfe(yObSY z5LqjAQ-(CCC>sp53>5Fd_a&jiG^J(@@YNy{r&<`YP}}n-HpDwZBfdCxWUQ~g1ghl3 z5%dfYH&n(6N>>Fx*_#*^rCJj?&z7{rps1OIB8KUjn9+DGs4>me$6{O%n>JYiy4#h| z*fFnDx}i|APGyjvNi_%y<#0;ehv3)Hzj8wLgrKpWR z9vU^&CPwMp*7HP(uFe_HcrkEuAgm7ASQr4V+-t?r7Xr|qR}-s%R@)Zlr9y5H!+r*i zlN!RsfXK;76o3KWo8LWhtRlnY&{J;1)2k#>8M%!^3kktI*)ZWoa2C1f zdUj_?1J_EX0-`A*9pTQ|4i^oE(uews_#=Dk3my79Pf;%y5DC7@?V7i8Uh&!!QO#?Ed(WeGg z#@NMx35Ypog@+;-(rSX51*)dghU%Zj=rLN za;JUm1}OIUJppa-E=K6aYffE?xU%{d>K>6i>Y;v+7_S?(fV(`!F{&P7{UD*E@=>fv z{s&(odxez-@0mFWqTV$$y0KgZgv}jx0eUVF4T^Nn>^c@Nc`Td+pZoyO5*j#jS0(cN zs(G9jn=}Y-JV?x|HIZ*bc!8(9Euh;E7+S+%?(%b`~s+|URZNwiZ4 zMP#e*Dj5<8RMVU>_Q1|Ol0Y$E;iS>qsS{yE)M=qhb~BUc#_fo|qjWEz%SxTZ?bPL@ zGQt4SU%M=$+G)622qVE8f9^{_qu1!5Jcz<#)@B>)zTw9nM^qHjOP?sJ;^j48+Jh1q zPyv&-QjC<{M9ekBghf=4)pn>_jt85b(eR-9BIBx_7nt@%Wy2oxK$fw}`s`hE@r5J? z=e-gXc-RksC`e$!2Ndk~tV@FS4tloVXKiU)p^_ysyv`Bsy|rz>G3)XB4LuKMiknIp zrigUd&`a`kX-deQqEFT7))dXobO}~SbK)0zd#jAXJ#C1fW9>Chi1Yz4Q$$A*^0X!9 zzCXK(N>aygH0G{p!}a4+Z8D4|qhbcYN=QKxDbCDpU4HY@xxuSt6m6dcpm*})$#>*j_?g7$Tg1j22lUaPih-yj#(aiC8$2#I`>qJvB_J>XcP4;t ziJ4vs0$_t22{hEsMQz3EmS_&M!g_g6)aK!o1Zz#SbADH?EL3@wCN{35BQEgj?@%PE zsmzQE#-!kyr2+fvrw+ETeADwyW49Yx+TSzx@mmPR_0qNo%8tNs8E)7d%0Mm{Pdueh z9386*m>HPNE4lgR5DtRY74tVTa(v6QIhtR?W!-z|g3rK4=vu@#w@nDy*`qiv@xiZmZKNU0 zSjUc?I|%L*RqHaL+b*p7F{Qk2^t5gzBzLnJ>K0hq@L4<{Vq&==WBUM4Q)j_Bu&7`$ zk!+8wy{E_VU7d9>0BY#(p_fiU1hTB62Fp0dFD2NC9qFv3vAQDS$PF%R}L=?%X3@@y|^(Rm+zsy}W*8&gPI#Fkv} z{lBABA8x6CSi{0?Y@4K~i9bDxW+n7qwz|YsCen?pKZi@gauIjdzWxS@d+Cvo_l(~D z-jn2~mAgdX;F;ieF?m zcDE;;S!k2q*%aoAzsN#duog!|8rTik`IwXJ*>-M1VpQmu=>N*ieK8)ug*TVlz2F*M zmj`1(Qmji5s2bD>^b*62k(zIM%^gkKt^Bj(r`$u9vql6ko}mboz` z>s?5pt!P^6N+v4g13)u&*~XcDR;~{cHbEAyQNYiCA4k z422;mY8EhR^+tAqRD6rTSE~Ees1w8qJ7UNfw59NvT06&3VjbQAUR()jX53JtLIhBa zUN<>pk3?ZUy_KX6i`)L#=OV9Tw?QSwSMQ;~Kj8x~g;l=5*R3tl6njh%vAq4-l{Iu( z7*xy>6ZPybGwB%&R@-}I+$~Q6#cEM44@oQl`g68Ynod*Kpbak@G9I4O%MUX5J`g-u zpYV~l;pS$+v8yljw=gQ`V}7SwYz3>;l8pwEFn6)i=KnH(8idsp0n>BY$7eAumQmJd zYkWkJmCFphCH|x8QLJ$^B@r^dc9q!G8wgfd`K>>BMo{dITB+>GZ{m^lGM*VcaGc6z zs}#i9p=YBV_{{=W96^j*_z9v%HWBRuu)A#LF7EMI3U!#s>a9N8{7UuBRd3iOIhN$^ z>~HBeO3&01QOFlB%xbl6v|DcFKg$f7VL3=*;r;MbhXiF3v^Lcr0Ba+d?l~8=^0Rt( zk#Q@LDT!-(8Rt2_*=2G%bO?hd1(+`bj{-Ed#~%PFrd;dPP4IEbsLGU-PI2l=P$+jp27*K>V<>B4HXk1%0_|9wPdIQ*B3*l%-&^K;~FR@ zXSU(ilC#$@6QW|5p?Xmchtlr=mQ;BkIU5l|5^&Bq7;F|C&!{rUC>~XDwp%5y6X8r0 zQ=?Itx6Te1Fk!pM635+5CvR7{V6_9N#N6bZg9>l#WP>3kLy!8-Xvh0o@Y*5Wv=YC@4-!5ymi4vsS+U;EIB7B(Yb&d0!Lt!AKfjZAvu!1 zNYs*Z-tD9UL0C2x)S$CFvXt9UVY+F2MkrknCOH8yn9?|cc^L`>yRR2NsbCCCiBYxN zb`U02-Bxjn+6nI_GBxFi5-#i&_G&>-&|`}I!y$3qw+ae4cEdXcVgX|#sMzLLk^Rb? zfm?73O1>#t5Tk9yG40$Wqe6K(2Xg(|-qj&0B$Net6$IC-VfhiIge=^V_&%OT6DoZL zZvQ)E1KVTopXsnOBp2x-043`4QRrweej{c)uak7nUvMQF@}4cb@J0(U1>JCB#jG&R zab@P@YJVP9!WqadUKtb@{3Y7jWR|KuXeF&Qb??EakQa2cjXj_GRLbh~86j}RYe?>9 z6B_1U(Fs@|fClt>GO4C=#Z~Pvn&`O~MekBT6KRhEAKIL#NGok3Jc+T_Zkh@RGc*N) z;#JVa9|99OIPQ$qu8xyActL7rpDbsl<4l^El$JnvlL42t{sC-4s@u71PhZgF7C^+k zzaXvZBswXv`^w;dgTV%U}a)iF}uAbfF)?2b1-r4Ip5-tb2oPt8lnI^wv4p>TgPL`Z>OP zr;$&puSg1@U1(llv~_C-Y%=&<(jMcsmJFJqmOQ*tx-*x*jr>M66!li;+tf^Y27EmrvJ=?1%f^^+(1BZh<}nL;4{e<075~9 zAVFgxMMh^8!GI)V6IE6*cK(lU2?hj013m!GYv|B5gR6@+g8u0nt8q;s!HZKwd+DdU z#Dx;{zQ@#LW{k|^7zn8)%MCdTcsx)IRwQ+eIow26oCllq`qFE0K6Z0L19_0K}@h^ zwSi6A7;iJ6i;s+8RX6vkPRSlJI2Ta)lB;Q>NV7k$o@~WU;ZDoRQ;77t*s-;*&nH+3 z%?{+!q%`sa2Fy!U?>i7Zy@SOYW6$QN@6qB@E8T?N6Z36EBfv#B2EM z`g9=4xb@j1k6AE8AI&|+Fh(I*a3CMZibx^=XEj|aVAxE-_UZ>|%_@5!U)COLas?yl zN<~GQ2umLsDu}ZPX$0kG5gKgw+d-4W9Zm_UG@HWjvW2;Qk>Mju%BX-l$f;e0I7Qh; z4vKXHa2ixak)+;Sq>gOn)za6RZbIqeqzT~@^fHl8MVdZgQIgpcv}jYR@j&0J7`}=R z%Ai6g_)bBnj}HrgCGm^S9Bx2ORJ`Gdx(Qi#El#$zOAc&8qUi3^Tje>A4PLACz;h>9 z4T3lbq#U{aOn7ufqmr+`S}xBUJA^kFK)wrs(vkdW4be@@YC`*9iiHJ+z1T1WF+Hup}n_Bmt37pl&r zw!a4S7qz~uWC{<;$J5K#y*lEmOXQ5WgA%O?lgKz4S*}Lp=wA8K_W?0`nh`joxVzO) zbTsC9UpINLZwA92VI{G?YKEj^NGf!kXgnV#wK$ z=eH^N3v!_A2SD}{pEyze0TKur0vrtLKk)QfP=EqP!UB#gqJm2NpTNoth%|Y7hqa-n z_>x&vS=D&;y;_t6WvMZeI>b@9j`7y5fXPFg6otTtl+ngsoRT`2u}BTt zP<^^!m)s)a*T4)eh`of{Vg=ygQ{h|wZA1gs4qXFbo@NA(Pzx?@&L6tz%mTeo>X;py zxQD&M=R&*E4(mLIXp<{~numi=l0`Vxih{ByC1Ib;t;NCRAqinw>Od zfNd7cFGS@`4Wd+Jax&f)y0MYAfccB$rUMn^idYGdc3p+Ls`#aN%MbmZ)r=&gFd@dX zDj5*_BqOMnRmq_=Z+CY0Qh9wfb8ic(yI$+zwBrPaEwseMBO$3cYPCge>nhpVsGSDt zxFqq`HzI2wODB<}WYY*9cM+Hk4FO5fQxfG^ka`Ps zmAFdEPE~f^p}Os9TZ6>9zYl2^`_VT@9O}NaN|GglV<_Z^D#6qHM)=o7Ep+qX@Pw9v zR7w>G2<7i_krSdl1CwjCu|YqRqruTB!-=^UBmi;0JGK1nqvNqa0nC|*R%EIgwJFAk zY|G?evC#D{T&T-8DqVT0kbv&VIzjppYgW^zDytAl;#C$?ybBJyGUSvgqUFkFT;;dk z*sn$*581KUZ7$+0Ov<6QaIlLGb$WI8Go(O=s>%0QAl-Ge!)y zSahKFl=FzlH(DdwrY(*9DEh&spC_ybRx{Jqk%-8&mE*UXQppXpW8=gz5;xr%P{i!Y z(Ou?+Rc*d7FAeTMVjRp`2@#a7>YY7}T&W;UiQ=k|kc1KCjD%x`AsT8*-Na@t06J79 zR3$2k4PS-}UW#!^q%$pmb9}2t4m-4M_UMN}`M|uxaErs<~@J>Sw>DXu+fnuYzg5I+SN9_Z_H0PtCrWYt53+Bk|c^mfMf& zEmis1U%Kz_69bV_2YAM#*5}-y`ETF-FXRaRzx!@95>ggqbO;ev6-YAC{|-2QMkN0^ z?s{-`QZrrVqECVMTTZ`+1B#7~(JR{`PxdVRRldtbpS5`6mmv4PUH^-O6oDkTp} zb)&$vnz#H6D4G^* zwopKIHT|z9 z5991VzedP!MV59GGJ5mZN%wuUC~H{Pa0@(gB(zgv;16&B=tWUAGia^3%txJO7?ag3 zA~}%3i$6%$Dzyz+H4~`?MHZfm1D}wCQ>k8^V?$JuiAs|UZ1r#&$4SKSdCCxl*@wxA z)1o)O;gDGZ3LAkso(~MU8#>zLbfbU}p%vFHbjN^Z#492SoV#EwjD&Nt%u5%RXhhk?iEPHM=_|h~ zm1eJdYxS&MA!Pee4yn8zR&fsfJSDf8{=Ny*FjmDFaO-P*>wM&OHY>ZB6F#5F9n&5K z*FY!#QK-|2G*kF(bW6T)P2!y5&_JpP|FOJC%{+q1MrrQbG8vU+wW*HX9Vs`_;T)$h z*jhC5rtfE?bjdkCnKxw!B^ejBMr_EFfA1zQ%0#al>HMfePwJojtTDT-Zhzj9CeZjS z_h~-6-CxTKq!aI#_E5<%n3d7hL9KRlI7^yM9YH@X$yW)-Tr!IL6*hZ0ytSnnN4#Ln z5GO;ICvwVS^quAWS84IDA0?GrIkz*?eIzDn87g;&gpXFWG!o7N&fGkOv4}RN^TuW` z^UC^ycRw``?;D2|1x1D$c+jclkvY>t#_3q!L&gPM*0lr{S@c^mMg&|GL}jYdb@$WT z%W7@tvX10?+v8lKS!u9|9t%EUh4~+>{3~|>|L+ySKhgcu*+LmO7UcarH;bwR0Sd#Bem__Xq_O;%uYsd0Ab zjmEC;X^V=fFa~B_VTkSp=UqNtV8BoPS25$)3_qj%T?NLn&oaR+js8cvZ@DY;d2DcQ zIU&dI$q|T@y1f(39qXas@d`1+|p&Yw!FSZKRUGB(7tuCCRElbA)>yhhDLh* zc8lZr;m}bK-jsPx{bFMmF+i1n9iyK2pky_c9XH_hrTjeS!6)r^xjKd1@xetNom){% zz+|+JRSkVvYGXQS&gY4eQaY3YFEhCOuuQ4GnzTi8G)s@pYTm-aLhP2P@C{M~OjLrp K{FUxw<$nPjbv*+B literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/slider-type4.jpg b/assets/img/skins/popup/slider-type4.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5effd46f39d36b71f000eef9bd3964d58a59ad28 GIT binary patch literal 15785 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/popup/slider-type5.jpg b/assets/img/skins/popup/slider-type5.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b9638e1107f24e60a08bcb0b412be4cde8badb1c GIT binary patch literal 6661 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

  • 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%0D9)vSff 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 NKvPXmwHj_4@gFmDocaI& literal 0 HcmV?d00001 diff --git a/assets/img/skins/fluent/fluent-weekly-view.png b/assets/img/skins/fluent/fluent-weekly-view.png new file mode 100755 index 0000000000000000000000000000000000000000..0f320184a8cf8281ea79bb9aaf160b19958e1ba2 GIT binary patch literal 9175 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 literal 0 HcmV?d00001 diff --git a/assets/img/skins/full-calendar/full-calendar-weekly.png b/assets/img/skins/full-calendar/full-calendar-weekly.png new file mode 100755 index 0000000000000000000000000000000000000000..3fa348a7b3c24e863afa039f9a9f69f89ef336a9 GIT binary patch literal 2661 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 z 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 P00000NkvXXu0mjf5#ka# literal 0 HcmV?d00001 diff --git a/assets/img/skins/full-calendar/index.html b/assets/img/skins/full-calendar/index.html new file mode 100755 index 0000000..e69de29 diff --git a/assets/img/skins/full_calendar.svg b/assets/img/skins/full_calendar.svg new file mode 100755 index 0000000..264bc88 --- /dev/null +++ b/assets/img/skins/full_calendar.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/general_calendar.svg b/assets/img/skins/general_calendar.svg new file mode 100755 index 0000000..096cdea --- /dev/null +++ b/assets/img/skins/general_calendar.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/grid.svg b/assets/img/skins/grid.svg new file mode 100755 index 0000000..1e2ed24 --- /dev/null +++ b/assets/img/skins/grid.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/skins/grid/grid-classic.png b/assets/img/skins/grid/grid-classic.png new file mode 100755 index 0000000000000000000000000000000000000000..10b797c25bc678878e0e3ffcc38d7f1c7df8bbaa GIT binary patch literal 20040 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 H^H2Q`L2KI_ literal 0 HcmV?d00001 diff --git a/assets/img/skins/grid/grid-minimal.png b/assets/img/skins/grid/grid-minimal.png new file mode 100755 index 0000000000000000000000000000000000000000..b5772c882d752deb83c3f0a22afcbc1a7236f66a GIT binary patch literal 2932 zcmZXWcQhM{7sq3?h$1y=RS89{w$xr#v1dw(mX=y2gc>pH*`Y>?s!dU$=95shSCybG zq4uir6d^`DJM#0+?|0rmzkBZaen01)d(OT0zxx_$rq2T80|Ed57DEFa3jly7<%02y zbQiiis6TvR2~ZQ5E|p3>IzA@v?M+P2;=hkPer&U_wnIJJu5IbtI6m(qo!pgGUL5YQ zK}6xOwS^x_d+Q3lBGQYJg9o~sB3^~;F8+k*SqSn9RR2DR&ZvUBd!&RqrB`;L)83kD zD~GyRy1;ZPJJS_k=ZzjCT8d&QKLLr$`wXdhfRH5ruKry>(fM{RWf5`|HHNjcbp!x_ z7(<;0u%PM9uE>iO0TG3ia_(~4fAAt)I|c&gVv2qpO<(4i3A!}kXcAG;2B%U_jixi} z2Ox8rJ8aesy6M@ zwi0NEti`pYdm8?j*s^PgB{MnZ}HMXqm zkRRSXb8FG3Xff{M^fS^Ziu`yFpMf-2cZt1x(ce4kqvZsm<3s?&XDGWT&4H0txKK~4 zAIfY)GY&r>!g}5q!Y%!f$&sH}= ze-OE&QHdyz$#uyH9lmz3b>!iJkp1wsz`K5xB|RHIYN%>lASENaRZewokMTBRspb*6sDtn;PFWVV}5z$3DGGb z@*78x)8ZFb@njx->GNkP)#DQBJrPp|od&jH!6CdLgDu@1tNZg{90K7zA>&rbTs^zH z

    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 aEx-VEHwfo@I#a3u0000l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeDsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qem*8>> zL~jaiw^-uTs}FRHJ}6?5A{r(HOg$hbJlO&{@Pwb52Tbinz-0aI>IW$X21a>L7srr_ zTS+NE(7>eTzI_@)n%K9R1v3mi9{m6RKmGr|zjyc7r(ac5_%83!Be<&Z@8$QLV|lW9!-gU; zBLM~nQ&xvA(It&@J3B-BC$O!MGTXrG@ZQi!faU+eEJv2Z^X=`|3kUIq6!Yc?cl`bM zx4E^&#Np~6##W)n-RaNgb$Gwx+_>?xR6_8dr=LH!F7NlB$(T~dl=*|7>y)# z1gqJusGK@-M2Vr~^Zfh!_s7-#{gn0p=49hE#;bc6AIX2{U{1l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFhHasTY(KatnYqyQCInmZhe+73JqDfW2&$iPJ3xt~kwu z>P^Av76Uh&di8;h(Fa8=QbfaqfT;(>geO}d2cGa#^MI+n2$-zd&+-K_FffLBx;TbZ z+^Pw*^=5VysNMc^$K?q#Tyk@A*0^p6t+qaRNIoG|vCiSZd<7SeMCG!BP7^}RZgGfh zlL}b0?NFlVWaW=%=0@tDv(|HL`t@MrZsYv4=Z6h=m<6wV)eCc*d?SeKvk41hUTyEC zM~vrwE;-x5bj6qP_s=Pz9{o!aRL>YRU;ldX-HwbMafJ&zY}pJQVsny8tL|9MKJjD$ zPwRY+D#ll9)#C2$+4|Hu!pICjQ(DFC@QGHhoF~;pnr(6$k6DizY&Z#Znr| z8dkZ&K{WI>^@7x78NEfYQP7C`T#ySG{)>e!W6(p!J(B>3E4cT+rhW$`CxjA++wy}>pavC_}htq zS9U(^L>d!1VWVFHkXKPM7-qqiFibNIPQ{-uvJRx5;ay# z0@*uR0W4CQMPiA+Zdo7np}hS%vOk^Ro5ka-LUy1FfM0HRy~PE+<@CIf zb;>ysW|kT=Dgl;+G}X=z$Zfw9pY#a$+hm<`j*tWmW>f-{YJNQ{+caeA5wN8zbQK&I#m(N891A>mlbN~%-h2X z6KCV>XmduxjCvBLE@rm8GPH|Qp!fo@G9#HtxnAA-6*ZzWWg*s6jCTpYqHmurg-R)% zUrI2?`+*1IK8g#<*{R7nC{>;XfEA z3G5kCib`kye?ayjov=|l7Z`+f(eP1B%hm6##c}PpH5s6L0g~ndiL-_t(H3Ju_uu89 z9>+bk+;93mu;LzjNfoZpR5cFbRqZyuHku8K1>$;$Ln4h$_z$_CN^>zL0&UlM18ux2 zquzsmQ01uL4Pz!Cq~n%UPJIUa`#NsxmteyLT+g_>@0%heV+dVLN`F4$?r|d^#92x8 zK8%()Ok14SE^!XCgP@$jMEqdd3Wv zDFXEK>FN85l1RV56(y9a9y3^mH=*)}HU9z{MZ5Vl3h0&`G=pP>N$L5_gA0$cqoNF( ebuQ$e00RIn`hYVUZB7{g0000dI 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

    + * For more information about this service, see the API + * Documentation + *

    + * + * @author Google, Inc. + */ +class Google_Service_Calendar extends Google_Service +{ + /** Manage your calendars. */ + const CALENDAR = + "https://www.googleapis.com/auth/calendar"; + /** View your calendars. */ + const CALENDAR_READONLY = + "https://www.googleapis.com/auth/calendar.readonly"; + + public $acl; + public $calendarList; + public $calendars; + public $channels; + public $colors; + public $events; + public $freebusy; + public $settings; + public $serviceName; + + /** + * Constructs the internal representation of the Calendar service. + * + * @param Google_Client $client + */ + public function __construct(Google_Client $client) + { + parent::__construct($client); + $this->rootUrl = 'https://www.googleapis.com/'; + $this->servicePath = 'calendar/v3/'; + $this->version = 'v3'; + $this->serviceName = 'calendar'; + + $this->acl = new Google_Service_Calendar_Acl_Resource( + $this, + $this->serviceName, + 'acl', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'calendars/{calendarId}/acl/{ruleId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'ruleId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'calendars/{calendarId}/acl/{ruleId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'ruleId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'calendars/{calendarId}/acl', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'calendars/{calendarId}/acl', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'patch' => array( + 'path' => 'calendars/{calendarId}/acl/{ruleId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'ruleId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'calendars/{calendarId}/acl/{ruleId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'ruleId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'watch' => array( + 'path' => 'calendars/{calendarId}/acl/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->calendarList = new Google_Service_Calendar_CalendarList_Resource( + $this, + $this->serviceName, + 'calendarList', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'users/me/calendarList/{calendarId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'users/me/calendarList/{calendarId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'users/me/calendarList', + 'httpMethod' => 'POST', + 'parameters' => array( + 'colorRgbFormat' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'list' => array( + 'path' => 'users/me/calendarList', + 'httpMethod' => 'GET', + 'parameters' => array( + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'minAccessRole' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'showHidden' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'patch' => array( + 'path' => 'users/me/calendarList/{calendarId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'colorRgbFormat' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'update' => array( + 'path' => 'users/me/calendarList/{calendarId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'colorRgbFormat' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'watch' => array( + 'path' => 'users/me/calendarList/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'minAccessRole' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'showHidden' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->calendars = new Google_Service_Calendar_Calendars_Resource( + $this, + $this->serviceName, + 'calendars', + array( + 'methods' => array( + 'clear' => array( + 'path' => 'calendars/{calendarId}/clear', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'delete' => array( + 'path' => 'calendars/{calendarId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'calendars/{calendarId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'calendars', + 'httpMethod' => 'POST', + 'parameters' => array(), + ),'patch' => array( + 'path' => 'calendars/{calendarId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'calendars/{calendarId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->channels = new Google_Service_Calendar_Channels_Resource( + $this, + $this->serviceName, + 'channels', + array( + 'methods' => array( + 'stop' => array( + 'path' => 'channels/stop', + 'httpMethod' => 'POST', + 'parameters' => array(), + ), + ) + ) + ); + $this->colors = new Google_Service_Calendar_Colors_Resource( + $this, + $this->serviceName, + 'colors', + array( + 'methods' => array( + 'get' => array( + 'path' => 'colors', + 'httpMethod' => 'GET', + 'parameters' => array(), + ), + ) + ) + ); + $this->events = new Google_Service_Calendar_Events_Resource( + $this, + $this->serviceName, + 'events', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'get' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'timeZone' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'import' => array( + 'path' => 'calendars/{calendarId}/events/import', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'supportsAttachments' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'insert' => array( + 'path' => 'calendars/{calendarId}/events', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'supportsAttachments' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'instances' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}/instances', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'originalStart' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'timeMax' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeZone' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'list' => array( + 'path' => 'calendars/{calendarId}/events', + 'httpMethod' => 'GET', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'iCalUID' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'orderBy' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'privateExtendedProperty' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'sharedExtendedProperty' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'showHiddenInvitations' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'singleEvents' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeMax' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeZone' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'updatedMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'move' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}/move', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'destination' => array( + 'location' => 'query', + 'type' => 'string', + 'required' => true, + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'patch' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'supportsAttachments' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'quickAdd' => array( + 'path' => 'calendars/{calendarId}/events/quickAdd', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'text' => array( + 'location' => 'query', + 'type' => 'string', + 'required' => true, + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'update' => array( + 'path' => 'calendars/{calendarId}/events/{eventId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'eventId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'sendNotifications' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'supportsAttachments' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'watch' => array( + 'path' => 'calendars/{calendarId}/events/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'calendarId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'alwaysIncludeEmail' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'iCalUID' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'maxAttendees' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'orderBy' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'privateExtendedProperty' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'sharedExtendedProperty' => array( + 'location' => 'query', + 'type' => 'string', + 'repeated' => true, + ), + 'showDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'showHiddenInvitations' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'singleEvents' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeMax' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timeZone' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'updatedMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->freebusy = new Google_Service_Calendar_Freebusy_Resource( + $this, + $this->serviceName, + 'freebusy', + array( + 'methods' => array( + 'query' => array( + 'path' => 'freeBusy', + 'httpMethod' => 'POST', + 'parameters' => array(), + ), + ) + ) + ); + $this->settings = new Google_Service_Calendar_Settings_Resource( + $this, + $this->serviceName, + 'settings', + array( + 'methods' => array( + 'get' => array( + 'path' => 'users/me/settings/{setting}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'setting' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'users/me/settings', + 'httpMethod' => 'GET', + 'parameters' => array( + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'watch' => array( + 'path' => 'users/me/settings/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'syncToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + } +} + + +/** + * The "acl" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $acl = $calendarService->acl; + * + */ +class Google_Service_Calendar_Acl_Resource extends Google_Service_Resource +{ + + /** + * Deletes an access control rule. (acl.delete) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $ruleId ACL rule identifier. + * @param array $optParams Optional parameters. + */ + public function delete($calendarId, $ruleId, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + + /** + * Returns an access control rule. (acl.get) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $ruleId ACL rule identifier. + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_AclRule + */ + public function get($calendarId, $ruleId, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_AclRule"); + } + + /** + * Creates an access control rule. (acl.insert) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_AclRule $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_AclRule + */ + public function insert($calendarId, Google_Service_Calendar_AclRule $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Calendar_AclRule"); + } + + /** + * Returns the rules in the access control list for the calendar. (acl.listAcl) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param bool showDeleted Whether to include deleted ACLs in the result. + * Deleted ACLs are represented by role equal to "none". Deleted ACLs will + * always be included if syncToken is provided. Optional. The default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. All entries deleted since the previous list request will always be in + * the result set and it is not allowed to set showDeleted to False. If the + * syncToken expires, the server will respond with a 410 GONE response code and + * the client should clear its storage and perform a full synchronization + * without any syncToken. Learn more about incremental synchronization. + * Optional. The default is to return all entries. + * @return Google_Service_Calendar_Acl + */ + public function listAcl($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Calendar_Acl"); + } + + /** + * Updates an access control rule. This method supports patch semantics. + * (acl.patch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $ruleId ACL rule identifier. + * @param Google_AclRule $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_AclRule + */ + public function patch($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Calendar_AclRule"); + } + + /** + * Updates an access control rule. (acl.update) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $ruleId ACL rule identifier. + * @param Google_AclRule $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_AclRule + */ + public function update($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Calendar_AclRule"); + } + + /** + * Watch for changes to ACL resources. (acl.watch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param bool showDeleted Whether to include deleted ACLs in the result. + * Deleted ACLs are represented by role equal to "none". Deleted ACLs will + * always be included if syncToken is provided. Optional. The default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. All entries deleted since the previous list request will always be in + * the result set and it is not allowed to set showDeleted to False. If the + * syncToken expires, the server will respond with a 410 GONE response code and + * the client should clear its storage and perform a full synchronization + * without any syncToken. Learn more about incremental synchronization. + * Optional. The default is to return all entries. + * @return Google_Service_Calendar_Channel + */ + public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Calendar_Channel"); + } +} + +/** + * The "calendarList" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $calendarList = $calendarService->calendarList; + * + */ +class Google_Service_Calendar_CalendarList_Resource extends Google_Service_Resource +{ + + /** + * Deletes an entry on the user's calendar list. (calendarList.delete) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + */ + public function delete($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + + /** + * Returns an entry on the user's calendar list. (calendarList.get) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_CalendarListEntry + */ + public function get($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_CalendarListEntry"); + } + + /** + * Adds an entry to the user's calendar list. (calendarList.insert) + * + * @param Google_CalendarListEntry $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool colorRgbFormat Whether to use the foregroundColor and + * backgroundColor fields to write the calendar colors (RGB). If this feature is + * used, the index-based colorId field will be set to the best matching option + * automatically. Optional. The default is False. + * @return Google_Service_Calendar_CalendarListEntry + */ + public function insert(Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Calendar_CalendarListEntry"); + } + + /** + * Returns entries on the user's calendar list. (calendarList.listCalendarList) + * + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string minAccessRole The minimum access role for the user in the + * returned entries. Optional. The default is no restriction. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param bool showDeleted Whether to include deleted calendar list entries + * in the result. Optional. The default is False. + * @opt_param bool showHidden Whether to show hidden entries. Optional. The + * default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. If only read-only fields such as calendar properties or ACLs have + * changed, the entry won't be returned. All entries deleted and hidden since + * the previous list request will always be in the result set and it is not + * allowed to set showDeleted neither showHidden to False. To ensure client + * state consistency minAccessRole query parameter cannot be specified together + * with nextSyncToken. If the syncToken expires, the server will respond with a + * 410 GONE response code and the client should clear its storage and perform a + * full synchronization without any syncToken. Learn more about incremental + * synchronization. Optional. The default is to return all entries. + * @return Google_Service_Calendar_CalendarList + */ + public function listCalendarList($optParams = array()) + { + $params = []; + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Calendar_CalendarList"); + } + + /** + * Updates an entry on the user's calendar list. This method supports patch + * semantics. (calendarList.patch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_CalendarListEntry $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool colorRgbFormat Whether to use the foregroundColor and + * backgroundColor fields to write the calendar colors (RGB). If this feature is + * used, the index-based colorId field will be set to the best matching option + * automatically. Optional. The default is False. + * @return Google_Service_Calendar_CalendarListEntry + */ + public function patch($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Calendar_CalendarListEntry"); + } + + /** + * Updates an entry on the user's calendar list. (calendarList.update) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_CalendarListEntry $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool colorRgbFormat Whether to use the foregroundColor and + * backgroundColor fields to write the calendar colors (RGB). If this feature is + * used, the index-based colorId field will be set to the best matching option + * automatically. Optional. The default is False. + * @return Google_Service_Calendar_CalendarListEntry + */ + public function update($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Calendar_CalendarListEntry"); + } + + /** + * Watch for changes to CalendarList resources. (calendarList.watch) + * + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string minAccessRole The minimum access role for the user in the + * returned entries. Optional. The default is no restriction. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param bool showDeleted Whether to include deleted calendar list entries + * in the result. Optional. The default is False. + * @opt_param bool showHidden Whether to show hidden entries. Optional. The + * default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. If only read-only fields such as calendar properties or ACLs have + * changed, the entry won't be returned. All entries deleted and hidden since + * the previous list request will always be in the result set and it is not + * allowed to set showDeleted neither showHidden to False. To ensure client + * state consistency minAccessRole query parameter cannot be specified together + * with nextSyncToken. If the syncToken expires, the server will respond with a + * 410 GONE response code and the client should clear its storage and perform a + * full synchronization without any syncToken. Learn more about incremental + * synchronization. Optional. The default is to return all entries. + * @return Google_Service_Calendar_Channel + */ + public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Calendar_Channel"); + } +} + +/** + * The "calendars" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $calendars = $calendarService->calendars; + * + */ +class Google_Service_Calendar_Calendars_Resource extends Google_Service_Resource +{ + + /** + * Clears a primary calendar. This operation deletes all events associated with + * the primary calendar of an account. (calendars.clear) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + */ + public function clear($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('clear', array($params)); + } + + /** + * Deletes a secondary calendar. Use calendars.clear for clearing all events on + * primary calendars. (calendars.delete) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + */ + public function delete($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + + /** + * Returns metadata for a calendar. (calendars.get) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Calendar + */ + public function get($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_Calendar"); + } + + /** + * Creates a secondary calendar. (calendars.insert) + * + * @param Google_Calendar $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Calendar + */ + public function insert(Google_Service_Calendar_Calendar $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Calendar_Calendar"); + } + + /** + * Updates metadata for a calendar. This method supports patch semantics. + * (calendars.patch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Calendar $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Calendar + */ + public function patch($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Calendar_Calendar"); + } + + /** + * Updates metadata for a calendar. (calendars.update) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Calendar $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Calendar + */ + public function update($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Calendar_Calendar"); + } +} + +/** + * The "channels" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $channels = $calendarService->channels; + * + */ +class Google_Service_Calendar_Channels_Resource extends Google_Service_Resource +{ + + /** + * Stop watching resources through this channel (channels.stop) + * + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + */ + public function stop(Google_Service_Calendar_Channel $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('stop', array($params)); + } +} + +/** + * The "colors" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $colors = $calendarService->colors; + * + */ +class Google_Service_Calendar_Colors_Resource extends Google_Service_Resource +{ + + /** + * Returns the color definitions for calendars and events. (colors.get) + * + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Colors + */ + public function get($optParams = array()) + { + $params = []; + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_Colors"); + } +} + +/** + * The "events" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $events = $calendarService->events; + * + */ +class Google_Service_Calendar_Events_Resource extends Google_Service_Resource +{ + + /** + * Deletes an event. (events.delete) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $eventId Event identifier. + * @param array $optParams Optional parameters. + * + * @opt_param bool sendNotifications Whether to send notifications about the + * deletion of the event. Optional. The default is False. + */ + public function delete($calendarId, $eventId, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + + /** + * Returns an event. (events.get) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $eventId Event identifier. + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param string timeZone Time zone used in the response. Optional. The + * default is the time zone of the calendar. + * @return Google_Service_Calendar_Event + */ + public function get($calendarId, $eventId, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Imports an event. This operation is used to add a private copy of an existing + * event to a calendar. (events.import) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Event $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool supportsAttachments Whether API client performing operation + * supports event attachments. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function import($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('import', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Creates an event. (events.insert) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Event $postBody + * @param array $optParams Optional parameters. + * + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param bool sendNotifications Whether to send notifications about the + * creation of the new event. Optional. The default is False. + * @opt_param bool supportsAttachments Whether API client performing operation + * supports event attachments. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function insert($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Returns instances of the specified recurring event. (events.instances) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $eventId Recurring event identifier. + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param int maxResults Maximum number of events returned on one result + * page. By default the value is 250 events. The page size can never be larger + * than 2500 events. Optional. + * @opt_param string originalStart The original start time of the instance in + * the result. Optional. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param bool showDeleted Whether to include deleted events (with status + * equals "cancelled") in the result. Cancelled instances of recurring events + * will still be included if singleEvents is False. Optional. The default is + * False. + * @opt_param string timeMax Upper bound (exclusive) for an event's start time + * to filter by. Optional. The default is not to filter by start time. Must be + * an RFC3339 timestamp with mandatory time zone offset. + * @opt_param string timeMin Lower bound (inclusive) for an event's end time to + * filter by. Optional. The default is not to filter by end time. Must be an + * RFC3339 timestamp with mandatory time zone offset. + * @opt_param string timeZone Time zone used in the response. Optional. The + * default is the time zone of the calendar. + * @return Google_Service_Calendar_Events + */ + public function instances($calendarId, $eventId, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId); + $params = array_merge($params, $optParams); + return $this->call('instances', array($params), "Google_Service_Calendar_Events"); + } + + /** + * Returns events on the specified calendar. (events.listEvents) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param string iCalUID Specifies event ID in the iCalendar format to be + * included in the response. Optional. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param int maxResults Maximum number of events returned on one result + * page. By default the value is 250 events. The page size can never be larger + * than 2500 events. Optional. + * @opt_param string orderBy The order of the events returned in the result. + * Optional. The default is an unspecified, stable order. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param string privateExtendedProperty Extended properties constraint + * specified as propertyName=value. Matches only private properties. This + * parameter might be repeated multiple times to return events that match all + * given constraints. + * @opt_param string q Free text search terms to find events that match these + * terms in any field, except for extended properties. Optional. + * @opt_param string sharedExtendedProperty Extended properties constraint + * specified as propertyName=value. Matches only shared properties. This + * parameter might be repeated multiple times to return events that match all + * given constraints. + * @opt_param bool showDeleted Whether to include deleted events (with status + * equals "cancelled") in the result. Cancelled instances of recurring events + * (but not the underlying recurring event) will still be included if + * showDeleted and singleEvents are both False. If showDeleted and singleEvents + * are both True, only single instances of deleted events (but not the + * underlying recurring events) are returned. Optional. The default is False. + * @opt_param bool showHiddenInvitations Whether to include hidden invitations + * in the result. Optional. The default is False. + * @opt_param bool singleEvents Whether to expand recurring events into + * instances and only return single one-off events and instances of recurring + * events, but not the underlying recurring events themselves. Optional. The + * default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. All events deleted since the previous list request will always be in + * the result set and it is not allowed to set showDeleted to False. There are + * several query parameters that cannot be specified together with nextSyncToken + * to ensure consistency of the client state. + * + * These are: - iCalUID - orderBy - privateExtendedProperty - q - + * sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken + * expires, the server will respond with a 410 GONE response code and the client + * should clear its storage and perform a full synchronization without any + * syncToken. Learn more about incremental synchronization. Optional. The + * default is to return all entries. + * @opt_param string timeMax Upper bound (exclusive) for an event's start time + * to filter by. Optional. The default is not to filter by start time. Must be + * an RFC3339 timestamp with mandatory time zone offset, e.g., + * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided + * but will be ignored. + * @opt_param string timeMin Lower bound (inclusive) for an event's end time to + * filter by. Optional. The default is not to filter by end time. Must be an + * RFC3339 timestamp with mandatory time zone offset, e.g., + * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided + * but will be ignored. + * @opt_param string timeZone Time zone used in the response. Optional. The + * default is the time zone of the calendar. + * @opt_param string updatedMin Lower bound for an event's last modification + * time (as a RFC3339 timestamp) to filter by. When specified, entries deleted + * since this time will always be included regardless of showDeleted. Optional. + * The default is not to filter by last modification time. + * @return Google_Service_Calendar_Events + */ + public function listEvents($calendarId, $optParams = array()) + { + $params = array('calendarId' => $calendarId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Calendar_Events"); + } + + /** + * Moves an event to another calendar, i.e. changes an event's organizer. + * (events.move) + * + * @param string $calendarId Calendar identifier of the source calendar where + * the event currently is on. + * @param string $eventId Event identifier. + * @param string $destination Calendar identifier of the target calendar where + * the event is to be moved to. + * @param array $optParams Optional parameters. + * + * @opt_param bool sendNotifications Whether to send notifications about the + * change of the event's organizer. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function move($calendarId, $eventId, $destination, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'destination' => $destination); + $params = array_merge($params, $optParams); + return $this->call('move', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Updates an event. This method supports patch semantics. (events.patch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $eventId Event identifier. + * @param Google_Event $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param bool sendNotifications Whether to send notifications about the + * event update (e.g. attendee's responses, title changes, etc.). Optional. The + * default is False. + * @opt_param bool supportsAttachments Whether API client performing operation + * supports event attachments. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function patch($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Creates an event based on a simple text string. (events.quickAdd) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $text The text describing the event to be created. + * @param array $optParams Optional parameters. + * + * @opt_param bool sendNotifications Whether to send notifications about the + * creation of the event. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function quickAdd($calendarId, $text, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'text' => $text); + $params = array_merge($params, $optParams); + return $this->call('quickAdd', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Updates an event. (events.update) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param string $eventId Event identifier. + * @param Google_Event $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param bool sendNotifications Whether to send notifications about the + * event update (e.g. attendee's responses, title changes, etc.). Optional. The + * default is False. + * @opt_param bool supportsAttachments Whether API client performing operation + * supports event attachments. Optional. The default is False. + * @return Google_Service_Calendar_Event + */ + public function update($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Calendar_Event"); + } + + /** + * Watch for changes to Events resources. (events.watch) + * + * @param string $calendarId Calendar identifier. To retrieve calendar IDs call + * the calendarList.list method. If you want to access the primary calendar of + * the currently logged in user, use the "primary" keyword. + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool alwaysIncludeEmail Whether to always include a value in the + * email field for the organizer, creator and attendees, even if no real email + * is available (i.e. a generated, non-working value will be provided). The use + * of this option is discouraged and should only be used by clients which cannot + * handle the absence of an email address value in the mentioned places. + * Optional. The default is False. + * @opt_param string iCalUID Specifies event ID in the iCalendar format to be + * included in the response. Optional. + * @opt_param int maxAttendees The maximum number of attendees to include in the + * response. If there are more than the specified number of attendees, only the + * participant is returned. Optional. + * @opt_param int maxResults Maximum number of events returned on one result + * page. By default the value is 250 events. The page size can never be larger + * than 2500 events. Optional. + * @opt_param string orderBy The order of the events returned in the result. + * Optional. The default is an unspecified, stable order. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param string privateExtendedProperty Extended properties constraint + * specified as propertyName=value. Matches only private properties. This + * parameter might be repeated multiple times to return events that match all + * given constraints. + * @opt_param string q Free text search terms to find events that match these + * terms in any field, except for extended properties. Optional. + * @opt_param string sharedExtendedProperty Extended properties constraint + * specified as propertyName=value. Matches only shared properties. This + * parameter might be repeated multiple times to return events that match all + * given constraints. + * @opt_param bool showDeleted Whether to include deleted events (with status + * equals "cancelled") in the result. Cancelled instances of recurring events + * (but not the underlying recurring event) will still be included if + * showDeleted and singleEvents are both False. If showDeleted and singleEvents + * are both True, only single instances of deleted events (but not the + * underlying recurring events) are returned. Optional. The default is False. + * @opt_param bool showHiddenInvitations Whether to include hidden invitations + * in the result. Optional. The default is False. + * @opt_param bool singleEvents Whether to expand recurring events into + * instances and only return single one-off events and instances of recurring + * events, but not the underlying recurring events themselves. Optional. The + * default is False. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. All events deleted since the previous list request will always be in + * the result set and it is not allowed to set showDeleted to False. There are + * several query parameters that cannot be specified together with nextSyncToken + * to ensure consistency of the client state. + * + * These are: - iCalUID - orderBy - privateExtendedProperty - q - + * sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken + * expires, the server will respond with a 410 GONE response code and the client + * should clear its storage and perform a full synchronization without any + * syncToken. Learn more about incremental synchronization. Optional. The + * default is to return all entries. + * @opt_param string timeMax Upper bound (exclusive) for an event's start time + * to filter by. Optional. The default is not to filter by start time. Must be + * an RFC3339 timestamp with mandatory time zone offset, e.g., + * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided + * but will be ignored. + * @opt_param string timeMin Lower bound (inclusive) for an event's end time to + * filter by. Optional. The default is not to filter by end time. Must be an + * RFC3339 timestamp with mandatory time zone offset, e.g., + * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided + * but will be ignored. + * @opt_param string timeZone Time zone used in the response. Optional. The + * default is the time zone of the calendar. + * @opt_param string updatedMin Lower bound for an event's last modification + * time (as a RFC3339 timestamp) to filter by. When specified, entries deleted + * since this time will always be included regardless of showDeleted. Optional. + * The default is not to filter by last modification time. + * @return Google_Service_Calendar_Channel + */ + public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array()) + { + $params = array('calendarId' => $calendarId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Calendar_Channel"); + } +} + +/** + * The "freebusy" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $freebusy = $calendarService->freebusy; + * + */ +class Google_Service_Calendar_Freebusy_Resource extends Google_Service_Resource +{ + + /** + * Returns free/busy information for a set of calendars. (freebusy.query) + * + * @param Google_FreeBusyRequest $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_FreeBusyResponse + */ + public function query(Google_Service_Calendar_FreeBusyRequest $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('query', array($params), "Google_Service_Calendar_FreeBusyResponse"); + } +} + +/** + * The "settings" collection of methods. + * Typical usage is: + * + * $calendarService = new Google_Service_Calendar(...); + * $settings = $calendarService->settings; + * + */ +class Google_Service_Calendar_Settings_Resource extends Google_Service_Resource +{ + + /** + * Returns a single user setting. (settings.get) + * + * @param string $setting The id of the user setting. + * @param array $optParams Optional parameters. + * @return Google_Service_Calendar_Setting + */ + public function get($setting, $optParams = array()) + { + $params = array('setting' => $setting); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Calendar_Setting"); + } + + /** + * Returns all user settings for the authenticated user. (settings.listSettings) + * + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. If the syncToken expires, the server will respond with a 410 GONE + * response code and the client should clear its storage and perform a full + * synchronization without any syncToken. Learn more about incremental + * synchronization. Optional. The default is to return all entries. + * @return Google_Service_Calendar_Settings + */ + public function listSettings($optParams = array()) + { + $params = []; + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Calendar_Settings"); + } + + /** + * Watch for changes to Settings resources. (settings.watch) + * + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param int maxResults Maximum number of entries returned on one result + * page. By default the value is 100 entries. The page size can never be larger + * than 250 entries. Optional. + * @opt_param string pageToken Token specifying which result page to return. + * Optional. + * @opt_param string syncToken Token obtained from the nextSyncToken field + * returned on the last page of results from the previous list request. It makes + * the result of this list request contain only entries that have changed since + * then. If the syncToken expires, the server will respond with a 410 GONE + * response code and the client should clear its storage and perform a full + * synchronization without any syncToken. Learn more about incremental + * synchronization. Optional. The default is to return all entries. + * @return Google_Service_Calendar_Channel + */ + public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Calendar_Channel"); + } +} + + + + +class Google_Service_Calendar_Acl extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Calendar_AclRule'; + protected $itemsDataType = 'array'; + public $kind; + public $nextPageToken; + public $nextSyncToken; + + + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setItems($items) + { + $this->items = $items; + } + public function getItems() + { + return $this->items; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setNextSyncToken($nextSyncToken) + { + $this->nextSyncToken = $nextSyncToken; + } + public function getNextSyncToken() + { + return $this->nextSyncToken; + } +} + +class Google_Service_Calendar_AclRule extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $etag; + public $id; + public $kind; + public $role; + protected $scopeType = 'Google_Service_Calendar_AclRuleScope'; + protected $scopeDataType = ''; + + + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setRole($role) + { + $this->role = $role; + } + public function getRole() + { + return $this->role; + } + public function setScope(Google_Service_Calendar_AclRuleScope $scope) + { + $this->scope = $scope; + } + public function getScope() + { + return $this->scope; + } +} + +class Google_Service_Calendar_AclRuleScope extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $type; + public $value; + + + public function setType($type) + { + $this->type = $type; + } + public function getType() + { + return $this->type; + } + public function setValue($value) + { + $this->value = $value; + } + public function getValue() + { + return $this->value; + } +} + +class Google_Service_Calendar_Calendar extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $description; + public $etag; + public $id; + public $kind; + public $location; + public $summary; + public $timeZone; + + + public function setDescription($description) + { + $this->description = $description; + } + public function getDescription() + { + return $this->description; + } + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setLocation($location) + { + $this->location = $location; + } + public function getLocation() + { + return $this->location; + } + public function setSummary($summary) + { + $this->summary = $summary; + } + public function getSummary() + { + return $this->summary; + } + public function setTimeZone($timeZone) + { + $this->timeZone = $timeZone; + } + public function getTimeZone() + { + return $this->timeZone; + } +} + +class Google_Service_Calendar_CalendarList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Calendar_CalendarListEntry'; + protected $itemsDataType = 'array'; + public $kind; + public $nextPageToken; + public $nextSyncToken; + + + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setItems($items) + { + $this->items = $items; + } + public function getItems() + { + return $this->items; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setNextSyncToken($nextSyncToken) + { + $this->nextSyncToken = $nextSyncToken; + } + public function getNextSyncToken() + { + return $this->nextSyncToken; + } +} + +class Google_Service_Calendar_CalendarListEntry extends Google_Collection +{ + protected $collection_key = 'defaultReminders'; + protected $internal_gapi_mappings = array( + ); + public $accessRole; + public $backgroundColor; + public $colorId; + protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder'; + protected $defaultRemindersDataType = 'array'; + public $deleted; + public $description; + public $etag; + public $foregroundColor; + public $hidden; + public $id; + public $kind; + public $location; + protected $notificationSettingsType = 'Google_Service_Calendar_CalendarListEntryNotificationSettings'; + protected $notificationSettingsDataType = ''; + public $primary; + public $selected; + public $summary; + public $summaryOverride; + public $timeZone; + + + public function setAccessRole($accessRole) + { + $this->accessRole = $accessRole; + } + public function getAccessRole() + { + return $this->accessRole; + } + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = $backgroundColor; + } + public function getBackgroundColor() + { + return $this->backgroundColor; + } + public function setColorId($colorId) + { + $this->colorId = $colorId; + } + public function getColorId() + { + return $this->colorId; + } + public function setDefaultReminders($defaultReminders) + { + $this->defaultReminders = $defaultReminders; + } + public function getDefaultReminders() + { + return $this->defaultReminders; + } + public function setDeleted($deleted) + { + $this->deleted = $deleted; + } + public function getDeleted() + { + return $this->deleted; + } + public function setDescription($description) + { + $this->description = $description; + } + public function getDescription() + { + return $this->description; + } + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setForegroundColor($foregroundColor) + { + $this->foregroundColor = $foregroundColor; + } + public function getForegroundColor() + { + return $this->foregroundColor; + } + public function setHidden($hidden) + { + $this->hidden = $hidden; + } + public function getHidden() + { + return $this->hidden; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setLocation($location) + { + $this->location = $location; + } + public function getLocation() + { + return $this->location; + } + public function setNotificationSettings(Google_Service_Calendar_CalendarListEntryNotificationSettings $notificationSettings) + { + $this->notificationSettings = $notificationSettings; + } + public function getNotificationSettings() + { + return $this->notificationSettings; + } + public function setPrimary($primary) + { + $this->primary = $primary; + } + public function getPrimary() + { + return $this->primary; + } + public function setSelected($selected) + { + $this->selected = $selected; + } + public function getSelected() + { + return $this->selected; + } + public function setSummary($summary) + { + $this->summary = $summary; + } + public function getSummary() + { + return $this->summary; + } + public function setSummaryOverride($summaryOverride) + { + $this->summaryOverride = $summaryOverride; + } + public function getSummaryOverride() + { + return $this->summaryOverride; + } + public function setTimeZone($timeZone) + { + $this->timeZone = $timeZone; + } + public function getTimeZone() + { + return $this->timeZone; + } +} + +class Google_Service_Calendar_CalendarListEntryNotificationSettings extends Google_Collection +{ + protected $collection_key = 'notifications'; + protected $internal_gapi_mappings = array( + ); + protected $notificationsType = 'Google_Service_Calendar_CalendarNotification'; + protected $notificationsDataType = 'array'; + + + public function setNotifications($notifications) + { + $this->notifications = $notifications; + } + public function getNotifications() + { + return $this->notifications; + } +} + +class Google_Service_Calendar_CalendarNotification extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $method; + public $type; + + + public function setMethod($method) + { + $this->method = $method; + } + public function getMethod() + { + return $this->method; + } + public function setType($type) + { + $this->type = $type; + } + public function getType() + { + return $this->type; + } +} + +class Google_Service_Calendar_Channel extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $address; + public $expiration; + public $id; + public $kind; + public $params; + public $payload; + public $resourceId; + public $resourceUri; + public $token; + public $type; + + + public function setAddress($address) + { + $this->address = $address; + } + public function getAddress() + { + return $this->address; + } + public function setExpiration($expiration) + { + $this->expiration = $expiration; + } + public function getExpiration() + { + return $this->expiration; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setParams($params) + { + $this->params = $params; + } + public function getParams() + { + return $this->params; + } + public function setPayload($payload) + { + $this->payload = $payload; + } + public function getPayload() + { + return $this->payload; + } + public function setResourceId($resourceId) + { + $this->resourceId = $resourceId; + } + public function getResourceId() + { + return $this->resourceId; + } + public function setResourceUri($resourceUri) + { + $this->resourceUri = $resourceUri; + } + public function getResourceUri() + { + return $this->resourceUri; + } + public function setToken($token) + { + $this->token = $token; + } + public function getToken() + { + return $this->token; + } + public function setType($type) + { + $this->type = $type; + } + public function getType() + { + return $this->type; + } +} + +class Google_Service_Calendar_ColorDefinition extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $background; + public $foreground; + + + public function setBackground($background) + { + $this->background = $background; + } + public function getBackground() + { + return $this->background; + } + public function setForeground($foreground) + { + $this->foreground = $foreground; + } + public function getForeground() + { + return $this->foreground; + } +} + +class Google_Service_Calendar_Colors extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + protected $calendarType = 'Google_Service_Calendar_ColorDefinition'; + protected $calendarDataType = 'map'; + protected $eventType = 'Google_Service_Calendar_ColorDefinition'; + protected $eventDataType = 'map'; + public $kind; + public $updated; + + + public function setCalendar($calendar) + { + $this->calendar = $calendar; + } + public function getCalendar() + { + return $this->calendar; + } + public function setEvent($event) + { + $this->event = $event; + } + public function getEvent() + { + return $this->event; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setUpdated($updated) + { + $this->updated = $updated; + } + public function getUpdated() + { + return $this->updated; + } +} + +class Google_Service_Calendar_Error extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $domain; + public $reason; + + + public function setDomain($domain) + { + $this->domain = $domain; + } + public function getDomain() + { + return $this->domain; + } + public function setReason($reason) + { + $this->reason = $reason; + } + public function getReason() + { + return $this->reason; + } +} + +class Google_Service_Calendar_Event extends Google_Collection +{ + protected $collection_key = 'recurrence'; + protected $internal_gapi_mappings = array( + ); + public $anyoneCanAddSelf; + protected $attachmentsType = 'Google_Service_Calendar_EventAttachment'; + protected $attachmentsDataType = 'array'; + protected $attendeesType = 'Google_Service_Calendar_EventAttendee'; + protected $attendeesDataType = 'array'; + public $attendeesOmitted; + public $colorId; + public $created; + protected $creatorType = 'Google_Service_Calendar_EventCreator'; + protected $creatorDataType = ''; + public $description; + protected $endType = 'Google_Service_Calendar_EventDateTime'; + protected $endDataType = ''; + public $endTimeUnspecified; + public $etag; + protected $extendedPropertiesType = 'Google_Service_Calendar_EventExtendedProperties'; + protected $extendedPropertiesDataType = ''; + protected $gadgetType = 'Google_Service_Calendar_EventGadget'; + protected $gadgetDataType = ''; + public $guestsCanInviteOthers; + public $guestsCanModify; + public $guestsCanSeeOtherGuests; + public $hangoutLink; + public $htmlLink; + public $iCalUID; + public $id; + public $kind; + public $location; + public $locked; + protected $organizerType = 'Google_Service_Calendar_EventOrganizer'; + protected $organizerDataType = ''; + protected $originalStartTimeType = 'Google_Service_Calendar_EventDateTime'; + protected $originalStartTimeDataType = ''; + public $privateCopy; + public $recurrence; + public $recurringEventId; + protected $remindersType = 'Google_Service_Calendar_EventReminders'; + protected $remindersDataType = ''; + public $sequence; + protected $sourceType = 'Google_Service_Calendar_EventSource'; + protected $sourceDataType = ''; + protected $startType = 'Google_Service_Calendar_EventDateTime'; + protected $startDataType = ''; + public $status; + public $summary; + public $transparency; + public $updated; + public $visibility; + + + public function setAnyoneCanAddSelf($anyoneCanAddSelf) + { + $this->anyoneCanAddSelf = $anyoneCanAddSelf; + } + public function getAnyoneCanAddSelf() + { + return $this->anyoneCanAddSelf; + } + public function setAttachments($attachments) + { + $this->attachments = $attachments; + } + public function getAttachments() + { + return $this->attachments; + } + public function setAttendees($attendees) + { + $this->attendees = $attendees; + } + public function getAttendees() + { + return $this->attendees; + } + public function setAttendeesOmitted($attendeesOmitted) + { + $this->attendeesOmitted = $attendeesOmitted; + } + public function getAttendeesOmitted() + { + return $this->attendeesOmitted; + } + public function setColorId($colorId) + { + $this->colorId = $colorId; + } + public function getColorId() + { + return $this->colorId; + } + public function setCreated($created) + { + $this->created = $created; + } + public function getCreated() + { + return $this->created; + } + public function setCreator(Google_Service_Calendar_EventCreator $creator) + { + $this->creator = $creator; + } + public function getCreator() + { + return $this->creator; + } + public function setDescription($description) + { + $this->description = $description; + } + public function getDescription() + { + return $this->description; + } + public function setEnd(Google_Service_Calendar_EventDateTime $end) + { + $this->end = $end; + } + public function getEnd() + { + return $this->end; + } + public function setEndTimeUnspecified($endTimeUnspecified) + { + $this->endTimeUnspecified = $endTimeUnspecified; + } + public function getEndTimeUnspecified() + { + return $this->endTimeUnspecified; + } + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setExtendedProperties(Google_Service_Calendar_EventExtendedProperties $extendedProperties) + { + $this->extendedProperties = $extendedProperties; + } + public function getExtendedProperties() + { + return $this->extendedProperties; + } + public function setGadget(Google_Service_Calendar_EventGadget $gadget) + { + $this->gadget = $gadget; + } + public function getGadget() + { + return $this->gadget; + } + public function setGuestsCanInviteOthers($guestsCanInviteOthers) + { + $this->guestsCanInviteOthers = $guestsCanInviteOthers; + } + public function getGuestsCanInviteOthers() + { + return $this->guestsCanInviteOthers; + } + public function setGuestsCanModify($guestsCanModify) + { + $this->guestsCanModify = $guestsCanModify; + } + public function getGuestsCanModify() + { + return $this->guestsCanModify; + } + public function setGuestsCanSeeOtherGuests($guestsCanSeeOtherGuests) + { + $this->guestsCanSeeOtherGuests = $guestsCanSeeOtherGuests; + } + public function getGuestsCanSeeOtherGuests() + { + return $this->guestsCanSeeOtherGuests; + } + public function setHangoutLink($hangoutLink) + { + $this->hangoutLink = $hangoutLink; + } + public function getHangoutLink() + { + return $this->hangoutLink; + } + public function setHtmlLink($htmlLink) + { + $this->htmlLink = $htmlLink; + } + public function getHtmlLink() + { + return $this->htmlLink; + } + public function setICalUID($iCalUID) + { + $this->iCalUID = $iCalUID; + } + public function getICalUID() + { + return $this->iCalUID; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setLocation($location) + { + $this->location = $location; + } + public function getLocation() + { + return $this->location; + } + public function setLocked($locked) + { + $this->locked = $locked; + } + public function getLocked() + { + return $this->locked; + } + public function setOrganizer(Google_Service_Calendar_EventOrganizer $organizer) + { + $this->organizer = $organizer; + } + public function getOrganizer() + { + return $this->organizer; + } + public function setOriginalStartTime(Google_Service_Calendar_EventDateTime $originalStartTime) + { + $this->originalStartTime = $originalStartTime; + } + public function getOriginalStartTime() + { + return $this->originalStartTime; + } + public function setPrivateCopy($privateCopy) + { + $this->privateCopy = $privateCopy; + } + public function getPrivateCopy() + { + return $this->privateCopy; + } + public function setRecurrence($recurrence) + { + $this->recurrence = $recurrence; + } + public function getRecurrence() + { + return $this->recurrence; + } + public function setRecurringEventId($recurringEventId) + { + $this->recurringEventId = $recurringEventId; + } + public function getRecurringEventId() + { + return $this->recurringEventId; + } + public function setReminders(Google_Service_Calendar_EventReminders $reminders) + { + $this->reminders = $reminders; + } + public function getReminders() + { + return $this->reminders; + } + public function setSequence($sequence) + { + $this->sequence = $sequence; + } + public function getSequence() + { + return $this->sequence; + } + public function setSource(Google_Service_Calendar_EventSource $source) + { + $this->source = $source; + } + public function getSource() + { + return $this->source; + } + public function setStart(Google_Service_Calendar_EventDateTime $start) + { + $this->start = $start; + } + public function getStart() + { + return $this->start; + } + public function setStatus($status) + { + $this->status = $status; + } + public function getStatus() + { + return $this->status; + } + public function setSummary($summary) + { + $this->summary = $summary; + } + public function getSummary() + { + return $this->summary; + } + public function setTransparency($transparency) + { + $this->transparency = $transparency; + } + public function getTransparency() + { + return $this->transparency; + } + public function setUpdated($updated) + { + $this->updated = $updated; + } + public function getUpdated() + { + return $this->updated; + } + public function setVisibility($visibility) + { + $this->visibility = $visibility; + } + public function getVisibility() + { + return $this->visibility; + } +} + +class Google_Service_Calendar_EventAttachment extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $fileId; + public $fileUrl; + public $iconLink; + public $mimeType; + public $title; + + + public function setFileId($fileId) + { + $this->fileId = $fileId; + } + public function getFileId() + { + return $this->fileId; + } + public function setFileUrl($fileUrl) + { + $this->fileUrl = $fileUrl; + } + public function getFileUrl() + { + return $this->fileUrl; + } + public function setIconLink($iconLink) + { + $this->iconLink = $iconLink; + } + public function getIconLink() + { + return $this->iconLink; + } + public function setMimeType($mimeType) + { + $this->mimeType = $mimeType; + } + public function getMimeType() + { + return $this->mimeType; + } + public function setTitle($title) + { + $this->title = $title; + } + public function getTitle() + { + return $this->title; + } +} + +class Google_Service_Calendar_EventAttendee extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $additionalGuests; + public $comment; + public $displayName; + public $email; + public $id; + public $optional; + public $organizer; + public $resource; + public $responseStatus; + public $self; + + + public function setAdditionalGuests($additionalGuests) + { + $this->additionalGuests = $additionalGuests; + } + public function getAdditionalGuests() + { + return $this->additionalGuests; + } + public function setComment($comment) + { + $this->comment = $comment; + } + public function getComment() + { + return $this->comment; + } + public function setDisplayName($displayName) + { + $this->displayName = $displayName; + } + public function getDisplayName() + { + return $this->displayName; + } + public function setEmail($email) + { + $this->email = $email; + } + public function getEmail() + { + return $this->email; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setOptional($optional) + { + $this->optional = $optional; + } + public function getOptional() + { + return $this->optional; + } + public function setOrganizer($organizer) + { + $this->organizer = $organizer; + } + public function getOrganizer() + { + return $this->organizer; + } + public function setResource($resource) + { + $this->resource = $resource; + } + public function getResource() + { + return $this->resource; + } + public function setResponseStatus($responseStatus) + { + $this->responseStatus = $responseStatus; + } + public function getResponseStatus() + { + return $this->responseStatus; + } + public function setSelf($self) + { + $this->self = $self; + } + public function getSelf() + { + return $this->self; + } +} + +class Google_Service_Calendar_EventCreator extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $displayName; + public $email; + public $id; + public $self; + + + public function setDisplayName($displayName) + { + $this->displayName = $displayName; + } + public function getDisplayName() + { + return $this->displayName; + } + public function setEmail($email) + { + $this->email = $email; + } + public function getEmail() + { + return $this->email; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setSelf($self) + { + $this->self = $self; + } + public function getSelf() + { + return $this->self; + } +} + +class Google_Service_Calendar_EventDateTime extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $date; + public $dateTime; + public $timeZone; + + + public function setDate($date) + { + $this->date = $date; + } + public function getDate() + { + return $this->date; + } + public function setDateTime($dateTime) + { + $this->dateTime = $dateTime; + } + public function getDateTime() + { + return $this->dateTime; + } + public function setTimeZone($timeZone) + { + $this->timeZone = $timeZone; + } + public function getTimeZone() + { + return $this->timeZone; + } +} + +class Google_Service_Calendar_EventExtendedProperties extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $private; + public $shared; + + + public function setPrivate($private) + { + $this->private = $private; + } + public function getPrivate() + { + return $this->private; + } + public function setShared($shared) + { + $this->shared = $shared; + } + public function getShared() + { + return $this->shared; + } +} + +class Google_Service_Calendar_EventGadget extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $display; + public $height; + public $iconLink; + public $link; + public $preferences; + public $title; + public $type; + public $width; + + + public function setDisplay($display) + { + $this->display = $display; + } + public function getDisplay() + { + return $this->display; + } + public function setHeight($height) + { + $this->height = $height; + } + public function getHeight() + { + return $this->height; + } + public function setIconLink($iconLink) + { + $this->iconLink = $iconLink; + } + public function getIconLink() + { + return $this->iconLink; + } + public function setLink($link) + { + $this->link = $link; + } + public function getLink() + { + return $this->link; + } + public function setPreferences($preferences) + { + $this->preferences = $preferences; + } + public function getPreferences() + { + return $this->preferences; + } + public function setTitle($title) + { + $this->title = $title; + } + public function getTitle() + { + return $this->title; + } + public function setType($type) + { + $this->type = $type; + } + public function getType() + { + return $this->type; + } + public function setWidth($width) + { + $this->width = $width; + } + public function getWidth() + { + return $this->width; + } +} + +class Google_Service_Calendar_EventOrganizer extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $displayName; + public $email; + public $id; + public $self; + + + public function setDisplayName($displayName) + { + $this->displayName = $displayName; + } + public function getDisplayName() + { + return $this->displayName; + } + public function setEmail($email) + { + $this->email = $email; + } + public function getEmail() + { + return $this->email; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setSelf($self) + { + $this->self = $self; + } + public function getSelf() + { + return $this->self; + } +} + +class Google_Service_Calendar_EventReminder extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $method; + public $minutes; + + + public function setMethod($method) + { + $this->method = $method; + } + public function getMethod() + { + return $this->method; + } + public function setMinutes($minutes) + { + $this->minutes = $minutes; + } + public function getMinutes() + { + return $this->minutes; + } +} + +class Google_Service_Calendar_EventReminders extends Google_Collection +{ + protected $collection_key = 'overrides'; + protected $internal_gapi_mappings = array( + ); + protected $overridesType = 'Google_Service_Calendar_EventReminder'; + protected $overridesDataType = 'array'; + public $useDefault; + + + public function setOverrides($overrides) + { + $this->overrides = $overrides; + } + public function getOverrides() + { + return $this->overrides; + } + public function setUseDefault($useDefault) + { + $this->useDefault = $useDefault; + } + public function getUseDefault() + { + return $this->useDefault; + } +} + +class Google_Service_Calendar_EventSource extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $title; + public $url; + + + public function setTitle($title) + { + $this->title = $title; + } + public function getTitle() + { + return $this->title; + } + public function setUrl($url) + { + $this->url = $url; + } + public function getUrl() + { + return $this->url; + } +} + +class Google_Service_Calendar_Events extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $accessRole; + protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder'; + protected $defaultRemindersDataType = 'array'; + public $description; + public $etag; + protected $itemsType = 'Google_Service_Calendar_Event'; + protected $itemsDataType = 'array'; + public $kind; + public $nextPageToken; + public $nextSyncToken; + public $summary; + public $timeZone; + public $updated; + + + public function setAccessRole($accessRole) + { + $this->accessRole = $accessRole; + } + public function getAccessRole() + { + return $this->accessRole; + } + public function setDefaultReminders($defaultReminders) + { + $this->defaultReminders = $defaultReminders; + } + public function getDefaultReminders() + { + return $this->defaultReminders; + } + public function setDescription($description) + { + $this->description = $description; + } + public function getDescription() + { + return $this->description; + } + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setItems($items) + { + $this->items = $items; + } + public function getItems() + { + return $this->items; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setNextSyncToken($nextSyncToken) + { + $this->nextSyncToken = $nextSyncToken; + } + public function getNextSyncToken() + { + return $this->nextSyncToken; + } + public function setSummary($summary) + { + $this->summary = $summary; + } + public function getSummary() + { + return $this->summary; + } + public function setTimeZone($timeZone) + { + $this->timeZone = $timeZone; + } + public function getTimeZone() + { + return $this->timeZone; + } + public function setUpdated($updated) + { + $this->updated = $updated; + } + public function getUpdated() + { + return $this->updated; + } +} + +class Google_Service_Calendar_FreeBusyCalendar extends Google_Collection +{ + protected $collection_key = 'errors'; + protected $internal_gapi_mappings = array( + ); + protected $busyType = 'Google_Service_Calendar_TimePeriod'; + protected $busyDataType = 'array'; + protected $errorsType = 'Google_Service_Calendar_Error'; + protected $errorsDataType = 'array'; + + + public function setBusy($busy) + { + $this->busy = $busy; + } + public function getBusy() + { + return $this->busy; + } + public function setErrors($errors) + { + $this->errors = $errors; + } + public function getErrors() + { + return $this->errors; + } +} + +class Google_Service_Calendar_FreeBusyGroup extends Google_Collection +{ + protected $collection_key = 'errors'; + protected $internal_gapi_mappings = array( + ); + public $calendars; + protected $errorsType = 'Google_Service_Calendar_Error'; + protected $errorsDataType = 'array'; + + + public function setCalendars($calendars) + { + $this->calendars = $calendars; + } + public function getCalendars() + { + return $this->calendars; + } + public function setErrors($errors) + { + $this->errors = $errors; + } + public function getErrors() + { + return $this->errors; + } +} + +class Google_Service_Calendar_FreeBusyRequest extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $calendarExpansionMax; + public $groupExpansionMax; + protected $itemsType = 'Google_Service_Calendar_FreeBusyRequestItem'; + protected $itemsDataType = 'array'; + public $timeMax; + public $timeMin; + public $timeZone; + + + public function setCalendarExpansionMax($calendarExpansionMax) + { + $this->calendarExpansionMax = $calendarExpansionMax; + } + public function getCalendarExpansionMax() + { + return $this->calendarExpansionMax; + } + public function setGroupExpansionMax($groupExpansionMax) + { + $this->groupExpansionMax = $groupExpansionMax; + } + public function getGroupExpansionMax() + { + return $this->groupExpansionMax; + } + public function setItems($items) + { + $this->items = $items; + } + public function getItems() + { + return $this->items; + } + public function setTimeMax($timeMax) + { + $this->timeMax = $timeMax; + } + public function getTimeMax() + { + return $this->timeMax; + } + public function setTimeMin($timeMin) + { + $this->timeMin = $timeMin; + } + public function getTimeMin() + { + return $this->timeMin; + } + public function setTimeZone($timeZone) + { + $this->timeZone = $timeZone; + } + public function getTimeZone() + { + return $this->timeZone; + } +} + +class Google_Service_Calendar_FreeBusyRequestItem extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $id; + + + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } +} + +class Google_Service_Calendar_FreeBusyResponse extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + protected $calendarsType = 'Google_Service_Calendar_FreeBusyCalendar'; + protected $calendarsDataType = 'map'; + protected $groupsType = 'Google_Service_Calendar_FreeBusyGroup'; + protected $groupsDataType = 'map'; + public $kind; + public $timeMax; + public $timeMin; + + + public function setCalendars($calendars) + { + $this->calendars = $calendars; + } + public function getCalendars() + { + return $this->calendars; + } + public function setGroups($groups) + { + $this->groups = $groups; + } + public function getGroups() + { + return $this->groups; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setTimeMax($timeMax) + { + $this->timeMax = $timeMax; + } + public function getTimeMax() + { + return $this->timeMax; + } + public function setTimeMin($timeMin) + { + $this->timeMin = $timeMin; + } + public function getTimeMin() + { + return $this->timeMin; + } +} + +class Google_Service_Calendar_Setting extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $etag; + public $id; + public $kind; + public $value; + + + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setId($id) + { + $this->id = $id; + } + public function getId() + { + return $this->id; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setValue($value) + { + $this->value = $value; + } + public function getValue() + { + return $this->value; + } +} + +class Google_Service_Calendar_Settings extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Calendar_Setting'; + protected $itemsDataType = 'array'; + public $kind; + public $nextPageToken; + public $nextSyncToken; + + + public function setEtag($etag) + { + $this->etag = $etag; + } + public function getEtag() + { + return $this->etag; + } + public function setItems($items) + { + $this->items = $items; + } + public function getItems() + { + return $this->items; + } + public function setKind($kind) + { + $this->kind = $kind; + } + public function getKind() + { + return $this->kind; + } + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + public function getNextPageToken() + { + return $this->nextPageToken; + } + public function setNextSyncToken($nextSyncToken) + { + $this->nextSyncToken = $nextSyncToken; + } + public function getNextSyncToken() + { + return $this->nextSyncToken; + } +} + +class Google_Service_Calendar_TimePeriod extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $end; + public $start; + + + public function setEnd($end) + { + $this->end = $end; + } + public function getEnd() + { + return $this->end; + } + public function setStart($start) + { + $this->start = $start; + } + public function getStart() + { + return $this->start; + } +} diff --git a/app/api/Google/Service/Exception.php b/app/api/Google/Service/Exception.php new file mode 100755 index 0000000..7bf8937 --- /dev/null +++ b/app/api/Google/Service/Exception.php @@ -0,0 +1,105 @@ += 0) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + + $this->errors = $errors; + + if (is_array($retryMap)) { + $this->retryMap = $retryMap; + } + } + + /** + * An example of the possible errors returned. + * + * { + * "domain": "global", + * "reason": "authError", + * "message": "Invalid Credentials", + * "locationType": "header", + * "location": "Authorization", + * } + * + * @return [{string, string}] List of errors return in an HTTP response or []. + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Gets the number of times the associated task can be retried. + * + * NOTE: -1 is returned if the task can be retried indefinitely + * + * @return integer + */ + public function allowedRetries() + { + if (isset($this->retryMap[$this->code])) { + return $this->retryMap[$this->code]; + } + + $errors = $this->getErrors(); + + if (!empty($errors) && isset($errors[0]['reason']) && + isset($this->retryMap[$errors[0]['reason']])) { + return $this->retryMap[$errors[0]['reason']]; + } + + return 0; + } +} diff --git a/app/api/Google/Service/Resource.php b/app/api/Google/Service/Resource.php new file mode 100755 index 0000000..e8d3214 --- /dev/null +++ b/app/api/Google/Service/Resource.php @@ -0,0 +1,255 @@ + array('type' => 'string', 'location' => 'query'), + 'fields' => array('type' => 'string', 'location' => 'query'), + 'trace' => array('type' => 'string', 'location' => 'query'), + 'userIp' => array('type' => 'string', 'location' => 'query'), + 'quotaUser' => array('type' => 'string', 'location' => 'query'), + 'data' => array('type' => 'string', 'location' => 'body'), + 'mimeType' => array('type' => 'string', 'location' => 'header'), + 'uploadType' => array('type' => 'string', 'location' => 'query'), + 'mediaUpload' => array('type' => 'complex', 'location' => 'query'), + 'prettyPrint' => array('type' => 'string', 'location' => 'query'), + ); + + /** @var string $rootUrl */ + private $rootUrl; + + /** @var Google_Client $client */ + private $client; + + /** @var string $serviceName */ + private $serviceName; + + /** @var string $servicePath */ + private $servicePath; + + /** @var string $resourceName */ + private $resourceName; + + /** @var array $methods */ + private $methods; + + public function __construct($service, $serviceName, $resourceName, $resource) + { + $this->rootUrl = $service->rootUrl; + $this->client = $service->getClient(); + $this->servicePath = $service->servicePath; + $this->serviceName = $serviceName; + $this->resourceName = $resourceName; + $this->methods = is_array($resource) && isset($resource['methods']) ? + $resource['methods'] : + array($resourceName => $resource); + } + + /** + * TODO: This function needs simplifying. + * @param $name + * @param $arguments + * @param $expected_class - optional, the expected class name + * @return Google_Http_Request|expected_class + * @throws Google_Exception + */ + public function call($name, $arguments, $expected_class = null) + { + if (! isset($this->methods[$name])) { + $this->client->getLogger()->error( + 'Service method unknown', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name + ) + ); + + throw new Google_Exception( + "Unknown function: " . + "{$this->serviceName}->{$this->resourceName}->{$name}()" + ); + } + $method = $this->methods[$name]; + $parameters = $arguments[0]; + + // postBody is a special case since it's not defined in the discovery + // document as parameter, but we abuse the param entry for storing it. + $postBody = null; + if (isset($parameters['postBody'])) { + if ($parameters['postBody'] instanceof Google_Model) { + // In the cases the post body is an existing object, we want + // to use the smart method to create a simple object for + // for JSONification. + $parameters['postBody'] = $parameters['postBody']->toSimpleObject(); + } else if (is_object($parameters['postBody'])) { + // If the post body is another kind of object, we will try and + // wrangle it into a sensible format. + $parameters['postBody'] = + $this->convertToArrayAndStripNulls($parameters['postBody']); + } + $postBody = json_encode($parameters['postBody']); + if ($postBody === false && $parameters['postBody'] !== false) { + throw new Google_Exception("JSON encoding failed. Ensure all strings in the request are UTF-8 encoded."); + } + unset($parameters['postBody']); + } + + // TODO: optParams here probably should have been + // handled already - this may well be redundant code. + if (isset($parameters['optParams'])) { + $optParams = $parameters['optParams']; + unset($parameters['optParams']); + $parameters = array_merge($parameters, $optParams); + } + + if (!isset($method['parameters'])) { + $method['parameters'] = []; + } + + $method['parameters'] = array_merge( + $this->stackParameters, + $method['parameters'] + ); + foreach ($parameters as $key => $val) { + if ($key != 'postBody' && ! isset($method['parameters'][$key])) { + $this->client->getLogger()->error( + 'Service parameter unknown', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'parameter' => $key + ) + ); + throw new Google_Exception("($name) unknown parameter: '$key'"); + } + } + + foreach ($method['parameters'] as $paramName => $paramSpec) { + if (isset($paramSpec['required']) && + $paramSpec['required'] && + ! isset($parameters[$paramName]) + ) { + $this->client->getLogger()->error( + 'Service parameter missing', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'parameter' => $paramName + ) + ); + throw new Google_Exception("($name) missing required param: '$paramName'"); + } + if (isset($parameters[$paramName])) { + $value = $parameters[$paramName]; + $parameters[$paramName] = $paramSpec; + $parameters[$paramName]['value'] = $value; + unset($parameters[$paramName]['required']); + } else { + // Ensure we don't pass nulls. + unset($parameters[$paramName]); + } + } + + $this->client->getLogger()->info( + 'Service Call', + array( + 'service' => $this->serviceName, + 'resource' => $this->resourceName, + 'method' => $name, + 'arguments' => $parameters, + ) + ); + + $url = Google_Http_REST::createRequestUri( + $this->servicePath, + $method['path'], + $parameters + ); + $httpRequest = new Google_Http_Request( + $url, + $method['httpMethod'], + null, + $postBody + ); + + if ($this->rootUrl) { + $httpRequest->setBaseComponent($this->rootUrl); + } else { + $httpRequest->setBaseComponent($this->client->getBasePath()); + } + + if ($postBody) { + $contentTypeHeader = []; + $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8'; + $httpRequest->setRequestHeaders($contentTypeHeader); + $httpRequest->setPostBody($postBody); + } + + $httpRequest = $this->client->getAuth()->sign($httpRequest); + $httpRequest->setExpectedClass($expected_class); + + if (isset($parameters['data']) && + ($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) { + // If we are doing a simple media upload, trigger that as a convenience. + $mfu = new Google_Http_MediaFileUpload( + $this->client, + $httpRequest, + isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream', + $parameters['data']['value'] + ); + } + + if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') { + $httpRequest->enableExpectedRaw(); + } + + if ($this->client->shouldDefer()) { + // If we are in batch or upload mode, return the raw request. + return $httpRequest; + } + + return $this->client->execute($httpRequest); + } + + protected function convertToArrayAndStripNulls($o) + { + $o = (array) $o; + foreach ($o as $k => $v) { + if ($v === null) { + unset($o[$k]); + } elseif (is_object($v) || is_array($v)) { + $o[$k] = $this->convertToArrayAndStripNulls($o[$k]); + } + } + return $o; + } +} diff --git a/app/api/Google/Signer/Abstract.php b/app/api/Google/Signer/Abstract.php new file mode 100755 index 0000000..1b5676d --- /dev/null +++ b/app/api/Google/Signer/Abstract.php @@ -0,0 +1,29 @@ + + */ +abstract class Google_Signer_Abstract +{ + /** + * Signs data, returns the signature as binary data. + */ + abstract public function sign($data); +} diff --git a/app/api/Google/Signer/P12.php b/app/api/Google/Signer/P12.php new file mode 100755 index 0000000..17592c5 --- /dev/null +++ b/app/api/Google/Signer/P12.php @@ -0,0 +1,94 @@ + + */ +class Google_Signer_P12 extends Google_Signer_Abstract +{ + // OpenSSL private key resource + private $privateKey; + + // Creates a new signer from a .p12 file. + public function __construct($p12, $password) + { + if (!function_exists('openssl_x509_read')) { + throw new Google_Exception( + 'The Google PHP API library needs the openssl PHP extension' + ); + } + + // If the private key is provided directly, then this isn't in the p12 + // format. Different versions of openssl support different p12 formats + // and the key from google wasn't being accepted by the version available + // at the time. + if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) { + $this->privateKey = openssl_pkey_get_private($p12); + } elseif ($password === 'notasecret' && strpos($p12, "-----BEGIN PRIVATE KEY-----") !== false) { + $this->privateKey = openssl_pkey_get_private($p12); + } else { + // This throws on error + $certs = []; + if (!openssl_pkcs12_read($p12, $certs, $password)) { + throw new Google_Auth_Exception( + "Unable to parse the p12 file. " . + "Is this a .p12 file? Is the password correct? OpenSSL error: " . + openssl_error_string() + ); + } + // TODO(beaton): is this part of the contract for the openssl_pkcs12_read + // method? What happens if there are multiple private keys? Do we care? + if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) { + throw new Google_Auth_Exception("No private key found in p12 file."); + } + $this->privateKey = openssl_pkey_get_private($certs['pkey']); + } + + if (!$this->privateKey) { + throw new Google_Auth_Exception("Unable to load private key"); + } + } + + public function __destruct() + { + if ($this->privateKey) { + openssl_pkey_free($this->privateKey); + } + } + + public function sign($data) + { + if (version_compare(PHP_VERSION, '5.3.0') < 0) { + throw new Google_Auth_Exception( + "PHP 5.3.0 or higher is required to use service accounts." + ); + } + $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; + if (!openssl_sign($data, $signature, $this->privateKey, $hash)) { + throw new Google_Auth_Exception("Unable to sign data"); + } + return $signature; + } +} diff --git a/app/api/Google/Task/Exception.php b/app/api/Google/Task/Exception.php new file mode 100755 index 0000000..4c2ca79 --- /dev/null +++ b/app/api/Google/Task/Exception.php @@ -0,0 +1,24 @@ +getClassConfig('Google_Task_Runner'); + + if (isset($config['initial_delay'])) { + if ($config['initial_delay'] < 0) { + throw new Google_Task_Exception( + 'Task configuration `initial_delay` must not be negative.' + ); + } + + $this->delay = $config['initial_delay']; + } + + if (isset($config['max_delay'])) { + if ($config['max_delay'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `max_delay` must be greater than 0.' + ); + } + + $this->maxDelay = $config['max_delay']; + } + + if (isset($config['factor'])) { + if ($config['factor'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `factor` must be greater than 0.' + ); + } + + $this->factor = $config['factor']; + } + + if (isset($config['jitter'])) { + if ($config['jitter'] <= 0) { + throw new Google_Task_Exception( + 'Task configuration `jitter` must be greater than 0.' + ); + } + + $this->jitter = $config['jitter']; + } + + if (isset($config['retries'])) { + if ($config['retries'] < 0) { + throw new Google_Task_Exception( + 'Task configuration `retries` must not be negative.' + ); + } + $this->maxAttempts += $config['retries']; + } + + if (!is_callable($action)) { + throw new Google_Task_Exception( + 'Task argument `$action` must be a valid callable.' + ); + } + + $this->name = $name; + $this->client = $client; + $this->action = $action; + $this->arguments = $arguments; + } + + /** + * Checks if a retry can be attempted. + * + * @return boolean + */ + public function canAttmpt() + { + return $this->attempts < $this->maxAttempts; + } + + /** + * Runs the task and (if applicable) automatically retries when errors occur. + * + * @return mixed + * @throws Google_Task_Retryable on failure when no retries are available. + */ + public function run() + { + while ($this->attempt()) { + try { + return call_user_func_array($this->action, $this->arguments); + } catch (Google_Task_Retryable $exception) { + $allowedRetries = $exception->allowedRetries(); + + if (!$this->canAttmpt() || !$allowedRetries) { + throw $exception; + } + + if ($allowedRetries > 0) { + $this->maxAttempts = min( + $this->maxAttempts, + $this->attempts + $allowedRetries + ); + } + } + } + } + + /** + * Runs a task once, if possible. This is useful for bypassing the `run()` + * loop. + * + * NOTE: If this is not the first attempt, this function will sleep in + * accordance to the backoff configurations before running the task. + * + * @return boolean + */ + public function attempt() + { + if (!$this->canAttmpt()) { + return false; + } + + if ($this->attempts > 0) { + $this->backOff(); + } + + $this->attempts++; + return true; + } + + /** + * Sleeps in accordance to the backoff configurations. + */ + private function backOff() + { + $delay = $this->getDelay(); + + $this->client->getLogger()->debug( + 'Retrying task with backoff', + array( + 'request' => $this->name, + 'retry' => $this->attempts, + 'backoff_seconds' => $delay + ) + ); + + usleep($delay * 1000000); + } + + /** + * Gets the delay (in seconds) for the current backoff period. + * + * @return float + */ + private function getDelay() + { + $jitter = $this->getJitter(); + $factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter); + + return $this->delay = min($this->maxDelay, $this->delay * $factor); + } + + /** + * Gets the current jitter (random number between -$this->jitter and + * $this->jitter). + * + * @return float + */ + private function getJitter() + { + return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter; + } +} diff --git a/app/api/Google/Utils.php b/app/api/Google/Utils.php new file mode 100755 index 0000000..74fb84a --- /dev/null +++ b/app/api/Google/Utils.php @@ -0,0 +1,133 @@ += 0x20) && ($ordinalValue <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ret ++; + break; + case (($ordinalValue & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 2; + break; + case (($ordinalValue & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 3; + break; + case (($ordinalValue & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 4; + break; + case (($ordinalValue & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 5; + break; + case (($ordinalValue & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $ret += 6; + break; + default: + $ret ++; + } + } + return $ret; + } + + /** + * Normalize all keys in an array to lower-case. + * @param array $arr + * @return array Normalized array. + */ + public static function normalize($arr) + { + if (!is_array($arr)) { + return []; + } + + $normalized = []; + foreach ($arr as $key => $val) { + $normalized[strtolower($key)] = $val; + } + return $normalized; + } + + /** + * Convert a string to camelCase + * @param string $value + * @return string + */ + public static function camelCase($value) + { + $value = ucwords(str_replace(array('-', '_'), ' ', $value)); + $value = str_replace(' ', '', $value); + $value[0] = strtolower($value[0]); + return $value; + } +} diff --git a/app/api/Google/Utils/URITemplate.php b/app/api/Google/Utils/URITemplate.php new file mode 100755 index 0000000..ab30ce7 --- /dev/null +++ b/app/api/Google/Utils/URITemplate.php @@ -0,0 +1,333 @@ + "reserved", + "/" => "segments", + "." => "dotprefix", + "#" => "fragment", + ";" => "semicolon", + "?" => "form", + "&" => "continuation" + ); + + /** + * @var reserved array + * These are the characters which should not be URL encoded in reserved + * strings. + */ + private $reserved = array( + "=", ",", "!", "@", "|", ":", "/", "?", "#", + "[", "]",'$', "&", "'", "(", ")", "*", "+", ";" + ); + private $reservedEncoded = array( + "%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F", + "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29", + "%2A", "%2B", "%3B" + ); + + public function parse($string, array $parameters) + { + return $this->resolveNextSection($string, $parameters); + } + + /** + * This function finds the first matching {...} block and + * executes the replacement. It then calls itself to find + * subsequent blocks, if any. + */ + private function resolveNextSection($string, $parameters) + { + $start = strpos($string, "{"); + if ($start === false) { + return $string; + } + $end = strpos($string, "}"); + if ($end === false) { + return $string; + } + $string = $this->replace($string, $start, $end, $parameters); + return $this->resolveNextSection($string, $parameters); + } + + private function replace($string, $start, $end, $parameters) + { + // We know a data block will have {} round it, so we can strip that. + $data = substr($string, $start + 1, $end - $start - 1); + + // If the first character is one of the reserved operators, it effects + // the processing of the stream. + if (isset($this->operators[$data[0]])) { + $op = $this->operators[$data[0]]; + $data = substr($data, 1); + $prefix = ""; + $prefix_on_missing = false; + + switch ($op) { + case "reserved": + // Reserved means certain characters should not be URL encoded + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "fragment": + // Comma separated with fragment prefix. Bare values only. + $prefix = "#"; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "segments": + // Slash separated data. Bare values only. + $prefix = "/"; + $data =$this->replaceVars($data, $parameters, "/"); + break; + case "dotprefix": + // Dot separated data. Bare values only. + $prefix = "."; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, "."); + break; + case "semicolon": + // Semicolon prefixed and separated. Uses the key name + $prefix = ";"; + $data = $this->replaceVars($data, $parameters, ";", "=", false, true, false); + break; + case "form": + // Standard URL format. Uses the key name + $prefix = "?"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + case "continuation": + // Standard URL, but with leading ampersand. Uses key name. + $prefix = "&"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + } + + // Add the initial prefix character if data is valid. + if ($data || ($data !== false && $prefix_on_missing)) { + $data = $prefix . $data; + } + + } else { + // If no operator we replace with the defaults. + $data = $this->replaceVars($data, $parameters); + } + // This is chops out the {...} and replaces with the new section. + return substr($string, 0, $start) . $data . substr($string, $end + 1); + } + + private function replaceVars( + $section, + $parameters, + $sep = ",", + $combine = null, + $reserved = false, + $tag_empty = false, + $combine_on_empty = true + ) { + if (strpos($section, ",") === false) { + // If we only have a single value, we can immediately process. + return $this->combine( + $section, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + } else { + // If we have multiple values, we need to split and loop over them. + // Each is treated individually, then glued together with the + // separator character. + $vars = explode(",", $section); + return $this->combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + false, // Never emit empty strings in multi-param replacements + $combine_on_empty + ); + } + } + + public function combine( + $key, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $length = false; + $explode = false; + $skip_final_combine = false; + $value = false; + + // Check for length restriction. + if (strpos($key, ":") !== false) { + list($key, $length) = explode(":", $key); + } + + // Check for explode parameter. + if ($key[strlen($key) - 1] == "*") { + $explode = true; + $key = substr($key, 0, -1); + $skip_final_combine = true; + } + + // Define the list separator. + $list_sep = $explode ? $sep : ","; + + if (isset($parameters[$key])) { + $data_type = $this->getDataType($parameters[$key]); + switch ($data_type) { + case self::TYPE_SCALAR: + $value = $this->getValue($parameters[$key], $length); + break; + case self::TYPE_LIST: + $values = []; + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($combine && $explode) { + $values[$pkey] = $key . $combine . $pvalue; + } else { + $values[$pkey] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return ''; + } + break; + case self::TYPE_MAP: + $values = []; + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($explode) { + $pkey = $this->getValue($pkey, $length); + $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine. + } else { + $values[] = $pkey; + $values[] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return false; + } + break; + } + } else if ($tag_empty) { + // If we are just indicating empty values with their key name, return that. + return $key; + } else { + // Otherwise we can skip this variable due to not being defined. + return false; + } + + if ($reserved) { + $value = str_replace($this->reservedEncoded, $this->reserved, $value); + } + + // If we do not need to include the key name, we just return the raw + // value. + if (!$combine || $skip_final_combine) { + return $value; + } + + // Else we combine the key name: foo=bar, if value is not the empty string. + return $key . ($value != '' || $combine_on_empty ? $combine . $value : ''); + } + + /** + * Return the type of a passed in value + */ + private function getDataType($data) + { + if (is_array($data)) { + reset($data); + if (key($data) !== 0) { + return self::TYPE_MAP; + } + return self::TYPE_LIST; + } + return self::TYPE_SCALAR; + } + + /** + * Utility function that merges multiple combine calls + * for multi-key templates. + */ + private function combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $ret = []; + foreach ($vars as $var) { + $response = $this->combine( + $var, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + if ($response === false) { + continue; + } + $ret[] = $response; + } + return implode($sep, $ret); + } + + /** + * Utility function to encode and trim values + */ + private function getValue($value, $length) + { + if ($length) { + $value = substr($value, 0, $length); + } + $value = rawurlencode($value); + return $value; + } +} diff --git a/app/api/Google/Verifier/Abstract.php b/app/api/Google/Verifier/Abstract.php new file mode 100755 index 0000000..a70e713 --- /dev/null +++ b/app/api/Google/Verifier/Abstract.php @@ -0,0 +1,30 @@ + + */ +abstract class Google_Verifier_Abstract +{ + /** + * Checks a signature, returns true if the signature is correct, + * false otherwise. + */ + abstract public function verify($data, $signature); +} diff --git a/app/api/Google/Verifier/Pem.php b/app/api/Google/Verifier/Pem.php new file mode 100755 index 0000000..e0dd922 --- /dev/null +++ b/app/api/Google/Verifier/Pem.php @@ -0,0 +1,75 @@ + + */ +class Google_Verifier_Pem extends Google_Verifier_Abstract +{ + private $publicKey; + + /** + * Constructs a verifier from the supplied PEM-encoded certificate. + * + * $pem: a PEM encoded certificate (not a file). + * @param $pem + * @throws Google_Auth_Exception + * @throws Google_Exception + */ + public function __construct($pem) + { + if (!function_exists('openssl_x509_read')) { + throw new Google_Exception('Google API PHP client needs the openssl PHP extension'); + } + $this->publicKey = openssl_x509_read($pem); + if (!$this->publicKey) { + throw new Google_Auth_Exception("Unable to parse PEM: $pem"); + } + } + + public function __destruct() + { + if ($this->publicKey) { + openssl_x509_free($this->publicKey); + } + } + + /** + * Verifies the signature on data. + * + * Returns true if the signature is valid, false otherwise. + * @param $data + * @param $signature + * @throws Google_Auth_Exception + * @return bool + */ + public function verify($data, $signature) + { + $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; + $status = openssl_verify($data, $signature, $this->publicKey, $hash); + if ($status === -1) { + throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string()); + } + return $status === 1; + } +} diff --git a/app/api/Google/autoload.php b/app/api/Google/autoload.php new file mode 100755 index 0000000..b641bfa --- /dev/null +++ b/app/api/Google/autoload.php @@ -0,0 +1,37 @@ + 'true', + ); + + public function __construct(array $parameters = array()) { + $this->_parameters = array_merge($this->_parameters, $parameters); + } + + public function getEvents(array $parameters = array()) { + return $this->get('/:urlname/events', $parameters); + } + + public function getEvent(array $parameters = array()) { + return $this->get('/:urlname/events/:id', $parameters); + } + + public function getPhotos(array $parameters = array()) { + return $this->get('/2/photos', $parameters)->results; + } + + public function getDiscussionBoards(array $parameters = array()) { + return $this->get('/:urlname/boards', $parameters); + } + + public function getDiscussions(array $parameters = array()) { + return $this->get('/:urlname/boards/:bid/discussions', $parameters); + } + + public function getMembers(array $parameters = array()) { + return $this->get('/2/members', $parameters); + } + + public function getNext($response) { + if (!isset($response) || !isset($response->meta->next)) + { + throw new Exception("Invalid response object."); + } + return $this->get_url($response->meta->next); + } + + public function get($path, array $parameters = array()) { + $parameters = array_merge($this->_parameters, $parameters); + + if (preg_match_all('/:([a-z]+)/', $path, $matches)) { + + foreach ($matches[0] as $i => $match) { + + if (isset($parameters[$matches[1][$i]])) { + $path = str_replace($match, $parameters[$matches[1][$i]], $path); + unset($parameters[$matches[1][$i]]); + } else { + throw new Exception("Missing parameter '" . $matches[1][$i] . "' for path '" . $path . "'."); + } + } + } + + $url = self::BASE . $path . '?' . http_build_query($parameters); + + return $this->get_url($url); + } + + protected function get_url($url) { + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Charset: utf-8")); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + + $content = curl_exec($ch); + + if (curl_errno($ch)) { + $error = curl_error($ch); + curl_close($ch); + + throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'."); + } + + $response = json_decode($content); + $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + if ($status != 200) { + + if (isset($response->errors[0]->message)) { + $error = $response->errors[0]->message; + } else { + $error = 'Status ' . $status; + } + + throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'."); + } + + if (isset($response) == false) { + + switch (json_last_error()) { + case JSON_ERROR_NONE: + $error = 'No errors'; + break; + case JSON_ERROR_DEPTH: + $error = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $error = ' Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $error = 'Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + $error = 'Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + $error = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $error = 'Unknown error'; + break; + } + + throw new Exception("Cannot read response by '" . $url . "' because of: '" . $error . "'."); + } + + return $response; + } +} + diff --git a/app/api/Stripe/Account.php b/app/api/Stripe/Account.php new file mode 100755 index 0000000..65de047 --- /dev/null +++ b/app/api/Stripe/Account.php @@ -0,0 +1,431 @@ +create and manage Express or + * Custom accounts. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|\Stripe\StripeObject $business_profile Business information about the account. + * @property null|string $business_type The business type. + * @property \Stripe\StripeObject $capabilities + * @property bool $charges_enabled Whether the account can create live charges. + * @property \Stripe\StripeObject $company + * @property string $country The account's country. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $default_currency Three-letter ISO currency code representing the default currency for the account. This must be a currency that Stripe supports in the account's country. + * @property bool $details_submitted Whether account details have been submitted. Standard accounts cannot receive payouts before this is true. + * @property null|string $email The primary user's email address. + * @property \Stripe\Collection $external_accounts External accounts (bank accounts and debit cards) currently attached to this account + * @property \Stripe\Person $individual

    This is an object representing a person associated with a Stripe account.

    A platform cannot access a Standard or Express account's persons after the account starts onboarding, such as after generating an account link for the account. See the Standard onboarding or Express onboarding documentation for information about platform pre-filling and account onboarding steps.

    Related guide: Handling Identity Verification with the API.

    + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property bool $payouts_enabled Whether Stripe can send payouts to this account. + * @property \Stripe\StripeObject $requirements + * @property null|\Stripe\StripeObject $settings Options for customizing how the account functions within Stripe. + * @property \Stripe\StripeObject $tos_acceptance + * @property string $type The Stripe account type. Can be standard, express, or custom. + */ +class Account extends ApiResource +{ + const OBJECT_NAME = 'account'; + + use ApiOperations\All; + use ApiOperations\Create; + use ApiOperations\Delete; + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const BUSINESS_TYPE_COMPANY = 'company'; + const BUSINESS_TYPE_GOVERNMENT_ENTITY = 'government_entity'; + const BUSINESS_TYPE_INDIVIDUAL = 'individual'; + const BUSINESS_TYPE_NON_PROFIT = 'non_profit'; + + const CAPABILITY_CARD_PAYMENTS = 'card_payments'; + const CAPABILITY_LEGACY_PAYMENTS = 'legacy_payments'; + const CAPABILITY_PLATFORM_PAYMENTS = 'platform_payments'; + const CAPABILITY_TRANSFERS = 'transfers'; + + const CAPABILITY_STATUS_ACTIVE = 'active'; + const CAPABILITY_STATUS_INACTIVE = 'inactive'; + const CAPABILITY_STATUS_PENDING = 'pending'; + + const TYPE_CUSTOM = 'custom'; + const TYPE_EXPRESS = 'express'; + const TYPE_STANDARD = 'standard'; + + use ApiOperations\Retrieve { + retrieve as protected _retrieve; + } + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'external_account', + 'bank_account', + ]); + } + + return $savedNestedResources; + } + + public function instanceUrl() + { + if (null === $this['id']) { + return '/v1/account'; + } + + return parent::instanceUrl(); + } + + public function serializeParameters($force = false) + { + $update = parent::serializeParameters($force); + if (isset($this->_values['legal_entity'])) { + $entity = $this['legal_entity']; + if (isset($entity->_values['additional_owners'])) { + $owners = $entity['additional_owners']; + $entityUpdate = isset($update['legal_entity']) ? $update['legal_entity'] : []; + $entityUpdate['additional_owners'] = $this->serializeAdditionalOwners($entity, $owners); + $update['legal_entity'] = $entityUpdate; + } + } + if (isset($this->_values['individual'])) { + $individual = $this['individual']; + if (($individual instanceof Person) && !isset($update['individual'])) { + $update['individual'] = $individual->serializeParameters($force); + } + } + + return $update; + } + + private function serializeAdditionalOwners($legalEntity, $additionalOwners) + { + if (isset($legalEntity->_originalValues['additional_owners'])) { + $originalValue = $legalEntity->_originalValues['additional_owners']; + } else { + $originalValue = []; + } + if (($originalValue) && (\count($originalValue) > \count($additionalOwners))) { + throw new Exception\InvalidArgumentException( + 'You cannot delete an item from an array, you must instead set a new array' + ); + } + + $updateArr = []; + foreach ($additionalOwners as $i => $v) { + $update = ($v instanceof StripeObject) ? $v->serializeParameters() : $v; + + if ([] !== $update) { + if (!$originalValue + || !\array_key_exists($i, $originalValue) + || ($update !== $legalEntity->serializeParamsValue($originalValue[$i], null, false, true))) { + $updateArr[$i] = $update; + } + } + } + + return $updateArr; + } + + /** + * @param null|array|string $id the ID of the account to retrieve, or an + * options array containing an `id` key + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Account + */ + public static function retrieve($id = null, $opts = null) + { + if (!$opts && \is_string($id) && 'sk_' === \substr($id, 0, 3)) { + $opts = $id; + $id = null; + } + + return self::_retrieve($id, $opts); + } + + /** + * @param null|array $clientId + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject object containing the response from the API + */ + public function deauthorize($clientId = null, $opts = null) + { + $params = [ + 'client_id' => $clientId, + 'stripe_user_id' => $this->id, + ]; + + return OAuth::deauthorize($params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of persons + */ + public function persons($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/persons'; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return Account the rejected account + */ + public function reject($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reject'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /* + * Capabilities methods + * We can not add the capabilities() method today as the Account object already has a + * capabilities property which is a hash and not the sub-list of capabilities. + */ + + const PATH_CAPABILITIES = '/capabilities'; + + /** + * @param string $id the ID of the account on which to retrieve the capabilities + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of capabilities + */ + public static function allCapabilities($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_CAPABILITIES, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the capability belongs + * @param string $capabilityId the ID of the capability to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Capability + */ + public static function retrieveCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the capability belongs + * @param string $capabilityId the ID of the capability to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Capability + */ + public static function updateCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + + const PATH_EXTERNAL_ACCOUNTS = '/external_accounts'; + + /** + * @param string $id the ID of the account on which to retrieve the external accounts + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of external accounts (BankAccount or Card) + */ + public static function allExternalAccounts($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); + } + + /** + * @param string $id the ID of the account on which to create the external account + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public static function createExternalAccount($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to delete + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public static function deleteExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public static function retrieveExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\BankAccount|\Stripe\Card + */ + public static function updateExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + + const PATH_LOGIN_LINKS = '/login_links'; + + /** + * @param string $id the ID of the account on which to create the login link + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\LoginLink + */ + public static function createLoginLink($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_LOGIN_LINKS, $params, $opts); + } + + const PATH_PERSONS = '/persons'; + + /** + * @param string $id the ID of the account on which to retrieve the persons + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Collection the list of persons + */ + public static function allPersons($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_PERSONS, $params, $opts); + } + + /** + * @param string $id the ID of the account on which to create the person + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public static function createPerson($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_PERSONS, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to delete + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public static function deletePerson($id, $personId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public static function retrievePerson($id, $personId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to update + * @param null|array $params + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\Person + */ + public static function updatePerson($id, $personId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } +} diff --git a/app/api/Stripe/AccountLink.php b/app/api/Stripe/AccountLink.php new file mode 100755 index 0000000..87f5739 --- /dev/null +++ b/app/api/Stripe/AccountLink.php @@ -0,0 +1,26 @@ +Connect + * Onboarding. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property int $expires_at The timestamp at which this account link will expire. + * @property string $url The URL for the account link. + */ +class AccountLink extends ApiResource +{ + const OBJECT_NAME = 'account_link'; + + use ApiOperations\Create; +} diff --git a/app/api/Stripe/AlipayAccount.php b/app/api/Stripe/AlipayAccount.php new file mode 100755 index 0000000..13f4ad6 --- /dev/null +++ b/app/api/Stripe/AlipayAccount.php @@ -0,0 +1,75 @@ +json, $opts); + if (!($obj instanceof \Stripe\Collection)) { + throw new \Stripe\Exception\UnexpectedValueException( + 'Expected type ' . \Stripe\Collection::class . ', got "' . \get_class($obj) . '" instead.' + ); + } + $obj->setLastResponse($response); + $obj->setFilters($params); + + return $obj; + } +} diff --git a/app/api/Stripe/ApiOperations/Create.php b/app/api/Stripe/ApiOperations/Create.php new file mode 100755 index 0000000..d1dead9 --- /dev/null +++ b/app/api/Stripe/ApiOperations/Create.php @@ -0,0 +1,31 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/app/api/Stripe/ApiOperations/Delete.php b/app/api/Stripe/ApiOperations/Delete.php new file mode 100755 index 0000000..291546a --- /dev/null +++ b/app/api/Stripe/ApiOperations/Delete.php @@ -0,0 +1,30 @@ +instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/app/api/Stripe/ApiOperations/NestedResource.php b/app/api/Stripe/ApiOperations/NestedResource.php new file mode 100755 index 0000000..ed9c830 --- /dev/null +++ b/app/api/Stripe/ApiOperations/NestedResource.php @@ -0,0 +1,135 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * + * @return string + */ + protected static function _nestedResourceUrl($id, $nestedPath, $nestedId = null) + { + $url = static::resourceUrl($id) . $nestedPath; + if (null !== $nestedId) { + $url .= "/{$nestedId}"; + } + + return $url; + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|array $params + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject + */ + protected static function _createNestedResource($id, $nestedPath, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath); + + return self::_nestedResourceOperation('post', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject + */ + protected static function _retrieveNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('get', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject + */ + protected static function _updateNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('post', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject + */ + protected static function _deleteNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('delete', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|array $params + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return \Stripe\StripeObject + */ + protected static function _allNestedResources($id, $nestedPath, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath); + + return self::_nestedResourceOperation('get', $url, $params, $options); + } +} diff --git a/app/api/Stripe/ApiOperations/Request.php b/app/api/Stripe/ApiOperations/Request.php new file mode 100755 index 0000000..f645a8f --- /dev/null +++ b/app/api/Stripe/ApiOperations/Request.php @@ -0,0 +1,68 @@ + 100, " + . "'currency' => 'usd', 'source' => 'tok_1234'])\")"; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + } + + /** + * @param string $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param array $params list of parameters for the request + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return array tuple containing (the JSON response, $options) + */ + protected function _request($method, $url, $params = [], $options = null) + { + $opts = $this->_opts->merge($options); + list($resp, $options) = static::_staticRequest($method, $url, $params, $opts); + $this->setLastResponse($resp); + + return [$resp->json, $options]; + } + + /** + * @param string $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param array $params list of parameters for the request + * @param null|array|string $options + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return array tuple containing (the JSON response, $options) + */ + protected static function _staticRequest($method, $url, $params, $options) + { + $opts = \Stripe\Util\RequestOptions::parse($options); + $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl(); + $requestor = new \Stripe\ApiRequestor($opts->apiKey, $baseUrl); + list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers); + $opts->discardNonPersistentHeaders(); + + return [$response, $opts]; + } +} diff --git a/app/api/Stripe/ApiOperations/Retrieve.php b/app/api/Stripe/ApiOperations/Retrieve.php new file mode 100755 index 0000000..ddd8e51 --- /dev/null +++ b/app/api/Stripe/ApiOperations/Retrieve.php @@ -0,0 +1,30 @@ +refresh(); + + return $instance; + } +} diff --git a/app/api/Stripe/ApiOperations/Update.php b/app/api/Stripe/ApiOperations/Update.php new file mode 100755 index 0000000..841b039 --- /dev/null +++ b/app/api/Stripe/ApiOperations/Update.php @@ -0,0 +1,52 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array|string $opts + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @return static the saved resource + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/app/api/Stripe/ApiRequestor.php b/app/api/Stripe/ApiRequestor.php new file mode 100755 index 0000000..4ebe9b3 --- /dev/null +++ b/app/api/Stripe/ApiRequestor.php @@ -0,0 +1,526 @@ +_apiKey = $apiKey; + if (!$apiBase) { + $apiBase = Stripe::$apiBase; + } + $this->_apiBase = $apiBase; + } + + /** + * Creates a telemetry json blob for use in 'X-Stripe-Client-Telemetry' headers. + * + * @static + * + * @param RequestTelemetry $requestTelemetry + * + * @return string + */ + private static function _telemetryJson($requestTelemetry) + { + $payload = [ + 'last_request_metrics' => [ + 'request_id' => $requestTelemetry->requestId, + 'request_duration_ms' => $requestTelemetry->requestDuration, + ], + ]; + + $result = \json_encode($payload); + if (false !== $result) { + return $result; + } + Stripe::getLogger()->error('Serializing telemetry payload failed!'); + + return '{}'; + } + + /** + * @static + * + * @param ApiResource|array|bool|mixed $d + * + * @return ApiResource|array|mixed|string + */ + private static function _encodeObjects($d) + { + if ($d instanceof ApiResource) { + return Util\Util::utf8($d->id); + } + if (true === $d) { + return 'true'; + } + if (false === $d) { + return 'false'; + } + if (\is_array($d)) { + $res = []; + foreach ($d as $k => $v) { + $res[$k] = self::_encodeObjects($v); + } + + return $res; + } + + return Util\Util::utf8($d); + } + + /** + * @param string $method + * @param string $url + * @param null|array $params + * @param null|array $headers + * + * @throws Exception\ApiErrorException + * + * @return array tuple containing (ApiReponse, API key) + */ + public function request($method, $url, $params = null, $headers = null) + { + $params = $params ?: []; + $headers = $headers ?: []; + list($rbody, $rcode, $rheaders, $myApiKey) = + $this->_requestRaw($method, $url, $params, $headers); + $json = $this->_interpretResponse($rbody, $rcode, $rheaders); + $resp = new ApiResponse($rbody, $rcode, $rheaders, $json); + + return [$resp, $myApiKey]; + } + + /** + * @param string $rbody a JSON string + * @param int $rcode + * @param array $rheaders + * @param array $resp + * + * @throws Exception\UnexpectedValueException + * @throws Exception\ApiErrorException + */ + public function handleErrorResponse($rbody, $rcode, $rheaders, $resp) + { + if (!\is_array($resp) || !isset($resp['error'])) { + $msg = "Invalid response object from API: {$rbody} " + . "(HTTP response code was {$rcode})"; + + throw new Exception\UnexpectedValueException($msg); + } + + $errorData = $resp['error']; + + $error = null; + if (\is_string($errorData)) { + $error = self::_specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorData); + } + if (!$error) { + $error = self::_specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData); + } + + throw $error; + } + + /** + * @static + * + * @param string $rbody + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param array $errorData + * + * @return Exception\ApiErrorException + */ + private static function _specificAPIError($rbody, $rcode, $rheaders, $resp, $errorData) + { + $msg = isset($errorData['message']) ? $errorData['message'] : null; + $param = isset($errorData['param']) ? $errorData['param'] : null; + $code = isset($errorData['code']) ? $errorData['code'] : null; + $type = isset($errorData['type']) ? $errorData['type'] : null; + $declineCode = isset($errorData['decline_code']) ? $errorData['decline_code'] : null; + + switch ($rcode) { + case 400: + // 'rate_limit' code is deprecated, but left here for backwards compatibility + // for API versions earlier than 2015-09-08 + if ('rate_limit' === $code) { + return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + } + if ('idempotency_error' === $type) { + return Exception\IdempotencyException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + } + + // no break + case 404: + return Exception\InvalidRequestException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + + case 401: + return Exception\AuthenticationException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + + case 402: + return Exception\CardException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $declineCode, $param); + + case 403: + return Exception\PermissionException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + + case 429: + return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + + default: + return Exception\UnknownApiErrorException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + } + } + + /** + * @static + * + * @param bool|string $rbody + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param string $errorCode + * + * @return Exception\OAuth\OAuthErrorException + */ + private static function _specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorCode) + { + $description = isset($resp['error_description']) ? $resp['error_description'] : $errorCode; + + switch ($errorCode) { + case 'invalid_client': + return Exception\OAuth\InvalidClientException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_grant': + return Exception\OAuth\InvalidGrantException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_request': + return Exception\OAuth\InvalidRequestException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_scope': + return Exception\OAuth\InvalidScopeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'unsupported_grant_type': + return Exception\OAuth\UnsupportedGrantTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'unsupported_response_type': + return Exception\OAuth\UnsupportedResponseTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + default: + return Exception\OAuth\UnknownOAuthErrorException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + } + } + + /** + * @static + * + * @param null|array $appInfo + * + * @return null|string + */ + private static function _formatAppInfo($appInfo) + { + if (null !== $appInfo) { + $string = $appInfo['name']; + if (null !== $appInfo['version']) { + $string .= '/' . $appInfo['version']; + } + if (null !== $appInfo['url']) { + $string .= ' (' . $appInfo['url'] . ')'; + } + + return $string; + } + + return null; + } + + /** + * @static + * + * @param string $disabledFunctionsOutput - String value of the 'disable_function' setting, as output by \ini_get('disable_functions') + * @param string $functionName - Name of the function we are interesting in seeing whether or not it is disabled + * @param mixed $disableFunctionsOutput + * + * @return bool + */ + private static function _isDisabled($disableFunctionsOutput, $functionName) + { + $disabledFunctions = \explode(',', $disableFunctionsOutput); + foreach ($disabledFunctions as $disabledFunction) { + if (\trim($disabledFunction) === $functionName) { + return true; + } + } + + return false; + } + + /** + * @static + * + * @param string $apiKey + * @param null $clientInfo + * + * @return array + */ + private static function _defaultHeaders($apiKey, $clientInfo = null) + { + $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION; + + $langVersion = \PHP_VERSION; + $uname_disabled = static::_isDisabled(\ini_get('disable_functions'), 'php_uname'); + $uname = $uname_disabled ? '(disabled)' : \php_uname(); + + $appInfo = Stripe::getAppInfo(); + $ua = [ + 'bindings_version' => Stripe::VERSION, + 'lang' => 'php', + 'lang_version' => $langVersion, + 'publisher' => 'stripe', + 'uname' => $uname, + ]; + if ($clientInfo) { + $ua = \array_merge($clientInfo, $ua); + } + if (null !== $appInfo) { + $uaString .= ' ' . self::_formatAppInfo($appInfo); + $ua['application'] = $appInfo; + } + + return [ + 'X-Stripe-Client-User-Agent' => \json_encode($ua), + 'User-Agent' => $uaString, + 'Authorization' => 'Bearer ' . $apiKey, + ]; + } + + /** + * @param string $method + * @param string $url + * @param array $params + * @param array $headers + * + * @throws Exception\AuthenticationException + * @throws Exception\ApiConnectionException + * + * @return array + */ + private function _requestRaw($method, $url, $params, $headers) + { + $myApiKey = $this->_apiKey; + if (!$myApiKey) { + $myApiKey = Stripe::$apiKey; + } + + if (!$myApiKey) { + $msg = 'No API key provided. (HINT: set your API key using ' + . '"Stripe::setApiKey()". You can generate API keys from ' + . 'the Stripe web interface. See https://stripe.com/api for ' + . 'details, or email support@stripe.com if you have any questions.'; + + throw new Exception\AuthenticationException($msg); + } + + // Clients can supply arbitrary additional keys to be included in the + // X-Stripe-Client-User-Agent header via the optional getUserAgentInfo() + // method + $clientUAInfo = null; + if (\method_exists($this->httpClient(), 'getUserAgentInfo')) { + $clientUAInfo = $this->httpClient()->getUserAgentInfo(); + } + + if ($params && \is_array($params)) { + $optionKeysInParams = \array_filter( + static::$OPTIONS_KEYS, + function ($key) use ($params) { + return \array_key_exists($key, $params); + } + ); + if (\count($optionKeysInParams) > 0) { + $message = \sprintf('Options found in $params: %s. Options should ' + . 'be passed in their own array after $params. (HINT: pass an ' + . 'empty array to $params if you do not have any.)', \implode(', ', $optionKeysInParams)); + \trigger_error($message, \E_USER_WARNING); + } + } + + $absUrl = $this->_apiBase . $url; + $params = self::_encodeObjects($params); + $defaultHeaders = $this->_defaultHeaders($myApiKey, $clientUAInfo); + if (Stripe::$apiVersion) { + $defaultHeaders['Stripe-Version'] = Stripe::$apiVersion; + } + + if (Stripe::$accountId) { + $defaultHeaders['Stripe-Account'] = Stripe::$accountId; + } + + if (Stripe::$enableTelemetry && null !== self::$requestTelemetry) { + $defaultHeaders['X-Stripe-Client-Telemetry'] = self::_telemetryJson(self::$requestTelemetry); + } + + $hasFile = false; + foreach ($params as $k => $v) { + if (\is_resource($v)) { + $hasFile = true; + $params[$k] = self::_processResourceParam($v); + } elseif ($v instanceof \CURLFile) { + $hasFile = true; + } + } + + if ($hasFile) { + $defaultHeaders['Content-Type'] = 'multipart/form-data'; + } else { + $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + $combinedHeaders = \array_merge($defaultHeaders, $headers); + $rawHeaders = []; + + foreach ($combinedHeaders as $header => $value) { + $rawHeaders[] = $header . ': ' . $value; + } + + $requestStartMs = Util\Util::currentTimeMillis(); + + list($rbody, $rcode, $rheaders) = $this->httpClient()->request( + $method, + $absUrl, + $rawHeaders, + $params, + $hasFile + ); + + if (isset($rheaders['request-id']) + && \is_string($rheaders['request-id']) + && \strlen($rheaders['request-id']) > 0) { + self::$requestTelemetry = new RequestTelemetry( + $rheaders['request-id'], + Util\Util::currentTimeMillis() - $requestStartMs + ); + } + + return [$rbody, $rcode, $rheaders, $myApiKey]; + } + + /** + * @param resource $resource + * + * @throws Exception\InvalidArgumentException + * + * @return \CURLFile|string + */ + private function _processResourceParam($resource) + { + if ('stream' !== \get_resource_type($resource)) { + throw new Exception\InvalidArgumentException( + 'Attempted to upload a resource that is not a stream' + ); + } + + $metaData = \stream_get_meta_data($resource); + if ('plainfile' !== $metaData['wrapper_type']) { + throw new Exception\InvalidArgumentException( + 'Only plainfile resource streams are supported' + ); + } + + // We don't have the filename or mimetype, but the API doesn't care + return new \CURLFile($metaData['uri']); + } + + /** + * @param string $rbody + * @param int $rcode + * @param array $rheaders + * + * @throws Exception\UnexpectedValueException + * @throws Exception\ApiErrorException + * + * @return array + */ + private function _interpretResponse($rbody, $rcode, $rheaders) + { + $resp = \json_decode($rbody, true); + $jsonError = \json_last_error(); + if (null === $resp && \JSON_ERROR_NONE !== $jsonError) { + $msg = "Invalid response body from API: {$rbody} " + . "(HTTP response code was {$rcode}, json_last_error() was {$jsonError})"; + + throw new Exception\UnexpectedValueException($msg, $rcode); + } + + if ($rcode < 200 || $rcode >= 300) { + $this->handleErrorResponse($rbody, $rcode, $rheaders, $resp); + } + + return $resp; + } + + /** + * @static + * + * @param HttpClient\ClientInterface $client + */ + public static function setHttpClient($client) + { + self::$_httpClient = $client; + } + + /** + * @static + * + * Resets any stateful telemetry data + */ + public static function resetTelemetry() + { + self::$requestTelemetry = null; + } + + /** + * @return HttpClient\ClientInterface + */ + private function httpClient() + { + if (!self::$_httpClient) { + self::$_httpClient = HttpClient\CurlClient::instance(); + } + + return self::$_httpClient; + } +} diff --git a/app/api/Stripe/ApiResource.php b/app/api/Stripe/ApiResource.php new file mode 100755 index 0000000..0d22de0 --- /dev/null +++ b/app/api/Stripe/ApiResource.php @@ -0,0 +1,120 @@ +{$k}; + if ((static::getSavedNestedResources()->includes($k)) + && ($v instanceof ApiResource)) { + $v->saveWithParent = true; + } + } + + /** + * @throws Exception\ApiErrorException + * + * @return ApiResource the refreshed resource + */ + public function refresh() + { + $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl()); + $url = $this->instanceUrl(); + + list($response, $this->_opts->apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions, + $this->_opts->headers + ); + $this->setLastResponse($response); + $this->refreshFrom($response->json, $this->_opts); + + return $this; + } + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * @return string the endpoint URL for the given class + */ + public static function classUrl() + { + // Replace dots with slashes for namespaced resources, e.g. if the object's name is + // "foo.bar", then its URL will be "/v1/foo/bars". + $base = \str_replace('.', '/', static::OBJECT_NAME); + + return "/v1/{$base}s"; + } + + /** + * @param null|string $id the ID of the resource + * + * @throws Exception\UnexpectedValueException if $id is null + * + * @return string the instance endpoint URL for the given class + */ + public static function resourceUrl($id) + { + if (null === $id) { + $class = static::class; + $message = 'Could not determine which URL to request: ' + . "{$class} instance has invalid ID: {$id}"; + + throw new Exception\UnexpectedValueException($message); + } + $id = Util\Util::utf8($id); + $base = static::classUrl(); + $extn = \urlencode($id); + + return "{$base}/{$extn}"; + } + + /** + * @return string the full API URL for this API resource + */ + public function instanceUrl() + { + return static::resourceUrl($this['id']); + } +} diff --git a/app/api/Stripe/ApiResponse.php b/app/api/Stripe/ApiResponse.php new file mode 100755 index 0000000..64ed3e2 --- /dev/null +++ b/app/api/Stripe/ApiResponse.php @@ -0,0 +1,45 @@ +body = $body; + $this->code = $code; + $this->headers = $headers; + $this->json = $json; + } +} diff --git a/app/api/Stripe/ApplePayDomain.php b/app/api/Stripe/ApplePayDomain.php new file mode 100755 index 0000000..4bb458c --- /dev/null +++ b/app/api/Stripe/ApplePayDomain.php @@ -0,0 +1,31 @@ +true